aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/acpi/device_pm.c12
-rw-r--r--include/acpi/acpi_bus.h1
2 files changed, 11 insertions, 2 deletions
diff --git a/drivers/acpi/device_pm.c b/drivers/acpi/device_pm.c
index 076af8149566..e6ff33ecd784 100644
--- a/drivers/acpi/device_pm.c
+++ b/drivers/acpi/device_pm.c
@@ -680,13 +680,21 @@ static int acpi_device_wakeup(struct acpi_device *adev, u32 target_state,
680 if (error) 680 if (error)
681 return error; 681 return error;
682 682
683 if (adev->wakeup.flags.enabled)
684 return 0;
685
683 res = acpi_enable_gpe(wakeup->gpe_device, wakeup->gpe_number); 686 res = acpi_enable_gpe(wakeup->gpe_device, wakeup->gpe_number);
684 if (ACPI_FAILURE(res)) { 687 if (ACPI_SUCCESS(res)) {
688 adev->wakeup.flags.enabled = 1;
689 } else {
685 acpi_disable_wakeup_device_power(adev); 690 acpi_disable_wakeup_device_power(adev);
686 return -EIO; 691 return -EIO;
687 } 692 }
688 } else { 693 } else {
689 acpi_disable_gpe(wakeup->gpe_device, wakeup->gpe_number); 694 if (adev->wakeup.flags.enabled) {
695 acpi_disable_gpe(wakeup->gpe_device, wakeup->gpe_number);
696 adev->wakeup.flags.enabled = 0;
697 }
690 acpi_disable_wakeup_device_power(adev); 698 acpi_disable_wakeup_device_power(adev);
691 } 699 }
692 return 0; 700 return 0;
diff --git a/include/acpi/acpi_bus.h b/include/acpi/acpi_bus.h
index f34a0835aa4f..8de31d472fad 100644
--- a/include/acpi/acpi_bus.h
+++ b/include/acpi/acpi_bus.h
@@ -312,6 +312,7 @@ struct acpi_device_wakeup_flags {
312 u8 valid:1; /* Can successfully enable wakeup? */ 312 u8 valid:1; /* Can successfully enable wakeup? */
313 u8 run_wake:1; /* Run-Wake GPE devices */ 313 u8 run_wake:1; /* Run-Wake GPE devices */
314 u8 notifier_present:1; /* Wake-up notify handler has been installed */ 314 u8 notifier_present:1; /* Wake-up notify handler has been installed */
315 u8 enabled:1; /* Enabled for wakeup */
315}; 316};
316 317
317struct acpi_device_wakeup_context { 318struct acpi_device_wakeup_context {