• Jon Hunter's avatar
    mfd: as3722: Handle interrupts on suspend · e7dff89d
    Jon Hunter authored
    commit 35deff7e upstream.
    
    The as3722 device is registered as an irqchip and the as3722-rtc interrupt
    is one of it's interrupt sources. When using the as3722-rtc as a wake-up
    device from suspend, the following is seen:
    
      PM: Syncing filesystems ... done.
      Freezing user space processes ... (elapsed 0.001 seconds) done.
      Freezing remaining freezable tasks ... (elapsed 0.001 seconds) done.
      Suspending console(s) (use no_console_suspend to debug)
      PM: suspend of devices complete after 161.119 msecs
      PM: late suspend of devices complete after 1.048 msecs
      PM: noirq suspend of devices complete after 0.756 msecs
      Disabling non-boot CPUs ...
      CPU1: shutdown
      CPU2: shutdown
      CPU3: shutdown
      Entering suspend state LP1
      Enabling non-boot CPUs ...
      CPU1 is up
      CPU2 is up
      CPU3 is up
      PM: noirq resume of devices complete after 0.487 msecs
      as3722 4-0040: Failed to read IRQ status: -16
      as3722 4-0040: Failed to read IRQ status: -16
      as3722 4-0040: Failed to read IRQ status: -16
      as3722 4-0040: Failed to read IRQ status: -16
      ...
    
    The reason why the as3722 interrupt status cannot be read is because the
    as3722 interrupt is not masked during suspend and when the as3722-rtc
    interrupt occurs, to wake-up the device, the interrupt is seen before the
    i2c controller has been resumed in order to read the as3722 interrupt
    status.
    
    The as3722-rtc driver sets it's interrupt as a wake-up source during
    suspend, which gets propagated to the parent as3722 interrupt. However,
    the as3722-rtc driver cannot disable it's interrupt during suspend
    otherwise we would never be woken up and so the as3722 must disable it's
    interrupt instead.
    
    Fix this by disabling the as3722 interrupt during suspend. To ensure that
    a wake-up event from the as3722 is not missing, enable the as3722 interrupt
    as a wake-up source before disabling the interrupt on entering suspend.
    Signed-off-by: default avatarJon Hunter <jonathanh@nvidia.com>
    Signed-off-by: default avatarLee Jones <lee.jones@linaro.org>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    e7dff89d
Name
Last commit
Last update
Documentation Loading commit data...
arch Loading commit data...
block Loading commit data...
certs Loading commit data...
crypto Loading commit data...
drivers Loading commit data...
firmware Loading commit data...
fs Loading commit data...
include Loading commit data...
init Loading commit data...
ipc Loading commit data...
kernel Loading commit data...
lib Loading commit data...
mm Loading commit data...
net Loading commit data...
samples Loading commit data...
scripts Loading commit data...
security Loading commit data...
sound Loading commit data...
tools Loading commit data...
usr Loading commit data...
virt Loading commit data...
.get_maintainer.ignore Loading commit data...
.gitignore Loading commit data...
.mailmap Loading commit data...
COPYING Loading commit data...
CREDITS Loading commit data...
Kbuild Loading commit data...
Kconfig Loading commit data...
MAINTAINERS Loading commit data...
Makefile Loading commit data...
README Loading commit data...
REPORTING-BUGS Loading commit data...