← Documents Documentation/devicetree/bindings/pinctrl/pinctrl-st.txt GitHub 원문 ↗

Linux 6.18.37 · Devicetree Bindings

ST PIO Pinctrl

ST PIO mux, GPIO bank IRQ topology, pin retiming configuration binding입니다.

Source pathDocumentation/devicetree/bindings/pinctrl/pinctrl-st.txt
Source versionLinux v6.18.37
TranslationDUJINLABS 전문 번역 + 해설

요약·해설과 원문, 전문 번역을 서로 분리했습니다. API 이름, symbol, source path는 원문 표기를 사용합니다.

1. 요약·해설

원문의 핵심 논리와 kernel programming 관점의 보충 설명입니다. 아래의 전문 번역과는 별도로 작성했습니다.

요약과 해설

pinctrl-st.txt:1-174

공유 irqmux·bank 전용 IRQ 구조와 4~7개 pin parameter, retime type을 시각화합니다.

2. 영어 원문 전체

번역 기준이 된 Linux v6.18.37 원문입니다. 줄 번호는 이 버전의 파일 좌표입니다.

원문 전체 펼치기
1 *ST pin controller.
2
3 Each multi-function pin is controlled, driven and routed through the
4 PIO multiplexing block. Each pin supports GPIO functionality (ALT0)
5 and multiple alternate functions(ALT1 - ALTx) that directly connect
6 the pin to different hardware blocks.
7
8 When a pin is in GPIO mode, Output Enable (OE), Open Drain(OD), and
9 Pull Up (PU) are driven by the related PIO block.
10
11 ST pinctrl driver controls PIO multiplexing block and also interacts with
12 gpio driver to configure a pin.
13
14 GPIO bank can have one of the two possible types of interrupt-wirings.
15
16 First type is via irqmux, single interrupt is used by multiple gpio banks. This
17 reduces number of overall interrupts numbers required. All these banks belong to
18 a single pincontroller.
19 _________
20 | |----> [gpio-bank (n) ]
21 | |----> [gpio-bank (n + 1)]
22 [irqN]-- | irq-mux |----> [gpio-bank (n + 2)]
23 | |----> [gpio-bank (... )]
24 |_________|----> [gpio-bank (n + 7)]
25
26 Second type has a dedicated interrupt per gpio bank.
27
28 [irqN]----> [gpio-bank (n)]
29
30
31 Pin controller node:
32 Required properties:
33 - compatible : should be "st,stih407-<pio-block>-pinctrl"
34 - st,syscfg : Should be a phandle of the syscfg node.
35 - st,retime-pin-mask : Should be mask to specify which pins can be retimed.
36 If the property is not present, it is assumed that all the pins in the
37 bank are capable of retiming. Retiming is mainly used to improve the
38 IO timing margins of external synchronous interfaces.
39 - ranges : defines mapping between pin controller node (parent) to gpio-bank
40 node (children).
41
42 Optional properties:
43 - interrupts : Interrupt number of the irqmux. If the interrupt is shared
44 with other gpio banks via irqmux.
45 a irqline and gpio banks.
46 - reg : irqmux memory resource. If irqmux is present.
47 - reg-names : irqmux resource should be named as "irqmux".
48
49 GPIO controller/bank node.
50 Required properties:
51 - gpio-controller : Indicates this device is a GPIO controller
52 - #gpio-cells : Must be two.
53 - First cell: specifies the pin number inside the controller
54 - Second cell: specifies whether the pin is logically inverted.
55 - 0 = active high
56 - 1 = active low
57 - st,bank-name : Should be a name string for this bank as specified in
58 datasheet.
59
60 Optional properties:
61 - interrupts : Interrupt number for this gpio bank. If there is a dedicated
62 interrupt wired up for this gpio bank.
63
64 - interrupt-controller : Indicates this device is a interrupt controller. GPIO
65 bank can be an interrupt controller iff one of the interrupt type either via
66 irqmux or a dedicated interrupt per bank is specified.
67
68 - #interrupt-cells: the value of this property should be 2.
69 - First Cell: represents the external gpio interrupt number local to the
70 gpio interrupt space of the controller.
71 - Second Cell: flags to identify the type of the interrupt
72 - 1 = rising edge triggered
73 - 2 = falling edge triggered
74 - 3 = rising and falling edge triggered
75 - 4 = high level triggered
76 - 8 = low level triggered
77 for related macros look in:
78 include/dt-bindings/interrupt-controller/irq.h
79
80 Example:
81 pin-controller-sbc {
82 #address-cells = <1>;
83 #size-cells = <1>;
84 compatible = "st,stih407-sbc-pinctrl";
85 st,syscfg = <&syscfg_sbc>;
86 reg = <0x0961f080 0x4>;
87 reg-names = "irqmux";
88 interrupts = <GIC_SPI 188 IRQ_TYPE_NONE>;
89 interrupt-names = "irqmux";
90 ranges = <0 0x09610000 0x6000>;
91
92 pio0: gpio@9610000 {
93 gpio-controller;
94 #gpio-cells = <2>;
95 interrupt-controller;
96 #interrupt-cells = <2>;
97 reg = <0x0 0x100>;
98 st,bank-name = "PIO0";
99 };
100 ...
101 pin-functions nodes follow...
102 };
103
104
105 Contents of function subnode node:
106 ----------------------
107 Required properties for pin configuration node:
108 - st,pins : Child node with list of pins with configuration.
109
110 Below is the format of how each pin conf should look like.
111
112 <bank offset mux mode rt_type rt_delay rt_clk>
113
114 Every PIO is represented with 4-7 parameters depending on retime configuration.
115 Each parameter is explained as below.
116
117 -bank : Should be bank phandle to which this PIO belongs.
118 -offset : Offset in the PIO bank.
119 -mux : Should be alternate function number associated this pin.
120 Use same numbers from datasheet.
121 -mode :pin configuration is selected from one of the below values.
122 IN
123 IN_PU
124 OUT
125 BIDIR
126 BIDIR_PU
127
128 -rt_type Retiming Configuration for the pin.
129 Possible retime configuration are:
130
131 ------- -------------
132 value args
133 ------- -------------
134 NICLK <delay> <clk>
135 ICLK_IO <delay> <clk>
136 BYPASS <delay>
137 DE_IO <delay> <clk>
138 SE_ICLK_IO <delay> <clk>
139 SE_NICLK_IO <delay> <clk>
140
141 - delay is retime delay in pico seconds as mentioned in data sheet.
142
143 - rt_clk :clk to be use for retime.
144 Possible values are:
145 CLK_A
146 CLK_B
147 CLK_C
148 CLK_D
149
150 Example of mmcclk pin which is a bi-direction pull pu with retime config
151 as non inverted clock retimed with CLK_B and delay of 0 pico seconds:
152
153 pin-controller {
154 ...
155 mmc0 {
156 pinctrl_mmc: mmc {
157 st,pins {
158 mmcclk = <&PIO13 4 ALT4 BIDIR_PU NICLK 0 CLK_B>;
159 ...
160 };
161 };
162 ...
163 };
164 };
165
166 sdhci0:sdhci@fe810000{
167 ...
168 interrupt-parent = <&pio3>;
169 #interrupt-cells = <2>;
170 interrupts = <3 IRQ_TYPE_LEVEL_HIGH>; /* Interrupt line via PIO3-3 */
171 interrupt-names = "card-detect";
172 pinctrl-names = "default";
173 pinctrl-0 = <&pinctrl_mmc>;
174 };
175

3. 한국어 전문 번역

영어 원문의 문단 순서와 의미를 유지한 전체 번역입니다. 코드, 함수명, symbol과 URL은 원문 표기를 유지합니다.

ST PIO multiplexing

1-13

각 multi-function pin은 PIO multiplexing block을 통해 제어·drive·route됩니다. 모든 pin은 GPIO function ALT0과 hardware block에 직접 연결되는 alternate function ALT1부터 ALTx를 지원합니다.

GPIO mode에서는 관련 PIO block이 Output Enable(OE), Open Drain(OD), Pull Up(PU)을 drive합니다. ST pinctrl driver는 PIO mux block을 제어하고 GPIO driver와 협력해 pin을 구성합니다.

GPIO bank interrupt wiring

14-30

첫 번째 방식은 하나의 irqmux interrupt를 여러 GPIO bank가 공유해 전체 interrupt 수를 줄입니다. 이 bank들은 모두 하나의 pin controller에 속합니다.

공유 irqmux 배선
irqNirq-muxgpio-bank (n)
irqNirq-muxgpio-bank (n + 1)
irqNirq-muxgpio-bank (n + 2)
irqNirq-muxgpio-bank (...)
irqNirq-muxgpio-bank (n + 7)

irqN 하나가 irq-mux를 거쳐 최대 여러 GPIO bank로 fan-out됩니다.

두 번째 방식은 각 GPIO bank마다 dedicated interrupt 하나를 직접 연결합니다.

Bank 전용 IRQ 배선
irqNgpio-bank (n)

irqN이 GPIO bank n에 직접 연결됩니다.

Pin controller node 속성

31-48

필수 `compatible` 형식은 `st,stih407-<pio-block>-pinctrl`이고, `st,syscfg`는 syscfg node phandle입니다. `st,retime-pin-mask`는 retime 가능한 pin mask이며 없으면 bank의 모든 pin이 가능하다고 봅니다. Retiming은 external synchronous interface의 I/O timing margin을 개선하는 데 주로 사용합니다. `ranges`는 parent controller와 child GPIO bank mapping입니다.

선택적 `interrupts`는 여러 bank가 irqmux로 공유하는 interrupt 번호입니다. `reg`는 irqmux memory resource이고 `reg-names`는 `irqmux`여야 합니다.

GPIO bank와 interrupt controller

49-79

GPIO bank에는 `gpio-controller`, 값이 2인 `#gpio-cells`, datasheet의 bank 이름인 `st,bank-name`이 필요합니다. 첫 GPIO cell은 controller 내부 pin 번호이고 두 번째 cell은 logical inversion으로 0은 active high, 1은 active low입니다.

Dedicated bank IRQ가 있으면 `interrupts`를 지정합니다. `interrupt-controller`는 bank를 interrupt controller로 표시하며 irqmux 또는 dedicated IRQ 중 하나가 있어야 합니다. `#interrupt-cells`는 2이고 첫 cell은 local GPIO interrupt 번호, 두 번째 cell은 trigger flag입니다.

FlagInterrupt type
1Rising edge triggered
2Falling edge triggered
3Rising and falling edge triggered
4High level triggered
8Low level triggered

관련 macro는 `include/dt-bindings/interrupt-controller/irq.h`를 참조합니다.

Controller와 GPIO bank 예제

80-104

STiH407 SBC pin controller의 irqmux resource와 interrupt, address range를 선언하고 PIO0을 GPIO·interrupt controller로 구성하는 예제입니다.

pin-controller-sbc {
        #address-cells = <1>;
        #size-cells = <1>;
        compatible = "st,stih407-sbc-pinctrl";
        st,syscfg = <&syscfg_sbc>;
        reg = <0x0961f080 0x4>;
        reg-names = "irqmux";
        interrupts = <GIC_SPI 188 IRQ_TYPE_NONE>;
        interrupt-names = "irqmux";
        ranges = <0 0x09610000 0x6000>;

        pio0: gpio@9610000 {
                gpio-controller;
                #gpio-cells = <2>;
                interrupt-controller;
                #interrupt-cells = <2>;
                reg = <0x0 0x100>;
                st,bank-name = "PIO0";
        };
        ...
        pin-functions nodes follow...
};

Function subnode와 pin parameter

105-127

Pin configuration node의 필수 `st,pins` child는 구성할 pin 목록을 담습니다. 각 PIO는 retime configuration에 따라 `<bank offset mux mode rt_type rt_delay rt_clk>`의 4개부터 7개 parameter로 표현됩니다.

`bank`는 PIO가 속한 bank phandle, `offset`은 bank 내부 offset, `mux`는 datasheet의 alternate function 번호, `mode`는 아래 pin mode 중 하나입니다.

ModeMeaning
INInput
IN_PUInput with pull-up
OUTOutput
BIDIRBidirectional
BIDIR_PUBidirectional with pull-up

Retiming type·delay·clock

128-149

`rt_type`은 pin retiming configuration이고 각 값이 요구하는 argument는 아래와 같습니다. `delay`는 datasheet에 명시된 picosecond 단위 retime delay입니다.

rt_typeArguments
NICLK<delay> <clk>
ICLK_IO<delay> <clk>
BYPASS<delay>
DE_IO<delay> <clk>
SE_ICLK_IO<delay> <clk>
SE_NICLK_IO<delay> <clk>

`rt_clk`는 retime에 사용할 clock이며 가능한 값은 다음 네 개입니다.

Clock
CLK_A
CLK_B
CLK_C
CLK_D

MMC clock pin retiming 예제

150-165

MMC clock pin을 bidirectional pull-up으로 설정하고, non-inverted clock retiming `NICLK`, `CLK_B`, delay 0 ps를 적용하는 예제입니다.

pin-controller {
        ...
        mmc0 {
                pinctrl_mmc: mmc {
                        st,pins {
                                mmcclk = <&PIO13 4 ALT4 BIDIR_PU NICLK 0 CLK_B>;
                                ...
                        };
                };
        ...
        };
};

SDHCI card-detect 예제

166-174

SDHCI0가 PIO3-3을 level-high card-detect interrupt로 사용하고 `pinctrl_mmc`를 default pinctrl state로 참조합니다.

sdhci0:sdhci@fe810000{
        ...
        interrupt-parent = <&pio3>;
        #interrupt-cells = <2>;
        interrupts = <3 IRQ_TYPE_LEVEL_HIGH>; /* Interrupt line via PIO3-3 */
        interrupt-names = "card-detect";
        pinctrl-names = "default";
        pinctrl-0        = <&pinctrl_mmc>;
};