• Russell King's avatar
    gpio: gpio-omap: fix level interrupt idling · d01849f7
    Russell King authored
    Tony notes that the GPIO module does not idle when level interrupts are
    in use, as the wakeup appears to get stuck.
    
    After extensive investigation, it appears that the wakeup will only be
    cleared if the interrupt status register is cleared while the interrupt
    is enabled. However, we are currently clearing it with the interrupt
    disabled for level-based interrupts.
    
    It is acknowledged that this observed behaviour conflicts with a
    statement in the TRM:
    
    CAUTION
      After servicing the interrupt, the status bit in the interrupt status
      register (GPIOi.GPIO_IRQSTATUS_0 or GPIOi.GPIO_IRQSTATUS_1) must be
      reset and the interrupt line released (by setting the corresponding
      bit of the interrupt status register to 1) before enabling an
      interrupt for the GPIO channel in the interrupt-enable register
      (GPIOi.GPIO_IRQSTATUS_SET_0 or GPIOi.GPIO_IRQSTATUS_SET_1) to prevent
      the occurrence of unexpected interrupts when enabling an interrupt
      for the GPIO channel.
    
    However, this does not appear to be a practical problem.
    
    Further, as reported by Grygorii Strashko <grygorii.strashko@ti.com>,
    the TI Android kernel tree has an earlier similar patch as "GPIO: OMAP:
    Fix the sequence to clear the IRQ status" saying:
    
     if the status is cleared after disabling the IRQ then sWAKEUP will not
     be cleared and gates the module transition
    
    When we unmask the level interrupt after the interrupt has been handled,
    enable the interrupt and only then clear the interrupt. If the interrupt
    is still pending, the hardware will re-assert the interrupt status.
    
    Should the caution note in the TRM prove to be a problem, we could
    use a clear-enable-clear sequence instead.
    
    Cc: Aaro Koskinen <aaro.koskinen@iki.fi>
    Cc: Keerthy <j-keerthy@ti.com>
    Cc: Peter Ujfalusi <peter.ujfalusi@ti.com>
    Signed-off-by: default avatarRussell King <rmk+kernel@armlinux.org.uk>
    [tony@atomide.com: updated comments based on an earlier TI patch]
    Signed-off-by: default avatarTony Lindgren <tony@atomide.com>
    Acked-by: default avatarGrygorii Strashko <grygorii.strashko@ti.com>
    Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
    d01849f7
gpio-omap.c 46.9 KB