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;
}
Пример #2
0
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;
}