diff options
author | Mathieu Desnoyers <mathieu.desnoyers@polymtl.ca> | 2008-02-07 03:16:12 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2008-02-07 11:42:31 -0500 |
commit | 5e86c11d3eb4662000f3ced7344352b2ca319d03 (patch) | |
tree | 30332e5df3105622e2b5443aa346c739a89f37f6 | |
parent | 176393d4232a89aaf8745b0726f4d212a20103f1 (diff) |
Add cmpxchg_local to avr32
Use the new generic cmpxchg_local (disables interrupt) for 8, 16 and 64 bits
cmpxchg_local. Use the __cmpxchg_u32 primitive for 32 bits cmpxchg_local.
Note that cmpxchg only uses the __cmpxchg_u32 or __cmpxchg_u64 and will cause
a linker error if called with 8 or 16 bits argument.
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@polymtl.ca>
Acked-by: Haavard Skinnemoen <hskinnemoen@atmel.com>
Cc: Haavard Skinnemoen <hskinnemoen@atmel.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r-- | include/asm-avr32/system.h | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/include/asm-avr32/system.h b/include/asm-avr32/system.h index c600cc15cbcb..9702c2213e1e 100644 --- a/include/asm-avr32/system.h +++ b/include/asm-avr32/system.h | |||
@@ -145,6 +145,29 @@ static inline unsigned long __cmpxchg(volatile void *ptr, unsigned long old, | |||
145 | (unsigned long)(new), \ | 145 | (unsigned long)(new), \ |
146 | sizeof(*(ptr)))) | 146 | sizeof(*(ptr)))) |
147 | 147 | ||
148 | #include <asm-generic/cmpxchg-local.h> | ||
149 | |||
150 | static inline unsigned long __cmpxchg_local(volatile void *ptr, | ||
151 | unsigned long old, | ||
152 | unsigned long new, int size) | ||
153 | { | ||
154 | switch (size) { | ||
155 | case 4: | ||
156 | return __cmpxchg_u32(ptr, old, new); | ||
157 | default: | ||
158 | return __cmpxchg_local_generic(ptr, old, new, size); | ||
159 | } | ||
160 | |||
161 | return old; | ||
162 | } | ||
163 | |||
164 | #define cmpxchg_local(ptr, old, new) \ | ||
165 | ((typeof(*(ptr)))__cmpxchg_local((ptr), (unsigned long)(old), \ | ||
166 | (unsigned long)(new), \ | ||
167 | sizeof(*(ptr)))) | ||
168 | |||
169 | #define cmpxchg64_local(ptr, o, n) __cmpxchg64_local_generic((ptr), (o), (n)) | ||
170 | |||
148 | struct pt_regs; | 171 | struct pt_regs; |
149 | void NORET_TYPE die(const char *str, struct pt_regs *regs, long err); | 172 | void NORET_TYPE die(const char *str, struct pt_regs *regs, long err); |
150 | void _exception(long signr, struct pt_regs *regs, int code, | 173 | void _exception(long signr, struct pt_regs *regs, int code, |