我正在分析设备驱动程序,例如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内核版本。最新版本的 struct pca953x_platform_data 定义只剩下两个字段(主要是由于上一个 Linux 内核版本期间删除了旧的不受支持的代码。
现在,如果你跑步
git grep -n -w 'struct pca953x_platform_data'
在 Linux 内核源代码的 Git 存储库中,您将看到使用此数据类型的仅有的三块板仍在内核中。 EP93xx 将转换为设备树模型(有补丁系列)。其余的可以轻松转换为使用软件节点方法。
也就是说,你的问题很容易得到解答。在第一种情况下,数据是静态定义的,因此不需要执行或需要内存分配。它只是传递给 I²C 框架负责处理的
struct i2c_board_info
。