1
0
Fork 0
forked from len0rd/rockbox

Make atomic bit modification functions return previous value.

Change-Id: I19a94cf946735e1d9e51c3207cd82198fd4dfc1a
This commit is contained in:
Michael Sevakis 2017-01-24 10:15:53 -05:00
parent 65e7617ab6
commit f728559bf9
3 changed files with 68 additions and 55 deletions

View file

@ -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);
/* 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);
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);
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)