1#ifndef __ASM_METAG_CMPXCHG_LNKGET_H
2#define __ASM_METAG_CMPXCHG_LNKGET_H
3
4static inline unsigned long xchg_u32(volatile u32 *m, unsigned long val)
5{
6	int temp, old;
7
8	smp_mb();
9
10	asm volatile (
11		      "1:	LNKGETD %1, [%2]\n"
12		      "	LNKSETD	[%2], %3\n"
13		      "	DEFR	%0, TXSTAT\n"
14		      "	ANDT	%0, %0, #HI(0x3f000000)\n"
15		      "	CMPT	%0, #HI(0x02000000)\n"
16		      "	BNZ	1b\n"
17#ifdef CONFIG_METAG_LNKGET_AROUND_CACHE
18		      "	DCACHE	[%2], %0\n"
19#endif
20		      : "=&d" (temp), "=&d" (old)
21		      : "da" (m), "da" (val)
22		      : "cc"
23		      );
24
25	smp_mb();
26
27	return old;
28}
29
30static inline unsigned long xchg_u8(volatile u8 *m, unsigned long val)
31{
32	int temp, old;
33
34	smp_mb();
35
36	asm volatile (
37		      "1:	LNKGETD %1, [%2]\n"
38		      "	LNKSETD	[%2], %3\n"
39		      "	DEFR	%0, TXSTAT\n"
40		      "	ANDT	%0, %0, #HI(0x3f000000)\n"
41		      "	CMPT	%0, #HI(0x02000000)\n"
42		      "	BNZ	1b\n"
43#ifdef CONFIG_METAG_LNKGET_AROUND_CACHE
44		      "	DCACHE	[%2], %0\n"
45#endif
46		      : "=&d" (temp), "=&d" (old)
47		      : "da" (m), "da" (val & 0xff)
48		      : "cc"
49		      );
50
51	smp_mb();
52
53	return old;
54}
55
56static inline unsigned long __cmpxchg_u32(volatile int *m, unsigned long old,
57					  unsigned long new)
58{
59	__u32 retval, temp;
60
61	smp_mb();
62
63	asm volatile (
64		      "1:	LNKGETD	%1, [%2]\n"
65		      "	CMP	%1, %3\n"
66		      "	LNKSETDEQ [%2], %4\n"
67		      "	BNE	2f\n"
68		      "	DEFR	%0, TXSTAT\n"
69		      "	ANDT	%0, %0, #HI(0x3f000000)\n"
70		      "	CMPT	%0, #HI(0x02000000)\n"
71		      "	BNZ	1b\n"
72#ifdef CONFIG_METAG_LNKGET_AROUND_CACHE
73		      "	DCACHE	[%2], %0\n"
74#endif
75		      "2:\n"
76		      : "=&d" (temp), "=&da" (retval)
77		      : "da" (m), "bd" (old), "da" (new)
78		      : "cc"
79		      );
80
81	smp_mb();
82
83	return retval;
84}
85
86#endif /* __ASM_METAG_CMPXCHG_LNKGET_H */
87