OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [linux/] [linux-2.4/] [include/] [asm-or32/] [atomic.h] - Blame information for rev 1765

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 1276 phoenix
#ifndef _OR32_ATOMIC_H
2
#define _OR32_ATOMIC_H
3
 
4
#include <linux/config.h>
5
#include <asm/system.h>
6
 
7
#ifdef __KERNEL__
8
 
9
#define ATOMIC_INIT(i)  { (i) }
10
 
11
#define atomic_read(v)          ((v)->counter)
12
#define atomic_set(v,i)         (((v)->counter) = (i))
13
 
14
/*
15
 * Atomic operations that C can't guarantee us.  Useful for
16
 * resource counting etc..
17
 */
18
 
19
typedef struct { volatile int counter; } atomic_t;
20
 
21
static __inline__ void atomic_add(int i, volatile atomic_t *v)
22
{
23
        unsigned long flags;
24
        save_and_cli(flags);
25
        v->counter += i;
26
        restore_flags(flags);
27
}
28
 
29
static __inline__ void atomic_sub(int i, volatile atomic_t *v)
30
{
31
        unsigned long flags;
32
        save_and_cli(flags);
33
        v->counter -= i;
34
        restore_flags(flags);
35
}
36
 
37
static __inline__ int atomic_add_return(int i, volatile atomic_t *v)
38
{
39
        unsigned long flags;
40
        int retval;
41
        save_and_cli(flags);
42
        retval = (v->counter += i);
43
        restore_flags(flags);
44
        return retval;
45
}
46
 
47
static __inline__ int atomic_sub_return(int i, volatile atomic_t *v)
48
{
49
        unsigned long flags;
50
        int retval;
51
        save_and_cli(flags);
52
        retval = (v->counter -= i);
53
        restore_flags(flags);
54
        return retval;
55
}
56
 
57
static __inline__ int atomic_sub_and_test(int i, volatile atomic_t *v)
58
{
59
        int retval;
60
        unsigned long flags;
61
        save_and_cli(flags);
62
        retval = (v->counter -= i) == 0;
63
        restore_flags(flags);
64
        return retval;
65
}
66
 
67
static __inline__ void atomic_inc(volatile atomic_t *v)
68
{
69
        unsigned long flags;
70
        save_and_cli(flags);
71
        (v->counter)++;
72
        restore_flags(flags);
73
}
74
 
75
static __inline__ void atomic_dec(volatile atomic_t *v)
76
{
77
        unsigned long flags;
78
        save_and_cli(flags);
79
        (v->counter)--;
80
        restore_flags(flags);
81
}
82
 
83
static __inline__ int atomic_inc_return(volatile atomic_t *v)
84
{
85
        unsigned long flags;
86
        int retval;
87
        save_and_cli(flags);
88
        retval = (v->counter)++;
89
        restore_flags(flags);
90
        return retval;
91
}
92
 
93
static __inline__ int atomic_dec_return(volatile atomic_t *v)
94
{
95
        unsigned long flags;
96
        int retval;
97
        save_and_cli(flags);
98
        retval = (v->counter)--;
99
        restore_flags(flags);
100
        return retval;
101
}
102
static __inline__ int atomic_dec_and_test(volatile atomic_t *v)
103
{
104
        int retval;
105
        unsigned long flags;
106
        save_and_cli(flags);
107
        retval = --(v->counter) == 0;
108
        restore_flags(flags);
109
        return retval;
110
}
111
 
112
static __inline__ int atomic_inc_and_test(volatile atomic_t *v)
113
{
114
        int retval;
115
        unsigned long flags;
116
        save_and_cli(flags);
117
        retval = ++(v->counter) == 0;
118
        restore_flags(flags);
119
        return retval;
120
}
121
 
122
/* Atomic operations are already serializing */
123
#define smp_mb__before_atomic_dec()    barrier()
124
#define smp_mb__after_atomic_dec()     barrier()
125
#define smp_mb__before_atomic_inc()    barrier()
126
#define smp_mb__after_atomic_inc()     barrier()
127
 
128
#endif
129
#endif /* _OR32_ATOMIC_H */

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.