Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

PCI: dwc: Save root bus for driver remove hooks

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>

authored by

Jisheng Zhang and committed by
Bjorn Helgaas
fe23274f e6fdd3bf

+7 -6
+6 -6
drivers/pci/controller/dwc/pcie-designware-host.c
··· 341 341 struct device_node *np = dev->of_node; 342 342 struct platform_device *pdev = to_platform_device(dev); 343 343 struct resource_entry *win, *tmp; 344 - struct pci_bus *bus, *child; 344 + struct pci_bus *child; 345 345 struct pci_host_bridge *bridge; 346 346 struct resource *cfg_res; 347 347 int ret; ··· 496 496 if (ret) 497 497 goto err_free_msi; 498 498 499 - bus = bridge->bus; 499 + pp->root_bus = bridge->bus; 500 500 501 501 if (pp->ops->scan_bus) 502 502 pp->ops->scan_bus(pp); 503 503 504 - pci_bus_size_bridges(bus); 505 - pci_bus_assign_resources(bus); 504 + pci_bus_size_bridges(pp->root_bus); 505 + pci_bus_assign_resources(pp->root_bus); 506 506 507 - list_for_each_entry(child, &bus->children, node) 507 + list_for_each_entry(child, &pp->root_bus->children, node) 508 508 pcie_bus_configure_settings(child); 509 509 510 - pci_bus_add_devices(bus); 510 + pci_bus_add_devices(pp->root_bus); 511 511 return 0; 512 512 513 513 err_free_msi:
+1
drivers/pci/controller/dwc/pcie-designware.h
··· 182 182 struct page *msi_page; 183 183 u32 num_vectors; 184 184 u32 irq_mask[MAX_MSI_CTRLS]; 185 + struct pci_bus *root_bus; 185 186 raw_spinlock_t lock; 186 187 DECLARE_BITMAP(msi_irq_in_use, MAX_MSI_IRQS); 187 188 };