ARM: tegra: shut down USB device controller at boot
authorStephen Warren <swarren@nvidia.com>
Tue, 26 Jan 2016 17:59:42 +0000 (10:59 -0700)
committerSimon Glass <sjg@chromium.org>
Fri, 29 Jan 2016 04:01:23 +0000 (21:01 -0700)
When loading U-Boot into RAM over USB protocols using tools such as
tegrarcm or L4T's exec-uboot.sh/tegraflash.py, Tegra's USB device
mode controller is initialized and enumerated by the host PC running
the tool. Unfortunately, these tools do not shut down the USB
controller before executing the downloaded code, and so the host PC
does not "de-enumerate" the USB device. This patch implements optional
code to shut down the USB controller when U-Boot boots to avoid leaving
a stale USB device present.

Signed-off-by: Stephen Warren <swarren@nvidia.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
arch/arm/mach-tegra/Kconfig
arch/arm/mach-tegra/board2.c

index 48a387c95713cf33cf8677e34f4275dd01cc2bf1..0b2852c4dae5782a9d600c70fdfa31fa02bfc227 100644 (file)
@@ -52,6 +52,19 @@ config TEGRA210
 
 endchoice
 
+config TEGRA_DISCONNECT_UDC_ON_BOOT
+       bool "Disconnect USB device mode controller on boot"
+       default y
+       help
+         When loading U-Boot into RAM over USB protocols using tools such as
+         tegrarcm or L4T's exec-uboot.sh/tegraflash.py, Tegra's USB device
+         mode controller is initialized and enumerated by the host PC running
+         the tool. Unfortunately, these tools do not shut down the USB
+         controller before executing the downloaded code, and so the host PC
+         does not "de-enumerate" the USB device. This option shuts down the
+         USB controller when U-Boot boots to avoid leaving a stale USB device
+         present.
+
 config SYS_MALLOC_F_LEN
        default 0x1800
 
index a650abd731adb78ae30dd0d03bdf5d16d3757e56..60e19c838784ec0fb2cb05e701c1314acaaee5bb 100644 (file)
@@ -34,8 +34,8 @@
 #ifdef CONFIG_TEGRA_CLOCK_SCALING
 #include <asm/arch/emc.h>
 #endif
-#ifdef CONFIG_USB_EHCI_TEGRA
 #include <asm/arch-tegra/usb.h>
+#ifdef CONFIG_USB_EHCI_TEGRA
 #include <usb.h>
 #endif
 #ifdef CONFIG_TEGRA_MMC
@@ -201,6 +201,14 @@ void gpio_early_init(void) __attribute__((weak, alias("__gpio_early_init")));
 
 int board_early_init_f(void)
 {
+#if defined(CONFIG_TEGRA_DISCONNECT_UDC_ON_BOOT)
+#define USBCMD_FS2 (1 << 15)
+       {
+               struct usb_ctlr *usbctlr = (struct usb_ctlr *)0x7d000000;
+               writel(USBCMD_FS2, &usbctlr->usb_cmd);
+       }
+#endif
+
        /* Do any special system timer/TSC setup */
 #if defined(CONFIG_TEGRA_SUPPORT_NON_SECURE)
        if (!tegra_cpu_is_non_secure())