u-boot-brain/arch/arm/cpu/armv7/tegra2/funcmux.c
Stephen Warren 4850ab9a4f 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>
2012-02-12 10:11:22 +01:00

71 lines
2.2 KiB
C

/*
* Copyright (c) 2011 The Chromium OS Authors.
* See file CREDITS for list of people who contributed to this
* project.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*/
/* Tegra2 high-level function multiplexing */
#include <common.h>
#include <asm/arch/clock.h>
#include <asm/arch/pinmux.h>
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;
}
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);
break;
case PERIPH_ID_UART2:
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);
break;
default:
debug("%s: invalid periph_id %d", __func__, id);
return -1;
}
return 0;
}