Lines Matching +full:entry +full:- +full:method

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()
102 struct acpi_power_resource_entry *entry; in acpi_power_resources_list_add() local
105 return -EINVAL; in acpi_power_resources_list_add()
107 entry = kzalloc(sizeof(*entry), GFP_KERNEL); in acpi_power_resources_list_add()
108 if (!entry) 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()
127 struct acpi_power_resource_entry *entry, *e; in acpi_power_resources_list_free() local
129 list_for_each_entry_safe(entry, e, list, node) { in acpi_power_resources_list_free()
130 list_del(&entry->node); in acpi_power_resources_list_free()
131 kfree(entry); 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()
227 struct acpi_power_resource_entry *entry; in acpi_power_get_list_state() local
231 return -EINVAL; in acpi_power_get_list_state()
234 list_for_each_entry(entry, list, node) { 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
311 * is needed for devices such as PCI to allow its driver to re-initialize
321 struct acpi_power_resource_entry *entry; in acpi_device_power_add_dependent() local
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()
329 list_for_each_entry(entry, resources, node) { in acpi_device_power_add_dependent()
330 ret = acpi_power_resource_add_dependent(entry->resource, dev); in acpi_device_power_add_dependent()
338 list_for_each_entry(entry, resources, node) 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
356 struct acpi_power_resource_entry *entry; in acpi_device_power_remove_dependent() local
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()
363 list_for_each_entry_reverse(entry, resources, node) 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()
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()
448 if (!resource->ref_count) { in acpi_power_off_unlocked()
449 acpi_handle_debug(resource->device.handle, 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()
477 struct acpi_power_resource_entry *entry; in acpi_power_off_list() local
480 list_for_each_entry_reverse(entry, list, node) { in acpi_power_off_list()
481 result = acpi_power_off(entry->resource); in acpi_power_off_list()
488 list_for_each_entry_continue(entry, list, node) in acpi_power_off_list()
489 acpi_power_on(entry->resource); in acpi_power_off_list()
496 struct acpi_power_resource_entry *entry; in acpi_power_on_list() local
499 list_for_each_entry(entry, list, node) { in acpi_power_on_list()
500 result = acpi_power_on(entry->resource); in acpi_power_on_list()
507 list_for_each_entry_continue_reverse(entry, list, node) in acpi_power_on_list()
508 acpi_power_off(entry->resource); in acpi_power_on_list()
545 struct acpi_power_resource_entry *entry; in acpi_power_hide_list() local
550 list_for_each_entry_reverse(entry, resources, node) { in acpi_power_hide_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()
564 struct acpi_power_resource_entry *entry; in acpi_power_expose_list() local
570 ret = sysfs_create_group(&adev->dev.kobj, attr_group); in acpi_power_expose_list()
574 list_for_each_entry(entry, resources, node) { 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()
618 struct acpi_power_resource_entry *entry; in acpi_power_wakeup_list_init() local
621 list_for_each_entry(entry, list, node) { in acpi_power_wakeup_list_init()
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()
757 * Shutdown a wakeup device, counterpart of above method
764 struct acpi_power_resource_entry *entry; in acpi_disable_wakeup_device_power() local
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()
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()
1020 * Use the same delay as DSDT uses in modem _RST method. 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()
1076 * This flag only gets set from this power resource "_OFF" method, while the
1077 * actual modem power gets turned off during suspend by "GP12.PTS" method
1078 * called from the global "_PTS" (Prepare To Sleep) method.
1079 * On the other hand, this power resource "_OFF" method implementation just
1084 * power resource back ON since its "_STA" method returns 0 (while the resource
1085 * is still considered in use) its "_ON" method won't do anything since
1092 * "_OFF" method before calling the "_ON" method to make sure the "ONEN"
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()