From abea98e1fa7a3760589198a9c33ca9ff2c2b61ad Mon Sep 17 00:00:00 2001 From: Alex Frid Date: Mon, 24 Apr 2017 18:51:00 -0700 Subject: [PATCH] clk: tegra: Fix shared bus connector rate update When connector rate is updated the result cannot be used directly to set new rate, since it represents only users of this connector, and does not take into account rates of the sibling connector (if any). Instead, rate update of the parent (top level bus) should be called recursively. Bug 1903909 Bug 200269751 Change-Id: Ic2b36767c3a53c6ed584e4f5199ff4ebdf02e92e Signed-off-by: Alex Frid Reviewed-on: http://git-master/r/1469100 (cherry picked from commit 9c854a599810da951613012a4b461b16cb1d501c) Reviewed-on: http://git-master/r/1480205 Reviewed-by: Automatic_Commit_Validation_User GVS: Gerrit_Virtual_Submit Reviewed-by: Yu-Huan Hsu --- drivers/clk/tegra/clk-cbus-shared.c | 32 ++++++++++++++++------------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/drivers/clk/tegra/clk-cbus-shared.c b/drivers/clk/tegra/clk-cbus-shared.c index bdb6e96d0246..c2f7428d753d 100644 --- a/drivers/clk/tegra/clk-cbus-shared.c +++ b/drivers/clk/tegra/clk-cbus-shared.c @@ -422,20 +422,6 @@ static int _simple_shared_update(struct tegra_clk_cbus_shared *bus) return err; } -static int _connect_shared_update(struct tegra_clk_cbus_shared *bus) -{ - unsigned long rate; - int err; - - rate = _clk_shared_bus_update(bus, NULL, NULL, NULL); - - bus->u.shared_bus_user.rate = rate; - - err = clk_set_rate(bus->hw.clk, rate); - - return err; -} - static int clk_shared_bus_update(struct clk *bus) { struct tegra_clk_cbus_shared *cbus = @@ -478,6 +464,22 @@ static void clk_shared_unprepare(struct clk_hw *hw) clk_shared_bus_update(clk_get_parent(hw->clk)); } +static int _connect_shared_update(struct tegra_clk_cbus_shared *bus) +{ + unsigned long rate; + int err; + + rate = _clk_shared_bus_update(bus, NULL, NULL, NULL); + + bus->u.shared_bus_user.rate = rate; + pr_debug("%s: %s: user.rate is set to %lu\n", + __func__, clk_hw_get_name(&bus->hw), rate); + + err = clk_shared_bus_update(clk_get_parent(bus->hw.clk)); + + return err; +} + static int clk_shared_connect_master_prepare(struct clk_hw *hw) { struct tegra_clk_cbus_shared *shared = to_clk_cbus_shared(hw); @@ -510,6 +512,8 @@ static int clk_shared_set_rate(struct clk_hw *hw, unsigned long rate, return 0; shared->u.shared_bus_user.rate = rate; + pr_debug("%s: %s: user.rate is set to %lu\n", + __func__, clk_hw_get_name(hw), rate); return clk_shared_bus_update(clk_get_parent(hw->clk)); } -- 2.39.2