static int acpi_power_on(acpi_handle handle) { int result = 0; bool resume_device = false; struct acpi_power_resource *resource = NULL; struct acpi_power_resource_device *device_list; result = acpi_power_get_context(handle, &resource); if (result) return result; mutex_lock(&resource->resource_lock); if (resource->ref_count++) { ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Power resource [%s] already on", resource->name)); } else { result = __acpi_power_on(resource); if (result) resource->ref_count--; else resume_device = true; } mutex_unlock(&resource->resource_lock); if (!resume_device) return result; mutex_lock(&resource->devices_lock); device_list = resource->devices; while (device_list) { acpi_power_on_device(device_list->device); device_list = device_list->next; } mutex_unlock(&resource->devices_lock); return result; }
static int __acpi_power_on(struct acpi_power_resource *resource) { struct acpi_power_resource_device *device_list = resource->devices; acpi_status status = AE_OK; status = acpi_evaluate_object(resource->device->handle, "_ON", NULL, NULL); if (ACPI_FAILURE(status)) return -ENODEV; /* Update the power resource's _device_ power state */ resource->device->power.state = ACPI_STATE_D0; ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Power resource [%s] turned on\n", resource->name)); while (device_list) { acpi_power_on_device(device_list->device); device_list = device_list->next; } return 0; }