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 <linux/types.h> 12 #include <asm/sysreg.h> 13 arch_local_save_flags(void)14static inline unsigned long arch_local_save_flags(void) 15 { 16 return sysreg_read(SR); 17 } 18 19 /* 20 * This will restore ALL status register flags, not only the interrupt 21 * mask flag. 22 * 23 * The empty asm statement informs the compiler of this fact while 24 * also serving as a barrier. 25 */ arch_local_irq_restore(unsigned long flags)26static inline void arch_local_irq_restore(unsigned long flags) 27 { 28 sysreg_write(SR, flags); 29 asm volatile("" : : : "memory", "cc"); 30 } 31 arch_local_irq_disable(void)32static inline void arch_local_irq_disable(void) 33 { 34 asm volatile("ssrf %0" : : "n"(SYSREG_GM_OFFSET) : "memory"); 35 } 36 arch_local_irq_enable(void)37static inline void arch_local_irq_enable(void) 38 { 39 asm volatile("csrf %0" : : "n"(SYSREG_GM_OFFSET) : "memory"); 40 } 41 arch_irqs_disabled_flags(unsigned long flags)42static inline bool arch_irqs_disabled_flags(unsigned long flags) 43 { 44 return (flags & SYSREG_BIT(GM)) != 0; 45 } 46 arch_irqs_disabled(void)47static inline bool arch_irqs_disabled(void) 48 { 49 return arch_irqs_disabled_flags(arch_local_save_flags()); 50 } 51 arch_local_irq_save(void)52static inline unsigned long arch_local_irq_save(void) 53 { 54 unsigned long flags = arch_local_save_flags(); 55 56 arch_local_irq_disable(); 57 58 return flags; 59 } 60 61 #endif /* __ASM_AVR32_IRQFLAGS_H */ 62