]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blobdiff - drivers/acpi/sleep.c
ACPI / PM: Ignore spurious SCI wakeups from suspend-to-idle
[mirror_ubuntu-artful-kernel.git] / drivers / acpi / sleep.c
index a6574d62634031ac6e351418b935a333b556b665..555de11a56b6d3fcb635641cffe0113c8f472adf 100644 (file)
@@ -650,6 +650,8 @@ static const struct platform_suspend_ops acpi_suspend_ops_old = {
        .recover = acpi_pm_finish,
 };
 
+static bool s2idle_wakeup;
+
 static int acpi_freeze_begin(void)
 {
        acpi_scan_lock_acquire();
@@ -658,7 +660,6 @@ 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();
        if (acpi_sci_irq_valid())
@@ -675,8 +676,10 @@ static void acpi_freeze_wake(void)
         * case it has not been a wakeup event (the GPEs will be checked later).
         */
        if (acpi_sci_irq_valid() &&
-           !irqd_is_wakeup_armed(irq_get_irq_data(acpi_sci_irq)))
+           !irqd_is_wakeup_armed(irq_get_irq_data(acpi_sci_irq))) {
                pm_system_cancel_wakeup();
+               s2idle_wakeup = true;
+       }
 }
 
 static void acpi_freeze_sync(void)
@@ -689,11 +692,11 @@ static void acpi_freeze_sync(void)
         */
        acpi_os_wait_events_complete();
        flush_scheduled_work();
+       s2idle_wakeup = false;
 }
 
 static void acpi_freeze_restore(void)
 {
-       acpi_disable_wakeup_devices(ACPI_STATE_S0);
        if (acpi_sci_irq_valid())
                disable_irq_wake(acpi_sci_irq);
 
@@ -728,9 +731,15 @@ static void acpi_sleep_suspend_setup(void)
 }
 
 #else /* !CONFIG_SUSPEND */
+#define s2idle_wakeup  (false)
 static inline void acpi_sleep_suspend_setup(void) {}
 #endif /* !CONFIG_SUSPEND */
 
+bool acpi_s2idle_wakeup(void)
+{
+       return s2idle_wakeup;
+}
+
 #ifdef CONFIG_PM_SLEEP
 static u32 saved_bm_rld;