]> git.karo-electronics.de Git - linux-beck.git/commitdiff
ARM/PCI: Save MSI controller in pci_sys_data
authorYijing Wang <wangyijing@huawei.com>
Mon, 27 Oct 2014 07:48:40 +0000 (15:48 +0800)
committerBjorn Helgaas <bhelgaas@google.com>
Fri, 21 Nov 2014 16:32:29 +0000 (09:32 -0700)
Currently ARM associates an MSI controller with a PCI bus by defining
pcibios_add_bus() and using it to call a struct hw_pci.add_bus() method.
That method sets the struct pci_bus "msi" member.  That's unwieldy and
unnecessarily couples MSI with the PCI enumeration code.

On ARM, all devices under the same PCI host bridge share an MSI controller,
so add an msi_controller pointer to the struct pci_sys_data and implement
pcibios_msi_controller() to retrieve it.

This is a step toward moving the msi_controller pointer into the generic
struct pci_host_bridge.

[bhelgaas: changelog, take pci_dev instead of pci_bus]
Signed-off-by: Yijing Wang <wangyijing@huawei.com>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
arch/arm/include/asm/mach/pci.h
arch/arm/kernel/bios32.c

index 7fc42784becbf2ee4e4779d06b9345be6c8ccf06..8144d61e5693e7ca96d4272e0b21909d0a99a705 100644 (file)
@@ -21,6 +21,9 @@ struct device;
 struct hw_pci {
 #ifdef CONFIG_PCI_DOMAINS
        int             domain;
+#endif
+#ifdef CONFIG_PCI_MSI
+       struct msi_controller *msi_ctrl;
 #endif
        struct pci_ops  *ops;
        int             nr_controllers;
@@ -46,6 +49,9 @@ struct hw_pci {
 struct pci_sys_data {
 #ifdef CONFIG_PCI_DOMAINS
        int             domain;
+#endif
+#ifdef CONFIG_PCI_MSI
+       struct msi_controller *msi_ctrl;
 #endif
        struct list_head node;
        int             busnr;          /* primary bus number                   */
index 17a26c17f7f5731d78d257e7facd0080bba12d5f..ff2be3a22e1d11b27a5c41744f7de2bd130fe750 100644 (file)
 
 static int debug_pci;
 
+#ifdef CONFIG_PCI_MSI
+struct msi_controller *pcibios_msi_controller(struct pci_dev *dev)
+{
+       struct pci_sys_data *sysdata = dev->bus->sysdata;
+
+       return sysdata->msi_ctrl;
+}
+#endif
+
 /*
  * We can't use pci_get_device() here since we are
  * called from interrupt context.
@@ -470,6 +479,9 @@ static void pcibios_init_hw(struct device *parent, struct hw_pci *hw,
 
 #ifdef CONFIG_PCI_DOMAINS
                sys->domain  = hw->domain;
+#endif
+#ifdef CONFIG_PCI_MSI
+               sys->msi_ctrl = hw->msi_ctrl;
 #endif
                sys->busnr   = busnr;
                sys->swizzle = hw->swizzle;