1 /* 2 * Copyright (c) 2012 Samsung Electronics. 3 * Abhilash Kesavan <a.kesavan@samsung.com> 4 * 5 * SPDX-License-Identifier: GPL-2.0+ 6 */ 7 8 #include <common.h> 9 #include <fdtdec.h> 10 #include <asm/gpio.h> 11 #include <asm/arch/pinmux.h> 12 #include <asm/arch/sromc.h> 13 14 static void exynos5_uart_config(int peripheral) 15 { 16 int i, start, count; 17 18 switch (peripheral) { 19 case PERIPH_ID_UART0: 20 start = EXYNOS5_GPIO_A00; 21 count = 4; 22 break; 23 case PERIPH_ID_UART1: 24 start = EXYNOS5_GPIO_D00; 25 count = 4; 26 break; 27 case PERIPH_ID_UART2: 28 start = EXYNOS5_GPIO_A10; 29 count = 4; 30 break; 31 case PERIPH_ID_UART3: 32 start = EXYNOS5_GPIO_A14; 33 count = 2; 34 break; 35 default: 36 debug("%s: invalid peripheral %d", __func__, peripheral); 37 return; 38 } 39 for (i = start; i < start + count; i++) { 40 gpio_set_pull(i, S5P_GPIO_PULL_NONE); 41 gpio_cfg_pin(i, S5P_GPIO_FUNC(0x2)); 42 } 43 } 44 45 static void exynos5420_uart_config(int peripheral) 46 { 47 int i, start, count; 48 49 switch (peripheral) { 50 case PERIPH_ID_UART0: 51 start = EXYNOS5420_GPIO_A00; 52 count = 4; 53 break; 54 case PERIPH_ID_UART1: 55 start = EXYNOS5420_GPIO_A04; 56 count = 4; 57 break; 58 case PERIPH_ID_UART2: 59 start = EXYNOS5420_GPIO_A10; 60 count = 4; 61 break; 62 case PERIPH_ID_UART3: 63 start = EXYNOS5420_GPIO_A14; 64 count = 2; 65 break; 66 default: 67 debug("%s: invalid peripheral %d", __func__, peripheral); 68 return; 69 } 70 71 for (i = start; i < start + count; i++) { 72 gpio_set_pull(i, S5P_GPIO_PULL_NONE); 73 gpio_cfg_pin(i, S5P_GPIO_FUNC(0x2)); 74 } 75 } 76 77 static int exynos5_mmc_config(int peripheral, int flags) 78 { 79 int i, start, start_ext, gpio_func = 0; 80 81 switch (peripheral) { 82 case PERIPH_ID_SDMMC0: 83 start = EXYNOS5_GPIO_C00; 84 start_ext = EXYNOS5_GPIO_C10; 85 gpio_func = S5P_GPIO_FUNC(0x2); 86 break; 87 case PERIPH_ID_SDMMC1: 88 start = EXYNOS5_GPIO_C20; 89 start_ext = 0; 90 break; 91 case PERIPH_ID_SDMMC2: 92 start = EXYNOS5_GPIO_C30; 93 start_ext = EXYNOS5_GPIO_C43; 94 gpio_func = S5P_GPIO_FUNC(0x3); 95 break; 96 case PERIPH_ID_SDMMC3: 97 start = EXYNOS5_GPIO_C40; 98 start_ext = 0; 99 break; 100 default: 101 debug("%s: invalid peripheral %d", __func__, peripheral); 102 return -1; 103 } 104 if ((flags & PINMUX_FLAG_8BIT_MODE) && !start_ext) { 105 debug("SDMMC device %d does not support 8bit mode", 106 peripheral); 107 return -1; 108 } 109 if (flags & PINMUX_FLAG_8BIT_MODE) { 110 for (i = start_ext; i <= (start_ext + 3); i++) { 111 gpio_cfg_pin(i, gpio_func); 112 gpio_set_pull(i, S5P_GPIO_PULL_UP); 113 gpio_set_drv(i, S5P_GPIO_DRV_4X); 114 } 115 } 116 for (i = start; i < (start + 2); i++) { 117 gpio_cfg_pin(i, S5P_GPIO_FUNC(0x2)); 118 gpio_set_pull(i, S5P_GPIO_PULL_NONE); 119 gpio_set_drv(i, S5P_GPIO_DRV_4X); 120 } 121 for (i = (start + 3); i <= (start + 6); i++) { 122 gpio_cfg_pin(i, S5P_GPIO_FUNC(0x2)); 123 gpio_set_pull(i, S5P_GPIO_PULL_UP); 124 gpio_set_drv(i, S5P_GPIO_DRV_4X); 125 } 126 127 return 0; 128 } 129 130 static int exynos5420_mmc_config(int peripheral, int flags) 131 { 132 int i, start = 0, start_ext = 0; 133 134 switch (peripheral) { 135 case PERIPH_ID_SDMMC0: 136 start = EXYNOS5420_GPIO_C00; 137 start_ext = EXYNOS5420_GPIO_C30; 138 break; 139 case PERIPH_ID_SDMMC1: 140 start = EXYNOS5420_GPIO_C10; 141 start_ext = EXYNOS5420_GPIO_D14; 142 break; 143 case PERIPH_ID_SDMMC2: 144 start = EXYNOS5420_GPIO_C20; 145 start_ext = 0; 146 break; 147 default: 148 start = 0; 149 debug("%s: invalid peripheral %d", __func__, peripheral); 150 return -1; 151 } 152 153 if ((flags & PINMUX_FLAG_8BIT_MODE) && !start_ext) { 154 debug("SDMMC device %d does not support 8bit mode", 155 peripheral); 156 return -1; 157 } 158 159 if (flags & PINMUX_FLAG_8BIT_MODE) { 160 for (i = start_ext; i <= (start_ext + 3); i++) { 161 gpio_cfg_pin(i, S5P_GPIO_FUNC(0x2)); 162 gpio_set_pull(i, S5P_GPIO_PULL_UP); 163 gpio_set_drv(i, S5P_GPIO_DRV_4X); 164 } 165 } 166 167 for (i = start; i < (start + 3); i++) { 168 /* 169 * MMC0 is intended to be used for eMMC. The 170 * card detect pin is used as a VDDEN signal to 171 * power on the eMMC. The 5420 iROM makes 172 * this same assumption. 173 */ 174 if ((peripheral == PERIPH_ID_SDMMC0) && (i == (start + 2))) { 175 #ifndef CONFIG_SPL_BUILD 176 gpio_request(i, "sdmmc0_vdden"); 177 #endif 178 gpio_set_value(i, 1); 179 gpio_cfg_pin(i, S5P_GPIO_OUTPUT); 180 } else { 181 gpio_cfg_pin(i, S5P_GPIO_FUNC(0x2)); 182 } 183 gpio_set_pull(i, S5P_GPIO_PULL_NONE); 184 gpio_set_drv(i, S5P_GPIO_DRV_4X); 185 } 186 187 for (i = (start + 3); i <= (start + 6); i++) { 188 gpio_cfg_pin(i, S5P_GPIO_FUNC(0x2)); 189 gpio_set_pull(i, S5P_GPIO_PULL_UP); 190 gpio_set_drv(i, S5P_GPIO_DRV_4X); 191 } 192 193 return 0; 194 } 195 196 static void exynos5_sromc_config(int flags) 197 { 198 int i; 199 200 /* 201 * SROM:CS1 and EBI 202 * 203 * GPY0[0] SROM_CSn[0] 204 * GPY0[1] SROM_CSn[1](2) 205 * GPY0[2] SROM_CSn[2] 206 * GPY0[3] SROM_CSn[3] 207 * GPY0[4] EBI_OEn(2) 208 * GPY0[5] EBI_EEn(2) 209 * 210 * GPY1[0] EBI_BEn[0](2) 211 * GPY1[1] EBI_BEn[1](2) 212 * GPY1[2] SROM_WAIT(2) 213 * GPY1[3] EBI_DATA_RDn(2) 214 */ 215 gpio_cfg_pin(EXYNOS5_GPIO_Y00 + (flags & PINMUX_FLAG_BANK), 216 S5P_GPIO_FUNC(2)); 217 gpio_cfg_pin(EXYNOS5_GPIO_Y04, S5P_GPIO_FUNC(2)); 218 gpio_cfg_pin(EXYNOS5_GPIO_Y05, S5P_GPIO_FUNC(2)); 219 220 for (i = 0; i < 4; i++) 221 gpio_cfg_pin(EXYNOS5_GPIO_Y10 + i, S5P_GPIO_FUNC(2)); 222 223 /* 224 * EBI: 8 Addrss Lines 225 * 226 * GPY3[0] EBI_ADDR[0](2) 227 * GPY3[1] EBI_ADDR[1](2) 228 * GPY3[2] EBI_ADDR[2](2) 229 * GPY3[3] EBI_ADDR[3](2) 230 * GPY3[4] EBI_ADDR[4](2) 231 * GPY3[5] EBI_ADDR[5](2) 232 * GPY3[6] EBI_ADDR[6](2) 233 * GPY3[7] EBI_ADDR[7](2) 234 * 235 * EBI: 16 Data Lines 236 * 237 * GPY5[0] EBI_DATA[0](2) 238 * GPY5[1] EBI_DATA[1](2) 239 * GPY5[2] EBI_DATA[2](2) 240 * GPY5[3] EBI_DATA[3](2) 241 * GPY5[4] EBI_DATA[4](2) 242 * GPY5[5] EBI_DATA[5](2) 243 * GPY5[6] EBI_DATA[6](2) 244 * GPY5[7] EBI_DATA[7](2) 245 * 246 * GPY6[0] EBI_DATA[8](2) 247 * GPY6[1] EBI_DATA[9](2) 248 * GPY6[2] EBI_DATA[10](2) 249 * GPY6[3] EBI_DATA[11](2) 250 * GPY6[4] EBI_DATA[12](2) 251 * GPY6[5] EBI_DATA[13](2) 252 * GPY6[6] EBI_DATA[14](2) 253 * GPY6[7] EBI_DATA[15](2) 254 */ 255 for (i = 0; i < 8; i++) { 256 gpio_cfg_pin(EXYNOS5_GPIO_Y30 + i, S5P_GPIO_FUNC(2)); 257 gpio_set_pull(EXYNOS5_GPIO_Y30 + i, S5P_GPIO_PULL_UP); 258 259 gpio_cfg_pin(EXYNOS5_GPIO_Y50 + i, S5P_GPIO_FUNC(2)); 260 gpio_set_pull(EXYNOS5_GPIO_Y50 + i, S5P_GPIO_PULL_UP); 261 262 gpio_cfg_pin(EXYNOS5_GPIO_Y60 + i, S5P_GPIO_FUNC(2)); 263 gpio_set_pull(EXYNOS5_GPIO_Y60 + i, S5P_GPIO_PULL_UP); 264 } 265 } 266 267 static void exynos5_i2c_config(int peripheral, int flags) 268 { 269 int func01, func23; 270 271 /* High-Speed I2C */ 272 if (flags & PINMUX_FLAG_HS_MODE) { 273 func01 = 4; 274 func23 = 4; 275 } else { 276 func01 = 2; 277 func23 = 3; 278 } 279 280 switch (peripheral) { 281 case PERIPH_ID_I2C0: 282 gpio_cfg_pin(EXYNOS5_GPIO_B30, S5P_GPIO_FUNC(func01)); 283 gpio_cfg_pin(EXYNOS5_GPIO_B31, S5P_GPIO_FUNC(func01)); 284 break; 285 case PERIPH_ID_I2C1: 286 gpio_cfg_pin(EXYNOS5_GPIO_B32, S5P_GPIO_FUNC(func01)); 287 gpio_cfg_pin(EXYNOS5_GPIO_B33, S5P_GPIO_FUNC(func01)); 288 break; 289 case PERIPH_ID_I2C2: 290 gpio_cfg_pin(EXYNOS5_GPIO_A06, S5P_GPIO_FUNC(func23)); 291 gpio_cfg_pin(EXYNOS5_GPIO_A07, S5P_GPIO_FUNC(func23)); 292 break; 293 case PERIPH_ID_I2C3: 294 gpio_cfg_pin(EXYNOS5_GPIO_A12, S5P_GPIO_FUNC(func23)); 295 gpio_cfg_pin(EXYNOS5_GPIO_A13, S5P_GPIO_FUNC(func23)); 296 break; 297 case PERIPH_ID_I2C4: 298 gpio_cfg_pin(EXYNOS5_GPIO_A20, S5P_GPIO_FUNC(0x3)); 299 gpio_cfg_pin(EXYNOS5_GPIO_A21, S5P_GPIO_FUNC(0x3)); 300 break; 301 case PERIPH_ID_I2C5: 302 gpio_cfg_pin(EXYNOS5_GPIO_A22, S5P_GPIO_FUNC(0x3)); 303 gpio_cfg_pin(EXYNOS5_GPIO_A23, S5P_GPIO_FUNC(0x3)); 304 break; 305 case PERIPH_ID_I2C6: 306 gpio_cfg_pin(EXYNOS5_GPIO_B13, S5P_GPIO_FUNC(0x4)); 307 gpio_cfg_pin(EXYNOS5_GPIO_B14, S5P_GPIO_FUNC(0x4)); 308 break; 309 case PERIPH_ID_I2C7: 310 gpio_cfg_pin(EXYNOS5_GPIO_B22, S5P_GPIO_FUNC(0x3)); 311 gpio_cfg_pin(EXYNOS5_GPIO_B23, S5P_GPIO_FUNC(0x3)); 312 break; 313 } 314 } 315 316 static void exynos5420_i2c_config(int peripheral) 317 { 318 switch (peripheral) { 319 case PERIPH_ID_I2C0: 320 gpio_cfg_pin(EXYNOS5420_GPIO_B30, S5P_GPIO_FUNC(0x2)); 321 gpio_cfg_pin(EXYNOS5420_GPIO_B31, S5P_GPIO_FUNC(0x2)); 322 break; 323 case PERIPH_ID_I2C1: 324 gpio_cfg_pin(EXYNOS5420_GPIO_B32, S5P_GPIO_FUNC(0x2)); 325 gpio_cfg_pin(EXYNOS5420_GPIO_B33, S5P_GPIO_FUNC(0x2)); 326 break; 327 case PERIPH_ID_I2C2: 328 gpio_cfg_pin(EXYNOS5420_GPIO_A06, S5P_GPIO_FUNC(0x3)); 329 gpio_cfg_pin(EXYNOS5420_GPIO_A07, S5P_GPIO_FUNC(0x3)); 330 break; 331 case PERIPH_ID_I2C3: 332 gpio_cfg_pin(EXYNOS5420_GPIO_A12, S5P_GPIO_FUNC(0x3)); 333 gpio_cfg_pin(EXYNOS5420_GPIO_A13, S5P_GPIO_FUNC(0x3)); 334 break; 335 case PERIPH_ID_I2C4: 336 gpio_cfg_pin(EXYNOS5420_GPIO_A20, S5P_GPIO_FUNC(0x3)); 337 gpio_cfg_pin(EXYNOS5420_GPIO_A21, S5P_GPIO_FUNC(0x3)); 338 break; 339 case PERIPH_ID_I2C5: 340 gpio_cfg_pin(EXYNOS5420_GPIO_A22, S5P_GPIO_FUNC(0x3)); 341 gpio_cfg_pin(EXYNOS5420_GPIO_A23, S5P_GPIO_FUNC(0x3)); 342 break; 343 case PERIPH_ID_I2C6: 344 gpio_cfg_pin(EXYNOS5420_GPIO_B13, S5P_GPIO_FUNC(0x4)); 345 gpio_cfg_pin(EXYNOS5420_GPIO_B14, S5P_GPIO_FUNC(0x4)); 346 break; 347 case PERIPH_ID_I2C7: 348 gpio_cfg_pin(EXYNOS5420_GPIO_B22, S5P_GPIO_FUNC(0x3)); 349 gpio_cfg_pin(EXYNOS5420_GPIO_B23, S5P_GPIO_FUNC(0x3)); 350 break; 351 case PERIPH_ID_I2C8: 352 gpio_cfg_pin(EXYNOS5420_GPIO_B34, S5P_GPIO_FUNC(0x2)); 353 gpio_cfg_pin(EXYNOS5420_GPIO_B35, S5P_GPIO_FUNC(0x2)); 354 break; 355 case PERIPH_ID_I2C9: 356 gpio_cfg_pin(EXYNOS5420_GPIO_B36, S5P_GPIO_FUNC(0x2)); 357 gpio_cfg_pin(EXYNOS5420_GPIO_B37, S5P_GPIO_FUNC(0x2)); 358 break; 359 case PERIPH_ID_I2C10: 360 gpio_cfg_pin(EXYNOS5420_GPIO_B40, S5P_GPIO_FUNC(0x2)); 361 gpio_cfg_pin(EXYNOS5420_GPIO_B41, S5P_GPIO_FUNC(0x2)); 362 break; 363 } 364 } 365 366 static void exynos5_i2s_config(int peripheral) 367 { 368 int i; 369 370 switch (peripheral) { 371 case PERIPH_ID_I2S0: 372 for (i = 0; i < 5; i++) 373 gpio_cfg_pin(EXYNOS5_GPIO_Z0 + i, S5P_GPIO_FUNC(0x02)); 374 break; 375 case PERIPH_ID_I2S1: 376 for (i = 0; i < 5; i++) 377 gpio_cfg_pin(EXYNOS5_GPIO_B00 + i, S5P_GPIO_FUNC(0x02)); 378 break; 379 } 380 } 381 382 void exynos5_spi_config(int peripheral) 383 { 384 int cfg = 0, pin = 0, i; 385 386 switch (peripheral) { 387 case PERIPH_ID_SPI0: 388 cfg = S5P_GPIO_FUNC(0x2); 389 pin = EXYNOS5_GPIO_A20; 390 break; 391 case PERIPH_ID_SPI1: 392 cfg = S5P_GPIO_FUNC(0x2); 393 pin = EXYNOS5_GPIO_A24; 394 break; 395 case PERIPH_ID_SPI2: 396 cfg = S5P_GPIO_FUNC(0x5); 397 pin = EXYNOS5_GPIO_B11; 398 break; 399 case PERIPH_ID_SPI3: 400 cfg = S5P_GPIO_FUNC(0x2); 401 pin = EXYNOS5_GPIO_F10; 402 break; 403 case PERIPH_ID_SPI4: 404 for (i = 0; i < 2; i++) { 405 gpio_cfg_pin(EXYNOS5_GPIO_F02 + i, S5P_GPIO_FUNC(0x4)); 406 gpio_cfg_pin(EXYNOS5_GPIO_E04 + i, S5P_GPIO_FUNC(0x4)); 407 } 408 break; 409 } 410 if (peripheral != PERIPH_ID_SPI4) { 411 for (i = pin; i < pin + 4; i++) 412 gpio_cfg_pin(i, cfg); 413 } 414 } 415 416 void exynos5420_spi_config(int peripheral) 417 { 418 int cfg, pin, i; 419 420 switch (peripheral) { 421 case PERIPH_ID_SPI0: 422 pin = EXYNOS5420_GPIO_A20; 423 cfg = S5P_GPIO_FUNC(0x2); 424 break; 425 case PERIPH_ID_SPI1: 426 pin = EXYNOS5420_GPIO_A24; 427 cfg = S5P_GPIO_FUNC(0x2); 428 break; 429 case PERIPH_ID_SPI2: 430 pin = EXYNOS5420_GPIO_B11; 431 cfg = S5P_GPIO_FUNC(0x5); 432 break; 433 case PERIPH_ID_SPI3: 434 pin = EXYNOS5420_GPIO_F10; 435 cfg = S5P_GPIO_FUNC(0x2); 436 break; 437 case PERIPH_ID_SPI4: 438 cfg = 0; 439 pin = 0; 440 break; 441 default: 442 cfg = 0; 443 pin = 0; 444 debug("%s: invalid peripheral %d", __func__, peripheral); 445 return; 446 } 447 448 if (peripheral != PERIPH_ID_SPI4) { 449 for (i = pin; i < pin + 4; i++) 450 gpio_cfg_pin(i, cfg); 451 } else { 452 for (i = 0; i < 2; i++) { 453 gpio_cfg_pin(EXYNOS5420_GPIO_F02 + i, 454 S5P_GPIO_FUNC(0x4)); 455 gpio_cfg_pin(EXYNOS5420_GPIO_E04 + i, 456 S5P_GPIO_FUNC(0x4)); 457 } 458 } 459 } 460 461 static int exynos5_pinmux_config(int peripheral, int flags) 462 { 463 switch (peripheral) { 464 case PERIPH_ID_UART0: 465 case PERIPH_ID_UART1: 466 case PERIPH_ID_UART2: 467 case PERIPH_ID_UART3: 468 exynos5_uart_config(peripheral); 469 break; 470 case PERIPH_ID_SDMMC0: 471 case PERIPH_ID_SDMMC1: 472 case PERIPH_ID_SDMMC2: 473 case PERIPH_ID_SDMMC3: 474 return exynos5_mmc_config(peripheral, flags); 475 case PERIPH_ID_SROMC: 476 exynos5_sromc_config(flags); 477 break; 478 case PERIPH_ID_I2C0: 479 case PERIPH_ID_I2C1: 480 case PERIPH_ID_I2C2: 481 case PERIPH_ID_I2C3: 482 case PERIPH_ID_I2C4: 483 case PERIPH_ID_I2C5: 484 case PERIPH_ID_I2C6: 485 case PERIPH_ID_I2C7: 486 exynos5_i2c_config(peripheral, flags); 487 break; 488 case PERIPH_ID_I2S0: 489 case PERIPH_ID_I2S1: 490 exynos5_i2s_config(peripheral); 491 break; 492 case PERIPH_ID_SPI0: 493 case PERIPH_ID_SPI1: 494 case PERIPH_ID_SPI2: 495 case PERIPH_ID_SPI3: 496 case PERIPH_ID_SPI4: 497 exynos5_spi_config(peripheral); 498 break; 499 case PERIPH_ID_DPHPD: 500 /* Set Hotplug detect for DP */ 501 gpio_cfg_pin(EXYNOS5_GPIO_X07, S5P_GPIO_FUNC(0x3)); 502 503 /* 504 * Hotplug detect should have an external pullup; disable the 505 * internal pulldown so they don't fight. 506 */ 507 gpio_set_pull(EXYNOS5_GPIO_X07, S5P_GPIO_PULL_NONE); 508 break; 509 default: 510 debug("%s: invalid peripheral %d", __func__, peripheral); 511 return -1; 512 } 513 514 return 0; 515 } 516 517 static int exynos5420_pinmux_config(int peripheral, int flags) 518 { 519 switch (peripheral) { 520 case PERIPH_ID_UART0: 521 case PERIPH_ID_UART1: 522 case PERIPH_ID_UART2: 523 case PERIPH_ID_UART3: 524 exynos5420_uart_config(peripheral); 525 break; 526 case PERIPH_ID_SDMMC0: 527 case PERIPH_ID_SDMMC1: 528 case PERIPH_ID_SDMMC2: 529 case PERIPH_ID_SDMMC3: 530 return exynos5420_mmc_config(peripheral, flags); 531 case PERIPH_ID_SPI0: 532 case PERIPH_ID_SPI1: 533 case PERIPH_ID_SPI2: 534 case PERIPH_ID_SPI3: 535 case PERIPH_ID_SPI4: 536 exynos5420_spi_config(peripheral); 537 break; 538 case PERIPH_ID_I2C0: 539 case PERIPH_ID_I2C1: 540 case PERIPH_ID_I2C2: 541 case PERIPH_ID_I2C3: 542 case PERIPH_ID_I2C4: 543 case PERIPH_ID_I2C5: 544 case PERIPH_ID_I2C6: 545 case PERIPH_ID_I2C7: 546 case PERIPH_ID_I2C8: 547 case PERIPH_ID_I2C9: 548 case PERIPH_ID_I2C10: 549 exynos5420_i2c_config(peripheral); 550 break; 551 default: 552 debug("%s: invalid peripheral %d", __func__, peripheral); 553 return -1; 554 } 555 556 return 0; 557 } 558 559 static void exynos4_i2c_config(int peripheral, int flags) 560 { 561 switch (peripheral) { 562 case PERIPH_ID_I2C0: 563 gpio_cfg_pin(EXYNOS4_GPIO_D10, S5P_GPIO_FUNC(0x2)); 564 gpio_cfg_pin(EXYNOS4_GPIO_D11, S5P_GPIO_FUNC(0x2)); 565 break; 566 case PERIPH_ID_I2C1: 567 gpio_cfg_pin(EXYNOS4_GPIO_D12, S5P_GPIO_FUNC(0x2)); 568 gpio_cfg_pin(EXYNOS4_GPIO_D13, S5P_GPIO_FUNC(0x2)); 569 break; 570 case PERIPH_ID_I2C2: 571 gpio_cfg_pin(EXYNOS4_GPIO_A06, S5P_GPIO_FUNC(0x3)); 572 gpio_cfg_pin(EXYNOS4_GPIO_A07, S5P_GPIO_FUNC(0x3)); 573 break; 574 case PERIPH_ID_I2C3: 575 gpio_cfg_pin(EXYNOS4_GPIO_A12, S5P_GPIO_FUNC(0x3)); 576 gpio_cfg_pin(EXYNOS4_GPIO_A13, S5P_GPIO_FUNC(0x3)); 577 break; 578 case PERIPH_ID_I2C4: 579 gpio_cfg_pin(EXYNOS4_GPIO_B2, S5P_GPIO_FUNC(0x3)); 580 gpio_cfg_pin(EXYNOS4_GPIO_B3, S5P_GPIO_FUNC(0x3)); 581 break; 582 case PERIPH_ID_I2C5: 583 gpio_cfg_pin(EXYNOS4_GPIO_B6, S5P_GPIO_FUNC(0x3)); 584 gpio_cfg_pin(EXYNOS4_GPIO_B7, S5P_GPIO_FUNC(0x3)); 585 break; 586 case PERIPH_ID_I2C6: 587 gpio_cfg_pin(EXYNOS4_GPIO_C13, S5P_GPIO_FUNC(0x4)); 588 gpio_cfg_pin(EXYNOS4_GPIO_C14, S5P_GPIO_FUNC(0x4)); 589 break; 590 case PERIPH_ID_I2C7: 591 gpio_cfg_pin(EXYNOS4_GPIO_D02, S5P_GPIO_FUNC(0x3)); 592 gpio_cfg_pin(EXYNOS4_GPIO_D03, S5P_GPIO_FUNC(0x3)); 593 break; 594 } 595 } 596 597 static int exynos4_mmc_config(int peripheral, int flags) 598 { 599 int i, start = 0, start_ext = 0; 600 unsigned int func, ext_func; 601 602 switch (peripheral) { 603 case PERIPH_ID_SDMMC0: 604 start = EXYNOS4_GPIO_K00; 605 start_ext = EXYNOS4_GPIO_K13; 606 func = S5P_GPIO_FUNC(0x2); 607 ext_func = S5P_GPIO_FUNC(0x3); 608 break; 609 case PERIPH_ID_SDMMC2: 610 start = EXYNOS4_GPIO_K20; 611 start_ext = EXYNOS4_GPIO_K33; 612 func = S5P_GPIO_FUNC(0x2); 613 ext_func = S5P_GPIO_FUNC(0x3); 614 break; 615 case PERIPH_ID_SDMMC4: 616 start = EXYNOS4_GPIO_K00; 617 start_ext = EXYNOS4_GPIO_K13; 618 func = S5P_GPIO_FUNC(0x3); 619 ext_func = S5P_GPIO_FUNC(0x4); 620 break; 621 default: 622 return -1; 623 } 624 for (i = start; i < (start + 7); i++) { 625 if (i == (start + 2)) 626 continue; 627 gpio_cfg_pin(i, func); 628 gpio_set_pull(i, S5P_GPIO_PULL_NONE); 629 gpio_set_drv(i, S5P_GPIO_DRV_4X); 630 } 631 /* SDMMC2 do not use 8bit mode at exynos4 */ 632 if (flags & PINMUX_FLAG_8BIT_MODE) { 633 for (i = start_ext; i < (start_ext + 4); i++) { 634 gpio_cfg_pin(i, ext_func); 635 gpio_set_pull(i, S5P_GPIO_PULL_NONE); 636 gpio_set_drv(i, S5P_GPIO_DRV_4X); 637 } 638 } 639 640 return 0; 641 } 642 643 static void exynos4_uart_config(int peripheral) 644 { 645 int i, start, count; 646 647 switch (peripheral) { 648 case PERIPH_ID_UART0: 649 start = EXYNOS4_GPIO_A00; 650 count = 4; 651 break; 652 case PERIPH_ID_UART1: 653 start = EXYNOS4_GPIO_A04; 654 count = 4; 655 break; 656 case PERIPH_ID_UART2: 657 start = EXYNOS4_GPIO_A10; 658 count = 4; 659 break; 660 case PERIPH_ID_UART3: 661 start = EXYNOS4_GPIO_A14; 662 count = 2; 663 break; 664 default: 665 debug("%s: invalid peripheral %d", __func__, peripheral); 666 return; 667 } 668 for (i = start; i < (start + count); i++) { 669 gpio_set_pull(i, S5P_GPIO_PULL_NONE); 670 gpio_cfg_pin(i, S5P_GPIO_FUNC(0x2)); 671 } 672 } 673 674 static void exynos4x12_i2c_config(int peripheral, int flags) 675 { 676 switch (peripheral) { 677 case PERIPH_ID_I2C0: 678 gpio_cfg_pin(EXYNOS4X12_GPIO_D10, S5P_GPIO_FUNC(0x2)); 679 gpio_cfg_pin(EXYNOS4X12_GPIO_D11, S5P_GPIO_FUNC(0x2)); 680 break; 681 case PERIPH_ID_I2C1: 682 gpio_cfg_pin(EXYNOS4X12_GPIO_D12, S5P_GPIO_FUNC(0x2)); 683 gpio_cfg_pin(EXYNOS4X12_GPIO_D13, S5P_GPIO_FUNC(0x2)); 684 break; 685 case PERIPH_ID_I2C2: 686 gpio_cfg_pin(EXYNOS4X12_GPIO_A06, S5P_GPIO_FUNC(0x3)); 687 gpio_cfg_pin(EXYNOS4X12_GPIO_A07, S5P_GPIO_FUNC(0x3)); 688 break; 689 case PERIPH_ID_I2C3: 690 gpio_cfg_pin(EXYNOS4X12_GPIO_A12, S5P_GPIO_FUNC(0x3)); 691 gpio_cfg_pin(EXYNOS4X12_GPIO_A13, S5P_GPIO_FUNC(0x3)); 692 break; 693 case PERIPH_ID_I2C4: 694 gpio_cfg_pin(EXYNOS4X12_GPIO_B2, S5P_GPIO_FUNC(0x3)); 695 gpio_cfg_pin(EXYNOS4X12_GPIO_B3, S5P_GPIO_FUNC(0x3)); 696 break; 697 case PERIPH_ID_I2C5: 698 gpio_cfg_pin(EXYNOS4X12_GPIO_B6, S5P_GPIO_FUNC(0x3)); 699 gpio_cfg_pin(EXYNOS4X12_GPIO_B7, S5P_GPIO_FUNC(0x3)); 700 break; 701 case PERIPH_ID_I2C6: 702 gpio_cfg_pin(EXYNOS4X12_GPIO_C13, S5P_GPIO_FUNC(0x4)); 703 gpio_cfg_pin(EXYNOS4X12_GPIO_C14, S5P_GPIO_FUNC(0x4)); 704 break; 705 case PERIPH_ID_I2C7: 706 gpio_cfg_pin(EXYNOS4X12_GPIO_D02, S5P_GPIO_FUNC(0x3)); 707 gpio_cfg_pin(EXYNOS4X12_GPIO_D03, S5P_GPIO_FUNC(0x3)); 708 break; 709 } 710 } 711 712 static int exynos4x12_mmc_config(int peripheral, int flags) 713 { 714 int i, start = 0, start_ext = 0; 715 unsigned int func, ext_func; 716 717 switch (peripheral) { 718 case PERIPH_ID_SDMMC0: 719 start = EXYNOS4X12_GPIO_K00; 720 start_ext = EXYNOS4X12_GPIO_K13; 721 func = S5P_GPIO_FUNC(0x2); 722 ext_func = S5P_GPIO_FUNC(0x3); 723 break; 724 case PERIPH_ID_SDMMC2: 725 start = EXYNOS4X12_GPIO_K20; 726 start_ext = EXYNOS4X12_GPIO_K33; 727 func = S5P_GPIO_FUNC(0x2); 728 ext_func = S5P_GPIO_FUNC(0x3); 729 break; 730 case PERIPH_ID_SDMMC4: 731 start = EXYNOS4X12_GPIO_K00; 732 start_ext = EXYNOS4X12_GPIO_K13; 733 func = S5P_GPIO_FUNC(0x3); 734 ext_func = S5P_GPIO_FUNC(0x4); 735 break; 736 default: 737 return -1; 738 } 739 for (i = start; i < (start + 7); i++) { 740 if (i == (start + 2)) 741 continue; 742 gpio_cfg_pin(i, func); 743 gpio_set_pull(i, S5P_GPIO_PULL_NONE); 744 gpio_set_drv(i, S5P_GPIO_DRV_4X); 745 } 746 if (flags & PINMUX_FLAG_8BIT_MODE) { 747 for (i = start_ext; i < (start_ext + 4); i++) { 748 gpio_cfg_pin(i, ext_func); 749 gpio_set_pull(i, S5P_GPIO_PULL_NONE); 750 gpio_set_drv(i, S5P_GPIO_DRV_4X); 751 } 752 } 753 754 return 0; 755 } 756 757 static void exynos4x12_uart_config(int peripheral) 758 { 759 int i, start, count; 760 761 switch (peripheral) { 762 case PERIPH_ID_UART0: 763 start = EXYNOS4X12_GPIO_A00; 764 count = 4; 765 break; 766 case PERIPH_ID_UART1: 767 start = EXYNOS4X12_GPIO_A04; 768 count = 4; 769 break; 770 case PERIPH_ID_UART2: 771 start = EXYNOS4X12_GPIO_A10; 772 count = 4; 773 break; 774 case PERIPH_ID_UART3: 775 start = EXYNOS4X12_GPIO_A14; 776 count = 2; 777 break; 778 default: 779 debug("%s: invalid peripheral %d", __func__, peripheral); 780 return; 781 } 782 for (i = start; i < (start + count); i++) { 783 gpio_set_pull(i, S5P_GPIO_PULL_NONE); 784 gpio_cfg_pin(i, S5P_GPIO_FUNC(0x2)); 785 } 786 } 787 788 static int exynos4_pinmux_config(int peripheral, int flags) 789 { 790 switch (peripheral) { 791 case PERIPH_ID_UART0: 792 case PERIPH_ID_UART1: 793 case PERIPH_ID_UART2: 794 case PERIPH_ID_UART3: 795 exynos4_uart_config(peripheral); 796 break; 797 case PERIPH_ID_I2C0: 798 case PERIPH_ID_I2C1: 799 case PERIPH_ID_I2C2: 800 case PERIPH_ID_I2C3: 801 case PERIPH_ID_I2C4: 802 case PERIPH_ID_I2C5: 803 case PERIPH_ID_I2C6: 804 case PERIPH_ID_I2C7: 805 exynos4_i2c_config(peripheral, flags); 806 break; 807 case PERIPH_ID_SDMMC0: 808 case PERIPH_ID_SDMMC2: 809 case PERIPH_ID_SDMMC4: 810 return exynos4_mmc_config(peripheral, flags); 811 case PERIPH_ID_SDMMC1: 812 case PERIPH_ID_SDMMC3: 813 debug("SDMMC device %d not implemented\n", peripheral); 814 return -1; 815 default: 816 debug("%s: invalid peripheral %d", __func__, peripheral); 817 return -1; 818 } 819 820 return 0; 821 } 822 823 static int exynos4x12_pinmux_config(int peripheral, int flags) 824 { 825 switch (peripheral) { 826 case PERIPH_ID_UART0: 827 case PERIPH_ID_UART1: 828 case PERIPH_ID_UART2: 829 case PERIPH_ID_UART3: 830 exynos4x12_uart_config(peripheral); 831 break; 832 case PERIPH_ID_I2C0: 833 case PERIPH_ID_I2C1: 834 case PERIPH_ID_I2C2: 835 case PERIPH_ID_I2C3: 836 case PERIPH_ID_I2C4: 837 case PERIPH_ID_I2C5: 838 case PERIPH_ID_I2C6: 839 case PERIPH_ID_I2C7: 840 exynos4x12_i2c_config(peripheral, flags); 841 break; 842 case PERIPH_ID_SDMMC0: 843 case PERIPH_ID_SDMMC2: 844 case PERIPH_ID_SDMMC4: 845 return exynos4x12_mmc_config(peripheral, flags); 846 case PERIPH_ID_SDMMC1: 847 case PERIPH_ID_SDMMC3: 848 debug("SDMMC device %d not implemented\n", peripheral); 849 return -1; 850 default: 851 debug("%s: invalid peripheral %d", __func__, peripheral); 852 return -1; 853 } 854 855 return 0; 856 } 857 858 int exynos_pinmux_config(int peripheral, int flags) 859 { 860 if (cpu_is_exynos5()) { 861 if (proid_is_exynos5420() || proid_is_exynos5800()) 862 return exynos5420_pinmux_config(peripheral, flags); 863 else if (proid_is_exynos5250()) 864 return exynos5_pinmux_config(peripheral, flags); 865 } else if (cpu_is_exynos4()) { 866 if (proid_is_exynos4412()) 867 return exynos4x12_pinmux_config(peripheral, flags); 868 else 869 return exynos4_pinmux_config(peripheral, flags); 870 } 871 872 debug("pinmux functionality not supported\n"); 873 874 return -1; 875 } 876 877 #if CONFIG_IS_ENABLED(OF_CONTROL) 878 static int exynos4_pinmux_decode_periph_id(const void *blob, int node) 879 { 880 int err; 881 u32 cell[3]; 882 883 err = fdtdec_get_int_array(blob, node, "interrupts", cell, 884 ARRAY_SIZE(cell)); 885 if (err) { 886 debug(" invalid peripheral id\n"); 887 return PERIPH_ID_NONE; 888 } 889 890 return cell[1]; 891 } 892 893 static int exynos5_pinmux_decode_periph_id(const void *blob, int node) 894 { 895 int err; 896 u32 cell[3]; 897 898 err = fdtdec_get_int_array(blob, node, "interrupts", cell, 899 ARRAY_SIZE(cell)); 900 if (err) 901 return PERIPH_ID_NONE; 902 903 return cell[1]; 904 } 905 906 int pinmux_decode_periph_id(const void *blob, int node) 907 { 908 if (cpu_is_exynos5()) 909 return exynos5_pinmux_decode_periph_id(blob, node); 910 else if (cpu_is_exynos4()) 911 return exynos4_pinmux_decode_periph_id(blob, node); 912 913 return PERIPH_ID_NONE; 914 } 915 #endif 916