93c0afe
From a2872b1e2f81e04f92f0970e18c6c8a40640eea8 Mon Sep 17 00:00:00 2001
2b2f1d4
From: Peter Robinson <pbrobinson@gmail.com>
93c0afe
Date: Wed, 5 Sep 2018 12:11:40 +0100
93c0afe
Subject: [PATCH] tegra fix tx1
2b2f1d4
93c0afe
Signed-off-by: Peter Robinson <pbrobinson@gmail.com>
2b2f1d4
---
93c0afe
 arch/arm/include/asm/arch-tegra/xusb-padctl.h |  1 +
93c0afe
 arch/arm/mach-tegra/board.c                   |  4 +-
93c0afe
 arch/arm/mach-tegra/board2.c                  | 12 ++++
93c0afe
 arch/arm/mach-tegra/dt-setup.c                |  5 +-
93c0afe
 arch/arm/mach-tegra/gpu.c                     |  2 +
93c0afe
 .../mach-tegra/{tegra186 => }/nvtboot_board.c | 70 +++++++++++++++++++
93c0afe
 .../mach-tegra/{tegra186 => }/nvtboot_ll.S    |  0
93c0afe
 .../mach-tegra/{tegra186 => }/nvtboot_mem.c   |  0
93c0afe
 arch/arm/mach-tegra/tegra186/Makefile         |  6 +-
93c0afe
 arch/arm/mach-tegra/tegra210/Makefile         |  3 +
93c0afe
 arch/arm/mach-tegra/tegra210/clock.c          | 19 -----
93c0afe
 arch/arm/mach-tegra/tegra210/xusb-padctl.c    | 68 +++++++++++-------
93c0afe
 arch/arm/mach-tegra/xusb-padctl-dummy.c       |  4 ++
93c0afe
 configs/p2371-0000_defconfig                  |  2 +-
93c0afe
 configs/p2371-2180_defconfig                  |  2 +-
93c0afe
 configs/p2571_defconfig                       |  2 +-
93c0afe
 16 files changed, 146 insertions(+), 54 deletions(-)
93c0afe
 rename arch/arm/mach-tegra/{tegra186 => }/nvtboot_board.c (84%)
93c0afe
 rename arch/arm/mach-tegra/{tegra186 => }/nvtboot_ll.S (100%)
93c0afe
 rename arch/arm/mach-tegra/{tegra186 => }/nvtboot_mem.c (100%)
2b2f1d4
93c0afe
diff --git a/arch/arm/include/asm/arch-tegra/xusb-padctl.h b/arch/arm/include/asm/arch-tegra/xusb-padctl.h
93c0afe
index deccdf455d..7e14d8109d 100644
93c0afe
--- a/arch/arm/include/asm/arch-tegra/xusb-padctl.h
93c0afe
+++ b/arch/arm/include/asm/arch-tegra/xusb-padctl.h
93c0afe
@@ -16,6 +16,7 @@ struct tegra_xusb_phy;
93c0afe
 struct tegra_xusb_phy *tegra_xusb_phy_get(unsigned int type);
93c0afe
 
93c0afe
 void tegra_xusb_padctl_init(void);
93c0afe
+void tegra_xusb_padctl_exit(void);
93c0afe
 int tegra_xusb_phy_prepare(struct tegra_xusb_phy *phy);
93c0afe
 int tegra_xusb_phy_enable(struct tegra_xusb_phy *phy);
93c0afe
 int tegra_xusb_phy_disable(struct tegra_xusb_phy *phy);
2b2f1d4
diff --git a/arch/arm/mach-tegra/board.c b/arch/arm/mach-tegra/board.c
93c0afe
index f8fc042a1d..ddef228831 100644
2b2f1d4
--- a/arch/arm/mach-tegra/board.c
2b2f1d4
+++ b/arch/arm/mach-tegra/board.c
2b2f1d4
@@ -35,7 +35,7 @@ enum {
2b2f1d4
 
2b2f1d4
 static bool from_spl __attribute__ ((section(".data")));
2b2f1d4
 
2b2f1d4
-#ifndef CONFIG_SPL_BUILD
2b2f1d4
+#if !defined(CONFIG_SPL_BUILD) && !defined(CONFIG_TEGRA210)
2b2f1d4
 void save_boot_params(u32 r0, u32 r1, u32 r2, u32 r3)
2b2f1d4
 {
2b2f1d4
 	from_spl = r0 != UBOOT_NOT_LOADED_FROM_SPL;
2b2f1d4
@@ -66,6 +66,7 @@ bool tegra_cpu_is_non_secure(void)
2b2f1d4
 }
2b2f1d4
 #endif
2b2f1d4
 
2b2f1d4
+#if !defined(CONFIG_ARM64)
2b2f1d4
 /* Read the RAM size directly from the memory controller */
2b2f1d4
 static phys_size_t query_sdram_size(void)
2b2f1d4
 {
2b2f1d4
@@ -122,6 +123,7 @@ int dram_init(void)
2b2f1d4
 	gd->ram_size = query_sdram_size();
2b2f1d4
 	return 0;
2b2f1d4
 }
2b2f1d4
+#endif
2b2f1d4
 
2b2f1d4
 static int uart_configs[] = {
2b2f1d4
 #if defined(CONFIG_TEGRA20)
2b2f1d4
diff --git a/arch/arm/mach-tegra/board2.c b/arch/arm/mach-tegra/board2.c
93c0afe
index 421a71b301..22ecd99760 100644
2b2f1d4
--- a/arch/arm/mach-tegra/board2.c
2b2f1d4
+++ b/arch/arm/mach-tegra/board2.c
93c0afe
@@ -171,6 +171,12 @@ int board_init(void)
93c0afe
 	return nvidia_board_init();
93c0afe
 }
93c0afe
 
93c0afe
+void board_cleanup_before_linux(void)
93c0afe
+{
93c0afe
+	/* power down UPHY PLL */
93c0afe
+	tegra_xusb_padctl_exit();
93c0afe
+}
93c0afe
+
93c0afe
 #ifdef CONFIG_BOARD_EARLY_INIT_F
93c0afe
 static void __gpio_early_init(void)
93c0afe
 {
93c0afe
@@ -220,9 +226,14 @@ int board_late_init(void)
2b2f1d4
 #endif
2b2f1d4
 	start_cpu_fan();
2b2f1d4
 
2b2f1d4
+#if defined(CONFIG_TEGRA210)
2b2f1d4
+	tegra_soc_board_init_late();
2b2f1d4
+#endif
2b2f1d4
+
2b2f1d4
 	return 0;
2b2f1d4
 }
2b2f1d4
 
2b2f1d4
+#ifndef CONFIG_TEGRA210
2b2f1d4
 /*
2b2f1d4
  * In some SW environments, a memory carve-out exists to house a secure
2b2f1d4
  * monitor, a trusted OS, and/or various statically allocated media buffers.
93c0afe
@@ -348,3 +359,4 @@ ulong board_get_usable_ram_top(ulong total_size)
2b2f1d4
 {
2b2f1d4
 	return CONFIG_SYS_SDRAM_BASE + usable_ram_size_below_4g();
2b2f1d4
 }
2b2f1d4
+#endif
2b2f1d4
diff --git a/arch/arm/mach-tegra/dt-setup.c b/arch/arm/mach-tegra/dt-setup.c
93c0afe
index 8ac723f41e..a961fab20f 100644
2b2f1d4
--- a/arch/arm/mach-tegra/dt-setup.c
2b2f1d4
+++ b/arch/arm/mach-tegra/dt-setup.c
2b2f1d4
@@ -12,12 +12,10 @@
2b2f1d4
  */
2b2f1d4
 int ft_system_setup(void *blob, bd_t *bd)
2b2f1d4
 {
2b2f1d4
+#if !defined(CONFIG_ARM64)
2b2f1d4
 	const char *gpu_compats[] = {
2b2f1d4
 #if defined(CONFIG_TEGRA124)
2b2f1d4
 		"nvidia,gk20a",
2b2f1d4
-#endif
2b2f1d4
-#if defined(CONFIG_TEGRA210)
2b2f1d4
-		"nvidia,gm20b",
2b2f1d4
 #endif
2b2f1d4
 	};
2b2f1d4
 	int i, ret;
2b2f1d4
@@ -28,6 +26,7 @@ int ft_system_setup(void *blob, bd_t *bd)
2b2f1d4
 		if (ret)
2b2f1d4
 			return ret;
2b2f1d4
 	}
2b2f1d4
+#endif
2b2f1d4
 
2b2f1d4
 	return 0;
2b2f1d4
 }
2b2f1d4
diff --git a/arch/arm/mach-tegra/gpu.c b/arch/arm/mach-tegra/gpu.c
93c0afe
index e047f67821..3b8c1a0434 100644
2b2f1d4
--- a/arch/arm/mach-tegra/gpu.c
2b2f1d4
+++ b/arch/arm/mach-tegra/gpu.c
2b2f1d4
@@ -17,6 +17,7 @@ static bool _configured;
2b2f1d4
 
2b2f1d4
 void tegra_gpu_config(void)
2b2f1d4
 {
2b2f1d4
+#if !defined(CONFIG_ARM64)
2b2f1d4
 	struct mc_ctlr *mc = (struct mc_ctlr *)NV_PA_MC_BASE;
2b2f1d4
 
2b2f1d4
 #if defined(CONFIG_TEGRA_SUPPORT_NON_SECURE)
2b2f1d4
@@ -34,6 +35,7 @@ void tegra_gpu_config(void)
2b2f1d4
 	debug("configured VPR\n");
2b2f1d4
 
2b2f1d4
 	_configured = true;
2b2f1d4
+#endif
2b2f1d4
 }
2b2f1d4
 
2b2f1d4
 #if defined(CONFIG_OF_LIBFDT)
93c0afe
diff --git a/arch/arm/mach-tegra/tegra186/nvtboot_board.c b/arch/arm/mach-tegra/nvtboot_board.c
93c0afe
similarity index 84%
93c0afe
rename from arch/arm/mach-tegra/tegra186/nvtboot_board.c
93c0afe
rename to arch/arm/mach-tegra/nvtboot_board.c
93c0afe
index 83c0e931ea..7b98b502ef 100644
2b2f1d4
--- a/arch/arm/mach-tegra/tegra186/nvtboot_board.c
2b2f1d4
+++ b/arch/arm/mach-tegra/nvtboot_board.c
93c0afe
@@ -5,6 +5,7 @@
93c0afe
 
93c0afe
 #include <stdlib.h>
93c0afe
 #include <common.h>
2b2f1d4
+#include <linux/ctype.h>
93c0afe
 #include <fdt_support.h>
93c0afe
 #include <fdtdec.h>
93c0afe
 #include <asm/arch/tegra.h>
93c0afe
@@ -270,6 +271,27 @@ static void set_calculated_env_vars(void)
93c0afe
 	free(vars);
93c0afe
 }
93c0afe
 
2b2f1d4
+char *strstrip(char *s)
2b2f1d4
+{
2b2f1d4
+    size_t size;
2b2f1d4
+    char *end;
2b2f1d4
+
2b2f1d4
+    size = strlen(s);
2b2f1d4
+
2b2f1d4
+    if (!size)
2b2f1d4
+        return s;
2b2f1d4
+
2b2f1d4
+    end = s + size - 1;
2b2f1d4
+    while (end >= s && isblank(*end))
2b2f1d4
+        end--;
2b2f1d4
+    *(end + 1) = '\0';
2b2f1d4
+
2b2f1d4
+    while (*s && isblank(*s))
2b2f1d4
+        s++;
2b2f1d4
+
2b2f1d4
+    return s;
2b2f1d4
+}
2b2f1d4
+
93c0afe
 static int set_fdt_addr(void)
93c0afe
 {
93c0afe
 	int ret;
93c0afe
@@ -283,6 +305,7 @@ static int set_fdt_addr(void)
93c0afe
 	return 0;
93c0afe
 }
93c0afe
 
2b2f1d4
+#if defined(CONFIG_TEGRA186)
93c0afe
 /*
93c0afe
  * Attempt to use /chosen/nvidia,ether-mac in the nvtboot DTB to U-Boot's
93c0afe
  * ethaddr environment variable if possible.
93c0afe
@@ -316,6 +339,49 @@ static int set_ethaddr_from_nvtboot(void)
93c0afe
 
93c0afe
 	return 0;
93c0afe
 }
2b2f1d4
+#endif
2b2f1d4
+
2b2f1d4
+static int set_cbootargs(void)
2b2f1d4
+{
2b2f1d4
+	const void *nvtboot_blob = (void *)nvtboot_boot_x0;
2b2f1d4
+	const void *prop;
2b2f1d4
+	char *bargs, *s;
2b2f1d4
+	int node, len, ret = 0;
2b2f1d4
+
2b2f1d4
+	/*
2b2f1d4
+	 * Save the bootargs passed in the DTB by the previous bootloader
2b2f1d4
+	 * (CBoot) to the env. (pointer in reg x0)
2b2f1d4
+	 */
2b2f1d4
+
2b2f1d4
+	debug("%s: nvtboot_blob = %p\n", __func__, nvtboot_blob);
2b2f1d4
+
2b2f1d4
+	node = fdt_path_offset(nvtboot_blob, "/chosen");
2b2f1d4
+	if (node < 0) {
2b2f1d4
+		pr_err("Can't find /chosen node in nvtboot DTB");
2b2f1d4
+		return node;
2b2f1d4
+	}
2b2f1d4
+	debug("%s: found 'chosen' node: %d\n", __func__, node);
2b2f1d4
+
2b2f1d4
+	prop = fdt_getprop(nvtboot_blob, node, "bootargs", &len;;
2b2f1d4
+	if (!prop) {
2b2f1d4
+		pr_err("Can't find /chosen/bootargs property in nvtboot DTB");
2b2f1d4
+		return -ENOENT;
2b2f1d4
+	}
2b2f1d4
+	debug("%s: found 'bootargs' property, len =%d\n",  __func__, len);
2b2f1d4
+
2b2f1d4
+	/* CBoot seems to add trailing whitespace - strip it here */
2b2f1d4
+	s = strdup((char *)prop);
2b2f1d4
+	bargs = strstrip(s);
2b2f1d4
+	debug("%s: bootargs = %s!\n", __func__, bargs);
2b2f1d4
+
2b2f1d4
+        /* Set cbootargs to env for later use by extlinux files */
2b2f1d4
+	ret = env_set("cbootargs", bargs);
2b2f1d4
+	if (ret)
2b2f1d4
+		printf("Failed to set cbootargs from cboot DTB: %d\n", ret);
2b2f1d4
+
2b2f1d4
+	free(s);
2b2f1d4
+	return ret;
2b2f1d4
+}
93c0afe
 
93c0afe
 int tegra_soc_board_init_late(void)
93c0afe
 {
93c0afe
@@ -325,8 +391,12 @@ int tegra_soc_board_init_late(void)
93c0afe
 	 * extlinux.conf or boot script content.
93c0afe
 	 */
93c0afe
 	set_fdt_addr();
2b2f1d4
+#if defined(CONFIG_TEGRA186)
93c0afe
 	/* Ignore errors here; not all cases care about Ethernet addresses */
93c0afe
 	set_ethaddr_from_nvtboot();
2b2f1d4
+#endif
2b2f1d4
+	/* Save CBoot bootargs to env */
2b2f1d4
+	set_cbootargs();
2b2f1d4
 
93c0afe
 	return 0;
2b2f1d4
 }
93c0afe
diff --git a/arch/arm/mach-tegra/tegra186/nvtboot_ll.S b/arch/arm/mach-tegra/nvtboot_ll.S
93c0afe
similarity index 100%
93c0afe
rename from arch/arm/mach-tegra/tegra186/nvtboot_ll.S
93c0afe
rename to arch/arm/mach-tegra/nvtboot_ll.S
93c0afe
diff --git a/arch/arm/mach-tegra/tegra186/nvtboot_mem.c b/arch/arm/mach-tegra/nvtboot_mem.c
93c0afe
similarity index 100%
93c0afe
rename from arch/arm/mach-tegra/tegra186/nvtboot_mem.c
93c0afe
rename to arch/arm/mach-tegra/nvtboot_mem.c
93c0afe
diff --git a/arch/arm/mach-tegra/tegra186/Makefile b/arch/arm/mach-tegra/tegra186/Makefile
93c0afe
index 56f3378ece..1a43ef7a45 100644
93c0afe
--- a/arch/arm/mach-tegra/tegra186/Makefile
93c0afe
+++ b/arch/arm/mach-tegra/tegra186/Makefile
93c0afe
@@ -4,6 +4,6 @@
2b2f1d4
 
93c0afe
 obj-y += ../board186.o
93c0afe
 obj-y += cache.o
93c0afe
-obj-y += nvtboot_board.o
93c0afe
-obj-y += nvtboot_ll.o
93c0afe
-obj-y += nvtboot_mem.o
93c0afe
+obj-y += ../nvtboot_board.o
93c0afe
+obj-y += ../nvtboot_ll.o
93c0afe
+obj-y += ../nvtboot_mem.o
93c0afe
diff --git a/arch/arm/mach-tegra/tegra210/Makefile b/arch/arm/mach-tegra/tegra210/Makefile
93c0afe
index b6012fc7ba..6de6d810eb 100644
93c0afe
--- a/arch/arm/mach-tegra/tegra210/Makefile
93c0afe
+++ b/arch/arm/mach-tegra/tegra210/Makefile
93c0afe
@@ -8,5 +8,8 @@
93c0afe
 obj-y	+= clock.o
93c0afe
 obj-y	+= funcmux.o
93c0afe
 obj-y	+= pinmux.o
93c0afe
+obj-y	+= ../nvtboot_board.o
93c0afe
+obj-y	+= ../nvtboot_ll.o
93c0afe
+obj-y	+= ../nvtboot_mem.o
93c0afe
 obj-y	+= xusb-padctl.o
93c0afe
 obj-y	+= ../xusb-padctl-common.o
2b2f1d4
diff --git a/arch/arm/mach-tegra/tegra210/clock.c b/arch/arm/mach-tegra/tegra210/clock.c
93c0afe
index 06068c4b7b..341c97f16d 100644
2b2f1d4
--- a/arch/arm/mach-tegra/tegra210/clock.c
2b2f1d4
+++ b/arch/arm/mach-tegra/tegra210/clock.c
2b2f1d4
@@ -1235,25 +1235,6 @@ int tegra_plle_enable(void)
2b2f1d4
 	value &= ~PLLE_SS_CNTL_INTERP_RESET;
2b2f1d4
 	writel(value, NV_PA_CLK_RST_BASE + PLLE_SS_CNTL);
2b2f1d4
 
2b2f1d4
-	/* 7. Enable HW power sequencer for PLLE */
2b2f1d4
-
2b2f1d4
-	value = readl(NV_PA_CLK_RST_BASE + PLLE_MISC);
2b2f1d4
-	value &= ~PLLE_MISC_IDDQ_SWCTL;
2b2f1d4
-	writel(value, NV_PA_CLK_RST_BASE + PLLE_MISC);
2b2f1d4
-
2b2f1d4
-	value = readl(NV_PA_CLK_RST_BASE + PLLE_AUX);
2b2f1d4
-	value &= ~PLLE_AUX_SS_SWCTL;
2b2f1d4
-	value &= ~PLLE_AUX_ENABLE_SWCTL;
2b2f1d4
-	value |= PLLE_AUX_SS_SEQ_INCLUDE;
2b2f1d4
-	value |= PLLE_AUX_USE_LOCKDET;
2b2f1d4
-	writel(value, NV_PA_CLK_RST_BASE + PLLE_AUX);
2b2f1d4
-
2b2f1d4
-	/* 8. Wait 1 us */
2b2f1d4
-
2b2f1d4
-	udelay(1);
2b2f1d4
-	value |= PLLE_AUX_SEQ_ENABLE;
2b2f1d4
-	writel(value, NV_PA_CLK_RST_BASE + PLLE_AUX);
2b2f1d4
-
2b2f1d4
 	return 0;
2b2f1d4
 }
2b2f1d4
 
2b2f1d4
diff --git a/arch/arm/mach-tegra/tegra210/xusb-padctl.c b/arch/arm/mach-tegra/tegra210/xusb-padctl.c
93c0afe
index ab6684f027..64dc297ae2 100644
2b2f1d4
--- a/arch/arm/mach-tegra/tegra210/xusb-padctl.c
2b2f1d4
+++ b/arch/arm/mach-tegra/tegra210/xusb-padctl.c
2b2f1d4
@@ -170,6 +170,17 @@ static int phy_unprepare(struct tegra_xusb_phy *phy)
2b2f1d4
 	return tegra_xusb_padctl_disable(phy->padctl);
2b2f1d4
 }
2b2f1d4
 
2b2f1d4
+#define XUSB_PADCTL_USB3_PAD_MUX 0x28
2b2f1d4
+#define  XUSB_PADCTL_USB3_PAD_MUX_FORCE_PCIE_PAD_IDDQ_DISABLE (1 << 0)
2b2f1d4
+#define  XUSB_PADCTL_USB3_PAD_MUX_FORCE_PCIE_PAD_IDDQ_DISABLE_MASK0 (1 << 1)
2b2f1d4
+#define  XUSB_PADCTL_USB3_PAD_MUX_FORCE_PCIE_PAD_IDDQ_DISABLE_MASK1 (1 << 2)
2b2f1d4
+#define  XUSB_PADCTL_USB3_PAD_MUX_FORCE_PCIE_PAD_IDDQ_DISABLE_MASK2 (1 << 3)
2b2f1d4
+#define  XUSB_PADCTL_USB3_PAD_MUX_FORCE_PCIE_PAD_IDDQ_DISABLE_MASK3 (1 << 4)
2b2f1d4
+#define  XUSB_PADCTL_USB3_PAD_MUX_FORCE_PCIE_PAD_IDDQ_DISABLE_MASK4 (1 << 5)
2b2f1d4
+#define  XUSB_PADCTL_USB3_PAD_MUX_FORCE_PCIE_PAD_IDDQ_DISABLE_MASK5 (1 << 6)
2b2f1d4
+#define  XUSB_PADCTL_USB3_PAD_MUX_FORCE_PCIE_PAD_IDDQ_DISABLE_MASK6 (1 << 7)
2b2f1d4
+#define  XUSB_PADCTL_USB3_PAD_MUX_FORCE_SATA_PAD_IDDQ_DISABLE_MASK0 (1 << 8)
2b2f1d4
+
2b2f1d4
 #define XUSB_PADCTL_UPHY_PLL_P0_CTL1 0x360
2b2f1d4
 #define  XUSB_PADCTL_UPHY_PLL_P0_CTL1_FREQ_NDIV_MASK (0xff << 20)
2b2f1d4
 #define  XUSB_PADCTL_UPHY_PLL_P0_CTL1_FREQ_NDIV(x) (((x) & 0xff) << 20)
2b2f1d4
@@ -366,31 +377,6 @@ static int pcie_phy_enable(struct tegra_xusb_phy *phy)
2b2f1d4
 	value &= ~XUSB_PADCTL_UPHY_PLL_P0_CTL8_RCAL_CLK_EN;
2b2f1d4
 	padctl_writel(padctl, value, XUSB_PADCTL_UPHY_PLL_P0_CTL8);
2b2f1d4
 
2b2f1d4
-	value = readl(NV_PA_CLK_RST_BASE + CLK_RST_XUSBIO_PLL_CFG0);
2b2f1d4
-	value &= ~CLK_RST_XUSBIO_PLL_CFG0_PADPLL_RESET_SWCTL;
2b2f1d4
-	value &= ~CLK_RST_XUSBIO_PLL_CFG0_CLK_ENABLE_SWCTL;
2b2f1d4
-	value |= CLK_RST_XUSBIO_PLL_CFG0_PADPLL_USE_LOCKDET;
2b2f1d4
-	value |= CLK_RST_XUSBIO_PLL_CFG0_PADPLL_SLEEP_IDDQ;
2b2f1d4
-	writel(value, NV_PA_CLK_RST_BASE + CLK_RST_XUSBIO_PLL_CFG0);
2b2f1d4
-
2b2f1d4
-	value = padctl_readl(padctl, XUSB_PADCTL_UPHY_PLL_P0_CTL1);
2b2f1d4
-	value &= ~XUSB_PADCTL_UPHY_PLL_P0_CTL1_PWR_OVRD;
2b2f1d4
-	padctl_writel(padctl, value, XUSB_PADCTL_UPHY_PLL_P0_CTL1);
2b2f1d4
-
2b2f1d4
-	value = padctl_readl(padctl, XUSB_PADCTL_UPHY_PLL_P0_CTL2);
2b2f1d4
-	value &= ~XUSB_PADCTL_UPHY_PLL_P0_CTL2_CAL_OVRD;
2b2f1d4
-	padctl_writel(padctl, value, XUSB_PADCTL_UPHY_PLL_P0_CTL2);
2b2f1d4
-
2b2f1d4
-	value = padctl_readl(padctl, XUSB_PADCTL_UPHY_PLL_P0_CTL8);
2b2f1d4
-	value &= ~XUSB_PADCTL_UPHY_PLL_P0_CTL8_RCAL_OVRD;
2b2f1d4
-	padctl_writel(padctl, value, XUSB_PADCTL_UPHY_PLL_P0_CTL8);
2b2f1d4
-
2b2f1d4
-	udelay(1);
2b2f1d4
-
2b2f1d4
-	value = readl(NV_PA_CLK_RST_BASE + CLK_RST_XUSBIO_PLL_CFG0);
2b2f1d4
-	value |= CLK_RST_XUSBIO_PLL_CFG0_SEQ_ENABLE;
2b2f1d4
-	writel(value, NV_PA_CLK_RST_BASE + CLK_RST_XUSBIO_PLL_CFG0);
2b2f1d4
-
2b2f1d4
 	debug("< %s()\n", __func__);
2b2f1d4
 	return 0;
2b2f1d4
 }
2b2f1d4
@@ -454,3 +440,35 @@ void tegra_xusb_padctl_init(void)
2b2f1d4
 	ret = tegra_xusb_process_nodes(nodes, count, &tegra210_socdata);
2b2f1d4
 	debug("%s: done, ret=%d\n", __func__, ret);
2b2f1d4
 }
2b2f1d4
+
2b2f1d4
+void tegra_xusb_padctl_exit(void)
2b2f1d4
+{
2b2f1d4
+	u32 value;
2b2f1d4
+
2b2f1d4
+	debug("> %s\n", __func__);
2b2f1d4
+
2b2f1d4
+	value = padctl_readl(&padctl, XUSB_PADCTL_USB3_PAD_MUX);
2b2f1d4
+	value &= ~XUSB_PADCTL_USB3_PAD_MUX_FORCE_PCIE_PAD_IDDQ_DISABLE;
2b2f1d4
+	value &= ~XUSB_PADCTL_USB3_PAD_MUX_FORCE_PCIE_PAD_IDDQ_DISABLE_MASK0;
2b2f1d4
+	value &= ~XUSB_PADCTL_USB3_PAD_MUX_FORCE_PCIE_PAD_IDDQ_DISABLE_MASK1;
2b2f1d4
+	value &= ~XUSB_PADCTL_USB3_PAD_MUX_FORCE_PCIE_PAD_IDDQ_DISABLE_MASK2;
2b2f1d4
+	value &= ~XUSB_PADCTL_USB3_PAD_MUX_FORCE_PCIE_PAD_IDDQ_DISABLE_MASK3;
2b2f1d4
+	value &= ~XUSB_PADCTL_USB3_PAD_MUX_FORCE_PCIE_PAD_IDDQ_DISABLE_MASK4;
2b2f1d4
+	value &= ~XUSB_PADCTL_USB3_PAD_MUX_FORCE_PCIE_PAD_IDDQ_DISABLE_MASK5;
2b2f1d4
+	value &= ~XUSB_PADCTL_USB3_PAD_MUX_FORCE_PCIE_PAD_IDDQ_DISABLE_MASK6;
2b2f1d4
+	value &= ~XUSB_PADCTL_USB3_PAD_MUX_FORCE_SATA_PAD_IDDQ_DISABLE_MASK0;
2b2f1d4
+	padctl_writel(&padctl, value, XUSB_PADCTL_USB3_PAD_MUX);
2b2f1d4
+
2b2f1d4
+	value = padctl_readl(&padctl, XUSB_PADCTL_UPHY_PLL_P0_CTL1);
2b2f1d4
+	value &= ~XUSB_PADCTL_UPHY_PLL_P0_CTL1_IDDQ;
2b2f1d4
+	value &= ~XUSB_PADCTL_UPHY_PLL_P0_CTL1_SLEEP_MASK;
2b2f1d4
+	value |= XUSB_PADCTL_UPHY_PLL_P0_CTL1_SLEEP(3);
2b2f1d4
+	value &= ~XUSB_PADCTL_UPHY_PLL_P0_CTL1_ENABLE;
2b2f1d4
+	padctl_writel(&padctl, value, XUSB_PADCTL_UPHY_PLL_P0_CTL1);
2b2f1d4
+
2b2f1d4
+	reset_set_enable(PERIPH_ID_PEX_USB_UPHY, 1);
2b2f1d4
+	while (padctl.enable)
2b2f1d4
+		tegra_xusb_padctl_disable(&padctl);
2b2f1d4
+
2b2f1d4
+	debug("< %s()\n", __func__);
2b2f1d4
+}
2b2f1d4
diff --git a/arch/arm/mach-tegra/xusb-padctl-dummy.c b/arch/arm/mach-tegra/xusb-padctl-dummy.c
93c0afe
index 3ec27a2e3a..f2d90302f6 100644
2b2f1d4
--- a/arch/arm/mach-tegra/xusb-padctl-dummy.c
2b2f1d4
+++ b/arch/arm/mach-tegra/xusb-padctl-dummy.c
2b2f1d4
@@ -36,3 +36,7 @@ int __weak tegra_xusb_phy_unprepare(struct tegra_xusb_phy *phy)
2b2f1d4
 void __weak tegra_xusb_padctl_init(void)
2b2f1d4
 {
2b2f1d4
 }
2b2f1d4
+
2b2f1d4
+void __weak tegra_xusb_padctl_exit(void)
2b2f1d4
+{
2b2f1d4
+}
93c0afe
diff --git a/configs/p2371-0000_defconfig b/configs/p2371-0000_defconfig
93c0afe
index 02a7569205..d9b8be15e7 100644
93c0afe
--- a/configs/p2371-0000_defconfig
93c0afe
+++ b/configs/p2371-0000_defconfig
93c0afe
@@ -1,6 +1,6 @@
93c0afe
 CONFIG_ARM=y
93c0afe
 CONFIG_TEGRA=y
93c0afe
-CONFIG_SYS_TEXT_BASE=0x80110000
93c0afe
+CONFIG_SYS_TEXT_BASE=0x80080000
93c0afe
 CONFIG_TEGRA210=y
93c0afe
 CONFIG_TARGET_P2371_0000=y
93c0afe
 CONFIG_NR_DRAM_BANKS=2
93c0afe
diff --git a/configs/p2371-2180_defconfig b/configs/p2371-2180_defconfig
93c0afe
index 156a1cbcf9..602c5c1fad 100644
93c0afe
--- a/configs/p2371-2180_defconfig
93c0afe
+++ b/configs/p2371-2180_defconfig
93c0afe
@@ -1,6 +1,6 @@
93c0afe
 CONFIG_ARM=y
93c0afe
 CONFIG_TEGRA=y
93c0afe
-CONFIG_SYS_TEXT_BASE=0x80110000
93c0afe
+CONFIG_SYS_TEXT_BASE=0x80080000
93c0afe
 CONFIG_TEGRA210=y
93c0afe
 CONFIG_TARGET_P2371_2180=y
93c0afe
 CONFIG_NR_DRAM_BANKS=2
93c0afe
diff --git a/configs/p2571_defconfig b/configs/p2571_defconfig
93c0afe
index 5cbb1c3201..29929e2d99 100644
93c0afe
--- a/configs/p2571_defconfig
93c0afe
+++ b/configs/p2571_defconfig
93c0afe
@@ -1,6 +1,6 @@
93c0afe
 CONFIG_ARM=y
93c0afe
 CONFIG_TEGRA=y
93c0afe
-CONFIG_SYS_TEXT_BASE=0x80110000
93c0afe
+CONFIG_SYS_TEXT_BASE=0x80080000
93c0afe
 CONFIG_TEGRA210=y
93c0afe
 CONFIG_TARGET_P2571=y
93c0afe
 CONFIG_NR_DRAM_BANKS=2
2b2f1d4
-- 
93c0afe
2.19.0.rc0
2b2f1d4