|
@@ -148,15 +148,19 @@ ____atomic_test_and_change_bit(unsigned int bit, volatile unsigned long *p)
|
|
|
* Note that bit 0 is defined to be 32-bit word bit 0, not byte 0 bit 0.
|
|
|
*/
|
|
|
|
|
|
+/*
|
|
|
+ * Native endian assembly bitops. nr = 0 -> word 0 bit 0.
|
|
|
+ */
|
|
|
+extern void _set_bit(int nr, volatile unsigned long * p);
|
|
|
+extern void _clear_bit(int nr, volatile unsigned long * p);
|
|
|
+extern void _change_bit(int nr, volatile unsigned long * p);
|
|
|
+extern int _test_and_set_bit(int nr, volatile unsigned long * p);
|
|
|
+extern int _test_and_clear_bit(int nr, volatile unsigned long * p);
|
|
|
+extern int _test_and_change_bit(int nr, volatile unsigned long * p);
|
|
|
+
|
|
|
/*
|
|
|
* Little endian assembly bitops. nr = 0 -> byte 0 bit 0.
|
|
|
*/
|
|
|
-extern void _set_bit_le(int nr, volatile unsigned long * p);
|
|
|
-extern void _clear_bit_le(int nr, volatile unsigned long * p);
|
|
|
-extern void _change_bit_le(int nr, volatile unsigned long * p);
|
|
|
-extern int _test_and_set_bit_le(int nr, volatile unsigned long * p);
|
|
|
-extern int _test_and_clear_bit_le(int nr, volatile unsigned long * p);
|
|
|
-extern int _test_and_change_bit_le(int nr, volatile unsigned long * p);
|
|
|
extern int _find_first_zero_bit_le(const void * p, unsigned size);
|
|
|
extern int _find_next_zero_bit_le(const void * p, int size, int offset);
|
|
|
extern int _find_first_bit_le(const unsigned long *p, unsigned size);
|
|
@@ -165,12 +169,6 @@ extern int _find_next_bit_le(const unsigned long *p, int size, int offset);
|
|
|
/*
|
|
|
* Big endian assembly bitops. nr = 0 -> byte 3 bit 0.
|
|
|
*/
|
|
|
-extern void _set_bit_be(int nr, volatile unsigned long * p);
|
|
|
-extern void _clear_bit_be(int nr, volatile unsigned long * p);
|
|
|
-extern void _change_bit_be(int nr, volatile unsigned long * p);
|
|
|
-extern int _test_and_set_bit_be(int nr, volatile unsigned long * p);
|
|
|
-extern int _test_and_clear_bit_be(int nr, volatile unsigned long * p);
|
|
|
-extern int _test_and_change_bit_be(int nr, volatile unsigned long * p);
|
|
|
extern int _find_first_zero_bit_be(const void * p, unsigned size);
|
|
|
extern int _find_next_zero_bit_be(const void * p, int size, int offset);
|
|
|
extern int _find_first_bit_be(const unsigned long *p, unsigned size);
|
|
@@ -180,33 +178,26 @@ extern int _find_next_bit_be(const unsigned long *p, int size, int offset);
|
|
|
/*
|
|
|
* The __* form of bitops are non-atomic and may be reordered.
|
|
|
*/
|
|
|
-#define ATOMIC_BITOP_LE(name,nr,p) \
|
|
|
- (__builtin_constant_p(nr) ? \
|
|
|
- ____atomic_##name(nr, p) : \
|
|
|
- _##name##_le(nr,p))
|
|
|
-
|
|
|
-#define ATOMIC_BITOP_BE(name,nr,p) \
|
|
|
- (__builtin_constant_p(nr) ? \
|
|
|
- ____atomic_##name(nr, p) : \
|
|
|
- _##name##_be(nr,p))
|
|
|
+#define ATOMIC_BITOP(name,nr,p) \
|
|
|
+ (__builtin_constant_p(nr) ? ____atomic_##name(nr, p) : _##name(nr,p))
|
|
|
#else
|
|
|
-#define ATOMIC_BITOP_LE(name,nr,p) _##name##_le(nr,p)
|
|
|
-#define ATOMIC_BITOP_BE(name,nr,p) _##name##_be(nr,p)
|
|
|
+#define ATOMIC_BITOP(name,nr,p) _##name(nr,p)
|
|
|
#endif
|
|
|
|
|
|
-#define NONATOMIC_BITOP(name,nr,p) \
|
|
|
- (____nonatomic_##name(nr, p))
|
|
|
+/*
|
|
|
+ * Native endian atomic definitions.
|
|
|
+ */
|
|
|
+#define set_bit(nr,p) ATOMIC_BITOP(set_bit,nr,p)
|
|
|
+#define clear_bit(nr,p) ATOMIC_BITOP(clear_bit,nr,p)
|
|
|
+#define change_bit(nr,p) ATOMIC_BITOP(change_bit,nr,p)
|
|
|
+#define test_and_set_bit(nr,p) ATOMIC_BITOP(test_and_set_bit,nr,p)
|
|
|
+#define test_and_clear_bit(nr,p) ATOMIC_BITOP(test_and_clear_bit,nr,p)
|
|
|
+#define test_and_change_bit(nr,p) ATOMIC_BITOP(test_and_change_bit,nr,p)
|
|
|
|
|
|
#ifndef __ARMEB__
|
|
|
/*
|
|
|
* These are the little endian, atomic definitions.
|
|
|
*/
|
|
|
-#define set_bit(nr,p) ATOMIC_BITOP_LE(set_bit,nr,p)
|
|
|
-#define clear_bit(nr,p) ATOMIC_BITOP_LE(clear_bit,nr,p)
|
|
|
-#define change_bit(nr,p) ATOMIC_BITOP_LE(change_bit,nr,p)
|
|
|
-#define test_and_set_bit(nr,p) ATOMIC_BITOP_LE(test_and_set_bit,nr,p)
|
|
|
-#define test_and_clear_bit(nr,p) ATOMIC_BITOP_LE(test_and_clear_bit,nr,p)
|
|
|
-#define test_and_change_bit(nr,p) ATOMIC_BITOP_LE(test_and_change_bit,nr,p)
|
|
|
#define find_first_zero_bit(p,sz) _find_first_zero_bit_le(p,sz)
|
|
|
#define find_next_zero_bit(p,sz,off) _find_next_zero_bit_le(p,sz,off)
|
|
|
#define find_first_bit(p,sz) _find_first_bit_le(p,sz)
|
|
@@ -215,16 +206,9 @@ extern int _find_next_bit_be(const unsigned long *p, int size, int offset);
|
|
|
#define WORD_BITOFF_TO_LE(x) ((x))
|
|
|
|
|
|
#else
|
|
|
-
|
|
|
/*
|
|
|
* These are the big endian, atomic definitions.
|
|
|
*/
|
|
|
-#define set_bit(nr,p) ATOMIC_BITOP_BE(set_bit,nr,p)
|
|
|
-#define clear_bit(nr,p) ATOMIC_BITOP_BE(clear_bit,nr,p)
|
|
|
-#define change_bit(nr,p) ATOMIC_BITOP_BE(change_bit,nr,p)
|
|
|
-#define test_and_set_bit(nr,p) ATOMIC_BITOP_BE(test_and_set_bit,nr,p)
|
|
|
-#define test_and_clear_bit(nr,p) ATOMIC_BITOP_BE(test_and_clear_bit,nr,p)
|
|
|
-#define test_and_change_bit(nr,p) ATOMIC_BITOP_BE(test_and_change_bit,nr,p)
|
|
|
#define find_first_zero_bit(p,sz) _find_first_zero_bit_be(p,sz)
|
|
|
#define find_next_zero_bit(p,sz,off) _find_next_zero_bit_be(p,sz,off)
|
|
|
#define find_first_bit(p,sz) _find_first_bit_be(p,sz)
|