From: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
To: Rob Herring <robh+dt@kernel.org>,
Krzysztof Kozlowski <krzysztof.kozlowski+dt@linaro.org>,
Conor Dooley <conor+dt@kernel.org>,
Andy Gross <agross@kernel.org>,
Bjorn Andersson <andersson@kernel.org>,
Konrad Dybcio <konrad.dybcio@linaro.org>,
Ilia Lin <ilia.lin@kernel.org>, Viresh Kumar <vireshk@kernel.org>,
Nishanth Menon <nm@ti.com>, Stephen Boyd <sboyd@kernel.org>,
Michael Turquette <mturquette@baylibre.com>,
"Rafael J. Wysocki" <rafael@kernel.org>,
Georgi Djakov <djakov@kernel.org>
Cc: linux-arm-msm@vger.kernel.org, devicetree@vger.kernel.org,
linux-pm@vger.kernel.org, linux-clk@vger.kernel.org,
Christian Marangi <ansuelsmth@gmail.com>,
Stephan Gerhold <stephan@gerhold.net>
Subject: [PATCH v4 06/23] clk: qcom: krait-cc: rewrite driver to use clk_hw instead of clk
Date: Sun, 27 Aug 2023 14:50:16 +0300 [thread overview]
Message-ID: <20230827115033.935089-7-dmitry.baryshkov@linaro.org> (raw)
In-Reply-To: <20230827115033.935089-1-dmitry.baryshkov@linaro.org>
The krait-cc driver still uses struct clk internally. Rewrite it to
allocate and register struct clk_hw instead.
Reviewed-by: Stephen Boyd <sboyd@kernel.org>
Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
---
drivers/clk/qcom/krait-cc.c | 141 ++++++++++++++++--------------------
1 file changed, 63 insertions(+), 78 deletions(-)
diff --git a/drivers/clk/qcom/krait-cc.c b/drivers/clk/qcom/krait-cc.c
index 410ae8390f1c..a37abbd31f50 100644
--- a/drivers/clk/qcom/krait-cc.c
+++ b/drivers/clk/qcom/krait-cc.c
@@ -13,17 +13,9 @@
#include <linux/clk-provider.h>
#include <linux/slab.h>
-#include "clk-krait.h"
-
-enum {
- cpu0_mux = 0,
- cpu1_mux,
- cpu2_mux,
- cpu3_mux,
- l2_mux,
+#include <dt-bindings/clock/qcom,krait-cc.h>
- clks_max,
-};
+#include "clk-krait.h"
static unsigned int sec_mux_map[] = {
2,
@@ -235,7 +227,7 @@ krait_add_pri_mux(struct device *dev, struct clk_hw *hfpll_div, struct clk_hw *s
.parent_data = p_data,
.num_parents = ARRAY_SIZE(p_data),
.ops = &krait_mux_clk_ops,
- .flags = CLK_SET_RATE_PARENT,
+ .flags = CLK_SET_RATE_PARENT | CLK_IS_CRITICAL,
};
struct clk_hw *clk;
char *hfpll_name;
@@ -324,19 +316,6 @@ static struct clk_hw *krait_add_clks(struct device *dev, int id, bool unique_aux
return pri_mux;
}
-static struct clk *krait_of_get(struct of_phandle_args *clkspec, void *data)
-{
- unsigned int idx = clkspec->args[0];
- struct clk **clks = data;
-
- if (idx >= clks_max) {
- pr_err("%s: invalid clock index %d\n", __func__, idx);
- return ERR_PTR(-EINVAL);
- }
-
- return clks[idx] ? : ERR_PTR(-ENODEV);
-}
-
static const struct of_device_id krait_cc_match_table[] = {
{ .compatible = "qcom,krait-cc-v1", (void *)1UL },
{ .compatible = "qcom,krait-cc-v2" },
@@ -344,60 +323,84 @@ static const struct of_device_id krait_cc_match_table[] = {
};
MODULE_DEVICE_TABLE(of, krait_cc_match_table);
+static int krait_clk_reinit(struct clk_hw *hw, int cpu)
+{
+ struct clk *clk;
+ unsigned long cur_rate, aux_rate;
+ char name[5]; /* CPUn */
+
+ if (cpu == -1)
+ strcpy(name, "L2");
+ else
+ snprintf(name, sizeof(name), "CPU%d", cpu);
+
+ clk = clk_hw_get_clk(hw, clk_hw_get_name(hw));
+ if (IS_ERR(clk))
+ return PTR_ERR(clk);
+
+ aux_rate = 384000000;
+
+ cur_rate = clk_get_rate(clk);
+ if (cur_rate < aux_rate) {
+ pr_info("%s @ Undefined rate %lu. Forcing new rate.\n",
+ name, cur_rate / 1000);
+ cur_rate = aux_rate;
+ }
+
+ clk_set_rate(clk, aux_rate);
+ clk_set_rate(clk, 2);
+ clk_set_rate(clk, cur_rate);
+ pr_info("%s @ %lu KHz\n", name, clk_get_rate(clk) / 1000);
+
+ clk_put(clk);
+
+ return 0;
+}
+
+/* Krait configurations have at most 4 CPUs and one L2 */
+#define KRAIT_NUM_CLOCKS 5
+
static int krait_cc_probe(struct platform_device *pdev)
{
struct device *dev = &pdev->dev;
const struct of_device_id *id;
- unsigned long cur_rate, aux_rate;
- int cpu;
- struct clk_hw *mux, *l2_pri_mux;
- struct clk *clk, **clks;
+ int cpu, ret;
+ struct clk_hw *clk;
+ struct clk_hw_onecell_data *clks;
id = of_match_device(krait_cc_match_table, dev);
if (!id)
return -ENODEV;
/* Rate is 1 because 0 causes problems for __clk_mux_determine_rate */
- clk = clk_register_fixed_rate(dev, "qsb", NULL, 0, 1);
+ clk = clk_hw_register_fixed_rate(dev, "qsb", NULL, 0, 1);
if (IS_ERR(clk))
return PTR_ERR(clk);
if (!id->data) {
- clk = clk_register_fixed_factor(dev, "acpu_aux",
- "gpll0_vote", 0, 1, 2);
+ clk = clk_hw_register_fixed_factor(dev, "acpu_aux", "gpll0_vote", 0, 1, 2);
if (IS_ERR(clk))
return PTR_ERR(clk);
}
- /* Krait configurations have at most 4 CPUs and one L2 */
- clks = devm_kcalloc(dev, clks_max, sizeof(*clks), GFP_KERNEL);
+ clks = devm_kzalloc(dev, struct_size(clks, hws, KRAIT_NUM_CLOCKS), GFP_KERNEL);
if (!clks)
return -ENOMEM;
+ clks->num = KRAIT_NUM_CLOCKS;
+ BUILD_BUG_ON(KRAIT_L2 >= KRAIT_NUM_CLOCKS);
+
for_each_possible_cpu(cpu) {
- mux = krait_add_clks(dev, cpu, id->data);
- if (IS_ERR(mux))
- return PTR_ERR(mux);
- clks[cpu] = mux->clk;
+ clk = krait_add_clks(dev, cpu, id->data);
+ if (IS_ERR(clk))
+ return PTR_ERR(clk);
+ clks->hws[cpu] = clk;
}
- l2_pri_mux = krait_add_clks(dev, -1, id->data);
- if (IS_ERR(l2_pri_mux))
- return PTR_ERR(l2_pri_mux);
- clks[l2_mux] = l2_pri_mux->clk;
-
- /*
- * We don't want the CPU or L2 clocks to be turned off at late init
- * if CPUFREQ or HOTPLUG configs are disabled. So, bump up the
- * refcount of these clocks. Any cpufreq/hotplug manager can assume
- * that the clocks have already been prepared and enabled by the time
- * they take over.
- */
- for_each_online_cpu(cpu) {
- clk_prepare_enable(clks[l2_mux]);
- WARN(clk_prepare_enable(clks[cpu]),
- "Unable to turn on CPU%d clock", cpu);
- }
+ clk = krait_add_clks(dev, -1, id->data);
+ if (IS_ERR(clk))
+ return PTR_ERR(clk);
+ clks->hws[KRAIT_L2] = clk;
/*
* Force reinit of HFPLLs and muxes to overwrite any potential
@@ -410,31 +413,13 @@ static int krait_cc_probe(struct platform_device *pdev)
* two different rates to force a HFPLL reinit under all
* circumstances.
*/
- cur_rate = clk_get_rate(clks[l2_mux]);
- aux_rate = 384000000;
- if (cur_rate < aux_rate) {
- pr_info("L2 @ Undefined rate. Forcing new rate.\n");
- cur_rate = aux_rate;
- }
- clk_set_rate(clks[l2_mux], aux_rate);
- clk_set_rate(clks[l2_mux], 2);
- clk_set_rate(clks[l2_mux], cur_rate);
- pr_info("L2 @ %lu KHz\n", clk_get_rate(clks[l2_mux]) / 1000);
- for_each_possible_cpu(cpu) {
- clk = clks[cpu];
- cur_rate = clk_get_rate(clk);
- if (cur_rate < aux_rate) {
- pr_info("CPU%d @ Undefined rate. Forcing new rate.\n", cpu);
- cur_rate = aux_rate;
- }
+ krait_clk_reinit(clks->hws[KRAIT_L2], -1);
+ for_each_possible_cpu(cpu)
+ krait_clk_reinit(clks->hws[cpu], cpu);
- clk_set_rate(clk, aux_rate);
- clk_set_rate(clk, 2);
- clk_set_rate(clk, cur_rate);
- pr_info("CPU%d @ %lu KHz\n", cpu, clk_get_rate(clk) / 1000);
- }
-
- of_clk_add_provider(dev->of_node, krait_of_get, clks);
+ ret = devm_of_clk_add_hw_provider(dev, of_clk_hw_onecell_get, clks);
+ if (ret)
+ return ret;
return 0;
}
--
2.39.2
next prev parent reply other threads:[~2023-08-27 11:51 UTC|newest]
Thread overview: 44+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-08-27 11:50 [PATCH v4 00/23] ARM: qcom: apq8064: support CPU frequency scaling Dmitry Baryshkov
2023-08-27 11:50 ` [PATCH v4 01/23] dt-bindings: soc: qcom: merge qcom,saw2.txt into qcom,spm.yaml Dmitry Baryshkov
2023-08-27 11:50 ` [PATCH v4 02/23] dt-bindings: soc: qcom: qcom,saw2: define optional regulator node Dmitry Baryshkov
2023-08-27 11:50 ` [PATCH v4 03/23] dt-bindings: clock: qcom,krait-cc: Krait core clock controller Dmitry Baryshkov
2023-08-27 11:50 ` [PATCH v4 04/23] dt-bindings: cache: describe L2 cache on Qualcomm Krait platforms Dmitry Baryshkov
2023-08-28 15:33 ` Rob Herring
2023-08-27 11:50 ` [PATCH v4 05/23] interconnect: icc-clk: add support for scaling using OPP Dmitry Baryshkov
[not found] ` <493aff10d698c9ca5bdbeae45250f5fe.sboyd@kernel.org>
2023-08-28 21:18 ` Dmitry Baryshkov
2023-10-03 8:30 ` Dmitry Baryshkov
2023-10-03 13:01 ` Stephan Gerhold
2023-10-03 13:36 ` Dmitry Baryshkov
2023-10-03 14:17 ` Stephan Gerhold
2023-10-03 15:31 ` Dmitry Baryshkov
2023-10-03 16:04 ` Stephan Gerhold
2023-10-10 4:14 ` Stephen Boyd
2023-08-27 11:50 ` Dmitry Baryshkov [this message]
2023-08-27 11:50 ` [PATCH v4 07/23] soc: qcom: spm: add support for voltage regulator Dmitry Baryshkov
2023-08-28 10:49 ` Konrad Dybcio
2023-08-27 11:50 ` [PATCH v4 08/23] soc: qcom: Add driver for Qualcomm Krait L2 cache scaling Dmitry Baryshkov
2023-08-28 10:49 ` Konrad Dybcio
2023-10-11 15:49 ` Rob Herring
2023-10-11 18:19 ` Dmitry Baryshkov
2023-10-11 18:44 ` Rob Herring
2024-01-04 2:02 ` Dmitry Baryshkov
2024-01-15 16:16 ` Rob Herring
2023-08-27 11:50 ` [PATCH v4 09/23] ARM: dts: qcom: apq8064-asus-nexus7-flo: constraint cpufreq regulators Dmitry Baryshkov
2023-08-27 11:50 ` [PATCH v4 10/23] ARM: dts: qcom: apq8064-cm-qs600: " Dmitry Baryshkov
2023-08-27 11:50 ` [PATCH v4 11/23] ARM: dts: qcom: apq8064-ifc6410: " Dmitry Baryshkov
2023-08-27 11:50 ` [PATCH v4 12/23] ARM: dts: qcom: apq8064-sony-xperia-lagan-yuga: " Dmitry Baryshkov
2023-08-27 11:50 ` [PATCH v4 13/23] ARM: dts: qcom: apq8064: rename SAW nodes to power-manager Dmitry Baryshkov
2023-08-27 11:50 ` [PATCH v4 14/23] ARM: dts: qcom: apq8064: declare SAW2 regulators Dmitry Baryshkov
2023-08-27 11:50 ` [PATCH v4 15/23] ARM: dts: qcom: apq8064: add Krait clock controller Dmitry Baryshkov
2023-08-28 10:54 ` Konrad Dybcio
2023-08-28 11:38 ` Dmitry Baryshkov
2023-08-27 11:50 ` [PATCH v4 16/23] ARM: dts: qcom: apq8064: add L2 cache scaling Dmitry Baryshkov
2023-08-28 10:55 ` Konrad Dybcio
2023-08-27 11:50 ` [PATCH v4 17/23] ARM: dts: qcom: apq8064: add simple CPUFreq support Dmitry Baryshkov
2023-08-28 10:56 ` Konrad Dybcio
2023-08-27 11:50 ` [PATCH v4 18/23] ARM: dts: qcom: apq8064: enable passive CPU cooling Dmitry Baryshkov
2023-08-27 11:50 ` [PATCH v4 19/23] ARM: dts: qcom: msm8960: declare SAW2 regulators Dmitry Baryshkov
2023-08-27 11:50 ` [PATCH v4 20/23] ARM: dts: qcom: apq8084: drop 'regulator' property from SAW2 device Dmitry Baryshkov
2023-08-27 11:50 ` [PATCH v4 21/23] ARM: dts: qcom: msm8974: " Dmitry Baryshkov
2023-08-27 11:50 ` [PATCH v4 22/23] ARM: dts: qcom: ipq4019: drop 'regulator' property from SAW2 devices Dmitry Baryshkov
2023-08-27 11:50 ` [PATCH v4 23/23] ARM: dts: qcom: ipq8064: " Dmitry Baryshkov
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20230827115033.935089-7-dmitry.baryshkov@linaro.org \
--to=dmitry.baryshkov@linaro.org \
--cc=agross@kernel.org \
--cc=andersson@kernel.org \
--cc=ansuelsmth@gmail.com \
--cc=conor+dt@kernel.org \
--cc=devicetree@vger.kernel.org \
--cc=djakov@kernel.org \
--cc=ilia.lin@kernel.org \
--cc=konrad.dybcio@linaro.org \
--cc=krzysztof.kozlowski+dt@linaro.org \
--cc=linux-arm-msm@vger.kernel.org \
--cc=linux-clk@vger.kernel.org \
--cc=linux-pm@vger.kernel.org \
--cc=mturquette@baylibre.com \
--cc=nm@ti.com \
--cc=rafael@kernel.org \
--cc=robh+dt@kernel.org \
--cc=sboyd@kernel.org \
--cc=stephan@gerhold.net \
--cc=vireshk@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).