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