| 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 |
| |
| From: Maxime Ripard <maxime.ripard@free-electrons.com> |
| |
| commit 1e7e4fb66489cc84366656ca5318f1cb61afd4ba upstream. |
| |
| 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> |
| Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/usb/host/xhci-plat.c | 19 +++++++++---------- |
| 1 file changed, 9 insertions(+), 10 deletions(-) |
| |
| --- a/drivers/usb/host/xhci-plat.c |
| +++ b/drivers/usb/host/xhci-plat.c |
| @@ -83,16 +83,6 @@ static int xhci_plat_probe(struct platfo |
| if (irq < 0) |
| 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) |
| @@ -127,6 +117,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) |
| + goto disable_clk; |
| + } |
| + |
| ret = usb_add_hcd(hcd, irq, IRQF_SHARED); |
| if (ret) |
| goto disable_clk; |