diff options
| -rw-r--r-- | drivers/clk/clk.c | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c index df89cbfc1bd0..dcbe05616090 100644 --- a/drivers/clk/clk.c +++ b/drivers/clk/clk.c | |||
| @@ -850,18 +850,21 @@ static void clk_change_rate(struct clk *clk) | |||
| 850 | { | 850 | { |
| 851 | struct clk *child; | 851 | struct clk *child; |
| 852 | unsigned long old_rate; | 852 | unsigned long old_rate; |
| 853 | unsigned long best_parent_rate = 0; | ||
| 853 | struct hlist_node *tmp; | 854 | struct hlist_node *tmp; |
| 854 | 855 | ||
| 855 | old_rate = clk->rate; | 856 | old_rate = clk->rate; |
| 856 | 857 | ||
| 858 | if (clk->parent) | ||
| 859 | best_parent_rate = clk->parent->rate; | ||
| 860 | |||
| 857 | if (clk->ops->set_rate) | 861 | if (clk->ops->set_rate) |
| 858 | clk->ops->set_rate(clk->hw, clk->new_rate, clk->parent->rate); | 862 | clk->ops->set_rate(clk->hw, clk->new_rate, best_parent_rate); |
| 859 | 863 | ||
| 860 | if (clk->ops->recalc_rate) | 864 | if (clk->ops->recalc_rate) |
| 861 | clk->rate = clk->ops->recalc_rate(clk->hw, | 865 | clk->rate = clk->ops->recalc_rate(clk->hw, best_parent_rate); |
| 862 | clk->parent->rate); | ||
| 863 | else | 866 | else |
| 864 | clk->rate = clk->parent->rate; | 867 | clk->rate = best_parent_rate; |
| 865 | 868 | ||
| 866 | if (clk->notifier_count && old_rate != clk->rate) | 869 | if (clk->notifier_count && old_rate != clk->rate) |
| 867 | __clk_notify(clk, POST_RATE_CHANGE, old_rate, clk->rate); | 870 | __clk_notify(clk, POST_RATE_CHANGE, old_rate, clk->rate); |
