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 | |
| 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>
| -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 */ |
