参考文档:Linux4.4/Documentation/devicetree/bindings/pinctrl/samsung-pinctrl.txt
samsung-pinctrl.txt文档中的重要部分:
pinctr的学习与理解:
-引脚复用器/配置组作为子节点:引脚复用器(选择引脚功能模式)和引脚配置(上拉/下拉,驱动器强度)设置表示为引脚控制器节点的子节点。应该至少有一个子节点,并且这些子节点的数量没有限制。子节点也可能由几个其他子节点组成,以允许将多个pinctrl组分组为一个。第二级子节点的格式与第一级子节点的格式完全相同,如下所述。
子节点应包含一个或多个引脚列表,在这些引脚上必须应用特定的引脚功能选择或引脚配置(或两者)。使用属性名称“ samsung,pins”指定此引脚列表。此属性应至少指定一个引脚,并且可以指定的引脚数没有上限。使用从SoC硬件手册派生的引脚名称来指定引脚。例如,引脚控制器的GPA0 bank中的引脚可以表示为“ gpa0-0”,“ gpa0-1”,“ gpa0-2”等。名称应小写。引脚名称的格式应为(根据硬件手册)
“ [[pin bank]-[pin number within the bank]”。
使用“ samsung,pin-function”属性可以指定应该应用于子节点中列出的引脚的引脚功能选择。应该从SoC的硬件手册中为指定的引脚组选择应应用于“ samsung,pins”属性中列出的每个引脚的此属性的值。如果不需要为子节点中列出的引脚选择特定功能,则此属性在子节点中是可选的。该属性的值按原样用于编程引脚组的引脚控制器功能选择器寄存器。
- samsung,pin-val:引脚输出缓冲区的初始值。
- samsung,pin-pud:上拉/下拉配置。
- samsung,pin-drv:驱动强度配置。
- samsung,pin-pud-pdn:在掉电模式下上拉/下拉配置。
- samsung,pin-drv-pdn:掉电模式下的驱动强度配置。
这些配置属性指定的值应来自硬件手册,并且这些值按原样编程到引脚中
上拉/下拉和引脚控制器的驱动器强度寄存器。
注意:子项应至少包括引脚功能选择属性或引脚配置属性(一个或多个)或同时包含这两个属性。
需要特定引脚功能选择和/或引脚配置的客户端节点应使用“ pinctrl-bindings.txt”文件中列出的绑定。
外部GPIO和唤醒中断:
控制器通过gpio支持两种类型的外部中断。第一个是外部gpio中断,第二个是外部唤醒中断。两者之间的区别在于,外部唤醒中断可以用作系统唤醒事件。
A.外部GPIO中断:为了支持外部gpio中断,应在引脚控制器设备节点中指定以下属性。
-中断父级:外部GPIO中断转发到的中断父级的中断。
-中断:控制器的中断说明符。中断说明符的格式和值取决于控制器的中断父级。
此外,在支持GPIO中断的每组引脚的节点中必须存在以下属性:
-中断控制器:将控制器节点标识为中断父节点。
-#interrupt-cells:此属性的值应为2。
-第一个单元格:表示控制器外部gpio中断空间本地的外部gpio中断号。
-第二个单元:用于标识中断类型的标志
-1 =触发上升沿
-2 =触发下降沿
-3 =触发上升沿和下降沿
-4 =高电平触发
-8 =低电平触发
B.外部唤醒中断:为了支持外部唤醒中断,在引脚控制器设备节点中应包含一个代表外部唤醒中断控制器的子节点。该子节点应包括以下属性。
-兼容:标识外部唤醒中断控制器的类型,可能的值为:
-samsung,s3c2410-wakeup-eint:代表三星S3C24xx SoC上除S3C2412和S3C2413之外的唤醒中断控制器,
-samsung,s3c2412-wakeup-eint:代表在三星S3C2412和S3C2413 SoC上找到的唤醒中断控制器,
-samsung,s3c64xx-wakeup-eint:代表在三星S3C64xx SoC上找到的唤醒中断控制器,
-samsung,exynos4210-wakeup-eint:代表在三星Exynos4210和S5PC110 / S5PV210 SoC上找到的唤醒中断控制器。
-samsung,exynos7-wakeup-eint:代表在三星Exynos7 SoC上找到的唤醒中断控制器。
-中断父级:外部唤醒中断转发到的中断父级的中断。
-中断:复用唤醒中断使用的中断。
此外,在支持唤醒中断的每组引脚的节点中必须存在以下属性:
-中断控制器:将节点标识为中断父节点。
-#interrupt-cells:此属性的值应为2
-第一单元:表示控制器外部唤醒中断空间本地的外部唤醒中断号。
-第二个单元:用于标识中断类型的标志
-1 =触发上升沿
-2 =触发下降沿
-3 =触发上升沿和下降沿
-4 =高电平触发
-8 =低电平触发
支持直接唤醒中断(无复用)的每排引脚的节点必须包含以下属性:
-中断父级:外部唤醒中断转发到的中断父级的中断。
-中断:用于来自存储区引脚的外部唤醒中断的中断父级中断必须包含存储区所有引脚的中断。
别名:
应该在别名节点中使用以下格式“ pinctrl {n}”表示所有引脚控制器节点,其中n是别名的唯一编号。
与“ samsung,exynos7-pinctrl”兼容的控制器的别名:
-pinctrl0:ALIVE模块的引脚控制器,
-pinctrl1:BUS0模块的引脚控制器,
-pinctrl2:NFC模块的引脚控制器,
-pinctrl3:TOUCH模块的引脚控制器,
-pinctrl4:FF块的引脚控制器,
-pinctrl5:ESE模块的引脚控制器,
-pinctrl6:FSYS0模块的引脚控制器,
-pinctrl7:FSYS1模块的引脚控制器,
-pinctrl8:BUS1模块的引脚控制器,
-pinctrl9:音频模块的引脚控制器,
Example: A pin-controller node with pin banks:
pinctrl_0: pinctrl@11400000 { compatible = "samsung,exynos4210-pinctrl";
reg = <0x11400000 0x1000>;
interrupts = <0 47 0>;
/* ... */
/* Pin bank without external interrupts */
gpy0: gpy0 { gpio-controller;
#gpio-cells = <2>; };
/* ... */
/* Pin bank with external GPIO or muxed wake-up interrupts */
gpj0: gpj0 { gpio-controller;
#gpio-cells = <2>;
interrupt-controller;
#interrupt-cells = <2>; };
/* ... */
/* Pin bank with external direct wake-up interrupts */
gpx0: gpx0 { gpio-controller;
#gpio-cells = <2>;
interrupt-controller;
interrupt-parent = <&gic>;
interrupts = <0 16 0>, <0 17 0>, <0 18 0>, <0 19 0>, <0 20 0>, <0 21 0>, <0 22 0>, <0 23 0>; #interrupt-cells = <2>; };
/* ... */ };
Example 1: A pin-controller node with pin groups.
pinctrl_0: pinctrl@11400000 { compatible = "samsung,exynos4210-pinctrl";
reg = <0x11400000 0x1000>;
interrupts = <0 47 0>;
/* ... */
uart0_data: uart0-data { samsung,pins = "gpa0-0", "gpa0-1";
samsung,pin-function = <2>;
samsung,pin-pud = <0>;
samsung,pin-drv = <0>; };
uart0_fctl: uart0-fctl { samsung,pins = "gpa0-2", "gpa0-3";
samsung,pin-function = <2>;
samsung,pin-pud = <0>;
samsung,pin-drv = <0>; };
uart1_data: uart1-data { samsung,pins = "gpa0-4", "gpa0-5";
samsung,pin-function = <2>;
samsung,pin-pud = <0>;
samsung,pin-drv = <0>; };
uart1_fctl: uart1-fctl { samsung,pins = "gpa0-6", "gpa0-7";
samsung,pin-function = <2>;
samsung,pin-pud = <0>;
samsung,pin-drv = <0>; };
i2c2_bus: i2c2-bus { samsung,pins = "gpa0-6", "gpa0-7";
samsung,pin-function = <3>;
samsung,pin-pud = <3>;
samsung,pin-drv = <0>; };
sd4_bus8: sd4-bus-width8 { part-1 { samsung,pins = "gpk0-3", "gpk0-4", "gpk0-5", "gpk0-6"; samsung,pin-function = <3>;
samsung,pin-pud = <3>;
samsung,pin-drv = <3>; };
part-2 { samsung,pins = "gpk1-3", "gpk1-4", "gpk1-5", "gpk1-6"; samsung,pin-function = <4>;
samsung,pin-pud = <4>;
samsung,pin-drv = <3>; }; }; };
Example 2: A pin-controller node with external wakeup interrupt controller node.
pinctrl_1: pinctrl@11000000 { compatible = "samsung,exynos4210-pinctrl";
reg = <0x11000000 0x1000>;
interrupts = <0 46 0>
/* ... */
wakeup-interrupt-controller { compatible = "samsung,exynos4210-wakeup-eint";
interrupt-parent = <&gic>;
interrupts = <0 32 0>; }; };
Example 3: A uart client node that supports 'default' and 'flow-control' states.
uart@13800000 { compatible = "samsung,exynos4210-uart";
reg = <0x13800000 0x100>;
interrupts = <0 52 0>;
pinctrl-names = "default", "flow-control;
pinctrl-0 = <&uart0_data>;
pinctrl-1 = <&uart0_data &uart0_fctl>; };
Example 4: Set up the default pin state for uart controller.
static int s3c24xx_serial_probe(struct platform_device *pdev) { struct pinctrl *pinctrl;
/* ... */
pinctrl = devm_pinctrl_get_select_default(&pdev->dev); }
Example 5: A display port client node that supports 'default' pinctrl state and gpio binding.
display-port-controller { /* ... */
samsung,hpd-gpio = <&gpx2 6 0>;
pinctrl-names = "default";
pinctrl-0 = <&dp_hpd>; };
Example 6: Request the gpio for display port controller
static int exynos_dp_probe(struct platform_device *pdev)
{
int hpd_gpio, ret;
struct device *dev = &pdev->dev;
struct device_node *dp_node = dev->of_node;
/* ... */
hpd_gpio = of_get_named_gpio(dp_node, "samsung,hpd-gpio", 0);
/* ... */
ret = devm_gpio_request_one(&pdev->dev, hpd_gpio, GPIOF_IN, "hpd_gpio"); /* ... */
}