0001
0002 #ifndef _ASM_GENERIC_BITOPS_NON_ATOMIC_H_
0003 #define _ASM_GENERIC_BITOPS_NON_ATOMIC_H_
0004
0005 #include <linux/bits.h>
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016 static __always_inline void
0017 ___set_bit(unsigned long nr, volatile unsigned long *addr)
0018 {
0019 unsigned long mask = BIT_MASK(nr);
0020 unsigned long *p = ((unsigned long *)addr) + BIT_WORD(nr);
0021
0022 *p |= mask;
0023 }
0024
0025 static __always_inline void
0026 ___clear_bit(unsigned long nr, volatile unsigned long *addr)
0027 {
0028 unsigned long mask = BIT_MASK(nr);
0029 unsigned long *p = ((unsigned long *)addr) + BIT_WORD(nr);
0030
0031 *p &= ~mask;
0032 }
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043 static __always_inline void
0044 ___change_bit(unsigned long nr, volatile unsigned long *addr)
0045 {
0046 unsigned long mask = BIT_MASK(nr);
0047 unsigned long *p = ((unsigned long *)addr) + BIT_WORD(nr);
0048
0049 *p ^= mask;
0050 }
0051
0052
0053
0054
0055
0056
0057
0058
0059
0060
0061 static __always_inline bool
0062 ___test_and_set_bit(unsigned long nr, volatile unsigned long *addr)
0063 {
0064 unsigned long mask = BIT_MASK(nr);
0065 unsigned long *p = ((unsigned long *)addr) + BIT_WORD(nr);
0066 unsigned long old = *p;
0067
0068 *p = old | mask;
0069 return (old & mask) != 0;
0070 }
0071
0072
0073
0074
0075
0076
0077
0078
0079
0080
0081 static __always_inline bool
0082 ___test_and_clear_bit(unsigned long nr, volatile unsigned long *addr)
0083 {
0084 unsigned long mask = BIT_MASK(nr);
0085 unsigned long *p = ((unsigned long *)addr) + BIT_WORD(nr);
0086 unsigned long old = *p;
0087
0088 *p = old & ~mask;
0089 return (old & mask) != 0;
0090 }
0091
0092
0093 static __always_inline bool
0094 ___test_and_change_bit(unsigned long nr, volatile unsigned long *addr)
0095 {
0096 unsigned long mask = BIT_MASK(nr);
0097 unsigned long *p = ((unsigned long *)addr) + BIT_WORD(nr);
0098 unsigned long old = *p;
0099
0100 *p = old ^ mask;
0101 return (old & mask) != 0;
0102 }
0103
0104
0105
0106
0107
0108
0109 static __always_inline bool
0110 _test_bit(unsigned long nr, const volatile unsigned long *addr)
0111 {
0112 return 1UL & (addr[BIT_WORD(nr)] >> (nr & (BITS_PER_LONG-1)));
0113 }
0114
0115 #endif