From 15e97a67d7b28029d5a233162a78794991fbe370 Mon Sep 17 00:00:00 2001 From: Mark Brown Date: Tue, 21 Aug 2012 20:02:03 +0100 Subject: [PATCH] --- yaml --- r: 329946 b: refs/heads/master c: 3080de4ef62f0cc1910b227d33d3533f3c4a4a5d h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/drivers/mfd/arizona-irq.c | 18 +++++++++++++++--- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/[refs] b/[refs] index 9dd8f6a5ffb2..78b4460f9bec 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 55692af5eb587f7592d6c2713e1e0eeaab0f6c31 +refs/heads/master: 3080de4ef62f0cc1910b227d33d3533f3c4a4a5d diff --git a/trunk/drivers/mfd/arizona-irq.c b/trunk/drivers/mfd/arizona-irq.c index 64940c6da93c..a062153f54e7 100644 --- a/trunk/drivers/mfd/arizona-irq.c +++ b/trunk/drivers/mfd/arizona-irq.c @@ -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);