1*4882a593Smuzhiyun #ifndef _ASM_GENERIC_ATOMIC_LONG_H
2*4882a593Smuzhiyun #define _ASM_GENERIC_ATOMIC_LONG_H
3*4882a593Smuzhiyun /*
4*4882a593Smuzhiyun * Copyright (C) 2005 Silicon Graphics, Inc.
5*4882a593Smuzhiyun * Christoph Lameter
6*4882a593Smuzhiyun *
7*4882a593Smuzhiyun * Allows to provide arch independent atomic definitions without the need to
8*4882a593Smuzhiyun * edit all arch specific atomic.h files.
9*4882a593Smuzhiyun */
10*4882a593Smuzhiyun
11*4882a593Smuzhiyun #include <asm/types.h>
12*4882a593Smuzhiyun
13*4882a593Smuzhiyun /*
14*4882a593Smuzhiyun * Suppport for atomic_long_t
15*4882a593Smuzhiyun *
16*4882a593Smuzhiyun * Casts for parameters are avoided for existing atomic functions in order to
17*4882a593Smuzhiyun * avoid issues with cast-as-lval under gcc 4.x and other limitations that the
18*4882a593Smuzhiyun * macros of a platform may have.
19*4882a593Smuzhiyun */
20*4882a593Smuzhiyun
21*4882a593Smuzhiyun #if BITS_PER_LONG == 64
22*4882a593Smuzhiyun
23*4882a593Smuzhiyun typedef atomic64_t atomic_long_t;
24*4882a593Smuzhiyun
25*4882a593Smuzhiyun #define ATOMIC_LONG_INIT(i) ATOMIC64_INIT(i)
26*4882a593Smuzhiyun
atomic_long_read(atomic_long_t * l)27*4882a593Smuzhiyun static inline long atomic_long_read(atomic_long_t *l)
28*4882a593Smuzhiyun {
29*4882a593Smuzhiyun atomic64_t *v = (atomic64_t *)l;
30*4882a593Smuzhiyun
31*4882a593Smuzhiyun return (long)atomic64_read(v);
32*4882a593Smuzhiyun }
33*4882a593Smuzhiyun
atomic_long_set(atomic_long_t * l,long i)34*4882a593Smuzhiyun static inline void atomic_long_set(atomic_long_t *l, long i)
35*4882a593Smuzhiyun {
36*4882a593Smuzhiyun atomic64_t *v = (atomic64_t *)l;
37*4882a593Smuzhiyun
38*4882a593Smuzhiyun atomic64_set(v, i);
39*4882a593Smuzhiyun }
40*4882a593Smuzhiyun
atomic_long_inc(atomic_long_t * l)41*4882a593Smuzhiyun static inline void atomic_long_inc(atomic_long_t *l)
42*4882a593Smuzhiyun {
43*4882a593Smuzhiyun atomic64_t *v = (atomic64_t *)l;
44*4882a593Smuzhiyun
45*4882a593Smuzhiyun atomic64_inc(v);
46*4882a593Smuzhiyun }
47*4882a593Smuzhiyun
atomic_long_dec(atomic_long_t * l)48*4882a593Smuzhiyun static inline void atomic_long_dec(atomic_long_t *l)
49*4882a593Smuzhiyun {
50*4882a593Smuzhiyun atomic64_t *v = (atomic64_t *)l;
51*4882a593Smuzhiyun
52*4882a593Smuzhiyun atomic64_dec(v);
53*4882a593Smuzhiyun }
54*4882a593Smuzhiyun
atomic_long_add(long i,atomic_long_t * l)55*4882a593Smuzhiyun static inline void atomic_long_add(long i, atomic_long_t *l)
56*4882a593Smuzhiyun {
57*4882a593Smuzhiyun atomic64_t *v = (atomic64_t *)l;
58*4882a593Smuzhiyun
59*4882a593Smuzhiyun atomic64_add(i, v);
60*4882a593Smuzhiyun }
61*4882a593Smuzhiyun
atomic_long_sub(long i,atomic_long_t * l)62*4882a593Smuzhiyun static inline void atomic_long_sub(long i, atomic_long_t *l)
63*4882a593Smuzhiyun {
64*4882a593Smuzhiyun atomic64_t *v = (atomic64_t *)l;
65*4882a593Smuzhiyun
66*4882a593Smuzhiyun atomic64_sub(i, v);
67*4882a593Smuzhiyun }
68*4882a593Smuzhiyun
69*4882a593Smuzhiyun #ifndef __UBOOT__
atomic_long_sub_and_test(long i,atomic_long_t * l)70*4882a593Smuzhiyun static inline int atomic_long_sub_and_test(long i, atomic_long_t *l)
71*4882a593Smuzhiyun {
72*4882a593Smuzhiyun atomic64_t *v = (atomic64_t *)l;
73*4882a593Smuzhiyun
74*4882a593Smuzhiyun return atomic64_sub_and_test(i, v);
75*4882a593Smuzhiyun }
76*4882a593Smuzhiyun
atomic_long_dec_and_test(atomic_long_t * l)77*4882a593Smuzhiyun static inline int atomic_long_dec_and_test(atomic_long_t *l)
78*4882a593Smuzhiyun {
79*4882a593Smuzhiyun atomic64_t *v = (atomic64_t *)l;
80*4882a593Smuzhiyun
81*4882a593Smuzhiyun return atomic64_dec_and_test(v);
82*4882a593Smuzhiyun }
83*4882a593Smuzhiyun
atomic_long_inc_and_test(atomic_long_t * l)84*4882a593Smuzhiyun static inline int atomic_long_inc_and_test(atomic_long_t *l)
85*4882a593Smuzhiyun {
86*4882a593Smuzhiyun atomic64_t *v = (atomic64_t *)l;
87*4882a593Smuzhiyun
88*4882a593Smuzhiyun return atomic64_inc_and_test(v);
89*4882a593Smuzhiyun }
90*4882a593Smuzhiyun
atomic_long_add_negative(long i,atomic_long_t * l)91*4882a593Smuzhiyun static inline int atomic_long_add_negative(long i, atomic_long_t *l)
92*4882a593Smuzhiyun {
93*4882a593Smuzhiyun atomic64_t *v = (atomic64_t *)l;
94*4882a593Smuzhiyun
95*4882a593Smuzhiyun return atomic64_add_negative(i, v);
96*4882a593Smuzhiyun }
97*4882a593Smuzhiyun
atomic_long_add_return(long i,atomic_long_t * l)98*4882a593Smuzhiyun static inline long atomic_long_add_return(long i, atomic_long_t *l)
99*4882a593Smuzhiyun {
100*4882a593Smuzhiyun atomic64_t *v = (atomic64_t *)l;
101*4882a593Smuzhiyun
102*4882a593Smuzhiyun return (long)atomic64_add_return(i, v);
103*4882a593Smuzhiyun }
104*4882a593Smuzhiyun
atomic_long_sub_return(long i,atomic_long_t * l)105*4882a593Smuzhiyun static inline long atomic_long_sub_return(long i, atomic_long_t *l)
106*4882a593Smuzhiyun {
107*4882a593Smuzhiyun atomic64_t *v = (atomic64_t *)l;
108*4882a593Smuzhiyun
109*4882a593Smuzhiyun return (long)atomic64_sub_return(i, v);
110*4882a593Smuzhiyun }
111*4882a593Smuzhiyun
atomic_long_inc_return(atomic_long_t * l)112*4882a593Smuzhiyun static inline long atomic_long_inc_return(atomic_long_t *l)
113*4882a593Smuzhiyun {
114*4882a593Smuzhiyun atomic64_t *v = (atomic64_t *)l;
115*4882a593Smuzhiyun
116*4882a593Smuzhiyun return (long)atomic64_inc_return(v);
117*4882a593Smuzhiyun }
118*4882a593Smuzhiyun
atomic_long_dec_return(atomic_long_t * l)119*4882a593Smuzhiyun static inline long atomic_long_dec_return(atomic_long_t *l)
120*4882a593Smuzhiyun {
121*4882a593Smuzhiyun atomic64_t *v = (atomic64_t *)l;
122*4882a593Smuzhiyun
123*4882a593Smuzhiyun return (long)atomic64_dec_return(v);
124*4882a593Smuzhiyun }
125*4882a593Smuzhiyun
atomic_long_add_unless(atomic_long_t * l,long a,long u)126*4882a593Smuzhiyun static inline long atomic_long_add_unless(atomic_long_t *l, long a, long u)
127*4882a593Smuzhiyun {
128*4882a593Smuzhiyun atomic64_t *v = (atomic64_t *)l;
129*4882a593Smuzhiyun
130*4882a593Smuzhiyun return (long)atomic64_add_unless(v, a, u);
131*4882a593Smuzhiyun }
132*4882a593Smuzhiyun
133*4882a593Smuzhiyun #define atomic_long_inc_not_zero(l) atomic64_inc_not_zero((atomic64_t *)(l))
134*4882a593Smuzhiyun
135*4882a593Smuzhiyun #define atomic_long_cmpxchg(l, old, new) \
136*4882a593Smuzhiyun (atomic64_cmpxchg((atomic64_t *)(l), (old), (new)))
137*4882a593Smuzhiyun #define atomic_long_xchg(v, new) \
138*4882a593Smuzhiyun (atomic64_xchg((atomic64_t *)(v), (new)))
139*4882a593Smuzhiyun #endif /* __UBOOT__ */
140*4882a593Smuzhiyun
141*4882a593Smuzhiyun #else /* BITS_PER_LONG == 64 */
142*4882a593Smuzhiyun
143*4882a593Smuzhiyun typedef atomic_t atomic_long_t;
144*4882a593Smuzhiyun
145*4882a593Smuzhiyun #define ATOMIC_LONG_INIT(i) ATOMIC_INIT(i)
atomic_long_read(atomic_long_t * l)146*4882a593Smuzhiyun static inline long atomic_long_read(atomic_long_t *l)
147*4882a593Smuzhiyun {
148*4882a593Smuzhiyun atomic_t *v = (atomic_t *)l;
149*4882a593Smuzhiyun
150*4882a593Smuzhiyun return (long)atomic_read(v);
151*4882a593Smuzhiyun }
152*4882a593Smuzhiyun
atomic_long_set(atomic_long_t * l,long i)153*4882a593Smuzhiyun static inline void atomic_long_set(atomic_long_t *l, long i)
154*4882a593Smuzhiyun {
155*4882a593Smuzhiyun atomic_t *v = (atomic_t *)l;
156*4882a593Smuzhiyun
157*4882a593Smuzhiyun atomic_set(v, i);
158*4882a593Smuzhiyun }
159*4882a593Smuzhiyun
atomic_long_inc(atomic_long_t * l)160*4882a593Smuzhiyun static inline void atomic_long_inc(atomic_long_t *l)
161*4882a593Smuzhiyun {
162*4882a593Smuzhiyun atomic_t *v = (atomic_t *)l;
163*4882a593Smuzhiyun
164*4882a593Smuzhiyun atomic_inc(v);
165*4882a593Smuzhiyun }
166*4882a593Smuzhiyun
atomic_long_dec(atomic_long_t * l)167*4882a593Smuzhiyun static inline void atomic_long_dec(atomic_long_t *l)
168*4882a593Smuzhiyun {
169*4882a593Smuzhiyun atomic_t *v = (atomic_t *)l;
170*4882a593Smuzhiyun
171*4882a593Smuzhiyun atomic_dec(v);
172*4882a593Smuzhiyun }
173*4882a593Smuzhiyun
atomic_long_add(long i,atomic_long_t * l)174*4882a593Smuzhiyun static inline void atomic_long_add(long i, atomic_long_t *l)
175*4882a593Smuzhiyun {
176*4882a593Smuzhiyun atomic_t *v = (atomic_t *)l;
177*4882a593Smuzhiyun
178*4882a593Smuzhiyun atomic_add(i, v);
179*4882a593Smuzhiyun }
180*4882a593Smuzhiyun
atomic_long_sub(long i,atomic_long_t * l)181*4882a593Smuzhiyun static inline void atomic_long_sub(long i, atomic_long_t *l)
182*4882a593Smuzhiyun {
183*4882a593Smuzhiyun atomic_t *v = (atomic_t *)l;
184*4882a593Smuzhiyun
185*4882a593Smuzhiyun atomic_sub(i, v);
186*4882a593Smuzhiyun }
187*4882a593Smuzhiyun
188*4882a593Smuzhiyun #ifndef __UBOOT__
atomic_long_sub_and_test(long i,atomic_long_t * l)189*4882a593Smuzhiyun static inline int atomic_long_sub_and_test(long i, atomic_long_t *l)
190*4882a593Smuzhiyun {
191*4882a593Smuzhiyun atomic_t *v = (atomic_t *)l;
192*4882a593Smuzhiyun
193*4882a593Smuzhiyun return atomic_sub_and_test(i, v);
194*4882a593Smuzhiyun }
195*4882a593Smuzhiyun
atomic_long_dec_and_test(atomic_long_t * l)196*4882a593Smuzhiyun static inline int atomic_long_dec_and_test(atomic_long_t *l)
197*4882a593Smuzhiyun {
198*4882a593Smuzhiyun atomic_t *v = (atomic_t *)l;
199*4882a593Smuzhiyun
200*4882a593Smuzhiyun return atomic_dec_and_test(v);
201*4882a593Smuzhiyun }
202*4882a593Smuzhiyun
atomic_long_inc_and_test(atomic_long_t * l)203*4882a593Smuzhiyun static inline int atomic_long_inc_and_test(atomic_long_t *l)
204*4882a593Smuzhiyun {
205*4882a593Smuzhiyun atomic_t *v = (atomic_t *)l;
206*4882a593Smuzhiyun
207*4882a593Smuzhiyun return atomic_inc_and_test(v);
208*4882a593Smuzhiyun }
209*4882a593Smuzhiyun
atomic_long_add_negative(long i,atomic_long_t * l)210*4882a593Smuzhiyun static inline int atomic_long_add_negative(long i, atomic_long_t *l)
211*4882a593Smuzhiyun {
212*4882a593Smuzhiyun atomic_t *v = (atomic_t *)l;
213*4882a593Smuzhiyun
214*4882a593Smuzhiyun return atomic_add_negative(i, v);
215*4882a593Smuzhiyun }
216*4882a593Smuzhiyun
atomic_long_add_return(long i,atomic_long_t * l)217*4882a593Smuzhiyun static inline long atomic_long_add_return(long i, atomic_long_t *l)
218*4882a593Smuzhiyun {
219*4882a593Smuzhiyun atomic_t *v = (atomic_t *)l;
220*4882a593Smuzhiyun
221*4882a593Smuzhiyun return (long)atomic_add_return(i, v);
222*4882a593Smuzhiyun }
223*4882a593Smuzhiyun
atomic_long_sub_return(long i,atomic_long_t * l)224*4882a593Smuzhiyun static inline long atomic_long_sub_return(long i, atomic_long_t *l)
225*4882a593Smuzhiyun {
226*4882a593Smuzhiyun atomic_t *v = (atomic_t *)l;
227*4882a593Smuzhiyun
228*4882a593Smuzhiyun return (long)atomic_sub_return(i, v);
229*4882a593Smuzhiyun }
230*4882a593Smuzhiyun
atomic_long_inc_return(atomic_long_t * l)231*4882a593Smuzhiyun static inline long atomic_long_inc_return(atomic_long_t *l)
232*4882a593Smuzhiyun {
233*4882a593Smuzhiyun atomic_t *v = (atomic_t *)l;
234*4882a593Smuzhiyun
235*4882a593Smuzhiyun return (long)atomic_inc_return(v);
236*4882a593Smuzhiyun }
237*4882a593Smuzhiyun
atomic_long_dec_return(atomic_long_t * l)238*4882a593Smuzhiyun static inline long atomic_long_dec_return(atomic_long_t *l)
239*4882a593Smuzhiyun {
240*4882a593Smuzhiyun atomic_t *v = (atomic_t *)l;
241*4882a593Smuzhiyun
242*4882a593Smuzhiyun return (long)atomic_dec_return(v);
243*4882a593Smuzhiyun }
244*4882a593Smuzhiyun
atomic_long_add_unless(atomic_long_t * l,long a,long u)245*4882a593Smuzhiyun static inline long atomic_long_add_unless(atomic_long_t *l, long a, long u)
246*4882a593Smuzhiyun {
247*4882a593Smuzhiyun atomic_t *v = (atomic_t *)l;
248*4882a593Smuzhiyun
249*4882a593Smuzhiyun return (long)atomic_add_unless(v, a, u);
250*4882a593Smuzhiyun }
251*4882a593Smuzhiyun
252*4882a593Smuzhiyun #define atomic_long_inc_not_zero(l) atomic_inc_not_zero((atomic_t *)(l))
253*4882a593Smuzhiyun
254*4882a593Smuzhiyun #define atomic_long_cmpxchg(l, old, new) \
255*4882a593Smuzhiyun (atomic_cmpxchg((atomic_t *)(l), (old), (new)))
256*4882a593Smuzhiyun #define atomic_long_xchg(v, new) \
257*4882a593Smuzhiyun (atomic_xchg((atomic_t *)(v), (new)))
258*4882a593Smuzhiyun #endif /* __UBOOT__ */
259*4882a593Smuzhiyun
260*4882a593Smuzhiyun #endif /* BITS_PER_LONG == 64 */
261*4882a593Smuzhiyun
262*4882a593Smuzhiyun #endif /* _ASM_GENERIC_ATOMIC_LONG_H */
263