Message ID | 1453831183-22998-1-git-send-email-swarren@wwwdotorg.org |
---|---|
State | Accepted |
Commit | dd8204de157e10c080aa2cdc0f24bcb2e4ac73dd |
Delegated to: | Simon Glass |
Headers | show |
On 26 January 2016 at 10:59, Stephen Warren <swarren@wwwdotorg.org> wrote: > > From: Stephen Warren <swarren@nvidia.com> > > 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> > --- > This patch needs to be applied along with the next patch in this series, > likely in u-boot-dm since that patch modifies test code that's only > currently present in u-boot-dm. > --- > arch/arm/mach-tegra/Kconfig | 13 +++++++++++++ > arch/arm/mach-tegra/board2.c | 10 +++++++++- > 2 files changed, 22 insertions(+), 1 deletion(-) Reviewed-by: Simon Glass <sjg@chromium.org>
On 26 January 2016 at 12:59, Simon Glass <sjg@chromium.org> wrote: > On 26 January 2016 at 10:59, Stephen Warren <swarren@wwwdotorg.org> wrote: >> >> From: Stephen Warren <swarren@nvidia.com> >> >> 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> >> --- >> This patch needs to be applied along with the next patch in this series, >> likely in u-boot-dm since that patch modifies test code that's only >> currently present in u-boot-dm. >> --- >> arch/arm/mach-tegra/Kconfig | 13 +++++++++++++ >> arch/arm/mach-tegra/board2.c | 10 +++++++++- >> 2 files changed, 22 insertions(+), 1 deletion(-) > > > Reviewed-by: Simon Glass <sjg@chromium.org> Applied to u-boot-dm, thanks!
diff --git a/arch/arm/mach-tegra/Kconfig b/arch/arm/mach-tegra/Kconfig index 48a387c95713..0b2852c4dae5 100644 --- a/arch/arm/mach-tegra/Kconfig +++ b/arch/arm/mach-tegra/Kconfig @@ -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 diff --git a/arch/arm/mach-tegra/board2.c b/arch/arm/mach-tegra/board2.c index a650abd731ad..60e19c838784 100644 --- a/arch/arm/mach-tegra/board2.c +++ b/arch/arm/mach-tegra/board2.c @@ -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())