tegra2: spi: Support SPI / UART switch
authorSimon Glass <sjg@chromium.org>
Sat, 5 Nov 2011 04:46:50 +0000 (04:46 +0000)
committerAlbert ARIBAUD <albert.u.boot@aribaud.net>
Sat, 24 Dec 2011 09:23:31 +0000 (10:23 +0100)
Add the SPI / UART switch logic into the Tegra2 SPI driver so that it
can co-exist with the NS16550 UART.

We need the ns16550.h header for NS16550_t for now.

Signed-off-by: Simon Glass <sjg@chromium.org>
Signed-off-by: Tom Warren <twarren@nvidia.com>
drivers/spi/tegra2_spi.c

index fdcad093cf9e5647063cb82e5384510f1ad8ba9e..56cb22963db635b9a5e5b01c5cf3793f1c7ba980 100644 (file)
 #include <spi.h>
 #include <asm/io.h>
 #include <asm/gpio.h>
+#include <ns16550.h>
 #include <asm/arch/clk_rst.h>
 #include <asm/arch/clock.h>
 #include <asm/arch/pinmux.h>
+#include <asm/arch/uart-spi-switch.h>
 #include <asm/arch/tegra2_spi.h>
 
 struct tegra_spi_slave {
@@ -128,6 +130,16 @@ int spi_claim_bus(struct spi_slave *slave)
         */
        pinmux_set_func(PINGRP_GMD, PMUX_FUNC_SFLASH);
        pinmux_tristate_disable(PINGRP_LSPI);
+
+#ifndef CONFIG_SPI_UART_SWITCH
+       /*
+        * NOTE:
+        * Only set PinMux bits 3:2 to SPI here on boards that don't have the
+        * SPI UART switch or subsequent UART data won't go out!  See
+        * spi_uart_switch().
+        */
+       /* TODO: pinmux_set_func(PINGRP_GMC, PMUX_FUNC_SFLASH); */
+#endif
        return 0;
 }
 
@@ -145,6 +157,8 @@ void spi_cs_activate(struct spi_slave *slave)
 {
        struct tegra_spi_slave *spi = to_tegra_spi(slave);
 
+       pinmux_select_spi();
+
        /* CS is negated on Tegra, so drive a 1 to get a 0 */
        setbits_le32(&spi->regs->command, SPI_CMD_CS_VAL);
 }