]> git.proxmox.com Git - mirror_ubuntu-focal-kernel.git/blob - arch/metag/include/asm/bitops.h
Merge tag 'batadv-net-for-davem-20161202' of git://git.open-mesh.org/linux-merge
[mirror_ubuntu-focal-kernel.git] / arch / metag / include / asm / bitops.h
1 #ifndef __ASM_METAG_BITOPS_H
2 #define __ASM_METAG_BITOPS_H
3
4 #include <linux/compiler.h>
5 #include <asm/barrier.h>
6 #include <asm/global_lock.h>
7
8 #ifdef CONFIG_SMP
9 /*
10 * These functions are the basis of our bit ops.
11 */
12 static inline void set_bit(unsigned int bit, volatile unsigned long *p)
13 {
14 unsigned long flags;
15 unsigned long mask = 1UL << (bit & 31);
16
17 p += bit >> 5;
18
19 __global_lock1(flags);
20 fence();
21 *p |= mask;
22 __global_unlock1(flags);
23 }
24
25 static inline void clear_bit(unsigned int bit, volatile unsigned long *p)
26 {
27 unsigned long flags;
28 unsigned long mask = 1UL << (bit & 31);
29
30 p += bit >> 5;
31
32 __global_lock1(flags);
33 fence();
34 *p &= ~mask;
35 __global_unlock1(flags);
36 }
37
38 static inline void change_bit(unsigned int bit, volatile unsigned long *p)
39 {
40 unsigned long flags;
41 unsigned long mask = 1UL << (bit & 31);
42
43 p += bit >> 5;
44
45 __global_lock1(flags);
46 fence();
47 *p ^= mask;
48 __global_unlock1(flags);
49 }
50
51 static inline int test_and_set_bit(unsigned int bit, volatile unsigned long *p)
52 {
53 unsigned long flags;
54 unsigned long old;
55 unsigned long mask = 1UL << (bit & 31);
56
57 p += bit >> 5;
58
59 __global_lock1(flags);
60 old = *p;
61 if (!(old & mask)) {
62 fence();
63 *p = old | mask;
64 }
65 __global_unlock1(flags);
66
67 return (old & mask) != 0;
68 }
69
70 static inline int test_and_clear_bit(unsigned int bit,
71 volatile unsigned long *p)
72 {
73 unsigned long flags;
74 unsigned long old;
75 unsigned long mask = 1UL << (bit & 31);
76
77 p += bit >> 5;
78
79 __global_lock1(flags);
80 old = *p;
81 if (old & mask) {
82 fence();
83 *p = old & ~mask;
84 }
85 __global_unlock1(flags);
86
87 return (old & mask) != 0;
88 }
89
90 static inline int test_and_change_bit(unsigned int bit,
91 volatile unsigned long *p)
92 {
93 unsigned long flags;
94 unsigned long old;
95 unsigned long mask = 1UL << (bit & 31);
96
97 p += bit >> 5;
98
99 __global_lock1(flags);
100 fence();
101 old = *p;
102 *p = old ^ mask;
103 __global_unlock1(flags);
104
105 return (old & mask) != 0;
106 }
107
108 #else
109 #include <asm-generic/bitops/atomic.h>
110 #endif /* CONFIG_SMP */
111
112 #include <asm-generic/bitops/non-atomic.h>
113 #include <asm-generic/bitops/find.h>
114 #include <asm-generic/bitops/ffs.h>
115 #include <asm-generic/bitops/__ffs.h>
116 #include <asm-generic/bitops/ffz.h>
117 #include <asm-generic/bitops/fls.h>
118 #include <asm-generic/bitops/__fls.h>
119 #include <asm-generic/bitops/fls64.h>
120 #include <asm-generic/bitops/hweight.h>
121 #include <asm-generic/bitops/lock.h>
122 #include <asm-generic/bitops/sched.h>
123 #include <asm-generic/bitops/le.h>
124 #include <asm-generic/bitops/ext2-atomic.h>
125
126 #endif /* __ASM_METAG_BITOPS_H */