blob: 0a478a8a99a02e399964de9cee1c74dec4aec1c9 [file] [log] [blame]
Kever Yangd73a4e82017-02-23 15:37:53 +08001/*
2 * (C) Copyright 2016 Rockchip Electronics Co., Ltd
3 *
4 * SPDX-License-Identifier: GPL-2.0+
5 */
6
7#include <common.h>
8#include <dm.h>
9#include <errno.h>
10#include <syscon.h>
11#include <asm/arch/clock.h>
12#include <asm/arch/hardware.h>
13#include <asm/arch/grf_rk3328.h>
14#include <asm/arch/periph.h>
15#include <asm/io.h>
16#include <dm/pinctrl.h>
17
David Wu1a7665f2018-01-13 14:01:45 +080018enum {
19 /* GPIO0A_IOMUX */
20 GPIO0A5_SEL_SHIFT = 10,
21 GPIO0A5_SEL_MASK = 3 << GPIO0A5_SEL_SHIFT,
22 GPIO0A5_I2C3_SCL = 2,
23
24 GPIO0A6_SEL_SHIFT = 12,
25 GPIO0A6_SEL_MASK = 3 << GPIO0A6_SEL_SHIFT,
26 GPIO0A6_I2C3_SDA = 2,
27
28 GPIO0A7_SEL_SHIFT = 14,
29 GPIO0A7_SEL_MASK = 3 << GPIO0A7_SEL_SHIFT,
30 GPIO0A7_EMMC_DATA0 = 2,
31
David Wub47fc262018-01-13 14:02:07 +080032 /* GPIO0B_IOMUX*/
33 GPIO0B0_SEL_SHIFT = 0,
34 GPIO0B0_SEL_MASK = 3 << GPIO0B0_SEL_SHIFT,
35 GPIO0B0_GAMC_CLKTXM0 = 1,
36
37 GPIO0B4_SEL_SHIFT = 8,
38 GPIO0B4_SEL_MASK = 3 << GPIO0B4_SEL_SHIFT,
39 GPIO0B4_GAMC_TXENM0 = 1,
40
41 /* GPIO0C_IOMUX*/
42 GPIO0C0_SEL_SHIFT = 0,
43 GPIO0C0_SEL_MASK = 3 << GPIO0C0_SEL_SHIFT,
44 GPIO0C0_GAMC_TXD1M0 = 1,
45
46 GPIO0C1_SEL_SHIFT = 2,
47 GPIO0C1_SEL_MASK = 3 << GPIO0C1_SEL_SHIFT,
48 GPIO0C1_GAMC_TXD0M0 = 1,
49
50 GPIO0C6_SEL_SHIFT = 12,
51 GPIO0C6_SEL_MASK = 3 << GPIO0C6_SEL_SHIFT,
52 GPIO0C6_GAMC_TXD2M0 = 1,
53
54 GPIO0C7_SEL_SHIFT = 14,
55 GPIO0C7_SEL_MASK = 3 << GPIO0C7_SEL_SHIFT,
56 GPIO0C7_GAMC_TXD3M0 = 1,
57
58 /* GPIO0D_IOMUX*/
59 GPIO0D0_SEL_SHIFT = 0,
60 GPIO0D0_SEL_MASK = 3 << GPIO0D0_SEL_SHIFT,
61 GPIO0D0_GMAC_CLKM0 = 1,
62
David Wu1a7665f2018-01-13 14:01:45 +080063 GPIO0D6_SEL_SHIFT = 12,
64 GPIO0D6_SEL_MASK = 3 << GPIO0D6_SEL_SHIFT,
65 GPIO0D6_GPIO = 0,
66 GPIO0D6_SDMMC0_PWRENM1 = 3,
67
68 /* GPIO1A_IOMUX */
69 GPIO1A0_SEL_SHIFT = 0,
70 GPIO1A0_SEL_MASK = 0x3fff << GPIO1A0_SEL_SHIFT,
71 GPIO1A0_CARD_DATA_CLK_CMD_DETN = 0x1555,
72
David Wub47fc262018-01-13 14:02:07 +080073 /* GPIO1B_IOMUX */
74 GPIO1B0_SEL_SHIFT = 0,
75 GPIO1B0_SEL_MASK = 3 << GPIO1B0_SEL_SHIFT,
76 GPIO1B0_GMAC_TXD1M1 = 2,
77
78 GPIO1B1_SEL_SHIFT = 2,
79 GPIO1B1_SEL_MASK = 3 << GPIO1B1_SEL_SHIFT,
80 GPIO1B1_GMAC_TXD0M1 = 2,
81
82 GPIO1B2_SEL_SHIFT = 4,
83 GPIO1B2_SEL_MASK = 3 << GPIO1B2_SEL_SHIFT,
84 GPIO1B2_GMAC_RXD1M1 = 2,
85
86 GPIO1B3_SEL_SHIFT = 6,
87 GPIO1B3_SEL_MASK = 3 << GPIO1B3_SEL_SHIFT,
88 GPIO1B3_GMAC_RXD0M1 = 2,
89
90 GPIO1B4_SEL_SHIFT = 8,
91 GPIO1B4_SEL_MASK = 3 << GPIO1B4_SEL_SHIFT,
92 GPIO1B4_GMAC_TXCLKM1 = 2,
93
94 GPIO1B5_SEL_SHIFT = 10,
95 GPIO1B5_SEL_MASK = 3 << GPIO1B5_SEL_SHIFT,
96 GPIO1B5_GMAC_RXCLKM1 = 2,
97
98 GPIO1B6_SEL_SHIFT = 12,
99 GPIO1B6_SEL_MASK = 3 << GPIO1B6_SEL_SHIFT,
100 GPIO1B6_GMAC_RXD3M1 = 2,
101
102 GPIO1B7_SEL_SHIFT = 14,
103 GPIO1B7_SEL_MASK = 3 << GPIO1B7_SEL_SHIFT,
104 GPIO1B7_GMAC_RXD2M1 = 2,
105
106 /* GPIO1C_IOMUX */
107 GPIO1C0_SEL_SHIFT = 0,
108 GPIO1C0_SEL_MASK = 3 << GPIO1C0_SEL_SHIFT,
109 GPIO1C0_GMAC_TXD3M1 = 2,
110
111 GPIO1C1_SEL_SHIFT = 2,
112 GPIO1C1_SEL_MASK = 3 << GPIO1C1_SEL_SHIFT,
113 GPIO1C1_GMAC_TXD2M1 = 2,
114
115 GPIO1C3_SEL_SHIFT = 6,
116 GPIO1C3_SEL_MASK = 3 << GPIO1C3_SEL_SHIFT,
117 GPIO1C3_GMAC_MDIOM1 = 2,
118
119 GPIO1C5_SEL_SHIFT = 10,
120 GPIO1C5_SEL_MASK = 3 << GPIO1C5_SEL_SHIFT,
121 GPIO1C5_GMAC_CLKM1 = 2,
122
123 GPIO1C6_SEL_SHIFT = 12,
124 GPIO1C6_SEL_MASK = 3 << GPIO1C6_SEL_SHIFT,
125 GPIO1C6_GMAC_RXDVM1 = 2,
126
127 GPIO1C7_SEL_SHIFT = 14,
128 GPIO1C7_SEL_MASK = 3 << GPIO1C7_SEL_SHIFT,
129 GPIO1C7_GMAC_MDCM1 = 2,
130
131 /* GPIO1D_IOMUX */
132 GPIO1D1_SEL_SHIFT = 2,
133 GPIO1D1_SEL_MASK = 3 << GPIO1D1_SEL_SHIFT,
134 GPIO1D1_GMAC_TXENM1 = 2,
135
David Wu1a7665f2018-01-13 14:01:45 +0800136 /* GPIO2A_IOMUX */
137 GPIO2A0_SEL_SHIFT = 0,
138 GPIO2A0_SEL_MASK = 3 << GPIO2A0_SEL_SHIFT,
139 GPIO2A0_UART2_TX_M1 = 1,
140
141 GPIO2A1_SEL_SHIFT = 2,
142 GPIO2A1_SEL_MASK = 3 << GPIO2A1_SEL_SHIFT,
143 GPIO2A1_UART2_RX_M1 = 1,
144
145 GPIO2A2_SEL_SHIFT = 4,
146 GPIO2A2_SEL_MASK = 3 << GPIO2A2_SEL_SHIFT,
147 GPIO2A2_PWM_IR = 1,
148
149 GPIO2A4_SEL_SHIFT = 8,
150 GPIO2A4_SEL_MASK = 3 << GPIO2A4_SEL_SHIFT,
151 GPIO2A4_PWM_0 = 1,
152 GPIO2A4_I2C1_SDA,
153
154 GPIO2A5_SEL_SHIFT = 10,
155 GPIO2A5_SEL_MASK = 3 << GPIO2A5_SEL_SHIFT,
156 GPIO2A5_PWM_1 = 1,
157 GPIO2A5_I2C1_SCL,
158
159 GPIO2A6_SEL_SHIFT = 12,
160 GPIO2A6_SEL_MASK = 3 << GPIO2A6_SEL_SHIFT,
161 GPIO2A6_PWM_2 = 1,
162
163 GPIO2A7_SEL_SHIFT = 14,
164 GPIO2A7_SEL_MASK = 3 << GPIO2A7_SEL_SHIFT,
165 GPIO2A7_GPIO = 0,
166 GPIO2A7_SDMMC0_PWRENM0,
167
168 /* GPIO2BL_IOMUX */
169 GPIO2BL0_SEL_SHIFT = 0,
170 GPIO2BL0_SEL_MASK = 0x3f << GPIO2BL0_SEL_SHIFT,
171 GPIO2BL0_SPI_CLK_TX_RX_M0 = 0x15,
172
173 GPIO2BL3_SEL_SHIFT = 6,
174 GPIO2BL3_SEL_MASK = 3 << GPIO2BL3_SEL_SHIFT,
175 GPIO2BL3_SPI_CSN0_M0 = 1,
176
177 GPIO2BL4_SEL_SHIFT = 8,
178 GPIO2BL4_SEL_MASK = 3 << GPIO2BL4_SEL_SHIFT,
179 GPIO2BL4_SPI_CSN1_M0 = 1,
180
181 GPIO2BL5_SEL_SHIFT = 10,
182 GPIO2BL5_SEL_MASK = 3 << GPIO2BL5_SEL_SHIFT,
183 GPIO2BL5_I2C2_SDA = 1,
184
185 GPIO2BL6_SEL_SHIFT = 12,
186 GPIO2BL6_SEL_MASK = 3 << GPIO2BL6_SEL_SHIFT,
187 GPIO2BL6_I2C2_SCL = 1,
188
189 /* GPIO2D_IOMUX */
190 GPIO2D0_SEL_SHIFT = 0,
191 GPIO2D0_SEL_MASK = 3 << GPIO2D0_SEL_SHIFT,
192 GPIO2D0_I2C0_SCL = 1,
193
194 GPIO2D1_SEL_SHIFT = 2,
195 GPIO2D1_SEL_MASK = 3 << GPIO2D1_SEL_SHIFT,
196 GPIO2D1_I2C0_SDA = 1,
197
198 GPIO2D4_SEL_SHIFT = 8,
199 GPIO2D4_SEL_MASK = 0xff << GPIO2D4_SEL_SHIFT,
200 GPIO2D4_EMMC_DATA1234 = 0xaa,
201
202 /* GPIO3C_IOMUX */
203 GPIO3C0_SEL_SHIFT = 0,
204 GPIO3C0_SEL_MASK = 0x3fff << GPIO3C0_SEL_SHIFT,
205 GPIO3C0_EMMC_DATA567_PWR_CLK_RSTN_CMD = 0x2aaa,
206
207 /* COM_IOMUX */
208 IOMUX_SEL_UART2_SHIFT = 0,
209 IOMUX_SEL_UART2_MASK = 3 << IOMUX_SEL_UART2_SHIFT,
210 IOMUX_SEL_UART2_M0 = 0,
211 IOMUX_SEL_UART2_M1,
212
David Wub47fc262018-01-13 14:02:07 +0800213 IOMUX_SEL_GMAC_SHIFT = 2,
214 IOMUX_SEL_GMAC_MASK = 1 << IOMUX_SEL_GMAC_SHIFT,
215 IOMUX_SEL_GMAC_M0 = 0,
216 IOMUX_SEL_GMAC_M1,
217
David Wu1a7665f2018-01-13 14:01:45 +0800218 IOMUX_SEL_SPI_SHIFT = 4,
219 IOMUX_SEL_SPI_MASK = 3 << IOMUX_SEL_SPI_SHIFT,
220 IOMUX_SEL_SPI_M0 = 0,
221 IOMUX_SEL_SPI_M1,
222 IOMUX_SEL_SPI_M2,
223
224 IOMUX_SEL_SDMMC_SHIFT = 7,
225 IOMUX_SEL_SDMMC_MASK = 1 << IOMUX_SEL_SDMMC_SHIFT,
226 IOMUX_SEL_SDMMC_M0 = 0,
227 IOMUX_SEL_SDMMC_M1,
David Wub47fc262018-01-13 14:02:07 +0800228
229 IOMUX_SEL_GMACM1_OPTIMIZATION_SHIFT = 10,
230 IOMUX_SEL_GMACM1_OPTIMIZATION_MASK = 1 << IOMUX_SEL_GMACM1_OPTIMIZATION_SHIFT,
231 IOMUX_SEL_GMACM1_OPTIMIZATION_BEFORE = 0,
232 IOMUX_SEL_GMACM1_OPTIMIZATION_AFTER,
233
234 /* GRF_GPIO1B_E */
235 GRF_GPIO1B0_E_SHIFT = 0,
236 GRF_GPIO1B0_E_MASK = 3 << GRF_GPIO1B0_E_SHIFT,
237 GRF_GPIO1B1_E_SHIFT = 2,
238 GRF_GPIO1B1_E_MASK = 3 << GRF_GPIO1B1_E_SHIFT,
239 GRF_GPIO1B2_E_SHIFT = 4,
240 GRF_GPIO1B2_E_MASK = 3 << GRF_GPIO1B2_E_SHIFT,
241 GRF_GPIO1B3_E_SHIFT = 6,
242 GRF_GPIO1B3_E_MASK = 3 << GRF_GPIO1B3_E_SHIFT,
243 GRF_GPIO1B4_E_SHIFT = 8,
244 GRF_GPIO1B4_E_MASK = 3 << GRF_GPIO1B4_E_SHIFT,
245 GRF_GPIO1B5_E_SHIFT = 10,
246 GRF_GPIO1B5_E_MASK = 3 << GRF_GPIO1B5_E_SHIFT,
247 GRF_GPIO1B6_E_SHIFT = 12,
248 GRF_GPIO1B6_E_MASK = 3 << GRF_GPIO1B6_E_SHIFT,
249 GRF_GPIO1B7_E_SHIFT = 14,
250 GRF_GPIO1B7_E_MASK = 3 << GRF_GPIO1B7_E_SHIFT,
251
252 /* GRF_GPIO1C_E */
253 GRF_GPIO1C0_E_SHIFT = 0,
254 GRF_GPIO1C0_E_MASK = 3 << GRF_GPIO1C0_E_SHIFT,
255 GRF_GPIO1C1_E_SHIFT = 2,
256 GRF_GPIO1C1_E_MASK = 3 << GRF_GPIO1C1_E_SHIFT,
257 GRF_GPIO1C3_E_SHIFT = 6,
258 GRF_GPIO1C3_E_MASK = 3 << GRF_GPIO1C3_E_SHIFT,
259 GRF_GPIO1C5_E_SHIFT = 10,
260 GRF_GPIO1C5_E_MASK = 3 << GRF_GPIO1C5_E_SHIFT,
261 GRF_GPIO1C6_E_SHIFT = 12,
262 GRF_GPIO1C6_E_MASK = 3 << GRF_GPIO1C6_E_SHIFT,
263 GRF_GPIO1C7_E_SHIFT = 14,
264 GRF_GPIO1C7_E_MASK = 3 << GRF_GPIO1C7_E_SHIFT,
265
266 /* GRF_GPIO1D_E */
267 GRF_GPIO1D1_E_SHIFT = 2,
268 GRF_GPIO1D1_E_MASK = 3 << GRF_GPIO1D1_E_SHIFT,
269};
270
271/* GPIO Bias drive strength settings */
272enum GPIO_BIAS {
273 GPIO_BIAS_2MA = 0,
274 GPIO_BIAS_4MA,
275 GPIO_BIAS_8MA,
276 GPIO_BIAS_12MA,
David Wu1a7665f2018-01-13 14:01:45 +0800277};
278
Kever Yangd73a4e82017-02-23 15:37:53 +0800279struct rk3328_pinctrl_priv {
280 struct rk3328_grf_regs *grf;
281};
282
Kever Yangd73a4e82017-02-23 15:37:53 +0800283static void pinctrl_rk3328_pwm_config(struct rk3328_grf_regs *grf, int pwm_id)
284{
285 switch (pwm_id) {
286 case PERIPH_ID_PWM0:
287 rk_clrsetreg(&grf->gpio2a_iomux,
Kever Yang35077242017-05-17 11:44:43 +0800288 GPIO2A4_SEL_MASK,
289 GPIO2A4_PWM_0 << GPIO2A4_SEL_SHIFT);
Kever Yangd73a4e82017-02-23 15:37:53 +0800290 break;
291 case PERIPH_ID_PWM1:
292 rk_clrsetreg(&grf->gpio2a_iomux,
Kever Yang35077242017-05-17 11:44:43 +0800293 GPIO2A5_SEL_MASK,
294 GPIO2A5_PWM_1 << GPIO2A5_SEL_SHIFT);
Kever Yangd73a4e82017-02-23 15:37:53 +0800295 break;
296 case PERIPH_ID_PWM2:
297 rk_clrsetreg(&grf->gpio2a_iomux,
Kever Yang35077242017-05-17 11:44:43 +0800298 GPIO2A6_SEL_MASK,
299 GPIO2A6_PWM_2 << GPIO2A6_SEL_SHIFT);
Kever Yangd73a4e82017-02-23 15:37:53 +0800300 break;
301 case PERIPH_ID_PWM3:
302 rk_clrsetreg(&grf->gpio2a_iomux,
Kever Yang35077242017-05-17 11:44:43 +0800303 GPIO2A2_SEL_MASK,
304 GPIO2A2_PWM_IR << GPIO2A2_SEL_SHIFT);
Kever Yangd73a4e82017-02-23 15:37:53 +0800305 break;
306 default:
307 debug("pwm id = %d iomux error!\n", pwm_id);
308 break;
309 }
310}
311
312static void pinctrl_rk3328_i2c_config(struct rk3328_grf_regs *grf, int i2c_id)
313{
314 switch (i2c_id) {
315 case PERIPH_ID_I2C0:
316 rk_clrsetreg(&grf->gpio2d_iomux,
Kever Yang35077242017-05-17 11:44:43 +0800317 GPIO2D0_SEL_MASK | GPIO2D1_SEL_MASK,
318 GPIO2D0_I2C0_SCL << GPIO2D0_SEL_SHIFT |
319 GPIO2D1_I2C0_SDA << GPIO2D1_SEL_SHIFT);
Kever Yangd73a4e82017-02-23 15:37:53 +0800320 break;
321 case PERIPH_ID_I2C1:
322 rk_clrsetreg(&grf->gpio2a_iomux,
Kever Yang35077242017-05-17 11:44:43 +0800323 GPIO2A4_SEL_MASK | GPIO2A5_SEL_MASK,
324 GPIO2A5_I2C1_SCL << GPIO2A5_SEL_SHIFT |
325 GPIO2A4_I2C1_SDA << GPIO2A4_SEL_SHIFT);
Kever Yangd73a4e82017-02-23 15:37:53 +0800326 break;
327 case PERIPH_ID_I2C2:
328 rk_clrsetreg(&grf->gpio2bl_iomux,
Kever Yang35077242017-05-17 11:44:43 +0800329 GPIO2BL5_SEL_MASK | GPIO2BL6_SEL_MASK,
330 GPIO2BL6_I2C2_SCL << GPIO2BL6_SEL_SHIFT |
331 GPIO2BL5_I2C2_SDA << GPIO2BL5_SEL_SHIFT);
Kever Yangd73a4e82017-02-23 15:37:53 +0800332 break;
333 case PERIPH_ID_I2C3:
334 rk_clrsetreg(&grf->gpio0a_iomux,
Kever Yang35077242017-05-17 11:44:43 +0800335 GPIO0A5_SEL_MASK | GPIO0A6_SEL_MASK,
336 GPIO0A5_I2C3_SCL << GPIO0A5_SEL_SHIFT |
337 GPIO0A6_I2C3_SDA << GPIO0A6_SEL_SHIFT);
Kever Yangd73a4e82017-02-23 15:37:53 +0800338 break;
339 default:
340 debug("i2c id = %d iomux error!\n", i2c_id);
341 break;
342 }
343}
344
345static void pinctrl_rk3328_lcdc_config(struct rk3328_grf_regs *grf, int lcd_id)
346{
347 switch (lcd_id) {
348 case PERIPH_ID_LCDC0:
349 break;
350 default:
351 debug("lcdc id = %d iomux error!\n", lcd_id);
352 break;
353 }
354}
355
356static int pinctrl_rk3328_spi_config(struct rk3328_grf_regs *grf,
357 enum periph_id spi_id, int cs)
358{
Kever Yangf15ac622017-05-17 11:44:44 +0800359 u32 com_iomux = readl(&grf->com_iomux);
360
361 if ((com_iomux & IOMUX_SEL_SPI_MASK) !=
362 IOMUX_SEL_SPI_M0 << IOMUX_SEL_SPI_SHIFT) {
363 debug("driver do not support iomux other than m0\n");
364 goto err;
365 }
Kever Yangd73a4e82017-02-23 15:37:53 +0800366
367 switch (spi_id) {
368 case PERIPH_ID_SPI0:
369 switch (cs) {
370 case 0:
371 rk_clrsetreg(&grf->gpio2bl_iomux,
Kever Yang35077242017-05-17 11:44:43 +0800372 GPIO2BL3_SEL_MASK,
373 GPIO2BL3_SPI_CSN0_M0
374 << GPIO2BL3_SEL_SHIFT);
Kever Yangd73a4e82017-02-23 15:37:53 +0800375 break;
376 case 1:
377 rk_clrsetreg(&grf->gpio2bl_iomux,
Kever Yang35077242017-05-17 11:44:43 +0800378 GPIO2BL4_SEL_MASK,
379 GPIO2BL4_SPI_CSN1_M0
380 << GPIO2BL4_SEL_SHIFT);
Kever Yangd73a4e82017-02-23 15:37:53 +0800381 break;
382 default:
383 goto err;
384 }
385 rk_clrsetreg(&grf->gpio2bl_iomux,
Kever Yang35077242017-05-17 11:44:43 +0800386 GPIO2BL0_SEL_MASK,
387 GPIO2BL0_SPI_CLK_TX_RX_M0 << GPIO2BL0_SEL_SHIFT);
Kever Yangd73a4e82017-02-23 15:37:53 +0800388 break;
389 default:
390 goto err;
391 }
392
393 return 0;
394err:
395 debug("rkspi: periph%d cs=%d not supported", spi_id, cs);
396 return -ENOENT;
397}
398
399static void pinctrl_rk3328_uart_config(struct rk3328_grf_regs *grf, int uart_id)
400{
Kever Yangf15ac622017-05-17 11:44:44 +0800401 u32 com_iomux = readl(&grf->com_iomux);
402
Kever Yangd73a4e82017-02-23 15:37:53 +0800403 switch (uart_id) {
404 case PERIPH_ID_UART2:
405 break;
Kever Yangf15ac622017-05-17 11:44:44 +0800406 if (com_iomux & IOMUX_SEL_UART2_MASK)
407 rk_clrsetreg(&grf->gpio2a_iomux,
408 GPIO2A0_SEL_MASK | GPIO2A1_SEL_MASK,
409 GPIO2A0_UART2_TX_M1 << GPIO2A0_SEL_SHIFT |
410 GPIO2A1_UART2_RX_M1 << GPIO2A1_SEL_SHIFT);
411
Kever Yangd73a4e82017-02-23 15:37:53 +0800412 break;
413 case PERIPH_ID_UART0:
414 case PERIPH_ID_UART1:
415 case PERIPH_ID_UART3:
416 case PERIPH_ID_UART4:
417 default:
418 debug("uart id = %d iomux error!\n", uart_id);
419 break;
420 }
421}
422
423static void pinctrl_rk3328_sdmmc_config(struct rk3328_grf_regs *grf,
424 int mmc_id)
425{
Kever Yangf15ac622017-05-17 11:44:44 +0800426 u32 com_iomux = readl(&grf->com_iomux);
427
Kever Yangd73a4e82017-02-23 15:37:53 +0800428 switch (mmc_id) {
429 case PERIPH_ID_EMMC:
430 rk_clrsetreg(&grf->gpio0a_iomux,
Kever Yang35077242017-05-17 11:44:43 +0800431 GPIO0A7_SEL_MASK,
432 GPIO0A7_EMMC_DATA0 << GPIO0A7_SEL_SHIFT);
Kever Yangd73a4e82017-02-23 15:37:53 +0800433 rk_clrsetreg(&grf->gpio2d_iomux,
Kever Yang35077242017-05-17 11:44:43 +0800434 GPIO2D4_SEL_MASK,
435 GPIO2D4_EMMC_DATA1234 << GPIO2D4_SEL_SHIFT);
Kever Yangd73a4e82017-02-23 15:37:53 +0800436 rk_clrsetreg(&grf->gpio3c_iomux,
Kever Yang35077242017-05-17 11:44:43 +0800437 GPIO3C0_SEL_MASK,
438 GPIO3C0_EMMC_DATA567_PWR_CLK_RSTN_CMD
439 << GPIO3C0_SEL_SHIFT);
Kever Yangd73a4e82017-02-23 15:37:53 +0800440 break;
441 case PERIPH_ID_SDCARD:
Kever Yangf15ac622017-05-17 11:44:44 +0800442 /* SDMMC_PWREN use GPIO and init as regulator-fiexed */
443 if (com_iomux & IOMUX_SEL_SDMMC_MASK)
444 rk_clrsetreg(&grf->gpio0d_iomux,
445 GPIO0D6_SEL_MASK,
Kever Yang70fd6132017-06-08 15:32:04 +0800446 GPIO0D6_GPIO << GPIO0D6_SEL_SHIFT);
Kever Yangf15ac622017-05-17 11:44:44 +0800447 else
448 rk_clrsetreg(&grf->gpio2a_iomux,
449 GPIO2A7_SEL_MASK,
Kever Yang70fd6132017-06-08 15:32:04 +0800450 GPIO2A7_GPIO << GPIO2A7_SEL_SHIFT);
Kever Yangd73a4e82017-02-23 15:37:53 +0800451 rk_clrsetreg(&grf->gpio1a_iomux,
Kever Yang35077242017-05-17 11:44:43 +0800452 GPIO1A0_SEL_MASK,
453 GPIO1A0_CARD_DATA_CLK_CMD_DETN
454 << GPIO1A0_SEL_SHIFT);
Kever Yangd73a4e82017-02-23 15:37:53 +0800455 break;
456 default:
457 debug("mmc id = %d iomux error!\n", mmc_id);
458 break;
459 }
460}
461
David Wub47fc262018-01-13 14:02:07 +0800462#if CONFIG_IS_ENABLED(GMAC_ROCKCHIP)
463static void pinctrl_rk3328_gmac_config(struct rk3328_grf_regs *grf, int gmac_id)
464{
465 switch (gmac_id) {
466 case PERIPH_ID_GMAC:
467 /* set rgmii m1 pins mux */
468 rk_clrsetreg(&grf->gpio1b_iomux,
469 GPIO1B0_SEL_MASK |
470 GPIO1B1_SEL_MASK |
471 GPIO1B2_SEL_MASK |
472 GPIO1B3_SEL_MASK |
473 GPIO1B4_SEL_MASK |
474 GPIO1B5_SEL_MASK |
475 GPIO1B6_SEL_MASK |
476 GPIO1B7_SEL_MASK,
477 GPIO1B0_GMAC_TXD1M1 << GPIO1B0_SEL_SHIFT |
478 GPIO1B1_GMAC_TXD0M1 << GPIO1B1_SEL_SHIFT |
479 GPIO1B2_GMAC_RXD1M1 << GPIO1B2_SEL_SHIFT |
480 GPIO1B3_GMAC_RXD0M1 << GPIO1B3_SEL_SHIFT |
481 GPIO1B4_GMAC_TXCLKM1 << GPIO1B4_SEL_SHIFT |
482 GPIO1B5_GMAC_RXCLKM1 << GPIO1B5_SEL_SHIFT |
483 GPIO1B6_GMAC_RXD3M1 << GPIO1B6_SEL_SHIFT |
484 GPIO1B7_GMAC_RXD2M1 << GPIO1B7_SEL_SHIFT);
485
486 rk_clrsetreg(&grf->gpio1c_iomux,
487 GPIO1C0_SEL_MASK |
488 GPIO1C1_SEL_MASK |
489 GPIO1C3_SEL_MASK |
490 GPIO1C5_SEL_MASK |
491 GPIO1C6_SEL_MASK |
492 GPIO1C7_SEL_MASK,
493 GPIO1C0_GMAC_TXD3M1 << GPIO1C0_SEL_SHIFT |
494 GPIO1C1_GMAC_TXD2M1 << GPIO1C1_SEL_SHIFT |
495 GPIO1C3_GMAC_MDIOM1 << GPIO1C3_SEL_SHIFT |
496 GPIO1C5_GMAC_CLKM1 << GPIO1C5_SEL_SHIFT |
497 GPIO1C6_GMAC_RXDVM1 << GPIO1C6_SEL_SHIFT |
498 GPIO1C7_GMAC_MDCM1 << GPIO1C7_SEL_SHIFT);
499
500 rk_clrsetreg(&grf->gpio1d_iomux,
501 GPIO1D1_SEL_MASK,
502 GPIO1D1_GMAC_TXENM1 << GPIO1D1_SEL_SHIFT);
503
504 /* set rgmii m0 tx pins mux */
505 rk_clrsetreg(&grf->gpio0b_iomux,
506 GPIO0B0_SEL_MASK |
507 GPIO0B4_SEL_MASK,
508 GPIO0B0_GAMC_CLKTXM0 << GPIO0B0_SEL_SHIFT |
509 GPIO0B4_GAMC_TXENM0 << GPIO0B4_SEL_SHIFT);
510
511 rk_clrsetreg(&grf->gpio0c_iomux,
512 GPIO0C0_SEL_MASK |
513 GPIO0C1_SEL_MASK |
514 GPIO0C6_SEL_MASK |
515 GPIO0C7_SEL_MASK,
516 GPIO0C0_GAMC_TXD1M0 << GPIO0C0_SEL_SHIFT |
517 GPIO0C1_GAMC_TXD0M0 << GPIO0C1_SEL_SHIFT |
518 GPIO0C6_GAMC_TXD2M0 << GPIO0C6_SEL_SHIFT |
519 GPIO0C7_GAMC_TXD3M0 << GPIO0C7_SEL_SHIFT);
520
521 rk_clrsetreg(&grf->gpio0d_iomux,
522 GPIO0D0_SEL_MASK,
523 GPIO0D0_GMAC_CLKM0 << GPIO0D0_SEL_SHIFT);
524
525 /* set com mux */
526 rk_clrsetreg(&grf->com_iomux,
527 IOMUX_SEL_GMAC_MASK |
528 IOMUX_SEL_GMACM1_OPTIMIZATION_MASK,
529 IOMUX_SEL_GMAC_M1 << IOMUX_SEL_GMAC_SHIFT |
530 IOMUX_SEL_GMACM1_OPTIMIZATION_AFTER <<
531 IOMUX_SEL_GMACM1_OPTIMIZATION_SHIFT);
532
533 /*
534 * set rgmii m1 tx pins to 12ma drive-strength,
535 * and clean others to 2ma.
536 */
537 rk_clrsetreg(&grf->gpio1b_e,
538 GRF_GPIO1B0_E_MASK |
539 GRF_GPIO1B1_E_MASK |
540 GRF_GPIO1B2_E_MASK |
541 GRF_GPIO1B3_E_MASK |
542 GRF_GPIO1B4_E_MASK |
543 GRF_GPIO1B5_E_MASK |
544 GRF_GPIO1B6_E_MASK |
545 GRF_GPIO1B7_E_MASK,
546 GPIO_BIAS_12MA << GRF_GPIO1B0_E_SHIFT |
547 GPIO_BIAS_12MA << GRF_GPIO1B1_E_SHIFT |
548 GPIO_BIAS_2MA << GRF_GPIO1B2_E_SHIFT |
549 GPIO_BIAS_2MA << GRF_GPIO1B3_E_SHIFT |
550 GPIO_BIAS_12MA << GRF_GPIO1B4_E_SHIFT |
551 GPIO_BIAS_2MA << GRF_GPIO1B5_E_SHIFT |
552 GPIO_BIAS_2MA << GRF_GPIO1B6_E_SHIFT |
553 GPIO_BIAS_2MA << GRF_GPIO1B7_E_SHIFT);
554
555 rk_clrsetreg(&grf->gpio1c_e,
556 GRF_GPIO1C0_E_MASK |
557 GRF_GPIO1C1_E_MASK |
558 GRF_GPIO1C3_E_MASK |
559 GRF_GPIO1C5_E_MASK |
560 GRF_GPIO1C6_E_MASK |
561 GRF_GPIO1C7_E_MASK,
562 GPIO_BIAS_12MA << GRF_GPIO1C0_E_SHIFT |
563 GPIO_BIAS_12MA << GRF_GPIO1C1_E_SHIFT |
564 GPIO_BIAS_2MA << GRF_GPIO1C3_E_SHIFT |
565 GPIO_BIAS_2MA << GRF_GPIO1C5_E_SHIFT |
566 GPIO_BIAS_2MA << GRF_GPIO1C6_E_SHIFT |
567 GPIO_BIAS_2MA << GRF_GPIO1C7_E_SHIFT);
568
569 rk_clrsetreg(&grf->gpio1d_e,
570 GRF_GPIO1D1_E_MASK,
571 GPIO_BIAS_12MA << GRF_GPIO1D1_E_SHIFT);
572 break;
573 default:
574 debug("gmac id = %d iomux error!\n", gmac_id);
575 break;
576 }
577}
578#endif
579
Kever Yangd73a4e82017-02-23 15:37:53 +0800580static int rk3328_pinctrl_request(struct udevice *dev, int func, int flags)
581{
582 struct rk3328_pinctrl_priv *priv = dev_get_priv(dev);
583
584 debug("%s: func=%x, flags=%x\n", __func__, func, flags);
585 switch (func) {
586 case PERIPH_ID_PWM0:
587 case PERIPH_ID_PWM1:
588 case PERIPH_ID_PWM2:
589 case PERIPH_ID_PWM3:
590 pinctrl_rk3328_pwm_config(priv->grf, func);
591 break;
592 case PERIPH_ID_I2C0:
593 case PERIPH_ID_I2C1:
594 case PERIPH_ID_I2C2:
595 case PERIPH_ID_I2C3:
596 pinctrl_rk3328_i2c_config(priv->grf, func);
597 break;
598 case PERIPH_ID_SPI0:
599 pinctrl_rk3328_spi_config(priv->grf, func, flags);
600 break;
601 case PERIPH_ID_UART0:
602 case PERIPH_ID_UART1:
603 case PERIPH_ID_UART2:
604 case PERIPH_ID_UART3:
605 case PERIPH_ID_UART4:
606 pinctrl_rk3328_uart_config(priv->grf, func);
607 break;
608 case PERIPH_ID_LCDC0:
609 case PERIPH_ID_LCDC1:
610 pinctrl_rk3328_lcdc_config(priv->grf, func);
611 break;
612 case PERIPH_ID_SDMMC0:
613 case PERIPH_ID_SDMMC1:
614 pinctrl_rk3328_sdmmc_config(priv->grf, func);
615 break;
David Wub47fc262018-01-13 14:02:07 +0800616#if CONFIG_IS_ENABLED(GMAC_ROCKCHIP)
617 case PERIPH_ID_GMAC:
618 pinctrl_rk3328_gmac_config(priv->grf, func);
619 break;
620#endif
Kever Yangd73a4e82017-02-23 15:37:53 +0800621 default:
622 return -EINVAL;
623 }
624
625 return 0;
626}
627
628static int rk3328_pinctrl_get_periph_id(struct udevice *dev,
629 struct udevice *periph)
630{
631 u32 cell[3];
632 int ret;
633
Philipp Tomsichff7865f2017-06-07 18:45:57 +0200634 ret = dev_read_u32_array(periph, "interrupts", cell, ARRAY_SIZE(cell));
Kever Yangd73a4e82017-02-23 15:37:53 +0800635 if (ret < 0)
636 return -EINVAL;
637
638 switch (cell[1]) {
639 case 49:
640 return PERIPH_ID_SPI0;
641 case 50:
642 return PERIPH_ID_PWM0;
643 case 36:
644 return PERIPH_ID_I2C0;
645 case 37: /* Note strange order */
646 return PERIPH_ID_I2C1;
647 case 38:
648 return PERIPH_ID_I2C2;
649 case 39:
650 return PERIPH_ID_I2C3;
651 case 12:
652 return PERIPH_ID_SDCARD;
653 case 14:
654 return PERIPH_ID_EMMC;
David Wub47fc262018-01-13 14:02:07 +0800655#if CONFIG_IS_ENABLED(GMAC_ROCKCHIP)
656 case 24:
657 return PERIPH_ID_GMAC;
658#endif
Kever Yangd73a4e82017-02-23 15:37:53 +0800659 }
660
661 return -ENOENT;
662}
663
664static int rk3328_pinctrl_set_state_simple(struct udevice *dev,
665 struct udevice *periph)
666{
667 int func;
668
669 func = rk3328_pinctrl_get_periph_id(dev, periph);
670 if (func < 0)
671 return func;
672
673 return rk3328_pinctrl_request(dev, func, 0);
674}
675
676static struct pinctrl_ops rk3328_pinctrl_ops = {
677 .set_state_simple = rk3328_pinctrl_set_state_simple,
678 .request = rk3328_pinctrl_request,
679 .get_periph_id = rk3328_pinctrl_get_periph_id,
680};
681
682static int rk3328_pinctrl_probe(struct udevice *dev)
683{
684 struct rk3328_pinctrl_priv *priv = dev_get_priv(dev);
685 int ret = 0;
686
687 priv->grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
688 debug("%s: grf=%p\n", __func__, priv->grf);
689
690 return ret;
691}
692
693static const struct udevice_id rk3328_pinctrl_ids[] = {
694 { .compatible = "rockchip,rk3328-pinctrl" },
695 { }
696};
697
698U_BOOT_DRIVER(pinctrl_rk3328) = {
699 .name = "rockchip_rk3328_pinctrl",
700 .id = UCLASS_PINCTRL,
701 .of_match = rk3328_pinctrl_ids,
702 .priv_auto_alloc_size = sizeof(struct rk3328_pinctrl_priv),
703 .ops = &rk3328_pinctrl_ops,
704 .bind = dm_scan_fdt_dev,
705 .probe = rk3328_pinctrl_probe,
706};