aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMathieu Desnoyers <mathieu.desnoyers@polymtl.ca>2008-02-07 03:16:26 -0500
committerLinus Torvalds <torvalds@woody.linux-foundation.org>2008-02-07 11:42:33 -0500
commit9a7744f9823b9ddf14c47c475e81c1326b1a2787 (patch)
treea5969eab412bb34aa0f38c6a12a5fffe5553b2ce
parentb62f13439147210d5ad4bc40acee32b94c59f06d (diff)
Add cmpxchg_local to xtensa
Use the architecture specific __cmpxchg_u32 for 32 bits cmpxchg)_local. Else, use the new generic cmpxchg_local (disables interrupt). Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@polymtl.ca> Cc: Chris Zankel <chris@zankel.net> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r--include/asm-xtensa/system.h22
1 files changed, 22 insertions, 0 deletions
diff --git a/include/asm-xtensa/system.h b/include/asm-xtensa/system.h
index ddc970847ae9..e0cb9116d8ab 100644
--- a/include/asm-xtensa/system.h
+++ b/include/asm-xtensa/system.h
@@ -156,8 +156,30 @@ __cmpxchg(volatile void *ptr, unsigned long old, unsigned long new, int size)
156 (unsigned long)_n_, sizeof (*(ptr))); \ 156 (unsigned long)_n_, sizeof (*(ptr))); \
157 }) 157 })
158 158
159#include <asm-generic/cmpxchg-local.h>
159 160
161static inline unsigned long __cmpxchg_local(volatile void *ptr,
162 unsigned long old,
163 unsigned long new, int size)
164{
165 switch (size) {
166 case 4:
167 return __cmpxchg_u32(ptr, old, new);
168 default:
169 return __cmpxchg_local_generic(ptr, old, new, size);
170 }
160 171
172 return old;
173}
174
175/*
176 * cmpxchg_local and cmpxchg64_local are atomic wrt current CPU. Always make
177 * them available.
178 */
179#define cmpxchg_local(ptr, o, n) \
180 ((__typeof__(*(ptr)))__cmpxchg_local_generic((ptr), (unsigned long)(o),\
181 (unsigned long)(n), sizeof(*(ptr))))
182#define cmpxchg64_local(ptr, o, n) __cmpxchg64_local_generic((ptr), (o), (n))
161 183
162/* 184/*
163 * xchg_u32 185 * xchg_u32