Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8953aab1 authored by Lorenzo Pieralisi's avatar Lorenzo Pieralisi Committed by Bjorn Helgaas
Browse files

ARM/PCI, designware, xilinx: Use pci_scan_root_bus_msi()



ARM previously stored the msi_controller pointer in its sysdata, struct
pci_sys_data, and implemented pcibios_msi_controller() to retrieve it.
That made PCI host controller drivers specific to ARM because they had to
put the msi_controller pointer in the ARM-specific pci_sys_data.

There is now a generic mechanism, pci_scan_root_bus_msi(), for giving the
msi_controller pointer to the PCI core.  Use this for all ARM systems and
for the DesignWare and Xilinx PCI host controller drivers.

This removes an ARM dependency from the DesignWare, DRA7xx, EXYNOS, i.MX6,
Keystone, Layerscape, SPEAr13xx, and Xilinx drivers.

[bhelgaas: changelog, split into separate patch]
Suggested-by: default avatarRussell King <linux@arm.linux.org.uk>
Signed-off-by: default avatarLorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Signed-off-by: default avatarBjorn Helgaas <bhelgaas@google.com>
Acked-by: default avatarJingoo Han <jingoohan1@gmail.com>
CC: Pratyush Anand <pratyush.anand@gmail.com>
CC: Arnd Bergmann <arnd@arndb.de>
CC: Simon Horman <horms@verge.net.au>
CC: Russell King <linux@arm.linux.org.uk>
CC: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
CC: Thierry Reding <thierry.reding@gmail.com>
CC: Michal Simek <michal.simek@xilinx.com>
CC: Marc Zyngier <marc.zyngier@arm.com>
parent d2a7926d
Loading
Loading
Loading
Loading
+0 −2
Original line number Diff line number Diff line
@@ -19,9 +19,7 @@ struct pci_bus;
struct device;

struct hw_pci {
#ifdef CONFIG_PCI_MSI
	struct msi_controller *msi_ctrl;
#endif
	struct pci_ops	*ops;
	int		nr_controllers;
	void		**private_data;
+3 −2
Original line number Diff line number Diff line
@@ -486,8 +486,9 @@ static void pcibios_init_hw(struct device *parent, struct hw_pci *hw,
			if (hw->scan)
				sys->bus = hw->scan(nr, sys);
			else
				sys->bus = pci_scan_root_bus(parent, sys->busnr,
						hw->ops, sys, &sys->resources);
				sys->bus = pci_scan_root_bus_msi(parent,
					sys->busnr, hw->ops, sys,
					&sys->resources, hw->msi_ctrl);

			if (WARN(!sys->bus, "PCI: unable to scan bus!")) {
				kfree(sys);
+9 −3
Original line number Diff line number Diff line
@@ -526,7 +526,6 @@ int dw_pcie_host_init(struct pcie_port *pp)

#ifdef CONFIG_PCI_MSI
	dw_pcie_msi_chip.dev = pp->dev;
	dw_pci.msi_ctrl = &dw_pcie_msi_chip;
#endif

	dw_pci.nr_controllers = 1;
@@ -708,8 +707,15 @@ static struct pci_bus *dw_pcie_scan_bus(int nr, struct pci_sys_data *sys)
	struct pcie_port *pp = sys_to_pcie(sys);

	pp->root_bus_nr = sys->busnr;
	bus = pci_scan_root_bus(pp->dev, sys->busnr,
				  &dw_pcie_ops, sys, &sys->resources);

	if (IS_ENABLED(CONFIG_PCI_MSI))
		bus = pci_scan_root_bus_msi(pp->dev, sys->busnr, &dw_pcie_ops,
					    sys, &sys->resources,
					    &dw_pcie_msi_chip);
	else
		bus = pci_scan_root_bus(pp->dev, sys->busnr, &dw_pcie_ops,
					sys, &sys->resources);

	if (!bus)
		return NULL;

+8 −3
Original line number Diff line number Diff line
@@ -647,9 +647,15 @@ static struct pci_bus *xilinx_pcie_scan_bus(int nr, struct pci_sys_data *sys)
	struct pci_bus *bus;

	port->root_busno = sys->busnr;
	bus = pci_scan_root_bus(port->dev, sys->busnr, &xilinx_pcie_ops,
				sys, &sys->resources);

	if (IS_ENABLED(CONFIG_PCI_MSI))
		bus = pci_scan_root_bus_msi(port->dev, sys->busnr,
					    &xilinx_pcie_ops, sys,
					    &sys->resources,
					    &xilinx_pcie_msi_chip);
	else
		bus = pci_scan_root_bus(port->dev, sys->busnr,
					&xilinx_pcie_ops, sys, &sys->resources);
	return bus;
}

@@ -847,7 +853,6 @@ static int xilinx_pcie_probe(struct platform_device *pdev)

#ifdef CONFIG_PCI_MSI
	xilinx_pcie_msi_chip.dev = port->dev;
	hw.msi_ctrl = &xilinx_pcie_msi_chip;
#endif
	pci_common_init_dev(dev, &hw);