
Implement three atomic functions to allow making an atomic operation that returns the value. Adds: atomic_add_return(), atomic_sub_return(), atomic_inc_return() and atomic_dec_return().
Signed-off-by: Antoine Tenart antoine.tenart@free-electrons.com --- arch/arm/include/asm/atomic.h | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+)
diff --git a/arch/arm/include/asm/atomic.h b/arch/arm/include/asm/atomic.h index 171f4d979281..0d9a6e3901e2 100644 --- a/arch/arm/include/asm/atomic.h +++ b/arch/arm/include/asm/atomic.h @@ -46,6 +46,18 @@ static inline void atomic_add(int i, volatile atomic_t *v) local_irq_restore(flags); }
+static inline int atomic_add_return(int i, volatile atomic_t *v) +{ + unsigned long flags = 0; + int ret; + + local_irq_save(flags); + ret = (v->counter += i); + local_irq_restore(flags); + + return ret; +} + static inline void atomic_sub(int i, volatile atomic_t *v) { unsigned long flags = 0; @@ -55,6 +67,18 @@ static inline void atomic_sub(int i, volatile atomic_t *v) local_irq_restore(flags); }
+static inline int atomic_sub_return(int i, volatile atomic_t *v) +{ + unsigned long flags = 0; + int ret; + + local_irq_save(flags); + ret = (v->counter -= i); + local_irq_restore(flags); + + return ret; +} + static inline void atomic_inc(volatile atomic_t *v) { unsigned long flags = 0; @@ -64,6 +88,11 @@ static inline void atomic_inc(volatile atomic_t *v) local_irq_restore(flags); }
+static inline int atomic_inc_return(volatile atomic_t *v) +{ + return atomic_add_return(1, v); +} + static inline void atomic_dec(volatile atomic_t *v) { unsigned long flags = 0; @@ -73,6 +102,11 @@ static inline void atomic_dec(volatile atomic_t *v) local_irq_restore(flags); }
+static inline int atomic_dec_return(volatile atomic_t *v) +{ + return atomic_sub_return(1, v); +} + static inline int atomic_dec_and_test(volatile atomic_t *v) { unsigned long flags = 0;