From f6eff33b8dd6755c503f7745ef0b10f6d07f4999 Mon Sep 17 00:00:00 2001 From: Imre Kaloz Date: Thu, 26 Mar 2015 14:32:45 +0000 Subject: [PATCH] mvebu: fixup usb3 support on the a38x Signed-off-by: Imre Kaloz SVN-Revision: 45026 --- package/kernel/linux/modules/usb.mk | 1 + .../210-xhci_move_marvell_quirks.patch | 61 +++++++++++++++++++ 2 files changed, 62 insertions(+) create mode 100644 target/linux/mvebu/patches-3.18/210-xhci_move_marvell_quirks.patch diff --git a/package/kernel/linux/modules/usb.mk b/package/kernel/linux/modules/usb.mk index be1553a508f7..7a63829a758b 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 000000000000..2296900e3181 --- /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 +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 +Cc: # v3.16+ +Signed-off-by: Mathias Nyman +Signed-off-by: Greg Kroah-Hartman + +--- 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; -- 2.30.2