Commit 5e86c11d3eb4662000f3ced7344352b2ca319d03
Committed by
Linus Torvalds
1 parent
176393d423
Exists in
master
and in
7 other branches
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>
Showing 1 changed file with 23 additions and 0 deletions Side-by-side Diff
include/asm-avr32/system.h
... | ... | @@ -145,6 +145,29 @@ |
145 | 145 | (unsigned long)(new), \ |
146 | 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 | 171 | struct pt_regs; |
149 | 172 | void NORET_TYPE die(const char *str, struct pt_regs *regs, long err); |
150 | 173 | void _exception(long signr, struct pt_regs *regs, int code, |