1 #ifndef __ASM_SH_CMPXCHG_IRQ_H 2 #define __ASM_SH_CMPXCHG_IRQ_H 3 4 static inline unsigned long xchg_u32(volatile u32 *m, unsigned long val) 5 { 6 unsigned long flags, retval; 7 8 local_irq_save(flags); 9 retval = *m; 10 *m = val; 11 local_irq_restore(flags); 12 return retval; 13 } 14 15 static inline unsigned long xchg_u8(volatile u8 *m, unsigned long val) 16 { 17 unsigned long flags, retval; 18 19 local_irq_save(flags); 20 retval = *m; 21 *m = val & 0xff; 22 local_irq_restore(flags); 23 return retval; 24 } 25 26 static inline unsigned long __cmpxchg_u32(volatile int *m, unsigned long old, 27 unsigned long new) 28 { 29 __u32 retval; 30 unsigned long flags; 31 32 local_irq_save(flags); 33 retval = *m; 34 if (retval == old) 35 *m = new; 36 local_irq_restore(flags); /* implies memory barrier */ 37 return retval; 38 } 39 40 #endif /* __ASM_SH_CMPXCHG_IRQ_H */ 41