• Rafael J. Wysocki's avatar
    ACPI / PM: Ignore wakeup setting if the ACPI companion can't wake up · ab1e2dc0
    Rafael J. Wysocki authored
    commit 78579b7c upstream.
    
    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>
    Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
    [ luis: backported to 3.16: adjusted context ]
    Signed-off-by: default avatarLuis Henriques <luis.henriques@canonical.com>
    ab1e2dc0
device_pm.c 30.8 KB