platform_set_drvdata 和 platform_get_drvdata函数分析

本文详细解析了platform_set_drvdata与platform_get_drvdata函数的工作原理。通过代码示例展示了如何利用这两个函数来保存和获取参数,具体说明了数据如何被设置到platform_device结构体中并从中读取。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

分析两个小知识点看看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函数是如何保存和获取参数的。






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值