PCI: mobiveil: Add callback function for interrupt initialization
authorHou Zhiqiang <Zhiqiang.Hou@nxp.com>
Thu, 13 Feb 2020 04:06:36 +0000 (12:06 +0800)
committerLorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Fri, 21 Feb 2020 11:53:22 +0000 (11:53 +0000)
The Mobiveil GPEX internal MSI/INTx controller is not implemented
in all platforms in which the Mobiveil GPEX is integrated.

Allow platforms to implement their specific interrupt initialization.

Signed-off-by: Hou Zhiqiang <Zhiqiang.Hou@nxp.com>
Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Reviewed-by: Andrew Murray <amurray@thegoodpenguin.co.uk>
drivers/pci/controller/mobiveil/pcie-mobiveil-host.c
drivers/pci/controller/mobiveil/pcie-mobiveil.h

index 432b019a4fcfa89f0571d4cde517d39946b9d85a..8d12682e8346545997e35b242f36700184582798 100644 (file)
@@ -499,7 +499,7 @@ static int mobiveil_pcie_init_irq_domain(struct mobiveil_pcie *pcie)
        return 0;
 }
 
-static int mobiveil_pcie_interrupt_init(struct mobiveil_pcie *pcie)
+static int mobiveil_pcie_integrated_interrupt_init(struct mobiveil_pcie *pcie)
 {
        struct platform_device *pdev = pcie->pdev;
        struct device *dev = &pdev->dev;
@@ -539,6 +539,16 @@ static int mobiveil_pcie_interrupt_init(struct mobiveil_pcie *pcie)
        return 0;
 }
 
+static int mobiveil_pcie_interrupt_init(struct mobiveil_pcie *pcie)
+{
+       struct mobiveil_root_port *rp = &pcie->rp;
+
+       if (rp->ops->interrupt_init)
+               return rp->ops->interrupt_init(pcie);
+
+       return mobiveil_pcie_integrated_interrupt_init(pcie);
+}
+
 int mobiveil_pcie_host_probe(struct mobiveil_pcie *pcie)
 {
        struct mobiveil_root_port *rp = &pcie->rp;
index 98ad7227b0223e21e9919c4e9b8474b1525b7771..1f7d9da765424acecd91316ffc38225c21638a58 100644 (file)
@@ -130,10 +130,17 @@ struct mobiveil_msi {                     /* MSI information */
        DECLARE_BITMAP(msi_irq_in_use, PCI_NUM_MSI);
 };
 
+struct mobiveil_pcie;
+
+struct mobiveil_rp_ops {
+       int (*interrupt_init)(struct mobiveil_pcie *pcie);
+};
+
 struct mobiveil_root_port {
        char root_bus_nr;
        void __iomem *config_axi_slave_base;    /* endpoint config base */
        struct resource *ob_io_res;
+       struct mobiveil_rp_ops *ops;
        int irq;
        raw_spinlock_t intx_mask_lock;
        struct irq_domain *intx_domain;