irqchip: mips-gic: Simplify gic_local_irq_domain_map()
authorPaul Burton <paul.burton@imgtec.com>
Sun, 13 Aug 2017 04:36:17 +0000 (21:36 -0700)
committerRalf Baechle <ralf@linux-mips.org>
Mon, 4 Sep 2017 11:53:14 +0000 (13:53 +0200)
Simplify gic_local_irq_domain_map() by:

- Moving the check for invalid IRQs outside of the loop.

- Moving the decision about whether to use gic_cpu_pin or timer_cpu_pin
  outside of the loop.

- Using the new write_gic_vo_map() accessor function to avoid the need
  to handle each map register separately.

Signed-off-by: Paul Burton <paul.burton@imgtec.com>
Acked-by: Marc Zyngier <marc.zyngier@arm.com>
Cc: Jason Cooper <jason@lakedaemon.net>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: linux-mips@linux-mips.org
Patchwork: https://patchwork.linux-mips.org/patch/17027/
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
drivers/irqchip/irq-mips-gic.c
include/linux/irqchip/mips-gic.h

index 7445c3b58c44766be932f7f2c633fe2d1f8e2cd4..4b6c4e55562d9cb6c1deb2b51d9a3bd254b1cad2 100644 (file)
@@ -498,58 +498,33 @@ static int gic_local_irq_domain_map(struct irq_domain *d, unsigned int virq,
                                    irq_hw_number_t hw)
 {
        int intr = GIC_HWIRQ_TO_LOCAL(hw);
-       int ret = 0;
        int i;
        unsigned long flags;
+       u32 val;
 
        if (!gic_local_irq_is_routable(intr))
                return -EPERM;
 
-       spin_lock_irqsave(&gic_lock, flags);
-       for (i = 0; i < gic_vpes; i++) {
-               u32 val = GIC_MAP_TO_PIN_MSK | gic_cpu_pin;
+       if (intr > GIC_LOCAL_INT_FDC) {
+               pr_err("Invalid local IRQ %d\n", intr);
+               return -EINVAL;
+       }
 
-               gic_write(GIC_REG(VPE_LOCAL, GIC_VPE_OTHER_ADDR),
-                         mips_cm_vp_id(i));
+       if (intr == GIC_LOCAL_INT_TIMER) {
+               /* CONFIG_MIPS_CMP workaround (see __gic_init) */
+               val = GIC_MAP_PIN_MAP_TO_PIN | timer_cpu_pin;
+       } else {
+               val = GIC_MAP_PIN_MAP_TO_PIN | gic_cpu_pin;
+       }
 
-               switch (intr) {
-               case GIC_LOCAL_INT_WD:
-                       gic_write32(GIC_REG(VPE_OTHER, GIC_VPE_WD_MAP), val);
-                       break;
-               case GIC_LOCAL_INT_COMPARE:
-                       gic_write32(GIC_REG(VPE_OTHER, GIC_VPE_COMPARE_MAP),
-                                   val);
-                       break;
-               case GIC_LOCAL_INT_TIMER:
-                       /* CONFIG_MIPS_CMP workaround (see __gic_init) */
-                       val = GIC_MAP_TO_PIN_MSK | timer_cpu_pin;
-                       gic_write32(GIC_REG(VPE_OTHER, GIC_VPE_TIMER_MAP),
-                                   val);
-                       break;
-               case GIC_LOCAL_INT_PERFCTR:
-                       gic_write32(GIC_REG(VPE_OTHER, GIC_VPE_PERFCTR_MAP),
-                                   val);
-                       break;
-               case GIC_LOCAL_INT_SWINT0:
-                       gic_write32(GIC_REG(VPE_OTHER, GIC_VPE_SWINT0_MAP),
-                                   val);
-                       break;
-               case GIC_LOCAL_INT_SWINT1:
-                       gic_write32(GIC_REG(VPE_OTHER, GIC_VPE_SWINT1_MAP),
-                                   val);
-                       break;
-               case GIC_LOCAL_INT_FDC:
-                       gic_write32(GIC_REG(VPE_OTHER, GIC_VPE_FDC_MAP), val);
-                       break;
-               default:
-                       pr_err("Invalid local IRQ %d\n", intr);
-                       ret = -EINVAL;
-                       break;
-               }
+       spin_lock_irqsave(&gic_lock, flags);
+       for (i = 0; i < gic_vpes; i++) {
+               write_gic_vl_other(mips_cm_vp_id(i));
+               write_gic_vo_map(intr, val);
        }
        spin_unlock_irqrestore(&gic_lock, flags);
 
-       return ret;
+       return 0;
 }
 
 static int gic_shared_irq_domain_map(struct irq_domain *d, unsigned int virq,
index 835e25506660afc58ffced07934381215f525107..1342b17b681201b4e623df2da466d3424866409c 100644 (file)
 #define GIC_VPE_MASK_OFS               0x0008
 #define GIC_VPE_RMASK_OFS              0x000c
 #define GIC_VPE_SMASK_OFS              0x0010
-#define GIC_VPE_WD_MAP_OFS             0x0040
-#define GIC_VPE_COMPARE_MAP_OFS                0x0044
 #define GIC_VPE_TIMER_MAP_OFS          0x0048
-#define GIC_VPE_FDC_MAP_OFS            0x004c
-#define GIC_VPE_PERFCTR_MAP_OFS                0x0050
-#define GIC_VPE_SWINT0_MAP_OFS         0x0054
-#define GIC_VPE_SWINT1_MAP_OFS         0x0058
 #define GIC_VPE_OTHER_ADDR_OFS         0x0080
 #define GIC_VPE_WD_CONFIG0_OFS         0x0090
 #define GIC_VPE_WD_COUNT0_OFS          0x0094