1# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
2%YAML 1.2
3---
4$id: http://devicetree.org/schemas/pinctrl/mediatek,mt7986-pinctrl.yaml#
5$schema: http://devicetree.org/meta-schemas/core.yaml#
6
7title: Mediatek MT7986 Pin Controller
8
9maintainers:
10  - Sean Wang <sean.wang@kernel.org>
11
12description: |+
13  The MediaTek's MT7986 Pin controller is used to control SoC pins.
14
15properties:
16  compatible:
17    enum:
18      - mediatek,mt7986a-pinctrl
19      - mediatek,mt7986b-pinctrl
20
21  reg:
22    minItems: 8
23    maxItems: 8
24
25  reg-names:
26    items:
27      - const: gpio
28      - const: iocfg_rt
29      - const: iocfg_rb
30      - const: iocfg_lt
31      - const: iocfg_lb
32      - const: iocfg_tr
33      - const: iocfg_tl
34      - const: eint
35
36  gpio-controller: true
37
38  "#gpio-cells":
39    const: 2
40    description: |
41      Number of cells in GPIO specifier. Since the generic GPIO
42      binding is used, the amount of cells must be specified as 2. See the below
43      mentioned gpio binding representation for description of particular cells.
44
45  gpio-ranges:
46    minItems: 1
47    maxItems: 5
48    description: |
49      GPIO valid number range.
50
51  interrupt-controller: true
52
53  interrupts:
54    maxItems: 1
55
56  "#interrupt-cells":
57    const: 2
58
59allOf:
60  - $ref: "pinctrl.yaml#"
61
62required:
63  - compatible
64  - reg
65  - reg-names
66  - gpio-controller
67  - "#gpio-cells"
68
69patternProperties:
70  '-pins$':
71    type: object
72    additionalProperties: false
73
74    patternProperties:
75      '.*mux.*':
76        type: object
77        additionalProperties: false
78        description: |
79          pinmux configuration nodes.
80
81          The following table shows the effective values of "group", "function"
82          properties and chip pinout pins
83
84          groups	    function    pins (in pin#)
85          ---------------------------------------------------------------------
86          "watchdog"        "watchdog"  0
87          "wifi_led"        "led"       1, 2
88          "i2c"             "i2c"       3, 4
89          "uart1_0"         "uart"      7, 8, 9, 10
90          "pcie_clk"        "pcie"      9
91          "pcie_wake"       "pcie"      10
92          "spi1_0"          "spi"       11, 12, 13, 14
93          "pwm1_1"          "pwm"       20,
94          "pwm0"            "pwm"       21,
95          "pwm1_0"          "pwm"       22,
96          "snfi"            "flash"     23, 24, 25, 26, 27, 28
97          "spi1_2"          "spi"       29, 30, 31, 32
98          "emmc_45"         "emmc"      22, 23, 24, 25, 26, 27, 28, 29, 30,
99                                        31, 32
100          "spi1_1"          "spi"       23, 24, 25, 26
101          "uart1_2"         "uart"      29, 30, 31, 32
102          "uart1_1"         "uart"      23, 24, 25, 26
103          "uart2_0"         "uart"      29, 30, 31, 32
104          "spi0"            "spi"       33, 34, 35, 36
105          "spi0_wp_hold"    "spi"       37, 38
106          "uart1_3_rx_tx"   "uart"      35, 36
107          "uart1_3_cts_rts" "uart"      37, 38
108          "uart2_1"         "uart"      33, 34, 35, 36
109          "spi1_3"          "spi"       33, 34, 35, 36
110          "uart0"           "uart"      39, 40
111          "pcie_pereset"    "pcie"      41
112          "uart1"           "uart"      42, 43, 44, 45
113          "uart2"           "uart"      46, 47, 48, 49
114          "emmc_51"         "emmc"      50, 51, 52, 53, 54, 55, 56, 57, 57,
115                                        59, 60, 61
116          "pcm"             "audio"     62, 63, 64, 65
117          "i2s"             "audio"     62, 63, 64, 65
118          "switch_int"      "eth"       66
119          "mdc_mdio"        "eth"       67
120
121        $ref: "/schemas/pinctrl/pinmux-node.yaml"
122        properties:
123          function:
124            description: |
125              A string containing the name of the function to mux to the group.
126              There is no "audio", "pcie" functions on mt7986b, you can only use
127              those functions on mt7986a.
128            enum: [audio, emmc, eth, i2c, led, flash, pcie, pwm, spi, uart,
129                   watchdog, wifi]
130          groups:
131            description: |
132              An array of strings. Each string contains the name of a group.
133              There is no "pcie_pereset", "uart1", "uart2" "emmc_51", "pcm",
134              and "i2s" groups on mt7986b, you can only use those groups on
135              mt7986a.
136        required:
137          - function
138          - groups
139
140        allOf:
141          - if:
142              properties:
143                function:
144                  const: audio
145            then:
146              properties:
147                groups:
148                  enum: [pcm, i2s]
149          - if:
150              properties:
151                function:
152                  const: emmc
153            then:
154              properties:
155                groups:
156                  enum: [emmc, emmc_rst]
157          - if:
158              properties:
159                function:
160                  const: eth
161            then:
162              properties:
163                groups:
164                  enum: [switch_int, mdc_mdio]
165          - if:
166              properties:
167                function:
168                  const: i2c
169            then:
170              properties:
171                groups:
172                  enum: [i2c]
173          - if:
174              properties:
175                function:
176                  const: led
177            then:
178              properties:
179                groups:
180                  enum: [wifi_led]
181          - if:
182              properties:
183                function:
184                  const: flash
185            then:
186              properties:
187                groups:
188                  enum: [snfi]
189          - if:
190              properties:
191                function:
192                  const: pcie
193            then:
194              properties:
195                groups:
196                  enum: [pcie_clk, pcie_wake, pcie_pereset]
197          - if:
198              properties:
199                function:
200                  const: pwm
201            then:
202              properties:
203                groups:
204                  enum: [pwm0, pwm1_0, pwm1_1]
205          - if:
206              properties:
207                function:
208                  const: spi
209            then:
210              properties:
211                groups:
212                  enum: [spi0, spi0_wp_hold, spi1_0, spi1_1, spi1_2, spi1_3]
213          - if:
214              properties:
215                function:
216                  const: uart
217            then:
218              properties:
219                groups:
220                  enum: [uart1_0, uart1_1, uart1_2, uart1_3_rx_tx,
221                         uart1_3_cts_rts, uart2_0, uart2_1, uart0, uart1, uart2]
222          - if:
223              properties:
224                function:
225                  const: watchdog
226            then:
227              properties:
228                groups:
229                  enum: [watchdog]
230          - if:
231              properties:
232                function:
233                  const: wifi
234            then:
235              properties:
236                groups:
237                  enum: [wf_2g, wf_5g, wf_dbdc]
238      '.*conf.*':
239        type: object
240        additionalProperties: false
241        description: |
242          pinconf configuration nodes.
243        $ref: "/schemas/pinctrl/pincfg-node.yaml"
244
245        properties:
246          pins:
247            description: |
248              An array of strings. Each string contains the name of a pin.
249              There is no PIN 41 to PIN 65 above on mt7686b, you can only use
250              those pins on mt7986a.
251            enum: [SYS_WATCHDOG, WF2G_LED, WF5G_LED, I2C_SCL, I2C_SDA, GPIO_0,
252                   GPIO_1, GPIO_2, GPIO_3, GPIO_4, GPIO_5, GPIO_6, GPIO_7,
253                   GPIO_8, GPIO_9, GPIO_10, GPIO_11, GPIO_12, GPIO_13, GPIO_14,
254                   GPIO_15, PWM0, PWM1, SPI0_CLK, SPI0_MOSI, SPI0_MISO, SPI0_CS,
255                   SPI0_HOLD, SPI0_WP, SPI1_CLK, SPI1_MOSI, SPI1_MISO, SPI1_CS,
256                   SPI2_CLK, SPI2_MOSI, SPI2_MISO, SPI2_CS, SPI2_HOLD, SPI2_WP,
257                   UART0_RXD, UART0_TXD, PCIE_PERESET_N, UART1_RXD, UART1_TXD,
258                   UART1_CTS, UART1_RTS, UART2_RXD, UART2_TXD, UART2_CTS,
259                   UART2_RTS, EMMC_DATA_0, EMMC_DATA_1, EMMC_DATA_2,
260                   EMMC_DATA_3, EMMC_DATA_4, EMMC_DATA_5, EMMC_DATA_6,
261                   EMMC_DATA_7, EMMC_CMD, EMMC_CK, EMMC_DSL, EMMC_RSTB, PCM_DTX,
262                   PCM_DRX, PCM_CLK, PCM_FS, MT7531_INT, SMI_MDC, SMI_MDIO,
263                   WF0_DIG_RESETB, WF0_CBA_RESETB, WF0_XO_REQ, WF0_TOP_CLK,
264                   WF0_TOP_DATA, WF0_HB1, WF0_HB2, WF0_HB3, WF0_HB4, WF0_HB0,
265                   WF0_HB0_B, WF0_HB5, WF0_HB6, WF0_HB7, WF0_HB8, WF0_HB9,
266                   WF0_HB10, WF1_DIG_RESETB, WF1_CBA_RESETB, WF1_XO_REQ,
267                   WF1_TOP_CLK, WF1_TOP_DATA, WF1_HB1, WF1_HB2, WF1_HB3,
268                   WF1_HB4, WF1_HB0, WF1_HB0_B, WF1_HB5, WF1_HB6, WF1_HB7,
269                   WF1_HB8]
270
271          bias-disable: true
272
273          bias-pull-up: true
274
275          bias-pull-down: true
276
277          input-enable: true
278
279          input-disable: true
280
281          output-enable: true
282
283          output-low: true
284
285          output-high: true
286
287          input-schmitt-enable: true
288
289          input-schmitt-disable: true
290
291          drive-strength:
292            enum: [2, 4, 6, 8, 10, 12, 14, 16]
293
294          mediatek,pull-up-adv:
295            description: |
296              Valid arguments for 'mediatek,pull-up-adv' are '0', '1', '2', '3'
297              Pull up setings for 2 pull resistors, R0 and R1. Valid arguments
298              are described as below:
299              0: (R1, R0) = (0, 0) which means R1 disabled and R0 disabled.
300              1: (R1, R0) = (0, 1) which means R1 disabled and R0 enabled.
301              2: (R1, R0) = (1, 0) which means R1 enabled and R0 disabled.
302              3: (R1, R0) = (1, 1) which means R1 enabled and R0 enabled.
303            $ref: /schemas/types.yaml#/definitions/uint32
304            enum: [0, 1, 2, 3]
305
306          mediatek,pull-down-adv:
307            description: |
308              Valid arguments for 'mediatek,pull-up-adv' are '0', '1', '2', '3'
309              Pull down setings for 2 pull resistors, R0 and R1. Valid arguments
310              are described as below:
311              0: (R1, R0) = (0, 0) which means R1 disabled and R0 disabled.
312              1: (R1, R0) = (0, 1) which means R1 disabled and R0 enabled.
313              2: (R1, R0) = (1, 0) which means R1 enabled and R0 disabled.
314              3: (R1, R0) = (1, 1) which means R1 enabled and R0 enabled.
315            $ref: /schemas/types.yaml#/definitions/uint32
316            enum: [0, 1, 2, 3]
317
318        required:
319          - pins
320
321additionalProperties: false
322
323examples:
324  - |
325    #include <dt-bindings/interrupt-controller/irq.h>
326    #include <dt-bindings/interrupt-controller/arm-gic.h>
327
328    soc {
329      #address-cells = <2>;
330      #size-cells = <2>;
331      pio: pinctrl@1001f000 {
332        compatible = "mediatek,mt7986a-pinctrl";
333        reg = <0 0x1001f000 0 0x1000>,
334              <0 0x11c30000 0 0x1000>,
335              <0 0x11c40000 0 0x1000>,
336              <0 0x11e20000 0 0x1000>,
337              <0 0x11e30000 0 0x1000>,
338              <0 0x11f00000 0 0x1000>,
339              <0 0x11f10000 0 0x1000>,
340              <0 0x1000b000 0 0x1000>;
341        reg-names = "gpio", "iocfg_rt", "iocfg_rb", "iocfg_lt",
342                    "iocfg_lb", "iocfg_tr", "iocfg_tl", "eint";
343        gpio-controller;
344        #gpio-cells = <2>;
345        gpio-ranges = <&pio 0 0 100>;
346        interrupt-controller;
347        interrupts = <GIC_SPI 225 IRQ_TYPE_LEVEL_HIGH>;
348        interrupt-parent = <&gic>;
349        #interrupt-cells = <2>;
350
351        uart1_pins: uart1-pins {
352          mux {
353            function = "uart";
354            groups = "uart1";
355          };
356        };
357
358        uart2_pins: uart2-pins {
359          mux {
360            function = "uart";
361            groups = "uart2";
362          };
363        };
364
365      };
366    };
367