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