This adds support for SDMMC ports to the funcmux. Only one option is supported: FUNCMUXO_SDMMC_8BIT which selects an 8-bit wide SDIO interface where available.
Signed-off-by: Simon Glass <s...@chromium.org> --- arch/arm/cpu/armv7/tegra2/funcmux.c | 70 ++++++++++++++++++++++++++++ arch/arm/include/asm/arch-tegra2/funcmux.h | 5 ++ 2 files changed, 75 insertions(+), 0 deletions(-) diff --git a/arch/arm/cpu/armv7/tegra2/funcmux.c b/arch/arm/cpu/armv7/tegra2/funcmux.c index ea40f1a..accae5c 100644 --- a/arch/arm/cpu/armv7/tegra2/funcmux.c +++ b/arch/arm/cpu/armv7/tegra2/funcmux.c @@ -94,6 +94,76 @@ int funcmux_select(enum periph_id id, int config, int options) } break; + case PERIPH_ID_SDMMC2: + if (config == 0) { + if (options & FUNCMUXO_SDMMC_8BIT) { + pinmux_set_func(PINGRP_DTA, PMUX_FUNC_SDIO2); + pinmux_set_func(PINGRP_DTD, PMUX_FUNC_SDIO2); + + pinmux_tristate_disable(PINGRP_DTA); + pinmux_tristate_disable(PINGRP_DTD); + options &= ~FUNCMUXO_SDMMC_8BIT; + } else { + required_options = FUNCMUXO_SDMMC_8BIT; + } + } + break; + + case PERIPH_ID_SDMMC3: + if (config == 0) { + pinmux_set_func(PINGRP_SDB, PMUX_FUNC_SDIO3); + pinmux_set_func(PINGRP_SDC, PMUX_FUNC_SDIO3); + pinmux_set_func(PINGRP_SDD, PMUX_FUNC_SDIO3); + + pinmux_tristate_disable(PINGRP_SDC); + pinmux_tristate_disable(PINGRP_SDD); + pinmux_tristate_disable(PINGRP_SDB); + + if (options & FUNCMUXO_SDMMC_8BIT) { + pinmux_set_func(PINGRP_SLXA, PMUX_FUNC_SDIO3); + pinmux_set_func(PINGRP_SLXC, PMUX_FUNC_SDIO3); + pinmux_set_func(PINGRP_SLXD, PMUX_FUNC_SDIO3); + pinmux_set_func(PINGRP_SLXK, PMUX_FUNC_SDIO3); + + pinmux_tristate_disable(PINGRP_SLXA); + pinmux_tristate_disable(PINGRP_SLXC); + pinmux_tristate_disable(PINGRP_SLXD); + pinmux_tristate_disable(PINGRP_SLXK); + options &= ~FUNCMUXO_SDMMC_8BIT; + } + } + break; + + case PERIPH_ID_SDMMC4: + switch (config) { + case 0: + if (options & FUNCMUXO_SDMMC_8BIT) { + pinmux_set_func(PINGRP_ATB, PMUX_FUNC_SDIO4); + pinmux_set_func(PINGRP_ATC, PMUX_FUNC_SDIO4); + pinmux_set_func(PINGRP_ATD, PMUX_FUNC_SDIO4); + + pinmux_tristate_disable(PINGRP_ATB); + pinmux_tristate_disable(PINGRP_ATC); + pinmux_tristate_disable(PINGRP_ATD); + options &= ~FUNCMUXO_SDMMC_8BIT; + } else { + required_options = FUNCMUXO_SDMMC_8BIT; + } + break; + + case 1: + pinmux_set_func(PINGRP_ATB, PMUX_FUNC_SDIO4); + pinmux_set_func(PINGRP_GMA, PMUX_FUNC_SDIO4); + pinmux_set_func(PINGRP_GME, PMUX_FUNC_SDIO4); + + pinmux_tristate_disable(PINGRP_ATB); + pinmux_tristate_disable(PINGRP_GMA); + pinmux_tristate_disable(PINGRP_GME); + bad_config = 0; + break; + } + break; + default: debug("%s: invalid periph_id %d", __func__, id); return -1; diff --git a/arch/arm/include/asm/arch-tegra2/funcmux.h b/arch/arm/include/asm/arch-tegra2/funcmux.h index a3b315b..2c48433 100644 --- a/arch/arm/include/asm/arch-tegra2/funcmux.h +++ b/arch/arm/include/asm/arch-tegra2/funcmux.h @@ -24,6 +24,11 @@ #ifndef __FUNCMUX_H #define __FUNCMUX_H +/* Options supported by the func mux */ +enum { + FUNCMUXO_SDMMC_8BIT = 1 << 0, /* 8-pin SDMMC interface */ +}; + /** * Select a config for a particular peripheral. * -- 1.7.3.1 _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot