i2c: qcom-geni: Simplify error handling in probe function
authorAndi Shyti <andi.shyti@kernel.org>
Fri, 27 Dec 2024 22:32:30 +0000 (23:32 +0100)
committerAndi Shyti <andi.shyti@kernel.org>
Tue, 7 Jan 2025 22:46:11 +0000 (23:46 +0100)
Avoid repeating the error handling pattern:

        geni_se_resources_off(&gi2c->se);
        clk_disable_unprepare(gi2c->core_clk);
        return;

Introduce a single 'goto' exit label for cleanup in case of
errors. While there are currently two distinct exit points, there
is no overlap in their handling, allowing both branches to
coexist cleanly.

Reviewed-by: Vladimir Zapolskiy <vladimir.zapolskiy@linaro.org>
Link: https://lore.kernel.org/r/20241227223230.462395-3-andi.shyti@kernel.org
Signed-off-by: Andi Shyti <andi.shyti@kernel.org>
drivers/i2c/busses/i2c-qcom-geni.c

index 01db24188e29bc48a5bd36d421788308a6296cb5..7bbd478171e02cd16005a934398b0da41a42b35f 100644 (file)
@@ -867,14 +867,13 @@ static int geni_i2c_probe(struct platform_device *pdev)
 
        ret = geni_se_resources_on(&gi2c->se);
        if (ret) {
-               clk_disable_unprepare(gi2c->core_clk);
-               return dev_err_probe(dev, ret, "Error turning on resources\n");
+               dev_err_probe(dev, ret, "Error turning on resources\n");
+               goto err_clk;
        }
        proto = geni_se_read_proto(&gi2c->se);
        if (proto != GENI_SE_I2C) {
-               geni_se_resources_off(&gi2c->se);
-               clk_disable_unprepare(gi2c->core_clk);
-               return dev_err_probe(dev, -ENXIO, "Invalid proto %d\n", proto);
+               ret = dev_err_probe(dev, -ENXIO, "Invalid proto %d\n", proto);
+               goto err_resources;
        }
 
        if (desc && desc->no_dma_support)
@@ -886,11 +885,8 @@ static int geni_i2c_probe(struct platform_device *pdev)
                /* FIFO is disabled, so we can only use GPI DMA */
                gi2c->gpi_mode = true;
                ret = setup_gpi_dma(gi2c);
-               if (ret) {
-                       geni_se_resources_off(&gi2c->se);
-                       clk_disable_unprepare(gi2c->core_clk);
-                       return ret;
-               }
+               if (ret)
+                       goto err_resources;
 
                dev_dbg(dev, "Using GPI DMA mode for I2C\n");
        } else {
@@ -902,10 +898,9 @@ static int geni_i2c_probe(struct platform_device *pdev)
                        tx_depth = desc->tx_fifo_depth;
 
                if (!tx_depth) {
-                       geni_se_resources_off(&gi2c->se);
-                       clk_disable_unprepare(gi2c->core_clk);
-                       return dev_err_probe(dev, -EINVAL,
-                                            "Invalid TX FIFO depth\n");
+                       ret = dev_err_probe(dev, -EINVAL,
+                                           "Invalid TX FIFO depth\n");
+                       goto err_resources;
                }
 
                gi2c->tx_wm = tx_depth - 1;
@@ -942,10 +937,18 @@ static int geni_i2c_probe(struct platform_device *pdev)
 
        dev_dbg(dev, "Geni-I2C adaptor successfully added\n");
 
-       return 0;
+       return ret;
+
+err_resources:
+       geni_se_resources_off(&gi2c->se);
+err_clk:
+       clk_disable_unprepare(gi2c->core_clk);
+
+       return ret;
 
 err_dma:
        release_gpi_dma(gi2c);
+
        return ret;
 }