xref: /aosp_15_r20/external/coreboot/src/soc/samsung/exynos5250/include/soc/gpio.h (revision b9411a12aaaa7e1e6a6fb7c5e057f44ee179a49c)
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 
3 #ifndef CPU_SAMSUNG_EXYNOS5250_GPIO_H
4 #define CPU_SAMSUNG_EXYNOS5250_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_GPA0 = EXYNOS5_GPIO_PART1_BASE + 0x0000,
44 	EXYNOS5_GPA1 = EXYNOS5_GPIO_PART1_BASE + 0x0020,
45 	EXYNOS5_GPA2 = EXYNOS5_GPIO_PART1_BASE + 0x0040,
46 
47 	EXYNOS5_GPB0 = EXYNOS5_GPIO_PART1_BASE + 0x0060,
48 	EXYNOS5_GPB1 = EXYNOS5_GPIO_PART1_BASE + 0x0080,
49 	EXYNOS5_GPB2 = EXYNOS5_GPIO_PART1_BASE + 0x00a0,
50 	EXYNOS5_GPB3 = EXYNOS5_GPIO_PART1_BASE + 0x00c0,
51 
52 	EXYNOS5_GPC0 = EXYNOS5_GPIO_PART1_BASE + 0x00e0,
53 	EXYNOS5_GPC1 = EXYNOS5_GPIO_PART1_BASE + 0x0100,
54 	EXYNOS5_GPC2 = EXYNOS5_GPIO_PART1_BASE + 0x0120,
55 	EXYNOS5_GPC3 = EXYNOS5_GPIO_PART1_BASE + 0x0140,
56 
57 	EXYNOS5_GPD0 = EXYNOS5_GPIO_PART1_BASE + 0x0160,
58 	EXYNOS5_GPD1 = EXYNOS5_GPIO_PART1_BASE + 0x0180,
59 
60 	EXYNOS5_GPY0 = EXYNOS5_GPIO_PART1_BASE + 0x01a0,
61 	EXYNOS5_GPY1 = EXYNOS5_GPIO_PART1_BASE + 0x01c0,
62 	EXYNOS5_GPY2 = EXYNOS5_GPIO_PART1_BASE + 0x01e0,
63 	EXYNOS5_GPY3 = EXYNOS5_GPIO_PART1_BASE + 0x0200,
64 	EXYNOS5_GPY4 = EXYNOS5_GPIO_PART1_BASE + 0x0220,
65 	EXYNOS5_GPY5 = EXYNOS5_GPIO_PART1_BASE + 0x0240,
66 	EXYNOS5_GPY6 = EXYNOS5_GPIO_PART1_BASE + 0x0260,
67 
68 	EXYNOS5_GPX0 = EXYNOS5_GPIO_PART2_BASE + 0x0000,
69 	EXYNOS5_GPX1 = EXYNOS5_GPIO_PART2_BASE + 0x0020,
70 	EXYNOS5_GPX2 = EXYNOS5_GPIO_PART2_BASE + 0x0040,
71 	EXYNOS5_GPX3 = EXYNOS5_GPIO_PART2_BASE + 0x0060,
72 
73 	EXYNOS5_GPE0 = EXYNOS5_GPIO_PART3_BASE + 0x0000,
74 	EXYNOS5_GPE1 = EXYNOS5_GPIO_PART3_BASE + 0x0020,
75 
76 	EXYNOS5_GPF0 = EXYNOS5_GPIO_PART3_BASE + 0x0040,
77 	EXYNOS5_GPF1 = EXYNOS5_GPIO_PART3_BASE + 0x0060,
78 
79 	EXYNOS5_GPG0 = EXYNOS5_GPIO_PART3_BASE + 0x0080,
80 	EXYNOS5_GPG1 = EXYNOS5_GPIO_PART3_BASE + 0x00a0,
81 	EXYNOS5_GPG2 = EXYNOS5_GPIO_PART3_BASE + 0x00c0,
82 
83 	EXYNOS5_GPH0 = EXYNOS5_GPIO_PART3_BASE + 0x00e0,
84 	EXYNOS5_GPH1 = EXYNOS5_GPIO_PART3_BASE + 0x0100,
85 
86 	EXYNOS5_GPV0 = EXYNOS5_GPIO_PART4_BASE + 0x0000,
87 	EXYNOS5_GPV1 = EXYNOS5_GPIO_PART4_BASE + 0x0020,
88 	EXYNOS5_GPV2 = EXYNOS5_GPIO_PART4_BASE + 0x0060,
89 	EXYNOS5_GPV3 = EXYNOS5_GPIO_PART4_BASE + 0x0080,
90 
91 	EXYNOS5_GPV4 = EXYNOS5_GPIO_PART5_BASE + 0x0000,
92 
93 	EXYNOS5_GPZ = EXYNOS5_GPIO_PART6_BASE + 0x0000,
94 };
95 
96 enum {
97 	/* GPIO banks are split into this many parts */
98 	EXYNOS_GPIO_NUM_PARTS		= 6
99 };
100 
101 /* A list of valid GPIO numbers for the asm-generic/gpio.h interface */
102 enum exynos5_gpio_pin {
103 	/* GPIO_PART1_STARTS */
104 	GPIO_A00,
105 	GPIO_A01,
106 	GPIO_A02,
107 	GPIO_A03,
108 	GPIO_A04,
109 	GPIO_A05,
110 	GPIO_A06,
111 	GPIO_A07,
112 	GPIO_A10,
113 	GPIO_A11,
114 	GPIO_A12,
115 	GPIO_A13,
116 	GPIO_A14,
117 	GPIO_A15,
118 	GPIO_A16,
119 	GPIO_A17,
120 	GPIO_A20,
121 	GPIO_A21,
122 	GPIO_A22,
123 	GPIO_A23,
124 	GPIO_A24,
125 	GPIO_A25,
126 	GPIO_A26,
127 	GPIO_A27,
128 	GPIO_B00,				/* 0x18 */
129 	GPIO_B01,
130 	GPIO_B02,
131 	GPIO_B03,
132 	GPIO_B04,
133 	GPIO_B05,
134 	GPIO_B06,
135 	GPIO_B07,
136 	GPIO_B10,
137 	GPIO_B11,
138 	GPIO_B12,
139 	GPIO_B13,
140 	GPIO_B14,
141 	GPIO_B15,
142 	GPIO_B16,
143 	GPIO_B17,
144 	GPIO_B20,
145 	GPIO_B21,
146 	GPIO_B22,
147 	GPIO_B23,
148 	GPIO_B24,
149 	GPIO_B25,
150 	GPIO_B26,
151 	GPIO_B27,
152 	GPIO_B30,
153 	GPIO_B31,
154 	GPIO_B32,
155 	GPIO_B33,
156 	GPIO_B34,
157 	GPIO_B35,
158 	GPIO_B36,
159 	GPIO_B37,
160 	GPIO_C00,				/* 0x38 */
161 	GPIO_C01,
162 	GPIO_C02,
163 	GPIO_C03,
164 	GPIO_C04,
165 	GPIO_C05,
166 	GPIO_C06,
167 	GPIO_C07,
168 	GPIO_C10,
169 	GPIO_C11,
170 	GPIO_C12,
171 	GPIO_C13,
172 	GPIO_C14,
173 	GPIO_C15,
174 	GPIO_C16,
175 	GPIO_C17,
176 	GPIO_C20,
177 	GPIO_C21,
178 	GPIO_C22,
179 	GPIO_C23,
180 	GPIO_C24,
181 	GPIO_C25,
182 	GPIO_C26,
183 	GPIO_C27,
184 	GPIO_C30,
185 	GPIO_C31,
186 	GPIO_C32,
187 	GPIO_C33,
188 	GPIO_C34,
189 	GPIO_C35,
190 	GPIO_C36,
191 	GPIO_C37,
192 	GPIO_D00,				/* 0x58 */
193 	GPIO_D01,
194 	GPIO_D02,
195 	GPIO_D03,
196 	GPIO_D04,
197 	GPIO_D05,
198 	GPIO_D06,
199 	GPIO_D07,
200 	GPIO_D10,
201 	GPIO_D11,
202 	GPIO_D12,
203 	GPIO_D13,
204 	GPIO_D14,
205 	GPIO_D15,
206 	GPIO_D16,
207 	GPIO_D17,
208 	GPIO_Y00,				/* 0x68 */
209 	GPIO_Y01,
210 	GPIO_Y02,
211 	GPIO_Y03,
212 	GPIO_Y04,
213 	GPIO_Y05,
214 	GPIO_Y06,
215 	GPIO_Y07,
216 	GPIO_Y10,
217 	GPIO_Y11,
218 	GPIO_Y12,
219 	GPIO_Y13,
220 	GPIO_Y14,
221 	GPIO_Y15,
222 	GPIO_Y16,
223 	GPIO_Y17,
224 	GPIO_Y20,
225 	GPIO_Y21,
226 	GPIO_Y22,
227 	GPIO_Y23,
228 	GPIO_Y24,
229 	GPIO_Y25,
230 	GPIO_Y26,
231 	GPIO_Y27,
232 	GPIO_Y30,
233 	GPIO_Y31,
234 	GPIO_Y32,
235 	GPIO_Y33,
236 	GPIO_Y34,
237 	GPIO_Y35,
238 	GPIO_Y36,
239 	GPIO_Y37,
240 	GPIO_Y40,
241 	GPIO_Y41,
242 	GPIO_Y42,
243 	GPIO_Y43,
244 	GPIO_Y44,
245 	GPIO_Y45,
246 	GPIO_Y46,
247 	GPIO_Y47,
248 	GPIO_Y50,
249 	GPIO_Y51,
250 	GPIO_Y52,
251 	GPIO_Y53,
252 	GPIO_Y54,
253 	GPIO_Y55,
254 	GPIO_Y56,
255 	GPIO_Y57,
256 	GPIO_Y60,
257 	GPIO_Y61,
258 	GPIO_Y62,
259 	GPIO_Y63,
260 	GPIO_Y64,
261 	GPIO_Y65,
262 	GPIO_Y66,
263 	GPIO_Y67,
264 
265 	/* GPIO_PART2_STARTS */
266 	GPIO_MAX_PORT_PART_1,
267 	GPIO_X00 = GPIO_MAX_PORT_PART_1,	/* 0xa0 */
268 	GPIO_X01,
269 	GPIO_X02,
270 	GPIO_X03,
271 	GPIO_X04,
272 	GPIO_X05,
273 	GPIO_X06,
274 	GPIO_X07,
275 	GPIO_X10,
276 	GPIO_X11,
277 	GPIO_X12,
278 	GPIO_X13,
279 	GPIO_X14,
280 	GPIO_X15,
281 	GPIO_X16,
282 	GPIO_X17,
283 	GPIO_X20,
284 	GPIO_X21,
285 	GPIO_X22,
286 	GPIO_X23,
287 	GPIO_X24,
288 	GPIO_X25,
289 	GPIO_X26,
290 	GPIO_X27,
291 	GPIO_X30,
292 	GPIO_X31,
293 	GPIO_X32,
294 	GPIO_X33,
295 	GPIO_X34,
296 	GPIO_X35,
297 	GPIO_X36,
298 	GPIO_X37,
299 
300 	/* GPIO_PART3_STARTS */
301 	GPIO_MAX_PORT_PART_2,
302 	GPIO_E00 = GPIO_MAX_PORT_PART_2,	/* 0xc0 */
303 	GPIO_E01,
304 	GPIO_E02,
305 	GPIO_E03,
306 	GPIO_E04,
307 	GPIO_E05,
308 	GPIO_E06,
309 	GPIO_E07,
310 	GPIO_E10,
311 	GPIO_E11,
312 	GPIO_E12,
313 	GPIO_E13,
314 	GPIO_E14,
315 	GPIO_E15,
316 	GPIO_E16,
317 	GPIO_E17,
318 	GPIO_F00,				/* 0xd0 */
319 	GPIO_F01,
320 	GPIO_F02,
321 	GPIO_F03,
322 	GPIO_F04,
323 	GPIO_F05,
324 	GPIO_F06,
325 	GPIO_F07,
326 	GPIO_F10,
327 	GPIO_F11,
328 	GPIO_F12,
329 	GPIO_F13,
330 	GPIO_F14,
331 	GPIO_F15,
332 	GPIO_F16,
333 	GPIO_F17,
334 	GPIO_G00,
335 	GPIO_G01,
336 	GPIO_G02,
337 	GPIO_G03,
338 	GPIO_G04,
339 	GPIO_G05,
340 	GPIO_G06,
341 	GPIO_G07,
342 	GPIO_G10,
343 	GPIO_G11,
344 	GPIO_G12,
345 	GPIO_G13,
346 	GPIO_G14,
347 	GPIO_G15,
348 	GPIO_G16,
349 	GPIO_G17,
350 	GPIO_G20,
351 	GPIO_G21,
352 	GPIO_G22,
353 	GPIO_G23,
354 	GPIO_G24,
355 	GPIO_G25,
356 	GPIO_G26,
357 	GPIO_G27,
358 	GPIO_H00,
359 	GPIO_H01,
360 	GPIO_H02,
361 	GPIO_H03,
362 	GPIO_H04,
363 	GPIO_H05,
364 	GPIO_H06,
365 	GPIO_H07,
366 	GPIO_H10,
367 	GPIO_H11,
368 	GPIO_H12,
369 	GPIO_H13,
370 	GPIO_H14,
371 	GPIO_H15,
372 	GPIO_H16,
373 	GPIO_H17,
374 
375 	/* GPIO_PART4_STARTS */
376 	GPIO_MAX_PORT_PART_3,
377 	GPIO_V00 = GPIO_MAX_PORT_PART_3,
378 	GPIO_V01,
379 	GPIO_V02,
380 	GPIO_V03,
381 	GPIO_V04,
382 	GPIO_V05,
383 	GPIO_V06,
384 	GPIO_V07,
385 	GPIO_V10,
386 	GPIO_V11,
387 	GPIO_V12,
388 	GPIO_V13,
389 	GPIO_V14,
390 	GPIO_V15,
391 	GPIO_V16,
392 	GPIO_V17,
393 	GPIO_V20,
394 	GPIO_V21,
395 	GPIO_V22,
396 	GPIO_V23,
397 	GPIO_V24,
398 	GPIO_V25,
399 	GPIO_V26,
400 	GPIO_V27,
401 	GPIO_V30,
402 	GPIO_V31,
403 	GPIO_V32,
404 	GPIO_V33,
405 	GPIO_V34,
406 	GPIO_V35,
407 	GPIO_V36,
408 	GPIO_V37,
409 
410 	/* GPIO_PART5_STARTS */
411 	GPIO_MAX_PORT_PART_4,
412 	GPIO_V40 = GPIO_MAX_PORT_PART_4,
413 	GPIO_V41,
414 	GPIO_V42,
415 	GPIO_V43,
416 	GPIO_V44,
417 	GPIO_V45,
418 	GPIO_V46,
419 	GPIO_V47,
420 
421 	/* GPIO_PART6_STARTS */
422 	GPIO_MAX_PORT_PART_5,
423 	GPIO_Z0 = GPIO_MAX_PORT_PART_5,
424 	GPIO_Z1,
425 	GPIO_Z2,
426 	GPIO_Z3,
427 	GPIO_Z4,
428 	GPIO_Z5,
429 	GPIO_Z6,
430 	GPIO_MAX_PORT
431 };
432 
433 /**
434  * Set GPIO pin configuration.
435  *
436  * @param gpio	GPIO pin
437  * @param cfg	Either GPIO_INPUT, GPIO_OUTPUT, or GPIO_IRQ
438  */
439 void gpio_cfg_pin(int gpio, int cfg);
440 
441 /**
442  * Set GPIO pull mode.
443  *
444  * @param gpio	GPIO pin
445  * @param mode	Either GPIO_PULL_DOWN or GPIO_PULL_UP
446  */
447 void gpio_set_pull(int gpio, int mode);
448 
449 /**
450  * Set GPIO drive strength level.
451  *
452  * @param gpio	GPIO pin
453  * @param mode	Either GPIO_DRV_1X, GPIO_DRV_2X, GPIO_DRV_3X, or GPIO_DRV_4X
454  */
455 void gpio_set_drv(int gpio, int mode);
456 
457 /**
458  * Set GPIO drive rate.
459  *
460  * @param gpio	GPIO pin
461  * @param mode	Either GPIO_DRV_FAST or GPIO_DRV_SLOW
462  */
463 void gpio_set_rate(int gpio, int mode);
464 
465 /*
466  * reads only a single GPIO
467  *
468  * @param gpio		GPIO to read
469  * @return -1 if the value cannot be determined. Otherwise returns
470  *              the corresponding MVL3 enum value.
471  */
472 int gpio_read_mvl3(unsigned int gpio);
473 
474 void gpio_info(void);
475 
476 /*
477  * Generic GPIO API for U-Boot
478  *
479  * GPIOs are numbered from 0 to GPIO_COUNT-1 which value is defined
480  * by the SOC/architecture.
481  *
482  * Each GPIO can be an input or output. If an input then its value can
483  * be read as 0 or 1. If an output then its value can be set to 0 or 1.
484  * If you try to write an input then the value is undefined. If you try
485  * to read an output, barring something very unusual,  you will get
486  * back the value of the output that you previously set.
487  *
488  * In some cases the operation may fail, for example if the GPIO number
489  * is out of range, or the GPIO is not available because its pin is
490  * being used by another function. In that case, functions may return
491  * an error value of -1.
492  */
493 
494 /**
495  * Make a GPIO an input.
496  *
497  * @param gpio	GPIO number
498  * @return 0 if ok, -1 on error
499  */
500 int gpio_direction_input(unsigned int gpio);
501 
502 /**
503  * Make a GPIO an output, and set its value.
504  *
505  * @param gpio	GPIO number
506  * @param value	GPIO value (0 for low or 1 for high)
507  * @return 0 if ok, -1 on error
508  */
509 int gpio_direction_output(unsigned int gpio, int value);
510 
511 /**
512  * Get a GPIO's value. This will work whether the GPIO is an input
513  * or an output.
514  *
515  * @param gpio	GPIO number
516  * @return 0 if low, 1 if high, -1 on error
517  */
518 int gpio_get_value(unsigned int gpio);
519 
520 /**
521  * Set an output GPIO's value. The GPIO must already be an output or
522  * this function may have no effect.
523  *
524  * @param gpio	GPIO number
525  * @param value	GPIO value (0 for low or 1 for high)
526  * @return 0 if ok, -1 on error
527  */
528 int gpio_set_value(unsigned int gpio, int value);
529 
530 /*
531  * Many-value logic (3 states). This can be used for inputs whereby presence
532  * of external pull-up or pull-down resistors can be added to overcome internal
533  * pull-ups/pull-downs and force a single value.
534  *
535  * Thus, external pull resistors can force a 0 or 1 and if the value changes
536  * along with internal pull-up/down enable then the input is floating.
537  *
538  *     Vpd | Vpu | MVL
539  *    -----------------
540  *      0  |  0  | 0
541  *    -----------------
542  *      0  |  1  | Z    <-- floating input will follow internal pull up/down
543  *    -----------------
544  *      1  |  1  | 1
545  */
546 enum mvl3 {
547 	LOGIC_0,
548 	LOGIC_1,
549 	LOGIC_Z,		/* high impedance / tri-stated / floating */
550 };
551 
552 #endif	/* CPU_SAMSUNG_EXYNOS5250_GPIO_H */
553