diff options
Diffstat (limited to 'include/asm-arm/bitops.h')
| -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); |