IMX8MM平台sn65dsi83桥接器驱动加载顺序问题求助
解决IMX8MM平台sn65dsi83 DSI转LVDS桥驱动加载顺序问题
问题背景
基于IMX8MM平台运行nxp-imx分支lf-5.15.y内核,启用sn65dsi83 DSI转LVDS桥驱动时遇到加载顺序异常:
- 预期显示链路:
lcdif > mipi_dsi > sn65dsi83 > panel - 实际加载顺序:先初始化i2c设备(含sn65dsi83,因找不到panel导致probe失败且无警告)→ nxp专属驱动
sec_mipi_dsim-imx.c尝试绑定链路返回-517 (eprobe_defer)→ 最后加载panel-lvds.c驱动,后续重试出现更多错误 - 已尝试调整
/drivers/gpu/drm/Makefile中obj-y += panel/的位置,但panel加载仍晚于i2c设备初始化
问题分析
- sn65dsi83作为i2c设备,其probe时机由i2c总线初始化流程决定,优先级高于panel驱动的加载
sn65dsi_probe()调用drm_of_find_panel_or_bridge()未找到panel时,未返回EPROBE_DEFER触发延迟重试,直接导致初始化失败- 仅调整Makefile编译顺序无法改变内核设备初始化的总线优先级逻辑
解决方案
1. 修改sn65dsi83驱动,添加延迟重试逻辑
在sn65dsi83.c的sn65dsi_probe()函数中,当无法找到panel时返回EPROBE_DEFER,让内核重新调度probe:
bridge = drm_of_find_panel_or_bridge(dev->of_node, 1, 0, &panel); if (IS_ERR(bridge)) { ret = PTR_ERR(bridge); // 新增:未找到panel时返回延迟重试标记 if (ret == -ENODEV) return -EPROBE_DEFER; dev_err(dev, "Failed to find panel or bridge: %d\n", ret); goto err_alloc; }
2. 设备树中明确依赖关系
在sn65dsi83的设备树节点中添加depends-on属性,强制内核优先初始化panel:
&sn65dsi83 { /* 原有属性保留 */ depends-on = <&panel_lvds>; // 替换为实际的panel节点别名 };
3. 强制panel驱动内置编译(可选)
若panel驱动为模块编译,改为内置以消除模块加载时机的不确定性:
在内核配置文件中设置:
CONFIG_DRM_PANEL_LVDS=y
验证
重新编译内核与设备树并烧录,查看dmesg日志,确认sn65dsi83的probe会延迟至panel加载完成后执行,显示链路绑定成功。
内容的提问来源于stack exchange,提问作者owndampu
相关产品推荐
相关产品推荐

