]> git.proxmox.com Git - mirror_ubuntu-eoan-kernel.git/blob - drivers/pinctrl/pinctrl-pistachio.c
brcmsmac: remove set but not used variables 'phybw40, maxtargetpwr'
[mirror_ubuntu-eoan-kernel.git] / drivers / pinctrl / pinctrl-pistachio.c
1 /*
2 * Pistachio SoC pinctrl driver
3 *
4 * Copyright (C) 2014 Imagination Technologies Ltd.
5 * Copyright (C) 2014 Google, Inc.
6 *
7 * This program is free software; you can redistribute it and/or modify it
8 * under the terms and conditions of the GNU General Public License,
9 * version 2, as published by the Free Software Foundation.
10 */
11
12 #include <linux/gpio/driver.h>
13 #include <linux/interrupt.h>
14 #include <linux/io.h>
15 #include <linux/irq.h>
16 #include <linux/of.h>
17 #include <linux/of_irq.h>
18 #include <linux/pinctrl/pinconf.h>
19 #include <linux/pinctrl/pinconf-generic.h>
20 #include <linux/pinctrl/pinctrl.h>
21 #include <linux/pinctrl/pinmux.h>
22 #include <linux/platform_device.h>
23 #include <linux/slab.h>
24 #include <linux/spinlock.h>
25
26 #include "pinctrl-utils.h"
27
28 #define PADS_SCHMITT_EN0 0x000
29 #define PADS_SCHMITT_EN_REG(pin) (PADS_SCHMITT_EN0 + 0x4 * ((pin) / 32))
30 #define PADS_SCHMITT_EN_BIT(pin) BIT((pin) % 32)
31
32 #define PADS_PU_PD0 0x040
33 #define PADS_PU_PD_REG(pin) (PADS_PU_PD0 + 0x4 * ((pin) / 16))
34 #define PADS_PU_PD_SHIFT(pin) (2 * ((pin) % 16))
35 #define PADS_PU_PD_MASK 0x3
36 #define PADS_PU_PD_HIGHZ 0x0
37 #define PADS_PU_PD_UP 0x1
38 #define PADS_PU_PD_DOWN 0x2
39 #define PADS_PU_PD_BUS 0x3
40
41 #define PADS_FUNCTION_SELECT0 0x0c0
42 #define PADS_FUNCTION_SELECT1 0x0c4
43 #define PADS_FUNCTION_SELECT2 0x0c8
44 #define PADS_SCENARIO_SELECT 0x0f8
45
46 #define PADS_SLEW_RATE0 0x100
47 #define PADS_SLEW_RATE_REG(pin) (PADS_SLEW_RATE0 + 0x4 * ((pin) / 32))
48 #define PADS_SLEW_RATE_BIT(pin) BIT((pin) % 32)
49
50 #define PADS_DRIVE_STRENGTH0 0x120
51 #define PADS_DRIVE_STRENGTH_REG(pin) \
52 (PADS_DRIVE_STRENGTH0 + 0x4 * ((pin) / 16))
53 #define PADS_DRIVE_STRENGTH_SHIFT(pin) (2 * ((pin) % 16))
54 #define PADS_DRIVE_STRENGTH_MASK 0x3
55 #define PADS_DRIVE_STRENGTH_2MA 0x0
56 #define PADS_DRIVE_STRENGTH_4MA 0x1
57 #define PADS_DRIVE_STRENGTH_8MA 0x2
58 #define PADS_DRIVE_STRENGTH_12MA 0x3
59
60 #define GPIO_BANK_BASE(bank) (0x200 + 0x24 * (bank))
61
62 #define GPIO_BIT_EN 0x00
63 #define GPIO_OUTPUT_EN 0x04
64 #define GPIO_OUTPUT 0x08
65 #define GPIO_INPUT 0x0c
66 #define GPIO_INPUT_POLARITY 0x10
67 #define GPIO_INTERRUPT_TYPE 0x14
68 #define GPIO_INTERRUPT_TYPE_LEVEL 0x0
69 #define GPIO_INTERRUPT_TYPE_EDGE 0x1
70 #define GPIO_INTERRUPT_EDGE 0x18
71 #define GPIO_INTERRUPT_EDGE_SINGLE 0x0
72 #define GPIO_INTERRUPT_EDGE_DUAL 0x1
73 #define GPIO_INTERRUPT_EN 0x1c
74 #define GPIO_INTERRUPT_STATUS 0x20
75
76 struct pistachio_function {
77 const char *name;
78 const char * const *groups;
79 unsigned int ngroups;
80 const int *scenarios;
81 unsigned int nscenarios;
82 unsigned int scenario_reg;
83 unsigned int scenario_shift;
84 unsigned int scenario_mask;
85 };
86
87 struct pistachio_pin_group {
88 const char *name;
89 unsigned int pin;
90 int mux_option[3];
91 int mux_reg;
92 int mux_shift;
93 int mux_mask;
94 };
95
96 struct pistachio_gpio_bank {
97 struct pistachio_pinctrl *pctl;
98 void __iomem *base;
99 unsigned int pin_base;
100 unsigned int npins;
101 struct gpio_chip gpio_chip;
102 struct irq_chip irq_chip;
103 };
104
105 struct pistachio_pinctrl {
106 struct device *dev;
107 void __iomem *base;
108 struct pinctrl_dev *pctldev;
109 const struct pinctrl_pin_desc *pins;
110 unsigned int npins;
111 const struct pistachio_function *functions;
112 unsigned int nfunctions;
113 const struct pistachio_pin_group *groups;
114 unsigned int ngroups;
115 struct pistachio_gpio_bank *gpio_banks;
116 unsigned int nbanks;
117 };
118
119 #define PISTACHIO_PIN_MFIO(p) (p)
120 #define PISTACHIO_PIN_TCK 90
121 #define PISTACHIO_PIN_TRSTN 91
122 #define PISTACHIO_PIN_TDI 92
123 #define PISTACHIO_PIN_TMS 93
124 #define PISTACHIO_PIN_TDO 94
125 #define PISTACHIO_PIN_JTAG_COMPLY 95
126 #define PISTACHIO_PIN_SAFE_MODE 96
127 #define PISTACHIO_PIN_POR_DISABLE 97
128 #define PISTACHIO_PIN_RESETN 98
129
130 #define MFIO_PIN_DESC(p) PINCTRL_PIN(PISTACHIO_PIN_MFIO(p), "mfio" #p)
131
132 static const struct pinctrl_pin_desc pistachio_pins[] = {
133 MFIO_PIN_DESC(0),
134 MFIO_PIN_DESC(1),
135 MFIO_PIN_DESC(2),
136 MFIO_PIN_DESC(3),
137 MFIO_PIN_DESC(4),
138 MFIO_PIN_DESC(5),
139 MFIO_PIN_DESC(6),
140 MFIO_PIN_DESC(7),
141 MFIO_PIN_DESC(8),
142 MFIO_PIN_DESC(9),
143 MFIO_PIN_DESC(10),
144 MFIO_PIN_DESC(11),
145 MFIO_PIN_DESC(12),
146 MFIO_PIN_DESC(13),
147 MFIO_PIN_DESC(14),
148 MFIO_PIN_DESC(15),
149 MFIO_PIN_DESC(16),
150 MFIO_PIN_DESC(17),
151 MFIO_PIN_DESC(18),
152 MFIO_PIN_DESC(19),
153 MFIO_PIN_DESC(20),
154 MFIO_PIN_DESC(21),
155 MFIO_PIN_DESC(22),
156 MFIO_PIN_DESC(23),
157 MFIO_PIN_DESC(24),
158 MFIO_PIN_DESC(25),
159 MFIO_PIN_DESC(26),
160 MFIO_PIN_DESC(27),
161 MFIO_PIN_DESC(28),
162 MFIO_PIN_DESC(29),
163 MFIO_PIN_DESC(30),
164 MFIO_PIN_DESC(31),
165 MFIO_PIN_DESC(32),
166 MFIO_PIN_DESC(33),
167 MFIO_PIN_DESC(34),
168 MFIO_PIN_DESC(35),
169 MFIO_PIN_DESC(36),
170 MFIO_PIN_DESC(37),
171 MFIO_PIN_DESC(38),
172 MFIO_PIN_DESC(39),
173 MFIO_PIN_DESC(40),
174 MFIO_PIN_DESC(41),
175 MFIO_PIN_DESC(42),
176 MFIO_PIN_DESC(43),
177 MFIO_PIN_DESC(44),
178 MFIO_PIN_DESC(45),
179 MFIO_PIN_DESC(46),
180 MFIO_PIN_DESC(47),
181 MFIO_PIN_DESC(48),
182 MFIO_PIN_DESC(49),
183 MFIO_PIN_DESC(50),
184 MFIO_PIN_DESC(51),
185 MFIO_PIN_DESC(52),
186 MFIO_PIN_DESC(53),
187 MFIO_PIN_DESC(54),
188 MFIO_PIN_DESC(55),
189 MFIO_PIN_DESC(56),
190 MFIO_PIN_DESC(57),
191 MFIO_PIN_DESC(58),
192 MFIO_PIN_DESC(59),
193 MFIO_PIN_DESC(60),
194 MFIO_PIN_DESC(61),
195 MFIO_PIN_DESC(62),
196 MFIO_PIN_DESC(63),
197 MFIO_PIN_DESC(64),
198 MFIO_PIN_DESC(65),
199 MFIO_PIN_DESC(66),
200 MFIO_PIN_DESC(67),
201 MFIO_PIN_DESC(68),
202 MFIO_PIN_DESC(69),
203 MFIO_PIN_DESC(70),
204 MFIO_PIN_DESC(71),
205 MFIO_PIN_DESC(72),
206 MFIO_PIN_DESC(73),
207 MFIO_PIN_DESC(74),
208 MFIO_PIN_DESC(75),
209 MFIO_PIN_DESC(76),
210 MFIO_PIN_DESC(77),
211 MFIO_PIN_DESC(78),
212 MFIO_PIN_DESC(79),
213 MFIO_PIN_DESC(80),
214 MFIO_PIN_DESC(81),
215 MFIO_PIN_DESC(82),
216 MFIO_PIN_DESC(83),
217 MFIO_PIN_DESC(84),
218 MFIO_PIN_DESC(85),
219 MFIO_PIN_DESC(86),
220 MFIO_PIN_DESC(87),
221 MFIO_PIN_DESC(88),
222 MFIO_PIN_DESC(89),
223 PINCTRL_PIN(PISTACHIO_PIN_TCK, "tck"),
224 PINCTRL_PIN(PISTACHIO_PIN_TRSTN, "trstn"),
225 PINCTRL_PIN(PISTACHIO_PIN_TDI, "tdi"),
226 PINCTRL_PIN(PISTACHIO_PIN_TMS, "tms"),
227 PINCTRL_PIN(PISTACHIO_PIN_TDO, "tdo"),
228 PINCTRL_PIN(PISTACHIO_PIN_JTAG_COMPLY, "jtag_comply"),
229 PINCTRL_PIN(PISTACHIO_PIN_SAFE_MODE, "safe_mode"),
230 PINCTRL_PIN(PISTACHIO_PIN_POR_DISABLE, "por_disable"),
231 PINCTRL_PIN(PISTACHIO_PIN_RESETN, "resetn"),
232 };
233
234 static const char * const pistachio_spim0_groups[] = {
235 "mfio1", "mfio2", "mfio8", "mfio9", "mfio10", "mfio28", "mfio29",
236 "mfio30", "mfio55", "mfio56", "mfio57",
237 };
238
239 static const char * const pistachio_spim1_groups[] = {
240 "mfio0", "mfio1", "mfio2", "mfio3", "mfio4", "mfio5", "mfio6",
241 "mfio7", "mfio31", "mfio55", "mfio56", "mfio57", "mfio58",
242 };
243
244 static const char * const pistachio_spis_groups[] = {
245 "mfio11", "mfio12", "mfio13", "mfio14",
246 };
247
248 static const char *const pistachio_sdhost_groups[] = {
249 "mfio15", "mfio16", "mfio17", "mfio18", "mfio19", "mfio20",
250 "mfio21", "mfio22", "mfio23", "mfio24", "mfio25", "mfio26",
251 "mfio27",
252 };
253
254 static const char * const pistachio_i2c0_groups[] = {
255 "mfio28", "mfio29",
256 };
257
258 static const char * const pistachio_i2c1_groups[] = {
259 "mfio30", "mfio31",
260 };
261
262 static const char * const pistachio_i2c2_groups[] = {
263 "mfio32", "mfio33",
264 };
265
266 static const char * const pistachio_i2c3_groups[] = {
267 "mfio34", "mfio35",
268 };
269
270 static const char * const pistachio_audio_clk_in_groups[] = {
271 "mfio36",
272 };
273
274 static const char * const pistachio_i2s_out_groups[] = {
275 "mfio36", "mfio37", "mfio38", "mfio39", "mfio40", "mfio41",
276 "mfio42", "mfio43", "mfio44",
277 };
278
279 static const char * const pistachio_debug_raw_cca_ind_groups[] = {
280 "mfio37",
281 };
282
283 static const char * const pistachio_debug_ed_sec20_cca_ind_groups[] = {
284 "mfio38",
285 };
286
287 static const char * const pistachio_debug_ed_sec40_cca_ind_groups[] = {
288 "mfio39",
289 };
290
291 static const char * const pistachio_debug_agc_done_0_groups[] = {
292 "mfio40",
293 };
294
295 static const char * const pistachio_debug_agc_done_1_groups[] = {
296 "mfio41",
297 };
298
299 static const char * const pistachio_debug_ed_cca_ind_groups[] = {
300 "mfio42",
301 };
302
303 static const char * const pistachio_debug_s2l_done_groups[] = {
304 "mfio43",
305 };
306
307 static const char * const pistachio_i2s_dac_clk_groups[] = {
308 "mfio45",
309 };
310
311 static const char * const pistachio_audio_sync_groups[] = {
312 "mfio45",
313 };
314
315 static const char * const pistachio_audio_trigger_groups[] = {
316 "mfio46",
317 };
318
319 static const char * const pistachio_i2s_in_groups[] = {
320 "mfio47", "mfio48", "mfio49", "mfio50", "mfio51", "mfio52",
321 "mfio53", "mfio54",
322 };
323
324 static const char * const pistachio_uart0_groups[] = {
325 "mfio55", "mfio56", "mfio57", "mfio58",
326 };
327
328 static const char * const pistachio_uart1_groups[] = {
329 "mfio59", "mfio60", "mfio1", "mfio2",
330 };
331
332 static const char * const pistachio_spdif_out_groups[] = {
333 "mfio61",
334 };
335
336 static const char * const pistachio_spdif_in_groups[] = {
337 "mfio62", "mfio54",
338 };
339 static const int pistachio_spdif_in_scenarios[] = {
340 PISTACHIO_PIN_MFIO(62),
341 PISTACHIO_PIN_MFIO(54),
342 };
343
344 static const char * const pistachio_eth_groups[] = {
345 "mfio63", "mfio64", "mfio65", "mfio66", "mfio67", "mfio68",
346 "mfio69", "mfio70", "mfio71",
347 };
348
349 static const char * const pistachio_ir_groups[] = {
350 "mfio72",
351 };
352
353 static const char * const pistachio_pwmpdm_groups[] = {
354 "mfio73", "mfio74", "mfio75", "mfio76",
355 };
356
357 static const char * const pistachio_mips_trace_clk_groups[] = {
358 "mfio15", "mfio63", "mfio73",
359 };
360
361 static const char * const pistachio_mips_trace_dint_groups[] = {
362 "mfio16", "mfio64", "mfio74",
363 };
364 static const int pistachio_mips_trace_dint_scenarios[] = {
365 PISTACHIO_PIN_MFIO(16),
366 PISTACHIO_PIN_MFIO(64),
367 PISTACHIO_PIN_MFIO(74),
368 };
369
370 static const char * const pistachio_mips_trace_trigout_groups[] = {
371 "mfio17", "mfio65", "mfio75",
372 };
373
374 static const char * const pistachio_mips_trace_trigin_groups[] = {
375 "mfio18", "mfio66", "mfio76",
376 };
377 static const int pistachio_mips_trace_trigin_scenarios[] = {
378 PISTACHIO_PIN_MFIO(18),
379 PISTACHIO_PIN_MFIO(66),
380 PISTACHIO_PIN_MFIO(76),
381 };
382
383 static const char * const pistachio_mips_trace_dm_groups[] = {
384 "mfio19", "mfio67", "mfio77",
385 };
386
387 static const char * const pistachio_mips_probe_n_groups[] = {
388 "mfio20", "mfio68", "mfio78",
389 };
390 static const int pistachio_mips_probe_n_scenarios[] = {
391 PISTACHIO_PIN_MFIO(20),
392 PISTACHIO_PIN_MFIO(68),
393 PISTACHIO_PIN_MFIO(78),
394 };
395
396 static const char * const pistachio_mips_trace_data_groups[] = {
397 "mfio15", "mfio16", "mfio17", "mfio18", "mfio19", "mfio20",
398 "mfio21", "mfio22", "mfio63", "mfio64", "mfio65", "mfio66",
399 "mfio67", "mfio68", "mfio69", "mfio70", "mfio79", "mfio80",
400 "mfio81", "mfio82", "mfio83", "mfio84", "mfio85", "mfio86",
401 };
402
403 static const char * const pistachio_sram_debug_groups[] = {
404 "mfio73", "mfio74",
405 };
406
407 static const char * const pistachio_rom_debug_groups[] = {
408 "mfio75", "mfio76",
409 };
410
411 static const char * const pistachio_rpu_debug_groups[] = {
412 "mfio77", "mfio78",
413 };
414
415 static const char * const pistachio_mips_debug_groups[] = {
416 "mfio79", "mfio80",
417 };
418
419 static const char * const pistachio_eth_debug_groups[] = {
420 "mfio81", "mfio82",
421 };
422
423 static const char * const pistachio_usb_debug_groups[] = {
424 "mfio83", "mfio84",
425 };
426
427 static const char * const pistachio_sdhost_debug_groups[] = {
428 "mfio85", "mfio86",
429 };
430
431 static const char * const pistachio_socif_debug_groups[] = {
432 "mfio87", "mfio88",
433 };
434
435 static const char * const pistachio_mdc_debug_groups[] = {
436 "mfio77", "mfio78",
437 };
438
439 static const char * const pistachio_ddr_debug_groups[] = {
440 "mfio79", "mfio80",
441 };
442
443 static const char * const pistachio_dreq0_groups[] = {
444 "mfio81",
445 };
446
447 static const char * const pistachio_dreq1_groups[] = {
448 "mfio82",
449 };
450
451 static const char * const pistachio_dreq2_groups[] = {
452 "mfio87",
453 };
454
455 static const char * const pistachio_dreq3_groups[] = {
456 "mfio88",
457 };
458
459 static const char * const pistachio_dreq4_groups[] = {
460 "mfio89",
461 };
462
463 static const char * const pistachio_dreq5_groups[] = {
464 "mfio89",
465 };
466
467 static const char * const pistachio_mips_pll_lock_groups[] = {
468 "mfio83",
469 };
470
471 static const char * const pistachio_audio_pll_lock_groups[] = {
472 "mfio84",
473 };
474
475 static const char * const pistachio_rpu_v_pll_lock_groups[] = {
476 "mfio85",
477 };
478
479 static const char * const pistachio_rpu_l_pll_lock_groups[] = {
480 "mfio86",
481 };
482
483 static const char * const pistachio_sys_pll_lock_groups[] = {
484 "mfio87",
485 };
486
487 static const char * const pistachio_wifi_pll_lock_groups[] = {
488 "mfio88",
489 };
490
491 static const char * const pistachio_bt_pll_lock_groups[] = {
492 "mfio89",
493 };
494
495 #define FUNCTION(_name) \
496 { \
497 .name = #_name, \
498 .groups = pistachio_##_name##_groups, \
499 .ngroups = ARRAY_SIZE(pistachio_##_name##_groups), \
500 }
501
502 #define FUNCTION_SCENARIO(_name, _reg, _shift, _mask) \
503 { \
504 .name = #_name, \
505 .groups = pistachio_##_name##_groups, \
506 .ngroups = ARRAY_SIZE(pistachio_##_name##_groups), \
507 .scenarios = pistachio_##_name##_scenarios, \
508 .nscenarios = ARRAY_SIZE(pistachio_##_name##_scenarios),\
509 .scenario_reg = _reg, \
510 .scenario_shift = _shift, \
511 .scenario_mask = _mask, \
512 }
513
514 enum pistachio_mux_option {
515 PISTACHIO_FUNCTION_NONE = -1,
516 PISTACHIO_FUNCTION_SPIM0,
517 PISTACHIO_FUNCTION_SPIM1,
518 PISTACHIO_FUNCTION_SPIS,
519 PISTACHIO_FUNCTION_SDHOST,
520 PISTACHIO_FUNCTION_I2C0,
521 PISTACHIO_FUNCTION_I2C1,
522 PISTACHIO_FUNCTION_I2C2,
523 PISTACHIO_FUNCTION_I2C3,
524 PISTACHIO_FUNCTION_AUDIO_CLK_IN,
525 PISTACHIO_FUNCTION_I2S_OUT,
526 PISTACHIO_FUNCTION_I2S_DAC_CLK,
527 PISTACHIO_FUNCTION_AUDIO_SYNC,
528 PISTACHIO_FUNCTION_AUDIO_TRIGGER,
529 PISTACHIO_FUNCTION_I2S_IN,
530 PISTACHIO_FUNCTION_UART0,
531 PISTACHIO_FUNCTION_UART1,
532 PISTACHIO_FUNCTION_SPDIF_OUT,
533 PISTACHIO_FUNCTION_SPDIF_IN,
534 PISTACHIO_FUNCTION_ETH,
535 PISTACHIO_FUNCTION_IR,
536 PISTACHIO_FUNCTION_PWMPDM,
537 PISTACHIO_FUNCTION_MIPS_TRACE_CLK,
538 PISTACHIO_FUNCTION_MIPS_TRACE_DINT,
539 PISTACHIO_FUNCTION_MIPS_TRACE_TRIGOUT,
540 PISTACHIO_FUNCTION_MIPS_TRACE_TRIGIN,
541 PISTACHIO_FUNCTION_MIPS_TRACE_DM,
542 PISTACHIO_FUNCTION_MIPS_TRACE_PROBE_N,
543 PISTACHIO_FUNCTION_MIPS_TRACE_DATA,
544 PISTACHIO_FUNCTION_SRAM_DEBUG,
545 PISTACHIO_FUNCTION_ROM_DEBUG,
546 PISTACHIO_FUNCTION_RPU_DEBUG,
547 PISTACHIO_FUNCTION_MIPS_DEBUG,
548 PISTACHIO_FUNCTION_ETH_DEBUG,
549 PISTACHIO_FUNCTION_USB_DEBUG,
550 PISTACHIO_FUNCTION_SDHOST_DEBUG,
551 PISTACHIO_FUNCTION_SOCIF_DEBUG,
552 PISTACHIO_FUNCTION_MDC_DEBUG,
553 PISTACHIO_FUNCTION_DDR_DEBUG,
554 PISTACHIO_FUNCTION_DREQ0,
555 PISTACHIO_FUNCTION_DREQ1,
556 PISTACHIO_FUNCTION_DREQ2,
557 PISTACHIO_FUNCTION_DREQ3,
558 PISTACHIO_FUNCTION_DREQ4,
559 PISTACHIO_FUNCTION_DREQ5,
560 PISTACHIO_FUNCTION_MIPS_PLL_LOCK,
561 PISTACHIO_FUNCTION_AUDIO_PLL_LOCK,
562 PISTACHIO_FUNCTION_RPU_V_PLL_LOCK,
563 PISTACHIO_FUNCTION_RPU_L_PLL_LOCK,
564 PISTACHIO_FUNCTION_SYS_PLL_LOCK,
565 PISTACHIO_FUNCTION_WIFI_PLL_LOCK,
566 PISTACHIO_FUNCTION_BT_PLL_LOCK,
567 PISTACHIO_FUNCTION_DEBUG_RAW_CCA_IND,
568 PISTACHIO_FUNCTION_DEBUG_ED_SEC20_CCA_IND,
569 PISTACHIO_FUNCTION_DEBUG_ED_SEC40_CCA_IND,
570 PISTACHIO_FUNCTION_DEBUG_AGC_DONE_0,
571 PISTACHIO_FUNCTION_DEBUG_AGC_DONE_1,
572 PISTACHIO_FUNCTION_DEBUG_ED_CCA_IND,
573 PISTACHIO_FUNCTION_DEBUG_S2L_DONE,
574 };
575
576 static const struct pistachio_function pistachio_functions[] = {
577 FUNCTION(spim0),
578 FUNCTION(spim1),
579 FUNCTION(spis),
580 FUNCTION(sdhost),
581 FUNCTION(i2c0),
582 FUNCTION(i2c1),
583 FUNCTION(i2c2),
584 FUNCTION(i2c3),
585 FUNCTION(audio_clk_in),
586 FUNCTION(i2s_out),
587 FUNCTION(i2s_dac_clk),
588 FUNCTION(audio_sync),
589 FUNCTION(audio_trigger),
590 FUNCTION(i2s_in),
591 FUNCTION(uart0),
592 FUNCTION(uart1),
593 FUNCTION(spdif_out),
594 FUNCTION_SCENARIO(spdif_in, PADS_SCENARIO_SELECT, 0, 0x1),
595 FUNCTION(eth),
596 FUNCTION(ir),
597 FUNCTION(pwmpdm),
598 FUNCTION(mips_trace_clk),
599 FUNCTION_SCENARIO(mips_trace_dint, PADS_SCENARIO_SELECT, 1, 0x3),
600 FUNCTION(mips_trace_trigout),
601 FUNCTION_SCENARIO(mips_trace_trigin, PADS_SCENARIO_SELECT, 3, 0x3),
602 FUNCTION(mips_trace_dm),
603 FUNCTION_SCENARIO(mips_probe_n, PADS_SCENARIO_SELECT, 5, 0x3),
604 FUNCTION(mips_trace_data),
605 FUNCTION(sram_debug),
606 FUNCTION(rom_debug),
607 FUNCTION(rpu_debug),
608 FUNCTION(mips_debug),
609 FUNCTION(eth_debug),
610 FUNCTION(usb_debug),
611 FUNCTION(sdhost_debug),
612 FUNCTION(socif_debug),
613 FUNCTION(mdc_debug),
614 FUNCTION(ddr_debug),
615 FUNCTION(dreq0),
616 FUNCTION(dreq1),
617 FUNCTION(dreq2),
618 FUNCTION(dreq3),
619 FUNCTION(dreq4),
620 FUNCTION(dreq5),
621 FUNCTION(mips_pll_lock),
622 FUNCTION(audio_pll_lock),
623 FUNCTION(rpu_v_pll_lock),
624 FUNCTION(rpu_l_pll_lock),
625 FUNCTION(sys_pll_lock),
626 FUNCTION(wifi_pll_lock),
627 FUNCTION(bt_pll_lock),
628 FUNCTION(debug_raw_cca_ind),
629 FUNCTION(debug_ed_sec20_cca_ind),
630 FUNCTION(debug_ed_sec40_cca_ind),
631 FUNCTION(debug_agc_done_0),
632 FUNCTION(debug_agc_done_1),
633 FUNCTION(debug_ed_cca_ind),
634 FUNCTION(debug_s2l_done),
635 };
636
637 #define PIN_GROUP(_pin, _name) \
638 { \
639 .name = #_name, \
640 .pin = PISTACHIO_PIN_##_pin, \
641 .mux_option = { \
642 PISTACHIO_FUNCTION_NONE, \
643 PISTACHIO_FUNCTION_NONE, \
644 PISTACHIO_FUNCTION_NONE, \
645 }, \
646 .mux_reg = -1, \
647 .mux_shift = -1, \
648 .mux_mask = -1, \
649 }
650
651 #define MFIO_PIN_GROUP(_pin, _func) \
652 { \
653 .name = "mfio" #_pin, \
654 .pin = PISTACHIO_PIN_MFIO(_pin), \
655 .mux_option = { \
656 PISTACHIO_FUNCTION_##_func, \
657 PISTACHIO_FUNCTION_NONE, \
658 PISTACHIO_FUNCTION_NONE, \
659 }, \
660 .mux_reg = -1, \
661 .mux_shift = -1, \
662 .mux_mask = -1, \
663 }
664
665 #define MFIO_MUX_PIN_GROUP(_pin, _f0, _f1, _f2, _reg, _shift, _mask) \
666 { \
667 .name = "mfio" #_pin, \
668 .pin = PISTACHIO_PIN_MFIO(_pin), \
669 .mux_option = { \
670 PISTACHIO_FUNCTION_##_f0, \
671 PISTACHIO_FUNCTION_##_f1, \
672 PISTACHIO_FUNCTION_##_f2, \
673 }, \
674 .mux_reg = _reg, \
675 .mux_shift = _shift, \
676 .mux_mask = _mask, \
677 }
678
679 static const struct pistachio_pin_group pistachio_groups[] = {
680 MFIO_PIN_GROUP(0, SPIM1),
681 MFIO_MUX_PIN_GROUP(1, SPIM1, SPIM0, UART1,
682 PADS_FUNCTION_SELECT0, 0, 0x3),
683 MFIO_MUX_PIN_GROUP(2, SPIM1, SPIM0, UART1,
684 PADS_FUNCTION_SELECT0, 2, 0x3),
685 MFIO_PIN_GROUP(3, SPIM1),
686 MFIO_PIN_GROUP(4, SPIM1),
687 MFIO_PIN_GROUP(5, SPIM1),
688 MFIO_PIN_GROUP(6, SPIM1),
689 MFIO_PIN_GROUP(7, SPIM1),
690 MFIO_PIN_GROUP(8, SPIM0),
691 MFIO_PIN_GROUP(9, SPIM0),
692 MFIO_PIN_GROUP(10, SPIM0),
693 MFIO_PIN_GROUP(11, SPIS),
694 MFIO_PIN_GROUP(12, SPIS),
695 MFIO_PIN_GROUP(13, SPIS),
696 MFIO_PIN_GROUP(14, SPIS),
697 MFIO_MUX_PIN_GROUP(15, SDHOST, MIPS_TRACE_CLK, MIPS_TRACE_DATA,
698 PADS_FUNCTION_SELECT0, 4, 0x3),
699 MFIO_MUX_PIN_GROUP(16, SDHOST, MIPS_TRACE_DINT, MIPS_TRACE_DATA,
700 PADS_FUNCTION_SELECT0, 6, 0x3),
701 MFIO_MUX_PIN_GROUP(17, SDHOST, MIPS_TRACE_TRIGOUT, MIPS_TRACE_DATA,
702 PADS_FUNCTION_SELECT0, 8, 0x3),
703 MFIO_MUX_PIN_GROUP(18, SDHOST, MIPS_TRACE_TRIGIN, MIPS_TRACE_DATA,
704 PADS_FUNCTION_SELECT0, 10, 0x3),
705 MFIO_MUX_PIN_GROUP(19, SDHOST, MIPS_TRACE_DM, MIPS_TRACE_DATA,
706 PADS_FUNCTION_SELECT0, 12, 0x3),
707 MFIO_MUX_PIN_GROUP(20, SDHOST, MIPS_TRACE_PROBE_N, MIPS_TRACE_DATA,
708 PADS_FUNCTION_SELECT0, 14, 0x3),
709 MFIO_MUX_PIN_GROUP(21, SDHOST, NONE, MIPS_TRACE_DATA,
710 PADS_FUNCTION_SELECT0, 16, 0x3),
711 MFIO_MUX_PIN_GROUP(22, SDHOST, NONE, MIPS_TRACE_DATA,
712 PADS_FUNCTION_SELECT0, 18, 0x3),
713 MFIO_PIN_GROUP(23, SDHOST),
714 MFIO_PIN_GROUP(24, SDHOST),
715 MFIO_PIN_GROUP(25, SDHOST),
716 MFIO_PIN_GROUP(26, SDHOST),
717 MFIO_PIN_GROUP(27, SDHOST),
718 MFIO_MUX_PIN_GROUP(28, I2C0, SPIM0, NONE,
719 PADS_FUNCTION_SELECT0, 20, 0x1),
720 MFIO_MUX_PIN_GROUP(29, I2C0, SPIM0, NONE,
721 PADS_FUNCTION_SELECT0, 21, 0x1),
722 MFIO_MUX_PIN_GROUP(30, I2C1, SPIM0, NONE,
723 PADS_FUNCTION_SELECT0, 22, 0x1),
724 MFIO_MUX_PIN_GROUP(31, I2C1, SPIM1, NONE,
725 PADS_FUNCTION_SELECT0, 23, 0x1),
726 MFIO_PIN_GROUP(32, I2C2),
727 MFIO_PIN_GROUP(33, I2C2),
728 MFIO_PIN_GROUP(34, I2C3),
729 MFIO_PIN_GROUP(35, I2C3),
730 MFIO_MUX_PIN_GROUP(36, I2S_OUT, AUDIO_CLK_IN, NONE,
731 PADS_FUNCTION_SELECT0, 24, 0x1),
732 MFIO_MUX_PIN_GROUP(37, I2S_OUT, DEBUG_RAW_CCA_IND, NONE,
733 PADS_FUNCTION_SELECT0, 25, 0x1),
734 MFIO_MUX_PIN_GROUP(38, I2S_OUT, DEBUG_ED_SEC20_CCA_IND, NONE,
735 PADS_FUNCTION_SELECT0, 26, 0x1),
736 MFIO_MUX_PIN_GROUP(39, I2S_OUT, DEBUG_ED_SEC40_CCA_IND, NONE,
737 PADS_FUNCTION_SELECT0, 27, 0x1),
738 MFIO_MUX_PIN_GROUP(40, I2S_OUT, DEBUG_AGC_DONE_0, NONE,
739 PADS_FUNCTION_SELECT0, 28, 0x1),
740 MFIO_MUX_PIN_GROUP(41, I2S_OUT, DEBUG_AGC_DONE_1, NONE,
741 PADS_FUNCTION_SELECT0, 29, 0x1),
742 MFIO_MUX_PIN_GROUP(42, I2S_OUT, DEBUG_ED_CCA_IND, NONE,
743 PADS_FUNCTION_SELECT0, 30, 0x1),
744 MFIO_MUX_PIN_GROUP(43, I2S_OUT, DEBUG_S2L_DONE, NONE,
745 PADS_FUNCTION_SELECT0, 31, 0x1),
746 MFIO_PIN_GROUP(44, I2S_OUT),
747 MFIO_MUX_PIN_GROUP(45, I2S_DAC_CLK, AUDIO_SYNC, NONE,
748 PADS_FUNCTION_SELECT1, 0, 0x1),
749 MFIO_PIN_GROUP(46, AUDIO_TRIGGER),
750 MFIO_PIN_GROUP(47, I2S_IN),
751 MFIO_PIN_GROUP(48, I2S_IN),
752 MFIO_PIN_GROUP(49, I2S_IN),
753 MFIO_PIN_GROUP(50, I2S_IN),
754 MFIO_PIN_GROUP(51, I2S_IN),
755 MFIO_PIN_GROUP(52, I2S_IN),
756 MFIO_PIN_GROUP(53, I2S_IN),
757 MFIO_MUX_PIN_GROUP(54, I2S_IN, NONE, SPDIF_IN,
758 PADS_FUNCTION_SELECT1, 1, 0x3),
759 MFIO_MUX_PIN_GROUP(55, UART0, SPIM0, SPIM1,
760 PADS_FUNCTION_SELECT1, 3, 0x3),
761 MFIO_MUX_PIN_GROUP(56, UART0, SPIM0, SPIM1,
762 PADS_FUNCTION_SELECT1, 5, 0x3),
763 MFIO_MUX_PIN_GROUP(57, UART0, SPIM0, SPIM1,
764 PADS_FUNCTION_SELECT1, 7, 0x3),
765 MFIO_MUX_PIN_GROUP(58, UART0, SPIM1, NONE,
766 PADS_FUNCTION_SELECT1, 9, 0x1),
767 MFIO_PIN_GROUP(59, UART1),
768 MFIO_PIN_GROUP(60, UART1),
769 MFIO_PIN_GROUP(61, SPDIF_OUT),
770 MFIO_PIN_GROUP(62, SPDIF_IN),
771 MFIO_MUX_PIN_GROUP(63, ETH, MIPS_TRACE_CLK, MIPS_TRACE_DATA,
772 PADS_FUNCTION_SELECT1, 10, 0x3),
773 MFIO_MUX_PIN_GROUP(64, ETH, MIPS_TRACE_DINT, MIPS_TRACE_DATA,
774 PADS_FUNCTION_SELECT1, 12, 0x3),
775 MFIO_MUX_PIN_GROUP(65, ETH, MIPS_TRACE_TRIGOUT, MIPS_TRACE_DATA,
776 PADS_FUNCTION_SELECT1, 14, 0x3),
777 MFIO_MUX_PIN_GROUP(66, ETH, MIPS_TRACE_TRIGIN, MIPS_TRACE_DATA,
778 PADS_FUNCTION_SELECT1, 16, 0x3),
779 MFIO_MUX_PIN_GROUP(67, ETH, MIPS_TRACE_DM, MIPS_TRACE_DATA,
780 PADS_FUNCTION_SELECT1, 18, 0x3),
781 MFIO_MUX_PIN_GROUP(68, ETH, MIPS_TRACE_PROBE_N, MIPS_TRACE_DATA,
782 PADS_FUNCTION_SELECT1, 20, 0x3),
783 MFIO_MUX_PIN_GROUP(69, ETH, NONE, MIPS_TRACE_DATA,
784 PADS_FUNCTION_SELECT1, 22, 0x3),
785 MFIO_MUX_PIN_GROUP(70, ETH, NONE, MIPS_TRACE_DATA,
786 PADS_FUNCTION_SELECT1, 24, 0x3),
787 MFIO_PIN_GROUP(71, ETH),
788 MFIO_PIN_GROUP(72, IR),
789 MFIO_MUX_PIN_GROUP(73, PWMPDM, MIPS_TRACE_CLK, SRAM_DEBUG,
790 PADS_FUNCTION_SELECT1, 26, 0x3),
791 MFIO_MUX_PIN_GROUP(74, PWMPDM, MIPS_TRACE_DINT, SRAM_DEBUG,
792 PADS_FUNCTION_SELECT1, 28, 0x3),
793 MFIO_MUX_PIN_GROUP(75, PWMPDM, MIPS_TRACE_TRIGOUT, ROM_DEBUG,
794 PADS_FUNCTION_SELECT1, 30, 0x3),
795 MFIO_MUX_PIN_GROUP(76, PWMPDM, MIPS_TRACE_TRIGIN, ROM_DEBUG,
796 PADS_FUNCTION_SELECT2, 0, 0x3),
797 MFIO_MUX_PIN_GROUP(77, MDC_DEBUG, MIPS_TRACE_DM, RPU_DEBUG,
798 PADS_FUNCTION_SELECT2, 2, 0x3),
799 MFIO_MUX_PIN_GROUP(78, MDC_DEBUG, MIPS_TRACE_PROBE_N, RPU_DEBUG,
800 PADS_FUNCTION_SELECT2, 4, 0x3),
801 MFIO_MUX_PIN_GROUP(79, DDR_DEBUG, MIPS_TRACE_DATA, MIPS_DEBUG,
802 PADS_FUNCTION_SELECT2, 6, 0x3),
803 MFIO_MUX_PIN_GROUP(80, DDR_DEBUG, MIPS_TRACE_DATA, MIPS_DEBUG,
804 PADS_FUNCTION_SELECT2, 8, 0x3),
805 MFIO_MUX_PIN_GROUP(81, DREQ0, MIPS_TRACE_DATA, ETH_DEBUG,
806 PADS_FUNCTION_SELECT2, 10, 0x3),
807 MFIO_MUX_PIN_GROUP(82, DREQ1, MIPS_TRACE_DATA, ETH_DEBUG,
808 PADS_FUNCTION_SELECT2, 12, 0x3),
809 MFIO_MUX_PIN_GROUP(83, MIPS_PLL_LOCK, MIPS_TRACE_DATA, USB_DEBUG,
810 PADS_FUNCTION_SELECT2, 14, 0x3),
811 MFIO_MUX_PIN_GROUP(84, AUDIO_PLL_LOCK, MIPS_TRACE_DATA, USB_DEBUG,
812 PADS_FUNCTION_SELECT2, 16, 0x3),
813 MFIO_MUX_PIN_GROUP(85, RPU_V_PLL_LOCK, MIPS_TRACE_DATA, SDHOST_DEBUG,
814 PADS_FUNCTION_SELECT2, 18, 0x3),
815 MFIO_MUX_PIN_GROUP(86, RPU_L_PLL_LOCK, MIPS_TRACE_DATA, SDHOST_DEBUG,
816 PADS_FUNCTION_SELECT2, 20, 0x3),
817 MFIO_MUX_PIN_GROUP(87, SYS_PLL_LOCK, DREQ2, SOCIF_DEBUG,
818 PADS_FUNCTION_SELECT2, 22, 0x3),
819 MFIO_MUX_PIN_GROUP(88, WIFI_PLL_LOCK, DREQ3, SOCIF_DEBUG,
820 PADS_FUNCTION_SELECT2, 24, 0x3),
821 MFIO_MUX_PIN_GROUP(89, BT_PLL_LOCK, DREQ4, DREQ5,
822 PADS_FUNCTION_SELECT2, 26, 0x3),
823 PIN_GROUP(TCK, "tck"),
824 PIN_GROUP(TRSTN, "trstn"),
825 PIN_GROUP(TDI, "tdi"),
826 PIN_GROUP(TMS, "tms"),
827 PIN_GROUP(TDO, "tdo"),
828 PIN_GROUP(JTAG_COMPLY, "jtag_comply"),
829 PIN_GROUP(SAFE_MODE, "safe_mode"),
830 PIN_GROUP(POR_DISABLE, "por_disable"),
831 PIN_GROUP(RESETN, "resetn"),
832 };
833
834 static inline u32 pctl_readl(struct pistachio_pinctrl *pctl, u32 reg)
835 {
836 return readl(pctl->base + reg);
837 }
838
839 static inline void pctl_writel(struct pistachio_pinctrl *pctl, u32 val, u32 reg)
840 {
841 writel(val, pctl->base + reg);
842 }
843
844 static inline struct pistachio_gpio_bank *irqd_to_bank(struct irq_data *d)
845 {
846 return gpiochip_get_data(irq_data_get_irq_chip_data(d));
847 }
848
849 static inline u32 gpio_readl(struct pistachio_gpio_bank *bank, u32 reg)
850 {
851 return readl(bank->base + reg);
852 }
853
854 static inline void gpio_writel(struct pistachio_gpio_bank *bank, u32 val,
855 u32 reg)
856 {
857 writel(val, bank->base + reg);
858 }
859
860 static inline void gpio_mask_writel(struct pistachio_gpio_bank *bank,
861 u32 reg, unsigned int bit, u32 val)
862 {
863 /*
864 * For most of the GPIO registers, bit 16 + X must be set in order to
865 * write bit X.
866 */
867 gpio_writel(bank, (0x10000 | val) << bit, reg);
868 }
869
870 static inline void gpio_enable(struct pistachio_gpio_bank *bank,
871 unsigned offset)
872 {
873 gpio_mask_writel(bank, GPIO_BIT_EN, offset, 1);
874 }
875
876 static inline void gpio_disable(struct pistachio_gpio_bank *bank,
877 unsigned offset)
878 {
879 gpio_mask_writel(bank, GPIO_BIT_EN, offset, 0);
880 }
881
882 static int pistachio_pinctrl_get_groups_count(struct pinctrl_dev *pctldev)
883 {
884 struct pistachio_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
885
886 return pctl->ngroups;
887 }
888
889 static const char *pistachio_pinctrl_get_group_name(struct pinctrl_dev *pctldev,
890 unsigned group)
891 {
892 struct pistachio_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
893
894 return pctl->groups[group].name;
895 }
896
897 static int pistachio_pinctrl_get_group_pins(struct pinctrl_dev *pctldev,
898 unsigned group,
899 const unsigned **pins,
900 unsigned *num_pins)
901 {
902 struct pistachio_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
903
904 *pins = &pctl->groups[group].pin;
905 *num_pins = 1;
906
907 return 0;
908 }
909
910 static const struct pinctrl_ops pistachio_pinctrl_ops = {
911 .get_groups_count = pistachio_pinctrl_get_groups_count,
912 .get_group_name = pistachio_pinctrl_get_group_name,
913 .get_group_pins = pistachio_pinctrl_get_group_pins,
914 .dt_node_to_map = pinconf_generic_dt_node_to_map_pin,
915 .dt_free_map = pinctrl_utils_free_map,
916 };
917
918 static int pistachio_pinmux_get_functions_count(struct pinctrl_dev *pctldev)
919 {
920 struct pistachio_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
921
922 return pctl->nfunctions;
923 }
924
925 static const char *
926 pistachio_pinmux_get_function_name(struct pinctrl_dev *pctldev, unsigned func)
927 {
928 struct pistachio_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
929
930 return pctl->functions[func].name;
931 }
932
933 static int pistachio_pinmux_get_function_groups(struct pinctrl_dev *pctldev,
934 unsigned func,
935 const char * const **groups,
936 unsigned * const num_groups)
937 {
938 struct pistachio_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
939
940 *groups = pctl->functions[func].groups;
941 *num_groups = pctl->functions[func].ngroups;
942
943 return 0;
944 }
945
946 static int pistachio_pinmux_enable(struct pinctrl_dev *pctldev,
947 unsigned func, unsigned group)
948 {
949 struct pistachio_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
950 const struct pistachio_pin_group *pg = &pctl->groups[group];
951 const struct pistachio_function *pf = &pctl->functions[func];
952 struct pinctrl_gpio_range *range;
953 unsigned int i;
954 u32 val;
955
956 if (pg->mux_reg > 0) {
957 for (i = 0; i < ARRAY_SIZE(pg->mux_option); i++) {
958 if (pg->mux_option[i] == func)
959 break;
960 }
961 if (i == ARRAY_SIZE(pg->mux_option)) {
962 dev_err(pctl->dev, "Cannot mux pin %u to function %u\n",
963 group, func);
964 return -EINVAL;
965 }
966
967 val = pctl_readl(pctl, pg->mux_reg);
968 val &= ~(pg->mux_mask << pg->mux_shift);
969 val |= i << pg->mux_shift;
970 pctl_writel(pctl, val, pg->mux_reg);
971
972 if (pf->scenarios) {
973 for (i = 0; i < pf->nscenarios; i++) {
974 if (pf->scenarios[i] == group)
975 break;
976 }
977 if (WARN_ON(i == pf->nscenarios))
978 return -EINVAL;
979
980 val = pctl_readl(pctl, pf->scenario_reg);
981 val &= ~(pf->scenario_mask << pf->scenario_shift);
982 val |= i << pf->scenario_shift;
983 pctl_writel(pctl, val, pf->scenario_reg);
984 }
985 }
986
987 range = pinctrl_find_gpio_range_from_pin(pctl->pctldev, pg->pin);
988 if (range)
989 gpio_disable(gpiochip_get_data(range->gc), pg->pin - range->pin_base);
990
991 return 0;
992 }
993
994 static const struct pinmux_ops pistachio_pinmux_ops = {
995 .get_functions_count = pistachio_pinmux_get_functions_count,
996 .get_function_name = pistachio_pinmux_get_function_name,
997 .get_function_groups = pistachio_pinmux_get_function_groups,
998 .set_mux = pistachio_pinmux_enable,
999 };
1000
1001 static int pistachio_pinconf_get(struct pinctrl_dev *pctldev, unsigned pin,
1002 unsigned long *config)
1003 {
1004 struct pistachio_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
1005 enum pin_config_param param = pinconf_to_config_param(*config);
1006 u32 val, arg;
1007
1008 switch (param) {
1009 case PIN_CONFIG_INPUT_SCHMITT_ENABLE:
1010 val = pctl_readl(pctl, PADS_SCHMITT_EN_REG(pin));
1011 arg = !!(val & PADS_SCHMITT_EN_BIT(pin));
1012 break;
1013 case PIN_CONFIG_BIAS_HIGH_IMPEDANCE:
1014 val = pctl_readl(pctl, PADS_PU_PD_REG(pin)) >>
1015 PADS_PU_PD_SHIFT(pin);
1016 arg = (val & PADS_PU_PD_MASK) == PADS_PU_PD_HIGHZ;
1017 break;
1018 case PIN_CONFIG_BIAS_PULL_UP:
1019 val = pctl_readl(pctl, PADS_PU_PD_REG(pin)) >>
1020 PADS_PU_PD_SHIFT(pin);
1021 arg = (val & PADS_PU_PD_MASK) == PADS_PU_PD_UP;
1022 break;
1023 case PIN_CONFIG_BIAS_PULL_DOWN:
1024 val = pctl_readl(pctl, PADS_PU_PD_REG(pin)) >>
1025 PADS_PU_PD_SHIFT(pin);
1026 arg = (val & PADS_PU_PD_MASK) == PADS_PU_PD_DOWN;
1027 break;
1028 case PIN_CONFIG_BIAS_BUS_HOLD:
1029 val = pctl_readl(pctl, PADS_PU_PD_REG(pin)) >>
1030 PADS_PU_PD_SHIFT(pin);
1031 arg = (val & PADS_PU_PD_MASK) == PADS_PU_PD_BUS;
1032 break;
1033 case PIN_CONFIG_SLEW_RATE:
1034 val = pctl_readl(pctl, PADS_SLEW_RATE_REG(pin));
1035 arg = !!(val & PADS_SLEW_RATE_BIT(pin));
1036 break;
1037 case PIN_CONFIG_DRIVE_STRENGTH:
1038 val = pctl_readl(pctl, PADS_DRIVE_STRENGTH_REG(pin)) >>
1039 PADS_DRIVE_STRENGTH_SHIFT(pin);
1040 switch (val & PADS_DRIVE_STRENGTH_MASK) {
1041 case PADS_DRIVE_STRENGTH_2MA:
1042 arg = 2;
1043 break;
1044 case PADS_DRIVE_STRENGTH_4MA:
1045 arg = 4;
1046 break;
1047 case PADS_DRIVE_STRENGTH_8MA:
1048 arg = 8;
1049 break;
1050 case PADS_DRIVE_STRENGTH_12MA:
1051 default:
1052 arg = 12;
1053 break;
1054 }
1055 break;
1056 default:
1057 dev_dbg(pctl->dev, "Property %u not supported\n", param);
1058 return -ENOTSUPP;
1059 }
1060
1061 *config = pinconf_to_config_packed(param, arg);
1062
1063 return 0;
1064 }
1065
1066 static int pistachio_pinconf_set(struct pinctrl_dev *pctldev, unsigned pin,
1067 unsigned long *configs, unsigned num_configs)
1068 {
1069 struct pistachio_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
1070 enum pin_config_param param;
1071 u32 drv, val, arg;
1072 unsigned int i;
1073
1074 for (i = 0; i < num_configs; i++) {
1075 param = pinconf_to_config_param(configs[i]);
1076 arg = pinconf_to_config_argument(configs[i]);
1077
1078 switch (param) {
1079 case PIN_CONFIG_INPUT_SCHMITT_ENABLE:
1080 val = pctl_readl(pctl, PADS_SCHMITT_EN_REG(pin));
1081 if (arg)
1082 val |= PADS_SCHMITT_EN_BIT(pin);
1083 else
1084 val &= ~PADS_SCHMITT_EN_BIT(pin);
1085 pctl_writel(pctl, val, PADS_SCHMITT_EN_REG(pin));
1086 break;
1087 case PIN_CONFIG_BIAS_HIGH_IMPEDANCE:
1088 val = pctl_readl(pctl, PADS_PU_PD_REG(pin));
1089 val &= ~(PADS_PU_PD_MASK << PADS_PU_PD_SHIFT(pin));
1090 val |= PADS_PU_PD_HIGHZ << PADS_PU_PD_SHIFT(pin);
1091 pctl_writel(pctl, val, PADS_PU_PD_REG(pin));
1092 break;
1093 case PIN_CONFIG_BIAS_PULL_UP:
1094 val = pctl_readl(pctl, PADS_PU_PD_REG(pin));
1095 val &= ~(PADS_PU_PD_MASK << PADS_PU_PD_SHIFT(pin));
1096 val |= PADS_PU_PD_UP << PADS_PU_PD_SHIFT(pin);
1097 pctl_writel(pctl, val, PADS_PU_PD_REG(pin));
1098 break;
1099 case PIN_CONFIG_BIAS_PULL_DOWN:
1100 val = pctl_readl(pctl, PADS_PU_PD_REG(pin));
1101 val &= ~(PADS_PU_PD_MASK << PADS_PU_PD_SHIFT(pin));
1102 val |= PADS_PU_PD_DOWN << PADS_PU_PD_SHIFT(pin);
1103 pctl_writel(pctl, val, PADS_PU_PD_REG(pin));
1104 break;
1105 case PIN_CONFIG_BIAS_BUS_HOLD:
1106 val = pctl_readl(pctl, PADS_PU_PD_REG(pin));
1107 val &= ~(PADS_PU_PD_MASK << PADS_PU_PD_SHIFT(pin));
1108 val |= PADS_PU_PD_BUS << PADS_PU_PD_SHIFT(pin);
1109 pctl_writel(pctl, val, PADS_PU_PD_REG(pin));
1110 break;
1111 case PIN_CONFIG_SLEW_RATE:
1112 val = pctl_readl(pctl, PADS_SLEW_RATE_REG(pin));
1113 if (arg)
1114 val |= PADS_SLEW_RATE_BIT(pin);
1115 else
1116 val &= ~PADS_SLEW_RATE_BIT(pin);
1117 pctl_writel(pctl, val, PADS_SLEW_RATE_REG(pin));
1118 break;
1119 case PIN_CONFIG_DRIVE_STRENGTH:
1120 val = pctl_readl(pctl, PADS_DRIVE_STRENGTH_REG(pin));
1121 val &= ~(PADS_DRIVE_STRENGTH_MASK <<
1122 PADS_DRIVE_STRENGTH_SHIFT(pin));
1123 switch (arg) {
1124 case 2:
1125 drv = PADS_DRIVE_STRENGTH_2MA;
1126 break;
1127 case 4:
1128 drv = PADS_DRIVE_STRENGTH_4MA;
1129 break;
1130 case 8:
1131 drv = PADS_DRIVE_STRENGTH_8MA;
1132 break;
1133 case 12:
1134 drv = PADS_DRIVE_STRENGTH_12MA;
1135 break;
1136 default:
1137 dev_err(pctl->dev,
1138 "Drive strength %umA not supported\n",
1139 arg);
1140 return -EINVAL;
1141 }
1142 val |= drv << PADS_DRIVE_STRENGTH_SHIFT(pin);
1143 pctl_writel(pctl, val, PADS_DRIVE_STRENGTH_REG(pin));
1144 break;
1145 default:
1146 dev_err(pctl->dev, "Property %u not supported\n",
1147 param);
1148 return -ENOTSUPP;
1149 }
1150 }
1151
1152 return 0;
1153 }
1154
1155 static const struct pinconf_ops pistachio_pinconf_ops = {
1156 .pin_config_get = pistachio_pinconf_get,
1157 .pin_config_set = pistachio_pinconf_set,
1158 .is_generic = true,
1159 };
1160
1161 static struct pinctrl_desc pistachio_pinctrl_desc = {
1162 .name = "pistachio-pinctrl",
1163 .pctlops = &pistachio_pinctrl_ops,
1164 .pmxops = &pistachio_pinmux_ops,
1165 .confops = &pistachio_pinconf_ops,
1166 };
1167
1168 static int pistachio_gpio_get_direction(struct gpio_chip *chip, unsigned offset)
1169 {
1170 struct pistachio_gpio_bank *bank = gpiochip_get_data(chip);
1171
1172 return !(gpio_readl(bank, GPIO_OUTPUT_EN) & BIT(offset));
1173 }
1174
1175 static int pistachio_gpio_get(struct gpio_chip *chip, unsigned offset)
1176 {
1177 struct pistachio_gpio_bank *bank = gpiochip_get_data(chip);
1178 u32 reg;
1179
1180 if (gpio_readl(bank, GPIO_OUTPUT_EN) & BIT(offset))
1181 reg = GPIO_OUTPUT;
1182 else
1183 reg = GPIO_INPUT;
1184
1185 return !!(gpio_readl(bank, reg) & BIT(offset));
1186 }
1187
1188 static void pistachio_gpio_set(struct gpio_chip *chip, unsigned offset,
1189 int value)
1190 {
1191 struct pistachio_gpio_bank *bank = gpiochip_get_data(chip);
1192
1193 gpio_mask_writel(bank, GPIO_OUTPUT, offset, !!value);
1194 }
1195
1196 static int pistachio_gpio_direction_input(struct gpio_chip *chip,
1197 unsigned offset)
1198 {
1199 struct pistachio_gpio_bank *bank = gpiochip_get_data(chip);
1200
1201 gpio_mask_writel(bank, GPIO_OUTPUT_EN, offset, 0);
1202 gpio_enable(bank, offset);
1203
1204 return 0;
1205 }
1206
1207 static int pistachio_gpio_direction_output(struct gpio_chip *chip,
1208 unsigned offset, int value)
1209 {
1210 struct pistachio_gpio_bank *bank = gpiochip_get_data(chip);
1211
1212 pistachio_gpio_set(chip, offset, value);
1213 gpio_mask_writel(bank, GPIO_OUTPUT_EN, offset, 1);
1214 gpio_enable(bank, offset);
1215
1216 return 0;
1217 }
1218
1219 static void pistachio_gpio_irq_ack(struct irq_data *data)
1220 {
1221 struct pistachio_gpio_bank *bank = irqd_to_bank(data);
1222
1223 gpio_mask_writel(bank, GPIO_INTERRUPT_STATUS, data->hwirq, 0);
1224 }
1225
1226 static void pistachio_gpio_irq_mask(struct irq_data *data)
1227 {
1228 struct pistachio_gpio_bank *bank = irqd_to_bank(data);
1229
1230 gpio_mask_writel(bank, GPIO_INTERRUPT_EN, data->hwirq, 0);
1231 }
1232
1233 static void pistachio_gpio_irq_unmask(struct irq_data *data)
1234 {
1235 struct pistachio_gpio_bank *bank = irqd_to_bank(data);
1236
1237 gpio_mask_writel(bank, GPIO_INTERRUPT_EN, data->hwirq, 1);
1238 }
1239
1240 static unsigned int pistachio_gpio_irq_startup(struct irq_data *data)
1241 {
1242 struct gpio_chip *chip = irq_data_get_irq_chip_data(data);
1243
1244 pistachio_gpio_direction_input(chip, data->hwirq);
1245 pistachio_gpio_irq_unmask(data);
1246
1247 return 0;
1248 }
1249
1250 static int pistachio_gpio_irq_set_type(struct irq_data *data, unsigned int type)
1251 {
1252 struct pistachio_gpio_bank *bank = irqd_to_bank(data);
1253
1254 switch (type & IRQ_TYPE_SENSE_MASK) {
1255 case IRQ_TYPE_EDGE_RISING:
1256 gpio_mask_writel(bank, GPIO_INPUT_POLARITY, data->hwirq, 1);
1257 gpio_mask_writel(bank, GPIO_INTERRUPT_TYPE, data->hwirq,
1258 GPIO_INTERRUPT_TYPE_EDGE);
1259 gpio_mask_writel(bank, GPIO_INTERRUPT_EDGE, data->hwirq,
1260 GPIO_INTERRUPT_EDGE_SINGLE);
1261 break;
1262 case IRQ_TYPE_EDGE_FALLING:
1263 gpio_mask_writel(bank, GPIO_INPUT_POLARITY, data->hwirq, 0);
1264 gpio_mask_writel(bank, GPIO_INTERRUPT_TYPE, data->hwirq,
1265 GPIO_INTERRUPT_TYPE_EDGE);
1266 gpio_mask_writel(bank, GPIO_INTERRUPT_EDGE, data->hwirq,
1267 GPIO_INTERRUPT_EDGE_SINGLE);
1268 break;
1269 case IRQ_TYPE_EDGE_BOTH:
1270 gpio_mask_writel(bank, GPIO_INTERRUPT_TYPE, data->hwirq,
1271 GPIO_INTERRUPT_TYPE_EDGE);
1272 gpio_mask_writel(bank, GPIO_INTERRUPT_EDGE, data->hwirq,
1273 GPIO_INTERRUPT_EDGE_DUAL);
1274 break;
1275 case IRQ_TYPE_LEVEL_HIGH:
1276 gpio_mask_writel(bank, GPIO_INPUT_POLARITY, data->hwirq, 1);
1277 gpio_mask_writel(bank, GPIO_INTERRUPT_TYPE, data->hwirq,
1278 GPIO_INTERRUPT_TYPE_LEVEL);
1279 break;
1280 case IRQ_TYPE_LEVEL_LOW:
1281 gpio_mask_writel(bank, GPIO_INPUT_POLARITY, data->hwirq, 0);
1282 gpio_mask_writel(bank, GPIO_INTERRUPT_TYPE, data->hwirq,
1283 GPIO_INTERRUPT_TYPE_LEVEL);
1284 break;
1285 default:
1286 return -EINVAL;
1287 }
1288
1289 if (type & IRQ_TYPE_LEVEL_MASK)
1290 irq_set_handler_locked(data, handle_level_irq);
1291 else
1292 irq_set_handler_locked(data, handle_edge_irq);
1293
1294 return 0;
1295 }
1296
1297 static void pistachio_gpio_irq_handler(struct irq_desc *desc)
1298 {
1299 struct gpio_chip *gc = irq_desc_get_handler_data(desc);
1300 struct pistachio_gpio_bank *bank = gpiochip_get_data(gc);
1301 struct irq_chip *chip = irq_desc_get_chip(desc);
1302 unsigned long pending;
1303 unsigned int pin;
1304
1305 chained_irq_enter(chip, desc);
1306 pending = gpio_readl(bank, GPIO_INTERRUPT_STATUS) &
1307 gpio_readl(bank, GPIO_INTERRUPT_EN);
1308 for_each_set_bit(pin, &pending, 16)
1309 generic_handle_irq(irq_linear_revmap(gc->irq.domain, pin));
1310 chained_irq_exit(chip, desc);
1311 }
1312
1313 #define GPIO_BANK(_bank, _pin_base, _npins) \
1314 { \
1315 .pin_base = _pin_base, \
1316 .npins = _npins, \
1317 .gpio_chip = { \
1318 .label = "GPIO" #_bank, \
1319 .request = gpiochip_generic_request, \
1320 .free = gpiochip_generic_free, \
1321 .get_direction = pistachio_gpio_get_direction, \
1322 .direction_input = pistachio_gpio_direction_input, \
1323 .direction_output = pistachio_gpio_direction_output, \
1324 .get = pistachio_gpio_get, \
1325 .set = pistachio_gpio_set, \
1326 .base = _pin_base, \
1327 .ngpio = _npins, \
1328 }, \
1329 .irq_chip = { \
1330 .name = "GPIO" #_bank, \
1331 .irq_startup = pistachio_gpio_irq_startup, \
1332 .irq_ack = pistachio_gpio_irq_ack, \
1333 .irq_mask = pistachio_gpio_irq_mask, \
1334 .irq_unmask = pistachio_gpio_irq_unmask, \
1335 .irq_set_type = pistachio_gpio_irq_set_type, \
1336 }, \
1337 }
1338
1339 static struct pistachio_gpio_bank pistachio_gpio_banks[] = {
1340 GPIO_BANK(0, PISTACHIO_PIN_MFIO(0), 16),
1341 GPIO_BANK(1, PISTACHIO_PIN_MFIO(16), 16),
1342 GPIO_BANK(2, PISTACHIO_PIN_MFIO(32), 16),
1343 GPIO_BANK(3, PISTACHIO_PIN_MFIO(48), 16),
1344 GPIO_BANK(4, PISTACHIO_PIN_MFIO(64), 16),
1345 GPIO_BANK(5, PISTACHIO_PIN_MFIO(80), 10),
1346 };
1347
1348 static int pistachio_gpio_register(struct pistachio_pinctrl *pctl)
1349 {
1350 struct device_node *node = pctl->dev->of_node;
1351 struct pistachio_gpio_bank *bank;
1352 unsigned int i;
1353 int irq, ret = 0;
1354
1355 for (i = 0; i < pctl->nbanks; i++) {
1356 char child_name[sizeof("gpioXX")];
1357 struct device_node *child;
1358
1359 snprintf(child_name, sizeof(child_name), "gpio%d", i);
1360 child = of_get_child_by_name(node, child_name);
1361 if (!child) {
1362 dev_err(pctl->dev, "No node for bank %u\n", i);
1363 ret = -ENODEV;
1364 goto err;
1365 }
1366
1367 if (!of_find_property(child, "gpio-controller", NULL)) {
1368 dev_err(pctl->dev,
1369 "No gpio-controller property for bank %u\n", i);
1370 ret = -ENODEV;
1371 goto err;
1372 }
1373
1374 irq = irq_of_parse_and_map(child, 0);
1375 if (irq < 0) {
1376 dev_err(pctl->dev, "No IRQ for bank %u: %d\n", i, irq);
1377 ret = irq;
1378 goto err;
1379 }
1380
1381 bank = &pctl->gpio_banks[i];
1382 bank->pctl = pctl;
1383 bank->base = pctl->base + GPIO_BANK_BASE(i);
1384
1385 bank->gpio_chip.parent = pctl->dev;
1386 bank->gpio_chip.of_node = child;
1387 ret = gpiochip_add_data(&bank->gpio_chip, bank);
1388 if (ret < 0) {
1389 dev_err(pctl->dev, "Failed to add GPIO chip %u: %d\n",
1390 i, ret);
1391 goto err;
1392 }
1393
1394 ret = gpiochip_irqchip_add(&bank->gpio_chip, &bank->irq_chip,
1395 0, handle_level_irq, IRQ_TYPE_NONE);
1396 if (ret < 0) {
1397 dev_err(pctl->dev, "Failed to add IRQ chip %u: %d\n",
1398 i, ret);
1399 gpiochip_remove(&bank->gpio_chip);
1400 goto err;
1401 }
1402 gpiochip_set_chained_irqchip(&bank->gpio_chip, &bank->irq_chip,
1403 irq, pistachio_gpio_irq_handler);
1404
1405 ret = gpiochip_add_pin_range(&bank->gpio_chip,
1406 dev_name(pctl->dev), 0,
1407 bank->pin_base, bank->npins);
1408 if (ret < 0) {
1409 dev_err(pctl->dev, "Failed to add GPIO range %u: %d\n",
1410 i, ret);
1411 gpiochip_remove(&bank->gpio_chip);
1412 goto err;
1413 }
1414 }
1415
1416 return 0;
1417 err:
1418 for (; i > 0; i--) {
1419 bank = &pctl->gpio_banks[i - 1];
1420 gpiochip_remove(&bank->gpio_chip);
1421 }
1422 return ret;
1423 }
1424
1425 static const struct of_device_id pistachio_pinctrl_of_match[] = {
1426 { .compatible = "img,pistachio-system-pinctrl", },
1427 { },
1428 };
1429
1430 static int pistachio_pinctrl_probe(struct platform_device *pdev)
1431 {
1432 struct pistachio_pinctrl *pctl;
1433 struct resource *res;
1434
1435 pctl = devm_kzalloc(&pdev->dev, sizeof(*pctl), GFP_KERNEL);
1436 if (!pctl)
1437 return -ENOMEM;
1438 pctl->dev = &pdev->dev;
1439 dev_set_drvdata(&pdev->dev, pctl);
1440
1441 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
1442 pctl->base = devm_ioremap_resource(&pdev->dev, res);
1443 if (IS_ERR(pctl->base))
1444 return PTR_ERR(pctl->base);
1445
1446 pctl->pins = pistachio_pins;
1447 pctl->npins = ARRAY_SIZE(pistachio_pins);
1448 pctl->functions = pistachio_functions;
1449 pctl->nfunctions = ARRAY_SIZE(pistachio_functions);
1450 pctl->groups = pistachio_groups;
1451 pctl->ngroups = ARRAY_SIZE(pistachio_groups);
1452 pctl->gpio_banks = pistachio_gpio_banks;
1453 pctl->nbanks = ARRAY_SIZE(pistachio_gpio_banks);
1454
1455 pistachio_pinctrl_desc.pins = pctl->pins;
1456 pistachio_pinctrl_desc.npins = pctl->npins;
1457
1458 pctl->pctldev = devm_pinctrl_register(&pdev->dev, &pistachio_pinctrl_desc,
1459 pctl);
1460 if (IS_ERR(pctl->pctldev)) {
1461 dev_err(&pdev->dev, "Failed to register pinctrl device\n");
1462 return PTR_ERR(pctl->pctldev);
1463 }
1464
1465 return pistachio_gpio_register(pctl);
1466 }
1467
1468 static struct platform_driver pistachio_pinctrl_driver = {
1469 .driver = {
1470 .name = "pistachio-pinctrl",
1471 .of_match_table = pistachio_pinctrl_of_match,
1472 .suppress_bind_attrs = true,
1473 },
1474 .probe = pistachio_pinctrl_probe,
1475 };
1476
1477 static int __init pistachio_pinctrl_register(void)
1478 {
1479 return platform_driver_register(&pistachio_pinctrl_driver);
1480 }
1481 arch_initcall(pistachio_pinctrl_register);