* [PATCH] clk: xilinx: Optimize divisor search in clk_wzrd_get_divisors_ver()
@ 2025-07-29 5:08 Shubhrajyoti Datta
2025-09-21 17:57 ` Stephen Boyd
0 siblings, 1 reply; 2+ messages in thread
From: Shubhrajyoti Datta @ 2025-07-29 5:08 UTC (permalink / raw)
To: linux-clk, linux-kernel
Cc: git, Michael Turquette, Stephen Boyd, Michal Simek,
Shubhrajyoti Datta
Optimise the clock wizard divisor calculation by eliminating the innermost
loop over output divider o. Earlier there was an error that is returned
if the WZRD_MIN_ERR is not achieved error is returned now it computes
the best possible frequency.
Signed-off-by: Shubhrajyoti Datta <shubhrajyoti.datta@amd.com>
---
For someof the input frequency choices
setting 233250000 -> 233331003 diff is 81003
if minerr is 20000 it was returning error now it will
compute the nearest frequency.
drivers/clk/xilinx/clk-xlnx-clock-wizard.c | 32 ++++++++++++----------
1 file changed, 18 insertions(+), 14 deletions(-)
diff --git a/drivers/clk/xilinx/clk-xlnx-clock-wizard.c b/drivers/clk/xilinx/clk-xlnx-clock-wizard.c
index 3efce7b88906..4775cde45e21 100644
--- a/drivers/clk/xilinx/clk-xlnx-clock-wizard.c
+++ b/drivers/clk/xilinx/clk-xlnx-clock-wizard.c
@@ -344,7 +344,7 @@ static int clk_wzrd_get_divisors_ver(struct clk_hw *hw, unsigned long rate,
unsigned long parent_rate)
{
struct clk_wzrd_divider *divider = to_clk_wzrd_divider(hw);
- u64 vco_freq, freq, diff, vcomin, vcomax;
+ u64 vco_freq, freq, diff, vcomin, vcomax, best_diff = -1ULL;
u32 m, d, o;
u32 mmin, mmax, dmin, dmax, omin, omax;
@@ -360,22 +360,26 @@ static int clk_wzrd_get_divisors_ver(struct clk_hw *hw, unsigned long rate,
for (m = mmin; m <= mmax; m++) {
for (d = dmin; d <= dmax; d++) {
vco_freq = DIV_ROUND_CLOSEST((parent_rate * m), d);
- if (vco_freq >= vcomin && vco_freq <= vcomax) {
- for (o = omin; o <= omax; o++) {
- freq = DIV_ROUND_CLOSEST_ULL(vco_freq, o);
- diff = abs(freq - rate);
-
- if (diff < WZRD_MIN_ERR) {
- divider->m = m;
- divider->d = d;
- divider->o = o;
- return 0;
- }
- }
+ if (vco_freq < vcomin || vco_freq > vcomax)
+ continue;
+
+ o = DIV_ROUND_CLOSEST_ULL(vco_freq, rate);
+ if (o < omin || o > omax)
+ continue;
+ freq = DIV_ROUND_CLOSEST_ULL(vco_freq, o);
+ diff = abs(freq - rate);
+
+ if (diff < best_diff) {
+ best_diff = diff;
+ divider->m = m;
+ divider->d = d;
+ divider->o = o;
+ if (!diff)
+ return 0;
}
}
}
- return -EBUSY;
+ return 0;
}
static int clk_wzrd_get_divisors(struct clk_hw *hw, unsigned long rate,
--
2.34.1
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [PATCH] clk: xilinx: Optimize divisor search in clk_wzrd_get_divisors_ver()
2025-07-29 5:08 [PATCH] clk: xilinx: Optimize divisor search in clk_wzrd_get_divisors_ver() Shubhrajyoti Datta
@ 2025-09-21 17:57 ` Stephen Boyd
0 siblings, 0 replies; 2+ messages in thread
From: Stephen Boyd @ 2025-09-21 17:57 UTC (permalink / raw)
To: Shubhrajyoti Datta, linux-clk, linux-kernel
Cc: git, Michael Turquette, Michal Simek, Shubhrajyoti Datta
Quoting Shubhrajyoti Datta (2025-07-28 22:08:42)
> Optimise the clock wizard divisor calculation by eliminating the innermost
> loop over output divider o. Earlier there was an error that is returned
> if the WZRD_MIN_ERR is not achieved error is returned now it computes
> the best possible frequency.
>
> Signed-off-by: Shubhrajyoti Datta <shubhrajyoti.datta@amd.com>
> ---
Applied to clk-next
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2025-09-21 17:57 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-07-29 5:08 [PATCH] clk: xilinx: Optimize divisor search in clk_wzrd_get_divisors_ver() Shubhrajyoti Datta
2025-09-21 17:57 ` Stephen Boyd
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox