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