]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - include/asm-frv/system.h
FRV: Don't make smp_{r, w, }mb() interpolate MEMBAR when CONFIG_SMP=n [try #2]
[linux-2.6-omap-h63xx.git] / include / asm-frv / system.h
index 59be5443a68f23cead7a8517f29ad2380b44bb84..30a67a9da11ae88f7754bb09512940204787ba7d 100644 (file)
@@ -14,6 +14,7 @@
 
 #include <linux/types.h>
 #include <linux/linkage.h>
+#include <linux/kernel.h>
 
 struct thread_struct;
 
@@ -178,14 +179,23 @@ do {                                                      \
 #define mb()                   asm volatile ("membar" : : :"memory")
 #define rmb()                  asm volatile ("membar" : : :"memory")
 #define wmb()                  asm volatile ("membar" : : :"memory")
-#define set_mb(var, value)     do { var = value; mb(); } while (0)
+#define read_barrier_depends() barrier()
 
-#define smp_mb()               mb()
-#define smp_rmb()              rmb()
-#define smp_wmb()              wmb()
-
-#define read_barrier_depends()         do {} while(0)
+#ifdef CONFIG_SMP
+#define smp_mb()                       mb()
+#define smp_rmb()                      rmb()
+#define smp_wmb()                      wmb()
 #define smp_read_barrier_depends()     read_barrier_depends()
+#define set_mb(var, value) \
+       do { xchg(&var, (value)); } while (0)
+#else
+#define smp_mb()                       barrier()
+#define smp_rmb()                      barrier()
+#define smp_wmb()                      barrier()
+#define smp_read_barrier_depends()     do {} while(0)
+#define set_mb(var, value) \
+       do { var = (value); barrier(); } while (0)
+#endif
 
 #define HARD_RESET_NOW()                       \
 do {                                           \
@@ -233,7 +243,7 @@ extern void free_initmem(void);
                break;                                                          \
                                                                                \
        default:                                                                \
-               __xg_orig = 0;                                                  \
+               __xg_orig = (__typeof__(__xg_orig))0;                           \
                asm volatile("break");                                          \
                break;                                                          \
        }                                                                       \
@@ -258,7 +268,7 @@ extern uint32_t __cmpxchg_32(uint32_t *v, uint32_t test, uint32_t new);
                                         (__force uint32_t)__xg_test,           \
                                         (__force uint32_t)__xg_new); break;    \
        default:                                                                \
-               __xg_orig = 0;                                                  \
+               __xg_orig = (__typeof__(__xg_orig))0;                           \
                asm volatile("break");                                          \
                break;                                                          \
        }                                                                       \
@@ -276,7 +286,7 @@ static inline unsigned long __cmpxchg_local(volatile void *ptr,
 {
        switch (size) {
        case 4:
-               return cmpxchg(ptr, old, new);
+               return cmpxchg((unsigned long *)ptr, old, new);
        default:
                return __cmpxchg_local_generic(ptr, old, new, size);
        }