sh: Add Ecovec24 specific memory pre/post sleep code
authorMagnus Damm <damm@opensource.se>
Fri, 30 Oct 2009 04:23:59 +0000 (04:23 +0000)
committerPaul Mundt <lethal@linux-sh.org>
Fri, 30 Oct 2009 05:33:46 +0000 (14:33 +0900)
Add self-refresh handling code for the Ecovec24 board.

Signed-off-by: Magnus Damm <damm@opensource.se>
Signed-off-by: Paul Mundt <lethal@linux-sh.org>
arch/sh/boards/mach-ecovec24/Makefile
arch/sh/boards/mach-ecovec24/sdram.S [new file with mode: 0644]
arch/sh/boards/mach-ecovec24/setup.c

index 51f8521..e69bc82 100644 (file)
@@ -6,4 +6,4 @@
 # for more details.
 #
 
-obj-y   := setup.o
\ No newline at end of file
+obj-y   := setup.o sdram.o
\ No newline at end of file
diff --git a/arch/sh/boards/mach-ecovec24/sdram.S b/arch/sh/boards/mach-ecovec24/sdram.S
new file mode 100644 (file)
index 0000000..8334400
--- /dev/null
@@ -0,0 +1,52 @@
+/*
+ * Ecovec24 sdram self/auto-refresh setup code
+ *
+ *  Copyright (C) 2009 Magnus Damm
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License.  See the file "COPYING" in the main directory of this archive
+ * for more details.
+ */
+
+#include <linux/sys.h>
+#include <linux/errno.h>
+#include <linux/linkage.h>
+#include <asm/asm-offsets.h>
+#include <asm/suspend.h>
+#include <asm/romimage-macros.h>
+
+/* code to enter and leave self-refresh. must be self-contained.
+ * this code will be copied to on-chip memory and executed from there.
+ */
+       .balign 4
+ENTRY(ecovec24_sdram_enter_start)
+
+       /* DBSC: put memory in self-refresh mode */
+
+       ED 0xFD000010, 0x00000000 /* DBEN */
+       ED 0xFD000040, 0x00000000 /* DBRFPDN0 */
+       ED 0xFD000014, 0x00000002 /* DBCMDCNT (PALL) */
+       ED 0xFD000014, 0x00000004 /* DBCMDCNT (REF) */
+       ED 0xFD000040, 0x00000001 /* DBRFPDN0 */
+
+       rts
+        nop
+
+ENTRY(ecovec24_sdram_enter_end)
+
+       .balign 4
+ENTRY(ecovec24_sdram_leave_start)
+
+       /* DBSC: put memory in auto-refresh mode */
+
+       ED 0xFD000040, 0x00000000 /* DBRFPDN0 */
+       WAIT 1
+       ED 0xFD000014, 0x00000002 /* DBCMDCNT (PALL) */
+       ED 0xFD000014, 0x00000004 /* DBCMDCNT (REF) */
+       ED 0xFD000010, 0x00000001 /* DBEN */
+       ED 0xFD000040, 0x00010000 /* DBRFPDN0 */
+
+       rts
+        nop
+
+ENTRY(ecovec24_sdram_leave_end)
index c3d05e5..2274985 100644 (file)
@@ -26,6 +26,7 @@
 #include <asm/sh_eth.h>
 #include <asm/sh_keysc.h>
 #include <asm/clock.h>
+#include <asm/suspend.h>
 #include <cpu/sh7724.h>
 
 /*
@@ -526,8 +527,21 @@ static void __init sh_eth_init(struct sh_eth_plat_data *pd)
 
 #define PORT_HIZA 0xA4050158
 #define IODRIVEA  0xA405018A
+
+extern char ecovec24_sdram_enter_start;
+extern char ecovec24_sdram_enter_end;
+extern char ecovec24_sdram_leave_start;
+extern char ecovec24_sdram_leave_end;
+
 static int __init arch_setup(void)
 {
+       /* register board specific self-refresh code */
+       sh_mobile_register_self_refresh(SUSP_SH_STANDBY | SUSP_SH_SF,
+                                       &ecovec24_sdram_enter_start,
+                                       &ecovec24_sdram_enter_end,
+                                       &ecovec24_sdram_leave_start,
+                                       &ecovec24_sdram_leave_end);
+
        /* enable STATUS0, STATUS2 and PDSTATUS */
        gpio_request(GPIO_FN_STATUS0, NULL);
        gpio_request(GPIO_FN_STATUS2, NULL);