xref: /openbmc/u-boot/arch/arm/mach-exynos/pinmux.c (revision 8fc26fce41592175ae004514e431e68a9dd60671)
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  
exynos5420_i2s_config(int peripheral)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  
exynos5_spi_config(int peripheral)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  
exynos5420_spi_config(int peripheral)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  
exynos5_pinmux_config(int peripheral,int flags)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  
exynos5420_pinmux_config(int peripheral,int flags)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  
exynos4_i2c_config(int peripheral,int flags)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  
exynos4_mmc_config(int peripheral,int flags)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  
exynos4_uart_config(int peripheral)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  
exynos4x12_i2c_config(int peripheral,int flags)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  
exynos4x12_mmc_config(int peripheral,int flags)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  
exynos4x12_uart_config(int peripheral)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  
exynos4_pinmux_config(int peripheral,int flags)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  
exynos4x12_pinmux_config(int peripheral,int flags)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  
exynos_pinmux_config(int peripheral,int flags)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)
exynos4_pinmux_decode_periph_id(const void * blob,int node)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  
exynos5_pinmux_decode_periph_id(const void * blob,int node)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  
pinmux_decode_periph_id(const void * blob,int node)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
938