summaryrefslogtreecommitdiff
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
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>
-rw-r--r--arch/arm/mach-tegra/common.c16
-rw-r--r--arch/arm/mach-tegra/pm.c3
-rw-r--r--arch/arm/mach-tegra/pm.h4
3 files changed, 20 insertions, 3 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;
diff --git a/arch/arm/mach-tegra/pm.c b/arch/arm/mach-tegra/pm.c
index efa71fb9867a..f74c159262cd 100644
--- a/arch/arm/mach-tegra/pm.c
+++ b/arch/arm/mach-tegra/pm.c
@@ -131,9 +131,6 @@ struct suspend_context tegra_sctx;
#define PMC_WAKE_STATUS 0x14
#define PMC_SW_WAKE_STATUS 0x18
#define PMC_COREPWRGOOD_TIMER 0x3c
-#define PMC_SCRATCH0 0x50
-#define PMC_SCRATCH1 0x54
-#define PMC_SCRATCH4 0x60
#define PMC_CPUPWRGOOD_TIMER 0xc8
#define PMC_CPUPWROFF_TIMER 0xcc
#define PMC_COREPWROFF_TIMER PMC_WAKE_DELAY
diff --git a/arch/arm/mach-tegra/pm.h b/arch/arm/mach-tegra/pm.h
index 2b89e7cb05b5..1a443ce13379 100644
--- a/arch/arm/mach-tegra/pm.h
+++ b/arch/arm/mach-tegra/pm.h
@@ -29,6 +29,10 @@
#include <mach/iomap.h>
+#define PMC_SCRATCH0 0x50
+#define PMC_SCRATCH1 0x54
+#define PMC_SCRATCH4 0x60
+
enum tegra_suspend_mode {
TEGRA_SUSPEND_NONE = 0,
TEGRA_SUSPEND_LP2, /* CPU voltage off */