Message ID | 20220808025121.110223-1-jhlspies@gmail.com |
---|---|
State | Accepted |
Commit | b871656aa4f54e04207f62bdd0d7572be1d86b36 |
Headers | show |
Series | pinctrl: rockchip: Enhance support for IRQ_TYPE_EDGE_BOTH | expand |
On Mon, Aug 8, 2022 at 4:53 AM João H. Spies <jhlspies@gmail.com> wrote: > Switching between falling/rising edges for IRQ_TYPE_EDGE_BOTH on pins that > require debounce can cause the device to lose events due to a desync > between pin state and irq type. > > This problem is resolved by switching between IRQ_TYPE_LEVEL_LOW and > IRQ_TYPE_LEVEL_HIGH instead. > > Fixes: 936ee26 ("gpio/rockchip: add driver for rockchip gpio") > Signed-off-by: João H. Spies <jhlspies@gmail.com> No reaction from maintainers so I'm just gonna assume this fix is correct and applied for fixes. Yours, Linus Walleij
diff --git a/drivers/gpio/gpio-rockchip.c b/drivers/gpio/gpio-rockchip.c index 099e358d2491..48b948723077 100644 --- a/drivers/gpio/gpio-rockchip.c +++ b/drivers/gpio/gpio-rockchip.c @@ -417,11 +417,11 @@ static int rockchip_irq_set_type(struct irq_data *d, unsigned int type) goto out; } else { bank->toggle_edge_mode |= mask; - level |= mask; + level &= ~mask; /* * Determine gpio state. If 1 next interrupt should be - * falling otherwise rising. + * low otherwise high. */ data = readl(bank->reg_base + bank->gpio_regs->ext_port); if (data & mask)
Switching between falling/rising edges for IRQ_TYPE_EDGE_BOTH on pins that require debounce can cause the device to lose events due to a desync between pin state and irq type. This problem is resolved by switching between IRQ_TYPE_LEVEL_LOW and IRQ_TYPE_LEVEL_HIGH instead. Fixes: 936ee26 ("gpio/rockchip: add driver for rockchip gpio") Signed-off-by: João H. Spies <jhlspies@gmail.com> --- drivers/gpio/gpio-rockchip.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)