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