1 /* SPDX-License-Identifier: GPL-2.0 */
2 #ifndef _H8300_IRQFLAGS_H
3 #define _H8300_IRQFLAGS_H
4 
5 #ifdef CONFIG_CPU_H8300H
6 typedef unsigned char h8300flags;
7 
arch_local_save_flags(void)8 static inline h8300flags arch_local_save_flags(void)
9 {
10 	h8300flags flags;
11 
12 	__asm__ volatile ("stc ccr,%w0" : "=r" (flags));
13 	return flags;
14 }
15 
arch_local_irq_disable(void)16 static inline void arch_local_irq_disable(void)
17 {
18 	__asm__ volatile ("orc  #0xc0,ccr");
19 }
20 
arch_local_irq_enable(void)21 static inline void arch_local_irq_enable(void)
22 {
23 	__asm__ volatile ("andc #0x3f,ccr");
24 }
25 
arch_local_irq_save(void)26 static inline h8300flags arch_local_irq_save(void)
27 {
28 	h8300flags flags;
29 
30 	__asm__ volatile ("stc ccr,%w0\n\t"
31 		      "orc  #0xc0,ccr" : "=r" (flags));
32 	return flags;
33 }
34 
arch_local_irq_restore(h8300flags flags)35 static inline void arch_local_irq_restore(h8300flags flags)
36 {
37 	__asm__ volatile ("ldc %w0,ccr" : : "r" (flags) : "cc");
38 }
39 
arch_irqs_disabled_flags(unsigned long flags)40 static inline int arch_irqs_disabled_flags(unsigned long flags)
41 {
42 	return (flags & 0xc0) == 0xc0;
43 }
44 #endif
45 #ifdef CONFIG_CPU_H8S
46 typedef unsigned short h8300flags;
47 
arch_local_save_flags(void)48 static inline h8300flags arch_local_save_flags(void)
49 {
50 	h8300flags flags;
51 
52 	__asm__ volatile ("stc ccr,%w0\n\tstc exr,%x0" : "=r" (flags));
53 	return flags;
54 }
55 
arch_local_irq_disable(void)56 static inline void arch_local_irq_disable(void)
57 {
58 	__asm__ volatile ("orc #0x80,ccr\n\t");
59 }
60 
arch_local_irq_enable(void)61 static inline void arch_local_irq_enable(void)
62 {
63 	__asm__ volatile ("andc #0x7f,ccr\n\t"
64 		      "andc #0xf0,exr\n\t");
65 }
66 
arch_local_irq_save(void)67 static inline h8300flags arch_local_irq_save(void)
68 {
69 	h8300flags flags;
70 
71 	__asm__ volatile ("stc ccr,%w0\n\t"
72 		      "stc exr,%x0\n\t"
73 		      "orc  #0x80,ccr\n\t"
74 		      : "=r" (flags));
75 	return flags;
76 }
77 
arch_local_irq_restore(h8300flags flags)78 static inline void arch_local_irq_restore(h8300flags flags)
79 {
80 	__asm__ volatile ("ldc %w0,ccr\n\t"
81 		      "ldc %x0,exr"
82 		      : : "r" (flags) : "cc");
83 }
84 
arch_irqs_disabled_flags(h8300flags flags)85 static inline int arch_irqs_disabled_flags(h8300flags flags)
86 {
87 	return (flags & 0x0080) == 0x0080;
88 }
89 
90 #endif
91 
arch_irqs_disabled(void)92 static inline int arch_irqs_disabled(void)
93 {
94 	return arch_irqs_disabled_flags(arch_local_save_flags());
95 }
96 
97 #endif /* _H8300_IRQFLAGS_H */
98