diff options
Diffstat (limited to 'arch/powerpc/kernel/pci-common.c')
| -rw-r--r-- | arch/powerpc/kernel/pci-common.c | 30 | 
1 files changed, 19 insertions, 11 deletions
diff --git a/arch/powerpc/kernel/pci-common.c b/arch/powerpc/kernel/pci-common.c index fa4a573d671..cce98d76e90 100644 --- a/arch/powerpc/kernel/pci-common.c +++ b/arch/powerpc/kernel/pci-common.c @@ -1131,6 +1131,11 @@ void __devinit pcibios_setup_bus_devices(struct pci_bus *bus)  	}  } +void pcibios_set_master(struct pci_dev *dev) +{ +	/* No special bus mastering setup handling */ +} +  void __devinit pcibios_fixup_bus(struct pci_bus *bus)  {  	/* When called from the generic PCI probe, read PCI<->PCI bridge @@ -1560,14 +1565,13 @@ int pcibios_enable_device(struct pci_dev *dev, int mask)  	return pci_enable_resources(dev, mask);  } -void __devinit pcibios_setup_phb_resources(struct pci_controller *hose) +static void __devinit pcibios_setup_phb_resources(struct pci_controller *hose, struct list_head *resources)  { -	struct pci_bus *bus = hose->bus;  	struct resource *res;  	int i;  	/* Hookup PHB IO resource */ -	bus->resource[0] = res = &hose->io_resource; +	res = &hose->io_resource;  	if (!res->flags) {  		printk(KERN_WARNING "PCI: I/O resource not set for host" @@ -1585,6 +1589,7 @@ void __devinit pcibios_setup_phb_resources(struct pci_controller *hose)  		 (unsigned long long)res->start,  		 (unsigned long long)res->end,  		 (unsigned long)res->flags); +	pci_add_resource(resources, res);  	/* Hookup PHB Memory resources */  	for (i = 0; i < 3; ++i) { @@ -1602,12 +1607,12 @@ void __devinit pcibios_setup_phb_resources(struct pci_controller *hose)  			res->flags = IORESOURCE_MEM;  #endif /* CONFIG_PPC32 */  		} -		bus->resource[i+1] = res;  		pr_debug("PCI: PHB MEM resource %d = %016llx-%016llx [%lx]\n", i,  			 (unsigned long long)res->start,  			 (unsigned long long)res->end,  			 (unsigned long)res->flags); +		pci_add_resource(resources, res);  	}  	pr_debug("PCI: PHB MEM offset     = %016llx\n", @@ -1701,6 +1706,7 @@ struct device_node *pcibios_get_phb_of_node(struct pci_bus *bus)   */  void __devinit pcibios_scan_phb(struct pci_controller *hose)  { +	LIST_HEAD(resources);  	struct pci_bus *bus;  	struct device_node *node = hose->dn;  	int mode; @@ -1708,22 +1714,24 @@ void __devinit pcibios_scan_phb(struct pci_controller *hose)  	pr_debug("PCI: Scanning PHB %s\n",  		 node ? node->full_name : "<NO NAME>"); +	/* Get some IO space for the new PHB */ +	pcibios_setup_phb_io_space(hose); + +	/* Wire up PHB bus resources */ +	pcibios_setup_phb_resources(hose, &resources); +  	/* Create an empty bus for the toplevel */ -	bus = pci_create_bus(hose->parent, hose->first_busno, hose->ops, hose); +	bus = pci_create_root_bus(hose->parent, hose->first_busno, +				  hose->ops, hose, &resources);  	if (bus == NULL) {  		pr_err("Failed to create bus for PCI domain %04x\n",  			hose->global_number); +		pci_free_resource_list(&resources);  		return;  	}  	bus->secondary = hose->first_busno;  	hose->bus = bus; -	/* Get some IO space for the new PHB */ -	pcibios_setup_phb_io_space(hose); - -	/* Wire up PHB bus resources */ -	pcibios_setup_phb_resources(hose); -  	/* Get probe mode and perform scan */  	mode = PCI_PROBE_NORMAL;  	if (node && ppc_md.pci_probe_mode)  |