greybus: arche-apb: Do cleanup within apb_ctrl_init_seq() for error cases
authorViresh Kumar <viresh.kumar@linaro.org>
Mon, 11 Jan 2016 05:59:15 +0000 (11:29 +0530)
committerGreg Kroah-Hartman <gregkh@google.com>
Mon, 11 Jan 2016 23:58:01 +0000 (15:58 -0800)
Relying on apb_ctrl_cleanup() to do the cleanup for errors that occurred
within apb_ctrl_init_seq() isn't a very clean idea. Handle that
separately within apb_ctrl_init_seq().

This will clean apb_ctrl_cleanup() in later patches.

Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org>
Reviewed-by: Vaibhav Hiremath <vaibhav.hiremath@linaro.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
drivers/staging/greybus/arche-apb-ctrl.c

index f83230deb4b4940e1b76bde7be1b62e9371e7331..859d22e3f149d0648ec9560f8ccd4cf47c66016c 100644 (file)
@@ -184,7 +184,7 @@ static int apb_ctrl_init_seq(struct platform_device *pdev,
                ret = regulator_enable(apb->vio);
                if (ret) {
                        dev_err(dev, "failed to enable IO regulator\n");
-                       return ret;
+                       goto out_vcore_disable;
                }
        }
 
@@ -193,16 +193,27 @@ static int apb_ctrl_init_seq(struct platform_device *pdev,
        if (ret) {
                dev_err(dev, "Failed requesting bootret gpio %d\n",
                                apb->boot_ret_gpio);
-               return ret;
+               goto out_vio_disable;
        }
        gpio_set_value(apb->boot_ret_gpio, 0);
        udelay(50);
 
        ret = devm_gpio_request_one(dev, apb->wake_detect_gpio,
                        GPIOF_INIT_LOW, "wake detect");
-       if (ret)
+       if (ret) {
                dev_err(dev, "Failed requesting wake_detect gpio %d\n",
                                apb->wake_detect_gpio);
+               goto out_vio_disable;
+       }
+
+       return 0;
+
+out_vio_disable:
+       if (!IS_ERR(apb->vio))
+               regulator_disable(apb->vio);
+out_vcore_disable:
+       if (!IS_ERR(apb->vcore))
+               regulator_disable(apb->vcore);
 
        return ret;
 }
@@ -311,7 +322,7 @@ int arche_apb_ctrl_probe(struct platform_device *pdev)
        if (ret) {
                dev_err(dev, "failed to set init state of control signal %d\n",
                                ret);
-               goto exit;
+               return ret;
        }
 
        spin_lock_init(&apb->lock);
@@ -332,7 +343,8 @@ int arche_apb_ctrl_probe(struct platform_device *pdev)
                        "wake detect", apb);
        if (ret) {
                dev_err(dev, "failed to request wake detect IRQ\n");
-               goto exit;
+               apb_ctrl_cleanup(apb);
+               return ret;
        }
 
        platform_set_drvdata(pdev, apb);
@@ -341,10 +353,6 @@ int arche_apb_ctrl_probe(struct platform_device *pdev)
 
        dev_info(&pdev->dev, "Device registered successfully\n");
        return 0;
-
-exit:
-       apb_ctrl_cleanup(apb);
-       return ret;
 }
 
 int arche_apb_ctrl_remove(struct platform_device *pdev)