]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blob - arch/nios2/include/asm/cmpxchg.h
Merge branches 'acpi-scan', 'acpi-utils' and 'acpi-pm'
[mirror_ubuntu-bionic-kernel.git] / 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 */