xref: /openbmc/u-boot/arch/sh/include/asm/irqflags.h (revision 20c700f8)
1 #ifndef __ASM_SH_IRQFLAGS_H
2 #define __ASM_SH_IRQFLAGS_H
3 
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 
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 
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 
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 
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 
83 static inline int raw_irqs_disabled_flags(unsigned long flags)
84 {
85 	return (flags != 0);
86 }
87 
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 
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 
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