2 * interface to Blackfin CEC
4 * Copyright 2009 Analog Devices Inc.
5 * Licensed under the GPL-2 or later.
8 #ifndef __ASM_BFIN_IRQFLAGS_H__
9 #define __ASM_BFIN_IRQFLAGS_H__
11 #include <mach/blackfin.h>
15 # include <asm/processor.h>
16 /* Forward decl needed due to cdef inter dependencies */
17 static inline uint32_t __pure bfin_dspid(void);
18 # define blackfin_core_id() (bfin_dspid() & 0xff)
19 # define bfin_irq_flags cpu_pda[blackfin_core_id()].imask
21 extern unsigned long bfin_irq_flags;
24 static inline void bfin_sti(unsigned long flags)
26 asm volatile("sti %0;" : : "d" (flags));
29 static inline unsigned long bfin_cli(void)
32 asm volatile("cli %0;" : "=d" (flags));
38 #include <linux/compiler.h>
39 #include <linux/ipipe_base.h>
40 #include <linux/ipipe_trace.h>
42 #ifdef CONFIG_DEBUG_HWERR
43 # define bfin_no_irqs 0x3f
45 # define bfin_no_irqs 0x1f
48 #define raw_local_irq_disable() \
50 ipipe_check_context(ipipe_root_domain); \
51 __ipipe_stall_root(); \
55 #define raw_local_irq_enable() \
58 ipipe_check_context(ipipe_root_domain); \
59 __ipipe_unstall_root(); \
62 #define raw_local_save_flags_ptr(x) \
64 *(x) = __ipipe_test_root() ? bfin_no_irqs : bfin_irq_flags; \
67 #define raw_local_save_flags(x) raw_local_save_flags_ptr(&(x))
69 #define raw_irqs_disabled_flags(x) ((x) == bfin_no_irqs)
71 #define raw_local_irq_save_ptr(x) \
73 *(x) = __ipipe_test_and_stall_root() ? bfin_no_irqs : bfin_irq_flags; \
77 #define raw_local_irq_save(x) \
79 ipipe_check_context(ipipe_root_domain); \
80 raw_local_irq_save_ptr(&(x)); \
83 static inline unsigned long raw_mangle_irq_bits(int virt, unsigned long real)
86 * Merge virtual and real interrupt mask bits into a single
89 return (real & ~(1 << 31)) | ((virt != 0) << 31);
92 static inline int raw_demangle_irq_bits(unsigned long *x)
94 int virt = (*x & (1 << 31)) != 0;
99 static inline void local_irq_disable_hw_notrace(void)
104 static inline void local_irq_enable_hw_notrace(void)
106 bfin_sti(bfin_irq_flags);
109 #define local_save_flags_hw(flags) \
111 (flags) = bfin_read_IMASK(); \
114 #define irqs_disabled_flags_hw(flags) (((flags) & ~0x3f) == 0)
116 #define irqs_disabled_hw() \
118 unsigned long flags; \
119 local_save_flags_hw(flags); \
120 irqs_disabled_flags_hw(flags); \
123 static inline void local_irq_save_ptr_hw(unsigned long *flags)
126 #ifdef CONFIG_DEBUG_HWERR
131 #define local_irq_save_hw_notrace(flags) \
133 local_irq_save_ptr_hw(&(flags)); \
136 static inline void local_irq_restore_hw_notrace(unsigned long flags)
138 if (!irqs_disabled_flags_hw(flags))
139 local_irq_enable_hw_notrace();
142 #ifdef CONFIG_IPIPE_TRACE_IRQSOFF
143 # define local_irq_disable_hw() \
145 if (!irqs_disabled_hw()) { \
146 local_irq_disable_hw_notrace(); \
147 ipipe_trace_begin(0x80000000); \
150 # define local_irq_enable_hw() \
152 if (irqs_disabled_hw()) { \
153 ipipe_trace_end(0x80000000); \
154 local_irq_enable_hw_notrace(); \
157 # define local_irq_save_hw(flags) \
159 local_save_flags_hw(flags); \
160 if (!irqs_disabled_flags_hw(flags)) { \
161 local_irq_disable_hw_notrace(); \
162 ipipe_trace_begin(0x80000001); \
165 # define local_irq_restore_hw(flags) \
167 if (!irqs_disabled_flags_hw(flags)) { \
168 ipipe_trace_end(0x80000001); \
169 local_irq_enable_hw_notrace(); \
172 #else /* !CONFIG_IPIPE_TRACE_IRQSOFF */
173 # define local_irq_disable_hw() local_irq_disable_hw_notrace()
174 # define local_irq_enable_hw() local_irq_enable_hw_notrace()
175 # define local_irq_save_hw(flags) local_irq_save_hw_notrace(flags)
176 # define local_irq_restore_hw(flags) local_irq_restore_hw_notrace(flags)
177 #endif /* !CONFIG_IPIPE_TRACE_IRQSOFF */
179 #else /* CONFIG_IPIPE */
181 static inline void raw_local_irq_disable(void)
185 static inline void raw_local_irq_enable(void)
187 bfin_sti(bfin_irq_flags);
190 static inline unsigned long arch_local_save_flags(void)
192 return bfin_read_IMASK();
195 #define raw_local_save_flags(flags) do { (flags) = arch_local_save_flags(); } while (0)
197 #define raw_irqs_disabled_flags(flags) (((flags) & ~0x3f) == 0)
199 static inline unsigned long __raw_local_irq_save(void)
201 unsigned long flags = bfin_cli();
202 #ifdef CONFIG_DEBUG_HWERR
207 #define raw_local_irq_save(flags) do { (flags) = __raw_local_irq_save(); } while (0)
209 #define local_irq_save_hw(flags) raw_local_irq_save(flags)
210 #define local_irq_restore_hw(flags) raw_local_irq_restore(flags)
211 #define local_irq_enable_hw() raw_local_irq_enable()
212 #define local_irq_disable_hw() raw_local_irq_disable()
213 #define irqs_disabled_hw() irqs_disabled()
215 #endif /* !CONFIG_IPIPE */
217 static inline void raw_local_irq_restore(unsigned long flags)
219 if (!raw_irqs_disabled_flags(flags))
220 raw_local_irq_enable();