diff mbox series

clk: tegra: Avoid calling an uninitialized function

Message ID 20230630130748.840729-1-thierry.reding@gmail.com (mailing list archive)
State Accepted, archived
Headers show
Series clk: tegra: Avoid calling an uninitialized function | expand

Commit Message

Thierry Reding June 30, 2023, 1:07 p.m. UTC
From: Thierry Reding <treding@nvidia.com>

Commit 493ffb046cf5 ("clk: tegra: super: Switch to determine_rate")
replaced clk_super_round_rate() by clk_super_determine_rate(), but
didn't update one callsite that was explicitly calling the old
tegra_clk_super_ops.round_rate() function, which was now NULL. This
resulted in a crash on Tegra30 systems during early boot.

Switch this callsite over to the clk_super_determine_rate() equivalent
to avoid the crash.

Fixes: 493ffb046cf5 ("clk: tegra: super: Switch to determine_rate")
Tested-by: Dmitry Osipenko <digetx@gmail.com>
Signed-off-by: Thierry Reding <treding@nvidia.com>
---
 drivers/clk/tegra/clk-tegra-super-cclk.c | 15 ++++++++++++---
 1 file changed, 12 insertions(+), 3 deletions(-)

Comments

Stephen Boyd July 4, 2023, 3:54 p.m. UTC | #1
Quoting Thierry Reding (2023-06-30 06:07:48)
> From: Thierry Reding <treding@nvidia.com>
> 
> Commit 493ffb046cf5 ("clk: tegra: super: Switch to determine_rate")
> replaced clk_super_round_rate() by clk_super_determine_rate(), but
> didn't update one callsite that was explicitly calling the old
> tegra_clk_super_ops.round_rate() function, which was now NULL. This
> resulted in a crash on Tegra30 systems during early boot.
> 
> Switch this callsite over to the clk_super_determine_rate() equivalent
> to avoid the crash.
> 
> Fixes: 493ffb046cf5 ("clk: tegra: super: Switch to determine_rate")
> Tested-by: Dmitry Osipenko <digetx@gmail.com>
> Signed-off-by: Thierry Reding <treding@nvidia.com>
> ---

Applied to clk-next
diff mbox series

Patch

diff --git a/drivers/clk/tegra/clk-tegra-super-cclk.c b/drivers/clk/tegra/clk-tegra-super-cclk.c
index 68d7bcd5fc8a..3b22a4d0dffc 100644
--- a/drivers/clk/tegra/clk-tegra-super-cclk.c
+++ b/drivers/clk/tegra/clk-tegra-super-cclk.c
@@ -86,9 +86,18 @@  static int cclk_super_determine_rate(struct clk_hw *hw,
 	if (rate <= pllp_rate) {
 		if (super->flags & TEGRA20_SUPER_CLK)
 			rate = pllp_rate;
-		else
-			rate = tegra_clk_super_ops.round_rate(hw, rate,
-							      &pllp_rate);
+		else {
+			struct clk_rate_request parent = {
+				.rate = req->rate,
+				.best_parent_rate = pllp_rate,
+			};
+
+			clk_hw_get_rate_range(hw, &parent.min_rate,
+					      &parent.max_rate);
+			tegra_clk_super_ops.determine_rate(hw, &parent);
+			pllp_rate = parent.best_parent_rate;
+			rate = parent.rate;
+		}
 
 		req->best_parent_rate = pllp_rate;
 		req->best_parent_hw = pllp_hw;