i2c: cadence: Simplify using devm_clk_get_enabled()
authorMichal Simek <michal.simek@amd.com>
Thu, 6 Feb 2025 11:57:07 +0000 (17:27 +0530)
committerAndi Shyti <andi.shyti@kernel.org>
Tue, 18 Mar 2025 20:53:54 +0000 (21:53 +0100)
Clock handling can be very simplified with using devm_clk_get_enabled() as
was done by commit 8d2aaf4382b7 ("gpio: zynq: Simplify using
devm_clk_get_enabled()").
And also fix issue in connection to incorrect sequence when err_clk_dis
label is called.
When reset_control_deassert() fails it jumps to err_clk_dis label which
disables clock and also disable pm_runtime setup but nothing has been setup
at this time of failure because initialization is done below
reset_control_deassert() call.

Signed-off-by: Michal Simek <michal.simek@amd.com>
Signed-off-by: Manikanta Guntupalli <manikanta.guntupalli@amd.com>
Signed-off-by: Andi Shyti <andi.shyti@kernel.org>
Link: https://lore.kernel.org/r/20250206115708.1085523-2-manikanta.guntupalli@amd.com
drivers/i2c/busses/i2c-cadence.c

index b64026fbca665b21b70b9bbce14d98baeedcfdfc..51dc7728d133e83bafa7efc5b85b2390054e9e11 100644 (file)
@@ -1541,7 +1541,7 @@ static int cdns_i2c_probe(struct platform_device *pdev)
        snprintf(id->adap.name, sizeof(id->adap.name),
                 "Cadence I2C at %08lx", (unsigned long)r_mem->start);
 
-       id->clk = devm_clk_get(&pdev->dev, NULL);
+       id->clk = devm_clk_get_enabled(&pdev->dev, NULL);
        if (IS_ERR(id->clk))
                return dev_err_probe(&pdev->dev, PTR_ERR(id->clk),
                                     "input clock not found.\n");
@@ -1551,16 +1551,10 @@ static int cdns_i2c_probe(struct platform_device *pdev)
                return dev_err_probe(&pdev->dev, PTR_ERR(id->reset),
                                     "Failed to request reset.\n");
 
-       ret = clk_prepare_enable(id->clk);
-       if (ret)
-               dev_err(&pdev->dev, "Unable to enable clock.\n");
-
        ret = reset_control_deassert(id->reset);
-       if (ret) {
-               dev_err_probe(&pdev->dev, ret,
-                             "Failed to de-assert reset.\n");
-               goto err_clk_dis;
-       }
+       if (ret)
+               return dev_err_probe(&pdev->dev, ret,
+                                    "Failed to de-assert reset.\n");
 
        pm_runtime_set_autosuspend_delay(id->dev, CNDS_I2C_PM_TIMEOUT);
        pm_runtime_use_autosuspend(id->dev);
@@ -1616,8 +1610,6 @@ static int cdns_i2c_probe(struct platform_device *pdev)
 err_clk_notifier_unregister:
        clk_notifier_unregister(id->clk, &id->clk_rate_change_nb);
        reset_control_assert(id->reset);
-err_clk_dis:
-       clk_disable_unprepare(id->clk);
        pm_runtime_disable(&pdev->dev);
        pm_runtime_set_suspended(&pdev->dev);
        return ret;
@@ -1642,7 +1634,6 @@ static void cdns_i2c_remove(struct platform_device *pdev)
        i2c_del_adapter(&id->adap);
        clk_notifier_unregister(id->clk, &id->clk_rate_change_nb);
        reset_control_assert(id->reset);
-       clk_disable_unprepare(id->clk);
 }
 
 static struct platform_driver cdns_i2c_drv = {