summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Turquette <mturquette@baylibre.com>2016-07-08 16:32:10 -0700
committerStephen Boyd <sboyd@codeaurora.org>2016-08-11 18:06:50 -0700
commit904e6ead02dcb409cb6eb5ec1c31dc2c7c28b5df (patch)
treec81655dfc23146f3a85d74ffacc71f036fab97c9
parente0cb1b84163720ec67ff0e54397fd3f57ad4a4dd (diff)
downloadblackbird-obmc-linux-904e6ead02dcb409cb6eb5ec1c31dc2c7c28b5df.tar.gz
blackbird-obmc-linux-904e6ead02dcb409cb6eb5ec1c31dc2c7c28b5df.zip
clk: migrate ref counts when orphans are reunited
It's always nice to see families reunited, and this is equally true when talking about parent clocks and their children. However, if the orphan clk had a positive prepare_count or enable_count, then we would not migrate those counts up the parent chain correctly. This has manifested with the recent critical clocks feature, which often enables clocks very early, before their parents have been registered. Fixed by replacing the call to clk_core_reparent with calls to __clk_set_parent_{before,after}. Cc: James Liao <jamesjj.liao@mediatek.com> Cc: Erin Lo <erin.lo@mediatek.com> Signed-off-by: Michael Turquette <mturquette@baylibre.com> [sboyd@codeaurora.org: Recalc accuracies and rates too] Signed-off-by: Stephen Boyd <sboyd@codeaurora.org>
-rw-r--r--drivers/clk/clk.c12
1 files changed, 10 insertions, 2 deletions
diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c
index 820a939fb6bb..238b989bf778 100644
--- a/drivers/clk/clk.c
+++ b/drivers/clk/clk.c
@@ -2449,8 +2449,16 @@ static int __clk_core_init(struct clk_core *core)
hlist_for_each_entry_safe(orphan, tmp2, &clk_orphan_list, child_node) {
struct clk_core *parent = __clk_init_parent(orphan);
- if (parent)
- clk_core_reparent(orphan, parent);
+ /*
+ * we could call __clk_set_parent, but that would result in a
+ * redundant call to the .set_rate op, if it exists
+ */
+ if (parent) {
+ __clk_set_parent_before(orphan, parent);
+ __clk_set_parent_after(orphan, parent, NULL);
+ __clk_recalc_accuracies(orphan);
+ __clk_recalc_rates(orphan, 0);
+ }
}
/*
OpenPOWER on IntegriCloud