mfd: arizona: Suppress needless calls to the primary IRQ

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>
This commit is contained in:
Mark Brown 2012-08-21 20:02:03 +01:00 committed by Samuel Ortiz
parent 55692af5eb
commit 3080de4ef6
1 changed files with 15 additions and 3 deletions

View 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) static irqreturn_t arizona_irq_thread(int irq, void *data)
{ {
struct arizona *arizona = data; struct arizona *arizona = data;
unsigned int val;
int i, ret; int i, ret;
ret = pm_runtime_get_sync(arizona->dev); ret = pm_runtime_get_sync(arizona->dev);
@ -102,9 +103,20 @@ static irqreturn_t arizona_irq_thread(int irq, void *data)
return IRQ_NONE; return IRQ_NONE;
} }
/* Check both domains */ /* Always handle the AoD domain */
for (i = 0; i < 2; i++) handle_nested_irq(irq_find_mapping(arizona->virq, 0));
handle_nested_irq(irq_find_mapping(arizona->virq, i));
/*
* 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_mark_last_busy(arizona->dev);
pm_runtime_put_autosuspend(arizona->dev); pm_runtime_put_autosuspend(arizona->dev);