aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/clk/clk.c25
1 files changed, 14 insertions, 11 deletions
diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c
index a004769528e6..9e0a8372f59c 100644
--- a/drivers/clk/clk.c
+++ b/drivers/clk/clk.c
@@ -1080,13 +1080,16 @@ unsigned long clk_get_rate(struct clk *clk)
1080} 1080}
1081EXPORT_SYMBOL_GPL(clk_get_rate); 1081EXPORT_SYMBOL_GPL(clk_get_rate);
1082 1082
1083static u8 clk_fetch_parent_index(struct clk *clk, struct clk *parent) 1083static int clk_fetch_parent_index(struct clk *clk, struct clk *parent)
1084{ 1084{
1085 u8 i; 1085 int i;
1086 1086
1087 if (!clk->parents) 1087 if (!clk->parents) {
1088 clk->parents = kzalloc((sizeof(struct clk*) * clk->num_parents), 1088 clk->parents = kzalloc((sizeof(struct clk*) * clk->num_parents),
1089 GFP_KERNEL); 1089 GFP_KERNEL);
1090 if (!clk->parents)
1091 return -ENOMEM;
1092 }
1090 1093
1091 /* 1094 /*
1092 * find index of new parent clock using cached parent ptrs, 1095 * find index of new parent clock using cached parent ptrs,
@@ -1095,15 +1098,15 @@ static u8 clk_fetch_parent_index(struct clk *clk, struct clk *parent)
1095 */ 1098 */
1096 for (i = 0; i < clk->num_parents; i++) { 1099 for (i = 0; i < clk->num_parents; i++) {
1097 if (clk->parents && clk->parents[i] == parent) 1100 if (clk->parents && clk->parents[i] == parent)
1098 break; 1101 return i;
1099 else if (!strcmp(clk->parent_names[i], parent->name)) { 1102 else if (!strcmp(clk->parent_names[i], parent->name)) {
1100 if (clk->parents) 1103 if (clk->parents)
1101 clk->parents[i] = __clk_lookup(parent->name); 1104 clk->parents[i] = __clk_lookup(parent->name);
1102 break; 1105 return i;
1103 } 1106 }
1104 } 1107 }
1105 1108
1106 return i; 1109 return -EINVAL;
1107} 1110}
1108 1111
1109static void clk_reparent(struct clk *clk, struct clk *new_parent) 1112static void clk_reparent(struct clk *clk, struct clk *new_parent)
@@ -1265,7 +1268,7 @@ static struct clk *clk_calc_new_rates(struct clk *clk, unsigned long rate)
1265 struct clk *old_parent, *parent; 1268 struct clk *old_parent, *parent;
1266 unsigned long best_parent_rate = 0; 1269 unsigned long best_parent_rate = 0;
1267 unsigned long new_rate; 1270 unsigned long new_rate;
1268 u8 p_index = 0; 1271 int p_index = 0;
1269 1272
1270 /* sanity */ 1273 /* sanity */
1271 if (IS_ERR_OR_NULL(clk)) 1274 if (IS_ERR_OR_NULL(clk))
@@ -1306,7 +1309,7 @@ static struct clk *clk_calc_new_rates(struct clk *clk, unsigned long rate)
1306 /* try finding the new parent index */ 1309 /* try finding the new parent index */
1307 if (parent) { 1310 if (parent) {
1308 p_index = clk_fetch_parent_index(clk, parent); 1311 p_index = clk_fetch_parent_index(clk, parent);
1309 if (p_index == clk->num_parents) { 1312 if (p_index < 0) {
1310 pr_debug("%s: clk %s can not be parent of clk %s\n", 1313 pr_debug("%s: clk %s can not be parent of clk %s\n",
1311 __func__, parent->name, clk->name); 1314 __func__, parent->name, clk->name);
1312 return NULL; 1315 return NULL;
@@ -1568,7 +1571,7 @@ void __clk_reparent(struct clk *clk, struct clk *new_parent)
1568int clk_set_parent(struct clk *clk, struct clk *parent) 1571int clk_set_parent(struct clk *clk, struct clk *parent)
1569{ 1572{
1570 int ret = 0; 1573 int ret = 0;
1571 u8 p_index = 0; 1574 int p_index = 0;
1572 unsigned long p_rate = 0; 1575 unsigned long p_rate = 0;
1573 1576
1574 if (!clk) 1577 if (!clk)
@@ -1597,10 +1600,10 @@ int clk_set_parent(struct clk *clk, struct clk *parent)
1597 if (parent) { 1600 if (parent) {
1598 p_index = clk_fetch_parent_index(clk, parent); 1601 p_index = clk_fetch_parent_index(clk, parent);
1599 p_rate = parent->rate; 1602 p_rate = parent->rate;
1600 if (p_index == clk->num_parents) { 1603 if (p_index < 0) {
1601 pr_debug("%s: clk %s can not be parent of clk %s\n", 1604 pr_debug("%s: clk %s can not be parent of clk %s\n",
1602 __func__, parent->name, clk->name); 1605 __func__, parent->name, clk->name);
1603 ret = -EINVAL; 1606 ret = p_index;
1604 goto out; 1607 goto out;
1605 } 1608 }
1606 } 1609 }