diff options
author | Gaurav Sarode <gsarode@nvidia.com> | 2012-02-27 21:54:30 +0530 |
---|---|---|
committer | Simone Willett <swillett@nvidia.com> | 2012-03-01 16:55:30 -0800 |
commit | 7e782c0362e5ac5c925af8d7567a09e7dcbc74f0 (patch) | |
tree | 6664044f1df53144fc2b3884112d821dccef7cea /arch | |
parent | a6a05e492f2021883a5757ef3d4643fe9b0986e0 (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')
-rw-r--r-- | arch/arm/mach-tegra/common.c | 16 | ||||
-rw-r--r-- | arch/arm/mach-tegra/pm.c | 3 | ||||
-rw-r--r-- | arch/arm/mach-tegra/pm.h | 4 |
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 */ |