]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
i3c: master: cdns: Simplify handling clocks in probe()
authorKrzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
Sun, 13 Jul 2025 15:24:12 +0000 (17:24 +0200)
committerAlexandre Belloni <alexandre.belloni@bootlin.com>
Wed, 30 Jul 2025 23:24:25 +0000 (01:24 +0200)
The two clocks, driver is getting, are not being disabled/re-enabled
during runtime of the device.  Eliminate one variable in state struct,
all error paths and a lot of code from probe() and remove() by using
devm_clk_get_enabled().

Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
Reviewed-by: Frank Li <Frank.Li@nxp.com>
Link: https://lore.kernel.org/r/20250713152411.74917-2-krzysztof.kozlowski@linaro.org
Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
drivers/i3c/master/i3c-master-cdns.c

index 63135e75868d8ae2cbafb0c94dde58626bd9733b..97b151564d3d31092975cec14958a17ddcd91d13 100644 (file)
@@ -414,7 +414,6 @@ struct cdns_i3c_master {
        } xferqueue;
        void __iomem *regs;
        struct clk *sysclk;
-       struct clk *pclk;
        struct cdns_i3c_master_caps caps;
        unsigned long i3c_scl_lim;
        const struct cdns_i3c_data *devdata;
@@ -1551,6 +1550,7 @@ MODULE_DEVICE_TABLE(of, cdns_i3c_master_of_ids);
 static int cdns_i3c_master_probe(struct platform_device *pdev)
 {
        struct cdns_i3c_master *master;
+       struct clk *pclk;
        int ret, irq;
        u32 val;
 
@@ -1566,11 +1566,11 @@ static int cdns_i3c_master_probe(struct platform_device *pdev)
        if (IS_ERR(master->regs))
                return PTR_ERR(master->regs);
 
-       master->pclk = devm_clk_get(&pdev->dev, "pclk");
-       if (IS_ERR(master->pclk))
-               return PTR_ERR(master->pclk);
+       pclk = devm_clk_get_enabled(&pdev->dev, "pclk");
+       if (IS_ERR(pclk))
+               return PTR_ERR(pclk);
 
-       master->sysclk = devm_clk_get(&pdev->dev, "sysclk");
+       master->sysclk = devm_clk_get_enabled(&pdev->dev, "sysclk");
        if (IS_ERR(master->sysclk))
                return PTR_ERR(master->sysclk);
 
@@ -1578,18 +1578,8 @@ static int cdns_i3c_master_probe(struct platform_device *pdev)
        if (irq < 0)
                return irq;
 
-       ret = clk_prepare_enable(master->pclk);
-       if (ret)
-               return ret;
-
-       ret = clk_prepare_enable(master->sysclk);
-       if (ret)
-               goto err_disable_pclk;
-
-       if (readl(master->regs + DEV_ID) != DEV_ID_I3C_MASTER) {
-               ret = -EINVAL;
-               goto err_disable_sysclk;
-       }
+       if (readl(master->regs + DEV_ID) != DEV_ID_I3C_MASTER)
+               return -EINVAL;
 
        spin_lock_init(&master->xferqueue.lock);
        INIT_LIST_HEAD(&master->xferqueue.list);
@@ -1600,7 +1590,7 @@ static int cdns_i3c_master_probe(struct platform_device *pdev)
        ret = devm_request_irq(&pdev->dev, irq, cdns_i3c_master_interrupt, 0,
                               dev_name(&pdev->dev), master);
        if (ret)
-               goto err_disable_sysclk;
+               return ret;
 
        platform_set_drvdata(pdev, master);
 
@@ -1622,29 +1612,15 @@ static int cdns_i3c_master_probe(struct platform_device *pdev)
        master->ibi.slots = devm_kcalloc(&pdev->dev, master->ibi.num_slots,
                                         sizeof(*master->ibi.slots),
                                         GFP_KERNEL);
-       if (!master->ibi.slots) {
-               ret = -ENOMEM;
-               goto err_disable_sysclk;
-       }
+       if (!master->ibi.slots)
+               return -ENOMEM;
 
        writel(IBIR_THR(1), master->regs + CMD_IBI_THR_CTRL);
        writel(MST_INT_IBIR_THR, master->regs + MST_IER);
        writel(DEVS_CTRL_DEV_CLR_ALL, master->regs + DEVS_CTRL);
 
-       ret = i3c_master_register(&master->base, &pdev->dev,
-                                 &cdns_i3c_master_ops, false);
-       if (ret)
-               goto err_disable_sysclk;
-
-       return 0;
-
-err_disable_sysclk:
-       clk_disable_unprepare(master->sysclk);
-
-err_disable_pclk:
-       clk_disable_unprepare(master->pclk);
-
-       return ret;
+       return i3c_master_register(&master->base, &pdev->dev,
+                                  &cdns_i3c_master_ops, false);
 }
 
 static void cdns_i3c_master_remove(struct platform_device *pdev)
@@ -1653,9 +1629,6 @@ static void cdns_i3c_master_remove(struct platform_device *pdev)
 
        cancel_work_sync(&master->hj_work);
        i3c_master_unregister(&master->base);
-
-       clk_disable_unprepare(master->sysclk);
-       clk_disable_unprepare(master->pclk);
 }
 
 static struct platform_driver cdns_i3c_master = {