aboutsummaryrefslogtreecommitdiffstats
path: root/include/asm-arm/system.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/asm-arm/system.h')
-rw-r--r--include/asm-arm/system.h138
1 files changed, 9 insertions, 129 deletions
diff --git a/include/asm-arm/system.h b/include/asm-arm/system.h
index 6001febfe63b..f05fbe31576c 100644
--- a/include/asm-arm/system.h
+++ b/include/asm-arm/system.h
@@ -46,6 +46,7 @@
46#define CPUID_TCM 2 46#define CPUID_TCM 2
47#define CPUID_TLBTYPE 3 47#define CPUID_TLBTYPE 3
48 48
49#ifdef CONFIG_CPU_CP15
49#define read_cpuid(reg) \ 50#define read_cpuid(reg) \
50 ({ \ 51 ({ \
51 unsigned int __val; \ 52 unsigned int __val; \
@@ -55,6 +56,9 @@
55 : "cc"); \ 56 : "cc"); \
56 __val; \ 57 __val; \
57 }) 58 })
59#else
60#define read_cpuid(reg) (processor_id)
61#endif
58 62
59/* 63/*
60 * This is used to ensure the compiler did actually allocate the register we 64 * This is used to ensure the compiler did actually allocate the register we
@@ -176,7 +180,6 @@ extern unsigned int user_debug;
176#define wmb() mb() 180#define wmb() mb()
177#define read_barrier_depends() do { } while(0) 181#define read_barrier_depends() do { } while(0)
178#define set_mb(var, value) do { var = value; mb(); } while (0) 182#define set_mb(var, value) do { var = value; mb(); } while (0)
179#define set_wmb(var, value) do { var = value; wmb(); } while (0)
180#define nop() __asm__ __volatile__("mov\tr0,r0\t@ nop\n\t"); 183#define nop() __asm__ __volatile__("mov\tr0,r0\t@ nop\n\t");
181 184
182/* 185/*
@@ -208,130 +211,7 @@ static inline void sched_cacheflush(void)
208{ 211{
209} 212}
210 213
211/* 214#include <linux/irqflags.h>
212 * CPU interrupt mask handling.
213 */
214#if __LINUX_ARM_ARCH__ >= 6
215
216#define local_irq_save(x) \
217 ({ \
218 __asm__ __volatile__( \
219 "mrs %0, cpsr @ local_irq_save\n" \
220 "cpsid i" \
221 : "=r" (x) : : "memory", "cc"); \
222 })
223
224#define local_irq_enable() __asm__("cpsie i @ __sti" : : : "memory", "cc")
225#define local_irq_disable() __asm__("cpsid i @ __cli" : : : "memory", "cc")
226#define local_fiq_enable() __asm__("cpsie f @ __stf" : : : "memory", "cc")
227#define local_fiq_disable() __asm__("cpsid f @ __clf" : : : "memory", "cc")
228
229#else
230
231/*
232 * Save the current interrupt enable state & disable IRQs
233 */
234#define local_irq_save(x) \
235 ({ \
236 unsigned long temp; \
237 (void) (&temp == &x); \
238 __asm__ __volatile__( \
239 "mrs %0, cpsr @ local_irq_save\n" \
240" orr %1, %0, #128\n" \
241" msr cpsr_c, %1" \
242 : "=r" (x), "=r" (temp) \
243 : \
244 : "memory", "cc"); \
245 })
246
247/*
248 * Enable IRQs
249 */
250#define local_irq_enable() \
251 ({ \
252 unsigned long temp; \
253 __asm__ __volatile__( \
254 "mrs %0, cpsr @ local_irq_enable\n" \
255" bic %0, %0, #128\n" \
256" msr cpsr_c, %0" \
257 : "=r" (temp) \
258 : \
259 : "memory", "cc"); \
260 })
261
262/*
263 * Disable IRQs
264 */
265#define local_irq_disable() \
266 ({ \
267 unsigned long temp; \
268 __asm__ __volatile__( \
269 "mrs %0, cpsr @ local_irq_disable\n" \
270" orr %0, %0, #128\n" \
271" msr cpsr_c, %0" \
272 : "=r" (temp) \
273 : \
274 : "memory", "cc"); \
275 })
276
277/*
278 * Enable FIQs
279 */
280#define local_fiq_enable() \
281 ({ \
282 unsigned long temp; \
283 __asm__ __volatile__( \
284 "mrs %0, cpsr @ stf\n" \
285" bic %0, %0, #64\n" \
286" msr cpsr_c, %0" \
287 : "=r" (temp) \
288 : \
289 : "memory", "cc"); \
290 })
291
292/*
293 * Disable FIQs
294 */
295#define local_fiq_disable() \
296 ({ \
297 unsigned long temp; \
298 __asm__ __volatile__( \
299 "mrs %0, cpsr @ clf\n" \
300" orr %0, %0, #64\n" \
301" msr cpsr_c, %0" \
302 : "=r" (temp) \
303 : \
304 : "memory", "cc"); \
305 })
306
307#endif
308
309/*
310 * Save the current interrupt enable state.
311 */
312#define local_save_flags(x) \
313 ({ \
314 __asm__ __volatile__( \
315 "mrs %0, cpsr @ local_save_flags" \
316 : "=r" (x) : : "memory", "cc"); \
317 })
318
319/*
320 * restore saved IRQ & FIQ state
321 */
322#define local_irq_restore(x) \
323 __asm__ __volatile__( \
324 "msr cpsr_c, %0 @ local_irq_restore\n" \
325 : \
326 : "r" (x) \
327 : "memory", "cc")
328
329#define irqs_disabled() \
330({ \
331 unsigned long flags; \
332 local_save_flags(flags); \
333 (int)(flags & PSR_I_BIT); \
334})
335 215
336#ifdef CONFIG_SMP 216#ifdef CONFIG_SMP
337 217
@@ -406,17 +286,17 @@ static inline unsigned long __xchg(unsigned long x, volatile void *ptr, int size
406#error SMP is not supported on this platform 286#error SMP is not supported on this platform
407#endif 287#endif
408 case 1: 288 case 1:
409 local_irq_save(flags); 289 raw_local_irq_save(flags);
410 ret = *(volatile unsigned char *)ptr; 290 ret = *(volatile unsigned char *)ptr;
411 *(volatile unsigned char *)ptr = x; 291 *(volatile unsigned char *)ptr = x;
412 local_irq_restore(flags); 292 raw_local_irq_restore(flags);
413 break; 293 break;
414 294
415 case 4: 295 case 4:
416 local_irq_save(flags); 296 raw_local_irq_save(flags);
417 ret = *(volatile unsigned long *)ptr; 297 ret = *(volatile unsigned long *)ptr;
418 *(volatile unsigned long *)ptr = x; 298 *(volatile unsigned long *)ptr = x;
419 local_irq_restore(flags); 299 raw_local_irq_restore(flags);
420 break; 300 break;
421#else 301#else
422 case 1: 302 case 1: