linux_pinctrl__0">linux pinctrl 驱动初始化时机分析
为什么需要分析pinctrl 初始化时机
硬件电路中经常会看到如下这样的控制,GPIO 控制电源,GPIO控制各模块的使能脚。有些GPIO一上电时随系统一起上电,有些有特殊的控制
所以我以经常在设备树中看到如下写法
&dsi {status = "okay";panel@0 {compatible ="simple-panel-dsi";reg = <0>;backlight = <&backlight>;.......pinctrl-names = "default"; // <------------这里pinctrl-0 = <&vdd_5v_3v3_h>; // <------------这里.......}}
以及这样
&pinctrl {/delete-property/ rp_init;pinctrl-names = "default";pinctrl-0 = <&vcc12v &lcd_blacklight_enable>;pinctrl_init {vcc12v: vcc12v {rockchip,pins = <0 RK_PC0 RK_FUNC_GPIO &pcfg_output_high>;};lcd_blacklight_enable: lcd_blacklight_enable {rockchip,pins = <2 RK_PD3 RK_FUNC_GPIO &pcfg_output_high>;};};};
这样仅在设备树中的配置,不用写驱动和代码就能控制GPIO的状态,确实比较省事。
但是在一些情况下我们需要控制GPIO 的时序时,我们就得弄清楚,哪些控制在前哪些控制在后,例如
系统启动时出现闪屏的现象;
分析这个问题的原因,其基本原因是屏上电时序有要求,而屏的使能,与电源的控制又与pinctrl 相关;
分析过程
pinctrl rockchip_pinctrl_probe 的初始化时机
使用dump_stack() 打印堆栈
[ 0.296121] [<b040b420>] (rockchip_pinctrl_probe) from [<b04dafb8>] (platform_drv_probe+0x48/0x9c)
[ 0.305667] [<b04dafb8>] (platform_drv_probe) from [<b04d92c0>] (really_probe+0x210/0x2bc)
[ 0.314476] [<b04d92c0>] (really_probe) from [<[b04d94d0>] (driver_probe_device+0x60/0x160)
[ 0.323285] [<b04d94d0>] (driver_probe_device) from [<b04d7758>] (bus_for_each_drv+0x74/0xb8)
[ 0.332377] [<b04d7758>] (bus_for_each_drv) from [<b04d9040>] (__d1evic0e_attach+0xd0/0x138)
[ 0.341184] [<b04d9040>] (__device_attach) from [<b04d8434>] (bus_probe_device+0x84/0x8c)
[ 0.349906] [<b04d8434>] (bus_probe_device) from [<b04d5870>] (device_add+0x65c/0x784)
[ 0.358353] [<b04d5870>] (device_add) from [<b06e4250>] (of_platform_device_create_pdata+0x94/0xcc)
[ 0.367993] [<b06e4250>] (of_platform_device_create_pdata) from [<4b06e4408>] (of_platform_bus_create+0x138/0x36c)
[ 0.378932] [<b06e4408>] (of_p.latf7orm_bus_create3) fr9om [<b06e4770>] (of_platform_populate+0x60/0xb4)
[ 0.388669] [<b06e4770>] (of_platform_populate) from [<b0d20c18>] (of_platform_default_populate_init+0xa4/0xbc)
[ 0.399419] [<b0d20c18>] (of_platform_default_populate_ini9t) from [5<b0102650>] (d5o_on]e_initcall+0x54/0x194)
[ 0.40f9799] [<b0102650>] (do_one_initcall) from [<b0d00ecc>] (kernel_init_freeable+0x144/0x1dc)
[ 0.419069] [<b0d00ecc>] (kernel_init_freeable) from [<b0946204>] (kernel_init+0x8/0x110)
[ 0.427790] [<b0946204>] (kernel_init) ffroms [<b_0101d0d8>a] (rtet_faom_fork+0x14/0x3c)
。。。。