aboutsummaryrefslogtreecommitdiffstats
path: root/include/asm-generic/atomic-long.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/asm-generic/atomic-long.h')
-rw-r--r--include/asm-generic/atomic-long.h55
1 files changed, 32 insertions, 23 deletions
diff --git a/include/asm-generic/atomic-long.h b/include/asm-generic/atomic-long.h
index a94cbebbc33d..eb1973bad80b 100644
--- a/include/asm-generic/atomic-long.h
+++ b/include/asm-generic/atomic-long.h
@@ -35,7 +35,7 @@ typedef atomic_t atomic_long_t;
35#endif 35#endif
36 36
37#define ATOMIC_LONG_READ_OP(mo) \ 37#define ATOMIC_LONG_READ_OP(mo) \
38static inline long atomic_long_read##mo(atomic_long_t *l) \ 38static inline long atomic_long_read##mo(const atomic_long_t *l) \
39{ \ 39{ \
40 ATOMIC_LONG_PFX(_t) *v = (ATOMIC_LONG_PFX(_t) *)l; \ 40 ATOMIC_LONG_PFX(_t) *v = (ATOMIC_LONG_PFX(_t) *)l; \
41 \ 41 \
@@ -112,19 +112,23 @@ static inline void atomic_long_dec(atomic_long_t *l)
112 ATOMIC_LONG_PFX(_dec)(v); 112 ATOMIC_LONG_PFX(_dec)(v);
113} 113}
114 114
115static inline void atomic_long_add(long i, atomic_long_t *l) 115#define ATOMIC_LONG_OP(op) \
116{ 116static inline void \
117 ATOMIC_LONG_PFX(_t) *v = (ATOMIC_LONG_PFX(_t) *)l; 117atomic_long_##op(long i, atomic_long_t *l) \
118 118{ \
119 ATOMIC_LONG_PFX(_add)(i, v); 119 ATOMIC_LONG_PFX(_t) *v = (ATOMIC_LONG_PFX(_t) *)l; \
120 \
121 ATOMIC_LONG_PFX(_##op)(i, v); \
120} 122}
121 123
122static inline void atomic_long_sub(long i, atomic_long_t *l) 124ATOMIC_LONG_OP(add)
123{ 125ATOMIC_LONG_OP(sub)
124 ATOMIC_LONG_PFX(_t) *v = (ATOMIC_LONG_PFX(_t) *)l; 126ATOMIC_LONG_OP(and)
127ATOMIC_LONG_OP(or)
128ATOMIC_LONG_OP(xor)
129ATOMIC_LONG_OP(andnot)
125 130
126 ATOMIC_LONG_PFX(_sub)(i, v); 131#undef ATOMIC_LONG_OP
127}
128 132
129static inline int atomic_long_sub_and_test(long i, atomic_long_t *l) 133static inline int atomic_long_sub_and_test(long i, atomic_long_t *l)
130{ 134{
@@ -154,19 +158,24 @@ static inline int atomic_long_add_negative(long i, atomic_long_t *l)
154 return ATOMIC_LONG_PFX(_add_negative)(i, v); 158 return ATOMIC_LONG_PFX(_add_negative)(i, v);
155} 159}
156 160
157static inline long atomic_long_inc_return(atomic_long_t *l) 161#define ATOMIC_LONG_INC_DEC_OP(op, mo) \
158{ 162static inline long \
159 ATOMIC_LONG_PFX(_t) *v = (ATOMIC_LONG_PFX(_t) *)l; 163atomic_long_##op##_return##mo(atomic_long_t *l) \
160 164{ \
161 return (long)ATOMIC_LONG_PFX(_inc_return)(v); 165 ATOMIC_LONG_PFX(_t) *v = (ATOMIC_LONG_PFX(_t) *)l; \
162} 166 \
163 167 return (long)ATOMIC_LONG_PFX(_##op##_return##mo)(v); \
164static inline long atomic_long_dec_return(atomic_long_t *l)
165{
166 ATOMIC_LONG_PFX(_t) *v = (ATOMIC_LONG_PFX(_t) *)l;
167
168 return (long)ATOMIC_LONG_PFX(_dec_return)(v);
169} 168}
169ATOMIC_LONG_INC_DEC_OP(inc,)
170ATOMIC_LONG_INC_DEC_OP(inc, _relaxed)
171ATOMIC_LONG_INC_DEC_OP(inc, _acquire)
172ATOMIC_LONG_INC_DEC_OP(inc, _release)
173ATOMIC_LONG_INC_DEC_OP(dec,)
174ATOMIC_LONG_INC_DEC_OP(dec, _relaxed)
175ATOMIC_LONG_INC_DEC_OP(dec, _acquire)
176ATOMIC_LONG_INC_DEC_OP(dec, _release)
177
178#undef ATOMIC_LONG_INC_DEC_OP
170 179
171static inline long atomic_long_add_unless(atomic_long_t *l, long a, long u) 180static inline long atomic_long_add_unless(atomic_long_t *l, long a, long u)
172{ 181{