mfd: arizona: Suppress needless calls to the primary IRQ
authorMark Brown <broonie@opensource.wolfsonmicro.com>
Tue, 21 Aug 2012 19:02:03 +0000 (20:02 +0100)
committerSamuel Ortiz <sameo@linux.intel.com>
Fri, 14 Sep 2012 07:52:11 +0000 (09:52 +0200)
We can read back if the primary IRQ is asserted from the register map,
meaning that we can suppress polling of the interrupt status registers
when only the AoD IRQ domain is asserting.

Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
drivers/mfd/arizona-irq.c

index 64940c6da93c031b7fb5e8dad88366b79c1eaa57..a062153f54e76621cd8c9f7a7773f17daab926d4 100644 (file)
@@ -94,6 +94,7 @@ static irqreturn_t arizona_ctrlif_err(int irq, void *data)
 static irqreturn_t arizona_irq_thread(int irq, void *data)
 {
        struct arizona *arizona = data;
+       unsigned int val;
        int i, ret;
 
        ret = pm_runtime_get_sync(arizona->dev);
@@ -102,9 +103,20 @@ static irqreturn_t arizona_irq_thread(int irq, void *data)
                return IRQ_NONE;
        }
 
-       /* Check both domains */
-       for (i = 0; i < 2; i++)
-               handle_nested_irq(irq_find_mapping(arizona->virq, i));
+       /* Always handle the AoD domain */
+       handle_nested_irq(irq_find_mapping(arizona->virq, 0));
+
+       /*
+        * Check if one of the main interrupts is asserted and only
+        * check that domain if it is.
+        */
+       ret = regmap_read(arizona->regmap, ARIZONA_IRQ_PIN_STATUS, &val);
+       if (ret == 0 && val & ARIZONA_IRQ1_STS) {
+               handle_nested_irq(irq_find_mapping(arizona->virq, 1));
+       } else if (ret != 0) {
+               dev_err(arizona->dev, "Failed to read main IRQ status: %d\n",
+                       ret);
+       }
 
        pm_runtime_mark_last_busy(arizona->dev);
        pm_runtime_put_autosuspend(arizona->dev);