diff options
author | Mathieu Desnoyers <mathieu.desnoyers@polymtl.ca> | 2008-02-07 03:16:14 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2008-02-07 11:42:32 -0500 |
commit | 14e0cb3c60b89c4a2512852ffc18601c72314a0f (patch) | |
tree | 59267c487c31f18036ac8c1a28a2250c3bd97f60 /include | |
parent | 7732ba3abc5a53e7e1d93afd5a5a6ccf74f2ce53 (diff) |
Add cmpxchg_local to frv
Use the new generic cmpxchg_local (disables interrupt) for 8, 16 and 64 bits
arguments. Use the 32 bits cmpxchg available on the architecture for 32 bits
arguments.
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@polymtl.ca>
Cc: David Howells <dhowells@redhat.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'include')
-rw-r--r-- | include/asm-frv/system.h | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/include/asm-frv/system.h b/include/asm-frv/system.h index 9f5663ba19f8..59be5443a68f 100644 --- a/include/asm-frv/system.h +++ b/include/asm-frv/system.h | |||
@@ -268,5 +268,29 @@ extern uint32_t __cmpxchg_32(uint32_t *v, uint32_t test, uint32_t new); | |||
268 | 268 | ||
269 | #endif | 269 | #endif |
270 | 270 | ||
271 | #include <asm-generic/cmpxchg-local.h> | ||
272 | |||
273 | static inline unsigned long __cmpxchg_local(volatile void *ptr, | ||
274 | unsigned long old, | ||
275 | unsigned long new, int size) | ||
276 | { | ||
277 | switch (size) { | ||
278 | case 4: | ||
279 | return cmpxchg(ptr, old, new); | ||
280 | default: | ||
281 | return __cmpxchg_local_generic(ptr, old, new, size); | ||
282 | } | ||
283 | |||
284 | return old; | ||
285 | } | ||
286 | |||
287 | /* | ||
288 | * cmpxchg_local and cmpxchg64_local are atomic wrt current CPU. Always make | ||
289 | * them available. | ||
290 | */ | ||
291 | #define cmpxchg_local(ptr, o, n) \ | ||
292 | ((__typeof__(*(ptr)))__cmpxchg_local((ptr), (unsigned long)(o), \ | ||
293 | (unsigned long)(n), sizeof(*(ptr)))) | ||
294 | #define cmpxchg64_local(ptr, o, n) __cmpxchg64_local_generic((ptr), (o), (n)) | ||
271 | 295 | ||
272 | #endif /* _ASM_SYSTEM_H */ | 296 | #endif /* _ASM_SYSTEM_H */ |