| #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); |
| v->counter += i; |
| local_irq_restore(flags); |
| } |
| |
| static inline void atomic_sub(int i, atomic_t *v) |
| { |
| unsigned long flags; |
| |
| local_irq_save(flags); |
| v->counter -= 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 = v->counter; |
| temp += i; |
| v->counter = 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 = v->counter; |
| temp -= i; |
| v->counter = 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); |
| v->counter &= ~mask; |
| local_irq_restore(flags); |
| } |
| |
| static inline void atomic_set_mask(unsigned int mask, atomic_t *v) |
| { |
| unsigned long flags; |
| |
| local_irq_save(flags); |
| v->counter |= mask; |
| local_irq_restore(flags); |
| } |
| |
| #endif /* __ASM_SH_ATOMIC_IRQ_H */ |