Add the rt linux 4.1.3-rt3 as base
[kvmfornfv.git] / kernel / arch / nios2 / include / asm / cmpxchg.h
1 /*
2  * Copyright (C) 2004 Microtronix Datacom Ltd.
3  *
4  * This file is subject to the terms and conditions of the GNU General Public
5  * License. See the file "COPYING" in the main directory of this archive
6  * for more details.
7  */
8
9 #ifndef _ASM_NIOS2_CMPXCHG_H
10 #define _ASM_NIOS2_CMPXCHG_H
11
12 #include <linux/irqflags.h>
13
14 #define xchg(ptr, x)    \
15         ((__typeof__(*(ptr)))__xchg((unsigned long)(x), (ptr), sizeof(*(ptr))))
16
17 struct __xchg_dummy { unsigned long a[100]; };
18 #define __xg(x)         ((volatile struct __xchg_dummy *)(x))
19
20 static inline unsigned long __xchg(unsigned long x, volatile void *ptr,
21                                         int size)
22 {
23         unsigned long tmp, flags;
24
25         local_irq_save(flags);
26
27         switch (size) {
28         case 1:
29                 __asm__ __volatile__(
30                         "ldb    %0, %2\n"
31                         "stb    %1, %2\n"
32                         : "=&r" (tmp)
33                         : "r" (x), "m" (*__xg(ptr))
34                         : "memory");
35                 break;
36         case 2:
37                 __asm__ __volatile__(
38                         "ldh    %0, %2\n"
39                         "sth    %1, %2\n"
40                         : "=&r" (tmp)
41                         : "r" (x), "m" (*__xg(ptr))
42                         : "memory");
43                 break;
44         case 4:
45                 __asm__ __volatile__(
46                         "ldw    %0, %2\n"
47                         "stw    %1, %2\n"
48                         : "=&r" (tmp)
49                         : "r" (x), "m" (*__xg(ptr))
50                         : "memory");
51                 break;
52         }
53
54         local_irq_restore(flags);
55         return tmp;
56 }
57
58 #include <asm-generic/cmpxchg.h>
59 #include <asm-generic/cmpxchg-local.h>
60
61 #endif /* _ASM_NIOS2_CMPXCHG_H */