summaryrefslogtreecommitdiff
path: root/drivers/usb
diff options
context:
space:
mode:
authorAlexey Brodkin <Alexey.Brodkin@synopsys.com>2017-11-17 16:26:30 +0300
committerMarek Vasut <marek.vasut+renesas@gmail.com>2017-11-26 02:22:36 +0100
commit9829ce2ff25c659ca29cd15ab773312ac4b6cfc6 (patch)
tree13b6a6f21985b9c1b28c42e00aa87123193a4a6f /drivers/usb
parentabd7cedb19ab7979467734b3933a39879bd8935a (diff)
usb: ehci: Fix accessors for big-endian platforms and descriptors
Commit 9000eddbae0d ("drivers/usb/ehci: Use platform-specific accessors") broke USB 2.0 on big-endian platforms because for them writel/readl() does automatic conversion of BE data to LE. Proper implementation requires to use "raw" variant of these accessors which read/write data without messing with endianess. While at it replace cpu_to_be32() to be32_to_cpu() in readl() to keep sane semantics. Signed-off-by: Alexey Brodkin <abrodkin@synopsys.com> Cc: Marek Vasut <marex@denx.de> Reported-by: Vladimir Boroda <boroda@yahoo.com>
Diffstat (limited to 'drivers/usb')
-rw-r--r--drivers/usb/host/ehci.h8
1 files changed, 4 insertions, 4 deletions
diff --git a/drivers/usb/host/ehci.h b/drivers/usb/host/ehci.h
index 7c39becd24..18692b732e 100644
--- a/drivers/usb/host/ehci.h
+++ b/drivers/usb/host/ehci.h
@@ -101,11 +101,11 @@ struct usb_linux_config_descriptor {
} __attribute__ ((packed));
#if defined CONFIG_EHCI_DESC_BIG_ENDIAN
-#define ehci_readl(x) cpu_to_be32(readl(x))
-#define ehci_writel(a, b) writel(cpu_to_be32(b), a)
+#define ehci_readl(x) be32_to_cpu(__raw_readl(x))
+#define ehci_writel(a, b) __raw_writel(cpu_to_be32(b), a)
#else
-#define ehci_readl(x) cpu_to_le32(readl(x))
-#define ehci_writel(a, b) writel(cpu_to_le32(b), a)
+#define ehci_readl(x) readl(x)
+#define ehci_writel(a, b) writel(b, a)
#endif
#if defined CONFIG_EHCI_MMIO_BIG_ENDIAN