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 */ 72