#if IO_CONCAT(__IO_PREFIX,trivial_io_bw)
 extern inline unsigned int ioread8(void __iomem *addr)
 {
-       unsigned int ret = IO_CONCAT(__IO_PREFIX,ioread8)(addr);
+       unsigned int ret;
+       mb();
+       ret = IO_CONCAT(__IO_PREFIX,ioread8)(addr);
        mb();
        return ret;
 }
 
 extern inline unsigned int ioread16(void __iomem *addr)
 {
-       unsigned int ret = IO_CONCAT(__IO_PREFIX,ioread16)(addr);
+       unsigned int ret;
+       mb();
+       ret = IO_CONCAT(__IO_PREFIX,ioread16)(addr);
        mb();
        return ret;
 }
 #if IO_CONCAT(__IO_PREFIX,trivial_io_lq)
 extern inline unsigned int ioread32(void __iomem *addr)
 {
-       unsigned int ret = IO_CONCAT(__IO_PREFIX,ioread32)(addr);
+       unsigned int ret;
+       mb();
+       ret = IO_CONCAT(__IO_PREFIX,ioread32)(addr);
        mb();
        return ret;
 }
 
 extern inline u8 readb(const volatile void __iomem *addr)
 {
-       u8 ret = __raw_readb(addr);
+       u8 ret;
+       mb();
+       ret = __raw_readb(addr);
        mb();
        return ret;
 }
 
 extern inline u16 readw(const volatile void __iomem *addr)
 {
-       u16 ret = __raw_readw(addr);
+       u16 ret;
+       mb();
+       ret = __raw_readw(addr);
        mb();
        return ret;
 }
 
 extern inline u32 readl(const volatile void __iomem *addr)
 {
-       u32 ret = __raw_readl(addr);
+       u32 ret;
+       mb();
+       ret = __raw_readl(addr);
        mb();
        return ret;
 }
 
 extern inline u64 readq(const volatile void __iomem *addr)
 {
-       u64 ret = __raw_readq(addr);
+       u64 ret;
+       mb();
+       ret = __raw_readq(addr);
        mb();
        return ret;
 }
 #define outb_p         outb
 #define outw_p         outw
 #define outl_p         outl
-#define readb_relaxed(addr)    __raw_readb(addr)
-#define readw_relaxed(addr)    __raw_readw(addr)
-#define readl_relaxed(addr)    __raw_readl(addr)
-#define readq_relaxed(addr)    __raw_readq(addr)
-#define writeb_relaxed(b, addr)        __raw_writeb(b, addr)
-#define writew_relaxed(b, addr)        __raw_writew(b, addr)
-#define writel_relaxed(b, addr)        __raw_writel(b, addr)
-#define writeq_relaxed(b, addr)        __raw_writeq(b, addr)
+
+extern u8 readb_relaxed(const volatile void __iomem *addr);
+extern u16 readw_relaxed(const volatile void __iomem *addr);
+extern u32 readl_relaxed(const volatile void __iomem *addr);
+extern u64 readq_relaxed(const volatile void __iomem *addr);
+
+#if IO_CONCAT(__IO_PREFIX,trivial_io_bw)
+extern inline u8 readb_relaxed(const volatile void __iomem *addr)
+{
+       mb();
+       return __raw_readb(addr);
+}
+
+extern inline u16 readw_relaxed(const volatile void __iomem *addr)
+{
+       mb();
+       return __raw_readw(addr);
+}
+#endif
+
+#if IO_CONCAT(__IO_PREFIX,trivial_io_lq)
+extern inline u32 readl_relaxed(const volatile void __iomem *addr)
+{
+       mb();
+       return __raw_readl(addr);
+}
+
+extern inline u64 readq_relaxed(const volatile void __iomem *addr)
+{
+       mb();
+       return __raw_readq(addr);
+}
+#endif
+
+#define writeb_relaxed writeb
+#define writew_relaxed writew
+#define writel_relaxed writel
+#define writeq_relaxed writeq
 
 /*
  * String version of IO memory access ops:
 
 unsigned int
 ioread8(void __iomem *addr)
 {
-       unsigned int ret = IO_CONCAT(__IO_PREFIX,ioread8)(addr);
+       unsigned int ret;
+       mb();
+       ret = IO_CONCAT(__IO_PREFIX,ioread8)(addr);
        mb();
        return ret;
 }
 
 unsigned int ioread16(void __iomem *addr)
 {
-       unsigned int ret = IO_CONCAT(__IO_PREFIX,ioread16)(addr);
+       unsigned int ret;
+       mb();
+       ret = IO_CONCAT(__IO_PREFIX,ioread16)(addr);
        mb();
        return ret;
 }
 
 unsigned int ioread32(void __iomem *addr)
 {
-       unsigned int ret = IO_CONCAT(__IO_PREFIX,ioread32)(addr);
+       unsigned int ret;
+       mb();
+       ret = IO_CONCAT(__IO_PREFIX,ioread32)(addr);
        mb();
        return ret;
 }
 
 u8 readb(const volatile void __iomem *addr)
 {
-       u8 ret = __raw_readb(addr);
+       u8 ret;
+       mb();
+       ret = __raw_readb(addr);
        mb();
        return ret;
 }
 
 u16 readw(const volatile void __iomem *addr)
 {
-       u16 ret = __raw_readw(addr);
+       u16 ret;
+       mb();
+       ret = __raw_readw(addr);
        mb();
        return ret;
 }
 
 u32 readl(const volatile void __iomem *addr)
 {
-       u32 ret = __raw_readl(addr);
+       u32 ret;
+       mb();
+       ret = __raw_readl(addr);
        mb();
        return ret;
 }
 
 u64 readq(const volatile void __iomem *addr)
 {
-       u64 ret = __raw_readq(addr);
+       u64 ret;
+       mb();
+       ret = __raw_readq(addr);
        mb();
        return ret;
 }
 EXPORT_SYMBOL(writel);
 EXPORT_SYMBOL(writeq);
 
+/*
+ * The _relaxed functions must be ordered w.r.t. each other, but they don't
+ * have to be ordered w.r.t. other memory accesses.
+ */
+u8 readb_relaxed(const volatile void __iomem *addr)
+{
+       mb();
+       return __raw_readb(addr);
+}
+
+u16 readw_relaxed(const volatile void __iomem *addr)
+{
+       mb();
+       return __raw_readw(addr);
+}
+
+u32 readl_relaxed(const volatile void __iomem *addr)
+{
+       mb();
+       return __raw_readl(addr);
+}
+
+u64 readq_relaxed(const volatile void __iomem *addr)
+{
+       mb();
+       return __raw_readq(addr);
+}
+
+EXPORT_SYMBOL(readb_relaxed);
+EXPORT_SYMBOL(readw_relaxed);
+EXPORT_SYMBOL(readl_relaxed);
+EXPORT_SYMBOL(readq_relaxed);
 
 /*
  * Read COUNT 8-bit bytes from port PORT into memory starting at SRC.