内核ACPI函数API之acpi_turn_off_unused_power_resources

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/tiantao2012/article/details/79969273
void acpi_turn_off_unused_power_resources(void)
用于将acpi_power_resource_list 这个list上没有用到的power resource 关闭。
其源码分析如下:
void acpi_turn_off_unused_power_resources(void)
{
	struct acpi_power_resource *resource;

	mutex_lock(&power_resource_list_lock);
	#从这里知道系统中所有power resource都会添加到acpi_power_resource_list 这个全局list中
	list_for_each_entry_reverse(resource, &acpi_power_resource_list, list_node) {
		int result, state;

		mutex_lock(&resource->resource_lock);
		#得到handle 对应的power state
		result = acpi_power_get_state(resource->device.handle, &state);
		if (result) {
			mutex_unlock(&resource->resource_lock);
			continue;
		}
		#如果这个power state 是on状态但是ref count是零,也就是状态是on但是没有人使用,则需要关闭这个resource
		if (state == ACPI_POWER_RESOURCE_STATE_ON
		    && !resource->ref_count) {
			dev_info(&resource->device.dev, "Turning OFF\n");
			__acpi_power_off(resource);
		}

		mutex_unlock(&resource->resource_lock);
	}

	mutex_unlock(&power_resource_list_lock);
}
我们看看如果关掉power resource
static int __acpi_power_off(struct acpi_power_resource *resource)
{
	acpi_status status;

	status = acpi_evaluate_object(resource->device.handle, "_OFF",
				      NULL, NULL);
	if (ACPI_FAILURE(status))
		return -ENODEV;

	ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Power resource [%s] turned off\n",
			  resource->name));
	return 0;
}
原来直接通过bios直接执行_OFF 这个object就可以了

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页