From: Dan Carpenter <dan.carpenter@linaro.org>
To: Peng Fan <peng.fan@nxp.com>
Cc: Michael Turquette <mturquette@baylibre.com>,
Stephen Boyd <sboyd@kernel.org>,
Sudeep Holla <sudeep.holla@arm.com>,
Cristian Marussi <cristian.marussi@arm.com>,
Marco Felsch <m.felsch@pengutronix.de>,
Geert Uytterhoeven <geert@linux-m68k.org>,
linux-clk@vger.kernel.org, linux-kernel@vger.kernel.org,
arm-scmi@vger.kernel.org, linux-arm-kernel@lists.infradead.org
Subject: Re: [PATCH 2/3] clk: conf: Support assigned-clock-sscs
Date: Wed, 13 Aug 2025 08:48:15 +0300 [thread overview]
Message-ID: <aJwnH2mlRdqp1K1u@stanley.mountain> (raw)
In-Reply-To: <20250812-clk-ssc-version1-v1-2-cef60f20d770@nxp.com>
On Tue, Aug 12, 2025 at 08:17:06PM +0800, Peng Fan wrote:
> Parse the Spread Spectrum Configuration(SSC) from device tree and configure
> them before using the clock.
>
> Each SSC is three u32 elements which means '<modfreq spreaddepth
> modmethod>', so assigned-clock-sscs is an array of multiple three u32
> elements.
>
> Signed-off-by: Peng Fan <peng.fan@nxp.com>
> ---
> drivers/clk/clk-conf.c | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 70 insertions(+)
>
> diff --git a/drivers/clk/clk-conf.c b/drivers/clk/clk-conf.c
> index 303a0bb26e54a95655ce094a35b989c97ebc6fd8..81a2c1f8ca4c44df2c54c1e51f800f533c9453b3 100644
> --- a/drivers/clk/clk-conf.c
> +++ b/drivers/clk/clk-conf.c
> @@ -155,6 +155,72 @@ static int __set_clk_rates(struct device_node *node, bool clk_supplier)
> return 0;
> }
>
> +static int __set_clk_spread_spectrum(struct device_node *node, bool clk_supplier)
> +{
> + u32 *sscs __free(kfree) = NULL;
> + u32 elem_size = sizeof(u32) * 3;
> + struct of_phandle_args clkspec;
> + int rc, count, index;
> + struct clk *clk;
> +
> + /* modfreq, spreadPercent, modmethod */
> + count = of_property_count_elems_of_size(node, "assigned-clock-sscs", elem_size);
> + if (count > 0) {
> + sscs = kcalloc(count, elem_size, GFP_KERNEL);
> + if (!sscs)
> + return -ENOMEM;
> + rc = of_property_read_u32_array(node,
> + "assigned-clock-sscs",
> + sscs, count * 3);
> + } else {
> + return 0;
> + }
> +
> + if (rc)
> + return rc;
Nit pick: Please, flip these conditions around.
count = of_property_count_elems_of_size(node, "assigned-clock-sscs", elem_size);
if (count <= 0)
return 0;
sscs = kcalloc(count, elem_size, GFP_KERNEL);
if (!sscs)
return -ENOMEM;
rc = of_property_read_u32_array(node, "assigned-clock-sscs", sscs,
count * 3);
if (rc)
return rc;
> +
> + for (index = 0; index < count; index++) {
> + u32 modfreq_hz = sscs[index * 3], spread_bp = sscs[index * 3 + 1];
> + u32 method = sscs[index * 3 + 2];
This math would be nicer if you created a struct:
struct spread_config {
u32 modfreq_hz;
u32 spread_depth;
u32 method;
};
Then you could use that instead of sscs.
for (i = 0; i < count; i++) {
struct spread_config *conf = &configs[i];
struct clk_hw *hw;
if (!conf->modfreq_hz && !conf->spread_depth && !conf->method)
continue;
> + struct clk_hw *hw;
> +
> + if (modfreq_hz || spread_bp || method) {
> + rc = of_parse_phandle_with_args(node, "assigned-clocks",
> + "#clock-cells", index, &clkspec);
> + if (rc < 0) {
> + /* skip empty (null) phandles */
> + if (rc == -ENOENT)
> + continue;
> + else
> + return rc;
> + }
> +
> + if (clkspec.np == node && !clk_supplier) {
Could you add a comment for this condition? It's strange to me that we
don't iterate through the whole array.
regards,
dan carpenter
> + of_node_put(clkspec.np);
> + return 0;
> + }
> +
> + clk = of_clk_get_from_provider(&clkspec);
> + of_node_put(clkspec.np);
> + if (IS_ERR(clk)) {
> + if (PTR_ERR(clk) != -EPROBE_DEFER)
> + pr_warn("clk: couldn't get clock %d for %pOF\n",
> + index, node);
> + return PTR_ERR(clk);
> + }
> +
> + hw = __clk_get_hw(clk);
> + rc = clk_hw_set_spread_spectrum(hw, modfreq_hz, spread_bp, method);
> + if (rc < 0)
> + pr_err("clk: couldn't set %s clk spread spectrum %u %u %u: %d\n",
> + __clk_get_name(clk), modfreq_hz, spread_bp, method, rc);
> + clk_put(clk);
> + }
> + }
> +
> + return 0;
> +}
next prev parent reply other threads:[~2025-08-13 5:48 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-08-12 12:17 [PATCH 0/3] clk: Support spread spectrum and use it in clk-scmi Peng Fan
2025-08-12 12:17 ` [PATCH 1/3] clk: Introduce clk_hw_set_spread_spectrum Peng Fan
2025-08-27 15:45 ` Brian Masney
2025-08-29 9:08 ` Peng Fan
2025-08-12 12:17 ` [PATCH 2/3] clk: conf: Support assigned-clock-sscs Peng Fan
2025-08-13 5:48 ` Dan Carpenter [this message]
2025-08-15 8:50 ` Peng Fan
2025-08-15 7:51 ` Dan Carpenter
2025-08-12 12:17 ` [PATCH 3/3] clk: scmi: Support Spread Spectrum for NXP i.MX95 Peng Fan
2025-08-27 7:05 ` [PATCH 0/3] clk: Support spread spectrum and use it in clk-scmi Peng Fan
-- strict thread matches above, loose matches on Subject: below --
2025-01-24 14:25 Peng Fan (OSS)
2025-01-24 14:25 ` [PATCH 2/3] clk: conf: Support assigned-clock-sscs Peng Fan (OSS)
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=aJwnH2mlRdqp1K1u@stanley.mountain \
--to=dan.carpenter@linaro.org \
--cc=arm-scmi@vger.kernel.org \
--cc=cristian.marussi@arm.com \
--cc=geert@linux-m68k.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-clk@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=m.felsch@pengutronix.de \
--cc=mturquette@baylibre.com \
--cc=peng.fan@nxp.com \
--cc=sboyd@kernel.org \
--cc=sudeep.holla@arm.com \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.