On Wed, 11 Nov 2020, Tony Lindgren wrote: > With commit 3a6f0fb7b8eb ("regmap: irq: Add support to clear ack > registers"), the cpcap interrupts are no longer getting acked properly > leading to a very unresponsive device with CPUs fully loaded spinning > in the threaded IRQ handlers. > > To me it looks like the clear_ack commit above actually fixed a long > standing bug in regmap_irq_thread() where we unconditionally acked the > interrupts earlier without considering ack_invert. And the issue with > cpcap started happening as we now also consider ack_invert. > > Tim Harvey <thar...@gateworks.com> tried to fix this issue earlier with > "[PATCH v2] regmap: irq: fix ack-invert", but the reading of the ack > register was considered unnecessary for just ack_invert, and we did not > have clear_ack available yet. As the cpcap irqs worked both with and > without ack_invert earlier because of the unconditional ack, the > problem remained hidden until now. > > Also, looks like the earlier v3.0.8 based Motorola Android Linux kernel > does clear_ack style read-clear-write with "ireg_val & ~mreg_val" instead > of just ack_invert style write. So let's switch cpcap to use clear_ack > to fix the issue. > > Fixes: 3a6f0fb7b8eb ("regmap: irq: Add support to clear ack registers") > Cc: Carl Philipp Klemm <phil...@uvos.xyz> > Cc: Laxminath Kasam <lka...@codeaurora.org> > Cc: Merlijn Wajer <merl...@wizzup.org> > Cc: Mark Brown <broo...@kernel.org> > Cc: Pavel Machek <pa...@ucw.cz> > Cc: Sebastian Reichel <s...@kernel.org> > Cc: Tim Harvey <thar...@gateworks.com>
It would be nice to have you review this Tim. > Signed-off-by: Tony Lindgren <t...@atomide.com> > --- > drivers/mfd/motorola-cpcap.c | 6 +++--- > 1 file changed, 3 insertions(+), 3 deletions(-) > > diff --git a/drivers/mfd/motorola-cpcap.c b/drivers/mfd/motorola-cpcap.c > --- a/drivers/mfd/motorola-cpcap.c > +++ b/drivers/mfd/motorola-cpcap.c > @@ -97,7 +97,7 @@ static struct regmap_irq_chip > cpcap_irq_chip[CPCAP_NR_IRQ_CHIPS] = { > .ack_base = CPCAP_REG_MI1, > .mask_base = CPCAP_REG_MIM1, > .use_ack = true, > - .ack_invert = true, > + .clear_ack = true, > }, > { > .name = "cpcap-m2", > @@ -106,7 +106,7 @@ static struct regmap_irq_chip > cpcap_irq_chip[CPCAP_NR_IRQ_CHIPS] = { > .ack_base = CPCAP_REG_MI2, > .mask_base = CPCAP_REG_MIM2, > .use_ack = true, > - .ack_invert = true, > + .clear_ack = true, > }, > { > .name = "cpcap1-4", > @@ -115,7 +115,7 @@ static struct regmap_irq_chip > cpcap_irq_chip[CPCAP_NR_IRQ_CHIPS] = { > .ack_base = CPCAP_REG_INT1, > .mask_base = CPCAP_REG_INTM1, > .use_ack = true, > - .ack_invert = true, > + .clear_ack = true, > }, > }; > -- Lee Jones [李琼斯] Senior Technical Lead - Developer Services Linaro.org │ Open source software for Arm SoCs Follow Linaro: Facebook | Twitter | Blog