2 * This file is subject to the terms and conditions of the GNU General Public
3 * License. See the file "COPYING" in the main directory of this archive
6 * Copyright (C) 2001 Hiroyuki Kondo, Hirokazu Takata, and Hitoshi Yamamoto
7 * Copyright (C) 2004, 2006 Hirokazu Takata <takata at linux-m32r.org>
10 #ifndef _ASM_M32R_IRQFLAGS_H
11 #define _ASM_M32R_IRQFLAGS_H
13 #include <linux/types.h>
15 static inline unsigned long arch_local_save_flags(void)
18 asm volatile("mvfc %0,psw" : "=r"(flags
));
22 static inline void arch_local_irq_disable(void)
24 #if !defined(CONFIG_CHIP_M32102) && !defined(CONFIG_CHIP_M32104)
29 unsigned long tmpreg0
, tmpreg1
;
31 "ld24 %0, #0 ; Use 32-bit insn. \n\t"
32 "mvfc %1, psw ; No interrupt can be accepted here. \n\t"
34 "and3 %0, %1, #0xffbf \n\t"
36 : "=&r" (tmpreg0
), "=&r" (tmpreg1
)
42 static inline void arch_local_irq_enable(void)
44 #if !defined(CONFIG_CHIP_M32102) && !defined(CONFIG_CHIP_M32104)
52 "or3 %0, %0, #0x0040; \n\t"
60 static inline unsigned long arch_local_irq_save(void)
64 #if !(defined(CONFIG_CHIP_M32102) || defined(CONFIG_CHIP_M32104))
67 "clrpsw #0x40 -> nop; \n\t"
77 "and3 %1, %0, #0xffbf \n\t"
79 : "=r" (flags
), "=&r" (tmpreg
)
86 static inline void arch_local_irq_restore(unsigned long flags
)
88 asm volatile("mvtc %0,psw"
94 static inline bool arch_irqs_disabled_flags(unsigned long flags
)
96 return !(flags
& 0x40);
99 static inline bool arch_irqs_disabled(void)
101 return arch_irqs_disabled_flags(arch_local_save_flags());
104 #endif /* _ASM_M32R_IRQFLAGS_H */