dev_name
程序员文章站
2022-06-04 19:17:25
...
一份驱动代码,可以注册多个设备。 比如一个I2S的代码,可以注册2S0 、I2S1 、I2S2 几个设备。
那么在代码中,是如何做区分的呢? 这里使用id 来做区分。
这里暂时讨论使用在mach-xxx 中进行区分的情况
比如arch/arm/mach-smdk4x12.c
struct platform_device exynos_device_i2s0 = {
.name = "samsung-i2s",
.id = 0,
.num_resources = ARRAY_SIZE(exynos_i2s0_resource),
.resource = exynos_i2s0_resource,
.dev = {
.platform_data = &i2sv5_pdata,
},
};
比如这里设置的id = 0 ,
static struct platform_device *smdk4x12_devices[] __initdata = {
...
#ifdef CONFIG_SND_SAMSUNG_I2S
&exynos_device_i2s0,
#endif
...
}
platform_add_devices(smdk4x12_devices, ARRAY_SIZE(smdk4x12_devices));
ret = platform_device_register(devs[i]);
device_initialize(&pdev->dev);
return platform_device_add(pdev);
//platform.c
if (pdev->id != -1) //如果id不为0
dev_set_name(&pdev->dev, "%s.%d", pdev->name, pdev->id);
else
dev_set_name(&pdev->dev, "%s", pdev->name);
//kobject.c
err = kobject_set_name_vargs(&dev->kobj, fmt, vargs);
kobj->name = kvasprintf(GFP_KERNEL, fmt, vargs);
通过以上代码的分析,可以知道device的dev的 name.id 。 对应到我们的例子中,最终注册的驱动的name 为 samsung-i2s.0 .
那么ASoC 的dai_link中,需要制定的cpu_dai_name的名字就是 sansung-i2s.0
在来分析一下 dev_name的源码
static inline const char *dev_name(const struct device *dev)
{
/* Use the init name until the kobject becomes available */
if (dev->init_name)
return dev->init_name;
return kobject_name(&dev->kobj);
// return kobj->name;
}
综上可知,使用dev_name来获取name的时候。 需要注意提供的platform_device的id 是多少,才能最终确定dev_name 。
上一篇: MFS(moosefs)分布式文件系统最简单的搭建
下一篇: 初识HashMap
推荐阅读