2020-02-25 16:15:01

by André Draszik

[permalink] [raw]
Subject: [PATCH v2 6/6] Input: snvs_pwrkey - only IRQ_HANDLED for our own events

The snvs_pwrkey shares the SNVS LPSR status register with the snvs_rtc.

This driver here should only return IRQ_HANDLED if the status register
indicates that the event we're handling in the irq handler was genuinely
intended for this driver. Otheriwse the interrupt subsystem will
assume the interrupt was handled successfully even though it wasn't
at all.

Signed-off-by: André Draszik <[email protected]>
Cc: "Horia Geantă" <[email protected]>
Cc: Aymen Sghaier <[email protected]>
Cc: Herbert Xu <[email protected]>
Cc: "David S. Miller" <[email protected]>
Cc: Rob Herring <[email protected]>
Cc: Mark Rutland <[email protected]>
Cc: Shawn Guo <[email protected]>
Cc: Sascha Hauer <[email protected]>
Cc: Pengutronix Kernel Team <[email protected]>
Cc: Fabio Estevam <[email protected]>
Cc: NXP Linux Team <[email protected]>
Cc: Dmitry Torokhov <[email protected]>
Cc: Anson Huang <[email protected]>
Cc: Robin Gong <[email protected]>
Cc: [email protected]
Cc: [email protected]
Cc: [email protected]
Cc: [email protected]

---
v2:
* no changes
---
drivers/input/keyboard/snvs_pwrkey.c | 12 +++++++-----
1 file changed, 7 insertions(+), 5 deletions(-)

diff --git a/drivers/input/keyboard/snvs_pwrkey.c b/drivers/input/keyboard/snvs_pwrkey.c
index 382d2ae82c9b..980867886b34 100644
--- a/drivers/input/keyboard/snvs_pwrkey.c
+++ b/drivers/input/keyboard/snvs_pwrkey.c
@@ -82,7 +82,9 @@ static irqreturn_t imx_snvs_pwrkey_interrupt(int irq, void *dev_id)
clk_enable(pdata->clk);

regmap_read(pdata->snvs, SNVS_LPSR_REG, &lp_status);
- if (lp_status & SNVS_LPSR_SPO) {
+ lp_status &= SNVS_LPSR_SPO;
+
+ if (lp_status) {
if (pdata->minor_rev == 0) {
/*
* The first generation i.MX[6|7] SoCs only send an
@@ -98,14 +100,14 @@ static irqreturn_t imx_snvs_pwrkey_interrupt(int irq, void *dev_id)
mod_timer(&pdata->check_timer,
jiffies + msecs_to_jiffies(DEBOUNCE_TIME));
}
- }

- /* clear SPO status */
- regmap_write(pdata->snvs, SNVS_LPSR_REG, SNVS_LPSR_SPO);
+ /* clear SPO status */
+ regmap_write(pdata->snvs, SNVS_LPSR_REG, SNVS_LPSR_SPO);
+ }

clk_disable(pdata->clk);

- return IRQ_HANDLED;
+ return lp_status ? IRQ_HANDLED : IRQ_NONE;
}

static void imx_snvs_pwrkey_act(void *pdata)
--
2.23.0.rc1


2020-02-26 01:15:47

by Robin Gong

[permalink] [raw]
Subject: RE: [PATCH v2 6/6] Input: snvs_pwrkey - only IRQ_HANDLED for our own events

On 2020/02/26 André Draszik <[email protected]> wrote:
> The snvs_pwrkey shares the SNVS LPSR status register with the snvs_rtc.
>
> This driver here should only return IRQ_HANDLED if the status register
> indicates that the event we're handling in the irq handler was genuinely
> intended for this driver. Otheriwse the interrupt subsystem will assume the
> interrupt was handled successfully even though it wasn't at all.
>
> Signed-off-by: André Draszik <[email protected]>
> Cc: "Horia Geantă" <[email protected]>
> Cc: Aymen Sghaier <[email protected]>
> Cc: Herbert Xu <[email protected]>
> Cc: "David S. Miller" <[email protected]>
> Cc: Rob Herring <[email protected]>
> Cc: Mark Rutland <[email protected]>
> Cc: Shawn Guo <[email protected]>
> Cc: Sascha Hauer <[email protected]>
> Cc: Pengutronix Kernel Team <[email protected]>
> Cc: Fabio Estevam <[email protected]>
> Cc: NXP Linux Team <[email protected]>
> Cc: Dmitry Torokhov <[email protected]>
> Cc: Anson Huang <[email protected]>
> Cc: Robin Gong <[email protected]>
> Cc: [email protected]
> Cc: [email protected]
> Cc: [email protected]
> Cc: [email protected]
>
> ---
> v2:
> * no changes
> ---
> drivers/input/keyboard/snvs_pwrkey.c | 12 +++++++-----
> 1 file changed, 7 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/input/keyboard/snvs_pwrkey.c
> b/drivers/input/keyboard/snvs_pwrkey.c
> index 382d2ae82c9b..980867886b34 100644
> --- a/drivers/input/keyboard/snvs_pwrkey.c
> +++ b/drivers/input/keyboard/snvs_pwrkey.c
> @@ -82,7 +82,9 @@ static irqreturn_t imx_snvs_pwrkey_interrupt(int irq, void
> *dev_id)
> clk_enable(pdata->clk);
>
> regmap_read(pdata->snvs, SNVS_LPSR_REG, &lp_status);
> - if (lp_status & SNVS_LPSR_SPO) {
> + lp_status &= SNVS_LPSR_SPO;
> +
> + if (lp_status) {
> if (pdata->minor_rev == 0) {
> /*
> * The first generation i.MX[6|7] SoCs only send an @@ -98,14
> +100,14 @@ static irqreturn_t imx_snvs_pwrkey_interrupt(int irq, void
> *dev_id)
> mod_timer(&pdata->check_timer,
> jiffies + msecs_to_jiffies(DEBOUNCE_TIME));
> }
> - }
>
> - /* clear SPO status */
> - regmap_write(pdata->snvs, SNVS_LPSR_REG, SNVS_LPSR_SPO);
> + /* clear SPO status */
> + regmap_write(pdata->snvs, SNVS_LPSR_REG, SNVS_LPSR_SPO);
But irq storm will come in once there is other interrupt triggered as unexpected,
although I never met it before. Could we drop this patch now? Others are ok for me.

Reviewed-by: Robin Gong <yibin.gong@nxp>
> + }
>
> clk_disable(pdata->clk);
>
> - return IRQ_HANDLED;
> + return lp_status ? IRQ_HANDLED : IRQ_NONE;
> }
>
> static void imx_snvs_pwrkey_act(void *pdata)
> --
> 2.23.0.rc1

2020-02-26 17:24:00

by André Draszik

[permalink] [raw]
Subject: Re: [PATCH v2 6/6] Input: snvs_pwrkey - only IRQ_HANDLED for our own events

On Wed, 2020-02-26 at 01:15 +0000, Robin Gong wrote:
> On 2020/02/26 André Draszik <[email protected]> wrote:
> > The snvs_pwrkey shares the SNVS LPSR status register with the snvs_rtc.
> >
> > This driver here should only return IRQ_HANDLED if the status register
> > indicates that the event we're handling in the irq handler was genuinely
> > intended for this driver. Otheriwse the interrupt subsystem will assume the
> > interrupt was handled successfully even though it wasn't at all.
> >
> > Signed-off-by: André Draszik <[email protected]>
> > Cc: "Horia Geantă" <[email protected]>
> > Cc: Aymen Sghaier <[email protected]>
> > Cc: Herbert Xu <[email protected]>
> > Cc: "David S. Miller" <[email protected]>
> > Cc: Rob Herring <[email protected]>
> > Cc: Mark Rutland <[email protected]>
> > Cc: Shawn Guo <[email protected]>
> > Cc: Sascha Hauer <[email protected]>
> > Cc: Pengutronix Kernel Team <[email protected]>
> > Cc: Fabio Estevam <[email protected]>
> > Cc: NXP Linux Team <[email protected]>
> > Cc: Dmitry Torokhov <[email protected]>
> > Cc: Anson Huang <[email protected]>
> > Cc: Robin Gong <[email protected]>
> > Cc: [email protected]
> > Cc: [email protected]
> > Cc: [email protected]
> > Cc: [email protected]
> >
> > ---
> > v2:
> > * no changes
> > ---
> > drivers/input/keyboard/snvs_pwrkey.c | 12 +++++++-----
> > 1 file changed, 7 insertions(+), 5 deletions(-)
> >
> > diff --git a/drivers/input/keyboard/snvs_pwrkey.c
> > b/drivers/input/keyboard/snvs_pwrkey.c
> > index 382d2ae82c9b..980867886b34 100644
> > --- a/drivers/input/keyboard/snvs_pwrkey.c
> > +++ b/drivers/input/keyboard/snvs_pwrkey.c
> > @@ -82,7 +82,9 @@ static irqreturn_t imx_snvs_pwrkey_interrupt(int irq, void
> > *dev_id)
> > clk_enable(pdata->clk);
> >
> > regmap_read(pdata->snvs, SNVS_LPSR_REG, &lp_status);
> > - if (lp_status & SNVS_LPSR_SPO) {
> > + lp_status &= SNVS_LPSR_SPO;
> > +
> > + if (lp_status) {
> > if (pdata->minor_rev == 0) {
> > /*
> > * The first generation i.MX[6|7] SoCs only send an @@ -98,14
> > +100,14 @@ static irqreturn_t imx_snvs_pwrkey_interrupt(int irq, void
> > *dev_id)
> > mod_timer(&pdata->check_timer,
> > jiffies + msecs_to_jiffies(DEBOUNCE_TIME));
> > }
> > - }
> >
> > - /* clear SPO status */
> > - regmap_write(pdata->snvs, SNVS_LPSR_REG, SNVS_LPSR_SPO);
> > + /* clear SPO status */
> > + regmap_write(pdata->snvs, SNVS_LPSR_REG, SNVS_LPSR_SPO);
> But irq storm will come in once there is other interrupt triggered as unexpected,
> although I never met it before. Could we drop this patch now? Others are ok for me.

I don't have strong feelings about this patch, but this bit merely changes behaviour to
clear SP0 if SP0 was in fact != 0 in the first place, whereas before SP0 was always
cleared, even if it was == 0 anyway. Seems more logical in my eyes.


> Reviewed-by: Robin Gong <yibin.gong@nxp>
> > + }
> >
> > clk_disable(pdata->clk);
> >
> > - return IRQ_HANDLED;
> > + return lp_status ? IRQ_HANDLED : IRQ_NONE;

If you're talking about this part, the rtc-snvs driver does the same in its interrupt handler.
In other words, this driver here could prevent the rtc-snvs driver from seeing its events.



Cheers,
Andre'


> > }
> >
> > static void imx_snvs_pwrkey_act(void *pdata)
> > --
> > 2.23.0.rc1

2020-03-02 09:22:35

by Horia Geanta

[permalink] [raw]
Subject: Re: [PATCH v2 6/6] Input: snvs_pwrkey - only IRQ_HANDLED for our own events

On 2/25/2020 6:12 PM, Andr? Draszik wrote:
> The snvs_pwrkey shares the SNVS LPSR status register with the snvs_rtc.
>
> This driver here should only return IRQ_HANDLED if the status register
> indicates that the event we're handling in the irq handler was genuinely
> intended for this driver. Otheriwse the interrupt subsystem will
> assume the interrupt was handled successfully even though it wasn't
> at all.
>
> Signed-off-by: Andr? Draszik <[email protected]>
> Cc: "Horia Geant?" <[email protected]>
> Cc: Aymen Sghaier <[email protected]>
> Cc: Herbert Xu <[email protected]>
> Cc: "David S. Miller" <[email protected]>
> Cc: Rob Herring <[email protected]>
> Cc: Mark Rutland <[email protected]>
> Cc: Shawn Guo <[email protected]>
> Cc: Sascha Hauer <[email protected]>
> Cc: Pengutronix Kernel Team <[email protected]>
> Cc: Fabio Estevam <[email protected]>
> Cc: NXP Linux Team <[email protected]>
> Cc: Dmitry Torokhov <[email protected]>
> Cc: Anson Huang <[email protected]>
> Cc: Robin Gong <[email protected]>
> Cc: [email protected]
> Cc: [email protected]
> Cc: [email protected]
> Cc: [email protected]
For patches 2-6:
Reviewed-by: Horia Geant? <[email protected]>

Also imx8mn.dtsi and imx8mp.dtsi will have to be updated.

Thanks,
Horia