Skip to content
  • Tony Lindgren's avatar
    gpio: omap: Add level wakeup handling for omap4 based SoCs · ec0daae6
    Tony Lindgren authored
    
    
    I noticed that unlike omap2 and 3 based SoCs, omap4 based SoCs keep
    the GPIO clocks enabled for GPIO level interrupts with wakeup enabled.
    This blocks deeper idle states as the whole domain will stay busy.
    
    The GPIO functional clock seems to stay enabled if the wakeup register
    is enabled and a level interrupt is triggered. In that case the only
    way to have the GPIO module idle is to reset it. It is possible this
    has gone unnoticed with OSWR (Open SWitch Retention) and off mode
    during idle resetting GPIO context most GPIO instances in the earlier
    Android trees for example.
    
    Looks like the way to deal with this is to have omap4 based SoCs
    only set wake for the duration of idle for level interrupts, and clear
    level registers for the idle. With level interrupts we can do this as
    the level interrupt from device will be still there on resume.
    
    I've taken the long path to fixing this to avoid yet more hard to
    read code. I've set up a quirks flag, and a struct for function
    pointers so we can use these to clean up other quirk handling easier
    in the later patches. The current level quirk handling is moved to
    the new functions.
    
    Cc: Aaro Koskinen <aaro.koskinen@iki.fi>
    Cc: Ladislav Michl <ladis@linux-mips.org>
    Cc: Tero Kristo <t-kristo@ti.com>
    Signed-off-by: default avatarTony Lindgren <tony@atomide.com>
    Acked-by: default avatarGrygorii Strashko <grygorii.strashko@ti.com>
    Tested-by: default avatarKeerthy <j-keerthy@ti.com>
    
    Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
    ec0daae6