Skip to content

Commit

Permalink
usb: host: xhci-tegra: Enable runtime PM as late as possible
Browse files Browse the repository at this point in the history
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: Thierry Reding <treding@nvidia.com>
Link: https://lore.kernel.org/r/20191206140653.2085561-8-thierry.reding@gmail.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
  • Loading branch information
Thierry Reding authored and Greg Kroah-Hartman committed Dec 10, 2019
1 parent ecd0fbd commit 1792692
Showing 1 changed file with 17 additions and 16 deletions.
33 changes: 17 additions & 16 deletions drivers/usb/host/xhci-tegra.c
Original file line number Diff line number Diff line change
Expand Up @@ -1242,27 +1242,14 @@ static int tegra_xusb_probe(struct platform_device *pdev)
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 DMA mask accordingly.
*/
err = dma_set_mask_and_coherent(tegra->dev, DMA_BIT_MASK(40));
if (err < 0) {
dev_err(&pdev->dev, "failed to set DMA mask: %d\n", err);
goto put_rpm;
goto disable_phy;
}

err = tegra_xusb_request_firmware(tegra);
Expand All @@ -1271,16 +1258,30 @@ static int tegra_xusb_probe(struct platform_device *pdev)
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);
if (err < 0) {
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);
if (err < 0) {
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);
Expand Down

0 comments on commit 1792692

Please sign in to comment.