• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 
3 #ifndef CPU_SAMSUNG_EXYNOS5420_GPIO_H
4 #define CPU_SAMSUNG_EXYNOS5420_GPIO_H
5 
6 #include <soc/cpu.h>
7 
8 /* TODO: Align interface to src/include/gpio.h! */
9 
10 struct gpio_bank {
11 	unsigned int	con;
12 	unsigned int	dat;
13 	unsigned int	pull;
14 	unsigned int	drv;
15 	unsigned int	pdn_con;
16 	unsigned int	pdn_pull;
17 	unsigned char	res1[8];
18 };
19 
20 /* GPIO pins per bank  */
21 #define GPIO_PER_BANK 8
22 
23 /* Pin configurations */
24 #define GPIO_INPUT	0x0
25 #define GPIO_OUTPUT	0x1
26 #define GPIO_IRQ	0xf
27 #define GPIO_FUNC(x)	(x)
28 
29 /* Pull mode */
30 #define GPIO_PULL_NONE	0x0
31 #define GPIO_PULL_DOWN	0x1
32 #define GPIO_PULL_UP	0x3
33 
34 /* Drive Strength level */
35 #define GPIO_DRV_1X	0x0
36 #define GPIO_DRV_3X	0x1
37 #define GPIO_DRV_2X	0x2
38 #define GPIO_DRV_4X	0x3
39 #define GPIO_DRV_FAST	0x0
40 #define GPIO_DRV_SLOW	0x1
41 
42 enum exynos5_gpio_port {
43 	EXYNOS5_GPY7 = EXYNOS5420_GPIO_PART1_BASE + 0x0000,
44 
45 	EXYNOS5_GPX0 = EXYNOS5420_GPIO_PART2_BASE + 0x0000,
46 	EXYNOS5_GPX1 = EXYNOS5420_GPIO_PART2_BASE + 0x0020,
47 	EXYNOS5_GPX2 = EXYNOS5420_GPIO_PART2_BASE + 0x0040,
48 	EXYNOS5_GPX3 = EXYNOS5420_GPIO_PART2_BASE + 0x0060,
49 
50 	EXYNOS5_GPC0 = EXYNOS5420_GPIO_PART3_BASE + 0x0000,
51 	EXYNOS5_GPC1 = EXYNOS5420_GPIO_PART3_BASE + 0x0020,
52 	EXYNOS5_GPC2 = EXYNOS5420_GPIO_PART3_BASE + 0x0040,
53 	EXYNOS5_GPC3 = EXYNOS5420_GPIO_PART3_BASE + 0x0060,
54 	EXYNOS5_GPC4 = EXYNOS5420_GPIO_PART3_BASE + 0x0080,
55 
56 	EXYNOS5_GPD1 = EXYNOS5420_GPIO_PART3_BASE + 0x00a0,
57 
58 	EXYNOS5_GPY0 = EXYNOS5420_GPIO_PART3_BASE + 0x00c0,
59 	EXYNOS5_GPY1 = EXYNOS5420_GPIO_PART3_BASE + 0x00e0,
60 	EXYNOS5_GPY2 = EXYNOS5420_GPIO_PART3_BASE + 0x0100,
61 	EXYNOS5_GPY3 = EXYNOS5420_GPIO_PART3_BASE + 0x0120,
62 	EXYNOS5_GPY4 = EXYNOS5420_GPIO_PART3_BASE + 0x0140,
63 	EXYNOS5_GPY5 = EXYNOS5420_GPIO_PART3_BASE + 0x0160,
64 	EXYNOS5_GPY6 = EXYNOS5420_GPIO_PART3_BASE + 0x0180,
65 
66 	EXYNOS5_GPE0 = EXYNOS5420_GPIO_PART4_BASE + 0x0000,
67 	EXYNOS5_GPE1 = EXYNOS5420_GPIO_PART4_BASE + 0x0020,
68 
69 	EXYNOS5_GPF0 = EXYNOS5420_GPIO_PART4_BASE + 0x0040,
70 	EXYNOS5_GPF1 = EXYNOS5420_GPIO_PART4_BASE + 0x0060,
71 
72 	EXYNOS5_GPG0 = EXYNOS5420_GPIO_PART4_BASE + 0x0080,
73 	EXYNOS5_GPG1 = EXYNOS5420_GPIO_PART4_BASE + 0x00a0,
74 	EXYNOS5_GPG2 = EXYNOS5420_GPIO_PART4_BASE + 0x00c0,
75 
76 	EXYNOS5_GPJ4 = EXYNOS5420_GPIO_PART4_BASE + 0x00e0,
77 
78 	/* base == EXYNOS5420_GPIO_PART5_BASE */
79 	EXYNOS5_GPA0 = EXYNOS5420_GPIO_PART5_BASE + 0x0000,
80 	EXYNOS5_GPA1 = EXYNOS5420_GPIO_PART5_BASE + 0x0020,
81 	EXYNOS5_GPA2 = EXYNOS5420_GPIO_PART5_BASE + 0x0040,
82 
83 	EXYNOS5_GPB0 = EXYNOS5420_GPIO_PART5_BASE + 0x0060,
84 	EXYNOS5_GPB1 = EXYNOS5420_GPIO_PART5_BASE + 0x0080,
85 	EXYNOS5_GPB2 = EXYNOS5420_GPIO_PART5_BASE + 0x00a0,
86 	EXYNOS5_GPB3 = EXYNOS5420_GPIO_PART5_BASE + 0x00c0,
87 	EXYNOS5_GPB4 = EXYNOS5420_GPIO_PART5_BASE + 0x00e0,
88 
89 	EXYNOS5_GPH0 = EXYNOS5420_GPIO_PART5_BASE + 0x0100,
90 
91 	/* base == EXYNOS5420_GPIO_PART6_BASE */
92 	EXYNOS5_GPZ0 = EXYNOS5420_GPIO_PART6_BASE + 0x0000,
93 };
94 
95 enum {
96 	/* GPIO banks are split into this many parts */
97 	EXYNOS_GPIO_NUM_PARTS		= 6
98 };
99 
100 /* A list of valid GPIO numbers for the asm-generic/gpio.h interface */
101 enum exynos5_gpio_pin {
102 	/* GPIO_PART1_STARTS */
103 	GPIO_Y70,
104 	GPIO_Y71,
105 	GPIO_Y72,
106 	GPIO_Y73,
107 	GPIO_Y74,
108 	GPIO_Y75,
109 	GPIO_Y76,
110 	GPIO_Y77,
111 
112 	/* GPIO_PART2_STARTS */
113 	GPIO_MAX_PORT_PART_1,
114 	GPIO_X00 = GPIO_MAX_PORT_PART_1,	/* 0x08 */
115 	GPIO_X01,
116 	GPIO_X02,
117 	GPIO_X03,
118 	GPIO_X04,
119 	GPIO_X05,
120 	GPIO_X06,
121 	GPIO_X07,
122 	GPIO_X10,
123 	GPIO_X11,
124 	GPIO_X12,
125 	GPIO_X13,
126 	GPIO_X14,
127 	GPIO_X15,
128 	GPIO_X16,
129 	GPIO_X17,
130 	GPIO_X20,
131 	GPIO_X21,
132 	GPIO_X22,
133 	GPIO_X23,
134 	GPIO_X24,
135 	GPIO_X25,
136 	GPIO_X26,
137 	GPIO_X27,
138 	GPIO_X30,
139 	GPIO_X31,
140 	GPIO_X32,
141 	GPIO_X33,
142 	GPIO_X34,
143 	GPIO_X35,
144 	GPIO_X36,
145 	GPIO_X37,
146 
147 	/* GPIO_PART3_STARTS */
148 	GPIO_MAX_PORT_PART_2,
149 	GPIO_C00 = GPIO_MAX_PORT_PART_2,	/* 0x28 */
150 	GPIO_C01,
151 	GPIO_C02,
152 	GPIO_C03,
153 	GPIO_C04,
154 	GPIO_C05,
155 	GPIO_C06,
156 	GPIO_C07,
157 	GPIO_C10,
158 	GPIO_C11,
159 	GPIO_C12,
160 	GPIO_C13,
161 	GPIO_C14,
162 	GPIO_C15,
163 	GPIO_C16,
164 	GPIO_C17,
165 	GPIO_C20,
166 	GPIO_C21,
167 	GPIO_C22,
168 	GPIO_C23,
169 	GPIO_C24,
170 	GPIO_C25,
171 	GPIO_C26,
172 	GPIO_C27,
173 	GPIO_C30,
174 	GPIO_C31,
175 	GPIO_C32,
176 	GPIO_C33,
177 	GPIO_C34,
178 	GPIO_C35,
179 	GPIO_C36,
180 	GPIO_C37,
181 	GPIO_C40,
182 	GPIO_C41,
183 	GPIO_C42,
184 	GPIO_C43,
185 	GPIO_C44,
186 	GPIO_C45,
187 	GPIO_C46,
188 	GPIO_C47,
189 
190 	GPIO_D10,				/* 0x50 */
191 	GPIO_D11,
192 	GPIO_D12,
193 	GPIO_D13,
194 	GPIO_D14,
195 	GPIO_D15,
196 	GPIO_D16,
197 	GPIO_D17,
198 
199 	GPIO_Y00,				/* 0x58 */
200 	GPIO_Y01,
201 	GPIO_Y02,
202 	GPIO_Y03,
203 	GPIO_Y04,
204 	GPIO_Y05,
205 	GPIO_Y06,
206 	GPIO_Y07,
207 	GPIO_Y10,
208 	GPIO_Y11,
209 	GPIO_Y12,
210 	GPIO_Y13,
211 	GPIO_Y14,
212 	GPIO_Y15,
213 	GPIO_Y16,
214 	GPIO_Y17,
215 	GPIO_Y20,
216 	GPIO_Y21,
217 	GPIO_Y22,
218 	GPIO_Y23,
219 	GPIO_Y24,
220 	GPIO_Y25,
221 	GPIO_Y26,
222 	GPIO_Y27,
223 	GPIO_Y30,
224 	GPIO_Y31,
225 	GPIO_Y32,
226 	GPIO_Y33,
227 	GPIO_Y34,
228 	GPIO_Y35,
229 	GPIO_Y36,
230 	GPIO_Y37,
231 	GPIO_Y40,
232 	GPIO_Y41,
233 	GPIO_Y42,
234 	GPIO_Y43,
235 	GPIO_Y44,
236 	GPIO_Y45,
237 	GPIO_Y46,
238 	GPIO_Y47,
239 	GPIO_Y50,
240 	GPIO_Y51,
241 	GPIO_Y52,
242 	GPIO_Y53,
243 	GPIO_Y54,
244 	GPIO_Y55,
245 	GPIO_Y56,
246 	GPIO_Y57,
247 	GPIO_Y60,
248 	GPIO_Y61,
249 	GPIO_Y62,
250 	GPIO_Y63,
251 	GPIO_Y64,
252 	GPIO_Y65,
253 	GPIO_Y66,
254 	GPIO_Y67,
255 
256 	/* GPIO_PART4_STARTS */
257 	GPIO_MAX_PORT_PART_3,
258 	GPIO_E00 = GPIO_MAX_PORT_PART_3,	/* 0x90 */
259 	GPIO_E01,
260 	GPIO_E02,
261 	GPIO_E03,
262 	GPIO_E04,
263 	GPIO_E05,
264 	GPIO_E06,
265 	GPIO_E07,
266 	GPIO_E10,
267 	GPIO_E11,
268 	GPIO_E12,
269 	GPIO_E13,
270 	GPIO_E14,
271 	GPIO_E15,
272 	GPIO_E16,
273 	GPIO_E17,
274 
275 	GPIO_F00,				/* 0xa0 */
276 	GPIO_F01,
277 	GPIO_F02,
278 	GPIO_F03,
279 	GPIO_F04,
280 	GPIO_F05,
281 	GPIO_F06,
282 	GPIO_F07,
283 	GPIO_F10,
284 	GPIO_F11,
285 	GPIO_F12,
286 	GPIO_F13,
287 	GPIO_F14,
288 	GPIO_F15,
289 	GPIO_F16,
290 	GPIO_F17,
291 
292 	GPIO_G00,				/* 0xb0 */
293 	GPIO_G01,
294 	GPIO_G02,
295 	GPIO_G03,
296 	GPIO_G04,
297 	GPIO_G05,
298 	GPIO_G06,
299 	GPIO_G07,
300 	GPIO_G10,
301 	GPIO_G11,
302 	GPIO_G12,
303 	GPIO_G13,
304 	GPIO_G14,
305 	GPIO_G15,
306 	GPIO_G16,
307 	GPIO_G17,
308 	GPIO_G20,
309 	GPIO_G21,
310 	GPIO_G22,
311 	GPIO_G23,
312 	GPIO_G24,
313 	GPIO_G25,
314 	GPIO_G26,
315 	GPIO_G27,
316 
317 	GPIO_J40,				/* 0xc8 */
318 	GPIO_J41,
319 	GPIO_J42,
320 	GPIO_J43,
321 	GPIO_J44,
322 	GPIO_J45,
323 	GPIO_J46,
324 	GPIO_J47,
325 
326 	/* GPIO_PART5_STARTS */
327 	GPIO_MAX_PORT_PART_4,
328 	GPIO_A00 = GPIO_MAX_PORT_PART_4,	/* 0xd0 */
329 	GPIO_A01,
330 	GPIO_A02,
331 	GPIO_A03,
332 	GPIO_A04,
333 	GPIO_A05,
334 	GPIO_A06,
335 	GPIO_A07,
336 	GPIO_A10,
337 	GPIO_A11,
338 	GPIO_A12,
339 	GPIO_A13,
340 	GPIO_A14,
341 	GPIO_A15,
342 	GPIO_A16,
343 	GPIO_A17,
344 	GPIO_A20,
345 	GPIO_A21,
346 	GPIO_A22,
347 	GPIO_A23,
348 	GPIO_A24,
349 	GPIO_A25,
350 	GPIO_A26,
351 	GPIO_A27,
352 
353 	GPIO_B00,				/* 0xe8 */
354 	GPIO_B01,
355 	GPIO_B02,
356 	GPIO_B03,
357 	GPIO_B04,
358 	GPIO_B05,
359 	GPIO_B06,
360 	GPIO_B07,
361 	GPIO_B10,
362 	GPIO_B11,
363 	GPIO_B12,
364 	GPIO_B13,
365 	GPIO_B14,
366 	GPIO_B15,
367 	GPIO_B16,
368 	GPIO_B17,
369 	GPIO_B20,
370 	GPIO_B21,
371 	GPIO_B22,
372 	GPIO_B23,
373 	GPIO_B24,
374 	GPIO_B25,
375 	GPIO_B26,
376 	GPIO_B27,
377 	GPIO_B30,
378 	GPIO_B31,
379 	GPIO_B32,
380 	GPIO_B33,
381 	GPIO_B34,
382 	GPIO_B35,
383 	GPIO_B36,
384 	GPIO_B37,
385 	GPIO_B40,
386 	GPIO_B41,
387 	GPIO_B42,
388 	GPIO_B43,
389 	GPIO_B44,
390 	GPIO_B45,
391 	GPIO_B46,
392 	GPIO_B47,
393 
394 	GPIO_H00,				/* 0x110 */
395 	GPIO_H01,
396 	GPIO_H02,
397 	GPIO_H03,
398 	GPIO_H04,
399 	GPIO_H05,
400 	GPIO_H06,
401 	GPIO_H07,
402 
403 	/* GPIO_PART6_STARTS */
404 	GPIO_MAX_PORT_PART_5,
405 	GPIO_Z00 = GPIO_MAX_PORT_PART_5,	/* 0x118 */
406 	GPIO_Z01,
407 	GPIO_Z02,
408 	GPIO_Z03,
409 	GPIO_Z04,
410 	GPIO_Z05,
411 	GPIO_Z06,
412 	GPIO_Z07,
413 	GPIO_MAX_PORT
414 };
415 
416 /**
417  * Set GPIO pin configuration.
418  *
419  * @param gpio	GPIO pin
420  * @param cfg	Either GPIO_INPUT, GPIO_OUTPUT, or GPIO_IRQ
421  */
422 void gpio_cfg_pin(int gpio, int cfg);
423 
424 /**
425  * Set GPIO pull mode.
426  *
427  * @param gpio	GPIO pin
428  * @param mode	Either GPIO_PULL_DOWN or GPIO_PULL_UP
429  */
430 void gpio_set_pull(int gpio, int mode);
431 
432 /**
433  * Set GPIO drive strength level.
434  *
435  * @param gpio	GPIO pin
436  * @param mode	Either GPIO_DRV_1X, GPIO_DRV_2X, GPIO_DRV_3X, or GPIO_DRV_4X
437  */
438 void gpio_set_drv(int gpio, int mode);
439 
440 /**
441  * Set GPIO drive rate.
442  *
443  * @param gpio	GPIO pin
444  * @param mode	Either GPIO_DRV_FAST or GPIO_DRV_SLOW
445  */
446 void gpio_set_rate(int gpio, int mode);
447 
448 /*
449  * reads only a single GPIO
450  *
451  * @param gpio		GPIO to read
452  * @return -1 if the value cannot be determined. Otherwise returns
453  *              the corresponding MVL3 enum value.
454  */
455 int gpio_read_mvl3(unsigned int gpio);
456 
457 void gpio_info(void);
458 
459 /*
460  * Generic GPIO API for U-Boot
461  *
462  * GPIOs are numbered from 0 to GPIO_COUNT-1 which value is defined
463  * by the SOC/architecture.
464  *
465  * Each GPIO can be an input or output. If an input then its value can
466  * be read as 0 or 1. If an output then its value can be set to 0 or 1.
467  * If you try to write an input then the value is undefined. If you try
468  * to read an output, barring something very unusual,  you will get
469  * back the value of the output that you previously set.
470  *
471  * In some cases the operation may fail, for example if the GPIO number
472  * is out of range, or the GPIO is not available because its pin is
473  * being used by another function. In that case, functions may return
474  * an error value of -1.
475  */
476 
477 /**
478  * Make a GPIO an input.
479  *
480  * @param gpio	GPIO number
481  * @return 0 if ok, -1 on error
482  */
483 int gpio_direction_input(unsigned int gpio);
484 
485 /**
486  * Make a GPIO an output, and set its value.
487  *
488  * @param gpio	GPIO number
489  * @param value	GPIO value (0 for low or 1 for high)
490  * @return 0 if ok, -1 on error
491  */
492 int gpio_direction_output(unsigned int gpio, int value);
493 
494 /**
495  * Get a GPIO's value. This will work whether the GPIO is an input
496  * or an output.
497  *
498  * @param gpio	GPIO number
499  * @return 0 if low, 1 if high, -1 on error
500  */
501 int gpio_get_value(unsigned int gpio);
502 
503 /**
504  * Set an output GPIO's value. The GPIO must already be an output or
505  * this function may have no effect.
506  *
507  * @param gpio	GPIO number
508  * @param value	GPIO value (0 for low or 1 for high)
509  * @return 0 if ok, -1 on error
510  */
511 int gpio_set_value(unsigned int gpio, int value);
512 
513 /*
514  * Many-value logic (3 states). This can be used for inputs whereby presence
515  * of external pull-up or pull-down resistors can be added to overcome internal
516  * pull-ups/pull-downs and force a single value.
517  *
518  * Thus, external pull resistors can force a 0 or 1 and if the value changes
519  * along with internal pull-up/down enable then the input is floating.
520  *
521  *     Vpd | Vpu | MVL
522  *    -----------------
523  *      0  |  0  | 0
524  *    -----------------
525  *      0  |  1  | Z    <-- floating input will follow internal pull up/down
526  *    -----------------
527  *      1  |  1  | 1
528  */
529 enum mvl3 {
530 	LOGIC_0,
531 	LOGIC_1,
532 	LOGIC_Z,		/* high impedance / tri-stated / floating */
533 };
534 
535 #endif	/* CPU_SAMSUNG_EXYNOS5420_GPIO_H */
536