reference:

Linux pinctrl 子系统 - BSP-路人甲 - 博客园

1.pinctrl 子系统概述

pinctrl子系统涉及两个概念:

Pin controller devices

在dts中定义具体pin 复用信息,配置信息的地方,也是与pinctrl driver匹配的device

Pinctrl client devices

在dts中引用pin controller devices的具体设备

2.pinctrl子系统使用

a.pin controller devices dts配置

这里以imx6ull上最简单的led为例,pin controller devices中需要加上led pin的复用信息和配置信息

&iomuxc {
	pinctrl-names = "default";
	pinctrl-0 = <&pinctrl_hog_1>;
	imx6ul-evk {
pinctrl_hog_1: hoggrp-1 {
				   fsl,pins = <
					   MX6UL_PAD_UART1_RTS_B__GPIO1_IO19	0x17059 /* SD1 CD */
					   MX6UL_PAD_GPIO1_IO05__USDHC1_VSELECT	0x17059 /* SD1 VSELECT */
					   //MX6UL_PAD_GPIO1_IO09__GPIO1_IO09        0x17059 /* SD1 RESET */
					   >;
			   };
			   ...
pinctrl_gpioled: gpioledgrp {
				  fsl,pins = <
					  MX6UL_PAD_GPIO1_IO03__GPIO1_IO03  0x10b0
					  >;
			   };
			   ...
		};
};

imx6ull中pin controller devices 名字是iomuxc,名称每个半导体厂商都可以自定义,主要是和pin controller driver匹配即可;上述dts是对iomuxc节点进行追加,原始定义在imx6ull.dtsi中如下

iomuxc: iomuxc@020e0000 {
				compatible = "fsl,imx6ul-iomuxc";
				reg = <0x020e0000 0x4000>;
			};

所以在kernel中搜索"fsl,imx6ul-iomuxc"可以找到pinctrl driver的实现,在drivers/pinctrl/freescale/pinctrl-imx6ul.c,后续会详解,说回pinctrl client devices dts配置

b.pinctrl client devices dts配置

	gpioled{
		compatible = "alientek,gpio-led";
		status = "okay";
		pinctrl-0 = <&pinctrl_gpioled>;
		led-gpios = <&gpio1 3 GPIO_ACTIVE_LOW>;
	};

gpioled是我们led设备,需要设置io复用以及配置信息,只要在gpioled设备中引用我们在pin controller devices dts中定义好的pinctrl_gpioled,在gpioled 对应的ko insmode 的时候就会按照pinctrl_gpioled中的定义自动帮我们配置好pinctrl相关的信息