1df9ee29270c11dba7d0fe0b83ce47a4d8e8d2101David Howells/* 2df9ee29270c11dba7d0fe0b83ce47a4d8e8d2101David Howells * Xtensa IRQ flags handling functions 3df9ee29270c11dba7d0fe0b83ce47a4d8e8d2101David Howells * 4df9ee29270c11dba7d0fe0b83ce47a4d8e8d2101David Howells * This file is subject to the terms and conditions of the GNU General Public 5df9ee29270c11dba7d0fe0b83ce47a4d8e8d2101David Howells * License. See the file "COPYING" in the main directory of this archive 6df9ee29270c11dba7d0fe0b83ce47a4d8e8d2101David Howells * for more details. 7df9ee29270c11dba7d0fe0b83ce47a4d8e8d2101David Howells * 8df9ee29270c11dba7d0fe0b83ce47a4d8e8d2101David Howells * Copyright (C) 2001 - 2005 Tensilica Inc. 9df9ee29270c11dba7d0fe0b83ce47a4d8e8d2101David Howells */ 10df9ee29270c11dba7d0fe0b83ce47a4d8e8d2101David Howells 11df9ee29270c11dba7d0fe0b83ce47a4d8e8d2101David Howells#ifndef _XTENSA_IRQFLAGS_H 12df9ee29270c11dba7d0fe0b83ce47a4d8e8d2101David Howells#define _XTENSA_IRQFLAGS_H 13df9ee29270c11dba7d0fe0b83ce47a4d8e8d2101David Howells 14df9ee29270c11dba7d0fe0b83ce47a4d8e8d2101David Howells#include <linux/types.h> 15df9ee29270c11dba7d0fe0b83ce47a4d8e8d2101David Howells 16df9ee29270c11dba7d0fe0b83ce47a4d8e8d2101David Howellsstatic inline unsigned long arch_local_save_flags(void) 17df9ee29270c11dba7d0fe0b83ce47a4d8e8d2101David Howells{ 18df9ee29270c11dba7d0fe0b83ce47a4d8e8d2101David Howells unsigned long flags; 19df9ee29270c11dba7d0fe0b83ce47a4d8e8d2101David Howells asm volatile("rsr %0,"__stringify(PS) : "=a" (flags)); 20df9ee29270c11dba7d0fe0b83ce47a4d8e8d2101David Howells return flags; 21df9ee29270c11dba7d0fe0b83ce47a4d8e8d2101David Howells} 22df9ee29270c11dba7d0fe0b83ce47a4d8e8d2101David Howells 23df9ee29270c11dba7d0fe0b83ce47a4d8e8d2101David Howellsstatic inline unsigned long arch_local_irq_save(void) 24df9ee29270c11dba7d0fe0b83ce47a4d8e8d2101David Howells{ 25df9ee29270c11dba7d0fe0b83ce47a4d8e8d2101David Howells unsigned long flags; 26df9ee29270c11dba7d0fe0b83ce47a4d8e8d2101David Howells asm volatile("rsil %0, "__stringify(LOCKLEVEL) 27df9ee29270c11dba7d0fe0b83ce47a4d8e8d2101David Howells : "=a" (flags) :: "memory"); 28df9ee29270c11dba7d0fe0b83ce47a4d8e8d2101David Howells return flags; 29df9ee29270c11dba7d0fe0b83ce47a4d8e8d2101David Howells} 30df9ee29270c11dba7d0fe0b83ce47a4d8e8d2101David Howells 31df9ee29270c11dba7d0fe0b83ce47a4d8e8d2101David Howellsstatic inline void arch_local_irq_disable(void) 32df9ee29270c11dba7d0fe0b83ce47a4d8e8d2101David Howells{ 33df9ee29270c11dba7d0fe0b83ce47a4d8e8d2101David Howells arch_local_irq_save(); 34df9ee29270c11dba7d0fe0b83ce47a4d8e8d2101David Howells} 35df9ee29270c11dba7d0fe0b83ce47a4d8e8d2101David Howells 36df9ee29270c11dba7d0fe0b83ce47a4d8e8d2101David Howellsstatic inline void arch_local_irq_enable(void) 37df9ee29270c11dba7d0fe0b83ce47a4d8e8d2101David Howells{ 38df9ee29270c11dba7d0fe0b83ce47a4d8e8d2101David Howells unsigned long flags; 39df9ee29270c11dba7d0fe0b83ce47a4d8e8d2101David Howells asm volatile("rsil %0, 0" : "=a" (flags) :: "memory"); 40df9ee29270c11dba7d0fe0b83ce47a4d8e8d2101David Howells} 41df9ee29270c11dba7d0fe0b83ce47a4d8e8d2101David Howells 42df9ee29270c11dba7d0fe0b83ce47a4d8e8d2101David Howellsstatic inline void arch_local_irq_restore(unsigned long flags) 43df9ee29270c11dba7d0fe0b83ce47a4d8e8d2101David Howells{ 44df9ee29270c11dba7d0fe0b83ce47a4d8e8d2101David Howells asm volatile("wsr %0, "__stringify(PS)" ; rsync" 45df9ee29270c11dba7d0fe0b83ce47a4d8e8d2101David Howells :: "a" (flags) : "memory"); 46df9ee29270c11dba7d0fe0b83ce47a4d8e8d2101David Howells} 47df9ee29270c11dba7d0fe0b83ce47a4d8e8d2101David Howells 48df9ee29270c11dba7d0fe0b83ce47a4d8e8d2101David Howellsstatic inline bool arch_irqs_disabled_flags(unsigned long flags) 49df9ee29270c11dba7d0fe0b83ce47a4d8e8d2101David Howells{ 50df9ee29270c11dba7d0fe0b83ce47a4d8e8d2101David Howells return (flags & 0xf) != 0; 51df9ee29270c11dba7d0fe0b83ce47a4d8e8d2101David Howells} 52df9ee29270c11dba7d0fe0b83ce47a4d8e8d2101David Howells 53df9ee29270c11dba7d0fe0b83ce47a4d8e8d2101David Howellsstatic inline bool arch_irqs_disabled(void) 54df9ee29270c11dba7d0fe0b83ce47a4d8e8d2101David Howells{ 55df9ee29270c11dba7d0fe0b83ce47a4d8e8d2101David Howells return arch_irqs_disabled_flags(arch_local_save_flags()); 56df9ee29270c11dba7d0fe0b83ce47a4d8e8d2101David Howells} 57df9ee29270c11dba7d0fe0b83ce47a4d8e8d2101David Howells 58df9ee29270c11dba7d0fe0b83ce47a4d8e8d2101David Howells#endif /* _XTENSA_IRQFLAGS_H */ 59