|
@@ -741,19 +741,39 @@ acpi_bus_extract_wakeup_device_power_package(struct acpi_device *device,
|
|
|
return AE_OK;
|
|
|
}
|
|
|
|
|
|
-static int acpi_bus_get_wakeup_device_flags(struct acpi_device *device)
|
|
|
+static void acpi_bus_set_run_wake_flags(struct acpi_device *device)
|
|
|
{
|
|
|
- acpi_status status = 0;
|
|
|
- struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
|
|
|
- union acpi_object *package = NULL;
|
|
|
- int psw_error;
|
|
|
-
|
|
|
struct acpi_device_id button_device_ids[] = {
|
|
|
{"PNP0C0D", 0},
|
|
|
{"PNP0C0C", 0},
|
|
|
{"PNP0C0E", 0},
|
|
|
{"", 0},
|
|
|
};
|
|
|
+ acpi_status status;
|
|
|
+ acpi_event_status event_status;
|
|
|
+
|
|
|
+ device->wakeup.run_wake_count = 0;
|
|
|
+
|
|
|
+ /* Power button, Lid switch always enable wakeup */
|
|
|
+ if (!acpi_match_device_ids(device, button_device_ids)) {
|
|
|
+ device->wakeup.flags.run_wake = 1;
|
|
|
+ device->wakeup.flags.always_enabled = 1;
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ status = acpi_get_gpe_status(NULL, device->wakeup.gpe_number,
|
|
|
+ ACPI_NOT_ISR, &event_status);
|
|
|
+ if (status == AE_OK)
|
|
|
+ device->wakeup.flags.run_wake =
|
|
|
+ !!(event_status & ACPI_EVENT_FLAG_HANDLE);
|
|
|
+}
|
|
|
+
|
|
|
+static int acpi_bus_get_wakeup_device_flags(struct acpi_device *device)
|
|
|
+{
|
|
|
+ acpi_status status = 0;
|
|
|
+ struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
|
|
|
+ union acpi_object *package = NULL;
|
|
|
+ int psw_error;
|
|
|
|
|
|
/* _PRW */
|
|
|
status = acpi_evaluate_object(device->handle, "_PRW", NULL, &buffer);
|
|
@@ -773,6 +793,7 @@ static int acpi_bus_get_wakeup_device_flags(struct acpi_device *device)
|
|
|
|
|
|
device->wakeup.flags.valid = 1;
|
|
|
device->wakeup.prepare_count = 0;
|
|
|
+ acpi_bus_set_run_wake_flags(device);
|
|
|
/* Call _PSW/_DSW object to disable its ability to wake the sleeping
|
|
|
* system for the ACPI device with the _PRW object.
|
|
|
* The _PSW object is depreciated in ACPI 3.0 and is replaced by _DSW.
|
|
@@ -784,10 +805,6 @@ static int acpi_bus_get_wakeup_device_flags(struct acpi_device *device)
|
|
|
ACPI_DEBUG_PRINT((ACPI_DB_INFO,
|
|
|
"error in _DSW or _PSW evaluation\n"));
|
|
|
|
|
|
- /* Power button, Lid switch always enable wakeup */
|
|
|
- if (!acpi_match_device_ids(device, button_device_ids))
|
|
|
- device->wakeup.flags.run_wake = 1;
|
|
|
-
|
|
|
end:
|
|
|
if (ACPI_FAILURE(status))
|
|
|
device->flags.wake_capable = 0;
|