diff options
author | Mark Salter <msalter@redhat.com> | 2010-10-27 20:28:52 +0400 |
---|---|---|
committer | David Howells <dhowells@redhat.com> | 2010-10-27 20:28:52 +0400 |
commit | 4f81ca13532981192c83da95ed8c8cb285817d99 (patch) | |
tree | 737f558ce1683dacc5a294694cfd9f1a9b6fa972 /arch/mn10300/include/asm/system.h | |
parent | 278d91c4609d55202c1e63d5fc5f01466cc7bbab (diff) | |
download | linux-4f81ca13532981192c83da95ed8c8cb285817d99.tar.xz |
MN10300: Implement atomic ops using atomic ops unit
Implement atomic ops using the atomic ops unit available in the AM34 CPU. This
allows the equivalent of the LL/SC instructions to be found on other CPUs.
Signed-off-by: Mark Salter <msalter@redhat.com>
Signed-off-by: David Howells <dhowells@redhat.com>
Diffstat (limited to 'arch/mn10300/include/asm/system.h')
-rw-r--r-- | arch/mn10300/include/asm/system.h | 48 |
1 files changed, 1 insertions, 47 deletions
diff --git a/arch/mn10300/include/asm/system.h b/arch/mn10300/include/asm/system.h index 3c272a1a1015..7de90bc4cf80 100644 --- a/arch/mn10300/include/asm/system.h +++ b/arch/mn10300/include/asm/system.h @@ -18,6 +18,7 @@ #include <linux/kernel.h> #include <linux/irqflags.h> +#include <asm/atomic.h> #if !defined(CONFIG_LAZY_SAVE_FPU) struct fpu_state_struct; @@ -96,52 +97,5 @@ do { \ #define read_barrier_depends() do {} while (0) #define smp_read_barrier_depends() do {} while (0) -/*****************************************************************************/ -/* - * MN10300 doesn't actually have an exchange instruction - */ -#ifndef __ASSEMBLY__ - -struct __xchg_dummy { unsigned long a[100]; }; -#define __xg(x) ((struct __xchg_dummy *)(x)) - -static inline -unsigned long __xchg(volatile unsigned long *m, unsigned long val) -{ - unsigned long retval; - unsigned long flags; - - local_irq_save(flags); - retval = *m; - *m = val; - local_irq_restore(flags); - return retval; -} - -#define xchg(ptr, v) \ - ((__typeof__(*(ptr))) __xchg((unsigned long *)(ptr), \ - (unsigned long)(v))) - -static inline unsigned long __cmpxchg(volatile unsigned long *m, - unsigned long old, unsigned long new) -{ - unsigned long retval; - unsigned long flags; - - local_irq_save(flags); - retval = *m; - if (retval == old) - *m = new; - local_irq_restore(flags); - return retval; -} - -#define cmpxchg(ptr, o, n) \ - ((__typeof__(*(ptr))) __cmpxchg((unsigned long *)(ptr), \ - (unsigned long)(o), \ - (unsigned long)(n))) - -#endif /* !__ASSEMBLY__ */ - #endif /* __KERNEL__ */ #endif /* _ASM_SYSTEM_H */ |