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