* [PATCH V3] pinctrl: mediatek: Fix trigger type setting follow for unexpected interrupt
@ 2021-01-25 4:17 Hailong Fan
2021-01-25 13:11 ` Linus Walleij
0 siblings, 1 reply; 2+ messages in thread
From: Hailong Fan @ 2021-01-25 4:17 UTC (permalink / raw)
To: Sean Wang, Linus Walleij, Matthias Brugger
Cc: linux-mediatek, linux-gpio, linux-arm-kernel, linux-kernel,
youlin.pei, Nicolas Boichat, srv_heupstream, chentsung,
gtk_pangao, hanks.chen, yong.wu, Hailong Fan
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.
Remove mtk_eint_flip_edge: because mtk_eint_unmask already calls it.
Signed-off-by: Hailong Fan <hailong.fan@mediatek.com>
Reviewed-by: Nicolas Boichat <drinkcat@chromium.org>
---
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..3b9b5dbd7968 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 masked;
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);
+ masked = false;
+ } else {
+ masked = true;
+ }
+
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 (!masked)
+ mtk_eint_unmask(d);
return 0;
}
--
2.18.0
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [PATCH V3] pinctrl: mediatek: Fix trigger type setting follow for unexpected interrupt
2021-01-25 4:17 [PATCH V3] pinctrl: mediatek: Fix trigger type setting follow for unexpected interrupt Hailong Fan
@ 2021-01-25 13:11 ` Linus Walleij
0 siblings, 0 replies; 2+ messages in thread
From: Linus Walleij @ 2021-01-25 13:11 UTC (permalink / raw)
To: Hailong Fan
Cc: Sean Wang, Matthias Brugger,
moderated list:ARM/Mediatek SoC support, open list:GPIO SUBSYSTEM,
Linux ARM, linux-kernel@vger.kernel.org, youlin.pei,
Nicolas Boichat, srv_heupstream, chentsung, gtk_pangao,
Hanks Chen, yong.wu
On Mon, Jan 25, 2021 at 5:18 AM Hailong Fan <hailong.fan@mediatek.com> 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.
>
> Remove mtk_eint_flip_edge: because mtk_eint_unmask already calls it.
>
> Signed-off-by: Hailong Fan <hailong.fan@mediatek.com>
> Reviewed-by: Nicolas Boichat <drinkcat@chromium.org>
Took out v2 and applied this v3 instead.
(No idea what the difference is, you don't say.)
Yours,
Linus Walleij
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2021-01-25 13:12 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2021-01-25 4:17 [PATCH V3] pinctrl: mediatek: Fix trigger type setting follow for unexpected interrupt Hailong Fan
2021-01-25 13:11 ` Linus Walleij
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).