aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/acpi/scan.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/acpi/scan.c')
-rw-r--r--drivers/acpi/scan.c26
1 files changed, 16 insertions, 10 deletions
diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c
index d557868c0081..e4ac46a9c664 100644
--- a/drivers/acpi/scan.c
+++ b/drivers/acpi/scan.c
@@ -479,6 +479,9 @@ static void acpi_free_power_resources_lists(struct acpi_device *device)
479{ 479{
480 int i; 480 int i;
481 481
482 if (device->wakeup.flags.valid)
483 acpi_power_resources_list_free(&device->wakeup.resources);
484
482 if (!device->flags.power_manageable) 485 if (!device->flags.power_manageable)
483 return; 486 return;
484 487
@@ -902,6 +905,8 @@ acpi_bus_extract_wakeup_device_power_package(acpi_handle handle,
902 if (!wakeup) 905 if (!wakeup)
903 return AE_BAD_PARAMETER; 906 return AE_BAD_PARAMETER;
904 907
908 INIT_LIST_HEAD(&wakeup->resources);
909
905 /* _PRW */ 910 /* _PRW */
906 status = acpi_evaluate_object(handle, "_PRW", NULL, &buffer); 911 status = acpi_evaluate_object(handle, "_PRW", NULL, &buffer);
907 if (ACPI_FAILURE(status)) { 912 if (ACPI_FAILURE(status)) {
@@ -948,19 +953,17 @@ acpi_bus_extract_wakeup_device_power_package(acpi_handle handle,
948 } 953 }
949 wakeup->sleep_state = element->integer.value; 954 wakeup->sleep_state = element->integer.value;
950 955
951 if ((package->package.count - 2) > ACPI_MAX_HANDLES) { 956 for (i = 2; i < package->package.count; i++) {
952 status = AE_NO_MEMORY; 957 acpi_handle rhandle;
953 goto out; 958
954 } 959 element = &(package->package.elements[i]);
955 wakeup->resources.count = package->package.count - 2;
956 for (i = 0; i < wakeup->resources.count; i++) {
957 element = &(package->package.elements[i + 2]);
958 if (element->type != ACPI_TYPE_LOCAL_REFERENCE) { 960 if (element->type != ACPI_TYPE_LOCAL_REFERENCE) {
959 status = AE_BAD_DATA; 961 status = AE_BAD_DATA;
960 goto out; 962 goto out;
961 } 963 }
962 964 rhandle = element->reference.handle;
963 wakeup->resources.handles[i] = element->reference.handle; 965 acpi_add_power_resource(rhandle);
966 acpi_power_resources_list_add(rhandle, &wakeup->resources);
964 } 967 }
965 968
966 acpi_setup_gpe_for_wake(handle, wakeup->gpe_device, wakeup->gpe_number); 969 acpi_setup_gpe_for_wake(handle, wakeup->gpe_device, wakeup->gpe_number);
@@ -1018,6 +1021,7 @@ static void acpi_bus_get_wakeup_device_flags(struct acpi_device *device)
1018 status = acpi_bus_extract_wakeup_device_power_package(device->handle, 1021 status = acpi_bus_extract_wakeup_device_power_package(device->handle,
1019 &device->wakeup); 1022 &device->wakeup);
1020 if (ACPI_FAILURE(status)) { 1023 if (ACPI_FAILURE(status)) {
1024 acpi_power_resources_list_free(&device->wakeup.resources);
1021 ACPI_EXCEPTION((AE_INFO, status, "Extracting _PRW package")); 1025 ACPI_EXCEPTION((AE_INFO, status, "Extracting _PRW package"));
1022 return; 1026 return;
1023 } 1027 }
@@ -1491,9 +1495,11 @@ static acpi_status acpi_bus_check_add(acpi_handle handle, u32 lvl_not_used,
1491 acpi_handle temp; 1495 acpi_handle temp;
1492 1496
1493 status = acpi_get_handle(handle, "_PRW", &temp); 1497 status = acpi_get_handle(handle, "_PRW", &temp);
1494 if (ACPI_SUCCESS(status)) 1498 if (ACPI_SUCCESS(status)) {
1495 acpi_bus_extract_wakeup_device_power_package(handle, 1499 acpi_bus_extract_wakeup_device_power_package(handle,
1496 &wakeup); 1500 &wakeup);
1501 acpi_power_resources_list_free(&wakeup.resources);
1502 }
1497 return AE_CTRL_DEPTH; 1503 return AE_CTRL_DEPTH;
1498 } 1504 }
1499 1505