OSDN Git Service

usb: chipidea: ci13xxx_imx: fix error path
authorFabio Estevam <fabio.estevam@freescale.com>
Thu, 13 Jun 2013 14:59:48 +0000 (17:59 +0300)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 17 Jun 2013 20:45:46 +0000 (13:45 -0700)
If usbmisc_ops->post() fails it should point the error path to release all
previously acquired resources, so adjust it to call ci13xxx_remove_device().

While at it, remove the unnecessary 'plat_ci' indirection, as we can directly
use the private structure.

Signed-off-by: Fabio Estevam <fabio.estevam@freescale.com>
Signed-off-by: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/chipidea/ci13xxx_imx.c

index 45bb9b5..24f46e1 100644 (file)
@@ -98,7 +98,7 @@ static struct ci13xxx_platform_data ci13xxx_imx_platdata  = {
 static int ci13xxx_imx_probe(struct platform_device *pdev)
 {
        struct ci13xxx_imx_data *data;
-       struct platform_device *plat_ci, *phy_pdev;
+       struct platform_device *phy_pdev;
        struct device_node *phy_np;
        struct resource *res;
        struct regulator *reg_vbus;
@@ -180,11 +180,11 @@ static int ci13xxx_imx_probe(struct platform_device *pdev)
                }
        }
 
-       plat_ci = ci13xxx_add_device(&pdev->dev,
+       data->ci_pdev = ci13xxx_add_device(&pdev->dev,
                                pdev->resource, pdev->num_resources,
                                &ci13xxx_imx_platdata);
-       if (IS_ERR(plat_ci)) {
-               ret = PTR_ERR(plat_ci);
+       if (IS_ERR(data->ci_pdev)) {
+               ret = PTR_ERR(data->ci_pdev);
                dev_err(&pdev->dev,
                        "Can't register ci_hdrc platform device, err=%d\n",
                        ret);
@@ -196,11 +196,10 @@ static int ci13xxx_imx_probe(struct platform_device *pdev)
                if (ret) {
                        dev_err(&pdev->dev,
                                "usbmisc post failed, ret=%d\n", ret);
-                       goto put_np;
+                       goto disable_device;
                }
        }
 
-       data->ci_pdev = plat_ci;
        platform_set_drvdata(pdev, data);
 
        pm_runtime_no_callbacks(&pdev->dev);
@@ -208,6 +207,8 @@ static int ci13xxx_imx_probe(struct platform_device *pdev)
 
        return 0;
 
+disable_device:
+       ci13xxx_remove_device(data->ci_pdev);
 err:
        if (reg_vbus)
                regulator_disable(reg_vbus);