PCI: qcom: Use bulk clock APIs for handling clocks for IP rev 1.0.0
authorManivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
Thu, 16 Mar 2023 08:11:06 +0000 (13:41 +0530)
committerLorenzo Pieralisi <lpieralisi@kernel.org>
Tue, 11 Apr 2023 09:31:10 +0000 (11:31 +0200)
All the clocks are enabled and disabled at the same time. So the bulk clock
APIs can be used to handle them together. This simplifies the code a lot.

Link: https://lore.kernel.org/r/20230316081117.14288-9-manivannan.sadhasivam@linaro.org
Signed-off-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
Signed-off-by: Lorenzo Pieralisi <lpieralisi@kernel.org>
drivers/pci/controller/dwc/pcie-qcom.c

index 10e7926..14373d5 100644 (file)
 
 #define QCOM_PCIE_CRC8_POLYNOMIAL              (BIT(2) | BIT(1) | BIT(0))
 
+#define QCOM_PCIE_1_0_0_MAX_CLOCKS             4
 struct qcom_pcie_resources_1_0_0 {
-       struct clk *iface;
-       struct clk *aux;
-       struct clk *master_bus;
-       struct clk *slave_bus;
+       struct clk_bulk_data clks[QCOM_PCIE_1_0_0_MAX_CLOCKS];
        struct reset_control *core;
        struct regulator *vdda;
 };
@@ -439,26 +437,20 @@ static int qcom_pcie_get_resources_1_0_0(struct qcom_pcie *pcie)
        struct qcom_pcie_resources_1_0_0 *res = &pcie->res.v1_0_0;
        struct dw_pcie *pci = pcie->pci;
        struct device *dev = pci->dev;
+       int ret;
 
        res->vdda = devm_regulator_get(dev, "vdda");
        if (IS_ERR(res->vdda))
                return PTR_ERR(res->vdda);
 
-       res->iface = devm_clk_get(dev, "iface");
-       if (IS_ERR(res->iface))
-               return PTR_ERR(res->iface);
-
-       res->aux = devm_clk_get(dev, "aux");
-       if (IS_ERR(res->aux))
-               return PTR_ERR(res->aux);
-
-       res->master_bus = devm_clk_get(dev, "master_bus");
-       if (IS_ERR(res->master_bus))
-               return PTR_ERR(res->master_bus);
+       res->clks[0].id = "iface";
+       res->clks[1].id = "aux";
+       res->clks[2].id = "master_bus";
+       res->clks[3].id = "slave_bus";
 
-       res->slave_bus = devm_clk_get(dev, "slave_bus");
-       if (IS_ERR(res->slave_bus))
-               return PTR_ERR(res->slave_bus);
+       ret = devm_clk_bulk_get(dev, ARRAY_SIZE(res->clks), res->clks);
+       if (ret < 0)
+               return ret;
 
        res->core = devm_reset_control_get_exclusive(dev, "core");
        return PTR_ERR_OR_ZERO(res->core);
@@ -469,10 +461,7 @@ static void qcom_pcie_deinit_1_0_0(struct qcom_pcie *pcie)
        struct qcom_pcie_resources_1_0_0 *res = &pcie->res.v1_0_0;
 
        reset_control_assert(res->core);
-       clk_disable_unprepare(res->slave_bus);
-       clk_disable_unprepare(res->master_bus);
-       clk_disable_unprepare(res->iface);
-       clk_disable_unprepare(res->aux);
+       clk_bulk_disable_unprepare(ARRAY_SIZE(res->clks), res->clks);
        regulator_disable(res->vdda);
 }
 
@@ -489,46 +478,23 @@ static int qcom_pcie_init_1_0_0(struct qcom_pcie *pcie)
                return ret;
        }
 
-       ret = clk_prepare_enable(res->aux);
-       if (ret) {
-               dev_err(dev, "cannot prepare/enable aux clock\n");
-               goto err_res;
-       }
-
-       ret = clk_prepare_enable(res->iface);
-       if (ret) {
-               dev_err(dev, "cannot prepare/enable iface clock\n");
-               goto err_aux;
-       }
-
-       ret = clk_prepare_enable(res->master_bus);
-       if (ret) {
-               dev_err(dev, "cannot prepare/enable master_bus clock\n");
-               goto err_iface;
-       }
-
-       ret = clk_prepare_enable(res->slave_bus);
+       ret = clk_bulk_prepare_enable(ARRAY_SIZE(res->clks), res->clks);
        if (ret) {
-               dev_err(dev, "cannot prepare/enable slave_bus clock\n");
-               goto err_master;
+               dev_err(dev, "cannot prepare/enable clocks\n");
+               goto err_assert_reset;
        }
 
        ret = regulator_enable(res->vdda);
        if (ret) {
                dev_err(dev, "cannot enable vdda regulator\n");
-               goto err_slave;
+               goto err_disable_clks;
        }
 
        return 0;
-err_slave:
-       clk_disable_unprepare(res->slave_bus);
-err_master:
-       clk_disable_unprepare(res->master_bus);
-err_iface:
-       clk_disable_unprepare(res->iface);
-err_aux:
-       clk_disable_unprepare(res->aux);
-err_res:
+
+err_disable_clks:
+       clk_bulk_disable_unprepare(ARRAY_SIZE(res->clks), res->clks);
+err_assert_reset:
        reset_control_assert(res->core);
 
        return ret;