acpi_apd.c 的作用是create I2C device.

acpi_apd.c 用于创建I2C device
static const struct acpi_device_id acpi_apd_device_ids[] = {
    /* Generic apd devices */
#ifdef CONFIG_ARM64
    { "APMC0D0F", APD_ADDR(xgene_i2c_desc) },
    { "BRCM900D", APD_ADDR(vulcan_spi_desc) },
    { "CAV900D",  APD_ADDR(vulcan_spi_desc) },
    { "HISI0A21", APD_ADDR(hip07_i2c_desc) },
    { "HISI0A22", APD_ADDR(hip08_i2c_desc) },
#endif
    { }
};

static struct acpi_scan_handler apd_handler = {
    .ids = acpi_apd_device_ids,
    .attach = acpi_apd_create_device,
};

void __init acpi_apd_init(void)
{
    acpi_scan_add_handler(&apd_handler);
}
如果bios传递过来的apci的dsdt子表中有acpi_apd_device_ids 中定义的id,就会调用apd_handler.attach 函数,这里就是对应的acpi_apd_create_device
以HISI0A21为例
static int acpi_apd_create_device(struct acpi_device *adev,
                   const struct acpi_device_id *id)
{
    //从id中拿到apd_device_desc,这里HISI0A21的desc不为null
    const struct apd_device_desc *dev_desc = (void *)id->driver_data;
    struct apd_private_data *pdata;
    struct platform_device *pdev;
    int ret;

    if (!dev_desc) {
        pdev = acpi_create_platform_device(adev, NULL);
        return IS_ERR_OR_NULL(pdev) ? PTR_ERR(pdev) : 1;
    }

    pdata = kzalloc(sizeof(*pdata), GFP_KERNEL);
    if (!pdata)
        return -ENOMEM;

    pdata->adev = adev;
    pdata->dev_desc = dev_desc;
//调用dev_desc->setup,本例对应的就是acpi_apd_setup
    if (dev_desc->setup) {
        ret = dev_desc->setup(pdata);
        if (ret)
            goto err_out;
    }

    adev->driver_data = pdata;
//新建I2C device
    pdev = acpi_create_platform_device(adev, dev_desc->properties);
    if (!IS_ERR_OR_NULL(pdev))
        return 1;

    ret = PTR_ERR(pdev);
    adev->driver_data = NULL;

 err_out:
    kfree(pdata);
    return ret;
}
static const struct apd_device_desc hip07_i2c_desc = {
    .setup = acpi_apd_setup,
    .fixed_clk_rate = 200000000,
};

来看看的desc的setup函数
static int acpi_apd_setup(struct apd_private_data *pdata)
{
    const struct apd_device_desc *dev_desc = pdata->dev_desc;
    struct clk *clk = ERR_PTR(-ENODEV);
//这里的fixed_clk_rate等于200000000。因此if条件成立
    if (dev_desc->fixed_clk_rate) {
首先注册一个clk,
        clk = clk_register_fixed_rate(&pdata->adev->dev,
                    dev_name(&pdata->adev->dev),
                    NULL, 0, dev_desc->fixed_clk_rate);
用clk注册一个clkdev
        clk_register_clkdev(clk, NULL, dev_name(&pdata->adev->dev));
保存这个clk,后续就额可以通过pdata->clk得到clk,再通过clk找到clkdev
        pdata->clk = clk;
    }

    return 0;
}

例如我们可以通过u32rate=clk_get_rate(pdata->clk)拿到这个clock的rate。本例中就是200000000

unsigned long clk_get_rate(struct clk *clk)
{
    if (!clk)
        return 0;

    return clk_core_get_rate(clk->core);
}


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: acpi_6_0_errata_a.pdf是一个关于ACPI(高级配置与电源管理接口)6.0规范勘误的PDF文件。ACPI是一种由Intel、微软和Toshiba等公司共同开发的电源管理标准,用于操作系统与硬件设备之间的通信和协调。 这个PDF文件提供了有关ACPI 6.0的规范勘误信息。规范勘误是指对原始规范的修正或修改,以解决其中的错误、疏漏或不完善之处。 在acpi_6_0_errata_a.pdf文件中,会列出通过规范勘误进行的更正,例如修复关于ACPI命名空间、状态机、电源管理等方面的错误或不准确的信息。这些更正旨在提高ACPI规范的准确性和一致性,以确保操作系统与硬件设备之间的正常通信和协调。 这份PDF文件对于开发ACPI 6.0兼容的操作系统、驱动程序和硬件设备的开发者来说,具有重要的参考价值。通过查阅这份文件,开发者可以了解并避免已知的ACPI 6.0规范问题,并确保他们的设备或软件与ACPI 6.0规范保持一致。 总之,acpi_6_0_errata_a.pdf是一份提供有关ACPI 6.0规范勘误信息的PDF文件,对于开发者来说,它是一个重要的参考资源,用于确保ACPI兼容设备和操作系统之间的正常通信和协调。 ### 回答2: acpi_6_0_errata_a.pdf 是一个ACPI(高级配置和电源接口)规范的错误补充文档。 ACPI是一种由电脑操作系统使用的标准接口,用于管理硬件设备的电源管理和配置。ACPI规范定义了一组用于操作系统与计算机硬件进行通信的标准方法和数据结构。 acpi_6_0_errata_a.pdf是对ACPI规范6.0版本中发现的错误的修正文档。这些错误可能包括规范中的技术或概念错误、代码示例错误、规范解释的不准确之处等等。ACPI规范的错误修正文档旨在帮助开发人员和硬件制造商更好地理解和遵循ACPI规范,以确保操作系统与硬件之间的兼容性和良好的性能。 acpi_6_0_errata_a.pdf 文件可能包含了对规范的补充说明、更正的代码示例、修复的错误描述等内容。这些修正可以更准确地描述ACPI规范中的特定功能或行为,并提供了解决特定问题的指导。 开发人员和硬件制造商可以通过阅读acpi_6_0_errata_a.pdf文件来了解ACPI规范的修正和更新。这将有助于他们更好地设计和实施ACPI功能,并确保其与操作系统和其他硬件设备的兼容性。 总之,acpi_6_0_errata_a.pdf 是一份ACPI规范6.0版本的错误修正文档,旨在帮助开发人员和硬件制造商更好地理解和遵循ACPI规范,以提高电脑系统的性能和兼容性。 ### 回答3: "acpi_6_0_errata_a.pdf"是一份关于ACPI(高级配置和电源接口)规范的修正文档。ACPI是一种标准化的电源管理技术,它允许操作系统和硬件设备之间的有效交流和协作,以实现电源管理和设备控制。 该修正文档"acpi_6_0_errata_a.pdf"旨在解决ACPI 6.0规范中可能存在的问题和错误。ACPI 6.0是ACPI规范的最新版本,它引入了一些新特性和改进,可以提高系统的功耗管理、设备配置和控制能力。 在修正文档中,可能会包含关于ACPI 6.0规范中已知问题的详细描述和相应的解决方法。这些问题可能涉及与操作系统兼容性、电源管理策略、设备驱动程序等方面有关。修正文档的目的是帮助操作系统开发人员、设备制造商和其他相关技术人员理解和解决这些问题。 对于使用ACPI技术的操作系统开发人员和硬件制造商来说,及时了解和遵循修正文档中的修正建议非常重要。这可以确保系统在ACPI规范的框架下正常运行,并正确地实现电源管理和设备控制功能。 总的来说,"acpi_6_0_errata_a.pdf"是一份关于ACPI 6.0规范修正的文档,供操作系统开发人员和硬件制造商参考,以确保ACPI技术在系统中得到正确的实现和运行。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值