Thread (1 message) 1 message, 1 author, 2021-01-25

Re: [PATCH] pinctrl: mediatek: Fix trigger type setting follow for unexpected interrupt

From: Nicolas Boichat <hidden>
Date: 2021-01-25 03:25:25
Also in: linux-gpio, linux-mediatek, lkml

On Mon, Jan 25, 2021 at 11:15 AM Hailong Fan [off-list ref] wrote:
When flipping the polarity will be generated interrupt under certain
circumstances, but GPIO external signal has not changed.
Then, mask the interrupt before polarity setting, and clear the
unexpected interrupt after trigger type setting completed.
I'd add a short note about why you remove mtk_eint_flip_edge, that is,
because mtk_eint_unmask already calls it.
quoted hunk
Signed-off-by: Hailong Fan <redacted>
---
[V2]
---
 drivers/pinctrl/mediatek/mtk-eint.c | 13 +++++++++++--
 1 file changed, 11 insertions(+), 2 deletions(-)
diff --git a/drivers/pinctrl/mediatek/mtk-eint.c b/drivers/pinctrl/mediatek/mtk-eint.c
index 22736f60c16c..0042f32c7e7e 100644
--- a/drivers/pinctrl/mediatek/mtk-eint.c
+++ b/drivers/pinctrl/mediatek/mtk-eint.c
@@ -157,6 +157,7 @@ static void mtk_eint_ack(struct irq_data *d)
 static int mtk_eint_set_type(struct irq_data *d, unsigned int type)
 {
        struct mtk_eint *eint = irq_data_get_irq_chip_data(d);
+       bool unmasked;
Well, this is true if the interrupt has been masked (or, equivalently,
if we need to unmask it later).

So I think either "masked" or "unmask" are better as variable names.
quoted hunk
        u32 mask = BIT(d->hwirq & 0x1f);
        void __iomem *reg;
@@ -173,6 +174,13 @@ static int mtk_eint_set_type(struct irq_data *d, unsigned int type)
        else
                eint->dual_edge[d->hwirq] = 0;

+       if (!mtk_eint_get_mask(eint, d->hwirq)) {
+               mtk_eint_mask(d);
+               unmasked = true;
+       } else {
+               unmasked = false;
+       }
+
        if (type & (IRQ_TYPE_LEVEL_LOW | IRQ_TYPE_EDGE_FALLING)) {
                reg = mtk_eint_get_offset(eint, d->hwirq, eint->regs->pol_clr);
                writel(mask, reg);
@@ -189,8 +197,9 @@ static int mtk_eint_set_type(struct irq_data *d, unsigned int type)
                writel(mask, reg);
        }

-       if (eint->dual_edge[d->hwirq])
-               mtk_eint_flip_edge(eint, d->hwirq);
+       mtk_eint_ack(d);
+       if (unmasked)
+               mtk_eint_unmask(d);

        return 0;
 }
--
2.18.0
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help