• Tony Lindgren's avatar
    gpio: omap: Fix lost edge wake-up interrupts · a522f1d0
    Tony Lindgren authored
    If an edge interrupt triggers while entering idle just before we save
    GPIO datain register to saved_datain, the triggered GPIO will not be
    noticed on wake-up. This is because the saved_datain and GPIO datain
    are the same on wake-up in omap_gpio_unidle(). Let's fix this by
    ignoring any pending edge interrupts for saved_datain.
    
    This issue affects only idle states where the GPIO module internal
    wake-up path is operational. For deeper idle states where the GPIO
    module gets powered off, Linux generic wakeirqs must be used for
    the padconf wake-up events with pinctrl-single driver. For examples,
    please see "interrupts-extended" dts usage in many drivers.
    
    This issue can be somewhat easily reproduced by pinging an idle system
    with smsc911x Ethernet interface configured IRQ_TYPE_EDGE_FALLING. At
    some point the smsc911x interrupts will just stop triggering. Also if
    WLCORE WLAN is used with EDGE interrupt like it's documentation specifies,
    we can see lost interrupts without this patch.
    
    Note that in the long run we may be able to cancel entering idle by
    returning an error in gpio_omap_cpu_notifier() on pending interrupts.
    But let's fix the bug first.
    
    Also note that because of the recent clean-up efforts this patch does
    not apply directly to older kernels. This does fix a long term issue
    though, and can be backported as needed.
    
    Cc: Aaro Koskinen <aaro.koskinen@iki.fi>
    Cc: Grygorii Strashko <grygorii.strashko@ti.com>
    Cc: Keerthy <j-keerthy@ti.com>
    Cc: Ladislav Michl <ladis@linux-mips.org>
    Cc: Peter Ujfalusi <peter.ujfalusi@ti.com>
    Cc: Russell King <rmk+kernel@armlinux.org.uk>
    Cc: Tero Kristo <t-kristo@ti.com>
    Signed-off-by: default avatarTony Lindgren <tony@atomide.com>
    Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
    a522f1d0
gpio-omap.c 41.1 KB