Merge branch 'core-rcu-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git...
[sfrench/cifs-2.6.git] / arch / sh / include / asm / atomic-irq.h
1 #ifndef __ASM_SH_ATOMIC_IRQ_H
2 #define __ASM_SH_ATOMIC_IRQ_H
3
4 #include <linux/irqflags.h>
5
6 /*
7  * To get proper branch prediction for the main line, we must branch
8  * forward to code at the end of this object's .text section, then
9  * branch back to restart the operation.
10  */
11 static inline void atomic_add(int i, atomic_t *v)
12 {
13         unsigned long flags;
14
15         raw_local_irq_save(flags);
16         v->counter += i;
17         raw_local_irq_restore(flags);
18 }
19
20 static inline void atomic_sub(int i, atomic_t *v)
21 {
22         unsigned long flags;
23
24         raw_local_irq_save(flags);
25         v->counter -= i;
26         raw_local_irq_restore(flags);
27 }
28
29 static inline int atomic_add_return(int i, atomic_t *v)
30 {
31         unsigned long temp, flags;
32
33         raw_local_irq_save(flags);
34         temp = v->counter;
35         temp += i;
36         v->counter = temp;
37         raw_local_irq_restore(flags);
38
39         return temp;
40 }
41
42 static inline int atomic_sub_return(int i, atomic_t *v)
43 {
44         unsigned long temp, flags;
45
46         raw_local_irq_save(flags);
47         temp = v->counter;
48         temp -= i;
49         v->counter = temp;
50         raw_local_irq_restore(flags);
51
52         return temp;
53 }
54
55 static inline void atomic_clear_mask(unsigned int mask, atomic_t *v)
56 {
57         unsigned long flags;
58
59         raw_local_irq_save(flags);
60         v->counter &= ~mask;
61         raw_local_irq_restore(flags);
62 }
63
64 static inline void atomic_set_mask(unsigned int mask, atomic_t *v)
65 {
66         unsigned long flags;
67
68         raw_local_irq_save(flags);
69         v->counter |= mask;
70         raw_local_irq_restore(flags);
71 }
72
73 #endif /* __ASM_SH_ATOMIC_IRQ_H */