diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2008-04-21 22:44:57 (GMT) |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2008-04-21 22:44:57 (GMT) |
commit | c3823c479e1f86a0adc7bb76fcfded67b042afc3 (patch) | |
tree | 0f75e8ac7c126b81f09cf6453184ff20216d7c29 /arch/avr32/mach-at32ap/pm-at32ap700x.S | |
parent | 5dfeaef89559d4968b0470adf749659f10d722f6 (diff) | |
parent | ed3fa7c9510cde67d232299cab8052ff50a08285 (diff) | |
download | linux-c3823c479e1f86a0adc7bb76fcfded67b042afc3.tar.xz |
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/hskinnemoen/avr32-2.6
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/hskinnemoen/avr32-2.6: (25 commits)
avr32: Add hardware power-down function call
avr32: add include/asm-avr32/serial.h
avr32: don't offer PARPORT_PC
avr32: don't offer CONFIG_GEN_RTC
avr32: don't offer CONFIG_RTC
add include/asm-avr32/xor.h
avr32: Remove two unused #defines from mm/init.c
avr32: Implement set_rate(), set_parent() and mode() for pll1
avr32: Generic clockevents support
avr32: Move sleep code into mach-at32ap
avr32: Use constants from sysreg.h in asm.h
avr32: Delete mostly unused header asm/intc.h
avr32: start clocksource cleanup
avr32: pass i2c board info through at32_add_device_twi
avr32: cleanup - use _AC macro to define PAGE_SIZE
Generate raw keyboard codes for AVR32 architecture
atmel_usba_udc: Add support for AT91CAP9 UDPHS
atmel_usba_udc: Add missing kfree() in usba_udc_remove()
atmel_usba_udc: move endpoint declarations into platform data.
atmel_usba_udc: Kill GPIO_PIN_NONE
...
Diffstat (limited to 'arch/avr32/mach-at32ap/pm-at32ap700x.S')
-rw-r--r-- | arch/avr32/mach-at32ap/pm-at32ap700x.S | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/arch/avr32/mach-at32ap/pm-at32ap700x.S b/arch/avr32/mach-at32ap/pm-at32ap700x.S new file mode 100644 index 0000000..949e248 --- /dev/null +++ b/arch/avr32/mach-at32ap/pm-at32ap700x.S @@ -0,0 +1,66 @@ +/* + * Low-level Power Management code. + * + * Copyright (C) 2008 Atmel Corporation + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ +#include <asm/asm.h> +#include <asm/asm-offsets.h> +#include <asm/thread_info.h> +#include <asm/arch/pm.h> + + .section .bss, "wa", @nobits + .global disable_idle_sleep + .type disable_idle_sleep, @object +disable_idle_sleep: + .int 4 + .size disable_idle_sleep, . - disable_idle_sleep + + /* Keep this close to the irq handlers */ + .section .irq.text, "ax", @progbits + + /* + * void cpu_enter_idle(void) + * + * Put the CPU into "idle" mode, in which it will consume + * significantly less power. + * + * If an interrupt comes along in the window between + * unmask_interrupts and the sleep instruction below, the + * interrupt code will adjust the return address so that we + * never execute the sleep instruction. This is required + * because the AP7000 doesn't unmask interrupts when entering + * sleep modes; later CPUs may not need this workaround. + */ + .global cpu_enter_idle + .type cpu_enter_idle, @function +cpu_enter_idle: + mask_interrupts + get_thread_info r8 + ld.w r9, r8[TI_flags] + bld r9, TIF_NEED_RESCHED + brcs .Lret_from_sleep + sbr r9, TIF_CPU_GOING_TO_SLEEP + st.w r8[TI_flags], r9 + unmask_interrupts + sleep CPU_SLEEP_IDLE + .size cpu_idle_sleep, . - cpu_idle_sleep + + /* + * Common return path for PM functions that don't run from + * SRAM. + */ + .global cpu_idle_skip_sleep + .type cpu_idle_skip_sleep, @function +cpu_idle_skip_sleep: + mask_interrupts + ld.w r9, r8[TI_flags] + cbr r9, TIF_CPU_GOING_TO_SLEEP + st.w r8[TI_flags], r9 +.Lret_from_sleep: + unmask_interrupts + retal r12 + .size cpu_idle_skip_sleep, . - cpu_idle_skip_sleep |