Hi, On 18/03/2019 09:58, Jisheng Zhang wrote: > Currently dwc host doesn't support the remove, but nothing prevent us > from supporting it. Save the root bus for clean up work in driver > remove code path. > > After this patch, the dwc host users could implement its remove as: > > static int foo_pcie_remove(struct platform_device *pdev) > { > ... > pci_stop_root_bus(pp->root_bus); > pci_remove_root_bus(pp->root_bus); > dw_pcie_free_msi(pp); > ... > } > > Signed-off-by: Jisheng Zhang <jisheng.zh...@synaptics.com> > --- > drivers/pci/controller/dwc/pcie-designware-host.c | 12 ++++++------ > drivers/pci/controller/dwc/pcie-designware.h | 1 + > 2 files changed, 7 insertions(+), 6 deletions(-) > > diff --git a/drivers/pci/controller/dwc/pcie-designware-host.c > b/drivers/pci/controller/dwc/pcie-designware-host.c > index 68a9dac23b1b..7e9dad7ba056 100644 > --- a/drivers/pci/controller/dwc/pcie-designware-host.c > +++ b/drivers/pci/controller/dwc/pcie-designware-host.c > @@ -341,7 +341,7 @@ int dw_pcie_host_init(struct pcie_port *pp) > struct device_node *np = dev->of_node; > struct platform_device *pdev = to_platform_device(dev); > struct resource_entry *win, *tmp; > - struct pci_bus *bus, *child; > + struct pci_bus *child; > struct pci_host_bridge *bridge; > struct resource *cfg_res; > int ret; > @@ -496,18 +496,18 @@ int dw_pcie_host_init(struct pcie_port *pp) > if (ret) > goto err_free_msi; > > - bus = bridge->bus; > + pp->root_bus = bridge->bus; > > if (pp->ops->scan_bus) > pp->ops->scan_bus(pp); > > - pci_bus_size_bridges(bus); > - pci_bus_assign_resources(bus); > + pci_bus_size_bridges(pp->root_bus); > + pci_bus_assign_resources(pp->root_bus); > > - list_for_each_entry(child, &bus->children, node) > + list_for_each_entry(child, &pp->root_bus->children, node) > pcie_bus_configure_settings(child); > > - pci_bus_add_devices(bus); > + pci_bus_add_devices(pp->root_bus); > return 0; > > err_free_msi: > diff --git a/drivers/pci/controller/dwc/pcie-designware.h > b/drivers/pci/controller/dwc/pcie-designware.h > index 6fb0a1879932..adff0c713665 100644 > --- a/drivers/pci/controller/dwc/pcie-designware.h > +++ b/drivers/pci/controller/dwc/pcie-designware.h > @@ -182,6 +182,7 @@ struct pcie_port { > struct page *msi_page; > u32 num_vectors; > u32 irq_mask[MAX_MSI_CTRLS]; > + struct pci_bus *root_bus; > raw_spinlock_t lock; > DECLARE_BITMAP(msi_irq_in_use, MAX_MSI_IRQS); > }; >
Acked-by: Gustavo Pimentel <gustavo.pimen...@synopsys.com>