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