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 __raw_local_save_flags(void)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 */ raw_local_irq_restore(unsigned long flags)28static inline void raw_local_irq_restore(unsigned long flags) 29 { 30 sysreg_write(SR, flags); 31 asm volatile("" : : : "memory", "cc"); 32 } 33 raw_local_irq_disable(void)34static inline void raw_local_irq_disable(void) 35 { 36 asm volatile("ssrf %0" : : "n"(SYSREG_GM_OFFSET) : "memory"); 37 } 38 raw_local_irq_enable(void)39static inline void raw_local_irq_enable(void) 40 { 41 asm volatile("csrf %0" : : "n"(SYSREG_GM_OFFSET) : "memory"); 42 } 43 raw_irqs_disabled_flags(unsigned long flags)44static inline int raw_irqs_disabled_flags(unsigned long flags) 45 { 46 return (flags & SYSREG_BIT(GM)) != 0; 47 } 48 raw_irqs_disabled(void)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 __raw_local_irq_save(void)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