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 case PERIPH_ID_PWM0: 510 gpio_cfg_pin(EXYNOS5_GPIO_B20, S5P_GPIO_FUNC(2)); 511 break; 512 default: 513 debug("%s: invalid peripheral %d", __func__, peripheral); 514 return -1; 515 } 516 517 return 0; 518 } 519 520 static int exynos5420_pinmux_config(int peripheral, int flags) 521 { 522 switch (peripheral) { 523 case PERIPH_ID_UART0: 524 case PERIPH_ID_UART1: 525 case PERIPH_ID_UART2: 526 case PERIPH_ID_UART3: 527 exynos5420_uart_config(peripheral); 528 break; 529 case PERIPH_ID_SDMMC0: 530 case PERIPH_ID_SDMMC1: 531 case PERIPH_ID_SDMMC2: 532 case PERIPH_ID_SDMMC3: 533 return exynos5420_mmc_config(peripheral, flags); 534 case PERIPH_ID_SPI0: 535 case PERIPH_ID_SPI1: 536 case PERIPH_ID_SPI2: 537 case PERIPH_ID_SPI3: 538 case PERIPH_ID_SPI4: 539 exynos5420_spi_config(peripheral); 540 break; 541 case PERIPH_ID_I2C0: 542 case PERIPH_ID_I2C1: 543 case PERIPH_ID_I2C2: 544 case PERIPH_ID_I2C3: 545 case PERIPH_ID_I2C4: 546 case PERIPH_ID_I2C5: 547 case PERIPH_ID_I2C6: 548 case PERIPH_ID_I2C7: 549 case PERIPH_ID_I2C8: 550 case PERIPH_ID_I2C9: 551 case PERIPH_ID_I2C10: 552 exynos5420_i2c_config(peripheral); 553 break; 554 case PERIPH_ID_PWM0: 555 gpio_cfg_pin(EXYNOS5420_GPIO_B20, S5P_GPIO_FUNC(2)); 556 break; 557 default: 558 debug("%s: invalid peripheral %d", __func__, peripheral); 559 return -1; 560 } 561 562 return 0; 563 } 564 565 static void exynos4_i2c_config(int peripheral, int flags) 566 { 567 switch (peripheral) { 568 case PERIPH_ID_I2C0: 569 gpio_cfg_pin(EXYNOS4_GPIO_D10, S5P_GPIO_FUNC(0x2)); 570 gpio_cfg_pin(EXYNOS4_GPIO_D11, S5P_GPIO_FUNC(0x2)); 571 break; 572 case PERIPH_ID_I2C1: 573 gpio_cfg_pin(EXYNOS4_GPIO_D12, S5P_GPIO_FUNC(0x2)); 574 gpio_cfg_pin(EXYNOS4_GPIO_D13, S5P_GPIO_FUNC(0x2)); 575 break; 576 case PERIPH_ID_I2C2: 577 gpio_cfg_pin(EXYNOS4_GPIO_A06, S5P_GPIO_FUNC(0x3)); 578 gpio_cfg_pin(EXYNOS4_GPIO_A07, S5P_GPIO_FUNC(0x3)); 579 break; 580 case PERIPH_ID_I2C3: 581 gpio_cfg_pin(EXYNOS4_GPIO_A12, S5P_GPIO_FUNC(0x3)); 582 gpio_cfg_pin(EXYNOS4_GPIO_A13, S5P_GPIO_FUNC(0x3)); 583 break; 584 case PERIPH_ID_I2C4: 585 gpio_cfg_pin(EXYNOS4_GPIO_B2, S5P_GPIO_FUNC(0x3)); 586 gpio_cfg_pin(EXYNOS4_GPIO_B3, S5P_GPIO_FUNC(0x3)); 587 break; 588 case PERIPH_ID_I2C5: 589 gpio_cfg_pin(EXYNOS4_GPIO_B6, S5P_GPIO_FUNC(0x3)); 590 gpio_cfg_pin(EXYNOS4_GPIO_B7, S5P_GPIO_FUNC(0x3)); 591 break; 592 case PERIPH_ID_I2C6: 593 gpio_cfg_pin(EXYNOS4_GPIO_C13, S5P_GPIO_FUNC(0x4)); 594 gpio_cfg_pin(EXYNOS4_GPIO_C14, S5P_GPIO_FUNC(0x4)); 595 break; 596 case PERIPH_ID_I2C7: 597 gpio_cfg_pin(EXYNOS4_GPIO_D02, S5P_GPIO_FUNC(0x3)); 598 gpio_cfg_pin(EXYNOS4_GPIO_D03, S5P_GPIO_FUNC(0x3)); 599 break; 600 } 601 } 602 603 static int exynos4_mmc_config(int peripheral, int flags) 604 { 605 int i, start = 0, start_ext = 0; 606 unsigned int func, ext_func; 607 608 switch (peripheral) { 609 case PERIPH_ID_SDMMC0: 610 start = EXYNOS4_GPIO_K00; 611 start_ext = EXYNOS4_GPIO_K13; 612 func = S5P_GPIO_FUNC(0x2); 613 ext_func = S5P_GPIO_FUNC(0x3); 614 break; 615 case PERIPH_ID_SDMMC2: 616 start = EXYNOS4_GPIO_K20; 617 start_ext = EXYNOS4_GPIO_K33; 618 func = S5P_GPIO_FUNC(0x2); 619 ext_func = S5P_GPIO_FUNC(0x3); 620 break; 621 case PERIPH_ID_SDMMC4: 622 start = EXYNOS4_GPIO_K00; 623 start_ext = EXYNOS4_GPIO_K13; 624 func = S5P_GPIO_FUNC(0x3); 625 ext_func = S5P_GPIO_FUNC(0x4); 626 break; 627 default: 628 return -1; 629 } 630 for (i = start; i < (start + 7); i++) { 631 if (i == (start + 2)) 632 continue; 633 gpio_cfg_pin(i, func); 634 gpio_set_pull(i, S5P_GPIO_PULL_NONE); 635 gpio_set_drv(i, S5P_GPIO_DRV_4X); 636 } 637 /* SDMMC2 do not use 8bit mode at exynos4 */ 638 if (flags & PINMUX_FLAG_8BIT_MODE) { 639 for (i = start_ext; i < (start_ext + 4); i++) { 640 gpio_cfg_pin(i, ext_func); 641 gpio_set_pull(i, S5P_GPIO_PULL_NONE); 642 gpio_set_drv(i, S5P_GPIO_DRV_4X); 643 } 644 } 645 646 return 0; 647 } 648 649 static void exynos4_uart_config(int peripheral) 650 { 651 int i, start, count; 652 653 switch (peripheral) { 654 case PERIPH_ID_UART0: 655 start = EXYNOS4_GPIO_A00; 656 count = 4; 657 break; 658 case PERIPH_ID_UART1: 659 start = EXYNOS4_GPIO_A04; 660 count = 4; 661 break; 662 case PERIPH_ID_UART2: 663 start = EXYNOS4_GPIO_A10; 664 count = 4; 665 break; 666 case PERIPH_ID_UART3: 667 start = EXYNOS4_GPIO_A14; 668 count = 2; 669 break; 670 default: 671 debug("%s: invalid peripheral %d", __func__, peripheral); 672 return; 673 } 674 for (i = start; i < (start + count); i++) { 675 gpio_set_pull(i, S5P_GPIO_PULL_NONE); 676 gpio_cfg_pin(i, S5P_GPIO_FUNC(0x2)); 677 } 678 } 679 680 static void exynos4x12_i2c_config(int peripheral, int flags) 681 { 682 switch (peripheral) { 683 case PERIPH_ID_I2C0: 684 gpio_cfg_pin(EXYNOS4X12_GPIO_D10, S5P_GPIO_FUNC(0x2)); 685 gpio_cfg_pin(EXYNOS4X12_GPIO_D11, S5P_GPIO_FUNC(0x2)); 686 break; 687 case PERIPH_ID_I2C1: 688 gpio_cfg_pin(EXYNOS4X12_GPIO_D12, S5P_GPIO_FUNC(0x2)); 689 gpio_cfg_pin(EXYNOS4X12_GPIO_D13, S5P_GPIO_FUNC(0x2)); 690 break; 691 case PERIPH_ID_I2C2: 692 gpio_cfg_pin(EXYNOS4X12_GPIO_A06, S5P_GPIO_FUNC(0x3)); 693 gpio_cfg_pin(EXYNOS4X12_GPIO_A07, S5P_GPIO_FUNC(0x3)); 694 break; 695 case PERIPH_ID_I2C3: 696 gpio_cfg_pin(EXYNOS4X12_GPIO_A12, S5P_GPIO_FUNC(0x3)); 697 gpio_cfg_pin(EXYNOS4X12_GPIO_A13, S5P_GPIO_FUNC(0x3)); 698 break; 699 case PERIPH_ID_I2C4: 700 gpio_cfg_pin(EXYNOS4X12_GPIO_B2, S5P_GPIO_FUNC(0x3)); 701 gpio_cfg_pin(EXYNOS4X12_GPIO_B3, S5P_GPIO_FUNC(0x3)); 702 break; 703 case PERIPH_ID_I2C5: 704 gpio_cfg_pin(EXYNOS4X12_GPIO_B6, S5P_GPIO_FUNC(0x3)); 705 gpio_cfg_pin(EXYNOS4X12_GPIO_B7, S5P_GPIO_FUNC(0x3)); 706 break; 707 case PERIPH_ID_I2C6: 708 gpio_cfg_pin(EXYNOS4X12_GPIO_C13, S5P_GPIO_FUNC(0x4)); 709 gpio_cfg_pin(EXYNOS4X12_GPIO_C14, S5P_GPIO_FUNC(0x4)); 710 break; 711 case PERIPH_ID_I2C7: 712 gpio_cfg_pin(EXYNOS4X12_GPIO_D02, S5P_GPIO_FUNC(0x3)); 713 gpio_cfg_pin(EXYNOS4X12_GPIO_D03, S5P_GPIO_FUNC(0x3)); 714 break; 715 } 716 } 717 718 static int exynos4x12_mmc_config(int peripheral, int flags) 719 { 720 int i, start = 0, start_ext = 0; 721 unsigned int func, ext_func; 722 723 switch (peripheral) { 724 case PERIPH_ID_SDMMC0: 725 start = EXYNOS4X12_GPIO_K00; 726 start_ext = EXYNOS4X12_GPIO_K13; 727 func = S5P_GPIO_FUNC(0x2); 728 ext_func = S5P_GPIO_FUNC(0x3); 729 break; 730 case PERIPH_ID_SDMMC2: 731 start = EXYNOS4X12_GPIO_K20; 732 start_ext = EXYNOS4X12_GPIO_K33; 733 func = S5P_GPIO_FUNC(0x2); 734 ext_func = S5P_GPIO_FUNC(0x3); 735 break; 736 case PERIPH_ID_SDMMC4: 737 start = EXYNOS4X12_GPIO_K00; 738 start_ext = EXYNOS4X12_GPIO_K13; 739 func = S5P_GPIO_FUNC(0x3); 740 ext_func = S5P_GPIO_FUNC(0x4); 741 break; 742 default: 743 return -1; 744 } 745 for (i = start; i < (start + 7); i++) { 746 gpio_set_pull(i, S5P_GPIO_PULL_NONE); 747 if (i == (start + 2)) 748 continue; 749 gpio_cfg_pin(i, func); 750 gpio_set_drv(i, S5P_GPIO_DRV_4X); 751 } 752 if (flags & PINMUX_FLAG_8BIT_MODE) { 753 for (i = start_ext; i < (start_ext + 4); i++) { 754 gpio_cfg_pin(i, ext_func); 755 gpio_set_pull(i, S5P_GPIO_PULL_NONE); 756 gpio_set_drv(i, S5P_GPIO_DRV_4X); 757 } 758 } 759 760 return 0; 761 } 762 763 static void exynos4x12_uart_config(int peripheral) 764 { 765 int i, start, count; 766 767 switch (peripheral) { 768 case PERIPH_ID_UART0: 769 start = EXYNOS4X12_GPIO_A00; 770 count = 4; 771 break; 772 case PERIPH_ID_UART1: 773 start = EXYNOS4X12_GPIO_A04; 774 count = 4; 775 break; 776 case PERIPH_ID_UART2: 777 start = EXYNOS4X12_GPIO_A10; 778 count = 4; 779 break; 780 case PERIPH_ID_UART3: 781 start = EXYNOS4X12_GPIO_A14; 782 count = 2; 783 break; 784 default: 785 debug("%s: invalid peripheral %d", __func__, peripheral); 786 return; 787 } 788 for (i = start; i < (start + count); i++) { 789 gpio_set_pull(i, S5P_GPIO_PULL_NONE); 790 gpio_cfg_pin(i, S5P_GPIO_FUNC(0x2)); 791 } 792 } 793 794 static int exynos4_pinmux_config(int peripheral, int flags) 795 { 796 switch (peripheral) { 797 case PERIPH_ID_UART0: 798 case PERIPH_ID_UART1: 799 case PERIPH_ID_UART2: 800 case PERIPH_ID_UART3: 801 exynos4_uart_config(peripheral); 802 break; 803 case PERIPH_ID_I2C0: 804 case PERIPH_ID_I2C1: 805 case PERIPH_ID_I2C2: 806 case PERIPH_ID_I2C3: 807 case PERIPH_ID_I2C4: 808 case PERIPH_ID_I2C5: 809 case PERIPH_ID_I2C6: 810 case PERIPH_ID_I2C7: 811 exynos4_i2c_config(peripheral, flags); 812 break; 813 case PERIPH_ID_SDMMC0: 814 case PERIPH_ID_SDMMC2: 815 case PERIPH_ID_SDMMC4: 816 return exynos4_mmc_config(peripheral, flags); 817 case PERIPH_ID_SDMMC1: 818 case PERIPH_ID_SDMMC3: 819 debug("SDMMC device %d not implemented\n", peripheral); 820 return -1; 821 default: 822 debug("%s: invalid peripheral %d", __func__, peripheral); 823 return -1; 824 } 825 826 return 0; 827 } 828 829 static int exynos4x12_pinmux_config(int peripheral, int flags) 830 { 831 switch (peripheral) { 832 case PERIPH_ID_UART0: 833 case PERIPH_ID_UART1: 834 case PERIPH_ID_UART2: 835 case PERIPH_ID_UART3: 836 exynos4x12_uart_config(peripheral); 837 break; 838 case PERIPH_ID_I2C0: 839 case PERIPH_ID_I2C1: 840 case PERIPH_ID_I2C2: 841 case PERIPH_ID_I2C3: 842 case PERIPH_ID_I2C4: 843 case PERIPH_ID_I2C5: 844 case PERIPH_ID_I2C6: 845 case PERIPH_ID_I2C7: 846 exynos4x12_i2c_config(peripheral, flags); 847 break; 848 case PERIPH_ID_SDMMC0: 849 case PERIPH_ID_SDMMC2: 850 case PERIPH_ID_SDMMC4: 851 return exynos4x12_mmc_config(peripheral, flags); 852 case PERIPH_ID_SDMMC1: 853 case PERIPH_ID_SDMMC3: 854 debug("SDMMC device %d not implemented\n", peripheral); 855 return -1; 856 default: 857 debug("%s: invalid peripheral %d", __func__, peripheral); 858 return -1; 859 } 860 861 return 0; 862 } 863 864 int exynos_pinmux_config(int peripheral, int flags) 865 { 866 if (cpu_is_exynos5()) { 867 if (proid_is_exynos5420() || proid_is_exynos5422()) 868 return exynos5420_pinmux_config(peripheral, flags); 869 else if (proid_is_exynos5250()) 870 return exynos5_pinmux_config(peripheral, flags); 871 } else if (cpu_is_exynos4()) { 872 if (proid_is_exynos4412()) 873 return exynos4x12_pinmux_config(peripheral, flags); 874 else 875 return exynos4_pinmux_config(peripheral, flags); 876 } 877 878 debug("pinmux functionality not supported\n"); 879 880 return -1; 881 } 882 883 #if CONFIG_IS_ENABLED(OF_CONTROL) 884 static int exynos4_pinmux_decode_periph_id(const void *blob, int node) 885 { 886 int err; 887 u32 cell[3]; 888 889 err = fdtdec_get_int_array(blob, node, "interrupts", cell, 890 ARRAY_SIZE(cell)); 891 if (err) { 892 debug(" invalid peripheral id\n"); 893 return PERIPH_ID_NONE; 894 } 895 896 return cell[1]; 897 } 898 899 static int exynos5_pinmux_decode_periph_id(const void *blob, int node) 900 { 901 int err; 902 u32 cell[3]; 903 904 err = fdtdec_get_int_array(blob, node, "interrupts", cell, 905 ARRAY_SIZE(cell)); 906 if (err) 907 return PERIPH_ID_NONE; 908 909 return cell[1]; 910 } 911 912 int pinmux_decode_periph_id(const void *blob, int node) 913 { 914 if (cpu_is_exynos5()) 915 return exynos5_pinmux_decode_periph_id(blob, node); 916 else if (cpu_is_exynos4()) 917 return exynos4_pinmux_decode_periph_id(blob, node); 918 919 return PERIPH_ID_NONE; 920 } 921 #endif 922