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