Linux内核现在如何在platform_data中放入什么?

问题描述 投票:0回答:1

我正在分析设备驱动程序,例如TI TCA6408设备,驱动程序是gpio-pca953x。

->probe()
函数中有一个从设备获取平台数据的部分:

static int pca953x_probe(struct i2c_client *const struct i2c_device_id *i2c_id)
{
    [...]
    int irq_base = 0;
    struct pca953x_platform_data *pdata;
    pdata = dev_get_platdata(&client->dev);

    irq_base = pdata->irq_base;
    [...]
}

结构如下:

struct pca953x_platform_data {
    /* number of the first GPIO */
    unsigned    gpio_base;

    /* initial polarity inversion setting */
    u32     invert;

    /* interrupt base */
    int     irq_base;

    void        *context;   /* param to setup/teardown */

    int     (*setup)(struct i2c_client *client,
                unsigned gpio, unsigned ngpio,
                void *context);
    int     (*teardown)(struct i2c_client *client,
                unsigned gpio, unsigned ngpio,
                void *context);
    const char  *const *names;
};

我的问题是 - 因为我没有看到任何对

pca953x_platform_data
字段的赋值,这个 irq_base 字段(来自
pca953x_platform_data
)到底是如何获取它的值的?我完全困惑了......

调用:

dev_get_platdata()
仅返回存储在
dev->platform_data
中的内容。

示例设备树是:

#include <dt-bindings/gpio/gpio.h>
#include <dt-bindings/interrupt-controller/irq.h>

i2c0 {
    #address-cells = <1>;
    #size-cells = <0>;

    gpio@20 {
        compatible = "nxp,pca9505";
        reg = <0x20>;
        pinctrl-names = "default";
        pinctrl-0 = <&pinctrl_pca9505>;
        gpio-controller;
        #gpio-cells = <2>;
        interrupt-parent = <&gpio3>;
        interrupts = <23 IRQ_TYPE_LEVEL_LOW>;

        usb3-sata-sel-hog {
            gpio-hog;
            gpios = <4 GPIO_ACTIVE_HIGH>;
            output-low;
            line-name = "usb3_sata_sel";
        };
    };
};

我可以想象,在代码的某些部分,有人为

pca953x_platform_data
结构分配内存,然后为每个字段分配值,但是此驱动程序中不会发生类似的情况。

linux-kernel linux-device-driver device-tree
1个回答
0
投票

首先,您忘记提及您所询问的Linux内核版本。最新版本的 struct pca953x_platform_data 定义只剩下两个字段(主要是由于上一个 Linux 内核版本期间删除了旧的不受支持的代码。

现在,如果你跑步

git grep -n -w 'struct pca953x_platform_data'
在 Linux 内核源代码的 Git 存储库中,您将看到使用此数据类型的

仅有的三块板仍在内核中。 EP93xx 将转换为设备树模型(有补丁系列)。其余的可以轻松转换为使用软件节点方法。

也就是说,你的问题很容易得到解答。

    对于上述板子,它来自各自所谓的
  • board 文件(参见 2)。
  • 对于其余部分,它
  • 可以通过 ACPI 或设备树来实现,但实际上驱动程序对它进行硬编码
在第一种情况下,数据是静态定义的,因此不需要执行或需要内存分配。它只是传递给 I²C 框架负责处理的

struct i2c_board_info

© www.soinside.com 2019 - 2024. All rights reserved.