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*4882a593Smuzhiyunstatic 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*4882a593Smuzhiyunstatic 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*4882a593Smuzhiyunstatic 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*4882a593Smuzhiyunstatic 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