Merge branch 'merge' of git://git.kernel.org/pub/scm/linux/kernel/git/paulus/powerpc
[linux-2.6] / arch / powerpc / platforms / pasemi / powersave.S
1 /*
2  * Copyright (C) 2006-2007 PA Semi, Inc
3  *
4  * Maintained by: Olof Johansson <olof@lixom.net>
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License version 2 as
8  * published by the Free Software Foundation.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, write to the Free Software
17  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
18  *
19  */
20
21 #include <asm/processor.h>
22 #include <asm/page.h>
23 #include <asm/ppc_asm.h>
24 #include <asm/cputable.h>
25 #include <asm/cache.h>
26 #include <asm/thread_info.h>
27 #include <asm/asm-offsets.h>
28
29 /* Power savings opcodes since not all binutils have them at this time */
30 #define DOZE    .long   0x4c000324
31 #define NAP     .long   0x4c000364
32 #define SLEEP   .long   0x4c0003a4
33 #define RVW     .long   0x4c0003e4
34
35 /* Common sequence to do before going to any of the
36  * powersavings modes.
37  */
38
39 #define PRE_SLEEP_SEQUENCE      \
40         std     r3,8(r1);       \
41         ptesync ;               \
42         ld      r3,8(r1);       \
43 1:      cmpd    r3,r3;          \
44         bne     1b
45
46 _doze:
47         PRE_SLEEP_SEQUENCE
48         DOZE
49         b       .
50
51
52 _GLOBAL(idle_spin)
53         blr
54
55 _GLOBAL(idle_doze)
56         LOAD_REG_ADDR(r3, _doze)
57         b       sleep_common
58
59 /* Add more modes here later */
60
61 sleep_common:
62         mflr    r0
63         std     r0, 16(r1)
64         stdu    r1,-64(r1)
65
66         LOAD_REG_IMMEDIATE(r6,MSR_DR|MSR_IR|MSR_ME|MSR_EE)
67         mfmsr   r4
68         andc    r5,r4,r6
69         mtmsrd  r5,0
70
71         mtctr   r3
72         bctrl
73
74         mtmsrd  r4,0
75
76         addi    r1,r1,64
77         ld      r0,16(r1)
78         mtlr    r0
79         blr
80