summaryrefslogtreecommitdiff
path: root/arch/arm/mach-tegra/common.c
diff options
context:
space:
mode:
authorGaurav Sarode <gsarode@nvidia.com>2012-02-27 21:54:30 +0530
committerSimone Willett <swillett@nvidia.com>2012-03-01 16:55:30 -0800
commit7e782c0362e5ac5c925af8d7567a09e7dcbc74f0 (patch)
tree6664044f1df53144fc2b3884112d821dccef7cea /arch/arm/mach-tegra/common.c
parenta6a05e492f2021883a5757ef3d4643fe9b0986e0 (diff)
ARM: tegra: Add support for passing arguments to bootloader.
PMC SCRATCH register 0 holds value across warmboot. Storing values in bit31:30 for recovery and fastboot. This requires change in bootloader as well to parse these arguments. Bug 863014 Change-Id: I1d4b752dbc6dd7b065e9d0cc87df189e7caeb201 Signed-off-by: Gaurav Sarode <gsarode@nvidia.com> Reviewed-on: http://git-master/r/86140 Reviewed-by: Simone Willett <swillett@nvidia.com> Tested-by: Simone Willett <swillett@nvidia.com>
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;