内核ACPI函数API之acpi_turn_off_unused_power_resources

6人阅读 评论(0) 收藏 举报
分类:
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就可以了

查看评论

内核ACPI函数API之acpi_is_root_bridge

acpi_is_root_bridge 用于判断一个形参的acpi_handle 是否是root bridge 其源码分析如下: int acpi_is_root_bridge(acpi_handle...
  • tiantao2012
  • tiantao2012
  • 2018-04-16 08:28:13
  • 11

内核ACPI函数API之acpi_pci_find_root

acpi_pci_find_root 函数根据形参的handle返回对应的pci root bridge 其源码分析如下: struct acpi_pci_root *acpi_pci_fin...
  • tiantao2012
  • tiantao2012
  • 2018-04-16 09:34:27
  • 9

内核ACPI函数API之acpi_reboot

acpi_reboot 这个函数用于写pci/io/memory的相关寄存器让其重启 其源码分析如下: void acpi_reboot(void) { struct acpi_generic_...
  • tiantao2012
  • tiantao2012
  • 2018-04-17 08:30:06
  • 7

内核ACPI函数API之acpi_create_platform_device

acpi_create_platform_device 这个函数会为没有platform_driver 自动创建platform_device设备。只有当用户只调用register_platform_...
  • tiantao2012
  • tiantao2012
  • 2018-04-08 08:45:04
  • 9

内核ACPI函数API之acpi_os_map_iomem

void __iomem *__ref acpi_os_map_iomem(acpi_physical_address phys, acpi_size size) 的作用是将形参指定的物理地址的范围映...
  • tiantao2012
  • tiantao2012
  • 2018-04-03 08:20:17
  • 10

内核ACPI函数API之acpi_os_unmap_iomem

acpi_os_unmap_iomem函数用于释放acpi_os_map_iomem 映射的虚拟地址 其源码分析如下: void __ref acpi_os_unmap_iomem(void __i...
  • tiantao2012
  • tiantao2012
  • 2018-04-03 08:21:07
  • 12

内核ACPI函数API之acpi_get_first_physical_node

acpi_get_first_physical_node 这个函数用于获取acpi_device的第一个物理节点。 其源码分析如下: struct device *acpi_get_first_phy...
  • tiantao2012
  • tiantao2012
  • 2018-04-11 08:28:21
  • 13

内核ACPI函数API之acpi_dev_get_resources

acpi_dev_get_resources 用于获取形参指定的acpi_device 所有的资源,这里的资源包括 memory/io/interrupt等 部分资源定义如下: #define IOR...
  • tiantao2012
  • tiantao2012
  • 2018-04-02 09:50:07
  • 18

内核ACPI函数API之acpi_scan_add_handler

int acpi_scan_add_handler(struct acpi_scan_handler *handler)用于将一个acpi handler添加到acpi_scan_handlers_l...
  • tiantao2012
  • tiantao2012
  • 2018-04-09 08:29:15
  • 9

内核ACPI函数API之acpi_bus_get_device

acpi_bus_get_device 这个函数可以通过acpi_handle得到一个acpi_device 其用法如下: if (acpi_bus_get_device(ACPI_HANDLE(&...
  • tiantao2012
  • tiantao2012
  • 2018-04-04 08:31:14
  • 12
    个人资料
    持之以恒
    等级:
    访问量: 37万+
    积分: 1万+
    排名: 810
    最新评论