PCI: dwc: Save root bus for driver remove hooks
authorJisheng Zhang <Jisheng.Zhang@synaptics.com>
Fri, 29 Mar 2019 11:59:26 +0000 (11:59 +0000)
committerBjorn Helgaas <bhelgaas@google.com>
Tue, 7 May 2019 13:59:49 +0000 (08:59 -0500)
Currently DWC host does not support the remove callback, but nothing
prevents us from supporting it.

Save the root bus for clean up work in driver remove code paths to allow
DWC host drivers to implement their remove hook as, eg:

  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.Zhang@synaptics.com>
Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Acked-by: Gustavo Pimentel <gustavo.pimentel@synopsys.com>
drivers/pci/controller/dwc/pcie-designware-host.c
drivers/pci/controller/dwc/pcie-designware.h

index dcc7405..3e4169e 100644 (file)
@@ -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:
index 6fb0a18..adff0c7 100644 (file)
@@ -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);
 };