16006c0d8ce9441dd1363bf14f18a8e28d3588460James Hogan#ifndef __ASM_METAG_CMPXCHG_LOCK1_H
26006c0d8ce9441dd1363bf14f18a8e28d3588460James Hogan#define __ASM_METAG_CMPXCHG_LOCK1_H
36006c0d8ce9441dd1363bf14f18a8e28d3588460James Hogan
46006c0d8ce9441dd1363bf14f18a8e28d3588460James Hogan#include <asm/global_lock.h>
56006c0d8ce9441dd1363bf14f18a8e28d3588460James Hogan
66006c0d8ce9441dd1363bf14f18a8e28d3588460James Hogan/* Use LOCK2 as these have to be atomic w.r.t. ordinary accesses. */
76006c0d8ce9441dd1363bf14f18a8e28d3588460James Hogan
86006c0d8ce9441dd1363bf14f18a8e28d3588460James Hoganstatic inline unsigned long xchg_u32(volatile u32 *m, unsigned long val)
96006c0d8ce9441dd1363bf14f18a8e28d3588460James Hogan{
106006c0d8ce9441dd1363bf14f18a8e28d3588460James Hogan	unsigned long flags, retval;
116006c0d8ce9441dd1363bf14f18a8e28d3588460James Hogan
126006c0d8ce9441dd1363bf14f18a8e28d3588460James Hogan	__global_lock2(flags);
136006c0d8ce9441dd1363bf14f18a8e28d3588460James Hogan	fence();
146006c0d8ce9441dd1363bf14f18a8e28d3588460James Hogan	retval = *m;
156006c0d8ce9441dd1363bf14f18a8e28d3588460James Hogan	*m = val;
166006c0d8ce9441dd1363bf14f18a8e28d3588460James Hogan	__global_unlock2(flags);
176006c0d8ce9441dd1363bf14f18a8e28d3588460James Hogan	return retval;
186006c0d8ce9441dd1363bf14f18a8e28d3588460James Hogan}
196006c0d8ce9441dd1363bf14f18a8e28d3588460James Hogan
206006c0d8ce9441dd1363bf14f18a8e28d3588460James Hoganstatic inline unsigned long xchg_u8(volatile u8 *m, unsigned long val)
216006c0d8ce9441dd1363bf14f18a8e28d3588460James Hogan{
226006c0d8ce9441dd1363bf14f18a8e28d3588460James Hogan	unsigned long flags, retval;
236006c0d8ce9441dd1363bf14f18a8e28d3588460James Hogan
246006c0d8ce9441dd1363bf14f18a8e28d3588460James Hogan	__global_lock2(flags);
256006c0d8ce9441dd1363bf14f18a8e28d3588460James Hogan	fence();
266006c0d8ce9441dd1363bf14f18a8e28d3588460James Hogan	retval = *m;
276006c0d8ce9441dd1363bf14f18a8e28d3588460James Hogan	*m = val & 0xff;
286006c0d8ce9441dd1363bf14f18a8e28d3588460James Hogan	__global_unlock2(flags);
296006c0d8ce9441dd1363bf14f18a8e28d3588460James Hogan	return retval;
306006c0d8ce9441dd1363bf14f18a8e28d3588460James Hogan}
316006c0d8ce9441dd1363bf14f18a8e28d3588460James Hogan
326006c0d8ce9441dd1363bf14f18a8e28d3588460James Hoganstatic inline unsigned long __cmpxchg_u32(volatile int *m, unsigned long old,
336006c0d8ce9441dd1363bf14f18a8e28d3588460James Hogan					  unsigned long new)
346006c0d8ce9441dd1363bf14f18a8e28d3588460James Hogan{
356006c0d8ce9441dd1363bf14f18a8e28d3588460James Hogan	__u32 retval;
366006c0d8ce9441dd1363bf14f18a8e28d3588460James Hogan	unsigned long flags;
376006c0d8ce9441dd1363bf14f18a8e28d3588460James Hogan
386006c0d8ce9441dd1363bf14f18a8e28d3588460James Hogan	__global_lock2(flags);
396006c0d8ce9441dd1363bf14f18a8e28d3588460James Hogan	retval = *m;
406006c0d8ce9441dd1363bf14f18a8e28d3588460James Hogan	if (retval == old) {
416006c0d8ce9441dd1363bf14f18a8e28d3588460James Hogan		fence();
426006c0d8ce9441dd1363bf14f18a8e28d3588460James Hogan		*m = new;
436006c0d8ce9441dd1363bf14f18a8e28d3588460James Hogan	}
446006c0d8ce9441dd1363bf14f18a8e28d3588460James Hogan	__global_unlock2(flags);
456006c0d8ce9441dd1363bf14f18a8e28d3588460James Hogan	return retval;
466006c0d8ce9441dd1363bf14f18a8e28d3588460James Hogan}
476006c0d8ce9441dd1363bf14f18a8e28d3588460James Hogan
486006c0d8ce9441dd1363bf14f18a8e28d3588460James Hogan#endif /* __ASM_METAG_CMPXCHG_LOCK1_H */
49