diff --git a/src/arch/host/include/arch/atomic.h b/src/arch/host/include/arch/atomic.h index d9e9fad8b401..7534748e1516 100644 --- a/src/arch/host/include/arch/atomic.h +++ b/src/arch/host/include/arch/atomic.h @@ -56,14 +56,14 @@ static inline void arch_atomic_init(atomic_t *a, int32_t value) } /* use gcc atomic built-ins for host library */ -static inline void arch_atomic_add(atomic_t *a, int32_t value) +static inline int32_t arch_atomic_add(atomic_t *a, int32_t value) { - __sync_fetch_and_add(&a->value, value); + return __sync_fetch_and_add(&a->value, value); } -static inline void arch_atomic_sub(atomic_t *a, int32_t value) +static inline int32_t arch_atomic_sub(atomic_t *a, int32_t value) { - __sync_fetch_and_sub(&a->value, value); + return __sync_fetch_and_sub(&a->value, value); } #endif diff --git a/src/arch/xtensa/include/arch/atomic.h b/src/arch/xtensa/include/arch/atomic.h index aadc6dbb8399..1e368df12b36 100644 --- a/src/arch/xtensa/include/arch/atomic.h +++ b/src/arch/xtensa/include/arch/atomic.h @@ -54,7 +54,7 @@ static inline void arch_atomic_init(atomic_t *a, int32_t value) arch_atomic_set(a, value); } -static inline void arch_atomic_add(atomic_t *a, int32_t value) +static inline int32_t arch_atomic_add(atomic_t *a, int32_t value) { int32_t result, current; @@ -67,9 +67,11 @@ static inline void arch_atomic_add(atomic_t *a, int32_t value) : "=&a" (result), "=&a" (current) : "a" (&a->value), "a" (value) : "memory"); + + return (*(volatile int32_t *)&a->value); } -static inline void arch_atomic_sub(atomic_t *a, int32_t value) +static inline int32_t arch_atomic_sub(atomic_t *a, int32_t value) { int32_t result, current; @@ -82,6 +84,8 @@ static inline void arch_atomic_sub(atomic_t *a, int32_t value) : "=&a" (result), "=&a" (current) : "a" (&a->value), "a" (value) : "memory"); + + return (*(volatile int32_t *)&a->value); } #endif diff --git a/src/include/sof/atomic.h b/src/include/sof/atomic.h index 656121545cf3..6dc010985ff0 100644 --- a/src/include/sof/atomic.h +++ b/src/include/sof/atomic.h @@ -50,14 +50,14 @@ static inline void atomic_set(atomic_t *a, int32_t value) arch_atomic_set(a, value); } -static inline void atomic_add(atomic_t *a, int32_t value) +static inline int32_t atomic_add(atomic_t *a, int32_t value) { - arch_atomic_add(a, value); + return arch_atomic_add(a, value); } -static inline void atomic_sub(atomic_t *a, int32_t value) +static inline int32_t atomic_sub(atomic_t *a, int32_t value) { - arch_atomic_sub(a, value); + return arch_atomic_sub(a, value); } #endif