• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
exynos5_uart_config(int peripheral)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 
exynos5420_uart_config(int peripheral)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 
exynos5_mmc_config(int peripheral,int flags)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 
exynos5420_mmc_config(int peripheral,int flags)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 
exynos5_sromc_config(int flags)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 
exynos5_i2c_config(int peripheral,int flags)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 
exynos5420_i2c_config(int peripheral)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 
exynos5_i2s_config(int peripheral)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 
exynos5_spi_config(int peripheral)381 void 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 
exynos5420_spi_config(int peripheral)415 void 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 
exynos5_pinmux_config(int peripheral,int flags)460 static 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 		/* Set Hotplug detect for DP */
500 		gpio_cfg_pin(EXYNOS5_GPIO_X07, S5P_GPIO_FUNC(0x3));
501 
502 		/*
503 		 * Hotplug detect should have an external pullup; disable the
504 		 * internal pulldown so they don't fight.
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 
exynos5420_pinmux_config(int peripheral,int flags)519 static 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 
exynos4_i2c_config(int peripheral,int flags)564 static 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 
exynos4_mmc_config(int peripheral,int flags)602 static 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 	/* SDMMC2 do not use 8bit mode at exynos4 */
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 
exynos4_uart_config(int peripheral)648 static 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 
exynos4x12_i2c_config(int peripheral,int flags)679 static 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 
exynos4x12_mmc_config(int peripheral,int flags)717 static 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 
exynos4x12_uart_config(int peripheral)762 static 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 
exynos4_pinmux_config(int peripheral,int flags)793 static 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 
exynos4x12_pinmux_config(int peripheral,int flags)828 static 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 
exynos_pinmux_config(int peripheral,int flags)863 int 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)
exynos4_pinmux_decode_periph_id(const void * blob,int node)883 static 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 
exynos5_pinmux_decode_periph_id(const void * blob,int node)898 static 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 
pinmux_decode_periph_id(const void * blob,int node)911 int 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