aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorImre Kaloz <kaloz@openwrt.org>2015-03-26 14:32:45 +0000
committerImre Kaloz <kaloz@openwrt.org>2015-03-26 14:32:45 +0000
commitf6eff33b8dd6755c503f7745ef0b10f6d07f4999 (patch)
tree54c4da07d01df84a4827c1d7a7d579293d12c409
parent4bac1253c1da052fb9716e268b5fa2fc31952183 (diff)
downloadupstream-f6eff33b8dd6755c503f7745ef0b10f6d07f4999.tar.gz
upstream-f6eff33b8dd6755c503f7745ef0b10f6d07f4999.tar.bz2
upstream-f6eff33b8dd6755c503f7745ef0b10f6d07f4999.zip
mvebu: fixup usb3 support on the a38x
Signed-off-by: Imre Kaloz <kaloz@openwrt.org> SVN-Revision: 45026
-rw-r--r--package/kernel/linux/modules/usb.mk1
-rw-r--r--target/linux/mvebu/patches-3.18/210-xhci_move_marvell_quirks.patch61
2 files changed, 62 insertions, 0 deletions
diff --git a/package/kernel/linux/modules/usb.mk b/package/kernel/linux/modules/usb.mk
index be1553a508..7a63829a75 100644
--- a/package/kernel/linux/modules/usb.mk
+++ b/package/kernel/linux/modules/usb.mk
@@ -1480,6 +1480,7 @@ define KernelPackage/usb3
CONFIG_USB_XHCI_HCD \
CONFIG_USB_XHCI_PCI \
CONFIG_USB_XHCI_PLATFORM \
+ CONFIG_USB_XHCI_MVEBU=y \
CONFIG_USB_XHCI_HCD_DEBUGGING=n
FILES:= \
$(XHCI_FILES)
diff --git a/target/linux/mvebu/patches-3.18/210-xhci_move_marvell_quirks.patch b/target/linux/mvebu/patches-3.18/210-xhci_move_marvell_quirks.patch
new file mode 100644
index 0000000000..2296900e31
--- /dev/null
+++ b/target/linux/mvebu/patches-3.18/210-xhci_move_marvell_quirks.patch
@@ -0,0 +1,61 @@
+From 1e7e4fb66489cc84366656ca5318f1cb61afd4ba Mon Sep 17 00:00:00 2001
+From: Maxime Ripard <maxime.ripard@free-electrons.com>
+Date: Tue, 24 Feb 2015 18:27:00 +0200
+Subject: usb: XHCI: platform: Move the Marvell quirks after the enabling the
+ clocks
+
+The commit 973747928514 ("usb: host: xhci-plat: add support for the Armada
+375/38x XHCI controllers") extended the xhci-plat driver to support the Armada
+375/38x SoCs, mostly by adding a quirk configuring the MBUS window.
+
+However, that quirk was run before the clock the controllers needs has been
+enabled. This usually worked because the clock was first enabled by the
+bootloader, and left as such until the driver is probe, where it tries to
+access the MBUS configuration registers before enabling the clock.
+
+Things get messy when EPROBE_DEFER is involved during the probe, since as part
+of its error path, the driver will rightfully disable the clock. When the
+driver will be reprobed, it will retry to access the MBUS registers, but this
+time with the clock disabled, which hangs forever.
+
+Fix this by running the quirks after the clock has been enabled by the driver.
+
+Signed-off-by: Maxime Ripard <maxime.ripard@free-electrons.com>
+Cc: <stable@vger.kernel.org> # v3.16+
+Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+--- a/drivers/usb/host/xhci-plat.c
++++ b/drivers/usb/host/xhci-plat.c
+@@ -87,15 +87,6 @@ static int xhci_plat_probe(struct platfo
+ if (!res)
+ return -ENODEV;
+
+- if (of_device_is_compatible(pdev->dev.of_node,
+- "marvell,armada-375-xhci") ||
+- of_device_is_compatible(pdev->dev.of_node,
+- "marvell,armada-380-xhci")) {
+- ret = xhci_mvebu_mbus_init_quirk(pdev);
+- if (ret)
+- return ret;
+- }
+-
+ /* Initialize dma_mask and coherent_dma_mask to 32-bits */
+ ret = dma_set_coherent_mask(&pdev->dev, DMA_BIT_MASK(32));
+ if (ret)
+@@ -129,6 +120,15 @@ static int xhci_plat_probe(struct platfo
+ goto put_hcd;
+ }
+
++ if (of_device_is_compatible(pdev->dev.of_node,
++ "marvell,armada-375-xhci") ||
++ of_device_is_compatible(pdev->dev.of_node,
++ "marvell,armada-380-xhci")) {
++ ret = xhci_mvebu_mbus_init_quirk(pdev);
++ if (ret)
++ return ret;
++ }
++
+ ret = usb_add_hcd(hcd, irq, IRQF_SHARED);
+ if (ret)
+ goto disable_clk;