diff options
Diffstat (limited to 'include/asm-arm')
-rw-r--r-- | include/asm-arm/atomic.h | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/include/asm-arm/atomic.h b/include/asm-arm/atomic.h index 8ab1689ef56a..75b802719723 100644 --- a/include/asm-arm/atomic.h +++ b/include/asm-arm/atomic.h | |||
@@ -173,6 +173,17 @@ static inline void atomic_clear_mask(unsigned long mask, unsigned long *addr) | |||
173 | 173 | ||
174 | #endif /* __LINUX_ARM_ARCH__ */ | 174 | #endif /* __LINUX_ARM_ARCH__ */ |
175 | 175 | ||
176 | static inline int atomic_add_unless(atomic_t *v, int a, int u) | ||
177 | { | ||
178 | int c, old; | ||
179 | |||
180 | c = atomic_read(v); | ||
181 | while (c != u && (old = atomic_cmpxchg((v), c, c + a)) != c) | ||
182 | c = old; | ||
183 | return c != u; | ||
184 | } | ||
185 | #define atomic_inc_not_zero(v) atomic_add_unless((v), 1, 0) | ||
186 | |||
176 | #define atomic_add(i, v) (void) atomic_add_return(i, v) | 187 | #define atomic_add(i, v) (void) atomic_add_return(i, v) |
177 | #define atomic_inc(v) (void) atomic_add_return(1, v) | 188 | #define atomic_inc(v) (void) atomic_add_return(1, v) |
178 | #define atomic_sub(i, v) (void) atomic_sub_return(i, v) | 189 | #define atomic_sub(i, v) (void) atomic_sub_return(i, v) |