[OpenWrt-Devel] [PATCH] gpio-button-hotplug: gpio-keys: read initial state

Linus Walleij linus.walleij at linaro.org
Sun Jun 16 19:42:17 EDT 2019

On Sun, Jun 16, 2019 at 4:31 PM David Bauer <mail at david-bauer.net> wrote:

> It seems the input is indeed not stable after setting the GPIO
> direction. With the following patch applied, i get zero ghost presses
> and the buttons work as expected. However I'm not sure if this approach
> is the right one to fix the underlying issue.

It shows what the problem is for sure. delays are forbidden in
irqchip callback functions since they are all called from
IRQ context with IRQs disabled though.

> @@ -96,6 +97,12 @@ static void ath79_gpio_irq_enable(struct irq_data *data)

>         u32 mask = BIT(irqd_to_hwirq(data));
>         unsigned long flags;
> +       /*
> +        * The input can be unstable after configuring GPIO direction.
> +        * Wait a bit to assert the input is stable.
> +        */
> +       msleep(25);
> +
>         raw_spin_lock_irqsave(&ctrl->lock, flags);
>         ath79_gpio_update_bits(ctrl, AR71XX_GPIO_REG_INT_ENABLE, mask, mask);
>         ath79_gpio_update_bits(ctrl, AR71XX_GPIO_REG_INT_MASK, mask, mask);

After this and before the raw_spin_unlock() try to read the status
register until it
eads zero for the requested IRQ:

while (ath79_gpio_read(ctrl, AR71XX_GPIO_REG_INT_PENDING) & mask) {}

This way we wait for the status to go low before we allow any IRQs to
fire after enableing.

Maybe not so good since we may want to turn on IRQs that are asserted
at some point, but worth a try.

Linus Walleij

openwrt-devel mailing list
openwrt-devel at lists.openwrt.org

More information about the openwrt-devel mailing list