xref: /OK3568_Linux_fs/u-boot/arch/xtensa/include/asm/atomic.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * Copyright (C) 2016 Cadence Design Systems Inc.
3*4882a593Smuzhiyun  *
4*4882a593Smuzhiyun  * SPDX-License-Identifier:	GPL-2.0+
5*4882a593Smuzhiyun  */
6*4882a593Smuzhiyun 
7*4882a593Smuzhiyun #ifndef _XTENSA_ATOMIC_H
8*4882a593Smuzhiyun #define _XTENSA_ATOMIC_H
9*4882a593Smuzhiyun 
10*4882a593Smuzhiyun #include <asm/system.h>
11*4882a593Smuzhiyun 
12*4882a593Smuzhiyun typedef struct { volatile int counter; } atomic_t;
13*4882a593Smuzhiyun 
14*4882a593Smuzhiyun #define ATOMIC_INIT(i)	{ (i) }
15*4882a593Smuzhiyun 
16*4882a593Smuzhiyun #define atomic_read(v)		((v)->counter)
17*4882a593Smuzhiyun #define atomic_set(v, i)	((v)->counter = (i))
18*4882a593Smuzhiyun 
atomic_add(int i,atomic_t * v)19*4882a593Smuzhiyun static inline void atomic_add(int i, atomic_t *v)
20*4882a593Smuzhiyun {
21*4882a593Smuzhiyun 	unsigned long flags;
22*4882a593Smuzhiyun 
23*4882a593Smuzhiyun 	local_irq_save(flags);
24*4882a593Smuzhiyun 	v->counter += i;
25*4882a593Smuzhiyun 	local_irq_restore(flags);
26*4882a593Smuzhiyun }
27*4882a593Smuzhiyun 
atomic_sub(int i,atomic_t * v)28*4882a593Smuzhiyun static inline void atomic_sub(int i, atomic_t *v)
29*4882a593Smuzhiyun {
30*4882a593Smuzhiyun 	unsigned long flags;
31*4882a593Smuzhiyun 
32*4882a593Smuzhiyun 	local_irq_save(flags);
33*4882a593Smuzhiyun 	v->counter -= i;
34*4882a593Smuzhiyun 	local_irq_restore(flags);
35*4882a593Smuzhiyun }
36*4882a593Smuzhiyun 
atomic_inc(atomic_t * v)37*4882a593Smuzhiyun static inline void atomic_inc(atomic_t *v)
38*4882a593Smuzhiyun {
39*4882a593Smuzhiyun 	unsigned long flags;
40*4882a593Smuzhiyun 
41*4882a593Smuzhiyun 	local_irq_save(flags);
42*4882a593Smuzhiyun 	++v->counter;
43*4882a593Smuzhiyun 	local_irq_restore(flags);
44*4882a593Smuzhiyun }
45*4882a593Smuzhiyun 
atomic_dec(atomic_t * v)46*4882a593Smuzhiyun static inline void atomic_dec(atomic_t *v)
47*4882a593Smuzhiyun {
48*4882a593Smuzhiyun 	unsigned long flags;
49*4882a593Smuzhiyun 
50*4882a593Smuzhiyun 	local_irq_save(flags);
51*4882a593Smuzhiyun 	--v->counter;
52*4882a593Smuzhiyun 	local_irq_restore(flags);
53*4882a593Smuzhiyun }
54*4882a593Smuzhiyun 
55*4882a593Smuzhiyun #endif
56