Merge tag 'u-boot-imx-20190101' of git://www.denx.de/git/u-boot-imx
[pandora-u-boot.git] / arch / arm / mach-exynos / pinmux.c
1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * Copyright (c) 2012 Samsung Electronics.
4  * Abhilash Kesavan <a.kesavan@samsung.com>
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
13 static 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
44 static 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
76 static 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
129 static 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                  * MMC0 is intended to be used for eMMC. The
169                  * card detect pin is used as a VDDEN signal to
170                  * power on the eMMC. The 5420 iROM makes
171                  * this same assumption.
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
195 static void exynos5_sromc_config(int flags)
196 {
197         int i;
198
199         /*
200          * SROM:CS1 and EBI
201          *
202          * GPY0[0]      SROM_CSn[0]
203          * GPY0[1]      SROM_CSn[1](2)
204          * GPY0[2]      SROM_CSn[2]
205          * GPY0[3]      SROM_CSn[3]
206          * GPY0[4]      EBI_OEn(2)
207          * GPY0[5]      EBI_EEn(2)
208          *
209          * GPY1[0]      EBI_BEn[0](2)
210          * GPY1[1]      EBI_BEn[1](2)
211          * GPY1[2]      SROM_WAIT(2)
212          * GPY1[3]      EBI_DATA_RDn(2)
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          * EBI: 8 Addrss Lines
224          *
225          * GPY3[0]      EBI_ADDR[0](2)
226          * GPY3[1]      EBI_ADDR[1](2)
227          * GPY3[2]      EBI_ADDR[2](2)
228          * GPY3[3]      EBI_ADDR[3](2)
229          * GPY3[4]      EBI_ADDR[4](2)
230          * GPY3[5]      EBI_ADDR[5](2)
231          * GPY3[6]      EBI_ADDR[6](2)
232          * GPY3[7]      EBI_ADDR[7](2)
233          *
234          * EBI: 16 Data Lines
235          *
236          * GPY5[0]      EBI_DATA[0](2)
237          * GPY5[1]      EBI_DATA[1](2)
238          * GPY5[2]      EBI_DATA[2](2)
239          * GPY5[3]      EBI_DATA[3](2)
240          * GPY5[4]      EBI_DATA[4](2)
241          * GPY5[5]      EBI_DATA[5](2)
242          * GPY5[6]      EBI_DATA[6](2)
243          * GPY5[7]      EBI_DATA[7](2)
244          *
245          * GPY6[0]      EBI_DATA[8](2)
246          * GPY6[1]      EBI_DATA[9](2)
247          * GPY6[2]      EBI_DATA[10](2)
248          * GPY6[3]      EBI_DATA[11](2)
249          * GPY6[4]      EBI_DATA[12](2)
250          * GPY6[5]      EBI_DATA[13](2)
251          * GPY6[6]      EBI_DATA[14](2)
252          * GPY6[7]      EBI_DATA[15](2)
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
266 static void exynos5_i2c_config(int peripheral, int flags)
267 {
268         int func01, func23;
269
270          /* High-Speed I2C */
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
315 static 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
365 static 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
381 static void exynos5420_i2s_config(int peripheral)
382 {
383         int i;
384
385         switch (peripheral) {
386         case PERIPH_ID_I2S0:
387                 for (i = 0; i < 5; i++)
388                         gpio_cfg_pin(EXYNOS5420_GPIO_Z0 + i,
389                                      S5P_GPIO_FUNC(0x02));
390                 break;
391         }
392 }
393
394
395 void exynos5_spi_config(int peripheral)
396 {
397         int cfg = 0, pin = 0, i;
398
399         switch (peripheral) {
400         case PERIPH_ID_SPI0:
401                 cfg = S5P_GPIO_FUNC(0x2);
402                 pin = EXYNOS5_GPIO_A20;
403                 break;
404         case PERIPH_ID_SPI1:
405                 cfg = S5P_GPIO_FUNC(0x2);
406                 pin = EXYNOS5_GPIO_A24;
407                 break;
408         case PERIPH_ID_SPI2:
409                 cfg = S5P_GPIO_FUNC(0x5);
410                 pin = EXYNOS5_GPIO_B11;
411                 break;
412         case PERIPH_ID_SPI3:
413                 cfg = S5P_GPIO_FUNC(0x2);
414                 pin = EXYNOS5_GPIO_F10;
415                 break;
416         case PERIPH_ID_SPI4:
417                 for (i = 0; i < 2; i++) {
418                         gpio_cfg_pin(EXYNOS5_GPIO_F02 + i, S5P_GPIO_FUNC(0x4));
419                         gpio_cfg_pin(EXYNOS5_GPIO_E04 + i, S5P_GPIO_FUNC(0x4));
420                 }
421                 break;
422         }
423         if (peripheral != PERIPH_ID_SPI4) {
424                 for (i = pin; i < pin + 4; i++)
425                         gpio_cfg_pin(i, cfg);
426         }
427 }
428
429 void exynos5420_spi_config(int peripheral)
430 {
431         int cfg, pin, i;
432
433         switch (peripheral) {
434         case PERIPH_ID_SPI0:
435                 pin = EXYNOS5420_GPIO_A20;
436                 cfg = S5P_GPIO_FUNC(0x2);
437                 break;
438         case PERIPH_ID_SPI1:
439                 pin = EXYNOS5420_GPIO_A24;
440                 cfg = S5P_GPIO_FUNC(0x2);
441                 break;
442         case PERIPH_ID_SPI2:
443                 pin = EXYNOS5420_GPIO_B11;
444                 cfg = S5P_GPIO_FUNC(0x5);
445                 break;
446         case PERIPH_ID_SPI3:
447                 pin = EXYNOS5420_GPIO_F10;
448                 cfg = S5P_GPIO_FUNC(0x2);
449                 break;
450         case PERIPH_ID_SPI4:
451                 cfg = 0;
452                 pin = 0;
453                 break;
454         default:
455                 cfg = 0;
456                 pin = 0;
457                 debug("%s: invalid peripheral %d", __func__, peripheral);
458                 return;
459         }
460
461         if (peripheral != PERIPH_ID_SPI4) {
462                 for (i = pin; i < pin + 4; i++)
463                         gpio_cfg_pin(i, cfg);
464         } else {
465                 for (i = 0; i < 2; i++) {
466                         gpio_cfg_pin(EXYNOS5420_GPIO_F02 + i,
467                                      S5P_GPIO_FUNC(0x4));
468                         gpio_cfg_pin(EXYNOS5420_GPIO_E04 + i,
469                                      S5P_GPIO_FUNC(0x4));
470                 }
471         }
472 }
473
474 static int exynos5_pinmux_config(int peripheral, int flags)
475 {
476         switch (peripheral) {
477         case PERIPH_ID_UART0:
478         case PERIPH_ID_UART1:
479         case PERIPH_ID_UART2:
480         case PERIPH_ID_UART3:
481                 exynos5_uart_config(peripheral);
482                 break;
483         case PERIPH_ID_SDMMC0:
484         case PERIPH_ID_SDMMC1:
485         case PERIPH_ID_SDMMC2:
486         case PERIPH_ID_SDMMC3:
487                 return exynos5_mmc_config(peripheral, flags);
488         case PERIPH_ID_SROMC:
489                 exynos5_sromc_config(flags);
490                 break;
491         case PERIPH_ID_I2C0:
492         case PERIPH_ID_I2C1:
493         case PERIPH_ID_I2C2:
494         case PERIPH_ID_I2C3:
495         case PERIPH_ID_I2C4:
496         case PERIPH_ID_I2C5:
497         case PERIPH_ID_I2C6:
498         case PERIPH_ID_I2C7:
499                 exynos5_i2c_config(peripheral, flags);
500                 break;
501         case PERIPH_ID_I2S0:
502         case PERIPH_ID_I2S1:
503                 exynos5_i2s_config(peripheral);
504                 break;
505         case PERIPH_ID_SPI0:
506         case PERIPH_ID_SPI1:
507         case PERIPH_ID_SPI2:
508         case PERIPH_ID_SPI3:
509         case PERIPH_ID_SPI4:
510                 exynos5_spi_config(peripheral);
511                 break;
512         case PERIPH_ID_DPHPD:
513                 /* Set Hotplug detect for DP */
514                 gpio_cfg_pin(EXYNOS5_GPIO_X07, S5P_GPIO_FUNC(0x3));
515
516                 /*
517                  * Hotplug detect should have an external pullup; disable the
518                  * internal pulldown so they don't fight.
519                  */
520                 gpio_set_pull(EXYNOS5_GPIO_X07, S5P_GPIO_PULL_NONE);
521                 break;
522         case PERIPH_ID_PWM0:
523                 gpio_cfg_pin(EXYNOS5_GPIO_B20, S5P_GPIO_FUNC(2));
524                 break;
525         default:
526                 debug("%s: invalid peripheral %d", __func__, peripheral);
527                 return -1;
528         }
529
530         return 0;
531 }
532
533 static int exynos5420_pinmux_config(int peripheral, int flags)
534 {
535         switch (peripheral) {
536         case PERIPH_ID_UART0:
537         case PERIPH_ID_UART1:
538         case PERIPH_ID_UART2:
539         case PERIPH_ID_UART3:
540                 exynos5420_uart_config(peripheral);
541                 break;
542         case PERIPH_ID_SDMMC0:
543         case PERIPH_ID_SDMMC1:
544         case PERIPH_ID_SDMMC2:
545         case PERIPH_ID_SDMMC3:
546                 return exynos5420_mmc_config(peripheral, flags);
547         case PERIPH_ID_SPI0:
548         case PERIPH_ID_SPI1:
549         case PERIPH_ID_SPI2:
550         case PERIPH_ID_SPI3:
551         case PERIPH_ID_SPI4:
552                 exynos5420_spi_config(peripheral);
553                 break;
554         case PERIPH_ID_I2C0:
555         case PERIPH_ID_I2C1:
556         case PERIPH_ID_I2C2:
557         case PERIPH_ID_I2C3:
558         case PERIPH_ID_I2C4:
559         case PERIPH_ID_I2C5:
560         case PERIPH_ID_I2C6:
561         case PERIPH_ID_I2C7:
562         case PERIPH_ID_I2C8:
563         case PERIPH_ID_I2C9:
564         case PERIPH_ID_I2C10:
565                 exynos5420_i2c_config(peripheral);
566                 break;
567         case PERIPH_ID_I2S0:
568                 exynos5420_i2s_config(peripheral);
569                 break;
570         case PERIPH_ID_PWM0:
571                 gpio_cfg_pin(EXYNOS5420_GPIO_B20, S5P_GPIO_FUNC(2));
572                 break;
573         default:
574                 debug("%s: invalid peripheral %d", __func__, peripheral);
575                 return -1;
576         }
577
578         return 0;
579 }
580
581 static void exynos4_i2c_config(int peripheral, int flags)
582 {
583         switch (peripheral) {
584         case PERIPH_ID_I2C0:
585                 gpio_cfg_pin(EXYNOS4_GPIO_D10, S5P_GPIO_FUNC(0x2));
586                 gpio_cfg_pin(EXYNOS4_GPIO_D11, S5P_GPIO_FUNC(0x2));
587                 break;
588         case PERIPH_ID_I2C1:
589                 gpio_cfg_pin(EXYNOS4_GPIO_D12, S5P_GPIO_FUNC(0x2));
590                 gpio_cfg_pin(EXYNOS4_GPIO_D13, S5P_GPIO_FUNC(0x2));
591                 break;
592         case PERIPH_ID_I2C2:
593                 gpio_cfg_pin(EXYNOS4_GPIO_A06, S5P_GPIO_FUNC(0x3));
594                 gpio_cfg_pin(EXYNOS4_GPIO_A07, S5P_GPIO_FUNC(0x3));
595                 break;
596         case PERIPH_ID_I2C3:
597                 gpio_cfg_pin(EXYNOS4_GPIO_A12, S5P_GPIO_FUNC(0x3));
598                 gpio_cfg_pin(EXYNOS4_GPIO_A13, S5P_GPIO_FUNC(0x3));
599                 break;
600         case PERIPH_ID_I2C4:
601                 gpio_cfg_pin(EXYNOS4_GPIO_B2, S5P_GPIO_FUNC(0x3));
602                 gpio_cfg_pin(EXYNOS4_GPIO_B3, S5P_GPIO_FUNC(0x3));
603                 break;
604         case PERIPH_ID_I2C5:
605                 gpio_cfg_pin(EXYNOS4_GPIO_B6, S5P_GPIO_FUNC(0x3));
606                 gpio_cfg_pin(EXYNOS4_GPIO_B7, S5P_GPIO_FUNC(0x3));
607                 break;
608         case PERIPH_ID_I2C6:
609                 gpio_cfg_pin(EXYNOS4_GPIO_C13, S5P_GPIO_FUNC(0x4));
610                 gpio_cfg_pin(EXYNOS4_GPIO_C14, S5P_GPIO_FUNC(0x4));
611                 break;
612         case PERIPH_ID_I2C7:
613                 gpio_cfg_pin(EXYNOS4_GPIO_D02, S5P_GPIO_FUNC(0x3));
614                 gpio_cfg_pin(EXYNOS4_GPIO_D03, S5P_GPIO_FUNC(0x3));
615                 break;
616         }
617 }
618
619 static int exynos4_mmc_config(int peripheral, int flags)
620 {
621         int i, start = 0, start_ext = 0;
622         unsigned int func, ext_func;
623
624         switch (peripheral) {
625         case PERIPH_ID_SDMMC0:
626                 start = EXYNOS4_GPIO_K00;
627                 start_ext = EXYNOS4_GPIO_K13;
628                 func = S5P_GPIO_FUNC(0x2);
629                 ext_func = S5P_GPIO_FUNC(0x3);
630                 break;
631         case PERIPH_ID_SDMMC2:
632                 start = EXYNOS4_GPIO_K20;
633                 start_ext = EXYNOS4_GPIO_K33;
634                 func = S5P_GPIO_FUNC(0x2);
635                 ext_func = S5P_GPIO_FUNC(0x3);
636                 break;
637         case PERIPH_ID_SDMMC4:
638                 start = EXYNOS4_GPIO_K00;
639                 start_ext = EXYNOS4_GPIO_K13;
640                 func = S5P_GPIO_FUNC(0x3);
641                 ext_func = S5P_GPIO_FUNC(0x4);
642                 break;
643         default:
644                 return -1;
645         }
646         for (i = start; i < (start + 7); i++) {
647                 if (i == (start + 2))
648                         continue;
649                 gpio_cfg_pin(i,  func);
650                 gpio_set_pull(i, S5P_GPIO_PULL_NONE);
651                 gpio_set_drv(i, S5P_GPIO_DRV_4X);
652         }
653         /* SDMMC2 do not use 8bit mode at exynos4 */
654         if (flags & PINMUX_FLAG_8BIT_MODE) {
655                 for (i = start_ext; i < (start_ext + 4); i++) {
656                         gpio_cfg_pin(i,  ext_func);
657                         gpio_set_pull(i, S5P_GPIO_PULL_NONE);
658                         gpio_set_drv(i, S5P_GPIO_DRV_4X);
659                 }
660         }
661
662         return 0;
663 }
664
665 static void exynos4_uart_config(int peripheral)
666 {
667         int i, start, count;
668
669         switch (peripheral) {
670         case PERIPH_ID_UART0:
671                 start = EXYNOS4_GPIO_A00;
672                 count = 4;
673                 break;
674         case PERIPH_ID_UART1:
675                 start = EXYNOS4_GPIO_A04;
676                 count = 4;
677                 break;
678         case PERIPH_ID_UART2:
679                 start = EXYNOS4_GPIO_A10;
680                 count = 4;
681                 break;
682         case PERIPH_ID_UART3:
683                 start = EXYNOS4_GPIO_A14;
684                 count = 2;
685                 break;
686         default:
687                 debug("%s: invalid peripheral %d", __func__, peripheral);
688                 return;
689         }
690         for (i = start; i < (start + count); i++) {
691                 gpio_set_pull(i, S5P_GPIO_PULL_NONE);
692                 gpio_cfg_pin(i, S5P_GPIO_FUNC(0x2));
693         }
694 }
695
696 static void exynos4x12_i2c_config(int peripheral, int flags)
697 {
698         switch (peripheral) {
699         case PERIPH_ID_I2C0:
700                 gpio_cfg_pin(EXYNOS4X12_GPIO_D10, S5P_GPIO_FUNC(0x2));
701                 gpio_cfg_pin(EXYNOS4X12_GPIO_D11, S5P_GPIO_FUNC(0x2));
702                 break;
703         case PERIPH_ID_I2C1:
704                 gpio_cfg_pin(EXYNOS4X12_GPIO_D12, S5P_GPIO_FUNC(0x2));
705                 gpio_cfg_pin(EXYNOS4X12_GPIO_D13, S5P_GPIO_FUNC(0x2));
706                 break;
707         case PERIPH_ID_I2C2:
708                 gpio_cfg_pin(EXYNOS4X12_GPIO_A06, S5P_GPIO_FUNC(0x3));
709                 gpio_cfg_pin(EXYNOS4X12_GPIO_A07, S5P_GPIO_FUNC(0x3));
710                 break;
711         case PERIPH_ID_I2C3:
712                 gpio_cfg_pin(EXYNOS4X12_GPIO_A12, S5P_GPIO_FUNC(0x3));
713                 gpio_cfg_pin(EXYNOS4X12_GPIO_A13, S5P_GPIO_FUNC(0x3));
714                 break;
715         case PERIPH_ID_I2C4:
716                 gpio_cfg_pin(EXYNOS4X12_GPIO_B2, S5P_GPIO_FUNC(0x3));
717                 gpio_cfg_pin(EXYNOS4X12_GPIO_B3, S5P_GPIO_FUNC(0x3));
718                 break;
719         case PERIPH_ID_I2C5:
720                 gpio_cfg_pin(EXYNOS4X12_GPIO_B6, S5P_GPIO_FUNC(0x3));
721                 gpio_cfg_pin(EXYNOS4X12_GPIO_B7, S5P_GPIO_FUNC(0x3));
722                 break;
723         case PERIPH_ID_I2C6:
724                 gpio_cfg_pin(EXYNOS4X12_GPIO_C13, S5P_GPIO_FUNC(0x4));
725                 gpio_cfg_pin(EXYNOS4X12_GPIO_C14, S5P_GPIO_FUNC(0x4));
726                 break;
727         case PERIPH_ID_I2C7:
728                 gpio_cfg_pin(EXYNOS4X12_GPIO_D02, S5P_GPIO_FUNC(0x3));
729                 gpio_cfg_pin(EXYNOS4X12_GPIO_D03, S5P_GPIO_FUNC(0x3));
730                 break;
731         }
732 }
733
734 static int exynos4x12_mmc_config(int peripheral, int flags)
735 {
736         int i, start = 0, start_ext = 0;
737         unsigned int func, ext_func;
738
739         switch (peripheral) {
740         case PERIPH_ID_SDMMC0:
741                 start = EXYNOS4X12_GPIO_K00;
742                 start_ext = EXYNOS4X12_GPIO_K13;
743                 func = S5P_GPIO_FUNC(0x2);
744                 ext_func = S5P_GPIO_FUNC(0x3);
745                 break;
746         case PERIPH_ID_SDMMC2:
747                 start = EXYNOS4X12_GPIO_K20;
748                 start_ext = EXYNOS4X12_GPIO_K33;
749                 func = S5P_GPIO_FUNC(0x2);
750                 ext_func = S5P_GPIO_FUNC(0x3);
751                 break;
752         case PERIPH_ID_SDMMC4:
753                 start = EXYNOS4X12_GPIO_K00;
754                 start_ext = EXYNOS4X12_GPIO_K13;
755                 func = S5P_GPIO_FUNC(0x3);
756                 ext_func = S5P_GPIO_FUNC(0x4);
757                 break;
758         default:
759                 return -1;
760         }
761         for (i = start; i < (start + 7); i++) {
762                 gpio_set_pull(i, S5P_GPIO_PULL_NONE);
763                 if (i == (start + 2))
764                         continue;
765                 gpio_cfg_pin(i,  func);
766                 gpio_set_drv(i, S5P_GPIO_DRV_4X);
767         }
768         if (flags & PINMUX_FLAG_8BIT_MODE) {
769                 for (i = start_ext; i < (start_ext + 4); i++) {
770                         gpio_cfg_pin(i,  ext_func);
771                         gpio_set_pull(i, S5P_GPIO_PULL_NONE);
772                         gpio_set_drv(i, S5P_GPIO_DRV_4X);
773                 }
774         }
775
776         return 0;
777 }
778
779 static void exynos4x12_uart_config(int peripheral)
780 {
781         int i, start, count;
782
783         switch (peripheral) {
784         case PERIPH_ID_UART0:
785                 start = EXYNOS4X12_GPIO_A00;
786                 count = 4;
787                 break;
788         case PERIPH_ID_UART1:
789                 start = EXYNOS4X12_GPIO_A04;
790                 count = 4;
791                 break;
792         case PERIPH_ID_UART2:
793                 start = EXYNOS4X12_GPIO_A10;
794                 count = 4;
795                 break;
796         case PERIPH_ID_UART3:
797                 start = EXYNOS4X12_GPIO_A14;
798                 count = 2;
799                 break;
800         default:
801                 debug("%s: invalid peripheral %d", __func__, peripheral);
802                 return;
803         }
804         for (i = start; i < (start + count); i++) {
805                 gpio_set_pull(i, S5P_GPIO_PULL_NONE);
806                 gpio_cfg_pin(i, S5P_GPIO_FUNC(0x2));
807         }
808 }
809
810 static int exynos4_pinmux_config(int peripheral, int flags)
811 {
812         switch (peripheral) {
813         case PERIPH_ID_UART0:
814         case PERIPH_ID_UART1:
815         case PERIPH_ID_UART2:
816         case PERIPH_ID_UART3:
817                 exynos4_uart_config(peripheral);
818                 break;
819         case PERIPH_ID_I2C0:
820         case PERIPH_ID_I2C1:
821         case PERIPH_ID_I2C2:
822         case PERIPH_ID_I2C3:
823         case PERIPH_ID_I2C4:
824         case PERIPH_ID_I2C5:
825         case PERIPH_ID_I2C6:
826         case PERIPH_ID_I2C7:
827                 exynos4_i2c_config(peripheral, flags);
828                 break;
829         case PERIPH_ID_SDMMC0:
830         case PERIPH_ID_SDMMC2:
831         case PERIPH_ID_SDMMC4:
832                 return exynos4_mmc_config(peripheral, flags);
833         case PERIPH_ID_SDMMC1:
834         case PERIPH_ID_SDMMC3:
835                 debug("SDMMC device %d not implemented\n", peripheral);
836                 return -1;
837         default:
838                 debug("%s: invalid peripheral %d", __func__, peripheral);
839                 return -1;
840         }
841
842         return 0;
843 }
844
845 static int exynos4x12_pinmux_config(int peripheral, int flags)
846 {
847         switch (peripheral) {
848         case PERIPH_ID_UART0:
849         case PERIPH_ID_UART1:
850         case PERIPH_ID_UART2:
851         case PERIPH_ID_UART3:
852                 exynos4x12_uart_config(peripheral);
853                 break;
854         case PERIPH_ID_I2C0:
855         case PERIPH_ID_I2C1:
856         case PERIPH_ID_I2C2:
857         case PERIPH_ID_I2C3:
858         case PERIPH_ID_I2C4:
859         case PERIPH_ID_I2C5:
860         case PERIPH_ID_I2C6:
861         case PERIPH_ID_I2C7:
862                 exynos4x12_i2c_config(peripheral, flags);
863                 break;
864         case PERIPH_ID_SDMMC0:
865         case PERIPH_ID_SDMMC2:
866         case PERIPH_ID_SDMMC4:
867                 return exynos4x12_mmc_config(peripheral, flags);
868         case PERIPH_ID_SDMMC1:
869         case PERIPH_ID_SDMMC3:
870                 debug("SDMMC device %d not implemented\n", peripheral);
871                 return -1;
872         default:
873                 debug("%s: invalid peripheral %d", __func__, peripheral);
874                 return -1;
875         }
876
877         return 0;
878 }
879
880 int exynos_pinmux_config(int peripheral, int flags)
881 {
882         if (cpu_is_exynos5()) {
883                 if (proid_is_exynos542x())
884                         return exynos5420_pinmux_config(peripheral, flags);
885                 else if (proid_is_exynos5250())
886                         return exynos5_pinmux_config(peripheral, flags);
887         } else if (cpu_is_exynos4()) {
888                 if (proid_is_exynos4412())
889                         return exynos4x12_pinmux_config(peripheral, flags);
890                 else
891                         return exynos4_pinmux_config(peripheral, flags);
892         }
893
894         debug("pinmux functionality not supported\n");
895
896         return -1;
897 }
898
899 #if CONFIG_IS_ENABLED(OF_CONTROL)
900 static int exynos4_pinmux_decode_periph_id(const void *blob, int node)
901 {
902         int err;
903         u32 cell[3];
904
905         err = fdtdec_get_int_array(blob, node, "interrupts", cell,
906                                         ARRAY_SIZE(cell));
907         if (err) {
908                 debug(" invalid peripheral id\n");
909                 return PERIPH_ID_NONE;
910         }
911
912         return cell[1];
913 }
914
915 static int exynos5_pinmux_decode_periph_id(const void *blob, int node)
916 {
917         int err;
918         u32 cell[3];
919
920         err = fdtdec_get_int_array(blob, node, "interrupts", cell,
921                                         ARRAY_SIZE(cell));
922         if (err)
923                 return PERIPH_ID_NONE;
924
925         return cell[1];
926 }
927
928 int pinmux_decode_periph_id(const void *blob, int node)
929 {
930         if (cpu_is_exynos5())
931                 return  exynos5_pinmux_decode_periph_id(blob, node);
932         else if (cpu_is_exynos4())
933                 return  exynos4_pinmux_decode_periph_id(blob, node);
934
935         return PERIPH_ID_NONE;
936 }
937 #endif