Merge branch 'fb' into devel
[linux-2.6] / arch / avr32 / mach-at32ap / pm-at32ap700x.S
1 /*
2  * Low-level Power Management code.
3  *
4  * Copyright (C) 2008 Atmel Corporation
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 #include <asm/asm.h>
11 #include <asm/asm-offsets.h>
12 #include <asm/thread_info.h>
13 #include <asm/arch/pm.h>
14
15         .section .bss, "wa", @nobits
16         .global disable_idle_sleep
17         .type   disable_idle_sleep, @object
18 disable_idle_sleep:
19         .int    4
20         .size   disable_idle_sleep, . - disable_idle_sleep
21
22         /* Keep this close to the irq handlers */
23         .section .irq.text, "ax", @progbits
24
25         /*
26          * void cpu_enter_idle(void)
27          *
28          * Put the CPU into "idle" mode, in which it will consume
29          * significantly less power.
30          *
31          * If an interrupt comes along in the window between
32          * unmask_interrupts and the sleep instruction below, the
33          * interrupt code will adjust the return address so that we
34          * never execute the sleep instruction. This is required
35          * because the AP7000 doesn't unmask interrupts when entering
36          * sleep modes; later CPUs may not need this workaround.
37          */
38         .global cpu_enter_idle
39         .type   cpu_enter_idle, @function
40 cpu_enter_idle:
41         mask_interrupts
42         get_thread_info r8
43         ld.w    r9, r8[TI_flags]
44         bld     r9, TIF_NEED_RESCHED
45         brcs    .Lret_from_sleep
46         sbr     r9, TIF_CPU_GOING_TO_SLEEP
47         st.w    r8[TI_flags], r9
48         unmask_interrupts
49         sleep   CPU_SLEEP_IDLE
50         .size   cpu_idle_sleep, . - cpu_idle_sleep
51
52         /*
53          * Common return path for PM functions that don't run from
54          * SRAM.
55          */
56         .global cpu_idle_skip_sleep
57         .type   cpu_idle_skip_sleep, @function
58 cpu_idle_skip_sleep:
59         mask_interrupts
60         ld.w    r9, r8[TI_flags]
61         cbr     r9, TIF_CPU_GOING_TO_SLEEP
62         st.w    r8[TI_flags], r9
63 .Lret_from_sleep:
64         unmask_interrupts
65         retal   r12
66         .size   cpu_idle_skip_sleep, . - cpu_idle_skip_sleep