1
2
3
4
5
6
7#include <common.h>
8#include <fdtdec.h>
9#include <asm/gpio.h>
10#include <asm/arch/pinmux.h>
11#include <asm/arch/sromc.h>
12
13static void exynos5_uart_config(int peripheral)
14{
15 int i, start, count;
16
17 switch (peripheral) {
18 case PERIPH_ID_UART0:
19 start = EXYNOS5_GPIO_A00;
20 count = 4;
21 break;
22 case PERIPH_ID_UART1:
23 start = EXYNOS5_GPIO_D00;
24 count = 4;
25 break;
26 case PERIPH_ID_UART2:
27 start = EXYNOS5_GPIO_A10;
28 count = 4;
29 break;
30 case PERIPH_ID_UART3:
31 start = EXYNOS5_GPIO_A14;
32 count = 2;
33 break;
34 default:
35 debug("%s: invalid peripheral %d", __func__, peripheral);
36 return;
37 }
38 for (i = start; i < start + count; i++) {
39 gpio_set_pull(i, S5P_GPIO_PULL_NONE);
40 gpio_cfg_pin(i, S5P_GPIO_FUNC(0x2));
41 }
42}
43
44static void exynos5420_uart_config(int peripheral)
45{
46 int i, start, count;
47
48 switch (peripheral) {
49 case PERIPH_ID_UART0:
50 start = EXYNOS5420_GPIO_A00;
51 count = 4;
52 break;
53 case PERIPH_ID_UART1:
54 start = EXYNOS5420_GPIO_A04;
55 count = 4;
56 break;
57 case PERIPH_ID_UART2:
58 start = EXYNOS5420_GPIO_A10;
59 count = 4;
60 break;
61 case PERIPH_ID_UART3:
62 start = EXYNOS5420_GPIO_A14;
63 count = 2;
64 break;
65 default:
66 debug("%s: invalid peripheral %d", __func__, peripheral);
67 return;
68 }
69
70 for (i = start; i < start + count; i++) {
71 gpio_set_pull(i, S5P_GPIO_PULL_NONE);
72 gpio_cfg_pin(i, S5P_GPIO_FUNC(0x2));
73 }
74}
75
76static int exynos5_mmc_config(int peripheral, int flags)
77{
78 int i, start, start_ext, gpio_func = 0;
79
80 switch (peripheral) {
81 case PERIPH_ID_SDMMC0:
82 start = EXYNOS5_GPIO_C00;
83 start_ext = EXYNOS5_GPIO_C10;
84 gpio_func = S5P_GPIO_FUNC(0x2);
85 break;
86 case PERIPH_ID_SDMMC1:
87 start = EXYNOS5_GPIO_C20;
88 start_ext = 0;
89 break;
90 case PERIPH_ID_SDMMC2:
91 start = EXYNOS5_GPIO_C30;
92 start_ext = EXYNOS5_GPIO_C43;
93 gpio_func = S5P_GPIO_FUNC(0x3);
94 break;
95 case PERIPH_ID_SDMMC3:
96 start = EXYNOS5_GPIO_C40;
97 start_ext = 0;
98 break;
99 default:
100 debug("%s: invalid peripheral %d", __func__, peripheral);
101 return -1;
102 }
103 if ((flags & PINMUX_FLAG_8BIT_MODE) && !start_ext) {
104 debug("SDMMC device %d does not support 8bit mode",
105 peripheral);
106 return -1;
107 }
108 if (flags & PINMUX_FLAG_8BIT_MODE) {
109 for (i = start_ext; i <= (start_ext + 3); i++) {
110 gpio_cfg_pin(i, gpio_func);
111 gpio_set_pull(i, S5P_GPIO_PULL_UP);
112 gpio_set_drv(i, S5P_GPIO_DRV_4X);
113 }
114 }
115 for (i = start; i < (start + 2); i++) {
116 gpio_cfg_pin(i, S5P_GPIO_FUNC(0x2));
117 gpio_set_pull(i, S5P_GPIO_PULL_NONE);
118 gpio_set_drv(i, S5P_GPIO_DRV_4X);
119 }
120 for (i = (start + 3); i <= (start + 6); i++) {
121 gpio_cfg_pin(i, S5P_GPIO_FUNC(0x2));
122 gpio_set_pull(i, S5P_GPIO_PULL_UP);
123 gpio_set_drv(i, S5P_GPIO_DRV_4X);
124 }
125
126 return 0;
127}
128
129static int exynos5420_mmc_config(int peripheral, int flags)
130{
131 int i, start = 0, start_ext = 0;
132
133 switch (peripheral) {
134 case PERIPH_ID_SDMMC0:
135 start = EXYNOS5420_GPIO_C00;
136 start_ext = EXYNOS5420_GPIO_C30;
137 break;
138 case PERIPH_ID_SDMMC1:
139 start = EXYNOS5420_GPIO_C10;
140 start_ext = EXYNOS5420_GPIO_D14;
141 break;
142 case PERIPH_ID_SDMMC2:
143 start = EXYNOS5420_GPIO_C20;
144 start_ext = 0;
145 break;
146 default:
147 start = 0;
148 debug("%s: invalid peripheral %d", __func__, peripheral);
149 return -1;
150 }
151
152 if ((flags & PINMUX_FLAG_8BIT_MODE) && !start_ext) {
153 debug("SDMMC device %d does not support 8bit mode",
154 peripheral);
155 return -1;
156 }
157
158 if (flags & PINMUX_FLAG_8BIT_MODE) {
159 for (i = start_ext; i <= (start_ext + 3); i++) {
160 gpio_cfg_pin(i, S5P_GPIO_FUNC(0x2));
161 gpio_set_pull(i, S5P_GPIO_PULL_UP);
162 gpio_set_drv(i, S5P_GPIO_DRV_4X);
163 }
164 }
165
166 for (i = start; i < (start + 3); i++) {
167
168
169
170
171
172
173 if ((peripheral == PERIPH_ID_SDMMC0) && (i == (start + 2))) {
174#ifndef CONFIG_SPL_BUILD
175 gpio_request(i, "sdmmc0_vdden");
176#endif
177 gpio_set_value(i, 1);
178 gpio_cfg_pin(i, S5P_GPIO_OUTPUT);
179 } else {
180 gpio_cfg_pin(i, S5P_GPIO_FUNC(0x2));
181 }
182 gpio_set_pull(i, S5P_GPIO_PULL_NONE);
183 gpio_set_drv(i, S5P_GPIO_DRV_4X);
184 }
185
186 for (i = (start + 3); i <= (start + 6); i++) {
187 gpio_cfg_pin(i, S5P_GPIO_FUNC(0x2));
188 gpio_set_pull(i, S5P_GPIO_PULL_UP);
189 gpio_set_drv(i, S5P_GPIO_DRV_4X);
190 }
191
192 return 0;
193}
194
195static void exynos5_sromc_config(int flags)
196{
197 int i;
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214 gpio_cfg_pin(EXYNOS5_GPIO_Y00 + (flags & PINMUX_FLAG_BANK),
215 S5P_GPIO_FUNC(2));
216 gpio_cfg_pin(EXYNOS5_GPIO_Y04, S5P_GPIO_FUNC(2));
217 gpio_cfg_pin(EXYNOS5_GPIO_Y05, S5P_GPIO_FUNC(2));
218
219 for (i = 0; i < 4; i++)
220 gpio_cfg_pin(EXYNOS5_GPIO_Y10 + i, S5P_GPIO_FUNC(2));
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254 for (i = 0; i < 8; i++) {
255 gpio_cfg_pin(EXYNOS5_GPIO_Y30 + i, S5P_GPIO_FUNC(2));
256 gpio_set_pull(EXYNOS5_GPIO_Y30 + i, S5P_GPIO_PULL_UP);
257
258 gpio_cfg_pin(EXYNOS5_GPIO_Y50 + i, S5P_GPIO_FUNC(2));
259 gpio_set_pull(EXYNOS5_GPIO_Y50 + i, S5P_GPIO_PULL_UP);
260
261 gpio_cfg_pin(EXYNOS5_GPIO_Y60 + i, S5P_GPIO_FUNC(2));
262 gpio_set_pull(EXYNOS5_GPIO_Y60 + i, S5P_GPIO_PULL_UP);
263 }
264}
265
266static void exynos5_i2c_config(int peripheral, int flags)
267{
268 int func01, func23;
269
270
271 if (flags & PINMUX_FLAG_HS_MODE) {
272 func01 = 4;
273 func23 = 4;
274 } else {
275 func01 = 2;
276 func23 = 3;
277 }
278
279 switch (peripheral) {
280 case PERIPH_ID_I2C0:
281 gpio_cfg_pin(EXYNOS5_GPIO_B30, S5P_GPIO_FUNC(func01));
282 gpio_cfg_pin(EXYNOS5_GPIO_B31, S5P_GPIO_FUNC(func01));
283 break;
284 case PERIPH_ID_I2C1:
285 gpio_cfg_pin(EXYNOS5_GPIO_B32, S5P_GPIO_FUNC(func01));
286 gpio_cfg_pin(EXYNOS5_GPIO_B33, S5P_GPIO_FUNC(func01));
287 break;
288 case PERIPH_ID_I2C2:
289 gpio_cfg_pin(EXYNOS5_GPIO_A06, S5P_GPIO_FUNC(func23));
290 gpio_cfg_pin(EXYNOS5_GPIO_A07, S5P_GPIO_FUNC(func23));
291 break;
292 case PERIPH_ID_I2C3:
293 gpio_cfg_pin(EXYNOS5_GPIO_A12, S5P_GPIO_FUNC(func23));
294 gpio_cfg_pin(EXYNOS5_GPIO_A13, S5P_GPIO_FUNC(func23));
295 break;
296 case PERIPH_ID_I2C4:
297 gpio_cfg_pin(EXYNOS5_GPIO_A20, S5P_GPIO_FUNC(0x3));
298 gpio_cfg_pin(EXYNOS5_GPIO_A21, S5P_GPIO_FUNC(0x3));
299 break;
300 case PERIPH_ID_I2C5:
301 gpio_cfg_pin(EXYNOS5_GPIO_A22, S5P_GPIO_FUNC(0x3));
302 gpio_cfg_pin(EXYNOS5_GPIO_A23, S5P_GPIO_FUNC(0x3));
303 break;
304 case PERIPH_ID_I2C6:
305 gpio_cfg_pin(EXYNOS5_GPIO_B13, S5P_GPIO_FUNC(0x4));
306 gpio_cfg_pin(EXYNOS5_GPIO_B14, S5P_GPIO_FUNC(0x4));
307 break;
308 case PERIPH_ID_I2C7:
309 gpio_cfg_pin(EXYNOS5_GPIO_B22, S5P_GPIO_FUNC(0x3));
310 gpio_cfg_pin(EXYNOS5_GPIO_B23, S5P_GPIO_FUNC(0x3));
311 break;
312 }
313}
314
315static void exynos5420_i2c_config(int peripheral)
316{
317 switch (peripheral) {
318 case PERIPH_ID_I2C0:
319 gpio_cfg_pin(EXYNOS5420_GPIO_B30, S5P_GPIO_FUNC(0x2));
320 gpio_cfg_pin(EXYNOS5420_GPIO_B31, S5P_GPIO_FUNC(0x2));
321 break;
322 case PERIPH_ID_I2C1:
323 gpio_cfg_pin(EXYNOS5420_GPIO_B32, S5P_GPIO_FUNC(0x2));
324 gpio_cfg_pin(EXYNOS5420_GPIO_B33, S5P_GPIO_FUNC(0x2));
325 break;
326 case PERIPH_ID_I2C2:
327 gpio_cfg_pin(EXYNOS5420_GPIO_A06, S5P_GPIO_FUNC(0x3));
328 gpio_cfg_pin(EXYNOS5420_GPIO_A07, S5P_GPIO_FUNC(0x3));
329 break;
330 case PERIPH_ID_I2C3:
331 gpio_cfg_pin(EXYNOS5420_GPIO_A12, S5P_GPIO_FUNC(0x3));
332 gpio_cfg_pin(EXYNOS5420_GPIO_A13, S5P_GPIO_FUNC(0x3));
333 break;
334 case PERIPH_ID_I2C4:
335 gpio_cfg_pin(EXYNOS5420_GPIO_A20, S5P_GPIO_FUNC(0x3));
336 gpio_cfg_pin(EXYNOS5420_GPIO_A21, S5P_GPIO_FUNC(0x3));
337 break;
338 case PERIPH_ID_I2C5:
339 gpio_cfg_pin(EXYNOS5420_GPIO_A22, S5P_GPIO_FUNC(0x3));
340 gpio_cfg_pin(EXYNOS5420_GPIO_A23, S5P_GPIO_FUNC(0x3));
341 break;
342 case PERIPH_ID_I2C6:
343 gpio_cfg_pin(EXYNOS5420_GPIO_B13, S5P_GPIO_FUNC(0x4));
344 gpio_cfg_pin(EXYNOS5420_GPIO_B14, S5P_GPIO_FUNC(0x4));
345 break;
346 case PERIPH_ID_I2C7:
347 gpio_cfg_pin(EXYNOS5420_GPIO_B22, S5P_GPIO_FUNC(0x3));
348 gpio_cfg_pin(EXYNOS5420_GPIO_B23, S5P_GPIO_FUNC(0x3));
349 break;
350 case PERIPH_ID_I2C8:
351 gpio_cfg_pin(EXYNOS5420_GPIO_B34, S5P_GPIO_FUNC(0x2));
352 gpio_cfg_pin(EXYNOS5420_GPIO_B35, S5P_GPIO_FUNC(0x2));
353 break;
354 case PERIPH_ID_I2C9:
355 gpio_cfg_pin(EXYNOS5420_GPIO_B36, S5P_GPIO_FUNC(0x2));
356 gpio_cfg_pin(EXYNOS5420_GPIO_B37, S5P_GPIO_FUNC(0x2));
357 break;
358 case PERIPH_ID_I2C10:
359 gpio_cfg_pin(EXYNOS5420_GPIO_B40, S5P_GPIO_FUNC(0x2));
360 gpio_cfg_pin(EXYNOS5420_GPIO_B41, S5P_GPIO_FUNC(0x2));
361 break;
362 }
363}
364
365static void exynos5_i2s_config(int peripheral)
366{
367 int i;
368
369 switch (peripheral) {
370 case PERIPH_ID_I2S0:
371 for (i = 0; i < 5; i++)
372 gpio_cfg_pin(EXYNOS5_GPIO_Z0 + i, S5P_GPIO_FUNC(0x02));
373 break;
374 case PERIPH_ID_I2S1:
375 for (i = 0; i < 5; i++)
376 gpio_cfg_pin(EXYNOS5_GPIO_B00 + i, S5P_GPIO_FUNC(0x02));
377 break;
378 }
379}
380
381void exynos5_spi_config(int peripheral)
382{
383 int cfg = 0, pin = 0, i;
384
385 switch (peripheral) {
386 case PERIPH_ID_SPI0:
387 cfg = S5P_GPIO_FUNC(0x2);
388 pin = EXYNOS5_GPIO_A20;
389 break;
390 case PERIPH_ID_SPI1:
391 cfg = S5P_GPIO_FUNC(0x2);
392 pin = EXYNOS5_GPIO_A24;
393 break;
394 case PERIPH_ID_SPI2:
395 cfg = S5P_GPIO_FUNC(0x5);
396 pin = EXYNOS5_GPIO_B11;
397 break;
398 case PERIPH_ID_SPI3:
399 cfg = S5P_GPIO_FUNC(0x2);
400 pin = EXYNOS5_GPIO_F10;
401 break;
402 case PERIPH_ID_SPI4:
403 for (i = 0; i < 2; i++) {
404 gpio_cfg_pin(EXYNOS5_GPIO_F02 + i, S5P_GPIO_FUNC(0x4));
405 gpio_cfg_pin(EXYNOS5_GPIO_E04 + i, S5P_GPIO_FUNC(0x4));
406 }
407 break;
408 }
409 if (peripheral != PERIPH_ID_SPI4) {
410 for (i = pin; i < pin + 4; i++)
411 gpio_cfg_pin(i, cfg);
412 }
413}
414
415void exynos5420_spi_config(int peripheral)
416{
417 int cfg, pin, i;
418
419 switch (peripheral) {
420 case PERIPH_ID_SPI0:
421 pin = EXYNOS5420_GPIO_A20;
422 cfg = S5P_GPIO_FUNC(0x2);
423 break;
424 case PERIPH_ID_SPI1:
425 pin = EXYNOS5420_GPIO_A24;
426 cfg = S5P_GPIO_FUNC(0x2);
427 break;
428 case PERIPH_ID_SPI2:
429 pin = EXYNOS5420_GPIO_B11;
430 cfg = S5P_GPIO_FUNC(0x5);
431 break;
432 case PERIPH_ID_SPI3:
433 pin = EXYNOS5420_GPIO_F10;
434 cfg = S5P_GPIO_FUNC(0x2);
435 break;
436 case PERIPH_ID_SPI4:
437 cfg = 0;
438 pin = 0;
439 break;
440 default:
441 cfg = 0;
442 pin = 0;
443 debug("%s: invalid peripheral %d", __func__, peripheral);
444 return;
445 }
446
447 if (peripheral != PERIPH_ID_SPI4) {
448 for (i = pin; i < pin + 4; i++)
449 gpio_cfg_pin(i, cfg);
450 } else {
451 for (i = 0; i < 2; i++) {
452 gpio_cfg_pin(EXYNOS5420_GPIO_F02 + i,
453 S5P_GPIO_FUNC(0x4));
454 gpio_cfg_pin(EXYNOS5420_GPIO_E04 + i,
455 S5P_GPIO_FUNC(0x4));
456 }
457 }
458}
459
460static int exynos5_pinmux_config(int peripheral, int flags)
461{
462 switch (peripheral) {
463 case PERIPH_ID_UART0:
464 case PERIPH_ID_UART1:
465 case PERIPH_ID_UART2:
466 case PERIPH_ID_UART3:
467 exynos5_uart_config(peripheral);
468 break;
469 case PERIPH_ID_SDMMC0:
470 case PERIPH_ID_SDMMC1:
471 case PERIPH_ID_SDMMC2:
472 case PERIPH_ID_SDMMC3:
473 return exynos5_mmc_config(peripheral, flags);
474 case PERIPH_ID_SROMC:
475 exynos5_sromc_config(flags);
476 break;
477 case PERIPH_ID_I2C0:
478 case PERIPH_ID_I2C1:
479 case PERIPH_ID_I2C2:
480 case PERIPH_ID_I2C3:
481 case PERIPH_ID_I2C4:
482 case PERIPH_ID_I2C5:
483 case PERIPH_ID_I2C6:
484 case PERIPH_ID_I2C7:
485 exynos5_i2c_config(peripheral, flags);
486 break;
487 case PERIPH_ID_I2S0:
488 case PERIPH_ID_I2S1:
489 exynos5_i2s_config(peripheral);
490 break;
491 case PERIPH_ID_SPI0:
492 case PERIPH_ID_SPI1:
493 case PERIPH_ID_SPI2:
494 case PERIPH_ID_SPI3:
495 case PERIPH_ID_SPI4:
496 exynos5_spi_config(peripheral);
497 break;
498 case PERIPH_ID_DPHPD:
499
500 gpio_cfg_pin(EXYNOS5_GPIO_X07, S5P_GPIO_FUNC(0x3));
501
502
503
504
505
506 gpio_set_pull(EXYNOS5_GPIO_X07, S5P_GPIO_PULL_NONE);
507 break;
508 case PERIPH_ID_PWM0:
509 gpio_cfg_pin(EXYNOS5_GPIO_B20, S5P_GPIO_FUNC(2));
510 break;
511 default:
512 debug("%s: invalid peripheral %d", __func__, peripheral);
513 return -1;
514 }
515
516 return 0;
517}
518
519static int exynos5420_pinmux_config(int peripheral, int flags)
520{
521 switch (peripheral) {
522 case PERIPH_ID_UART0:
523 case PERIPH_ID_UART1:
524 case PERIPH_ID_UART2:
525 case PERIPH_ID_UART3:
526 exynos5420_uart_config(peripheral);
527 break;
528 case PERIPH_ID_SDMMC0:
529 case PERIPH_ID_SDMMC1:
530 case PERIPH_ID_SDMMC2:
531 case PERIPH_ID_SDMMC3:
532 return exynos5420_mmc_config(peripheral, flags);
533 case PERIPH_ID_SPI0:
534 case PERIPH_ID_SPI1:
535 case PERIPH_ID_SPI2:
536 case PERIPH_ID_SPI3:
537 case PERIPH_ID_SPI4:
538 exynos5420_spi_config(peripheral);
539 break;
540 case PERIPH_ID_I2C0:
541 case PERIPH_ID_I2C1:
542 case PERIPH_ID_I2C2:
543 case PERIPH_ID_I2C3:
544 case PERIPH_ID_I2C4:
545 case PERIPH_ID_I2C5:
546 case PERIPH_ID_I2C6:
547 case PERIPH_ID_I2C7:
548 case PERIPH_ID_I2C8:
549 case PERIPH_ID_I2C9:
550 case PERIPH_ID_I2C10:
551 exynos5420_i2c_config(peripheral);
552 break;
553 case PERIPH_ID_PWM0:
554 gpio_cfg_pin(EXYNOS5420_GPIO_B20, S5P_GPIO_FUNC(2));
555 break;
556 default:
557 debug("%s: invalid peripheral %d", __func__, peripheral);
558 return -1;
559 }
560
561 return 0;
562}
563
564static void exynos4_i2c_config(int peripheral, int flags)
565{
566 switch (peripheral) {
567 case PERIPH_ID_I2C0:
568 gpio_cfg_pin(EXYNOS4_GPIO_D10, S5P_GPIO_FUNC(0x2));
569 gpio_cfg_pin(EXYNOS4_GPIO_D11, S5P_GPIO_FUNC(0x2));
570 break;
571 case PERIPH_ID_I2C1:
572 gpio_cfg_pin(EXYNOS4_GPIO_D12, S5P_GPIO_FUNC(0x2));
573 gpio_cfg_pin(EXYNOS4_GPIO_D13, S5P_GPIO_FUNC(0x2));
574 break;
575 case PERIPH_ID_I2C2:
576 gpio_cfg_pin(EXYNOS4_GPIO_A06, S5P_GPIO_FUNC(0x3));
577 gpio_cfg_pin(EXYNOS4_GPIO_A07, S5P_GPIO_FUNC(0x3));
578 break;
579 case PERIPH_ID_I2C3:
580 gpio_cfg_pin(EXYNOS4_GPIO_A12, S5P_GPIO_FUNC(0x3));
581 gpio_cfg_pin(EXYNOS4_GPIO_A13, S5P_GPIO_FUNC(0x3));
582 break;
583 case PERIPH_ID_I2C4:
584 gpio_cfg_pin(EXYNOS4_GPIO_B2, S5P_GPIO_FUNC(0x3));
585 gpio_cfg_pin(EXYNOS4_GPIO_B3, S5P_GPIO_FUNC(0x3));
586 break;
587 case PERIPH_ID_I2C5:
588 gpio_cfg_pin(EXYNOS4_GPIO_B6, S5P_GPIO_FUNC(0x3));
589 gpio_cfg_pin(EXYNOS4_GPIO_B7, S5P_GPIO_FUNC(0x3));
590 break;
591 case PERIPH_ID_I2C6:
592 gpio_cfg_pin(EXYNOS4_GPIO_C13, S5P_GPIO_FUNC(0x4));
593 gpio_cfg_pin(EXYNOS4_GPIO_C14, S5P_GPIO_FUNC(0x4));
594 break;
595 case PERIPH_ID_I2C7:
596 gpio_cfg_pin(EXYNOS4_GPIO_D02, S5P_GPIO_FUNC(0x3));
597 gpio_cfg_pin(EXYNOS4_GPIO_D03, S5P_GPIO_FUNC(0x3));
598 break;
599 }
600}
601
602static int exynos4_mmc_config(int peripheral, int flags)
603{
604 int i, start = 0, start_ext = 0;
605 unsigned int func, ext_func;
606
607 switch (peripheral) {
608 case PERIPH_ID_SDMMC0:
609 start = EXYNOS4_GPIO_K00;
610 start_ext = EXYNOS4_GPIO_K13;
611 func = S5P_GPIO_FUNC(0x2);
612 ext_func = S5P_GPIO_FUNC(0x3);
613 break;
614 case PERIPH_ID_SDMMC2:
615 start = EXYNOS4_GPIO_K20;
616 start_ext = EXYNOS4_GPIO_K33;
617 func = S5P_GPIO_FUNC(0x2);
618 ext_func = S5P_GPIO_FUNC(0x3);
619 break;
620 case PERIPH_ID_SDMMC4:
621 start = EXYNOS4_GPIO_K00;
622 start_ext = EXYNOS4_GPIO_K13;
623 func = S5P_GPIO_FUNC(0x3);
624 ext_func = S5P_GPIO_FUNC(0x4);
625 break;
626 default:
627 return -1;
628 }
629 for (i = start; i < (start + 7); i++) {
630 if (i == (start + 2))
631 continue;
632 gpio_cfg_pin(i, func);
633 gpio_set_pull(i, S5P_GPIO_PULL_NONE);
634 gpio_set_drv(i, S5P_GPIO_DRV_4X);
635 }
636
637 if (flags & PINMUX_FLAG_8BIT_MODE) {
638 for (i = start_ext; i < (start_ext + 4); i++) {
639 gpio_cfg_pin(i, ext_func);
640 gpio_set_pull(i, S5P_GPIO_PULL_NONE);
641 gpio_set_drv(i, S5P_GPIO_DRV_4X);
642 }
643 }
644
645 return 0;
646}
647
648static void exynos4_uart_config(int peripheral)
649{
650 int i, start, count;
651
652 switch (peripheral) {
653 case PERIPH_ID_UART0:
654 start = EXYNOS4_GPIO_A00;
655 count = 4;
656 break;
657 case PERIPH_ID_UART1:
658 start = EXYNOS4_GPIO_A04;
659 count = 4;
660 break;
661 case PERIPH_ID_UART2:
662 start = EXYNOS4_GPIO_A10;
663 count = 4;
664 break;
665 case PERIPH_ID_UART3:
666 start = EXYNOS4_GPIO_A14;
667 count = 2;
668 break;
669 default:
670 debug("%s: invalid peripheral %d", __func__, peripheral);
671 return;
672 }
673 for (i = start; i < (start + count); i++) {
674 gpio_set_pull(i, S5P_GPIO_PULL_NONE);
675 gpio_cfg_pin(i, S5P_GPIO_FUNC(0x2));
676 }
677}
678
679static void exynos4x12_i2c_config(int peripheral, int flags)
680{
681 switch (peripheral) {
682 case PERIPH_ID_I2C0:
683 gpio_cfg_pin(EXYNOS4X12_GPIO_D10, S5P_GPIO_FUNC(0x2));
684 gpio_cfg_pin(EXYNOS4X12_GPIO_D11, S5P_GPIO_FUNC(0x2));
685 break;
686 case PERIPH_ID_I2C1:
687 gpio_cfg_pin(EXYNOS4X12_GPIO_D12, S5P_GPIO_FUNC(0x2));
688 gpio_cfg_pin(EXYNOS4X12_GPIO_D13, S5P_GPIO_FUNC(0x2));
689 break;
690 case PERIPH_ID_I2C2:
691 gpio_cfg_pin(EXYNOS4X12_GPIO_A06, S5P_GPIO_FUNC(0x3));
692 gpio_cfg_pin(EXYNOS4X12_GPIO_A07, S5P_GPIO_FUNC(0x3));
693 break;
694 case PERIPH_ID_I2C3:
695 gpio_cfg_pin(EXYNOS4X12_GPIO_A12, S5P_GPIO_FUNC(0x3));
696 gpio_cfg_pin(EXYNOS4X12_GPIO_A13, S5P_GPIO_FUNC(0x3));
697 break;
698 case PERIPH_ID_I2C4:
699 gpio_cfg_pin(EXYNOS4X12_GPIO_B2, S5P_GPIO_FUNC(0x3));
700 gpio_cfg_pin(EXYNOS4X12_GPIO_B3, S5P_GPIO_FUNC(0x3));
701 break;
702 case PERIPH_ID_I2C5:
703 gpio_cfg_pin(EXYNOS4X12_GPIO_B6, S5P_GPIO_FUNC(0x3));
704 gpio_cfg_pin(EXYNOS4X12_GPIO_B7, S5P_GPIO_FUNC(0x3));
705 break;
706 case PERIPH_ID_I2C6:
707 gpio_cfg_pin(EXYNOS4X12_GPIO_C13, S5P_GPIO_FUNC(0x4));
708 gpio_cfg_pin(EXYNOS4X12_GPIO_C14, S5P_GPIO_FUNC(0x4));
709 break;
710 case PERIPH_ID_I2C7:
711 gpio_cfg_pin(EXYNOS4X12_GPIO_D02, S5P_GPIO_FUNC(0x3));
712 gpio_cfg_pin(EXYNOS4X12_GPIO_D03, S5P_GPIO_FUNC(0x3));
713 break;
714 }
715}
716
717static int exynos4x12_mmc_config(int peripheral, int flags)
718{
719 int i, start = 0, start_ext = 0;
720 unsigned int func, ext_func;
721
722 switch (peripheral) {
723 case PERIPH_ID_SDMMC0:
724 start = EXYNOS4X12_GPIO_K00;
725 start_ext = EXYNOS4X12_GPIO_K13;
726 func = S5P_GPIO_FUNC(0x2);
727 ext_func = S5P_GPIO_FUNC(0x3);
728 break;
729 case PERIPH_ID_SDMMC2:
730 start = EXYNOS4X12_GPIO_K20;
731 start_ext = EXYNOS4X12_GPIO_K33;
732 func = S5P_GPIO_FUNC(0x2);
733 ext_func = S5P_GPIO_FUNC(0x3);
734 break;
735 case PERIPH_ID_SDMMC4:
736 start = EXYNOS4X12_GPIO_K00;
737 start_ext = EXYNOS4X12_GPIO_K13;
738 func = S5P_GPIO_FUNC(0x3);
739 ext_func = S5P_GPIO_FUNC(0x4);
740 break;
741 default:
742 return -1;
743 }
744 for (i = start; i < (start + 7); i++) {
745 gpio_set_pull(i, S5P_GPIO_PULL_NONE);
746 if (i == (start + 2))
747 continue;
748 gpio_cfg_pin(i, func);
749 gpio_set_drv(i, S5P_GPIO_DRV_4X);
750 }
751 if (flags & PINMUX_FLAG_8BIT_MODE) {
752 for (i = start_ext; i < (start_ext + 4); i++) {
753 gpio_cfg_pin(i, ext_func);
754 gpio_set_pull(i, S5P_GPIO_PULL_NONE);
755 gpio_set_drv(i, S5P_GPIO_DRV_4X);
756 }
757 }
758
759 return 0;
760}
761
762static void exynos4x12_uart_config(int peripheral)
763{
764 int i, start, count;
765
766 switch (peripheral) {
767 case PERIPH_ID_UART0:
768 start = EXYNOS4X12_GPIO_A00;
769 count = 4;
770 break;
771 case PERIPH_ID_UART1:
772 start = EXYNOS4X12_GPIO_A04;
773 count = 4;
774 break;
775 case PERIPH_ID_UART2:
776 start = EXYNOS4X12_GPIO_A10;
777 count = 4;
778 break;
779 case PERIPH_ID_UART3:
780 start = EXYNOS4X12_GPIO_A14;
781 count = 2;
782 break;
783 default:
784 debug("%s: invalid peripheral %d", __func__, peripheral);
785 return;
786 }
787 for (i = start; i < (start + count); i++) {
788 gpio_set_pull(i, S5P_GPIO_PULL_NONE);
789 gpio_cfg_pin(i, S5P_GPIO_FUNC(0x2));
790 }
791}
792
793static int exynos4_pinmux_config(int peripheral, int flags)
794{
795 switch (peripheral) {
796 case PERIPH_ID_UART0:
797 case PERIPH_ID_UART1:
798 case PERIPH_ID_UART2:
799 case PERIPH_ID_UART3:
800 exynos4_uart_config(peripheral);
801 break;
802 case PERIPH_ID_I2C0:
803 case PERIPH_ID_I2C1:
804 case PERIPH_ID_I2C2:
805 case PERIPH_ID_I2C3:
806 case PERIPH_ID_I2C4:
807 case PERIPH_ID_I2C5:
808 case PERIPH_ID_I2C6:
809 case PERIPH_ID_I2C7:
810 exynos4_i2c_config(peripheral, flags);
811 break;
812 case PERIPH_ID_SDMMC0:
813 case PERIPH_ID_SDMMC2:
814 case PERIPH_ID_SDMMC4:
815 return exynos4_mmc_config(peripheral, flags);
816 case PERIPH_ID_SDMMC1:
817 case PERIPH_ID_SDMMC3:
818 debug("SDMMC device %d not implemented\n", peripheral);
819 return -1;
820 default:
821 debug("%s: invalid peripheral %d", __func__, peripheral);
822 return -1;
823 }
824
825 return 0;
826}
827
828static int exynos4x12_pinmux_config(int peripheral, int flags)
829{
830 switch (peripheral) {
831 case PERIPH_ID_UART0:
832 case PERIPH_ID_UART1:
833 case PERIPH_ID_UART2:
834 case PERIPH_ID_UART3:
835 exynos4x12_uart_config(peripheral);
836 break;
837 case PERIPH_ID_I2C0:
838 case PERIPH_ID_I2C1:
839 case PERIPH_ID_I2C2:
840 case PERIPH_ID_I2C3:
841 case PERIPH_ID_I2C4:
842 case PERIPH_ID_I2C5:
843 case PERIPH_ID_I2C6:
844 case PERIPH_ID_I2C7:
845 exynos4x12_i2c_config(peripheral, flags);
846 break;
847 case PERIPH_ID_SDMMC0:
848 case PERIPH_ID_SDMMC2:
849 case PERIPH_ID_SDMMC4:
850 return exynos4x12_mmc_config(peripheral, flags);
851 case PERIPH_ID_SDMMC1:
852 case PERIPH_ID_SDMMC3:
853 debug("SDMMC device %d not implemented\n", peripheral);
854 return -1;
855 default:
856 debug("%s: invalid peripheral %d", __func__, peripheral);
857 return -1;
858 }
859
860 return 0;
861}
862
863int exynos_pinmux_config(int peripheral, int flags)
864{
865 if (cpu_is_exynos5()) {
866 if (proid_is_exynos5420() || proid_is_exynos5422())
867 return exynos5420_pinmux_config(peripheral, flags);
868 else if (proid_is_exynos5250())
869 return exynos5_pinmux_config(peripheral, flags);
870 } else if (cpu_is_exynos4()) {
871 if (proid_is_exynos4412())
872 return exynos4x12_pinmux_config(peripheral, flags);
873 else
874 return exynos4_pinmux_config(peripheral, flags);
875 }
876
877 debug("pinmux functionality not supported\n");
878
879 return -1;
880}
881
882#if CONFIG_IS_ENABLED(OF_CONTROL)
883static int exynos4_pinmux_decode_periph_id(const void *blob, int node)
884{
885 int err;
886 u32 cell[3];
887
888 err = fdtdec_get_int_array(blob, node, "interrupts", cell,
889 ARRAY_SIZE(cell));
890 if (err) {
891 debug(" invalid peripheral id\n");
892 return PERIPH_ID_NONE;
893 }
894
895 return cell[1];
896}
897
898static int exynos5_pinmux_decode_periph_id(const void *blob, int node)
899{
900 int err;
901 u32 cell[3];
902
903 err = fdtdec_get_int_array(blob, node, "interrupts", cell,
904 ARRAY_SIZE(cell));
905 if (err)
906 return PERIPH_ID_NONE;
907
908 return cell[1];
909}
910
911int pinmux_decode_periph_id(const void *blob, int node)
912{
913 if (cpu_is_exynos5())
914 return exynos5_pinmux_decode_periph_id(blob, node);
915 else if (cpu_is_exynos4())
916 return exynos4_pinmux_decode_periph_id(blob, node);
917
918 return PERIPH_ID_NONE;
919}
920#endif
921