diff for duplicates of <1494594482.2135.1.camel@baylibre.com> diff --git a/a/1.txt b/N1/1.txt index 2eae685..e37d838 100644 --- a/a/1.txt +++ b/N1/1.txt @@ -9,74 +9,74 @@ On Thu, 2017-05-11 at 12:05 -0700, Michael Turquette wrote: > > > > Signed-off-by: Jerome Brunet <jbrunet@baylibre.com> > > --- -> > ?drivers/clk/clk.c????????????| 177 +> > drivers/clk/clk.c | 177 > > ++++++++++++++++++++++++++++++++++++++++--- -> > ?include/linux/clk-provider.h |???1 + -> > ?include/linux/clk.h??????????|??29 +++++++ -> > ?3 files changed, 197 insertions(+), 10 deletions(-) +> > include/linux/clk-provider.h | 1 + +> > include/linux/clk.h | 29 +++++++ +> > 3 files changed, 197 insertions(+), 10 deletions(-) > > > > diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c > > index fa77a1841e0f..69db8cc15063 100644 > > --- a/drivers/clk/clk.c > > +++ b/drivers/clk/clk.c > > @@ -60,6 +60,7 @@ struct clk_core { -> > ????????bool????????????????????orphan; -> > ????????unsigned int????????????enable_count; -> > ????????unsigned int????????????prepare_count; -> > +???????unsigned int????????????protect_count; -> > ????????unsigned long???????????min_rate; -> > ????????unsigned long???????????max_rate; -> > ????????unsigned long???????????accuracy; +> > bool orphan; +> > unsigned int enable_count; +> > unsigned int prepare_count; +> > + unsigned int protect_count; +> > unsigned long min_rate; +> > unsigned long max_rate; +> > unsigned long accuracy; > > @@ -84,6 +85,7 @@ struct clk { -> > ????????const char *con_id; -> > ????????unsigned long min_rate; -> > ????????unsigned long max_rate; -> > +???????unsigned long protect_ucount; -> > ????????struct hlist_node clks_node; -> > ?}; -> > ? +> > const char *con_id; +> > unsigned long min_rate; +> > unsigned long max_rate; +> > + unsigned long protect_ucount; +> > struct hlist_node clks_node; +> > }; +> > > > @@ -160,6 +162,11 @@ static bool clk_core_is_prepared(struct clk_core *core) -> > ????????return core->ops->is_prepared(core->hw); -> > ?} -> > ? +> > return core->ops->is_prepared(core->hw); +> > } +> > > > +static bool clk_core_is_protected(struct clk_core *core) > > +{ -> > +???????return core->protect_count; +> > + return core->protect_count; > > +} > > + -> > ?static bool clk_core_is_enabled(struct clk_core *core) -> > ?{ -> > ????????/* +> > static bool clk_core_is_enabled(struct clk_core *core) +> > { +> > /* > > @@ -328,6 +335,11 @@ bool clk_hw_is_prepared(const struct clk_hw *hw) -> > ????????return clk_core_is_prepared(hw->core); -> > ?} -> > ? +> > return clk_core_is_prepared(hw->core); +> > } +> > > > +bool clk_hw_is_protected(const struct clk_hw *hw) > > +{ -> > +???????return clk_core_is_protected(hw->core); +> > + return clk_core_is_protected(hw->core); > > +} > > + -> > ?bool clk_hw_is_enabled(const struct clk_hw *hw) -> > ?{ -> > ????????return clk_core_is_enabled(hw->core); +> > bool clk_hw_is_enabled(const struct clk_hw *hw) +> > { +> > return clk_core_is_enabled(hw->core); > > @@ -584,6 +596,89 @@ int clk_prepare(struct clk *clk) -> > ?} -> > ?EXPORT_SYMBOL_GPL(clk_prepare); -> > ? +> > } +> > EXPORT_SYMBOL_GPL(clk_prepare); +> > > > +static void clk_core_unprotect(struct clk_core *core) > > +{ -> > +???????lockdep_assert_held(&prepare_lock); +> > + lockdep_assert_held(&prepare_lock); > > + -> > +???????if (!core) -> > +???????????????return; +> > + if (!core) +> > + return; > > + -> > +???????if (WARN_ON(core->protect_count == 0)) -> > +???????????????return; +> > + if (WARN_ON(core->protect_count == 0)) +> > + return; > > + -> > +???????if (--core->protect_count > 0) -> > +???????????????return; +> > + if (--core->protect_count > 0) +> > + return; > > + -> > +???????clk_core_unprotect(core->parent); +> > + clk_core_unprotect(core->parent); > > +} > > + > > +/** @@ -114,38 +114,38 @@ Like it ! Thx ! > > + */ > > +void clk_unprotect(struct clk *clk) > > +{ -> > +???????if (!clk) -> > +???????????????return; +> > + if (!clk) +> > + return; > > + -> > +???????clk_prepare_lock(); +> > + clk_prepare_lock(); > > + -> > +???????if (WARN_ON(clk->protect_ucount <= 0)) { -> > +???????????????/* -> > +????????????????* There is something wrong with this consumer protect +> > + if (WARN_ON(clk->protect_ucount <= 0)) { +> > + /* +> > + * There is something wrong with this consumer protect > > count. -> > +????????????????* Stop here before messing with the provider -> > +????????????????*/ -> > +???????????????clk_prepare_unlock(); -> > +???????????????return; -> > +???????} -> > + -> > +???????clk_core_unprotect(clk->core); -> > +???????clk->protect_ucount--; -> > +???????clk_prepare_unlock(); +> > + * Stop here before messing with the provider +> > + */ +> > + clk_prepare_unlock(); +> > + return; +> > + } +> > + +> > + clk_core_unprotect(clk->core); +> > + clk->protect_ucount--; +> > + clk_prepare_unlock(); > > +} > > +EXPORT_SYMBOL_GPL(clk_unprotect); > > + > > +static void clk_core_protect(struct clk_core *core) > > +{ -> > +???????lockdep_assert_held(&prepare_lock); +> > + lockdep_assert_held(&prepare_lock); > > + -> > +???????if (!core) -> > +???????????????return; +> > + if (!core) +> > + return; > > + -> > +???????if (core->protect_count == 0) -> > +???????????????clk_core_protect(core->parent); +> > + if (core->protect_count == 0) +> > + clk_core_protect(core->parent); > > + -> > +???????core->protect_count++; +> > + core->protect_count++; > > +} > > + > > +/** @@ -183,27 +183,27 @@ Like it ! Thx ! > > > +void clk_protect(struct clk *clk) > > +{ -> > +???????if (!clk) -> > +???????????????return; +> > + if (!clk) +> > + return; > > + -> > +???????clk_prepare_lock(); -> > +???????clk_core_protect(clk->core); -> > +???????clk->protect_ucount++; -> > +???????clk_prepare_unlock(); +> > + clk_prepare_lock(); +> > + clk_core_protect(clk->core); +> > + clk->protect_ucount++; +> > + clk_prepare_unlock(); > > +} > > +EXPORT_SYMBOL_GPL(clk_protect); > > + -> > ?static void clk_core_disable(struct clk_core *core) -> > ?{ -> > ????????lockdep_assert_held(&enable_lock); +> > static void clk_core_disable(struct clk_core *core) +> > { +> > lockdep_assert_held(&enable_lock); > > @@ -838,7 +933,9 @@ static int clk_core_determine_round(struct clk_core > > *core, -> > ?{ -> > ????????long rate; -> > ? -> > -???????if (core->ops->determine_rate) { -> > +???????if (clk_core_is_protected(core)) { -> > +???????????????req->rate = core->rate; +> > { +> > long rate; +> > +> > - if (core->ops->determine_rate) { +> > + if (clk_core_is_protected(core)) { +> > + req->rate = core->rate; > > Hmm, in CCF we basically re-use round_rate/determine_rate from within > calls to clk_set_rate. The point is that clk_set_rate should set the @@ -234,17 +234,17 @@ I may be wrong but I think it is already the way you want it. Please see below [0] > -> > +???????} else if (core->ops->determine_rate) { -> > ????????????????return core->ops->determine_rate(core->hw, req); -> > ????????} else if (core->ops->round_rate) { -> > ????????????????rate = core->ops->round_rate(core->hw, req->rate, +> > + } else if (core->ops->determine_rate) { +> > return core->ops->determine_rate(core->hw, req); +> > } else if (core->ops->round_rate) { +> > rate = core->ops->round_rate(core->hw, req->rate, > > @@ -1381,7 +1478,7 @@ static struct clk_core *clk_calc_new_rates(struct > > clk_core *core, -> > ????????????????req.min_rate = min_rate; -> > ????????????????req.max_rate = max_rate; -> > ? -> > -???????????????clk_core_init_rate_req(core, req); -> > +???????????????clk_core_init_rate_req(core, &req); +> > req.min_rate = min_rate; +> > req.max_rate = max_rate; +> > +> > - clk_core_init_rate_req(core, req); +> > + clk_core_init_rate_req(core, &req); > > Why isn't this change in patch #3? Seems like a bug introduced in patch > #3 and fixed here in patch #4. @@ -252,12 +252,12 @@ I may be wrong but I think it is already the way you want it. Please see below Indeed, I messed up while formatting the patches :( > -> > ? -> > ????????????????ret = clk_core_determine_round(core, &req); -> > ????????????????if (ret < 0) +> > +> > ret = clk_core_determine_round(core, &req); +> > if (ret < 0) > > @@ -1637,8 +1734,14 @@ int clk_set_rate(struct clk *clk, unsigned long rate) -> > ????????/* prevent racing with updates to the clock topology */ -> > ????????clk_prepare_lock(); +> > /* prevent racing with updates to the clock topology */ +> > clk_prepare_lock(); > > The fact that a user can protect a clk AND change its rate is very > subtle. Please update the kerneldoc for clk_set_rate, clk_set_parent and @@ -266,9 +266,9 @@ Indeed, I messed up while formatting the patches :( Will do > -> > ? -> > +???????if (clk->protect_ucount) -> > +???????????????clk_core_unprotect(clk->core); +> > +> > + if (clk->protect_ucount) +> > + clk_core_unprotect(clk->core); > > What happens here if two different users have both protected this same > clk? Looks like we ignore the second user? @@ -288,8 +288,8 @@ temporarily decremented by 1. It is safe to do so because we are holding the prepare_lock. When we get to -+???????if (clk_core_is_protected(core)) { -+???????????????req->rate = core->rate; ++ if (clk_core_is_protected(core)) { ++ req->rate = core->rate; Either the clock was only protected by the calling consumer, *and only once*, then the protection has been temporarily removed, test is false and the usual @@ -320,210 +320,210 @@ Jerome > Mike > > > + -> > ????????ret = clk_core_set_rate_nolock(clk->core, rate); -> > ? -> > +???????if (clk->protect_ucount) -> > +???????????????clk_core_protect(clk->core); +> > ret = clk_core_set_rate_nolock(clk->core, rate); +> > +> > + if (clk->protect_ucount) +> > + clk_core_protect(clk->core); > > + -> > ????????clk_prepare_unlock(); -> > ? -> > ????????return ret; +> > clk_prepare_unlock(); +> > +> > return ret; > > @@ -1669,12 +1772,18 @@ int clk_set_rate_range(struct clk *clk, unsigned > > long min, unsigned long max) -> > ? -> > ????????clk_prepare_lock(); -> > ? -> > +???????if (clk->protect_ucount) -> > +???????????????clk_core_unprotect(clk->core); -> > + -> > ????????if (min != clk->min_rate || max != clk->max_rate) { -> > ????????????????clk->min_rate = min; -> > ????????????????clk->max_rate = max; -> > ????????????????ret = clk_core_set_rate_nolock(clk->core, clk->core- +> > +> > clk_prepare_lock(); +> > +> > + if (clk->protect_ucount) +> > + clk_core_unprotect(clk->core); +> > + +> > if (min != clk->min_rate || max != clk->max_rate) { +> > clk->min_rate = min; +> > clk->max_rate = max; +> > ret = clk_core_set_rate_nolock(clk->core, clk->core- > > >req_rate); -> > ????????} -> > ? -> > +???????if (clk->protect_ucount) -> > +???????????????clk_core_protect(clk->core); -> > + -> > ????????clk_prepare_unlock(); -> > ? -> > ????????return ret; +> > } +> > +> > + if (clk->protect_ucount) +> > + clk_core_protect(clk->core); +> > + +> > clk_prepare_unlock(); +> > +> > return ret; > > @@ -1815,6 +1924,9 @@ static int clk_core_set_parent(struct clk_core *core, > > struct clk_core *parent) -> > ????????if ((core->flags & CLK_SET_PARENT_GATE) && core->prepare_count) -> > ????????????????return -EBUSY; -> > ? -> > +???????if (clk_core_is_protected(core)) -> > +???????????????return -EBUSY; -> > + -> > ????????/* try finding the new parent index */ -> > ????????if (parent) { -> > ????????????????p_index = clk_fetch_parent_index(core, parent); +> > if ((core->flags & CLK_SET_PARENT_GATE) && core->prepare_count) +> > return -EBUSY; +> > +> > + if (clk_core_is_protected(core)) +> > + return -EBUSY; +> > + +> > /* try finding the new parent index */ +> > if (parent) { +> > p_index = clk_fetch_parent_index(core, parent); > > @@ -1878,11 +1990,24 @@ static int clk_core_set_parent_lock(struct clk_core > > *core, -> > ? */ -> > ?int clk_set_parent(struct clk *clk, struct clk *parent) -> > ?{ -> > +???????int ret; +> > */ +> > int clk_set_parent(struct clk *clk, struct clk *parent) +> > { +> > + int ret; > > + -> > ????????if (!clk) -> > ????????????????return 0; -> > ? -> > -???????return clk_core_set_parent_lock(clk->core, -> > -???????????????????????????????????????parent ? parent->core : NULL); -> > +???????clk_prepare_lock(); +> > if (!clk) +> > return 0; +> > +> > - return clk_core_set_parent_lock(clk->core, +> > - parent ? parent->core : NULL); +> > + clk_prepare_lock(); > > + -> > +???????if (clk->protect_ucount) -> > +???????????????clk_core_unprotect(clk->core); +> > + if (clk->protect_ucount) +> > + clk_core_unprotect(clk->core); > > + -> > +???????ret = clk_core_set_parent(clk->core, parent ? parent->core : NULL); +> > + ret = clk_core_set_parent(clk->core, parent ? parent->core : NULL); > > + -> > +???????if (clk->protect_ucount) -> > +???????????????clk_core_protect(clk->core); +> > + if (clk->protect_ucount) +> > + clk_core_protect(clk->core); > > + -> > +???????clk_prepare_unlock(); +> > + clk_prepare_unlock(); > > + -> > +???????return ret; -> > ?} -> > ?EXPORT_SYMBOL_GPL(clk_set_parent); -> > ? +> > + return ret; +> > } +> > EXPORT_SYMBOL_GPL(clk_set_parent); +> > > > @@ -1893,7 +2018,10 @@ static int clk_core_set_phase(struct clk_core *core, > > int degrees) -> > ????????if (!core) -> > ????????????????return 0; -> > ? -> > -???????trace_clk_set_phase(clk->core, degrees); -> > +???????if (clk_core_is_protected(core)) -> > +???????????????return -EBUSY; -> > + -> > +???????trace_clk_set_phase(core, degrees); -> > ? -> > ????????if (core->ops->set_phase) -> > ????????????????ret = core->ops->set_phase(core->hw, degrees); +> > if (!core) +> > return 0; +> > +> > - trace_clk_set_phase(clk->core, degrees); +> > + if (clk_core_is_protected(core)) +> > + return -EBUSY; +> > + +> > + trace_clk_set_phase(core, degrees); +> > +> > if (core->ops->set_phase) +> > ret = core->ops->set_phase(core->hw, degrees); > > @@ -1936,7 +2064,15 @@ int clk_set_phase(struct clk *clk, int degrees) -> > ????????????????degrees += 360; -> > ? -> > ????????clk_prepare_lock(); +> > degrees += 360; +> > +> > clk_prepare_lock(); > > + -> > +???????if (clk->protect_ucount) -> > +???????????????clk_core_unprotect(clk->core); +> > + if (clk->protect_ucount) +> > + clk_core_unprotect(clk->core); > > + -> > ????????ret = clk_core_set_phase(clk->core, degrees); +> > ret = clk_core_set_phase(clk->core, degrees); > > + -> > +???????if (clk->protect_ucount) -> > +???????????????clk_core_protect(clk->core); +> > + if (clk->protect_ucount) +> > + clk_core_protect(clk->core); > > + -> > ????????clk_prepare_unlock(); -> > ? -> > ????????return ret; +> > clk_prepare_unlock(); +> > +> > return ret; > > @@ -2023,11 +2159,12 @@ static void clk_summary_show_one(struct seq_file *s, > > struct clk_core *c, -> > ????????if (!c) -> > ????????????????return; -> > ? -> > -???????seq_printf(s, "%*s%-*s %11d %12d %11lu %10lu %-3d\n", -> > +???????seq_printf(s, "%*s%-*s %11d %12d %12d %11lu %10lu %-3d\n", -> > ???????????????????level * 3 + 1, "", -> > ???????????????????30 - level * 3, c->name, -> > -??????????????????c->enable_count, c->prepare_count, clk_core_get_rate(c), -> > -??????????????????clk_core_get_accuracy(c), clk_core_get_phase(c)); -> > +??????????????????c->enable_count, c->prepare_count, c->protect_count, -> > +??????????????????clk_core_get_rate(c), clk_core_get_accuracy(c), -> > +??????????????????clk_core_get_phase(c)); -> > ?} -> > ? -> > ?static void clk_summary_show_subtree(struct seq_file *s, struct clk_core +> > if (!c) +> > return; +> > +> > - seq_printf(s, "%*s%-*s %11d %12d %11lu %10lu %-3d\n", +> > + seq_printf(s, "%*s%-*s %11d %12d %12d %11lu %10lu %-3d\n", +> > level * 3 + 1, "", +> > 30 - level * 3, c->name, +> > - c->enable_count, c->prepare_count, clk_core_get_rate(c), +> > - clk_core_get_accuracy(c), clk_core_get_phase(c)); +> > + c->enable_count, c->prepare_count, c->protect_count, +> > + clk_core_get_rate(c), clk_core_get_accuracy(c), +> > + clk_core_get_phase(c)); +> > } +> > +> > static void clk_summary_show_subtree(struct seq_file *s, struct clk_core > > *c, > > @@ -2049,8 +2186,8 @@ static int clk_summary_show(struct seq_file *s, void > > *data) -> > ????????struct clk_core *c; -> > ????????struct hlist_head **lists = (struct hlist_head **)s->private; -> > ? -> > -???????seq_puts(s, -> > "???clock?????????????????????????enable_cnt??prepare_cnt????????rate???accu -> > racy???phase\n"); -> > -???????seq_puts(s, "------------------------------------------------------- +> > struct clk_core *c; +> > struct hlist_head **lists = (struct hlist_head **)s->private; +> > +> > - seq_puts(s, +> > " clock enable_cnt prepare_cnt rate accu +> > racy phase\n"); +> > - seq_puts(s, "------------------------------------------------------- > > ---------------------------------\n"); -> > +???????seq_puts(s, -> > "???clock?????????????????????????enable_cnt??prepare_cnt??protect_cnt?????? -> > ??rate???accuracy???phase\n"); -> > +???????seq_puts(s, "------------------------------------------------------- +> > + seq_puts(s, +> > " clock enable_cnt prepare_cnt protect_cnt +> > rate accuracy phase\n"); +> > + seq_puts(s, "------------------------------------------------------- > > ---------------------------------------------\n"); -> > ? -> > ????????clk_prepare_lock(); -> > ? +> > +> > clk_prepare_lock(); +> > > > @@ -2085,6 +2222,7 @@ static void clk_dump_one(struct seq_file *s, struct > > clk_core *c, int level) -> > ????????seq_printf(s, "\"%s\": { ", c->name); -> > ????????seq_printf(s, "\"enable_count\": %d,", c->enable_count); -> > ????????seq_printf(s, "\"prepare_count\": %d,", c->prepare_count); -> > +???????seq_printf(s, "\"protect_count\": %d,", c->protect_count); -> > ????????seq_printf(s, "\"rate\": %lu,", clk_core_get_rate(c)); -> > ????????seq_printf(s, "\"accuracy\": %lu,", clk_core_get_accuracy(c)); -> > ????????seq_printf(s, "\"phase\": %d", clk_core_get_phase(c)); +> > seq_printf(s, "\"%s\": { ", c->name); +> > seq_printf(s, "\"enable_count\": %d,", c->enable_count); +> > seq_printf(s, "\"prepare_count\": %d,", c->prepare_count); +> > + seq_printf(s, "\"protect_count\": %d,", c->protect_count); +> > seq_printf(s, "\"rate\": %lu,", clk_core_get_rate(c)); +> > seq_printf(s, "\"accuracy\": %lu,", clk_core_get_accuracy(c)); +> > seq_printf(s, "\"phase\": %d", clk_core_get_phase(c)); > > @@ -2191,6 +2329,11 @@ static int clk_debug_create_one(struct clk_core > > *core, struct dentry *pdentry) -> > ????????if (!d) -> > ????????????????goto err_out; -> > ? -> > +???????d = debugfs_create_u32("clk_protect_count", S_IRUGO, core->dentry, -> > +???????????????????????(u32 *)&core->protect_count); -> > +???????if (!d) -> > +???????????????goto err_out; -> > + -> > ????????d = debugfs_create_u32("clk_notifier_count", S_IRUGO, core->dentry, -> > ????????????????????????(u32 *)&core->notifier_count); -> > ????????if (!d) +> > if (!d) +> > goto err_out; +> > +> > + d = debugfs_create_u32("clk_protect_count", S_IRUGO, core->dentry, +> > + (u32 *)&core->protect_count); +> > + if (!d) +> > + goto err_out; +> > + +> > d = debugfs_create_u32("clk_notifier_count", S_IRUGO, core->dentry, +> > (u32 *)&core->notifier_count); +> > if (!d) > > @@ -2747,6 +2890,11 @@ void clk_unregister(struct clk *clk) -> > ????????if (clk->core->prepare_count) -> > ????????????????pr_warn("%s: unregistering prepared clock: %s\n", -> > ????????????????????????????????????????__func__, clk->core->name); +> > if (clk->core->prepare_count) +> > pr_warn("%s: unregistering prepared clock: %s\n", +> > __func__, clk->core->name); > > + -> > +???????if (clk->core->protect_count) -> > +???????????????pr_warn("%s: unregistering protected clock: %s\n", -> > +???????????????????????????????????????__func__, clk->core->name); +> > + if (clk->core->protect_count) +> > + pr_warn("%s: unregistering protected clock: %s\n", +> > + __func__, clk->core->name); > > + -> > ????????kref_put(&clk->core->ref, __clk_release); -> > ?unlock: -> > ????????clk_prepare_unlock(); +> > kref_put(&clk->core->ref, __clk_release); +> > unlock: +> > clk_prepare_unlock(); > > @@ -2905,6 +3053,15 @@ void __clk_put(struct clk *clk) -> > ? -> > ????????clk_prepare_lock(); -> > ? -> > +???????/* Protect count not balanced: warn and sanitize */ -> > +???????if (clk->protect_ucount) { -> > +???????????????pr_warn("%s: releasing protected clock: %s\n", -> > +???????????????????????????????????????__func__, clk->core->name); -> > + -> > +???????????????for (; clk->protect_ucount; clk->protect_ucount--) -> > +???????????????????????clk_core_unprotect(clk->core); -> > +???????} -> > + -> > ????????hlist_del(&clk->clks_node); -> > ????????if (clk->min_rate > clk->core->req_rate || -> > ????????????clk->max_rate < clk->core->req_rate) +> > +> > clk_prepare_lock(); +> > +> > + /* Protect count not balanced: warn and sanitize */ +> > + if (clk->protect_ucount) { +> > + pr_warn("%s: releasing protected clock: %s\n", +> > + __func__, clk->core->name); +> > + +> > + for (; clk->protect_ucount; clk->protect_ucount--) +> > + clk_core_unprotect(clk->core); +> > + } +> > + +> > hlist_del(&clk->clks_node); +> > if (clk->min_rate > clk->core->req_rate || +> > clk->max_rate < clk->core->req_rate) > > diff --git a/include/linux/clk-provider.h b/include/linux/clk-provider.h > > index a428aec36ace..705a158d9b8f 100644 > > --- a/include/linux/clk-provider.h > > +++ b/include/linux/clk-provider.h > > @@ -739,6 +739,7 @@ unsigned long clk_hw_get_rate(const struct clk_hw *hw); -> > ?unsigned long __clk_get_flags(struct clk *clk); -> > ?unsigned long clk_hw_get_flags(const struct clk_hw *hw); -> > ?bool clk_hw_is_prepared(const struct clk_hw *hw); +> > unsigned long __clk_get_flags(struct clk *clk); +> > unsigned long clk_hw_get_flags(const struct clk_hw *hw); +> > bool clk_hw_is_prepared(const struct clk_hw *hw); > > +bool clk_hw_is_protected(const struct clk_hw *hw); -> > ?bool clk_hw_is_enabled(const struct clk_hw *hw); -> > ?bool __clk_is_enabled(struct clk *clk); -> > ?struct clk *__clk_lookup(const char *name); +> > bool clk_hw_is_enabled(const struct clk_hw *hw); +> > bool __clk_is_enabled(struct clk *clk); +> > struct clk *__clk_lookup(const char *name); > > diff --git a/include/linux/clk.h b/include/linux/clk.h > > index e9d36b3e49de..90b72ead4411 100644 > > --- a/include/linux/clk.h > > +++ b/include/linux/clk.h > > @@ -265,6 +265,30 @@ struct clk *devm_clk_get(struct device *dev, const char > > *id); -> > ? */ -> > ?struct clk *devm_get_clk_from_child(struct device *dev, -> > ????????????????????????????????????struct device_node *np, const char +> > */ +> > struct clk *devm_get_clk_from_child(struct device *dev, +> > struct device_node *np, const char > > *con_id); > > +/** > > + * clk_protect - inform the system when the clock source should be @@ -552,21 +552,21 @@ Jerome > > + * Must not be called from within atomic context. > > + */ > > +void clk_unprotect(struct clk *clk); -> > ? -> > ?/** -> > ? * clk_enable - inform the system when the clock source should be running. +> > +> > /** +> > * clk_enable - inform the system when the clock source should be running. > > @@ -460,6 +484,11 @@ static inline void clk_put(struct clk *clk) {} -> > ? -> > ?static inline void devm_clk_put(struct device *dev, struct clk *clk) {} -> > ? +> > +> > static inline void devm_clk_put(struct device *dev, struct clk *clk) {} +> > > > + > > +static inline void clk_protect(struct clk *clk) {} > > + > > +static inline void clk_unprotect(struct clk *clk) {} > > + -> > ?static inline int clk_enable(struct clk *clk) -> > ?{ -> > ????????return 0; -> > --? +> > static inline int clk_enable(struct clk *clk) +> > { +> > return 0; +> > -- > > 2.9.3 > > diff --git a/a/content_digest b/N1/content_digest index 334f583..1778900 100644 --- a/a/content_digest +++ b/N1/content_digest @@ -1,10 +1,14 @@ "ref\020170321183330.26722-1-jbrunet@baylibre.com\0" "ref\020170321183330.26722-5-jbrunet@baylibre.com\0" "ref\0149452951146.81039.10685895856154834071@resonance\0" - "From\0jbrunet@baylibre.com (Jerome Brunet)\0" - "Subject\0[RFC 4/7] clk: add support for clock protection\0" + "From\0Jerome Brunet <jbrunet@baylibre.com>\0" + "Subject\0Re: [RFC 4/7] clk: add support for clock protection\0" "Date\0Fri, 12 May 2017 15:08:02 +0200\0" - "To\0linus-amlogic@lists.infradead.org\0" + "To\0Michael Turquette <mturquette@baylibre.com>" + Stephen Boyd <sboyd@codeaurora.org> + " Kevin Hilman <khilman@baylibre.com>\0" + "Cc\0linux-clk@vger.kernel.org" + " linux-amlogic@lists.infradead.org\0" "\00:1\0" "b\0" "On Thu, 2017-05-11 at 12:05 -0700, Michael Turquette wrote:\n" @@ -18,74 +22,74 @@ "> > \n" "> > Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>\n" "> > ---\n" - "> > ?drivers/clk/clk.c????????????| 177\n" + "> > \302\240drivers/clk/clk.c\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240| 177\n" "> > ++++++++++++++++++++++++++++++++++++++++---\n" - "> > ?include/linux/clk-provider.h |???1 +\n" - "> > ?include/linux/clk.h??????????|??29 +++++++\n" - "> > ?3 files changed, 197 insertions(+), 10 deletions(-)\n" + "> > \302\240include/linux/clk-provider.h |\302\240\302\240\302\2401 +\n" + "> > \302\240include/linux/clk.h\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240|\302\240\302\24029 +++++++\n" + "> > \302\2403 files changed, 197 insertions(+), 10 deletions(-)\n" "> > \n" "> > diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c\n" "> > index fa77a1841e0f..69db8cc15063 100644\n" "> > --- a/drivers/clk/clk.c\n" "> > +++ b/drivers/clk/clk.c\n" "> > @@ -60,6 +60,7 @@ struct clk_core {\n" - "> > ????????bool????????????????????orphan;\n" - "> > ????????unsigned int????????????enable_count;\n" - "> > ????????unsigned int????????????prepare_count;\n" - "> > +???????unsigned int????????????protect_count;\n" - "> > ????????unsigned long???????????min_rate;\n" - "> > ????????unsigned long???????????max_rate;\n" - "> > ????????unsigned long???????????accuracy;\n" + "> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240bool\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240orphan;\n" + "> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240unsigned int\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240enable_count;\n" + "> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240unsigned int\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240prepare_count;\n" + "> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240unsigned int\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240protect_count;\n" + "> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240unsigned long\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240min_rate;\n" + "> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240unsigned long\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240max_rate;\n" + "> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240unsigned long\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240accuracy;\n" "> > @@ -84,6 +85,7 @@ struct clk {\n" - "> > ????????const char *con_id;\n" - "> > ????????unsigned long min_rate;\n" - "> > ????????unsigned long max_rate;\n" - "> > +???????unsigned long protect_ucount;\n" - "> > ????????struct hlist_node clks_node;\n" - "> > ?};\n" - "> > ?\n" + "> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240const char *con_id;\n" + "> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240unsigned long min_rate;\n" + "> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240unsigned long max_rate;\n" + "> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240unsigned long protect_ucount;\n" + "> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240struct hlist_node clks_node;\n" + "> > \302\240};\n" + "> > \302\240\n" "> > @@ -160,6 +162,11 @@ static bool clk_core_is_prepared(struct clk_core *core)\n" - "> > ????????return core->ops->is_prepared(core->hw);\n" - "> > ?}\n" - "> > ?\n" + "> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240return core->ops->is_prepared(core->hw);\n" + "> > \302\240}\n" + "> > \302\240\n" "> > +static bool clk_core_is_protected(struct clk_core *core)\n" "> > +{\n" - "> > +???????return core->protect_count;\n" + "> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240return core->protect_count;\n" "> > +}\n" "> > +\n" - "> > ?static bool clk_core_is_enabled(struct clk_core *core)\n" - "> > ?{\n" - "> > ????????/*\n" + "> > \302\240static bool clk_core_is_enabled(struct clk_core *core)\n" + "> > \302\240{\n" + "> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240/*\n" "> > @@ -328,6 +335,11 @@ bool clk_hw_is_prepared(const struct clk_hw *hw)\n" - "> > ????????return clk_core_is_prepared(hw->core);\n" - "> > ?}\n" - "> > ?\n" + "> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240return clk_core_is_prepared(hw->core);\n" + "> > \302\240}\n" + "> > \302\240\n" "> > +bool clk_hw_is_protected(const struct clk_hw *hw)\n" "> > +{\n" - "> > +???????return clk_core_is_protected(hw->core);\n" + "> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240return clk_core_is_protected(hw->core);\n" "> > +}\n" "> > +\n" - "> > ?bool clk_hw_is_enabled(const struct clk_hw *hw)\n" - "> > ?{\n" - "> > ????????return clk_core_is_enabled(hw->core);\n" + "> > \302\240bool clk_hw_is_enabled(const struct clk_hw *hw)\n" + "> > \302\240{\n" + "> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240return clk_core_is_enabled(hw->core);\n" "> > @@ -584,6 +596,89 @@ int clk_prepare(struct clk *clk)\n" - "> > ?}\n" - "> > ?EXPORT_SYMBOL_GPL(clk_prepare);\n" - "> > ?\n" + "> > \302\240}\n" + "> > \302\240EXPORT_SYMBOL_GPL(clk_prepare);\n" + "> > \302\240\n" "> > +static void clk_core_unprotect(struct clk_core *core)\n" "> > +{\n" - "> > +???????lockdep_assert_held(&prepare_lock);\n" + "> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240lockdep_assert_held(&prepare_lock);\n" "> > +\n" - "> > +???????if (!core)\n" - "> > +???????????????return;\n" + "> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (!core)\n" + "> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240return;\n" "> > +\n" - "> > +???????if (WARN_ON(core->protect_count == 0))\n" - "> > +???????????????return;\n" + "> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (WARN_ON(core->protect_count == 0))\n" + "> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240return;\n" "> > +\n" - "> > +???????if (--core->protect_count > 0)\n" - "> > +???????????????return;\n" + "> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (--core->protect_count > 0)\n" + "> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240return;\n" "> > +\n" - "> > +???????clk_core_unprotect(core->parent);\n" + "> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240clk_core_unprotect(core->parent);\n" "> > +}\n" "> > +\n" "> > +/**\n" @@ -123,38 +127,38 @@ "> > + */\n" "> > +void clk_unprotect(struct clk *clk)\n" "> > +{\n" - "> > +???????if (!clk)\n" - "> > +???????????????return;\n" + "> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (!clk)\n" + "> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240return;\n" "> > +\n" - "> > +???????clk_prepare_lock();\n" + "> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240clk_prepare_lock();\n" "> > +\n" - "> > +???????if (WARN_ON(clk->protect_ucount <= 0)) {\n" - "> > +???????????????/*\n" - "> > +????????????????* There is something wrong with this consumer protect\n" + "> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (WARN_ON(clk->protect_ucount <= 0)) {\n" + "> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240/*\n" + "> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240* There is something wrong with this consumer protect\n" "> > count.\n" - "> > +????????????????* Stop here before messing with the provider\n" - "> > +????????????????*/\n" - "> > +???????????????clk_prepare_unlock();\n" - "> > +???????????????return;\n" - "> > +???????}\n" - "> > +\n" - "> > +???????clk_core_unprotect(clk->core);\n" - "> > +???????clk->protect_ucount--;\n" - "> > +???????clk_prepare_unlock();\n" + "> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240* Stop here before messing with the provider\n" + "> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240*/\n" + "> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240clk_prepare_unlock();\n" + "> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240return;\n" + "> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240}\n" + "> > +\n" + "> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240clk_core_unprotect(clk->core);\n" + "> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240clk->protect_ucount--;\n" + "> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240clk_prepare_unlock();\n" "> > +}\n" "> > +EXPORT_SYMBOL_GPL(clk_unprotect);\n" "> > +\n" "> > +static void clk_core_protect(struct clk_core *core)\n" "> > +{\n" - "> > +???????lockdep_assert_held(&prepare_lock);\n" + "> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240lockdep_assert_held(&prepare_lock);\n" "> > +\n" - "> > +???????if (!core)\n" - "> > +???????????????return;\n" + "> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (!core)\n" + "> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240return;\n" "> > +\n" - "> > +???????if (core->protect_count == 0)\n" - "> > +???????????????clk_core_protect(core->parent);\n" + "> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (core->protect_count == 0)\n" + "> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240clk_core_protect(core->parent);\n" "> > +\n" - "> > +???????core->protect_count++;\n" + "> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240core->protect_count++;\n" "> > +}\n" "> > +\n" "> > +/**\n" @@ -192,27 +196,27 @@ "> \n" "> > +void clk_protect(struct clk *clk)\n" "> > +{\n" - "> > +???????if (!clk)\n" - "> > +???????????????return;\n" + "> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (!clk)\n" + "> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240return;\n" "> > +\n" - "> > +???????clk_prepare_lock();\n" - "> > +???????clk_core_protect(clk->core);\n" - "> > +???????clk->protect_ucount++;\n" - "> > +???????clk_prepare_unlock();\n" + "> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240clk_prepare_lock();\n" + "> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240clk_core_protect(clk->core);\n" + "> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240clk->protect_ucount++;\n" + "> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240clk_prepare_unlock();\n" "> > +}\n" "> > +EXPORT_SYMBOL_GPL(clk_protect);\n" "> > +\n" - "> > ?static void clk_core_disable(struct clk_core *core)\n" - "> > ?{\n" - "> > ????????lockdep_assert_held(&enable_lock);\n" + "> > \302\240static void clk_core_disable(struct clk_core *core)\n" + "> > \302\240{\n" + "> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240lockdep_assert_held(&enable_lock);\n" "> > @@ -838,7 +933,9 @@ static int clk_core_determine_round(struct clk_core\n" "> > *core,\n" - "> > ?{\n" - "> > ????????long rate;\n" - "> > ?\n" - "> > -???????if (core->ops->determine_rate) {\n" - "> > +???????if (clk_core_is_protected(core)) {\n" - "> > +???????????????req->rate = core->rate;\n" + "> > \302\240{\n" + "> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240long rate;\n" + "> > \302\240\n" + "> > -\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (core->ops->determine_rate) {\n" + "> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (clk_core_is_protected(core)) {\n" + "> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240req->rate = core->rate;\n" "> \n" "> Hmm, in CCF we basically re-use round_rate/determine_rate from within\n" "> calls to clk_set_rate. The point is that clk_set_rate should set the\n" @@ -243,17 +247,17 @@ "[0]\n" "\n" "> \n" - "> > +???????} else if (core->ops->determine_rate) {\n" - "> > ????????????????return core->ops->determine_rate(core->hw, req);\n" - "> > ????????} else if (core->ops->round_rate) {\n" - "> > ????????????????rate = core->ops->round_rate(core->hw, req->rate,\n" + "> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240} else if (core->ops->determine_rate) {\n" + "> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240return core->ops->determine_rate(core->hw, req);\n" + "> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240} else if (core->ops->round_rate) {\n" + "> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240rate = core->ops->round_rate(core->hw, req->rate,\n" "> > @@ -1381,7 +1478,7 @@ static struct clk_core *clk_calc_new_rates(struct\n" "> > clk_core *core,\n" - "> > ????????????????req.min_rate = min_rate;\n" - "> > ????????????????req.max_rate = max_rate;\n" - "> > ?\n" - "> > -???????????????clk_core_init_rate_req(core, req);\n" - "> > +???????????????clk_core_init_rate_req(core, &req);\n" + "> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240req.min_rate = min_rate;\n" + "> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240req.max_rate = max_rate;\n" + "> > \302\240\n" + "> > -\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240clk_core_init_rate_req(core, req);\n" + "> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240clk_core_init_rate_req(core, &req);\n" "> \n" "> Why isn't this change in patch #3? Seems like a bug introduced in patch\n" "> #3 and fixed here in patch #4.\n" @@ -261,12 +265,12 @@ "Indeed, I messed up while formatting the patches :(\n" "\n" "> \n" - "> > ?\n" - "> > ????????????????ret = clk_core_determine_round(core, &req);\n" - "> > ????????????????if (ret < 0)\n" + "> > \302\240\n" + "> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240ret = clk_core_determine_round(core, &req);\n" + "> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (ret < 0)\n" "> > @@ -1637,8 +1734,14 @@ int clk_set_rate(struct clk *clk, unsigned long rate)\n" - "> > ????????/* prevent racing with updates to the clock topology */\n" - "> > ????????clk_prepare_lock();\n" + "> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240/* prevent racing with updates to the clock topology */\n" + "> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240clk_prepare_lock();\n" "> \n" "> The fact that a user can protect a clk AND change its rate is very\n" "> subtle. Please update the kerneldoc for clk_set_rate, clk_set_parent and\n" @@ -275,9 +279,9 @@ "Will do\n" "\n" "> \n" - "> > ?\n" - "> > +???????if (clk->protect_ucount)\n" - "> > +???????????????clk_core_unprotect(clk->core);\n" + "> > \302\240\n" + "> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (clk->protect_ucount)\n" + "> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240clk_core_unprotect(clk->core);\n" "> \n" "> What happens here if two different users have both protected this same\n" "> clk? Looks like we ignore the second user?\n" @@ -297,8 +301,8 @@ "prepare_lock.\n" "\n" "When we get to \n" - "+???????if (clk_core_is_protected(core)) {\n" - "+???????????????req->rate = core->rate;\n" + "+\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (clk_core_is_protected(core)) {\n" + "+\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240req->rate = core->rate;\n" "\n" "Either the clock was only protected by the calling consumer, *and only once*,\n" "then the protection has been temporarily removed, test is false and the usual\n" @@ -329,210 +333,210 @@ "> Mike\n" "> \n" "> > +\n" - "> > ????????ret = clk_core_set_rate_nolock(clk->core, rate);\n" - "> > ?\n" - "> > +???????if (clk->protect_ucount)\n" - "> > +???????????????clk_core_protect(clk->core);\n" + "> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240ret = clk_core_set_rate_nolock(clk->core, rate);\n" + "> > \302\240\n" + "> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (clk->protect_ucount)\n" + "> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240clk_core_protect(clk->core);\n" "> > +\n" - "> > ????????clk_prepare_unlock();\n" - "> > ?\n" - "> > ????????return ret;\n" + "> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240clk_prepare_unlock();\n" + "> > \302\240\n" + "> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240return ret;\n" "> > @@ -1669,12 +1772,18 @@ int clk_set_rate_range(struct clk *clk, unsigned\n" "> > long min, unsigned long max)\n" - "> > ?\n" - "> > ????????clk_prepare_lock();\n" - "> > ?\n" - "> > +???????if (clk->protect_ucount)\n" - "> > +???????????????clk_core_unprotect(clk->core);\n" - "> > +\n" - "> > ????????if (min != clk->min_rate || max != clk->max_rate) {\n" - "> > ????????????????clk->min_rate = min;\n" - "> > ????????????????clk->max_rate = max;\n" - "> > ????????????????ret = clk_core_set_rate_nolock(clk->core, clk->core-\n" + "> > \302\240\n" + "> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240clk_prepare_lock();\n" + "> > \302\240\n" + "> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (clk->protect_ucount)\n" + "> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240clk_core_unprotect(clk->core);\n" + "> > +\n" + "> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (min != clk->min_rate || max != clk->max_rate) {\n" + "> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240clk->min_rate = min;\n" + "> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240clk->max_rate = max;\n" + "> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240ret = clk_core_set_rate_nolock(clk->core, clk->core-\n" "> > >req_rate);\n" - "> > ????????}\n" - "> > ?\n" - "> > +???????if (clk->protect_ucount)\n" - "> > +???????????????clk_core_protect(clk->core);\n" - "> > +\n" - "> > ????????clk_prepare_unlock();\n" - "> > ?\n" - "> > ????????return ret;\n" + "> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240}\n" + "> > \302\240\n" + "> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (clk->protect_ucount)\n" + "> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240clk_core_protect(clk->core);\n" + "> > +\n" + "> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240clk_prepare_unlock();\n" + "> > \302\240\n" + "> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240return ret;\n" "> > @@ -1815,6 +1924,9 @@ static int clk_core_set_parent(struct clk_core *core,\n" "> > struct clk_core *parent)\n" - "> > ????????if ((core->flags & CLK_SET_PARENT_GATE) && core->prepare_count)\n" - "> > ????????????????return -EBUSY;\n" - "> > ?\n" - "> > +???????if (clk_core_is_protected(core))\n" - "> > +???????????????return -EBUSY;\n" - "> > +\n" - "> > ????????/* try finding the new parent index */\n" - "> > ????????if (parent) {\n" - "> > ????????????????p_index = clk_fetch_parent_index(core, parent);\n" + "> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240if ((core->flags & CLK_SET_PARENT_GATE) && core->prepare_count)\n" + "> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240return -EBUSY;\n" + "> > \302\240\n" + "> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (clk_core_is_protected(core))\n" + "> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240return -EBUSY;\n" + "> > +\n" + "> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240/* try finding the new parent index */\n" + "> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (parent) {\n" + "> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240p_index = clk_fetch_parent_index(core, parent);\n" "> > @@ -1878,11 +1990,24 @@ static int clk_core_set_parent_lock(struct clk_core\n" "> > *core,\n" - "> > ? */\n" - "> > ?int clk_set_parent(struct clk *clk, struct clk *parent)\n" - "> > ?{\n" - "> > +???????int ret;\n" + "> > \302\240 */\n" + "> > \302\240int clk_set_parent(struct clk *clk, struct clk *parent)\n" + "> > \302\240{\n" + "> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240int ret;\n" "> > +\n" - "> > ????????if (!clk)\n" - "> > ????????????????return 0;\n" - "> > ?\n" - "> > -???????return clk_core_set_parent_lock(clk->core,\n" - "> > -???????????????????????????????????????parent ? parent->core : NULL);\n" - "> > +???????clk_prepare_lock();\n" + "> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (!clk)\n" + "> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240return 0;\n" + "> > \302\240\n" + "> > -\302\240\302\240\302\240\302\240\302\240\302\240\302\240return clk_core_set_parent_lock(clk->core,\n" + "> > -\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240parent ? parent->core : NULL);\n" + "> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240clk_prepare_lock();\n" "> > +\n" - "> > +???????if (clk->protect_ucount)\n" - "> > +???????????????clk_core_unprotect(clk->core);\n" + "> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (clk->protect_ucount)\n" + "> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240clk_core_unprotect(clk->core);\n" "> > +\n" - "> > +???????ret = clk_core_set_parent(clk->core, parent ? parent->core : NULL);\n" + "> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240ret = clk_core_set_parent(clk->core, parent ? parent->core : NULL);\n" "> > +\n" - "> > +???????if (clk->protect_ucount)\n" - "> > +???????????????clk_core_protect(clk->core);\n" + "> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (clk->protect_ucount)\n" + "> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240clk_core_protect(clk->core);\n" "> > +\n" - "> > +???????clk_prepare_unlock();\n" + "> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240clk_prepare_unlock();\n" "> > +\n" - "> > +???????return ret;\n" - "> > ?}\n" - "> > ?EXPORT_SYMBOL_GPL(clk_set_parent);\n" - "> > ?\n" + "> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240return ret;\n" + "> > \302\240}\n" + "> > \302\240EXPORT_SYMBOL_GPL(clk_set_parent);\n" + "> > \302\240\n" "> > @@ -1893,7 +2018,10 @@ static int clk_core_set_phase(struct clk_core *core,\n" "> > int degrees)\n" - "> > ????????if (!core)\n" - "> > ????????????????return 0;\n" - "> > ?\n" - "> > -???????trace_clk_set_phase(clk->core, degrees);\n" - "> > +???????if (clk_core_is_protected(core))\n" - "> > +???????????????return -EBUSY;\n" - "> > +\n" - "> > +???????trace_clk_set_phase(core, degrees);\n" - "> > ?\n" - "> > ????????if (core->ops->set_phase)\n" - "> > ????????????????ret = core->ops->set_phase(core->hw, degrees);\n" + "> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (!core)\n" + "> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240return 0;\n" + "> > \302\240\n" + "> > -\302\240\302\240\302\240\302\240\302\240\302\240\302\240trace_clk_set_phase(clk->core, degrees);\n" + "> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (clk_core_is_protected(core))\n" + "> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240return -EBUSY;\n" + "> > +\n" + "> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240trace_clk_set_phase(core, degrees);\n" + "> > \302\240\n" + "> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (core->ops->set_phase)\n" + "> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240ret = core->ops->set_phase(core->hw, degrees);\n" "> > @@ -1936,7 +2064,15 @@ int clk_set_phase(struct clk *clk, int degrees)\n" - "> > ????????????????degrees += 360;\n" - "> > ?\n" - "> > ????????clk_prepare_lock();\n" + "> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240degrees += 360;\n" + "> > \302\240\n" + "> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240clk_prepare_lock();\n" "> > +\n" - "> > +???????if (clk->protect_ucount)\n" - "> > +???????????????clk_core_unprotect(clk->core);\n" + "> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (clk->protect_ucount)\n" + "> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240clk_core_unprotect(clk->core);\n" "> > +\n" - "> > ????????ret = clk_core_set_phase(clk->core, degrees);\n" + "> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240ret = clk_core_set_phase(clk->core, degrees);\n" "> > +\n" - "> > +???????if (clk->protect_ucount)\n" - "> > +???????????????clk_core_protect(clk->core);\n" + "> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (clk->protect_ucount)\n" + "> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240clk_core_protect(clk->core);\n" "> > +\n" - "> > ????????clk_prepare_unlock();\n" - "> > ?\n" - "> > ????????return ret;\n" + "> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240clk_prepare_unlock();\n" + "> > \302\240\n" + "> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240return ret;\n" "> > @@ -2023,11 +2159,12 @@ static void clk_summary_show_one(struct seq_file *s,\n" "> > struct clk_core *c,\n" - "> > ????????if (!c)\n" - "> > ????????????????return;\n" - "> > ?\n" - "> > -???????seq_printf(s, \"%*s%-*s %11d %12d %11lu %10lu %-3d\\n\",\n" - "> > +???????seq_printf(s, \"%*s%-*s %11d %12d %12d %11lu %10lu %-3d\\n\",\n" - "> > ???????????????????level * 3 + 1, \"\",\n" - "> > ???????????????????30 - level * 3, c->name,\n" - "> > -??????????????????c->enable_count, c->prepare_count, clk_core_get_rate(c),\n" - "> > -??????????????????clk_core_get_accuracy(c), clk_core_get_phase(c));\n" - "> > +??????????????????c->enable_count, c->prepare_count, c->protect_count,\n" - "> > +??????????????????clk_core_get_rate(c), clk_core_get_accuracy(c),\n" - "> > +??????????????????clk_core_get_phase(c));\n" - "> > ?}\n" - "> > ?\n" - "> > ?static void clk_summary_show_subtree(struct seq_file *s, struct clk_core\n" + "> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (!c)\n" + "> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240return;\n" + "> > \302\240\n" + "> > -\302\240\302\240\302\240\302\240\302\240\302\240\302\240seq_printf(s, \"%*s%-*s %11d %12d %11lu %10lu %-3d\\n\",\n" + "> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240seq_printf(s, \"%*s%-*s %11d %12d %12d %11lu %10lu %-3d\\n\",\n" + "> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240level * 3 + 1, \"\",\n" + "> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\24030 - level * 3, c->name,\n" + "> > -\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240c->enable_count, c->prepare_count, clk_core_get_rate(c),\n" + "> > -\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240clk_core_get_accuracy(c), clk_core_get_phase(c));\n" + "> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240c->enable_count, c->prepare_count, c->protect_count,\n" + "> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240clk_core_get_rate(c), clk_core_get_accuracy(c),\n" + "> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240clk_core_get_phase(c));\n" + "> > \302\240}\n" + "> > \302\240\n" + "> > \302\240static void clk_summary_show_subtree(struct seq_file *s, struct clk_core\n" "> > *c,\n" "> > @@ -2049,8 +2186,8 @@ static int clk_summary_show(struct seq_file *s, void\n" "> > *data)\n" - "> > ????????struct clk_core *c;\n" - "> > ????????struct hlist_head **lists = (struct hlist_head **)s->private;\n" - "> > ?\n" - "> > -???????seq_puts(s,\n" - "> > \"???clock?????????????????????????enable_cnt??prepare_cnt????????rate???accu\n" - "> > racy???phase\\n\");\n" - "> > -???????seq_puts(s, \"-------------------------------------------------------\n" + "> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240struct clk_core *c;\n" + "> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240struct hlist_head **lists = (struct hlist_head **)s->private;\n" + "> > \302\240\n" + "> > -\302\240\302\240\302\240\302\240\302\240\302\240\302\240seq_puts(s,\n" + "> > \"\302\240\302\240\302\240clock\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240enable_cnt\302\240\302\240prepare_cnt\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240rate\302\240\302\240\302\240accu\n" + "> > racy\302\240\302\240\302\240phase\\n\");\n" + "> > -\302\240\302\240\302\240\302\240\302\240\302\240\302\240seq_puts(s, \"-------------------------------------------------------\n" "> > ---------------------------------\\n\");\n" - "> > +???????seq_puts(s,\n" - "> > \"???clock?????????????????????????enable_cnt??prepare_cnt??protect_cnt??????\n" - "> > ??rate???accuracy???phase\\n\");\n" - "> > +???????seq_puts(s, \"-------------------------------------------------------\n" + "> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240seq_puts(s,\n" + "> > \"\302\240\302\240\302\240clock\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240enable_cnt\302\240\302\240prepare_cnt\302\240\302\240protect_cnt\302\240\302\240\302\240\302\240\302\240\302\240\n" + "> > \302\240\302\240rate\302\240\302\240\302\240accuracy\302\240\302\240\302\240phase\\n\");\n" + "> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240seq_puts(s, \"-------------------------------------------------------\n" "> > ---------------------------------------------\\n\");\n" - "> > ?\n" - "> > ????????clk_prepare_lock();\n" - "> > ?\n" + "> > \302\240\n" + "> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240clk_prepare_lock();\n" + "> > \302\240\n" "> > @@ -2085,6 +2222,7 @@ static void clk_dump_one(struct seq_file *s, struct\n" "> > clk_core *c, int level)\n" - "> > ????????seq_printf(s, \"\\\"%s\\\": { \", c->name);\n" - "> > ????????seq_printf(s, \"\\\"enable_count\\\": %d,\", c->enable_count);\n" - "> > ????????seq_printf(s, \"\\\"prepare_count\\\": %d,\", c->prepare_count);\n" - "> > +???????seq_printf(s, \"\\\"protect_count\\\": %d,\", c->protect_count);\n" - "> > ????????seq_printf(s, \"\\\"rate\\\": %lu,\", clk_core_get_rate(c));\n" - "> > ????????seq_printf(s, \"\\\"accuracy\\\": %lu,\", clk_core_get_accuracy(c));\n" - "> > ????????seq_printf(s, \"\\\"phase\\\": %d\", clk_core_get_phase(c));\n" + "> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240seq_printf(s, \"\\\"%s\\\": { \", c->name);\n" + "> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240seq_printf(s, \"\\\"enable_count\\\": %d,\", c->enable_count);\n" + "> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240seq_printf(s, \"\\\"prepare_count\\\": %d,\", c->prepare_count);\n" + "> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240seq_printf(s, \"\\\"protect_count\\\": %d,\", c->protect_count);\n" + "> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240seq_printf(s, \"\\\"rate\\\": %lu,\", clk_core_get_rate(c));\n" + "> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240seq_printf(s, \"\\\"accuracy\\\": %lu,\", clk_core_get_accuracy(c));\n" + "> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240seq_printf(s, \"\\\"phase\\\": %d\", clk_core_get_phase(c));\n" "> > @@ -2191,6 +2329,11 @@ static int clk_debug_create_one(struct clk_core\n" "> > *core, struct dentry *pdentry)\n" - "> > ????????if (!d)\n" - "> > ????????????????goto err_out;\n" - "> > ?\n" - "> > +???????d = debugfs_create_u32(\"clk_protect_count\", S_IRUGO, core->dentry,\n" - "> > +???????????????????????(u32 *)&core->protect_count);\n" - "> > +???????if (!d)\n" - "> > +???????????????goto err_out;\n" - "> > +\n" - "> > ????????d = debugfs_create_u32(\"clk_notifier_count\", S_IRUGO, core->dentry,\n" - "> > ????????????????????????(u32 *)&core->notifier_count);\n" - "> > ????????if (!d)\n" + "> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (!d)\n" + "> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240goto err_out;\n" + "> > \302\240\n" + "> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240d = debugfs_create_u32(\"clk_protect_count\", S_IRUGO, core->dentry,\n" + "> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240(u32 *)&core->protect_count);\n" + "> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (!d)\n" + "> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240goto err_out;\n" + "> > +\n" + "> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240d = debugfs_create_u32(\"clk_notifier_count\", S_IRUGO, core->dentry,\n" + "> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240(u32 *)&core->notifier_count);\n" + "> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (!d)\n" "> > @@ -2747,6 +2890,11 @@ void clk_unregister(struct clk *clk)\n" - "> > ????????if (clk->core->prepare_count)\n" - "> > ????????????????pr_warn(\"%s: unregistering prepared clock: %s\\n\",\n" - "> > ????????????????????????????????????????__func__, clk->core->name);\n" + "> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (clk->core->prepare_count)\n" + "> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240pr_warn(\"%s: unregistering prepared clock: %s\\n\",\n" + "> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240__func__, clk->core->name);\n" "> > +\n" - "> > +???????if (clk->core->protect_count)\n" - "> > +???????????????pr_warn(\"%s: unregistering protected clock: %s\\n\",\n" - "> > +???????????????????????????????????????__func__, clk->core->name);\n" + "> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (clk->core->protect_count)\n" + "> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240pr_warn(\"%s: unregistering protected clock: %s\\n\",\n" + "> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240__func__, clk->core->name);\n" "> > +\n" - "> > ????????kref_put(&clk->core->ref, __clk_release);\n" - "> > ?unlock:\n" - "> > ????????clk_prepare_unlock();\n" + "> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240kref_put(&clk->core->ref, __clk_release);\n" + "> > \302\240unlock:\n" + "> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240clk_prepare_unlock();\n" "> > @@ -2905,6 +3053,15 @@ void __clk_put(struct clk *clk)\n" - "> > ?\n" - "> > ????????clk_prepare_lock();\n" - "> > ?\n" - "> > +???????/* Protect count not balanced: warn and sanitize */\n" - "> > +???????if (clk->protect_ucount) {\n" - "> > +???????????????pr_warn(\"%s: releasing protected clock: %s\\n\",\n" - "> > +???????????????????????????????????????__func__, clk->core->name);\n" - "> > +\n" - "> > +???????????????for (; clk->protect_ucount; clk->protect_ucount--)\n" - "> > +???????????????????????clk_core_unprotect(clk->core);\n" - "> > +???????}\n" - "> > +\n" - "> > ????????hlist_del(&clk->clks_node);\n" - "> > ????????if (clk->min_rate > clk->core->req_rate ||\n" - "> > ????????????clk->max_rate < clk->core->req_rate)\n" + "> > \302\240\n" + "> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240clk_prepare_lock();\n" + "> > \302\240\n" + "> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240/* Protect count not balanced: warn and sanitize */\n" + "> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (clk->protect_ucount) {\n" + "> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240pr_warn(\"%s: releasing protected clock: %s\\n\",\n" + "> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240__func__, clk->core->name);\n" + "> > +\n" + "> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240for (; clk->protect_ucount; clk->protect_ucount--)\n" + "> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240clk_core_unprotect(clk->core);\n" + "> > +\302\240\302\240\302\240\302\240\302\240\302\240\302\240}\n" + "> > +\n" + "> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240hlist_del(&clk->clks_node);\n" + "> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240if (clk->min_rate > clk->core->req_rate ||\n" + "> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240clk->max_rate < clk->core->req_rate)\n" "> > diff --git a/include/linux/clk-provider.h b/include/linux/clk-provider.h\n" "> > index a428aec36ace..705a158d9b8f 100644\n" "> > --- a/include/linux/clk-provider.h\n" "> > +++ b/include/linux/clk-provider.h\n" "> > @@ -739,6 +739,7 @@ unsigned long clk_hw_get_rate(const struct clk_hw *hw);\n" - "> > ?unsigned long __clk_get_flags(struct clk *clk);\n" - "> > ?unsigned long clk_hw_get_flags(const struct clk_hw *hw);\n" - "> > ?bool clk_hw_is_prepared(const struct clk_hw *hw);\n" + "> > \302\240unsigned long __clk_get_flags(struct clk *clk);\n" + "> > \302\240unsigned long clk_hw_get_flags(const struct clk_hw *hw);\n" + "> > \302\240bool clk_hw_is_prepared(const struct clk_hw *hw);\n" "> > +bool clk_hw_is_protected(const struct clk_hw *hw);\n" - "> > ?bool clk_hw_is_enabled(const struct clk_hw *hw);\n" - "> > ?bool __clk_is_enabled(struct clk *clk);\n" - "> > ?struct clk *__clk_lookup(const char *name);\n" + "> > \302\240bool clk_hw_is_enabled(const struct clk_hw *hw);\n" + "> > \302\240bool __clk_is_enabled(struct clk *clk);\n" + "> > \302\240struct clk *__clk_lookup(const char *name);\n" "> > diff --git a/include/linux/clk.h b/include/linux/clk.h\n" "> > index e9d36b3e49de..90b72ead4411 100644\n" "> > --- a/include/linux/clk.h\n" "> > +++ b/include/linux/clk.h\n" "> > @@ -265,6 +265,30 @@ struct clk *devm_clk_get(struct device *dev, const char\n" "> > *id);\n" - "> > ? */\n" - "> > ?struct clk *devm_get_clk_from_child(struct device *dev,\n" - "> > ????????????????????????????????????struct device_node *np, const char\n" + "> > \302\240 */\n" + "> > \302\240struct clk *devm_get_clk_from_child(struct device *dev,\n" + "> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240struct device_node *np, const char\n" "> > *con_id);\n" "> > +/**\n" "> > + * clk_protect - inform the system when the clock source should be\n" @@ -561,23 +565,23 @@ "> > + * Must not be called from within atomic context.\n" "> > + */\n" "> > +void clk_unprotect(struct clk *clk);\n" - "> > ?\n" - "> > ?/**\n" - "> > ? * clk_enable - inform the system when the clock source should be running.\n" + "> > \302\240\n" + "> > \302\240/**\n" + "> > \302\240 * clk_enable - inform the system when the clock source should be running.\n" "> > @@ -460,6 +484,11 @@ static inline void clk_put(struct clk *clk) {}\n" - "> > ?\n" - "> > ?static inline void devm_clk_put(struct device *dev, struct clk *clk) {}\n" - "> > ?\n" + "> > \302\240\n" + "> > \302\240static inline void devm_clk_put(struct device *dev, struct clk *clk) {}\n" + "> > \302\240\n" "> > +\n" "> > +static inline void clk_protect(struct clk *clk) {}\n" "> > +\n" "> > +static inline void clk_unprotect(struct clk *clk) {}\n" "> > +\n" - "> > ?static inline int clk_enable(struct clk *clk)\n" - "> > ?{\n" - "> > ????????return 0;\n" - "> > --?\n" + "> > \302\240static inline int clk_enable(struct clk *clk)\n" + "> > \302\240{\n" + "> > \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240return 0;\n" + "> > --\302\240\n" "> > 2.9.3\n" > > -b5ca9b8fa342bed5bbd00fc6c8e3b5a807646960b1eef142245ef05f91719631 +6ba2e4ff8e034211602dcb78da21cd81891820a4c04c48da00f3c224189e5e5b
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.