usb: dwc3: core: only reset res->start in case of error
authorFelipe Balbi <balbi@ti.com>
Tue, 2 Sep 2014 20:19:43 +0000 (15:19 -0500)
committerFelipe Balbi <balbi@ti.com>
Mon, 9 Mar 2015 15:38:49 +0000 (10:38 -0500)
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>
drivers/usb/dwc3/core.c

index 9f0e209b8f6cee759d873eca5e6f813f6809a524..cd59e919e27ef1982d7359fef22764453cbad1ac 100644 (file)
@@ -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;
@@ -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);
@@ -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))
@@ -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);