14eb14db4440febb7e560eb8ab2c099bc6e11a0acDavid Howells#ifndef _ASM_SCORE_CMPXCHG_H
24eb14db4440febb7e560eb8ab2c099bc6e11a0acDavid Howells#define _ASM_SCORE_CMPXCHG_H
34eb14db4440febb7e560eb8ab2c099bc6e11a0acDavid Howells
44eb14db4440febb7e560eb8ab2c099bc6e11a0acDavid Howells#include <linux/irqflags.h>
54eb14db4440febb7e560eb8ab2c099bc6e11a0acDavid Howells
64eb14db4440febb7e560eb8ab2c099bc6e11a0acDavid Howellsstruct __xchg_dummy { unsigned long a[100]; };
74eb14db4440febb7e560eb8ab2c099bc6e11a0acDavid Howells#define __xg(x) ((struct __xchg_dummy *)(x))
84eb14db4440febb7e560eb8ab2c099bc6e11a0acDavid Howells
94eb14db4440febb7e560eb8ab2c099bc6e11a0acDavid Howellsstatic inline
104eb14db4440febb7e560eb8ab2c099bc6e11a0acDavid Howellsunsigned long __xchg(volatile unsigned long *m, unsigned long val)
114eb14db4440febb7e560eb8ab2c099bc6e11a0acDavid Howells{
124eb14db4440febb7e560eb8ab2c099bc6e11a0acDavid Howells	unsigned long retval;
134eb14db4440febb7e560eb8ab2c099bc6e11a0acDavid Howells	unsigned long flags;
144eb14db4440febb7e560eb8ab2c099bc6e11a0acDavid Howells
154eb14db4440febb7e560eb8ab2c099bc6e11a0acDavid Howells	local_irq_save(flags);
164eb14db4440febb7e560eb8ab2c099bc6e11a0acDavid Howells	retval = *m;
174eb14db4440febb7e560eb8ab2c099bc6e11a0acDavid Howells	*m = val;
184eb14db4440febb7e560eb8ab2c099bc6e11a0acDavid Howells	local_irq_restore(flags);
194eb14db4440febb7e560eb8ab2c099bc6e11a0acDavid Howells	return retval;
204eb14db4440febb7e560eb8ab2c099bc6e11a0acDavid Howells}
214eb14db4440febb7e560eb8ab2c099bc6e11a0acDavid Howells
224eb14db4440febb7e560eb8ab2c099bc6e11a0acDavid Howells#define xchg(ptr, v)						\
234eb14db4440febb7e560eb8ab2c099bc6e11a0acDavid Howells	((__typeof__(*(ptr))) __xchg((unsigned long *)(ptr),	\
244eb14db4440febb7e560eb8ab2c099bc6e11a0acDavid Howells					(unsigned long)(v)))
254eb14db4440febb7e560eb8ab2c099bc6e11a0acDavid Howells
264eb14db4440febb7e560eb8ab2c099bc6e11a0acDavid Howellsstatic inline unsigned long __cmpxchg(volatile unsigned long *m,
274eb14db4440febb7e560eb8ab2c099bc6e11a0acDavid Howells				unsigned long old, unsigned long new)
284eb14db4440febb7e560eb8ab2c099bc6e11a0acDavid Howells{
294eb14db4440febb7e560eb8ab2c099bc6e11a0acDavid Howells	unsigned long retval;
304eb14db4440febb7e560eb8ab2c099bc6e11a0acDavid Howells	unsigned long flags;
314eb14db4440febb7e560eb8ab2c099bc6e11a0acDavid Howells
324eb14db4440febb7e560eb8ab2c099bc6e11a0acDavid Howells	local_irq_save(flags);
334eb14db4440febb7e560eb8ab2c099bc6e11a0acDavid Howells	retval = *m;
344eb14db4440febb7e560eb8ab2c099bc6e11a0acDavid Howells	if (retval == old)
354eb14db4440febb7e560eb8ab2c099bc6e11a0acDavid Howells		*m = new;
364eb14db4440febb7e560eb8ab2c099bc6e11a0acDavid Howells	local_irq_restore(flags);
374eb14db4440febb7e560eb8ab2c099bc6e11a0acDavid Howells	return retval;
384eb14db4440febb7e560eb8ab2c099bc6e11a0acDavid Howells}
394eb14db4440febb7e560eb8ab2c099bc6e11a0acDavid Howells
404eb14db4440febb7e560eb8ab2c099bc6e11a0acDavid Howells#define cmpxchg(ptr, o, n)					\
414eb14db4440febb7e560eb8ab2c099bc6e11a0acDavid Howells	((__typeof__(*(ptr))) __cmpxchg((unsigned long *)(ptr),	\
424eb14db4440febb7e560eb8ab2c099bc6e11a0acDavid Howells					(unsigned long)(o),	\
434eb14db4440febb7e560eb8ab2c099bc6e11a0acDavid Howells					(unsigned long)(n)))
444eb14db4440febb7e560eb8ab2c099bc6e11a0acDavid Howells
454eb14db4440febb7e560eb8ab2c099bc6e11a0acDavid Howells#define __HAVE_ARCH_CMPXCHG	1
464eb14db4440febb7e560eb8ab2c099bc6e11a0acDavid Howells
474eb14db4440febb7e560eb8ab2c099bc6e11a0acDavid Howells#include <asm-generic/cmpxchg-local.h>
484eb14db4440febb7e560eb8ab2c099bc6e11a0acDavid Howells
494eb14db4440febb7e560eb8ab2c099bc6e11a0acDavid Howells#endif /* _ASM_SCORE_CMPXCHG_H */
50