提交 175f8e26 编写于 作者: R Rafael J. Wysocki

ACPI / PM: Do not disable wakeup GPEs that have not been enabled

In some cases acpi_device_wakeup() may be called to ensure wakeup
power to be off for a given device even though that device's wakeup
GPE has not been enabled so far.  It calls acpi_disable_gpe() on a
GPE that's not enabled and this causes ACPICA to return the AE_LIMIT
status code from that call which then is reported as an error by the
ACPICA's debug facilities (if enabled).  This may lead to a fair
amount of confusion, so introduce a new ACPI device wakeup flag
to store the wakeup GPE status and avoid disabling wakeup GPEs
that have not been enabled.
Reported-and-tested-by: NVenkat Raghavulu <venkat.raghavulu@intel.com>
Signed-off-by: NRafael J. Wysocki <rafael.j.wysocki@intel.com>
上级 c52fa70c
...@@ -680,13 +680,21 @@ static int acpi_device_wakeup(struct acpi_device *adev, u32 target_state, ...@@ -680,13 +680,21 @@ static int acpi_device_wakeup(struct acpi_device *adev, u32 target_state,
if (error) if (error)
return error; return error;
if (adev->wakeup.flags.enabled)
return 0;
res = acpi_enable_gpe(wakeup->gpe_device, wakeup->gpe_number); res = acpi_enable_gpe(wakeup->gpe_device, wakeup->gpe_number);
if (ACPI_FAILURE(res)) { if (ACPI_SUCCESS(res)) {
adev->wakeup.flags.enabled = 1;
} else {
acpi_disable_wakeup_device_power(adev); acpi_disable_wakeup_device_power(adev);
return -EIO; return -EIO;
} }
} else { } else {
acpi_disable_gpe(wakeup->gpe_device, wakeup->gpe_number); if (adev->wakeup.flags.enabled) {
acpi_disable_gpe(wakeup->gpe_device, wakeup->gpe_number);
adev->wakeup.flags.enabled = 0;
}
acpi_disable_wakeup_device_power(adev); acpi_disable_wakeup_device_power(adev);
} }
return 0; return 0;
......
...@@ -312,6 +312,7 @@ struct acpi_device_wakeup_flags { ...@@ -312,6 +312,7 @@ struct acpi_device_wakeup_flags {
u8 valid:1; /* Can successfully enable wakeup? */ u8 valid:1; /* Can successfully enable wakeup? */
u8 run_wake:1; /* Run-Wake GPE devices */ u8 run_wake:1; /* Run-Wake GPE devices */
u8 notifier_present:1; /* Wake-up notify handler has been installed */ u8 notifier_present:1; /* Wake-up notify handler has been installed */
u8 enabled:1; /* Enabled for wakeup */
}; };
struct acpi_device_wakeup_context { struct acpi_device_wakeup_context {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册