#ifndef __ASM_SH_ATOMIC_IRQ_H #define __ASM_SH_ATOMIC_IRQ_H /* * To get proper branch prediction for the main line, we must branch * forward to code at the end of this object's .text section, then * branch back to restart the operation. */ static inline void atomic_add(int i, atomic_t *v) { unsigned long flags; local_irq_save(flags); *(long *)v += i; local_irq_restore(flags); } static inline void atomic_sub(int i, atomic_t *v) { unsigned long flags; local_irq_save(flags); *(long *)v -= i; local_irq_restore(flags); } static inline int atomic_add_return(int i, atomic_t *v) { unsigned long temp, flags; local_irq_save(flags); temp = *(long *)v; temp += i; *(long *)v = temp; local_irq_restore(flags); return temp; } static inline int atomic_sub_return(int i, atomic_t *v) { unsigned long temp, flags; local_irq_save(flags); temp = *(long *)v; temp -= i; *(long *)v = temp; local_irq_restore(flags); return temp; } static inline void atomic_clear_mask(unsigned int mask, atomic_t *v) { unsigned long flags; local_irq_save(flags); *(long *)v &= ~mask; local_irq_restore(flags); } static inline void atomic_set_mask(unsigned int mask, atomic_t *v) { unsigned long flags; local_irq_save(flags); *(long *)v |= mask; local_irq_restore(flags); } #endif /* __ASM_SH_ATOMIC_IRQ_H */