UPSTREAM: usb: ehci: Fix accessors for big-endian platforms and descriptors
Commit 9000eddbae ("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.
Change-Id: I35e193f08aa56967c831bce1b2892e2c51527796
Signed-off-by: Alexey Brodkin <abrodkin@synopsys.com>
Cc: Marek Vasut <marex@denx.de>
Reported-by: Vladimir Boroda <boroda@yahoo.com>
Signed-off-by: Kever Yang <kever.yang@rock-chips.com>
(cherry picked from commit 9829ce2ff25c659ca29cd15ab773312ac4b6cfc6)
This commit is contained in:
parent
1c7b1b4b19
commit
02b25dcd4f
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in New Issue