This patch regroups resource enabling/disabling in dedicated function.
This simplify error handling and will permit to support power
management.

Signed-off-by: Corentin Labbe <clabbe.montj...@gmail.com>
Acked-by: Maxime Ripard <mrip...@kernel.org>
---
 drivers/crypto/sunxi-ss/sun4i-ss-core.c | 77 +++++++++++++++----------
 1 file changed, 46 insertions(+), 31 deletions(-)

diff --git a/drivers/crypto/sunxi-ss/sun4i-ss-core.c 
b/drivers/crypto/sunxi-ss/sun4i-ss-core.c
index 9aa6fe081a27..6c2db5d83b06 100644
--- a/drivers/crypto/sunxi-ss/sun4i-ss-core.c
+++ b/drivers/crypto/sunxi-ss/sun4i-ss-core.c
@@ -223,6 +223,45 @@ static struct sun4i_ss_alg_template ss_algs[] = {
 #endif
 };
 
+static void sun4i_ss_disable(struct sun4i_ss_ctx *ss)
+{
+       if (ss->reset)
+               reset_control_assert(ss->reset);
+
+       clk_disable_unprepare(ss->ssclk);
+       clk_disable_unprepare(ss->busclk);
+}
+
+static int sun4i_ss_enable(struct sun4i_ss_ctx *ss)
+{
+       int err;
+
+       err = clk_prepare_enable(ss->busclk);
+       if (err) {
+               dev_err(ss->dev, "Cannot prepare_enable busclk\n");
+               goto err_enable;
+       }
+
+       err = clk_prepare_enable(ss->ssclk);
+       if (err) {
+               dev_err(ss->dev, "Cannot prepare_enable ssclk\n");
+               goto err_enable;
+       }
+
+       if (ss->reset) {
+               err = reset_control_deassert(ss->reset);
+               if (err) {
+                       dev_err(ss->dev, "Cannot deassert reset control\n");
+                       goto err_enable;
+               }
+       }
+
+       return err;
+err_enable:
+       sun4i_ss_disable(ss);
+       return err;
+}
+
 static int sun4i_ss_probe(struct platform_device *pdev)
 {
        u32 v;
@@ -269,17 +308,9 @@ static int sun4i_ss_probe(struct platform_device *pdev)
                ss->reset = NULL;
        }
 
-       /* Enable both clocks */
-       err = clk_prepare_enable(ss->busclk);
-       if (err) {
-               dev_err(&pdev->dev, "Cannot prepare_enable busclk\n");
-               return err;
-       }
-       err = clk_prepare_enable(ss->ssclk);
-       if (err) {
-               dev_err(&pdev->dev, "Cannot prepare_enable ssclk\n");
-               goto error_ssclk;
-       }
+       err = sun4i_ss_enable(ss);
+       if (err)
+               goto error_enable;
 
        /*
         * Check that clock have the correct rates given in the datasheet
@@ -288,16 +319,7 @@ static int sun4i_ss_probe(struct platform_device *pdev)
        err = clk_set_rate(ss->ssclk, cr_mod);
        if (err) {
                dev_err(&pdev->dev, "Cannot set clock rate to ssclk\n");
-               goto error_clk;
-       }
-
-       /* Deassert reset if we have a reset control */
-       if (ss->reset) {
-               err = reset_control_deassert(ss->reset);
-               if (err) {
-                       dev_err(&pdev->dev, "Cannot deassert reset control\n");
-                       goto error_clk;
-               }
+               goto error_enable;
        }
 
        /*
@@ -387,12 +409,8 @@ static int sun4i_ss_probe(struct platform_device *pdev)
                        break;
                }
        }
-       if (ss->reset)
-               reset_control_assert(ss->reset);
-error_clk:
-       clk_disable_unprepare(ss->ssclk);
-error_ssclk:
-       clk_disable_unprepare(ss->busclk);
+error_enable:
+       sun4i_ss_disable(ss);
        return err;
 }
 
@@ -416,10 +434,7 @@ static int sun4i_ss_remove(struct platform_device *pdev)
        }
 
        writel(0, ss->base + SS_CTL);
-       if (ss->reset)
-               reset_control_assert(ss->reset);
-       clk_disable_unprepare(ss->busclk);
-       clk_disable_unprepare(ss->ssclk);
+       sun4i_ss_disable(ss);
        return 0;
 }
 
-- 
2.21.0

Reply via email to