diff options
Diffstat (limited to 'drivers/clk/clk.c')
-rw-r--r-- | drivers/clk/clk.c | 26 |
1 files changed, 17 insertions, 9 deletions
diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c index 687b00d67c8a..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); |
@@ -999,7 +1002,7 @@ static struct clk *__clk_init_parent(struct clk *clk) | |||
999 | 1002 | ||
1000 | if (!clk->parents) | 1003 | if (!clk->parents) |
1001 | clk->parents = | 1004 | clk->parents = |
1002 | kmalloc((sizeof(struct clk*) * clk->num_parents), | 1005 | kzalloc((sizeof(struct clk*) * clk->num_parents), |
1003 | GFP_KERNEL); | 1006 | GFP_KERNEL); |
1004 | 1007 | ||
1005 | if (!clk->parents) | 1008 | if (!clk->parents) |
@@ -1065,9 +1068,13 @@ static int __clk_set_parent(struct clk *clk, struct clk *parent) | |||
1065 | old_parent = clk->parent; | 1068 | old_parent = clk->parent; |
1066 | 1069 | ||
1067 | /* find index of new parent clock using cached parent ptrs */ | 1070 | /* find index of new parent clock using cached parent ptrs */ |
1068 | for (i = 0; i < clk->num_parents; i++) | 1071 | if (clk->parents) |
1069 | if (clk->parents[i] == parent) | 1072 | for (i = 0; i < clk->num_parents; i++) |
1070 | break; | 1073 | if (clk->parents[i] == parent) |
1074 | break; | ||
1075 | else | ||
1076 | clk->parents = kzalloc((sizeof(struct clk*) * clk->num_parents), | ||
1077 | GFP_KERNEL); | ||
1071 | 1078 | ||
1072 | /* | 1079 | /* |
1073 | * find index of new parent clock using string name comparison | 1080 | * find index of new parent clock using string name comparison |
@@ -1076,7 +1083,8 @@ static int __clk_set_parent(struct clk *clk, struct clk *parent) | |||
1076 | if (i == clk->num_parents) | 1083 | if (i == clk->num_parents) |
1077 | for (i = 0; i < clk->num_parents; i++) | 1084 | for (i = 0; i < clk->num_parents; i++) |
1078 | if (!strcmp(clk->parent_names[i], parent->name)) { | 1085 | if (!strcmp(clk->parent_names[i], parent->name)) { |
1079 | clk->parents[i] = __clk_lookup(parent->name); | 1086 | if (clk->parents) |
1087 | clk->parents[i] = __clk_lookup(parent->name); | ||
1080 | break; | 1088 | break; |
1081 | } | 1089 | } |
1082 | 1090 | ||