i2c 时钟频率值如何从 BIOS 传递到驱动程序?

How is i2c clock frequency value passed from BIOS to driver?

我的 i2c clock-frequency 值来自 BIOS。

我提取了DSDTi2c clock-frequency字段如下:

         Device (I2C1)
        {
            Name (_ADR, 0x00160001)  // _ADR: Address
            Name (_DDN, "Intel(R) I2C Controller #1")  // _DDN: DOS Device Name
            Name (_UID, 0x02)  // _UID: Unique ID
            Name (LINK, "\_SB.PCI0.I2C1")
            Name (RBUF, ResourceTemplate ()
            {
            })
            Name (_DSD, Package (0x02)
            {
                Buffer (0x10)
                {
                    /* 0000 */   0x14, 0xD8, 0xFF, 0xDA, 0xBA, 0x6E, 0x8C, 0x4D,
                    /* 0008 */   0x8A, 0x91, 0xBC, 0x9B, 0xBF, 0x4A, 0xA3, 0x01
                }, 

                Package (0x01)
                {
                    Package (0x02)
                    {
                        "clock-frequency", 
                        IC1S
                    }
                }
            })

但是没有提到不同模式(如 400k、1M 等)的 i2c 时钟频率值。这些值在哪里定义?它是如何从 BIOS 传递给驱动程序的?

这些i2c-clock-frequency值已经在BIOS source code中定义(显然)。因为我们有 BIOS 到 select 或者 Standard Mode (100k), Fast Mode (400k), Fast Plus (1M) & High Speed (3.4M) 中的选项,所以这些值应该在 BIOS 源代码的某处匹配。内核API

`device_property_read_u32(&pdev->dev, "clock-frequency", &dev->clk_freq);` 

匹配 ACPI 中的 "clock-frequency" propname 字段并从 ACPI object.

中获取 i2c-clock-frequency