diff options
Diffstat (limited to 'core')
-rw-r--r-- | core/nds32/atomic.h | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/core/nds32/atomic.h b/core/nds32/atomic.h index d93d1e7b06..ae33b39986 100644 --- a/core/nds32/atomic.h +++ b/core/nds32/atomic.h @@ -12,6 +12,9 @@ #include "cpu.h" #include "task.h" +typedef int atomic_t; +typedef atomic_t atomic_val_t; + /* * The atomic_* functions are marked as deprecated as a part of the process of * transaction to Zephyr compatible atomic functions. These prefixes will be @@ -27,6 +30,15 @@ static inline void deprecated_atomic_clear_bits(uint32_t volatile *addr, set_int_mask(int_mask); } +static inline void atomic_clear_bits(atomic_t *addr, atomic_val_t bits) +{ + atomic_t volatile *ptr = addr; + uint32_t int_mask = read_clear_int_mask(); + + *ptr &= ~bits; + set_int_mask(int_mask); +} + static inline void deprecated_atomic_or(uint32_t volatile *addr, uint32_t bits) { uint32_t int_mask = read_clear_int_mask(); @@ -35,6 +47,18 @@ static inline void deprecated_atomic_or(uint32_t volatile *addr, uint32_t bits) set_int_mask(int_mask); } +static inline atomic_val_t atomic_or(atomic_t *addr, atomic_val_t bits) +{ + atomic_val_t ret; + atomic_t volatile *ptr = addr; + uint32_t int_mask = read_clear_int_mask(); + + ret = *ptr; + *ptr |= bits; + set_int_mask(int_mask); + return ret; +} + static inline void deprecated_atomic_add(uint32_t volatile *addr, uint32_t value) { @@ -44,6 +68,18 @@ static inline void deprecated_atomic_add(uint32_t volatile *addr, set_int_mask(int_mask); } +static inline atomic_val_t atomic_add(atomic_t *addr, atomic_val_t value) +{ + atomic_val_t ret; + atomic_t volatile *ptr = addr; + uint32_t int_mask = read_clear_int_mask(); + + ret = *ptr; + *ptr += value; + set_int_mask(int_mask); + return ret; +} + static inline void deprecated_atomic_sub(uint32_t volatile *addr, uint32_t value) { @@ -53,6 +89,18 @@ static inline void deprecated_atomic_sub(uint32_t volatile *addr, set_int_mask(int_mask); } +static inline atomic_val_t atomic_sub(atomic_t *addr, atomic_val_t value) +{ + atomic_val_t ret; + atomic_t volatile *ptr = addr; + uint32_t int_mask = read_clear_int_mask(); + + ret = *ptr; + *ptr -= value; + set_int_mask(int_mask); + return ret; +} + static inline uint32_t deprecated_atomic_read_clear(uint32_t volatile *addr) { uint32_t val; @@ -63,4 +111,17 @@ static inline uint32_t deprecated_atomic_read_clear(uint32_t volatile *addr) set_int_mask(int_mask); return val; } + +static inline atomic_val_t atomic_read_clear(atomic_t *addr) +{ + atomic_val_t ret; + atomic_t volatile *ptr = addr; + uint32_t int_mask = read_clear_int_mask(); + + ret = *ptr; + *ptr = 0; + set_int_mask(int_mask); + return ret; +} + #endif /* __CROS_EC_ATOMIC_H */ |