diff options
Diffstat (limited to 'arch/x86/kernel/devicetree.c')
| -rw-r--r-- | arch/x86/kernel/devicetree.c | 60 | 
1 files changed, 18 insertions, 42 deletions
diff --git a/arch/x86/kernel/devicetree.c b/arch/x86/kernel/devicetree.c index 9aeb78a23de4..a621f3427685 100644 --- a/arch/x86/kernel/devicetree.c +++ b/arch/x86/kernel/devicetree.c @@ -134,6 +134,24 @@ static int __init add_bus_probe(void)  module_init(add_bus_probe);  #ifdef CONFIG_PCI +struct device_node *pcibios_get_phb_of_node(struct pci_bus *bus) +{ +	struct device_node *np; + +	for_each_node_by_type(np, "pci") { +		const void *prop; +		unsigned int bus_min; + +		prop = of_get_property(np, "bus-range", NULL); +		if (!prop) +			continue; +		bus_min = be32_to_cpup(prop); +		if (bus->number == bus_min) +			return np; +	} +	return NULL; +} +  static int x86_of_pci_irq_enable(struct pci_dev *dev)  {  	struct of_irq oirq; @@ -165,50 +183,8 @@ static void x86_of_pci_irq_disable(struct pci_dev *dev)  void __cpuinit x86_of_pci_init(void)  { -	struct device_node *np; -  	pcibios_enable_irq = x86_of_pci_irq_enable;  	pcibios_disable_irq = x86_of_pci_irq_disable; - -	for_each_node_by_type(np, "pci") { -		const void *prop; -		struct pci_bus *bus; -		unsigned int bus_min; -		struct device_node *child; - -		prop = of_get_property(np, "bus-range", NULL); -		if (!prop) -			continue; -		bus_min = be32_to_cpup(prop); - -		bus = pci_find_bus(0, bus_min); -		if (!bus) { -			printk(KERN_ERR "Can't find a node for bus %s.\n", -					np->full_name); -			continue; -		} - -		if (bus->self) -			bus->self->dev.of_node = np; -		else -			bus->dev.of_node = np; - -		for_each_child_of_node(np, child) { -			struct pci_dev *dev; -			u32 devfn; - -			prop = of_get_property(child, "reg", NULL); -			if (!prop) -				continue; - -			devfn = (be32_to_cpup(prop) >> 8) & 0xff; -			dev = pci_get_slot(bus, devfn); -			if (!dev) -				continue; -			dev->dev.of_node = child; -			pci_dev_put(dev); -		} -	}  }  #endif  |