xref: /linux/include/asm-generic/irqflags.h (revision 498495dba268b20e8eadd7fe93c140c68b6cc9d2)
1*b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */
2aafe4dbeSArnd Bergmann #ifndef __ASM_GENERIC_IRQFLAGS_H
3aafe4dbeSArnd Bergmann #define __ASM_GENERIC_IRQFLAGS_H
4aafe4dbeSArnd Bergmann 
5aafe4dbeSArnd Bergmann /*
6aafe4dbeSArnd Bergmann  * All architectures should implement at least the first two functions,
7aafe4dbeSArnd Bergmann  * usually inline assembly will be the best way.
8aafe4dbeSArnd Bergmann  */
9df9ee292SDavid Howells #ifndef ARCH_IRQ_DISABLED
10df9ee292SDavid Howells #define ARCH_IRQ_DISABLED 0
11df9ee292SDavid Howells #define ARCH_IRQ_ENABLED 1
12aafe4dbeSArnd Bergmann #endif
13aafe4dbeSArnd Bergmann 
14aafe4dbeSArnd Bergmann /* read interrupt enabled status */
15df9ee292SDavid Howells #ifndef arch_local_save_flags
16df9ee292SDavid Howells unsigned long arch_local_save_flags(void);
17aafe4dbeSArnd Bergmann #endif
18aafe4dbeSArnd Bergmann 
19aafe4dbeSArnd Bergmann /* set interrupt enabled status */
20df9ee292SDavid Howells #ifndef arch_local_irq_restore
21df9ee292SDavid Howells void arch_local_irq_restore(unsigned long flags);
22aafe4dbeSArnd Bergmann #endif
23aafe4dbeSArnd Bergmann 
24aafe4dbeSArnd Bergmann /* get status and disable interrupts */
25df9ee292SDavid Howells #ifndef arch_local_irq_save
arch_local_irq_save(void)26df9ee292SDavid Howells static inline unsigned long arch_local_irq_save(void)
27aafe4dbeSArnd Bergmann {
28aafe4dbeSArnd Bergmann 	unsigned long flags;
29df9ee292SDavid Howells 	flags = arch_local_save_flags();
30df9ee292SDavid Howells 	arch_local_irq_restore(ARCH_IRQ_DISABLED);
31aafe4dbeSArnd Bergmann 	return flags;
32aafe4dbeSArnd Bergmann }
33aafe4dbeSArnd Bergmann #endif
34aafe4dbeSArnd Bergmann 
35aafe4dbeSArnd Bergmann /* test flags */
36df9ee292SDavid Howells #ifndef arch_irqs_disabled_flags
arch_irqs_disabled_flags(unsigned long flags)37df9ee292SDavid Howells static inline int arch_irqs_disabled_flags(unsigned long flags)
38aafe4dbeSArnd Bergmann {
39df9ee292SDavid Howells 	return flags == ARCH_IRQ_DISABLED;
40aafe4dbeSArnd Bergmann }
41aafe4dbeSArnd Bergmann #endif
42aafe4dbeSArnd Bergmann 
43aafe4dbeSArnd Bergmann /* unconditionally enable interrupts */
44df9ee292SDavid Howells #ifndef arch_local_irq_enable
arch_local_irq_enable(void)45df9ee292SDavid Howells static inline void arch_local_irq_enable(void)
46aafe4dbeSArnd Bergmann {
47df9ee292SDavid Howells 	arch_local_irq_restore(ARCH_IRQ_ENABLED);
48aafe4dbeSArnd Bergmann }
49aafe4dbeSArnd Bergmann #endif
50aafe4dbeSArnd Bergmann 
51aafe4dbeSArnd Bergmann /* unconditionally disable interrupts */
52df9ee292SDavid Howells #ifndef arch_local_irq_disable
arch_local_irq_disable(void)53df9ee292SDavid Howells static inline void arch_local_irq_disable(void)
54aafe4dbeSArnd Bergmann {
55df9ee292SDavid Howells 	arch_local_irq_restore(ARCH_IRQ_DISABLED);
56aafe4dbeSArnd Bergmann }
57aafe4dbeSArnd Bergmann #endif
58aafe4dbeSArnd Bergmann 
59aafe4dbeSArnd Bergmann /* test hardware interrupt enable bit */
60df9ee292SDavid Howells #ifndef arch_irqs_disabled
arch_irqs_disabled(void)61df9ee292SDavid Howells static inline int arch_irqs_disabled(void)
62aafe4dbeSArnd Bergmann {
63df9ee292SDavid Howells 	return arch_irqs_disabled_flags(arch_local_save_flags());
64aafe4dbeSArnd Bergmann }
65aafe4dbeSArnd Bergmann #endif
66aafe4dbeSArnd Bergmann 
67aafe4dbeSArnd Bergmann #endif /* __ASM_GENERIC_IRQFLAGS_H */
68