Skip to content

Commit

Permalink
usb: dwc3: core: only reset res->start in case of error
Browse files Browse the repository at this point in the history
That trick is only needed if we end up with an error, so
there's no point in messing that outside of an error path.

In fact doing so causes problems when removing dwc3.ko,
problems which commit c5a1fbc (usb: dwc3: dwc3-omap: Fix
the crash on module removal) mistakenly tried to fix.

Signed-off-by: Felipe Balbi <balbi@ti.com>
  • Loading branch information
Felipe Balbi committed Mar 9, 2015
1 parent 31a0ede commit 3da1f6e
Showing 1 changed file with 34 additions and 22 deletions.
56 changes: 34 additions & 22 deletions drivers/usb/dwc3/core.c
Original file line number Diff line number Diff line change
Expand Up @@ -774,17 +774,13 @@ static int dwc3_probe(struct platform_device *pdev)
* since it will be requested by the xhci-plat driver.
*/
regs = devm_ioremap_resource(dev, res);
if (IS_ERR(regs))
return PTR_ERR(regs);
if (IS_ERR(regs)) {
ret = PTR_ERR(regs);
goto err0;
}

dwc->regs = regs;
dwc->regs_size = resource_size(res);
/*
* restore res->start back to its original value so that,
* in case the probe is deferred, we don't end up getting error in
* request the memory region the next time probe is called.
*/
res->start -= DWC3_GLOBALS_REGS_START;

/* default to highest possible threshold */
lpm_nyet_threshold = 0xff;
Expand Down Expand Up @@ -878,7 +874,7 @@ static int dwc3_probe(struct platform_device *pdev)

ret = dwc3_core_get_phy(dwc);
if (ret)
return ret;
goto err0;

spin_lock_init(&dwc->lock);
platform_set_drvdata(pdev, dwc);
Expand All @@ -899,7 +895,7 @@ static int dwc3_probe(struct platform_device *pdev)
if (ret) {
dev_err(dwc->dev, "failed to allocate event buffers\n");
ret = -ENOMEM;
goto err0;
goto err1;
}

if (IS_ENABLED(CONFIG_USB_DWC3_HOST))
Expand All @@ -913,65 +909,81 @@ static int dwc3_probe(struct platform_device *pdev)
ret = dwc3_core_init(dwc);
if (ret) {
dev_err(dev, "failed to initialize core\n");
goto err0;
goto err1;
}

usb_phy_set_suspend(dwc->usb2_phy, 0);
usb_phy_set_suspend(dwc->usb3_phy, 0);
ret = phy_power_on(dwc->usb2_generic_phy);
if (ret < 0)
goto err1;
goto err2;

ret = phy_power_on(dwc->usb3_generic_phy);
if (ret < 0)
goto err_usb2phy_power;
goto err3;

ret = dwc3_event_buffers_setup(dwc);
if (ret) {
dev_err(dwc->dev, "failed to setup event buffers\n");
goto err_usb3phy_power;
goto err4;
}

ret = dwc3_core_init_mode(dwc);
if (ret)
goto err2;
goto err5;

ret = dwc3_debugfs_init(dwc);
if (ret) {
dev_err(dev, "failed to initialize debugfs\n");
goto err3;
goto err6;
}

pm_runtime_allow(dev);

return 0;

err3:
err6:
dwc3_core_exit_mode(dwc);

err2:
err5:
dwc3_event_buffers_cleanup(dwc);

err_usb3phy_power:
err4:
phy_power_off(dwc->usb3_generic_phy);

err_usb2phy_power:
err3:
phy_power_off(dwc->usb2_generic_phy);

err1:
err2:
usb_phy_set_suspend(dwc->usb2_phy, 1);
usb_phy_set_suspend(dwc->usb3_phy, 1);
dwc3_core_exit(dwc);

err0:
err1:
dwc3_free_event_buffers(dwc);

err0:
/*
* restore res->start back to its original value so that, in case the
* probe is deferred, we don't end up getting error in request the
* memory region the next time probe is called.
*/
res->start -= DWC3_GLOBALS_REGS_START;

return ret;
}

static int dwc3_remove(struct platform_device *pdev)
{
struct dwc3 *dwc = platform_get_drvdata(pdev);
struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0);

/*
* restore res->start back to its original value so that, in case the
* probe is deferred, we don't end up getting error in request the
* memory region the next time probe is called.
*/
res->start -= DWC3_GLOBALS_REGS_START;

dwc3_debugfs_exit(dwc);
dwc3_core_exit_mode(dwc);
Expand Down

0 comments on commit 3da1f6e

Please sign in to comment.