From: Maxime Ripard <mripard@kernel.org>
To: Brian Masney <bmasney@redhat.com>
Cc: Michael Turquette <mturquette@baylibre.com>,
Stephen Boyd <sboyd@kernel.org>, Alberto Ruiz <aruiz@redhat.com>,
linux-clk@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH v6 4/7] clk: test: introduce additional test case showing sibling clock rate change
Date: Thu, 19 Mar 2026 10:22:36 +0100 [thread overview]
Message-ID: <20260319-enchanted-flying-sparrow-5a6446@houat> (raw)
In-Reply-To: <20260313-clk-scaling-v6-4-ce89968c5247@redhat.com>
[-- Attachment #1: Type: text/plain, Size: 4386 bytes --]
On Fri, Mar 13, 2026 at 12:43:11PM -0400, Brian Masney wrote:
> Add a test case where the parent clk rate is set to a rate that's
> acceptable to both children, however the sibling clk rate is affected.
>
> The tests in this commit use the following simplified clk tree with
> the initial state:
>
> parent
> 24 MHz
> / \
> child1 child2
> 24 MHz 24 MHz
>
> child1 and child2 both divider-only clocks that have CLK_SET_RATE_PARENT
> set, and the parent is capable of achieving any rate.
>
> child1 requests 32 MHz, and the tree should end up with the state:
>
> parent
> 96 MHz
> / \
> child1 child2
> 32 MHz 24 MHz
>
> However, child2 ends up with it's parent rate due to the way the clk
> core currently calculates handles rate changes.
>
> parent
> 96 MHz
> / \
> child1 child2
> 32 MHz 96 MHz
> ^^^^^^
> Incorrect. Should be 24 MHz.
>
> Let's document this behavior with a kunit test since some boards are
> unknowingly dependent on this behavior.
>
> Link: https://lore.kernel.org/linux-clk/aUSWU7UymULCXOeF@redhat.com/
> Link: https://lpc.events/event/19/contributions/2152/
> Signed-off-by: Brian Masney <bmasney@redhat.com>
> ---
> drivers/clk/clk_test.c | 61 ++++++++++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 61 insertions(+)
>
> diff --git a/drivers/clk/clk_test.c b/drivers/clk/clk_test.c
> index 325da7c84ab2ecdcf6b7a023ce4c2c4ef2d49862..40bc01a0259d8d49ca4c1983b6c10a3684a95f0b 100644
> --- a/drivers/clk/clk_test.c
> +++ b/drivers/clk/clk_test.c
> @@ -181,6 +181,26 @@ static const struct clk_ops clk_dummy_div_ops = {
> .set_rate = clk_dummy_div_set_rate,
> };
>
> +static int clk_dummy_div_lcm_determine_rate(struct clk_hw *hw,
> + struct clk_rate_request *req)
> +{
> + struct clk_hw *parent_hw = clk_hw_get_parent(hw);
> +
> + if (!(clk_hw_get_flags(hw) & CLK_SET_RATE_PARENT) && req->best_parent_rate < req->rate)
> + return -EINVAL;
> +
> + req->best_parent_rate = clk_hw_get_children_lcm(parent_hw, hw, req->rate);
> + req->best_parent_hw = parent_hw;
> +
> + return divider_determine_rate(hw, req, NULL, CLK_DUMMY_DIV_WIDTH, CLK_DUMMY_DIV_FLAGS);
> +}
> +
> +static const struct clk_ops clk_dummy_div_lcm_ops = {
> + .recalc_rate = clk_dummy_div_recalc_rate,
> + .determine_rate = clk_dummy_div_lcm_determine_rate,
> + .set_rate = clk_dummy_div_set_rate,
> +};
> +
> struct clk_multiple_parent_ctx {
> struct clk_dummy_context parents_ctx[2];
> struct clk_hw hw;
> @@ -677,6 +697,18 @@ clk_rate_change_sibling_div_div_test_regular_ops_params[] = {
> KUNIT_ARRAY_PARAM_DESC(clk_rate_change_sibling_div_div_test_regular_ops,
> clk_rate_change_sibling_div_div_test_regular_ops_params, desc)
>
> +static const struct clk_rate_change_sibling_div_div_test_param
> +clk_rate_change_sibling_div_div_test_lcm_ops_v1_params[] = {
> + {
> + .desc = "lcm_ops_v1",
> + .ops = &clk_dummy_div_lcm_ops,
> + .extra_child_flags = 0,
> + },
> +};
> +
> +KUNIT_ARRAY_PARAM_DESC(clk_rate_change_sibling_div_div_test_lcm_ops_v1,
> + clk_rate_change_sibling_div_div_test_lcm_ops_v1_params, desc)
> +
> static int clk_rate_change_sibling_div_div_test_init(struct kunit *test)
> {
> const struct clk_rate_change_sibling_div_div_test_param *param = test->param_value;
> @@ -777,11 +809,40 @@ static void clk_test_rate_change_sibling_div_div_2_v1(struct kunit *test)
> KUNIT_EXPECT_EQ(test, ctx->child2.div, 1);
> }
>
> +/*
> + * Test that, for a parent with two divider-only children with CLK_SET_RATE_PARENT
> + * set and one requests a rate incompatible with the existing parent rate, the
> + * sibling rate is also affected. This preserves existing behavior in the clk
> + * core that some drivers may be unknowingly dependent on.
> + */
This description is identical to the one for
clk_test_rate_change_sibling_div_div_2_v1(), so it's not clear to me
what the difference between those two tests are.
Maxime
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 273 bytes --]
next prev parent reply other threads:[~2026-03-19 9:22 UTC|newest]
Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-03-13 16:43 [PATCH v6 0/7] clk: add support for v1 / v2 clock rate negotiation and kunit tests Brian Masney
2026-03-13 16:43 ` [PATCH v6 1/7] clk: test: introduce clk_dummy_div for a mock divider Brian Masney
2026-03-16 12:09 ` Maxime Ripard
2026-03-13 16:43 ` [PATCH v6 2/7] clk: test: introduce test suite for sibling rate changes on a divider Brian Masney
2026-03-19 9:10 ` Maxime Ripard
2026-03-19 11:08 ` Brian Masney
2026-03-20 13:03 ` Maxime Ripard
2026-03-20 13:08 ` Brian Masney
2026-03-20 14:29 ` Maxime Ripard
2026-03-20 14:34 ` Brian Masney
2026-03-13 16:43 ` [PATCH v6 3/7] clk: introduce new helper clk_hw_get_children_lcm() to calculate LCM of all child rates Brian Masney
2026-03-19 9:16 ` Maxime Ripard
2026-03-13 16:43 ` [PATCH v6 4/7] clk: test: introduce additional test case showing sibling clock rate change Brian Masney
2026-03-19 9:22 ` Maxime Ripard [this message]
2026-03-19 15:14 ` Brian Masney
2026-03-13 16:43 ` [PATCH v6 5/7] clk: introduce new flag CLK_V2_RATE_NEGOTIATION for sensitive clocks Brian Masney
2026-03-19 9:35 ` Maxime Ripard
2026-03-19 10:35 ` Brian Masney
2026-03-20 14:31 ` Maxime Ripard
2026-03-20 14:33 ` Maxime Ripard
2026-03-20 14:44 ` Brian Masney
2026-03-13 16:43 ` [PATCH v6 6/7] clk: divider: enable optional support for v2 rate negotiation Brian Masney
2026-03-19 9:36 ` Maxime Ripard
2026-03-13 16:43 ` [PATCH v6 7/7] clk: test: introduce additional test case showing v2 rate change + LCM parent Brian Masney
2026-03-19 9:43 ` Maxime Ripard
2026-03-19 11:09 ` Brian Masney
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=20260319-enchanted-flying-sparrow-5a6446@houat \
--to=mripard@kernel.org \
--cc=aruiz@redhat.com \
--cc=bmasney@redhat.com \
--cc=linux-clk@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mturquette@baylibre.com \
--cc=sboyd@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 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.