|
@@ -78,6 +78,12 @@ static void pcibios_scanbus(struct pci_controller *hose)
|
|
|
static int need_domain_info;
|
|
|
LIST_HEAD(resources);
|
|
|
struct pci_bus *bus;
|
|
|
+ struct pci_host_bridge *bridge;
|
|
|
+ int ret;
|
|
|
+
|
|
|
+ bridge = pci_alloc_host_bridge(0);
|
|
|
+ if (!bridge)
|
|
|
+ return;
|
|
|
|
|
|
if (hose->get_busno && pci_has_flag(PCI_PROBE_ONLY))
|
|
|
next_busno = (*hose->get_busno)();
|
|
@@ -87,14 +93,20 @@ static void pcibios_scanbus(struct pci_controller *hose)
|
|
|
pci_add_resource_offset(&resources,
|
|
|
hose->io_resource, hose->io_offset);
|
|
|
pci_add_resource(&resources, hose->busn_resource);
|
|
|
- bus = pci_scan_root_bus(NULL, next_busno, hose->pci_ops, hose,
|
|
|
- &resources);
|
|
|
- if (!bus) {
|
|
|
- pci_free_resource_list(&resources);
|
|
|
+ list_splice_init(&resources, &bridge->windows);
|
|
|
+ bridge->dev.parent = NULL;
|
|
|
+ bridge->sysdata = hose;
|
|
|
+ bridge->busnr = next_busno;
|
|
|
+ bridge->ops = hose->pci_ops;
|
|
|
+ bridge->swizzle_irq = pci_common_swizzle;
|
|
|
+ bridge->map_irq = pcibios_map_irq;
|
|
|
+ ret = pci_scan_root_bus_bridge(bridge);
|
|
|
+ if (ret) {
|
|
|
+ pci_free_host_bridge(bridge);
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- hose->bus = bus;
|
|
|
+ hose->bus = bus = bridge->bus;
|
|
|
|
|
|
need_domain_info = need_domain_info || pci_domain_nr(bus);
|
|
|
set_pci_need_domain_info(hose, need_domain_info);
|
|
@@ -224,8 +236,6 @@ static int __init pcibios_init(void)
|
|
|
list_for_each_entry(hose, &controllers, list)
|
|
|
pcibios_scanbus(hose);
|
|
|
|
|
|
- pci_fixup_irqs(pci_common_swizzle, pcibios_map_irq);
|
|
|
-
|
|
|
pci_initialized = 1;
|
|
|
|
|
|
return 0;
|