]>
Commit | Line | Data |
---|---|---|
b2441318 | 1 | /* SPDX-License-Identifier: GPL-2.0 */ |
c40d04df DH |
2 | #ifndef _ASM_MICROBLAZE_CMPXCHG_H |
3 | #define _ASM_MICROBLAZE_CMPXCHG_H | |
4 | ||
90c0d80d MS |
5 | #include <linux/irqflags.h> |
6 | ||
c40d04df DH |
7 | void __bad_xchg(volatile void *ptr, int size); |
8 | ||
9 | static inline unsigned long __xchg(unsigned long x, volatile void *ptr, | |
10 | int size) | |
11 | { | |
12 | unsigned long ret; | |
13 | unsigned long flags; | |
14 | ||
15 | switch (size) { | |
16 | case 1: | |
17 | local_irq_save(flags); | |
18 | ret = *(volatile unsigned char *)ptr; | |
19 | *(volatile unsigned char *)ptr = x; | |
20 | local_irq_restore(flags); | |
21 | break; | |
22 | ||
23 | case 4: | |
24 | local_irq_save(flags); | |
25 | ret = *(volatile unsigned long *)ptr; | |
26 | *(volatile unsigned long *)ptr = x; | |
27 | local_irq_restore(flags); | |
28 | break; | |
29 | default: | |
30 | __bad_xchg(ptr, size), ret = 0; | |
31 | break; | |
32 | } | |
33 | ||
34 | return ret; | |
35 | } | |
36 | ||
37 | #define xchg(ptr, x) \ | |
38 | ((__typeof__(*(ptr))) __xchg((unsigned long)(x), (ptr), sizeof(*(ptr)))) | |
39 | ||
40 | #include <asm-generic/cmpxchg.h> | |
41 | #include <asm-generic/cmpxchg-local.h> | |
42 | ||
43 | #endif /* _ASM_MICROBLAZE_CMPXCHG_H */ |