Linux kernel mirror (for testing)
git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel
os
linux
1// SPDX-License-Identifier: GPL-2.0+
2/*
3 * Driver for Broadcom brcmstb GPIO units (pinctrl only)
4 *
5 * Copyright (C) 2024-2025 Ivan T. Ivanov, Andrea della Porta
6 * Copyright (C) 2021-3 Raspberry Pi Ltd.
7 * Copyright (C) 2012 Chris Boot, Simon Arlott, Stephen Warren
8 *
9 * Based heavily on the BCM2835 GPIO & pinctrl driver, which was inspired by:
10 * pinctrl-nomadik.c, please see original file for copyright information
11 * pinctrl-tegra.c, please see original file for copyright information
12 */
13
14#include <linux/pinctrl/pinctrl.h>
15#include <linux/of.h>
16#include "pinctrl-brcmstb.h"
17
18#define BRCMSTB_FSEL_COUNT 8
19#define BRCMSTB_FSEL_MASK 0xf
20
21#define BRCMSTB_PIN(i, f1, f2, f3, f4, f5, f6, f7, f8) \
22 [i] = { \
23 .funcs = (u8[]) { \
24 func_##f1, \
25 func_##f2, \
26 func_##f3, \
27 func_##f4, \
28 func_##f5, \
29 func_##f6, \
30 func_##f7, \
31 func_##f8, \
32 }, \
33 .n_funcs = BRCMSTB_FSEL_COUNT, \
34 .func_mask = BRCMSTB_FSEL_MASK, \
35 }
36
37enum bcm2712_funcs {
38 func_gpio,
39 func_alt1,
40 func_alt2,
41 func_alt3,
42 func_alt4,
43 func_alt5,
44 func_alt6,
45 func_alt7,
46 func_alt8,
47 func_aon_cpu_standbyb,
48 func_aon_fp_4sec_resetb,
49 func_aon_gpclk,
50 func_aon_pwm,
51 func_arm_jtag,
52 func_aud_fs_clk0,
53 func_avs_pmu_bsc,
54 func_bsc_m0,
55 func_bsc_m1,
56 func_bsc_m2,
57 func_bsc_m3,
58 func_clk_observe,
59 func_ctl_hdmi_5v,
60 func_enet0,
61 func_enet0_mii,
62 func_enet0_rgmii,
63 func_ext_sc_clk,
64 func_fl0,
65 func_fl1,
66 func_gpclk0,
67 func_gpclk1,
68 func_gpclk2,
69 func_hdmi_tx0_auto_i2c,
70 func_hdmi_tx0_bsc,
71 func_hdmi_tx1_auto_i2c,
72 func_hdmi_tx1_bsc,
73 func_i2s_in,
74 func_i2s_out,
75 func_ir_in,
76 func_mtsif,
77 func_mtsif_alt,
78 func_mtsif_alt1,
79 func_pdm,
80 func_pkt,
81 func_pm_led_out,
82 func_sc0,
83 func_sd0,
84 func_sd2,
85 func_sd_card_a,
86 func_sd_card_b,
87 func_sd_card_c,
88 func_sd_card_d,
89 func_sd_card_e,
90 func_sd_card_f,
91 func_sd_card_g,
92 func_spdif_out,
93 func_spi_m,
94 func_spi_s,
95 func_sr_edm_sense,
96 func_te0,
97 func_te1,
98 func_tsio,
99 func_uart0,
100 func_uart1,
101 func_uart2,
102 func_usb_pwr,
103 func_usb_vbus,
104 func_uui,
105 func_vc_i2c0,
106 func_vc_i2c3,
107 func_vc_i2c4,
108 func_vc_i2c5,
109 func_vc_i2csl,
110 func_vc_pcm,
111 func_vc_pwm0,
112 func_vc_pwm1,
113 func_vc_spi0,
114 func_vc_spi3,
115 func_vc_spi4,
116 func_vc_spi5,
117 func_vc_uart0,
118 func_vc_uart2,
119 func_vc_uart3,
120 func_vc_uart4,
121 func__,
122 func_count = func__
123};
124
125static const struct pin_regs bcm2712_c0_gpio_pin_regs[] = {
126 GPIO_REGS(0, 0, 0, 7, 7),
127 GPIO_REGS(1, 0, 1, 7, 8),
128 GPIO_REGS(2, 0, 2, 7, 9),
129 GPIO_REGS(3, 0, 3, 7, 10),
130 GPIO_REGS(4, 0, 4, 7, 11),
131 GPIO_REGS(5, 0, 5, 7, 12),
132 GPIO_REGS(6, 0, 6, 7, 13),
133 GPIO_REGS(7, 0, 7, 7, 14),
134 GPIO_REGS(8, 1, 0, 8, 0),
135 GPIO_REGS(9, 1, 1, 8, 1),
136 GPIO_REGS(10, 1, 2, 8, 2),
137 GPIO_REGS(11, 1, 3, 8, 3),
138 GPIO_REGS(12, 1, 4, 8, 4),
139 GPIO_REGS(13, 1, 5, 8, 5),
140 GPIO_REGS(14, 1, 6, 8, 6),
141 GPIO_REGS(15, 1, 7, 8, 7),
142 GPIO_REGS(16, 2, 0, 8, 8),
143 GPIO_REGS(17, 2, 1, 8, 9),
144 GPIO_REGS(18, 2, 2, 8, 10),
145 GPIO_REGS(19, 2, 3, 8, 11),
146 GPIO_REGS(20, 2, 4, 8, 12),
147 GPIO_REGS(21, 2, 5, 8, 13),
148 GPIO_REGS(22, 2, 6, 8, 14),
149 GPIO_REGS(23, 2, 7, 9, 0),
150 GPIO_REGS(24, 3, 0, 9, 1),
151 GPIO_REGS(25, 3, 1, 9, 2),
152 GPIO_REGS(26, 3, 2, 9, 3),
153 GPIO_REGS(27, 3, 3, 9, 4),
154 GPIO_REGS(28, 3, 4, 9, 5),
155 GPIO_REGS(29, 3, 5, 9, 6),
156 GPIO_REGS(30, 3, 6, 9, 7),
157 GPIO_REGS(31, 3, 7, 9, 8),
158 GPIO_REGS(32, 4, 0, 9, 9),
159 GPIO_REGS(33, 4, 1, 9, 10),
160 GPIO_REGS(34, 4, 2, 9, 11),
161 GPIO_REGS(35, 4, 3, 9, 12),
162 GPIO_REGS(36, 4, 4, 9, 13),
163 GPIO_REGS(37, 4, 5, 9, 14),
164 GPIO_REGS(38, 4, 6, 10, 0),
165 GPIO_REGS(39, 4, 7, 10, 1),
166 GPIO_REGS(40, 5, 0, 10, 2),
167 GPIO_REGS(41, 5, 1, 10, 3),
168 GPIO_REGS(42, 5, 2, 10, 4),
169 GPIO_REGS(43, 5, 3, 10, 5),
170 GPIO_REGS(44, 5, 4, 10, 6),
171 GPIO_REGS(45, 5, 5, 10, 7),
172 GPIO_REGS(46, 5, 6, 10, 8),
173 GPIO_REGS(47, 5, 7, 10, 9),
174 GPIO_REGS(48, 6, 0, 10, 10),
175 GPIO_REGS(49, 6, 1, 10, 11),
176 GPIO_REGS(50, 6, 2, 10, 12),
177 GPIO_REGS(51, 6, 3, 10, 13),
178 GPIO_REGS(52, 6, 4, 10, 14),
179 GPIO_REGS(53, 6, 5, 11, 0),
180 EMMC_REGS(54, 11, 1), /* EMMC_CMD */
181 EMMC_REGS(55, 11, 2), /* EMMC_DS */
182 EMMC_REGS(56, 11, 3), /* EMMC_CLK */
183 EMMC_REGS(57, 11, 4), /* EMMC_DAT0 */
184 EMMC_REGS(58, 11, 5), /* EMMC_DAT1 */
185 EMMC_REGS(59, 11, 6), /* EMMC_DAT2 */
186 EMMC_REGS(60, 11, 7), /* EMMC_DAT3 */
187 EMMC_REGS(61, 11, 8), /* EMMC_DAT4 */
188 EMMC_REGS(62, 11, 9), /* EMMC_DAT5 */
189 EMMC_REGS(63, 11, 10), /* EMMC_DAT6 */
190 EMMC_REGS(64, 11, 11), /* EMMC_DAT7 */
191};
192
193static struct pin_regs bcm2712_c0_aon_gpio_pin_regs[] = {
194 AON_GPIO_REGS(0, 3, 0, 6, 10),
195 AON_GPIO_REGS(1, 3, 1, 6, 11),
196 AON_GPIO_REGS(2, 3, 2, 6, 12),
197 AON_GPIO_REGS(3, 3, 3, 6, 13),
198 AON_GPIO_REGS(4, 3, 4, 6, 14),
199 AON_GPIO_REGS(5, 3, 5, 7, 0),
200 AON_GPIO_REGS(6, 3, 6, 7, 1),
201 AON_GPIO_REGS(7, 3, 7, 7, 2),
202 AON_GPIO_REGS(8, 4, 0, 7, 3),
203 AON_GPIO_REGS(9, 4, 1, 7, 4),
204 AON_GPIO_REGS(10, 4, 2, 7, 5),
205 AON_GPIO_REGS(11, 4, 3, 7, 6),
206 AON_GPIO_REGS(12, 4, 4, 7, 7),
207 AON_GPIO_REGS(13, 4, 5, 7, 8),
208 AON_GPIO_REGS(14, 4, 6, 7, 9),
209 AON_GPIO_REGS(15, 4, 7, 7, 10),
210 AON_GPIO_REGS(16, 5, 0, 7, 11),
211 AON_SGPIO_REGS(0, 0, 0),
212 AON_SGPIO_REGS(1, 0, 1),
213 AON_SGPIO_REGS(2, 0, 2),
214 AON_SGPIO_REGS(3, 0, 3),
215 AON_SGPIO_REGS(4, 1, 0),
216 AON_SGPIO_REGS(5, 2, 0),
217};
218
219static const struct pinctrl_pin_desc bcm2712_c0_gpio_pins[] = {
220 GPIO_PIN(0),
221 GPIO_PIN(1),
222 GPIO_PIN(2),
223 GPIO_PIN(3),
224 GPIO_PIN(4),
225 GPIO_PIN(5),
226 GPIO_PIN(6),
227 GPIO_PIN(7),
228 GPIO_PIN(8),
229 GPIO_PIN(9),
230 GPIO_PIN(10),
231 GPIO_PIN(11),
232 GPIO_PIN(12),
233 GPIO_PIN(13),
234 GPIO_PIN(14),
235 GPIO_PIN(15),
236 GPIO_PIN(16),
237 GPIO_PIN(17),
238 GPIO_PIN(18),
239 GPIO_PIN(19),
240 GPIO_PIN(20),
241 GPIO_PIN(21),
242 GPIO_PIN(22),
243 GPIO_PIN(23),
244 GPIO_PIN(24),
245 GPIO_PIN(25),
246 GPIO_PIN(26),
247 GPIO_PIN(27),
248 GPIO_PIN(28),
249 GPIO_PIN(29),
250 GPIO_PIN(30),
251 GPIO_PIN(31),
252 GPIO_PIN(32),
253 GPIO_PIN(33),
254 GPIO_PIN(34),
255 GPIO_PIN(35),
256 GPIO_PIN(36),
257 GPIO_PIN(37),
258 GPIO_PIN(38),
259 GPIO_PIN(39),
260 GPIO_PIN(40),
261 GPIO_PIN(41),
262 GPIO_PIN(42),
263 GPIO_PIN(43),
264 GPIO_PIN(44),
265 GPIO_PIN(45),
266 GPIO_PIN(46),
267 GPIO_PIN(47),
268 GPIO_PIN(48),
269 GPIO_PIN(49),
270 GPIO_PIN(50),
271 GPIO_PIN(51),
272 GPIO_PIN(52),
273 GPIO_PIN(53),
274 PINCTRL_PIN(54, "emmc_cmd"),
275 PINCTRL_PIN(55, "emmc_ds"),
276 PINCTRL_PIN(56, "emmc_clk"),
277 PINCTRL_PIN(57, "emmc_dat0"),
278 PINCTRL_PIN(58, "emmc_dat1"),
279 PINCTRL_PIN(59, "emmc_dat2"),
280 PINCTRL_PIN(60, "emmc_dat3"),
281 PINCTRL_PIN(61, "emmc_dat4"),
282 PINCTRL_PIN(62, "emmc_dat5"),
283 PINCTRL_PIN(63, "emmc_dat6"),
284 PINCTRL_PIN(64, "emmc_dat7"),
285};
286
287static struct pinctrl_pin_desc bcm2712_c0_aon_gpio_pins[] = {
288 AON_GPIO_PIN(0), AON_GPIO_PIN(1), AON_GPIO_PIN(2), AON_GPIO_PIN(3),
289 AON_GPIO_PIN(4), AON_GPIO_PIN(5), AON_GPIO_PIN(6), AON_GPIO_PIN(7),
290 AON_GPIO_PIN(8), AON_GPIO_PIN(9), AON_GPIO_PIN(10), AON_GPIO_PIN(11),
291 AON_GPIO_PIN(12), AON_GPIO_PIN(13), AON_GPIO_PIN(14), AON_GPIO_PIN(15),
292 AON_GPIO_PIN(16), AON_SGPIO_PIN(0), AON_SGPIO_PIN(1), AON_SGPIO_PIN(2),
293 AON_SGPIO_PIN(3), AON_SGPIO_PIN(4), AON_SGPIO_PIN(5),
294};
295
296static const struct pin_regs bcm2712_d0_gpio_pin_regs[] = {
297 GPIO_REGS(1, 0, 0, 4, 5),
298 GPIO_REGS(2, 0, 1, 4, 6),
299 GPIO_REGS(3, 0, 2, 4, 7),
300 GPIO_REGS(4, 0, 3, 4, 8),
301 GPIO_REGS(10, 0, 4, 4, 9),
302 GPIO_REGS(11, 0, 5, 4, 10),
303 GPIO_REGS(12, 0, 6, 4, 11),
304 GPIO_REGS(13, 0, 7, 4, 12),
305 GPIO_REGS(14, 1, 0, 4, 13),
306 GPIO_REGS(15, 1, 1, 4, 14),
307 GPIO_REGS(18, 1, 2, 5, 0),
308 GPIO_REGS(19, 1, 3, 5, 1),
309 GPIO_REGS(20, 1, 4, 5, 2),
310 GPIO_REGS(21, 1, 5, 5, 3),
311 GPIO_REGS(22, 1, 6, 5, 4),
312 GPIO_REGS(23, 1, 7, 5, 5),
313 GPIO_REGS(24, 2, 0, 5, 6),
314 GPIO_REGS(25, 2, 1, 5, 7),
315 GPIO_REGS(26, 2, 2, 5, 8),
316 GPIO_REGS(27, 2, 3, 5, 9),
317 GPIO_REGS(28, 2, 4, 5, 10),
318 GPIO_REGS(29, 2, 5, 5, 11),
319 GPIO_REGS(30, 2, 6, 5, 12),
320 GPIO_REGS(31, 2, 7, 5, 13),
321 GPIO_REGS(32, 3, 0, 5, 14),
322 GPIO_REGS(33, 3, 1, 6, 0),
323 GPIO_REGS(34, 3, 2, 6, 1),
324 GPIO_REGS(35, 3, 3, 6, 2),
325 EMMC_REGS(36, 6, 3), /* EMMC_CMD */
326 EMMC_REGS(37, 6, 4), /* EMMC_DS */
327 EMMC_REGS(38, 6, 5), /* EMMC_CLK */
328 EMMC_REGS(39, 6, 6), /* EMMC_DAT0 */
329 EMMC_REGS(40, 6, 7), /* EMMC_DAT1 */
330 EMMC_REGS(41, 6, 8), /* EMMC_DAT2 */
331 EMMC_REGS(42, 6, 9), /* EMMC_DAT3 */
332 EMMC_REGS(43, 6, 10), /* EMMC_DAT4 */
333 EMMC_REGS(44, 6, 11), /* EMMC_DAT5 */
334 EMMC_REGS(45, 6, 12), /* EMMC_DAT6 */
335 EMMC_REGS(46, 6, 13), /* EMMC_DAT7 */
336};
337
338static struct pin_regs bcm2712_d0_aon_gpio_pin_regs[] = {
339 AON_GPIO_REGS(0, 3, 0, 5, 9),
340 AON_GPIO_REGS(1, 3, 1, 5, 10),
341 AON_GPIO_REGS(2, 3, 2, 5, 11),
342 AON_GPIO_REGS(3, 3, 3, 5, 12),
343 AON_GPIO_REGS(4, 3, 4, 5, 13),
344 AON_GPIO_REGS(5, 3, 5, 5, 14),
345 AON_GPIO_REGS(6, 3, 6, 6, 0),
346 AON_GPIO_REGS(8, 3, 7, 6, 1),
347 AON_GPIO_REGS(9, 4, 0, 6, 2),
348 AON_GPIO_REGS(12, 4, 1, 6, 3),
349 AON_GPIO_REGS(13, 4, 2, 6, 4),
350 AON_GPIO_REGS(14, 4, 3, 6, 5),
351 AON_SGPIO_REGS(0, 0, 0),
352 AON_SGPIO_REGS(1, 0, 1),
353 AON_SGPIO_REGS(2, 0, 2),
354 AON_SGPIO_REGS(3, 0, 3),
355 AON_SGPIO_REGS(4, 1, 0),
356 AON_SGPIO_REGS(5, 2, 0),
357};
358
359static const struct pinctrl_pin_desc bcm2712_d0_gpio_pins[] = {
360 GPIO_PIN(1),
361 GPIO_PIN(2),
362 GPIO_PIN(3),
363 GPIO_PIN(4),
364 GPIO_PIN(10),
365 GPIO_PIN(11),
366 GPIO_PIN(12),
367 GPIO_PIN(13),
368 GPIO_PIN(14),
369 GPIO_PIN(15),
370 GPIO_PIN(18),
371 GPIO_PIN(19),
372 GPIO_PIN(20),
373 GPIO_PIN(21),
374 GPIO_PIN(22),
375 GPIO_PIN(23),
376 GPIO_PIN(24),
377 GPIO_PIN(25),
378 GPIO_PIN(26),
379 GPIO_PIN(27),
380 GPIO_PIN(28),
381 GPIO_PIN(29),
382 GPIO_PIN(30),
383 GPIO_PIN(31),
384 GPIO_PIN(32),
385 GPIO_PIN(33),
386 GPIO_PIN(34),
387 GPIO_PIN(35),
388 PINCTRL_PIN(36, "emmc_cmd"),
389 PINCTRL_PIN(37, "emmc_ds"),
390 PINCTRL_PIN(38, "emmc_clk"),
391 PINCTRL_PIN(39, "emmc_dat0"),
392 PINCTRL_PIN(40, "emmc_dat1"),
393 PINCTRL_PIN(41, "emmc_dat2"),
394 PINCTRL_PIN(42, "emmc_dat3"),
395 PINCTRL_PIN(43, "emmc_dat4"),
396 PINCTRL_PIN(44, "emmc_dat5"),
397 PINCTRL_PIN(45, "emmc_dat6"),
398 PINCTRL_PIN(46, "emmc_dat7"),
399};
400
401static struct pinctrl_pin_desc bcm2712_d0_aon_gpio_pins[] = {
402 AON_GPIO_PIN(0), AON_GPIO_PIN(1), AON_GPIO_PIN(2), AON_GPIO_PIN(3),
403 AON_GPIO_PIN(4), AON_GPIO_PIN(5), AON_GPIO_PIN(6), AON_GPIO_PIN(8),
404 AON_GPIO_PIN(9), AON_GPIO_PIN(12), AON_GPIO_PIN(13), AON_GPIO_PIN(14),
405 AON_SGPIO_PIN(0), AON_SGPIO_PIN(1), AON_SGPIO_PIN(2),
406 AON_SGPIO_PIN(3), AON_SGPIO_PIN(4), AON_SGPIO_PIN(5),
407};
408
409static const char * const bcm2712_func_names[] = {
410 BRCMSTB_FUNC(gpio),
411 BRCMSTB_FUNC(alt1),
412 BRCMSTB_FUNC(alt2),
413 BRCMSTB_FUNC(alt3),
414 BRCMSTB_FUNC(alt4),
415 BRCMSTB_FUNC(alt5),
416 BRCMSTB_FUNC(alt6),
417 BRCMSTB_FUNC(alt7),
418 BRCMSTB_FUNC(alt8),
419 BRCMSTB_FUNC(aon_cpu_standbyb),
420 BRCMSTB_FUNC(aon_fp_4sec_resetb),
421 BRCMSTB_FUNC(aon_gpclk),
422 BRCMSTB_FUNC(aon_pwm),
423 BRCMSTB_FUNC(arm_jtag),
424 BRCMSTB_FUNC(aud_fs_clk0),
425 BRCMSTB_FUNC(avs_pmu_bsc),
426 BRCMSTB_FUNC(bsc_m0),
427 BRCMSTB_FUNC(bsc_m1),
428 BRCMSTB_FUNC(bsc_m2),
429 BRCMSTB_FUNC(bsc_m3),
430 BRCMSTB_FUNC(clk_observe),
431 BRCMSTB_FUNC(ctl_hdmi_5v),
432 BRCMSTB_FUNC(enet0),
433 BRCMSTB_FUNC(enet0_mii),
434 BRCMSTB_FUNC(enet0_rgmii),
435 BRCMSTB_FUNC(ext_sc_clk),
436 BRCMSTB_FUNC(fl0),
437 BRCMSTB_FUNC(fl1),
438 BRCMSTB_FUNC(gpclk0),
439 BRCMSTB_FUNC(gpclk1),
440 BRCMSTB_FUNC(gpclk2),
441 BRCMSTB_FUNC(hdmi_tx0_auto_i2c),
442 BRCMSTB_FUNC(hdmi_tx0_bsc),
443 BRCMSTB_FUNC(hdmi_tx1_auto_i2c),
444 BRCMSTB_FUNC(hdmi_tx1_bsc),
445 BRCMSTB_FUNC(i2s_in),
446 BRCMSTB_FUNC(i2s_out),
447 BRCMSTB_FUNC(ir_in),
448 BRCMSTB_FUNC(mtsif),
449 BRCMSTB_FUNC(mtsif_alt),
450 BRCMSTB_FUNC(mtsif_alt1),
451 BRCMSTB_FUNC(pdm),
452 BRCMSTB_FUNC(pkt),
453 BRCMSTB_FUNC(pm_led_out),
454 BRCMSTB_FUNC(sc0),
455 BRCMSTB_FUNC(sd0),
456 BRCMSTB_FUNC(sd2),
457 BRCMSTB_FUNC(sd_card_a),
458 BRCMSTB_FUNC(sd_card_b),
459 BRCMSTB_FUNC(sd_card_c),
460 BRCMSTB_FUNC(sd_card_d),
461 BRCMSTB_FUNC(sd_card_e),
462 BRCMSTB_FUNC(sd_card_f),
463 BRCMSTB_FUNC(sd_card_g),
464 BRCMSTB_FUNC(spdif_out),
465 BRCMSTB_FUNC(spi_m),
466 BRCMSTB_FUNC(spi_s),
467 BRCMSTB_FUNC(sr_edm_sense),
468 BRCMSTB_FUNC(te0),
469 BRCMSTB_FUNC(te1),
470 BRCMSTB_FUNC(tsio),
471 BRCMSTB_FUNC(uart0),
472 BRCMSTB_FUNC(uart1),
473 BRCMSTB_FUNC(uart2),
474 BRCMSTB_FUNC(usb_pwr),
475 BRCMSTB_FUNC(usb_vbus),
476 BRCMSTB_FUNC(uui),
477 BRCMSTB_FUNC(vc_i2c0),
478 BRCMSTB_FUNC(vc_i2c3),
479 BRCMSTB_FUNC(vc_i2c4),
480 BRCMSTB_FUNC(vc_i2c5),
481 BRCMSTB_FUNC(vc_i2csl),
482 BRCMSTB_FUNC(vc_pcm),
483 BRCMSTB_FUNC(vc_pwm0),
484 BRCMSTB_FUNC(vc_pwm1),
485 BRCMSTB_FUNC(vc_spi0),
486 BRCMSTB_FUNC(vc_spi3),
487 BRCMSTB_FUNC(vc_spi4),
488 BRCMSTB_FUNC(vc_spi5),
489 BRCMSTB_FUNC(vc_uart0),
490 BRCMSTB_FUNC(vc_uart2),
491 BRCMSTB_FUNC(vc_uart3),
492 BRCMSTB_FUNC(vc_uart4),
493};
494
495static const struct brcmstb_pin_funcs bcm2712_c0_aon_gpio_pin_funcs[] = {
496 BRCMSTB_PIN(0, ir_in, vc_spi0, vc_uart3, vc_i2c3, te0, vc_i2c0, _, _),
497 BRCMSTB_PIN(1, vc_pwm0, vc_spi0, vc_uart3, vc_i2c3, te1, aon_pwm, vc_i2c0, vc_pwm1),
498 BRCMSTB_PIN(2, vc_pwm0, vc_spi0, vc_uart3, ctl_hdmi_5v, fl0, aon_pwm, ir_in, vc_pwm1),
499 BRCMSTB_PIN(3, ir_in, vc_spi0, vc_uart3, aon_fp_4sec_resetb, fl1, sd_card_g, aon_gpclk, _),
500 BRCMSTB_PIN(4, gpclk0, vc_spi0, vc_i2csl, aon_gpclk, pm_led_out, aon_pwm, sd_card_g, vc_pwm0),
501 BRCMSTB_PIN(5, gpclk1, ir_in, vc_i2csl, clk_observe, aon_pwm, sd_card_g, vc_pwm0, _),
502 BRCMSTB_PIN(6, uart1, vc_uart4, gpclk2, ctl_hdmi_5v, vc_uart0, vc_spi3, _, _),
503 BRCMSTB_PIN(7, uart1, vc_uart4, gpclk0, aon_pwm, vc_uart0, vc_spi3, _, _),
504 BRCMSTB_PIN(8, uart1, vc_uart4, vc_i2csl, ctl_hdmi_5v, vc_uart0, vc_spi3, _, _),
505 BRCMSTB_PIN(9, uart1, vc_uart4, vc_i2csl, aon_pwm, vc_uart0, vc_spi3, _, _),
506 BRCMSTB_PIN(10, tsio, ctl_hdmi_5v, sc0, spdif_out, vc_spi5, usb_pwr, aon_gpclk, sd_card_f),
507 BRCMSTB_PIN(11, tsio, uart0, sc0, aud_fs_clk0, vc_spi5, usb_vbus, vc_uart2, sd_card_f),
508 BRCMSTB_PIN(12, tsio, uart0, vc_uart0, tsio, vc_spi5, usb_pwr, vc_uart2, sd_card_f),
509 BRCMSTB_PIN(13, bsc_m1, uart0, vc_uart0, uui, vc_spi5, arm_jtag, vc_uart2, vc_i2c3),
510 BRCMSTB_PIN(14, bsc_m1, uart0, vc_uart0, uui, vc_spi5, arm_jtag, vc_uart2, vc_i2c3),
511 BRCMSTB_PIN(15, ir_in, aon_fp_4sec_resetb, vc_uart0, pm_led_out, ctl_hdmi_5v, aon_pwm, aon_gpclk, _),
512 BRCMSTB_PIN(16, aon_cpu_standbyb, gpclk0, pm_led_out, ctl_hdmi_5v, vc_pwm0, usb_pwr, aud_fs_clk0, _),
513};
514
515static const struct brcmstb_pin_funcs bcm2712_c0_gpio_pin_funcs[] = {
516 BRCMSTB_PIN(0, bsc_m3, vc_i2c0, gpclk0, enet0, vc_pwm1, vc_spi0, ir_in, _),
517 BRCMSTB_PIN(1, bsc_m3, vc_i2c0, gpclk1, enet0, vc_pwm1, sr_edm_sense, vc_spi0, vc_uart3),
518 BRCMSTB_PIN(2, pdm, i2s_in, gpclk2, vc_spi4, pkt, vc_spi0, vc_uart3, _),
519 BRCMSTB_PIN(3, pdm, i2s_in, vc_spi4, pkt, vc_spi0, vc_uart3, _, _),
520 BRCMSTB_PIN(4, pdm, i2s_in, arm_jtag, vc_spi4, pkt, vc_spi0, vc_uart3, _),
521 BRCMSTB_PIN(5, pdm, vc_i2c3, arm_jtag, sd_card_e, vc_spi4, pkt, vc_pcm, vc_i2c5),
522 BRCMSTB_PIN(6, pdm, vc_i2c3, arm_jtag, sd_card_e, vc_spi4, pkt, vc_pcm, vc_i2c5),
523 BRCMSTB_PIN(7, i2s_out, spdif_out, arm_jtag, sd_card_e, vc_i2c3, enet0_rgmii, vc_pcm, vc_spi4),
524 BRCMSTB_PIN(8, i2s_out, aud_fs_clk0, arm_jtag, sd_card_e, vc_i2c3, enet0_mii, vc_pcm, vc_spi4),
525 BRCMSTB_PIN(9, i2s_out, aud_fs_clk0, arm_jtag, sd_card_e, enet0_mii, sd_card_c, vc_spi4, _),
526 BRCMSTB_PIN(10, bsc_m3, mtsif_alt1, i2s_in, i2s_out, vc_spi5, enet0_mii, sd_card_c, vc_spi4),
527 BRCMSTB_PIN(11, bsc_m3, mtsif_alt1, i2s_in, i2s_out, vc_spi5, enet0_mii, sd_card_c, vc_spi4),
528 BRCMSTB_PIN(12, spi_s, mtsif_alt1, i2s_in, i2s_out, vc_spi5, vc_i2csl, sd0, sd_card_d),
529 BRCMSTB_PIN(13, spi_s, mtsif_alt1, i2s_out, usb_vbus, vc_spi5, vc_i2csl, sd0, sd_card_d),
530 BRCMSTB_PIN(14, spi_s, vc_i2csl, enet0_rgmii, arm_jtag, vc_spi5, vc_pwm0, vc_i2c4, sd_card_d),
531 BRCMSTB_PIN(15, spi_s, vc_i2csl, vc_spi3, arm_jtag, vc_pwm0, vc_i2c4, gpclk0, _),
532 BRCMSTB_PIN(16, sd_card_b, i2s_out, vc_spi3, i2s_in, sd0, enet0_rgmii, gpclk1, _),
533 BRCMSTB_PIN(17, sd_card_b, i2s_out, vc_spi3, i2s_in, ext_sc_clk, sd0, enet0_rgmii, gpclk2),
534 BRCMSTB_PIN(18, sd_card_b, i2s_out, vc_spi3, i2s_in, sd0, enet0_rgmii, vc_pwm1, _),
535 BRCMSTB_PIN(19, sd_card_b, usb_pwr, vc_spi3, pkt, spdif_out, sd0, ir_in, vc_pwm1),
536 BRCMSTB_PIN(20, sd_card_b, uui, vc_uart0, arm_jtag, uart2, usb_pwr, vc_pcm, vc_uart4),
537 BRCMSTB_PIN(21, usb_pwr, uui, vc_uart0, arm_jtag, uart2, sd_card_b, vc_pcm, vc_uart4),
538 BRCMSTB_PIN(22, usb_pwr, enet0, vc_uart0, mtsif, uart2, usb_vbus, vc_pcm, vc_i2c5),
539 BRCMSTB_PIN(23, usb_vbus, enet0, vc_uart0, mtsif, uart2, i2s_out, vc_pcm, vc_i2c5),
540 BRCMSTB_PIN(24, mtsif, pkt, uart0, enet0_rgmii, enet0_rgmii, vc_i2c4, vc_uart3, _),
541 BRCMSTB_PIN(25, mtsif, pkt, sc0, uart0, enet0_rgmii, enet0_rgmii, vc_i2c4, vc_uart3),
542 BRCMSTB_PIN(26, mtsif, pkt, sc0, uart0, enet0_rgmii, vc_uart4, vc_spi5, _),
543 BRCMSTB_PIN(27, mtsif, pkt, sc0, uart0, enet0_rgmii, vc_uart4, vc_spi5, _),
544 BRCMSTB_PIN(28, mtsif, pkt, sc0, enet0_rgmii, vc_uart4, vc_spi5, _, _),
545 BRCMSTB_PIN(29, mtsif, pkt, sc0, enet0_rgmii, vc_uart4, vc_spi5, _, _),
546 BRCMSTB_PIN(30, mtsif, pkt, sc0, sd2, enet0_rgmii, gpclk0, vc_pwm0, _),
547 BRCMSTB_PIN(31, mtsif, pkt, sc0, sd2, enet0_rgmii, vc_spi3, vc_pwm0, _),
548 BRCMSTB_PIN(32, mtsif, pkt, sc0, sd2, enet0_rgmii, vc_spi3, vc_uart3, _),
549 BRCMSTB_PIN(33, mtsif, pkt, sd2, enet0_rgmii, vc_spi3, vc_uart3, _, _),
550 BRCMSTB_PIN(34, mtsif, pkt, ext_sc_clk, sd2, enet0_rgmii, vc_spi3, vc_i2c5, _),
551 BRCMSTB_PIN(35, mtsif, pkt, sd2, enet0_rgmii, vc_spi3, vc_i2c5, _, _),
552 BRCMSTB_PIN(36, sd0, mtsif, sc0, i2s_in, vc_uart3, vc_uart2, _, _),
553 BRCMSTB_PIN(37, sd0, mtsif, sc0, vc_spi0, i2s_in, vc_uart3, vc_uart2, _),
554 BRCMSTB_PIN(38, sd0, mtsif_alt, sc0, vc_spi0, i2s_in, vc_uart3, vc_uart2, _),
555 BRCMSTB_PIN(39, sd0, mtsif_alt, sc0, vc_spi0, vc_uart3, vc_uart2, _, _),
556 BRCMSTB_PIN(40, sd0, mtsif_alt, sc0, vc_spi0, bsc_m3, _, _, _),
557 BRCMSTB_PIN(41, sd0, mtsif_alt, sc0, vc_spi0, bsc_m3, _, _, _),
558 BRCMSTB_PIN(42, vc_spi0, mtsif_alt, vc_i2c0, sd_card_a, mtsif_alt1, arm_jtag, pdm, spi_m),
559 BRCMSTB_PIN(43, vc_spi0, mtsif_alt, vc_i2c0, sd_card_a, mtsif_alt1, arm_jtag, pdm, spi_m),
560 BRCMSTB_PIN(44, vc_spi0, mtsif_alt, enet0, sd_card_a, mtsif_alt1, arm_jtag, pdm, spi_m),
561 BRCMSTB_PIN(45, vc_spi0, mtsif_alt, enet0, sd_card_a, mtsif_alt1, arm_jtag, pdm, spi_m),
562 BRCMSTB_PIN(46, vc_spi0, mtsif_alt, sd_card_a, mtsif_alt1, arm_jtag, pdm, spi_m, _),
563 BRCMSTB_PIN(47, enet0, mtsif_alt, i2s_out, mtsif_alt1, arm_jtag, _, _, _),
564 BRCMSTB_PIN(48, sc0, usb_pwr, spdif_out, mtsif, _, _, _, _),
565 BRCMSTB_PIN(49, sc0, usb_pwr, aud_fs_clk0, mtsif, _, _, _, _),
566 BRCMSTB_PIN(50, sc0, usb_vbus, sc0, _, _, _, _, _),
567 BRCMSTB_PIN(51, sc0, enet0, sc0, sr_edm_sense, _, _, _, _),
568 BRCMSTB_PIN(52, sc0, enet0, vc_pwm1, _, _, _, _, _),
569 BRCMSTB_PIN(53, sc0, enet0_rgmii, ext_sc_clk, _, _, _, _, _),
570};
571
572static const struct brcmstb_pin_funcs bcm2712_d0_aon_gpio_pin_funcs[] = {
573 BRCMSTB_PIN(0, ir_in, vc_spi0, vc_uart0, vc_i2c3, uart0, vc_i2c0, _, _),
574 BRCMSTB_PIN(1, vc_pwm0, vc_spi0, vc_uart0, vc_i2c3, uart0, aon_pwm, vc_i2c0, vc_pwm1),
575 BRCMSTB_PIN(2, vc_pwm0, vc_spi0, vc_uart0, ctl_hdmi_5v, uart0, aon_pwm, ir_in, vc_pwm1),
576 BRCMSTB_PIN(3, ir_in, vc_spi0, vc_uart0, uart0, sd_card_g, aon_gpclk, _, _),
577 BRCMSTB_PIN(4, gpclk0, vc_spi0, pm_led_out, aon_pwm, sd_card_g, vc_pwm0, _, _),
578 BRCMSTB_PIN(5, gpclk1, ir_in, aon_pwm, sd_card_g, vc_pwm0, _, _, _),
579 BRCMSTB_PIN(6, uart1, vc_uart2, ctl_hdmi_5v, gpclk2, vc_spi3, _, _, _),
580 BRCMSTB_PIN(7, _, _, _, _, _, _, _, _), /* non-existent on D0 silicon */
581 BRCMSTB_PIN(8, uart1, vc_uart2, ctl_hdmi_5v, vc_spi0, vc_spi3, _, _, _),
582 BRCMSTB_PIN(9, uart1, vc_uart2, vc_uart0, aon_pwm, vc_spi0, vc_uart2, vc_spi3, _),
583 BRCMSTB_PIN(10, _, _, _, _, _, _, _, _), /* non-existent on D0 silicon */
584 BRCMSTB_PIN(11, _, _, _, _, _, _, _, _), /* non-existent on D0 silicon */
585 BRCMSTB_PIN(12, uart1, vc_uart2, vc_uart0, vc_spi0, usb_pwr, vc_uart2, vc_spi3, _),
586 BRCMSTB_PIN(13, bsc_m1, vc_uart0, uui, vc_spi0, arm_jtag, vc_uart2, vc_i2c3, _),
587 BRCMSTB_PIN(14, bsc_m1, aon_gpclk, vc_uart0, uui, vc_spi0, arm_jtag, vc_uart2, vc_i2c3),
588};
589
590static const struct brcmstb_pin_funcs bcm2712_d0_gpio_pin_funcs[] = {
591 BRCMSTB_PIN(1, vc_i2c0, usb_pwr, gpclk0, sd_card_e, vc_spi3, sr_edm_sense, vc_spi0, vc_uart0),
592 BRCMSTB_PIN(2, vc_i2c0, usb_pwr, gpclk1, sd_card_e, vc_spi3, clk_observe, vc_spi0, vc_uart0),
593 BRCMSTB_PIN(3, vc_i2c3, usb_vbus, gpclk2, sd_card_e, vc_spi3, vc_spi0, vc_uart0, _),
594 BRCMSTB_PIN(4, vc_i2c3, vc_pwm1, vc_spi3, sd_card_e, vc_spi3, vc_spi0, vc_uart0, _),
595 BRCMSTB_PIN(10, bsc_m3, vc_pwm1, vc_spi3, sd_card_e, vc_spi3, gpclk0, _, _),
596 BRCMSTB_PIN(11, bsc_m3, vc_spi3, clk_observe, sd_card_c, gpclk1, _, _, _),
597 BRCMSTB_PIN(12, spi_s, vc_spi3, sd_card_c, sd_card_d, _, _, _, _),
598 BRCMSTB_PIN(13, spi_s, vc_spi3, sd_card_c, sd_card_d, _, _, _, _),
599 BRCMSTB_PIN(14, spi_s, uui, arm_jtag, vc_pwm0, vc_i2c0, sd_card_d, _, _),
600 BRCMSTB_PIN(15, spi_s, uui, arm_jtag, vc_pwm0, vc_i2c0, gpclk0, _, _),
601 BRCMSTB_PIN(18, sd_card_f, vc_pwm1, _, _, _, _, _, _),
602 BRCMSTB_PIN(19, sd_card_f, usb_pwr, vc_pwm1, _, _, _, _, _),
603 BRCMSTB_PIN(20, vc_i2c3, uui, vc_uart0, arm_jtag, vc_uart2, _, _, _),
604 BRCMSTB_PIN(21, vc_i2c3, uui, vc_uart0, arm_jtag, vc_uart2, _, _, _),
605 BRCMSTB_PIN(22, sd_card_f, vc_uart0, vc_i2c3, _, _, _, _, _),
606 BRCMSTB_PIN(23, vc_uart0, vc_i2c3, _, _, _, _, _, _),
607 BRCMSTB_PIN(24, sd_card_b, vc_spi0, arm_jtag, uart0, usb_pwr, vc_uart2, vc_uart0, _),
608 BRCMSTB_PIN(25, sd_card_b, vc_spi0, arm_jtag, uart0, usb_pwr, vc_uart2, vc_uart0, _),
609 BRCMSTB_PIN(26, sd_card_b, vc_spi0, arm_jtag, uart0, usb_vbus, vc_uart2, vc_spi0, _),
610 BRCMSTB_PIN(27, sd_card_b, vc_spi0, arm_jtag, uart0, vc_uart2, vc_spi0, _, _),
611 BRCMSTB_PIN(28, sd_card_b, vc_spi0, arm_jtag, vc_i2c0, vc_spi0, _, _, _),
612 BRCMSTB_PIN(29, arm_jtag, vc_i2c0, vc_spi0, _, _, _, _, _),
613 BRCMSTB_PIN(30, sd2, gpclk0, vc_pwm0, _, _, _, _, _),
614 BRCMSTB_PIN(31, sd2, vc_spi3, vc_pwm0, _, _, _, _, _),
615 BRCMSTB_PIN(32, sd2, vc_spi3, vc_uart3, _, _, _, _, _),
616 BRCMSTB_PIN(33, sd2, vc_spi3, vc_uart3, _, _, _, _, _),
617 BRCMSTB_PIN(34, sd2, vc_spi3, vc_i2c5, _, _, _, _, _),
618 BRCMSTB_PIN(35, sd2, vc_spi3, vc_i2c5, _, _, _, _, _),
619};
620
621static const struct pinctrl_desc bcm2712_c0_pinctrl_desc = {
622 .name = "pinctrl-bcm2712",
623 .pins = bcm2712_c0_gpio_pins,
624 .npins = ARRAY_SIZE(bcm2712_c0_gpio_pins),
625};
626
627static const struct pinctrl_desc bcm2712_c0_aon_pinctrl_desc = {
628 .name = "aon-pinctrl-bcm2712",
629 .pins = bcm2712_c0_aon_gpio_pins,
630 .npins = ARRAY_SIZE(bcm2712_c0_aon_gpio_pins),
631};
632
633static const struct pinctrl_desc bcm2712_d0_pinctrl_desc = {
634 .name = "pinctrl-bcm2712",
635 .pins = bcm2712_d0_gpio_pins,
636 .npins = ARRAY_SIZE(bcm2712_d0_gpio_pins),
637};
638
639static const struct pinctrl_desc bcm2712_d0_aon_pinctrl_desc = {
640 .name = "aon-pinctrl-bcm2712",
641 .pins = bcm2712_d0_aon_gpio_pins,
642 .npins = ARRAY_SIZE(bcm2712_d0_aon_gpio_pins),
643};
644
645static const struct pinctrl_gpio_range bcm2712_c0_pinctrl_gpio_range = {
646 .name = "pinctrl-bcm2712",
647 .npins = ARRAY_SIZE(bcm2712_c0_gpio_pins),
648};
649
650static const struct pinctrl_gpio_range bcm2712_c0_aon_pinctrl_gpio_range = {
651 .name = "aon-pinctrl-bcm2712",
652 .npins = ARRAY_SIZE(bcm2712_c0_aon_gpio_pins),
653};
654
655static const struct pinctrl_gpio_range bcm2712_d0_pinctrl_gpio_range = {
656 .name = "pinctrl-bcm2712",
657 .npins = ARRAY_SIZE(bcm2712_d0_gpio_pins),
658};
659
660static const struct pinctrl_gpio_range bcm2712_d0_aon_pinctrl_gpio_range = {
661 .name = "aon-pinctrl-bcm2712",
662 .npins = ARRAY_SIZE(bcm2712_d0_aon_gpio_pins),
663};
664
665static const struct brcmstb_pdata bcm2712_c0_pdata = {
666 .pctl_desc = &bcm2712_c0_pinctrl_desc,
667 .gpio_range = &bcm2712_c0_pinctrl_gpio_range,
668 .pin_regs = bcm2712_c0_gpio_pin_regs,
669 .pin_funcs = bcm2712_c0_gpio_pin_funcs,
670 .func_count = func_count,
671 .func_gpio = func_gpio,
672 .func_names = bcm2712_func_names,
673};
674
675static const struct brcmstb_pdata bcm2712_c0_aon_pdata = {
676 .pctl_desc = &bcm2712_c0_aon_pinctrl_desc,
677 .gpio_range = &bcm2712_c0_aon_pinctrl_gpio_range,
678 .pin_regs = bcm2712_c0_aon_gpio_pin_regs,
679 .pin_funcs = bcm2712_c0_aon_gpio_pin_funcs,
680 .func_count = func_count,
681 .func_gpio = func_gpio,
682 .func_names = bcm2712_func_names,
683};
684
685static const struct brcmstb_pdata bcm2712_d0_pdata = {
686 .pctl_desc = &bcm2712_d0_pinctrl_desc,
687 .gpio_range = &bcm2712_d0_pinctrl_gpio_range,
688 .pin_regs = bcm2712_d0_gpio_pin_regs,
689 .pin_funcs = bcm2712_d0_gpio_pin_funcs,
690 .func_count = func_count,
691 .func_gpio = func_gpio,
692 .func_names = bcm2712_func_names,
693};
694
695static const struct brcmstb_pdata bcm2712_d0_aon_pdata = {
696 .pctl_desc = &bcm2712_d0_aon_pinctrl_desc,
697 .gpio_range = &bcm2712_d0_aon_pinctrl_gpio_range,
698 .pin_regs = bcm2712_d0_aon_gpio_pin_regs,
699 .pin_funcs = bcm2712_d0_aon_gpio_pin_funcs,
700 .func_count = func_count,
701 .func_gpio = func_gpio,
702 .func_names = bcm2712_func_names,
703};
704
705static int bcm2712_pinctrl_probe(struct platform_device *pdev)
706{
707 return brcmstb_pinctrl_probe(pdev);
708}
709
710static const struct of_device_id bcm2712_pinctrl_match[] = {
711 {
712 .compatible = "brcm,bcm2712c0-pinctrl",
713 .data = &bcm2712_c0_pdata
714 },
715 {
716 .compatible = "brcm,bcm2712c0-aon-pinctrl",
717 .data = &bcm2712_c0_aon_pdata
718 },
719
720 {
721 .compatible = "brcm,bcm2712d0-pinctrl",
722 .data = &bcm2712_d0_pdata
723 },
724 {
725 .compatible = "brcm,bcm2712d0-aon-pinctrl",
726 .data = &bcm2712_d0_aon_pdata
727 },
728 { /* sentinel */ }
729};
730MODULE_DEVICE_TABLE(of, bcm2712_pinctrl_match);
731
732static struct platform_driver bcm2712_pinctrl_driver = {
733 .probe = bcm2712_pinctrl_probe,
734 .driver = {
735 .name = "pinctrl-bcm2712",
736 .of_match_table = bcm2712_pinctrl_match,
737 .suppress_bind_attrs = true,
738 },
739};
740module_platform_driver(bcm2712_pinctrl_driver);
741
742MODULE_AUTHOR("Phil Elwell");
743MODULE_AUTHOR("Jonathan Bell");
744MODULE_AUTHOR("Ivan T. Ivanov");
745MODULE_AUTHOR("Andrea della Porta");
746MODULE_DESCRIPTION("Broadcom BCM2712 pinctrl driver");
747MODULE_LICENSE("GPL");