[PATCH 7/8] clk: divider: round up when searching for the best divider

Ahmad Fatoum a.fatoum at pengutronix.de
Mon Aug 31 12:35:54 PDT 2026


From: Ahmad Fatoum <a.fatoum at barebox.org>

clk_divider_bestdiv() compares candidates with a truncating division,
while divider_recalc_rate() rounds up. The search thus accepts a divider
whose reported rate is 1 Hz above the request, making clk_round_rate()
non-idempotent. Use DIV_ROUND_UP_ULL() there as well, as Linux commit
b11d282dbea2 ("clk: divider: fix rate calculation for fractional
rates") does; its other hunks barebox already has.

On i.MX6, clk_round_rate(ipu1_di0, 65 MHz) now yields 64800000 instead
of 40500000.

Fixes: e27c0b64db01 ("clk: add divider_recalc_rate helper")
Reported-by: Claude:opus-5
Signed-off-by: Ahmad Fatoum <a.fatoum at barebox.org>
---
 drivers/clk/clk-divider.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/clk/clk-divider.c b/drivers/clk/clk-divider.c
index 97dc9679c91c..8e630ccde4e6 100644
--- a/drivers/clk/clk-divider.c
+++ b/drivers/clk/clk-divider.c
@@ -213,7 +213,7 @@ static int clk_divider_bestdiv(struct clk *clk, unsigned long rate,
 		}
 		parent_rate = clk_round_rate(clk_get_parent(clk),
 				MULT_ROUND_UP(rate, i));
-		now = parent_rate / i;
+		now = DIV_ROUND_UP_ULL((u64)parent_rate, i);
 		if (now <= rate && now > best) {
 			bestdiv = i;
 			best = now;
-- 
2.47.3




More information about the barebox mailing list