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