1、pincontrol子系统和gpio子系统是两回事,不能混淆来看。比如说,在pincontrol子系统中分配了某gpio作为uart来使用,如果这时候在gpio子系统中gpio_request也是可以成功的,这个时候后执行的代码生效。
pincontrol子系统主要实现的是对PIN的复用功能配置和电气特性配置(比如上/下拉、速度、驱动能力等等)等,比如,这个引脚可以被pincontrol子系统配置为UART引脚或者SPI引脚或者GPIO引脚,可以理解为预处理;
如果 pinctrl 子系统将一个 PIN 复用为 GPIO 的话,那么接下来就要用到 gpio 子系统了。 gpio 子系统顾名思义,就是用于初始化 GPIO 并且提供相应的 API 函数,比如设置 GPIO为输入输出,读取 GPIO 的值等。 gpio 子系统的主要目的就是方便驱动开发者使用 gpio,驱动开发者在设备树中添加 gpio 相关信息,然后就可以在驱动程序中使用 gpio 子系统提供的 API函数来操作 GPIO,Linux 内核向驱动开发者屏蔽掉了 GPIO 的设置过程,极大的方便了驱动开发者使用 GPIO。
如下是pincontrol子系统从设备树中分配gpio的代码:
int flag;
struct pinctrl * p = devm_pinctrl_get(&pdev->dev);
struct pinctrl_state * turnon_tes = pinctrl_lookup_state(p, "default");
flag = pinctrl_select_state(p, turnon_tes);
如果某一外设在pincontrol子系统和gpio子系统都使用了某一gpio,另一外设也使用了这一gpio。则可能会有以下类似报错:
2.642425] pinctrl-single d401e000.pinmux: pin d401e1b0 already requested by pxa2xx-uart.1; cannot claim for matrix-keypad.7
[ 2.653961] ------------[ cut here ]------------
[ 2.658691] WARNING: at drivers/pinctrl/pinmux.c:118 pin_request+0x75/0x11c()
[ 2.665954] Modules linked in:
[ 2.669097] CPU: 0 PID: 1 Comm: swapper Tainted: G W 3.10.33 #79
[ 2.676086] [<c0019879>] (unwind_backtrace+0x1/0x88) from [<c0017def>] (show_stack+0xb/0xc)
[ 2.684631] [<c0017def>] (show_stack+0xb/0xc) from [<c0022747>] (warn_slowpath_common+0x33/0x4c)
[ 2.693603] [<c0022747>] (warn_slowpath_common+0x33/0x4c) from [<c00227b7>] (warn_slowpath_null+0xf/0x14)
[ 2.703338] [<c00227b7>] (warn_slowpath_null+0xf/0x14) from [<c0108fd5>] (pin_request+0x75/0x11c)
[ 2.712402] [<c0108fd5>] (pin_request+0x75/0x11c) from [<c0109535>] (pinmux_enable_setting+0x49/0x104)
[ 2.721923] [<c0109535>] (pinmux_enable_setting+0x49/0x104) from [<c01080f3>] (pinctrl_select_state+0x5f/0xc0)
[ 2.732116] [<c01080f3>] (pinctrl_select_state+0x5f/0xc0) from [<c01a980f>] (matrix_keypad_probe+0x26f/0x494)
[ 2.742218] [<c01a980f>] (matrix_keypad_probe+0x26f/0x494) from [<c013ecd9>] (driver_probe_device+0x75/0x15c)
[ 2.752349] [<c013ecd9>] (driver_probe_device+0x75/0x15c) from [<c013ee19>] (__driver_attach+0x35/0x48)
[ 2.761901] [<c013ee19>] (__driver_attach+0x35/0x48) from [<c013ddd9>] (bus_for_each_dev+0x3b/0x46)
[ 2.771148] [<c013ddd9>] (bus_for_each_dev+0x3b/0x46) from [<c013e7a1>] (bus_add_driver+0x89/0x148)
[ 2.780364] [<c013e7a1>] (bus_add_driver+0x89/0x148) from [<c013f143>] (driver_register+0x4b/0x98)
[ 2.789520] [<c013f143>] (driver_register+0x4b/0x98) from [<c0012b69>] (do_one_initcall+0x69/0xe8)
[ 2.798645] [<c0012b69>] (do_one_initcall+0x69/0xe8) from [<c044685b>] (kernel_init_freeable+0xab/0x140)
[ 2.808349] [<c044685b>] (kernel_init_freeable+0xab/0x140) from [<c000ed53>] (kernel_init+0x7/0xa0)
[ 2.817565] [<c000ed53>] (kernel_init+0x7/0xa0) from [<c00090fd>] (ret_from_fork+0x11/0x34)
[ 2.826049] ---[ end trace 46cebf95fb99e101 ]---
[ 2.830780] pinctrl-single d401e000.pinmux: pin-108 (matrix-keypad.7) status -22
[ 2.838317] pinctrl-single d401e000.pinmux: could not request pin 108 on device pinctrl-single
[ 2.847106] matrix-keypad matrix-keypad.7: Error applying setting, reverse things back
[ 2.855133] keypad pintrl -22
[ 2.858184] keypad request col 31 0 pinctrl
[ 2.862548] keypad request col 13 0 pinctrl
[ 2.866912] keypad request col 53 0 pinctrl
[ 2.871246] keypad request col 14 0 pinctrl
[ 2.875579] keypad request col 54 0 pinctrl
2、以mdm9x07为例
通用gpio只有0~80. 整个cpu pin有300+,但是有的pin标号1000+,可以用下面来理解
/sys/class/gpio # cat /sys/kernel/debug/gpio
cat /sys/kernel/debug/gpio
GPIOs 0-79, platform/1000000.pinctrl, 1000000.pinctrl:
gpio0 : out 0 4mA no pull
gpio1 : in 0 2mA pull down
gpio2 : in 0 2mA pull down
gpio3 : in 0 2mA pull down
gpio4 : out 2 2mA pull up
gpio5 : in 2 2mA pull up
gpio6 : in 2 2mA pull up
gpio7 : out 2 2mA pull up
gpio8 : out 2 2mA pull down
gpio9 : in 2 2mA pull down
gpio10 : in 0 2mA pull down
gpio11 : in 0 2mA pull down
gpio12 : in 0 2mA pull down
gpio13 : in 0 2mA pull down
gpio14 : in 0 2mA pull down
gpio15 : in 0 2mA pull down
gpio16 : in 0 2mA no pull
gpio17 : in 0 2mA pull down
gpio18 : out 0 2mA pull up
gpio19 : out 0 2mA pull up
gpio20 : out 3 8mA no pull
gpio21 : in 3 8mA no pull
gpio22 : out 3 8mA no pull
gpio23 : out 3 8mA no pull
gpio24 : in 0 2mA pull down
gpio25 : in 0 2mA pull down
gpio26 : out 0 2mA pull up
gpio27 : out 0 2mA no pull
gpio28 : out 0 8mA no pull
gpio29 : out 0 2mA no pull
gpio30 : in 0 2mA pull down
gpio31 : out 0 2mA no pull
gpio32 : out 0 8mA no pull
gpio33 : out 0 2mA no pull
gpio34 : in 0 2mA pull down
gpio35 : in 0 2mA pull down
gpio36 : in 0 2mA pull down
gpio37 : out 0 4mA pull down
gpio38 : in 0 2mA pull down
gpio39 : in 0 2mA no pull
gpio40 : in 0 2mA no pull
gpio41 : in 0 2mA no pull
gpio42 : in 0 2mA no pull
gpio43 : in 0 2mA no pull
gpio44 : in 0 2mA no pull
gpio45 : in 0 2mA no pull
gpio46 : in 0 2mA no pull
gpio47 : in 0 2mA no pull
gpio48 : in 0 2mA no pull
gpio49 : in 0 2mA pull up
gpio50 : in 0 2mA no pull
gpio51 : in 0 2mA no pull
gpio52 : in 0 2mA no pull
gpio53 : in 0 2mA pull down
gpio54 : in 0 2mA pull down
gpio55 : in 0 2mA no pull
gpio56 : in 0 2mA no pull
gpio57 : in 0 2mA no pull
gpio58 : in 0 2mA pull down
gpio59 : in 0 2mA pull down
gpio60 : in 0 2mA pull down
gpio61 : in 0 2mA pull down
gpio62 : in 0 2mA pull down
gpio63 : in 0 2mA pull down
gpio64 : in 0 2mA pull down
gpio65 : in 0 2mA pull down
gpio66 : in 0 2mA pull down
gpio67 : in 0 2mA pull down
gpio68 : in 0 2mA pull down
gpio69 : in 0 2mA pull down
gpio70 : in 0 2mA pull down
gpio71 : in 0 2mA pull down
gpio72 : in 0 2mA pull down
gpio73 : in 0 2mA pull down
gpio74 : in 0 2mA pull up
gpio75 : in 0 2mA pull down
gpio76 : in 0 2mA pull down
gpio77 : in 0 2mA pull down
gpio78 : in 0 2mA pull down
gpio79 : in 0 2mA pull down
GPIOs 820-851, platform/soc:qcom,smp2pgpio-ssr-smp2p-1-out, master-kernel:
GPIOs 852-883, platform/soc:qcom,smp2pgpio-ssr-smp2p-1-in, slave-kernel:
GPIOs 884-915, platform/soc:qcom,smp2pgpio-smp2p-1-out, smp2p:
GPIOs 916-947, platform/soc:qcom,smp2pgpio-smp2p-1-in, smp2p:
GPIOs 948-979, platform/soc:qcom,smp2pgpio-smp2p-15-out, smp2p:
GPIOs 980-1011, platform/soc:qcom,smp2pgpio-smp2p-15-in, smp2p:
GPIOs 1012-1017, spmi/qpnp-pin-7, pm8019-mpp:
gpio-1012 (sysfs ) out lo
GPIOs 1018-1023, spmi/qpnp-pin-6, pm8019-gpio:
gpio-1018 (rome_vreg ) out lo
gpio-1021 (sdcard_ext_vreg ) out lo
场景:用gpio控电,后面gpio用作他用,可以用以下代码来配置
#if 1 // leiting add changan svdc project... open peripheral device power
if (!strcmp(dev_name(&pdev->dev), "78b6000.i2c")) {
gpio_request(41, NULL);
gpio_direction_output(41, 0);
gpio_request(58, NULL);
gpio_direction_output(58, 0);
mdelay(1000);
gpio_set_value(41,1);
gpio_set_value(58,1);
gpio_free(41);
gpio_free(58);
}
#endif