]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - drivers/pci/host/pcie-iproc.c
Merge branch 'pci/host-rockchip' into next
[karo-tx-linux.git] / drivers / pci / host / pcie-iproc.c
index e48b8e2fa0b9a51d3ea91da0ecbc22725740b6df..c5748634885636e7daf6b40804a037707d1260f0 100644 (file)
@@ -1259,7 +1259,8 @@ int iproc_pcie_setup(struct iproc_pcie *pcie, struct list_head *res)
        struct device *dev;
        int ret;
        void *sysdata;
-       struct pci_bus *bus, *child;
+       struct pci_bus *child;
+       struct pci_host_bridge *host = pci_host_bridge_from_priv(pcie);
 
        dev = pcie->dev;
 
@@ -1306,18 +1307,10 @@ int iproc_pcie_setup(struct iproc_pcie *pcie, struct list_head *res)
        sysdata = pcie;
 #endif
 
-       bus = pci_create_root_bus(dev, 0, &iproc_pcie_ops, sysdata, res);
-       if (!bus) {
-               dev_err(dev, "unable to create PCI root bus\n");
-               ret = -ENOMEM;
-               goto err_power_off_phy;
-       }
-       pcie->root_bus = bus;
-
        ret = iproc_pcie_check_link(pcie);
        if (ret) {
                dev_err(dev, "no PCIe EP device detected\n");
-               goto err_rm_root_bus;
+               goto err_power_off_phy;
        }
 
        iproc_pcie_enable(pcie);
@@ -1326,23 +1319,31 @@ int iproc_pcie_setup(struct iproc_pcie *pcie, struct list_head *res)
                if (iproc_pcie_msi_enable(pcie))
                        dev_info(dev, "not using iProc MSI\n");
 
-       pci_scan_child_bus(bus);
-       pci_assign_unassigned_bus_resources(bus);
+       list_splice_init(res, &host->windows);
+       host->busnr = 0;
+       host->dev.parent = dev;
+       host->ops = &iproc_pcie_ops;
+       host->sysdata = sysdata;
+       host->map_irq = pcie->map_irq;
+       host->swizzle_irq = pci_common_swizzle;
+
+       ret = pci_scan_root_bus_bridge(host);
+       if (ret < 0) {
+               dev_err(dev, "failed to scan host: %d\n", ret);
+               goto err_power_off_phy;
+       }
 
-       if (pcie->map_irq)
-               pci_fixup_irqs(pci_common_swizzle, pcie->map_irq);
+       pci_assign_unassigned_bus_resources(host->bus);
 
-       list_for_each_entry(child, &bus->children, node)
+       pcie->root_bus = host->bus;
+
+       list_for_each_entry(child, &host->bus->children, node)
                pcie_bus_configure_settings(child);
 
-       pci_bus_add_devices(bus);
+       pci_bus_add_devices(host->bus);
 
        return 0;
 
-err_rm_root_bus:
-       pci_stop_root_bus(bus);
-       pci_remove_root_bus(bus);
-
 err_power_off_phy:
        phy_power_off(pcie->phy);
 err_exit_phy: