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