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