• Rafael J. Wysocki's avatar
    ACPI / PM: Ignore wakeup setting if the ACPI companion can't wake up · 78579b7c
    Rafael J. Wysocki authored
    As reported by Dmitry, on some Chromebooks there are devices with
    corresponding ACPI objects and with unusual system wakeup
    configuration.  Namely, they technically are wakeup-capable, but the
    wakeup is handled via a platform-specific out-of-band mechanism and
    the ACPI PM layer has no information on the wakeup capability.  As
    a result, device_may_wakeup(dev) called from acpi_dev_suspend_late()
    returns 'true' for those devices, but the wakeup.flags.valid flag is
    unset for the corresponding ACPI device objects, so acpi_device_wakeup()
    reproducibly fails for them causing acpi_dev_suspend_late() to return
    an error code.  The entire system suspend is then aborted and the
    machines in question cannot suspend at all.
    
    Address the problem by ignoring the device_may_wakeup(dev) return
    value in acpi_dev_suspend_late() if the ACPI companion of the device
    being handled has wakeup.flags.valid unset (in which case it is clear
    that the wakeup is supposed to be handled by other means).
    
    This fixes a regression introduced by commit a76e9bd8 (i2c:
    attach/detach I2C client device to the ACPI power domain) as the
    affected systems could suspend and resume successfully before that
    commit.
    
    Fixes: a76e9bd8 (i2c: attach/detach I2C client device to the ACPI power domain)
    Reported-by: default avatarDmitry Torokhov <dtor@chromium.org>
    Reviewed-by: default avatarDmitry Torokhov <dtor@chromium.org>
    Cc: 3.13+ <stable@vger.kernel.org> # 3.13+
    Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
    78579b7c
device_pm.c 31.1 KB