diff options
Diffstat (limited to 'arch/parisc/include/asm/atomic.h')
| -rw-r--r-- | arch/parisc/include/asm/atomic.h | 63 | 
1 files changed, 55 insertions, 8 deletions
diff --git a/arch/parisc/include/asm/atomic.h b/arch/parisc/include/asm/atomic.h index 1d109990a022..5394b9c5f914 100644 --- a/arch/parisc/include/asm/atomic.h +++ b/arch/parisc/include/asm/atomic.h @@ -121,16 +121,39 @@ static __inline__ int atomic_##op##_return(int i, atomic_t *v)		\  	return ret;							\  } -#define ATOMIC_OPS(op, c_op) ATOMIC_OP(op, c_op) ATOMIC_OP_RETURN(op, c_op) +#define ATOMIC_FETCH_OP(op, c_op)					\ +static __inline__ int atomic_fetch_##op(int i, atomic_t *v)		\ +{									\ +	unsigned long flags;						\ +	int ret;							\ +									\ +	_atomic_spin_lock_irqsave(v, flags);				\ +	ret = v->counter;						\ +	v->counter c_op i;						\ +	_atomic_spin_unlock_irqrestore(v, flags);			\ +									\ +	return ret;							\ +} + +#define ATOMIC_OPS(op, c_op)						\ +	ATOMIC_OP(op, c_op)						\ +	ATOMIC_OP_RETURN(op, c_op)					\ +	ATOMIC_FETCH_OP(op, c_op)  ATOMIC_OPS(add, +=)  ATOMIC_OPS(sub, -=) -ATOMIC_OP(and, &=) -ATOMIC_OP(or, |=) -ATOMIC_OP(xor, ^=) +#undef ATOMIC_OPS +#define ATOMIC_OPS(op, c_op)						\ +	ATOMIC_OP(op, c_op)						\ +	ATOMIC_FETCH_OP(op, c_op) + +ATOMIC_OPS(and, &=) +ATOMIC_OPS(or, |=) +ATOMIC_OPS(xor, ^=)  #undef ATOMIC_OPS +#undef ATOMIC_FETCH_OP  #undef ATOMIC_OP_RETURN  #undef ATOMIC_OP @@ -185,15 +208,39 @@ static __inline__ s64 atomic64_##op##_return(s64 i, atomic64_t *v)	\  	return ret;							\  } -#define ATOMIC64_OPS(op, c_op) ATOMIC64_OP(op, c_op) ATOMIC64_OP_RETURN(op, c_op) +#define ATOMIC64_FETCH_OP(op, c_op)					\ +static __inline__ s64 atomic64_fetch_##op(s64 i, atomic64_t *v)		\ +{									\ +	unsigned long flags;						\ +	s64 ret;							\ +									\ +	_atomic_spin_lock_irqsave(v, flags);				\ +	ret = v->counter;						\ +	v->counter c_op i;						\ +	_atomic_spin_unlock_irqrestore(v, flags);			\ +									\ +	return ret;							\ +} + +#define ATOMIC64_OPS(op, c_op)						\ +	ATOMIC64_OP(op, c_op)						\ +	ATOMIC64_OP_RETURN(op, c_op)					\ +	ATOMIC64_FETCH_OP(op, c_op)  ATOMIC64_OPS(add, +=)  ATOMIC64_OPS(sub, -=) -ATOMIC64_OP(and, &=) -ATOMIC64_OP(or, |=) -ATOMIC64_OP(xor, ^=)  #undef ATOMIC64_OPS +#define ATOMIC64_OPS(op, c_op)						\ +	ATOMIC64_OP(op, c_op)						\ +	ATOMIC64_FETCH_OP(op, c_op) + +ATOMIC64_OPS(and, &=) +ATOMIC64_OPS(or, |=) +ATOMIC64_OPS(xor, ^=) + +#undef ATOMIC64_OPS +#undef ATOMIC64_FETCH_OP  #undef ATOMIC64_OP_RETURN  #undef ATOMIC64_OP  |