xref: /OK3568_Linux_fs/kernel/Documentation/devicetree/bindings/pinctrl/pinctrl-single.txt (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593SmuzhiyunOne-register-per-pin type device tree based pinctrl driver
2*4882a593Smuzhiyun
3*4882a593SmuzhiyunRequired properties:
4*4882a593Smuzhiyun- compatible : "pinctrl-single" or "pinconf-single".
5*4882a593Smuzhiyun  "pinctrl-single" means that pinconf isn't supported.
6*4882a593Smuzhiyun  "pinconf-single" means that generic pinconf is supported.
7*4882a593Smuzhiyun
8*4882a593Smuzhiyun- reg : offset and length of the register set for the mux registers
9*4882a593Smuzhiyun
10*4882a593Smuzhiyun- #pinctrl-cells : number of cells in addition to the index, set to 1
11*4882a593Smuzhiyun  for pinctrl-single,pins and 2 for pinctrl-single,bits
12*4882a593Smuzhiyun
13*4882a593Smuzhiyun- pinctrl-single,register-width : pinmux register access width in bits
14*4882a593Smuzhiyun
15*4882a593Smuzhiyun- pinctrl-single,function-mask : mask of allowed pinmux function bits
16*4882a593Smuzhiyun  in the pinmux register
17*4882a593Smuzhiyun
18*4882a593SmuzhiyunOptional properties:
19*4882a593Smuzhiyun- pinctrl-single,function-off : function off mode for disabled state if
20*4882a593Smuzhiyun  available and same for all registers; if not specified, disabling of
21*4882a593Smuzhiyun  pin functions is ignored
22*4882a593Smuzhiyun
23*4882a593Smuzhiyun- pinctrl-single,bit-per-mux : boolean to indicate that one register controls
24*4882a593Smuzhiyun  more than one pin, for which "pinctrl-single,function-mask" property specifies
25*4882a593Smuzhiyun position mask of pin.
26*4882a593Smuzhiyun
27*4882a593Smuzhiyun- pinctrl-single,drive-strength : array of value that are used to configure
28*4882a593Smuzhiyun  drive strength in the pinmux register. They're value of drive strength
29*4882a593Smuzhiyun  current and drive strength mask.
30*4882a593Smuzhiyun
31*4882a593Smuzhiyun		/* drive strength current, mask */
32*4882a593Smuzhiyun		pinctrl-single,power-source = <0x30 0xf0>;
33*4882a593Smuzhiyun
34*4882a593Smuzhiyun- pinctrl-single,bias-pullup : array of value that are used to configure the
35*4882a593Smuzhiyun  input bias pullup in the pinmux register.
36*4882a593Smuzhiyun
37*4882a593Smuzhiyun		/* input, enabled pullup bits, disabled pullup bits, mask */
38*4882a593Smuzhiyun		pinctrl-single,bias-pullup = <0 1 0 1>;
39*4882a593Smuzhiyun
40*4882a593Smuzhiyun- pinctrl-single,bias-pulldown : array of value that are used to configure the
41*4882a593Smuzhiyun  input bias pulldown in the pinmux register.
42*4882a593Smuzhiyun
43*4882a593Smuzhiyun		/* input, enabled pulldown bits, disabled pulldown bits, mask */
44*4882a593Smuzhiyun		pinctrl-single,bias-pulldown = <2 2 0 2>;
45*4882a593Smuzhiyun
46*4882a593Smuzhiyun  * Two bits to control input bias pullup and pulldown: User should use
47*4882a593Smuzhiyun    pinctrl-single,bias-pullup & pinctrl-single,bias-pulldown. One bit means
48*4882a593Smuzhiyun    pullup, and the other one bit means pulldown.
49*4882a593Smuzhiyun  * Three bits to control input bias enable, pullup and pulldown. User should
50*4882a593Smuzhiyun    use pinctrl-single,bias-pullup & pinctrl-single,bias-pulldown. Input bias
51*4882a593Smuzhiyun    enable bit should be included in pullup or pulldown bits.
52*4882a593Smuzhiyun  * Although driver could set PIN_CONFIG_BIAS_DISABLE, there's no property as
53*4882a593Smuzhiyun    pinctrl-single,bias-disable. Because pinctrl single driver could implement
54*4882a593Smuzhiyun    it by calling pulldown, pullup disabled.
55*4882a593Smuzhiyun
56*4882a593Smuzhiyun- pinctrl-single,input-schmitt : array of value that are used to configure
57*4882a593Smuzhiyun  input schmitt in the pinmux register. In some silicons, there're two input
58*4882a593Smuzhiyun  schmitt value (rising-edge & falling-edge) in the pinmux register.
59*4882a593Smuzhiyun
60*4882a593Smuzhiyun		/* input schmitt value, mask */
61*4882a593Smuzhiyun		pinctrl-single,input-schmitt = <0x30 0x70>;
62*4882a593Smuzhiyun
63*4882a593Smuzhiyun- pinctrl-single,input-schmitt-enable : array of value that are used to
64*4882a593Smuzhiyun  configure input schmitt enable or disable in the pinmux register.
65*4882a593Smuzhiyun
66*4882a593Smuzhiyun		/* input, enable bits, disable bits, mask */
67*4882a593Smuzhiyun		pinctrl-single,input-schmitt-enable = <0x30 0x40 0 0x70>;
68*4882a593Smuzhiyun
69*4882a593Smuzhiyun- pinctrl-single,low-power-mode : array of value that are used to configure
70*4882a593Smuzhiyun  low power mode of this pin. For some silicons, the low power mode will
71*4882a593Smuzhiyun  control the output of the pin when the pad including the pin enter low
72*4882a593Smuzhiyun  power mode.
73*4882a593Smuzhiyun		/* low power mode value, mask */
74*4882a593Smuzhiyun		pinctrl-single,low-power-mode = <0x288 0x388>;
75*4882a593Smuzhiyun
76*4882a593Smuzhiyun- pinctrl-single,gpio-range : list of value that are used to configure a GPIO
77*4882a593Smuzhiyun  range. They're value of subnode phandle, pin base in pinctrl device, pin
78*4882a593Smuzhiyun  number in this range, GPIO function value of this GPIO range.
79*4882a593Smuzhiyun  The number of parameters is depend on #pinctrl-single,gpio-range-cells
80*4882a593Smuzhiyun  property.
81*4882a593Smuzhiyun
82*4882a593Smuzhiyun		/* pin base, nr pins & gpio function */
83*4882a593Smuzhiyun		pinctrl-single,gpio-range = <&range 0 3 0 &range 3 9 1>;
84*4882a593Smuzhiyun
85*4882a593Smuzhiyun- interrupt-controller : standard interrupt controller binding if using
86*4882a593Smuzhiyun  interrupts for wake-up events for example. In this case pinctrl-single
87*4882a593Smuzhiyun  is set up as a chained interrupt controller and the wake-up interrupts
88*4882a593Smuzhiyun  can be requested by the drivers using request_irq().
89*4882a593Smuzhiyun
90*4882a593Smuzhiyun- #interrupt-cells : standard interrupt binding if using interrupts
91*4882a593Smuzhiyun
92*4882a593SmuzhiyunThis driver assumes that there is only one register for each pin (unless the
93*4882a593Smuzhiyunpinctrl-single,bit-per-mux is set), and uses the common pinctrl bindings as
94*4882a593Smuzhiyunspecified in the pinctrl-bindings.txt document in this directory.
95*4882a593Smuzhiyun
96*4882a593SmuzhiyunThe pin configuration nodes for pinctrl-single are specified as pinctrl
97*4882a593Smuzhiyunregister offset and values using pinctrl-single,pins. Only the bits specified
98*4882a593Smuzhiyunin pinctrl-single,function-mask are updated.
99*4882a593Smuzhiyun
100*4882a593SmuzhiyunWhen #pinctrl-cells = 1, then setting a pin for a device could be done with:
101*4882a593Smuzhiyun
102*4882a593Smuzhiyun	pinctrl-single,pins = <0xdc 0x118>;
103*4882a593Smuzhiyun
104*4882a593SmuzhiyunWhere 0xdc is the offset from the pinctrl register base address for the device
105*4882a593Smuzhiyunpinctrl register, and 0x118 contains the desired value of the pinctrl register.
106*4882a593Smuzhiyun
107*4882a593SmuzhiyunWhen #pinctrl-cells = 2, then setting a pin for a device could be done with:
108*4882a593Smuzhiyun
109*4882a593Smuzhiyun	pinctrl-single,pins = <0xdc 0x30 0x07>;
110*4882a593Smuzhiyun
111*4882a593SmuzhiyunWhere 0x30 is the pin configuration value and 0x07 is the pin mux mode value.
112*4882a593SmuzhiyunThese two values are OR'd together to produce the value stored at offset 0xdc.
113*4882a593SmuzhiyunSee the device example and static board pins example below for more information.
114*4882a593Smuzhiyun
115*4882a593SmuzhiyunIn case when one register changes more than one pin's mux the
116*4882a593Smuzhiyunpinctrl-single,bits need to be used which takes three parameters:
117*4882a593Smuzhiyun
118*4882a593Smuzhiyun	pinctrl-single,bits = <0xdc 0x18 0xff>;
119*4882a593Smuzhiyun
120*4882a593SmuzhiyunWhere 0xdc is the offset from the pinctrl register base address for the
121*4882a593Smuzhiyundevice pinctrl register, 0x18 is the desired value, and 0xff is the sub mask to
122*4882a593Smuzhiyunbe used when applying this change to the register.
123*4882a593Smuzhiyun
124*4882a593Smuzhiyun
125*4882a593SmuzhiyunOptional sub-node: In case some pins could be configured as GPIO in the pinmux
126*4882a593Smuzhiyunregister, those pins could be defined as a GPIO range. This sub-node is required
127*4882a593Smuzhiyunby pinctrl-single,gpio-range property.
128*4882a593Smuzhiyun
129*4882a593SmuzhiyunRequired properties in sub-node:
130*4882a593Smuzhiyun- #pinctrl-single,gpio-range-cells : the number of parameters after phandle in
131*4882a593Smuzhiyun  pinctrl-single,gpio-range property.
132*4882a593Smuzhiyun
133*4882a593Smuzhiyun	range: gpio-range {
134*4882a593Smuzhiyun		#pinctrl-single,gpio-range-cells = <3>;
135*4882a593Smuzhiyun	};
136*4882a593Smuzhiyun
137*4882a593Smuzhiyun
138*4882a593SmuzhiyunExample:
139*4882a593Smuzhiyun
140*4882a593Smuzhiyun/* SoC common file */
141*4882a593Smuzhiyun
142*4882a593Smuzhiyun/* first controller instance for pins in core domain */
143*4882a593Smuzhiyunpmx_core: pinmux@4a100040 {
144*4882a593Smuzhiyun	compatible = "pinctrl-single";
145*4882a593Smuzhiyun	reg = <0x4a100040 0x0196>;
146*4882a593Smuzhiyun	#address-cells = <1>;
147*4882a593Smuzhiyun	#size-cells = <0>;
148*4882a593Smuzhiyun	#interrupt-cells = <1>;
149*4882a593Smuzhiyun	interrupt-controller;
150*4882a593Smuzhiyun	pinctrl-single,register-width = <16>;
151*4882a593Smuzhiyun	pinctrl-single,function-mask = <0xffff>;
152*4882a593Smuzhiyun};
153*4882a593Smuzhiyun
154*4882a593Smuzhiyun/* second controller instance for pins in wkup domain */
155*4882a593Smuzhiyunpmx_wkup: pinmux@4a31e040 {
156*4882a593Smuzhiyun	compatible = "pinctrl-single";
157*4882a593Smuzhiyun	reg = <0x4a31e040 0x0038>;
158*4882a593Smuzhiyun	#address-cells = <1>;
159*4882a593Smuzhiyun	#size-cells = <0>;
160*4882a593Smuzhiyun	#interrupt-cells = <1>;
161*4882a593Smuzhiyun	interrupt-controller;
162*4882a593Smuzhiyun	pinctrl-single,register-width = <16>;
163*4882a593Smuzhiyun	pinctrl-single,function-mask = <0xffff>;
164*4882a593Smuzhiyun};
165*4882a593Smuzhiyun
166*4882a593Smuzhiyuncontrol_devconf0: pinmux@48002274 {
167*4882a593Smuzhiyun	compatible = "pinctrl-single";
168*4882a593Smuzhiyun	reg = <0x48002274 4>;	/* Single register */
169*4882a593Smuzhiyun	#address-cells = <1>;
170*4882a593Smuzhiyun	#size-cells = <0>;
171*4882a593Smuzhiyun	pinctrl-single,bit-per-mux;
172*4882a593Smuzhiyun	pinctrl-single,register-width = <32>;
173*4882a593Smuzhiyun	pinctrl-single,function-mask = <0x5F>;
174*4882a593Smuzhiyun};
175*4882a593Smuzhiyun
176*4882a593Smuzhiyun/* third controller instance for pins in gpio domain */
177*4882a593Smuzhiyunpmx_gpio: pinmux@d401e000 {
178*4882a593Smuzhiyun	compatible = "pinconf-single";
179*4882a593Smuzhiyun	reg = <0xd401e000 0x0330>;
180*4882a593Smuzhiyun	#address-cells = <1>;
181*4882a593Smuzhiyun	#size-cells = <1>;
182*4882a593Smuzhiyun	ranges;
183*4882a593Smuzhiyun
184*4882a593Smuzhiyun	pinctrl-single,register-width = <32>;
185*4882a593Smuzhiyun	pinctrl-single,function-mask = <7>;
186*4882a593Smuzhiyun
187*4882a593Smuzhiyun	/* sparse GPIO range could be supported */
188*4882a593Smuzhiyun	pinctrl-single,gpio-range = <&range 0 3 0 &range 3 9 1
189*4882a593Smuzhiyun				&range 12 1 0 &range 13 29 1
190*4882a593Smuzhiyun				&range 43 1 0 &range 44 49 1
191*4882a593Smuzhiyun				&range 94 1 1 &range 96 2 1>;
192*4882a593Smuzhiyun
193*4882a593Smuzhiyun	range: gpio-range {
194*4882a593Smuzhiyun		#pinctrl-single,gpio-range-cells = <3>;
195*4882a593Smuzhiyun	};
196*4882a593Smuzhiyun};
197*4882a593Smuzhiyun
198*4882a593Smuzhiyun
199*4882a593Smuzhiyun/* board specific .dts file */
200*4882a593Smuzhiyun
201*4882a593Smuzhiyun&pmx_core {
202*4882a593Smuzhiyun
203*4882a593Smuzhiyun	/*
204*4882a593Smuzhiyun	 * map all board specific static pins enabled by the pinctrl driver
205*4882a593Smuzhiyun	 * itself during the boot (or just set them up in the bootloader)
206*4882a593Smuzhiyun	 */
207*4882a593Smuzhiyun	pinctrl-names = "default";
208*4882a593Smuzhiyun	pinctrl-0 = <&board_pins>;
209*4882a593Smuzhiyun
210*4882a593Smuzhiyun	board_pins: pinmux_board_pins {
211*4882a593Smuzhiyun		pinctrl-single,pins = <
212*4882a593Smuzhiyun			0x6c 0xf
213*4882a593Smuzhiyun			0x6e 0xf
214*4882a593Smuzhiyun			0x70 0xf
215*4882a593Smuzhiyun			0x72 0xf
216*4882a593Smuzhiyun		>;
217*4882a593Smuzhiyun	};
218*4882a593Smuzhiyun
219*4882a593Smuzhiyun	uart0_pins: pinmux_uart0_pins {
220*4882a593Smuzhiyun		pinctrl-single,pins = <
221*4882a593Smuzhiyun			0x208 0		/* UART0_RXD (IOCFG138) */
222*4882a593Smuzhiyun			0x20c 0		/* UART0_TXD (IOCFG139) */
223*4882a593Smuzhiyun		>;
224*4882a593Smuzhiyun		pinctrl-single,bias-pulldown = <0 2 2>;
225*4882a593Smuzhiyun		pinctrl-single,bias-pullup = <0 1 1>;
226*4882a593Smuzhiyun	};
227*4882a593Smuzhiyun
228*4882a593Smuzhiyun	/* map uart2 pins */
229*4882a593Smuzhiyun	uart2_pins: pinmux_uart2_pins {
230*4882a593Smuzhiyun		pinctrl-single,pins = <
231*4882a593Smuzhiyun			0xd8 0x118
232*4882a593Smuzhiyun			0xda 0
233*4882a593Smuzhiyun			0xdc 0x118
234*4882a593Smuzhiyun			0xde 0
235*4882a593Smuzhiyun		>;
236*4882a593Smuzhiyun	};
237*4882a593Smuzhiyun};
238*4882a593Smuzhiyun
239*4882a593Smuzhiyun&control_devconf0 {
240*4882a593Smuzhiyun	mcbsp1_pins: pinmux_mcbsp1_pins {
241*4882a593Smuzhiyun		pinctrl-single,bits = <
242*4882a593Smuzhiyun			0x00 0x18 0x18 /* FSR/CLKR signal from FSX/CLKX pin */
243*4882a593Smuzhiyun		>;
244*4882a593Smuzhiyun	};
245*4882a593Smuzhiyun
246*4882a593Smuzhiyun	mcbsp2_clks_pins: pinmux_mcbsp2_clks_pins {
247*4882a593Smuzhiyun		pinctrl-single,bits = <
248*4882a593Smuzhiyun			0x00 0x40 0x40 /* McBSP2 CLKS from McBSP_CLKS pin */
249*4882a593Smuzhiyun		>;
250*4882a593Smuzhiyun	};
251*4882a593Smuzhiyun
252*4882a593Smuzhiyun};
253*4882a593Smuzhiyun
254*4882a593Smuzhiyun&uart1 {
255*4882a593Smuzhiyun       pinctrl-names = "default";
256*4882a593Smuzhiyun       pinctrl-0 = <&uart0_pins>;
257*4882a593Smuzhiyun};
258*4882a593Smuzhiyun
259*4882a593Smuzhiyun&uart2 {
260*4882a593Smuzhiyun       pinctrl-names = "default";
261*4882a593Smuzhiyun       pinctrl-0 = <&uart2_pins>;
262*4882a593Smuzhiyun};
263