xref: /openbmc/linux/arch/sh/kernel/cpu/shmobile/sleep.S (revision e9edb3fe)
1/*
2 * arch/sh/kernel/cpu/sh4a/sleep-sh_mobile.S
3 *
4 * Sleep mode and Standby modes support for SuperH Mobile
5 *
6 *  Copyright (C) 2009 Magnus Damm
7 *
8 * This file is subject to the terms and conditions of the GNU General Public
9 * License.  See the file "COPYING" in the main directory of this archive
10 * for more details.
11 */
12
13#include <linux/sys.h>
14#include <linux/errno.h>
15#include <linux/linkage.h>
16#include <asm/asm-offsets.h>
17#include <asm/suspend.h>
18
19/* manage self-refresh and enter standby mode.
20 * this code will be copied to on-chip memory and executed from there.
21 */
22
23	.balign 	4096,0,4096
24ENTRY(sh_mobile_standby)
25	mov	r4, r0
26
27	tst	#SUSP_SH_SF, r0
28	bt	skip_set_sf
29
30	/* SDRAM: disable power down and put in self-refresh mode */
31	mov.l	1f, r4
32	mov.l	2f, r1
33	mov.l	@r4, r2
34	or	r1, r2
35	mov.l   3f, r3
36	and	r3, r2
37	mov.l	r2, @r4
38
39skip_set_sf:
40	tst	#SUSP_SH_SLEEP, r0
41	bt	test_standby
42
43	/* set mode to "sleep mode" */
44	bra	do_sleep
45	 mov	#0x00, r1
46
47test_standby:
48	tst	#SUSP_SH_STANDBY, r0
49	bt	test_rstandby
50
51	/* set mode to "software standby mode" */
52	bra	do_sleep
53	 mov	#0x80, r1
54
55test_rstandby:
56	tst	#SUSP_SH_RSTANDBY, r0
57	bt	test_ustandby
58
59	/* set mode to "r-standby mode" */
60	bra	do_sleep
61	 mov	#0x20, r1
62
63test_ustandby:
64	tst	#SUSP_SH_USTANDBY, r0
65	bt	done_sleep
66
67	/* set mode to "u-standby mode" */
68	mov	#0x10, r1
69
70	/* fall-through */
71
72do_sleep:
73	/* setup and enter selected standby mode */
74	mov.l	5f, r4
75	mov.l	r1, @r4
76	sleep
77
78done_sleep:
79	/* reset standby mode to sleep mode */
80	mov.l	5f, r4
81	mov	#0x00, r1
82	mov.l	r1, @r4
83
84	tst	#SUSP_SH_SF, r0
85	bt	skip_restore_sf
86
87	/* SDRAM: set auto-refresh mode */
88	mov.l	1f, r4
89	mov.l	@r4, r2
90	mov.l   4f, r3
91	and	r3, r2
92	mov.l	r2, @r4
93	mov.l	6f, r4
94	mov.l	7f, r1
95	mov.l	8f, r2
96	mov.l	@r4, r3
97	mov	#-1, r4
98	add	r4, r3
99	or	r2, r3
100	mov.l	r3, @r1
101skip_restore_sf:
102	rts
103	 nop
104
105	.balign 4
1061:	.long	0xfe400008 /* SDCR0 */
1072:	.long	0x00000400
1083:	.long	0xffff7fff
1094:	.long	0xfffffbff
1105:	.long	0xa4150020 /* STBCR */
1116:	.long   0xfe40001c /* RTCOR */
1127:	.long   0xfe400018 /* RTCNT */
1138:	.long   0xa55a0000
114
115/* interrupt vector @ 0x600 */
116	.balign 	0x400,0,0x400
117	.long	0xdeadbeef
118	.balign 	0x200,0,0x200
119	/* sh7722 will end up here in sleep mode */
120	rte
121	 nop
122sh_mobile_standby_end:
123
124ENTRY(sh_mobile_standby_size)
125	.long sh_mobile_standby_end - sh_mobile_standby
126