1c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/*
2c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *  linux/include/asm-arm/atomic.h
3c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *
4c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *  Copyright (C) 1996 Russell King.
5c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *  Copyright (C) 2002 Deep Blue Solutions Ltd.
6c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *
7c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * This program is free software; you can redistribute it and/or modify
8c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * it under the terms of the GNU General Public License version 2 as
9c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * published by the Free Software Foundation.
10c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */
11c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifndef __ASM_ARM_ATOMIC_H
12c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define __ASM_ARM_ATOMIC_H
13c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
14c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/compiler.h>
15c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
16c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querutypedef struct { volatile int counter; } atomic_t;
17c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
18c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define ATOMIC_INIT(i)	{ (i) }
19c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
20c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifdef __KERNEL__
21c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
22c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define atomic_read(v)	((v)->counter)
23c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
24c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#if __LINUX_ARM_ARCH__ >= 6
25c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
26c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/*
27c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * ARMv6 UP and SMP safe atomic ops.  We use load exclusive and
28c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * store exclusive to ensure that these are atomic.  We may loop
29c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * to ensure that the update happens.  Writing to 'v->counter'
30c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * without using the following operations WILL break the atomic
31c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * nature of these ops.
32c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */
33c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void atomic_set(atomic_t *v, int i)
34c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{
35c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	unsigned long tmp;
36c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
37c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	__asm__ __volatile__("@ atomic_set\n"
38c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru"1:	ldrex	%0, [%1]\n"
39c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru"	strex	%0, %2, [%1]\n"
40c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru"	teq	%0, #0\n"
41c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru"	bne	1b"
42c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	: "=&r" (tmp)
43c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	: "r" (&v->counter), "r" (i)
44c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	: "cc");
45c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}
46c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
47c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline int atomic_add_return(int i, atomic_t *v)
48c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{
49c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	unsigned long tmp;
50c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	int result;
51c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
52c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	__asm__ __volatile__("@ atomic_add_return\n"
53c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru"1:	ldrex	%0, [%2]\n"
54c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru"	add	%0, %0, %3\n"
55c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru"	strex	%1, %0, [%2]\n"
56c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru"	teq	%1, #0\n"
57c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru"	bne	1b"
58c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	: "=&r" (result), "=&r" (tmp)
59c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	: "r" (&v->counter), "Ir" (i)
60c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	: "cc");
61c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
62c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	return result;
63c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}
64c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
65c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline int atomic_sub_return(int i, atomic_t *v)
66c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{
67c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	unsigned long tmp;
68c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	int result;
69c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
70c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	__asm__ __volatile__("@ atomic_sub_return\n"
71c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru"1:	ldrex	%0, [%2]\n"
72c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru"	sub	%0, %0, %3\n"
73c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru"	strex	%1, %0, [%2]\n"
74c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru"	teq	%1, #0\n"
75c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru"	bne	1b"
76c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	: "=&r" (result), "=&r" (tmp)
77c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	: "r" (&v->counter), "Ir" (i)
78c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	: "cc");
79c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
80c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	return result;
81c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}
82c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
83c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline int atomic_cmpxchg(atomic_t *ptr, int old, int new)
84c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{
85c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	unsigned long oldval, res;
86c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
87c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	do {
88c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru		__asm__ __volatile__("@ atomic_cmpxchg\n"
89c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru		"ldrex	%1, [%2]\n"
90c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru		"mov	%0, #0\n"
91c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru		"teq	%1, %3\n"
92c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru		"strexeq %0, %4, [%2]\n"
93c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru		    : "=&r" (res), "=&r" (oldval)
94c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru		    : "r" (&ptr->counter), "Ir" (old), "r" (new)
95c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru		    : "cc");
96c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	} while (res);
97c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
98c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	return oldval;
99c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}
100c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
101c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void atomic_clear_mask(unsigned long mask, unsigned long *addr)
102c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{
103c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	unsigned long tmp, tmp2;
104c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
105c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	__asm__ __volatile__("@ atomic_clear_mask\n"
106c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru"1:	ldrex	%0, %2\n"
107c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru"	bic	%0, %0, %3\n"
108c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru"	strex	%1, %0, %2\n"
109c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru"	teq	%1, #0\n"
110c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru"	bne	1b"
111c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	: "=&r" (tmp), "=&r" (tmp2)
112c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	: "r" (addr), "Ir" (mask)
113c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	: "cc");
114c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}
115c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
116c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#else /* ARM_ARCH_6 */
117c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
118c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <asm/system.h>
119c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
120c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifdef CONFIG_SMP
121c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#error SMP not supported on pre-ARMv6 CPUs
122c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif
123c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
124c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define atomic_set(v,i)	(((v)->counter) = (i))
125c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
126c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline int atomic_add_return(int i, atomic_t *v)
127c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{
128c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	unsigned long flags;
129c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	int val;
130c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
131c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	local_irq_save(flags);
132c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	val = v->counter;
133c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	v->counter = val += i;
134c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	local_irq_restore(flags);
135c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
136c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	return val;
137c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}
138c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
139c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline int atomic_sub_return(int i, atomic_t *v)
140c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{
141c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	unsigned long flags;
142c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	int val;
143c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
144c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	local_irq_save(flags);
145c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	val = v->counter;
146c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	v->counter = val -= i;
147c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	local_irq_restore(flags);
148c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
149c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	return val;
150c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}
151c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
152c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline int atomic_cmpxchg(atomic_t *v, int old, int new)
153c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{
154c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	int ret;
155c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	unsigned long flags;
156c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
157c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	local_irq_save(flags);
158c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	ret = v->counter;
159c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	if (likely(ret == old))
160c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru		v->counter = new;
161c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	local_irq_restore(flags);
162c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
163c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	return ret;
164c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}
165c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
166c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void atomic_clear_mask(unsigned long mask, unsigned long *addr)
167c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{
168c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	unsigned long flags;
169c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
170c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	local_irq_save(flags);
171c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	*addr &= ~mask;
172c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	local_irq_restore(flags);
173c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}
174c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
175c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif /* __LINUX_ARM_ARCH__ */
176c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
177c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define atomic_xchg(v, new) (xchg(&((v)->counter), new))
178c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
179c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline int atomic_add_unless(atomic_t *v, int a, int u)
180c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{
181c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	int c, old;
182c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
183c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	c = atomic_read(v);
184c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	while (c != u && (old = atomic_cmpxchg((v), c, c + a)) != c)
185c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru		c = old;
186c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	return c != u;
187c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}
188c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define atomic_inc_not_zero(v) atomic_add_unless((v), 1, 0)
189c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
190c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define atomic_add(i, v)	(void) atomic_add_return(i, v)
191c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define atomic_inc(v)		(void) atomic_add_return(1, v)
192c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define atomic_sub(i, v)	(void) atomic_sub_return(i, v)
193c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define atomic_dec(v)		(void) atomic_sub_return(1, v)
194c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
195c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define atomic_inc_and_test(v)	(atomic_add_return(1, v) == 0)
196c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define atomic_dec_and_test(v)	(atomic_sub_return(1, v) == 0)
197c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define atomic_inc_return(v)    (atomic_add_return(1, v))
198c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define atomic_dec_return(v)    (atomic_sub_return(1, v))
199c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define atomic_sub_and_test(i, v) (atomic_sub_return(i, v) == 0)
200c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
201c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define atomic_add_negative(i,v) (atomic_add_return(i, v) < 0)
202c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
203c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* Atomic operations are already serializing on ARM */
204c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define smp_mb__before_atomic_dec()	barrier()
205c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define smp_mb__after_atomic_dec()	barrier()
206c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define smp_mb__before_atomic_inc()	barrier()
207c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define smp_mb__after_atomic_inc()	barrier()
208c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
209c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <asm-generic/atomic.h>
210c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif
211c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif
212