123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354 |
- #ifndef __ASM_SH_CMPXCHG_IRQ_H
- #define __ASM_SH_CMPXCHG_IRQ_H
- #include <linux/irqflags.h>
- static inline unsigned long xchg_u32(volatile u32 *m, unsigned long val)
- {
- unsigned long flags, retval;
- local_irq_save(flags);
- retval = *m;
- *m = val;
- local_irq_restore(flags);
- return retval;
- }
- static inline unsigned long xchg_u16(volatile u16 *m, unsigned long val)
- {
- unsigned long flags, retval;
- local_irq_save(flags);
- retval = *m;
- *m = val;
- local_irq_restore(flags);
- return retval;
- }
- static inline unsigned long xchg_u8(volatile u8 *m, unsigned long val)
- {
- unsigned long flags, retval;
- local_irq_save(flags);
- retval = *m;
- *m = val & 0xff;
- local_irq_restore(flags);
- return retval;
- }
- static inline unsigned long __cmpxchg_u32(volatile int *m, unsigned long old,
- unsigned long new)
- {
- __u32 retval;
- unsigned long flags;
- local_irq_save(flags);
- retval = *m;
- if (retval == old)
- *m = new;
- local_irq_restore(flags); /* implies memory barrier */
- return retval;
- }
- #endif /* __ASM_SH_CMPXCHG_IRQ_H */
|