18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */ 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * Copyright (C) 2010 Thomas Chou <thomas@wytron.com.tw> 48c2ecf20Sopenharmony_ci */ 58c2ecf20Sopenharmony_ci#ifndef _ASM_IRQFLAGS_H 68c2ecf20Sopenharmony_ci#define _ASM_IRQFLAGS_H 78c2ecf20Sopenharmony_ci 88c2ecf20Sopenharmony_ci#include <asm/registers.h> 98c2ecf20Sopenharmony_ci 108c2ecf20Sopenharmony_cistatic inline unsigned long arch_local_save_flags(void) 118c2ecf20Sopenharmony_ci{ 128c2ecf20Sopenharmony_ci return RDCTL(CTL_FSTATUS); 138c2ecf20Sopenharmony_ci} 148c2ecf20Sopenharmony_ci 158c2ecf20Sopenharmony_ci/* 168c2ecf20Sopenharmony_ci * This will restore ALL status register flags, not only the interrupt 178c2ecf20Sopenharmony_ci * mask flag. 188c2ecf20Sopenharmony_ci */ 198c2ecf20Sopenharmony_cistatic inline void arch_local_irq_restore(unsigned long flags) 208c2ecf20Sopenharmony_ci{ 218c2ecf20Sopenharmony_ci WRCTL(CTL_FSTATUS, flags); 228c2ecf20Sopenharmony_ci} 238c2ecf20Sopenharmony_ci 248c2ecf20Sopenharmony_cistatic inline void arch_local_irq_disable(void) 258c2ecf20Sopenharmony_ci{ 268c2ecf20Sopenharmony_ci unsigned long flags; 278c2ecf20Sopenharmony_ci 288c2ecf20Sopenharmony_ci flags = arch_local_save_flags(); 298c2ecf20Sopenharmony_ci arch_local_irq_restore(flags & ~STATUS_PIE); 308c2ecf20Sopenharmony_ci} 318c2ecf20Sopenharmony_ci 328c2ecf20Sopenharmony_cistatic inline void arch_local_irq_enable(void) 338c2ecf20Sopenharmony_ci{ 348c2ecf20Sopenharmony_ci unsigned long flags; 358c2ecf20Sopenharmony_ci 368c2ecf20Sopenharmony_ci flags = arch_local_save_flags(); 378c2ecf20Sopenharmony_ci arch_local_irq_restore(flags | STATUS_PIE); 388c2ecf20Sopenharmony_ci} 398c2ecf20Sopenharmony_ci 408c2ecf20Sopenharmony_cistatic inline int arch_irqs_disabled_flags(unsigned long flags) 418c2ecf20Sopenharmony_ci{ 428c2ecf20Sopenharmony_ci return (flags & STATUS_PIE) == 0; 438c2ecf20Sopenharmony_ci} 448c2ecf20Sopenharmony_ci 458c2ecf20Sopenharmony_cistatic inline int arch_irqs_disabled(void) 468c2ecf20Sopenharmony_ci{ 478c2ecf20Sopenharmony_ci return arch_irqs_disabled_flags(arch_local_save_flags()); 488c2ecf20Sopenharmony_ci} 498c2ecf20Sopenharmony_ci 508c2ecf20Sopenharmony_cistatic inline unsigned long arch_local_irq_save(void) 518c2ecf20Sopenharmony_ci{ 528c2ecf20Sopenharmony_ci unsigned long flags; 538c2ecf20Sopenharmony_ci 548c2ecf20Sopenharmony_ci flags = arch_local_save_flags(); 558c2ecf20Sopenharmony_ci arch_local_irq_restore(flags & ~STATUS_PIE); 568c2ecf20Sopenharmony_ci return flags; 578c2ecf20Sopenharmony_ci} 588c2ecf20Sopenharmony_ci 598c2ecf20Sopenharmony_ci#endif /* _ASM_IRQFLAGS_H */ 60