powerpc/fsl_msi: reorganize structs to improve clarity and flexibility
authorTudor Laurentiu <b10716@freescale.com>
Tue, 19 Aug 2014 11:25:01 +0000 (14:25 +0300)
committerScott Wood <scottwood@freescale.com>
Thu, 4 Sep 2014 23:41:29 +0000 (18:41 -0500)
Store cascade_data in an array inside the driver
data for later use.
Get rid of the msi_virq array since now we can
encapsulate the virqs in the cascade_data
directly and access them through the array
mentioned earlier.

Signed-off-by: Laurentiu Tudor <Laurentiu.Tudor@freescale.com>
Cc: Scott Wood <scottwood@freescale.com>
Cc: Mihai Caraman <mihai.caraman@freescale.com>
Signed-off-by: Scott Wood <scottwood@freescale.com>
arch/powerpc/sysdev/fsl_msi.c
arch/powerpc/sysdev/fsl_msi.h

index 9fadc6e4dc47a256aa7b5f145af9400c0735fd39..05a0dd918de27cf496fabeddfa4e94952a313642 100644 (file)
@@ -50,6 +50,7 @@ struct fsl_msi_feature {
 struct fsl_msi_cascade_data {
        struct fsl_msi *msi_data;
        int index;
+       int virq;
 };
 
 static inline u32 fsl_msi_read(u32 __iomem *base, unsigned int reg)
@@ -327,15 +328,18 @@ static int fsl_of_msi_remove(struct platform_device *ofdev)
 {
        struct fsl_msi *msi = platform_get_drvdata(ofdev);
        int virq, i;
-       struct fsl_msi_cascade_data *cascade_data;
 
        if (msi->list.prev != NULL)
                list_del(&msi->list);
        for (i = 0; i < NR_MSI_REG_MAX; i++) {
-               virq = msi->msi_virqs[i];
-               if (virq != NO_IRQ) {
-                       cascade_data = irq_get_handler_data(virq);
-                       kfree(cascade_data);
+               if (msi->cascade_array[i]) {
+                       virq = msi->cascade_array[i]->virq;
+
+                       BUG_ON(virq == NO_IRQ);
+                       BUG_ON(msi->cascade_array[i] !=
+                               irq_get_handler_data(virq));
+
+                       kfree(msi->cascade_array[i]);
                        irq_dispose_mapping(virq);
                }
        }
@@ -369,9 +373,10 @@ static int fsl_msi_setup_hwirq(struct fsl_msi *msi, struct platform_device *dev,
                return -ENOMEM;
        }
        irq_set_lockdep_class(virt_msir, &fsl_msi_irq_class);
-       msi->msi_virqs[irq_index] = virt_msir;
        cascade_data->index = offset;
        cascade_data->msi_data = msi;
+       cascade_data->virq = virt_msir;
+       msi->cascade_array[irq_index] = cascade_data;
        irq_set_handler_data(virt_msir, cascade_data);
        irq_set_chained_handler(virt_msir, fsl_msi_cascade);
 
index df9aa9fe0933b1f1f08ca8dcb270218b955e5b5b..420cfcbdac01c5c30a72fa64613a43373e17c8c5 100644 (file)
@@ -27,6 +27,8 @@
 #define FSL_PIC_IP_IPIC   0x00000002
 #define FSL_PIC_IP_VMPIC  0x00000003
 
+struct fsl_msi_cascade_data;
+
 struct fsl_msi {
        struct irq_domain *irqhost;
 
@@ -37,7 +39,7 @@ struct fsl_msi {
        u32 srs_shift; /* Shift of the shared interrupt register select */
        void __iomem *msi_regs;
        u32 feature;
-       int msi_virqs[NR_MSI_REG_MAX];
+       struct fsl_msi_cascade_data *cascade_array[NR_MSI_REG_MAX];
 
        struct msi_bitmap bitmap;