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@xxxxxxxxxx> --- 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