diff options
-rw-r--r-- | drivers/clk/clk-divider.c | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/drivers/clk/clk-divider.c b/drivers/clk/clk-divider.c index 2ce22447d76e..945405fee1ab 100644 --- a/drivers/clk/clk-divider.c +++ b/drivers/clk/clk-divider.c | |||
@@ -150,6 +150,7 @@ static int clk_divider_bestdiv(struct clk_hw *hw, unsigned long rate, | |||
150 | struct clk_divider *divider = to_clk_divider(hw); | 150 | struct clk_divider *divider = to_clk_divider(hw); |
151 | int i, bestdiv = 0; | 151 | int i, bestdiv = 0; |
152 | unsigned long parent_rate, best = 0, now, maxdiv; | 152 | unsigned long parent_rate, best = 0, now, maxdiv; |
153 | unsigned long parent_rate_saved = *best_parent_rate; | ||
153 | 154 | ||
154 | if (!rate) | 155 | if (!rate) |
155 | rate = 1; | 156 | rate = 1; |
@@ -173,6 +174,15 @@ static int clk_divider_bestdiv(struct clk_hw *hw, unsigned long rate, | |||
173 | for (i = 1; i <= maxdiv; i++) { | 174 | for (i = 1; i <= maxdiv; i++) { |
174 | if (!_is_valid_div(divider, i)) | 175 | if (!_is_valid_div(divider, i)) |
175 | continue; | 176 | continue; |
177 | if (rate * i == parent_rate_saved) { | ||
178 | /* | ||
179 | * It's the most ideal case if the requested rate can be | ||
180 | * divided from parent clock without needing to change | ||
181 | * parent rate, so return the divider immediately. | ||
182 | */ | ||
183 | *best_parent_rate = parent_rate_saved; | ||
184 | return i; | ||
185 | } | ||
176 | parent_rate = __clk_round_rate(__clk_get_parent(hw->clk), | 186 | parent_rate = __clk_round_rate(__clk_get_parent(hw->clk), |
177 | MULT_ROUND_UP(rate, i)); | 187 | MULT_ROUND_UP(rate, i)); |
178 | now = parent_rate / i; | 188 | now = parent_rate / i; |