]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
PCI: rockchip: Simplify clock handling by using clk_bulk*() functions
authorAnand Moon <linux.amoon@gmail.com>
Mon, 2 Dec 2024 15:11:42 +0000 (20:41 +0530)
committerBjorn Helgaas <bhelgaas@google.com>
Mon, 13 Jan 2025 21:10:38 +0000 (15:10 -0600)
Currently, the driver acquires clocks and prepare/enable/disable/unprepare
the clocks individually thereby making the driver complex to read.

The driver can be simplified by using the clk_bulk*() APIs.

Use:

  - devm_clk_bulk_get_all() API to acquire all the clocks
  - clk_bulk_prepare_enable() to prepare/enable clocks
  - clk_bulk_disable_unprepare() APIs to disable/unprepare them in bulk

Link: https://lore.kernel.org/r/20241202151150.7393-2-linux.amoon@gmail.com
Signed-off-by: Anand Moon <linux.amoon@gmail.com>
Signed-off-by: Lorenzo Pieralisi <lpieralisi@kernel.org>
[bhelgaas: squash error handling fix from https://lore.kernel.org/r/20250106153041.55267-1-linux.amoon@gmail.com]
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Reviewed-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
drivers/pci/controller/pcie-rockchip.c
drivers/pci/controller/pcie-rockchip.h

index b9ade7632e11349e3ddfae9b4512ab90bc8b8104..bbd16a54847925cf6cb8c7702f55c9da925103ef 100644 (file)
@@ -129,29 +129,10 @@ int rockchip_pcie_parse_dt(struct rockchip_pcie *rockchip)
                return dev_err_probe(dev, PTR_ERR(rockchip->perst_gpio),
                                     "failed to get PERST# GPIO\n");
 
-       rockchip->aclk_pcie = devm_clk_get(dev, "aclk");
-       if (IS_ERR(rockchip->aclk_pcie)) {
-               dev_err(dev, "aclk clock not found\n");
-               return PTR_ERR(rockchip->aclk_pcie);
-       }
-
-       rockchip->aclk_perf_pcie = devm_clk_get(dev, "aclk-perf");
-       if (IS_ERR(rockchip->aclk_perf_pcie)) {
-               dev_err(dev, "aclk_perf clock not found\n");
-               return PTR_ERR(rockchip->aclk_perf_pcie);
-       }
-
-       rockchip->hclk_pcie = devm_clk_get(dev, "hclk");
-       if (IS_ERR(rockchip->hclk_pcie)) {
-               dev_err(dev, "hclk clock not found\n");
-               return PTR_ERR(rockchip->hclk_pcie);
-       }
-
-       rockchip->clk_pcie_pm = devm_clk_get(dev, "pm");
-       if (IS_ERR(rockchip->clk_pcie_pm)) {
-               dev_err(dev, "pm clock not found\n");
-               return PTR_ERR(rockchip->clk_pcie_pm);
-       }
+       rockchip->num_clks = devm_clk_bulk_get_all(dev, &rockchip->clks);
+       if (rockchip->num_clks < 0)
+               return dev_err_probe(dev, rockchip->num_clks,
+                                    "failed to get clocks\n");
 
        return 0;
 }
@@ -375,39 +356,11 @@ int rockchip_pcie_enable_clocks(struct rockchip_pcie *rockchip)
        struct device *dev = rockchip->dev;
        int err;
 
-       err = clk_prepare_enable(rockchip->aclk_pcie);
-       if (err) {
-               dev_err(dev, "unable to enable aclk_pcie clock\n");
-               return err;
-       }
-
-       err = clk_prepare_enable(rockchip->aclk_perf_pcie);
-       if (err) {
-               dev_err(dev, "unable to enable aclk_perf_pcie clock\n");
-               goto err_aclk_perf_pcie;
-       }
-
-       err = clk_prepare_enable(rockchip->hclk_pcie);
-       if (err) {
-               dev_err(dev, "unable to enable hclk_pcie clock\n");
-               goto err_hclk_pcie;
-       }
-
-       err = clk_prepare_enable(rockchip->clk_pcie_pm);
-       if (err) {
-               dev_err(dev, "unable to enable clk_pcie_pm clock\n");
-               goto err_clk_pcie_pm;
-       }
+       err = clk_bulk_prepare_enable(rockchip->num_clks, rockchip->clks);
+       if (err)
+               return dev_err_probe(dev, err, "failed to enable clocks\n");
 
        return 0;
-
-err_clk_pcie_pm:
-       clk_disable_unprepare(rockchip->hclk_pcie);
-err_hclk_pcie:
-       clk_disable_unprepare(rockchip->aclk_perf_pcie);
-err_aclk_perf_pcie:
-       clk_disable_unprepare(rockchip->aclk_pcie);
-       return err;
 }
 EXPORT_SYMBOL_GPL(rockchip_pcie_enable_clocks);
 
@@ -415,10 +368,7 @@ void rockchip_pcie_disable_clocks(void *data)
 {
        struct rockchip_pcie *rockchip = data;
 
-       clk_disable_unprepare(rockchip->clk_pcie_pm);
-       clk_disable_unprepare(rockchip->hclk_pcie);
-       clk_disable_unprepare(rockchip->aclk_perf_pcie);
-       clk_disable_unprepare(rockchip->aclk_pcie);
+       clk_bulk_disable_unprepare(rockchip->num_clks, rockchip->clks);
 }
 EXPORT_SYMBOL_GPL(rockchip_pcie_disable_clocks);
 
index a51b087ce8786102aa8e53cb6467edecbe490b5a..f79c0a1cbbd028dcfa1709f6418a11e11f68f3f0 100644 (file)
@@ -11,6 +11,7 @@
 #ifndef _PCIE_ROCKCHIP_H
 #define _PCIE_ROCKCHIP_H
 
+#include <linux/clk.h>
 #include <linux/kernel.h>
 #include <linux/pci.h>
 #include <linux/pci-ecam.h>
@@ -321,10 +322,8 @@ struct rockchip_pcie {
        struct  reset_control *pm_rst;
        struct  reset_control *aclk_rst;
        struct  reset_control *pclk_rst;
-       struct  clk *aclk_pcie;
-       struct  clk *aclk_perf_pcie;
-       struct  clk *hclk_pcie;
-       struct  clk *clk_pcie_pm;
+       struct  clk_bulk_data *clks;
+       int     num_clks;
        struct  regulator *vpcie12v; /* 12V power supply */
        struct  regulator *vpcie3v3; /* 3.3V power supply */
        struct  regulator *vpcie1v8; /* 1.8V power supply */