xref: /linux/drivers/pinctrl/pinctrl-k210.c (revision 34dc1baba215b826e454b8d19e4f24adbeb7d00d)
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3  * Copyright (C) 2020 Sean Anderson <seanga2@gmail.com>
4  * Copyright (c) 2020 Western Digital Corporation or its affiliates.
5  */
6 #include <linux/bitfield.h>
7 #include <linux/clk.h>
8 #include <linux/io.h>
9 #include <linux/mfd/syscon.h>
10 #include <linux/of.h>
11 #include <linux/platform_device.h>
12 #include <linux/regmap.h>
13 #include <linux/seq_file.h>
14 #include <linux/slab.h>
15 
16 #include <linux/pinctrl/pinconf-generic.h>
17 #include <linux/pinctrl/pinconf.h>
18 #include <linux/pinctrl/pinctrl.h>
19 #include <linux/pinctrl/pinmux.h>
20 
21 #include <dt-bindings/pinctrl/k210-fpioa.h>
22 
23 #include "core.h"
24 #include "pinconf.h"
25 #include "pinctrl-utils.h"
26 
27 /*
28  * The K210 only implements 8 drive levels, even though
29  * there is register space for 16
30  */
31 #define K210_PC_DRIVE_MASK	GENMASK(11, 8)
32 #define K210_PC_DRIVE_SHIFT	8
33 #define K210_PC_DRIVE_0		(0 << K210_PC_DRIVE_SHIFT)
34 #define K210_PC_DRIVE_1		(1 << K210_PC_DRIVE_SHIFT)
35 #define K210_PC_DRIVE_2		(2 << K210_PC_DRIVE_SHIFT)
36 #define K210_PC_DRIVE_3		(3 << K210_PC_DRIVE_SHIFT)
37 #define K210_PC_DRIVE_4		(4 << K210_PC_DRIVE_SHIFT)
38 #define K210_PC_DRIVE_5		(5 << K210_PC_DRIVE_SHIFT)
39 #define K210_PC_DRIVE_6		(6 << K210_PC_DRIVE_SHIFT)
40 #define K210_PC_DRIVE_7		(7 << K210_PC_DRIVE_SHIFT)
41 #define K210_PC_DRIVE_MAX	7
42 #define K210_PC_MODE_MASK	GENMASK(23, 12)
43 
44 /*
45  * output enabled == PC_OE & (PC_OE_INV ^ FUNCTION_OE)
46  * where FUNCTION_OE is a physical signal from the function.
47  */
48 #define K210_PC_OE		BIT(12) /* Output Enable */
49 #define K210_PC_OE_INV		BIT(13) /* INVert Output Enable */
50 #define K210_PC_DO_OE		BIT(14) /* set Data Out to Output Enable sig */
51 #define K210_PC_DO_INV		BIT(15) /* INVert final Data Output */
52 #define K210_PC_PU		BIT(16) /* Pull Up */
53 #define K210_PC_PD		BIT(17) /* Pull Down */
54 /* Strong pull up not implemented on K210 */
55 #define K210_PC_SL		BIT(19) /* reduce SLew rate */
56 /* Same semantics as OE above */
57 #define K210_PC_IE		BIT(20) /* Input Enable */
58 #define K210_PC_IE_INV		BIT(21) /* INVert Input Enable */
59 #define K210_PC_DI_INV		BIT(22) /* INVert Data Input */
60 #define K210_PC_ST		BIT(23) /* Schmitt Trigger */
61 #define K210_PC_DI		BIT(31) /* raw Data Input */
62 
63 #define K210_PC_BIAS_MASK	(K210_PC_PU & K210_PC_PD)
64 
65 #define K210_PC_MODE_IN		(K210_PC_IE | K210_PC_ST)
66 #define K210_PC_MODE_OUT	(K210_PC_DRIVE_7 | K210_PC_OE)
67 #define K210_PC_MODE_I2C	(K210_PC_MODE_IN | K210_PC_SL | \
68 				 K210_PC_OE | K210_PC_PU)
69 #define K210_PC_MODE_SCCB	(K210_PC_MODE_I2C | \
70 				 K210_PC_OE_INV | K210_PC_IE_INV)
71 #define K210_PC_MODE_SPI	(K210_PC_MODE_IN | K210_PC_IE_INV | \
72 				 K210_PC_MODE_OUT | K210_PC_OE_INV)
73 #define K210_PC_MODE_GPIO	(K210_PC_MODE_IN | K210_PC_MODE_OUT)
74 
75 #define K210_PG_FUNC		GENMASK(7, 0)
76 #define K210_PG_DO		BIT(8)
77 #define K210_PG_PIN		GENMASK(22, 16)
78 
79 /*
80  * struct k210_fpioa: Kendryte K210 FPIOA memory mapped registers
81  * @pins: 48 32-bits IO pin registers
82  * @tie_en: 256 (one per function) input tie enable bits
83  * @tie_val: 256 (one per function) input tie value bits
84  */
85 struct k210_fpioa {
86 	u32 pins[48];
87 	u32 tie_en[8];
88 	u32 tie_val[8];
89 };
90 
91 struct k210_fpioa_data {
92 
93 	struct device *dev;
94 	struct pinctrl_dev *pctl;
95 
96 	struct k210_fpioa __iomem *fpioa;
97 	struct regmap *sysctl_map;
98 	u32 power_offset;
99 	struct clk *clk;
100 	struct clk *pclk;
101 };
102 
103 #define K210_PIN_NAME(i)	("IO_" #i)
104 #define K210_PIN(i)		[(i)] = PINCTRL_PIN((i), K210_PIN_NAME(i))
105 
106 static const struct pinctrl_pin_desc k210_pins[] = {
107 	K210_PIN(0),  K210_PIN(1),  K210_PIN(2),
108 	K210_PIN(3),  K210_PIN(4),  K210_PIN(5),
109 	K210_PIN(6),  K210_PIN(7),  K210_PIN(8),
110 	K210_PIN(9),  K210_PIN(10), K210_PIN(11),
111 	K210_PIN(12), K210_PIN(13), K210_PIN(14),
112 	K210_PIN(15), K210_PIN(16), K210_PIN(17),
113 	K210_PIN(18), K210_PIN(19), K210_PIN(20),
114 	K210_PIN(21), K210_PIN(22), K210_PIN(23),
115 	K210_PIN(24), K210_PIN(25), K210_PIN(26),
116 	K210_PIN(27), K210_PIN(28), K210_PIN(29),
117 	K210_PIN(30), K210_PIN(31), K210_PIN(32),
118 	K210_PIN(33), K210_PIN(34), K210_PIN(35),
119 	K210_PIN(36), K210_PIN(37), K210_PIN(38),
120 	K210_PIN(39), K210_PIN(40), K210_PIN(41),
121 	K210_PIN(42), K210_PIN(43), K210_PIN(44),
122 	K210_PIN(45), K210_PIN(46), K210_PIN(47)
123 };
124 
125 #define K210_NPINS ARRAY_SIZE(k210_pins)
126 
127 /*
128  * Pin groups: each of the 48 programmable pins is a group.
129  * To this are added 8 power domain groups, which for the purposes of
130  * the pin subsystem, contain no pins. The power domain groups only exist
131  * to set the power level. The id should never be used (since there are
132  * no pins 48-55).
133  */
134 static const char *const k210_group_names[] = {
135 	/* The first 48 groups are for pins, one each */
136 	K210_PIN_NAME(0),  K210_PIN_NAME(1),  K210_PIN_NAME(2),
137 	K210_PIN_NAME(3),  K210_PIN_NAME(4),  K210_PIN_NAME(5),
138 	K210_PIN_NAME(6),  K210_PIN_NAME(7),  K210_PIN_NAME(8),
139 	K210_PIN_NAME(9),  K210_PIN_NAME(10), K210_PIN_NAME(11),
140 	K210_PIN_NAME(12), K210_PIN_NAME(13), K210_PIN_NAME(14),
141 	K210_PIN_NAME(15), K210_PIN_NAME(16), K210_PIN_NAME(17),
142 	K210_PIN_NAME(18), K210_PIN_NAME(19), K210_PIN_NAME(20),
143 	K210_PIN_NAME(21), K210_PIN_NAME(22), K210_PIN_NAME(23),
144 	K210_PIN_NAME(24), K210_PIN_NAME(25), K210_PIN_NAME(26),
145 	K210_PIN_NAME(27), K210_PIN_NAME(28), K210_PIN_NAME(29),
146 	K210_PIN_NAME(30), K210_PIN_NAME(31), K210_PIN_NAME(32),
147 	K210_PIN_NAME(33), K210_PIN_NAME(34), K210_PIN_NAME(35),
148 	K210_PIN_NAME(36), K210_PIN_NAME(37), K210_PIN_NAME(38),
149 	K210_PIN_NAME(39), K210_PIN_NAME(40), K210_PIN_NAME(41),
150 	K210_PIN_NAME(42), K210_PIN_NAME(43), K210_PIN_NAME(44),
151 	K210_PIN_NAME(45), K210_PIN_NAME(46), K210_PIN_NAME(47),
152 	[48] = "A0", [49] = "A1", [50] = "A2",
153 	[51] = "B3", [52] = "B4", [53] = "B5",
154 	[54] = "C6", [55] = "C7"
155 };
156 
157 #define K210_NGROUPS	ARRAY_SIZE(k210_group_names)
158 
159 enum k210_pinctrl_mode_id {
160 	K210_PC_DEFAULT_DISABLED,
161 	K210_PC_DEFAULT_IN,
162 	K210_PC_DEFAULT_IN_TIE,
163 	K210_PC_DEFAULT_OUT,
164 	K210_PC_DEFAULT_I2C,
165 	K210_PC_DEFAULT_SCCB,
166 	K210_PC_DEFAULT_SPI,
167 	K210_PC_DEFAULT_GPIO,
168 	K210_PC_DEFAULT_INT13,
169 };
170 
171 #define K210_PC_DEFAULT(mode) \
172 	[K210_PC_DEFAULT_##mode] = K210_PC_MODE_##mode
173 
174 static const u32 k210_pinconf_mode_id_to_mode[] = {
175 	[K210_PC_DEFAULT_DISABLED] = 0,
176 	K210_PC_DEFAULT(IN),
177 	[K210_PC_DEFAULT_IN_TIE] = K210_PC_MODE_IN,
178 	K210_PC_DEFAULT(OUT),
179 	K210_PC_DEFAULT(I2C),
180 	K210_PC_DEFAULT(SCCB),
181 	K210_PC_DEFAULT(SPI),
182 	K210_PC_DEFAULT(GPIO),
183 	[K210_PC_DEFAULT_INT13] = K210_PC_MODE_IN | K210_PC_PU,
184 };
185 
186 #undef DEFAULT
187 
188 /*
189  * Pin functions configuration information.
190  */
191 struct k210_pcf_info {
192 	char name[15];
193 	u8 mode_id;
194 };
195 
196 #define K210_FUNC(id, mode)				\
197 	[K210_PCF_##id] = {				\
198 		.name = #id,				\
199 		.mode_id = K210_PC_DEFAULT_##mode	\
200 	}
201 
202 static const struct k210_pcf_info k210_pcf_infos[] = {
203 	K210_FUNC(JTAG_TCLK,		IN),
204 	K210_FUNC(JTAG_TDI,		IN),
205 	K210_FUNC(JTAG_TMS,		IN),
206 	K210_FUNC(JTAG_TDO,		OUT),
207 	K210_FUNC(SPI0_D0,		SPI),
208 	K210_FUNC(SPI0_D1,		SPI),
209 	K210_FUNC(SPI0_D2,		SPI),
210 	K210_FUNC(SPI0_D3,		SPI),
211 	K210_FUNC(SPI0_D4,		SPI),
212 	K210_FUNC(SPI0_D5,		SPI),
213 	K210_FUNC(SPI0_D6,		SPI),
214 	K210_FUNC(SPI0_D7,		SPI),
215 	K210_FUNC(SPI0_SS0,		OUT),
216 	K210_FUNC(SPI0_SS1,		OUT),
217 	K210_FUNC(SPI0_SS2,		OUT),
218 	K210_FUNC(SPI0_SS3,		OUT),
219 	K210_FUNC(SPI0_ARB,		IN_TIE),
220 	K210_FUNC(SPI0_SCLK,		OUT),
221 	K210_FUNC(UARTHS_RX,		IN),
222 	K210_FUNC(UARTHS_TX,		OUT),
223 	K210_FUNC(RESV6,		IN),
224 	K210_FUNC(RESV7,		IN),
225 	K210_FUNC(CLK_SPI1,		OUT),
226 	K210_FUNC(CLK_I2C1,		OUT),
227 	K210_FUNC(GPIOHS0,		GPIO),
228 	K210_FUNC(GPIOHS1,		GPIO),
229 	K210_FUNC(GPIOHS2,		GPIO),
230 	K210_FUNC(GPIOHS3,		GPIO),
231 	K210_FUNC(GPIOHS4,		GPIO),
232 	K210_FUNC(GPIOHS5,		GPIO),
233 	K210_FUNC(GPIOHS6,		GPIO),
234 	K210_FUNC(GPIOHS7,		GPIO),
235 	K210_FUNC(GPIOHS8,		GPIO),
236 	K210_FUNC(GPIOHS9,		GPIO),
237 	K210_FUNC(GPIOHS10,		GPIO),
238 	K210_FUNC(GPIOHS11,		GPIO),
239 	K210_FUNC(GPIOHS12,		GPIO),
240 	K210_FUNC(GPIOHS13,		GPIO),
241 	K210_FUNC(GPIOHS14,		GPIO),
242 	K210_FUNC(GPIOHS15,		GPIO),
243 	K210_FUNC(GPIOHS16,		GPIO),
244 	K210_FUNC(GPIOHS17,		GPIO),
245 	K210_FUNC(GPIOHS18,		GPIO),
246 	K210_FUNC(GPIOHS19,		GPIO),
247 	K210_FUNC(GPIOHS20,		GPIO),
248 	K210_FUNC(GPIOHS21,		GPIO),
249 	K210_FUNC(GPIOHS22,		GPIO),
250 	K210_FUNC(GPIOHS23,		GPIO),
251 	K210_FUNC(GPIOHS24,		GPIO),
252 	K210_FUNC(GPIOHS25,		GPIO),
253 	K210_FUNC(GPIOHS26,		GPIO),
254 	K210_FUNC(GPIOHS27,		GPIO),
255 	K210_FUNC(GPIOHS28,		GPIO),
256 	K210_FUNC(GPIOHS29,		GPIO),
257 	K210_FUNC(GPIOHS30,		GPIO),
258 	K210_FUNC(GPIOHS31,		GPIO),
259 	K210_FUNC(GPIO0,		GPIO),
260 	K210_FUNC(GPIO1,		GPIO),
261 	K210_FUNC(GPIO2,		GPIO),
262 	K210_FUNC(GPIO3,		GPIO),
263 	K210_FUNC(GPIO4,		GPIO),
264 	K210_FUNC(GPIO5,		GPIO),
265 	K210_FUNC(GPIO6,		GPIO),
266 	K210_FUNC(GPIO7,		GPIO),
267 	K210_FUNC(UART1_RX,		IN),
268 	K210_FUNC(UART1_TX,		OUT),
269 	K210_FUNC(UART2_RX,		IN),
270 	K210_FUNC(UART2_TX,		OUT),
271 	K210_FUNC(UART3_RX,		IN),
272 	K210_FUNC(UART3_TX,		OUT),
273 	K210_FUNC(SPI1_D0,		SPI),
274 	K210_FUNC(SPI1_D1,		SPI),
275 	K210_FUNC(SPI1_D2,		SPI),
276 	K210_FUNC(SPI1_D3,		SPI),
277 	K210_FUNC(SPI1_D4,		SPI),
278 	K210_FUNC(SPI1_D5,		SPI),
279 	K210_FUNC(SPI1_D6,		SPI),
280 	K210_FUNC(SPI1_D7,		SPI),
281 	K210_FUNC(SPI1_SS0,		OUT),
282 	K210_FUNC(SPI1_SS1,		OUT),
283 	K210_FUNC(SPI1_SS2,		OUT),
284 	K210_FUNC(SPI1_SS3,		OUT),
285 	K210_FUNC(SPI1_ARB,		IN_TIE),
286 	K210_FUNC(SPI1_SCLK,		OUT),
287 	K210_FUNC(SPI2_D0,		SPI),
288 	K210_FUNC(SPI2_SS,		IN),
289 	K210_FUNC(SPI2_SCLK,		IN),
290 	K210_FUNC(I2S0_MCLK,		OUT),
291 	K210_FUNC(I2S0_SCLK,		OUT),
292 	K210_FUNC(I2S0_WS,		OUT),
293 	K210_FUNC(I2S0_IN_D0,		IN),
294 	K210_FUNC(I2S0_IN_D1,		IN),
295 	K210_FUNC(I2S0_IN_D2,		IN),
296 	K210_FUNC(I2S0_IN_D3,		IN),
297 	K210_FUNC(I2S0_OUT_D0,		OUT),
298 	K210_FUNC(I2S0_OUT_D1,		OUT),
299 	K210_FUNC(I2S0_OUT_D2,		OUT),
300 	K210_FUNC(I2S0_OUT_D3,		OUT),
301 	K210_FUNC(I2S1_MCLK,		OUT),
302 	K210_FUNC(I2S1_SCLK,		OUT),
303 	K210_FUNC(I2S1_WS,		OUT),
304 	K210_FUNC(I2S1_IN_D0,		IN),
305 	K210_FUNC(I2S1_IN_D1,		IN),
306 	K210_FUNC(I2S1_IN_D2,		IN),
307 	K210_FUNC(I2S1_IN_D3,		IN),
308 	K210_FUNC(I2S1_OUT_D0,		OUT),
309 	K210_FUNC(I2S1_OUT_D1,		OUT),
310 	K210_FUNC(I2S1_OUT_D2,		OUT),
311 	K210_FUNC(I2S1_OUT_D3,		OUT),
312 	K210_FUNC(I2S2_MCLK,		OUT),
313 	K210_FUNC(I2S2_SCLK,		OUT),
314 	K210_FUNC(I2S2_WS,		OUT),
315 	K210_FUNC(I2S2_IN_D0,		IN),
316 	K210_FUNC(I2S2_IN_D1,		IN),
317 	K210_FUNC(I2S2_IN_D2,		IN),
318 	K210_FUNC(I2S2_IN_D3,		IN),
319 	K210_FUNC(I2S2_OUT_D0,		OUT),
320 	K210_FUNC(I2S2_OUT_D1,		OUT),
321 	K210_FUNC(I2S2_OUT_D2,		OUT),
322 	K210_FUNC(I2S2_OUT_D3,		OUT),
323 	K210_FUNC(RESV0,		DISABLED),
324 	K210_FUNC(RESV1,		DISABLED),
325 	K210_FUNC(RESV2,		DISABLED),
326 	K210_FUNC(RESV3,		DISABLED),
327 	K210_FUNC(RESV4,		DISABLED),
328 	K210_FUNC(RESV5,		DISABLED),
329 	K210_FUNC(I2C0_SCLK,		I2C),
330 	K210_FUNC(I2C0_SDA,		I2C),
331 	K210_FUNC(I2C1_SCLK,		I2C),
332 	K210_FUNC(I2C1_SDA,		I2C),
333 	K210_FUNC(I2C2_SCLK,		I2C),
334 	K210_FUNC(I2C2_SDA,		I2C),
335 	K210_FUNC(DVP_XCLK,		OUT),
336 	K210_FUNC(DVP_RST,		OUT),
337 	K210_FUNC(DVP_PWDN,		OUT),
338 	K210_FUNC(DVP_VSYNC,		IN),
339 	K210_FUNC(DVP_HSYNC,		IN),
340 	K210_FUNC(DVP_PCLK,		IN),
341 	K210_FUNC(DVP_D0,		IN),
342 	K210_FUNC(DVP_D1,		IN),
343 	K210_FUNC(DVP_D2,		IN),
344 	K210_FUNC(DVP_D3,		IN),
345 	K210_FUNC(DVP_D4,		IN),
346 	K210_FUNC(DVP_D5,		IN),
347 	K210_FUNC(DVP_D6,		IN),
348 	K210_FUNC(DVP_D7,		IN),
349 	K210_FUNC(SCCB_SCLK,		SCCB),
350 	K210_FUNC(SCCB_SDA,		SCCB),
351 	K210_FUNC(UART1_CTS,		IN),
352 	K210_FUNC(UART1_DSR,		IN),
353 	K210_FUNC(UART1_DCD,		IN),
354 	K210_FUNC(UART1_RI,		IN),
355 	K210_FUNC(UART1_SIR_IN,		IN),
356 	K210_FUNC(UART1_DTR,		OUT),
357 	K210_FUNC(UART1_RTS,		OUT),
358 	K210_FUNC(UART1_OUT2,		OUT),
359 	K210_FUNC(UART1_OUT1,		OUT),
360 	K210_FUNC(UART1_SIR_OUT,	OUT),
361 	K210_FUNC(UART1_BAUD,		OUT),
362 	K210_FUNC(UART1_RE,		OUT),
363 	K210_FUNC(UART1_DE,		OUT),
364 	K210_FUNC(UART1_RS485_EN,	OUT),
365 	K210_FUNC(UART2_CTS,		IN),
366 	K210_FUNC(UART2_DSR,		IN),
367 	K210_FUNC(UART2_DCD,		IN),
368 	K210_FUNC(UART2_RI,		IN),
369 	K210_FUNC(UART2_SIR_IN,		IN),
370 	K210_FUNC(UART2_DTR,		OUT),
371 	K210_FUNC(UART2_RTS,		OUT),
372 	K210_FUNC(UART2_OUT2,		OUT),
373 	K210_FUNC(UART2_OUT1,		OUT),
374 	K210_FUNC(UART2_SIR_OUT,	OUT),
375 	K210_FUNC(UART2_BAUD,		OUT),
376 	K210_FUNC(UART2_RE,		OUT),
377 	K210_FUNC(UART2_DE,		OUT),
378 	K210_FUNC(UART2_RS485_EN,	OUT),
379 	K210_FUNC(UART3_CTS,		IN),
380 	K210_FUNC(UART3_DSR,		IN),
381 	K210_FUNC(UART3_DCD,		IN),
382 	K210_FUNC(UART3_RI,		IN),
383 	K210_FUNC(UART3_SIR_IN,		IN),
384 	K210_FUNC(UART3_DTR,		OUT),
385 	K210_FUNC(UART3_RTS,		OUT),
386 	K210_FUNC(UART3_OUT2,		OUT),
387 	K210_FUNC(UART3_OUT1,		OUT),
388 	K210_FUNC(UART3_SIR_OUT,	OUT),
389 	K210_FUNC(UART3_BAUD,		OUT),
390 	K210_FUNC(UART3_RE,		OUT),
391 	K210_FUNC(UART3_DE,		OUT),
392 	K210_FUNC(UART3_RS485_EN,	OUT),
393 	K210_FUNC(TIMER0_TOGGLE1,	OUT),
394 	K210_FUNC(TIMER0_TOGGLE2,	OUT),
395 	K210_FUNC(TIMER0_TOGGLE3,	OUT),
396 	K210_FUNC(TIMER0_TOGGLE4,	OUT),
397 	K210_FUNC(TIMER1_TOGGLE1,	OUT),
398 	K210_FUNC(TIMER1_TOGGLE2,	OUT),
399 	K210_FUNC(TIMER1_TOGGLE3,	OUT),
400 	K210_FUNC(TIMER1_TOGGLE4,	OUT),
401 	K210_FUNC(TIMER2_TOGGLE1,	OUT),
402 	K210_FUNC(TIMER2_TOGGLE2,	OUT),
403 	K210_FUNC(TIMER2_TOGGLE3,	OUT),
404 	K210_FUNC(TIMER2_TOGGLE4,	OUT),
405 	K210_FUNC(CLK_SPI2,		OUT),
406 	K210_FUNC(CLK_I2C2,		OUT),
407 	K210_FUNC(INTERNAL0,		OUT),
408 	K210_FUNC(INTERNAL1,		OUT),
409 	K210_FUNC(INTERNAL2,		OUT),
410 	K210_FUNC(INTERNAL3,		OUT),
411 	K210_FUNC(INTERNAL4,		OUT),
412 	K210_FUNC(INTERNAL5,		OUT),
413 	K210_FUNC(INTERNAL6,		OUT),
414 	K210_FUNC(INTERNAL7,		OUT),
415 	K210_FUNC(INTERNAL8,		OUT),
416 	K210_FUNC(INTERNAL9,		IN),
417 	K210_FUNC(INTERNAL10,		IN),
418 	K210_FUNC(INTERNAL11,		IN),
419 	K210_FUNC(INTERNAL12,		IN),
420 	K210_FUNC(INTERNAL13,		INT13),
421 	K210_FUNC(INTERNAL14,		I2C),
422 	K210_FUNC(INTERNAL15,		IN),
423 	K210_FUNC(INTERNAL16,		IN),
424 	K210_FUNC(INTERNAL17,		IN),
425 	K210_FUNC(CONSTANT,		DISABLED),
426 	K210_FUNC(INTERNAL18,		IN),
427 	K210_FUNC(DEBUG0,		OUT),
428 	K210_FUNC(DEBUG1,		OUT),
429 	K210_FUNC(DEBUG2,		OUT),
430 	K210_FUNC(DEBUG3,		OUT),
431 	K210_FUNC(DEBUG4,		OUT),
432 	K210_FUNC(DEBUG5,		OUT),
433 	K210_FUNC(DEBUG6,		OUT),
434 	K210_FUNC(DEBUG7,		OUT),
435 	K210_FUNC(DEBUG8,		OUT),
436 	K210_FUNC(DEBUG9,		OUT),
437 	K210_FUNC(DEBUG10,		OUT),
438 	K210_FUNC(DEBUG11,		OUT),
439 	K210_FUNC(DEBUG12,		OUT),
440 	K210_FUNC(DEBUG13,		OUT),
441 	K210_FUNC(DEBUG14,		OUT),
442 	K210_FUNC(DEBUG15,		OUT),
443 	K210_FUNC(DEBUG16,		OUT),
444 	K210_FUNC(DEBUG17,		OUT),
445 	K210_FUNC(DEBUG18,		OUT),
446 	K210_FUNC(DEBUG19,		OUT),
447 	K210_FUNC(DEBUG20,		OUT),
448 	K210_FUNC(DEBUG21,		OUT),
449 	K210_FUNC(DEBUG22,		OUT),
450 	K210_FUNC(DEBUG23,		OUT),
451 	K210_FUNC(DEBUG24,		OUT),
452 	K210_FUNC(DEBUG25,		OUT),
453 	K210_FUNC(DEBUG26,		OUT),
454 	K210_FUNC(DEBUG27,		OUT),
455 	K210_FUNC(DEBUG28,		OUT),
456 	K210_FUNC(DEBUG29,		OUT),
457 	K210_FUNC(DEBUG30,		OUT),
458 	K210_FUNC(DEBUG31,		OUT),
459 };
460 
461 #define PIN_CONFIG_OUTPUT_INVERT	(PIN_CONFIG_END + 1)
462 #define PIN_CONFIG_INPUT_INVERT		(PIN_CONFIG_END + 2)
463 
464 static const struct pinconf_generic_params k210_pinconf_custom_params[] = {
465 	{ "output-polarity-invert", PIN_CONFIG_OUTPUT_INVERT, 1 },
466 	{ "input-polarity-invert",  PIN_CONFIG_INPUT_INVERT, 1 },
467 };
468 
469 /*
470  * Max drive strength in uA.
471  */
472 static const int k210_pinconf_drive_strength[] = {
473 	[0] = 11200,
474 	[1] = 16800,
475 	[2] = 22300,
476 	[3] = 27800,
477 	[4] = 33300,
478 	[5] = 38700,
479 	[6] = 44100,
480 	[7] = 49500,
481 };
482 
483 static int k210_pinconf_get_drive(unsigned int max_strength_ua)
484 {
485 	int i;
486 
487 	for (i = K210_PC_DRIVE_MAX; i >= 0; i--) {
488 		if (k210_pinconf_drive_strength[i] <= max_strength_ua)
489 			return i;
490 	}
491 
492 	return -EINVAL;
493 }
494 
495 static void k210_pinmux_set_pin_function(struct pinctrl_dev *pctldev,
496 					 u32 pin, u32 func)
497 {
498 	struct k210_fpioa_data *pdata = pinctrl_dev_get_drvdata(pctldev);
499 	const struct k210_pcf_info *info = &k210_pcf_infos[func];
500 	u32 mode = k210_pinconf_mode_id_to_mode[info->mode_id];
501 	u32 val = func | mode;
502 
503 	dev_dbg(pdata->dev, "set pin %u function %s (%u) -> 0x%08x\n",
504 		pin, info->name, func, val);
505 
506 	writel(val, &pdata->fpioa->pins[pin]);
507 }
508 
509 static int k210_pinconf_set_param(struct pinctrl_dev *pctldev,
510 				  unsigned int pin,
511 				  unsigned int param, unsigned int arg)
512 {
513 	struct k210_fpioa_data *pdata = pinctrl_dev_get_drvdata(pctldev);
514 	u32 val = readl(&pdata->fpioa->pins[pin]);
515 	int drive;
516 
517 	dev_dbg(pdata->dev, "set pin %u param %u, arg 0x%x\n",
518 		pin, param, arg);
519 
520 	switch (param) {
521 	case PIN_CONFIG_BIAS_DISABLE:
522 		val &= ~K210_PC_BIAS_MASK;
523 		break;
524 	case PIN_CONFIG_BIAS_PULL_DOWN:
525 		if (!arg)
526 			return -EINVAL;
527 		val |= K210_PC_PD;
528 		break;
529 	case PIN_CONFIG_BIAS_PULL_UP:
530 		if (!arg)
531 			return -EINVAL;
532 		val |= K210_PC_PU;
533 		break;
534 	case PIN_CONFIG_DRIVE_STRENGTH:
535 		arg *= 1000;
536 		fallthrough;
537 	case PIN_CONFIG_DRIVE_STRENGTH_UA:
538 		drive = k210_pinconf_get_drive(arg);
539 		if (drive < 0)
540 			return drive;
541 		val &= ~K210_PC_DRIVE_MASK;
542 		val |= FIELD_PREP(K210_PC_DRIVE_MASK, drive);
543 		break;
544 	case PIN_CONFIG_INPUT_ENABLE:
545 		if (arg)
546 			val |= K210_PC_IE;
547 		else
548 			val &= ~K210_PC_IE;
549 		break;
550 	case PIN_CONFIG_INPUT_SCHMITT_ENABLE:
551 		if (arg)
552 			val |= K210_PC_ST;
553 		else
554 			val &= ~K210_PC_ST;
555 		break;
556 	case PIN_CONFIG_OUTPUT:
557 		k210_pinmux_set_pin_function(pctldev, pin, K210_PCF_CONSTANT);
558 		val = readl(&pdata->fpioa->pins[pin]);
559 		val |= K210_PC_MODE_OUT;
560 		if (!arg)
561 			val |= K210_PC_DO_INV;
562 		break;
563 	case PIN_CONFIG_OUTPUT_ENABLE:
564 		if (arg)
565 			val |= K210_PC_OE;
566 		else
567 			val &= ~K210_PC_OE;
568 		break;
569 	case PIN_CONFIG_SLEW_RATE:
570 		if (arg)
571 			val |= K210_PC_SL;
572 		else
573 			val &= ~K210_PC_SL;
574 		break;
575 	case PIN_CONFIG_OUTPUT_INVERT:
576 		if (arg)
577 			val |= K210_PC_DO_INV;
578 		else
579 			val &= ~K210_PC_DO_INV;
580 		break;
581 	case PIN_CONFIG_INPUT_INVERT:
582 		if (arg)
583 			val |= K210_PC_DI_INV;
584 		else
585 			val &= ~K210_PC_DI_INV;
586 		break;
587 	default:
588 		return -EINVAL;
589 	}
590 
591 	writel(val, &pdata->fpioa->pins[pin]);
592 
593 	return 0;
594 }
595 
596 static int k210_pinconf_set(struct pinctrl_dev *pctldev, unsigned int pin,
597 			    unsigned long *configs, unsigned int num_configs)
598 {
599 	unsigned int param, arg;
600 	int i, ret;
601 
602 	if (WARN_ON(pin >= K210_NPINS))
603 		return -EINVAL;
604 
605 	for (i = 0; i < num_configs; i++) {
606 		param = pinconf_to_config_param(configs[i]);
607 		arg = pinconf_to_config_argument(configs[i]);
608 		ret = k210_pinconf_set_param(pctldev, pin, param, arg);
609 		if (ret)
610 			return ret;
611 	}
612 
613 	return 0;
614 }
615 
616 static void k210_pinconf_dbg_show(struct pinctrl_dev *pctldev,
617 				  struct seq_file *s, unsigned int pin)
618 {
619 	struct k210_fpioa_data *pdata = pinctrl_dev_get_drvdata(pctldev);
620 
621 	seq_printf(s, "%#x", readl(&pdata->fpioa->pins[pin]));
622 }
623 
624 static int k210_pinconf_group_set(struct pinctrl_dev *pctldev,
625 				  unsigned int selector, unsigned long *configs,
626 				  unsigned int num_configs)
627 {
628 	struct k210_fpioa_data *pdata = pinctrl_dev_get_drvdata(pctldev);
629 	unsigned int param, arg;
630 	u32 bit;
631 	int i;
632 
633 	/* Pins should be configured with pinmux, not groups*/
634 	if (selector < K210_NPINS)
635 		return -EINVAL;
636 
637 	/* Otherwise it's a power domain */
638 	for (i = 0; i < num_configs; i++) {
639 		param = pinconf_to_config_param(configs[i]);
640 		if (param != PIN_CONFIG_POWER_SOURCE)
641 			return -EINVAL;
642 
643 		arg = pinconf_to_config_argument(configs[i]);
644 		bit = BIT(selector - K210_NPINS);
645 		regmap_update_bits(pdata->sysctl_map,
646 				   pdata->power_offset,
647 				   bit, arg ? bit : 0);
648 	}
649 
650 	return 0;
651 }
652 
653 static void k210_pinconf_group_dbg_show(struct pinctrl_dev *pctldev,
654 					struct seq_file *s,
655 					unsigned int selector)
656 {
657 	struct k210_fpioa_data *pdata = pinctrl_dev_get_drvdata(pctldev);
658 	int ret;
659 	u32 val;
660 
661 	if (selector < K210_NPINS)
662 		return k210_pinconf_dbg_show(pctldev, s, selector);
663 
664 	ret = regmap_read(pdata->sysctl_map, pdata->power_offset, &val);
665 	if (ret) {
666 		dev_err(pdata->dev, "Failed to read power reg\n");
667 		return;
668 	}
669 
670 	seq_printf(s, "%s: %s V", k210_group_names[selector],
671 		   val & BIT(selector - K210_NPINS) ? "1.8" : "3.3");
672 }
673 
674 static const struct pinconf_ops k210_pinconf_ops = {
675 	.is_generic = true,
676 	.pin_config_set = k210_pinconf_set,
677 	.pin_config_group_set = k210_pinconf_group_set,
678 	.pin_config_dbg_show = k210_pinconf_dbg_show,
679 	.pin_config_group_dbg_show = k210_pinconf_group_dbg_show,
680 };
681 
682 static int k210_pinmux_get_function_count(struct pinctrl_dev *pctldev)
683 {
684 	return ARRAY_SIZE(k210_pcf_infos);
685 }
686 
687 static const char *k210_pinmux_get_function_name(struct pinctrl_dev *pctldev,
688 						 unsigned int selector)
689 {
690 	return k210_pcf_infos[selector].name;
691 }
692 
693 static int k210_pinmux_get_function_groups(struct pinctrl_dev *pctldev,
694 					   unsigned int selector,
695 					   const char * const **groups,
696 					   unsigned int * const num_groups)
697 {
698 	/* Any function can be mapped to any pin */
699 	*groups = k210_group_names;
700 	*num_groups = K210_NPINS;
701 
702 	return 0;
703 }
704 
705 static int k210_pinmux_set_mux(struct pinctrl_dev *pctldev,
706 			       unsigned int function,
707 			       unsigned int group)
708 {
709 	/* Can't mux power domains */
710 	if (group >= K210_NPINS)
711 		return -EINVAL;
712 
713 	k210_pinmux_set_pin_function(pctldev, group, function);
714 
715 	return 0;
716 }
717 
718 static const struct pinmux_ops k210_pinmux_ops = {
719 	.get_functions_count = k210_pinmux_get_function_count,
720 	.get_function_name = k210_pinmux_get_function_name,
721 	.get_function_groups = k210_pinmux_get_function_groups,
722 	.set_mux = k210_pinmux_set_mux,
723 	.strict = true,
724 };
725 
726 static int k210_pinctrl_get_groups_count(struct pinctrl_dev *pctldev)
727 {
728 	return K210_NGROUPS;
729 }
730 
731 static const char *k210_pinctrl_get_group_name(struct pinctrl_dev *pctldev,
732 					       unsigned int group)
733 {
734 	return k210_group_names[group];
735 }
736 
737 static int k210_pinctrl_get_group_pins(struct pinctrl_dev *pctldev,
738 				       unsigned int group,
739 				       const unsigned int **pins,
740 				       unsigned int *npins)
741 {
742 	if (group >= K210_NPINS) {
743 		*pins = NULL;
744 		*npins = 0;
745 		return 0;
746 	}
747 
748 	*pins = &k210_pins[group].number;
749 	*npins = 1;
750 
751 	return 0;
752 }
753 
754 static void k210_pinctrl_pin_dbg_show(struct pinctrl_dev *pctldev,
755 				      struct seq_file *s, unsigned int offset)
756 {
757 	seq_printf(s, "%s", dev_name(pctldev->dev));
758 }
759 
760 static int k210_pinctrl_dt_subnode_to_map(struct pinctrl_dev *pctldev,
761 					  struct device_node *np,
762 					  struct pinctrl_map **map,
763 					  unsigned int *reserved_maps,
764 					  unsigned int *num_maps)
765 {
766 	struct property *prop;
767 	const __be32 *p;
768 	int ret, pinmux_groups;
769 	u32 pinmux_group;
770 	unsigned long *configs = NULL;
771 	unsigned int num_configs = 0;
772 	unsigned int reserve = 0;
773 
774 	ret = of_property_count_strings(np, "groups");
775 	if (!ret)
776 		return pinconf_generic_dt_subnode_to_map(pctldev, np, map,
777 						reserved_maps, num_maps,
778 						PIN_MAP_TYPE_CONFIGS_GROUP);
779 
780 	pinmux_groups = of_property_count_u32_elems(np, "pinmux");
781 	if (pinmux_groups <= 0) {
782 		/* Ignore this node */
783 		return 0;
784 	}
785 
786 	ret = pinconf_generic_parse_dt_config(np, pctldev, &configs,
787 					      &num_configs);
788 	if (ret < 0) {
789 		dev_err(pctldev->dev, "%pOF: could not parse node property\n",
790 			np);
791 		return ret;
792 	}
793 
794 	reserve = pinmux_groups * (1 + num_configs);
795 	ret = pinctrl_utils_reserve_map(pctldev, map, reserved_maps, num_maps,
796 					reserve);
797 	if (ret < 0)
798 		goto exit;
799 
800 	of_property_for_each_u32(np, "pinmux", prop, p, pinmux_group) {
801 		const char *group_name, *func_name;
802 		u32 pin = FIELD_GET(K210_PG_PIN, pinmux_group);
803 		u32 func = FIELD_GET(K210_PG_FUNC, pinmux_group);
804 
805 		if (pin >= K210_NPINS) {
806 			ret = -EINVAL;
807 			goto exit;
808 		}
809 
810 		group_name = k210_group_names[pin];
811 		func_name = k210_pcf_infos[func].name;
812 
813 		dev_dbg(pctldev->dev, "Pinmux %s: pin %u func %s\n",
814 			np->name, pin, func_name);
815 
816 		ret = pinctrl_utils_add_map_mux(pctldev, map, reserved_maps,
817 						num_maps, group_name,
818 						func_name);
819 		if (ret < 0) {
820 			dev_err(pctldev->dev, "%pOF add mux map failed %d\n",
821 				np, ret);
822 			goto exit;
823 		}
824 
825 		if (num_configs) {
826 			ret = pinctrl_utils_add_map_configs(pctldev, map,
827 					reserved_maps, num_maps, group_name,
828 					configs, num_configs,
829 					PIN_MAP_TYPE_CONFIGS_PIN);
830 			if (ret < 0) {
831 				dev_err(pctldev->dev,
832 					"%pOF add configs map failed %d\n",
833 					np, ret);
834 				goto exit;
835 			}
836 		}
837 	}
838 
839 	ret = 0;
840 
841 exit:
842 	kfree(configs);
843 	return ret;
844 }
845 
846 static int k210_pinctrl_dt_node_to_map(struct pinctrl_dev *pctldev,
847 				       struct device_node *np_config,
848 				       struct pinctrl_map **map,
849 				       unsigned int *num_maps)
850 {
851 	unsigned int reserved_maps;
852 	struct device_node *np;
853 	int ret;
854 
855 	reserved_maps = 0;
856 	*map = NULL;
857 	*num_maps = 0;
858 
859 	ret = k210_pinctrl_dt_subnode_to_map(pctldev, np_config, map,
860 					     &reserved_maps, num_maps);
861 	if (ret < 0)
862 		goto err;
863 
864 	for_each_available_child_of_node(np_config, np) {
865 		ret = k210_pinctrl_dt_subnode_to_map(pctldev, np, map,
866 						     &reserved_maps, num_maps);
867 		if (ret < 0) {
868 			of_node_put(np);
869 			goto err;
870 		}
871 	}
872 	return 0;
873 
874 err:
875 	pinctrl_utils_free_map(pctldev, *map, *num_maps);
876 	return ret;
877 }
878 
879 
880 static const struct pinctrl_ops k210_pinctrl_ops = {
881 	.get_groups_count = k210_pinctrl_get_groups_count,
882 	.get_group_name = k210_pinctrl_get_group_name,
883 	.get_group_pins = k210_pinctrl_get_group_pins,
884 	.pin_dbg_show = k210_pinctrl_pin_dbg_show,
885 	.dt_node_to_map = k210_pinctrl_dt_node_to_map,
886 	.dt_free_map = pinconf_generic_dt_free_map,
887 };
888 
889 static struct pinctrl_desc k210_pinctrl_desc = {
890 	.name = "k210-pinctrl",
891 	.pins = k210_pins,
892 	.npins = K210_NPINS,
893 	.pctlops = &k210_pinctrl_ops,
894 	.pmxops = &k210_pinmux_ops,
895 	.confops = &k210_pinconf_ops,
896 	.custom_params = k210_pinconf_custom_params,
897 	.num_custom_params = ARRAY_SIZE(k210_pinconf_custom_params),
898 };
899 
900 static void k210_fpioa_init_ties(struct k210_fpioa_data *pdata)
901 {
902 	struct k210_fpioa __iomem *fpioa = pdata->fpioa;
903 	u32 val;
904 	int i, j;
905 
906 	dev_dbg(pdata->dev, "Init pin ties\n");
907 
908 	/* Init pin functions input ties */
909 	for (i = 0; i < ARRAY_SIZE(fpioa->tie_en); i++) {
910 		val = 0;
911 		for (j = 0; j < 32; j++) {
912 			if (k210_pcf_infos[i * 32 + j].mode_id ==
913 			    K210_PC_DEFAULT_IN_TIE) {
914 				dev_dbg(pdata->dev,
915 					"tie_en function %d (%s)\n",
916 					i * 32 + j,
917 					k210_pcf_infos[i * 32 + j].name);
918 				val |= BIT(j);
919 			}
920 		}
921 
922 		/* Set value before enable */
923 		writel(val, &fpioa->tie_val[i]);
924 		writel(val, &fpioa->tie_en[i]);
925 	}
926 }
927 
928 static int k210_fpioa_probe(struct platform_device *pdev)
929 {
930 	struct device *dev = &pdev->dev;
931 	struct device_node *np = dev->of_node;
932 	struct k210_fpioa_data *pdata;
933 	int ret;
934 
935 	dev_info(dev, "K210 FPIOA pin controller\n");
936 
937 	pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL);
938 	if (!pdata)
939 		return -ENOMEM;
940 
941 	pdata->dev = dev;
942 	platform_set_drvdata(pdev, pdata);
943 
944 	pdata->fpioa = devm_platform_ioremap_resource(pdev, 0);
945 	if (IS_ERR(pdata->fpioa))
946 		return PTR_ERR(pdata->fpioa);
947 
948 	pdata->clk = devm_clk_get(dev, "ref");
949 	if (IS_ERR(pdata->clk))
950 		return PTR_ERR(pdata->clk);
951 
952 	ret = clk_prepare_enable(pdata->clk);
953 	if (ret)
954 		return ret;
955 
956 	pdata->pclk = devm_clk_get_optional(dev, "pclk");
957 	if (!IS_ERR(pdata->pclk)) {
958 		ret = clk_prepare_enable(pdata->pclk);
959 		if (ret)
960 			goto disable_clk;
961 	}
962 
963 	pdata->sysctl_map =
964 		syscon_regmap_lookup_by_phandle_args(np,
965 						"canaan,k210-sysctl-power",
966 						1, &pdata->power_offset);
967 	if (IS_ERR(pdata->sysctl_map)) {
968 		ret = PTR_ERR(pdata->sysctl_map);
969 		goto disable_pclk;
970 	}
971 
972 	k210_fpioa_init_ties(pdata);
973 
974 	pdata->pctl = pinctrl_register(&k210_pinctrl_desc, dev, (void *)pdata);
975 	if (IS_ERR(pdata->pctl)) {
976 		ret = PTR_ERR(pdata->pctl);
977 		goto disable_pclk;
978 	}
979 
980 	return 0;
981 
982 disable_pclk:
983 	clk_disable_unprepare(pdata->pclk);
984 disable_clk:
985 	clk_disable_unprepare(pdata->clk);
986 
987 	return ret;
988 }
989 
990 static const struct of_device_id k210_fpioa_dt_ids[] = {
991 	{ .compatible = "canaan,k210-fpioa" },
992 	{ /* sentinel */ },
993 };
994 
995 static struct platform_driver k210_fpioa_driver = {
996 	.probe	= k210_fpioa_probe,
997 	.driver = {
998 		.name		= "k210-fpioa",
999 		.of_match_table	= k210_fpioa_dt_ids,
1000 	},
1001 };
1002 builtin_platform_driver(k210_fpioa_driver);
1003