Linux 5.10+内核中无引脚DTS节点的定义方法
解决Linux 5.10+内核无引脚硬件DTS节点绑定失败问题
针对你升级内核后遇到的无引脚外设(如TMU)pinctrl绑定报错问题,以下是几种可行的解决方法:
方法1:在DTS中添加空pinctrl节点
内核5.10+的pinctrl子系统要求设备节点必须能找到有效的pinctrl句柄,即使设备无外部引脚。你可以通过定义一个空的pinctrl节点来满足这个要求:
首先在DTS中添加空的pinctrl节点:
dummy_pinctrl: dummy-pinctrl { compatible = "dummy"; };
然后在你的TMU节点中引用这个空节点:
tmu@40008000 { compatible = "vendor-tmu"; reg = <0x40008000 0x1000>; pinctrl-0 = <&dummy_pinctrl>; pinctrl-names = "default"; };
这样驱动在获取pinctrl句柄时会得到一个有效的空句柄,不会返回-ENODEV错误。
方法2:修改驱动代码跳过pinctrl初始化
如果驱动中硬编码调用了devm_pinctrl_get_select_default()或类似pinctrl初始化函数,你可以针对无引脚设备添加判断逻辑,直接跳过pinctrl相关操作:
// 原驱动代码可能存在的调用 struct pinctrl *p; // 修改为: struct pinctrl *p = NULL; // 检查设备是否需要pinctrl(比如通过设备树属性或硬件特性判断) if (device_needs_pinctrl(dev)) { p = devm_pinctrl_get_select_default(dev); if (IS_ERR(p)) { dev_err(dev, "failed to get pinctrl handle\n"); return PTR_ERR(p); } } // 无引脚设备直接跳过,不返回错误
这种方法更彻底,从驱动层面避免不必要的pinctrl依赖。
方法3:关闭不必要的pinctrl内核配置(谨慎使用)
如果你的平台上只有少数无引脚设备,且对应的pinctrl驱动有独立的内核配置选项,可以尝试关闭该配置。但这种方法可能影响其他依赖pinctrl的设备,除非你能确认不会有副作用,否则不推荐使用。
问题根源
Linux 5.10内核的pinctrl子系统相比5.4版本做了行为调整:当驱动尝试获取默认pinctrl句柄但设备节点未定义任何pinctrl条目时,会返回-ENODEV错误并导致驱动卸载;而5.4版本中这种情况通常会被忽略,允许驱动继续加载。
内容的提问来源于stack exchange,提问作者MysteryMoose
相关产品推荐
相关产品推荐

