Commit | Line | Data |
---|---|---|
ec723fbe PM |
1 | #ifndef __ASM_SH_ATOMIC_IRQ_H |
2 | #define __ASM_SH_ATOMIC_IRQ_H | |
3 | ||
4 | /* | |
5 | * To get proper branch prediction for the main line, we must branch | |
6 | * forward to code at the end of this object's .text section, then | |
7 | * branch back to restart the operation. | |
8 | */ | |
9 | static inline void atomic_add(int i, atomic_t *v) | |
10 | { | |
11 | unsigned long flags; | |
12 | ||
13 | local_irq_save(flags); | |
14 | *(long *)v += i; | |
15 | local_irq_restore(flags); | |
16 | } | |
17 | ||
18 | static inline void atomic_sub(int i, atomic_t *v) | |
19 | { | |
20 | unsigned long flags; | |
21 | ||
22 | local_irq_save(flags); | |
23 | *(long *)v -= i; | |
24 | local_irq_restore(flags); | |
25 | } | |
26 | ||
27 | static inline int atomic_add_return(int i, atomic_t *v) | |
28 | { | |
29 | unsigned long temp, flags; | |
30 | ||
31 | local_irq_save(flags); | |
32 | temp = *(long *)v; | |
33 | temp += i; | |
34 | *(long *)v = temp; | |
35 | local_irq_restore(flags); | |
36 | ||
37 | return temp; | |
38 | } | |
39 | ||
40 | static inline int atomic_sub_return(int i, atomic_t *v) | |
41 | { | |
42 | unsigned long temp, flags; | |
43 | ||
44 | local_irq_save(flags); | |
45 | temp = *(long *)v; | |
46 | temp -= i; | |
47 | *(long *)v = temp; | |
48 | local_irq_restore(flags); | |
49 | ||
50 | return temp; | |
51 | } | |
52 | ||
53 | static inline void atomic_clear_mask(unsigned int mask, atomic_t *v) | |
54 | { | |
55 | unsigned long flags; | |
56 | ||
57 | local_irq_save(flags); | |
58 | *(long *)v &= ~mask; | |
59 | local_irq_restore(flags); | |
60 | } | |
61 | ||
62 | static inline void atomic_set_mask(unsigned int mask, atomic_t *v) | |
63 | { | |
64 | unsigned long flags; | |
65 | ||
66 | local_irq_save(flags); | |
67 | *(long *)v |= mask; | |
68 | local_irq_restore(flags); | |
69 | } | |
70 | ||
71 | #endif /* __ASM_SH_ATOMIC_IRQ_H */ |