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