Lines Matching refs:core
86 struct clk_core *core; member
96 static int clk_pm_runtime_get(struct clk_core *core) in clk_pm_runtime_get() argument
100 if (!core->dev) in clk_pm_runtime_get()
103 ret = pm_runtime_get_sync(core->dev); in clk_pm_runtime_get()
107 static void clk_pm_runtime_put(struct clk_core *core) in clk_pm_runtime_put() argument
109 if (!core->dev) in clk_pm_runtime_put()
112 pm_runtime_put_sync(core->dev); in clk_pm_runtime_put()
184 static bool clk_core_rate_is_protected(struct clk_core *core) in clk_core_rate_is_protected() argument
186 return core->protect_count; in clk_core_rate_is_protected()
189 static bool clk_core_is_prepared(struct clk_core *core) in clk_core_is_prepared() argument
197 if (!core->ops->is_prepared) in clk_core_is_prepared()
198 return core->prepare_count; in clk_core_is_prepared()
200 if (!clk_pm_runtime_get(core)) { in clk_core_is_prepared()
201 ret = core->ops->is_prepared(core->hw); in clk_core_is_prepared()
202 clk_pm_runtime_put(core); in clk_core_is_prepared()
208 static bool clk_core_is_enabled(struct clk_core *core) in clk_core_is_enabled() argument
216 if (!core->ops->is_enabled) in clk_core_is_enabled()
217 return core->enable_count; in clk_core_is_enabled()
229 if (core->dev) { in clk_core_is_enabled()
230 pm_runtime_get_noresume(core->dev); in clk_core_is_enabled()
231 if (!pm_runtime_active(core->dev)) { in clk_core_is_enabled()
237 ret = core->ops->is_enabled(core->hw); in clk_core_is_enabled()
239 if (core->dev) in clk_core_is_enabled()
240 pm_runtime_put(core->dev); in clk_core_is_enabled()
249 return !clk ? NULL : clk->core->name; in __clk_get_name()
255 return hw->core->name; in clk_hw_get_name()
261 return !clk ? NULL : clk->core->hw; in __clk_get_hw()
267 return hw->core->num_parents; in clk_hw_get_num_parents()
273 return hw->core->parent ? hw->core->parent->hw : NULL; in clk_hw_get_parent()
278 struct clk_core *core) in __clk_lookup_subtree() argument
283 if (!strcmp(core->name, name)) in __clk_lookup_subtree()
284 return core; in __clk_lookup_subtree()
286 hlist_for_each_entry(child, &core->children, child_node) { in __clk_lookup_subtree()
320 static struct clk_core *clk_core_get_parent_by_index(struct clk_core *core, in clk_core_get_parent_by_index() argument
323 if (!core || index >= core->num_parents) in clk_core_get_parent_by_index()
326 if (!core->parents[index]) in clk_core_get_parent_by_index()
327 core->parents[index] = in clk_core_get_parent_by_index()
328 clk_core_lookup(core->parent_names[index]); in clk_core_get_parent_by_index()
330 return core->parents[index]; in clk_core_get_parent_by_index()
338 parent = clk_core_get_parent_by_index(hw->core, index); in clk_hw_get_parent_by_index()
346 return !clk ? 0 : clk->core->enable_count; in __clk_get_enable_count()
349 static unsigned long clk_core_get_rate_nolock(struct clk_core *core) in clk_core_get_rate_nolock() argument
353 if (!core) { in clk_core_get_rate_nolock()
358 ret = core->rate; in clk_core_get_rate_nolock()
360 if (!core->num_parents) in clk_core_get_rate_nolock()
363 if (!core->parent) in clk_core_get_rate_nolock()
372 return clk_core_get_rate_nolock(hw->core); in clk_hw_get_rate()
376 static unsigned long __clk_get_accuracy(struct clk_core *core) in __clk_get_accuracy() argument
378 if (!core) in __clk_get_accuracy()
381 return core->accuracy; in __clk_get_accuracy()
386 return !clk ? 0 : clk->core->flags; in __clk_get_flags()
392 return hw->core->flags; in clk_hw_get_flags()
398 return clk_core_is_prepared(hw->core); in clk_hw_is_prepared()
403 return clk_core_rate_is_protected(hw->core); in clk_hw_rate_is_protected()
408 return clk_core_is_enabled(hw->core); in clk_hw_is_enabled()
416 return clk_core_is_enabled(clk->core); in __clk_is_enabled()
433 struct clk_core *core = hw->core, *parent, *best_parent = NULL; in clk_mux_determine_rate_flags() local
439 if (core->flags & CLK_SET_RATE_NO_REPARENT) { in clk_mux_determine_rate_flags()
440 parent = core->parent; in clk_mux_determine_rate_flags()
441 if (core->flags & CLK_SET_RATE_PARENT) { in clk_mux_determine_rate_flags()
451 best = clk_core_get_rate_nolock(core); in clk_mux_determine_rate_flags()
458 num_parents = core->num_parents; in clk_mux_determine_rate_flags()
460 parent = clk_core_get_parent_by_index(core, i); in clk_mux_determine_rate_flags()
464 if (core->flags & CLK_SET_RATE_PARENT) { in clk_mux_determine_rate_flags()
495 struct clk_core *core = clk_core_lookup(name); in __clk_lookup() local
497 return !core ? NULL : core->hw->clk; in __clk_lookup()
500 static void clk_core_get_boundaries(struct clk_core *core, in clk_core_get_boundaries() argument
506 *min_rate = core->min_rate; in clk_core_get_boundaries()
507 *max_rate = core->max_rate; in clk_core_get_boundaries()
509 hlist_for_each_entry(clk_user, &core->clks, clks_node) in clk_core_get_boundaries()
512 hlist_for_each_entry(clk_user, &core->clks, clks_node) in clk_core_get_boundaries()
519 hw->core->min_rate = min_rate; in clk_hw_set_rate_range()
520 hw->core->max_rate = max_rate; in clk_hw_set_rate_range()
545 static void clk_core_rate_unprotect(struct clk_core *core) in clk_core_rate_unprotect() argument
549 if (!core) in clk_core_rate_unprotect()
552 if (WARN(core->protect_count == 0, in clk_core_rate_unprotect()
553 "%s already unprotected\n", core->name)) in clk_core_rate_unprotect()
556 if (--core->protect_count > 0) in clk_core_rate_unprotect()
559 clk_core_rate_unprotect(core->parent); in clk_core_rate_unprotect()
562 static int clk_core_rate_nuke_protect(struct clk_core *core) in clk_core_rate_nuke_protect() argument
568 if (!core) in clk_core_rate_nuke_protect()
571 if (core->protect_count == 0) in clk_core_rate_nuke_protect()
574 ret = core->protect_count; in clk_core_rate_nuke_protect()
575 core->protect_count = 1; in clk_core_rate_nuke_protect()
576 clk_core_rate_unprotect(core); in clk_core_rate_nuke_protect()
613 clk_core_rate_unprotect(clk->core); in clk_rate_exclusive_put()
620 static void clk_core_rate_protect(struct clk_core *core) in clk_core_rate_protect() argument
624 if (!core) in clk_core_rate_protect()
627 if (core->protect_count == 0) in clk_core_rate_protect()
628 clk_core_rate_protect(core->parent); in clk_core_rate_protect()
630 core->protect_count++; in clk_core_rate_protect()
633 static void clk_core_rate_restore_protect(struct clk_core *core, int count) in clk_core_rate_restore_protect() argument
637 if (!core) in clk_core_rate_restore_protect()
643 clk_core_rate_protect(core); in clk_core_rate_restore_protect()
644 core->protect_count = count; in clk_core_rate_restore_protect()
671 clk_core_rate_protect(clk->core); in clk_rate_exclusive_get()
679 static void clk_core_unprepare(struct clk_core *core) in clk_core_unprepare() argument
683 if (!core) in clk_core_unprepare()
686 if (WARN(core->prepare_count == 0, in clk_core_unprepare()
687 "%s already unprepared\n", core->name)) in clk_core_unprepare()
690 if (WARN(core->prepare_count == 1 && core->flags & CLK_IS_CRITICAL, in clk_core_unprepare()
691 "Unpreparing critical %s\n", core->name)) in clk_core_unprepare()
694 if (core->flags & CLK_SET_RATE_GATE) in clk_core_unprepare()
695 clk_core_rate_unprotect(core); in clk_core_unprepare()
697 if (--core->prepare_count > 0) in clk_core_unprepare()
700 WARN(core->enable_count > 0, "Unpreparing enabled %s\n", core->name); in clk_core_unprepare()
702 trace_clk_unprepare(core); in clk_core_unprepare()
704 if (core->ops->unprepare) in clk_core_unprepare()
705 core->ops->unprepare(core->hw); in clk_core_unprepare()
707 clk_pm_runtime_put(core); in clk_core_unprepare()
709 trace_clk_unprepare_complete(core); in clk_core_unprepare()
710 clk_core_unprepare(core->parent); in clk_core_unprepare()
713 static void clk_core_unprepare_lock(struct clk_core *core) in clk_core_unprepare_lock() argument
716 clk_core_unprepare(core); in clk_core_unprepare_lock()
736 clk_core_unprepare_lock(clk->core); in clk_unprepare()
740 static int clk_core_prepare(struct clk_core *core) in clk_core_prepare() argument
746 if (!core) in clk_core_prepare()
749 if (core->prepare_count == 0) { in clk_core_prepare()
750 ret = clk_pm_runtime_get(core); in clk_core_prepare()
754 ret = clk_core_prepare(core->parent); in clk_core_prepare()
758 trace_clk_prepare(core); in clk_core_prepare()
760 if (core->ops->prepare) in clk_core_prepare()
761 ret = core->ops->prepare(core->hw); in clk_core_prepare()
763 trace_clk_prepare_complete(core); in clk_core_prepare()
769 core->prepare_count++; in clk_core_prepare()
778 if (core->flags & CLK_SET_RATE_GATE) in clk_core_prepare()
779 clk_core_rate_protect(core); in clk_core_prepare()
783 clk_core_unprepare(core->parent); in clk_core_prepare()
785 clk_pm_runtime_put(core); in clk_core_prepare()
789 static int clk_core_prepare_lock(struct clk_core *core) in clk_core_prepare_lock() argument
794 ret = clk_core_prepare(core); in clk_core_prepare_lock()
817 return clk_core_prepare_lock(clk->core); in clk_prepare()
821 static void clk_core_disable(struct clk_core *core) in clk_core_disable() argument
825 if (!core) in clk_core_disable()
828 if (WARN(core->enable_count == 0, "%s already disabled\n", core->name)) in clk_core_disable()
831 if (WARN(core->enable_count == 1 && core->flags & CLK_IS_CRITICAL, in clk_core_disable()
832 "Disabling critical %s\n", core->name)) in clk_core_disable()
835 if (--core->enable_count > 0) in clk_core_disable()
838 trace_clk_disable_rcuidle(core); in clk_core_disable()
840 if (core->ops->disable) in clk_core_disable()
841 core->ops->disable(core->hw); in clk_core_disable()
843 trace_clk_disable_complete_rcuidle(core); in clk_core_disable()
845 clk_core_disable(core->parent); in clk_core_disable()
848 static void clk_core_disable_lock(struct clk_core *core) in clk_core_disable_lock() argument
853 clk_core_disable(core); in clk_core_disable_lock()
874 clk_core_disable_lock(clk->core); in clk_disable()
878 static int clk_core_enable(struct clk_core *core) in clk_core_enable() argument
884 if (!core) in clk_core_enable()
887 if (WARN(core->prepare_count == 0, in clk_core_enable()
888 "Enabling unprepared %s\n", core->name)) in clk_core_enable()
891 if (core->enable_count == 0) { in clk_core_enable()
892 ret = clk_core_enable(core->parent); in clk_core_enable()
897 trace_clk_enable_rcuidle(core); in clk_core_enable()
899 if (core->ops->enable) in clk_core_enable()
900 ret = core->ops->enable(core->hw); in clk_core_enable()
902 trace_clk_enable_complete_rcuidle(core); in clk_core_enable()
905 clk_core_disable(core->parent); in clk_core_enable()
910 core->enable_count++; in clk_core_enable()
914 static int clk_core_enable_lock(struct clk_core *core) in clk_core_enable_lock() argument
920 ret = clk_core_enable(core); in clk_core_enable_lock()
944 return clk_core_enable_lock(clk->core); in clk_enable()
948 static int clk_core_prepare_enable(struct clk_core *core) in clk_core_prepare_enable() argument
952 ret = clk_core_prepare_lock(core); in clk_core_prepare_enable()
956 ret = clk_core_enable_lock(core); in clk_core_prepare_enable()
958 clk_core_unprepare_lock(core); in clk_core_prepare_enable()
963 static void clk_core_disable_unprepare(struct clk_core *core) in clk_core_disable_unprepare() argument
965 clk_core_disable_lock(core); in clk_core_disable_unprepare()
966 clk_core_unprepare_lock(core); in clk_core_disable_unprepare()
969 static void clk_unprepare_unused_subtree(struct clk_core *core) in clk_unprepare_unused_subtree() argument
975 hlist_for_each_entry(child, &core->children, child_node) in clk_unprepare_unused_subtree()
978 if (core->prepare_count) in clk_unprepare_unused_subtree()
981 if (core->flags & CLK_IGNORE_UNUSED) in clk_unprepare_unused_subtree()
984 if (clk_pm_runtime_get(core)) in clk_unprepare_unused_subtree()
987 if (clk_core_is_prepared(core)) { in clk_unprepare_unused_subtree()
988 trace_clk_unprepare(core); in clk_unprepare_unused_subtree()
989 if (core->ops->unprepare_unused) in clk_unprepare_unused_subtree()
990 core->ops->unprepare_unused(core->hw); in clk_unprepare_unused_subtree()
991 else if (core->ops->unprepare) in clk_unprepare_unused_subtree()
992 core->ops->unprepare(core->hw); in clk_unprepare_unused_subtree()
993 trace_clk_unprepare_complete(core); in clk_unprepare_unused_subtree()
996 clk_pm_runtime_put(core); in clk_unprepare_unused_subtree()
999 static void clk_disable_unused_subtree(struct clk_core *core) in clk_disable_unused_subtree() argument
1006 hlist_for_each_entry(child, &core->children, child_node) in clk_disable_unused_subtree()
1009 if (core->flags & CLK_OPS_PARENT_ENABLE) in clk_disable_unused_subtree()
1010 clk_core_prepare_enable(core->parent); in clk_disable_unused_subtree()
1012 if (clk_pm_runtime_get(core)) in clk_disable_unused_subtree()
1017 if (core->enable_count) in clk_disable_unused_subtree()
1020 if (core->flags & CLK_IGNORE_UNUSED) in clk_disable_unused_subtree()
1028 if (clk_core_is_enabled(core)) { in clk_disable_unused_subtree()
1029 trace_clk_disable(core); in clk_disable_unused_subtree()
1030 if (core->ops->disable_unused) in clk_disable_unused_subtree()
1031 core->ops->disable_unused(core->hw); in clk_disable_unused_subtree()
1032 else if (core->ops->disable) in clk_disable_unused_subtree()
1033 core->ops->disable(core->hw); in clk_disable_unused_subtree()
1034 trace_clk_disable_complete(core); in clk_disable_unused_subtree()
1039 clk_pm_runtime_put(core); in clk_disable_unused_subtree()
1041 if (core->flags & CLK_OPS_PARENT_ENABLE) in clk_disable_unused_subtree()
1042 clk_core_disable_unprepare(core->parent); in clk_disable_unused_subtree()
1055 struct clk_core *core; in clk_disable_unused() local
1064 hlist_for_each_entry(core, &clk_root_list, child_node) in clk_disable_unused()
1065 clk_disable_unused_subtree(core); in clk_disable_unused()
1067 hlist_for_each_entry(core, &clk_orphan_list, child_node) in clk_disable_unused()
1068 clk_disable_unused_subtree(core); in clk_disable_unused()
1070 hlist_for_each_entry(core, &clk_root_list, child_node) in clk_disable_unused()
1071 clk_unprepare_unused_subtree(core); in clk_disable_unused()
1073 hlist_for_each_entry(core, &clk_orphan_list, child_node) in clk_disable_unused()
1074 clk_unprepare_unused_subtree(core); in clk_disable_unused()
1082 static int clk_core_determine_round_nolock(struct clk_core *core, in clk_core_determine_round_nolock() argument
1089 if (!core) in clk_core_determine_round_nolock()
1098 if (clk_core_rate_is_protected(core)) { in clk_core_determine_round_nolock()
1099 req->rate = core->rate; in clk_core_determine_round_nolock()
1100 } else if (core->ops->determine_rate) { in clk_core_determine_round_nolock()
1101 return core->ops->determine_rate(core->hw, req); in clk_core_determine_round_nolock()
1102 } else if (core->ops->round_rate) { in clk_core_determine_round_nolock()
1103 rate = core->ops->round_rate(core->hw, req->rate, in clk_core_determine_round_nolock()
1116 static void clk_core_init_rate_req(struct clk_core * const core, in clk_core_init_rate_req() argument
1121 if (WARN_ON(!core || !req)) in clk_core_init_rate_req()
1124 parent = core->parent; in clk_core_init_rate_req()
1134 static bool clk_core_can_round(struct clk_core * const core) in clk_core_can_round() argument
1136 if (core->ops->determine_rate || core->ops->round_rate) in clk_core_can_round()
1142 static int clk_core_round_rate_nolock(struct clk_core *core, in clk_core_round_rate_nolock() argument
1147 if (!core) { in clk_core_round_rate_nolock()
1152 clk_core_init_rate_req(core, req); in clk_core_round_rate_nolock()
1154 if (clk_core_can_round(core)) in clk_core_round_rate_nolock()
1155 return clk_core_determine_round_nolock(core, req); in clk_core_round_rate_nolock()
1156 else if (core->flags & CLK_SET_RATE_PARENT) in clk_core_round_rate_nolock()
1157 return clk_core_round_rate_nolock(core->parent, req); in clk_core_round_rate_nolock()
1159 req->rate = core->rate; in clk_core_round_rate_nolock()
1177 return clk_core_round_rate_nolock(hw->core, req); in __clk_determine_rate()
1186 clk_core_get_boundaries(hw->core, &req.min_rate, &req.max_rate); in clk_hw_round_rate()
1189 ret = clk_core_round_rate_nolock(hw->core, &req); in clk_hw_round_rate()
1217 clk_core_rate_unprotect(clk->core); in clk_round_rate()
1219 clk_core_get_boundaries(clk->core, &req.min_rate, &req.max_rate); in clk_round_rate()
1222 ret = clk_core_round_rate_nolock(clk->core, &req); in clk_round_rate()
1225 clk_core_rate_protect(clk->core); in clk_round_rate()
1250 static int __clk_notify(struct clk_core *core, unsigned long msg, in __clk_notify() argument
1261 if (cn->clk->core == core) { in __clk_notify()
1282 static void __clk_recalc_accuracies(struct clk_core *core) in __clk_recalc_accuracies() argument
1289 if (core->parent) in __clk_recalc_accuracies()
1290 parent_accuracy = core->parent->accuracy; in __clk_recalc_accuracies()
1292 if (core->ops->recalc_accuracy) in __clk_recalc_accuracies()
1293 core->accuracy = core->ops->recalc_accuracy(core->hw, in __clk_recalc_accuracies()
1296 core->accuracy = parent_accuracy; in __clk_recalc_accuracies()
1298 hlist_for_each_entry(child, &core->children, child_node) in __clk_recalc_accuracies()
1302 static long clk_core_get_accuracy(struct clk_core *core) in clk_core_get_accuracy() argument
1307 if (core && (core->flags & CLK_GET_ACCURACY_NOCACHE)) in clk_core_get_accuracy()
1308 __clk_recalc_accuracies(core); in clk_core_get_accuracy()
1310 accuracy = __clk_get_accuracy(core); in clk_core_get_accuracy()
1330 return clk_core_get_accuracy(clk->core); in clk_get_accuracy()
1334 static unsigned long clk_recalc(struct clk_core *core, in clk_recalc() argument
1339 if (core->ops->recalc_rate && !clk_pm_runtime_get(core)) { in clk_recalc()
1340 rate = core->ops->recalc_rate(core->hw, parent_rate); in clk_recalc()
1341 clk_pm_runtime_put(core); in clk_recalc()
1358 static void __clk_recalc_rates(struct clk_core *core, unsigned long msg) in __clk_recalc_rates() argument
1366 old_rate = core->rate; in __clk_recalc_rates()
1368 if (core->parent) in __clk_recalc_rates()
1369 parent_rate = core->parent->rate; in __clk_recalc_rates()
1371 core->rate = clk_recalc(core, parent_rate); in __clk_recalc_rates()
1377 if (core->notifier_count && msg) in __clk_recalc_rates()
1378 __clk_notify(core, msg, old_rate, core->rate); in __clk_recalc_rates()
1380 hlist_for_each_entry(child, &core->children, child_node) in __clk_recalc_rates()
1384 static unsigned long clk_core_get_rate(struct clk_core *core) in clk_core_get_rate() argument
1390 if (core && (core->flags & CLK_GET_RATE_NOCACHE)) in clk_core_get_rate()
1391 __clk_recalc_rates(core, 0); in clk_core_get_rate()
1393 rate = clk_core_get_rate_nolock(core); in clk_core_get_rate()
1412 return clk_core_get_rate(clk->core); in clk_get_rate()
1416 static int clk_fetch_parent_index(struct clk_core *core, in clk_fetch_parent_index() argument
1424 for (i = 0; i < core->num_parents; i++) in clk_fetch_parent_index()
1425 if (clk_core_get_parent_by_index(core, i) == parent) in clk_fetch_parent_index()
1434 static void clk_core_update_orphan_status(struct clk_core *core, bool is_orphan) in clk_core_update_orphan_status() argument
1438 core->orphan = is_orphan; in clk_core_update_orphan_status()
1440 hlist_for_each_entry(child, &core->children, child_node) in clk_core_update_orphan_status()
1444 static void clk_reparent(struct clk_core *core, struct clk_core *new_parent) in clk_reparent() argument
1446 bool was_orphan = core->orphan; in clk_reparent()
1448 hlist_del(&core->child_node); in clk_reparent()
1454 if (new_parent->new_child == core) in clk_reparent()
1457 hlist_add_head(&core->child_node, &new_parent->children); in clk_reparent()
1460 clk_core_update_orphan_status(core, becomes_orphan); in clk_reparent()
1462 hlist_add_head(&core->child_node, &clk_orphan_list); in clk_reparent()
1464 clk_core_update_orphan_status(core, true); in clk_reparent()
1467 core->parent = new_parent; in clk_reparent()
1470 static struct clk_core *__clk_set_parent_before(struct clk_core *core, in __clk_set_parent_before() argument
1474 struct clk_core *old_parent = core->parent; in __clk_set_parent_before()
1497 if (core->flags & CLK_OPS_PARENT_ENABLE) { in __clk_set_parent_before()
1503 if (core->prepare_count) { in __clk_set_parent_before()
1505 clk_core_enable_lock(core); in __clk_set_parent_before()
1510 clk_reparent(core, parent); in __clk_set_parent_before()
1516 static void __clk_set_parent_after(struct clk_core *core, in __clk_set_parent_after() argument
1524 if (core->prepare_count) { in __clk_set_parent_after()
1525 clk_core_disable_lock(core); in __clk_set_parent_after()
1530 if (core->flags & CLK_OPS_PARENT_ENABLE) { in __clk_set_parent_after()
1536 static int __clk_set_parent(struct clk_core *core, struct clk_core *parent, in __clk_set_parent() argument
1543 old_parent = __clk_set_parent_before(core, parent); in __clk_set_parent()
1545 trace_clk_set_parent(core, parent); in __clk_set_parent()
1548 if (parent && core->ops->set_parent) in __clk_set_parent()
1549 ret = core->ops->set_parent(core->hw, p_index); in __clk_set_parent()
1551 trace_clk_set_parent_complete(core, parent); in __clk_set_parent()
1555 clk_reparent(core, old_parent); in __clk_set_parent()
1557 __clk_set_parent_after(core, old_parent, parent); in __clk_set_parent()
1562 __clk_set_parent_after(core, parent, old_parent); in __clk_set_parent()
1581 static int __clk_speculate_rates(struct clk_core *core, in __clk_speculate_rates() argument
1590 new_rate = clk_recalc(core, parent_rate); in __clk_speculate_rates()
1593 if (core->notifier_count) in __clk_speculate_rates()
1594 ret = __clk_notify(core, PRE_RATE_CHANGE, core->rate, new_rate); in __clk_speculate_rates()
1598 __func__, core->name, ret); in __clk_speculate_rates()
1602 hlist_for_each_entry(child, &core->children, child_node) { in __clk_speculate_rates()
1612 static void clk_calc_subtree(struct clk_core *core, unsigned long new_rate, in clk_calc_subtree() argument
1617 core->new_rate = new_rate; in clk_calc_subtree()
1618 core->new_parent = new_parent; in clk_calc_subtree()
1619 core->new_parent_index = p_index; in clk_calc_subtree()
1621 core->new_child = NULL; in clk_calc_subtree()
1622 if (new_parent && new_parent != core->parent) in clk_calc_subtree()
1623 new_parent->new_child = core; in clk_calc_subtree()
1625 hlist_for_each_entry(child, &core->children, child_node) { in clk_calc_subtree()
1635 static struct clk_core *clk_calc_new_rates(struct clk_core *core, in clk_calc_new_rates() argument
1638 struct clk_core *top = core; in clk_calc_new_rates()
1648 if (IS_ERR_OR_NULL(core)) in clk_calc_new_rates()
1652 parent = old_parent = core->parent; in clk_calc_new_rates()
1656 clk_core_get_boundaries(core, &min_rate, &max_rate); in clk_calc_new_rates()
1659 if (clk_core_can_round(core)) { in clk_calc_new_rates()
1666 clk_core_init_rate_req(core, &req); in clk_calc_new_rates()
1668 ret = clk_core_determine_round_nolock(core, &req); in clk_calc_new_rates()
1674 parent = req.best_parent_hw ? req.best_parent_hw->core : NULL; in clk_calc_new_rates()
1678 } else if (!parent || !(core->flags & CLK_SET_RATE_PARENT)) { in clk_calc_new_rates()
1680 core->new_rate = core->rate; in clk_calc_new_rates()
1691 (core->flags & CLK_SET_PARENT_GATE) && core->prepare_count) { in clk_calc_new_rates()
1693 __func__, core->name); in clk_calc_new_rates()
1698 if (parent && core->num_parents > 1) { in clk_calc_new_rates()
1699 p_index = clk_fetch_parent_index(core, parent); in clk_calc_new_rates()
1702 __func__, parent->name, core->name); in clk_calc_new_rates()
1707 if ((core->flags & CLK_SET_RATE_PARENT) && parent && in clk_calc_new_rates()
1712 clk_calc_subtree(core, new_rate, parent, p_index); in clk_calc_new_rates()
1722 static struct clk_core *clk_propagate_rate_change(struct clk_core *core, in clk_propagate_rate_change() argument
1728 if (core->rate == core->new_rate) in clk_propagate_rate_change()
1731 if (core->notifier_count) { in clk_propagate_rate_change()
1732 ret = __clk_notify(core, event, core->rate, core->new_rate); in clk_propagate_rate_change()
1734 fail_clk = core; in clk_propagate_rate_change()
1737 hlist_for_each_entry(child, &core->children, child_node) { in clk_propagate_rate_change()
1739 if (child->new_parent && child->new_parent != core) in clk_propagate_rate_change()
1747 if (core->new_child) { in clk_propagate_rate_change()
1748 tmp_clk = clk_propagate_rate_change(core->new_child, event); in clk_propagate_rate_change()
1760 static void clk_change_rate(struct clk_core *core) in clk_change_rate() argument
1770 old_rate = core->rate; in clk_change_rate()
1772 if (core->new_parent) { in clk_change_rate()
1773 parent = core->new_parent; in clk_change_rate()
1774 best_parent_rate = core->new_parent->rate; in clk_change_rate()
1775 } else if (core->parent) { in clk_change_rate()
1776 parent = core->parent; in clk_change_rate()
1777 best_parent_rate = core->parent->rate; in clk_change_rate()
1780 if (clk_pm_runtime_get(core)) in clk_change_rate()
1783 if (core->flags & CLK_SET_RATE_UNGATE) { in clk_change_rate()
1786 clk_core_prepare(core); in clk_change_rate()
1788 clk_core_enable(core); in clk_change_rate()
1792 if (core->new_parent && core->new_parent != core->parent) { in clk_change_rate()
1793 old_parent = __clk_set_parent_before(core, core->new_parent); in clk_change_rate()
1794 trace_clk_set_parent(core, core->new_parent); in clk_change_rate()
1796 if (core->ops->set_rate_and_parent) { in clk_change_rate()
1798 core->ops->set_rate_and_parent(core->hw, core->new_rate, in clk_change_rate()
1800 core->new_parent_index); in clk_change_rate()
1801 } else if (core->ops->set_parent) { in clk_change_rate()
1802 core->ops->set_parent(core->hw, core->new_parent_index); in clk_change_rate()
1805 trace_clk_set_parent_complete(core, core->new_parent); in clk_change_rate()
1806 __clk_set_parent_after(core, core->new_parent, old_parent); in clk_change_rate()
1809 if (core->flags & CLK_OPS_PARENT_ENABLE) in clk_change_rate()
1812 trace_clk_set_rate(core, core->new_rate); in clk_change_rate()
1814 if (!skip_set_rate && core->ops->set_rate) in clk_change_rate()
1815 core->ops->set_rate(core->hw, core->new_rate, best_parent_rate); in clk_change_rate()
1817 trace_clk_set_rate_complete(core, core->new_rate); in clk_change_rate()
1819 core->rate = clk_recalc(core, best_parent_rate); in clk_change_rate()
1821 if (core->flags & CLK_SET_RATE_UNGATE) { in clk_change_rate()
1825 clk_core_disable(core); in clk_change_rate()
1827 clk_core_unprepare(core); in clk_change_rate()
1830 if (core->flags & CLK_OPS_PARENT_ENABLE) in clk_change_rate()
1833 if (core->notifier_count && old_rate != core->rate) in clk_change_rate()
1834 __clk_notify(core, POST_RATE_CHANGE, old_rate, core->rate); in clk_change_rate()
1836 if (core->flags & CLK_RECALC_NEW_RATES) in clk_change_rate()
1837 (void)clk_calc_new_rates(core, core->new_rate); in clk_change_rate()
1843 hlist_for_each_entry_safe(child, tmp, &core->children, child_node) { in clk_change_rate()
1845 if (child->new_parent && child->new_parent != core) in clk_change_rate()
1851 if (core->new_child) in clk_change_rate()
1852 clk_change_rate(core->new_child); in clk_change_rate()
1854 clk_pm_runtime_put(core); in clk_change_rate()
1857 static unsigned long clk_core_req_round_rate_nolock(struct clk_core *core, in clk_core_req_round_rate_nolock() argument
1865 if (!core) in clk_core_req_round_rate_nolock()
1869 cnt = clk_core_rate_nuke_protect(core); in clk_core_req_round_rate_nolock()
1873 clk_core_get_boundaries(core, &req.min_rate, &req.max_rate); in clk_core_req_round_rate_nolock()
1876 ret = clk_core_round_rate_nolock(core, &req); in clk_core_req_round_rate_nolock()
1879 clk_core_rate_restore_protect(core, cnt); in clk_core_req_round_rate_nolock()
1884 static int clk_core_set_rate_nolock(struct clk_core *core, in clk_core_set_rate_nolock() argument
1891 if (!core) in clk_core_set_rate_nolock()
1894 rate = clk_core_req_round_rate_nolock(core, req_rate); in clk_core_set_rate_nolock()
1897 if (rate == clk_core_get_rate_nolock(core)) in clk_core_set_rate_nolock()
1901 if (clk_core_rate_is_protected(core)) in clk_core_set_rate_nolock()
1905 top = clk_calc_new_rates(core, req_rate); in clk_core_set_rate_nolock()
1909 ret = clk_pm_runtime_get(core); in clk_core_set_rate_nolock()
1926 core->req_rate = req_rate; in clk_core_set_rate_nolock()
1928 clk_pm_runtime_put(core); in clk_core_set_rate_nolock()
1965 clk_core_rate_unprotect(clk->core); in clk_set_rate()
1967 ret = clk_core_set_rate_nolock(clk->core, rate); in clk_set_rate()
1970 clk_core_rate_protect(clk->core); in clk_set_rate()
2013 ret = clk_core_set_rate_nolock(clk->core, rate); in clk_set_rate_exclusive()
2015 clk_core_rate_protect(clk->core); in clk_set_rate_exclusive()
2043 __func__, clk->core->name, clk->dev_id, clk->con_id, in clk_set_rate_range()
2051 clk_core_rate_unprotect(clk->core); in clk_set_rate_range()
2059 rate = clk_core_get_rate_nolock(clk->core); in clk_set_rate_range()
2079 ret = clk_core_set_rate_nolock(clk->core, rate); in clk_set_rate_range()
2088 clk_core_rate_protect(clk->core); in clk_set_rate_range()
2143 parent = !clk->core->parent ? NULL : clk->core->parent->hw->clk; in clk_get_parent()
2150 static struct clk_core *__clk_init_parent(struct clk_core *core) in __clk_init_parent() argument
2154 if (core->num_parents > 1 && core->ops->get_parent) in __clk_init_parent()
2155 index = core->ops->get_parent(core->hw); in __clk_init_parent()
2157 return clk_core_get_parent_by_index(core, index); in __clk_init_parent()
2160 static void clk_core_reparent(struct clk_core *core, in clk_core_reparent() argument
2163 clk_reparent(core, new_parent); in clk_core_reparent()
2164 __clk_recalc_accuracies(core); in clk_core_reparent()
2165 __clk_recalc_rates(core, POST_RATE_CHANGE); in clk_core_reparent()
2173 clk_core_reparent(hw->core, !new_parent ? NULL : new_parent->core); in clk_hw_reparent()
2188 struct clk_core *core, *parent_core; in clk_has_parent() local
2194 core = clk->core; in clk_has_parent()
2195 parent_core = parent->core; in clk_has_parent()
2198 if (core->parent == parent_core) in clk_has_parent()
2201 return match_string(core->parent_names, core->num_parents, in clk_has_parent()
2206 static int clk_core_set_parent_nolock(struct clk_core *core, in clk_core_set_parent_nolock() argument
2215 if (!core) in clk_core_set_parent_nolock()
2218 if (core->parent == parent) in clk_core_set_parent_nolock()
2222 if (core->num_parents > 1 && !core->ops->set_parent) in clk_core_set_parent_nolock()
2226 if ((core->flags & CLK_SET_PARENT_GATE) && core->prepare_count) in clk_core_set_parent_nolock()
2229 if (clk_core_rate_is_protected(core)) in clk_core_set_parent_nolock()
2234 p_index = clk_fetch_parent_index(core, parent); in clk_core_set_parent_nolock()
2237 __func__, parent->name, core->name); in clk_core_set_parent_nolock()
2243 ret = clk_pm_runtime_get(core); in clk_core_set_parent_nolock()
2248 ret = __clk_speculate_rates(core, p_rate); in clk_core_set_parent_nolock()
2255 ret = __clk_set_parent(core, parent, p_index); in clk_core_set_parent_nolock()
2259 __clk_recalc_rates(core, ABORT_RATE_CHANGE); in clk_core_set_parent_nolock()
2261 __clk_recalc_rates(core, POST_RATE_CHANGE); in clk_core_set_parent_nolock()
2262 __clk_recalc_accuracies(core); in clk_core_set_parent_nolock()
2266 clk_pm_runtime_put(core); in clk_core_set_parent_nolock()
2298 clk_core_rate_unprotect(clk->core); in clk_set_parent()
2300 ret = clk_core_set_parent_nolock(clk->core, in clk_set_parent()
2301 parent ? parent->core : NULL); in clk_set_parent()
2304 clk_core_rate_protect(clk->core); in clk_set_parent()
2312 static int clk_core_set_phase_nolock(struct clk_core *core, int degrees) in clk_core_set_phase_nolock() argument
2318 if (!core) in clk_core_set_phase_nolock()
2321 if (clk_core_rate_is_protected(core)) in clk_core_set_phase_nolock()
2324 trace_clk_set_phase(core, degrees); in clk_core_set_phase_nolock()
2326 if (core->ops->set_phase) { in clk_core_set_phase_nolock()
2327 ret = core->ops->set_phase(core->hw, degrees); in clk_core_set_phase_nolock()
2329 core->phase = degrees; in clk_core_set_phase_nolock()
2332 trace_clk_set_phase_complete(core, degrees); in clk_core_set_phase_nolock()
2372 clk_core_rate_unprotect(clk->core); in clk_set_phase()
2374 ret = clk_core_set_phase_nolock(clk->core, degrees); in clk_set_phase()
2377 clk_core_rate_protect(clk->core); in clk_set_phase()
2385 static int clk_core_get_phase(struct clk_core *core) in clk_core_get_phase() argument
2391 if (core->ops->get_phase) in clk_core_get_phase()
2392 core->phase = core->ops->get_phase(core->hw); in clk_core_get_phase()
2393 ret = core->phase; in clk_core_get_phase()
2411 return clk_core_get_phase(clk->core); in clk_get_phase()
2415 static void clk_core_reset_duty_cycle_nolock(struct clk_core *core) in clk_core_reset_duty_cycle_nolock() argument
2418 core->duty.num = 1; in clk_core_reset_duty_cycle_nolock()
2419 core->duty.den = 2; in clk_core_reset_duty_cycle_nolock()
2422 static int clk_core_update_duty_cycle_parent_nolock(struct clk_core *core);
2424 static int clk_core_update_duty_cycle_nolock(struct clk_core *core) in clk_core_update_duty_cycle_nolock() argument
2426 struct clk_duty *duty = &core->duty; in clk_core_update_duty_cycle_nolock()
2429 if (!core->ops->get_duty_cycle) in clk_core_update_duty_cycle_nolock()
2430 return clk_core_update_duty_cycle_parent_nolock(core); in clk_core_update_duty_cycle_nolock()
2432 ret = core->ops->get_duty_cycle(core->hw, duty); in clk_core_update_duty_cycle_nolock()
2445 clk_core_reset_duty_cycle_nolock(core); in clk_core_update_duty_cycle_nolock()
2449 static int clk_core_update_duty_cycle_parent_nolock(struct clk_core *core) in clk_core_update_duty_cycle_parent_nolock() argument
2453 if (core->parent && in clk_core_update_duty_cycle_parent_nolock()
2454 core->flags & CLK_DUTY_CYCLE_PARENT) { in clk_core_update_duty_cycle_parent_nolock()
2455 ret = clk_core_update_duty_cycle_nolock(core->parent); in clk_core_update_duty_cycle_parent_nolock()
2456 memcpy(&core->duty, &core->parent->duty, sizeof(core->duty)); in clk_core_update_duty_cycle_parent_nolock()
2458 clk_core_reset_duty_cycle_nolock(core); in clk_core_update_duty_cycle_parent_nolock()
2464 static int clk_core_set_duty_cycle_parent_nolock(struct clk_core *core,
2467 static int clk_core_set_duty_cycle_nolock(struct clk_core *core, in clk_core_set_duty_cycle_nolock() argument
2474 if (clk_core_rate_is_protected(core)) in clk_core_set_duty_cycle_nolock()
2477 trace_clk_set_duty_cycle(core, duty); in clk_core_set_duty_cycle_nolock()
2479 if (!core->ops->set_duty_cycle) in clk_core_set_duty_cycle_nolock()
2480 return clk_core_set_duty_cycle_parent_nolock(core, duty); in clk_core_set_duty_cycle_nolock()
2482 ret = core->ops->set_duty_cycle(core->hw, duty); in clk_core_set_duty_cycle_nolock()
2484 memcpy(&core->duty, duty, sizeof(*duty)); in clk_core_set_duty_cycle_nolock()
2486 trace_clk_set_duty_cycle_complete(core, duty); in clk_core_set_duty_cycle_nolock()
2491 static int clk_core_set_duty_cycle_parent_nolock(struct clk_core *core, in clk_core_set_duty_cycle_parent_nolock() argument
2496 if (core->parent && in clk_core_set_duty_cycle_parent_nolock()
2497 core->flags & (CLK_DUTY_CYCLE_PARENT | CLK_SET_RATE_PARENT)) { in clk_core_set_duty_cycle_parent_nolock()
2498 ret = clk_core_set_duty_cycle_nolock(core->parent, duty); in clk_core_set_duty_cycle_parent_nolock()
2499 memcpy(&core->duty, &core->parent->duty, sizeof(core->duty)); in clk_core_set_duty_cycle_parent_nolock()
2534 clk_core_rate_unprotect(clk->core); in clk_set_duty_cycle()
2536 ret = clk_core_set_duty_cycle_nolock(clk->core, &duty); in clk_set_duty_cycle()
2539 clk_core_rate_protect(clk->core); in clk_set_duty_cycle()
2547 static int clk_core_get_scaled_duty_cycle(struct clk_core *core, in clk_core_get_scaled_duty_cycle() argument
2550 struct clk_duty *duty = &core->duty; in clk_core_get_scaled_duty_cycle()
2555 ret = clk_core_update_duty_cycle_nolock(core); in clk_core_get_scaled_duty_cycle()
2577 return clk_core_get_scaled_duty_cycle(clk->core, scale); in clk_get_scaled_duty_cycle()
2600 if (p->core == q->core) in clk_is_match()
2760 struct clk_core *core = s->private; in clk_flags_show() local
2761 unsigned long flags = core->flags; in clk_flags_show()
2781 struct clk_core *core = s->private; in possible_parents_show() local
2784 for (i = 0; i < core->num_parents - 1; i++) in possible_parents_show()
2785 seq_printf(s, "%s ", core->parent_names[i]); in possible_parents_show()
2787 seq_printf(s, "%s\n", core->parent_names[i]); in possible_parents_show()
2795 struct clk_core *core = s->private; in clk_duty_cycle_show() local
2796 struct clk_duty *duty = &core->duty; in clk_duty_cycle_show()
2804 static void clk_debug_create_one(struct clk_core *core, struct dentry *pdentry) in clk_debug_create_one() argument
2808 if (!core || !pdentry) in clk_debug_create_one()
2811 root = debugfs_create_dir(core->name, pdentry); in clk_debug_create_one()
2812 core->dentry = root; in clk_debug_create_one()
2814 debugfs_create_ulong("clk_rate", 0444, root, &core->rate); in clk_debug_create_one()
2815 debugfs_create_ulong("clk_accuracy", 0444, root, &core->accuracy); in clk_debug_create_one()
2816 debugfs_create_u32("clk_phase", 0444, root, &core->phase); in clk_debug_create_one()
2817 debugfs_create_file("clk_flags", 0444, root, core, &clk_flags_fops); in clk_debug_create_one()
2818 debugfs_create_u32("clk_prepare_count", 0444, root, &core->prepare_count); in clk_debug_create_one()
2819 debugfs_create_u32("clk_enable_count", 0444, root, &core->enable_count); in clk_debug_create_one()
2820 debugfs_create_u32("clk_protect_count", 0444, root, &core->protect_count); in clk_debug_create_one()
2821 debugfs_create_u32("clk_notifier_count", 0444, root, &core->notifier_count); in clk_debug_create_one()
2822 debugfs_create_file("clk_duty_cycle", 0444, root, core, in clk_debug_create_one()
2825 if (core->num_parents > 1) in clk_debug_create_one()
2826 debugfs_create_file("clk_possible_parents", 0444, root, core, in clk_debug_create_one()
2829 if (core->ops->debug_init) in clk_debug_create_one()
2830 core->ops->debug_init(core->hw, core->dentry); in clk_debug_create_one()
2841 static void clk_debug_register(struct clk_core *core) in clk_debug_register() argument
2844 hlist_add_head(&core->debug_node, &clk_debug_list); in clk_debug_register()
2846 clk_debug_create_one(core, rootdir); in clk_debug_register()
2858 static void clk_debug_unregister(struct clk_core *core) in clk_debug_unregister() argument
2861 hlist_del_init(&core->debug_node); in clk_debug_unregister()
2862 debugfs_remove_recursive(core->dentry); in clk_debug_unregister()
2863 core->dentry = NULL; in clk_debug_unregister()
2878 struct clk_core *core; in clk_debug_init() local
2892 hlist_for_each_entry(core, &clk_debug_list, debug_node) in clk_debug_init()
2893 clk_debug_create_one(core, rootdir); in clk_debug_init()
2902 static inline void clk_debug_register(struct clk_core *core) { } in clk_debug_register() argument
2903 static inline void clk_debug_reparent(struct clk_core *core, in clk_debug_reparent() argument
2907 static inline void clk_debug_unregister(struct clk_core *core) in clk_debug_unregister() argument
2919 static int __clk_core_init(struct clk_core *core) in __clk_core_init() argument
2926 if (!core) in __clk_core_init()
2931 ret = clk_pm_runtime_get(core); in __clk_core_init()
2936 if (clk_core_lookup(core->name)) { in __clk_core_init()
2938 __func__, core->name); in __clk_core_init()
2944 if (core->ops->set_rate && in __clk_core_init()
2945 !((core->ops->round_rate || core->ops->determine_rate) && in __clk_core_init()
2946 core->ops->recalc_rate)) { in __clk_core_init()
2948 __func__, core->name); in __clk_core_init()
2953 if (core->ops->set_parent && !core->ops->get_parent) { in __clk_core_init()
2955 __func__, core->name); in __clk_core_init()
2960 if (core->num_parents > 1 && !core->ops->get_parent) { in __clk_core_init()
2962 __func__, core->name); in __clk_core_init()
2967 if (core->ops->set_rate_and_parent && in __clk_core_init()
2968 !(core->ops->set_parent && core->ops->set_rate)) { in __clk_core_init()
2970 __func__, core->name); in __clk_core_init()
2976 for (i = 0; i < core->num_parents; i++) in __clk_core_init()
2977 WARN(!core->parent_names[i], in __clk_core_init()
2979 __func__, core->name); in __clk_core_init()
2981 core->parent = __clk_init_parent(core); in __clk_core_init()
2993 if (core->parent) { in __clk_core_init()
2994 hlist_add_head(&core->child_node, in __clk_core_init()
2995 &core->parent->children); in __clk_core_init()
2996 core->orphan = core->parent->orphan; in __clk_core_init()
2997 } else if (!core->num_parents) { in __clk_core_init()
2998 hlist_add_head(&core->child_node, &clk_root_list); in __clk_core_init()
2999 core->orphan = false; in __clk_core_init()
3001 hlist_add_head(&core->child_node, &clk_orphan_list); in __clk_core_init()
3002 core->orphan = true; in __clk_core_init()
3013 if (core->ops->init) in __clk_core_init()
3014 core->ops->init(core->hw); in __clk_core_init()
3023 if (core->ops->recalc_accuracy) in __clk_core_init()
3024 core->accuracy = core->ops->recalc_accuracy(core->hw, in __clk_core_init()
3025 __clk_get_accuracy(core->parent)); in __clk_core_init()
3026 else if (core->parent) in __clk_core_init()
3027 core->accuracy = core->parent->accuracy; in __clk_core_init()
3029 core->accuracy = 0; in __clk_core_init()
3036 if (core->ops->get_phase) in __clk_core_init()
3037 core->phase = core->ops->get_phase(core->hw); in __clk_core_init()
3039 core->phase = 0; in __clk_core_init()
3044 clk_core_update_duty_cycle_nolock(core); in __clk_core_init()
3052 if (core->ops->recalc_rate) in __clk_core_init()
3053 rate = core->ops->recalc_rate(core->hw, in __clk_core_init()
3054 clk_core_get_rate_nolock(core->parent)); in __clk_core_init()
3055 else if (core->parent) in __clk_core_init()
3056 rate = core->parent->rate; in __clk_core_init()
3059 core->rate = core->req_rate = rate; in __clk_core_init()
3066 if (core->flags & CLK_IS_CRITICAL) { in __clk_core_init()
3069 clk_core_prepare(core); in __clk_core_init()
3072 clk_core_enable(core); in __clk_core_init()
3098 kref_init(&core->ref); in __clk_core_init()
3100 clk_pm_runtime_put(core); in __clk_core_init()
3105 clk_debug_register(core); in __clk_core_init()
3123 clk->core = hw->core; in __clk_create_clk()
3129 hlist_add_head(&clk->clks_node, &hw->core->clks); in __clk_create_clk()
3160 struct clk_core *core; in clk_register() local
3162 core = kzalloc(sizeof(*core), GFP_KERNEL); in clk_register()
3163 if (!core) { in clk_register()
3168 core->name = kstrdup_const(hw->init->name, GFP_KERNEL); in clk_register()
3169 if (!core->name) { in clk_register()
3178 core->ops = hw->init->ops; in clk_register()
3181 core->dev = dev; in clk_register()
3183 core->owner = dev->driver->owner; in clk_register()
3184 core->hw = hw; in clk_register()
3185 core->flags = hw->init->flags; in clk_register()
3186 core->num_parents = hw->init->num_parents; in clk_register()
3187 core->min_rate = 0; in clk_register()
3188 core->max_rate = ULONG_MAX; in clk_register()
3189 hw->core = core; in clk_register()
3192 core->parent_names = kcalloc(core->num_parents, sizeof(char *), in clk_register()
3195 if (!core->parent_names) { in clk_register()
3202 for (i = 0; i < core->num_parents; i++) { in clk_register()
3203 core->parent_names[i] = kstrdup_const(hw->init->parent_names[i], in clk_register()
3205 if (!core->parent_names[i]) { in clk_register()
3212 core->parents = kcalloc(core->num_parents, sizeof(*core->parents), in clk_register()
3214 if (!core->parents) { in clk_register()
3219 INIT_HLIST_HEAD(&core->clks); in clk_register()
3227 ret = __clk_core_init(core); in clk_register()
3235 kfree(core->parents); in clk_register()
3238 kfree_const(core->parent_names[i]); in clk_register()
3239 kfree(core->parent_names); in clk_register()
3242 kfree_const(core->name); in clk_register()
3244 kfree(core); in clk_register()
3269 struct clk_core *core = container_of(ref, struct clk_core, ref); in __clk_release() local
3270 int i = core->num_parents; in __clk_release()
3274 kfree(core->parents); in __clk_release()
3276 kfree_const(core->parent_names[i]); in __clk_release()
3278 kfree(core->parent_names); in __clk_release()
3279 kfree_const(core->name); in __clk_release()
3280 kfree(core); in __clk_release()
3329 clk_debug_unregister(clk->core); in clk_unregister()
3333 if (clk->core->ops == &clk_nodrv_ops) { in clk_unregister()
3335 clk->core->name); in clk_unregister()
3343 clk->core->ops = &clk_nodrv_ops; in clk_unregister()
3346 if (!hlist_empty(&clk->core->children)) { in clk_unregister()
3351 hlist_for_each_entry_safe(child, t, &clk->core->children, in clk_unregister()
3356 hlist_del_init(&clk->core->child_node); in clk_unregister()
3358 if (clk->core->prepare_count) in clk_unregister()
3360 __func__, clk->core->name); in clk_unregister()
3362 if (clk->core->protect_count) in clk_unregister()
3364 __func__, clk->core->name); in clk_unregister()
3366 kref_put(&clk->core->ref, __clk_release); in clk_unregister()
3504 struct clk_core *core = !clk ? NULL : clk->core; in __clk_get() local
3506 if (core) { in __clk_get()
3507 if (!try_module_get(core->owner)) in __clk_get()
3510 kref_get(&core->ref); in __clk_get()
3532 clk->core->protect_count -= (clk->exclusive_count - 1); in __clk_put()
3533 clk_core_rate_unprotect(clk->core); in __clk_put()
3538 if (clk->min_rate > clk->core->req_rate || in __clk_put()
3539 clk->max_rate < clk->core->req_rate) in __clk_put()
3540 clk_core_set_rate_nolock(clk->core, clk->core->req_rate); in __clk_put()
3542 owner = clk->core->owner; in __clk_put()
3543 kref_put(&clk->core->ref, __clk_release); in __clk_put()
3604 clk->core->notifier_count++; in clk_notifier_register()
3641 clk->core->notifier_count--; in clk_notifier_unregister()