Hi Jan, On Tue, Jun 21, 2016 at 08:07:50PM +0200, Jan Kiszka wrote: > Particularly useful when working in virtual environments where the > controller may come and go, but possibly not only there. > > Signed-off-by: Jan Kiszka <jan.kiszka@xxxxxxxxxxx> > --- > drivers/pci/ecam.h | 1 + > drivers/pci/host/pci-host-common.c | 13 +++++++++++++ > drivers/pci/host/pci-host-generic.c | 1 + > 3 files changed, 15 insertions(+) > > diff --git a/drivers/pci/ecam.h b/drivers/pci/ecam.h > index 9878beb..5a5f607 100644 > --- a/drivers/pci/ecam.h > +++ b/drivers/pci/ecam.h > @@ -63,5 +63,6 @@ extern struct pci_ecam_ops pci_generic_ecam_ops; > /* for DT-based PCI controllers that support ECAM */ > int pci_host_common_probe(struct platform_device *pdev, > struct pci_ecam_ops *ops); > +int pci_host_common_remove(struct platform_device *pdev); > #endif > #endif > diff --git a/drivers/pci/host/pci-host-common.c b/drivers/pci/host/pci-host-common.c > index 8cba7ab..c0ff4b1 100644 > --- a/drivers/pci/host/pci-host-common.c > +++ b/drivers/pci/host/pci-host-common.c > @@ -164,6 +164,19 @@ int pci_host_common_probe(struct platform_device *pdev, > } > > pci_bus_add_devices(bus); > + platform_set_drvdata(pdev, bus); > + return 0; > +} > + > +int pci_host_common_remove(struct platform_device *pdev) > +{ > + struct pci_bus *bus = platform_get_drvdata(pdev); > + > + pci_lock_rescan_remove(); > + pci_stop_root_bus(bus); > + pci_remove_root_bus(bus); > + pci_unlock_rescan_remove(); A couple of comments/questions about this: - The probe path seems to have some stateful operations outside of PCI resources. For example, kzalloc'ing the bus_range resource in of_pci_get_host_bridge_resources. Do we need to clean these up explicitly? - Similarly, we don't seem to tear-down the config space mappings and data structures for that, so we leak VA space afaict. Will -- To unsubscribe from this list: send the line "unsubscribe linux-pci" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html