Lines Matching +full:turned +full:- +full:off
1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * drivers/acpi/power.c - ACPI Power Resources management.
5 * Copyright (C) 2001 - 2015 Intel Corp.
12 * ACPI power-managed devices may be controlled in two ways:
13 * 1. via "Device Specific (D-State) Control"
73 /* --------------------------------------------------------------------------
75 -------------------------------------------------------------------------- */
79 return dev_name(&pr->device.dev); in resource_dev_name()
105 return -EINVAL; in acpi_power_resources_list_add()
109 return -ENOMEM; in acpi_power_resources_list_add()
111 entry->resource = resource; in acpi_power_resources_list_add()
116 if (e->resource->order > resource->order) { in acpi_power_resources_list_add()
117 list_add_tail(&entry->node, &e->node); in acpi_power_resources_list_add()
121 list_add_tail(&entry->node, list); in acpi_power_resources_list_add()
130 list_del(&entry->node); in acpi_power_resources_list_free()
142 rhandle = package->package.elements[i].reference.handle; in acpi_power_resource_is_dup()
144 dup = package->package.elements[j].reference.handle; in acpi_power_resource_is_dup()
158 for (i = start; i < package->package.count; i++) { in acpi_extract_power_resources()
159 union acpi_object *element = &package->package.elements[i]; in acpi_extract_power_resources()
163 if (element->type != ACPI_TYPE_LOCAL_REFERENCE) { in acpi_extract_power_resources()
164 err = -ENODATA; in acpi_extract_power_resources()
167 rhandle = element->reference.handle; in acpi_extract_power_resources()
169 err = -ENODEV; in acpi_extract_power_resources()
179 err = -ENODEV; in acpi_extract_power_resources()
200 return -ENODEV; in __get_state()
213 if (resource->state == ACPI_POWER_RESOURCE_STATE_UNKNOWN) { in acpi_power_get_state()
216 ret = __get_state(resource->device.handle, &resource->state); in acpi_power_get_state()
221 *state = resource->state; in acpi_power_get_state()
231 return -EINVAL; in acpi_power_get_list_state()
235 struct acpi_power_resource *resource = entry->resource; in acpi_power_get_list_state()
238 mutex_lock(&resource->resource_lock); in acpi_power_get_list_state()
240 mutex_unlock(&resource->resource_lock); in acpi_power_get_list_state()
261 mutex_lock(&resource->resource_lock); in acpi_power_resource_add_dependent()
262 list_for_each_entry(dep, &resource->dependents, node) { in acpi_power_resource_add_dependent()
264 if (dep->dev == dev) in acpi_power_resource_add_dependent()
270 ret = -ENOMEM; in acpi_power_resource_add_dependent()
274 dep->dev = dev; in acpi_power_resource_add_dependent()
275 list_add_tail(&dep->node, &resource->dependents); in acpi_power_resource_add_dependent()
280 mutex_unlock(&resource->resource_lock); in acpi_power_resource_add_dependent()
290 mutex_lock(&resource->resource_lock); in acpi_power_resource_remove_dependent()
291 list_for_each_entry(dep, &resource->dependents, node) { in acpi_power_resource_remove_dependent()
292 if (dep->dev == dev) { in acpi_power_resource_remove_dependent()
293 list_del(&dep->node); in acpi_power_resource_remove_dependent()
300 mutex_unlock(&resource->resource_lock); in acpi_power_resource_remove_dependent()
304 * acpi_device_power_add_dependent - Add dependent device of this ACPI device
308 * If @adev has non-empty _PR0 the @dev is added as dependent device to all
310 * resources are turned _ON the dependent devices get runtime resumed. This
311 * is needed for devices such as PCI to allow its driver to re-initialize
325 if (!adev->flags.power_manageable) in acpi_device_power_add_dependent()
328 resources = &adev->power.states[ACPI_STATE_D0].resources; in acpi_device_power_add_dependent()
330 ret = acpi_power_resource_add_dependent(entry->resource, dev); in acpi_device_power_add_dependent()
339 acpi_power_resource_remove_dependent(entry->resource, dev); in acpi_device_power_add_dependent()
345 * acpi_device_power_remove_dependent - Remove dependent device
359 if (!adev->flags.power_manageable) in acpi_device_power_remove_dependent()
362 resources = &adev->power.states[ACPI_STATE_D0].resources; in acpi_device_power_remove_dependent()
364 acpi_power_resource_remove_dependent(entry->resource, dev); in acpi_device_power_remove_dependent()
369 acpi_handle handle = resource->device.handle; in __acpi_power_on()
375 resource->state = ACPI_POWER_RESOURCE_STATE_UNKNOWN; in __acpi_power_on()
376 return -ENODEV; in __acpi_power_on()
379 resource->state = ACPI_POWER_RESOURCE_STATE_ON; in __acpi_power_on()
381 acpi_handle_debug(handle, "Power resource turned on\n"); in __acpi_power_on()
385 * resume them now so that their drivers can re-initialize the in __acpi_power_on()
388 if (list_empty(&resource->dependents) || in __acpi_power_on()
389 list_is_singular(&resource->dependents)) in __acpi_power_on()
392 list_for_each_entry(dep, &resource->dependents, node) { in __acpi_power_on()
393 dev_dbg(dep->dev, "runtime resuming because [%s] turned on\n", in __acpi_power_on()
395 pm_request_resume(dep->dev); in __acpi_power_on()
405 if (resource->ref_count++) { in acpi_power_on_unlocked()
406 acpi_handle_debug(resource->device.handle, in acpi_power_on_unlocked()
411 resource->ref_count--; in acpi_power_on_unlocked()
420 mutex_lock(&resource->resource_lock); in acpi_power_on()
422 mutex_unlock(&resource->resource_lock); in acpi_power_on()
428 acpi_handle handle = resource->device.handle; in __acpi_power_off()
433 resource->state = ACPI_POWER_RESOURCE_STATE_UNKNOWN; in __acpi_power_off()
434 return -ENODEV; in __acpi_power_off()
437 resource->state = ACPI_POWER_RESOURCE_STATE_OFF; in __acpi_power_off()
439 acpi_handle_debug(handle, "Power resource turned off\n"); in __acpi_power_off()
448 if (!resource->ref_count) { in acpi_power_off_unlocked()
449 acpi_handle_debug(resource->device.handle, in acpi_power_off_unlocked()
450 "Power resource already off\n"); in acpi_power_off_unlocked()
454 if (--resource->ref_count) { in acpi_power_off_unlocked()
455 acpi_handle_debug(resource->device.handle, in acpi_power_off_unlocked()
460 resource->ref_count++; in acpi_power_off_unlocked()
469 mutex_lock(&resource->resource_lock); in acpi_power_off()
471 mutex_unlock(&resource->resource_lock); in acpi_power_off()
481 result = acpi_power_off(entry->resource); in acpi_power_off_list()
489 acpi_power_on(entry->resource); in acpi_power_off_list()
500 result = acpi_power_on(entry->resource); in acpi_power_on_list()
508 acpi_power_off(entry->resource); in acpi_power_on_list()
551 struct acpi_device *res_dev = &entry->resource->device; in acpi_power_hide_list()
553 sysfs_remove_link_from_group(&adev->dev.kobj, in acpi_power_hide_list()
554 attr_group->name, in acpi_power_hide_list()
555 dev_name(&res_dev->dev)); in acpi_power_hide_list()
557 sysfs_remove_group(&adev->dev.kobj, attr_group); in acpi_power_hide_list()
570 ret = sysfs_create_group(&adev->dev.kobj, attr_group); in acpi_power_expose_list()
575 struct acpi_device *res_dev = &entry->resource->device; in acpi_power_expose_list()
577 ret = sysfs_add_link_to_group(&adev->dev.kobj, in acpi_power_expose_list()
578 attr_group->name, in acpi_power_expose_list()
579 &res_dev->dev.kobj, in acpi_power_expose_list()
580 dev_name(&res_dev->dev)); in acpi_power_expose_list()
603 if (adev->wakeup.flags.valid) in acpi_power_add_remove_device()
604 acpi_power_expose_hide(adev, &adev->wakeup.resources, in acpi_power_add_remove_device()
607 if (!adev->power.flags.power_resources) in acpi_power_add_remove_device()
612 &adev->power.states[state].resources, in acpi_power_add_remove_device()
622 struct acpi_power_resource *resource = entry->resource; in acpi_power_wakeup_list_init()
625 mutex_lock(&resource->resource_lock); in acpi_power_wakeup_list_init()
631 if (!resource->ref_count && in acpi_power_wakeup_list_init()
636 if (system_level > resource->system_level) in acpi_power_wakeup_list_init()
637 system_level = resource->system_level; in acpi_power_wakeup_list_init()
639 mutex_unlock(&resource->resource_lock); in acpi_power_wakeup_list_init()
645 /* --------------------------------------------------------------------------
647 -------------------------------------------------------------------------- */
650 * acpi_device_sleep_wake - execute _DSW (Device Sleep Wake) or (deprecated in
653 * @enable: 0 - disable, 1 - enable the wake capabilities of the device.
664 * -ENODEV if the execution of either _DSW or _PSW has failed
690 status = acpi_evaluate_object(dev->handle, "_DSW", &arg_list, NULL); in acpi_device_sleep_wake()
694 acpi_handle_info(dev->handle, "_DSW execution failed\n"); in acpi_device_sleep_wake()
695 dev->wakeup.flags.valid = 0; in acpi_device_sleep_wake()
696 return -ENODEV; in acpi_device_sleep_wake()
700 status = acpi_execute_simple_method(dev->handle, "_PSW", enable); in acpi_device_sleep_wake()
702 acpi_handle_info(dev->handle, "_PSW execution failed\n"); in acpi_device_sleep_wake()
703 dev->wakeup.flags.valid = 0; in acpi_device_sleep_wake()
704 return -ENODEV; in acpi_device_sleep_wake()
720 if (!dev || !dev->wakeup.flags.valid) in acpi_enable_wakeup_device_power()
721 return -EINVAL; in acpi_enable_wakeup_device_power()
725 dev_dbg(&dev->dev, "Enabling wakeup power (count %d)\n", in acpi_enable_wakeup_device_power()
726 dev->wakeup.prepare_count); in acpi_enable_wakeup_device_power()
728 if (dev->wakeup.prepare_count++) in acpi_enable_wakeup_device_power()
731 err = acpi_power_on_list(&dev->wakeup.resources); in acpi_enable_wakeup_device_power()
733 dev_err(&dev->dev, "Cannot turn on wakeup power resources\n"); in acpi_enable_wakeup_device_power()
734 dev->wakeup.flags.valid = 0; in acpi_enable_wakeup_device_power()
744 acpi_power_off_list(&dev->wakeup.resources); in acpi_enable_wakeup_device_power()
745 dev->wakeup.prepare_count = 0; in acpi_enable_wakeup_device_power()
749 dev_dbg(&dev->dev, "Wakeup power enabled\n"); in acpi_enable_wakeup_device_power()
767 if (!dev || !dev->wakeup.flags.valid) in acpi_disable_wakeup_device_power()
768 return -EINVAL; in acpi_disable_wakeup_device_power()
772 dev_dbg(&dev->dev, "Disabling wakeup power (count %d)\n", in acpi_disable_wakeup_device_power()
773 dev->wakeup.prepare_count); in acpi_disable_wakeup_device_power()
776 if (dev->wakeup.prepare_count <= 0) in acpi_disable_wakeup_device_power()
779 if (--dev->wakeup.prepare_count > 0) in acpi_disable_wakeup_device_power()
787 * All of the power resources in the list need to be turned off even if in acpi_disable_wakeup_device_power()
790 list_for_each_entry(entry, &dev->wakeup.resources, node) { in acpi_disable_wakeup_device_power()
793 ret = acpi_power_off(entry->resource); in acpi_disable_wakeup_device_power()
798 dev_err(&dev->dev, "Cannot turn off wakeup power resources\n"); in acpi_disable_wakeup_device_power()
799 dev->wakeup.flags.valid = 0; in acpi_disable_wakeup_device_power()
803 dev_dbg(&dev->dev, "Wakeup power disabled\n"); in acpi_disable_wakeup_device_power()
817 return -EINVAL; in acpi_power_get_inferred_state()
821 * required for a given D-state are 'on'. in acpi_power_get_inferred_state()
824 struct list_head *list = &device->power.states[i].resources; in acpi_power_get_inferred_state()
839 *state = device->power.states[ACPI_STATE_D3_COLD].flags.valid ? in acpi_power_get_inferred_state()
847 return -EINVAL; in acpi_power_on_resources()
849 return acpi_power_on_list(&device->power.states[state].resources); in acpi_power_on_resources()
857 return -EINVAL; in acpi_power_transition()
859 if (device->power.state == state || !device->flags.power_manageable) in acpi_power_transition()
862 if ((device->power.state < ACPI_STATE_D0) in acpi_power_transition()
863 || (device->power.state > ACPI_STATE_D3_COLD)) in acpi_power_transition()
864 return -ENODEV; in acpi_power_transition()
873 &device->power.states[state].resources); in acpi_power_transition()
875 if (!result && device->power.state < ACPI_STATE_D3_COLD) in acpi_power_transition()
877 &device->power.states[device->power.state].resources); in acpi_power_transition()
880 device->power.state = result ? ACPI_STATE_UNKNOWN : state; in acpi_power_transition()
893 list_del(&resource->list_node); in acpi_release_power_resource()
896 acpi_free_pnp_ids(&device->pnp); in acpi_release_power_resource()
907 return sprintf(buf, "%u\n", !!resource->ref_count); in resource_in_use_show()
913 device_remove_file(&device->dev, &dev_attr_resource_in_use); in acpi_power_sysfs_remove()
924 if (r->order > resource->order) { in acpi_power_add_resource_to_list()
925 list_add_tail(&resource->list_node, &r->list_node); in acpi_power_add_resource_to_list()
929 list_add_tail(&resource->list_node, &acpi_power_resource_list); in acpi_power_add_resource_to_list()
952 device = &resource->device; in acpi_add_power_resource()
955 mutex_init(&resource->resource_lock); in acpi_add_power_resource()
956 INIT_LIST_HEAD(&resource->list_node); in acpi_add_power_resource()
957 INIT_LIST_HEAD(&resource->dependents); in acpi_add_power_resource()
960 device->power.state = ACPI_STATE_UNKNOWN; in acpi_add_power_resource()
961 device->flags.match_driver = true; in acpi_add_power_resource()
968 resource->system_level = acpi_object.power_resource.system_level; in acpi_add_power_resource()
969 resource->order = acpi_object.power_resource.resource_order; in acpi_add_power_resource()
970 resource->state = ACPI_POWER_RESOURCE_STATE_UNKNOWN; in acpi_add_power_resource()
986 if (!device_create_file(&device->dev, &dev_attr_resource_in_use)) in acpi_add_power_resource()
987 device->remove = acpi_power_sysfs_remove; in acpi_add_power_resource()
994 acpi_release_power_resource(&device->dev); in acpi_add_power_resource()
1013 acpi_handle_notice(resource->device.handle, in acpi_resume_on_eb_gp12pxp()
1014 "HP EB quirk - turning OFF then ON\n"); in acpi_resume_on_eb_gp12pxp()
1041 mutex_lock(&resource->resource_lock); in acpi_resume_power_resources()
1043 resource->state = ACPI_POWER_RESOURCE_STATE_UNKNOWN; in acpi_resume_power_resources()
1046 mutex_unlock(&resource->resource_lock); in acpi_resume_power_resources()
1051 && resource->ref_count) { in acpi_resume_power_resources()
1053 resource_is_gp12pxp(resource->device.handle)) { in acpi_resume_power_resources()
1056 acpi_handle_debug(resource->device.handle, in acpi_resume_power_resources()
1062 mutex_unlock(&resource->resource_lock); in acpi_resume_power_resources()
1077 * actual modem power gets turned off during suspend by "GP12.PTS" method
1081 * doesn't contain any code to actually turn off power).
1107 * The Toshiba Click Mini has a CPR3 power-resource which must
1109 * _PR? lists. The other 2 affected power-resources are no-ops.
1113 DMI_MATCH(DMI_PRODUCT_NAME, "SATELLITE Click Mini L9W-B"),
1120 * acpi_turn_off_unused_power_resources - Turn off power resources not in use.
1132 mutex_lock(&resource->resource_lock); in acpi_turn_off_unused_power_resources()
1134 if (!resource->ref_count && in acpi_turn_off_unused_power_resources()
1135 resource->state == ACPI_POWER_RESOURCE_STATE_ON) { in acpi_turn_off_unused_power_resources()
1136 acpi_handle_debug(resource->device.handle, "Turning OFF\n"); in acpi_turn_off_unused_power_resources()
1140 mutex_unlock(&resource->resource_lock); in acpi_turn_off_unused_power_resources()