Merge branch 'davinci-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git...
[pandora-kernel.git] / arch / s390 / include / asm / irqflags.h
1 /*
2  *    Copyright IBM Corp. 2006,2010
3  *    Author(s): Martin Schwidefsky <schwidefsky@de.ibm.com>
4  */
5
6 #ifndef __ASM_IRQFLAGS_H
7 #define __ASM_IRQFLAGS_H
8
9 #include <linux/types.h>
10
11 /* store then or system mask. */
12 #define __raw_local_irq_stosm(__or)                                     \
13 ({                                                                      \
14         unsigned long __mask;                                           \
15         asm volatile(                                                   \
16                 "       stosm   %0,%1"                                  \
17                 : "=Q" (__mask) : "i" (__or) : "memory");               \
18         __mask;                                                         \
19 })
20
21 /* store then and system mask. */
22 #define __raw_local_irq_stnsm(__and)                                    \
23 ({                                                                      \
24         unsigned long __mask;                                           \
25         asm volatile(                                                   \
26                 "       stnsm   %0,%1"                                  \
27                 : "=Q" (__mask) : "i" (__and) : "memory");              \
28         __mask;                                                         \
29 })
30
31 /* set system mask. */
32 #define __raw_local_irq_ssm(__mask)                                     \
33 ({                                                                      \
34         asm volatile("ssm   %0" : : "Q" (__mask) : "memory");           \
35 })
36
37 /* interrupt control.. */
38 static inline unsigned long raw_local_irq_enable(void)
39 {
40         return __raw_local_irq_stosm(0x03);
41 }
42
43 static inline unsigned long raw_local_irq_disable(void)
44 {
45         return __raw_local_irq_stnsm(0xfc);
46 }
47
48 #define raw_local_save_flags(x)                                         \
49 do {                                                                    \
50         typecheck(unsigned long, x);                                    \
51         (x) = __raw_local_irq_stosm(0x00);                              \
52 } while (0)
53
54 static inline void raw_local_irq_restore(unsigned long flags)
55 {
56         __raw_local_irq_ssm(flags);
57 }
58
59 static inline int raw_irqs_disabled_flags(unsigned long flags)
60 {
61         return !(flags & (3UL << (BITS_PER_LONG - 8)));
62 }
63
64 /* For spinlocks etc */
65 #define raw_local_irq_save(x)   ((x) = raw_local_irq_disable())
66
67 #endif /* __ASM_IRQFLAGS_H */