]> git.kernelconcepts.de Git - karo-tx-uboot.git/commitdiff
tegra: Adjust funcmux config test to permit expansion
authorSimon Glass <sjg@chromium.org>
Wed, 11 Jan 2012 12:42:22 +0000 (12:42 +0000)
committerAlbert ARIBAUD <albert.u.boot@aribaud.net>
Sun, 12 Feb 2012 09:11:22 +0000 (10:11 +0100)
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>
arch/arm/cpu/armv7/tegra2/funcmux.c
arch/arm/include/asm/arch-tegra2/funcmux.h

index 140f8a7370170ea7bbdd276b6213e5f46ac70f7f..d3496c535a34e23751293cdddfc6c588e3718cd4 100644 (file)
 
 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;
 }
index 2d724a2872f8073302c4af07ebe3550d9d83b690..d4f9cfbd0654f913c2e4bdf405d98ef5fc10e08f 100644 (file)
@@ -32,6 +32,9 @@
  * The basic config is 0, and higher numbers indicate different
  * pinmux settings to bring the peripheral out on other pins,
  *
+ * This function also disables tristate for the function's pins,
+ * so that they operate in normal mode.
+ *
  * @param id           Peripheral id
  * @param config       Configuration to use (generally 0)
  * @return 0 if ok, -1 on error (e.g. incorrect id or config)