From: Arnaud Patard <arnaud.patard@rtp-net.org>
Subject: ixp4xx: add io{read,write}{16,32}be functions
Date: 2011-11-13 19:27:56 +0000
Forwarded: http://thread.gmane.org/gmane.linux.ports.arm.kernel/142249

Some driver are now requiring some be io functions, add noted in
commit (06901bd83412db5a31de7526e637101ed0c2c472). Otherwise, it may lead
to build errors like this one :

drivers/net/mlx4/en_tx.c: In function ‘mlx4_en_xmit’:
drivers/net/mlx4/en_tx.c:815: error: implicit declaration of function ‘iowrite32be’
make[3]: *** [drivers/net/mlx4/en_tx.o] Error 1
make[2]: *** [drivers/net/mlx4] Error 2
make[1]: *** [drivers/net] Error 2

Signed-off-by: Arnaud Patard <arnaud.patard@rtp-net.org>

Index: linux-3.1/arch/arm/mach-ixp4xx/include/mach/io.h
===================================================================
--- linux-3.1.orig/arch/arm/mach-ixp4xx/include/mach/io.h	2011-11-13 14:14:50.662853902 +0100
+++ linux-3.1/arch/arm/mach-ixp4xx/include/mach/io.h	2011-11-13 14:19:38.522841236 +0100
@@ -387,6 +387,20 @@ static inline unsigned int ioread16(cons
 #endif
 }
 
+#define	ioread16be(p)			ioread16be(p)
+static inline unsigned int ioread16be(const void __iomem *addr)
+{
+	unsigned long port = (unsigned long __force)addr;
+	if (__is_io_address(port))
+		return	(unsigned int)inw(port & PIO_MASK);
+	else
+#ifndef CONFIG_IXP4XX_INDIRECT_PCI
+		return be16_to_cpu((__force __be16)__raw_readw(addr));
+#else
+		return be16_to_cpu((__force __le16)(unsigned int)__indirect_readw(addr));
+#endif
+}
+
 #define	ioread16_rep(p, v, c)		ioread16_rep(p, v, c)
 static inline void ioread16_rep(const void __iomem *addr, void *vaddr,
 				u32 count)
@@ -417,6 +431,21 @@ static inline unsigned int ioread32(cons
 	}
 }
 
+#define	ioread32be(p)			ioread32be(p)
+static inline unsigned int ioread32be(const void __iomem *addr)
+{
+	unsigned long port = (unsigned long __force)addr;
+	if (__is_io_address(port))
+		return	(unsigned int)inl(port & PIO_MASK);
+	else {
+#ifndef CONFIG_IXP4XX_INDIRECT_PCI
+		return be32_to_cpu((__force __be32)__raw_readl(addr));
+#else
+		return be32_to_cpu((__force __be32)(unsigned int)__indirect_readl(addr));
+#endif
+	}
+}
+
 #define	ioread32_rep(p, v, c)		ioread32_rep(p, v, c)
 static inline void ioread32_rep(const void __iomem *addr, void *vaddr,
 				u32 count)
@@ -475,6 +504,20 @@ static inline void iowrite16(u16 value,
 #endif
 }
 
+#define	iowrite16be(v, p)			iowrite16be(v, p)
+static inline void iowrite16be(u16 value, void __iomem *addr)
+{
+	unsigned long port = (unsigned long __force)addr;
+	if (__is_io_address(port))
+		outw(value, port & PIO_MASK);
+	else
+#ifndef CONFIG_IXP4XX_INDIRECT_PCI
+		__raw_writew(cpu_to_be16(value), addr);
+#else
+		__indirect_writew(cpu_to_be16(value), addr);
+#endif
+}
+
 #define	iowrite16_rep(p, v, c)		iowrite16_rep(p, v, c)
 static inline void iowrite16_rep(void __iomem *addr, const void *vaddr,
 				 u32 count)
@@ -504,6 +547,20 @@ static inline void iowrite32(u32 value,
 #endif
 }
 
+#define	iowrite32be(v, p)			iowrite32be(v, p)
+static inline void iowrite32be(u32 value, void __iomem *addr)
+{
+	unsigned long port = (unsigned long __force)addr;
+	if (__is_io_address(port))
+		outl(value, port & PIO_MASK);
+	else
+#ifndef CONFIG_IXP4XX_INDIRECT_PCI
+		__raw_writel((u32 __force)cpu_to_be32(value), addr);
+#else
+		__indirect_writel((u32 __force)cpu_to_be32(value), addr);
+#endif
+}
+
 #define	iowrite32_rep(p, v, c)		iowrite32_rep(p, v, c)
 static inline void iowrite32_rep(void __iomem *addr, const void *vaddr,
 				 u32 count)
