git://ftp.safe.ca
/
safe
/
jmp
/
linux-2.6
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
x86: prepare merging futex_32/64.h
[safe/jmp/linux-2.6]
/
include
/
asm-arm
/
atomic.h
diff --git
a/include/asm-arm/atomic.h
b/include/asm-arm/atomic.h
index
5f82750
..
3b59f94
100644
(file)
--- a/
include/asm-arm/atomic.h
+++ b/
include/asm-arm/atomic.h
@@
-11,7
+11,8
@@
#ifndef __ASM_ARM_ATOMIC_H
#define __ASM_ARM_ATOMIC_H
#ifndef __ASM_ARM_ATOMIC_H
#define __ASM_ARM_ATOMIC_H
-#include <linux/config.h>
+#include <linux/compiler.h>
+#include <asm/system.h>
typedef struct { volatile int counter; } atomic_t;
typedef struct { volatile int counter; } atomic_t;
@@
-82,7
+83,7
@@
static inline int atomic_sub_return(int i, atomic_t *v)
static inline int atomic_cmpxchg(atomic_t *ptr, int old, int new)
{
static inline int atomic_cmpxchg(atomic_t *ptr, int old, int new)
{
- u
32
oldval, res;
+ u
nsigned long
oldval, res;
do {
__asm__ __volatile__("@ atomic_cmpxchg\n"
do {
__asm__ __volatile__("@ atomic_cmpxchg\n"
@@
-103,9
+104,9
@@
static inline void atomic_clear_mask(unsigned long mask, unsigned long *addr)
unsigned long tmp, tmp2;
__asm__ __volatile__("@ atomic_clear_mask\n"
unsigned long tmp, tmp2;
__asm__ __volatile__("@ atomic_clear_mask\n"
-"1: ldrex %0,
%2
\n"
+"1: ldrex %0,
[%2]
\n"
" bic %0, %0, %3\n"
" bic %0, %0, %3\n"
-" strex %1, %0,
%2
\n"
+" strex %1, %0,
[%2]
\n"
" teq %1, #0\n"
" bne 1b"
: "=&r" (tmp), "=&r" (tmp2)
" teq %1, #0\n"
" bne 1b"
: "=&r" (tmp), "=&r" (tmp2)
@@
-128,10
+129,10
@@
static inline int atomic_add_return(int i, atomic_t *v)
unsigned long flags;
int val;
unsigned long flags;
int val;
- local_irq_save(flags);
+
raw_
local_irq_save(flags);
val = v->counter;
v->counter = val += i;
val = v->counter;
v->counter = val += i;
- local_irq_restore(flags);
+
raw_
local_irq_restore(flags);
return val;
}
return val;
}
@@
-141,10
+142,10
@@
static inline int atomic_sub_return(int i, atomic_t *v)
unsigned long flags;
int val;
unsigned long flags;
int val;
- local_irq_save(flags);
+
raw_
local_irq_save(flags);
val = v->counter;
v->counter = val -= i;
val = v->counter;
v->counter = val -= i;
- local_irq_restore(flags);
+
raw_
local_irq_restore(flags);
return val;
}
return val;
}
@@
-154,11
+155,11
@@
static inline int atomic_cmpxchg(atomic_t *v, int old, int new)
int ret;
unsigned long flags;
int ret;
unsigned long flags;
- local_irq_save(flags);
+
raw_
local_irq_save(flags);
ret = v->counter;
if (likely(ret == old))
v->counter = new;
ret = v->counter;
if (likely(ret == old))
v->counter = new;
- local_irq_restore(flags);
+
raw_
local_irq_restore(flags);
return ret;
}
return ret;
}
@@
-167,13
+168,15
@@
static inline void atomic_clear_mask(unsigned long mask, unsigned long *addr)
{
unsigned long flags;
{
unsigned long flags;
- local_irq_save(flags);
+
raw_
local_irq_save(flags);
*addr &= ~mask;
*addr &= ~mask;
- local_irq_restore(flags);
+
raw_
local_irq_restore(flags);
}
#endif /* __LINUX_ARM_ARCH__ */
}
#endif /* __LINUX_ARM_ARCH__ */
+#define atomic_xchg(v, new) (xchg(&((v)->counter), new))
+
static inline int atomic_add_unless(atomic_t *v, int a, int u)
{
int c, old;
static inline int atomic_add_unless(atomic_t *v, int a, int u)
{
int c, old;
@@
-204,5
+207,6
@@
static inline int atomic_add_unless(atomic_t *v, int a, int u)
#define smp_mb__before_atomic_inc() barrier()
#define smp_mb__after_atomic_inc() barrier()
#define smp_mb__before_atomic_inc() barrier()
#define smp_mb__after_atomic_inc() barrier()
+#include <asm-generic/atomic.h>
#endif
#endif
#endif
#endif