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