linux/arch/sh/include/asm/cmpxchg-irq.h
<<
>>
Prefs
   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
   7static 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
  18static 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
  29static 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
  40static 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