]> Pileus Git - ~andy/linux/blobdiff - include/asm-generic/barrier.h
arch: Clean up asm/barrier.h implementations using asm-generic/barrier.h
[~andy/linux] / include / asm-generic / barrier.h
index 639d7a4d033bc2a0dc2413003d9209540504ebe3..d12a90f93689b54df868c529499e887c1b8f0684 100644 (file)
@@ -1,4 +1,5 @@
-/* Generic barrier definitions, based on MN10300 definitions.
+/*
+ * Generic barrier definitions, originally based on MN10300 definitions.
  *
  * It should be possible to use these on really simple architectures,
  * but it serves more as a starting point for new ports.
 
 #ifndef __ASSEMBLY__
 
-#define nop() asm volatile ("nop")
+#include <linux/compiler.h>
+
+#ifndef nop
+#define nop()  asm volatile ("nop")
+#endif
 
 /*
- * Force strict CPU ordering.
- * And yes, this is required on UP too when we're talking
- * to devices.
+ * Force strict CPU ordering. And yes, this is required on UP too when we're
+ * talking to devices.
  *
- * This implementation only contains a compiler barrier.
+ * Fall back to compiler barriers if nothing better is provided.
  */
 
-#define mb()   asm volatile ("": : :"memory")
+#ifndef mb
+#define mb()   barrier()
+#endif
+
+#ifndef rmb
 #define rmb()  mb()
-#define wmb()  asm volatile ("": : :"memory")
+#endif
+
+#ifndef wmb
+#define wmb()  mb()
+#endif
+
+#ifndef read_barrier_depends
+#define read_barrier_depends()         do { } while (0)
+#endif
 
 #ifdef CONFIG_SMP
 #define smp_mb()       mb()
 #define smp_rmb()      rmb()
 #define smp_wmb()      wmb()
+#define smp_read_barrier_depends()     read_barrier_depends()
 #else
 #define smp_mb()       barrier()
 #define smp_rmb()      barrier()
 #define smp_wmb()      barrier()
+#define smp_read_barrier_depends()     do { } while (0)
 #endif
 
-#define set_mb(var, value)  do { var = value;  mb(); } while (0)
-#define set_wmb(var, value) do { var = value; wmb(); } while (0)
-
-#define read_barrier_depends()         do {} while (0)
-#define smp_read_barrier_depends()     do {} while (0)
+#ifndef set_mb
+#define set_mb(var, value)  do { (var) = (value); mb(); } while (0)
+#endif
 
 #endif /* !__ASSEMBLY__ */
 #endif /* __ASM_GENERIC_BARRIER_H */