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