diff options
Diffstat (limited to 'target/linux/mvebu/patches-3.18')
-rw-r--r-- | target/linux/mvebu/patches-3.18/210-xhci_move_marvell_quirks.patch | 61 |
1 files changed, 61 insertions, 0 deletions
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; |