18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
28c2ecf20Sopenharmony_ci#ifndef _H8300_IRQFLAGS_H
38c2ecf20Sopenharmony_ci#define _H8300_IRQFLAGS_H
48c2ecf20Sopenharmony_ci
58c2ecf20Sopenharmony_ci#ifdef CONFIG_CPU_H8300H
68c2ecf20Sopenharmony_citypedef unsigned char h8300flags;
78c2ecf20Sopenharmony_ci
88c2ecf20Sopenharmony_cistatic inline h8300flags arch_local_save_flags(void)
98c2ecf20Sopenharmony_ci{
108c2ecf20Sopenharmony_ci	h8300flags flags;
118c2ecf20Sopenharmony_ci
128c2ecf20Sopenharmony_ci	__asm__ volatile ("stc ccr,%w0" : "=r" (flags));
138c2ecf20Sopenharmony_ci	return flags;
148c2ecf20Sopenharmony_ci}
158c2ecf20Sopenharmony_ci
168c2ecf20Sopenharmony_cistatic inline void arch_local_irq_disable(void)
178c2ecf20Sopenharmony_ci{
188c2ecf20Sopenharmony_ci	__asm__ volatile ("orc  #0xc0,ccr");
198c2ecf20Sopenharmony_ci}
208c2ecf20Sopenharmony_ci
218c2ecf20Sopenharmony_cistatic inline void arch_local_irq_enable(void)
228c2ecf20Sopenharmony_ci{
238c2ecf20Sopenharmony_ci	__asm__ volatile ("andc #0x3f,ccr");
248c2ecf20Sopenharmony_ci}
258c2ecf20Sopenharmony_ci
268c2ecf20Sopenharmony_cistatic inline h8300flags arch_local_irq_save(void)
278c2ecf20Sopenharmony_ci{
288c2ecf20Sopenharmony_ci	h8300flags flags;
298c2ecf20Sopenharmony_ci
308c2ecf20Sopenharmony_ci	__asm__ volatile ("stc ccr,%w0\n\t"
318c2ecf20Sopenharmony_ci		      "orc  #0xc0,ccr" : "=r" (flags));
328c2ecf20Sopenharmony_ci	return flags;
338c2ecf20Sopenharmony_ci}
348c2ecf20Sopenharmony_ci
358c2ecf20Sopenharmony_cistatic inline void arch_local_irq_restore(h8300flags flags)
368c2ecf20Sopenharmony_ci{
378c2ecf20Sopenharmony_ci	__asm__ volatile ("ldc %w0,ccr" : : "r" (flags) : "cc");
388c2ecf20Sopenharmony_ci}
398c2ecf20Sopenharmony_ci
408c2ecf20Sopenharmony_cistatic inline int arch_irqs_disabled_flags(unsigned long flags)
418c2ecf20Sopenharmony_ci{
428c2ecf20Sopenharmony_ci	return (flags & 0xc0) == 0xc0;
438c2ecf20Sopenharmony_ci}
448c2ecf20Sopenharmony_ci#endif
458c2ecf20Sopenharmony_ci#ifdef CONFIG_CPU_H8S
468c2ecf20Sopenharmony_citypedef unsigned short h8300flags;
478c2ecf20Sopenharmony_ci
488c2ecf20Sopenharmony_cistatic inline h8300flags arch_local_save_flags(void)
498c2ecf20Sopenharmony_ci{
508c2ecf20Sopenharmony_ci	h8300flags flags;
518c2ecf20Sopenharmony_ci
528c2ecf20Sopenharmony_ci	__asm__ volatile ("stc ccr,%w0\n\tstc exr,%x0" : "=r" (flags));
538c2ecf20Sopenharmony_ci	return flags;
548c2ecf20Sopenharmony_ci}
558c2ecf20Sopenharmony_ci
568c2ecf20Sopenharmony_cistatic inline void arch_local_irq_disable(void)
578c2ecf20Sopenharmony_ci{
588c2ecf20Sopenharmony_ci	__asm__ volatile ("orc #0x80,ccr\n\t");
598c2ecf20Sopenharmony_ci}
608c2ecf20Sopenharmony_ci
618c2ecf20Sopenharmony_cistatic inline void arch_local_irq_enable(void)
628c2ecf20Sopenharmony_ci{
638c2ecf20Sopenharmony_ci	__asm__ volatile ("andc #0x7f,ccr\n\t"
648c2ecf20Sopenharmony_ci		      "andc #0xf0,exr\n\t");
658c2ecf20Sopenharmony_ci}
668c2ecf20Sopenharmony_ci
678c2ecf20Sopenharmony_cistatic inline h8300flags arch_local_irq_save(void)
688c2ecf20Sopenharmony_ci{
698c2ecf20Sopenharmony_ci	h8300flags flags;
708c2ecf20Sopenharmony_ci
718c2ecf20Sopenharmony_ci	__asm__ volatile ("stc ccr,%w0\n\t"
728c2ecf20Sopenharmony_ci		      "stc exr,%x0\n\t"
738c2ecf20Sopenharmony_ci		      "orc  #0x80,ccr\n\t"
748c2ecf20Sopenharmony_ci		      : "=r" (flags));
758c2ecf20Sopenharmony_ci	return flags;
768c2ecf20Sopenharmony_ci}
778c2ecf20Sopenharmony_ci
788c2ecf20Sopenharmony_cistatic inline void arch_local_irq_restore(h8300flags flags)
798c2ecf20Sopenharmony_ci{
808c2ecf20Sopenharmony_ci	__asm__ volatile ("ldc %w0,ccr\n\t"
818c2ecf20Sopenharmony_ci		      "ldc %x0,exr"
828c2ecf20Sopenharmony_ci		      : : "r" (flags) : "cc");
838c2ecf20Sopenharmony_ci}
848c2ecf20Sopenharmony_ci
858c2ecf20Sopenharmony_cistatic inline int arch_irqs_disabled_flags(h8300flags flags)
868c2ecf20Sopenharmony_ci{
878c2ecf20Sopenharmony_ci	return (flags & 0x0080) == 0x0080;
888c2ecf20Sopenharmony_ci}
898c2ecf20Sopenharmony_ci
908c2ecf20Sopenharmony_ci#endif
918c2ecf20Sopenharmony_ci
928c2ecf20Sopenharmony_cistatic inline int arch_irqs_disabled(void)
938c2ecf20Sopenharmony_ci{
948c2ecf20Sopenharmony_ci	return arch_irqs_disabled_flags(arch_local_save_flags());
958c2ecf20Sopenharmony_ci}
968c2ecf20Sopenharmony_ci
978c2ecf20Sopenharmony_ci#endif /* _H8300_IRQFLAGS_H */
98