]> git.kernelconcepts.de Git - karo-tx-uboot.git/blob - arch/arm/cpu/armv7/exynos/pinmux.c
Merge branch 'master' of git://git.denx.de/u-boot-i2c
[karo-tx-uboot.git] / arch / arm / cpu / armv7 / exynos / pinmux.c
1 /*
2  * Copyright (c) 2012 Samsung Electronics.
3  * Abhilash Kesavan <a.kesavan@samsung.com>
4  *
5  * See file CREDITS for list of people who contributed to this
6  * project.
7  *
8  * This program is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU General Public License as
10  * published by the Free Software Foundation; either version 2 of
11  * the License, or (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, write to the Free Software
20  * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
21  * MA 02111-1307 USA
22  */
23
24 #include <common.h>
25 #include <asm/arch/gpio.h>
26 #include <asm/arch/pinmux.h>
27 #include <asm/arch/sromc.h>
28
29 static void exynos5_uart_config(int peripheral)
30 {
31         struct exynos5_gpio_part1 *gpio1 =
32                 (struct exynos5_gpio_part1 *) samsung_get_base_gpio_part1();
33         struct s5p_gpio_bank *bank;
34         int i, start, count;
35
36         switch (peripheral) {
37         case PERIPH_ID_UART0:
38                 bank = &gpio1->a0;
39                 start = 0;
40                 count = 4;
41                 break;
42         case PERIPH_ID_UART1:
43                 bank = &gpio1->a0;
44                 start = 4;
45                 count = 4;
46                 break;
47         case PERIPH_ID_UART2:
48                 bank = &gpio1->a1;
49                 start = 0;
50                 count = 4;
51                 break;
52         case PERIPH_ID_UART3:
53                 bank = &gpio1->a1;
54                 start = 4;
55                 count = 2;
56                 break;
57         }
58         for (i = start; i < start + count; i++) {
59                 s5p_gpio_set_pull(bank, i, GPIO_PULL_NONE);
60                 s5p_gpio_cfg_pin(bank, i, GPIO_FUNC(0x2));
61         }
62 }
63
64 static int exynos5_mmc_config(int peripheral, int flags)
65 {
66         struct exynos5_gpio_part1 *gpio1 =
67                 (struct exynos5_gpio_part1 *) samsung_get_base_gpio_part1();
68         struct s5p_gpio_bank *bank, *bank_ext;
69         int i;
70
71         switch (peripheral) {
72         case PERIPH_ID_SDMMC0:
73                 bank = &gpio1->c0;
74                 bank_ext = &gpio1->c1;
75                 break;
76         case PERIPH_ID_SDMMC1:
77                 bank = &gpio1->c1;
78                 bank_ext = NULL;
79                 break;
80         case PERIPH_ID_SDMMC2:
81                 bank = &gpio1->c2;
82                 bank_ext = &gpio1->c3;
83                 break;
84         case PERIPH_ID_SDMMC3:
85                 bank = &gpio1->c3;
86                 bank_ext = NULL;
87                 break;
88         }
89         if ((flags & PINMUX_FLAG_8BIT_MODE) && !bank_ext) {
90                 debug("SDMMC device %d does not support 8bit mode",
91                                 peripheral);
92                 return -1;
93         }
94         if (flags & PINMUX_FLAG_8BIT_MODE) {
95                 for (i = 3; i <= 6; i++) {
96                         s5p_gpio_cfg_pin(bank_ext, i, GPIO_FUNC(0x3));
97                         s5p_gpio_set_pull(bank_ext, i, GPIO_PULL_UP);
98                         s5p_gpio_set_drv(bank_ext, i, GPIO_DRV_4X);
99                 }
100         }
101         for (i = 0; i < 2; i++) {
102                 s5p_gpio_cfg_pin(bank, i, GPIO_FUNC(0x2));
103                 s5p_gpio_set_pull(bank, i, GPIO_PULL_NONE);
104                 s5p_gpio_set_drv(bank, i, GPIO_DRV_4X);
105         }
106         for (i = 3; i <= 6; i++) {
107                 s5p_gpio_cfg_pin(bank, i, GPIO_FUNC(0x2));
108                 s5p_gpio_set_pull(bank, i, GPIO_PULL_UP);
109                 s5p_gpio_set_drv(bank, i, GPIO_DRV_4X);
110         }
111         return 0;
112 }
113
114 static void exynos5_sromc_config(int flags)
115 {
116         struct exynos5_gpio_part1 *gpio1 =
117                 (struct exynos5_gpio_part1 *) samsung_get_base_gpio_part1();
118         int i;
119
120         /*
121          * SROM:CS1 and EBI
122          *
123          * GPY0[0]      SROM_CSn[0]
124          * GPY0[1]      SROM_CSn[1](2)
125          * GPY0[2]      SROM_CSn[2]
126          * GPY0[3]      SROM_CSn[3]
127          * GPY0[4]      EBI_OEn(2)
128          * GPY0[5]      EBI_EEn(2)
129          *
130          * GPY1[0]      EBI_BEn[0](2)
131          * GPY1[1]      EBI_BEn[1](2)
132          * GPY1[2]      SROM_WAIT(2)
133          * GPY1[3]      EBI_DATA_RDn(2)
134          */
135         s5p_gpio_cfg_pin(&gpio1->y0, (flags & PINMUX_FLAG_BANK),
136                                 GPIO_FUNC(2));
137         s5p_gpio_cfg_pin(&gpio1->y0, 4, GPIO_FUNC(2));
138         s5p_gpio_cfg_pin(&gpio1->y0, 5, GPIO_FUNC(2));
139
140         for (i = 0; i < 4; i++)
141                 s5p_gpio_cfg_pin(&gpio1->y1, i, GPIO_FUNC(2));
142
143         /*
144          * EBI: 8 Addrss Lines
145          *
146          * GPY3[0]      EBI_ADDR[0](2)
147          * GPY3[1]      EBI_ADDR[1](2)
148          * GPY3[2]      EBI_ADDR[2](2)
149          * GPY3[3]      EBI_ADDR[3](2)
150          * GPY3[4]      EBI_ADDR[4](2)
151          * GPY3[5]      EBI_ADDR[5](2)
152          * GPY3[6]      EBI_ADDR[6](2)
153          * GPY3[7]      EBI_ADDR[7](2)
154          *
155          * EBI: 16 Data Lines
156          *
157          * GPY5[0]      EBI_DATA[0](2)
158          * GPY5[1]      EBI_DATA[1](2)
159          * GPY5[2]      EBI_DATA[2](2)
160          * GPY5[3]      EBI_DATA[3](2)
161          * GPY5[4]      EBI_DATA[4](2)
162          * GPY5[5]      EBI_DATA[5](2)
163          * GPY5[6]      EBI_DATA[6](2)
164          * GPY5[7]      EBI_DATA[7](2)
165          *
166          * GPY6[0]      EBI_DATA[8](2)
167          * GPY6[1]      EBI_DATA[9](2)
168          * GPY6[2]      EBI_DATA[10](2)
169          * GPY6[3]      EBI_DATA[11](2)
170          * GPY6[4]      EBI_DATA[12](2)
171          * GPY6[5]      EBI_DATA[13](2)
172          * GPY6[6]      EBI_DATA[14](2)
173          * GPY6[7]      EBI_DATA[15](2)
174          */
175         for (i = 0; i < 8; i++) {
176                 s5p_gpio_cfg_pin(&gpio1->y3, i, GPIO_FUNC(2));
177                 s5p_gpio_set_pull(&gpio1->y3, i, GPIO_PULL_UP);
178
179                 s5p_gpio_cfg_pin(&gpio1->y5, i, GPIO_FUNC(2));
180                 s5p_gpio_set_pull(&gpio1->y5, i, GPIO_PULL_UP);
181
182                 s5p_gpio_cfg_pin(&gpio1->y6, i, GPIO_FUNC(2));
183                 s5p_gpio_set_pull(&gpio1->y6, i, GPIO_PULL_UP);
184         }
185 }
186
187 static void exynos5_i2c_config(int peripheral, int flags)
188 {
189
190         struct exynos5_gpio_part1 *gpio1 =
191                 (struct exynos5_gpio_part1 *) samsung_get_base_gpio_part1();
192
193         switch (peripheral) {
194         case PERIPH_ID_I2C0:
195                 s5p_gpio_cfg_pin(&gpio1->b3, 0, GPIO_FUNC(0x2));
196                 s5p_gpio_cfg_pin(&gpio1->b3, 1, GPIO_FUNC(0x2));
197                 break;
198         case PERIPH_ID_I2C1:
199                 s5p_gpio_cfg_pin(&gpio1->b3, 2, GPIO_FUNC(0x2));
200                 s5p_gpio_cfg_pin(&gpio1->b3, 3, GPIO_FUNC(0x2));
201                 break;
202         case PERIPH_ID_I2C2:
203                 s5p_gpio_cfg_pin(&gpio1->a0, 6, GPIO_FUNC(0x3));
204                 s5p_gpio_cfg_pin(&gpio1->a0, 7, GPIO_FUNC(0x3));
205                 break;
206         case PERIPH_ID_I2C3:
207                 s5p_gpio_cfg_pin(&gpio1->a1, 2, GPIO_FUNC(0x3));
208                 s5p_gpio_cfg_pin(&gpio1->a1, 3, GPIO_FUNC(0x3));
209                 break;
210         case PERIPH_ID_I2C4:
211                 s5p_gpio_cfg_pin(&gpio1->a2, 0, GPIO_FUNC(0x3));
212                 s5p_gpio_cfg_pin(&gpio1->a2, 1, GPIO_FUNC(0x3));
213                 break;
214         case PERIPH_ID_I2C5:
215                 s5p_gpio_cfg_pin(&gpio1->a2, 2, GPIO_FUNC(0x3));
216                 s5p_gpio_cfg_pin(&gpio1->a2, 3, GPIO_FUNC(0x3));
217                 break;
218         case PERIPH_ID_I2C6:
219                 s5p_gpio_cfg_pin(&gpio1->b1, 3, GPIO_FUNC(0x4));
220                 s5p_gpio_cfg_pin(&gpio1->b1, 4, GPIO_FUNC(0x4));
221                 break;
222         case PERIPH_ID_I2C7:
223                 s5p_gpio_cfg_pin(&gpio1->b2, 2, GPIO_FUNC(0x3));
224                 s5p_gpio_cfg_pin(&gpio1->b2, 3, GPIO_FUNC(0x3));
225                 break;
226         }
227 }
228
229 static int exynos5_pinmux_config(int peripheral, int flags)
230 {
231         switch (peripheral) {
232         case PERIPH_ID_UART0:
233         case PERIPH_ID_UART1:
234         case PERIPH_ID_UART2:
235         case PERIPH_ID_UART3:
236                 exynos5_uart_config(peripheral);
237                 break;
238         case PERIPH_ID_SDMMC0:
239         case PERIPH_ID_SDMMC1:
240         case PERIPH_ID_SDMMC2:
241         case PERIPH_ID_SDMMC3:
242                 return exynos5_mmc_config(peripheral, flags);
243         case PERIPH_ID_SROMC:
244                 exynos5_sromc_config(flags);
245                 break;
246         case PERIPH_ID_I2C0:
247         case PERIPH_ID_I2C1:
248         case PERIPH_ID_I2C2:
249         case PERIPH_ID_I2C3:
250         case PERIPH_ID_I2C4:
251         case PERIPH_ID_I2C5:
252         case PERIPH_ID_I2C6:
253         case PERIPH_ID_I2C7:
254                 exynos5_i2c_config(peripheral, flags);
255                 break;
256         default:
257                 debug("%s: invalid peripheral %d", __func__, peripheral);
258                 return -1;
259         }
260
261         return 0;
262 }
263
264 int exynos_pinmux_config(int peripheral, int flags)
265 {
266         if (cpu_is_exynos5())
267                 return exynos5_pinmux_config(peripheral, flags);
268         else {
269                 debug("pinmux functionality not supported\n");
270                 return -1;
271         }
272 }