diff options
author | Steve French <sfrench@us.ibm.com> | 2005-11-13 20:28:58 -0800 |
---|---|---|
committer | Steve French <sfrench@us.ibm.com> | 2005-11-13 20:28:58 -0800 |
commit | 7b0a65f9923ffe7885a5473648baaa3a1a701726 (patch) | |
tree | b9be4a0504b4e637b86bdc92d88268ff57ea1bc5 /include/asm-arm26 | |
parent | 1b98a8221e3c9c86ae7e292ba7542d2dd6f10eb9 (diff) | |
parent | ee90f62b3e69d0cd9f8edc6b95f07b1a8c38aaf4 (diff) |
Merge with /pub/scm/linux/kernel/git/torvalds/linux-2.6.git
Diffstat (limited to 'include/asm-arm26')
-rw-r--r-- | include/asm-arm26/atomic.h | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/include/asm-arm26/atomic.h b/include/asm-arm26/atomic.h index 4a88235c0e76..a47cadc59686 100644 --- a/include/asm-arm26/atomic.h +++ b/include/asm-arm26/atomic.h @@ -62,6 +62,35 @@ static inline int atomic_sub_return(int i, atomic_t *v) return val; } +static inline int atomic_cmpxchg(atomic_t *v, int old, int new) +{ + int ret; + unsigned long flags; + + local_irq_save(flags); + ret = v->counter; + if (likely(ret == old)) + v->counter = new; + local_irq_restore(flags); + + return ret; +} + +static inline int atomic_add_unless(atomic_t *v, int a, int u) +{ + int ret; + unsigned long flags; + + local_irq_save(flags); + ret = v->counter; + if (ret != u) + v->counter += a; + local_irq_restore(flags); + + return ret != u; +} +#define atomic_inc_not_zero(v) atomic_add_unless((v), 1, 0) + static inline void atomic_clear_mask(unsigned long mask, unsigned long *addr) { unsigned long flags; |