summaryrefslogtreecommitdiff
path: root/core
diff options
context:
space:
mode:
Diffstat (limited to 'core')
-rw-r--r--core/riscv-rv32i/atomic.h17
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 */