diff options
Diffstat (limited to 'arch/arm/mach-tegra/common.c')
-rw-r--r-- | arch/arm/mach-tegra/common.c | 16 |
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; |