aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChen Yu <[email protected]>2015-03-27 18:08:48 +0800
committerRafael J. Wysocki <[email protected]>2015-03-30 01:52:02 +0200
commit7b02ccea2e70e5e3e9fccf36123b77240323b8d6 (patch)
treef9c1acb7176f11d14af987772b2c540149eb9220
parentb8ee29786f6c0a887a65240fe0289b7ffc227a55 (diff)
ACPI / PM: Enable all wakeup GPEs in suspend-to-idle
Currently, in suspend-to-idle, wakeup GPE for PCI devices are handled properly because acpi_pci_sleep_wake() invokes acpi_enable_gpe() to enable the wakeup GPE directly. But for the other wakeup-capable devices in ACPI bus, acpi_enable_wakeup_devices() should be invoked to update enable_for_wake mask in gpe_register_info structure, thus acpi_enable_all_wakeup_gpes() can enable the wakeup GPE referred in _PRW methods. And acpi_disable_wakeup_devices() will be called before disable_irq_wake() in acpi_freeze_restore() to restore the mask. This patch fixes a power button wakeup problem on Surface Pro 3, on which platform power button uses EC to deliver event (EC GPE is referred in _PRW). Note: enabling EC GPE during freeze state may bring some risks because EC events are expected to fire more frequently than others. Thus it may bring the system out of freeze state unnecessarily. (We already have comments about this in bugzilla) Link: https://bugzilla.kernel.org/show_bug.cgi?id=84651 Reported-and-tested-by: Ethan Schoonover <[email protected]> Tested-by: Peter Amidon <[email protected]> Tested-by: Yani Ioadnnou <[email protected]> Tested-by: Mister Wardrop <[email protected]> Tested-by: Anton Anikin <[email protected]> Tested-by: Keith McClelland <[email protected]> Reviewed-by: Zhang Rui <[email protected]> Signed-off-by: Chen Yu <[email protected]> Signed-off-by: Rafael J. Wysocki <[email protected]>
-rw-r--r--drivers/acpi/sleep.c2
1 files changed, 2 insertions, 0 deletions
diff --git a/drivers/acpi/sleep.c b/drivers/acpi/sleep.c
index 24a830b39ec3..2f0d4db40a9e 100644
--- a/drivers/acpi/sleep.c
+++ b/drivers/acpi/sleep.c
@@ -629,6 +629,7 @@ static int acpi_freeze_begin(void)
static int acpi_freeze_prepare(void)
{
+ acpi_enable_wakeup_devices(ACPI_STATE_S0);
acpi_enable_all_wakeup_gpes();
acpi_os_wait_events_complete();
enable_irq_wake(acpi_gbl_FADT.sci_interrupt);
@@ -637,6 +638,7 @@ static int acpi_freeze_prepare(void)
static void acpi_freeze_restore(void)
{
+ acpi_disable_wakeup_devices(ACPI_STATE_S0);
disable_irq_wake(acpi_gbl_FADT.sci_interrupt);
acpi_enable_all_runtime_gpes();
}