diff options
| author | Simon Kagstrom <simon.kagstrom@netinsight.net> | 2009-08-24 09:10:03 +0200 | 
|---|---|---|
| committer | Wolfgang Denk <wd@denx.de> | 2009-09-15 22:34:04 +0200 | 
| commit | 4b15de08fe4d2c9d12a3764394731018a763216b (patch) | |
| tree | 78c36ef7b48f231f79bf0705ca986d2e203f2d64 | |
| parent | 02f99901ed1c9d828e3ea117f94ce2264bf8389e (diff) | |
| download | olio-uboot-2014.01-4b15de08fe4d2c9d12a3764394731018a763216b.tar.xz olio-uboot-2014.01-4b15de08fe4d2c9d12a3764394731018a763216b.zip | |
arm: Make arm bitops endianness-independent
Bring over the bitop implementations from the Linux
include/asm-generic/bitops/non-atomic.h to provide
endianness-independence.
Signed-off-by: Simon Kagstrom <simon.kagstrom@netinsight.net>
| -rw-r--r-- | include/asm-arm/bitops.h | 47 | 
1 files changed, 19 insertions, 28 deletions
| diff --git a/include/asm-arm/bitops.h b/include/asm-arm/bitops.h index 1549da169..854e225c2 100644 --- a/include/asm-arm/bitops.h +++ b/include/asm-arm/bitops.h @@ -25,61 +25,52 @@   */  extern void set_bit(int nr, volatile void * addr); -static inline void __set_bit(int nr, volatile void *addr) -{ -	((unsigned char *) addr)[nr >> 3] |= (1U << (nr & 7)); -} -#define __set_bit -  extern void clear_bit(int nr, volatile void * addr); -static inline void __clear_bit(int nr, volatile void *addr) -{ -	((unsigned char *) addr)[nr >> 3] &= ~(1U << (nr & 7)); -} -#define __clear_bit -  extern void change_bit(int nr, volatile void * addr);  static inline void __change_bit(int nr, volatile void *addr)  { -	((unsigned char *) addr)[nr >> 3] ^= (1U << (nr & 7)); +	unsigned long mask = BIT_MASK(nr); +	unsigned long *p = ((unsigned long *)addr) + BIT_WORD(nr); + +	*p ^= mask;  }  extern int test_and_set_bit(int nr, volatile void * addr);  static inline int __test_and_set_bit(int nr, volatile void *addr)  { -	unsigned int mask = 1 << (nr & 7); -	unsigned int oldval; +	unsigned long mask = BIT_MASK(nr); +	unsigned long *p = ((unsigned long *)addr) + BIT_WORD(nr); +	unsigned long old = *p; -	oldval = ((unsigned char *) addr)[nr >> 3]; -	((unsigned char *) addr)[nr >> 3] = oldval | mask; -	return oldval & mask; +	*p = old | mask; +	return (old & mask) != 0;  }  extern int test_and_clear_bit(int nr, volatile void * addr);  static inline int __test_and_clear_bit(int nr, volatile void *addr)  { -	unsigned int mask = 1 << (nr & 7); -	unsigned int oldval; +	unsigned long mask = BIT_MASK(nr); +	unsigned long *p = ((unsigned long *)addr) + BIT_WORD(nr); +	unsigned long old = *p; -	oldval = ((unsigned char *) addr)[nr >> 3]; -	((unsigned char *) addr)[nr >> 3] = oldval & ~mask; -	return oldval & mask; +	*p = old & ~mask; +	return (old & mask) != 0;  }  extern int test_and_change_bit(int nr, volatile void * addr);  static inline int __test_and_change_bit(int nr, volatile void *addr)  { -	unsigned int mask = 1 << (nr & 7); -	unsigned int oldval; +	unsigned long mask = BIT_MASK(nr); +	unsigned long *p = ((unsigned long *)addr) + BIT_WORD(nr); +	unsigned long old = *p; -	oldval = ((unsigned char *) addr)[nr >> 3]; -	((unsigned char *) addr)[nr >> 3] = oldval ^ mask; -	return oldval & mask; +	*p = old ^ mask; +	return (old & mask) != 0;  }  extern int find_first_zero_bit(void * addr, unsigned size); |