Commit 17926924 authored by Thierry Reding's avatar Thierry Reding Committed by Greg Kroah-Hartman

usb: host: xhci-tegra: Enable runtime PM as late as possible

A number of things can currently go wrong after the XUSB controller has
been enabled, which means that it might need to be disabled again before
it has ever been used.

Avoid this by delaying runtime PM enablement until it's really required
right before registers are accessed for the first time.
Signed-off-by: default avatarThierry Reding <treding@nvidia.com>
Link: https://lore.kernel.org/r/20191206140653.2085561-8-thierry.reding@gmail.comSigned-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent ecd0fbd1
...@@ -1242,19 +1242,6 @@ static int tegra_xusb_probe(struct platform_device *pdev) ...@@ -1242,19 +1242,6 @@ static int tegra_xusb_probe(struct platform_device *pdev)
goto put_hcd; goto put_hcd;
} }
pm_runtime_enable(&pdev->dev);
if (pm_runtime_enabled(&pdev->dev))
err = pm_runtime_get_sync(&pdev->dev);
else
err = tegra_xusb_runtime_resume(&pdev->dev);
if (err < 0) {
dev_err(&pdev->dev, "failed to enable device: %d\n", err);
goto disable_phy;
}
tegra_xusb_config(tegra);
/* /*
* The XUSB Falcon microcontroller can only address 40 bits, so set * The XUSB Falcon microcontroller can only address 40 bits, so set
* the DMA mask accordingly. * the DMA mask accordingly.
...@@ -1262,7 +1249,7 @@ static int tegra_xusb_probe(struct platform_device *pdev) ...@@ -1262,7 +1249,7 @@ static int tegra_xusb_probe(struct platform_device *pdev)
err = dma_set_mask_and_coherent(tegra->dev, DMA_BIT_MASK(40)); err = dma_set_mask_and_coherent(tegra->dev, DMA_BIT_MASK(40));
if (err < 0) { if (err < 0) {
dev_err(&pdev->dev, "failed to set DMA mask: %d\n", err); dev_err(&pdev->dev, "failed to set DMA mask: %d\n", err);
goto put_rpm; goto disable_phy;
} }
err = tegra_xusb_request_firmware(tegra); err = tegra_xusb_request_firmware(tegra);
...@@ -1271,16 +1258,30 @@ static int tegra_xusb_probe(struct platform_device *pdev) ...@@ -1271,16 +1258,30 @@ static int tegra_xusb_probe(struct platform_device *pdev)
goto disable_phy; goto disable_phy;
} }
pm_runtime_enable(&pdev->dev);
if (!pm_runtime_enabled(&pdev->dev))
err = tegra_xusb_runtime_resume(&pdev->dev);
else
err = pm_runtime_get_sync(&pdev->dev);
if (err < 0) {
dev_err(&pdev->dev, "failed to enable device: %d\n", err);
goto free_firmware;
}
tegra_xusb_config(tegra);
err = tegra_xusb_load_firmware(tegra); err = tegra_xusb_load_firmware(tegra);
if (err < 0) { if (err < 0) {
dev_err(&pdev->dev, "failed to load firmware: %d\n", err); dev_err(&pdev->dev, "failed to load firmware: %d\n", err);
goto free_firmware; goto put_rpm;
} }
err = usb_add_hcd(tegra->hcd, tegra->xhci_irq, IRQF_SHARED); err = usb_add_hcd(tegra->hcd, tegra->xhci_irq, IRQF_SHARED);
if (err < 0) { if (err < 0) {
dev_err(&pdev->dev, "failed to add USB HCD: %d\n", err); dev_err(&pdev->dev, "failed to add USB HCD: %d\n", err);
goto free_firmware; goto put_rpm;
} }
device_wakeup_enable(tegra->hcd->self.controller); device_wakeup_enable(tegra->hcd->self.controller);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment