[U-Boot] [PATCH 3/3] nds32: asm/io.h: add __iormb and __iowmb support

Macpaul Lin macpaul at andestech.com
Mon Oct 24 11:46:33 CEST 2011


This patch add required __iormb and __iowmb to io.h.
This also fix some misbehavior to periphal drivers.

This io.h has been fixed with referencing arm/include/asm/io.h.

Signed-off-by: Macpaul Lin <macpaul at andestech.com>
---
 arch/nds32/include/asm/io.h |   20 ++++++++++++++------
 1 files changed, 14 insertions(+), 6 deletions(-)

diff --git a/arch/nds32/include/asm/io.h b/arch/nds32/include/asm/io.h
index 2504c2b..a221a4d 100644
--- a/arch/nds32/include/asm/io.h
+++ b/arch/nds32/include/asm/io.h
@@ -98,13 +98,21 @@ extern void __raw_readsl(unsigned int addr, void *data, int longlen);
 #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
-- 
1.7.3.5



More information about the U-Boot mailing list