On Mon, Jun 22, 2020 at 11:46 PM Paul Cercueil <paul@xxxxxxxxxxxxxxx> wrote: > Ingenic SoCs don't natively support registering an interrupt for both > rising and falling edges. This has to be emulated in software. > > Until now, this was emulated by switching back and forth between > IRQ_TYPE_EDGE_RISING and IRQ_TYPE_EDGE_FALLING according to the level of > the GPIO. While this worked most of the time, when used with GPIOs that > need debouncing, some events would be lost. For instance, between the > time a falling-edge interrupt happens and the interrupt handler > configures the hardware for rising-edge, the level of the pin may have > already risen, and the rising-edge event is lost. > > To address that issue, instead of switching back and forth between > IRQ_TYPE_EDGE_RISING and IRQ_TYPE_EDGE_FALLING, we now switch back and > forth between IRQ_TYPE_LEVEL_LOW and IRQ_TYPE_LEVEL_HIGH. Since we > always switch in the interrupt handler, they actually permit to detect > level changes. In the example above, if the pin level rises before > switching the IRQ type from IRQ_TYPE_LEVEL_LOW to IRQ_TYPE_LEVEL_HIGH, > a new interrupt will raise as soon as the handler exits, and the > rising-edge event will be properly detected. > > Cc: stable@xxxxxxxxxxxxxxx > Fixes: e72394e2ea19 ("pinctrl: ingenic: Merge GPIO functionality") > Reported-by: João Henrique <johnnyonflame@xxxxxxxxxxx> > Tested-by: João Henrique <johnnyonflame@xxxxxxxxxxx> > Signed-off-by: Paul Cercueil <paul@xxxxxxxxxxxxxxx> I have applied these two as non-urgent fixes for v5.9. Are they urgent? Are they causing regressions? Tell me if they need to be merged to v5.8-rcs. Yours, Linus Walleij