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