diff options
Diffstat (limited to 'drivers/clk/clk-uclass.c')
-rw-r--r-- | drivers/clk/clk-uclass.c | 22 |
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) |