[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-Id: <20190516193616.252788-1-furquan@google.com>
Date: Thu, 16 May 2019 12:36:16 -0700
From: Furquan Shaikh <furquan@...gle.com>
To: "Rafael J . Wysocki" <rjw@...ysocki.net>,
Len Brown <lenb@...nel.org>
Cc: linux-acpi@...r.kernel.org, linux-kernel@...r.kernel.org,
rajatja@...gle.com, furquan@...gle.com
Subject: [PATCH] ACPI: PM: Clear wake-up device GPEs before enabling
This change clears GPE status for wake-up devices before enabling that
GPE. This is required to ensure that stale GPE status does
not result in pre-mature wake on enabling GPE for wake-up devices.
Without this change, here is the sequence of events that is causing
suspend aborts on recent chrome books:
1. System decides to enter sleep.
2. All devices in the system are put into low power mode.
3. This results in acpi_dev_suspend being called for each ACPI
device.
4. If the device is wake capable, then acpi_dev_suspend calls
acpi_device_wakeup_enable to enable GPE for the device.
5. If GPE status is already set, enabling GPE for the wakeup device
results in generating a SCI which is handled by acpi_ev_detect_gpe
ultimately calling wakeup_source_activate that increments wakeup
events, and thus aborting the suspend attempt.
Signed-off-by: Furquan Shaikh <furquan@...gle.com>
---
drivers/acpi/device_pm.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/drivers/acpi/device_pm.c b/drivers/acpi/device_pm.c
index b859d75eaf9f6..e05ee3ff45683 100644
--- a/drivers/acpi/device_pm.c
+++ b/drivers/acpi/device_pm.c
@@ -721,6 +721,8 @@ static int __acpi_device_wakeup_enable(struct acpi_device *adev,
if (error)
goto out;
+ acpi_clear_gpe(wakeup->gpe_device, wakeup->gpe_number);
+
status = acpi_enable_gpe(wakeup->gpe_device, wakeup->gpe_number);
if (ACPI_FAILURE(status)) {
acpi_disable_wakeup_device_power(adev);
--
2.21.0.1020.gf2820cf01a-goog
Powered by blists - more mailing lists