summaryrefslogtreecommitdiff
path: root/drivers/clk/clk-uclass.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/clk/clk-uclass.c')
-rw-r--r--drivers/clk/clk-uclass.c22
1 files changed, 19 insertions, 3 deletions
diff --git a/drivers/clk/clk-uclass.c b/drivers/clk/clk-uclass.c
index 90b70529a47..bc4d76277cd 100644
--- a/drivers/clk/clk-uclass.c
+++ b/drivers/clk/clk-uclass.c
@@ -572,6 +572,9 @@ static void clk_clean_rate_cache(struct clk *clk)
clk->rate = 0;
list_for_each_entry(child_dev, &clk->dev->child_head, sibling_node) {
+ if (device_get_uclass_id(child_dev) != UCLASS_CLK)
+ continue;
+
clkp = dev_get_clk_ptr(child_dev);
clk_clean_rate_cache(clkp);
}
@@ -623,14 +626,27 @@ int clk_set_parent(struct clk *clk, struct clk *parent)
if (!ops->set_parent)
return -ENOSYS;
+ ret = clk_enable(parent);
+ if (ret) {
+ printf("Cannot enable parent %s\n", parent->dev->name);
+ return ret;
+ }
+
ret = ops->set_parent(clk, parent);
- if (ret)
+ if (ret) {
+ clk_disable(parent);
return ret;
+ }
- if (CONFIG_IS_ENABLED(CLK_CCF))
+ if (CONFIG_IS_ENABLED(CLK_CCF)) {
ret = device_reparent(clk->dev, parent->dev);
+ if (ret) {
+ clk_disable(parent);
+ return ret;
+ }
+ }
- return ret;
+ return 0;
}
int clk_enable(struct clk *clk)