Message ID | 20220808025121.110223-1-jhlspies@gmail.com |
---|---|
State | New |
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
Am Montag, 22. August 2022, 11:03:08 CEST schrieb Linus Walleij: > 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. This plays with behavioral peculiarities of the gpio controller (using the level setting to hopefully prevent missing edge irqs), so doesn't follow So I guess it really is more of a wait-and-see. And I guess as João seems to have experienced that issue, that will hopefully work for others too. Heiko
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(-)