16a846f3f821a252762897751fa0aeb68dda635f5David Howells/*
26a846f3f821a252762897751fa0aeb68dda635f5David Howells *  Port on Texas Instruments TMS320C6x architecture
36a846f3f821a252762897751fa0aeb68dda635f5David Howells *
46a846f3f821a252762897751fa0aeb68dda635f5David Howells *  Copyright (C) 2004, 2009, 2010, 2011 Texas Instruments Incorporated
56a846f3f821a252762897751fa0aeb68dda635f5David Howells *  Author: Aurelien Jacquiot (aurelien.jacquiot@jaluna.com)
66a846f3f821a252762897751fa0aeb68dda635f5David Howells *
76a846f3f821a252762897751fa0aeb68dda635f5David Howells *  This program is free software; you can redistribute it and/or modify
86a846f3f821a252762897751fa0aeb68dda635f5David Howells *  it under the terms of the GNU General Public License version 2 as
96a846f3f821a252762897751fa0aeb68dda635f5David Howells *  published by the Free Software Foundation.
106a846f3f821a252762897751fa0aeb68dda635f5David Howells */
116a846f3f821a252762897751fa0aeb68dda635f5David Howells#ifndef _ASM_C6X_CMPXCHG_H
126a846f3f821a252762897751fa0aeb68dda635f5David Howells#define _ASM_C6X_CMPXCHG_H
136a846f3f821a252762897751fa0aeb68dda635f5David Howells
146a846f3f821a252762897751fa0aeb68dda635f5David Howells#include <linux/irqflags.h>
156a846f3f821a252762897751fa0aeb68dda635f5David Howells
166a846f3f821a252762897751fa0aeb68dda635f5David Howells/*
176a846f3f821a252762897751fa0aeb68dda635f5David Howells * Misc. functions
186a846f3f821a252762897751fa0aeb68dda635f5David Howells */
196a846f3f821a252762897751fa0aeb68dda635f5David Howellsstatic inline unsigned int __xchg(unsigned int x, volatile void *ptr, int size)
206a846f3f821a252762897751fa0aeb68dda635f5David Howells{
216a846f3f821a252762897751fa0aeb68dda635f5David Howells	unsigned int tmp;
226a846f3f821a252762897751fa0aeb68dda635f5David Howells	unsigned long flags;
236a846f3f821a252762897751fa0aeb68dda635f5David Howells
246a846f3f821a252762897751fa0aeb68dda635f5David Howells	local_irq_save(flags);
256a846f3f821a252762897751fa0aeb68dda635f5David Howells
266a846f3f821a252762897751fa0aeb68dda635f5David Howells	switch (size) {
276a846f3f821a252762897751fa0aeb68dda635f5David Howells	case 1:
286a846f3f821a252762897751fa0aeb68dda635f5David Howells		tmp = 0;
296a846f3f821a252762897751fa0aeb68dda635f5David Howells		tmp = *((unsigned char *) ptr);
306a846f3f821a252762897751fa0aeb68dda635f5David Howells		*((unsigned char *) ptr) = (unsigned char) x;
316a846f3f821a252762897751fa0aeb68dda635f5David Howells		break;
326a846f3f821a252762897751fa0aeb68dda635f5David Howells	case 2:
336a846f3f821a252762897751fa0aeb68dda635f5David Howells		tmp = 0;
346a846f3f821a252762897751fa0aeb68dda635f5David Howells		tmp = *((unsigned short *) ptr);
356a846f3f821a252762897751fa0aeb68dda635f5David Howells		*((unsigned short *) ptr) = x;
366a846f3f821a252762897751fa0aeb68dda635f5David Howells		break;
376a846f3f821a252762897751fa0aeb68dda635f5David Howells	case 4:
386a846f3f821a252762897751fa0aeb68dda635f5David Howells		tmp = 0;
396a846f3f821a252762897751fa0aeb68dda635f5David Howells		tmp = *((unsigned int *) ptr);
406a846f3f821a252762897751fa0aeb68dda635f5David Howells		*((unsigned int *) ptr) = x;
416a846f3f821a252762897751fa0aeb68dda635f5David Howells		break;
426a846f3f821a252762897751fa0aeb68dda635f5David Howells	}
436a846f3f821a252762897751fa0aeb68dda635f5David Howells	local_irq_restore(flags);
446a846f3f821a252762897751fa0aeb68dda635f5David Howells	return tmp;
456a846f3f821a252762897751fa0aeb68dda635f5David Howells}
466a846f3f821a252762897751fa0aeb68dda635f5David Howells
476a846f3f821a252762897751fa0aeb68dda635f5David Howells#define xchg(ptr, x) \
486a846f3f821a252762897751fa0aeb68dda635f5David Howells	((__typeof__(*(ptr)))__xchg((unsigned int)(x), (void *) (ptr), \
496a846f3f821a252762897751fa0aeb68dda635f5David Howells				    sizeof(*(ptr))))
506a846f3f821a252762897751fa0aeb68dda635f5David Howells#define tas(ptr)    xchg((ptr), 1)
516a846f3f821a252762897751fa0aeb68dda635f5David Howells
526a846f3f821a252762897751fa0aeb68dda635f5David Howells
536a846f3f821a252762897751fa0aeb68dda635f5David Howells#include <asm-generic/cmpxchg-local.h>
546a846f3f821a252762897751fa0aeb68dda635f5David Howells
556a846f3f821a252762897751fa0aeb68dda635f5David Howells/*
566a846f3f821a252762897751fa0aeb68dda635f5David Howells * cmpxchg_local and cmpxchg64_local are atomic wrt current CPU. Always make
576a846f3f821a252762897751fa0aeb68dda635f5David Howells * them available.
586a846f3f821a252762897751fa0aeb68dda635f5David Howells */
596a846f3f821a252762897751fa0aeb68dda635f5David Howells#define cmpxchg_local(ptr, o, n)					\
606a846f3f821a252762897751fa0aeb68dda635f5David Howells	((__typeof__(*(ptr)))__cmpxchg_local_generic((ptr),		\
616a846f3f821a252762897751fa0aeb68dda635f5David Howells						     (unsigned long)(o), \
626a846f3f821a252762897751fa0aeb68dda635f5David Howells						     (unsigned long)(n), \
636a846f3f821a252762897751fa0aeb68dda635f5David Howells						     sizeof(*(ptr))))
646a846f3f821a252762897751fa0aeb68dda635f5David Howells#define cmpxchg64_local(ptr, o, n) __cmpxchg64_local_generic((ptr), (o), (n))
656a846f3f821a252762897751fa0aeb68dda635f5David Howells
666a846f3f821a252762897751fa0aeb68dda635f5David Howells#include <asm-generic/cmpxchg.h>
676a846f3f821a252762897751fa0aeb68dda635f5David Howells
686a846f3f821a252762897751fa0aeb68dda635f5David Howells#endif /* _ASM_C6X_CMPXCHG_H */
69