| .. | .. |
|---|
| 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 */ |
|---|