Commit 5e86c11d3eb4662000f3ced7344352b2ca319d03

Authored by Mathieu Desnoyers
Committed by Linus Torvalds
1 parent 176393d423

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,