Lines Matching full:resource
14 * 2. via "Power Resource Control".
17 * An ACPI "power resource object" represents a software controllable power
18 * plane, clock plane, or other resource depended on by a device.
20 * A device may rely on multiple power resources, and a power resource
40 #define ACPI_POWER_DEVICE_NAME "Power Resource"
63 struct acpi_power_resource *resource; member
70 Power Resource Management
97 struct acpi_power_resource *resource = acpi_power_get_context(handle); in acpi_power_resources_list_add() local
100 if (!resource || !list) in acpi_power_resources_list_add()
107 entry->resource = resource; in acpi_power_resources_list_add()
112 if (e->resource->order > resource->order) { in acpi_power_resources_list_add()
169 /* Some ACPI tables contain duplicate power resource references */ in acpi_extract_power_resources()
200 acpi_handle_debug(handle, "Power resource is %s\n", in __get_state()
207 static int acpi_power_get_state(struct acpi_power_resource *resource, u8 *state) in acpi_power_get_state() argument
209 if (resource->state == ACPI_POWER_RESOURCE_STATE_UNKNOWN) { in acpi_power_get_state()
212 ret = __get_state(resource->device.handle, &resource->state); in acpi_power_get_state()
217 *state = resource->state; in acpi_power_get_state()
231 struct acpi_power_resource *resource = entry->resource; in acpi_power_get_list_state() local
234 mutex_lock(&resource->resource_lock); in acpi_power_get_list_state()
235 result = acpi_power_get_state(resource, &cur_state); in acpi_power_get_list_state()
236 mutex_unlock(&resource->resource_lock); in acpi_power_get_list_state()
244 pr_debug("Power resource list is %s\n", str_on_off(cur_state)); in acpi_power_get_list_state()
251 acpi_power_resource_add_dependent(struct acpi_power_resource *resource, in acpi_power_resource_add_dependent() argument
257 mutex_lock(&resource->resource_lock); in acpi_power_resource_add_dependent()
258 list_for_each_entry(dep, &resource->dependents, node) { in acpi_power_resource_add_dependent()
271 list_add_tail(&dep->node, &resource->dependents); in acpi_power_resource_add_dependent()
273 resource_dev_name(resource)); in acpi_power_resource_add_dependent()
276 mutex_unlock(&resource->resource_lock); in acpi_power_resource_add_dependent()
281 acpi_power_resource_remove_dependent(struct acpi_power_resource *resource, in acpi_power_resource_remove_dependent() argument
286 mutex_lock(&resource->resource_lock); in acpi_power_resource_remove_dependent()
287 list_for_each_entry(dep, &resource->dependents, node) { in acpi_power_resource_remove_dependent()
292 resource_dev_name(resource)); in acpi_power_resource_remove_dependent()
296 mutex_unlock(&resource->resource_lock); in acpi_power_resource_remove_dependent()
326 ret = acpi_power_resource_add_dependent(entry->resource, dev); in acpi_device_power_add_dependent()
335 acpi_power_resource_remove_dependent(entry->resource, dev); in acpi_device_power_add_dependent()
360 acpi_power_resource_remove_dependent(entry->resource, dev); in acpi_device_power_remove_dependent()
363 static int __acpi_power_on(struct acpi_power_resource *resource) in __acpi_power_on() argument
365 acpi_handle handle = resource->device.handle; in __acpi_power_on()
371 resource->state = ACPI_POWER_RESOURCE_STATE_UNKNOWN; in __acpi_power_on()
375 resource->state = ACPI_POWER_RESOURCE_STATE_ON; in __acpi_power_on()
377 acpi_handle_debug(handle, "Power resource turned on\n"); in __acpi_power_on()
380 * If there are other dependents on this power resource we need to in __acpi_power_on()
384 if (list_empty(&resource->dependents) || in __acpi_power_on()
385 list_is_singular(&resource->dependents)) in __acpi_power_on()
388 list_for_each_entry(dep, &resource->dependents, node) { in __acpi_power_on()
390 resource_dev_name(resource)); in __acpi_power_on()
397 static int acpi_power_on_unlocked(struct acpi_power_resource *resource) in acpi_power_on_unlocked() argument
401 if (resource->ref_count++) { in acpi_power_on_unlocked()
402 acpi_handle_debug(resource->device.handle, in acpi_power_on_unlocked()
403 "Power resource already on\n"); in acpi_power_on_unlocked()
405 result = __acpi_power_on(resource); in acpi_power_on_unlocked()
407 resource->ref_count--; in acpi_power_on_unlocked()
412 static int acpi_power_on(struct acpi_power_resource *resource) in acpi_power_on() argument
416 mutex_lock(&resource->resource_lock); in acpi_power_on()
417 result = acpi_power_on_unlocked(resource); in acpi_power_on()
418 mutex_unlock(&resource->resource_lock); in acpi_power_on()
422 static int __acpi_power_off(struct acpi_power_resource *resource) in __acpi_power_off() argument
424 acpi_handle handle = resource->device.handle; in __acpi_power_off()
429 resource->state = ACPI_POWER_RESOURCE_STATE_UNKNOWN; in __acpi_power_off()
433 resource->state = ACPI_POWER_RESOURCE_STATE_OFF; in __acpi_power_off()
435 acpi_handle_debug(handle, "Power resource turned off\n"); in __acpi_power_off()
440 static int acpi_power_off_unlocked(struct acpi_power_resource *resource) in acpi_power_off_unlocked() argument
444 if (!resource->ref_count) { in acpi_power_off_unlocked()
445 acpi_handle_debug(resource->device.handle, in acpi_power_off_unlocked()
446 "Power resource already off\n"); in acpi_power_off_unlocked()
450 if (--resource->ref_count) { in acpi_power_off_unlocked()
451 acpi_handle_debug(resource->device.handle, in acpi_power_off_unlocked()
452 "Power resource still in use\n"); in acpi_power_off_unlocked()
454 result = __acpi_power_off(resource); in acpi_power_off_unlocked()
456 resource->ref_count++; in acpi_power_off_unlocked()
461 static int acpi_power_off(struct acpi_power_resource *resource) in acpi_power_off() argument
465 mutex_lock(&resource->resource_lock); in acpi_power_off()
466 result = acpi_power_off_unlocked(resource); in acpi_power_off()
467 mutex_unlock(&resource->resource_lock); in acpi_power_off()
477 result = acpi_power_off(entry->resource); in acpi_power_off_list()
485 acpi_power_on(entry->resource); in acpi_power_off_list()
496 result = acpi_power_on(entry->resource); in acpi_power_on_list()
504 acpi_power_off(entry->resource); in acpi_power_on_list()
547 struct acpi_device *res_dev = &entry->resource->device; in acpi_power_hide_list()
571 struct acpi_device *res_dev = &entry->resource->device; in acpi_power_expose_list()
618 struct acpi_power_resource *resource = entry->resource; in acpi_power_wakeup_list_init() local
621 mutex_lock(&resource->resource_lock); in acpi_power_wakeup_list_init()
624 * Make sure that the power resource state and its reference in acpi_power_wakeup_list_init()
627 if (!resource->ref_count && in acpi_power_wakeup_list_init()
628 !acpi_power_get_state(resource, &state) && in acpi_power_wakeup_list_init()
630 __acpi_power_off(resource); in acpi_power_wakeup_list_init()
632 if (system_level > resource->system_level) in acpi_power_wakeup_list_init()
633 system_level = resource->system_level; in acpi_power_wakeup_list_init()
635 mutex_unlock(&resource->resource_lock); in acpi_power_wakeup_list_init()
789 ret = acpi_power_off(entry->resource); in acpi_disable_wakeup_device_power()
884 struct acpi_power_resource *resource; in acpi_release_power_resource() local
886 resource = container_of(device, struct acpi_power_resource, device); in acpi_release_power_resource()
889 list_del(&resource->list_node); in acpi_release_power_resource()
893 kfree(resource); in acpi_release_power_resource()
900 struct acpi_power_resource *resource; in resource_in_use_show() local
902 resource = to_power_resource(to_acpi_device(dev)); in resource_in_use_show()
903 return sprintf(buf, "%u\n", !!resource->ref_count); in resource_in_use_show()
912 static void acpi_power_add_resource_to_list(struct acpi_power_resource *resource) in acpi_power_add_resource_to_list() argument
920 if (r->order > resource->order) { in acpi_power_add_resource_to_list()
921 list_add_tail(&resource->list_node, &r->list_node); in acpi_power_add_resource_to_list()
925 list_add_tail(&resource->list_node, &acpi_power_resource_list); in acpi_power_add_resource_to_list()
934 struct acpi_power_resource *resource; in acpi_add_power_resource() local
944 resource = kzalloc(sizeof(*resource), GFP_KERNEL); in acpi_add_power_resource()
945 if (!resource) in acpi_add_power_resource()
948 device = &resource->device; in acpi_add_power_resource()
951 mutex_init(&resource->resource_lock); in acpi_add_power_resource()
952 INIT_LIST_HEAD(&resource->list_node); in acpi_add_power_resource()
953 INIT_LIST_HEAD(&resource->dependents); in acpi_add_power_resource()
959 /* Evaluate the object to get the system level and resource order. */ in acpi_add_power_resource()
964 resource->system_level = acpi_object.power_resource.system_level; in acpi_add_power_resource()
965 resource->order = acpi_object.power_resource.resource_order; in acpi_add_power_resource()
966 resource->state = ACPI_POWER_RESOURCE_STATE_UNKNOWN; in acpi_add_power_resource()
969 if (acpi_power_get_state(resource, &state_dummy)) in acpi_add_power_resource()
970 __acpi_power_on(resource); in acpi_add_power_resource()
972 acpi_handle_info(handle, "New power resource\n"); in acpi_add_power_resource()
985 acpi_power_add_resource_to_list(resource); in acpi_add_power_resource()
997 struct acpi_power_resource *resource; in acpi_resume_power_resources() local
1001 list_for_each_entry(resource, &acpi_power_resource_list, list_node) { in acpi_resume_power_resources()
1005 mutex_lock(&resource->resource_lock); in acpi_resume_power_resources()
1007 resource->state = ACPI_POWER_RESOURCE_STATE_UNKNOWN; in acpi_resume_power_resources()
1008 result = acpi_power_get_state(resource, &state); in acpi_resume_power_resources()
1010 mutex_unlock(&resource->resource_lock); in acpi_resume_power_resources()
1015 && resource->ref_count) { in acpi_resume_power_resources()
1016 acpi_handle_debug(resource->device.handle, "Turning ON\n"); in acpi_resume_power_resources()
1017 __acpi_power_on(resource); in acpi_resume_power_resources()
1020 mutex_unlock(&resource->resource_lock); in acpi_resume_power_resources()
1030 * The Toshiba Click Mini has a CPR3 power-resource which must
1047 struct acpi_power_resource *resource; in acpi_turn_off_unused_power_resources() local
1054 list_for_each_entry_reverse(resource, &acpi_power_resource_list, list_node) { in acpi_turn_off_unused_power_resources()
1055 mutex_lock(&resource->resource_lock); in acpi_turn_off_unused_power_resources()
1057 if (!resource->ref_count && in acpi_turn_off_unused_power_resources()
1058 resource->state == ACPI_POWER_RESOURCE_STATE_ON) { in acpi_turn_off_unused_power_resources()
1059 acpi_handle_debug(resource->device.handle, "Turning OFF\n"); in acpi_turn_off_unused_power_resources()
1060 __acpi_power_off(resource); in acpi_turn_off_unused_power_resources()
1063 mutex_unlock(&resource->resource_lock); in acpi_turn_off_unused_power_resources()