.. | .. |
---|
2 | 2 | #ifndef _ASM_MICROBLAZE_CMPXCHG_H |
---|
3 | 3 | #define _ASM_MICROBLAZE_CMPXCHG_H |
---|
4 | 4 | |
---|
5 | | -#include <linux/irqflags.h> |
---|
6 | | - |
---|
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> |
---|
| 5 | +#ifndef CONFIG_SMP |
---|
| 6 | +# include <asm-generic/cmpxchg.h> |
---|
| 7 | +#endif |
---|
42 | 8 | |
---|
43 | 9 | #endif /* _ASM_MICROBLAZE_CMPXCHG_H */ |
---|