2 * Hibernation support specific for ARM
4 * Copyright (C) 2010 Nokia Corporation
5 * Copyright (C) 2010 Texas Instruments, Inc.
6 * Copyright (C) 2006 Rafael J. Wysocki <rjw@sisk.pl>
8 * Contact: Hiroshi DOYU <Hiroshi.DOYU@nokia.com>
10 * License terms: GNU General Public License (GPL) version 2
13 #include <linux/linkage.h>
15 ENTRY(swsusp_arch_suspend)
17 * Save current program status register
24 * Change to system(user) mode
33 ldr r3, .Lsaved_context_r0
37 * Go back to original SVC mode
44 ldr r3, .Lsaved_context_r13_svc
46 ldr r3, .Lsaved_spsr_svc
53 * Restore return address
55 ldr r3, .Lsaved_context_r14_svc
58 ENDPROC(swsusp_arch_suspend)
60 ENTRY(swsusp_arch_resume)
62 * Restore_pblist is the starting point for loaded pages
64 ldr r0, .Lrestore_pblist
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 */
74 * This loop could be optimized by using stm and ldm.
81 /* The last field of struct pbe is a pointer to the next pbe structure */
89 ldr r3, .Lsaved_context_r13_svc
91 ldr r3, .Lsaved_spsr_svc
95 mrs r0, cpsr /* Save current mode into r0 */
98 * Change to system(user) mode
105 * Restore User context
107 ldr r3, .Lsaved_context_r0
113 msr cpsr_c, r0 /* Restore original mode from r0 */
116 * Flush TLB (Invalidate unified TLB unlocked entries)
119 mcr p15, 0, r1, c8, c7, 0
121 /* Set the return value */
124 /* Restore return address */
125 ldr r3, .Lsaved_context_r14_svc
128 ENDPROC(swsusp_arch_resume)
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