powerpc: mpic irq_data conversion.
authorLennert Buytenhek <buytenh@wantstofly.org>
Tue, 8 Mar 2011 22:26:43 +0000 (22:26 +0000)
committerBenjamin Herrenschmidt <benh@kernel.crashing.org>
Thu, 10 Mar 2011 00:03:56 +0000 (11:03 +1100)
Signed-off-by: Lennert Buytenhek <buytenh@secretlab.ca>
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
arch/powerpc/include/asm/mpic.h
arch/powerpc/platforms/pasemi/setup.c
arch/powerpc/sysdev/mpic.c
arch/powerpc/sysdev/mpic.h
arch/powerpc/sysdev/mpic_pasemi_msi.c
arch/powerpc/sysdev/mpic_u3msi.c

index e000cce..946ec49 100644 (file)
@@ -467,11 +467,11 @@ extern void mpic_request_ipis(void);
 void smp_mpic_message_pass(int target, int msg);
 
 /* Unmask a specific virq */
-extern void mpic_unmask_irq(unsigned int irq);
+extern void mpic_unmask_irq(struct irq_data *d);
 /* Mask a specific virq */
-extern void mpic_mask_irq(unsigned int irq);
+extern void mpic_mask_irq(struct irq_data *d);
 /* EOI a specific virq */
-extern void mpic_end_irq(unsigned int irq);
+extern void mpic_end_irq(struct irq_data *d);
 
 /* Fetch interrupt from a given mpic */
 extern unsigned int mpic_get_one_irq(struct mpic *mpic);
index f372ec1..a6067b3 100644 (file)
@@ -240,7 +240,7 @@ static __init void pas_init_IRQ(void)
                nmi_virq = irq_create_mapping(NULL, *nmiprop);
                mpic_irq_set_priority(nmi_virq, 15);
                set_irq_type(nmi_virq, IRQ_TYPE_EDGE_RISING);
-               mpic_unmask_irq(nmi_virq);
+               mpic_unmask_irq(irq_get_irq_data(nmi_virq));
        }
 
        of_node_put(mpic_node);
@@ -266,7 +266,7 @@ static int pas_machine_check_handler(struct pt_regs *regs)
        if (nmi_virq != NO_IRQ && mpic_get_mcirq() == nmi_virq) {
                printk(KERN_ERR "NMI delivered\n");
                debugger(regs);
-               mpic_end_irq(nmi_virq);
+               mpic_end_irq(irq_get_irq_data(nmi_virq));
                goto out;
        }
 
index b0c8469..eb70218 100644 (file)
@@ -611,7 +611,7 @@ static struct mpic *mpic_find(unsigned int irq)
        if (irq < NUM_ISA_INTERRUPTS)
                return NULL;
 
-       return irq_to_desc(irq)->chip_data;
+       return get_irq_chip_data(irq);
 }
 
 /* Determine if the linux irq is an IPI */
@@ -636,16 +636,22 @@ static inline u32 mpic_physmask(u32 cpumask)
 
 #ifdef CONFIG_SMP
 /* Get the mpic structure from the IPI number */
-static inline struct mpic * mpic_from_ipi(unsigned int ipi)
+static inline struct mpic * mpic_from_ipi(struct irq_data *d)
 {
-       return irq_to_desc(ipi)->chip_data;
+       return irq_data_get_irq_chip_data(d);
 }
 #endif
 
 /* Get the mpic structure from the irq number */
 static inline struct mpic * mpic_from_irq(unsigned int irq)
 {
-       return irq_to_desc(irq)->chip_data;
+       return get_irq_chip_data(irq);
+}
+
+/* Get the mpic structure from the irq data */
+static inline struct mpic * mpic_from_irq_data(struct irq_data *d)
+{
+       return irq_data_get_irq_chip_data(d);
 }
 
 /* Send an EOI */
@@ -660,13 +666,13 @@ static inline void mpic_eoi(struct mpic *mpic)
  */
 
 
-void mpic_unmask_irq(unsigned int irq)
+void mpic_unmask_irq(struct irq_data *d)
 {
        unsigned int loops = 100000;
-       struct mpic *mpic = mpic_from_irq(irq);
-       unsigned int src = mpic_irq_to_hw(irq);
+       struct mpic *mpic = mpic_from_irq_data(d);
+       unsigned int src = mpic_irq_to_hw(d->irq);
 
-       DBG("%p: %s: enable_irq: %d (src %d)\n", mpic, mpic->name, irq, src);
+       DBG("%p: %s: enable_irq: %d (src %d)\n", mpic, mpic->name, d->irq, src);
 
        mpic_irq_write(src, MPIC_INFO(IRQ_VECTOR_PRI),
                       mpic_irq_read(src, MPIC_INFO(IRQ_VECTOR_PRI)) &
@@ -681,13 +687,13 @@ void mpic_unmask_irq(unsigned int irq)
        } while(mpic_irq_read(src, MPIC_INFO(IRQ_VECTOR_PRI)) & MPIC_VECPRI_MASK);
 }
 
-void mpic_mask_irq(unsigned int irq)
+void mpic_mask_irq(struct irq_data *d)
 {
        unsigned int loops = 100000;
-       struct mpic *mpic = mpic_from_irq(irq);
-       unsigned int src = mpic_irq_to_hw(irq);
+       struct mpic *mpic = mpic_from_irq_data(d);
+       unsigned int src = mpic_irq_to_hw(d->irq);
 
-       DBG("%s: disable_irq: %d (src %d)\n", mpic->name, irq, src);
+       DBG("%s: disable_irq: %d (src %d)\n", mpic->name, d->irq, src);
 
        mpic_irq_write(src, MPIC_INFO(IRQ_VECTOR_PRI),
                       mpic_irq_read(src, MPIC_INFO(IRQ_VECTOR_PRI)) |
@@ -703,12 +709,12 @@ void mpic_mask_irq(unsigned int irq)
        } while(!(mpic_irq_read(src, MPIC_INFO(IRQ_VECTOR_PRI)) & MPIC_VECPRI_MASK));
 }
 
-void mpic_end_irq(unsigned int irq)
+void mpic_end_irq(struct irq_data *d)
 {
-       struct mpic *mpic = mpic_from_irq(irq);
+       struct mpic *mpic = mpic_from_irq_data(d);
 
 #ifdef DEBUG_IRQ
-       DBG("%s: end_irq: %d\n", mpic->name, irq);
+       DBG("%s: end_irq: %d\n", mpic->name, d->irq);
 #endif
        /* We always EOI on end_irq() even for edge interrupts since that
         * should only lower the priority, the MPIC should have properly
@@ -720,51 +726,51 @@ void mpic_end_irq(unsigned int irq)
 
 #ifdef CONFIG_MPIC_U3_HT_IRQS
 
-static void mpic_unmask_ht_irq(unsigned int irq)
+static void mpic_unmask_ht_irq(struct irq_data *d)
 {
-       struct mpic *mpic = mpic_from_irq(irq);
-       unsigned int src = mpic_irq_to_hw(irq);
+       struct mpic *mpic = mpic_from_irq_data(d);
+       unsigned int src = mpic_irq_to_hw(d->irq);
 
-       mpic_unmask_irq(irq);
+       mpic_unmask_irq(d);
 
-       if (irq_to_desc(irq)->status & IRQ_LEVEL)
+       if (irq_to_desc(d->irq)->status & IRQ_LEVEL)
                mpic_ht_end_irq(mpic, src);
 }
 
-static unsigned int mpic_startup_ht_irq(unsigned int irq)
+static unsigned int mpic_startup_ht_irq(struct irq_data *d)
 {
-       struct mpic *mpic = mpic_from_irq(irq);
-       unsigned int src = mpic_irq_to_hw(irq);
+       struct mpic *mpic = mpic_from_irq_data(d);
+       unsigned int src = mpic_irq_to_hw(d->irq);
 
-       mpic_unmask_irq(irq);
-       mpic_startup_ht_interrupt(mpic, src, irq_to_desc(irq)->status);
+       mpic_unmask_irq(d);
+       mpic_startup_ht_interrupt(mpic, src, irq_to_desc(d->irq)->status);
 
        return 0;
 }
 
-static void mpic_shutdown_ht_irq(unsigned int irq)
+static void mpic_shutdown_ht_irq(struct irq_data *d)
 {
-       struct mpic *mpic = mpic_from_irq(irq);
-       unsigned int src = mpic_irq_to_hw(irq);
+       struct mpic *mpic = mpic_from_irq_data(d);
+       unsigned int src = mpic_irq_to_hw(d->irq);
 
-       mpic_shutdown_ht_interrupt(mpic, src, irq_to_desc(irq)->status);
-       mpic_mask_irq(irq);
+       mpic_shutdown_ht_interrupt(mpic, src, irq_to_desc(d->irq)->status);
+       mpic_mask_irq(d);
 }
 
-static void mpic_end_ht_irq(unsigned int irq)
+static void mpic_end_ht_irq(struct irq_data *d)
 {
-       struct mpic *mpic = mpic_from_irq(irq);
-       unsigned int src = mpic_irq_to_hw(irq);
+       struct mpic *mpic = mpic_from_irq_data(d);
+       unsigned int src = mpic_irq_to_hw(d->irq);
 
 #ifdef DEBUG_IRQ
-       DBG("%s: end_irq: %d\n", mpic->name, irq);
+       DBG("%s: end_irq: %d\n", mpic->name, d->irq);
 #endif
        /* We always EOI on end_irq() even for edge interrupts since that
         * should only lower the priority, the MPIC should have properly
         * latched another edge interrupt coming in anyway
         */
 
-       if (irq_to_desc(irq)->status & IRQ_LEVEL)
+       if (irq_to_desc(d->irq)->status & IRQ_LEVEL)
                mpic_ht_end_irq(mpic, src);
        mpic_eoi(mpic);
 }
@@ -772,23 +778,23 @@ static void mpic_end_ht_irq(unsigned int irq)
 
 #ifdef CONFIG_SMP
 
-static void mpic_unmask_ipi(unsigned int irq)
+static void mpic_unmask_ipi(struct irq_data *d)
 {
-       struct mpic *mpic = mpic_from_ipi(irq);
-       unsigned int src = mpic_irq_to_hw(irq) - mpic->ipi_vecs[0];
+       struct mpic *mpic = mpic_from_ipi(d);
+       unsigned int src = mpic_irq_to_hw(d->irq) - mpic->ipi_vecs[0];
 
-       DBG("%s: enable_ipi: %d (ipi %d)\n", mpic->name, irq, src);
+       DBG("%s: enable_ipi: %d (ipi %d)\n", mpic->name, d->irq, src);
        mpic_ipi_write(src, mpic_ipi_read(src) & ~MPIC_VECPRI_MASK);
 }
 
-static void mpic_mask_ipi(unsigned int irq)
+static void mpic_mask_ipi(struct irq_data *d)
 {
        /* NEVER disable an IPI... that's just plain wrong! */
 }
 
-static void mpic_end_ipi(unsigned int irq)
+static void mpic_end_ipi(struct irq_data *d)
 {
-       struct mpic *mpic = mpic_from_ipi(irq);
+       struct mpic *mpic = mpic_from_ipi(d);
 
        /*
         * IPIs are marked IRQ_PER_CPU. This has the side effect of
@@ -802,10 +808,11 @@ static void mpic_end_ipi(unsigned int irq)
 
 #endif /* CONFIG_SMP */
 
-int mpic_set_affinity(unsigned int irq, const struct cpumask *cpumask)
+int mpic_set_affinity(struct irq_data *d, const struct cpumask *cpumask,
+                     bool force)
 {
-       struct mpic *mpic = mpic_from_irq(irq);
-       unsigned int src = mpic_irq_to_hw(irq);
+       struct mpic *mpic = mpic_from_irq_data(d);
+       unsigned int src = mpic_irq_to_hw(d->irq);
 
        if (mpic->flags & MPIC_SINGLE_DEST_CPU) {
                int cpuid = irq_choose_cpu(cpumask);
@@ -848,15 +855,15 @@ static unsigned int mpic_type_to_vecpri(struct mpic *mpic, unsigned int type)
        }
 }
 
-int mpic_set_irq_type(unsigned int virq, unsigned int flow_type)
+int mpic_set_irq_type(struct irq_data *d, unsigned int flow_type)
 {
-       struct mpic *mpic = mpic_from_irq(virq);
-       unsigned int src = mpic_irq_to_hw(virq);
-       struct irq_desc *desc = irq_to_desc(virq);
+       struct mpic *mpic = mpic_from_irq_data(d);
+       unsigned int src = mpic_irq_to_hw(d->irq);
+       struct irq_desc *desc = irq_to_desc(d->irq);
        unsigned int vecpri, vold, vnew;
 
        DBG("mpic: set_irq_type(mpic:@%p,virq:%d,src:0x%x,type:0x%x)\n",
-           mpic, virq, src, flow_type);
+           mpic, d->irq, src, flow_type);
 
        if (src >= mpic->irq_count)
                return -EINVAL;
@@ -907,28 +914,28 @@ void mpic_set_vector(unsigned int virq, unsigned int vector)
 }
 
 static struct irq_chip mpic_irq_chip = {
-       .mask           = mpic_mask_irq,
-       .unmask         = mpic_unmask_irq,
-       .eoi            = mpic_end_irq,
-       .set_type       = mpic_set_irq_type,
+       .irq_mask       = mpic_mask_irq,
+       .irq_unmask     = mpic_unmask_irq,
+       .irq_eoi        = mpic_end_irq,
+       .irq_set_type   = mpic_set_irq_type,
 };
 
 #ifdef CONFIG_SMP
 static struct irq_chip mpic_ipi_chip = {
-       .mask           = mpic_mask_ipi,
-       .unmask         = mpic_unmask_ipi,
-       .eoi            = mpic_end_ipi,
+       .irq_mask       = mpic_mask_ipi,
+       .irq_unmask     = mpic_unmask_ipi,
+       .irq_eoi        = mpic_end_ipi,
 };
 #endif /* CONFIG_SMP */
 
 #ifdef CONFIG_MPIC_U3_HT_IRQS
 static struct irq_chip mpic_irq_ht_chip = {
-       .startup        = mpic_startup_ht_irq,
-       .shutdown       = mpic_shutdown_ht_irq,
-       .mask           = mpic_mask_irq,
-       .unmask         = mpic_unmask_ht_irq,
-       .eoi            = mpic_end_ht_irq,
-       .set_type       = mpic_set_irq_type,
+       .irq_startup    = mpic_startup_ht_irq,
+       .irq_shutdown   = mpic_shutdown_ht_irq,
+       .irq_mask       = mpic_mask_irq,
+       .irq_unmask     = mpic_unmask_ht_irq,
+       .irq_eoi        = mpic_end_ht_irq,
+       .irq_set_type   = mpic_set_irq_type,
 };
 #endif /* CONFIG_MPIC_U3_HT_IRQS */
 
@@ -1060,12 +1067,12 @@ struct mpic * __init mpic_alloc(struct device_node *node,
        mpic->hc_irq = mpic_irq_chip;
        mpic->hc_irq.name = name;
        if (flags & MPIC_PRIMARY)
-               mpic->hc_irq.set_affinity = mpic_set_affinity;
+               mpic->hc_irq.irq_set_affinity = mpic_set_affinity;
 #ifdef CONFIG_MPIC_U3_HT_IRQS
        mpic->hc_ht_irq = mpic_irq_ht_chip;
        mpic->hc_ht_irq.name = name;
        if (flags & MPIC_PRIMARY)
-               mpic->hc_ht_irq.set_affinity = mpic_set_affinity;
+               mpic->hc_ht_irq.irq_set_affinity = mpic_set_affinity;
 #endif /* CONFIG_MPIC_U3_HT_IRQS */
 
 #ifdef CONFIG_SMP
index e4a6df7..13f3e89 100644 (file)
@@ -34,9 +34,10 @@ static inline int mpic_pasemi_msi_init(struct mpic *mpic)
 }
 #endif
 
-extern int mpic_set_irq_type(unsigned int virq, unsigned int flow_type);
+extern int mpic_set_irq_type(struct irq_data *d, unsigned int flow_type);
 extern void mpic_set_vector(unsigned int virq, unsigned int vector);
-extern int mpic_set_affinity(unsigned int irq, const struct cpumask *cpumask);
+extern int mpic_set_affinity(struct irq_data *d,
+                            const struct cpumask *cpumask, bool force);
 extern void mpic_reset_core(int cpu);
 
 #endif /* _POWERPC_SYSDEV_MPIC_H */
index 320ad5a..0b7794a 100644 (file)
@@ -43,24 +43,24 @@ static void mpic_pasemi_msi_mask_irq(struct irq_data *data)
 {
        pr_debug("mpic_pasemi_msi_mask_irq %d\n", data->irq);
        mask_msi_irq(data);
-       mpic_mask_irq(data->irq);
+       mpic_mask_irq(data);
 }
 
 static void mpic_pasemi_msi_unmask_irq(struct irq_data *data)
 {
        pr_debug("mpic_pasemi_msi_unmask_irq %d\n", data->irq);
-       mpic_unmask_irq(data->irq);
+       mpic_unmask_irq(data);
        unmask_msi_irq(data);
 }
 
 static struct irq_chip mpic_pasemi_msi_chip = {
-       .irq_shutdown   = mpic_pasemi_msi_mask_irq,
-       .irq_mask       = mpic_pasemi_msi_mask_irq,
-       .irq_unmask     = mpic_pasemi_msi_unmask_irq,
-       .eoi            = mpic_end_irq,
-       .set_type       = mpic_set_irq_type,
-       .set_affinity   = mpic_set_affinity,
-       .name           = "PASEMI-MSI",
+       .irq_shutdown           = mpic_pasemi_msi_mask_irq,
+       .irq_mask               = mpic_pasemi_msi_mask_irq,
+       .irq_unmask             = mpic_pasemi_msi_unmask_irq,
+       .irq_eoi                = mpic_end_irq,
+       .irq_set_type           = mpic_set_irq_type,
+       .irq_set_affinity       = mpic_set_affinity,
+       .name                   = "PASEMI-MSI",
 };
 
 static int pasemi_msi_check_device(struct pci_dev *pdev, int nvec, int type)
index a2b028b..71900ac 100644 (file)
@@ -26,23 +26,23 @@ static struct mpic *msi_mpic;
 static void mpic_u3msi_mask_irq(struct irq_data *data)
 {
        mask_msi_irq(data);
-       mpic_mask_irq(data->irq);
+       mpic_mask_irq(data);
 }
 
 static void mpic_u3msi_unmask_irq(struct irq_data *data)
 {
-       mpic_unmask_irq(data->irq);
+       mpic_unmask_irq(data);
        unmask_msi_irq(data);
 }
 
 static struct irq_chip mpic_u3msi_chip = {
-       .irq_shutdown   = mpic_u3msi_mask_irq,
-       .irq_mask       = mpic_u3msi_mask_irq,
-       .irq_unmask     = mpic_u3msi_unmask_irq,
-       .eoi            = mpic_end_irq,
-       .set_type       = mpic_set_irq_type,
-       .set_affinity   = mpic_set_affinity,
-       .name           = "MPIC-U3MSI",
+       .irq_shutdown           = mpic_u3msi_mask_irq,
+       .irq_mask               = mpic_u3msi_mask_irq,
+       .irq_unmask             = mpic_u3msi_unmask_irq,
+       .irq_eoi                = mpic_end_irq,
+       .irq_set_type           = mpic_set_irq_type,
+       .irq_set_affinity       = mpic_set_affinity,
+       .name                   = "MPIC-U3MSI",
 };
 
 static u64 read_ht_magic_addr(struct pci_dev *pdev, unsigned int pos)