--- zzzz-none-000/linux-2.4.17/include/asm-arm/bitops.h 2001-08-12 18:14:00.000000000 +0000 +++ sangam-fb-322/linux-2.4.17/include/asm-arm/bitops.h 2004-11-24 13:21:35.000000000 +0000 @@ -23,30 +23,50 @@ /* * Function prototypes to keep gcc -Wall happy. */ -extern void set_bit(int nr, volatile void * addr); +extern void _set_bit_le(int nr, volatile void * addr); +extern void _set_bit_be(int nr, volatile void * addr); -static inline void __set_bit(int nr, volatile void *addr) +static inline void ___set_bit_le(int nr, volatile void *addr) { ((unsigned char *) addr)[nr >> 3] |= (1U << (nr & 7)); } -extern void clear_bit(int nr, volatile void * addr); +static inline void ___set_bit_be(int nr, volatile void *addr) +{ + ((unsigned char *) addr)[(nr ^ 0x18) >> 3] |= (1U << (nr & 7)); +} -static inline void __clear_bit(int nr, volatile void *addr) +extern void _clear_bit_le(int nr, volatile void * addr); +extern void _clear_bit_be(int nr, volatile void * addr); + +static inline void ___clear_bit_le(int nr, volatile void *addr) { ((unsigned char *) addr)[nr >> 3] &= ~(1U << (nr & 7)); } -extern void change_bit(int nr, volatile void * addr); +static inline void ___clear_bit_be(int nr, volatile void *addr) +{ + ((unsigned char *) addr)[(nr ^ 0x18) >> 3] &= ~(1U << (nr & 7)); +} + + +extern void _change_bit_le(int nr, volatile void * addr); +extern void _change_bit_be(int nr, volatile void * addr); -static inline void __change_bit(int nr, volatile void *addr) +static inline void ___change_bit_le(int nr, volatile void *addr) { ((unsigned char *) addr)[nr >> 3] ^= (1U << (nr & 7)); } -extern int test_and_set_bit(int nr, volatile void * addr); +static inline void ___change_bit_be(int nr, volatile void *addr) +{ + ((unsigned char *) addr)[(nr ^ 0x18) >> 3] ^= (1U << (nr & 7)); +} + +extern int _test_and_set_bit_le(int nr, volatile void * addr); +extern int _test_and_set_bit_be(int nr, volatile void * addr); -static inline int __test_and_set_bit(int nr, volatile void *addr) +static inline int ___test_and_set_bit_le(int nr, volatile void *addr) { unsigned int mask = 1 << (nr & 7); unsigned int oldval; @@ -56,9 +76,20 @@ return oldval & mask; } -extern int test_and_clear_bit(int nr, volatile void * addr); +static inline int ___test_and_set_bit_be(int nr, volatile void *addr) +{ + unsigned int mask = 1 << (nr & 7); + unsigned int oldval; -static inline int __test_and_clear_bit(int nr, volatile void *addr) + oldval = ((unsigned char *) addr)[(nr ^ 0x18) >> 3]; + ((unsigned char *) addr)[(nr ^ 0x18) >> 3] = oldval | mask; + return oldval & mask; +} + +extern int _test_and_clear_bit_le(int nr, volatile void * addr); +extern int _test_and_clear_bit_be(int nr, volatile void * addr); + +static inline int ___test_and_clear_bit_le(int nr, volatile void *addr) { unsigned int mask = 1 << (nr & 7); unsigned int oldval; @@ -68,9 +99,20 @@ return oldval & mask; } -extern int test_and_change_bit(int nr, volatile void * addr); +static inline int ___test_and_clear_bit_be(int nr, volatile void *addr) +{ + unsigned int mask = 1 << (nr & 7); + unsigned int oldval; + + oldval = ((unsigned char *) addr)[(nr ^ 0x18) >> 3]; + ((unsigned char *) addr)[(nr ^ 0x18) >> 3] = oldval & ~mask; + return oldval & mask; +} + +extern int _test_and_change_bit_le(int nr, volatile void * addr); +extern int _test_and_change_bit_be(int nr, volatile void * addr); -static inline int __test_and_change_bit(int nr, volatile void *addr) +static inline int ___test_and_change_bit_le(int nr, volatile void *addr) { unsigned int mask = 1 << (nr & 7); unsigned int oldval; @@ -80,18 +122,86 @@ return oldval & mask; } -extern int find_first_zero_bit(void * addr, unsigned size); -extern int find_next_zero_bit(void * addr, int size, int offset); +static inline int ___test_and_change_bit_be(int nr, volatile void *addr) +{ + unsigned int mask = 1 << (nr & 7); + unsigned int oldval; -/* - * This routine doesn't need to be atomic. - */ -static inline int test_bit(int nr, const void * addr) + oldval = ((unsigned char *) addr)[(nr ^ 0x18) >> 3]; + ((unsigned char *) addr)[(nr ^ 0x18) >> 3] = oldval ^ mask; + return oldval & mask; +} + +extern int _find_first_zero_bit_le(void * addr, unsigned size); +extern int _find_next_zero_bit_le(void * addr, int size, int offset); +extern int _find_first_zero_bit_be(void * addr, unsigned size); +extern int _find_next_zero_bit_be(void * addr, int size, int offset); + + /* + * This routine doesn't need to be atomic. + */ +extern __inline__ int _test_bit_le(int nr, const void * addr) + { + return ((unsigned char *) addr)[nr >> 3] & (1U << (nr & 7)); + } + +static __inline__ int _test_bit_be(int nr, const void * addr) { - return ((unsigned char *) addr)[nr >> 3] & (1U << (nr & 7)); + return ((unsigned char *) addr)[(nr ^ 0x18) >> 3] & (1U << (nr & 7)); } /* + * Definitions according to our current endianness. + */ + +#ifndef __ARMEB__ + +#define set_bit _set_bit_le +#define clear_bit _clear_bit_le +#define change_bit _change_bit_le +#define test_bit _test_bit_le + +#define test_and_set_bit _test_and_set_bit_le +#define test_and_clear_bit _test_and_clear_bit_le +#define test_and_change_bit _test_and_change_bit_le + +#define find_first_zero_bit _find_first_zero_bit_le +#define find_next_zero_bit _find_next_zero_bit_le + +#define __set_bit ___set_bit_le +#define __clear_bit ___clear_bit_le +#define __change_bit ___change_bit_le + +#define __test_and_set_bit ___test_and_set_bit_le +#define __test_and_clear_bit ___test_and_clear_bit_le +#define __test_and_change_bit ___test_and_change_bit_le + +#else + +#define set_bit _set_bit_be +#define clear_bit _clear_bit_be +#define change_bit _change_bit_be +#define test_bit _test_bit_be + +#define test_and_set_bit _test_and_set_bit_be +#define test_and_clear_bit _test_and_clear_bit_be +#define test_and_change_bit _test_and_change_bit_be + +#define find_first_zero_bit _find_first_zero_bit_be +#define find_next_zero_bit _find_next_zero_bit_be + +#define __set_bit ___set_bit_be +#define __clear_bit ___clear_bit_be +#define __change_bit ___change_bit_be + +#define __test_and_set_bit ___test_and_set_bit_be +#define __test_and_clear_bit ___test_and_clear_bit_be +#define __test_and_change_bit ___test_and_change_bit_be + +#endif + + +/* * ffz = Find First Zero in word. Undefined if no zero exists, * so code should check against ~0UL first.. */ @@ -126,18 +236,18 @@ #define hweight16(x) generic_hweight16(x) #define hweight8(x) generic_hweight8(x) -#define ext2_set_bit test_and_set_bit -#define ext2_clear_bit test_and_clear_bit -#define ext2_test_bit test_bit -#define ext2_find_first_zero_bit find_first_zero_bit -#define ext2_find_next_zero_bit find_next_zero_bit +#define ext2_set_bit _test_and_set_bit_le +#define ext2_clear_bit _test_and_clear_bit_le +#define ext2_test_bit _test_bit_le +#define ext2_find_first_zero_bit _find_first_zero_bit_le +#define ext2_find_next_zero_bit _find_next_zero_bit_le /* Bitmap functions for the minix filesystem. */ -#define minix_test_and_set_bit(nr,addr) test_and_set_bit(nr,addr) -#define minix_set_bit(nr,addr) set_bit(nr,addr) -#define minix_test_and_clear_bit(nr,addr) test_and_clear_bit(nr,addr) -#define minix_test_bit(nr,addr) test_bit(nr,addr) -#define minix_find_first_zero_bit(addr,size) find_first_zero_bit(addr,size) +#define minix_test_and_set_bit(nr,addr) _test_and_set_bit_le(nr,addr) +#define minix_set_bit(nr,addr) _set_bit_le(nr,addr) +#define minix_test_and_clear_bit(nr,addr) _test_and_clear_bit_le(nr,addr) +#define minix_test_bit(nr,addr) _test_bit_le(nr,addr) +#define minix_find_first_zero_bit(addr,size) _find_first_zero_bit_le(addr,size) #endif /* __KERNEL__ */