acpi_dev_get_resources 用于获取形参指定的acpi_device 所有的资源,这里的资源包括
memory/io/interrupt等
部分资源定义如下:
#define IORESOURCE_IO 0x00000100 /* PCI/ISA I/O ports */
#define IORESOURCE_MEM 0x00000200
#define IORESOURCE_REG 0x00000300 /* Register offsets */
#define IORESOURCE_IRQ 0x00000400
#define IORESOURCE_DMA 0x00000800
#define IORESOURCE_BUS 0x00001000
其使用的例程如下:
#获取adev这个设备的资源
ret = acpi_dev_get_resources(adev, &resource_list, NULL, NULL);
if (ret < 0)
goto err_free;
list_for_each_entry(rentry, &resource_list, node) {
#按照资源的不同来赋值
switch (resource_type(rentry->res)) {
case IORESOURCE_MEM:
if (!address_found) {
dev->res = *rentry->res;
address_found = true;
}
break;
case IORESOURCE_IRQ:
if (irq_no < AMBA_NR_IRQS)
dev->irq[irq_no++] = rentry->res->start;
break;
default:
dev_warn(&adev->dev, "Invalid resource\n");
break;
}
}
#使用完成后释放resource_list 本身占用的资源
acpi_dev_free_resource_list(&resource_list);
其源码分析如下:
int acpi_dev_get_resources(struct acpi_device *adev, struct list_head *list,
int (*preproc)(struct acpi_resource *, void *),
void *preproc_data)
{
#原来设备的资源都是在acpi _CRS 表示的#define METHOD_NAME__CRS "_CRS"
return __acpi_dev_get_resources(adev, list, preproc, preproc_data,
METHOD_NAME__CRS);
}
static int __acpi_dev_get_resources(struct acpi_device *adev,
struct list_head *list,
int (*preproc)(struct acpi_resource *, void *),
void *preproc_data, char *method)
{
struct res_proc_context c;
acpi_status status;
if (!adev || !adev->handle || !list_empty(list))
return -EINVAL;
#检查这个设备是否包含_CRS 这个函数
if (!acpi_has_method(adev->handle, method))
return 0;
#资源要保存的list
c.list = list;
c.preproc = preproc;
c.preproc_data = preproc_data;
c.count = 0;
c.error = 0;
#遍历这个device 所用的_CRS字段通过acpi_dev_process_resource #将资源保存在res_proc_context 中
status = acpi_walk_resources(adev->handle, method,
acpi_dev_process_resource, &c);
#判断是否执行成功,返回0 表示成功,返回1表示失败
if (ACPI_FAILURE(status)) {
acpi_dev_free_resource_list(list);
return c.error ? c.error : -EIO;
}
#返回得到的资源的数目
return c.count;
}
内核ACPI函数API之acpi_dev_get_resources
最新推荐文章于 2021-05-06 10:37:42 发布