1 #ifndef __ASM_SH_IRQFLAGS_H
2 #define __ASM_SH_IRQFLAGS_H
3
raw_local_irq_enable(void)4 static inline void raw_local_irq_enable(void)
5 {
6 unsigned long __dummy0, __dummy1;
7
8 __asm__ __volatile__ (
9 "stc sr, %0\n\t"
10 "and %1, %0\n\t"
11 #ifdef CONFIG_CPU_HAS_SR_RB
12 "stc r6_bank, %1\n\t"
13 "or %1, %0\n\t"
14 #endif
15 "ldc %0, sr\n\t"
16 : "=&r" (__dummy0), "=r" (__dummy1)
17 : "1" (~0x000000f0)
18 : "memory"
19 );
20 }
21
raw_local_irq_disable(void)22 static inline void raw_local_irq_disable(void)
23 {
24 unsigned long flags;
25
26 __asm__ __volatile__ (
27 "stc sr, %0\n\t"
28 "or #0xf0, %0\n\t"
29 "ldc %0, sr\n\t"
30 : "=&z" (flags)
31 : /* no inputs */
32 : "memory"
33 );
34 }
35
set_bl_bit(void)36 static inline void set_bl_bit(void)
37 {
38 unsigned long __dummy0, __dummy1;
39
40 __asm__ __volatile__ (
41 "stc sr, %0\n\t"
42 "or %2, %0\n\t"
43 "and %3, %0\n\t"
44 "ldc %0, sr\n\t"
45 : "=&r" (__dummy0), "=r" (__dummy1)
46 : "r" (0x10000000), "r" (0xffffff0f)
47 : "memory"
48 );
49 }
50
clear_bl_bit(void)51 static inline void clear_bl_bit(void)
52 {
53 unsigned long __dummy0, __dummy1;
54
55 __asm__ __volatile__ (
56 "stc sr, %0\n\t"
57 "and %2, %0\n\t"
58 "ldc %0, sr\n\t"
59 : "=&r" (__dummy0), "=r" (__dummy1)
60 : "1" (~0x10000000)
61 : "memory"
62 );
63 }
64
__raw_local_save_flags(void)65 static inline unsigned long __raw_local_save_flags(void)
66 {
67 unsigned long flags;
68
69 __asm__ __volatile__ (
70 "stc sr, %0\n\t"
71 "and #0xf0, %0\n\t"
72 : "=&z" (flags)
73 : /* no inputs */
74 : "memory"
75 );
76
77 return flags;
78 }
79
80 #define raw_local_save_flags(flags) \
81 do { (flags) = __raw_local_save_flags(); } while (0)
82
raw_irqs_disabled_flags(unsigned long flags)83 static inline int raw_irqs_disabled_flags(unsigned long flags)
84 {
85 return (flags != 0);
86 }
87
raw_irqs_disabled(void)88 static inline int raw_irqs_disabled(void)
89 {
90 unsigned long flags = __raw_local_save_flags();
91
92 return raw_irqs_disabled_flags(flags);
93 }
94
__raw_local_irq_save(void)95 static inline unsigned long __raw_local_irq_save(void)
96 {
97 unsigned long flags, __dummy;
98
99 __asm__ __volatile__ (
100 "stc sr, %1\n\t"
101 "mov %1, %0\n\t"
102 "or #0xf0, %0\n\t"
103 "ldc %0, sr\n\t"
104 "mov %1, %0\n\t"
105 "and #0xf0, %0\n\t"
106 : "=&z" (flags), "=&r" (__dummy)
107 : /* no inputs */
108 : "memory"
109 );
110
111 return flags;
112 }
113
114 #define raw_local_irq_save(flags) \
115 do { (flags) = __raw_local_irq_save(); } while (0)
116
117 #define local_irq_save raw_local_irq_save
118
raw_local_irq_restore(unsigned long flags)119 static inline void raw_local_irq_restore(unsigned long flags)
120 {
121 if ((flags & 0xf0) != 0xf0)
122 raw_local_irq_enable();
123 }
124 #define local_irq_restore raw_local_irq_restore
125
126 #endif /* __ASM_SH_IRQFLAGS_H */
127