Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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 <es@ethanschoonover.com>
Tested-by: Peter Amidon <psa.pub.0@picnicpark.org>
Tested-by: Yani Ioadnnou <yani.ioannou@gmail.com>
Tested-by: Mister Wardrop <mister.wardrop@gmail.com>
Tested-by: Anton Anikin <anton@anikin.name>
Tested-by: Keith McClelland <zismylaptop@gmail.com>
Reviewed-by: Zhang Rui <rui.zhang@intel.com>
Signed-off-by: Chen Yu <yu.c.chen@intel.com>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>

authored by

Chen Yu and committed by
Rafael J. Wysocki
7b02ccea b8ee2978

+2
+2
drivers/acpi/sleep.c
··· 629 629 630 630 static int acpi_freeze_prepare(void) 631 631 { 632 + acpi_enable_wakeup_devices(ACPI_STATE_S0); 632 633 acpi_enable_all_wakeup_gpes(); 633 634 acpi_os_wait_events_complete(); 634 635 enable_irq_wake(acpi_gbl_FADT.sci_interrupt); ··· 638 637 639 638 static void acpi_freeze_restore(void) 640 639 { 640 + acpi_disable_wakeup_devices(ACPI_STATE_S0); 641 641 disable_irq_wake(acpi_gbl_FADT.sci_interrupt); 642 642 acpi_enable_all_runtime_gpes(); 643 643 }