| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263 |
- #ifndef __ASM_SH_ATOMIC_IRQ_H
- #define __ASM_SH_ATOMIC_IRQ_H
- #include <linux/irqflags.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.
- */
- #define ATOMIC_OP(op, c_op) \
- static inline void atomic_##op(int i, atomic_t *v) \
- { \
- unsigned long flags; \
- \
- raw_local_irq_save(flags); \
- v->counter c_op i; \
- raw_local_irq_restore(flags); \
- }
- #define ATOMIC_OP_RETURN(op, c_op) \
- static inline int atomic_##op##_return(int i, atomic_t *v) \
- { \
- unsigned long temp, flags; \
- \
- raw_local_irq_save(flags); \
- temp = v->counter; \
- temp c_op i; \
- v->counter = temp; \
- raw_local_irq_restore(flags); \
- \
- return temp; \
- }
- #define ATOMIC_OPS(op, c_op) ATOMIC_OP(op, c_op) ATOMIC_OP_RETURN(op, c_op)
- ATOMIC_OPS(add, +=)
- ATOMIC_OPS(sub, -=)
- #undef ATOMIC_OPS
- #undef ATOMIC_OP_RETURN
- #undef ATOMIC_OP
- static inline void atomic_clear_mask(unsigned int mask, atomic_t *v)
- {
- unsigned long flags;
- raw_local_irq_save(flags);
- v->counter &= ~mask;
- raw_local_irq_restore(flags);
- }
- static inline void atomic_set_mask(unsigned int mask, atomic_t *v)
- {
- unsigned long flags;
- raw_local_irq_save(flags);
- v->counter |= mask;
- raw_local_irq_restore(flags);
- }
- #endif /* __ASM_SH_ATOMIC_IRQ_H */
|