1#ifndef __ASM_SH_IRQFLAGS_H
2#define __ASM_SH_IRQFLAGS_H
3
4static 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
22static 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
36static 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
51static 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
65static 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
83static inline int raw_irqs_disabled_flags(unsigned long flags)
84{
85	return (flags != 0);
86}
87
88static 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
95static 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
119static 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