blob: be43e224fa37074bf2a939ad3e486f3268833910 [file] [log] [blame]
Rajeshwari Shinde57da3e32012-06-06 19:54:29 +00001/*
2 * Copyright (c) 2012 Samsung Electronics.
3 * Abhilash Kesavan <a.kesavan@samsung.com>
4 *
Wolfgang Denkd79de1d2013-07-08 09:37:19 +02005 * SPDX-License-Identifier: GPL-2.0+
Rajeshwari Shinde57da3e32012-06-06 19:54:29 +00006 */
7
8#include <common.h>
Rajeshwari Shinde28bae822012-12-26 20:03:11 +00009#include <fdtdec.h>
Simon Glass37f11622014-10-20 19:48:37 -060010#include <asm/gpio.h>
Rajeshwari Shinde57da3e32012-06-06 19:54:29 +000011#include <asm/arch/pinmux.h>
12#include <asm/arch/sromc.h>
13
14static void exynos5_uart_config(int peripheral)
15{
Rajeshwari Shinde57da3e32012-06-06 19:54:29 +000016 int i, start, count;
17
18 switch (peripheral) {
19 case PERIPH_ID_UART0:
Akshay Saraswat1376cdd2014-05-13 10:30:14 +053020 start = EXYNOS5_GPIO_A00;
Rajeshwari Shinde57da3e32012-06-06 19:54:29 +000021 count = 4;
22 break;
23 case PERIPH_ID_UART1:
Akshay Saraswat1376cdd2014-05-13 10:30:14 +053024 start = EXYNOS5_GPIO_D00;
Rajeshwari Shinde57da3e32012-06-06 19:54:29 +000025 count = 4;
26 break;
27 case PERIPH_ID_UART2:
Akshay Saraswat1376cdd2014-05-13 10:30:14 +053028 start = EXYNOS5_GPIO_A10;
Rajeshwari Shinde57da3e32012-06-06 19:54:29 +000029 count = 4;
30 break;
31 case PERIPH_ID_UART3:
Akshay Saraswat1376cdd2014-05-13 10:30:14 +053032 start = EXYNOS5_GPIO_A14;
Rajeshwari Shinde57da3e32012-06-06 19:54:29 +000033 count = 2;
34 break;
Marek Vasute382be92014-03-10 20:04:31 +010035 default:
36 debug("%s: invalid peripheral %d", __func__, peripheral);
37 return;
Rajeshwari Shinde57da3e32012-06-06 19:54:29 +000038 }
39 for (i = start; i < start + count; i++) {
Akshay Saraswat1376cdd2014-05-13 10:30:14 +053040 gpio_set_pull(i, S5P_GPIO_PULL_NONE);
41 gpio_cfg_pin(i, S5P_GPIO_FUNC(0x2));
Rajeshwari Shinde57da3e32012-06-06 19:54:29 +000042 }
43}
44
Rajeshwari Birjef0ce84f2013-12-26 09:44:23 +053045static void exynos5420_uart_config(int peripheral)
46{
Rajeshwari Birjef0ce84f2013-12-26 09:44:23 +053047 int i, start, count;
48
49 switch (peripheral) {
50 case PERIPH_ID_UART0:
Akshay Saraswat1376cdd2014-05-13 10:30:14 +053051 start = EXYNOS5420_GPIO_A00;
Rajeshwari Birjef0ce84f2013-12-26 09:44:23 +053052 count = 4;
53 break;
54 case PERIPH_ID_UART1:
Akshay Saraswat1376cdd2014-05-13 10:30:14 +053055 start = EXYNOS5420_GPIO_A04;
Rajeshwari Birjef0ce84f2013-12-26 09:44:23 +053056 count = 4;
57 break;
58 case PERIPH_ID_UART2:
Akshay Saraswat1376cdd2014-05-13 10:30:14 +053059 start = EXYNOS5420_GPIO_A10;
Rajeshwari Birjef0ce84f2013-12-26 09:44:23 +053060 count = 4;
61 break;
62 case PERIPH_ID_UART3:
Akshay Saraswat1376cdd2014-05-13 10:30:14 +053063 start = EXYNOS5420_GPIO_A14;
Rajeshwari Birjef0ce84f2013-12-26 09:44:23 +053064 count = 2;
65 break;
Marek Vasute382be92014-03-10 20:04:31 +010066 default:
67 debug("%s: invalid peripheral %d", __func__, peripheral);
68 return;
Rajeshwari Birjef0ce84f2013-12-26 09:44:23 +053069 }
70
71 for (i = start; i < start + count; i++) {
Akshay Saraswat1376cdd2014-05-13 10:30:14 +053072 gpio_set_pull(i, S5P_GPIO_PULL_NONE);
73 gpio_cfg_pin(i, S5P_GPIO_FUNC(0x2));
Rajeshwari Birjef0ce84f2013-12-26 09:44:23 +053074 }
75}
76
Rajeshwari Shinde57da3e32012-06-06 19:54:29 +000077static int exynos5_mmc_config(int peripheral, int flags)
78{
Akshay Saraswat1376cdd2014-05-13 10:30:14 +053079 int i, start, start_ext, gpio_func = 0;
Rajeshwari Shinde57da3e32012-06-06 19:54:29 +000080
81 switch (peripheral) {
82 case PERIPH_ID_SDMMC0:
Akshay Saraswat1376cdd2014-05-13 10:30:14 +053083 start = EXYNOS5_GPIO_C00;
84 start_ext = EXYNOS5_GPIO_C10;
85 gpio_func = S5P_GPIO_FUNC(0x2);
Rajeshwari Shinde57da3e32012-06-06 19:54:29 +000086 break;
87 case PERIPH_ID_SDMMC1:
Akshay Saraswat1376cdd2014-05-13 10:30:14 +053088 start = EXYNOS5_GPIO_C20;
89 start_ext = 0;
Rajeshwari Shinde57da3e32012-06-06 19:54:29 +000090 break;
91 case PERIPH_ID_SDMMC2:
Akshay Saraswat1376cdd2014-05-13 10:30:14 +053092 start = EXYNOS5_GPIO_C30;
93 start_ext = EXYNOS5_GPIO_C43;
94 gpio_func = S5P_GPIO_FUNC(0x3);
Rajeshwari Shinde57da3e32012-06-06 19:54:29 +000095 break;
96 case PERIPH_ID_SDMMC3:
Akshay Saraswat1376cdd2014-05-13 10:30:14 +053097 start = EXYNOS5_GPIO_C40;
98 start_ext = 0;
Rajeshwari Shinde57da3e32012-06-06 19:54:29 +000099 break;
Marek Vasute382be92014-03-10 20:04:31 +0100100 default:
101 debug("%s: invalid peripheral %d", __func__, peripheral);
102 return -1;
Rajeshwari Shinde57da3e32012-06-06 19:54:29 +0000103 }
Akshay Saraswat1376cdd2014-05-13 10:30:14 +0530104 if ((flags & PINMUX_FLAG_8BIT_MODE) && !start_ext) {
Rajeshwari Shinde57da3e32012-06-06 19:54:29 +0000105 debug("SDMMC device %d does not support 8bit mode",
106 peripheral);
107 return -1;
108 }
109 if (flags & PINMUX_FLAG_8BIT_MODE) {
Akshay Saraswat1376cdd2014-05-13 10:30:14 +0530110 for (i = start_ext; i <= (start_ext + 3); i++) {
111 gpio_cfg_pin(i, gpio_func);
112 gpio_set_pull(i, S5P_GPIO_PULL_UP);
113 gpio_set_drv(i, S5P_GPIO_DRV_4X);
Rajeshwari Shinde57da3e32012-06-06 19:54:29 +0000114 }
115 }
Akshay Saraswat1376cdd2014-05-13 10:30:14 +0530116 for (i = start; i < (start + 2); i++) {
117 gpio_cfg_pin(i, S5P_GPIO_FUNC(0x2));
118 gpio_set_pull(i, S5P_GPIO_PULL_NONE);
119 gpio_set_drv(i, S5P_GPIO_DRV_4X);
Rajeshwari Birjef0ce84f2013-12-26 09:44:23 +0530120 }
Akshay Saraswat1376cdd2014-05-13 10:30:14 +0530121 for (i = (start + 3); i <= (start + 6); i++) {
122 gpio_cfg_pin(i, S5P_GPIO_FUNC(0x2));
123 gpio_set_pull(i, S5P_GPIO_PULL_UP);
124 gpio_set_drv(i, S5P_GPIO_DRV_4X);
Rajeshwari Birjef0ce84f2013-12-26 09:44:23 +0530125 }
126
127 return 0;
128}
129
130static int exynos5420_mmc_config(int peripheral, int flags)
131{
Akshay Saraswat1376cdd2014-05-13 10:30:14 +0530132 int i, start = 0, start_ext = 0;
Rajeshwari Birjef0ce84f2013-12-26 09:44:23 +0530133
134 switch (peripheral) {
135 case PERIPH_ID_SDMMC0:
Akshay Saraswat1376cdd2014-05-13 10:30:14 +0530136 start = EXYNOS5420_GPIO_C00;
137 start_ext = EXYNOS5420_GPIO_C30;
Rajeshwari Birjef0ce84f2013-12-26 09:44:23 +0530138 break;
139 case PERIPH_ID_SDMMC1:
Akshay Saraswat1376cdd2014-05-13 10:30:14 +0530140 start = EXYNOS5420_GPIO_C10;
141 start_ext = EXYNOS5420_GPIO_D14;
Rajeshwari Birjef0ce84f2013-12-26 09:44:23 +0530142 break;
143 case PERIPH_ID_SDMMC2:
Akshay Saraswat1376cdd2014-05-13 10:30:14 +0530144 start = EXYNOS5420_GPIO_C20;
145 start_ext = 0;
Rajeshwari Birjef0ce84f2013-12-26 09:44:23 +0530146 break;
147 default:
148 start = 0;
149 debug("%s: invalid peripheral %d", __func__, peripheral);
150 return -1;
151 }
152
Akshay Saraswat1376cdd2014-05-13 10:30:14 +0530153 if ((flags & PINMUX_FLAG_8BIT_MODE) && !start_ext) {
Rajeshwari Birjef0ce84f2013-12-26 09:44:23 +0530154 debug("SDMMC device %d does not support 8bit mode",
155 peripheral);
156 return -1;
157 }
158
159 if (flags & PINMUX_FLAG_8BIT_MODE) {
Akshay Saraswat1376cdd2014-05-13 10:30:14 +0530160 for (i = start_ext; i <= (start_ext + 3); i++) {
161 gpio_cfg_pin(i, S5P_GPIO_FUNC(0x2));
162 gpio_set_pull(i, S5P_GPIO_PULL_UP);
163 gpio_set_drv(i, S5P_GPIO_DRV_4X);
Rajeshwari Birjef0ce84f2013-12-26 09:44:23 +0530164 }
165 }
166
Akshay Saraswat1376cdd2014-05-13 10:30:14 +0530167 for (i = start; i < (start + 3); i++) {
Rajeshwari Birjef0ce84f2013-12-26 09:44:23 +0530168 /*
169 * MMC0 is intended to be used for eMMC. The
170 * card detect pin is used as a VDDEN signal to
171 * power on the eMMC. The 5420 iROM makes
172 * this same assumption.
173 */
Akshay Saraswat1376cdd2014-05-13 10:30:14 +0530174 if ((peripheral == PERIPH_ID_SDMMC0) && (i == (start + 2))) {
Simon Glass4f83d3d2014-10-20 19:48:39 -0600175#ifndef CONFIG_SPL_BUILD
176 gpio_request(i, "sdmmc0_vdden");
177#endif
Akshay Saraswat1376cdd2014-05-13 10:30:14 +0530178 gpio_set_value(i, 1);
179 gpio_cfg_pin(i, S5P_GPIO_OUTPUT);
Rajeshwari Birjef0ce84f2013-12-26 09:44:23 +0530180 } else {
Akshay Saraswat1376cdd2014-05-13 10:30:14 +0530181 gpio_cfg_pin(i, S5P_GPIO_FUNC(0x2));
Rajeshwari Birjef0ce84f2013-12-26 09:44:23 +0530182 }
Akshay Saraswat1376cdd2014-05-13 10:30:14 +0530183 gpio_set_pull(i, S5P_GPIO_PULL_NONE);
184 gpio_set_drv(i, S5P_GPIO_DRV_4X);
Rajeshwari Shinde57da3e32012-06-06 19:54:29 +0000185 }
Rajeshwari Birjef0ce84f2013-12-26 09:44:23 +0530186
Akshay Saraswat1376cdd2014-05-13 10:30:14 +0530187 for (i = (start + 3); i <= (start + 6); i++) {
188 gpio_cfg_pin(i, S5P_GPIO_FUNC(0x2));
189 gpio_set_pull(i, S5P_GPIO_PULL_UP);
190 gpio_set_drv(i, S5P_GPIO_DRV_4X);
Rajeshwari Shinde57da3e32012-06-06 19:54:29 +0000191 }
Rajeshwari Shinde8d909f32012-10-28 19:32:54 +0000192
Rajeshwari Shinde57da3e32012-06-06 19:54:29 +0000193 return 0;
194}
195
196static void exynos5_sromc_config(int flags)
197{
Rajeshwari Shinde57da3e32012-06-06 19:54:29 +0000198 int i;
199
200 /*
201 * SROM:CS1 and EBI
202 *
203 * GPY0[0] SROM_CSn[0]
204 * GPY0[1] SROM_CSn[1](2)
205 * GPY0[2] SROM_CSn[2]
206 * GPY0[3] SROM_CSn[3]
207 * GPY0[4] EBI_OEn(2)
208 * GPY0[5] EBI_EEn(2)
209 *
210 * GPY1[0] EBI_BEn[0](2)
211 * GPY1[1] EBI_BEn[1](2)
212 * GPY1[2] SROM_WAIT(2)
213 * GPY1[3] EBI_DATA_RDn(2)
214 */
Akshay Saraswat1376cdd2014-05-13 10:30:14 +0530215 gpio_cfg_pin(EXYNOS5_GPIO_Y00 + (flags & PINMUX_FLAG_BANK),
216 S5P_GPIO_FUNC(2));
217 gpio_cfg_pin(EXYNOS5_GPIO_Y04, S5P_GPIO_FUNC(2));
218 gpio_cfg_pin(EXYNOS5_GPIO_Y05, S5P_GPIO_FUNC(2));
Rajeshwari Shinde57da3e32012-06-06 19:54:29 +0000219
220 for (i = 0; i < 4; i++)
Akshay Saraswat1376cdd2014-05-13 10:30:14 +0530221 gpio_cfg_pin(EXYNOS5_GPIO_Y10 + i, S5P_GPIO_FUNC(2));
Rajeshwari Shinde57da3e32012-06-06 19:54:29 +0000222
223 /*
224 * EBI: 8 Addrss Lines
225 *
226 * GPY3[0] EBI_ADDR[0](2)
227 * GPY3[1] EBI_ADDR[1](2)
228 * GPY3[2] EBI_ADDR[2](2)
229 * GPY3[3] EBI_ADDR[3](2)
230 * GPY3[4] EBI_ADDR[4](2)
231 * GPY3[5] EBI_ADDR[5](2)
232 * GPY3[6] EBI_ADDR[6](2)
233 * GPY3[7] EBI_ADDR[7](2)
234 *
235 * EBI: 16 Data Lines
236 *
237 * GPY5[0] EBI_DATA[0](2)
238 * GPY5[1] EBI_DATA[1](2)
239 * GPY5[2] EBI_DATA[2](2)
240 * GPY5[3] EBI_DATA[3](2)
241 * GPY5[4] EBI_DATA[4](2)
242 * GPY5[5] EBI_DATA[5](2)
243 * GPY5[6] EBI_DATA[6](2)
244 * GPY5[7] EBI_DATA[7](2)
245 *
246 * GPY6[0] EBI_DATA[8](2)
247 * GPY6[1] EBI_DATA[9](2)
248 * GPY6[2] EBI_DATA[10](2)
249 * GPY6[3] EBI_DATA[11](2)
250 * GPY6[4] EBI_DATA[12](2)
251 * GPY6[5] EBI_DATA[13](2)
252 * GPY6[6] EBI_DATA[14](2)
253 * GPY6[7] EBI_DATA[15](2)
254 */
255 for (i = 0; i < 8; i++) {
Akshay Saraswat1376cdd2014-05-13 10:30:14 +0530256 gpio_cfg_pin(EXYNOS5_GPIO_Y30 + i, S5P_GPIO_FUNC(2));
257 gpio_set_pull(EXYNOS5_GPIO_Y30 + i, S5P_GPIO_PULL_UP);
Rajeshwari Shinde57da3e32012-06-06 19:54:29 +0000258
Akshay Saraswat1376cdd2014-05-13 10:30:14 +0530259 gpio_cfg_pin(EXYNOS5_GPIO_Y50 + i, S5P_GPIO_FUNC(2));
260 gpio_set_pull(EXYNOS5_GPIO_Y50 + i, S5P_GPIO_PULL_UP);
Rajeshwari Shinde57da3e32012-06-06 19:54:29 +0000261
Akshay Saraswat1376cdd2014-05-13 10:30:14 +0530262 gpio_cfg_pin(EXYNOS5_GPIO_Y60 + i, S5P_GPIO_FUNC(2));
263 gpio_set_pull(EXYNOS5_GPIO_Y60 + i, S5P_GPIO_PULL_UP);
Rajeshwari Shinde57da3e32012-06-06 19:54:29 +0000264 }
265}
266
Rajeshwari Shinde6c313f92012-07-23 21:23:51 +0000267static void exynos5_i2c_config(int peripheral, int flags)
268{
Przemyslaw Marczak056d6552015-01-27 13:36:34 +0100269 int func01, func23;
270
271 /* High-Speed I2C */
272 if (flags & PINMUX_FLAG_HS_MODE) {
273 func01 = 4;
274 func23 = 4;
275 } else {
276 func01 = 2;
277 func23 = 3;
278 }
279
Rajeshwari Shinde6c313f92012-07-23 21:23:51 +0000280 switch (peripheral) {
281 case PERIPH_ID_I2C0:
Przemyslaw Marczak056d6552015-01-27 13:36:34 +0100282 gpio_cfg_pin(EXYNOS5_GPIO_B30, S5P_GPIO_FUNC(func01));
283 gpio_cfg_pin(EXYNOS5_GPIO_B31, S5P_GPIO_FUNC(func01));
Rajeshwari Shinde6c313f92012-07-23 21:23:51 +0000284 break;
285 case PERIPH_ID_I2C1:
Przemyslaw Marczak056d6552015-01-27 13:36:34 +0100286 gpio_cfg_pin(EXYNOS5_GPIO_B32, S5P_GPIO_FUNC(func01));
287 gpio_cfg_pin(EXYNOS5_GPIO_B33, S5P_GPIO_FUNC(func01));
Rajeshwari Shinde6c313f92012-07-23 21:23:51 +0000288 break;
289 case PERIPH_ID_I2C2:
Przemyslaw Marczak056d6552015-01-27 13:36:34 +0100290 gpio_cfg_pin(EXYNOS5_GPIO_A06, S5P_GPIO_FUNC(func23));
291 gpio_cfg_pin(EXYNOS5_GPIO_A07, S5P_GPIO_FUNC(func23));
Rajeshwari Shinde6c313f92012-07-23 21:23:51 +0000292 break;
293 case PERIPH_ID_I2C3:
Przemyslaw Marczak056d6552015-01-27 13:36:34 +0100294 gpio_cfg_pin(EXYNOS5_GPIO_A12, S5P_GPIO_FUNC(func23));
295 gpio_cfg_pin(EXYNOS5_GPIO_A13, S5P_GPIO_FUNC(func23));
Rajeshwari Shinde6c313f92012-07-23 21:23:51 +0000296 break;
297 case PERIPH_ID_I2C4:
Akshay Saraswat1376cdd2014-05-13 10:30:14 +0530298 gpio_cfg_pin(EXYNOS5_GPIO_A20, S5P_GPIO_FUNC(0x3));
299 gpio_cfg_pin(EXYNOS5_GPIO_A21, S5P_GPIO_FUNC(0x3));
Rajeshwari Shinde6c313f92012-07-23 21:23:51 +0000300 break;
301 case PERIPH_ID_I2C5:
Akshay Saraswat1376cdd2014-05-13 10:30:14 +0530302 gpio_cfg_pin(EXYNOS5_GPIO_A22, S5P_GPIO_FUNC(0x3));
303 gpio_cfg_pin(EXYNOS5_GPIO_A23, S5P_GPIO_FUNC(0x3));
Rajeshwari Shinde6c313f92012-07-23 21:23:51 +0000304 break;
305 case PERIPH_ID_I2C6:
Akshay Saraswat1376cdd2014-05-13 10:30:14 +0530306 gpio_cfg_pin(EXYNOS5_GPIO_B13, S5P_GPIO_FUNC(0x4));
307 gpio_cfg_pin(EXYNOS5_GPIO_B14, S5P_GPIO_FUNC(0x4));
Rajeshwari Shinde6c313f92012-07-23 21:23:51 +0000308 break;
309 case PERIPH_ID_I2C7:
Akshay Saraswat1376cdd2014-05-13 10:30:14 +0530310 gpio_cfg_pin(EXYNOS5_GPIO_B22, S5P_GPIO_FUNC(0x3));
311 gpio_cfg_pin(EXYNOS5_GPIO_B23, S5P_GPIO_FUNC(0x3));
Rajeshwari Shinde6c313f92012-07-23 21:23:51 +0000312 break;
313 }
314}
315
Rajeshwari Birjef0ce84f2013-12-26 09:44:23 +0530316static void exynos5420_i2c_config(int peripheral)
317{
Rajeshwari Birjef0ce84f2013-12-26 09:44:23 +0530318 switch (peripheral) {
319 case PERIPH_ID_I2C0:
Akshay Saraswat1376cdd2014-05-13 10:30:14 +0530320 gpio_cfg_pin(EXYNOS5420_GPIO_B30, S5P_GPIO_FUNC(0x2));
321 gpio_cfg_pin(EXYNOS5420_GPIO_B31, S5P_GPIO_FUNC(0x2));
Rajeshwari Birjef0ce84f2013-12-26 09:44:23 +0530322 break;
323 case PERIPH_ID_I2C1:
Akshay Saraswat1376cdd2014-05-13 10:30:14 +0530324 gpio_cfg_pin(EXYNOS5420_GPIO_B32, S5P_GPIO_FUNC(0x2));
325 gpio_cfg_pin(EXYNOS5420_GPIO_B33, S5P_GPIO_FUNC(0x2));
Rajeshwari Birjef0ce84f2013-12-26 09:44:23 +0530326 break;
327 case PERIPH_ID_I2C2:
Akshay Saraswat1376cdd2014-05-13 10:30:14 +0530328 gpio_cfg_pin(EXYNOS5420_GPIO_A06, S5P_GPIO_FUNC(0x3));
329 gpio_cfg_pin(EXYNOS5420_GPIO_A07, S5P_GPIO_FUNC(0x3));
Rajeshwari Birjef0ce84f2013-12-26 09:44:23 +0530330 break;
331 case PERIPH_ID_I2C3:
Akshay Saraswat1376cdd2014-05-13 10:30:14 +0530332 gpio_cfg_pin(EXYNOS5420_GPIO_A12, S5P_GPIO_FUNC(0x3));
333 gpio_cfg_pin(EXYNOS5420_GPIO_A13, S5P_GPIO_FUNC(0x3));
Rajeshwari Birjef0ce84f2013-12-26 09:44:23 +0530334 break;
335 case PERIPH_ID_I2C4:
Akshay Saraswat1376cdd2014-05-13 10:30:14 +0530336 gpio_cfg_pin(EXYNOS5420_GPIO_A20, S5P_GPIO_FUNC(0x3));
337 gpio_cfg_pin(EXYNOS5420_GPIO_A21, S5P_GPIO_FUNC(0x3));
Rajeshwari Birjef0ce84f2013-12-26 09:44:23 +0530338 break;
339 case PERIPH_ID_I2C5:
Akshay Saraswat1376cdd2014-05-13 10:30:14 +0530340 gpio_cfg_pin(EXYNOS5420_GPIO_A22, S5P_GPIO_FUNC(0x3));
341 gpio_cfg_pin(EXYNOS5420_GPIO_A23, S5P_GPIO_FUNC(0x3));
Rajeshwari Birjef0ce84f2013-12-26 09:44:23 +0530342 break;
343 case PERIPH_ID_I2C6:
Akshay Saraswat1376cdd2014-05-13 10:30:14 +0530344 gpio_cfg_pin(EXYNOS5420_GPIO_B13, S5P_GPIO_FUNC(0x4));
345 gpio_cfg_pin(EXYNOS5420_GPIO_B14, S5P_GPIO_FUNC(0x4));
Rajeshwari Birjef0ce84f2013-12-26 09:44:23 +0530346 break;
347 case PERIPH_ID_I2C7:
Akshay Saraswat1376cdd2014-05-13 10:30:14 +0530348 gpio_cfg_pin(EXYNOS5420_GPIO_B22, S5P_GPIO_FUNC(0x3));
349 gpio_cfg_pin(EXYNOS5420_GPIO_B23, S5P_GPIO_FUNC(0x3));
Rajeshwari Birjef0ce84f2013-12-26 09:44:23 +0530350 break;
351 case PERIPH_ID_I2C8:
Akshay Saraswat1376cdd2014-05-13 10:30:14 +0530352 gpio_cfg_pin(EXYNOS5420_GPIO_B34, S5P_GPIO_FUNC(0x2));
353 gpio_cfg_pin(EXYNOS5420_GPIO_B35, S5P_GPIO_FUNC(0x2));
Rajeshwari Birjef0ce84f2013-12-26 09:44:23 +0530354 break;
355 case PERIPH_ID_I2C9:
Akshay Saraswat1376cdd2014-05-13 10:30:14 +0530356 gpio_cfg_pin(EXYNOS5420_GPIO_B36, S5P_GPIO_FUNC(0x2));
357 gpio_cfg_pin(EXYNOS5420_GPIO_B37, S5P_GPIO_FUNC(0x2));
Rajeshwari Birjef0ce84f2013-12-26 09:44:23 +0530358 break;
359 case PERIPH_ID_I2C10:
Akshay Saraswat1376cdd2014-05-13 10:30:14 +0530360 gpio_cfg_pin(EXYNOS5420_GPIO_B40, S5P_GPIO_FUNC(0x2));
361 gpio_cfg_pin(EXYNOS5420_GPIO_B41, S5P_GPIO_FUNC(0x2));
Rajeshwari Birjef0ce84f2013-12-26 09:44:23 +0530362 break;
363 }
364}
365
Rajeshwari Shinde7cf89a22012-10-25 19:49:27 +0000366static void exynos5_i2s_config(int peripheral)
367{
368 int i;
Rajeshwari Shinde7cf89a22012-10-25 19:49:27 +0000369
Dani Krishna Mohan65c7ee62013-09-11 16:38:48 +0530370 switch (peripheral) {
371 case PERIPH_ID_I2S0:
372 for (i = 0; i < 5; i++)
Akshay Saraswat1376cdd2014-05-13 10:30:14 +0530373 gpio_cfg_pin(EXYNOS5_GPIO_Z0 + i, S5P_GPIO_FUNC(0x02));
Dani Krishna Mohan65c7ee62013-09-11 16:38:48 +0530374 break;
375 case PERIPH_ID_I2S1:
376 for (i = 0; i < 5; i++)
Akshay Saraswat1376cdd2014-05-13 10:30:14 +0530377 gpio_cfg_pin(EXYNOS5_GPIO_B00 + i, S5P_GPIO_FUNC(0x02));
Dani Krishna Mohan65c7ee62013-09-11 16:38:48 +0530378 break;
379 }
Rajeshwari Shinde7cf89a22012-10-25 19:49:27 +0000380}
381
Rajeshwari Shinde8d909f32012-10-28 19:32:54 +0000382void exynos5_spi_config(int peripheral)
383{
384 int cfg = 0, pin = 0, i;
Rajeshwari Shinde8d909f32012-10-28 19:32:54 +0000385
386 switch (peripheral) {
387 case PERIPH_ID_SPI0:
Akshay Saraswat1376cdd2014-05-13 10:30:14 +0530388 cfg = S5P_GPIO_FUNC(0x2);
389 pin = EXYNOS5_GPIO_A20;
Rajeshwari Shinde8d909f32012-10-28 19:32:54 +0000390 break;
391 case PERIPH_ID_SPI1:
Akshay Saraswat1376cdd2014-05-13 10:30:14 +0530392 cfg = S5P_GPIO_FUNC(0x2);
393 pin = EXYNOS5_GPIO_A24;
Rajeshwari Shinde8d909f32012-10-28 19:32:54 +0000394 break;
395 case PERIPH_ID_SPI2:
Akshay Saraswat1376cdd2014-05-13 10:30:14 +0530396 cfg = S5P_GPIO_FUNC(0x5);
397 pin = EXYNOS5_GPIO_B11;
Rajeshwari Shinde8d909f32012-10-28 19:32:54 +0000398 break;
399 case PERIPH_ID_SPI3:
Akshay Saraswat1376cdd2014-05-13 10:30:14 +0530400 cfg = S5P_GPIO_FUNC(0x2);
401 pin = EXYNOS5_GPIO_F10;
Rajeshwari Shinde8d909f32012-10-28 19:32:54 +0000402 break;
403 case PERIPH_ID_SPI4:
404 for (i = 0; i < 2; i++) {
Akshay Saraswat1376cdd2014-05-13 10:30:14 +0530405 gpio_cfg_pin(EXYNOS5_GPIO_F02 + i, S5P_GPIO_FUNC(0x4));
406 gpio_cfg_pin(EXYNOS5_GPIO_E04 + i, S5P_GPIO_FUNC(0x4));
Rajeshwari Shinde8d909f32012-10-28 19:32:54 +0000407 }
408 break;
409 }
410 if (peripheral != PERIPH_ID_SPI4) {
411 for (i = pin; i < pin + 4; i++)
Akshay Saraswat1376cdd2014-05-13 10:30:14 +0530412 gpio_cfg_pin(i, cfg);
Rajeshwari Shinde8d909f32012-10-28 19:32:54 +0000413 }
414}
415
Rajeshwari Birjef0ce84f2013-12-26 09:44:23 +0530416void exynos5420_spi_config(int peripheral)
417{
418 int cfg, pin, i;
Rajeshwari Birjef0ce84f2013-12-26 09:44:23 +0530419
420 switch (peripheral) {
421 case PERIPH_ID_SPI0:
Akshay Saraswat1376cdd2014-05-13 10:30:14 +0530422 pin = EXYNOS5420_GPIO_A20;
423 cfg = S5P_GPIO_FUNC(0x2);
Rajeshwari Birjef0ce84f2013-12-26 09:44:23 +0530424 break;
425 case PERIPH_ID_SPI1:
Akshay Saraswat1376cdd2014-05-13 10:30:14 +0530426 pin = EXYNOS5420_GPIO_A24;
427 cfg = S5P_GPIO_FUNC(0x2);
Rajeshwari Birjef0ce84f2013-12-26 09:44:23 +0530428 break;
429 case PERIPH_ID_SPI2:
Akshay Saraswat1376cdd2014-05-13 10:30:14 +0530430 pin = EXYNOS5420_GPIO_B11;
431 cfg = S5P_GPIO_FUNC(0x5);
Rajeshwari Birjef0ce84f2013-12-26 09:44:23 +0530432 break;
433 case PERIPH_ID_SPI3:
Akshay Saraswat1376cdd2014-05-13 10:30:14 +0530434 pin = EXYNOS5420_GPIO_F10;
435 cfg = S5P_GPIO_FUNC(0x2);
Rajeshwari Birjef0ce84f2013-12-26 09:44:23 +0530436 break;
437 case PERIPH_ID_SPI4:
438 cfg = 0;
439 pin = 0;
440 break;
441 default:
442 cfg = 0;
443 pin = 0;
444 debug("%s: invalid peripheral %d", __func__, peripheral);
445 return;
446 }
447
448 if (peripheral != PERIPH_ID_SPI4) {
449 for (i = pin; i < pin + 4; i++)
Akshay Saraswat1376cdd2014-05-13 10:30:14 +0530450 gpio_cfg_pin(i, cfg);
Rajeshwari Birjef0ce84f2013-12-26 09:44:23 +0530451 } else {
452 for (i = 0; i < 2; i++) {
Akshay Saraswat1376cdd2014-05-13 10:30:14 +0530453 gpio_cfg_pin(EXYNOS5420_GPIO_F02 + i,
454 S5P_GPIO_FUNC(0x4));
455 gpio_cfg_pin(EXYNOS5420_GPIO_E04 + i,
456 S5P_GPIO_FUNC(0x4));
Rajeshwari Birjef0ce84f2013-12-26 09:44:23 +0530457 }
458 }
459}
460
Rajeshwari Shinde57da3e32012-06-06 19:54:29 +0000461static int exynos5_pinmux_config(int peripheral, int flags)
462{
463 switch (peripheral) {
464 case PERIPH_ID_UART0:
465 case PERIPH_ID_UART1:
466 case PERIPH_ID_UART2:
467 case PERIPH_ID_UART3:
468 exynos5_uart_config(peripheral);
469 break;
470 case PERIPH_ID_SDMMC0:
471 case PERIPH_ID_SDMMC1:
472 case PERIPH_ID_SDMMC2:
473 case PERIPH_ID_SDMMC3:
474 return exynos5_mmc_config(peripheral, flags);
475 case PERIPH_ID_SROMC:
476 exynos5_sromc_config(flags);
477 break;
Rajeshwari Shinde6c313f92012-07-23 21:23:51 +0000478 case PERIPH_ID_I2C0:
479 case PERIPH_ID_I2C1:
480 case PERIPH_ID_I2C2:
481 case PERIPH_ID_I2C3:
482 case PERIPH_ID_I2C4:
483 case PERIPH_ID_I2C5:
484 case PERIPH_ID_I2C6:
485 case PERIPH_ID_I2C7:
486 exynos5_i2c_config(peripheral, flags);
487 break;
Dani Krishna Mohan65c7ee62013-09-11 16:38:48 +0530488 case PERIPH_ID_I2S0:
Rajeshwari Shinde7cf89a22012-10-25 19:49:27 +0000489 case PERIPH_ID_I2S1:
490 exynos5_i2s_config(peripheral);
491 break;
Rajeshwari Shinde8d909f32012-10-28 19:32:54 +0000492 case PERIPH_ID_SPI0:
493 case PERIPH_ID_SPI1:
494 case PERIPH_ID_SPI2:
495 case PERIPH_ID_SPI3:
496 case PERIPH_ID_SPI4:
497 exynos5_spi_config(peripheral);
498 break;
Rajeshwari Shinde57da3e32012-06-06 19:54:29 +0000499 default:
500 debug("%s: invalid peripheral %d", __func__, peripheral);
501 return -1;
502 }
503
504 return 0;
505}
506
Rajeshwari Birjef0ce84f2013-12-26 09:44:23 +0530507static int exynos5420_pinmux_config(int peripheral, int flags)
508{
509 switch (peripheral) {
510 case PERIPH_ID_UART0:
511 case PERIPH_ID_UART1:
512 case PERIPH_ID_UART2:
513 case PERIPH_ID_UART3:
514 exynos5420_uart_config(peripheral);
515 break;
516 case PERIPH_ID_SDMMC0:
517 case PERIPH_ID_SDMMC1:
518 case PERIPH_ID_SDMMC2:
519 case PERIPH_ID_SDMMC3:
520 return exynos5420_mmc_config(peripheral, flags);
521 case PERIPH_ID_SPI0:
522 case PERIPH_ID_SPI1:
523 case PERIPH_ID_SPI2:
524 case PERIPH_ID_SPI3:
525 case PERIPH_ID_SPI4:
526 exynos5420_spi_config(peripheral);
527 break;
528 case PERIPH_ID_I2C0:
529 case PERIPH_ID_I2C1:
530 case PERIPH_ID_I2C2:
531 case PERIPH_ID_I2C3:
532 case PERIPH_ID_I2C4:
533 case PERIPH_ID_I2C5:
534 case PERIPH_ID_I2C6:
535 case PERIPH_ID_I2C7:
536 case PERIPH_ID_I2C8:
537 case PERIPH_ID_I2C9:
538 case PERIPH_ID_I2C10:
539 exynos5420_i2c_config(peripheral);
540 break;
541 default:
542 debug("%s: invalid peripheral %d", __func__, peripheral);
543 return -1;
544 }
545
546 return 0;
547}
548
Piotr Wilczekedad2172012-11-20 02:19:04 +0000549static void exynos4_i2c_config(int peripheral, int flags)
Piotr Wilczek7318b292012-09-20 00:19:57 +0000550{
Piotr Wilczek7318b292012-09-20 00:19:57 +0000551 switch (peripheral) {
Piotr Wilczekedad2172012-11-20 02:19:04 +0000552 case PERIPH_ID_I2C0:
Akshay Saraswat1376cdd2014-05-13 10:30:14 +0530553 gpio_cfg_pin(EXYNOS4_GPIO_D10, S5P_GPIO_FUNC(0x2));
554 gpio_cfg_pin(EXYNOS4_GPIO_D11, S5P_GPIO_FUNC(0x2));
Piotr Wilczek7318b292012-09-20 00:19:57 +0000555 break;
Piotr Wilczekedad2172012-11-20 02:19:04 +0000556 case PERIPH_ID_I2C1:
Akshay Saraswat1376cdd2014-05-13 10:30:14 +0530557 gpio_cfg_pin(EXYNOS4_GPIO_D12, S5P_GPIO_FUNC(0x2));
558 gpio_cfg_pin(EXYNOS4_GPIO_D13, S5P_GPIO_FUNC(0x2));
Piotr Wilczek7318b292012-09-20 00:19:57 +0000559 break;
Piotr Wilczekedad2172012-11-20 02:19:04 +0000560 case PERIPH_ID_I2C2:
Akshay Saraswat1376cdd2014-05-13 10:30:14 +0530561 gpio_cfg_pin(EXYNOS4_GPIO_A06, S5P_GPIO_FUNC(0x3));
562 gpio_cfg_pin(EXYNOS4_GPIO_A07, S5P_GPIO_FUNC(0x3));
Piotr Wilczekedad2172012-11-20 02:19:04 +0000563 break;
564 case PERIPH_ID_I2C3:
Akshay Saraswat1376cdd2014-05-13 10:30:14 +0530565 gpio_cfg_pin(EXYNOS4_GPIO_A12, S5P_GPIO_FUNC(0x3));
566 gpio_cfg_pin(EXYNOS4_GPIO_A13, S5P_GPIO_FUNC(0x3));
Piotr Wilczekedad2172012-11-20 02:19:04 +0000567 break;
568 case PERIPH_ID_I2C4:
Akshay Saraswat1376cdd2014-05-13 10:30:14 +0530569 gpio_cfg_pin(EXYNOS4_GPIO_B2, S5P_GPIO_FUNC(0x3));
570 gpio_cfg_pin(EXYNOS4_GPIO_B3, S5P_GPIO_FUNC(0x3));
Piotr Wilczekedad2172012-11-20 02:19:04 +0000571 break;
572 case PERIPH_ID_I2C5:
Akshay Saraswat1376cdd2014-05-13 10:30:14 +0530573 gpio_cfg_pin(EXYNOS4_GPIO_B6, S5P_GPIO_FUNC(0x3));
574 gpio_cfg_pin(EXYNOS4_GPIO_B7, S5P_GPIO_FUNC(0x3));
Piotr Wilczekedad2172012-11-20 02:19:04 +0000575 break;
576 case PERIPH_ID_I2C6:
Akshay Saraswat1376cdd2014-05-13 10:30:14 +0530577 gpio_cfg_pin(EXYNOS4_GPIO_C13, S5P_GPIO_FUNC(0x4));
578 gpio_cfg_pin(EXYNOS4_GPIO_C14, S5P_GPIO_FUNC(0x4));
Piotr Wilczekedad2172012-11-20 02:19:04 +0000579 break;
580 case PERIPH_ID_I2C7:
Akshay Saraswat1376cdd2014-05-13 10:30:14 +0530581 gpio_cfg_pin(EXYNOS4_GPIO_D02, S5P_GPIO_FUNC(0x3));
582 gpio_cfg_pin(EXYNOS4_GPIO_D03, S5P_GPIO_FUNC(0x3));
Piotr Wilczekedad2172012-11-20 02:19:04 +0000583 break;
Piotr Wilczek7318b292012-09-20 00:19:57 +0000584 }
Piotr Wilczek7318b292012-09-20 00:19:57 +0000585}
586
Piotr Wilczeka90efe92013-01-02 21:31:00 +0000587static int exynos4_mmc_config(int peripheral, int flags)
588{
Akshay Saraswat1376cdd2014-05-13 10:30:14 +0530589 int i, start = 0, start_ext = 0;
Beomho Seo06d1b162014-05-16 13:59:46 +0900590 unsigned int func, ext_func;
Piotr Wilczeka90efe92013-01-02 21:31:00 +0000591
592 switch (peripheral) {
593 case PERIPH_ID_SDMMC0:
Akshay Saraswat1376cdd2014-05-13 10:30:14 +0530594 start = EXYNOS4_GPIO_K00;
595 start_ext = EXYNOS4_GPIO_K13;
Beomho Seo06d1b162014-05-16 13:59:46 +0900596 func = S5P_GPIO_FUNC(0x2);
597 ext_func = S5P_GPIO_FUNC(0x3);
Piotr Wilczeka90efe92013-01-02 21:31:00 +0000598 break;
599 case PERIPH_ID_SDMMC2:
Akshay Saraswat1376cdd2014-05-13 10:30:14 +0530600 start = EXYNOS4_GPIO_K20;
601 start_ext = EXYNOS4_GPIO_K33;
Beomho Seo06d1b162014-05-16 13:59:46 +0900602 func = S5P_GPIO_FUNC(0x2);
603 ext_func = S5P_GPIO_FUNC(0x3);
604 break;
605 case PERIPH_ID_SDMMC4:
606 start = EXYNOS4_GPIO_K00;
607 start_ext = EXYNOS4_GPIO_K13;
608 func = S5P_GPIO_FUNC(0x3);
609 ext_func = S5P_GPIO_FUNC(0x4);
Piotr Wilczeka90efe92013-01-02 21:31:00 +0000610 break;
611 default:
612 return -1;
613 }
Akshay Saraswat1376cdd2014-05-13 10:30:14 +0530614 for (i = start; i < (start + 7); i++) {
615 if (i == (start + 2))
Piotr Wilczeka90efe92013-01-02 21:31:00 +0000616 continue;
Beomho Seo06d1b162014-05-16 13:59:46 +0900617 gpio_cfg_pin(i, func);
Akshay Saraswat1376cdd2014-05-13 10:30:14 +0530618 gpio_set_pull(i, S5P_GPIO_PULL_NONE);
619 gpio_set_drv(i, S5P_GPIO_DRV_4X);
Piotr Wilczeka90efe92013-01-02 21:31:00 +0000620 }
Beomho Seo06d1b162014-05-16 13:59:46 +0900621 /* SDMMC2 do not use 8bit mode at exynos4 */
Piotr Wilczeka90efe92013-01-02 21:31:00 +0000622 if (flags & PINMUX_FLAG_8BIT_MODE) {
Akshay Saraswat1376cdd2014-05-13 10:30:14 +0530623 for (i = start_ext; i < (start_ext + 4); i++) {
Beomho Seo06d1b162014-05-16 13:59:46 +0900624 gpio_cfg_pin(i, ext_func);
Akshay Saraswat1376cdd2014-05-13 10:30:14 +0530625 gpio_set_pull(i, S5P_GPIO_PULL_NONE);
626 gpio_set_drv(i, S5P_GPIO_DRV_4X);
Piotr Wilczeka90efe92013-01-02 21:31:00 +0000627 }
628 }
629
630 return 0;
631}
632
Rajeshwari Shinde99ae9b82013-07-04 12:29:16 +0530633static void exynos4_uart_config(int peripheral)
634{
Rajeshwari Shinde99ae9b82013-07-04 12:29:16 +0530635 int i, start, count;
636
637 switch (peripheral) {
638 case PERIPH_ID_UART0:
Akshay Saraswat1376cdd2014-05-13 10:30:14 +0530639 start = EXYNOS4_GPIO_A00;
Rajeshwari Shinde99ae9b82013-07-04 12:29:16 +0530640 count = 4;
641 break;
642 case PERIPH_ID_UART1:
Akshay Saraswat1376cdd2014-05-13 10:30:14 +0530643 start = EXYNOS4_GPIO_A04;
Rajeshwari Shinde99ae9b82013-07-04 12:29:16 +0530644 count = 4;
645 break;
646 case PERIPH_ID_UART2:
Akshay Saraswat1376cdd2014-05-13 10:30:14 +0530647 start = EXYNOS4_GPIO_A10;
Rajeshwari Shinde99ae9b82013-07-04 12:29:16 +0530648 count = 4;
649 break;
650 case PERIPH_ID_UART3:
Akshay Saraswat1376cdd2014-05-13 10:30:14 +0530651 start = EXYNOS4_GPIO_A14;
Rajeshwari Shinde99ae9b82013-07-04 12:29:16 +0530652 count = 2;
653 break;
Marek Vasute382be92014-03-10 20:04:31 +0100654 default:
655 debug("%s: invalid peripheral %d", __func__, peripheral);
656 return;
Rajeshwari Shinde99ae9b82013-07-04 12:29:16 +0530657 }
Akshay Saraswat1376cdd2014-05-13 10:30:14 +0530658 for (i = start; i < (start + count); i++) {
659 gpio_set_pull(i, S5P_GPIO_PULL_NONE);
660 gpio_cfg_pin(i, S5P_GPIO_FUNC(0x2));
661 }
662}
663
664static void exynos4x12_i2c_config(int peripheral, int flags)
665{
666 switch (peripheral) {
667 case PERIPH_ID_I2C0:
668 gpio_cfg_pin(EXYNOS4X12_GPIO_D10, S5P_GPIO_FUNC(0x2));
669 gpio_cfg_pin(EXYNOS4X12_GPIO_D11, S5P_GPIO_FUNC(0x2));
670 break;
671 case PERIPH_ID_I2C1:
672 gpio_cfg_pin(EXYNOS4X12_GPIO_D12, S5P_GPIO_FUNC(0x2));
673 gpio_cfg_pin(EXYNOS4X12_GPIO_D13, S5P_GPIO_FUNC(0x2));
674 break;
675 case PERIPH_ID_I2C2:
676 gpio_cfg_pin(EXYNOS4X12_GPIO_A06, S5P_GPIO_FUNC(0x3));
677 gpio_cfg_pin(EXYNOS4X12_GPIO_A07, S5P_GPIO_FUNC(0x3));
678 break;
679 case PERIPH_ID_I2C3:
680 gpio_cfg_pin(EXYNOS4X12_GPIO_A12, S5P_GPIO_FUNC(0x3));
681 gpio_cfg_pin(EXYNOS4X12_GPIO_A13, S5P_GPIO_FUNC(0x3));
682 break;
683 case PERIPH_ID_I2C4:
684 gpio_cfg_pin(EXYNOS4X12_GPIO_B2, S5P_GPIO_FUNC(0x3));
685 gpio_cfg_pin(EXYNOS4X12_GPIO_B3, S5P_GPIO_FUNC(0x3));
686 break;
687 case PERIPH_ID_I2C5:
688 gpio_cfg_pin(EXYNOS4X12_GPIO_B6, S5P_GPIO_FUNC(0x3));
689 gpio_cfg_pin(EXYNOS4X12_GPIO_B7, S5P_GPIO_FUNC(0x3));
690 break;
691 case PERIPH_ID_I2C6:
692 gpio_cfg_pin(EXYNOS4X12_GPIO_C13, S5P_GPIO_FUNC(0x4));
693 gpio_cfg_pin(EXYNOS4X12_GPIO_C14, S5P_GPIO_FUNC(0x4));
694 break;
695 case PERIPH_ID_I2C7:
696 gpio_cfg_pin(EXYNOS4X12_GPIO_D02, S5P_GPIO_FUNC(0x3));
697 gpio_cfg_pin(EXYNOS4X12_GPIO_D03, S5P_GPIO_FUNC(0x3));
698 break;
699 }
700}
701
702static int exynos4x12_mmc_config(int peripheral, int flags)
703{
704 int i, start = 0, start_ext = 0;
Beomho Seo06d1b162014-05-16 13:59:46 +0900705 unsigned int func, ext_func;
Akshay Saraswat1376cdd2014-05-13 10:30:14 +0530706
707 switch (peripheral) {
708 case PERIPH_ID_SDMMC0:
709 start = EXYNOS4X12_GPIO_K00;
710 start_ext = EXYNOS4X12_GPIO_K13;
Beomho Seo06d1b162014-05-16 13:59:46 +0900711 func = S5P_GPIO_FUNC(0x2);
712 ext_func = S5P_GPIO_FUNC(0x3);
Akshay Saraswat1376cdd2014-05-13 10:30:14 +0530713 break;
714 case PERIPH_ID_SDMMC2:
715 start = EXYNOS4X12_GPIO_K20;
716 start_ext = EXYNOS4X12_GPIO_K33;
Beomho Seo06d1b162014-05-16 13:59:46 +0900717 func = S5P_GPIO_FUNC(0x2);
718 ext_func = S5P_GPIO_FUNC(0x3);
719 break;
720 case PERIPH_ID_SDMMC4:
Przemyslaw Marczak64c7da52014-09-01 13:50:43 +0200721 start = EXYNOS4X12_GPIO_K00;
722 start_ext = EXYNOS4X12_GPIO_K13;
Beomho Seo06d1b162014-05-16 13:59:46 +0900723 func = S5P_GPIO_FUNC(0x3);
724 ext_func = S5P_GPIO_FUNC(0x4);
Akshay Saraswat1376cdd2014-05-13 10:30:14 +0530725 break;
726 default:
727 return -1;
Rajeshwari Shinde99ae9b82013-07-04 12:29:16 +0530728 }
Akshay Saraswat1376cdd2014-05-13 10:30:14 +0530729 for (i = start; i < (start + 7); i++) {
730 if (i == (start + 2))
731 continue;
Beomho Seo06d1b162014-05-16 13:59:46 +0900732 gpio_cfg_pin(i, func);
Akshay Saraswat1376cdd2014-05-13 10:30:14 +0530733 gpio_set_pull(i, S5P_GPIO_PULL_NONE);
734 gpio_set_drv(i, S5P_GPIO_DRV_4X);
735 }
736 if (flags & PINMUX_FLAG_8BIT_MODE) {
737 for (i = start_ext; i < (start_ext + 4); i++) {
Beomho Seo06d1b162014-05-16 13:59:46 +0900738 gpio_cfg_pin(i, ext_func);
Akshay Saraswat1376cdd2014-05-13 10:30:14 +0530739 gpio_set_pull(i, S5P_GPIO_PULL_NONE);
740 gpio_set_drv(i, S5P_GPIO_DRV_4X);
741 }
742 }
743
744 return 0;
Rajeshwari Shinde99ae9b82013-07-04 12:29:16 +0530745}
Akshay Saraswat1376cdd2014-05-13 10:30:14 +0530746
747static void exynos4x12_uart_config(int peripheral)
748{
749 int i, start, count;
750
751 switch (peripheral) {
752 case PERIPH_ID_UART0:
753 start = EXYNOS4X12_GPIO_A00;
754 count = 4;
755 break;
756 case PERIPH_ID_UART1:
757 start = EXYNOS4X12_GPIO_A04;
758 count = 4;
759 break;
760 case PERIPH_ID_UART2:
761 start = EXYNOS4X12_GPIO_A10;
762 count = 4;
763 break;
764 case PERIPH_ID_UART3:
765 start = EXYNOS4X12_GPIO_A14;
766 count = 2;
767 break;
768 default:
769 debug("%s: invalid peripheral %d", __func__, peripheral);
770 return;
771 }
772 for (i = start; i < (start + count); i++) {
773 gpio_set_pull(i, S5P_GPIO_PULL_NONE);
774 gpio_cfg_pin(i, S5P_GPIO_FUNC(0x2));
775 }
776}
777
Piotr Wilczek7318b292012-09-20 00:19:57 +0000778static int exynos4_pinmux_config(int peripheral, int flags)
779{
780 switch (peripheral) {
Rajeshwari Shinde99ae9b82013-07-04 12:29:16 +0530781 case PERIPH_ID_UART0:
782 case PERIPH_ID_UART1:
783 case PERIPH_ID_UART2:
784 case PERIPH_ID_UART3:
785 exynos4_uart_config(peripheral);
786 break;
Piotr Wilczekedad2172012-11-20 02:19:04 +0000787 case PERIPH_ID_I2C0:
788 case PERIPH_ID_I2C1:
789 case PERIPH_ID_I2C2:
790 case PERIPH_ID_I2C3:
791 case PERIPH_ID_I2C4:
792 case PERIPH_ID_I2C5:
793 case PERIPH_ID_I2C6:
794 case PERIPH_ID_I2C7:
795 exynos4_i2c_config(peripheral, flags);
796 break;
Piotr Wilczeka90efe92013-01-02 21:31:00 +0000797 case PERIPH_ID_SDMMC0:
798 case PERIPH_ID_SDMMC2:
Beomho Seo06d1b162014-05-16 13:59:46 +0900799 case PERIPH_ID_SDMMC4:
Piotr Wilczeka90efe92013-01-02 21:31:00 +0000800 return exynos4_mmc_config(peripheral, flags);
801 case PERIPH_ID_SDMMC1:
802 case PERIPH_ID_SDMMC3:
Rajeshwari Shinde507f8922013-10-08 18:42:22 +0530803 debug("SDMMC device %d not implemented\n", peripheral);
Piotr Wilczeka90efe92013-01-02 21:31:00 +0000804 return -1;
Piotr Wilczek7318b292012-09-20 00:19:57 +0000805 default:
806 debug("%s: invalid peripheral %d", __func__, peripheral);
807 return -1;
808 }
809
810 return 0;
811}
812
Akshay Saraswat1376cdd2014-05-13 10:30:14 +0530813static int exynos4x12_pinmux_config(int peripheral, int flags)
814{
815 switch (peripheral) {
816 case PERIPH_ID_UART0:
817 case PERIPH_ID_UART1:
818 case PERIPH_ID_UART2:
819 case PERIPH_ID_UART3:
820 exynos4x12_uart_config(peripheral);
821 break;
822 case PERIPH_ID_I2C0:
823 case PERIPH_ID_I2C1:
824 case PERIPH_ID_I2C2:
825 case PERIPH_ID_I2C3:
826 case PERIPH_ID_I2C4:
827 case PERIPH_ID_I2C5:
828 case PERIPH_ID_I2C6:
829 case PERIPH_ID_I2C7:
830 exynos4x12_i2c_config(peripheral, flags);
831 break;
832 case PERIPH_ID_SDMMC0:
833 case PERIPH_ID_SDMMC2:
Beomho Seo06d1b162014-05-16 13:59:46 +0900834 case PERIPH_ID_SDMMC4:
Akshay Saraswat1376cdd2014-05-13 10:30:14 +0530835 return exynos4x12_mmc_config(peripheral, flags);
836 case PERIPH_ID_SDMMC1:
837 case PERIPH_ID_SDMMC3:
Akshay Saraswat1376cdd2014-05-13 10:30:14 +0530838 debug("SDMMC device %d not implemented\n", peripheral);
839 return -1;
840 default:
841 debug("%s: invalid peripheral %d", __func__, peripheral);
842 return -1;
843 }
844
845 return 0;
846}
847
Rajeshwari Shinde57da3e32012-06-06 19:54:29 +0000848int exynos_pinmux_config(int peripheral, int flags)
849{
Dani Krishna Mohan65c7ee62013-09-11 16:38:48 +0530850 if (cpu_is_exynos5()) {
Akshay Saraswat9fba7b42014-11-13 22:38:15 +0530851 if (proid_is_exynos5420() || proid_is_exynos5800())
Rajeshwari Birjef0ce84f2013-12-26 09:44:23 +0530852 return exynos5420_pinmux_config(peripheral, flags);
853 else if (proid_is_exynos5250())
854 return exynos5_pinmux_config(peripheral, flags);
Dani Krishna Mohan65c7ee62013-09-11 16:38:48 +0530855 } else if (cpu_is_exynos4()) {
Akshay Saraswat1376cdd2014-05-13 10:30:14 +0530856 if (proid_is_exynos4412())
857 return exynos4x12_pinmux_config(peripheral, flags);
858 else
859 return exynos4_pinmux_config(peripheral, flags);
Rajeshwari Shinde57da3e32012-06-06 19:54:29 +0000860 }
Rajeshwari Birjef0ce84f2013-12-26 09:44:23 +0530861
Akshay Saraswat1376cdd2014-05-13 10:30:14 +0530862 debug("pinmux functionality not supported\n");
863
Rajeshwari Birjef0ce84f2013-12-26 09:44:23 +0530864 return -1;
Rajeshwari Shinde57da3e32012-06-06 19:54:29 +0000865}
Rajeshwari Shinde28bae822012-12-26 20:03:11 +0000866
867#ifdef CONFIG_OF_CONTROL
Piotr Wilczek246ec3a2014-03-07 14:59:38 +0100868static int exynos4_pinmux_decode_periph_id(const void *blob, int node)
869{
870 int err;
871 u32 cell[3];
872
873 err = fdtdec_get_int_array(blob, node, "interrupts", cell,
874 ARRAY_SIZE(cell));
875 if (err) {
876 debug(" invalid peripheral id\n");
877 return PERIPH_ID_NONE;
878 }
879
880 return cell[1];
881}
882
Rajeshwari Shinde28bae822012-12-26 20:03:11 +0000883static int exynos5_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 return PERIPH_ID_NONE;
892
Minkyu Kangdcc99172014-01-29 17:04:17 +0900893 return cell[1];
Rajeshwari Shinde28bae822012-12-26 20:03:11 +0000894}
895
896int pinmux_decode_periph_id(const void *blob, int node)
897{
898 if (cpu_is_exynos5())
899 return exynos5_pinmux_decode_periph_id(blob, node);
Piotr Wilczek246ec3a2014-03-07 14:59:38 +0100900 else if (cpu_is_exynos4())
901 return exynos4_pinmux_decode_periph_id(blob, node);
Akshay Saraswat1376cdd2014-05-13 10:30:14 +0530902
903 return PERIPH_ID_NONE;
Rajeshwari Shinde28bae822012-12-26 20:03:11 +0000904}
905#endif