123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921 |
- /*
- * Copyright (c) 2012 Samsung Electronics.
- * Abhilash Kesavan <a.kesavan@samsung.com>
- *
- * SPDX-License-Identifier: GPL-2.0+
- */
- #include <common.h>
- #include <fdtdec.h>
- #include <asm/gpio.h>
- #include <asm/arch/pinmux.h>
- #include <asm/arch/sromc.h>
- static void exynos5_uart_config(int peripheral)
- {
- int i, start, count;
- switch (peripheral) {
- case PERIPH_ID_UART0:
- start = EXYNOS5_GPIO_A00;
- count = 4;
- break;
- case PERIPH_ID_UART1:
- start = EXYNOS5_GPIO_D00;
- count = 4;
- break;
- case PERIPH_ID_UART2:
- start = EXYNOS5_GPIO_A10;
- count = 4;
- break;
- case PERIPH_ID_UART3:
- start = EXYNOS5_GPIO_A14;
- count = 2;
- break;
- default:
- debug("%s: invalid peripheral %d", __func__, peripheral);
- return;
- }
- for (i = start; i < start + count; i++) {
- gpio_set_pull(i, S5P_GPIO_PULL_NONE);
- gpio_cfg_pin(i, S5P_GPIO_FUNC(0x2));
- }
- }
- static void exynos5420_uart_config(int peripheral)
- {
- int i, start, count;
- switch (peripheral) {
- case PERIPH_ID_UART0:
- start = EXYNOS5420_GPIO_A00;
- count = 4;
- break;
- case PERIPH_ID_UART1:
- start = EXYNOS5420_GPIO_A04;
- count = 4;
- break;
- case PERIPH_ID_UART2:
- start = EXYNOS5420_GPIO_A10;
- count = 4;
- break;
- case PERIPH_ID_UART3:
- start = EXYNOS5420_GPIO_A14;
- count = 2;
- break;
- default:
- debug("%s: invalid peripheral %d", __func__, peripheral);
- return;
- }
- for (i = start; i < start + count; i++) {
- gpio_set_pull(i, S5P_GPIO_PULL_NONE);
- gpio_cfg_pin(i, S5P_GPIO_FUNC(0x2));
- }
- }
- static int exynos5_mmc_config(int peripheral, int flags)
- {
- int i, start, start_ext, gpio_func = 0;
- switch (peripheral) {
- case PERIPH_ID_SDMMC0:
- start = EXYNOS5_GPIO_C00;
- start_ext = EXYNOS5_GPIO_C10;
- gpio_func = S5P_GPIO_FUNC(0x2);
- break;
- case PERIPH_ID_SDMMC1:
- start = EXYNOS5_GPIO_C20;
- start_ext = 0;
- break;
- case PERIPH_ID_SDMMC2:
- start = EXYNOS5_GPIO_C30;
- start_ext = EXYNOS5_GPIO_C43;
- gpio_func = S5P_GPIO_FUNC(0x3);
- break;
- case PERIPH_ID_SDMMC3:
- start = EXYNOS5_GPIO_C40;
- start_ext = 0;
- break;
- default:
- debug("%s: invalid peripheral %d", __func__, peripheral);
- return -1;
- }
- if ((flags & PINMUX_FLAG_8BIT_MODE) && !start_ext) {
- debug("SDMMC device %d does not support 8bit mode",
- peripheral);
- return -1;
- }
- if (flags & PINMUX_FLAG_8BIT_MODE) {
- for (i = start_ext; i <= (start_ext + 3); i++) {
- gpio_cfg_pin(i, gpio_func);
- gpio_set_pull(i, S5P_GPIO_PULL_UP);
- gpio_set_drv(i, S5P_GPIO_DRV_4X);
- }
- }
- for (i = start; i < (start + 2); i++) {
- gpio_cfg_pin(i, S5P_GPIO_FUNC(0x2));
- gpio_set_pull(i, S5P_GPIO_PULL_NONE);
- gpio_set_drv(i, S5P_GPIO_DRV_4X);
- }
- for (i = (start + 3); i <= (start + 6); i++) {
- gpio_cfg_pin(i, S5P_GPIO_FUNC(0x2));
- gpio_set_pull(i, S5P_GPIO_PULL_UP);
- gpio_set_drv(i, S5P_GPIO_DRV_4X);
- }
- return 0;
- }
- static int exynos5420_mmc_config(int peripheral, int flags)
- {
- int i, start = 0, start_ext = 0;
- switch (peripheral) {
- case PERIPH_ID_SDMMC0:
- start = EXYNOS5420_GPIO_C00;
- start_ext = EXYNOS5420_GPIO_C30;
- break;
- case PERIPH_ID_SDMMC1:
- start = EXYNOS5420_GPIO_C10;
- start_ext = EXYNOS5420_GPIO_D14;
- break;
- case PERIPH_ID_SDMMC2:
- start = EXYNOS5420_GPIO_C20;
- start_ext = 0;
- break;
- default:
- start = 0;
- debug("%s: invalid peripheral %d", __func__, peripheral);
- return -1;
- }
- if ((flags & PINMUX_FLAG_8BIT_MODE) && !start_ext) {
- debug("SDMMC device %d does not support 8bit mode",
- peripheral);
- return -1;
- }
- if (flags & PINMUX_FLAG_8BIT_MODE) {
- for (i = start_ext; i <= (start_ext + 3); i++) {
- gpio_cfg_pin(i, S5P_GPIO_FUNC(0x2));
- gpio_set_pull(i, S5P_GPIO_PULL_UP);
- gpio_set_drv(i, S5P_GPIO_DRV_4X);
- }
- }
- for (i = start; i < (start + 3); i++) {
- /*
- * MMC0 is intended to be used for eMMC. The
- * card detect pin is used as a VDDEN signal to
- * power on the eMMC. The 5420 iROM makes
- * this same assumption.
- */
- if ((peripheral == PERIPH_ID_SDMMC0) && (i == (start + 2))) {
- #ifndef CONFIG_SPL_BUILD
- gpio_request(i, "sdmmc0_vdden");
- #endif
- gpio_set_value(i, 1);
- gpio_cfg_pin(i, S5P_GPIO_OUTPUT);
- } else {
- gpio_cfg_pin(i, S5P_GPIO_FUNC(0x2));
- }
- gpio_set_pull(i, S5P_GPIO_PULL_NONE);
- gpio_set_drv(i, S5P_GPIO_DRV_4X);
- }
- for (i = (start + 3); i <= (start + 6); i++) {
- gpio_cfg_pin(i, S5P_GPIO_FUNC(0x2));
- gpio_set_pull(i, S5P_GPIO_PULL_UP);
- gpio_set_drv(i, S5P_GPIO_DRV_4X);
- }
- return 0;
- }
- static void exynos5_sromc_config(int flags)
- {
- int i;
- /*
- * SROM:CS1 and EBI
- *
- * GPY0[0] SROM_CSn[0]
- * GPY0[1] SROM_CSn[1](2)
- * GPY0[2] SROM_CSn[2]
- * GPY0[3] SROM_CSn[3]
- * GPY0[4] EBI_OEn(2)
- * GPY0[5] EBI_EEn(2)
- *
- * GPY1[0] EBI_BEn[0](2)
- * GPY1[1] EBI_BEn[1](2)
- * GPY1[2] SROM_WAIT(2)
- * GPY1[3] EBI_DATA_RDn(2)
- */
- gpio_cfg_pin(EXYNOS5_GPIO_Y00 + (flags & PINMUX_FLAG_BANK),
- S5P_GPIO_FUNC(2));
- gpio_cfg_pin(EXYNOS5_GPIO_Y04, S5P_GPIO_FUNC(2));
- gpio_cfg_pin(EXYNOS5_GPIO_Y05, S5P_GPIO_FUNC(2));
- for (i = 0; i < 4; i++)
- gpio_cfg_pin(EXYNOS5_GPIO_Y10 + i, S5P_GPIO_FUNC(2));
- /*
- * EBI: 8 Addrss Lines
- *
- * GPY3[0] EBI_ADDR[0](2)
- * GPY3[1] EBI_ADDR[1](2)
- * GPY3[2] EBI_ADDR[2](2)
- * GPY3[3] EBI_ADDR[3](2)
- * GPY3[4] EBI_ADDR[4](2)
- * GPY3[5] EBI_ADDR[5](2)
- * GPY3[6] EBI_ADDR[6](2)
- * GPY3[7] EBI_ADDR[7](2)
- *
- * EBI: 16 Data Lines
- *
- * GPY5[0] EBI_DATA[0](2)
- * GPY5[1] EBI_DATA[1](2)
- * GPY5[2] EBI_DATA[2](2)
- * GPY5[3] EBI_DATA[3](2)
- * GPY5[4] EBI_DATA[4](2)
- * GPY5[5] EBI_DATA[5](2)
- * GPY5[6] EBI_DATA[6](2)
- * GPY5[7] EBI_DATA[7](2)
- *
- * GPY6[0] EBI_DATA[8](2)
- * GPY6[1] EBI_DATA[9](2)
- * GPY6[2] EBI_DATA[10](2)
- * GPY6[3] EBI_DATA[11](2)
- * GPY6[4] EBI_DATA[12](2)
- * GPY6[5] EBI_DATA[13](2)
- * GPY6[6] EBI_DATA[14](2)
- * GPY6[7] EBI_DATA[15](2)
- */
- for (i = 0; i < 8; i++) {
- gpio_cfg_pin(EXYNOS5_GPIO_Y30 + i, S5P_GPIO_FUNC(2));
- gpio_set_pull(EXYNOS5_GPIO_Y30 + i, S5P_GPIO_PULL_UP);
- gpio_cfg_pin(EXYNOS5_GPIO_Y50 + i, S5P_GPIO_FUNC(2));
- gpio_set_pull(EXYNOS5_GPIO_Y50 + i, S5P_GPIO_PULL_UP);
- gpio_cfg_pin(EXYNOS5_GPIO_Y60 + i, S5P_GPIO_FUNC(2));
- gpio_set_pull(EXYNOS5_GPIO_Y60 + i, S5P_GPIO_PULL_UP);
- }
- }
- static void exynos5_i2c_config(int peripheral, int flags)
- {
- int func01, func23;
- /* High-Speed I2C */
- if (flags & PINMUX_FLAG_HS_MODE) {
- func01 = 4;
- func23 = 4;
- } else {
- func01 = 2;
- func23 = 3;
- }
- switch (peripheral) {
- case PERIPH_ID_I2C0:
- gpio_cfg_pin(EXYNOS5_GPIO_B30, S5P_GPIO_FUNC(func01));
- gpio_cfg_pin(EXYNOS5_GPIO_B31, S5P_GPIO_FUNC(func01));
- break;
- case PERIPH_ID_I2C1:
- gpio_cfg_pin(EXYNOS5_GPIO_B32, S5P_GPIO_FUNC(func01));
- gpio_cfg_pin(EXYNOS5_GPIO_B33, S5P_GPIO_FUNC(func01));
- break;
- case PERIPH_ID_I2C2:
- gpio_cfg_pin(EXYNOS5_GPIO_A06, S5P_GPIO_FUNC(func23));
- gpio_cfg_pin(EXYNOS5_GPIO_A07, S5P_GPIO_FUNC(func23));
- break;
- case PERIPH_ID_I2C3:
- gpio_cfg_pin(EXYNOS5_GPIO_A12, S5P_GPIO_FUNC(func23));
- gpio_cfg_pin(EXYNOS5_GPIO_A13, S5P_GPIO_FUNC(func23));
- break;
- case PERIPH_ID_I2C4:
- gpio_cfg_pin(EXYNOS5_GPIO_A20, S5P_GPIO_FUNC(0x3));
- gpio_cfg_pin(EXYNOS5_GPIO_A21, S5P_GPIO_FUNC(0x3));
- break;
- case PERIPH_ID_I2C5:
- gpio_cfg_pin(EXYNOS5_GPIO_A22, S5P_GPIO_FUNC(0x3));
- gpio_cfg_pin(EXYNOS5_GPIO_A23, S5P_GPIO_FUNC(0x3));
- break;
- case PERIPH_ID_I2C6:
- gpio_cfg_pin(EXYNOS5_GPIO_B13, S5P_GPIO_FUNC(0x4));
- gpio_cfg_pin(EXYNOS5_GPIO_B14, S5P_GPIO_FUNC(0x4));
- break;
- case PERIPH_ID_I2C7:
- gpio_cfg_pin(EXYNOS5_GPIO_B22, S5P_GPIO_FUNC(0x3));
- gpio_cfg_pin(EXYNOS5_GPIO_B23, S5P_GPIO_FUNC(0x3));
- break;
- }
- }
- static void exynos5420_i2c_config(int peripheral)
- {
- switch (peripheral) {
- case PERIPH_ID_I2C0:
- gpio_cfg_pin(EXYNOS5420_GPIO_B30, S5P_GPIO_FUNC(0x2));
- gpio_cfg_pin(EXYNOS5420_GPIO_B31, S5P_GPIO_FUNC(0x2));
- break;
- case PERIPH_ID_I2C1:
- gpio_cfg_pin(EXYNOS5420_GPIO_B32, S5P_GPIO_FUNC(0x2));
- gpio_cfg_pin(EXYNOS5420_GPIO_B33, S5P_GPIO_FUNC(0x2));
- break;
- case PERIPH_ID_I2C2:
- gpio_cfg_pin(EXYNOS5420_GPIO_A06, S5P_GPIO_FUNC(0x3));
- gpio_cfg_pin(EXYNOS5420_GPIO_A07, S5P_GPIO_FUNC(0x3));
- break;
- case PERIPH_ID_I2C3:
- gpio_cfg_pin(EXYNOS5420_GPIO_A12, S5P_GPIO_FUNC(0x3));
- gpio_cfg_pin(EXYNOS5420_GPIO_A13, S5P_GPIO_FUNC(0x3));
- break;
- case PERIPH_ID_I2C4:
- gpio_cfg_pin(EXYNOS5420_GPIO_A20, S5P_GPIO_FUNC(0x3));
- gpio_cfg_pin(EXYNOS5420_GPIO_A21, S5P_GPIO_FUNC(0x3));
- break;
- case PERIPH_ID_I2C5:
- gpio_cfg_pin(EXYNOS5420_GPIO_A22, S5P_GPIO_FUNC(0x3));
- gpio_cfg_pin(EXYNOS5420_GPIO_A23, S5P_GPIO_FUNC(0x3));
- break;
- case PERIPH_ID_I2C6:
- gpio_cfg_pin(EXYNOS5420_GPIO_B13, S5P_GPIO_FUNC(0x4));
- gpio_cfg_pin(EXYNOS5420_GPIO_B14, S5P_GPIO_FUNC(0x4));
- break;
- case PERIPH_ID_I2C7:
- gpio_cfg_pin(EXYNOS5420_GPIO_B22, S5P_GPIO_FUNC(0x3));
- gpio_cfg_pin(EXYNOS5420_GPIO_B23, S5P_GPIO_FUNC(0x3));
- break;
- case PERIPH_ID_I2C8:
- gpio_cfg_pin(EXYNOS5420_GPIO_B34, S5P_GPIO_FUNC(0x2));
- gpio_cfg_pin(EXYNOS5420_GPIO_B35, S5P_GPIO_FUNC(0x2));
- break;
- case PERIPH_ID_I2C9:
- gpio_cfg_pin(EXYNOS5420_GPIO_B36, S5P_GPIO_FUNC(0x2));
- gpio_cfg_pin(EXYNOS5420_GPIO_B37, S5P_GPIO_FUNC(0x2));
- break;
- case PERIPH_ID_I2C10:
- gpio_cfg_pin(EXYNOS5420_GPIO_B40, S5P_GPIO_FUNC(0x2));
- gpio_cfg_pin(EXYNOS5420_GPIO_B41, S5P_GPIO_FUNC(0x2));
- break;
- }
- }
- static void exynos5_i2s_config(int peripheral)
- {
- int i;
- switch (peripheral) {
- case PERIPH_ID_I2S0:
- for (i = 0; i < 5; i++)
- gpio_cfg_pin(EXYNOS5_GPIO_Z0 + i, S5P_GPIO_FUNC(0x02));
- break;
- case PERIPH_ID_I2S1:
- for (i = 0; i < 5; i++)
- gpio_cfg_pin(EXYNOS5_GPIO_B00 + i, S5P_GPIO_FUNC(0x02));
- break;
- }
- }
- void exynos5_spi_config(int peripheral)
- {
- int cfg = 0, pin = 0, i;
- switch (peripheral) {
- case PERIPH_ID_SPI0:
- cfg = S5P_GPIO_FUNC(0x2);
- pin = EXYNOS5_GPIO_A20;
- break;
- case PERIPH_ID_SPI1:
- cfg = S5P_GPIO_FUNC(0x2);
- pin = EXYNOS5_GPIO_A24;
- break;
- case PERIPH_ID_SPI2:
- cfg = S5P_GPIO_FUNC(0x5);
- pin = EXYNOS5_GPIO_B11;
- break;
- case PERIPH_ID_SPI3:
- cfg = S5P_GPIO_FUNC(0x2);
- pin = EXYNOS5_GPIO_F10;
- break;
- case PERIPH_ID_SPI4:
- for (i = 0; i < 2; i++) {
- gpio_cfg_pin(EXYNOS5_GPIO_F02 + i, S5P_GPIO_FUNC(0x4));
- gpio_cfg_pin(EXYNOS5_GPIO_E04 + i, S5P_GPIO_FUNC(0x4));
- }
- break;
- }
- if (peripheral != PERIPH_ID_SPI4) {
- for (i = pin; i < pin + 4; i++)
- gpio_cfg_pin(i, cfg);
- }
- }
- void exynos5420_spi_config(int peripheral)
- {
- int cfg, pin, i;
- switch (peripheral) {
- case PERIPH_ID_SPI0:
- pin = EXYNOS5420_GPIO_A20;
- cfg = S5P_GPIO_FUNC(0x2);
- break;
- case PERIPH_ID_SPI1:
- pin = EXYNOS5420_GPIO_A24;
- cfg = S5P_GPIO_FUNC(0x2);
- break;
- case PERIPH_ID_SPI2:
- pin = EXYNOS5420_GPIO_B11;
- cfg = S5P_GPIO_FUNC(0x5);
- break;
- case PERIPH_ID_SPI3:
- pin = EXYNOS5420_GPIO_F10;
- cfg = S5P_GPIO_FUNC(0x2);
- break;
- case PERIPH_ID_SPI4:
- cfg = 0;
- pin = 0;
- break;
- default:
- cfg = 0;
- pin = 0;
- debug("%s: invalid peripheral %d", __func__, peripheral);
- return;
- }
- if (peripheral != PERIPH_ID_SPI4) {
- for (i = pin; i < pin + 4; i++)
- gpio_cfg_pin(i, cfg);
- } else {
- for (i = 0; i < 2; i++) {
- gpio_cfg_pin(EXYNOS5420_GPIO_F02 + i,
- S5P_GPIO_FUNC(0x4));
- gpio_cfg_pin(EXYNOS5420_GPIO_E04 + i,
- S5P_GPIO_FUNC(0x4));
- }
- }
- }
- static int exynos5_pinmux_config(int peripheral, int flags)
- {
- switch (peripheral) {
- case PERIPH_ID_UART0:
- case PERIPH_ID_UART1:
- case PERIPH_ID_UART2:
- case PERIPH_ID_UART3:
- exynos5_uart_config(peripheral);
- break;
- case PERIPH_ID_SDMMC0:
- case PERIPH_ID_SDMMC1:
- case PERIPH_ID_SDMMC2:
- case PERIPH_ID_SDMMC3:
- return exynos5_mmc_config(peripheral, flags);
- case PERIPH_ID_SROMC:
- exynos5_sromc_config(flags);
- break;
- case PERIPH_ID_I2C0:
- case PERIPH_ID_I2C1:
- case PERIPH_ID_I2C2:
- case PERIPH_ID_I2C3:
- case PERIPH_ID_I2C4:
- case PERIPH_ID_I2C5:
- case PERIPH_ID_I2C6:
- case PERIPH_ID_I2C7:
- exynos5_i2c_config(peripheral, flags);
- break;
- case PERIPH_ID_I2S0:
- case PERIPH_ID_I2S1:
- exynos5_i2s_config(peripheral);
- break;
- case PERIPH_ID_SPI0:
- case PERIPH_ID_SPI1:
- case PERIPH_ID_SPI2:
- case PERIPH_ID_SPI3:
- case PERIPH_ID_SPI4:
- exynos5_spi_config(peripheral);
- break;
- case PERIPH_ID_DPHPD:
- /* Set Hotplug detect for DP */
- gpio_cfg_pin(EXYNOS5_GPIO_X07, S5P_GPIO_FUNC(0x3));
- /*
- * Hotplug detect should have an external pullup; disable the
- * internal pulldown so they don't fight.
- */
- gpio_set_pull(EXYNOS5_GPIO_X07, S5P_GPIO_PULL_NONE);
- break;
- case PERIPH_ID_PWM0:
- gpio_cfg_pin(EXYNOS5_GPIO_B20, S5P_GPIO_FUNC(2));
- break;
- default:
- debug("%s: invalid peripheral %d", __func__, peripheral);
- return -1;
- }
- return 0;
- }
- static int exynos5420_pinmux_config(int peripheral, int flags)
- {
- switch (peripheral) {
- case PERIPH_ID_UART0:
- case PERIPH_ID_UART1:
- case PERIPH_ID_UART2:
- case PERIPH_ID_UART3:
- exynos5420_uart_config(peripheral);
- break;
- case PERIPH_ID_SDMMC0:
- case PERIPH_ID_SDMMC1:
- case PERIPH_ID_SDMMC2:
- case PERIPH_ID_SDMMC3:
- return exynos5420_mmc_config(peripheral, flags);
- case PERIPH_ID_SPI0:
- case PERIPH_ID_SPI1:
- case PERIPH_ID_SPI2:
- case PERIPH_ID_SPI3:
- case PERIPH_ID_SPI4:
- exynos5420_spi_config(peripheral);
- break;
- case PERIPH_ID_I2C0:
- case PERIPH_ID_I2C1:
- case PERIPH_ID_I2C2:
- case PERIPH_ID_I2C3:
- case PERIPH_ID_I2C4:
- case PERIPH_ID_I2C5:
- case PERIPH_ID_I2C6:
- case PERIPH_ID_I2C7:
- case PERIPH_ID_I2C8:
- case PERIPH_ID_I2C9:
- case PERIPH_ID_I2C10:
- exynos5420_i2c_config(peripheral);
- break;
- case PERIPH_ID_PWM0:
- gpio_cfg_pin(EXYNOS5420_GPIO_B20, S5P_GPIO_FUNC(2));
- break;
- default:
- debug("%s: invalid peripheral %d", __func__, peripheral);
- return -1;
- }
- return 0;
- }
- static void exynos4_i2c_config(int peripheral, int flags)
- {
- switch (peripheral) {
- case PERIPH_ID_I2C0:
- gpio_cfg_pin(EXYNOS4_GPIO_D10, S5P_GPIO_FUNC(0x2));
- gpio_cfg_pin(EXYNOS4_GPIO_D11, S5P_GPIO_FUNC(0x2));
- break;
- case PERIPH_ID_I2C1:
- gpio_cfg_pin(EXYNOS4_GPIO_D12, S5P_GPIO_FUNC(0x2));
- gpio_cfg_pin(EXYNOS4_GPIO_D13, S5P_GPIO_FUNC(0x2));
- break;
- case PERIPH_ID_I2C2:
- gpio_cfg_pin(EXYNOS4_GPIO_A06, S5P_GPIO_FUNC(0x3));
- gpio_cfg_pin(EXYNOS4_GPIO_A07, S5P_GPIO_FUNC(0x3));
- break;
- case PERIPH_ID_I2C3:
- gpio_cfg_pin(EXYNOS4_GPIO_A12, S5P_GPIO_FUNC(0x3));
- gpio_cfg_pin(EXYNOS4_GPIO_A13, S5P_GPIO_FUNC(0x3));
- break;
- case PERIPH_ID_I2C4:
- gpio_cfg_pin(EXYNOS4_GPIO_B2, S5P_GPIO_FUNC(0x3));
- gpio_cfg_pin(EXYNOS4_GPIO_B3, S5P_GPIO_FUNC(0x3));
- break;
- case PERIPH_ID_I2C5:
- gpio_cfg_pin(EXYNOS4_GPIO_B6, S5P_GPIO_FUNC(0x3));
- gpio_cfg_pin(EXYNOS4_GPIO_B7, S5P_GPIO_FUNC(0x3));
- break;
- case PERIPH_ID_I2C6:
- gpio_cfg_pin(EXYNOS4_GPIO_C13, S5P_GPIO_FUNC(0x4));
- gpio_cfg_pin(EXYNOS4_GPIO_C14, S5P_GPIO_FUNC(0x4));
- break;
- case PERIPH_ID_I2C7:
- gpio_cfg_pin(EXYNOS4_GPIO_D02, S5P_GPIO_FUNC(0x3));
- gpio_cfg_pin(EXYNOS4_GPIO_D03, S5P_GPIO_FUNC(0x3));
- break;
- }
- }
- static int exynos4_mmc_config(int peripheral, int flags)
- {
- int i, start = 0, start_ext = 0;
- unsigned int func, ext_func;
- switch (peripheral) {
- case PERIPH_ID_SDMMC0:
- start = EXYNOS4_GPIO_K00;
- start_ext = EXYNOS4_GPIO_K13;
- func = S5P_GPIO_FUNC(0x2);
- ext_func = S5P_GPIO_FUNC(0x3);
- break;
- case PERIPH_ID_SDMMC2:
- start = EXYNOS4_GPIO_K20;
- start_ext = EXYNOS4_GPIO_K33;
- func = S5P_GPIO_FUNC(0x2);
- ext_func = S5P_GPIO_FUNC(0x3);
- break;
- case PERIPH_ID_SDMMC4:
- start = EXYNOS4_GPIO_K00;
- start_ext = EXYNOS4_GPIO_K13;
- func = S5P_GPIO_FUNC(0x3);
- ext_func = S5P_GPIO_FUNC(0x4);
- break;
- default:
- return -1;
- }
- for (i = start; i < (start + 7); i++) {
- if (i == (start + 2))
- continue;
- gpio_cfg_pin(i, func);
- gpio_set_pull(i, S5P_GPIO_PULL_NONE);
- gpio_set_drv(i, S5P_GPIO_DRV_4X);
- }
- /* SDMMC2 do not use 8bit mode at exynos4 */
- if (flags & PINMUX_FLAG_8BIT_MODE) {
- for (i = start_ext; i < (start_ext + 4); i++) {
- gpio_cfg_pin(i, ext_func);
- gpio_set_pull(i, S5P_GPIO_PULL_NONE);
- gpio_set_drv(i, S5P_GPIO_DRV_4X);
- }
- }
- return 0;
- }
- static void exynos4_uart_config(int peripheral)
- {
- int i, start, count;
- switch (peripheral) {
- case PERIPH_ID_UART0:
- start = EXYNOS4_GPIO_A00;
- count = 4;
- break;
- case PERIPH_ID_UART1:
- start = EXYNOS4_GPIO_A04;
- count = 4;
- break;
- case PERIPH_ID_UART2:
- start = EXYNOS4_GPIO_A10;
- count = 4;
- break;
- case PERIPH_ID_UART3:
- start = EXYNOS4_GPIO_A14;
- count = 2;
- break;
- default:
- debug("%s: invalid peripheral %d", __func__, peripheral);
- return;
- }
- for (i = start; i < (start + count); i++) {
- gpio_set_pull(i, S5P_GPIO_PULL_NONE);
- gpio_cfg_pin(i, S5P_GPIO_FUNC(0x2));
- }
- }
- static void exynos4x12_i2c_config(int peripheral, int flags)
- {
- switch (peripheral) {
- case PERIPH_ID_I2C0:
- gpio_cfg_pin(EXYNOS4X12_GPIO_D10, S5P_GPIO_FUNC(0x2));
- gpio_cfg_pin(EXYNOS4X12_GPIO_D11, S5P_GPIO_FUNC(0x2));
- break;
- case PERIPH_ID_I2C1:
- gpio_cfg_pin(EXYNOS4X12_GPIO_D12, S5P_GPIO_FUNC(0x2));
- gpio_cfg_pin(EXYNOS4X12_GPIO_D13, S5P_GPIO_FUNC(0x2));
- break;
- case PERIPH_ID_I2C2:
- gpio_cfg_pin(EXYNOS4X12_GPIO_A06, S5P_GPIO_FUNC(0x3));
- gpio_cfg_pin(EXYNOS4X12_GPIO_A07, S5P_GPIO_FUNC(0x3));
- break;
- case PERIPH_ID_I2C3:
- gpio_cfg_pin(EXYNOS4X12_GPIO_A12, S5P_GPIO_FUNC(0x3));
- gpio_cfg_pin(EXYNOS4X12_GPIO_A13, S5P_GPIO_FUNC(0x3));
- break;
- case PERIPH_ID_I2C4:
- gpio_cfg_pin(EXYNOS4X12_GPIO_B2, S5P_GPIO_FUNC(0x3));
- gpio_cfg_pin(EXYNOS4X12_GPIO_B3, S5P_GPIO_FUNC(0x3));
- break;
- case PERIPH_ID_I2C5:
- gpio_cfg_pin(EXYNOS4X12_GPIO_B6, S5P_GPIO_FUNC(0x3));
- gpio_cfg_pin(EXYNOS4X12_GPIO_B7, S5P_GPIO_FUNC(0x3));
- break;
- case PERIPH_ID_I2C6:
- gpio_cfg_pin(EXYNOS4X12_GPIO_C13, S5P_GPIO_FUNC(0x4));
- gpio_cfg_pin(EXYNOS4X12_GPIO_C14, S5P_GPIO_FUNC(0x4));
- break;
- case PERIPH_ID_I2C7:
- gpio_cfg_pin(EXYNOS4X12_GPIO_D02, S5P_GPIO_FUNC(0x3));
- gpio_cfg_pin(EXYNOS4X12_GPIO_D03, S5P_GPIO_FUNC(0x3));
- break;
- }
- }
- static int exynos4x12_mmc_config(int peripheral, int flags)
- {
- int i, start = 0, start_ext = 0;
- unsigned int func, ext_func;
- switch (peripheral) {
- case PERIPH_ID_SDMMC0:
- start = EXYNOS4X12_GPIO_K00;
- start_ext = EXYNOS4X12_GPIO_K13;
- func = S5P_GPIO_FUNC(0x2);
- ext_func = S5P_GPIO_FUNC(0x3);
- break;
- case PERIPH_ID_SDMMC2:
- start = EXYNOS4X12_GPIO_K20;
- start_ext = EXYNOS4X12_GPIO_K33;
- func = S5P_GPIO_FUNC(0x2);
- ext_func = S5P_GPIO_FUNC(0x3);
- break;
- case PERIPH_ID_SDMMC4:
- start = EXYNOS4X12_GPIO_K00;
- start_ext = EXYNOS4X12_GPIO_K13;
- func = S5P_GPIO_FUNC(0x3);
- ext_func = S5P_GPIO_FUNC(0x4);
- break;
- default:
- return -1;
- }
- for (i = start; i < (start + 7); i++) {
- gpio_set_pull(i, S5P_GPIO_PULL_NONE);
- if (i == (start + 2))
- continue;
- gpio_cfg_pin(i, func);
- gpio_set_drv(i, S5P_GPIO_DRV_4X);
- }
- if (flags & PINMUX_FLAG_8BIT_MODE) {
- for (i = start_ext; i < (start_ext + 4); i++) {
- gpio_cfg_pin(i, ext_func);
- gpio_set_pull(i, S5P_GPIO_PULL_NONE);
- gpio_set_drv(i, S5P_GPIO_DRV_4X);
- }
- }
- return 0;
- }
- static void exynos4x12_uart_config(int peripheral)
- {
- int i, start, count;
- switch (peripheral) {
- case PERIPH_ID_UART0:
- start = EXYNOS4X12_GPIO_A00;
- count = 4;
- break;
- case PERIPH_ID_UART1:
- start = EXYNOS4X12_GPIO_A04;
- count = 4;
- break;
- case PERIPH_ID_UART2:
- start = EXYNOS4X12_GPIO_A10;
- count = 4;
- break;
- case PERIPH_ID_UART3:
- start = EXYNOS4X12_GPIO_A14;
- count = 2;
- break;
- default:
- debug("%s: invalid peripheral %d", __func__, peripheral);
- return;
- }
- for (i = start; i < (start + count); i++) {
- gpio_set_pull(i, S5P_GPIO_PULL_NONE);
- gpio_cfg_pin(i, S5P_GPIO_FUNC(0x2));
- }
- }
- static int exynos4_pinmux_config(int peripheral, int flags)
- {
- switch (peripheral) {
- case PERIPH_ID_UART0:
- case PERIPH_ID_UART1:
- case PERIPH_ID_UART2:
- case PERIPH_ID_UART3:
- exynos4_uart_config(peripheral);
- break;
- case PERIPH_ID_I2C0:
- case PERIPH_ID_I2C1:
- case PERIPH_ID_I2C2:
- case PERIPH_ID_I2C3:
- case PERIPH_ID_I2C4:
- case PERIPH_ID_I2C5:
- case PERIPH_ID_I2C6:
- case PERIPH_ID_I2C7:
- exynos4_i2c_config(peripheral, flags);
- break;
- case PERIPH_ID_SDMMC0:
- case PERIPH_ID_SDMMC2:
- case PERIPH_ID_SDMMC4:
- return exynos4_mmc_config(peripheral, flags);
- case PERIPH_ID_SDMMC1:
- case PERIPH_ID_SDMMC3:
- debug("SDMMC device %d not implemented\n", peripheral);
- return -1;
- default:
- debug("%s: invalid peripheral %d", __func__, peripheral);
- return -1;
- }
- return 0;
- }
- static int exynos4x12_pinmux_config(int peripheral, int flags)
- {
- switch (peripheral) {
- case PERIPH_ID_UART0:
- case PERIPH_ID_UART1:
- case PERIPH_ID_UART2:
- case PERIPH_ID_UART3:
- exynos4x12_uart_config(peripheral);
- break;
- case PERIPH_ID_I2C0:
- case PERIPH_ID_I2C1:
- case PERIPH_ID_I2C2:
- case PERIPH_ID_I2C3:
- case PERIPH_ID_I2C4:
- case PERIPH_ID_I2C5:
- case PERIPH_ID_I2C6:
- case PERIPH_ID_I2C7:
- exynos4x12_i2c_config(peripheral, flags);
- break;
- case PERIPH_ID_SDMMC0:
- case PERIPH_ID_SDMMC2:
- case PERIPH_ID_SDMMC4:
- return exynos4x12_mmc_config(peripheral, flags);
- case PERIPH_ID_SDMMC1:
- case PERIPH_ID_SDMMC3:
- debug("SDMMC device %d not implemented\n", peripheral);
- return -1;
- default:
- debug("%s: invalid peripheral %d", __func__, peripheral);
- return -1;
- }
- return 0;
- }
- int exynos_pinmux_config(int peripheral, int flags)
- {
- if (cpu_is_exynos5()) {
- if (proid_is_exynos5420() || proid_is_exynos5422())
- return exynos5420_pinmux_config(peripheral, flags);
- else if (proid_is_exynos5250())
- return exynos5_pinmux_config(peripheral, flags);
- } else if (cpu_is_exynos4()) {
- if (proid_is_exynos4412())
- return exynos4x12_pinmux_config(peripheral, flags);
- else
- return exynos4_pinmux_config(peripheral, flags);
- }
- debug("pinmux functionality not supported\n");
- return -1;
- }
- #if CONFIG_IS_ENABLED(OF_CONTROL)
- static int exynos4_pinmux_decode_periph_id(const void *blob, int node)
- {
- int err;
- u32 cell[3];
- err = fdtdec_get_int_array(blob, node, "interrupts", cell,
- ARRAY_SIZE(cell));
- if (err) {
- debug(" invalid peripheral id\n");
- return PERIPH_ID_NONE;
- }
- return cell[1];
- }
- static int exynos5_pinmux_decode_periph_id(const void *blob, int node)
- {
- int err;
- u32 cell[3];
- err = fdtdec_get_int_array(blob, node, "interrupts", cell,
- ARRAY_SIZE(cell));
- if (err)
- return PERIPH_ID_NONE;
- return cell[1];
- }
- int pinmux_decode_periph_id(const void *blob, int node)
- {
- if (cpu_is_exynos5())
- return exynos5_pinmux_decode_periph_id(blob, node);
- else if (cpu_is_exynos4())
- return exynos4_pinmux_decode_periph_id(blob, node);
- return PERIPH_ID_NONE;
- }
- #endif
|