aboutsummaryrefslogtreecommitdiff
path: root/arch/arm/cpu
diff options
context:
space:
mode:
authorSimon Glass2012-01-11 12:42:22 +0000
committerAlbert ARIBAUD2012-02-12 10:11:22 +0100
commitd693969daa961d77c9f68e6868866509522eeb97 (patch)
tree959ff8e2f6d50f7c03696aa74dd400baa4d01677 /arch/arm/cpu
parent2996e2dcc0454207b4bf6248d034aead4ac54591 (diff)
tegra: Adjust funcmux config test to permit expansion
We want to support config options other than zero, so move the test to the end to allow intermediate code to OK such a config. Signed-off-by: Simon Glass <sjg@chromium.org> Signed-off-by: Tom Warren <twarren@nvidia.com>
Diffstat (limited to 'arch/arm/cpu')
-rw-r--r--arch/arm/cpu/armv7/tegra2/funcmux.c60
1 files changed, 35 insertions, 25 deletions
diff --git a/arch/arm/cpu/armv7/tegra2/funcmux.c b/arch/arm/cpu/armv7/tegra2/funcmux.c
index 140f8a73701..d3496c535a3 100644
--- a/arch/arm/cpu/armv7/tegra2/funcmux.c
+++ b/arch/arm/cpu/armv7/tegra2/funcmux.c
@@ -26,39 +26,43 @@
int funcmux_select(enum periph_id id, int config)
{
- if (config != 0) {
- debug("%s: invalid config %d for periph_id %d", __func__,
- config, id);
- return -1;
- }
+ int bad_config = config != 0;
+
switch (id) {
case PERIPH_ID_UART1:
- pinmux_set_func(PINGRP_IRRX, PMUX_FUNC_UARTA);
- pinmux_set_func(PINGRP_IRTX, PMUX_FUNC_UARTA);
- pinmux_tristate_disable(PINGRP_IRRX);
- pinmux_tristate_disable(PINGRP_IRTX);
- /*
- * Tegra appears to boot with function UARTA pre-selected on
- * mux group SDB. If two mux groups are both set to the same
- * function, it's unclear which group's pins drive the RX
- * signals into the HW module. For UARTA, SDB certainly
- * overrides group IRTX in practice. To solve this, configure
- * some alternative function on SDB to avoid the conflict. Also,
- * tri-state the group to avoid driving any signal onto it until
- * we know what's connected.
- */
- pinmux_tristate_enable(PINGRP_SDB);
- pinmux_set_func(PINGRP_SDB, PMUX_FUNC_SDIO3);
+ if (config == 0) {
+ pinmux_set_func(PINGRP_IRRX, PMUX_FUNC_UARTA);
+ pinmux_set_func(PINGRP_IRTX, PMUX_FUNC_UARTA);
+ pinmux_tristate_disable(PINGRP_IRRX);
+ pinmux_tristate_disable(PINGRP_IRTX);
+ /*
+ * Tegra appears to boot with function UARTA pre-
+ * selected on mux group SDB. If two mux groups are
+ * both set to the same function, it's unclear which
+ * group's pins drive the RX signals into the HW.
+ * For UARTA, SDB certainly overrides group IRTX in
+ * practice. To solve this, configure some alternative
+ * function on SDB to avoid the conflict. Also, tri-
+ * state the group to avoid driving any signal onto it
+ * until we know what's connected.
+ */
+ pinmux_tristate_enable(PINGRP_SDB);
+ pinmux_set_func(PINGRP_SDB, PMUX_FUNC_SDIO3);
+ }
break;
case PERIPH_ID_UART2:
- pinmux_set_func(PINGRP_UAD, PMUX_FUNC_IRDA);
- pinmux_tristate_disable(PINGRP_UAD);
+ if (config == 0) {
+ pinmux_set_func(PINGRP_UAD, PMUX_FUNC_IRDA);
+ pinmux_tristate_disable(PINGRP_UAD);
+ }
break;
case PERIPH_ID_UART4:
- pinmux_set_func(PINGRP_GMC, PMUX_FUNC_UARTD);
- pinmux_tristate_disable(PINGRP_GMC);
+ if (config == 0) {
+ pinmux_set_func(PINGRP_GMC, PMUX_FUNC_UARTD);
+ pinmux_tristate_disable(PINGRP_GMC);
+ }
break;
default:
@@ -66,5 +70,11 @@ int funcmux_select(enum periph_id id, int config)
return -1;
}
+ if (bad_config) {
+ debug("%s: invalid config %d for periph_id %d", __func__,
+ config, id);
+ return -1;
+ }
+
return 0;
}