Merge tag 'v3.10.102' into update
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / arch / metag / include / asm / cmpxchg_lnkget.h
1 #ifndef __ASM_METAG_CMPXCHG_LNKGET_H
2 #define __ASM_METAG_CMPXCHG_LNKGET_H
3
4 static 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
30 static 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
56 static 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 */