cmpxchg-irq.h 1.0 KB

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