struct pci_sys_data;
 struct pci_ops;
 struct pci_bus;
+struct pci_host_bridge;
 struct device;
 
 struct hw_pci {
        unsigned int    io_optional:1;
        void            **private_data;
        int             (*setup)(int nr, struct pci_sys_data *);
-       struct pci_bus *(*scan)(int nr, struct pci_sys_data *);
+       int             (*scan)(int nr, struct pci_host_bridge *);
        void            (*preinit)(void);
        void            (*postinit)(void);
        u8              (*swizzle)(struct pci_dev *dev, u8 *pin);
 
        int nr, busnr;
 
        for (nr = busnr = 0; nr < hw->nr_controllers; nr++) {
-               sys = kzalloc(sizeof(struct pci_sys_data), GFP_KERNEL);
-               if (WARN(!sys, "PCI: unable to allocate sys data!"))
+               struct pci_host_bridge *bridge;
+
+               bridge = pci_alloc_host_bridge(sizeof(struct pci_sys_data));
+               if (WARN(!bridge, "PCI: unable to allocate bridge!"))
                        break;
 
+               sys = pci_host_bridge_priv(bridge);
+
                sys->busnr   = busnr;
                sys->swizzle = hw->swizzle;
                sys->map_irq = hw->map_irq;
                ret = hw->setup(nr, sys);
 
                if (ret > 0) {
-                       struct pci_host_bridge *host_bridge;
 
                        ret = pcibios_init_resource(nr, sys, hw->io_optional);
                        if (ret)  {
                        }
 
                        if (hw->scan)
-                               sys->bus = hw->scan(nr, sys);
-                       else
-                               sys->bus = pci_scan_root_bus_msi(parent,
-                                       sys->busnr, hw->ops, sys,
-                                       &sys->resources, hw->msi_ctrl);
+                               ret = hw->scan(nr, bridge);
+                       else {
+                               list_splice_init(&sys->resources,
+                                                &bridge->windows);
+                               bridge->dev.parent = parent;
+                               bridge->sysdata = sys;
+                               bridge->busnr = sys->busnr;
+                               bridge->ops = hw->ops;
+                               bridge->msi = hw->msi_ctrl;
+                               bridge->align_resource =
+                                               hw->align_resource;
+
+                               ret = pci_scan_root_bus_bridge(bridge);
+                       }
 
-                       if (WARN(!sys->bus, "PCI: unable to scan bus!")) {
-                               kfree(sys);
+                       if (WARN(ret < 0, "PCI: unable to scan bus!")) {
+                               pci_free_host_bridge(bridge);
                                break;
                        }
 
+                       sys->bus = bridge->bus;
+
                        busnr = sys->bus->busn_res.end + 1;
 
                        list_add(&sys->node, head);
-
-                       host_bridge = pci_find_host_bridge(sys->bus);
-                       host_bridge->align_resource = hw->align_resource;
                } else {
-                       kfree(sys);
+                       pci_free_host_bridge(bridge);
                        if (ret < 0)
                                break;
                }
 
 }
 DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_MARVELL, PCI_ANY_ID, rc_pci_fixup);
 
-static struct pci_bus __init *
-dove_pcie_scan_bus(int nr, struct pci_sys_data *sys)
+static int __init
+dove_pcie_scan_bus(int nr, struct pci_host_bridge *bridge)
 {
+       struct pci_sys_data *sys = pci_host_bridge_priv(bridge);
+
        if (nr >= num_pcie_ports) {
                BUG();
-               return NULL;
+               return -EINVAL;
        }
 
-       return pci_scan_root_bus(NULL, sys->busnr, &pcie_ops, sys,
-                                &sys->resources);
+       list_splice_init(&sys->resources, &bridge->windows);
+       bridge->dev.parent = NULL;
+       bridge->sysdata = sys;
+       bridge->busnr = sys->busnr;
+       bridge->ops = &pcie_ops;
+
+       return pci_scan_root_bus_bridge(bridge);
 }
 
 static int __init dove_pcie_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
 
 
 /* Scan an IOP13XX PCI bus.  nr selects which ATU we use.
  */
-struct pci_bus *iop13xx_scan_bus(int nr, struct pci_sys_data *sys)
+int iop13xx_scan_bus(int nr, struct pci_host_bridge *bridge)
 {
-       int which_atu;
-       struct pci_bus *bus = NULL;
+       int which_atu, ret;
+       struct pci_sys_data *sys = pci_host_bridge_priv(bridge);
 
        switch (init_atu) {
        case IOP13XX_INIT_ATU_ATUX:
 
        if (!which_atu) {
                BUG();
-               return NULL;
+               return -ENODEV;
        }
 
+       list_splice_init(&sys->resources, &bridge->windows);
+       bridge->dev.parent = NULL;
+       bridge->sysdata = sys;
+       bridge->busnr = sys->busnr;
+
        switch (which_atu) {
        case IOP13XX_INIT_ATU_ATUX:
                if (time_after_eq(jiffies + msecs_to_jiffies(1000),
                        while(time_before(jiffies, atux_trhfa_timeout))
                                udelay(100);
 
-               bus = pci_bus_atux = pci_scan_root_bus(NULL, sys->busnr,
-                                                      &iop13xx_atux_ops,
-                                                      sys, &sys->resources);
+               bridge->ops = &iop13xx_atux_ops;
+               ret = pci_scan_root_bus_bridge(bridge);
+               if (!ret)
+                       pci_bus_atux = bridge->bus;
                break;
        case IOP13XX_INIT_ATU_ATUE:
-               bus = pci_bus_atue = pci_scan_root_bus(NULL, sys->busnr,
-                                                      &iop13xx_atue_ops,
-                                                      sys, &sys->resources);
+               bridge->ops = &iop13xx_atue_ops;
+               ret = pci_scan_root_bus_bridge(bridge);
+               if (!ret)
+                       pci_bus_atue = bridge->bus;
                break;
+       default:
+               ret = -EINVAL;
        }
 
-       return bus;
+       return ret;
 }
 
 /* This function is called from iop13xx_pci_init() after assigning valid
 
 extern size_t iop13xx_atux_mem_size;
 
 struct pci_sys_data;
+struct pci_host_bridge;
 struct hw_pci;
 int iop13xx_pci_setup(int nr, struct pci_sys_data *sys);
-struct pci_bus *iop13xx_scan_bus(int nr, struct pci_sys_data *);
+int iop13xx_scan_bus(int nr, struct pci_host_bridge *bridge);
 void iop13xx_atu_select(struct hw_pci *plat_pci);
 void iop13xx_pci_init(void);
 void iop13xx_map_pci_memory(void);
 
 }
 DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_MARVELL, PCI_ANY_ID, rc_pci_fixup);
 
-static struct pci_bus __init *
-mv78xx0_pcie_scan_bus(int nr, struct pci_sys_data *sys)
+static int __init mv78xx0_pcie_scan_bus(int nr, struct pci_host_bridge *bridge)
 {
+       struct pci_sys_data *sys = pci_host_bridge_priv(bridge);
+
        if (nr >= num_pcie_ports) {
                BUG();
-               return NULL;
+               return -EINVAL;
        }
 
-       return pci_scan_root_bus(NULL, sys->busnr, &pcie_ops, sys,
-                                &sys->resources);
+       list_splice_init(&sys->resources, &bridge->windows);
+       bridge->dev.parent = NULL;
+       bridge->sysdata = sys;
+       bridge->busnr = sys->busnr;
+       bridge->ops = &pcie_ops;
+
+       return pci_scan_root_bus_bridge(bridge);
 }
 
 static int __init mv78xx0_pcie_map_irq(const struct pci_dev *dev, u8 slot,
 
  * PCIe/PCI functions.
  */
 struct pci_bus;
+struct pci_host_bridge;
 struct pci_sys_data;
 struct pci_dev;
 
 void orion5x_pci_disable(void);
 void orion5x_pci_set_cardbus_mode(void);
 int orion5x_pci_sys_setup(int nr, struct pci_sys_data *sys);
-struct pci_bus *orion5x_pci_sys_scan_bus(int nr, struct pci_sys_data *sys);
+int orion5x_pci_sys_scan_bus(int nr, struct pci_host_bridge *bridge);
 int orion5x_pci_map_irq(const struct pci_dev *dev, u8 slot, u8 pin);
 
 struct tag;
 
        return 0;
 }
 
-struct pci_bus __init *orion5x_pci_sys_scan_bus(int nr, struct pci_sys_data *sys)
+int __init orion5x_pci_sys_scan_bus(int nr, struct pci_host_bridge *bridge)
 {
-       if (nr == 0)
-               return pci_scan_root_bus(NULL, sys->busnr, &pcie_ops, sys,
-                                        &sys->resources);
+       struct pci_sys_data *sys = pci_host_bridge_priv(bridge);
 
-       if (nr == 1 && !orion5x_pci_disabled)
-               return pci_scan_root_bus(NULL, sys->busnr, &pci_ops, sys,
-                                        &sys->resources);
+       list_splice_init(&sys->resources, &bridge->windows);
+       bridge->dev.parent = NULL;
+       bridge->sysdata = sys;
+       bridge->busnr = sys->busnr;
+
+       if (nr == 0) {
+               bridge->ops = &pcie_ops;
+               return pci_scan_root_bus_bridge(bridge);
+       }
+
+       if (nr == 1 && !orion5x_pci_disabled) {
+               bridge->ops = &pci_ops;
+               return pci_scan_root_bus_bridge(bridge);
+       }
 
        BUG();
-       return NULL;
+       return -ENODEV;
 }
 
 int __init orion5x_pci_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)