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