From f728559bf951b515be39d61f3ffd0eaae64b2b0d Mon Sep 17 00:00:00 2001 From: Michael Sevakis Date: Tue, 24 Jan 2017 10:15:53 -0500 Subject: Make atomic bit modification functions return previous value. Change-Id: I19a94cf946735e1d9e51c3207cd82198fd4dfc1a --- firmware/export/system.h | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) (limited to 'firmware/export/system.h') diff --git a/firmware/export/system.h b/firmware/export/system.h index 911c9edf4b..c7f5a8112c 100644 --- a/firmware/export/system.h +++ b/firmware/export/system.h @@ -163,14 +163,15 @@ static inline __attribute__((always_inline)) uint32_t isolate_first_bit(uint32_t val) { return val & -val; } -/* Functions to set and clear register or variable bits atomically */ -void bitmod16(volatile uint16_t *addr, uint16_t bits, uint16_t mask); -void bitset16(volatile uint16_t *addr, uint16_t mask); -void bitclr16(volatile uint16_t *addr, uint16_t mask); - -void bitmod32(volatile uint32_t *addr, uint32_t bits, uint32_t mask); -void bitset32(volatile uint32_t *addr, uint32_t mask); -void bitclr32(volatile uint32_t *addr, uint32_t mask); +/* Functions to set and clear register or variable bits atomically; + * return value is the previous value of *addr */ +uint16_t bitmod16(volatile uint16_t *addr, uint16_t bits, uint16_t mask); +uint16_t bitset16(volatile uint16_t *addr, uint16_t mask); +uint16_t bitclr16(volatile uint16_t *addr, uint16_t mask); + +uint32_t bitmod32(volatile uint32_t *addr, uint32_t bits, uint32_t mask); +uint32_t bitset32(volatile uint32_t *addr, uint32_t mask); +uint32_t bitclr32(volatile uint32_t *addr, uint32_t mask); /* gcc 3.4 changed the format of the constraints */ #if (__GNUC__ >= 3) && (__GNUC_MINOR__ > 3) || (__GNUC__ >= 4) -- cgit v1.2.3