On Friday, March 27, 2015 06:08:48 PM Chen Yu wrote: > Currently, in freeze state, 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) > > Fixes https://bugzilla.kernel.org/show_bug.cgi?id=84651 > > Reported-and-tested-by: Ethan Schoonover <es@xxxxxxxxxxxxxxxxxxx> > Tested-by: Peter Amidon <psa.pub.0@xxxxxxxxxxxxxx> > Tested-by: Yani Ioadnnou <yani.ioannou@xxxxxxxxx> > Tested-by: Mister Wardrop <mister.wardrop@xxxxxxxxx> > Tested-by: Anton Anikin <anton@xxxxxxxxxxx> > Tested-by: Keith McClelland <zismylaptop@xxxxxxxxx> > Reviewed-by: Zhang Rui <rui.zhang@xxxxxxxxx> > Signed-off-by: Chen Yu <yu.c.chen@xxxxxxxxx> Queued up for 4.1 with minor changes in the changelog/subject, thanks! > --- > drivers/acpi/sleep.c | 2 ++ > 1 file changed, 2 insertions(+) > > diff --git a/drivers/acpi/sleep.c b/drivers/acpi/sleep.c > index 7f251dd..81e5bd4 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(); > } > -- I speak only for myself. Rafael J. Wysocki, Intel Open Source Technology Center. -- To unsubscribe from this list: send the line "unsubscribe linux-acpi" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html