diff options
Diffstat (limited to 'core')
-rw-r--r-- | core/riscv-rv32i/atomic.h | 17 |
1 files changed, 11 insertions, 6 deletions
diff --git a/core/riscv-rv32i/atomic.h b/core/riscv-rv32i/atomic.h index 11765a2615..d9f25cd38d 100644 --- a/core/riscv-rv32i/atomic.h +++ b/core/riscv-rv32i/atomic.h @@ -19,6 +19,7 @@ "amo" #op ".w.aqrl %0, %2, %1" \ : "=r" (tmp), "+A" (*addr) \ : "r" (value)); \ + tmp; \ }) static inline void atomic_clear(volatile uint32_t *addr, uint32_t bits) @@ -43,13 +44,17 @@ static inline void atomic_sub(volatile uint32_t *addr, uint32_t value) static inline uint32_t atomic_read_clear(volatile uint32_t *addr) { - uint32_t ret; + return ATOMIC_OP(and, 0, addr); +} - asm volatile ( - "amoand.w.aqrl %0, %2, %1" - : "=r" (ret), "+A" (*addr) - : "r" (0)); +static inline uint32_t atomic_inc(volatile uint32_t *addr, uint32_t value) +{ + return ATOMIC_OP(add, value, addr); +} - return ret; +static inline uint32_t atomic_dec(volatile uint32_t *addr, uint32_t value) +{ + return ATOMIC_OP(add, -value, addr); } + #endif /* __CROS_EC_ATOMIC_H */ |