summaryrefslogtreecommitdiff
path: root/cpu
diff options
context:
space:
mode:
Diffstat (limited to 'cpu')
-rw-r--r--cpu/arm_cortexa8/cpu.c4
-rw-r--r--cpu/arm_cortexa8/mx53/generic.c35
2 files changed, 39 insertions, 0 deletions
diff --git a/cpu/arm_cortexa8/cpu.c b/cpu/arm_cortexa8/cpu.c
index ac7ac13..a7a6fb7 100644
--- a/cpu/arm_cortexa8/cpu.c
+++ b/cpu/arm_cortexa8/cpu.c
@@ -136,6 +136,10 @@ int cleanup_before_linux(void)
{
unsigned int i;
+#ifdef CONFIG_CMD_IMX_DOWNLOAD_MODE
+ clear_mfgmode_mem();
+#endif
+
#ifdef CONFIG_VIDEO_MX5
ipu_disable_channel(MEM_BG_SYNC);
ipu_uninit_channel(MEM_BG_SYNC);
diff --git a/cpu/arm_cortexa8/mx53/generic.c b/cpu/arm_cortexa8/mx53/generic.c
index d54bf2c..e53a720 100644
--- a/cpu/arm_cortexa8/mx53/generic.c
+++ b/cpu/arm_cortexa8/mx53/generic.c
@@ -1131,3 +1131,38 @@ void ipu_clk_disable(void)
reg |= (0x1 << 18);
writel(reg, CCM_BASE_ADDR + CLKCTL_CLPCR);
}
+
+#ifdef CONFIG_CMD_IMX_DOWNLOAD_MODE
+
+/* this function should call before enter linux, otherwise, you
+ * watchdog reset will enter mfg download mode again, clear this bit
+ * to prevent this behavior */
+void clear_mfgmode_mem(void)
+{
+ u32 reg;
+ reg = readl(SRTC_BASE_ADDR + SRTC_LPGR);
+ reg &= ~0x12000000;
+ writel(reg, SRTC_BASE_ADDR + SRTC_LPGR);
+}
+
+void do_switch_mfgmode(void)
+{
+ u32 reg;
+ reg = readl(SRTC_BASE_ADDR + SRTC_LPGR);
+ /* After set bit 28 of LPGR register of SRTC to 1, Set bit
+ * [25:0] to specified value according to format of SBMR,
+ * after trigger a watchdog reset, ROM will read Bit 28 and
+ * then copy bit [25:0] of LPGR to SBMR, then ROM can enter
+ * serial download mode.*/
+ reg |= 0x12000000;
+ writel(reg, SRTC_BASE_ADDR + SRTC_LPGR);
+ /* this watchdog reset will let chip enter mfgtool download
+ * mode. */
+ do_reset(NULL, 0, 0, NULL);
+}
+
+U_BOOT_CMD(
+ download_mode, 1, 1, do_switch_mfgmode,
+ "download_mode - enter i.MX serial/usb download mode\n",
+ "");
+#endif