summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStephen Warren <swarren@nvidia.com>2012-01-06 12:14:40 +0000
committerAlbert ARIBAUD <albert.u.boot@aribaud.net>2012-02-12 10:11:22 +0100
commit4850ab9a4f441129b1cde021d58855b3936c4e51 (patch)
tree6f7952742c3b5620be11a7418106796801e51165
parent9cbfee6dc200cc746394c7efc10253a24f3ce108 (diff)
downloadu-boot-imx-4850ab9a4f441129b1cde021d58855b3936c4e51.zip
u-boot-imx-4850ab9a4f441129b1cde021d58855b3936c4e51.tar.gz
u-boot-imx-4850ab9a4f441129b1cde021d58855b3936c4e51.tar.bz2
tegra2: Fix conflicting pinmux for UARTA
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. Signed-off-by: Stephen Warren <swarren@nvidia.com> Acked-by: Simon Glass <sjg@chromium.org> Tested-by: Simon Glass <sjg@chromium.org> Signed-off-by: Tom Warren <twarren@nvidia.com>
-rw-r--r--arch/arm/cpu/armv7/tegra2/funcmux.c12
1 files changed, 12 insertions, 0 deletions
diff --git a/arch/arm/cpu/armv7/tegra2/funcmux.c b/arch/arm/cpu/armv7/tegra2/funcmux.c
index 0878f51..140f8a7 100644
--- a/arch/arm/cpu/armv7/tegra2/funcmux.c
+++ b/arch/arm/cpu/armv7/tegra2/funcmux.c
@@ -37,6 +37,18 @@ int funcmux_select(enum periph_id id, int config)
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);
break;
case PERIPH_ID_UART2: