PCI: qcom: Use bulk clock APIs for handling clocks for IP rev 2.3.3
authorManivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
Thu, 16 Mar 2023 08:11:08 +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-11-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 0d0d877..42b851b 100644 (file)
@@ -169,6 +169,12 @@ struct qcom_pcie_resources_2_3_2 {
        struct regulator_bulk_data supplies[QCOM_PCIE_2_3_2_MAX_SUPPLY];
 };
 
+#define QCOM_PCIE_2_3_3_MAX_CLOCKS             5
+struct qcom_pcie_resources_2_3_3 {
+       struct clk_bulk_data clks[QCOM_PCIE_2_3_3_MAX_CLOCKS];
+       struct reset_control *rst[7];
+};
+
 #define QCOM_PCIE_2_4_0_MAX_CLOCKS     4
 struct qcom_pcie_resources_2_4_0 {
        struct clk_bulk_data clks[QCOM_PCIE_2_4_0_MAX_CLOCKS];
@@ -187,15 +193,6 @@ struct qcom_pcie_resources_2_4_0 {
        struct reset_control *phy_ahb_reset;
 };
 
-struct qcom_pcie_resources_2_3_3 {
-       struct clk *iface;
-       struct clk *axi_m_clk;
-       struct clk *axi_s_clk;
-       struct clk *ahb_clk;
-       struct clk *aux_clk;
-       struct reset_control *rst[7];
-};
-
 /* 6 clocks typically, 7 for sm8250 */
 struct qcom_pcie_resources_2_7_0 {
        struct clk_bulk_data clks[12];
@@ -896,26 +893,17 @@ static int qcom_pcie_get_resources_2_3_3(struct qcom_pcie *pcie)
        const char *rst_names[] = { "axi_m", "axi_s", "pipe",
                                    "axi_m_sticky", "sticky",
                                    "ahb", "sleep", };
+       int ret;
 
-       res->iface = devm_clk_get(dev, "iface");
-       if (IS_ERR(res->iface))
-               return PTR_ERR(res->iface);
-
-       res->axi_m_clk = devm_clk_get(dev, "axi_m");
-       if (IS_ERR(res->axi_m_clk))
-               return PTR_ERR(res->axi_m_clk);
-
-       res->axi_s_clk = devm_clk_get(dev, "axi_s");
-       if (IS_ERR(res->axi_s_clk))
-               return PTR_ERR(res->axi_s_clk);
-
-       res->ahb_clk = devm_clk_get(dev, "ahb");
-       if (IS_ERR(res->ahb_clk))
-               return PTR_ERR(res->ahb_clk);
+       res->clks[0].id = "iface";
+       res->clks[1].id = "axi_m";
+       res->clks[2].id = "axi_s";
+       res->clks[3].id = "ahb";
+       res->clks[4].id = "aux";
 
-       res->aux_clk = devm_clk_get(dev, "aux");
-       if (IS_ERR(res->aux_clk))
-               return PTR_ERR(res->aux_clk);
+       ret = devm_clk_bulk_get(dev, ARRAY_SIZE(res->clks), res->clks);
+       if (ret < 0)
+               return ret;
 
        for (i = 0; i < ARRAY_SIZE(rst_names); i++) {
                res->rst[i] = devm_reset_control_get(dev, rst_names[i]);
@@ -930,11 +918,7 @@ static void qcom_pcie_deinit_2_3_3(struct qcom_pcie *pcie)
 {
        struct qcom_pcie_resources_2_3_3 *res = &pcie->res.v2_3_3;
 
-       clk_disable_unprepare(res->iface);
-       clk_disable_unprepare(res->axi_m_clk);
-       clk_disable_unprepare(res->axi_s_clk);
-       clk_disable_unprepare(res->ahb_clk);
-       clk_disable_unprepare(res->aux_clk);
+       clk_bulk_disable_unprepare(ARRAY_SIZE(res->clks), res->clks);
 }
 
 static int qcom_pcie_init_2_3_3(struct qcom_pcie *pcie)
@@ -969,47 +953,15 @@ static int qcom_pcie_init_2_3_3(struct qcom_pcie *pcie)
         */
        usleep_range(2000, 2500);
 
-       ret = clk_prepare_enable(res->iface);
-       if (ret) {
-               dev_err(dev, "cannot prepare/enable core clock\n");
-               goto err_clk_iface;
-       }
-
-       ret = clk_prepare_enable(res->axi_m_clk);
-       if (ret) {
-               dev_err(dev, "cannot prepare/enable core clock\n");
-               goto err_clk_axi_m;
-       }
-
-       ret = clk_prepare_enable(res->axi_s_clk);
-       if (ret) {
-               dev_err(dev, "cannot prepare/enable axi slave clock\n");
-               goto err_clk_axi_s;
-       }
-
-       ret = clk_prepare_enable(res->ahb_clk);
-       if (ret) {
-               dev_err(dev, "cannot prepare/enable ahb clock\n");
-               goto err_clk_ahb;
-       }
-
-       ret = clk_prepare_enable(res->aux_clk);
+       ret = clk_bulk_prepare_enable(ARRAY_SIZE(res->clks), res->clks);
        if (ret) {
-               dev_err(dev, "cannot prepare/enable aux clock\n");
-               goto err_clk_aux;
+               dev_err(dev, "cannot prepare/enable clocks\n");
+               goto err_assert_resets;
        }
 
        return 0;
 
-err_clk_aux:
-       clk_disable_unprepare(res->ahb_clk);
-err_clk_ahb:
-       clk_disable_unprepare(res->axi_s_clk);
-err_clk_axi_s:
-       clk_disable_unprepare(res->axi_m_clk);
-err_clk_axi_m:
-       clk_disable_unprepare(res->iface);
-err_clk_iface:
+err_assert_resets:
        /*
         * Not checking for failure, will anyway return
         * the original failure in 'ret'.