Currently io{read,write}{16,32} expand to *addr = cpu_to_leXX(cpu_to_beXX(val)) and val = beXX_to_cpu(leXX_to_cpu(*addr)) While it should rather be: *addr = cpu_to_be{16,32}(val) and val = be{16,32}_to_cpu(*addr) The current implementation works on litte-endian targets(where cpu_to_leXX is a noop), but breaks on on big-endian targets, this patch fixes it. Signed-off-by: Lars-Peter Clausen <lars@xxxxxxxxxx> --- include/asm-generic/io.h | 8 ++++---- 1 files changed, 4 insertions(+), 4 deletions(-) diff --git a/include/asm-generic/io.h b/include/asm-generic/io.h index 4644c9a..5d93735 100644 --- a/include/asm-generic/io.h +++ b/include/asm-generic/io.h @@ -244,15 +244,15 @@ static inline void writesb(const void __iomem *addr, const void *buf, int len) #ifndef CONFIG_GENERIC_IOMAP #define ioread8(addr) readb(addr) #define ioread16(addr) readw(addr) -#define ioread16be(addr) be16_to_cpu(ioread16(addr)) +#define ioread16be(addr) be16_to_cpu(__raw_readw(addr)) #define ioread32(addr) readl(addr) -#define ioread32be(addr) be32_to_cpu(ioread32(addr)) +#define ioread32be(addr) be32_to_cpu(__raw_readl(addr)) #define iowrite8(v, addr) writeb((v), (addr)) #define iowrite16(v, addr) writew((v), (addr)) -#define iowrite16be(v, addr) iowrite16(be16_to_cpu(v), (addr)) +#define iowrite16be(v, addr) __raw_writew(be16_to_cpu(v), (addr)) #define iowrite32(v, addr) writel((v), (addr)) -#define iowrite32be(v, addr) iowrite32(be32_to_cpu(v), (addr)) +#define iowrite32be(v, addr) __raw_writel(be32_to_cpu(v), (addr)) #define ioread8_rep(p, dst, count) \ insb((unsigned long) (p), (dst), (count)) -- 1.7.2.3 -- To unsubscribe from this list: send the line "unsubscribe linux-arch" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html