In Linux struct pci_bus has a 'parent' member which is a pointer to the parent pci_bus. In barebox we also have a 'parent' member, but it is of type struct device *. To be closer to Linux remove the parent member and replace its usage with a struct pci_dev *self member (which also exists in Linux). Signed-off-by: Sascha Hauer <s.hauer@xxxxxxxxxxxxxx> --- drivers/pci/pci.c | 10 ++++++---- include/linux/pci.h | 3 ++- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c index 84678e40a9..8b96ac78df 100644 --- a/drivers/pci/pci.c +++ b/drivers/pci/pci.c @@ -48,7 +48,6 @@ void register_pci_controller(struct pci_controller *hose) bus = pci_alloc_bus(); hose->bus = bus; - bus->parent = hose->parent; bus->host = hose; bus->resource[PCI_BUS_RESOURCE_MEM] = hose->mem_resource; bus->resource[PCI_BUS_RESOURCE_MEM_PREF] = hose->mem_pref_resource; @@ -599,6 +598,8 @@ static unsigned int pci_scan_bus(struct pci_bus *bus) max = bus->secondary; for (devfn = 0; devfn < 0xff; ++devfn) { + struct device *parent; + if (PCI_FUNC(devfn) && !is_multi) { /* not a multi-function device */ continue; @@ -618,8 +619,9 @@ static unsigned int pci_scan_bus(struct pci_bus *bus) dev->devfn = devfn; dev->vendor = l & 0xffff; dev->device = (l >> 16) & 0xffff; - dev->dev.parent = bus->parent; - dev->dev.of_node = pci_of_match_device(bus->parent, devfn); + parent = bus->self ? &bus->self->dev : bus->host->parent; + dev->dev.parent = parent; + dev->dev.of_node = pci_of_match_device(parent, devfn); if (dev->dev.of_node) pr_debug("found DT node %pOF for device %04x:%04x\n", dev->dev.of_node, @@ -668,7 +670,7 @@ static unsigned int pci_scan_bus(struct pci_bus *bus) child_bus->resource[PCI_BUS_RESOURCE_IO] = bus->resource[PCI_BUS_RESOURCE_IO]; - child_bus->parent = &dev->dev; + child_bus->self = dev; if (pcibios_assign_all_busses()) { child_bus->number = bus_index++; diff --git a/include/linux/pci.h b/include/linux/pci.h index aa29ff5d17..c4ae53a235 100644 --- a/include/linux/pci.h +++ b/include/linux/pci.h @@ -139,9 +139,10 @@ enum { PCI_BUS_RESOURCE_MEM_PREF = 2, PCI_BUS_RESOURCE_BUSN = 3, }; + struct pci_bus { struct pci_controller *host; /* associated host controller */ - struct device *parent; + struct pci_dev *self; struct pci_bus *parent_bus; /* parent bus */ struct list_head node; /* node in list of buses */ struct list_head children; /* list of child buses */ -- 2.39.2