summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorVignesh Raghavendra <vigneshr@ti.com>2023-01-17 20:22:30 +0530
committerAnand Gadiyar <gadiyar@ti.com>2023-01-18 18:29:35 -0600
commitf8cb8ab8a3e9fbb67bf599d4b95537fe84b2b22e (patch)
treee3bcde517a9f64dca5caa3fb0e25496ff66fa18f /drivers
parent058469c6a8b3e35316a6349f339a328ae414d4c5 (diff)
clk: clk-k3: Fix possible failure wrt PLL reconfig
Check if the parent pll rate is indeed set to target rate, if not fallback adjusting dividers to get within 5% of requested rate This is required to set correct rate for DDR PLLs on AM62A resulting in lower DDR bandwidth when measured with lmbench (bw_mem) Signed-off-by: Vignesh Raghavendra <vigneshr@ti.com> Reviewed-by: Bryan Brattlof <bb@ti.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/clk/clk-k3.c10
1 files changed, 6 insertions, 4 deletions
diff --git a/drivers/clk/clk-k3.c b/drivers/clk/clk-k3.c
index 844accb796..6c47f43786 100644
--- a/drivers/clk/clk-k3.c
+++ b/drivers/clk/clk-k3.c
@@ -244,7 +244,7 @@ static ulong ti_clk_set_rate(struct clk *clk, ulong rate)
int div = 1;
ulong child_rate;
const struct clk_ops *ops;
- ulong new_rate, rem;
+ ulong new_rate, rem, temp_rate;
ulong diff, new_diff;
/*
@@ -287,7 +287,7 @@ static ulong ti_clk_set_rate(struct clk *clk, ulong rate)
* following directly a PLL
*/
- if (diff > rate / div / 8) {
+ if ((diff > rate / div / 8) && clk_get_parent(clkp)) {
ulong pll_tgt;
int pll_div = 0;
@@ -317,9 +317,11 @@ static ulong ti_clk_set_rate(struct clk *clk, ulong rate)
debug("%s: pll_tgt=%u, rate=%u, div=%u\n", __func__,
(u32)pll_tgt, (u32)rate, pll_div);
- clk_set_rate(clkp, pll_tgt);
+ temp_rate = clk_set_rate(clkp, pll_tgt);
+ if (temp_rate == pll_tgt)
+ return clk_set_rate(clk, rate / div) * div;
- return clk_set_rate(clk, rate / div) * div;
+ clkp = clk;
}
/*