1#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 69#ifndef __UBOOT__ 70static 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))) 139#endif /* __UBOOT__ */ 140 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 */ 263