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