Patchwork [U-Boot,v2,01/13] tegra: remove support for UART SPI switch

login
register
mail settings
Submitter Allen Martin
Date March 17, 2013, 4:58 a.m.
Message ID <1363496294-31160-2-git-send-email-amartin@nvidia.com>
Download mbox | patch
Permalink /patch/228275/
State Accepted
Delegated to: Tom Warren
Headers show

Comments

Allen Martin - March 17, 2013, 4:58 a.m.
This feature was only used for tegra20 seaboard that had a pinmux
conflict on the SPI pins.  These boards were never manufactured, so
remove this support to clean up SPI driver.

Signed-off-by: Allen Martin <amartin@nvidia.com>
---
 arch/arm/include/asm/arch-tegra/board.h            |    3 +-
 .../arm/include/asm/arch-tegra20/uart-spi-switch.h |   46 -------
 board/nvidia/common/board.c                        |    3 -
 board/nvidia/common/common.mk                      |    1 -
 board/nvidia/common/uart-spi-switch.c              |  125 --------------------
 board/nvidia/seaboard/seaboard.c                   |    2 +-
 drivers/spi/tegra_spi.c                            |   25 +---
 7 files changed, 3 insertions(+), 202 deletions(-)
 delete mode 100644 arch/arm/include/asm/arch-tegra20/uart-spi-switch.h
 delete mode 100644 board/nvidia/common/uart-spi-switch.c
Stephen Warren - March 19, 2013, 6:14 p.m.
On 03/16/2013 10:58 PM, Allen Martin wrote:
> This feature was only used for tegra20 seaboard that had a pinmux
> conflict on the SPI pins.  These boards were never manufactured, so
> remove this support to clean up SPI driver.

> diff --git a/drivers/spi/tegra_spi.c b/drivers/spi/tegra_spi.c

> @@ -175,16 +168,8 @@ int spi_claim_bus(struct spi_slave *slave)
>  	 */
>  	pinmux_set_func(PINGRP_GMD, PMUX_FUNC_SFLASH);
>  	pinmux_tristate_disable(PINGRP_LSPI);
> +	pinmux_set_func(PINGRP_GMC, PMUX_FUNC_SFLASH);

As a note for future cleanup, all this pinmux stuff should be moved out
of the SPI driver into the board file's initialization functions.
Simon Glass - March 19, 2013, 7:01 p.m.
Hi Allen,

On Sat, Mar 16, 2013 at 9:58 PM, Allen Martin <amartin@nvidia.com> wrote:
> This feature was only used for tegra20 seaboard that had a pinmux
> conflict on the SPI pins.  These boards were never manufactured, so
> remove this support to clean up SPI driver.
>
> Signed-off-by: Allen Martin <amartin@nvidia.com>
> ---
>  arch/arm/include/asm/arch-tegra/board.h            |    3 +-
>  .../arm/include/asm/arch-tegra20/uart-spi-switch.h |   46 -------
>  board/nvidia/common/board.c                        |    3 -
>  board/nvidia/common/common.mk                      |    1 -
>  board/nvidia/common/uart-spi-switch.c              |  125 --------------------
>  board/nvidia/seaboard/seaboard.c                   |    2 +-
>  drivers/spi/tegra_spi.c                            |   25 +---
>  7 files changed, 3 insertions(+), 202 deletions(-)
>  delete mode 100644 arch/arm/include/asm/arch-tegra20/uart-spi-switch.h
>  delete mode 100644 board/nvidia/common/uart-spi-switch.c

OK, maybe I need to get the T114 booting and stop using the seaboard?

Regards,
Simon
Stephen Warren - March 19, 2013, 7:13 p.m.
On 03/19/2013 01:01 PM, Simon Glass wrote:
> Hi Allen,
> 
> On Sat, Mar 16, 2013 at 9:58 PM, Allen Martin <amartin@nvidia.com> wrote:
>> This feature was only used for tegra20 seaboard that had a pinmux
>> conflict on the SPI pins.  These boards were never manufactured, so
>> remove this support to clean up SPI driver.
>>
>> Signed-off-by: Allen Martin <amartin@nvidia.com>
>> ---
>>  arch/arm/include/asm/arch-tegra/board.h            |    3 +-
>>  .../arm/include/asm/arch-tegra20/uart-spi-switch.h |   46 -------
>>  board/nvidia/common/board.c                        |    3 -
>>  board/nvidia/common/common.mk                      |    1 -
>>  board/nvidia/common/uart-spi-switch.c              |  125 --------------------
>>  board/nvidia/seaboard/seaboard.c                   |    2 +-
>>  drivers/spi/tegra_spi.c                            |   25 +---
>>  7 files changed, 3 insertions(+), 202 deletions(-)
>>  delete mode 100644 arch/arm/include/asm/arch-tegra20/uart-spi-switch.h
>>  delete mode 100644 board/nvidia/common/uart-spi-switch.c
> 
> OK, maybe I need to get the T114 booting and stop using the seaboard?

Seaboard still works perfectly after this patch (or should; I assume
Allen tested it!). The only issue is that you can't use SPI; the
assumption being that you store the BCT/bootloader in eMMC rather than
SPI and hence have no need to use SPI. SPI can be tested on other
Tegra20 board designs, such as TrimSlice (or perhaps Kaen/Aebl if
they're still around!)
Simon Glass - March 21, 2013, 9:04 p.m.
Hi Stephen,

On Tue, Mar 19, 2013 at 12:13 PM, Stephen Warren <swarren@wwwdotorg.org> wrote:
> On 03/19/2013 01:01 PM, Simon Glass wrote:
>> Hi Allen,
>>
>> On Sat, Mar 16, 2013 at 9:58 PM, Allen Martin <amartin@nvidia.com> wrote:
>>> This feature was only used for tegra20 seaboard that had a pinmux
>>> conflict on the SPI pins.  These boards were never manufactured, so
>>> remove this support to clean up SPI driver.
>>>
>>> Signed-off-by: Allen Martin <amartin@nvidia.com>
>>> ---
>>>  arch/arm/include/asm/arch-tegra/board.h            |    3 +-
>>>  .../arm/include/asm/arch-tegra20/uart-spi-switch.h |   46 -------
>>>  board/nvidia/common/board.c                        |    3 -
>>>  board/nvidia/common/common.mk                      |    1 -
>>>  board/nvidia/common/uart-spi-switch.c              |  125 --------------------
>>>  board/nvidia/seaboard/seaboard.c                   |    2 +-
>>>  drivers/spi/tegra_spi.c                            |   25 +---
>>>  7 files changed, 3 insertions(+), 202 deletions(-)
>>>  delete mode 100644 arch/arm/include/asm/arch-tegra20/uart-spi-switch.h
>>>  delete mode 100644 board/nvidia/common/uart-spi-switch.c
>>
>> OK, maybe I need to get the T114 booting and stop using the seaboard?
>
> Seaboard still works perfectly after this patch (or should; I assume
> Allen tested it!). The only issue is that you can't use SPI; the
> assumption being that you store the BCT/bootloader in eMMC rather than
> SPI and hence have no need to use SPI. SPI can be tested on other
> Tegra20 board designs, such as TrimSlice (or perhaps Kaen/Aebl if
> they're still around!)

OK that's no problem I think.

Regards,
Simon

Patch

diff --git a/arch/arm/include/asm/arch-tegra/board.h b/arch/arm/include/asm/arch-tegra/board.h
index 3db0d93..1a66990 100644
--- a/arch/arm/include/asm/arch-tegra/board.h
+++ b/arch/arm/include/asm/arch-tegra/board.h
@@ -25,8 +25,7 @@ 
 #define _TEGRA_BOARD_H_
 
 /* Set up pinmux to make UART usable */
-void gpio_config_uart(void);      /* CONFIG_SPI_UART_SWITCH */
-void gpio_early_init_uart(void);  /*!CONFIG_SPI_UART_SWITCH */
+void gpio_early_init_uart(void);
 
 /* Set up early UART output */
 void board_init_uart_f(void);
diff --git a/arch/arm/include/asm/arch-tegra20/uart-spi-switch.h b/arch/arm/include/asm/arch-tegra20/uart-spi-switch.h
deleted file mode 100644
index 82ac180..0000000
--- a/arch/arm/include/asm/arch-tegra20/uart-spi-switch.h
+++ /dev/null
@@ -1,46 +0,0 @@ 
-/*
- * 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
- */
-
-#ifndef _UART_SPI_SWITCH_H
-#define _UART_SPI_SWITCH_H
-
-#if defined(CONFIG_SPI_UART_SWITCH)
-/*
- * Signal that we are about to use the UART. This unfortunate hack is
- * required by Seaboard, which cannot use its console and SPI at the same
- * time! If the board file provides this, the board config will declare it.
- * Let this be a lesson for others.
- */
-void pinmux_select_uart(void);
-
-/*
- * Signal that we are about the use the SPI bus.
- */
-void pinmux_select_spi(void);
-
-#else /* not CONFIG_SPI_UART_SWITCH */
-
-static inline void pinmux_select_uart(void) {}
-static inline void pinmux_select_spi(void) {}
-
-#endif
-
-#endif
diff --git a/board/nvidia/common/board.c b/board/nvidia/common/board.c
index 7d9f361..b6e6566 100644
--- a/board/nvidia/common/board.c
+++ b/board/nvidia/common/board.c
@@ -132,9 +132,6 @@  int board_init(void)
 	clock_init();
 	clock_verify();
 
-#ifdef CONFIG_SPI_UART_SWITCH
-	gpio_config_uart();
-#endif
 #if defined(CONFIG_TEGRA_SPI) || defined(CONFIG_TEGRA_SLINK)
 	pin_mux_spi();
 	spi_init();
diff --git a/board/nvidia/common/common.mk b/board/nvidia/common/common.mk
index bd6202c..d9bcb85 100644
--- a/board/nvidia/common/common.mk
+++ b/board/nvidia/common/common.mk
@@ -1,4 +1,3 @@ 
 # common options for all tegra boards
 COBJS-y	+= ../../nvidia/common/board.o
-COBJS-$(CONFIG_SPI_UART_SWITCH) += ../../nvidia/common/uart-spi-switch.o
 COBJS-$(CONFIG_TEGRA_CLOCK_SCALING) += ../../nvidia/common/emc.o
diff --git a/board/nvidia/common/uart-spi-switch.c b/board/nvidia/common/uart-spi-switch.c
deleted file mode 100644
index e9d445d..0000000
--- a/board/nvidia/common/uart-spi-switch.c
+++ /dev/null
@@ -1,125 +0,0 @@ 
-/*
- * 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
- */
-
-#include <common.h>
-#include <asm/gpio.h>
-#include <asm/arch/pinmux.h>
-#include <asm/arch/uart-spi-switch.h>
-#include <asm/arch/tegra.h>
-#include <asm/arch-tegra/tegra_spi.h>
-#include <asm/arch-tegra/board.h>
-
-/* position of the UART/SPI select switch */
-enum spi_uart_switch {
-	SWITCH_UNKNOWN,
-	SWITCH_SPI,
-	SWITCH_UART,
-	SWITCH_BOTH
-};
-
-/* Information about the spi/uart switch */
-struct spi_uart {
-	int gpio;                       /* GPIO to control switch */
-	u32 port;                       /* Port number of UART affected */
-};
-
-static struct spi_uart local;
-static enum spi_uart_switch switch_pos; /* Current switch position */
-
-
-static void get_config(struct spi_uart *config)
-{
-#if defined CONFIG_SPI_CORRUPTS_UART
-	config->gpio = CONFIG_UART_DISABLE_GPIO;
-	config->port = CONFIG_SPI_CORRUPTS_UART_NR;
-#else
-	config->gpio = -1;
-#endif
-}
-
-/*
- * Init the UART / SPI switch. This can be called before relocation so we must
- * not access BSS.
- */
-void gpio_early_init_uart(void)
-{
-	struct spi_uart config;
-
-	get_config(&config);
-	if (config.gpio != -1) {
-		/* Cannot provide a label prior to relocation */
-		gpio_request(config.gpio, NULL);
-		gpio_direction_output(config.gpio, 0);
-	}
-}
-
-/*
- * Configure the UART / SPI switch.
- */
-void gpio_config_uart(void)
-{
-	get_config(&local);
-	if (local.gpio != -1) {
-		gpio_direction_output(local.gpio, 0);
-		switch_pos = SWITCH_UART;
-	} else {
-		/*
-		 * If we're here we don't have a SPI switch; go ahead and
-		 * enable the SPI now.  We didn't in spi_init() so we wouldn't
-		 * kill the UART.
-		 */
-		pinmux_set_func(PINGRP_GMC, PMUX_FUNC_SFLASH);
-		switch_pos = SWITCH_BOTH;
-	}
-}
-
-static void spi_uart_switch(struct spi_uart *config,
-			      enum spi_uart_switch new_pos)
-{
-	if (switch_pos == SWITCH_BOTH || new_pos == switch_pos)
-		return;
-
-	/* pre-delay, allow SPI/UART to settle, FIFO to empty, etc. */
-	udelay(CONFIG_SPI_CORRUPTS_UART_DLY);
-
-	/* We need to dynamically change the pinmux, shared w/UART RXD/CTS */
-	pinmux_set_func(PINGRP_GMC, new_pos == SWITCH_SPI ?
-				PMUX_FUNC_SFLASH : PMUX_FUNC_UARTD);
-
-	/*
-	 * On Seaboard, MOSI/MISO are shared w/UART.
-	 * Use GPIO I3 (UART_DISABLE) to tristate UART during SPI activity.
-	 * Enable UART later (cs_deactivate) so we can use it for U-Boot comms.
-	 */
-	gpio_direction_output(config->gpio, new_pos == SWITCH_SPI);
-	switch_pos = new_pos;
-}
-
-void pinmux_select_uart(void)
-{
-		spi_uart_switch(&local, SWITCH_UART);
-}
-
-void pinmux_select_spi(void)
-{
-	spi_uart_switch(&local, SWITCH_SPI);
-}
diff --git a/board/nvidia/seaboard/seaboard.c b/board/nvidia/seaboard/seaboard.c
index e581fdd..498e513 100644
--- a/board/nvidia/seaboard/seaboard.c
+++ b/board/nvidia/seaboard/seaboard.c
@@ -31,7 +31,7 @@ 
 #include <asm/gpio.h>
 
 /* TODO: Remove this code when the SPI switch is working */
-#if !defined(CONFIG_SPI_UART_SWITCH) && (CONFIG_MACH_TYPE != MACH_TYPE_VENTANA)
+#if (CONFIG_MACH_TYPE != MACH_TYPE_VENTANA)
 void gpio_early_init_uart(void)
 {
 	/* Enable UART via GPIO_PI3 (port 8, bit 3) so serial console works */
diff --git a/drivers/spi/tegra_spi.c b/drivers/spi/tegra_spi.c
index ce19095..2662923 100644
--- a/drivers/spi/tegra_spi.c
+++ b/drivers/spi/tegra_spi.c
@@ -28,7 +28,6 @@ 
 #include <asm/gpio.h>
 #include <asm/arch/clock.h>
 #include <asm/arch/pinmux.h>
-#include <asm/arch/uart-spi-switch.h>
 #include <asm/arch-tegra/clk_rst.h>
 #include <asm/arch-tegra/tegra_spi.h>
 #include <spi.h>
@@ -36,12 +35,6 @@ 
 
 DECLARE_GLOBAL_DATA_PTR;
 
-#if defined(CONFIG_SPI_CORRUPTS_UART)
- #define corrupt_delay()	udelay(CONFIG_SPI_CORRUPTS_UART_DLY);
-#else
- #define corrupt_delay()
-#endif
-
 struct tegra_spi_slave {
 	struct spi_slave slave;
 	struct spi_tegra *regs;
@@ -175,16 +168,8 @@  int spi_claim_bus(struct spi_slave *slave)
 	 */
 	pinmux_set_func(PINGRP_GMD, PMUX_FUNC_SFLASH);
 	pinmux_tristate_disable(PINGRP_LSPI);
+	pinmux_set_func(PINGRP_GMC, PMUX_FUNC_SFLASH);
 
-#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;
 }
 
@@ -202,24 +187,16 @@  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);
-
-	corrupt_delay();		/* Let UART settle */
 }
 
 void spi_cs_deactivate(struct spi_slave *slave)
 {
 	struct tegra_spi_slave *spi = to_tegra_spi(slave);
 
-	pinmux_select_uart();
-
 	/* CS is negated on Tegra, so drive a 0 to get a 1 */
 	clrbits_le32(&spi->regs->command, SPI_CMD_CS_VAL);
-
-	corrupt_delay();		/* Let SPI settle */
 }
 
 int spi_xfer(struct spi_slave *slave, unsigned int bitlen,