diff mbox

[U-Boot,1/3] tegra2: Fix conflicting pinmux for UARTA

Message ID 1325888082-20027-1-git-send-email-swarren@nvidia.com
State Accepted
Commit 4850ab9a4f441129b1cde021d58855b3936c4e51
Headers show

Commit Message

Stephen Warren Jan. 6, 2012, 10:14 p.m. UTC
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>
---
 arch/arm/cpu/armv7/tegra2/funcmux.c |   12 ++++++++++++
 1 files changed, 12 insertions(+), 0 deletions(-)

Comments

Simon Glass Jan. 9, 2012, 7:35 p.m. UTC | #1
On Fri, Jan 6, 2012 at 2:14 PM, Stephen Warren <swarren@nvidia.com> wrote:
> 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>

Tested on Seaboard.

Acked-by: Simon Glass <sjg@chromium.org>
Tested-by: Simon Glass <sjg@chromium.org>

> ---
>  arch/arm/cpu/armv7/tegra2/funcmux.c |   12 ++++++++++++
>  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:
> --
> 1.7.0.4
>
diff mbox

Patch

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: