1 #ifndef __ASM_ARM_ATOMIC_H_WRAPPER
2 #define __ASM_ARM_ATOMIC_H_WRAPPER 1
4 #include_next <asm/atomic.h>
6 #error "Cribbed from linux-2.6/include/asm-arm/atomic.h but untested"
10 #if __LINUX_ARM_ARCH__ >= 6
12 static inline int atomic_cmpxchg(atomic_t *ptr, int old, int new)
14 unsigned long oldval, res;
17 __asm__ __volatile__("@ atomic_cmpxchg\n"
21 "strexeq %0, %4, [%2]\n"
22 : "=&r" (res), "=&r" (oldval)
23 : "r" (&ptr->counter), "Ir" (old), "r" (new)
30 #else /* ARM_ARCH_6 */
32 #include <asm/system.h>
35 #error SMP not supported on pre-ARMv6 CPUs
38 static inline int atomic_cmpxchg(atomic_t *v, int old, int new)
43 raw_local_irq_save(flags);
45 if (likely(ret == old))
47 raw_local_irq_restore(flags);
52 #endif /* __LINUX_ARM_ARCH__ */
54 #endif /* __KERNEL__ */
56 #endif /* asm/atomic.h */