Merge master.kernel.org:/pub/scm/linux/kernel/git/gregkh/driver-2.6
[linux-2.6] / include / asm-s390 / irqflags.h
1 /*
2  *  include/asm-s390/irqflags.h
3  *
4  *    Copyright (C) IBM Corp. 2006
5  *    Author(s): Heiko Carstens <heiko.carstens@de.ibm.com>
6  */
7
8 #ifndef __ASM_IRQFLAGS_H
9 #define __ASM_IRQFLAGS_H
10
11 #ifdef __KERNEL__
12
13 #if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ > 2)
14
15 /* store then or system mask. */
16 #define __raw_local_irq_stosm(__or)                                     \
17 ({                                                                      \
18         unsigned long __mask;                                           \
19         asm volatile(                                                   \
20                 "       stosm   %0,%1"                                  \
21                 : "=Q" (__mask) : "i" (__or) : "memory");               \
22         __mask;                                                         \
23 })
24
25 /* store then and system mask. */
26 #define __raw_local_irq_stnsm(__and)                                    \
27 ({                                                                      \
28         unsigned long __mask;                                           \
29         asm volatile(                                                   \
30                 "       stnsm   %0,%1"                                  \
31                 : "=Q" (__mask) : "i" (__and) : "memory");              \
32         __mask;                                                         \
33 })
34
35 /* set system mask. */
36 #define __raw_local_irq_ssm(__mask)                                     \
37 ({                                                                      \
38         asm volatile("ssm   %0" : : "Q" (__mask) : "memory");           \
39 })
40
41 #else /* __GNUC__ */
42
43 /* store then or system mask. */
44 #define __raw_local_irq_stosm(__or)                                     \
45 ({                                                                      \
46         unsigned long __mask;                                           \
47         asm volatile(                                                   \
48                 "       stosm   0(%1),%2"                               \
49                 : "=m" (__mask)                                         \
50                 : "a" (&__mask), "i" (__or) : "memory");                \
51         __mask;                                                         \
52 })
53
54 /* store then and system mask. */
55 #define __raw_local_irq_stnsm(__and)                                    \
56 ({                                                                      \
57         unsigned long __mask;                                           \
58         asm volatile(                                                   \
59                 "       stnsm   0(%1),%2"                               \
60                 : "=m" (__mask)                                         \
61                 : "a" (&__mask), "i" (__and) : "memory");               \
62         __mask;                                                         \
63 })
64
65 /* set system mask. */
66 #define __raw_local_irq_ssm(__mask)                                     \
67 ({                                                                      \
68         asm volatile(                                                   \
69                 "       ssm     0(%0)"                                  \
70                 : : "a" (&__mask), "m" (__mask) : "memory");            \
71 })
72
73 #endif /* __GNUC__ */
74
75 /* interrupt control.. */
76 static inline unsigned long raw_local_irq_enable(void)
77 {
78         return __raw_local_irq_stosm(0x03);
79 }
80
81 static inline unsigned long raw_local_irq_disable(void)
82 {
83         return __raw_local_irq_stnsm(0xfc);
84 }
85
86 #define raw_local_save_flags(x)                                         \
87 do {                                                                    \
88         typecheck(unsigned long, x);                                    \
89         (x) = __raw_local_irq_stosm(0x00);                              \
90 } while (0)
91
92 static inline void raw_local_irq_restore(unsigned long flags)
93 {
94         __raw_local_irq_ssm(flags);
95 }
96
97 static inline int raw_irqs_disabled_flags(unsigned long flags)
98 {
99         return !(flags & (3UL << (BITS_PER_LONG - 8)));
100 }
101
102 /* For spinlocks etc */
103 #define raw_local_irq_save(x)   ((x) = raw_local_irq_disable())
104
105 #endif /* __KERNEL__ */
106 #endif /* __ASM_IRQFLAGS_H */