gpio: omap: Fix lost edge interrupts
authorGrygorii Strashko <grygorii.strashko@ti.com>
Tue, 3 Oct 2017 16:17:05 +0000 (11:17 -0500)
committerLinus Walleij <linus.walleij@linaro.org>
Sat, 7 Oct 2017 11:17:07 +0000 (13:17 +0200)
commit80ac93c274411a55ae731f259f75e4ca5e499e8b
tree73fce39c76d4636fc20486f94d797c87d58c0d6e
parente4b2ae7a8a11c5d4e0a6e21ba65d4b487a15d3d8
gpio: omap: Fix lost edge interrupts

Now acking of edge irqs happens the following way:
- omap_gpio_irq_handler
  - "isr" = read irq status
  - omap_clear_gpio_irqbank(bank, isr_saved & ~level_mask);
^ clear edge status, so irq can be accepted
  - loop while "isr"
generic_handle_irq()
 - handle_edge_irq()
    - desc->irq_data.chip->irq_ack(&desc->irq_data);
- omap_gpio_ack_irq()
it might be that at this moment edge IRQ was triggered again and it will be
cleared and IRQ will be lost.

Use handle_simple_irq and clear edge interrupts early without disabling them in
omap_gpio_irq_handler to avoid loosing interrupts.

[1] https://marc.info/?l=linux-omap&m=149004465313534&w=2
Signed-off-by: Grygorii Strashko <grygorii.strashko@ti.com>
Signed-off-by: Ladislav Michl <ladis@linux-mips.org>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
drivers/gpio/gpio-omap.c