ARM: tegra: Add support for passing arguments to bootloader.
Gaurav Sarode [Mon, 27 Feb 2012 16:24:30 +0000 (21:24 +0530)]
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>

Rebase-Id: R55bb6af9c4fa0970320f4397bbe3aca4678e8c7d

arch/arm/mach-tegra/common.c
arch/arm/mach-tegra/pm.c
arch/arm/mach-tegra/pm.h

index fa4247e..a54c2a6 100644 (file)
@@ -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
@@ -133,6 +136,19 @@ void tegra_assert_system_reset(char mode, const char *cmd)
        void __iomem *reset = IO_ADDRESS(TEGRA_PMC_BASE + 0);
        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);
        reg = readl_relaxed(reset);
        reg |= 0x10;
        writel_relaxed(reg, reset);
index ad91c9c..23ad677 100644 (file)
@@ -133,9 +133,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
index 0144a3c..2ad25d8 100644 (file)
 
 #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 */