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