|
|
@@ -131,6 +131,23 @@ void acpi_power_resources_list_free(struct list_head *list)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+static bool acpi_power_resource_is_dup(union acpi_object *package,
|
|
|
+ unsigned int start, unsigned int i)
|
|
|
+{
|
|
|
+ acpi_handle rhandle, dup;
|
|
|
+ unsigned int j;
|
|
|
+
|
|
|
+ /* The caller is expected to check the package element types */
|
|
|
+ rhandle = package->package.elements[i].reference.handle;
|
|
|
+ for (j = start; j < i; j++) {
|
|
|
+ dup = package->package.elements[j].reference.handle;
|
|
|
+ if (dup == rhandle)
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ return false;
|
|
|
+}
|
|
|
+
|
|
|
int acpi_extract_power_resources(union acpi_object *package, unsigned int start,
|
|
|
struct list_head *list)
|
|
|
{
|
|
|
@@ -150,6 +167,11 @@ int acpi_extract_power_resources(union acpi_object *package, unsigned int start,
|
|
|
err = -ENODEV;
|
|
|
break;
|
|
|
}
|
|
|
+
|
|
|
+ /* Some ACPI tables contain duplicate power resource references */
|
|
|
+ if (acpi_power_resource_is_dup(package, start, i))
|
|
|
+ continue;
|
|
|
+
|
|
|
err = acpi_add_power_resource(rhandle);
|
|
|
if (err)
|
|
|
break;
|