acpi_match_device 和 acpi_dev_found

通过acpi_match_device 可以找到当前当前的driver是匹配acpi_match_table中的哪一个id,例如下面的例子    

    id = acpi_match_device(p->dev->driver->acpi_match_table,
                       p->dev);
        if (id && !strcmp(id->id, "APMC0D08")) {
            p->iotype = UPIO_MEM32;
            p->regshift = 2;
            p->serial_in = dw8250_serial_in32;
            data->uart_16550_compatible = true;
        }
这段code还有一种写法,如果我知道当前要找到的是APMC0D08的话,同样可以通过下面的方式
        if (acpi_dev_found(hns_enet_acpi_match[0].id))
            priv->enet_ver = AE_VERSION_1;


const struct acpi_device_id *acpi_match_device(const struct acpi_device_id *ids,
                           const struct device *dev)
{
    return __acpi_match_device(acpi_companion_match(dev), ids, NULL);
}

可以看出acpi_match_device 主要是查特定struct device *dev的acpi id
bool acpi_dev_found(const char *hid)
{
    struct acpi_device_bus_id *acpi_device_bus_id;
    bool found = false;

    mutex_lock(&acpi_device_lock);
    list_for_each_entry(acpi_device_bus_id, &acpi_bus_id_list, node)
        if (!strcmp(acpi_device_bus_id->bus_id, hid)) {
            found = true;
            break;
        }
    mutex_unlock(&acpi_device_lock);

    return found;
}
而acpi_dev_found 则是遍历整个acpi_bus_id_list,这里可以知道系统中所有已经匹配的acpi id 都存在acpi_bus_id_list

在acpi scan的时候会通过acpi_device_add中的下面代码来加到acpi_bus_id_list
    if (!found) {
        acpi_device_bus_id = new_bus_id;
        strcpy(acpi_device_bus_id->bus_id, acpi_device_hid(device));
        acpi_device_bus_id->instance_no = 0;
        list_add_tail(&acpi_device_bus_id->node, &acpi_bus_id_list);
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值