cmpxchg-irq.h 796 B

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