Merge branch 'master' of git://www.denx.de/git/u-boot-imx
[oweals/u-boot.git] / arch / xtensa / include / asm / atomic.h
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