1
2
3
4
5
6
7
8 #include <asm/processor.h>
9 #include <asm/page.h>
10 #include <asm/ppc_asm.h>
11 #include <asm/cputable.h>
12 #include <asm/cache.h>
13 #include <asm/thread_info.h>
14 #include <asm/asm-offsets.h>
15
16
17 #define DOZE .long 0x4c000324
18 #define NAP .long 0x4c000364
19 #define SLEEP .long 0x4c0003a4
20 #define RVW .long 0x4c0003e4
21
22
23
24
25
26 #define PRE_SLEEP_SEQUENCE \
27 std r3,8(r1); \
28 ptesync ; \
29 ld r3,8(r1); \
30 1: cmpd r3,r3; \
31 bne 1b
32
33 _doze:
34 PRE_SLEEP_SEQUENCE
35 DOZE
36 b .
37
38
39 _GLOBAL(idle_spin)
40 blr
41
42 _GLOBAL(idle_doze)
43 LOAD_REG_ADDR(r3, _doze)
44 b sleep_common
45
46
47
48 sleep_common:
49 mflr r0
50 std r0, 16(r1)
51 stdu r1,-64(r1)
52 #ifdef CONFIG_PPC_PASEMI_CPUFREQ
53 std r3, 48(r1)
54
55
56 bl check_astate
57 cmpwi r3,0
58 bne 1f
59
60 ld r3, 48(r1)
61 #endif
62 LOAD_REG_IMMEDIATE(r6,MSR_DR|MSR_IR|MSR_ME|MSR_EE)
63 mfmsr r4
64 andc r5,r4,r6
65 mtmsrd r5,0
66
67 mtctr r3
68 bctrl
69
70 mtmsrd r4,0
71
72 1: addi r1,r1,64
73 ld r0,16(r1)
74 mtlr r0
75 blr
76