ACPI / PM: Clean up device wakeup enable/disable code
authorRafael J. Wysocki <rafael.j.wysocki@intel.com>
Mon, 12 Jun 2017 20:51:07 +0000 (22:51 +0200)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Wed, 14 Jun 2017 22:55:43 +0000 (00:55 +0200)
The wakeup.flags.enabled flag in struct acpi_device is not used
consistently, as there is no reason why it should only apply
to the enabling/disabling of the wakeup GPE, so put the invocation
of acpi_enable_wakeup_device_power() under it too.

Moreover, it is not necessary to call
acpi_enable_wakeup_devices() and acpi_disable_wakeup_devices() for
suspend-to-idle, so don't do that.

Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
drivers/acpi/device_pm.c
drivers/acpi/sleep.c

index fa7405286d716d3d226eae0aaae536f75577bf3f..f13c62c4b117806ff899081a97f3e6ca9ffa7735 100644 (file)
@@ -688,26 +688,23 @@ static int acpi_device_wakeup(struct acpi_device *adev, u32 target_state,
                acpi_status res;
                int error;
 
+               if (adev->wakeup.flags.enabled)
+                       return 0;
+
                error = acpi_enable_wakeup_device_power(adev, target_state);
                if (error)
                        return error;
 
-               if (adev->wakeup.flags.enabled)
-                       return 0;
-
                res = acpi_enable_gpe(wakeup->gpe_device, wakeup->gpe_number);
-               if (ACPI_SUCCESS(res)) {
-                       adev->wakeup.flags.enabled = 1;
-               } else {
+               if (ACPI_FAILURE(res)) {
                        acpi_disable_wakeup_device_power(adev);
                        return -EIO;
                }
-       } else {
-               if (adev->wakeup.flags.enabled) {
-                       acpi_disable_gpe(wakeup->gpe_device, wakeup->gpe_number);
-                       adev->wakeup.flags.enabled = 0;
-               }
+               adev->wakeup.flags.enabled = 1;
+       } else if (adev->wakeup.flags.enabled) {
+               acpi_disable_gpe(wakeup->gpe_device, wakeup->gpe_number);
                acpi_disable_wakeup_device_power(adev);
+               adev->wakeup.flags.enabled = 0;
        }
        return 0;
 }
index 097d630ab8867267326121f9f4db2525cf06ef4b..a4782c75ebdd7169d0a9705a0d52912c5fa73dd5 100644 (file)
@@ -658,19 +658,19 @@ static int acpi_freeze_begin(void)
 
 static int acpi_freeze_prepare(void)
 {
-       acpi_enable_wakeup_devices(ACPI_STATE_S0);
        acpi_enable_all_wakeup_gpes();
        acpi_os_wait_events_complete();
        if (acpi_sci_irq_valid())
                enable_irq_wake(acpi_sci_irq);
+
        return 0;
 }
 
 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();
 }