summaryrefslogtreecommitdiff
path: root/arch/arm/include/asm/io.h
diff options
context:
space:
mode:
authorWolfgang Denk <wd@denx.de>2011-02-02 21:57:19 +0100
committerWolfgang Denk <wd@denx.de>2011-02-02 21:57:19 +0100
commitbe9db564de898240034151c48cf9e0d03ece3f35 (patch)
treef87b02a573c61fdab3f190de09e6b0c8061f446b /arch/arm/include/asm/io.h
parent89ffa8dbb5bd0552f5f3399f4430a4c97f4d50d4 (diff)
parent9e40808c3fe0237a8d49f10394d3a8e4e29540a6 (diff)
downloadolio-uboot-2014.01-be9db564de898240034151c48cf9e0d03ece3f35.tar.xz
olio-uboot-2014.01-be9db564de898240034151c48cf9e0d03ece3f35.zip
Merge branch 'master' of /home/wd/git/u-boot/custodians
Diffstat (limited to 'arch/arm/include/asm/io.h')
-rw-r--r--arch/arm/include/asm/io.h32
1 files changed, 20 insertions, 12 deletions
diff --git a/arch/arm/include/asm/io.h b/arch/arm/include/asm/io.h
index ff1518eb0..3886f1589 100644
--- a/arch/arm/include/asm/io.h
+++ b/arch/arm/include/asm/io.h
@@ -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) ({ __iowmb(); __arch_putb(v,c); v; })
+#define writew(v,c) ({ __iowmb(); __arch_putw(v,c); v; })
+#define writel(v,c) ({ __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