Blame view

include/asm-cris/atomic.h 3.46 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
3
4
5
6
  /* $Id: atomic.h,v 1.3 2001/07/25 16:15:19 bjornw Exp $ */
  
  #ifndef __ASM_CRIS_ATOMIC__
  #define __ASM_CRIS_ATOMIC__
  
  #include <asm/system.h>
8d20a541b   Mikael Starvik   [PATCH] CRIS upda...
7
  #include <asm/arch/atomic.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
8
9
10
11
12
  
  /*
   * Atomic operations that C can't guarantee us.  Useful for
   * resource counting etc..
   */
8d20a541b   Mikael Starvik   [PATCH] CRIS upda...
13
  typedef struct { volatile int counter; } atomic_t;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
14
15
16
17
18
19
20
  
  #define ATOMIC_INIT(i)  { (i) }
  
  #define atomic_read(v) ((v)->counter)
  #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...
21
  static inline void atomic_add(int i, volatile atomic_t *v)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
22
23
  {
  	unsigned long flags;
8d20a541b   Mikael Starvik   [PATCH] CRIS upda...
24
  	cris_atomic_save(v, flags);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
25
  	v->counter += i;
8d20a541b   Mikael Starvik   [PATCH] CRIS upda...
26
  	cris_atomic_restore(v, flags);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
27
  }
d9b5444ee   Adrian Bunk   [PATCH] cris: "ex...
28
  static inline void atomic_sub(int i, volatile atomic_t *v)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
29
30
  {
  	unsigned long flags;
8d20a541b   Mikael Starvik   [PATCH] CRIS upda...
31
  	cris_atomic_save(v, flags);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
32
  	v->counter -= i;
8d20a541b   Mikael Starvik   [PATCH] CRIS upda...
33
  	cris_atomic_restore(v, flags);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
34
  }
d9b5444ee   Adrian Bunk   [PATCH] cris: "ex...
35
  static inline int atomic_add_return(int i, volatile atomic_t *v)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
36
37
38
  {
  	unsigned long flags;
  	int retval;
8d20a541b   Mikael Starvik   [PATCH] CRIS upda...
39
  	cris_atomic_save(v, flags);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
40
  	retval = (v->counter += i);
8d20a541b   Mikael Starvik   [PATCH] CRIS upda...
41
  	cris_atomic_restore(v, flags);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
42
43
44
45
  	return retval;
  }
  
  #define atomic_add_negative(a, v)	(atomic_add_return((a), (v)) < 0)
d9b5444ee   Adrian Bunk   [PATCH] cris: "ex...
46
  static inline int atomic_sub_return(int i, volatile atomic_t *v)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
47
48
49
  {
  	unsigned long flags;
  	int retval;
8d20a541b   Mikael Starvik   [PATCH] CRIS upda...
50
  	cris_atomic_save(v, flags);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
51
  	retval = (v->counter -= i);
8d20a541b   Mikael Starvik   [PATCH] CRIS upda...
52
  	cris_atomic_restore(v, flags);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
53
54
  	return retval;
  }
d9b5444ee   Adrian Bunk   [PATCH] cris: "ex...
55
  static inline int atomic_sub_and_test(int i, volatile atomic_t *v)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
56
57
58
  {
  	int retval;
  	unsigned long flags;
8d20a541b   Mikael Starvik   [PATCH] CRIS upda...
59
  	cris_atomic_save(v, flags);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
60
  	retval = (v->counter -= i) == 0;
8d20a541b   Mikael Starvik   [PATCH] CRIS upda...
61
  	cris_atomic_restore(v, flags);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
62
63
  	return retval;
  }
d9b5444ee   Adrian Bunk   [PATCH] cris: "ex...
64
  static inline void atomic_inc(volatile atomic_t *v)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
65
66
  {
  	unsigned long flags;
8d20a541b   Mikael Starvik   [PATCH] CRIS upda...
67
  	cris_atomic_save(v, flags);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
68
  	(v->counter)++;
8d20a541b   Mikael Starvik   [PATCH] CRIS upda...
69
  	cris_atomic_restore(v, flags);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
70
  }
d9b5444ee   Adrian Bunk   [PATCH] cris: "ex...
71
  static inline void atomic_dec(volatile atomic_t *v)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
72
73
  {
  	unsigned long flags;
8d20a541b   Mikael Starvik   [PATCH] CRIS upda...
74
  	cris_atomic_save(v, flags);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
75
  	(v->counter)--;
8d20a541b   Mikael Starvik   [PATCH] CRIS upda...
76
  	cris_atomic_restore(v, flags);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
77
  }
d9b5444ee   Adrian Bunk   [PATCH] cris: "ex...
78
  static inline int atomic_inc_return(volatile atomic_t *v)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
79
80
81
  {
  	unsigned long flags;
  	int retval;
8d20a541b   Mikael Starvik   [PATCH] CRIS upda...
82
  	cris_atomic_save(v, flags);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
83
  	retval = (v->counter)++;
8d20a541b   Mikael Starvik   [PATCH] CRIS upda...
84
  	cris_atomic_restore(v, flags);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
85
86
  	return retval;
  }
d9b5444ee   Adrian Bunk   [PATCH] cris: "ex...
87
  static inline int atomic_dec_return(volatile atomic_t *v)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
88
89
90
  {
  	unsigned long flags;
  	int retval;
8d20a541b   Mikael Starvik   [PATCH] CRIS upda...
91
  	cris_atomic_save(v, flags);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
92
  	retval = (v->counter)--;
8d20a541b   Mikael Starvik   [PATCH] CRIS upda...
93
  	cris_atomic_restore(v, flags);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
94
95
  	return retval;
  }
d9b5444ee   Adrian Bunk   [PATCH] cris: "ex...
96
  static inline int atomic_dec_and_test(volatile atomic_t *v)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
97
98
99
  {
  	int retval;
  	unsigned long flags;
8d20a541b   Mikael Starvik   [PATCH] CRIS upda...
100
  	cris_atomic_save(v, flags);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
101
  	retval = --(v->counter) == 0;
8d20a541b   Mikael Starvik   [PATCH] CRIS upda...
102
  	cris_atomic_restore(v, flags);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
103
104
  	return retval;
  }
d9b5444ee   Adrian Bunk   [PATCH] cris: "ex...
105
  static inline int atomic_inc_and_test(volatile atomic_t *v)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
106
107
108
  {
  	int retval;
  	unsigned long flags;
8d20a541b   Mikael Starvik   [PATCH] CRIS upda...
109
  	cris_atomic_save(v, flags);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
110
  	retval = ++(v->counter) == 0;
8d20a541b   Mikael Starvik   [PATCH] CRIS upda...
111
  	cris_atomic_restore(v, flags);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
112
113
  	return retval;
  }
4a6dae6d3   Nick Piggin   [PATCH] atomic: c...
114
115
116
117
118
119
120
121
122
123
124
125
  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...
126
  #define atomic_xchg(v, new) (xchg(&((v)->counter), new))
8426e1f6a   Nick Piggin   [PATCH] atomic: i...
127
128
129
130
131
132
133
134
135
136
137
138
139
  static inline int atomic_add_unless(atomic_t *v, int a, int u)
  {
  	int ret;
  	unsigned long flags;
  
  	cris_atomic_save(v, flags);
  	ret = v->counter;
  	if (ret != u)
  		v->counter += a;
  	cris_atomic_restore(v, flags);
  	return ret != u;
  }
  #define atomic_inc_not_zero(v) atomic_add_unless((v), 1, 0)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
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()
d3cb48714   Christoph Lameter   [PATCH] atomic_lo...
145
  #include <asm-generic/atomic.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
146
  #endif