diff options
Diffstat (limited to 'drivers/acpi/power.c')
-rw-r--r-- | drivers/acpi/power.c | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/drivers/acpi/power.c b/drivers/acpi/power.c index 1b475bc1ae16..665e93ca0b40 100644 --- a/drivers/acpi/power.c +++ b/drivers/acpi/power.c | |||
@@ -131,6 +131,23 @@ void acpi_power_resources_list_free(struct list_head *list) | |||
131 | } | 131 | } |
132 | } | 132 | } |
133 | 133 | ||
134 | static bool acpi_power_resource_is_dup(union acpi_object *package, | ||
135 | unsigned int start, unsigned int i) | ||
136 | { | ||
137 | acpi_handle rhandle, dup; | ||
138 | unsigned int j; | ||
139 | |||
140 | /* The caller is expected to check the package element types */ | ||
141 | rhandle = package->package.elements[i].reference.handle; | ||
142 | for (j = start; j < i; j++) { | ||
143 | dup = package->package.elements[j].reference.handle; | ||
144 | if (dup == rhandle) | ||
145 | return true; | ||
146 | } | ||
147 | |||
148 | return false; | ||
149 | } | ||
150 | |||
134 | int acpi_extract_power_resources(union acpi_object *package, unsigned int start, | 151 | int acpi_extract_power_resources(union acpi_object *package, unsigned int start, |
135 | struct list_head *list) | 152 | struct list_head *list) |
136 | { | 153 | { |
@@ -150,6 +167,11 @@ int acpi_extract_power_resources(union acpi_object *package, unsigned int start, | |||
150 | err = -ENODEV; | 167 | err = -ENODEV; |
151 | break; | 168 | break; |
152 | } | 169 | } |
170 | |||
171 | /* Some ACPI tables contain duplicate power resource references */ | ||
172 | if (acpi_power_resource_is_dup(package, start, i)) | ||
173 | continue; | ||
174 | |||
153 | err = acpi_add_power_resource(rhandle); | 175 | err = acpi_add_power_resource(rhandle); |
154 | if (err) | 176 | if (err) |
155 | break; | 177 | break; |