|
@@ -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;
|
|
|
}
|