upload tizen1.0 source
[kernel/linux-2.6.36.git] / arch / arm / kernel / hibernate_asm.S
1 /*
2  * Hibernation support specific for ARM
3  *
4  * Copyright (C) 2010 Nokia Corporation
5  * Copyright (C) 2010 Texas Instruments, Inc.
6  * Copyright (C) 2006 Rafael J. Wysocki <rjw@sisk.pl>
7  *
8  * Contact: Hiroshi DOYU <Hiroshi.DOYU@nokia.com>
9  *
10  * License terms: GNU General Public License (GPL) version 2
11  */
12
13 #include <linux/linkage.h>
14         .text
15 ENTRY(swsusp_arch_suspend)
16         /*
17          * Save current program status register
18          */
19         ldr     r3, .Lsaved_cpsr
20         mrs     r0, cpsr
21         str     r0, [r3]
22
23         /*
24          * Change to system(user) mode
25          */
26         mov     r1, r0
27         orr     r1, r1, #0x1f
28         msr     cpsr_c, r1
29
30         /*
31          * Save User context
32          */
33         ldr     r3, .Lsaved_context_r0
34         stmia   r3, {r0-r14}
35
36         /*
37          * Go back to original SVC mode
38          */
39         msr     cpsr_c, r0
40
41         /*
42          * Save SVC context
43          */
44         ldr     r3, .Lsaved_context_r13_svc
45         stmia   r3, {r13-r14}
46         ldr     r3, .Lsaved_spsr_svc
47         mrs     r1, spsr
48         str     r1, [r3]
49
50         bl      swsusp_save
51
52         /*
53          * Restore return address
54          */
55         ldr     r3, .Lsaved_context_r14_svc
56         ldr     lr, [r3]
57         mov     pc, lr
58 ENDPROC(swsusp_arch_suspend)
59
60 ENTRY(swsusp_arch_resume)
61         /*
62          * Restore_pblist is the starting point for loaded pages
63          */
64         ldr     r0, .Lrestore_pblist
65         ldr     r6, [r0]
66
67 .Lcopy_loop:
68         ldr     r4, [r6]     /* src IOW present address */
69         ldr     r5, [r6, #4] /* dst IOW original address*/
70         mov     r9, #1024    /* No. of entries in one page, where each entry is 4 bytes */
71
72 .Lcopy_one_page:
73         /*
74          * This loop could be optimized by using stm and ldm.
75          */
76         ldr     r8, [r4], #4
77         str     r8, [r5], #4
78         subs    r9, r9, #1
79         bne     .Lcopy_one_page
80
81         /* The last field of struct pbe is a pointer to the next pbe structure */
82         ldr     r6, [r6, #8]
83         cmp     r6, #0
84         bne     .Lcopy_loop
85
86         /*
87          * Restore SVC context
88          */
89         ldr     r3, .Lsaved_context_r13_svc
90         ldmia   r3, {r13-r14}
91         ldr     r3, .Lsaved_spsr_svc
92         ldr     r1, [r3]
93         msr     spsr_cxsf, r1
94
95         mrs     r0, cpsr        /* Save current mode into r0 */
96
97         /*
98          * Change to system(user) mode
99          */
100         mov     r1, r0
101         orr     r1, r1, #0x1f
102         msr     cpsr_c, r1
103
104         /*
105          * Restore User context
106          */
107         ldr     r3, .Lsaved_context_r0
108         ldmia   r3, {r0-r14}
109         ldr     r3, .Lsaved_cpsr
110         ldr     r1, [r3]
111         msr     cpsr_cxsf, r1
112
113         msr     cpsr_c, r0      /* Restore original mode from r0 */
114
115         /*
116          * Flush TLB (Invalidate unified TLB unlocked entries)
117          */
118         mov     r1, #0
119         mcr     p15, 0, r1, c8, c7, 0
120
121         /* Set the return value */
122         mov     r0, #0
123
124         /* Restore return address */
125         ldr     r3, .Lsaved_context_r14_svc
126         ldr     lr, [r3]
127         mov     pc, lr
128 ENDPROC(swsusp_arch_resume)
129         .align  4
130 .Lsaved_context_r0:             .long   saved_context_r0
131 .Lsaved_cpsr:                   .long   saved_cpsr
132 .Lsaved_context_r13_svc:        .long   saved_context_r13_svc
133 .Lsaved_context_r14_svc:        .long   saved_context_r14_svc
134 .Lsaved_spsr_svc:               .long   saved_spsr_svc
135 .Lrestore_pblist:               .long   restore_pblist