summaryrefslogtreecommitdiff
path: root/arch/arm/mach-tegra/common.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/arm/mach-tegra/common.c')
-rw-r--r--arch/arm/mach-tegra/common.c16
1 files changed, 16 insertions, 0 deletions
diff --git a/arch/arm/mach-tegra/common.c b/arch/arm/mach-tegra/common.c
index cf4ad3ae3515..ac19626e02d6 100644
--- a/arch/arm/mach-tegra/common.c
+++ b/arch/arm/mach-tegra/common.c
@@ -59,6 +59,9 @@
#define ENB_FAST_REARBITRATE BIT(2)
#define DONT_SPLIT_AHB_WR BIT(7)
+#define RECOVERY_MODE BIT(31)
+#define BOOTLOADER_MODE BIT(30)
+
#define AHB_GIZMO_USB 0x1c
#define AHB_GIZMO_USB2 0x78
#define AHB_GIZMO_USB3 0x7c
@@ -113,6 +116,19 @@ void tegra_assert_system_reset(char mode, const char *cmd)
void __iomem *reset = IO_ADDRESS(TEGRA_PMC_BASE + 0x00);
u32 reg;
+ reg = readl_relaxed(reset + PMC_SCRATCH0);
+ /* Writing recovery kernel or Bootloader mode in SCRATCH0 31:30 */
+ if (cmd) {
+ if (!strcmp(cmd, "recovery"))
+ reg |= RECOVERY_MODE;
+ else if (!strcmp(cmd, "bootloader"))
+ reg |= BOOTLOADER_MODE;
+ }
+ else {
+ /* Clearing SCRATCH0 31:30 on default reboot */
+ reg &= ~(BOOTLOADER_MODE | RECOVERY_MODE);
+ }
+ writel_relaxed(reg, reset + PMC_SCRATCH0);
/* use *_related to avoid spinlock since caches are off */
reg = readl_relaxed(reset);
reg |= 0x10;