Merge tag 'libnvdimm-for-5.15' of git://git.kernel.org/pub/scm/linux/kernel/git/nvdim...
[linux-2.6-microblaze.git] / arch / arc / include / asm / atomic.h
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 /*
3  * Copyright (C) 2004, 2007-2010, 2011-2012 Synopsys, Inc. (www.synopsys.com)
4  */
5
6 #ifndef _ASM_ARC_ATOMIC_H
7 #define _ASM_ARC_ATOMIC_H
8
9 #ifndef __ASSEMBLY__
10
11 #include <linux/types.h>
12 #include <linux/compiler.h>
13 #include <asm/cmpxchg.h>
14 #include <asm/barrier.h>
15 #include <asm/smp.h>
16
17 #define arch_atomic_read(v)  READ_ONCE((v)->counter)
18
19 #ifdef CONFIG_ARC_HAS_LLSC
20 #include <asm/atomic-llsc.h>
21 #else
22 #include <asm/atomic-spinlock.h>
23 #endif
24
25 #define arch_atomic_cmpxchg(v, o, n)                                    \
26 ({                                                                      \
27         arch_cmpxchg(&((v)->counter), (o), (n));                        \
28 })
29
30 #ifdef arch_cmpxchg_relaxed
31 #define arch_atomic_cmpxchg_relaxed(v, o, n)                            \
32 ({                                                                      \
33         arch_cmpxchg_relaxed(&((v)->counter), (o), (n));                \
34 })
35 #endif
36
37 #define arch_atomic_xchg(v, n)                                          \
38 ({                                                                      \
39         arch_xchg(&((v)->counter), (n));                                \
40 })
41
42 #ifdef arch_xchg_relaxed
43 #define arch_atomic_xchg_relaxed(v, n)                                  \
44 ({                                                                      \
45         arch_xchg_relaxed(&((v)->counter), (n));                        \
46 })
47 #endif
48
49 /*
50  * 64-bit atomics
51  */
52 #ifdef CONFIG_GENERIC_ATOMIC64
53 #include <asm-generic/atomic64.h>
54 #else
55 #include <asm/atomic64-arcv2.h>
56 #endif
57
58 #endif  /* !__ASSEMBLY__ */
59
60 #endif