path: root/arch/microblaze/pci
diff options
authorBenjamin Herrenschmidt <benh@kernel.crashing.org>2011-04-11 11:37:07 +1000
committerBenjamin Herrenschmidt <benh@kernel.crashing.org>2011-06-08 09:08:17 +1000
commit98d9f30c820d509145757e6ecbc36013aa02f7bc (patch)
treedd5da915d991352ced56ed849612029339f64198 /arch/microblaze/pci
parent1fa7b6a29c61358cc2ca6f64cef4aa0e1a7ca74c (diff)
pci/of: Match PCI devices to OF nodes dynamically
powerpc has two different ways of matching PCI devices to their corresponding OF node (if any) for historical reasons. The ppc64 one does a scan looking for matching bus/dev/fn, while the ppc32 one does a scan looking only for matching dev/fn on each level in order to be agnostic to busses being renumbered (which Linux does on some platforms). This removes both and instead moves the matching code to the PCI core itself. It's the most logical place to do it: when a pci_dev is created, we know the parent and thus can do a single level scan for the matching device_node (if any). The benefit is that all archs now get the matching for free. There's one hook the arch might want to provide to match a PHB bus to its device node. A default weak implementation is provided that looks for the parent device device node, but it's not entirely reliable on powerpc for various reasons so powerpc provides its own. Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org> Acked-by: Michal Simek <monstr@monstr.eu> Acked-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Diffstat (limited to 'arch/microblaze/pci')
1 files changed, 7 insertions, 33 deletions
diff --git a/arch/microblaze/pci/pci_32.c b/arch/microblaze/pci/pci_32.c
index 92728a6cfd8..2fa95069e6b 100644
--- a/arch/microblaze/pci/pci_32.c
+++ b/arch/microblaze/pci/pci_32.c
@@ -210,38 +210,6 @@ static struct device_node *scan_OF_for_pci_bus(struct pci_bus *bus)
return np;
- * Scans the OF tree for a device node matching a PCI device
- */
-struct device_node *
-pci_busdev_to_OF_node(struct pci_bus *bus, int devfn)
- struct device_node *parent, *np;
- pr_debug("pci_busdev_to_OF_node(%d,0x%x)\n", bus->number, devfn);
- parent = scan_OF_for_pci_bus(bus);
- if (parent == NULL)
- return NULL;
- pr_debug(" parent is %s\n", parent ? parent->full_name : "<NULL>");
- np = scan_OF_for_pci_dev(parent, devfn);
- of_node_put(parent);
- pr_debug(" result is %s\n", np ? np->full_name : "<NULL>");
- /* XXX most callers don't release the returned node
- * mostly because ppc64 doesn't increase the refcount,
- * we need to fix that.
- */
- return np;
-struct device_node*
-pci_device_to_OF_node(struct pci_dev *dev)
- return pci_busdev_to_OF_node(dev->bus, dev->devfn);
static int
find_OF_pci_device_filter(struct device_node *node, void *data)
@@ -315,6 +283,13 @@ pci_create_OF_bus_map(void)
+struct device_node *pcibios_get_phb_of_node(struct pci_bus *bus)
+ struct pci_controller *hose = bus->sysdata;
+ return of_node_get(hose->dn);
static void __devinit pcibios_scan_phb(struct pci_controller *hose)
struct pci_bus *bus;
@@ -332,7 +307,6 @@ static void __devinit pcibios_scan_phb(struct pci_controller *hose)
- bus.dev->of_node = of_node_get(node);
bus->secondary = hose->first_busno;
hose->bus = bus;