]> git.sur5r.net Git - u-boot/blobdiff - arch/arm/include/asm/io.h
Merge branch 'master' of git://git.denx.de/u-boot-nios
[u-boot] / arch / arm / include / asm / io.h
index ff1518eb0d1121e23927df7a237d16a37e33861a..1fbc531a084cc393142d9668f74009a8ffa25f80 100644 (file)
@@ -117,21 +117,29 @@ extern inline void __raw_readsl(unsigned int addr, void *data, int longlen)
                *buf++ = __arch_getl(addr);
 }
 
-#define __raw_writeb(v,a)              __arch_putb(v,a)
-#define __raw_writew(v,a)              __arch_putw(v,a)
-#define __raw_writel(v,a)              __arch_putl(v,a)
+#define __raw_writeb(v,a)      __arch_putb(v,a)
+#define __raw_writew(v,a)      __arch_putw(v,a)
+#define __raw_writel(v,a)      __arch_putl(v,a)
 
-#define __raw_readb(a)                 __arch_getb(a)
-#define __raw_readw(a)                 __arch_getw(a)
-#define __raw_readl(a)                 __arch_getl(a)
+#define __raw_readb(a)         __arch_getb(a)
+#define __raw_readw(a)         __arch_getw(a)
+#define __raw_readl(a)         __arch_getl(a)
 
-#define writeb(v,a)                    __arch_putb(v,a)
-#define writew(v,a)                    __arch_putw(v,a)
-#define writel(v,a)                    __arch_putl(v,a)
+/*
+ * TODO: The kernel offers some more advanced versions of barriers, it might
+ * have some advantages to use them instead of the simple one here.
+ */
+#define dmb()          __asm__ __volatile__ ("" : : : "memory")
+#define __iormb()      dmb()
+#define __iowmb()      dmb()
+
+#define writeb(v,c)    ({ u8  __v = v; __iowmb(); __arch_putb(__v,c); __v; })
+#define writew(v,c)    ({ u16 __v = v; __iowmb(); __arch_putw(__v,c); __v; })
+#define writel(v,c)    ({ u32 __v = v; __iowmb(); __arch_putl(__v,c); __v; })
 
-#define readb(a)                       __arch_getb(a)
-#define readw(a)                       __arch_getw(a)
-#define readl(a)                       __arch_getl(a)
+#define readb(c)       ({ u8  __v = __arch_getb(c); __iormb(); __v; })
+#define readw(c)       ({ u16 __v = __arch_getw(c); __iormb(); __v; })
+#define readl(c)       ({ u32 __v = __arch_getl(c); __iormb(); __v; })
 
 /*
  * The compiler seems to be incapable of optimising constants