You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 03:01:09