分析两个小知识点看看platform_set_drvdata 和 platform_get_drvdata函数是如何保存和获取参数的
直接上代码。
static struct platform_device *s900_link_snd_device;static struct snd_soc_card snd_soc_s900_atc2603c_link = {
.name = "s900_link",
.owner = THIS_MODULE,
.dai_link = s900_atc2603c_link_dai,
.num_links = ARRAY_SIZE(s900_atc2603c_link_dai),
.controls = owl_outpa_controls,
.num_controls = ARRAY_SIZE(owl_outpa_controls),
};platform_set_drvdata(s900_link_snd_device,&snd_soc_s900_atc2603c_link);static inline void platform_set_drvdata(struct platform_device *pdev,
void *data)
{
dev_set_drvdata(&pdev->dev, data);//dev_set_drvdata(&s900_link_snd_device->dev, snd_soc_s900_atc2609a_link);
}int dev_set_drvdata(struct device *dev, void *data)
{
int error;
if (!dev->p) {
error = device_private_init(dev);
if (error)
return error;
}
dev->p->driver_data = data;//即为s900_link_snd_device->dev->p->driver_datat = snd_soc_s900_atc2609a_link ;
return 0;
}
EXPORT_SYMBOL(dev_set_drvdata);跟踪一下参数传递流程可以看出,platform_set_drvdata函数,最终是将data参数赋值给了platform_device->dev->p->driver_data;
接着我们来看一下platform_get_drvdata函数是如何获取到这个data。
struct snd_soc_card *card = platform_get_drvdata(pdev);//即platform_get_drvdata(s900_link_snd_device);static inline void *platform_get_drvdata(const struct platform_device *pdev)
{
return dev_get_drvdata(&pdev->dev); //dev_get_drvdata(&s900_link_snd_device->dev)
}void *dev_get_drvdata(const struct device *dev)
{
if (dev && dev->p)
return dev->p->driver_data; //return s900_link_snd_device->dev->p->driver_data;
return NULL;
}
EXPORT_SYMBOL(dev_get_drvdata);至此就清楚了platform_set_drvdata 和 platform_get_drvdata函数是如何保存和获取参数的。
本文详细解析了platform_set_drvdata与platform_get_drvdata函数的工作原理。通过代码示例展示了如何利用这两个函数来保存和获取参数,具体说明了数据如何被设置到platform_device结构体中并从中读取。
3843

被折叠的 条评论
为什么被折叠?



