Commit 024aa873 authored by Rafael J. Wysocki's avatar Rafael J. Wysocki

ACPI: PM: s2idle: Rework ACPI events synchronization

Note that the EC GPE processing need not be synchronized in
acpi_s2idle_wake() after invoking acpi_ec_dispatch_gpe(), because
that function checks the GPE status and dispatches its handler if
need be and the SCI action handler is not going to run anyway at
that point.

Moreover, it is better to drain all of the pending ACPI events
before restoring the working-state configuration of GPEs in
acpi_s2idle_restore(), because those events are likely to be related
to system wakeup, in which case they will not be relevant going
forward.

Rework the code to take these observations into account.
Tested-by: default avatarKenneth R. Crudup <kenny@panix.com>
Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
parent 016b87ca
...@@ -977,6 +977,16 @@ static int acpi_s2idle_prepare_late(void) ...@@ -977,6 +977,16 @@ static int acpi_s2idle_prepare_late(void)
return 0; return 0;
} }
static void acpi_s2idle_sync(void)
{
/*
* The EC driver uses the system workqueue and an additional special
* one, so those need to be flushed too.
*/
acpi_ec_flush_work();
acpi_os_wait_events_complete(); /* synchronize Notify handling */
}
static void acpi_s2idle_wake(void) static void acpi_s2idle_wake(void)
{ {
/* /*
...@@ -1001,13 +1011,8 @@ static void acpi_s2idle_wake(void) ...@@ -1001,13 +1011,8 @@ static void acpi_s2idle_wake(void)
* should be missed by canceling the wakeup here. * should be missed by canceling the wakeup here.
*/ */
pm_system_cancel_wakeup(); pm_system_cancel_wakeup();
/*
* The EC driver uses the system workqueue and an additional acpi_s2idle_sync();
* special one, so those need to be flushed too.
*/
acpi_os_wait_events_complete(); /* synchronize EC GPE processing */
acpi_ec_flush_work();
acpi_os_wait_events_complete(); /* synchronize Notify handling */
rearm_wake_irq(acpi_sci_irq); rearm_wake_irq(acpi_sci_irq);
} }
...@@ -1024,6 +1029,13 @@ static void acpi_s2idle_restore_early(void) ...@@ -1024,6 +1029,13 @@ static void acpi_s2idle_restore_early(void)
static void acpi_s2idle_restore(void) static void acpi_s2idle_restore(void)
{ {
/*
* Drain pending events before restoring the working-state configuration
* of GPEs.
*/
acpi_os_wait_events_complete(); /* synchronize GPE processing */
acpi_s2idle_sync();
s2idle_wakeup = false; s2idle_wakeup = false;
acpi_enable_all_runtime_gpes(); acpi_enable_all_runtime_gpes();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment