|
@@ -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();
|
|
@@ -666,6 +668,33 @@ static int acpi_freeze_prepare(void)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+static void acpi_freeze_wake(void)
|
|
|
+{
|
|
|
+ /*
|
|
|
+ * If IRQD_WAKEUP_ARMED is not set for the SCI at this point, it means
|
|
|
+ * that the SCI has triggered while suspended, so cancel the wakeup in
|
|
|
+ * 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))) {
|
|
|
+ pm_system_cancel_wakeup();
|
|
|
+ s2idle_wakeup = true;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+static void acpi_freeze_sync(void)
|
|
|
+{
|
|
|
+ /*
|
|
|
+ * Process all pending events in case there are any wakeup ones.
|
|
|
+ *
|
|
|
+ * The EC driver uses the system workqueue, so that one needs to be
|
|
|
+ * flushed too.
|
|
|
+ */
|
|
|
+ acpi_os_wait_events_complete();
|
|
|
+ flush_scheduled_work();
|
|
|
+ s2idle_wakeup = false;
|
|
|
+}
|
|
|
+
|
|
|
static void acpi_freeze_restore(void)
|
|
|
{
|
|
|
if (acpi_sci_irq_valid())
|
|
@@ -682,6 +711,8 @@ static void acpi_freeze_end(void)
|
|
|
static const struct platform_freeze_ops acpi_freeze_ops = {
|
|
|
.begin = acpi_freeze_begin,
|
|
|
.prepare = acpi_freeze_prepare,
|
|
|
+ .wake = acpi_freeze_wake,
|
|
|
+ .sync = acpi_freeze_sync,
|
|
|
.restore = acpi_freeze_restore,
|
|
|
.end = acpi_freeze_end,
|
|
|
};
|
|
@@ -700,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;
|
|
|
|