|
|
@@ -1,61 +0,0 @@
|
|
|
-From 1e7e4fb66489cc84366656ca5318f1cb61afd4ba Mon Sep 17 00:00:00 2001
|
|
|
-From: Maxime Ripard <[email protected]>
|
|
|
-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 <[email protected]>
|
|
|
-Cc: <[email protected]> # v3.16+
|
|
|
-Signed-off-by: Mathias Nyman <[email protected]>
|
|
|
-Signed-off-by: Greg Kroah-Hartman <[email protected]>
|
|
|
-
|
|
|
---- 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;
|