0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012 #ifndef __ARCH_SPARC_ATOMIC__
0013 #define __ARCH_SPARC_ATOMIC__
0014
0015 #include <linux/types.h>
0016
0017 #include <asm/cmpxchg.h>
0018 #include <asm/barrier.h>
0019 #include <asm-generic/atomic64.h>
0020
0021 int arch_atomic_add_return(int, atomic_t *);
0022 int arch_atomic_fetch_add(int, atomic_t *);
0023 int arch_atomic_fetch_and(int, atomic_t *);
0024 int arch_atomic_fetch_or(int, atomic_t *);
0025 int arch_atomic_fetch_xor(int, atomic_t *);
0026 int arch_atomic_cmpxchg(atomic_t *, int, int);
0027 int arch_atomic_xchg(atomic_t *, int);
0028 int arch_atomic_fetch_add_unless(atomic_t *, int, int);
0029 void arch_atomic_set(atomic_t *, int);
0030
0031 #define arch_atomic_fetch_add_unless arch_atomic_fetch_add_unless
0032
0033 #define arch_atomic_set_release(v, i) arch_atomic_set((v), (i))
0034
0035 #define arch_atomic_read(v) READ_ONCE((v)->counter)
0036
0037 #define arch_atomic_add(i, v) ((void)arch_atomic_add_return( (int)(i), (v)))
0038 #define arch_atomic_sub(i, v) ((void)arch_atomic_add_return(-(int)(i), (v)))
0039
0040 #define arch_atomic_and(i, v) ((void)arch_atomic_fetch_and((i), (v)))
0041 #define arch_atomic_or(i, v) ((void)arch_atomic_fetch_or((i), (v)))
0042 #define arch_atomic_xor(i, v) ((void)arch_atomic_fetch_xor((i), (v)))
0043
0044 #define arch_atomic_sub_return(i, v) (arch_atomic_add_return(-(int)(i), (v)))
0045 #define arch_atomic_fetch_sub(i, v) (arch_atomic_fetch_add (-(int)(i), (v)))
0046
0047 #endif