[PATCH 2/5] clk: Fix v2 rate negotiation with composite clocks
From: Miquel Raynal
Date: Wed Oct 21 2026 - 09:14:26 EST
V2 rate negotiation walks the subtree using the composite hw clocks (the
ones that we have acces to while walking the clock tree), but compares
it internally with the inner hw clocks (typically the inner divider of a
composite clock). Since these may be different pointers in the case of
composite clocks, the comparison won't match for them, which fails the
whole v2 rate negociation logic.
Always use the top level core clock instead. Comparing the top level hw
clocks instead of the core clocks would also work, at the cost of an
extra pointer dereference.
Signed-off-by: Miquel Raynal <miquel.raynal@xxxxxxxxxxx>
---
Brian, if you agree with this change, you may keep this fix or fold it
into your series, at your own preference.
---
drivers/clk/clk.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c
index 745b13a77c83..349c35ab8a5d 100644
--- a/drivers/clk/clk.c
+++ b/drivers/clk/clk.c
@@ -917,7 +917,7 @@ unsigned long clk_hw_get_children_lcm(struct clk_hw *hw, struct clk_hw *requesti
hlist_for_each_entry(child, &hw->core->children, child_node) {
/* Use requesting rate for the requesting child, current rate for others */
- if (child->hw == requesting_hw) {
+ if (requesting_hw && child == requesting_hw->core) {
child_rate = requesting_rate;
} else {
if (!clk_hw_is_enabled(child->hw))
--
2.56.0