Blame view

arch/cris/include/asm/atomic.h 3.39 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
3
4
  /* $Id: atomic.h,v 1.3 2001/07/25 16:15:19 bjornw Exp $ */
  
  #ifndef __ASM_CRIS_ATOMIC__
  #define __ASM_CRIS_ATOMIC__
9587997a4   Andrew Morton   cris-build-fixes-...
5
  #include <linux/compiler.h>
ea4354675   Matthew Wilcox   atomic_t: unify a...
6
  #include <linux/types.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7
  #include <asm/system.h>
556dcee7b   Jesper Nilsson   [CRIS] Move heade...
8
  #include <arch/atomic.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
9
10
11
12
13
  
  /*
   * Atomic operations that C can't guarantee us.  Useful for
   * resource counting etc..
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
14
  #define ATOMIC_INIT(i)  { (i) }
f3d46f9d3   Anton Blanchard   atomic_t: Cast to...
15
  #define atomic_read(v) (*(volatile int *)&(v)->counter)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
16
17
18
  #define atomic_set(v,i) (((v)->counter) = (i))
  
  /* These should be written in asm but we do it in C for now. */
d9b5444ee   Adrian Bunk   [PATCH] cris: "ex...
19
  static inline void atomic_add(int i, volatile atomic_t *v)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
20
21
  {
  	unsigned long flags;
8d20a541b   Mikael Starvik   [PATCH] CRIS upda...
22
  	cris_atomic_save(v, flags);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
23
  	v->counter += i;
8d20a541b   Mikael Starvik   [PATCH] CRIS upda...
24
  	cris_atomic_restore(v, flags);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
25
  }
d9b5444ee   Adrian Bunk   [PATCH] cris: "ex...
26
  static inline void atomic_sub(int i, volatile atomic_t *v)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
27
28
  {
  	unsigned long flags;
8d20a541b   Mikael Starvik   [PATCH] CRIS upda...
29
  	cris_atomic_save(v, flags);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
30
  	v->counter -= i;
8d20a541b   Mikael Starvik   [PATCH] CRIS upda...
31
  	cris_atomic_restore(v, flags);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
32
  }
d9b5444ee   Adrian Bunk   [PATCH] cris: "ex...
33
  static inline int atomic_add_return(int i, volatile atomic_t *v)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
34
35
36
  {
  	unsigned long flags;
  	int retval;
8d20a541b   Mikael Starvik   [PATCH] CRIS upda...
37
  	cris_atomic_save(v, flags);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
38
  	retval = (v->counter += i);
8d20a541b   Mikael Starvik   [PATCH] CRIS upda...
39
  	cris_atomic_restore(v, flags);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
40
41
42
43
  	return retval;
  }
  
  #define atomic_add_negative(a, v)	(atomic_add_return((a), (v)) < 0)
d9b5444ee   Adrian Bunk   [PATCH] cris: "ex...
44
  static inline int atomic_sub_return(int i, volatile atomic_t *v)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
45
46
47
  {
  	unsigned long flags;
  	int retval;
8d20a541b   Mikael Starvik   [PATCH] CRIS upda...
48
  	cris_atomic_save(v, flags);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
49
  	retval = (v->counter -= i);
8d20a541b   Mikael Starvik   [PATCH] CRIS upda...
50
  	cris_atomic_restore(v, flags);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
51
52
  	return retval;
  }
d9b5444ee   Adrian Bunk   [PATCH] cris: "ex...
53
  static inline int atomic_sub_and_test(int i, volatile atomic_t *v)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
54
55
56
  {
  	int retval;
  	unsigned long flags;
8d20a541b   Mikael Starvik   [PATCH] CRIS upda...
57
  	cris_atomic_save(v, flags);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
58
  	retval = (v->counter -= i) == 0;
8d20a541b   Mikael Starvik   [PATCH] CRIS upda...
59
  	cris_atomic_restore(v, flags);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
60
61
  	return retval;
  }
d9b5444ee   Adrian Bunk   [PATCH] cris: "ex...
62
  static inline void atomic_inc(volatile atomic_t *v)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
63
64
  {
  	unsigned long flags;
8d20a541b   Mikael Starvik   [PATCH] CRIS upda...
65
  	cris_atomic_save(v, flags);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
66
  	(v->counter)++;
8d20a541b   Mikael Starvik   [PATCH] CRIS upda...
67
  	cris_atomic_restore(v, flags);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
68
  }
d9b5444ee   Adrian Bunk   [PATCH] cris: "ex...
69
  static inline void atomic_dec(volatile atomic_t *v)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
70
71
  {
  	unsigned long flags;
8d20a541b   Mikael Starvik   [PATCH] CRIS upda...
72
  	cris_atomic_save(v, flags);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
73
  	(v->counter)--;
8d20a541b   Mikael Starvik   [PATCH] CRIS upda...
74
  	cris_atomic_restore(v, flags);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
75
  }
d9b5444ee   Adrian Bunk   [PATCH] cris: "ex...
76
  static inline int atomic_inc_return(volatile atomic_t *v)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
77
78
79
  {
  	unsigned long flags;
  	int retval;
8d20a541b   Mikael Starvik   [PATCH] CRIS upda...
80
  	cris_atomic_save(v, flags);
3c1d9303a   Jesper Nilsson   CRIS: Fix bugs in...
81
  	retval = ++(v->counter);
8d20a541b   Mikael Starvik   [PATCH] CRIS upda...
82
  	cris_atomic_restore(v, flags);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
83
84
  	return retval;
  }
d9b5444ee   Adrian Bunk   [PATCH] cris: "ex...
85
  static inline int atomic_dec_return(volatile atomic_t *v)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
86
87
88
  {
  	unsigned long flags;
  	int retval;
8d20a541b   Mikael Starvik   [PATCH] CRIS upda...
89
  	cris_atomic_save(v, flags);
3c1d9303a   Jesper Nilsson   CRIS: Fix bugs in...
90
  	retval = --(v->counter);
8d20a541b   Mikael Starvik   [PATCH] CRIS upda...
91
  	cris_atomic_restore(v, flags);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
92
93
  	return retval;
  }
d9b5444ee   Adrian Bunk   [PATCH] cris: "ex...
94
  static inline int atomic_dec_and_test(volatile atomic_t *v)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
95
96
97
  {
  	int retval;
  	unsigned long flags;
8d20a541b   Mikael Starvik   [PATCH] CRIS upda...
98
  	cris_atomic_save(v, flags);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
99
  	retval = --(v->counter) == 0;
8d20a541b   Mikael Starvik   [PATCH] CRIS upda...
100
  	cris_atomic_restore(v, flags);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
101
102
  	return retval;
  }
d9b5444ee   Adrian Bunk   [PATCH] cris: "ex...
103
  static inline int atomic_inc_and_test(volatile atomic_t *v)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
104
105
106
  {
  	int retval;
  	unsigned long flags;
8d20a541b   Mikael Starvik   [PATCH] CRIS upda...
107
  	cris_atomic_save(v, flags);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
108
  	retval = ++(v->counter) == 0;
8d20a541b   Mikael Starvik   [PATCH] CRIS upda...
109
  	cris_atomic_restore(v, flags);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
110
111
  	return retval;
  }
4a6dae6d3   Nick Piggin   [PATCH] atomic: c...
112
113
114
115
116
117
118
119
120
121
122
123
  static inline int atomic_cmpxchg(atomic_t *v, int old, int new)
  {
  	int ret;
  	unsigned long flags;
  
  	cris_atomic_save(v, flags);
  	ret = v->counter;
  	if (likely(ret == old))
  		v->counter = new;
  	cris_atomic_restore(v, flags);
  	return ret;
  }
ffbf670f5   Ingo Molnar   [PATCH] mutex sub...
124
  #define atomic_xchg(v, new) (xchg(&((v)->counter), new))
f24219b4e   Arun Sharma   atomic: move atom...
125
  static inline int __atomic_add_unless(atomic_t *v, int a, int u)
8426e1f6a   Nick Piggin   [PATCH] atomic: i...
126
127
128
129
130
131
132
133
134
  {
  	int ret;
  	unsigned long flags;
  
  	cris_atomic_save(v, flags);
  	ret = v->counter;
  	if (ret != u)
  		v->counter += a;
  	cris_atomic_restore(v, flags);
f24219b4e   Arun Sharma   atomic: move atom...
135
  	return ret;
8426e1f6a   Nick Piggin   [PATCH] atomic: i...
136
  }
8426e1f6a   Nick Piggin   [PATCH] atomic: i...
137

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
138
139
140
141
142
143
144
  /* Atomic operations are already serializing */
  #define smp_mb__before_atomic_dec()    barrier()
  #define smp_mb__after_atomic_dec()     barrier()
  #define smp_mb__before_atomic_inc()    barrier()
  #define smp_mb__after_atomic_inc()     barrier()
  
  #endif