static int __init iseries_vio_init(void) { struct device_node *vio_root; int ret = -ENODEV; if (!firmware_has_feature(FW_FEATURE_ISERIES)) goto out; iommu_vio_init(); vio_root = of_find_node_by_path("/vdevice"); if (!vio_root) goto out; if (viopath_hostLp == HvLpIndexInvalid) { vio_set_hostlp(); /* If we don't have a host, bail out */ if (viopath_hostLp == HvLpIndexInvalid) goto put_node; } get_viodasd_info(vio_root); get_viocd_info(vio_root); get_viotape_info(vio_root); ret = 0; put_node: of_node_put(vio_root); out: return ret; }
/** * vio_bus_init: - Initialize the virtual IO bus */ static int __init vio_bus_init(void) { int err; struct device_node *node_vroot; #ifdef CONFIG_PPC_ISERIES if (firmware_has_feature(FW_FEATURE_ISERIES)) { iommu_vio_init(); vio_bus_device.iommu_table = &vio_iommu_table; iSeries_vio_dev = &vio_bus_device.dev; } #endif err = bus_register(&vio_bus_type); if (err) { printk(KERN_ERR "failed to register VIO bus\n"); return err; } /* * The fake parent of all vio devices, just to give us * a nice directory */ err = device_register(&vio_bus_device.dev); if (err) { printk(KERN_WARNING "%s: device_register returned %i\n", __FUNCTION__, err); return err; } node_vroot = find_devices("vdevice"); if (node_vroot) { struct device_node *of_node; /* * Create struct vio_devices for each virtual device in * the device tree. Drivers will associate with them later. */ for (of_node = node_vroot->child; of_node != NULL; of_node = of_node->sibling) { printk(KERN_DEBUG "%s: processing %p\n", __FUNCTION__, of_node); vio_register_device_node(of_node); } } return 0; }