|
@@ -662,14 +662,40 @@ static int acpi_freeze_prepare(void)
|
|
|
acpi_os_wait_events_complete();
|
|
|
if (acpi_sci_irq_valid())
|
|
|
enable_irq_wake(acpi_sci_irq);
|
|
|
+
|
|
|
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();
|
|
|
+}
|
|
|
+
|
|
|
+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();
|
|
|
+}
|
|
|
+
|
|
|
static void acpi_freeze_restore(void)
|
|
|
{
|
|
|
acpi_disable_wakeup_devices(ACPI_STATE_S0);
|
|
|
if (acpi_sci_irq_valid())
|
|
|
disable_irq_wake(acpi_sci_irq);
|
|
|
+
|
|
|
acpi_enable_all_runtime_gpes();
|
|
|
}
|
|
|
|
|
@@ -681,6 +707,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,
|
|
|
};
|