sleep.S 3.4 KB
Newer Older
M
Magnus Damm 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
/*
 * arch/sh/kernel/cpu/sh4a/sleep-sh_mobile.S
 *
 * Sleep mode and Standby modes support for SuperH Mobile
 *
 *  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>

/* manage self-refresh and enter standby mode.
 * this code will be copied to on-chip memory and executed from there.
 */

	.balign 	4096,0,4096
ENTRY(sh_mobile_standby)
	mov	r4, r0

	tst	#SUSP_SH_SF, r0
	bt	skip_set_sf
29 30
#ifdef CONFIG_CPU_SUBTYPE_SH7724
	/* DBSC: put memory in self-refresh mode */
M
Magnus Damm 已提交
31

32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
	mov.l	dben_reg, r4
	mov.l	dben_data0, r1
	mov.l	r1, @r4

	mov.l	dbrfpdn0_reg, r4
	mov.l	dbrfpdn0_data0, r1
	mov.l	r1, @r4

	mov.l	dbcmdcnt_reg, r4
	mov.l	dbcmdcnt_data0, r1
	mov.l	r1, @r4

	mov.l	dbcmdcnt_reg, r4
	mov.l	dbcmdcnt_data1, r1
	mov.l	r1, @r4

	mov.l	dbrfpdn0_reg, r4
	mov.l	dbrfpdn0_data1, r1
	mov.l	r1, @r4
#else
	/* SBSC: disable power down and put in self-refresh mode */
M
Magnus Damm 已提交
53 54 55 56 57 58 59
	mov.l	1f, r4
	mov.l	2f, r1
	mov.l	@r4, r2
	or	r1, r2
	mov.l   3f, r3
	and	r3, r2
	mov.l	r2, @r4
60
#endif
M
Magnus Damm 已提交
61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109

skip_set_sf:
	tst	#SUSP_SH_SLEEP, r0
	bt	test_standby

	/* set mode to "sleep mode" */
	bra	do_sleep
	 mov	#0x00, r1

test_standby:
	tst	#SUSP_SH_STANDBY, r0
	bt	test_rstandby

	/* set mode to "software standby mode" */
	bra	do_sleep
	 mov	#0x80, r1

test_rstandby:
	tst	#SUSP_SH_RSTANDBY, r0
	bt	test_ustandby

	/* set mode to "r-standby mode" */
	bra	do_sleep
	 mov	#0x20, r1

test_ustandby:
	tst	#SUSP_SH_USTANDBY, r0
	bt	done_sleep

	/* set mode to "u-standby mode" */
	mov	#0x10, r1

	/* fall-through */

do_sleep:
	/* setup and enter selected standby mode */
	mov.l	5f, r4
	mov.l	r1, @r4
	sleep

done_sleep:
	/* reset standby mode to sleep mode */
	mov.l	5f, r4
	mov	#0x00, r1
	mov.l	r1, @r4

	tst	#SUSP_SH_SF, r0
	bt	skip_restore_sf

110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139
#ifdef CONFIG_CPU_SUBTYPE_SH7724
	/* DBSC: put memory in auto-refresh mode */

	mov.l	dbrfpdn0_reg, r4
	mov.l	dbrfpdn0_data0, r1
	mov.l	r1, @r4

	/* sleep 140 ns */
	nop
	nop
	nop
	nop

	mov.l	dbcmdcnt_reg, r4
	mov.l	dbcmdcnt_data0, r1
	mov.l	r1, @r4

	mov.l	dbcmdcnt_reg, r4
	mov.l	dbcmdcnt_data1, r1
	mov.l	r1, @r4

	mov.l	dben_reg, r4
	mov.l	dben_data1, r1
	mov.l	r1, @r4

	mov.l	dbrfpdn0_reg, r4
	mov.l	dbrfpdn0_data2, r1
	mov.l	r1, @r4
#else
	/* SBSC: set auto-refresh mode */
M
Magnus Damm 已提交
140 141 142 143 144 145 146 147 148 149 150 151 152
	mov.l	1f, r4
	mov.l	@r4, r2
	mov.l   4f, r3
	and	r3, r2
	mov.l	r2, @r4
	mov.l	6f, r4
	mov.l	7f, r1
	mov.l	8f, r2
	mov.l	@r4, r3
	mov	#-1, r4
	add	r4, r3
	or	r2, r3
	mov.l	r3, @r1
153
#endif
M
Magnus Damm 已提交
154 155 156 157 158
skip_restore_sf:
	rts
	 nop

	.balign 4
159 160 161 162 163 164 165 166 167 168 169 170
#ifdef CONFIG_CPU_SUBTYPE_SH7724
dben_reg:	.long	0xfd000010 /* DBEN */
dben_data0:	.long	0
dben_data1:	.long	1
dbrfpdn0_reg:	.long	0xfd000040 /* DBRFPDN0 */
dbrfpdn0_data0:	.long	0
dbrfpdn0_data1:	.long	1
dbrfpdn0_data2:	.long	0x00010000
dbcmdcnt_reg:	.long	0xfd000014 /* DBCMDCNT */
dbcmdcnt_data0:	.long	2
dbcmdcnt_data1:	.long	4
#else
M
Magnus Damm 已提交
171 172 173 174
1:	.long	0xfe400008 /* SDCR0 */
2:	.long	0x00000400
3:	.long	0xffff7fff
4:	.long	0xfffffbff
175
#endif
M
Magnus Damm 已提交
176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191
5:	.long	0xa4150020 /* STBCR */
6:	.long   0xfe40001c /* RTCOR */
7:	.long   0xfe400018 /* RTCNT */
8:	.long   0xa55a0000

/* interrupt vector @ 0x600 */
	.balign 	0x400,0,0x400
	.long	0xdeadbeef
	.balign 	0x200,0,0x200
	/* sh7722 will end up here in sleep mode */
	rte
	 nop
sh_mobile_standby_end:

ENTRY(sh_mobile_standby_size)
	.long sh_mobile_standby_end - sh_mobile_standby