1/* 2 * Copyright (C) 2004-2006 Atmel Corporation 3 * 4 * This program is free software; you can redistribute it and/or modify 5 * it under the terms of the GNU General Public License version 2 as 6 * published by the Free Software Foundation. 7 */ 8#ifndef __ASM_AVR32_IRQFLAGS_H 9#define __ASM_AVR32_IRQFLAGS_H 10 11#include <asm/sysreg.h> 12 13static inline unsigned long __raw_local_save_flags(void) 14{ 15 return sysreg_read(SR); 16} 17 18#define raw_local_save_flags(x) \ 19 do { (x) = __raw_local_save_flags(); } while (0) 20 21/* 22 * This will restore ALL status register flags, not only the interrupt 23 * mask flag. 24 * 25 * The empty asm statement informs the compiler of this fact while 26 * also serving as a barrier. 27 */ 28static inline void raw_local_irq_restore(unsigned long flags) 29{ 30 sysreg_write(SR, flags); 31 asm volatile("" : : : "memory", "cc"); 32} 33 34static inline void raw_local_irq_disable(void) 35{ 36 asm volatile("ssrf %0" : : "n"(SYSREG_GM_OFFSET) : "memory"); 37} 38 39static inline void raw_local_irq_enable(void) 40{ 41 asm volatile("csrf %0" : : "n"(SYSREG_GM_OFFSET) : "memory"); 42} 43 44static inline int raw_irqs_disabled_flags(unsigned long flags) 45{ 46 return (flags & SYSREG_BIT(GM)) != 0; 47} 48 49static inline int raw_irqs_disabled(void) 50{ 51 unsigned long flags = __raw_local_save_flags(); 52 53 return raw_irqs_disabled_flags(flags); 54} 55 56static inline unsigned long __raw_local_irq_save(void) 57{ 58 unsigned long flags = __raw_local_save_flags(); 59 60 raw_local_irq_disable(); 61 62 return flags; 63} 64 65#define raw_local_irq_save(flags) \ 66 do { (flags) = __raw_local_irq_save(); } while (0) 67 68#endif /* __ASM_AVR32_IRQFLAGS_H */ 69