]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - include/asm-avr32/atomic.h
Consolidate of_get_parent
[karo-tx-linux.git] / include / asm-avr32 / atomic.h
index e0b9c44c126ce19519b67a8a074686f3a31e4cd7..7ef3862a73d02443d95eaf6520ff45417f3f00d5 100644 (file)
@@ -41,7 +41,7 @@ static inline int atomic_sub_return(int i, atomic_t *v)
                "       stcond  %1, %0\n"
                "       brne    1b"
                : "=&r"(result), "=o"(v->counter)
-               : "m"(v->counter), "ir"(i)
+               : "m"(v->counter), "rKs21"(i)
                : "cc");
 
        return result;
@@ -58,7 +58,7 @@ static inline int atomic_add_return(int i, atomic_t *v)
 {
        int result;
 
-       if (__builtin_constant_p(i))
+       if (__builtin_constant_p(i) && (i >= -1048575) && (i <= 1048576))
                result = atomic_sub_return(-i, v);
        else
                asm volatile(
@@ -101,7 +101,7 @@ static inline int atomic_sub_unless(atomic_t *v, int a, int u)
                "       mov     %1, 1\n"
                "1:"
                : "=&r"(tmp), "=&r"(result), "=o"(v->counter)
-               : "m"(v->counter), "ir"(a), "ir"(u)
+               : "m"(v->counter), "rKs21"(a), "rKs21"(u), "1"(result)
                : "cc", "memory");
 
        return result;
@@ -121,7 +121,7 @@ static inline int atomic_add_unless(atomic_t *v, int a, int u)
 {
        int tmp, result;
 
-       if (__builtin_constant_p(a))
+       if (__builtin_constant_p(a) && (a >= -1048575) && (a <= 1048576))
                result = atomic_sub_unless(v, -a, u);
        else {
                result = 0;
@@ -137,7 +137,7 @@ static inline int atomic_add_unless(atomic_t *v, int a, int u)
                        "       mov     %1, 1\n"
                        "1:"
                        : "=&r"(tmp), "=&r"(result), "=o"(v->counter)
-                       : "m"(v->counter), "r"(a), "ir"(u)
+                       : "m"(v->counter), "r"(a), "ir"(u), "1"(result)
                        : "cc", "memory");
        }
 
@@ -173,7 +173,7 @@ static inline int atomic_sub_if_positive(int i, atomic_t *v)
 }
 
 #define atomic_xchg(v, new)    (xchg(&((v)->counter), new))
-#define atomic_cmpxchg(v, o, n)        ((int)cmpxchg(&((v)->counter), (o), (n)))
+#define atomic_cmpxchg(v, o, n)        (cmpxchg(&((v)->counter), (o), (n)))
 
 #define atomic_sub(i, v)       (void)atomic_sub_return(i, v)
 #define atomic_add(i, v)       (void)atomic_add_return(i, v)