1 /* SPDX-License-Identifier: GPL-2.0 */ 2 #ifndef __ASM_SH_CMPXCHG_IRQ_H 3 #define __ASM_SH_CMPXCHG_IRQ_H 4 5 #include <linux/irqflags.h> 6 7 static inline unsigned long xchg_u32(volatile u32 *m, unsigned long val) 8 { 9 unsigned long flags, retval; 10 11 local_irq_save(flags); 12 retval = *m; 13 *m = val; 14 local_irq_restore(flags); 15 return retval; 16 } 17 18 static inline unsigned long xchg_u16(volatile u16 *m, unsigned long val) 19 { 20 unsigned long flags, retval; 21 22 local_irq_save(flags); 23 retval = *m; 24 *m = val; 25 local_irq_restore(flags); 26 return retval; 27 } 28 29 static inline unsigned long xchg_u8(volatile u8 *m, unsigned long val) 30 { 31 unsigned long flags, retval; 32 33 local_irq_save(flags); 34 retval = *m; 35 *m = val & 0xff; 36 local_irq_restore(flags); 37 return retval; 38 } 39 40 static inline unsigned long __cmpxchg_u32(volatile int *m, unsigned long old, 41 unsigned long new) 42 { 43 __u32 retval; 44 unsigned long flags; 45 46 local_irq_save(flags); 47 retval = *m; 48 if (retval == old) 49 *m = new; 50 local_irq_restore(flags); /* implies memory barrier */ 51 return retval; 52 } 53 54 #endif /* __ASM_SH_CMPXCHG_IRQ_H */ 55