关于pinctrl子系统的源码有一处没看懂

内核编译和嵌入式产品的设计与开发
回复
我是swk
帖子: 5
注册时间: 2021-12-04 18:11
系统: windows+linux
送出感谢: 3 次
接收感谢: 0

关于pinctrl子系统的源码有一处没看懂

#1

帖子 我是swk » 2022-11-04 12:37

困扰很久,网上也没查到,求大佬指点迷津。
我做了个调用图,只在关键地方缩进了,其他那种一层一层的调用没缩进,大佬们帮忙看下:
2022-11-04_12-39.png
平台是imx6ul,在really_probe()中先调用pinctrl_bind_pins(),然后再调用call_driver_probe(),可是pinctrl_bind_pins()中要用到的pinmux_ops、pinconf_ops这两个结构体里的驱动函数是在call_driver_probe()里面填充的,怎么能提前调用呢??
图片可能有点模糊,图里的文本在这里:
really_probe.c
(286 Bytes) 下载 9 次
头像
astolia
论坛版主
帖子: 5968
注册时间: 2008-09-18 13:11
送出感谢: 1 次
接收感谢: 1037 次

Re: 关于pinctrl子系统的源码有一处没看懂

#2

帖子 astolia » 2022-11-04 13:44

免责声明:我没研究过这块,下面的内容是我花了几分钟粗读源码得出的结论,可能与事实有偏差,请自行判断

不知道你说的是哪个版本的内核,我就拿最新的6.0.7版本来说明

https://elixir.bootlin.com/linux/latest ... re.c#L1341
pinctrl_select_state()里有判断,如果要设置的状态和当前状态相同,就不会去调用pinctrl_commit_state()而是直接返回

https://elixir.bootlin.com/linux/latest ... rl-state.h
在注释中提到,pinctrl的状态在probe前应当被设置成PINCTRL_STATE_DEFAULT或PINCTRL_STATE_INIT两者之一

https://elixir.bootlin.com/linux/latest ... ctrl.c#L21
而在pinctrl_bind_pins()里,如果支持init_state就设置成PINCTRL_STATE_INIT,否则设置成PINCTRL_STATE_DEFAULT。所以正常情况下pinctrl_select_state()都不会去调用pinctrl_commit_state()
这些用户感谢了作者 astolia 于这个帖子:
我是swk (2022-11-04 15:53)
评价: 3.7%
我是swk
帖子: 5
注册时间: 2021-12-04 18:11
系统: windows+linux
送出感谢: 3 次
接收感谢: 0

Re: 关于pinctrl子系统的源码有一处没看懂

#3

帖子 我是swk » 2022-11-04 15:53

astolia 写了:
2022-11-04 13:44
免责声明:我没研究过这块,下面的内容是我花了几分钟粗读源码得出的结论,可能与事实有偏差,请自行判断

不知道你说的是哪个版本的内核,我就拿最新的6.0.7版本来说明

https://elixir.bootlin.com/linux/latest ... re.c#L1341
pinctrl_select_state()里有判断,如果要设置的状态和当前状态相同,就不会去调用pinctrl_commit_state()而是直接返回

https://elixir.bootlin.com/linux/latest ... rl-state.h
在注释中提到,pinctrl的状态在probe前应当被设置成PINCTRL_STATE_DEFAULT或PINCTRL_STATE_INIT两者之一

https://elixir.bootlin.com/linux/latest ... ctrl.c#L21
而在pinctrl_bind_pins()里,如果支持init_state就设置成PINCTRL_STATE_INIT,否则设置成PINCTRL_STATE_DEFAULT。所以正常情况下pinctrl_select_state()都不会去调用pinctrl_commit_state()
感谢大佬,找了很久,已经知道是在dev->pins->p = devm_pinctrl_get(dev)这句里,应该是没查找到pinctrl然后创建一个新的。
大佬阅读内核代码的能力怎么这么强呢~仰望大佬~~
回复