Lines Matching full:resource
27 * 2. via "Power Resource Control".
30 * An ACPI "power resource object" represents a software controllable power
31 * plane, clock plane, or other resource depended on by a device.
33 * A device may rely on multiple power resources, and a power resource
51 #define ACPI_POWER_DEVICE_NAME "Power Resource"
71 struct acpi_power_resource *resource; member
78 Power Resource Management
100 struct acpi_power_resource *resource = acpi_power_get_context(handle); in acpi_power_resources_list_add() local
103 if (!resource || !list) in acpi_power_resources_list_add()
110 entry->resource = resource; in acpi_power_resources_list_add()
115 if (e->resource->order > resource->order) { in acpi_power_resources_list_add()
171 /* Some ACPI tables contain duplicate power resource references */ in acpi_extract_power_resources()
209 ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Resource [%s] is %s\n", in acpi_power_get_state()
227 struct acpi_power_resource *resource = entry->resource; in acpi_power_get_list_state() local
228 acpi_handle handle = resource->device.handle; in acpi_power_get_list_state()
231 mutex_lock(&resource->resource_lock); in acpi_power_get_list_state()
233 mutex_unlock(&resource->resource_lock); in acpi_power_get_list_state()
241 ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Resource list is %s\n", in acpi_power_get_list_state()
248 static int __acpi_power_on(struct acpi_power_resource *resource) in __acpi_power_on() argument
252 status = acpi_evaluate_object(resource->device.handle, "_ON", NULL, NULL); in __acpi_power_on()
256 ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Power resource [%s] turned on\n", in __acpi_power_on()
257 resource->name)); in __acpi_power_on()
262 static int acpi_power_on_unlocked(struct acpi_power_resource *resource) in acpi_power_on_unlocked() argument
266 if (resource->ref_count++) { in acpi_power_on_unlocked()
268 "Power resource [%s] already on\n", in acpi_power_on_unlocked()
269 resource->name)); in acpi_power_on_unlocked()
271 result = __acpi_power_on(resource); in acpi_power_on_unlocked()
273 resource->ref_count--; in acpi_power_on_unlocked()
278 static int acpi_power_on(struct acpi_power_resource *resource) in acpi_power_on() argument
282 mutex_lock(&resource->resource_lock); in acpi_power_on()
283 result = acpi_power_on_unlocked(resource); in acpi_power_on()
284 mutex_unlock(&resource->resource_lock); in acpi_power_on()
288 static int __acpi_power_off(struct acpi_power_resource *resource) in __acpi_power_off() argument
292 status = acpi_evaluate_object(resource->device.handle, "_OFF", in __acpi_power_off()
297 ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Power resource [%s] turned off\n", in __acpi_power_off()
298 resource->name)); in __acpi_power_off()
302 static int acpi_power_off_unlocked(struct acpi_power_resource *resource) in acpi_power_off_unlocked() argument
306 if (!resource->ref_count) { in acpi_power_off_unlocked()
308 "Power resource [%s] already off\n", in acpi_power_off_unlocked()
309 resource->name)); in acpi_power_off_unlocked()
313 if (--resource->ref_count) { in acpi_power_off_unlocked()
315 "Power resource [%s] still in use\n", in acpi_power_off_unlocked()
316 resource->name)); in acpi_power_off_unlocked()
318 result = __acpi_power_off(resource); in acpi_power_off_unlocked()
320 resource->ref_count++; in acpi_power_off_unlocked()
325 static int acpi_power_off(struct acpi_power_resource *resource) in acpi_power_off() argument
329 mutex_lock(&resource->resource_lock); in acpi_power_off()
330 result = acpi_power_off_unlocked(resource); in acpi_power_off()
331 mutex_unlock(&resource->resource_lock); in acpi_power_off()
341 result = acpi_power_off(entry->resource); in acpi_power_off_list()
349 acpi_power_on(entry->resource); in acpi_power_off_list()
360 result = acpi_power_on(entry->resource); in acpi_power_on_list()
368 acpi_power_off(entry->resource); in acpi_power_on_list()
411 struct acpi_device *res_dev = &entry->resource->device; in acpi_power_hide_list()
435 struct acpi_device *res_dev = &entry->resource->device; in acpi_power_expose_list()
482 struct acpi_power_resource *resource = entry->resource; in acpi_power_wakeup_list_init() local
483 acpi_handle handle = resource->device.handle; in acpi_power_wakeup_list_init()
487 mutex_lock(&resource->resource_lock); in acpi_power_wakeup_list_init()
491 mutex_unlock(&resource->resource_lock); in acpi_power_wakeup_list_init()
495 resource->ref_count++; in acpi_power_wakeup_list_init()
496 resource->wakeup_enabled = true; in acpi_power_wakeup_list_init()
498 if (system_level > resource->system_level) in acpi_power_wakeup_list_init()
499 system_level = resource->system_level; in acpi_power_wakeup_list_init()
501 mutex_unlock(&resource->resource_lock); in acpi_power_wakeup_list_init()
592 struct acpi_power_resource *resource = entry->resource; in acpi_enable_wakeup_device_power() local
594 mutex_lock(&resource->resource_lock); in acpi_enable_wakeup_device_power()
596 if (!resource->wakeup_enabled) { in acpi_enable_wakeup_device_power()
597 err = acpi_power_on_unlocked(resource); in acpi_enable_wakeup_device_power()
599 resource->wakeup_enabled = true; in acpi_enable_wakeup_device_power()
602 mutex_unlock(&resource->resource_lock); in acpi_enable_wakeup_device_power()
655 struct acpi_power_resource *resource = entry->resource; in acpi_disable_wakeup_device_power() local
657 mutex_lock(&resource->resource_lock); in acpi_disable_wakeup_device_power()
659 if (resource->wakeup_enabled) { in acpi_disable_wakeup_device_power()
660 err = acpi_power_off_unlocked(resource); in acpi_disable_wakeup_device_power()
662 resource->wakeup_enabled = false; in acpi_disable_wakeup_device_power()
665 mutex_unlock(&resource->resource_lock); in acpi_disable_wakeup_device_power()
758 struct acpi_power_resource *resource; in acpi_release_power_resource() local
760 resource = container_of(device, struct acpi_power_resource, device); in acpi_release_power_resource()
763 list_del(&resource->list_node); in acpi_release_power_resource()
767 kfree(resource); in acpi_release_power_resource()
773 struct acpi_power_resource *resource; in acpi_power_in_use_show() local
775 resource = to_power_resource(to_acpi_device(dev)); in acpi_power_in_use_show()
776 return sprintf(buf, "%u\n", !!resource->ref_count); in acpi_power_in_use_show()
785 static void acpi_power_add_resource_to_list(struct acpi_power_resource *resource) in acpi_power_add_resource_to_list() argument
793 if (r->order > resource->order) { in acpi_power_add_resource_to_list()
794 list_add_tail(&resource->list_node, &r->list_node); in acpi_power_add_resource_to_list()
798 list_add_tail(&resource->list_node, &acpi_power_resource_list); in acpi_power_add_resource_to_list()
806 struct acpi_power_resource *resource; in acpi_add_power_resource() local
817 resource = kzalloc(sizeof(*resource), GFP_KERNEL); in acpi_add_power_resource()
818 if (!resource) in acpi_add_power_resource()
821 device = &resource->device; in acpi_add_power_resource()
824 mutex_init(&resource->resource_lock); in acpi_add_power_resource()
825 INIT_LIST_HEAD(&resource->list_node); in acpi_add_power_resource()
826 resource->name = device->pnp.bus_id; in acpi_add_power_resource()
831 /* Evalute the object to get the system level and resource order. */ in acpi_add_power_resource()
836 resource->system_level = acpi_object.power_resource.system_level; in acpi_add_power_resource()
837 resource->order = acpi_object.power_resource.resource_order; in acpi_add_power_resource()
854 acpi_power_add_resource_to_list(resource); in acpi_add_power_resource()
866 struct acpi_power_resource *resource; in acpi_resume_power_resources() local
870 list_for_each_entry(resource, &acpi_power_resource_list, list_node) { in acpi_resume_power_resources()
873 mutex_lock(&resource->resource_lock); in acpi_resume_power_resources()
875 result = acpi_power_get_state(resource->device.handle, &state); in acpi_resume_power_resources()
877 mutex_unlock(&resource->resource_lock); in acpi_resume_power_resources()
882 && resource->ref_count) { in acpi_resume_power_resources()
883 dev_info(&resource->device.dev, "Turning ON\n"); in acpi_resume_power_resources()
884 __acpi_power_on(resource); in acpi_resume_power_resources()
887 mutex_unlock(&resource->resource_lock); in acpi_resume_power_resources()
895 struct acpi_power_resource *resource; in acpi_turn_off_unused_power_resources() local
899 list_for_each_entry_reverse(resource, &acpi_power_resource_list, list_node) { in acpi_turn_off_unused_power_resources()
902 mutex_lock(&resource->resource_lock); in acpi_turn_off_unused_power_resources()
904 result = acpi_power_get_state(resource->device.handle, &state); in acpi_turn_off_unused_power_resources()
906 mutex_unlock(&resource->resource_lock); in acpi_turn_off_unused_power_resources()
911 && !resource->ref_count) { in acpi_turn_off_unused_power_resources()
912 dev_info(&resource->device.dev, "Turning OFF\n"); in acpi_turn_off_unused_power_resources()
913 __acpi_power_off(resource); in acpi_turn_off_unused_power_resources()
916 mutex_unlock(&resource->resource_lock); in acpi_turn_off_unused_power_resources()