mfd: arizona: Check if AOD interrupts are pending before dispatching
Subsystems (2)
PATCH RESEND v2 1/1 mfd: arizona: Check if AOD interrupts are pending before dispatching
Previously the arizona_irq_thread implementation would call handle_nested_irqs() to handle AOD interrupts without checking if any were actually pending. The kernel will see these as spurious IRQs and will eventually disable the IRQ.
This patch ensures we only launch the nested handler if there are AOD interrupts pending in the codec.
--- drivers/mfd/arizona-irq.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-)
drivers/mfd/arizona-irq.c +14 -2
@@ -109,8 +109,20 @@ static irqreturn_t arizona_irq_thread(int irq, void *data) do { poll = false; - if (arizona->aod_irq_chip) - handle_nested_irq(irq_find_mapping(arizona->virq, 0)); + if (arizona->aod_irq_chip) { + /* + * Check the AOD status register to determine whether + * the nested IRQ handler should be called. + */ + ret = regmap_read(arizona->regmap, + ARIZONA_AOD_IRQ1, &val); + if (ret) + dev_warn(arizona->dev, + "Failed to read AOD IRQ1 %d\n", ret); + else if (val) + handle_nested_irq( + irq_find_mapping(arizona->virq, 0)); + } /* * Check if one of the main interrupts is asserted and only
Signature · 1 line
1.9.1
Lee Jones
AppliedQuoted 5 lines · Richard Fitzgerald
Previously the
arizona_irq_threadimplementation would callhandle_nested_irqs()to handle AOD interrupts without checking if any were actually pending. The kernel will see these as spurious IRQs and will eventually disable the IRQ.
Quoted 8 lines
This patch ensures we only launch the nested handler if there are AOD interrupts pending in the codec.
Signed-off-by Simon Trimmer <[email protected]>Signed-off-by Richard Fitzgerald <[email protected]>--- drivers/mfd/arizona-irq.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-)
Applied, thanks.
Quoted 27 lines
drivers/mfd/arizona-irq.c +14
-2@@ -109,8 +109,20 @@ static irqreturn_t arizona_irq_thread(int irq, void *data) do { poll = false; - if (arizona->aod_irq_chip) - handle_nested_irq(irq_find_mapping(arizona->virq, 0)); + if (arizona->aod_irq_chip) { + /* + * Check the AOD status register to determine whether + * the nested IRQ handler should be called. + */ + ret = regmap_read(arizona->regmap, + ARIZONA_AOD_IRQ1, &val); + if (ret) + dev_warn(arizona->dev, + "Failed to read AOD IRQ1 %d\n", ret); + else if (val) + handle_nested_irq( + irq_find_mapping(arizona->virq, 0)); + } /* * Check if one of the main interrupts is asserted and only
Signature · 4 lines
Lee Jones Linaro STMicroelectronics Landing Team Lead Linaro.org │ Open source software for ARM SoCs Follow Linaro: Facebook | Twitter | Blog