SC16IS750 GPIO0输出高电平GPIO hogging问题及驱动解析求助
SC16IS750 GPIO Hogging配置异常及驱动DTS解析疑问
问题概述
- 需求:将SC16IS750的GPIO0配置为输出模式且默认高电平,采用GPIO hogging机制实现
- 异常:未添加
p0子节点时,可正常识别/dev/gpiochip2及所有GPIO名称;添加p0子节点后出现识别异常 - 环境:Linux内核v5.4.148,使用官方
sc16is7xx.c驱动 - 参考:已对照GPIO绑定文档及相关技术问答完成DTS配置
当前DTS配置
/* I2C-to-UART converter */ sc16is750: sc16is750@48 { compatible = "nxp,sc16is750"; reg = <0x48>; clock-frequency = <14746500>; interrupt-parent = <&gpio>; interrupts = <28 0>; gpio-controller; #gpio-cells = <2>; /* ngpios = <8>; */ /* gpio-line-names = "Fan", "1", "TACO", "3", "4", "5", "6", "7"; */ p0 { gpio-hog; gpios = <0x0 0x0>; output-high; line-name = "Fan"; }; };
现象对比
- 无
p0子节点、开启ngpios和gpio-line-names:GPIO控制器正常识别,可看到所有GPIO名称 - 有
p0子节点、注释ngpios和gpio-line-names:GPIO控制器识别异常
驱动相关疑问
推测驱动读取DTS的入口为sc16is7xx_i2c_probe(),但难以梳理驱动中处理DTS GPIO配置(尤其是hogging)的具体逻辑,希望明确相关代码路径。
排查建议
- 恢复
ngpios = <8>配置:SC16IS750原生支持8个GPIO,部分驱动版本依赖该属性确认GPIO数量,缺失可能导致GPIO控制器初始化失败,进而影响hog子节点解析 - 调整
gpios属性格式:将gpios = <0x0 0x0>改为gpios = <0 GPIO_ACTIVE_HIGH>(DTS中可直接使用宏定义或对应数值),确保flags参数符合驱动预期 - 驱动代码梳理路径:
sc16is7xx_i2c_probe()会调用核心初始化函数sc16is7xx_probe()- GPIO控制器初始化逻辑在
sc16is7xx_gpio_probe()中,该函数负责注册GPIO chip,并处理ngpios等属性 - GPIO hogging由内核GPIO子系统统一解析,需驱动完成GPIO chip注册后才能生效;若注册流程因DTS配置错误中断,会导致hog子节点无法被处理
内容的提问来源于stack exchange,提问作者Dukel
相关产品推荐
相关产品推荐

