From: Tang Yuantian <yuantian.t...@freescale.com>

Added deep sleep support on T102xRDB platforms.

Signed-off-by: Tang Yuantian <yuantian.t...@freescale.com>
---
 board/freescale/t102xrdb/t102xrdb.c | 66 +++++++++++++++++++++++++++++++++++++
 include/configs/T102xRDB.h          |  2 +-
 2 files changed, 67 insertions(+), 1 deletion(-)

diff --git a/board/freescale/t102xrdb/t102xrdb.c 
b/board/freescale/t102xrdb/t102xrdb.c
index 8fb426e..7f8c3b0 100644
--- a/board/freescale/t102xrdb/t102xrdb.c
+++ b/board/freescale/t102xrdb/t102xrdb.c
@@ -149,3 +149,69 @@ void board_mem_sleep_setup(void)
        udelay(1);
 }
 #endif
+
+#ifdef CONFIG_FSL_DEEP_SLEEP
+/* determine if it is a warm boot */
+bool is_warm_boot(void)
+{
+#define DCFG_CCSR_CRSTSR_WDRFR (1 << 3)
+       struct ccsr_gur __iomem *gur = (void *)CONFIG_SYS_MPC85xx_GUTS_ADDR;
+
+       if (in_be32(&gur->scrtsr[0]) & DCFG_CCSR_CRSTSR_WDRFR)
+               return 1;
+
+       return 0;
+}
+
+void fsl_dp_mem_setup(void)
+{
+       /* does not provide HW signals for power management */
+       CPLD_WRITE(misc_ctl_status, (CPLD_READ(misc_ctl_status) & ~0x40));
+       /* Disable MCKE isolation */
+       gpio_set_value(2, 0);
+       udelay(1);
+}
+
+void fsl_dp_ddr_restore(void)
+{
+#define DDR_BUFF_LEN   128
+       volatile u64 *src, *dst;
+       int i;
+       struct ccsr_scfg *scfg = (void *)CONFIG_SYS_MPC85xx_SCFG;
+
+       if (!is_warm_boot())
+               return;
+
+       /* get the address of ddr date from SPARECR3 */
+       src = (u64 *)in_be32(&scfg->sparecr[2]);
+       dst = (u64 *)CONFIG_SYS_SDRAM_BASE;
+       for (i = 0; i < DDR_BUFF_LEN / 8; i++)
+               *dst++ = *src++;
+}
+
+int fsl_dp_resume(void)
+{
+       u32 start_addr;
+       void (*kernel_resume)(void);
+       struct ccsr_scfg *scfg = (void *)CONFIG_SYS_MPC85xx_SCFG;
+
+       if (!is_warm_boot())
+               return 0;
+
+       fsl_dp_ddr_restore();
+
+       l2cache_init();
+#if defined(CONFIG_RAMBOOT_PBL)
+       disable_cpc_sram();
+#endif
+       enable_cpc();
+
+       /* Get the entry address and jump to kernel */
+       start_addr = in_be32(&scfg->sparecr[1]);
+       debug("Entry address is 0x%08x\n", start_addr);
+       kernel_resume = (void (*)(void))start_addr;
+       kernel_resume();
+
+       return 0;
+}
+#endif
diff --git a/include/configs/T102xRDB.h b/include/configs/T102xRDB.h
index e575784..42a0240 100644
--- a/include/configs/T102xRDB.h
+++ b/include/configs/T102xRDB.h
@@ -35,7 +35,7 @@
 #define CONFIG_ENV_OVERWRITE
 
 /* support deep sleep */
-#define CONFIG_DEEP_SLEEP
+#define CONFIG_FSL_DEEP_SLEEP
 #define CONFIG_SILENT_CONSOLE
 
 #ifdef CONFIG_RAMBOOT_PBL
-- 
2.1.0.27.g96db324

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to