--- drivers/acpi/power.c | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) Index: linux-2.6.25-rc8/drivers/acpi/power.c =================================================================== --- linux-2.6.25-rc8.orig/drivers/acpi/power.c +++ linux-2.6.25-rc8/drivers/acpi/power.c @@ -665,7 +665,7 @@ static int acpi_power_resume(struct acpi { int result = 0, state; struct acpi_power_resource *resource = NULL; - struct acpi_power_reference *ref; + acpi_status status = AE_UNKNOWN_STATUS; if (!device || !acpi_driver_data(device)) return -EINVAL; @@ -679,13 +679,28 @@ static int acpi_power_resume(struct acpi mutex_lock(&resource->resource_lock); if (state == ACPI_POWER_RESOURCE_STATE_OFF && !list_empty(&resource->reference)) { - ref = container_of(resource->reference.next, struct acpi_power_reference, node); - mutex_unlock(&resource->resource_lock); - result = acpi_power_on(device->handle, ref->device); - return result; + /* Try to turn the power resource on. */ + status = acpi_evaluate_object(resource->device->handle, + "_ON", NULL, NULL); + if (ACPI_FAILURE(status)) + printk(KERN_WARNING PREFIX + "Failed to turn power resource %s [%s] on\n", + acpi_device_name(device), + acpi_device_bid(device)); } - mutex_unlock(&resource->resource_lock); + if (ACPI_SUCCESS(status)) { + result = acpi_power_get_state(resource, &state); + if (!result && state == ACPI_POWER_RESOURCE_STATE_ON) { + /* Update the power resource's _device_ power state */ + resource->device->power.state = ACPI_STATE_D0; + + ACPI_DEBUG_PRINT((ACPI_DB_INFO, + "Resource [%s] turned on\n", + resource->name)); + } + } + return 0; }