diff options
-rw-r--r-- | drivers/acpi/internal.h | 7 | ||||
-rw-r--r-- | drivers/acpi/power.c | 44 | ||||
-rw-r--r-- | drivers/acpi/scan.c | 57 |
3 files changed, 53 insertions, 55 deletions
diff --git a/drivers/acpi/internal.h b/drivers/acpi/internal.h index c35435e3d760..8a6c67c9da42 100644 --- a/drivers/acpi/internal.h +++ b/drivers/acpi/internal.h | |||
@@ -51,10 +51,9 @@ void acpi_free_ids(struct acpi_device *device); | |||
51 | -------------------------------------------------------------------------- */ | 51 | -------------------------------------------------------------------------- */ |
52 | int acpi_power_init(void); | 52 | int acpi_power_init(void); |
53 | void acpi_power_resources_list_free(struct list_head *list); | 53 | void acpi_power_resources_list_free(struct list_head *list); |
54 | acpi_status acpi_extract_power_resources(union acpi_object *package, | 54 | int acpi_extract_power_resources(union acpi_object *package, unsigned int start, |
55 | unsigned int start, | 55 | struct list_head *list); |
56 | struct list_head *list); | 56 | int acpi_add_power_resource(acpi_handle handle); |
57 | void acpi_add_power_resource(acpi_handle handle); | ||
58 | void acpi_power_add_remove_device(struct acpi_device *adev, bool add); | 57 | void acpi_power_add_remove_device(struct acpi_device *adev, bool add); |
59 | int acpi_device_sleep_wake(struct acpi_device *dev, | 58 | int acpi_device_sleep_wake(struct acpi_device *dev, |
60 | int enable, int sleep_state, int dev_state); | 59 | int enable, int sleep_state, int dev_state); |
diff --git a/drivers/acpi/power.c b/drivers/acpi/power.c index 4b93c97aff9f..1600f753fafe 100644 --- a/drivers/acpi/power.c +++ b/drivers/acpi/power.c | |||
@@ -97,18 +97,18 @@ static struct acpi_power_resource *acpi_power_get_context(acpi_handle handle) | |||
97 | return container_of(device, struct acpi_power_resource, device); | 97 | return container_of(device, struct acpi_power_resource, device); |
98 | } | 98 | } |
99 | 99 | ||
100 | static void acpi_power_resources_list_add(acpi_handle handle, | 100 | static int acpi_power_resources_list_add(acpi_handle handle, |
101 | struct list_head *list) | 101 | struct list_head *list) |
102 | { | 102 | { |
103 | struct acpi_power_resource *resource = acpi_power_get_context(handle); | 103 | struct acpi_power_resource *resource = acpi_power_get_context(handle); |
104 | struct acpi_power_resource_entry *entry; | 104 | struct acpi_power_resource_entry *entry; |
105 | 105 | ||
106 | if (!resource || !list) | 106 | if (!resource || !list) |
107 | return; | 107 | return -EINVAL; |
108 | 108 | ||
109 | entry = kzalloc(sizeof(*entry), GFP_KERNEL); | 109 | entry = kzalloc(sizeof(*entry), GFP_KERNEL); |
110 | if (!entry) | 110 | if (!entry) |
111 | return; | 111 | return -ENOMEM; |
112 | 112 | ||
113 | entry->resource = resource; | 113 | entry->resource = resource; |
114 | if (!list_empty(list)) { | 114 | if (!list_empty(list)) { |
@@ -117,10 +117,11 @@ static void acpi_power_resources_list_add(acpi_handle handle, | |||
117 | list_for_each_entry(e, list, node) | 117 | list_for_each_entry(e, list, node) |
118 | if (e->resource->order > resource->order) { | 118 | if (e->resource->order > resource->order) { |
119 | list_add_tail(&entry->node, &e->node); | 119 | list_add_tail(&entry->node, &e->node); |
120 | return; | 120 | return 0; |
121 | } | 121 | } |
122 | } | 122 | } |
123 | list_add_tail(&entry->node, list); | 123 | list_add_tail(&entry->node, list); |
124 | return 0; | ||
124 | } | 125 | } |
125 | 126 | ||
126 | void acpi_power_resources_list_free(struct list_head *list) | 127 | void acpi_power_resources_list_free(struct list_head *list) |
@@ -133,33 +134,37 @@ void acpi_power_resources_list_free(struct list_head *list) | |||
133 | } | 134 | } |
134 | } | 135 | } |
135 | 136 | ||
136 | acpi_status acpi_extract_power_resources(union acpi_object *package, | 137 | int acpi_extract_power_resources(union acpi_object *package, unsigned int start, |
137 | unsigned int start, | 138 | struct list_head *list) |
138 | struct list_head *list) | ||
139 | { | 139 | { |
140 | acpi_status status = AE_OK; | ||
141 | unsigned int i; | 140 | unsigned int i; |
141 | int err = 0; | ||
142 | 142 | ||
143 | for (i = start; i < package->package.count; i++) { | 143 | for (i = start; i < package->package.count; i++) { |
144 | union acpi_object *element = &package->package.elements[i]; | 144 | union acpi_object *element = &package->package.elements[i]; |
145 | acpi_handle rhandle; | 145 | acpi_handle rhandle; |
146 | 146 | ||
147 | if (element->type != ACPI_TYPE_LOCAL_REFERENCE) { | 147 | if (element->type != ACPI_TYPE_LOCAL_REFERENCE) { |
148 | status = AE_BAD_DATA; | 148 | err = -ENODATA; |
149 | break; | 149 | break; |
150 | } | 150 | } |
151 | rhandle = element->reference.handle; | 151 | rhandle = element->reference.handle; |
152 | if (!rhandle) { | 152 | if (!rhandle) { |
153 | status = AE_NULL_ENTRY; | 153 | err = -ENODEV; |
154 | break; | 154 | break; |
155 | } | 155 | } |
156 | acpi_add_power_resource(rhandle); | 156 | err = acpi_add_power_resource(rhandle); |
157 | acpi_power_resources_list_add(rhandle, list); | 157 | if (err) |
158 | break; | ||
159 | |||
160 | err = acpi_power_resources_list_add(rhandle, list); | ||
161 | if (err) | ||
162 | break; | ||
158 | } | 163 | } |
159 | if (ACPI_FAILURE(status)) | 164 | if (err) |
160 | acpi_power_resources_list_free(list); | 165 | acpi_power_resources_list_free(list); |
161 | 166 | ||
162 | return status; | 167 | return err; |
163 | } | 168 | } |
164 | 169 | ||
165 | static int acpi_power_get_state(acpi_handle handle, int *state) | 170 | static int acpi_power_get_state(acpi_handle handle, int *state) |
@@ -662,7 +667,7 @@ static void acpi_release_power_resource(struct device *dev) | |||
662 | kfree(resource); | 667 | kfree(resource); |
663 | } | 668 | } |
664 | 669 | ||
665 | void acpi_add_power_resource(acpi_handle handle) | 670 | int acpi_add_power_resource(acpi_handle handle) |
666 | { | 671 | { |
667 | struct acpi_power_resource *resource; | 672 | struct acpi_power_resource *resource; |
668 | struct acpi_device *device = NULL; | 673 | struct acpi_device *device = NULL; |
@@ -673,11 +678,11 @@ void acpi_add_power_resource(acpi_handle handle) | |||
673 | 678 | ||
674 | acpi_bus_get_device(handle, &device); | 679 | acpi_bus_get_device(handle, &device); |
675 | if (device) | 680 | if (device) |
676 | return; | 681 | return 0; |
677 | 682 | ||
678 | resource = kzalloc(sizeof(*resource), GFP_KERNEL); | 683 | resource = kzalloc(sizeof(*resource), GFP_KERNEL); |
679 | if (!resource) | 684 | if (!resource) |
680 | return; | 685 | return -ENOMEM; |
681 | 686 | ||
682 | device = &resource->device; | 687 | device = &resource->device; |
683 | acpi_init_device_object(device, handle, ACPI_BUS_TYPE_POWER, | 688 | acpi_init_device_object(device, handle, ACPI_BUS_TYPE_POWER, |
@@ -712,10 +717,11 @@ void acpi_add_power_resource(acpi_handle handle) | |||
712 | mutex_lock(&power_resource_list_lock); | 717 | mutex_lock(&power_resource_list_lock); |
713 | list_add(&resource->list_node, &acpi_power_resource_list); | 718 | list_add(&resource->list_node, &acpi_power_resource_list); |
714 | mutex_unlock(&power_resource_list_lock); | 719 | mutex_unlock(&power_resource_list_lock); |
715 | return; | 720 | return 0; |
716 | 721 | ||
717 | err: | 722 | err: |
718 | acpi_release_power_resource(&device->dev); | 723 | acpi_release_power_resource(&device->dev); |
724 | return result; | ||
719 | } | 725 | } |
720 | 726 | ||
721 | #ifdef CONFIG_ACPI_SLEEP | 727 | #ifdef CONFIG_ACPI_SLEEP |
diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c index d80df969f64a..0b6a6b4febd6 100644 --- a/drivers/acpi/scan.c +++ b/drivers/acpi/scan.c | |||
@@ -892,17 +892,17 @@ void acpi_bus_data_handler(acpi_handle handle, void *context) | |||
892 | return; | 892 | return; |
893 | } | 893 | } |
894 | 894 | ||
895 | static acpi_status | 895 | static int acpi_bus_extract_wakeup_device_power_package(acpi_handle handle, |
896 | acpi_bus_extract_wakeup_device_power_package(acpi_handle handle, | 896 | struct acpi_device_wakeup *wakeup) |
897 | struct acpi_device_wakeup *wakeup) | ||
898 | { | 897 | { |
899 | struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL }; | 898 | struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL }; |
900 | union acpi_object *package = NULL; | 899 | union acpi_object *package = NULL; |
901 | union acpi_object *element = NULL; | 900 | union acpi_object *element = NULL; |
902 | acpi_status status; | 901 | acpi_status status; |
902 | int err = -ENODATA; | ||
903 | 903 | ||
904 | if (!wakeup) | 904 | if (!wakeup) |
905 | return AE_BAD_PARAMETER; | 905 | return -EINVAL; |
906 | 906 | ||
907 | INIT_LIST_HEAD(&wakeup->resources); | 907 | INIT_LIST_HEAD(&wakeup->resources); |
908 | 908 | ||
@@ -910,29 +910,25 @@ acpi_bus_extract_wakeup_device_power_package(acpi_handle handle, | |||
910 | status = acpi_evaluate_object(handle, "_PRW", NULL, &buffer); | 910 | status = acpi_evaluate_object(handle, "_PRW", NULL, &buffer); |
911 | if (ACPI_FAILURE(status)) { | 911 | if (ACPI_FAILURE(status)) { |
912 | ACPI_EXCEPTION((AE_INFO, status, "Evaluating _PRW")); | 912 | ACPI_EXCEPTION((AE_INFO, status, "Evaluating _PRW")); |
913 | return status; | 913 | return err; |
914 | } | 914 | } |
915 | 915 | ||
916 | package = (union acpi_object *)buffer.pointer; | 916 | package = (union acpi_object *)buffer.pointer; |
917 | 917 | ||
918 | if (!package || (package->package.count < 2)) { | 918 | if (!package || package->package.count < 2) |
919 | status = AE_BAD_DATA; | ||
920 | goto out; | 919 | goto out; |
921 | } | ||
922 | 920 | ||
923 | element = &(package->package.elements[0]); | 921 | element = &(package->package.elements[0]); |
924 | if (!element) { | 922 | if (!element) |
925 | status = AE_BAD_DATA; | ||
926 | goto out; | 923 | goto out; |
927 | } | 924 | |
928 | if (element->type == ACPI_TYPE_PACKAGE) { | 925 | if (element->type == ACPI_TYPE_PACKAGE) { |
929 | if ((element->package.count < 2) || | 926 | if ((element->package.count < 2) || |
930 | (element->package.elements[0].type != | 927 | (element->package.elements[0].type != |
931 | ACPI_TYPE_LOCAL_REFERENCE) | 928 | ACPI_TYPE_LOCAL_REFERENCE) |
932 | || (element->package.elements[1].type != ACPI_TYPE_INTEGER)) { | 929 | || (element->package.elements[1].type != ACPI_TYPE_INTEGER)) |
933 | status = AE_BAD_DATA; | ||
934 | goto out; | 930 | goto out; |
935 | } | 931 | |
936 | wakeup->gpe_device = | 932 | wakeup->gpe_device = |
937 | element->package.elements[0].reference.handle; | 933 | element->package.elements[0].reference.handle; |
938 | wakeup->gpe_number = | 934 | wakeup->gpe_number = |
@@ -941,27 +937,24 @@ acpi_bus_extract_wakeup_device_power_package(acpi_handle handle, | |||
941 | wakeup->gpe_device = NULL; | 937 | wakeup->gpe_device = NULL; |
942 | wakeup->gpe_number = element->integer.value; | 938 | wakeup->gpe_number = element->integer.value; |
943 | } else { | 939 | } else { |
944 | status = AE_BAD_DATA; | ||
945 | goto out; | 940 | goto out; |
946 | } | 941 | } |
947 | 942 | ||
948 | element = &(package->package.elements[1]); | 943 | element = &(package->package.elements[1]); |
949 | if (element->type != ACPI_TYPE_INTEGER) { | 944 | if (element->type != ACPI_TYPE_INTEGER) |
950 | status = AE_BAD_DATA; | ||
951 | goto out; | 945 | goto out; |
952 | } | 946 | |
953 | wakeup->sleep_state = element->integer.value; | 947 | wakeup->sleep_state = element->integer.value; |
954 | 948 | ||
955 | status = acpi_extract_power_resources(package, 2, &wakeup->resources); | 949 | err = acpi_extract_power_resources(package, 2, &wakeup->resources); |
956 | if (ACPI_FAILURE(status)) | 950 | if (err) |
957 | goto out; | 951 | goto out; |
958 | 952 | ||
959 | acpi_setup_gpe_for_wake(handle, wakeup->gpe_device, wakeup->gpe_number); | 953 | acpi_setup_gpe_for_wake(handle, wakeup->gpe_device, wakeup->gpe_number); |
960 | 954 | ||
961 | out: | 955 | out: |
962 | kfree(buffer.pointer); | 956 | kfree(buffer.pointer); |
963 | 957 | return err; | |
964 | return status; | ||
965 | } | 958 | } |
966 | 959 | ||
967 | static void acpi_bus_set_run_wake_flags(struct acpi_device *device) | 960 | static void acpi_bus_set_run_wake_flags(struct acpi_device *device) |
@@ -1001,17 +994,17 @@ static void acpi_bus_get_wakeup_device_flags(struct acpi_device *device) | |||
1001 | { | 994 | { |
1002 | acpi_handle temp; | 995 | acpi_handle temp; |
1003 | acpi_status status = 0; | 996 | acpi_status status = 0; |
1004 | int psw_error; | 997 | int err; |
1005 | 998 | ||
1006 | /* Presence of _PRW indicates wake capable */ | 999 | /* Presence of _PRW indicates wake capable */ |
1007 | status = acpi_get_handle(device->handle, "_PRW", &temp); | 1000 | status = acpi_get_handle(device->handle, "_PRW", &temp); |
1008 | if (ACPI_FAILURE(status)) | 1001 | if (ACPI_FAILURE(status)) |
1009 | return; | 1002 | return; |
1010 | 1003 | ||
1011 | status = acpi_bus_extract_wakeup_device_power_package(device->handle, | 1004 | err = acpi_bus_extract_wakeup_device_power_package(device->handle, |
1012 | &device->wakeup); | 1005 | &device->wakeup); |
1013 | if (ACPI_FAILURE(status)) { | 1006 | if (err) { |
1014 | ACPI_EXCEPTION((AE_INFO, status, "Extracting _PRW package")); | 1007 | dev_err(&device->dev, "_PRW evaluation error: %d\n", err); |
1015 | return; | 1008 | return; |
1016 | } | 1009 | } |
1017 | 1010 | ||
@@ -1024,8 +1017,8 @@ static void acpi_bus_get_wakeup_device_flags(struct acpi_device *device) | |||
1024 | * So it is necessary to call _DSW object first. Only when it is not | 1017 | * So it is necessary to call _DSW object first. Only when it is not |
1025 | * present will the _PSW object used. | 1018 | * present will the _PSW object used. |
1026 | */ | 1019 | */ |
1027 | psw_error = acpi_device_sleep_wake(device, 0, 0, 0); | 1020 | err = acpi_device_sleep_wake(device, 0, 0, 0); |
1028 | if (psw_error) | 1021 | if (err) |
1029 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, | 1022 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, |
1030 | "error in _DSW or _PSW evaluation\n")); | 1023 | "error in _DSW or _PSW evaluation\n")); |
1031 | } | 1024 | } |
@@ -1048,9 +1041,9 @@ static void acpi_bus_init_power_state(struct acpi_device *device, int state) | |||
1048 | if (buffer.length && package | 1041 | if (buffer.length && package |
1049 | && package->type == ACPI_TYPE_PACKAGE | 1042 | && package->type == ACPI_TYPE_PACKAGE |
1050 | && package->package.count) { | 1043 | && package->package.count) { |
1051 | status = acpi_extract_power_resources(package, 0, | 1044 | int err = acpi_extract_power_resources(package, 0, |
1052 | &ps->resources); | 1045 | &ps->resources); |
1053 | if (ACPI_SUCCESS(status)) | 1046 | if (!err) |
1054 | device->power.flags.power_resources = 1; | 1047 | device->power.flags.power_resources = 1; |
1055 | } | 1048 | } |
1056 | ACPI_FREE(buffer.pointer); | 1049 | ACPI_FREE(buffer.pointer); |