blob: 94d02970516e9efce5065852bf73182647dfd9de [file] [log] [blame]
Rajeshwari Shindec5e37102012-06-06 19:54:29 +00001/*
2 * Copyright (c) 2012 Samsung Electronics.
3 * Abhilash Kesavan <a.kesavan@samsung.com>
4 *
Wolfgang Denk1a459662013-07-08 09:37:19 +02005 * SPDX-License-Identifier: GPL-2.0+
Rajeshwari Shindec5e37102012-06-06 19:54:29 +00006 */
7
8#include <common.h>
Rajeshwari Shinded0559112012-12-26 20:03:11 +00009#include <fdtdec.h>
Simon Glass903fd792014-10-20 19:48:37 -060010#include <asm/gpio.h>
Rajeshwari Shindec5e37102012-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 Shindec5e37102012-06-06 19:54:29 +000016 int i, start, count;
17
18 switch (peripheral) {
19 case PERIPH_ID_UART0:
Akshay Saraswatf6ae1ca2014-05-13 10:30:14 +053020 start = EXYNOS5_GPIO_A00;
Rajeshwari Shindec5e37102012-06-06 19:54:29 +000021 count = 4;
22 break;
23 case PERIPH_ID_UART1:
Akshay Saraswatf6ae1ca2014-05-13 10:30:14 +053024 start = EXYNOS5_GPIO_D00;
Rajeshwari Shindec5e37102012-06-06 19:54:29 +000025 count = 4;
26 break;
27 case PERIPH_ID_UART2:
Akshay Saraswatf6ae1ca2014-05-13 10:30:14 +053028 start = EXYNOS5_GPIO_A10;
Rajeshwari Shindec5e37102012-06-06 19:54:29 +000029 count = 4;
30 break;
31 case PERIPH_ID_UART3:
Akshay Saraswatf6ae1ca2014-05-13 10:30:14 +053032 start = EXYNOS5_GPIO_A14;
Rajeshwari Shindec5e37102012-06-06 19:54:29 +000033 count = 2;
34 break;
Marek Vasut47c9c762014-03-10 20:04:31 +010035 default:
36 debug("%s: invalid peripheral %d", __func__, peripheral);
37 return;
Rajeshwari Shindec5e37102012-06-06 19:54:29 +000038 }
39 for (i = start; i < start + count; i++) {
Akshay Saraswatf6ae1ca2014-05-13 10:30:14 +053040 gpio_set_pull(i, S5P_GPIO_PULL_NONE);
41 gpio_cfg_pin(i, S5P_GPIO_FUNC(0x2));
Rajeshwari Shindec5e37102012-06-06 19:54:29 +000042 }
43}
44
Rajeshwari Birje5af4a4f2013-12-26 09:44:23 +053045static void exynos5420_uart_config(int peripheral)
46{
Rajeshwari Birje5af4a4f2013-12-26 09:44:23 +053047 int i, start, count;
48
49 switch (peripheral) {
50 case PERIPH_ID_UART0:
Akshay Saraswatf6ae1ca2014-05-13 10:30:14 +053051 start = EXYNOS5420_GPIO_A00;
Rajeshwari Birje5af4a4f2013-12-26 09:44:23 +053052 count = 4;
53 break;
54 case PERIPH_ID_UART1:
Akshay Saraswatf6ae1ca2014-05-13 10:30:14 +053055 start = EXYNOS5420_GPIO_A04;
Rajeshwari Birje5af4a4f2013-12-26 09:44:23 +053056 count = 4;
57 break;
58 case PERIPH_ID_UART2:
Akshay Saraswatf6ae1ca2014-05-13 10:30:14 +053059 start = EXYNOS5420_GPIO_A10;
Rajeshwari Birje5af4a4f2013-12-26 09:44:23 +053060 count = 4;
61 break;
62 case PERIPH_ID_UART3:
Akshay Saraswatf6ae1ca2014-05-13 10:30:14 +053063 start = EXYNOS5420_GPIO_A14;
Rajeshwari Birje5af4a4f2013-12-26 09:44:23 +053064 count = 2;
65 break;
Marek Vasut47c9c762014-03-10 20:04:31 +010066 default:
67 debug("%s: invalid peripheral %d", __func__, peripheral);
68 return;
Rajeshwari Birje5af4a4f2013-12-26 09:44:23 +053069 }
70
71 for (i = start; i < start + count; i++) {
Akshay Saraswatf6ae1ca2014-05-13 10:30:14 +053072 gpio_set_pull(i, S5P_GPIO_PULL_NONE);
73 gpio_cfg_pin(i, S5P_GPIO_FUNC(0x2));
Rajeshwari Birje5af4a4f2013-12-26 09:44:23 +053074 }
75}
76
Rajeshwari Shindec5e37102012-06-06 19:54:29 +000077static int exynos5_mmc_config(int peripheral, int flags)
78{
Akshay Saraswatf6ae1ca2014-05-13 10:30:14 +053079 int i, start, start_ext, gpio_func = 0;
Rajeshwari Shindec5e37102012-06-06 19:54:29 +000080
81 switch (peripheral) {
82 case PERIPH_ID_SDMMC0:
Akshay Saraswatf6ae1ca2014-05-13 10:30:14 +053083 start = EXYNOS5_GPIO_C00;
84 start_ext = EXYNOS5_GPIO_C10;
85 gpio_func = S5P_GPIO_FUNC(0x2);
Rajeshwari Shindec5e37102012-06-06 19:54:29 +000086 break;
87 case PERIPH_ID_SDMMC1:
Akshay Saraswatf6ae1ca2014-05-13 10:30:14 +053088 start = EXYNOS5_GPIO_C20;
89 start_ext = 0;
Rajeshwari Shindec5e37102012-06-06 19:54:29 +000090 break;
91 case PERIPH_ID_SDMMC2:
Akshay Saraswatf6ae1ca2014-05-13 10:30:14 +053092 start = EXYNOS5_GPIO_C30;
93 start_ext = EXYNOS5_GPIO_C43;
94 gpio_func = S5P_GPIO_FUNC(0x3);
Rajeshwari Shindec5e37102012-06-06 19:54:29 +000095 break;
96 case PERIPH_ID_SDMMC3:
Akshay Saraswatf6ae1ca2014-05-13 10:30:14 +053097 start = EXYNOS5_GPIO_C40;
98 start_ext = 0;
Rajeshwari Shindec5e37102012-06-06 19:54:29 +000099 break;
Marek Vasut47c9c762014-03-10 20:04:31 +0100100 default:
101 debug("%s: invalid peripheral %d", __func__, peripheral);
102 return -1;
Rajeshwari Shindec5e37102012-06-06 19:54:29 +0000103 }
Akshay Saraswatf6ae1ca2014-05-13 10:30:14 +0530104 if ((flags & PINMUX_FLAG_8BIT_MODE) && !start_ext) {
Rajeshwari Shindec5e37102012-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 Saraswatf6ae1ca2014-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 Shindec5e37102012-06-06 19:54:29 +0000114 }
115 }
Akshay Saraswatf6ae1ca2014-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 Shindec5e37102012-06-06 19:54:29 +0000120 }
Akshay Saraswatf6ae1ca2014-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 Shindec5e37102012-06-06 19:54:29 +0000125 }
Rajeshwari Shindefbb57432012-10-28 19:32:54 +0000126
Rajeshwari Shindec5e37102012-06-06 19:54:29 +0000127 return 0;
128}
129
Rajeshwari Birje5af4a4f2013-12-26 09:44:23 +0530130static int exynos5420_mmc_config(int peripheral, int flags)
131{
Akshay Saraswatf6ae1ca2014-05-13 10:30:14 +0530132 int i, start = 0, start_ext = 0;
Rajeshwari Birje5af4a4f2013-12-26 09:44:23 +0530133
134 switch (peripheral) {
135 case PERIPH_ID_SDMMC0:
Akshay Saraswatf6ae1ca2014-05-13 10:30:14 +0530136 start = EXYNOS5420_GPIO_C00;
137 start_ext = EXYNOS5420_GPIO_C30;
Rajeshwari Birje5af4a4f2013-12-26 09:44:23 +0530138 break;
139 case PERIPH_ID_SDMMC1:
Akshay Saraswatf6ae1ca2014-05-13 10:30:14 +0530140 start = EXYNOS5420_GPIO_C10;
141 start_ext = EXYNOS5420_GPIO_D14;
Rajeshwari Birje5af4a4f2013-12-26 09:44:23 +0530142 break;
143 case PERIPH_ID_SDMMC2:
Akshay Saraswatf6ae1ca2014-05-13 10:30:14 +0530144 start = EXYNOS5420_GPIO_C20;
145 start_ext = 0;
Rajeshwari Birje5af4a4f2013-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 Saraswatf6ae1ca2014-05-13 10:30:14 +0530153 if ((flags & PINMUX_FLAG_8BIT_MODE) && !start_ext) {
Rajeshwari Birje5af4a4f2013-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 Saraswatf6ae1ca2014-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 Birje5af4a4f2013-12-26 09:44:23 +0530164 }
165 }
166
Akshay Saraswatf6ae1ca2014-05-13 10:30:14 +0530167 for (i = start; i < (start + 3); i++) {
Rajeshwari Birje5af4a4f2013-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 Saraswatf6ae1ca2014-05-13 10:30:14 +0530174 if ((peripheral == PERIPH_ID_SDMMC0) && (i == (start + 2))) {
Simon Glass7f196102014-10-20 19:48:39 -0600175#ifndef CONFIG_SPL_BUILD
176 gpio_request(i, "sdmmc0_vdden");
177#endif
Akshay Saraswatf6ae1ca2014-05-13 10:30:14 +0530178 gpio_set_value(i, 1);
179 gpio_cfg_pin(i, S5P_GPIO_OUTPUT);
Rajeshwari Birje5af4a4f2013-12-26 09:44:23 +0530180 } else {
Akshay Saraswatf6ae1ca2014-05-13 10:30:14 +0530181 gpio_cfg_pin(i, S5P_GPIO_FUNC(0x2));
Rajeshwari Birje5af4a4f2013-12-26 09:44:23 +0530182 }
Akshay Saraswatf6ae1ca2014-05-13 10:30:14 +0530183 gpio_set_pull(i, S5P_GPIO_PULL_NONE);
184 gpio_set_drv(i, S5P_GPIO_DRV_4X);
Rajeshwari Birje5af4a4f2013-12-26 09:44:23 +0530185 }
186
Akshay Saraswatf6ae1ca2014-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 Birje5af4a4f2013-12-26 09:44:23 +0530191 }
192
193 return 0;
194}
195
Rajeshwari Shindec5e37102012-06-06 19:54:29 +0000196static void exynos5_sromc_config(int flags)
197{
Rajeshwari Shindec5e37102012-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 Saraswatf6ae1ca2014-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 Shindec5e37102012-06-06 19:54:29 +0000219
220 for (i = 0; i < 4; i++)
Akshay Saraswatf6ae1ca2014-05-13 10:30:14 +0530221 gpio_cfg_pin(EXYNOS5_GPIO_Y10 + i, S5P_GPIO_FUNC(2));
Rajeshwari Shindec5e37102012-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 Saraswatf6ae1ca2014-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 Shindec5e37102012-06-06 19:54:29 +0000258
Akshay Saraswatf6ae1ca2014-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 Shindec5e37102012-06-06 19:54:29 +0000261
Akshay Saraswatf6ae1ca2014-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 Shindec5e37102012-06-06 19:54:29 +0000264 }
265}
266
Rajeshwari Shindec65c05f2012-07-23 21:23:51 +0000267static void exynos5_i2c_config(int peripheral, int flags)
268{
Rajeshwari Shindec65c05f2012-07-23 21:23:51 +0000269 switch (peripheral) {
270 case PERIPH_ID_I2C0:
Akshay Saraswatf6ae1ca2014-05-13 10:30:14 +0530271 gpio_cfg_pin(EXYNOS5_GPIO_B30, S5P_GPIO_FUNC(0x2));
272 gpio_cfg_pin(EXYNOS5_GPIO_B31, S5P_GPIO_FUNC(0x2));
Rajeshwari Shindec65c05f2012-07-23 21:23:51 +0000273 break;
274 case PERIPH_ID_I2C1:
Akshay Saraswatf6ae1ca2014-05-13 10:30:14 +0530275 gpio_cfg_pin(EXYNOS5_GPIO_B32, S5P_GPIO_FUNC(0x2));
276 gpio_cfg_pin(EXYNOS5_GPIO_B33, S5P_GPIO_FUNC(0x2));
Rajeshwari Shindec65c05f2012-07-23 21:23:51 +0000277 break;
278 case PERIPH_ID_I2C2:
Akshay Saraswatf6ae1ca2014-05-13 10:30:14 +0530279 gpio_cfg_pin(EXYNOS5_GPIO_A06, S5P_GPIO_FUNC(0x3));
280 gpio_cfg_pin(EXYNOS5_GPIO_A07, S5P_GPIO_FUNC(0x3));
Rajeshwari Shindec65c05f2012-07-23 21:23:51 +0000281 break;
282 case PERIPH_ID_I2C3:
Akshay Saraswatf6ae1ca2014-05-13 10:30:14 +0530283 gpio_cfg_pin(EXYNOS5_GPIO_A12, S5P_GPIO_FUNC(0x3));
284 gpio_cfg_pin(EXYNOS5_GPIO_A13, S5P_GPIO_FUNC(0x3));
Rajeshwari Shindec65c05f2012-07-23 21:23:51 +0000285 break;
286 case PERIPH_ID_I2C4:
Akshay Saraswatf6ae1ca2014-05-13 10:30:14 +0530287 gpio_cfg_pin(EXYNOS5_GPIO_A20, S5P_GPIO_FUNC(0x3));
288 gpio_cfg_pin(EXYNOS5_GPIO_A21, S5P_GPIO_FUNC(0x3));
Rajeshwari Shindec65c05f2012-07-23 21:23:51 +0000289 break;
290 case PERIPH_ID_I2C5:
Akshay Saraswatf6ae1ca2014-05-13 10:30:14 +0530291 gpio_cfg_pin(EXYNOS5_GPIO_A22, S5P_GPIO_FUNC(0x3));
292 gpio_cfg_pin(EXYNOS5_GPIO_A23, S5P_GPIO_FUNC(0x3));
Rajeshwari Shindec65c05f2012-07-23 21:23:51 +0000293 break;
294 case PERIPH_ID_I2C6:
Akshay Saraswatf6ae1ca2014-05-13 10:30:14 +0530295 gpio_cfg_pin(EXYNOS5_GPIO_B13, S5P_GPIO_FUNC(0x4));
296 gpio_cfg_pin(EXYNOS5_GPIO_B14, S5P_GPIO_FUNC(0x4));
Rajeshwari Shindec65c05f2012-07-23 21:23:51 +0000297 break;
298 case PERIPH_ID_I2C7:
Akshay Saraswatf6ae1ca2014-05-13 10:30:14 +0530299 gpio_cfg_pin(EXYNOS5_GPIO_B22, S5P_GPIO_FUNC(0x3));
300 gpio_cfg_pin(EXYNOS5_GPIO_B23, S5P_GPIO_FUNC(0x3));
Rajeshwari Shindec65c05f2012-07-23 21:23:51 +0000301 break;
302 }
303}
304
Rajeshwari Birje5af4a4f2013-12-26 09:44:23 +0530305static void exynos5420_i2c_config(int peripheral)
306{
Rajeshwari Birje5af4a4f2013-12-26 09:44:23 +0530307 switch (peripheral) {
308 case PERIPH_ID_I2C0:
Akshay Saraswatf6ae1ca2014-05-13 10:30:14 +0530309 gpio_cfg_pin(EXYNOS5420_GPIO_B30, S5P_GPIO_FUNC(0x2));
310 gpio_cfg_pin(EXYNOS5420_GPIO_B31, S5P_GPIO_FUNC(0x2));
Rajeshwari Birje5af4a4f2013-12-26 09:44:23 +0530311 break;
312 case PERIPH_ID_I2C1:
Akshay Saraswatf6ae1ca2014-05-13 10:30:14 +0530313 gpio_cfg_pin(EXYNOS5420_GPIO_B32, S5P_GPIO_FUNC(0x2));
314 gpio_cfg_pin(EXYNOS5420_GPIO_B33, S5P_GPIO_FUNC(0x2));
Rajeshwari Birje5af4a4f2013-12-26 09:44:23 +0530315 break;
316 case PERIPH_ID_I2C2:
Akshay Saraswatf6ae1ca2014-05-13 10:30:14 +0530317 gpio_cfg_pin(EXYNOS5420_GPIO_A06, S5P_GPIO_FUNC(0x3));
318 gpio_cfg_pin(EXYNOS5420_GPIO_A07, S5P_GPIO_FUNC(0x3));
Rajeshwari Birje5af4a4f2013-12-26 09:44:23 +0530319 break;
320 case PERIPH_ID_I2C3:
Akshay Saraswatf6ae1ca2014-05-13 10:30:14 +0530321 gpio_cfg_pin(EXYNOS5420_GPIO_A12, S5P_GPIO_FUNC(0x3));
322 gpio_cfg_pin(EXYNOS5420_GPIO_A13, S5P_GPIO_FUNC(0x3));
Rajeshwari Birje5af4a4f2013-12-26 09:44:23 +0530323 break;
324 case PERIPH_ID_I2C4:
Akshay Saraswatf6ae1ca2014-05-13 10:30:14 +0530325 gpio_cfg_pin(EXYNOS5420_GPIO_A20, S5P_GPIO_FUNC(0x3));
326 gpio_cfg_pin(EXYNOS5420_GPIO_A21, S5P_GPIO_FUNC(0x3));
Rajeshwari Birje5af4a4f2013-12-26 09:44:23 +0530327 break;
328 case PERIPH_ID_I2C5:
Akshay Saraswatf6ae1ca2014-05-13 10:30:14 +0530329 gpio_cfg_pin(EXYNOS5420_GPIO_A22, S5P_GPIO_FUNC(0x3));
330 gpio_cfg_pin(EXYNOS5420_GPIO_A23, S5P_GPIO_FUNC(0x3));
Rajeshwari Birje5af4a4f2013-12-26 09:44:23 +0530331 break;
332 case PERIPH_ID_I2C6:
Akshay Saraswatf6ae1ca2014-05-13 10:30:14 +0530333 gpio_cfg_pin(EXYNOS5420_GPIO_B13, S5P_GPIO_FUNC(0x4));
334 gpio_cfg_pin(EXYNOS5420_GPIO_B14, S5P_GPIO_FUNC(0x4));
Rajeshwari Birje5af4a4f2013-12-26 09:44:23 +0530335 break;
336 case PERIPH_ID_I2C7:
Akshay Saraswatf6ae1ca2014-05-13 10:30:14 +0530337 gpio_cfg_pin(EXYNOS5420_GPIO_B22, S5P_GPIO_FUNC(0x3));
338 gpio_cfg_pin(EXYNOS5420_GPIO_B23, S5P_GPIO_FUNC(0x3));
Rajeshwari Birje5af4a4f2013-12-26 09:44:23 +0530339 break;
340 case PERIPH_ID_I2C8:
Akshay Saraswatf6ae1ca2014-05-13 10:30:14 +0530341 gpio_cfg_pin(EXYNOS5420_GPIO_B34, S5P_GPIO_FUNC(0x2));
342 gpio_cfg_pin(EXYNOS5420_GPIO_B35, S5P_GPIO_FUNC(0x2));
Rajeshwari Birje5af4a4f2013-12-26 09:44:23 +0530343 break;
344 case PERIPH_ID_I2C9:
Akshay Saraswatf6ae1ca2014-05-13 10:30:14 +0530345 gpio_cfg_pin(EXYNOS5420_GPIO_B36, S5P_GPIO_FUNC(0x2));
346 gpio_cfg_pin(EXYNOS5420_GPIO_B37, S5P_GPIO_FUNC(0x2));
Rajeshwari Birje5af4a4f2013-12-26 09:44:23 +0530347 break;
348 case PERIPH_ID_I2C10:
Akshay Saraswatf6ae1ca2014-05-13 10:30:14 +0530349 gpio_cfg_pin(EXYNOS5420_GPIO_B40, S5P_GPIO_FUNC(0x2));
350 gpio_cfg_pin(EXYNOS5420_GPIO_B41, S5P_GPIO_FUNC(0x2));
Rajeshwari Birje5af4a4f2013-12-26 09:44:23 +0530351 break;
352 }
353}
354
Rajeshwari Shinde6b0884d2012-10-25 19:49:27 +0000355static void exynos5_i2s_config(int peripheral)
356{
357 int i;
Rajeshwari Shinde6b0884d2012-10-25 19:49:27 +0000358
Dani Krishna Mohan3dd22a32013-09-11 16:38:48 +0530359 switch (peripheral) {
360 case PERIPH_ID_I2S0:
361 for (i = 0; i < 5; i++)
Akshay Saraswatf6ae1ca2014-05-13 10:30:14 +0530362 gpio_cfg_pin(EXYNOS5_GPIO_Z0 + i, S5P_GPIO_FUNC(0x02));
Dani Krishna Mohan3dd22a32013-09-11 16:38:48 +0530363 break;
364 case PERIPH_ID_I2S1:
365 for (i = 0; i < 5; i++)
Akshay Saraswatf6ae1ca2014-05-13 10:30:14 +0530366 gpio_cfg_pin(EXYNOS5_GPIO_B00 + i, S5P_GPIO_FUNC(0x02));
Dani Krishna Mohan3dd22a32013-09-11 16:38:48 +0530367 break;
368 }
Rajeshwari Shinde6b0884d2012-10-25 19:49:27 +0000369}
370
Rajeshwari Shindefbb57432012-10-28 19:32:54 +0000371void exynos5_spi_config(int peripheral)
372{
373 int cfg = 0, pin = 0, i;
Rajeshwari Shindefbb57432012-10-28 19:32:54 +0000374
375 switch (peripheral) {
376 case PERIPH_ID_SPI0:
Akshay Saraswatf6ae1ca2014-05-13 10:30:14 +0530377 cfg = S5P_GPIO_FUNC(0x2);
378 pin = EXYNOS5_GPIO_A20;
Rajeshwari Shindefbb57432012-10-28 19:32:54 +0000379 break;
380 case PERIPH_ID_SPI1:
Akshay Saraswatf6ae1ca2014-05-13 10:30:14 +0530381 cfg = S5P_GPIO_FUNC(0x2);
382 pin = EXYNOS5_GPIO_A24;
Rajeshwari Shindefbb57432012-10-28 19:32:54 +0000383 break;
384 case PERIPH_ID_SPI2:
Akshay Saraswatf6ae1ca2014-05-13 10:30:14 +0530385 cfg = S5P_GPIO_FUNC(0x5);
386 pin = EXYNOS5_GPIO_B11;
Rajeshwari Shindefbb57432012-10-28 19:32:54 +0000387 break;
388 case PERIPH_ID_SPI3:
Akshay Saraswatf6ae1ca2014-05-13 10:30:14 +0530389 cfg = S5P_GPIO_FUNC(0x2);
390 pin = EXYNOS5_GPIO_F10;
Rajeshwari Shindefbb57432012-10-28 19:32:54 +0000391 break;
392 case PERIPH_ID_SPI4:
393 for (i = 0; i < 2; i++) {
Akshay Saraswatf6ae1ca2014-05-13 10:30:14 +0530394 gpio_cfg_pin(EXYNOS5_GPIO_F02 + i, S5P_GPIO_FUNC(0x4));
395 gpio_cfg_pin(EXYNOS5_GPIO_E04 + i, S5P_GPIO_FUNC(0x4));
Rajeshwari Shindefbb57432012-10-28 19:32:54 +0000396 }
397 break;
398 }
399 if (peripheral != PERIPH_ID_SPI4) {
400 for (i = pin; i < pin + 4; i++)
Akshay Saraswatf6ae1ca2014-05-13 10:30:14 +0530401 gpio_cfg_pin(i, cfg);
Rajeshwari Shindefbb57432012-10-28 19:32:54 +0000402 }
403}
404
Rajeshwari Birje5af4a4f2013-12-26 09:44:23 +0530405void exynos5420_spi_config(int peripheral)
406{
407 int cfg, pin, i;
Rajeshwari Birje5af4a4f2013-12-26 09:44:23 +0530408
409 switch (peripheral) {
410 case PERIPH_ID_SPI0:
Akshay Saraswatf6ae1ca2014-05-13 10:30:14 +0530411 pin = EXYNOS5420_GPIO_A20;
412 cfg = S5P_GPIO_FUNC(0x2);
Rajeshwari Birje5af4a4f2013-12-26 09:44:23 +0530413 break;
414 case PERIPH_ID_SPI1:
Akshay Saraswatf6ae1ca2014-05-13 10:30:14 +0530415 pin = EXYNOS5420_GPIO_A24;
416 cfg = S5P_GPIO_FUNC(0x2);
Rajeshwari Birje5af4a4f2013-12-26 09:44:23 +0530417 break;
418 case PERIPH_ID_SPI2:
Akshay Saraswatf6ae1ca2014-05-13 10:30:14 +0530419 pin = EXYNOS5420_GPIO_B11;
420 cfg = S5P_GPIO_FUNC(0x5);
Rajeshwari Birje5af4a4f2013-12-26 09:44:23 +0530421 break;
422 case PERIPH_ID_SPI3:
Akshay Saraswatf6ae1ca2014-05-13 10:30:14 +0530423 pin = EXYNOS5420_GPIO_F10;
424 cfg = S5P_GPIO_FUNC(0x2);
Rajeshwari Birje5af4a4f2013-12-26 09:44:23 +0530425 break;
426 case PERIPH_ID_SPI4:
427 cfg = 0;
428 pin = 0;
429 break;
430 default:
431 cfg = 0;
432 pin = 0;
433 debug("%s: invalid peripheral %d", __func__, peripheral);
434 return;
435 }
436
437 if (peripheral != PERIPH_ID_SPI4) {
438 for (i = pin; i < pin + 4; i++)
Akshay Saraswatf6ae1ca2014-05-13 10:30:14 +0530439 gpio_cfg_pin(i, cfg);
Rajeshwari Birje5af4a4f2013-12-26 09:44:23 +0530440 } else {
441 for (i = 0; i < 2; i++) {
Akshay Saraswatf6ae1ca2014-05-13 10:30:14 +0530442 gpio_cfg_pin(EXYNOS5420_GPIO_F02 + i,
443 S5P_GPIO_FUNC(0x4));
444 gpio_cfg_pin(EXYNOS5420_GPIO_E04 + i,
445 S5P_GPIO_FUNC(0x4));
Rajeshwari Birje5af4a4f2013-12-26 09:44:23 +0530446 }
447 }
448}
449
Rajeshwari Shindec5e37102012-06-06 19:54:29 +0000450static int exynos5_pinmux_config(int peripheral, int flags)
451{
452 switch (peripheral) {
453 case PERIPH_ID_UART0:
454 case PERIPH_ID_UART1:
455 case PERIPH_ID_UART2:
456 case PERIPH_ID_UART3:
457 exynos5_uart_config(peripheral);
458 break;
459 case PERIPH_ID_SDMMC0:
460 case PERIPH_ID_SDMMC1:
461 case PERIPH_ID_SDMMC2:
462 case PERIPH_ID_SDMMC3:
463 return exynos5_mmc_config(peripheral, flags);
464 case PERIPH_ID_SROMC:
465 exynos5_sromc_config(flags);
466 break;
Rajeshwari Shindec65c05f2012-07-23 21:23:51 +0000467 case PERIPH_ID_I2C0:
468 case PERIPH_ID_I2C1:
469 case PERIPH_ID_I2C2:
470 case PERIPH_ID_I2C3:
471 case PERIPH_ID_I2C4:
472 case PERIPH_ID_I2C5:
473 case PERIPH_ID_I2C6:
474 case PERIPH_ID_I2C7:
475 exynos5_i2c_config(peripheral, flags);
476 break;
Dani Krishna Mohan3dd22a32013-09-11 16:38:48 +0530477 case PERIPH_ID_I2S0:
Rajeshwari Shinde6b0884d2012-10-25 19:49:27 +0000478 case PERIPH_ID_I2S1:
479 exynos5_i2s_config(peripheral);
480 break;
Rajeshwari Shindefbb57432012-10-28 19:32:54 +0000481 case PERIPH_ID_SPI0:
482 case PERIPH_ID_SPI1:
483 case PERIPH_ID_SPI2:
484 case PERIPH_ID_SPI3:
485 case PERIPH_ID_SPI4:
486 exynos5_spi_config(peripheral);
487 break;
Rajeshwari Shindec5e37102012-06-06 19:54:29 +0000488 default:
489 debug("%s: invalid peripheral %d", __func__, peripheral);
490 return -1;
491 }
492
493 return 0;
494}
495
Rajeshwari Birje5af4a4f2013-12-26 09:44:23 +0530496static int exynos5420_pinmux_config(int peripheral, int flags)
497{
498 switch (peripheral) {
499 case PERIPH_ID_UART0:
500 case PERIPH_ID_UART1:
501 case PERIPH_ID_UART2:
502 case PERIPH_ID_UART3:
503 exynos5420_uart_config(peripheral);
504 break;
505 case PERIPH_ID_SDMMC0:
506 case PERIPH_ID_SDMMC1:
507 case PERIPH_ID_SDMMC2:
508 case PERIPH_ID_SDMMC3:
509 return exynos5420_mmc_config(peripheral, flags);
510 case PERIPH_ID_SPI0:
511 case PERIPH_ID_SPI1:
512 case PERIPH_ID_SPI2:
513 case PERIPH_ID_SPI3:
514 case PERIPH_ID_SPI4:
515 exynos5420_spi_config(peripheral);
516 break;
517 case PERIPH_ID_I2C0:
518 case PERIPH_ID_I2C1:
519 case PERIPH_ID_I2C2:
520 case PERIPH_ID_I2C3:
521 case PERIPH_ID_I2C4:
522 case PERIPH_ID_I2C5:
523 case PERIPH_ID_I2C6:
524 case PERIPH_ID_I2C7:
525 case PERIPH_ID_I2C8:
526 case PERIPH_ID_I2C9:
527 case PERIPH_ID_I2C10:
528 exynos5420_i2c_config(peripheral);
529 break;
530 default:
531 debug("%s: invalid peripheral %d", __func__, peripheral);
532 return -1;
533 }
534
535 return 0;
536}
537
Piotr Wilczek89bd58a2012-11-20 02:19:04 +0000538static void exynos4_i2c_config(int peripheral, int flags)
Piotr Wilczeka3eab2a2012-09-20 00:19:57 +0000539{
Piotr Wilczeka3eab2a2012-09-20 00:19:57 +0000540 switch (peripheral) {
Piotr Wilczek89bd58a2012-11-20 02:19:04 +0000541 case PERIPH_ID_I2C0:
Akshay Saraswatf6ae1ca2014-05-13 10:30:14 +0530542 gpio_cfg_pin(EXYNOS4_GPIO_D10, S5P_GPIO_FUNC(0x2));
543 gpio_cfg_pin(EXYNOS4_GPIO_D11, S5P_GPIO_FUNC(0x2));
Piotr Wilczeka3eab2a2012-09-20 00:19:57 +0000544 break;
Piotr Wilczek89bd58a2012-11-20 02:19:04 +0000545 case PERIPH_ID_I2C1:
Akshay Saraswatf6ae1ca2014-05-13 10:30:14 +0530546 gpio_cfg_pin(EXYNOS4_GPIO_D12, S5P_GPIO_FUNC(0x2));
547 gpio_cfg_pin(EXYNOS4_GPIO_D13, S5P_GPIO_FUNC(0x2));
Piotr Wilczeka3eab2a2012-09-20 00:19:57 +0000548 break;
Piotr Wilczek89bd58a2012-11-20 02:19:04 +0000549 case PERIPH_ID_I2C2:
Akshay Saraswatf6ae1ca2014-05-13 10:30:14 +0530550 gpio_cfg_pin(EXYNOS4_GPIO_A06, S5P_GPIO_FUNC(0x3));
551 gpio_cfg_pin(EXYNOS4_GPIO_A07, S5P_GPIO_FUNC(0x3));
Piotr Wilczek89bd58a2012-11-20 02:19:04 +0000552 break;
553 case PERIPH_ID_I2C3:
Akshay Saraswatf6ae1ca2014-05-13 10:30:14 +0530554 gpio_cfg_pin(EXYNOS4_GPIO_A12, S5P_GPIO_FUNC(0x3));
555 gpio_cfg_pin(EXYNOS4_GPIO_A13, S5P_GPIO_FUNC(0x3));
Piotr Wilczek89bd58a2012-11-20 02:19:04 +0000556 break;
557 case PERIPH_ID_I2C4:
Akshay Saraswatf6ae1ca2014-05-13 10:30:14 +0530558 gpio_cfg_pin(EXYNOS4_GPIO_B2, S5P_GPIO_FUNC(0x3));
559 gpio_cfg_pin(EXYNOS4_GPIO_B3, S5P_GPIO_FUNC(0x3));
Piotr Wilczek89bd58a2012-11-20 02:19:04 +0000560 break;
561 case PERIPH_ID_I2C5:
Akshay Saraswatf6ae1ca2014-05-13 10:30:14 +0530562 gpio_cfg_pin(EXYNOS4_GPIO_B6, S5P_GPIO_FUNC(0x3));
563 gpio_cfg_pin(EXYNOS4_GPIO_B7, S5P_GPIO_FUNC(0x3));
Piotr Wilczek89bd58a2012-11-20 02:19:04 +0000564 break;
565 case PERIPH_ID_I2C6:
Akshay Saraswatf6ae1ca2014-05-13 10:30:14 +0530566 gpio_cfg_pin(EXYNOS4_GPIO_C13, S5P_GPIO_FUNC(0x4));
567 gpio_cfg_pin(EXYNOS4_GPIO_C14, S5P_GPIO_FUNC(0x4));
Piotr Wilczek89bd58a2012-11-20 02:19:04 +0000568 break;
569 case PERIPH_ID_I2C7:
Akshay Saraswatf6ae1ca2014-05-13 10:30:14 +0530570 gpio_cfg_pin(EXYNOS4_GPIO_D02, S5P_GPIO_FUNC(0x3));
571 gpio_cfg_pin(EXYNOS4_GPIO_D03, S5P_GPIO_FUNC(0x3));
Piotr Wilczek89bd58a2012-11-20 02:19:04 +0000572 break;
Piotr Wilczeka3eab2a2012-09-20 00:19:57 +0000573 }
Piotr Wilczeka3eab2a2012-09-20 00:19:57 +0000574}
575
Piotr Wilczek7a84e1f2013-01-02 21:31:00 +0000576static int exynos4_mmc_config(int peripheral, int flags)
577{
Akshay Saraswatf6ae1ca2014-05-13 10:30:14 +0530578 int i, start = 0, start_ext = 0;
Beomho Seo77ee62d2014-05-16 13:59:46 +0900579 unsigned int func, ext_func;
Piotr Wilczek7a84e1f2013-01-02 21:31:00 +0000580
581 switch (peripheral) {
582 case PERIPH_ID_SDMMC0:
Akshay Saraswatf6ae1ca2014-05-13 10:30:14 +0530583 start = EXYNOS4_GPIO_K00;
584 start_ext = EXYNOS4_GPIO_K13;
Beomho Seo77ee62d2014-05-16 13:59:46 +0900585 func = S5P_GPIO_FUNC(0x2);
586 ext_func = S5P_GPIO_FUNC(0x3);
Piotr Wilczek7a84e1f2013-01-02 21:31:00 +0000587 break;
588 case PERIPH_ID_SDMMC2:
Akshay Saraswatf6ae1ca2014-05-13 10:30:14 +0530589 start = EXYNOS4_GPIO_K20;
590 start_ext = EXYNOS4_GPIO_K33;
Beomho Seo77ee62d2014-05-16 13:59:46 +0900591 func = S5P_GPIO_FUNC(0x2);
592 ext_func = S5P_GPIO_FUNC(0x3);
593 break;
594 case PERIPH_ID_SDMMC4:
595 start = EXYNOS4_GPIO_K00;
596 start_ext = EXYNOS4_GPIO_K13;
597 func = S5P_GPIO_FUNC(0x3);
598 ext_func = S5P_GPIO_FUNC(0x4);
Piotr Wilczek7a84e1f2013-01-02 21:31:00 +0000599 break;
600 default:
601 return -1;
602 }
Akshay Saraswatf6ae1ca2014-05-13 10:30:14 +0530603 for (i = start; i < (start + 7); i++) {
604 if (i == (start + 2))
Piotr Wilczek7a84e1f2013-01-02 21:31:00 +0000605 continue;
Beomho Seo77ee62d2014-05-16 13:59:46 +0900606 gpio_cfg_pin(i, func);
Akshay Saraswatf6ae1ca2014-05-13 10:30:14 +0530607 gpio_set_pull(i, S5P_GPIO_PULL_NONE);
608 gpio_set_drv(i, S5P_GPIO_DRV_4X);
Piotr Wilczek7a84e1f2013-01-02 21:31:00 +0000609 }
Beomho Seo77ee62d2014-05-16 13:59:46 +0900610 /* SDMMC2 do not use 8bit mode at exynos4 */
Piotr Wilczek7a84e1f2013-01-02 21:31:00 +0000611 if (flags & PINMUX_FLAG_8BIT_MODE) {
Akshay Saraswatf6ae1ca2014-05-13 10:30:14 +0530612 for (i = start_ext; i < (start_ext + 4); i++) {
Beomho Seo77ee62d2014-05-16 13:59:46 +0900613 gpio_cfg_pin(i, ext_func);
Akshay Saraswatf6ae1ca2014-05-13 10:30:14 +0530614 gpio_set_pull(i, S5P_GPIO_PULL_NONE);
615 gpio_set_drv(i, S5P_GPIO_DRV_4X);
Piotr Wilczek7a84e1f2013-01-02 21:31:00 +0000616 }
617 }
618
619 return 0;
620}
621
Rajeshwari Shinde198a40b2013-07-04 12:29:16 +0530622static void exynos4_uart_config(int peripheral)
623{
Rajeshwari Shinde198a40b2013-07-04 12:29:16 +0530624 int i, start, count;
625
626 switch (peripheral) {
627 case PERIPH_ID_UART0:
Akshay Saraswatf6ae1ca2014-05-13 10:30:14 +0530628 start = EXYNOS4_GPIO_A00;
Rajeshwari Shinde198a40b2013-07-04 12:29:16 +0530629 count = 4;
630 break;
631 case PERIPH_ID_UART1:
Akshay Saraswatf6ae1ca2014-05-13 10:30:14 +0530632 start = EXYNOS4_GPIO_A04;
Rajeshwari Shinde198a40b2013-07-04 12:29:16 +0530633 count = 4;
634 break;
635 case PERIPH_ID_UART2:
Akshay Saraswatf6ae1ca2014-05-13 10:30:14 +0530636 start = EXYNOS4_GPIO_A10;
Rajeshwari Shinde198a40b2013-07-04 12:29:16 +0530637 count = 4;
638 break;
639 case PERIPH_ID_UART3:
Akshay Saraswatf6ae1ca2014-05-13 10:30:14 +0530640 start = EXYNOS4_GPIO_A14;
Rajeshwari Shinde198a40b2013-07-04 12:29:16 +0530641 count = 2;
642 break;
Marek Vasut47c9c762014-03-10 20:04:31 +0100643 default:
644 debug("%s: invalid peripheral %d", __func__, peripheral);
645 return;
Rajeshwari Shinde198a40b2013-07-04 12:29:16 +0530646 }
Akshay Saraswatf6ae1ca2014-05-13 10:30:14 +0530647 for (i = start; i < (start + count); i++) {
648 gpio_set_pull(i, S5P_GPIO_PULL_NONE);
649 gpio_cfg_pin(i, S5P_GPIO_FUNC(0x2));
Rajeshwari Shinde198a40b2013-07-04 12:29:16 +0530650 }
651}
Akshay Saraswatf6ae1ca2014-05-13 10:30:14 +0530652
653static void exynos4x12_i2c_config(int peripheral, int flags)
654{
655 switch (peripheral) {
656 case PERIPH_ID_I2C0:
657 gpio_cfg_pin(EXYNOS4X12_GPIO_D10, S5P_GPIO_FUNC(0x2));
658 gpio_cfg_pin(EXYNOS4X12_GPIO_D11, S5P_GPIO_FUNC(0x2));
659 break;
660 case PERIPH_ID_I2C1:
661 gpio_cfg_pin(EXYNOS4X12_GPIO_D12, S5P_GPIO_FUNC(0x2));
662 gpio_cfg_pin(EXYNOS4X12_GPIO_D13, S5P_GPIO_FUNC(0x2));
663 break;
664 case PERIPH_ID_I2C2:
665 gpio_cfg_pin(EXYNOS4X12_GPIO_A06, S5P_GPIO_FUNC(0x3));
666 gpio_cfg_pin(EXYNOS4X12_GPIO_A07, S5P_GPIO_FUNC(0x3));
667 break;
668 case PERIPH_ID_I2C3:
669 gpio_cfg_pin(EXYNOS4X12_GPIO_A12, S5P_GPIO_FUNC(0x3));
670 gpio_cfg_pin(EXYNOS4X12_GPIO_A13, S5P_GPIO_FUNC(0x3));
671 break;
672 case PERIPH_ID_I2C4:
673 gpio_cfg_pin(EXYNOS4X12_GPIO_B2, S5P_GPIO_FUNC(0x3));
674 gpio_cfg_pin(EXYNOS4X12_GPIO_B3, S5P_GPIO_FUNC(0x3));
675 break;
676 case PERIPH_ID_I2C5:
677 gpio_cfg_pin(EXYNOS4X12_GPIO_B6, S5P_GPIO_FUNC(0x3));
678 gpio_cfg_pin(EXYNOS4X12_GPIO_B7, S5P_GPIO_FUNC(0x3));
679 break;
680 case PERIPH_ID_I2C6:
681 gpio_cfg_pin(EXYNOS4X12_GPIO_C13, S5P_GPIO_FUNC(0x4));
682 gpio_cfg_pin(EXYNOS4X12_GPIO_C14, S5P_GPIO_FUNC(0x4));
683 break;
684 case PERIPH_ID_I2C7:
685 gpio_cfg_pin(EXYNOS4X12_GPIO_D02, S5P_GPIO_FUNC(0x3));
686 gpio_cfg_pin(EXYNOS4X12_GPIO_D03, S5P_GPIO_FUNC(0x3));
687 break;
688 }
689}
690
691static int exynos4x12_mmc_config(int peripheral, int flags)
692{
693 int i, start = 0, start_ext = 0;
Beomho Seo77ee62d2014-05-16 13:59:46 +0900694 unsigned int func, ext_func;
Akshay Saraswatf6ae1ca2014-05-13 10:30:14 +0530695
696 switch (peripheral) {
697 case PERIPH_ID_SDMMC0:
698 start = EXYNOS4X12_GPIO_K00;
699 start_ext = EXYNOS4X12_GPIO_K13;
Beomho Seo77ee62d2014-05-16 13:59:46 +0900700 func = S5P_GPIO_FUNC(0x2);
701 ext_func = S5P_GPIO_FUNC(0x3);
Akshay Saraswatf6ae1ca2014-05-13 10:30:14 +0530702 break;
703 case PERIPH_ID_SDMMC2:
704 start = EXYNOS4X12_GPIO_K20;
705 start_ext = EXYNOS4X12_GPIO_K33;
Beomho Seo77ee62d2014-05-16 13:59:46 +0900706 func = S5P_GPIO_FUNC(0x2);
707 ext_func = S5P_GPIO_FUNC(0x3);
708 break;
709 case PERIPH_ID_SDMMC4:
Przemyslaw Marczak19f1b622014-09-01 13:50:43 +0200710 start = EXYNOS4X12_GPIO_K00;
711 start_ext = EXYNOS4X12_GPIO_K13;
Beomho Seo77ee62d2014-05-16 13:59:46 +0900712 func = S5P_GPIO_FUNC(0x3);
713 ext_func = S5P_GPIO_FUNC(0x4);
Akshay Saraswatf6ae1ca2014-05-13 10:30:14 +0530714 break;
715 default:
716 return -1;
717 }
718 for (i = start; i < (start + 7); i++) {
719 if (i == (start + 2))
720 continue;
Beomho Seo77ee62d2014-05-16 13:59:46 +0900721 gpio_cfg_pin(i, func);
Akshay Saraswatf6ae1ca2014-05-13 10:30:14 +0530722 gpio_set_pull(i, S5P_GPIO_PULL_NONE);
723 gpio_set_drv(i, S5P_GPIO_DRV_4X);
724 }
725 if (flags & PINMUX_FLAG_8BIT_MODE) {
726 for (i = start_ext; i < (start_ext + 4); i++) {
Beomho Seo77ee62d2014-05-16 13:59:46 +0900727 gpio_cfg_pin(i, ext_func);
Akshay Saraswatf6ae1ca2014-05-13 10:30:14 +0530728 gpio_set_pull(i, S5P_GPIO_PULL_NONE);
729 gpio_set_drv(i, S5P_GPIO_DRV_4X);
730 }
731 }
732
733 return 0;
734}
735
736static void exynos4x12_uart_config(int peripheral)
737{
738 int i, start, count;
739
740 switch (peripheral) {
741 case PERIPH_ID_UART0:
742 start = EXYNOS4X12_GPIO_A00;
743 count = 4;
744 break;
745 case PERIPH_ID_UART1:
746 start = EXYNOS4X12_GPIO_A04;
747 count = 4;
748 break;
749 case PERIPH_ID_UART2:
750 start = EXYNOS4X12_GPIO_A10;
751 count = 4;
752 break;
753 case PERIPH_ID_UART3:
754 start = EXYNOS4X12_GPIO_A14;
755 count = 2;
756 break;
757 default:
758 debug("%s: invalid peripheral %d", __func__, peripheral);
759 return;
760 }
761 for (i = start; i < (start + count); i++) {
762 gpio_set_pull(i, S5P_GPIO_PULL_NONE);
763 gpio_cfg_pin(i, S5P_GPIO_FUNC(0x2));
764 }
765}
766
Piotr Wilczeka3eab2a2012-09-20 00:19:57 +0000767static int exynos4_pinmux_config(int peripheral, int flags)
768{
769 switch (peripheral) {
Rajeshwari Shinde198a40b2013-07-04 12:29:16 +0530770 case PERIPH_ID_UART0:
771 case PERIPH_ID_UART1:
772 case PERIPH_ID_UART2:
773 case PERIPH_ID_UART3:
774 exynos4_uart_config(peripheral);
775 break;
Piotr Wilczek89bd58a2012-11-20 02:19:04 +0000776 case PERIPH_ID_I2C0:
777 case PERIPH_ID_I2C1:
778 case PERIPH_ID_I2C2:
779 case PERIPH_ID_I2C3:
780 case PERIPH_ID_I2C4:
781 case PERIPH_ID_I2C5:
782 case PERIPH_ID_I2C6:
783 case PERIPH_ID_I2C7:
784 exynos4_i2c_config(peripheral, flags);
785 break;
Piotr Wilczek7a84e1f2013-01-02 21:31:00 +0000786 case PERIPH_ID_SDMMC0:
787 case PERIPH_ID_SDMMC2:
Beomho Seo77ee62d2014-05-16 13:59:46 +0900788 case PERIPH_ID_SDMMC4:
Piotr Wilczek7a84e1f2013-01-02 21:31:00 +0000789 return exynos4_mmc_config(peripheral, flags);
790 case PERIPH_ID_SDMMC1:
791 case PERIPH_ID_SDMMC3:
Rajeshwari Shinde347e45d2013-10-08 18:42:22 +0530792 debug("SDMMC device %d not implemented\n", peripheral);
Piotr Wilczek7a84e1f2013-01-02 21:31:00 +0000793 return -1;
Piotr Wilczeka3eab2a2012-09-20 00:19:57 +0000794 default:
795 debug("%s: invalid peripheral %d", __func__, peripheral);
796 return -1;
797 }
798
799 return 0;
800}
801
Akshay Saraswatf6ae1ca2014-05-13 10:30:14 +0530802static int exynos4x12_pinmux_config(int peripheral, int flags)
803{
804 switch (peripheral) {
805 case PERIPH_ID_UART0:
806 case PERIPH_ID_UART1:
807 case PERIPH_ID_UART2:
808 case PERIPH_ID_UART3:
809 exynos4x12_uart_config(peripheral);
810 break;
811 case PERIPH_ID_I2C0:
812 case PERIPH_ID_I2C1:
813 case PERIPH_ID_I2C2:
814 case PERIPH_ID_I2C3:
815 case PERIPH_ID_I2C4:
816 case PERIPH_ID_I2C5:
817 case PERIPH_ID_I2C6:
818 case PERIPH_ID_I2C7:
819 exynos4x12_i2c_config(peripheral, flags);
820 break;
821 case PERIPH_ID_SDMMC0:
822 case PERIPH_ID_SDMMC2:
Beomho Seo77ee62d2014-05-16 13:59:46 +0900823 case PERIPH_ID_SDMMC4:
Akshay Saraswatf6ae1ca2014-05-13 10:30:14 +0530824 return exynos4x12_mmc_config(peripheral, flags);
825 case PERIPH_ID_SDMMC1:
826 case PERIPH_ID_SDMMC3:
Akshay Saraswatf6ae1ca2014-05-13 10:30:14 +0530827 debug("SDMMC device %d not implemented\n", peripheral);
828 return -1;
829 default:
830 debug("%s: invalid peripheral %d", __func__, peripheral);
831 return -1;
832 }
833
834 return 0;
835}
836
Rajeshwari Shindec5e37102012-06-06 19:54:29 +0000837int exynos_pinmux_config(int peripheral, int flags)
838{
Dani Krishna Mohan3dd22a32013-09-11 16:38:48 +0530839 if (cpu_is_exynos5()) {
Akshay Saraswataa14b422014-11-13 22:38:15 +0530840 if (proid_is_exynos5420() || proid_is_exynos5800())
Rajeshwari Birje5af4a4f2013-12-26 09:44:23 +0530841 return exynos5420_pinmux_config(peripheral, flags);
842 else if (proid_is_exynos5250())
843 return exynos5_pinmux_config(peripheral, flags);
Dani Krishna Mohan3dd22a32013-09-11 16:38:48 +0530844 } else if (cpu_is_exynos4()) {
Akshay Saraswatf6ae1ca2014-05-13 10:30:14 +0530845 if (proid_is_exynos4412())
846 return exynos4x12_pinmux_config(peripheral, flags);
847 else
848 return exynos4_pinmux_config(peripheral, flags);
Rajeshwari Shindec5e37102012-06-06 19:54:29 +0000849 }
Rajeshwari Birje5af4a4f2013-12-26 09:44:23 +0530850
Akshay Saraswatf6ae1ca2014-05-13 10:30:14 +0530851 debug("pinmux functionality not supported\n");
852
Rajeshwari Birje5af4a4f2013-12-26 09:44:23 +0530853 return -1;
Rajeshwari Shindec5e37102012-06-06 19:54:29 +0000854}
Rajeshwari Shinded0559112012-12-26 20:03:11 +0000855
856#ifdef CONFIG_OF_CONTROL
Piotr Wilczekb8dfcdb2014-03-07 14:59:38 +0100857static int exynos4_pinmux_decode_periph_id(const void *blob, int node)
858{
859 int err;
860 u32 cell[3];
861
862 err = fdtdec_get_int_array(blob, node, "interrupts", cell,
863 ARRAY_SIZE(cell));
864 if (err) {
865 debug(" invalid peripheral id\n");
866 return PERIPH_ID_NONE;
867 }
868
869 return cell[1];
870}
871
Rajeshwari Shinded0559112012-12-26 20:03:11 +0000872static int exynos5_pinmux_decode_periph_id(const void *blob, int node)
873{
874 int err;
875 u32 cell[3];
876
877 err = fdtdec_get_int_array(blob, node, "interrupts", cell,
878 ARRAY_SIZE(cell));
879 if (err)
880 return PERIPH_ID_NONE;
881
Minkyu Kang0ab9a032014-01-29 17:04:17 +0900882 return cell[1];
Rajeshwari Shinded0559112012-12-26 20:03:11 +0000883}
884
885int pinmux_decode_periph_id(const void *blob, int node)
886{
887 if (cpu_is_exynos5())
888 return exynos5_pinmux_decode_periph_id(blob, node);
Piotr Wilczekb8dfcdb2014-03-07 14:59:38 +0100889 else if (cpu_is_exynos4())
890 return exynos4_pinmux_decode_periph_id(blob, node);
Akshay Saraswatf6ae1ca2014-05-13 10:30:14 +0530891
892 return PERIPH_ID_NONE;
Rajeshwari Shinded0559112012-12-26 20:03:11 +0000893}
894#endif