uboot/include/asm-generic/atomic-long.h
<<
>>
Prefs
   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