Lines Matching full:core
54 struct clk_core *core; member
103 struct clk_core *core; member
114 static int clk_pm_runtime_get(struct clk_core *core) in clk_pm_runtime_get() argument
118 if (!core->rpm_enabled) in clk_pm_runtime_get()
121 ret = pm_runtime_get_sync(core->dev); in clk_pm_runtime_get()
123 pm_runtime_put_noidle(core->dev); in clk_pm_runtime_get()
129 static void clk_pm_runtime_put(struct clk_core *core) in clk_pm_runtime_put() argument
131 if (!core->rpm_enabled) in clk_pm_runtime_put()
134 pm_runtime_put_sync(core->dev); in clk_pm_runtime_put()
155 struct clk_core *core, *failed; in clk_pm_runtime_get_all() local
168 hlist_for_each_entry(core, &clk_rpm_list, rpm_node) { in clk_pm_runtime_get_all()
169 ret = clk_pm_runtime_get(core); in clk_pm_runtime_get_all()
171 failed = core; in clk_pm_runtime_get_all()
181 hlist_for_each_entry(core, &clk_rpm_list, rpm_node) { in clk_pm_runtime_get_all()
182 if (core == failed) in clk_pm_runtime_get_all()
185 clk_pm_runtime_put(core); in clk_pm_runtime_get_all()
200 struct clk_core *core; in clk_pm_runtime_put_all() local
202 hlist_for_each_entry(core, &clk_rpm_list, rpm_node) in clk_pm_runtime_put_all()
203 clk_pm_runtime_put(core); in clk_pm_runtime_put_all()
207 static void clk_pm_runtime_init(struct clk_core *core) in clk_pm_runtime_init() argument
209 struct device *dev = core->dev; in clk_pm_runtime_init()
212 core->rpm_enabled = true; in clk_pm_runtime_init()
215 hlist_add_head(&core->rpm_node, &clk_rpm_list); in clk_pm_runtime_init()
289 static bool clk_core_rate_is_protected(struct clk_core *core) in clk_core_rate_is_protected() argument
291 return core->protect_count; in clk_core_rate_is_protected()
294 static bool clk_core_is_prepared(struct clk_core *core) in clk_core_is_prepared() argument
302 if (!core->ops->is_prepared) in clk_core_is_prepared()
303 return core->prepare_count; in clk_core_is_prepared()
305 if (!clk_pm_runtime_get(core)) { in clk_core_is_prepared()
306 ret = core->ops->is_prepared(core->hw); in clk_core_is_prepared()
307 clk_pm_runtime_put(core); in clk_core_is_prepared()
313 static bool clk_core_is_enabled(struct clk_core *core) in clk_core_is_enabled() argument
321 if (!core->ops->is_enabled) in clk_core_is_enabled()
322 return core->enable_count; in clk_core_is_enabled()
334 if (core->rpm_enabled) { in clk_core_is_enabled()
335 pm_runtime_get_noresume(core->dev); in clk_core_is_enabled()
336 if (!pm_runtime_active(core->dev)) { in clk_core_is_enabled()
347 if ((core->flags & CLK_OPS_PARENT_ENABLE) && core->parent) in clk_core_is_enabled()
348 if (!clk_core_is_enabled(core->parent)) { in clk_core_is_enabled()
353 ret = core->ops->is_enabled(core->hw); in clk_core_is_enabled()
355 if (core->rpm_enabled) in clk_core_is_enabled()
356 pm_runtime_put(core->dev); in clk_core_is_enabled()
365 return !clk ? NULL : clk->core->name; in __clk_get_name()
371 return hw->core->name; in clk_hw_get_name()
377 return !clk ? NULL : clk->core->hw; in __clk_get_hw()
383 return hw->core->num_parents; in clk_hw_get_num_parents()
389 return hw->core->parent ? hw->core->parent->hw : NULL; in clk_hw_get_parent()
394 struct clk_core *core) in __clk_lookup_subtree() argument
399 if (!strcmp(core->name, name)) in __clk_lookup_subtree()
400 return core; in __clk_lookup_subtree()
402 hlist_for_each_entry(child, &core->children, child_node) { in __clk_lookup_subtree()
457 * @core: clk to find parent of
491 static struct clk_core *clk_core_get(struct clk_core *core, u8 p_index) in clk_core_get() argument
493 const char *name = core->parents[p_index].fw_name; in clk_core_get()
494 int index = core->parents[p_index].index; in clk_core_get()
496 struct device *dev = core->dev; in clk_core_get()
498 struct device_node *np = core->of_node; in clk_core_get()
519 return hw->core; in clk_core_get()
522 static void clk_core_fill_parent_index(struct clk_core *core, u8 index) in clk_core_fill_parent_index() argument
524 struct clk_parent_map *entry = &core->parents[index]; in clk_core_fill_parent_index()
528 parent = entry->hw->core; in clk_core_fill_parent_index()
537 parent = clk_core_get(core, index); in clk_core_fill_parent_index()
544 entry->core = parent; in clk_core_fill_parent_index()
547 static struct clk_core *clk_core_get_parent_by_index(struct clk_core *core, in clk_core_get_parent_by_index() argument
550 if (!core || index >= core->num_parents || !core->parents) in clk_core_get_parent_by_index()
553 if (!core->parents[index].core) in clk_core_get_parent_by_index()
554 clk_core_fill_parent_index(core, index); in clk_core_get_parent_by_index()
556 return core->parents[index].core; in clk_core_get_parent_by_index()
564 parent = clk_core_get_parent_by_index(hw->core, index); in clk_hw_get_parent_by_index()
572 return !clk ? 0 : clk->core->enable_count; in __clk_get_enable_count()
575 static unsigned long clk_core_get_rate_nolock(struct clk_core *core) in clk_core_get_rate_nolock() argument
577 if (!core) in clk_core_get_rate_nolock()
580 if (!core->num_parents || core->parent) in clk_core_get_rate_nolock()
581 return core->rate; in clk_core_get_rate_nolock()
593 return clk_core_get_rate_nolock(hw->core); in clk_hw_get_rate()
597 static unsigned long clk_core_get_accuracy_no_lock(struct clk_core *core) in clk_core_get_accuracy_no_lock() argument
599 if (!core) in clk_core_get_accuracy_no_lock()
602 return core->accuracy; in clk_core_get_accuracy_no_lock()
607 return hw->core->flags; in clk_hw_get_flags()
613 return clk_core_is_prepared(hw->core); in clk_hw_is_prepared()
619 return clk_core_rate_is_protected(hw->core); in clk_hw_rate_is_protected()
625 return clk_core_is_enabled(hw->core); in clk_hw_is_enabled()
634 return clk_core_is_enabled(clk->core); in __clk_is_enabled()
651 struct clk_core *core = hw->core, *parent, *best_parent = NULL; in clk_mux_determine_rate_flags() local
657 if (core->flags & CLK_SET_RATE_NO_REPARENT) { in clk_mux_determine_rate_flags()
658 parent = core->parent; in clk_mux_determine_rate_flags()
659 if (core->flags & CLK_SET_RATE_PARENT) { in clk_mux_determine_rate_flags()
669 best = clk_core_get_rate_nolock(core); in clk_mux_determine_rate_flags()
676 num_parents = core->num_parents; in clk_mux_determine_rate_flags()
678 parent = clk_core_get_parent_by_index(core, i); in clk_mux_determine_rate_flags()
682 if (core->flags & CLK_SET_RATE_PARENT) { in clk_mux_determine_rate_flags()
713 struct clk_core *core = clk_core_lookup(name); in __clk_lookup() local
715 return !core ? NULL : core->hw->clk; in __clk_lookup()
718 static void clk_core_get_boundaries(struct clk_core *core, in clk_core_get_boundaries() argument
726 *min_rate = core->min_rate; in clk_core_get_boundaries()
727 *max_rate = core->max_rate; in clk_core_get_boundaries()
729 hlist_for_each_entry(clk_user, &core->clks, clks_node) in clk_core_get_boundaries()
732 hlist_for_each_entry(clk_user, &core->clks, clks_node) in clk_core_get_boundaries()
736 static bool clk_core_check_boundaries(struct clk_core *core, in clk_core_check_boundaries() argument
744 if (min_rate > core->max_rate || max_rate < core->min_rate) in clk_core_check_boundaries()
747 hlist_for_each_entry(user, &core->clks, clks_node) in clk_core_check_boundaries()
757 hw->core->min_rate = min_rate; in clk_hw_set_rate_range()
758 hw->core->max_rate = max_rate; in clk_hw_set_rate_range()
789 static void clk_core_rate_unprotect(struct clk_core *core) in clk_core_rate_unprotect() argument
793 if (!core) in clk_core_rate_unprotect()
796 if (WARN(core->protect_count == 0, in clk_core_rate_unprotect()
797 "%s already unprotected\n", core->name)) in clk_core_rate_unprotect()
800 if (--core->protect_count > 0) in clk_core_rate_unprotect()
803 clk_core_rate_unprotect(core->parent); in clk_core_rate_unprotect()
806 static int clk_core_rate_nuke_protect(struct clk_core *core) in clk_core_rate_nuke_protect() argument
812 if (!core) in clk_core_rate_nuke_protect()
815 if (core->protect_count == 0) in clk_core_rate_nuke_protect()
818 ret = core->protect_count; in clk_core_rate_nuke_protect()
819 core->protect_count = 1; in clk_core_rate_nuke_protect()
820 clk_core_rate_unprotect(core); in clk_core_rate_nuke_protect()
857 clk_core_rate_unprotect(clk->core); in clk_rate_exclusive_put()
864 static void clk_core_rate_protect(struct clk_core *core) in clk_core_rate_protect() argument
868 if (!core) in clk_core_rate_protect()
871 if (core->protect_count == 0) in clk_core_rate_protect()
872 clk_core_rate_protect(core->parent); in clk_core_rate_protect()
874 core->protect_count++; in clk_core_rate_protect()
877 static void clk_core_rate_restore_protect(struct clk_core *core, int count) in clk_core_rate_restore_protect() argument
881 if (!core) in clk_core_rate_restore_protect()
887 clk_core_rate_protect(core); in clk_core_rate_restore_protect()
888 core->protect_count = count; in clk_core_rate_restore_protect()
915 clk_core_rate_protect(clk->core); in clk_rate_exclusive_get()
923 static void clk_core_unprepare(struct clk_core *core) in clk_core_unprepare() argument
927 if (!core) in clk_core_unprepare()
930 if (WARN(core->prepare_count == 0, in clk_core_unprepare()
931 "%s already unprepared\n", core->name)) in clk_core_unprepare()
934 if (WARN(core->prepare_count == 1 && core->flags & CLK_IS_CRITICAL, in clk_core_unprepare()
935 "Unpreparing critical %s\n", core->name)) in clk_core_unprepare()
938 if (core->flags & CLK_SET_RATE_GATE) in clk_core_unprepare()
939 clk_core_rate_unprotect(core); in clk_core_unprepare()
941 if (--core->prepare_count > 0) in clk_core_unprepare()
944 WARN(core->enable_count > 0, "Unpreparing enabled %s\n", core->name); in clk_core_unprepare()
946 trace_clk_unprepare(core); in clk_core_unprepare()
948 if (core->ops->unprepare) in clk_core_unprepare()
949 core->ops->unprepare(core->hw); in clk_core_unprepare()
951 trace_clk_unprepare_complete(core); in clk_core_unprepare()
952 clk_core_unprepare(core->parent); in clk_core_unprepare()
953 clk_pm_runtime_put(core); in clk_core_unprepare()
956 static void clk_core_unprepare_lock(struct clk_core *core) in clk_core_unprepare_lock() argument
959 clk_core_unprepare(core); in clk_core_unprepare_lock()
979 clk_core_unprepare_lock(clk->core); in clk_unprepare()
983 static int clk_core_prepare(struct clk_core *core) in clk_core_prepare() argument
989 if (!core) in clk_core_prepare()
992 if (core->prepare_count == 0) { in clk_core_prepare()
993 ret = clk_pm_runtime_get(core); in clk_core_prepare()
997 ret = clk_core_prepare(core->parent); in clk_core_prepare()
1001 trace_clk_prepare(core); in clk_core_prepare()
1003 if (core->ops->prepare) in clk_core_prepare()
1004 ret = core->ops->prepare(core->hw); in clk_core_prepare()
1006 trace_clk_prepare_complete(core); in clk_core_prepare()
1012 core->prepare_count++; in clk_core_prepare()
1021 if (core->flags & CLK_SET_RATE_GATE) in clk_core_prepare()
1022 clk_core_rate_protect(core); in clk_core_prepare()
1026 clk_core_unprepare(core->parent); in clk_core_prepare()
1028 clk_pm_runtime_put(core); in clk_core_prepare()
1032 static int clk_core_prepare_lock(struct clk_core *core) in clk_core_prepare_lock() argument
1037 ret = clk_core_prepare(core); in clk_core_prepare_lock()
1060 return clk_core_prepare_lock(clk->core); in clk_prepare()
1064 static void clk_core_disable(struct clk_core *core) in clk_core_disable() argument
1068 if (!core) in clk_core_disable()
1071 if (WARN(core->enable_count == 0, "%s already disabled\n", core->name)) in clk_core_disable()
1074 if (WARN(core->enable_count == 1 && core->flags & CLK_IS_CRITICAL, in clk_core_disable()
1075 "Disabling critical %s\n", core->name)) in clk_core_disable()
1078 if (--core->enable_count > 0) in clk_core_disable()
1081 trace_clk_disable_rcuidle(core); in clk_core_disable()
1083 if (core->ops->disable) in clk_core_disable()
1084 core->ops->disable(core->hw); in clk_core_disable()
1086 trace_clk_disable_complete_rcuidle(core); in clk_core_disable()
1088 clk_core_disable(core->parent); in clk_core_disable()
1091 static void clk_core_disable_lock(struct clk_core *core) in clk_core_disable_lock() argument
1096 clk_core_disable(core); in clk_core_disable_lock()
1117 clk_core_disable_lock(clk->core); in clk_disable()
1121 static int clk_core_enable(struct clk_core *core) in clk_core_enable() argument
1127 if (!core) in clk_core_enable()
1130 if (WARN(core->prepare_count == 0, in clk_core_enable()
1131 "Enabling unprepared %s\n", core->name)) in clk_core_enable()
1134 if (core->enable_count == 0) { in clk_core_enable()
1135 ret = clk_core_enable(core->parent); in clk_core_enable()
1140 trace_clk_enable_rcuidle(core); in clk_core_enable()
1142 if (core->ops->enable) in clk_core_enable()
1143 ret = core->ops->enable(core->hw); in clk_core_enable()
1145 trace_clk_enable_complete_rcuidle(core); in clk_core_enable()
1148 clk_core_disable(core->parent); in clk_core_enable()
1153 core->enable_count++; in clk_core_enable()
1157 static int clk_core_enable_lock(struct clk_core *core) in clk_core_enable_lock() argument
1163 ret = clk_core_enable(core); in clk_core_enable_lock()
1181 struct clk_core *core = hw->core; in clk_gate_restore_context() local
1183 if (core->enable_count) in clk_gate_restore_context()
1184 core->ops->enable(hw); in clk_gate_restore_context()
1186 core->ops->disable(hw); in clk_gate_restore_context()
1190 static int clk_core_save_context(struct clk_core *core) in clk_core_save_context() argument
1195 hlist_for_each_entry(child, &core->children, child_node) { in clk_core_save_context()
1201 if (core->ops && core->ops->save_context) in clk_core_save_context()
1202 ret = core->ops->save_context(core->hw); in clk_core_save_context()
1207 static void clk_core_restore_context(struct clk_core *core) in clk_core_restore_context() argument
1211 if (core->ops && core->ops->restore_context) in clk_core_restore_context()
1212 core->ops->restore_context(core->hw); in clk_core_restore_context()
1214 hlist_for_each_entry(child, &core->children, child_node) in clk_core_restore_context()
1254 struct clk_core *core; in clk_restore_context() local
1256 hlist_for_each_entry(core, &clk_root_list, child_node) in clk_restore_context()
1257 clk_core_restore_context(core); in clk_restore_context()
1259 hlist_for_each_entry(core, &clk_orphan_list, child_node) in clk_restore_context()
1260 clk_core_restore_context(core); in clk_restore_context()
1282 return clk_core_enable_lock(clk->core); in clk_enable()
1286 static int clk_core_prepare_enable(struct clk_core *core) in clk_core_prepare_enable() argument
1290 ret = clk_core_prepare_lock(core); in clk_core_prepare_enable()
1294 ret = clk_core_enable_lock(core); in clk_core_prepare_enable()
1296 clk_core_unprepare_lock(core); in clk_core_prepare_enable()
1301 static void clk_core_disable_unprepare(struct clk_core *core) in clk_core_disable_unprepare() argument
1303 clk_core_disable_lock(core); in clk_core_disable_unprepare()
1304 clk_core_unprepare_lock(core); in clk_core_disable_unprepare()
1307 static void __init clk_unprepare_unused_subtree(struct clk_core *core) in clk_unprepare_unused_subtree() argument
1313 hlist_for_each_entry(child, &core->children, child_node) in clk_unprepare_unused_subtree()
1316 if (core->prepare_count) in clk_unprepare_unused_subtree()
1319 if (core->flags & CLK_IGNORE_UNUSED) in clk_unprepare_unused_subtree()
1322 if (clk_core_is_prepared(core)) { in clk_unprepare_unused_subtree()
1323 trace_clk_unprepare(core); in clk_unprepare_unused_subtree()
1324 if (core->ops->unprepare_unused) in clk_unprepare_unused_subtree()
1325 core->ops->unprepare_unused(core->hw); in clk_unprepare_unused_subtree()
1326 else if (core->ops->unprepare) in clk_unprepare_unused_subtree()
1327 core->ops->unprepare(core->hw); in clk_unprepare_unused_subtree()
1328 trace_clk_unprepare_complete(core); in clk_unprepare_unused_subtree()
1332 static void __init clk_disable_unused_subtree(struct clk_core *core) in clk_disable_unused_subtree() argument
1339 hlist_for_each_entry(child, &core->children, child_node) in clk_disable_unused_subtree()
1342 if (core->flags & CLK_OPS_PARENT_ENABLE) in clk_disable_unused_subtree()
1343 clk_core_prepare_enable(core->parent); in clk_disable_unused_subtree()
1347 if (core->enable_count) in clk_disable_unused_subtree()
1350 if (core->flags & CLK_IGNORE_UNUSED) in clk_disable_unused_subtree()
1358 if (clk_core_is_enabled(core)) { in clk_disable_unused_subtree()
1359 trace_clk_disable(core); in clk_disable_unused_subtree()
1360 if (core->ops->disable_unused) in clk_disable_unused_subtree()
1361 core->ops->disable_unused(core->hw); in clk_disable_unused_subtree()
1362 else if (core->ops->disable) in clk_disable_unused_subtree()
1363 core->ops->disable(core->hw); in clk_disable_unused_subtree()
1364 trace_clk_disable_complete(core); in clk_disable_unused_subtree()
1369 if (core->flags & CLK_OPS_PARENT_ENABLE) in clk_disable_unused_subtree()
1370 clk_core_disable_unprepare(core->parent); in clk_disable_unused_subtree()
1383 struct clk_core *core; in clk_disable_unused() local
1402 hlist_for_each_entry(core, &clk_root_list, child_node) in clk_disable_unused()
1403 clk_disable_unused_subtree(core); in clk_disable_unused()
1405 hlist_for_each_entry(core, &clk_orphan_list, child_node) in clk_disable_unused()
1406 clk_disable_unused_subtree(core); in clk_disable_unused()
1408 hlist_for_each_entry(core, &clk_root_list, child_node) in clk_disable_unused()
1409 clk_unprepare_unused_subtree(core); in clk_disable_unused()
1411 hlist_for_each_entry(core, &clk_orphan_list, child_node) in clk_disable_unused()
1412 clk_unprepare_unused_subtree(core); in clk_disable_unused()
1422 static int clk_core_determine_round_nolock(struct clk_core *core, in clk_core_determine_round_nolock() argument
1429 if (!core) in clk_core_determine_round_nolock()
1433 * At this point, core protection will be disabled if in clk_core_determine_round_nolock()
1438 if (clk_core_rate_is_protected(core)) { in clk_core_determine_round_nolock()
1439 req->rate = core->rate; in clk_core_determine_round_nolock()
1440 } else if (core->ops->determine_rate) { in clk_core_determine_round_nolock()
1441 return core->ops->determine_rate(core->hw, req); in clk_core_determine_round_nolock()
1442 } else if (core->ops->round_rate) { in clk_core_determine_round_nolock()
1443 rate = core->ops->round_rate(core->hw, req->rate, in clk_core_determine_round_nolock()
1456 static void clk_core_init_rate_req(struct clk_core * const core, in clk_core_init_rate_req() argument
1461 if (WARN_ON(!core || !req)) in clk_core_init_rate_req()
1464 parent = core->parent; in clk_core_init_rate_req()
1474 static bool clk_core_can_round(struct clk_core * const core) in clk_core_can_round() argument
1476 return core->ops->determine_rate || core->ops->round_rate; in clk_core_can_round()
1479 static int clk_core_round_rate_nolock(struct clk_core *core, in clk_core_round_rate_nolock() argument
1484 if (!core) { in clk_core_round_rate_nolock()
1489 clk_core_init_rate_req(core, req); in clk_core_round_rate_nolock()
1491 if (clk_core_can_round(core)) in clk_core_round_rate_nolock()
1492 return clk_core_determine_round_nolock(core, req); in clk_core_round_rate_nolock()
1493 else if (core->flags & CLK_SET_RATE_PARENT) in clk_core_round_rate_nolock()
1494 return clk_core_round_rate_nolock(core->parent, req); in clk_core_round_rate_nolock()
1496 req->rate = core->rate; in clk_core_round_rate_nolock()
1514 return clk_core_round_rate_nolock(hw->core, req); in __clk_determine_rate()
1538 clk_core_get_boundaries(hw->core, &req.min_rate, &req.max_rate); in clk_hw_round_rate()
1541 ret = clk_core_round_rate_nolock(hw->core, &req); in clk_hw_round_rate()
1569 clk_core_rate_unprotect(clk->core); in clk_round_rate()
1571 clk_core_get_boundaries(clk->core, &req.min_rate, &req.max_rate); in clk_round_rate()
1574 ret = clk_core_round_rate_nolock(clk->core, &req); in clk_round_rate()
1577 clk_core_rate_protect(clk->core); in clk_round_rate()
1590 * @core: clk that is changing rate
1602 static int __clk_notify(struct clk_core *core, unsigned long msg, in __clk_notify() argument
1613 if (cn->clk->core == core) { in __clk_notify()
1627 * @core: first clk in the subtree
1634 static void __clk_recalc_accuracies(struct clk_core *core) in __clk_recalc_accuracies() argument
1641 if (core->parent) in __clk_recalc_accuracies()
1642 parent_accuracy = core->parent->accuracy; in __clk_recalc_accuracies()
1644 if (core->ops->recalc_accuracy) in __clk_recalc_accuracies()
1645 core->accuracy = core->ops->recalc_accuracy(core->hw, in __clk_recalc_accuracies()
1648 core->accuracy = parent_accuracy; in __clk_recalc_accuracies()
1650 hlist_for_each_entry(child, &core->children, child_node) in __clk_recalc_accuracies()
1654 static long clk_core_get_accuracy_recalc(struct clk_core *core) in clk_core_get_accuracy_recalc() argument
1656 if (core && (core->flags & CLK_GET_ACCURACY_NOCACHE)) in clk_core_get_accuracy_recalc()
1657 __clk_recalc_accuracies(core); in clk_core_get_accuracy_recalc()
1659 return clk_core_get_accuracy_no_lock(core); in clk_core_get_accuracy_recalc()
1679 accuracy = clk_core_get_accuracy_recalc(clk->core); in clk_get_accuracy()
1686 static unsigned long clk_recalc(struct clk_core *core, in clk_recalc() argument
1691 if (core->ops->recalc_rate && !clk_pm_runtime_get(core)) { in clk_recalc()
1692 rate = core->ops->recalc_rate(core->hw, parent_rate); in clk_recalc()
1693 clk_pm_runtime_put(core); in clk_recalc()
1700 * @core: first clk in the subtree
1710 static void __clk_recalc_rates(struct clk_core *core, unsigned long msg) in __clk_recalc_rates() argument
1718 old_rate = core->rate; in __clk_recalc_rates()
1720 if (core->parent) in __clk_recalc_rates()
1721 parent_rate = core->parent->rate; in __clk_recalc_rates()
1723 core->rate = clk_recalc(core, parent_rate); in __clk_recalc_rates()
1729 if (core->notifier_count && msg) in __clk_recalc_rates()
1730 __clk_notify(core, msg, old_rate, core->rate); in __clk_recalc_rates()
1732 hlist_for_each_entry(child, &core->children, child_node) in __clk_recalc_rates()
1736 static unsigned long clk_core_get_rate_recalc(struct clk_core *core) in clk_core_get_rate_recalc() argument
1738 if (core && (core->flags & CLK_GET_RATE_NOCACHE)) in clk_core_get_rate_recalc()
1739 __clk_recalc_rates(core, 0); in clk_core_get_rate_recalc()
1741 return clk_core_get_rate_nolock(core); in clk_core_get_rate_recalc()
1760 rate = clk_core_get_rate_recalc(clk->core); in clk_get_rate()
1767 static int clk_fetch_parent_index(struct clk_core *core, in clk_fetch_parent_index() argument
1775 for (i = 0; i < core->num_parents; i++) { in clk_fetch_parent_index()
1777 if (core->parents[i].core == parent) in clk_fetch_parent_index()
1781 if (core->parents[i].core) in clk_fetch_parent_index()
1784 /* Maybe core hasn't been cached but the hw is all we know? */ in clk_fetch_parent_index()
1785 if (core->parents[i].hw) { in clk_fetch_parent_index()
1786 if (core->parents[i].hw == parent->hw) in clk_fetch_parent_index()
1794 if (parent == clk_core_get(core, i)) in clk_fetch_parent_index()
1798 if (core->parents[i].name && in clk_fetch_parent_index()
1799 !strcmp(parent->name, core->parents[i].name)) in clk_fetch_parent_index()
1803 if (i == core->num_parents) in clk_fetch_parent_index()
1806 core->parents[i].core = parent; in clk_fetch_parent_index()
1824 return clk_fetch_parent_index(hw->core, parent->core); in clk_hw_get_parent_index()
1829 * Update the orphan status of @core and all its children.
1831 static void clk_core_update_orphan_status(struct clk_core *core, bool is_orphan) in clk_core_update_orphan_status() argument
1835 core->orphan = is_orphan; in clk_core_update_orphan_status()
1837 hlist_for_each_entry(child, &core->children, child_node) in clk_core_update_orphan_status()
1841 static void clk_reparent(struct clk_core *core, struct clk_core *new_parent) in clk_reparent() argument
1843 bool was_orphan = core->orphan; in clk_reparent()
1845 hlist_del(&core->child_node); in clk_reparent()
1851 if (new_parent->new_child == core) in clk_reparent()
1854 hlist_add_head(&core->child_node, &new_parent->children); in clk_reparent()
1857 clk_core_update_orphan_status(core, becomes_orphan); in clk_reparent()
1859 hlist_add_head(&core->child_node, &clk_orphan_list); in clk_reparent()
1861 clk_core_update_orphan_status(core, true); in clk_reparent()
1864 core->parent = new_parent; in clk_reparent()
1867 static struct clk_core *__clk_set_parent_before(struct clk_core *core, in __clk_set_parent_before() argument
1871 struct clk_core *old_parent = core->parent; in __clk_set_parent_before()
1894 if (core->flags & CLK_OPS_PARENT_ENABLE) { in __clk_set_parent_before()
1900 if (core->prepare_count) { in __clk_set_parent_before()
1902 clk_core_enable_lock(core); in __clk_set_parent_before()
1907 clk_reparent(core, parent); in __clk_set_parent_before()
1913 static void __clk_set_parent_after(struct clk_core *core, in __clk_set_parent_after() argument
1921 if (core->prepare_count) { in __clk_set_parent_after()
1922 clk_core_disable_lock(core); in __clk_set_parent_after()
1927 if (core->flags & CLK_OPS_PARENT_ENABLE) { in __clk_set_parent_after()
1933 static int __clk_set_parent(struct clk_core *core, struct clk_core *parent, in __clk_set_parent() argument
1940 old_parent = __clk_set_parent_before(core, parent); in __clk_set_parent()
1942 trace_clk_set_parent(core, parent); in __clk_set_parent()
1945 if (parent && core->ops->set_parent) in __clk_set_parent()
1946 ret = core->ops->set_parent(core->hw, p_index); in __clk_set_parent()
1948 trace_clk_set_parent_complete(core, parent); in __clk_set_parent()
1952 clk_reparent(core, old_parent); in __clk_set_parent()
1954 __clk_set_parent_after(core, old_parent, parent); in __clk_set_parent()
1959 __clk_set_parent_after(core, parent, old_parent); in __clk_set_parent()
1966 * @core: first clk in the subtree
1978 static int __clk_speculate_rates(struct clk_core *core, in __clk_speculate_rates() argument
1987 new_rate = clk_recalc(core, parent_rate); in __clk_speculate_rates()
1990 if (core->notifier_count) in __clk_speculate_rates()
1991 ret = __clk_notify(core, PRE_RATE_CHANGE, core->rate, new_rate); in __clk_speculate_rates()
1995 __func__, core->name, ret); in __clk_speculate_rates()
1999 hlist_for_each_entry(child, &core->children, child_node) { in __clk_speculate_rates()
2009 static void clk_calc_subtree(struct clk_core *core, unsigned long new_rate, in clk_calc_subtree() argument
2014 core->new_rate = new_rate; in clk_calc_subtree()
2015 core->new_parent = new_parent; in clk_calc_subtree()
2016 core->new_parent_index = p_index; in clk_calc_subtree()
2018 core->new_child = NULL; in clk_calc_subtree()
2019 if (new_parent && new_parent != core->parent) in clk_calc_subtree()
2020 new_parent->new_child = core; in clk_calc_subtree()
2022 hlist_for_each_entry(child, &core->children, child_node) { in clk_calc_subtree()
2032 static struct clk_core *clk_calc_new_rates(struct clk_core *core, in clk_calc_new_rates() argument
2035 struct clk_core *top = core; in clk_calc_new_rates()
2045 if (IS_ERR_OR_NULL(core)) in clk_calc_new_rates()
2049 parent = old_parent = core->parent; in clk_calc_new_rates()
2053 clk_core_get_boundaries(core, &min_rate, &max_rate); in clk_calc_new_rates()
2056 if (clk_core_can_round(core)) { in clk_calc_new_rates()
2063 clk_core_init_rate_req(core, &req); in clk_calc_new_rates()
2065 ret = clk_core_determine_round_nolock(core, &req); in clk_calc_new_rates()
2071 parent = req.best_parent_hw ? req.best_parent_hw->core : NULL; in clk_calc_new_rates()
2075 } else if (!parent || !(core->flags & CLK_SET_RATE_PARENT)) { in clk_calc_new_rates()
2077 core->new_rate = core->rate; in clk_calc_new_rates()
2088 (core->flags & CLK_SET_PARENT_GATE) && core->prepare_count) { in clk_calc_new_rates()
2090 __func__, core->name); in clk_calc_new_rates()
2095 if (parent && core->num_parents > 1) { in clk_calc_new_rates()
2096 p_index = clk_fetch_parent_index(core, parent); in clk_calc_new_rates()
2099 __func__, parent->name, core->name); in clk_calc_new_rates()
2104 if ((core->flags & CLK_SET_RATE_PARENT) && parent && in clk_calc_new_rates()
2109 clk_calc_subtree(core, new_rate, parent, p_index); in clk_calc_new_rates()
2119 static struct clk_core *clk_propagate_rate_change(struct clk_core *core, in clk_propagate_rate_change() argument
2125 if (core->rate == core->new_rate) in clk_propagate_rate_change()
2128 if (core->notifier_count) { in clk_propagate_rate_change()
2129 ret = __clk_notify(core, event, core->rate, core->new_rate); in clk_propagate_rate_change()
2131 fail_clk = core; in clk_propagate_rate_change()
2134 hlist_for_each_entry(child, &core->children, child_node) { in clk_propagate_rate_change()
2136 if (child->new_parent && child->new_parent != core) in clk_propagate_rate_change()
2143 /* handle the new child who might not be in core->children yet */ in clk_propagate_rate_change()
2144 if (core->new_child) { in clk_propagate_rate_change()
2145 tmp_clk = clk_propagate_rate_change(core->new_child, event); in clk_propagate_rate_change()
2157 static void clk_change_rate(struct clk_core *core) in clk_change_rate() argument
2167 old_rate = core->rate; in clk_change_rate()
2169 if (core->new_parent) { in clk_change_rate()
2170 parent = core->new_parent; in clk_change_rate()
2171 best_parent_rate = core->new_parent->rate; in clk_change_rate()
2172 } else if (core->parent) { in clk_change_rate()
2173 parent = core->parent; in clk_change_rate()
2174 best_parent_rate = core->parent->rate; in clk_change_rate()
2177 if (clk_pm_runtime_get(core)) in clk_change_rate()
2180 if (core->flags & CLK_SET_RATE_UNGATE) { in clk_change_rate()
2183 clk_core_prepare(core); in clk_change_rate()
2185 clk_core_enable(core); in clk_change_rate()
2189 if (core->new_parent && core->new_parent != core->parent) { in clk_change_rate()
2190 old_parent = __clk_set_parent_before(core, core->new_parent); in clk_change_rate()
2191 trace_clk_set_parent(core, core->new_parent); in clk_change_rate()
2193 if (core->ops->set_rate_and_parent) { in clk_change_rate()
2195 core->ops->set_rate_and_parent(core->hw, core->new_rate, in clk_change_rate()
2197 core->new_parent_index); in clk_change_rate()
2198 } else if (core->ops->set_parent) { in clk_change_rate()
2199 core->ops->set_parent(core->hw, core->new_parent_index); in clk_change_rate()
2202 trace_clk_set_parent_complete(core, core->new_parent); in clk_change_rate()
2203 __clk_set_parent_after(core, core->new_parent, old_parent); in clk_change_rate()
2206 if (core->flags & CLK_OPS_PARENT_ENABLE) in clk_change_rate()
2209 trace_clk_set_rate(core, core->new_rate); in clk_change_rate()
2211 if (!skip_set_rate && core->ops->set_rate) in clk_change_rate()
2212 core->ops->set_rate(core->hw, core->new_rate, best_parent_rate); in clk_change_rate()
2214 trace_clk_set_rate_complete(core, core->new_rate); in clk_change_rate()
2216 core->rate = clk_recalc(core, best_parent_rate); in clk_change_rate()
2218 if (core->flags & CLK_SET_RATE_UNGATE) { in clk_change_rate()
2222 clk_core_disable(core); in clk_change_rate()
2224 clk_core_unprepare(core); in clk_change_rate()
2227 if (core->flags & CLK_OPS_PARENT_ENABLE) in clk_change_rate()
2230 if (core->notifier_count && old_rate != core->rate) in clk_change_rate()
2231 __clk_notify(core, POST_RATE_CHANGE, old_rate, core->rate); in clk_change_rate()
2233 if (core->flags & CLK_RECALC_NEW_RATES) in clk_change_rate()
2234 (void)clk_calc_new_rates(core, core->new_rate); in clk_change_rate()
2240 hlist_for_each_entry_safe(child, tmp, &core->children, child_node) { in clk_change_rate()
2242 if (child->new_parent && child->new_parent != core) in clk_change_rate()
2247 /* handle the new child who might not be in core->children yet */ in clk_change_rate()
2248 if (core->new_child) in clk_change_rate()
2249 clk_change_rate(core->new_child); in clk_change_rate()
2251 clk_pm_runtime_put(core); in clk_change_rate()
2254 static unsigned long clk_core_req_round_rate_nolock(struct clk_core *core, in clk_core_req_round_rate_nolock() argument
2262 if (!core) in clk_core_req_round_rate_nolock()
2266 cnt = clk_core_rate_nuke_protect(core); in clk_core_req_round_rate_nolock()
2270 clk_core_get_boundaries(core, &req.min_rate, &req.max_rate); in clk_core_req_round_rate_nolock()
2273 ret = clk_core_round_rate_nolock(core, &req); in clk_core_req_round_rate_nolock()
2276 clk_core_rate_restore_protect(core, cnt); in clk_core_req_round_rate_nolock()
2281 static int clk_core_set_rate_nolock(struct clk_core *core, in clk_core_set_rate_nolock() argument
2288 if (!core) in clk_core_set_rate_nolock()
2291 rate = clk_core_req_round_rate_nolock(core, req_rate); in clk_core_set_rate_nolock()
2294 if (rate == clk_core_get_rate_nolock(core)) in clk_core_set_rate_nolock()
2298 if (clk_core_rate_is_protected(core)) in clk_core_set_rate_nolock()
2302 top = clk_calc_new_rates(core, req_rate); in clk_core_set_rate_nolock()
2306 ret = clk_pm_runtime_get(core); in clk_core_set_rate_nolock()
2323 core->req_rate = req_rate; in clk_core_set_rate_nolock()
2325 clk_pm_runtime_put(core); in clk_core_set_rate_nolock()
2362 clk_core_rate_unprotect(clk->core); in clk_set_rate()
2364 ret = clk_core_set_rate_nolock(clk->core, rate); in clk_set_rate()
2367 clk_core_rate_protect(clk->core); in clk_set_rate()
2410 ret = clk_core_set_rate_nolock(clk->core, rate); in clk_set_rate_exclusive()
2412 clk_core_rate_protect(clk->core); in clk_set_rate_exclusive()
2440 __func__, clk->core->name, clk->dev_id, clk->con_id, in clk_set_rate_range()
2448 clk_core_rate_unprotect(clk->core); in clk_set_rate_range()
2456 if (!clk_core_check_boundaries(clk->core, min, max)) { in clk_set_rate_range()
2461 rate = clk_core_get_rate_nolock(clk->core); in clk_set_rate_range()
2481 ret = clk_core_set_rate_nolock(clk->core, rate); in clk_set_rate_range()
2491 clk_core_rate_protect(clk->core); in clk_set_rate_range()
2546 parent = !clk->core->parent ? NULL : clk->core->parent->hw->clk; in clk_get_parent()
2553 static struct clk_core *__clk_init_parent(struct clk_core *core) in __clk_init_parent() argument
2557 if (core->num_parents > 1 && core->ops->get_parent) in __clk_init_parent()
2558 index = core->ops->get_parent(core->hw); in __clk_init_parent()
2560 return clk_core_get_parent_by_index(core, index); in __clk_init_parent()
2563 static void clk_core_reparent(struct clk_core *core, in clk_core_reparent() argument
2566 clk_reparent(core, new_parent); in clk_core_reparent()
2567 __clk_recalc_accuracies(core); in clk_core_reparent()
2568 __clk_recalc_rates(core, POST_RATE_CHANGE); in clk_core_reparent()
2576 clk_core_reparent(hw->core, !new_parent ? NULL : new_parent->core); in clk_hw_reparent()
2591 struct clk_core *core, *parent_core; in clk_has_parent() local
2598 core = clk->core; in clk_has_parent()
2599 parent_core = parent->core; in clk_has_parent()
2602 if (core->parent == parent_core) in clk_has_parent()
2605 for (i = 0; i < core->num_parents; i++) in clk_has_parent()
2606 if (!strcmp(core->parents[i].name, parent_core->name)) in clk_has_parent()
2613 static int clk_core_set_parent_nolock(struct clk_core *core, in clk_core_set_parent_nolock() argument
2622 if (!core) in clk_core_set_parent_nolock()
2625 if (core->parent == parent) in clk_core_set_parent_nolock()
2629 if (core->num_parents > 1 && !core->ops->set_parent) in clk_core_set_parent_nolock()
2633 if ((core->flags & CLK_SET_PARENT_GATE) && core->prepare_count) in clk_core_set_parent_nolock()
2636 if (clk_core_rate_is_protected(core)) in clk_core_set_parent_nolock()
2641 p_index = clk_fetch_parent_index(core, parent); in clk_core_set_parent_nolock()
2644 __func__, parent->name, core->name); in clk_core_set_parent_nolock()
2650 ret = clk_pm_runtime_get(core); in clk_core_set_parent_nolock()
2655 ret = __clk_speculate_rates(core, p_rate); in clk_core_set_parent_nolock()
2662 ret = __clk_set_parent(core, parent, p_index); in clk_core_set_parent_nolock()
2666 __clk_recalc_rates(core, ABORT_RATE_CHANGE); in clk_core_set_parent_nolock()
2668 __clk_recalc_rates(core, POST_RATE_CHANGE); in clk_core_set_parent_nolock()
2669 __clk_recalc_accuracies(core); in clk_core_set_parent_nolock()
2673 clk_pm_runtime_put(core); in clk_core_set_parent_nolock()
2680 return clk_core_set_parent_nolock(hw->core, parent->core); in clk_hw_set_parent()
2711 clk_core_rate_unprotect(clk->core); in clk_set_parent()
2713 ret = clk_core_set_parent_nolock(clk->core, in clk_set_parent()
2714 parent ? parent->core : NULL); in clk_set_parent()
2717 clk_core_rate_protect(clk->core); in clk_set_parent()
2725 static int clk_core_set_phase_nolock(struct clk_core *core, int degrees) in clk_core_set_phase_nolock() argument
2731 if (!core) in clk_core_set_phase_nolock()
2734 if (clk_core_rate_is_protected(core)) in clk_core_set_phase_nolock()
2737 trace_clk_set_phase(core, degrees); in clk_core_set_phase_nolock()
2739 if (core->ops->set_phase) { in clk_core_set_phase_nolock()
2740 ret = core->ops->set_phase(core->hw, degrees); in clk_core_set_phase_nolock()
2742 core->phase = degrees; in clk_core_set_phase_nolock()
2745 trace_clk_set_phase_complete(core, degrees); in clk_core_set_phase_nolock()
2785 clk_core_rate_unprotect(clk->core); in clk_set_phase()
2787 ret = clk_core_set_phase_nolock(clk->core, degrees); in clk_set_phase()
2790 clk_core_rate_protect(clk->core); in clk_set_phase()
2798 static int clk_core_get_phase(struct clk_core *core) in clk_core_get_phase() argument
2803 if (!core->ops->get_phase) in clk_core_get_phase()
2807 ret = core->ops->get_phase(core->hw); in clk_core_get_phase()
2809 core->phase = ret; in clk_core_get_phase()
2829 ret = clk_core_get_phase(clk->core); in clk_get_phase()
2836 static void clk_core_reset_duty_cycle_nolock(struct clk_core *core) in clk_core_reset_duty_cycle_nolock() argument
2839 core->duty.num = 1; in clk_core_reset_duty_cycle_nolock()
2840 core->duty.den = 2; in clk_core_reset_duty_cycle_nolock()
2843 static int clk_core_update_duty_cycle_parent_nolock(struct clk_core *core);
2845 static int clk_core_update_duty_cycle_nolock(struct clk_core *core) in clk_core_update_duty_cycle_nolock() argument
2847 struct clk_duty *duty = &core->duty; in clk_core_update_duty_cycle_nolock()
2850 if (!core->ops->get_duty_cycle) in clk_core_update_duty_cycle_nolock()
2851 return clk_core_update_duty_cycle_parent_nolock(core); in clk_core_update_duty_cycle_nolock()
2853 ret = core->ops->get_duty_cycle(core->hw, duty); in clk_core_update_duty_cycle_nolock()
2866 clk_core_reset_duty_cycle_nolock(core); in clk_core_update_duty_cycle_nolock()
2870 static int clk_core_update_duty_cycle_parent_nolock(struct clk_core *core) in clk_core_update_duty_cycle_parent_nolock() argument
2874 if (core->parent && in clk_core_update_duty_cycle_parent_nolock()
2875 core->flags & CLK_DUTY_CYCLE_PARENT) { in clk_core_update_duty_cycle_parent_nolock()
2876 ret = clk_core_update_duty_cycle_nolock(core->parent); in clk_core_update_duty_cycle_parent_nolock()
2877 memcpy(&core->duty, &core->parent->duty, sizeof(core->duty)); in clk_core_update_duty_cycle_parent_nolock()
2879 clk_core_reset_duty_cycle_nolock(core); in clk_core_update_duty_cycle_parent_nolock()
2885 static int clk_core_set_duty_cycle_parent_nolock(struct clk_core *core,
2888 static int clk_core_set_duty_cycle_nolock(struct clk_core *core, in clk_core_set_duty_cycle_nolock() argument
2895 if (clk_core_rate_is_protected(core)) in clk_core_set_duty_cycle_nolock()
2898 trace_clk_set_duty_cycle(core, duty); in clk_core_set_duty_cycle_nolock()
2900 if (!core->ops->set_duty_cycle) in clk_core_set_duty_cycle_nolock()
2901 return clk_core_set_duty_cycle_parent_nolock(core, duty); in clk_core_set_duty_cycle_nolock()
2903 ret = core->ops->set_duty_cycle(core->hw, duty); in clk_core_set_duty_cycle_nolock()
2905 memcpy(&core->duty, duty, sizeof(*duty)); in clk_core_set_duty_cycle_nolock()
2907 trace_clk_set_duty_cycle_complete(core, duty); in clk_core_set_duty_cycle_nolock()
2912 static int clk_core_set_duty_cycle_parent_nolock(struct clk_core *core, in clk_core_set_duty_cycle_parent_nolock() argument
2917 if (core->parent && in clk_core_set_duty_cycle_parent_nolock()
2918 core->flags & (CLK_DUTY_CYCLE_PARENT | CLK_SET_RATE_PARENT)) { in clk_core_set_duty_cycle_parent_nolock()
2919 ret = clk_core_set_duty_cycle_nolock(core->parent, duty); in clk_core_set_duty_cycle_parent_nolock()
2920 memcpy(&core->duty, &core->parent->duty, sizeof(core->duty)); in clk_core_set_duty_cycle_parent_nolock()
2955 clk_core_rate_unprotect(clk->core); in clk_set_duty_cycle()
2957 ret = clk_core_set_duty_cycle_nolock(clk->core, &duty); in clk_set_duty_cycle()
2960 clk_core_rate_protect(clk->core); in clk_set_duty_cycle()
2968 static int clk_core_get_scaled_duty_cycle(struct clk_core *core, in clk_core_get_scaled_duty_cycle() argument
2971 struct clk_duty *duty = &core->duty; in clk_core_get_scaled_duty_cycle()
2976 ret = clk_core_update_duty_cycle_nolock(core); in clk_core_get_scaled_duty_cycle()
2998 return clk_core_get_scaled_duty_cycle(clk->core, scale); in clk_get_scaled_duty_cycle()
3019 /* true if clk->core pointers match. Avoid dereferencing garbage */ in clk_is_match()
3021 if (p->core == q->core) in clk_is_match()
3167 struct clk_core *core = data; in clk_rate_set() local
3171 ret = clk_core_set_rate_nolock(core, val); in clk_rate_set()
3181 struct clk_core *core = data; in clk_prepare_enable_set() local
3185 ret = clk_prepare_enable(core->hw->clk); in clk_prepare_enable_set()
3187 clk_disable_unprepare(core->hw->clk); in clk_prepare_enable_set()
3194 struct clk_core *core = data; in clk_prepare_enable_get() local
3196 *val = core->enable_count && core->prepare_count; in clk_prepare_enable_get()
3210 struct clk_core *core = data; in clk_rate_get() local
3212 *val = core->rate; in clk_rate_get()
3240 struct clk_core *core = s->private; in clk_flags_show() local
3241 unsigned long flags = core->flags; in clk_flags_show()
3259 static void possible_parent_show(struct seq_file *s, struct clk_core *core, in possible_parent_show() argument
3277 parent = clk_core_get_parent_by_index(core, i); in possible_parent_show()
3280 } else if (core->parents[i].name) { in possible_parent_show()
3281 seq_puts(s, core->parents[i].name); in possible_parent_show()
3282 } else if (core->parents[i].fw_name) { in possible_parent_show()
3283 seq_printf(s, "<%s>(fw)", core->parents[i].fw_name); in possible_parent_show()
3285 if (core->parents[i].index >= 0) in possible_parent_show()
3286 name = of_clk_get_parent_name(core->of_node, core->parents[i].index); in possible_parent_show()
3298 struct clk_core *core = s->private; in possible_parents_show() local
3301 for (i = 0; i < core->num_parents - 1; i++) in possible_parents_show()
3302 possible_parent_show(s, core, i, ' '); in possible_parents_show()
3304 possible_parent_show(s, core, i, '\n'); in possible_parents_show()
3312 struct clk_core *core = s->private; in current_parent_show() local
3314 if (core->parent) in current_parent_show()
3315 seq_printf(s, "%s\n", core->parent->name); in current_parent_show()
3323 struct clk_core *core = s->private; in clk_duty_cycle_show() local
3324 struct clk_duty *duty = &core->duty; in clk_duty_cycle_show()
3334 struct clk_core *core = s->private; in clk_min_rate_show() local
3338 clk_core_get_boundaries(core, &min_rate, &max_rate); in clk_min_rate_show()
3348 struct clk_core *core = s->private; in clk_max_rate_show() local
3352 clk_core_get_boundaries(core, &min_rate, &max_rate); in clk_max_rate_show()
3360 static void clk_debug_create_one(struct clk_core *core, struct dentry *pdentry) in clk_debug_create_one() argument
3364 if (!core || !pdentry) in clk_debug_create_one()
3367 root = debugfs_create_dir(core->name, pdentry); in clk_debug_create_one()
3368 core->dentry = root; in clk_debug_create_one()
3370 debugfs_create_file("clk_rate", clk_rate_mode, root, core, in clk_debug_create_one()
3372 debugfs_create_file("clk_min_rate", 0444, root, core, &clk_min_rate_fops); in clk_debug_create_one()
3373 debugfs_create_file("clk_max_rate", 0444, root, core, &clk_max_rate_fops); in clk_debug_create_one()
3374 debugfs_create_ulong("clk_accuracy", 0444, root, &core->accuracy); in clk_debug_create_one()
3375 debugfs_create_u32("clk_phase", 0444, root, &core->phase); in clk_debug_create_one()
3376 debugfs_create_file("clk_flags", 0444, root, core, &clk_flags_fops); in clk_debug_create_one()
3377 debugfs_create_u32("clk_prepare_count", 0444, root, &core->prepare_count); in clk_debug_create_one()
3378 debugfs_create_u32("clk_enable_count", 0444, root, &core->enable_count); in clk_debug_create_one()
3379 debugfs_create_u32("clk_protect_count", 0444, root, &core->protect_count); in clk_debug_create_one()
3380 debugfs_create_u32("clk_notifier_count", 0444, root, &core->notifier_count); in clk_debug_create_one()
3381 debugfs_create_file("clk_duty_cycle", 0444, root, core, in clk_debug_create_one()
3384 debugfs_create_file("clk_prepare_enable", 0644, root, core, in clk_debug_create_one()
3388 if (core->num_parents > 0) in clk_debug_create_one()
3389 debugfs_create_file("clk_parent", 0444, root, core, in clk_debug_create_one()
3392 if (core->num_parents > 1) in clk_debug_create_one()
3393 debugfs_create_file("clk_possible_parents", 0444, root, core, in clk_debug_create_one()
3396 if (core->ops->debug_init) in clk_debug_create_one()
3397 core->ops->debug_init(core->hw, core->dentry); in clk_debug_create_one()
3402 * @core: the clk being added to the debugfs clk directory
3408 static void clk_debug_register(struct clk_core *core) in clk_debug_register() argument
3411 hlist_add_head(&core->debug_node, &clk_debug_list); in clk_debug_register()
3413 clk_debug_create_one(core, rootdir); in clk_debug_register()
3419 * @core: the clk being removed from the debugfs clk directory
3425 static void clk_debug_unregister(struct clk_core *core) in clk_debug_unregister() argument
3428 hlist_del_init(&core->debug_node); in clk_debug_unregister()
3429 debugfs_remove_recursive(core->dentry); in clk_debug_unregister()
3430 core->dentry = NULL; in clk_debug_unregister()
3445 struct clk_core *core; in clk_debug_init() local
3477 hlist_for_each_entry(core, &clk_debug_list, debug_node) in clk_debug_init()
3478 clk_debug_create_one(core, rootdir); in clk_debug_init()
3487 static inline void clk_debug_register(struct clk_core *core) { } in clk_debug_register() argument
3488 static inline void clk_debug_unregister(struct clk_core *core) in clk_debug_unregister() argument
3536 * @core: clk_core being initialized
3541 static int __clk_core_init(struct clk_core *core) in __clk_core_init() argument
3548 if (!core) in __clk_core_init()
3554 * Set hw->core after grabbing the prepare_lock to synchronize with in __clk_core_init()
3555 * callers of clk_core_fill_parent_index() where we treat hw->core in __clk_core_init()
3559 core->hw->core = core; in __clk_core_init()
3561 ret = clk_pm_runtime_get(core); in __clk_core_init()
3566 if (clk_core_lookup(core->name)) { in __clk_core_init()
3568 __func__, core->name); in __clk_core_init()
3574 if (core->ops->set_rate && in __clk_core_init()
3575 !((core->ops->round_rate || core->ops->determine_rate) && in __clk_core_init()
3576 core->ops->recalc_rate)) { in __clk_core_init()
3578 __func__, core->name); in __clk_core_init()
3583 if (core->ops->set_parent && !core->ops->get_parent) { in __clk_core_init()
3585 __func__, core->name); in __clk_core_init()
3590 if (core->num_parents > 1 && !core->ops->get_parent) { in __clk_core_init()
3592 __func__, core->name); in __clk_core_init()
3597 if (core->ops->set_rate_and_parent && in __clk_core_init()
3598 !(core->ops->set_parent && core->ops->set_rate)) { in __clk_core_init()
3600 __func__, core->name); in __clk_core_init()
3619 if (core->ops->init) { in __clk_core_init()
3620 ret = core->ops->init(core->hw); in __clk_core_init()
3625 parent = core->parent = __clk_init_parent(core); in __clk_core_init()
3628 * Populate core->parent if parent has already been clk_core_init'd. If in __clk_core_init()
3638 hlist_add_head(&core->child_node, &parent->children); in __clk_core_init()
3639 core->orphan = parent->orphan; in __clk_core_init()
3640 } else if (!core->num_parents) { in __clk_core_init()
3641 hlist_add_head(&core->child_node, &clk_root_list); in __clk_core_init()
3642 core->orphan = false; in __clk_core_init()
3644 hlist_add_head(&core->child_node, &clk_orphan_list); in __clk_core_init()
3645 core->orphan = true; in __clk_core_init()
3655 if (core->ops->recalc_accuracy) in __clk_core_init()
3656 core->accuracy = core->ops->recalc_accuracy(core->hw, in __clk_core_init()
3659 core->accuracy = parent->accuracy; in __clk_core_init()
3661 core->accuracy = 0; in __clk_core_init()
3668 phase = clk_core_get_phase(core); in __clk_core_init()
3672 core->name); in __clk_core_init()
3679 clk_core_update_duty_cycle_nolock(core); in __clk_core_init()
3687 if (core->ops->recalc_rate) in __clk_core_init()
3688 rate = core->ops->recalc_rate(core->hw, in __clk_core_init()
3694 core->rate = core->req_rate = rate; in __clk_core_init()
3701 if (core->flags & CLK_IS_CRITICAL) { in __clk_core_init()
3704 ret = clk_core_prepare(core); in __clk_core_init()
3707 __func__, core->name); in __clk_core_init()
3712 ret = clk_core_enable(core); in __clk_core_init()
3716 __func__, core->name); in __clk_core_init()
3717 clk_core_unprepare(core); in __clk_core_init()
3724 clk_pm_runtime_put(core); in __clk_core_init()
3727 hlist_del_init(&core->child_node); in __clk_core_init()
3728 core->hw->core = NULL; in __clk_core_init()
3734 clk_debug_register(core); in __clk_core_init()
3741 * @core: clk to add consumer to
3744 static void clk_core_link_consumer(struct clk_core *core, struct clk *clk) in clk_core_link_consumer() argument
3747 hlist_add_head(&clk->clks_node, &core->clks); in clk_core_link_consumer()
3763 * @core: clk to allocate a consumer for
3769 static struct clk *alloc_clk(struct clk_core *core, const char *dev_id, in alloc_clk() argument
3778 clk->core = core; in alloc_clk()
3815 struct clk_core *core; in clk_hw_create_clk() local
3821 core = hw->core; in clk_hw_create_clk()
3822 clk = alloc_clk(core, dev_id, con_id); in clk_hw_create_clk()
3827 if (!try_module_get(core->owner)) { in clk_hw_create_clk()
3832 kref_get(&core->ref); in clk_hw_create_clk()
3833 clk_core_link_consumer(core, clk); in clk_hw_create_clk()
3855 static int clk_core_populate_parent_map(struct clk_core *core, in clk_core_populate_parent_map() argument
3873 core->parents = parents; in clk_core_populate_parent_map()
3884 __func__, core->name); in clk_core_populate_parent_map()
3917 static void clk_core_free_parent_map(struct clk_core *core) in clk_core_free_parent_map() argument
3919 int i = core->num_parents; in clk_core_free_parent_map()
3921 if (!core->num_parents) in clk_core_free_parent_map()
3925 kfree_const(core->parents[i].name); in clk_core_free_parent_map()
3926 kfree_const(core->parents[i].fw_name); in clk_core_free_parent_map()
3929 kfree(core->parents); in clk_core_free_parent_map()
3935 struct clk_core *core = container_of(ref, struct clk_core, ref); in __clk_release() local
3937 if (core->rpm_enabled) { in __clk_release()
3939 hlist_del(&core->rpm_node); in __clk_release()
3943 clk_core_free_parent_map(core); in __clk_release()
3944 kfree_const(core->name); in __clk_release()
3945 kfree(core); in __clk_release()
3952 struct clk_core *core; in __clk_register() local
3958 * we catch use of hw->init early on in the core. in __clk_register()
3962 core = kzalloc(sizeof(*core), GFP_KERNEL); in __clk_register()
3963 if (!core) { in __clk_register()
3968 kref_init(&core->ref); in __clk_register()
3970 core->name = kstrdup_const(init->name, GFP_KERNEL); in __clk_register()
3971 if (!core->name) { in __clk_register()
3980 core->ops = init->ops; in __clk_register()
3982 core->dev = dev; in __clk_register()
3983 clk_pm_runtime_init(core); in __clk_register()
3984 core->of_node = np; in __clk_register()
3986 core->owner = dev->driver->owner; in __clk_register()
3987 core->hw = hw; in __clk_register()
3988 core->flags = init->flags; in __clk_register()
3989 core->num_parents = init->num_parents; in __clk_register()
3990 core->min_rate = 0; in __clk_register()
3991 core->max_rate = ULONG_MAX; in __clk_register()
3993 ret = clk_core_populate_parent_map(core, init); in __clk_register()
3997 INIT_HLIST_HEAD(&core->clks); in __clk_register()
4003 hw->clk = alloc_clk(core, NULL, NULL); in __clk_register()
4009 clk_core_link_consumer(core, hw->clk); in __clk_register()
4011 ret = __clk_core_init(core); in __clk_register()
4026 kref_put(&core->ref, __clk_release); in __clk_register()
4148 if (root->parents[i].core == target) in clk_core_evict_parent_cache_subtree()
4149 root->parents[i].core = NULL; in clk_core_evict_parent_cache_subtree()
4156 static void clk_core_evict_parent_cache(struct clk_core *core) in clk_core_evict_parent_cache() argument
4165 clk_core_evict_parent_cache_subtree(root, core); in clk_core_evict_parent_cache()
4181 clk_debug_unregister(clk->core); in clk_unregister()
4185 ops = clk->core->ops; in clk_unregister()
4188 clk->core->name); in clk_unregister()
4196 clk->core->ops = &clk_nodrv_ops; in clk_unregister()
4200 ops->terminate(clk->core->hw); in clk_unregister()
4202 if (!hlist_empty(&clk->core->children)) { in clk_unregister()
4207 hlist_for_each_entry_safe(child, t, &clk->core->children, in clk_unregister()
4212 clk_core_evict_parent_cache(clk->core); in clk_unregister()
4214 hlist_del_init(&clk->core->child_node); in clk_unregister()
4216 if (clk->core->prepare_count) in clk_unregister()
4218 __func__, clk->core->name); in clk_unregister()
4220 if (clk->core->protect_count) in clk_unregister()
4222 __func__, clk->core->name); in clk_unregister()
4224 kref_put(&clk->core->ref, __clk_release); in clk_unregister()
4380 clk->core->protect_count -= (clk->exclusive_count - 1); in __clk_put()
4381 clk_core_rate_unprotect(clk->core); in __clk_put()
4386 if (clk->min_rate > clk->core->req_rate || in __clk_put()
4387 clk->max_rate < clk->core->req_rate) in __clk_put()
4388 clk_core_set_rate_nolock(clk->core, clk->core->req_rate); in __clk_put()
4390 owner = clk->core->owner; in __clk_put()
4391 kref_put(&clk->core->ref, __clk_release); in __clk_put()
4450 clk->core->notifier_count++; in clk_notifier_register()
4484 clk->core->notifier_count--; in clk_notifier_unregister()