Linux内核模块dev_get_drvdata函数始终返回NULL问题咨询
问题根因
hwmon读取回调的入参struct device *dev是hwmon子系统新创建的hwmon类设备实例,不是你绑定了私有数据的platform设备实例。不同设备实例的私有数据是独立存储的,你从未给hwmon设备设置过drvdata,所以dev_get_drvdata返回NULL。
你调用devm_hwmon_device_register_with_info时第三个参数传了NULL,这个参数就是用来给hwmon设备绑定私有数据的,是核心错误点。
修复方案
任选以下任意一种方案即可:
- 修改probe中hwmon注册逻辑,把私有数据传入第三个参数,回调中直接取即可:
// 替换原来的hwmon注册代码 devm_hwmon_device_register_with_info(&platform_dev->dev, "qnap_ec", platform_drv_data, &qnap_ec_hwmon_chip_info, NULL); - 不修改注册逻辑,在回调中通过hwmon设备的父指针拿到原始platform设备,再取私有数据:
// 替换原来的drvdata获取代码 platform_drv_data = dev_get_drvdata(dev->parent);
常见诱因
- 不了解Linux设备模型的分层关系,混淆了hwmon设备和原始platform设备的实例边界
- 不熟悉
devm_hwmon_device_register_with_info的参数定义,忽略了私有数据传递入口 - 误认为子设备会自动继承父设备的私有数据,没有主动做数据绑定操作
内容的提问来源于stack exchange,提问作者Harry Muscle
相关产品推荐
相关产品推荐

