Merge branch 'akpm'
[linux-2.6/next.git] / arch / m32r / include / asm / irqflags.h
blob1f92d29982ae57af86994a42398a8b2beb8e64ef
1 /*
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
4 * for more details.
6 * Copyright (C) 2001 Hiroyuki Kondo, Hirokazu Takata, and Hitoshi Yamamoto
7 * Copyright (C) 2004, 2006 Hirokazu Takata <takata at linux-m32r.org>
8 */
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)
17 unsigned long flags;
18 asm volatile("mvfc %0,psw" : "=r"(flags));
19 return flags;
22 static inline void arch_local_irq_disable(void)
24 #if !defined(CONFIG_CHIP_M32102) && !defined(CONFIG_CHIP_M32104)
25 asm volatile (
26 "clrpsw #0x40 -> nop"
27 : : : "memory");
28 #else
29 unsigned long tmpreg0, tmpreg1;
30 asm volatile (
31 "ld24 %0, #0 ; Use 32-bit insn. \n\t"
32 "mvfc %1, psw ; No interrupt can be accepted here. \n\t"
33 "mvtc %0, psw \n\t"
34 "and3 %0, %1, #0xffbf \n\t"
35 "mvtc %0, psw \n\t"
36 : "=&r" (tmpreg0), "=&r" (tmpreg1)
38 : "cbit", "memory");
39 #endif
42 static inline void arch_local_irq_enable(void)
44 #if !defined(CONFIG_CHIP_M32102) && !defined(CONFIG_CHIP_M32104)
45 asm volatile (
46 "setpsw #0x40 -> nop"
47 : : : "memory");
48 #else
49 unsigned long tmpreg;
50 asm volatile (
51 "mvfc %0, psw; \n\t"
52 "or3 %0, %0, #0x0040; \n\t"
53 "mvtc %0, psw; \n\t"
54 : "=&r" (tmpreg)
56 : "cbit", "memory");
57 #endif
60 static inline unsigned long arch_local_irq_save(void)
62 unsigned long flags;
64 #if !(defined(CONFIG_CHIP_M32102) || defined(CONFIG_CHIP_M32104))
65 asm volatile (
66 "mvfc %0, psw; \n\t"
67 "clrpsw #0x40 -> nop; \n\t"
68 : "=r" (flags)
70 : "memory");
71 #else
72 unsigned long tmpreg;
73 asm volatile (
74 "ld24 %1, #0 \n\t"
75 "mvfc %0, psw \n\t"
76 "mvtc %1, psw \n\t"
77 "and3 %1, %0, #0xffbf \n\t"
78 "mvtc %1, psw \n\t"
79 : "=r" (flags), "=&r" (tmpreg)
81 : "cbit", "memory");
82 #endif
83 return flags;
86 static inline void arch_local_irq_restore(unsigned long flags)
88 asm volatile("mvtc %0,psw"
90 : "r" (flags)
91 : "cbit", "memory");
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 */