Lines Matching refs:clk

40 static long clk_core_get_accuracy(struct clk_core *clk);
41 static unsigned long clk_core_get_rate(struct clk_core *clk);
42 static int clk_core_get_phase(struct clk_core *clk);
43 static bool clk_core_is_prepared(struct clk_core *clk);
44 static bool clk_core_is_enabled(struct clk_core *clk);
83 struct clk { struct
297 static int clk_debug_create_one(struct clk_core *clk, struct dentry *pdentry) in clk_debug_create_one() argument
302 if (!clk || !pdentry) { in clk_debug_create_one()
307 d = debugfs_create_dir(clk->name, pdentry); in clk_debug_create_one()
311 clk->dentry = d; in clk_debug_create_one()
313 d = debugfs_create_u32("clk_rate", S_IRUGO, clk->dentry, in clk_debug_create_one()
314 (u32 *)&clk->rate); in clk_debug_create_one()
318 d = debugfs_create_u32("clk_accuracy", S_IRUGO, clk->dentry, in clk_debug_create_one()
319 (u32 *)&clk->accuracy); in clk_debug_create_one()
323 d = debugfs_create_u32("clk_phase", S_IRUGO, clk->dentry, in clk_debug_create_one()
324 (u32 *)&clk->phase); in clk_debug_create_one()
328 d = debugfs_create_x32("clk_flags", S_IRUGO, clk->dentry, in clk_debug_create_one()
329 (u32 *)&clk->flags); in clk_debug_create_one()
333 d = debugfs_create_u32("clk_prepare_count", S_IRUGO, clk->dentry, in clk_debug_create_one()
334 (u32 *)&clk->prepare_count); in clk_debug_create_one()
338 d = debugfs_create_u32("clk_enable_count", S_IRUGO, clk->dentry, in clk_debug_create_one()
339 (u32 *)&clk->enable_count); in clk_debug_create_one()
343 d = debugfs_create_u32("clk_notifier_count", S_IRUGO, clk->dentry, in clk_debug_create_one()
344 (u32 *)&clk->notifier_count); in clk_debug_create_one()
348 if (clk->ops->debug_init) { in clk_debug_create_one()
349 ret = clk->ops->debug_init(clk->hw, clk->dentry); in clk_debug_create_one()
358 debugfs_remove_recursive(clk->dentry); in clk_debug_create_one()
359 clk->dentry = NULL; in clk_debug_create_one()
372 static int clk_debug_register(struct clk_core *clk) in clk_debug_register() argument
377 hlist_add_head(&clk->debug_node, &clk_debug_list); in clk_debug_register()
382 ret = clk_debug_create_one(clk, rootdir); in clk_debug_register()
397 static void clk_debug_unregister(struct clk_core *clk) in clk_debug_unregister() argument
400 hlist_del_init(&clk->debug_node); in clk_debug_unregister()
401 debugfs_remove_recursive(clk->dentry); in clk_debug_unregister()
402 clk->dentry = NULL; in clk_debug_unregister()
433 struct clk_core *clk; in clk_debug_init() local
462 hlist_for_each_entry(clk, &clk_debug_list, debug_node) in clk_debug_init()
463 clk_debug_create_one(clk, rootdir); in clk_debug_init()
472 static inline int clk_debug_register(struct clk_core *clk) { return 0; } in clk_debug_register() argument
473 static inline void clk_debug_reparent(struct clk_core *clk, in clk_debug_reparent() argument
477 static inline void clk_debug_unregister(struct clk_core *clk) in clk_debug_unregister() argument
483 static void clk_unprepare_unused_subtree(struct clk_core *clk) in clk_unprepare_unused_subtree() argument
489 hlist_for_each_entry(child, &clk->children, child_node) in clk_unprepare_unused_subtree()
492 if (clk->prepare_count) in clk_unprepare_unused_subtree()
495 if (clk->flags & CLK_IGNORE_UNUSED) in clk_unprepare_unused_subtree()
498 if (clk_core_is_prepared(clk)) { in clk_unprepare_unused_subtree()
499 trace_clk_unprepare(clk); in clk_unprepare_unused_subtree()
500 if (clk->ops->unprepare_unused) in clk_unprepare_unused_subtree()
501 clk->ops->unprepare_unused(clk->hw); in clk_unprepare_unused_subtree()
502 else if (clk->ops->unprepare) in clk_unprepare_unused_subtree()
503 clk->ops->unprepare(clk->hw); in clk_unprepare_unused_subtree()
504 trace_clk_unprepare_complete(clk); in clk_unprepare_unused_subtree()
509 static void clk_disable_unused_subtree(struct clk_core *clk) in clk_disable_unused_subtree() argument
516 hlist_for_each_entry(child, &clk->children, child_node) in clk_disable_unused_subtree()
521 if (clk->enable_count) in clk_disable_unused_subtree()
524 if (clk->flags & CLK_IGNORE_UNUSED) in clk_disable_unused_subtree()
532 if (clk_core_is_enabled(clk)) { in clk_disable_unused_subtree()
533 trace_clk_disable(clk); in clk_disable_unused_subtree()
534 if (clk->ops->disable_unused) in clk_disable_unused_subtree()
535 clk->ops->disable_unused(clk->hw); in clk_disable_unused_subtree()
536 else if (clk->ops->disable) in clk_disable_unused_subtree()
537 clk->ops->disable(clk->hw); in clk_disable_unused_subtree()
538 trace_clk_disable_complete(clk); in clk_disable_unused_subtree()
555 struct clk_core *clk; in clk_disable_unused() local
564 hlist_for_each_entry(clk, &clk_root_list, child_node) in clk_disable_unused()
565 clk_disable_unused_subtree(clk); in clk_disable_unused()
567 hlist_for_each_entry(clk, &clk_orphan_list, child_node) in clk_disable_unused()
568 clk_disable_unused_subtree(clk); in clk_disable_unused()
570 hlist_for_each_entry(clk, &clk_root_list, child_node) in clk_disable_unused()
571 clk_unprepare_unused_subtree(clk); in clk_disable_unused()
573 hlist_for_each_entry(clk, &clk_orphan_list, child_node) in clk_disable_unused()
574 clk_unprepare_unused_subtree(clk); in clk_disable_unused()
584 const char *__clk_get_name(struct clk *clk) in __clk_get_name() argument
586 return !clk ? NULL : clk->core->name; in __clk_get_name()
590 struct clk_hw *__clk_get_hw(struct clk *clk) in __clk_get_hw() argument
592 return !clk ? NULL : clk->core->hw; in __clk_get_hw()
596 u8 __clk_get_num_parents(struct clk *clk) in __clk_get_num_parents() argument
598 return !clk ? 0 : clk->core->num_parents; in __clk_get_num_parents()
602 struct clk *__clk_get_parent(struct clk *clk) in __clk_get_parent() argument
604 if (!clk) in __clk_get_parent()
608 return !clk->core->parent ? NULL : clk->core->parent->hw->clk; in __clk_get_parent()
612 static struct clk_core *clk_core_get_parent_by_index(struct clk_core *clk, in clk_core_get_parent_by_index() argument
615 if (!clk || index >= clk->num_parents) in clk_core_get_parent_by_index()
617 else if (!clk->parents) in clk_core_get_parent_by_index()
618 return clk_core_lookup(clk->parent_names[index]); in clk_core_get_parent_by_index()
619 else if (!clk->parents[index]) in clk_core_get_parent_by_index()
620 return clk->parents[index] = in clk_core_get_parent_by_index()
621 clk_core_lookup(clk->parent_names[index]); in clk_core_get_parent_by_index()
623 return clk->parents[index]; in clk_core_get_parent_by_index()
626 struct clk *clk_get_parent_by_index(struct clk *clk, u8 index) in clk_get_parent_by_index() argument
630 if (!clk) in clk_get_parent_by_index()
633 parent = clk_core_get_parent_by_index(clk->core, index); in clk_get_parent_by_index()
635 return !parent ? NULL : parent->hw->clk; in clk_get_parent_by_index()
639 unsigned int __clk_get_enable_count(struct clk *clk) in __clk_get_enable_count() argument
641 return !clk ? 0 : clk->core->enable_count; in __clk_get_enable_count()
644 static unsigned long clk_core_get_rate_nolock(struct clk_core *clk) in clk_core_get_rate_nolock() argument
648 if (!clk) { in clk_core_get_rate_nolock()
653 ret = clk->rate; in clk_core_get_rate_nolock()
655 if (clk->flags & CLK_IS_ROOT) in clk_core_get_rate_nolock()
658 if (!clk->parent) in clk_core_get_rate_nolock()
665 unsigned long __clk_get_rate(struct clk *clk) in __clk_get_rate() argument
667 if (!clk) in __clk_get_rate()
670 return clk_core_get_rate_nolock(clk->core); in __clk_get_rate()
674 static unsigned long __clk_get_accuracy(struct clk_core *clk) in __clk_get_accuracy() argument
676 if (!clk) in __clk_get_accuracy()
679 return clk->accuracy; in __clk_get_accuracy()
682 unsigned long __clk_get_flags(struct clk *clk) in __clk_get_flags() argument
684 return !clk ? 0 : clk->core->flags; in __clk_get_flags()
688 static bool clk_core_is_prepared(struct clk_core *clk) in clk_core_is_prepared() argument
692 if (!clk) in clk_core_is_prepared()
699 if (!clk->ops->is_prepared) { in clk_core_is_prepared()
700 ret = clk->prepare_count ? 1 : 0; in clk_core_is_prepared()
704 ret = clk->ops->is_prepared(clk->hw); in clk_core_is_prepared()
709 bool __clk_is_prepared(struct clk *clk) in __clk_is_prepared() argument
711 if (!clk) in __clk_is_prepared()
714 return clk_core_is_prepared(clk->core); in __clk_is_prepared()
717 static bool clk_core_is_enabled(struct clk_core *clk) in clk_core_is_enabled() argument
721 if (!clk) in clk_core_is_enabled()
728 if (!clk->ops->is_enabled) { in clk_core_is_enabled()
729 ret = clk->enable_count ? 1 : 0; in clk_core_is_enabled()
733 ret = clk->ops->is_enabled(clk->hw); in clk_core_is_enabled()
738 bool __clk_is_enabled(struct clk *clk) in __clk_is_enabled() argument
740 if (!clk) in __clk_is_enabled()
743 return clk_core_is_enabled(clk->core); in __clk_is_enabled()
748 struct clk_core *clk) in __clk_lookup_subtree() argument
753 if (!strcmp(clk->name, name)) in __clk_lookup_subtree()
754 return clk; in __clk_lookup_subtree()
756 hlist_for_each_entry(child, &clk->children, child_node) { in __clk_lookup_subtree()
850 struct clk *__clk_lookup(const char *name) in __clk_lookup()
854 return !core ? NULL : core->hw->clk; in __clk_lookup()
857 static void clk_core_get_boundaries(struct clk_core *clk, in clk_core_get_boundaries() argument
861 struct clk *clk_user; in clk_core_get_boundaries()
866 hlist_for_each_entry(clk_user, &clk->clks, clks_node) in clk_core_get_boundaries()
869 hlist_for_each_entry(clk_user, &clk->clks, clks_node) in clk_core_get_boundaries()
905 static void clk_core_unprepare(struct clk_core *clk) in clk_core_unprepare() argument
907 if (!clk) in clk_core_unprepare()
910 if (WARN_ON(clk->prepare_count == 0)) in clk_core_unprepare()
913 if (--clk->prepare_count > 0) in clk_core_unprepare()
916 WARN_ON(clk->enable_count > 0); in clk_core_unprepare()
918 trace_clk_unprepare(clk); in clk_core_unprepare()
920 if (clk->ops->unprepare) in clk_core_unprepare()
921 clk->ops->unprepare(clk->hw); in clk_core_unprepare()
923 trace_clk_unprepare_complete(clk); in clk_core_unprepare()
924 clk_core_unprepare(clk->parent); in clk_core_unprepare()
938 void clk_unprepare(struct clk *clk) in clk_unprepare() argument
940 if (IS_ERR_OR_NULL(clk)) in clk_unprepare()
944 clk_core_unprepare(clk->core); in clk_unprepare()
949 static int clk_core_prepare(struct clk_core *clk) in clk_core_prepare() argument
953 if (!clk) in clk_core_prepare()
956 if (clk->prepare_count == 0) { in clk_core_prepare()
957 ret = clk_core_prepare(clk->parent); in clk_core_prepare()
961 trace_clk_prepare(clk); in clk_core_prepare()
963 if (clk->ops->prepare) in clk_core_prepare()
964 ret = clk->ops->prepare(clk->hw); in clk_core_prepare()
966 trace_clk_prepare_complete(clk); in clk_core_prepare()
969 clk_core_unprepare(clk->parent); in clk_core_prepare()
974 clk->prepare_count++; in clk_core_prepare()
991 int clk_prepare(struct clk *clk) in clk_prepare() argument
995 if (!clk) in clk_prepare()
999 ret = clk_core_prepare(clk->core); in clk_prepare()
1006 static void clk_core_disable(struct clk_core *clk) in clk_core_disable() argument
1008 if (!clk) in clk_core_disable()
1011 if (WARN_ON(clk->enable_count == 0)) in clk_core_disable()
1014 if (--clk->enable_count > 0) in clk_core_disable()
1017 trace_clk_disable(clk); in clk_core_disable()
1019 if (clk->ops->disable) in clk_core_disable()
1020 clk->ops->disable(clk->hw); in clk_core_disable()
1022 trace_clk_disable_complete(clk); in clk_core_disable()
1024 clk_core_disable(clk->parent); in clk_core_disable()
1027 static void __clk_disable(struct clk *clk) in __clk_disable() argument
1029 if (!clk) in __clk_disable()
1032 clk_core_disable(clk->core); in __clk_disable()
1047 void clk_disable(struct clk *clk) in clk_disable() argument
1051 if (IS_ERR_OR_NULL(clk)) in clk_disable()
1055 __clk_disable(clk); in clk_disable()
1060 static int clk_core_enable(struct clk_core *clk) in clk_core_enable() argument
1064 if (!clk) in clk_core_enable()
1067 if (WARN_ON(clk->prepare_count == 0)) in clk_core_enable()
1070 if (clk->enable_count == 0) { in clk_core_enable()
1071 ret = clk_core_enable(clk->parent); in clk_core_enable()
1076 trace_clk_enable(clk); in clk_core_enable()
1078 if (clk->ops->enable) in clk_core_enable()
1079 ret = clk->ops->enable(clk->hw); in clk_core_enable()
1081 trace_clk_enable_complete(clk); in clk_core_enable()
1084 clk_core_disable(clk->parent); in clk_core_enable()
1089 clk->enable_count++; in clk_core_enable()
1093 static int __clk_enable(struct clk *clk) in __clk_enable() argument
1095 if (!clk) in __clk_enable()
1098 return clk_core_enable(clk->core); in __clk_enable()
1114 int clk_enable(struct clk *clk) in clk_enable() argument
1120 ret = __clk_enable(clk); in clk_enable()
1127 static unsigned long clk_core_round_rate_nolock(struct clk_core *clk, in clk_core_round_rate_nolock() argument
1138 if (!clk) in clk_core_round_rate_nolock()
1141 parent = clk->parent; in clk_core_round_rate_nolock()
1145 if (clk->ops->determine_rate) { in clk_core_round_rate_nolock()
1147 return clk->ops->determine_rate(clk->hw, rate, in clk_core_round_rate_nolock()
1150 } else if (clk->ops->round_rate) in clk_core_round_rate_nolock()
1151 return clk->ops->round_rate(clk->hw, rate, &parent_rate); in clk_core_round_rate_nolock()
1152 else if (clk->flags & CLK_SET_RATE_PARENT) in clk_core_round_rate_nolock()
1153 return clk_core_round_rate_nolock(clk->parent, rate, min_rate, in clk_core_round_rate_nolock()
1156 return clk->rate; in clk_core_round_rate_nolock()
1188 unsigned long __clk_round_rate(struct clk *clk, unsigned long rate) in __clk_round_rate() argument
1193 if (!clk) in __clk_round_rate()
1196 clk_core_get_boundaries(clk->core, &min_rate, &max_rate); in __clk_round_rate()
1198 return clk_core_round_rate_nolock(clk->core, rate, min_rate, max_rate); in __clk_round_rate()
1211 long clk_round_rate(struct clk *clk, unsigned long rate) in clk_round_rate() argument
1215 if (!clk) in clk_round_rate()
1219 ret = __clk_round_rate(clk, rate); in clk_round_rate()
1240 static int __clk_notify(struct clk_core *clk, unsigned long msg, in __clk_notify() argument
1251 if (cn->clk->core == clk) { in __clk_notify()
1252 cnd.clk = cn->clk; in __clk_notify()
1272 static void __clk_recalc_accuracies(struct clk_core *clk) in __clk_recalc_accuracies() argument
1279 if (clk->parent) in __clk_recalc_accuracies()
1280 parent_accuracy = clk->parent->accuracy; in __clk_recalc_accuracies()
1282 if (clk->ops->recalc_accuracy) in __clk_recalc_accuracies()
1283 clk->accuracy = clk->ops->recalc_accuracy(clk->hw, in __clk_recalc_accuracies()
1286 clk->accuracy = parent_accuracy; in __clk_recalc_accuracies()
1288 hlist_for_each_entry(child, &clk->children, child_node) in __clk_recalc_accuracies()
1292 static long clk_core_get_accuracy(struct clk_core *clk) in clk_core_get_accuracy() argument
1297 if (clk && (clk->flags & CLK_GET_ACCURACY_NOCACHE)) in clk_core_get_accuracy()
1298 __clk_recalc_accuracies(clk); in clk_core_get_accuracy()
1300 accuracy = __clk_get_accuracy(clk); in clk_core_get_accuracy()
1315 long clk_get_accuracy(struct clk *clk) in clk_get_accuracy() argument
1317 if (!clk) in clk_get_accuracy()
1320 return clk_core_get_accuracy(clk->core); in clk_get_accuracy()
1324 static unsigned long clk_recalc(struct clk_core *clk, in clk_recalc() argument
1327 if (clk->ops->recalc_rate) in clk_recalc()
1328 return clk->ops->recalc_rate(clk->hw, parent_rate); in clk_recalc()
1346 static void __clk_recalc_rates(struct clk_core *clk, unsigned long msg) in __clk_recalc_rates() argument
1354 old_rate = clk->rate; in __clk_recalc_rates()
1356 if (clk->parent) in __clk_recalc_rates()
1357 parent_rate = clk->parent->rate; in __clk_recalc_rates()
1359 clk->rate = clk_recalc(clk, parent_rate); in __clk_recalc_rates()
1365 if (clk->notifier_count && msg) in __clk_recalc_rates()
1366 __clk_notify(clk, msg, old_rate, clk->rate); in __clk_recalc_rates()
1368 hlist_for_each_entry(child, &clk->children, child_node) in __clk_recalc_rates()
1372 static unsigned long clk_core_get_rate(struct clk_core *clk) in clk_core_get_rate() argument
1378 if (clk && (clk->flags & CLK_GET_RATE_NOCACHE)) in clk_core_get_rate()
1379 __clk_recalc_rates(clk, 0); in clk_core_get_rate()
1381 rate = clk_core_get_rate_nolock(clk); in clk_core_get_rate()
1395 unsigned long clk_get_rate(struct clk *clk) in clk_get_rate() argument
1397 if (!clk) in clk_get_rate()
1400 return clk_core_get_rate(clk->core); in clk_get_rate()
1404 static int clk_fetch_parent_index(struct clk_core *clk, in clk_fetch_parent_index() argument
1409 if (!clk->parents) { in clk_fetch_parent_index()
1410 clk->parents = kcalloc(clk->num_parents, in clk_fetch_parent_index()
1411 sizeof(struct clk *), GFP_KERNEL); in clk_fetch_parent_index()
1412 if (!clk->parents) in clk_fetch_parent_index()
1421 for (i = 0; i < clk->num_parents; i++) { in clk_fetch_parent_index()
1422 if (clk->parents[i] == parent) in clk_fetch_parent_index()
1425 if (clk->parents[i]) in clk_fetch_parent_index()
1428 if (!strcmp(clk->parent_names[i], parent->name)) { in clk_fetch_parent_index()
1429 clk->parents[i] = clk_core_lookup(parent->name); in clk_fetch_parent_index()
1437 static void clk_reparent(struct clk_core *clk, struct clk_core *new_parent) in clk_reparent() argument
1439 hlist_del(&clk->child_node); in clk_reparent()
1443 if (new_parent->new_child == clk) in clk_reparent()
1446 hlist_add_head(&clk->child_node, &new_parent->children); in clk_reparent()
1448 hlist_add_head(&clk->child_node, &clk_orphan_list); in clk_reparent()
1451 clk->parent = new_parent; in clk_reparent()
1454 static struct clk_core *__clk_set_parent_before(struct clk_core *clk, in __clk_set_parent_before() argument
1458 struct clk_core *old_parent = clk->parent; in __clk_set_parent_before()
1477 if (clk->prepare_count) { in __clk_set_parent_before()
1481 clk_core_enable(clk); in __clk_set_parent_before()
1487 clk_reparent(clk, parent); in __clk_set_parent_before()
1512 static int __clk_set_parent(struct clk_core *clk, struct clk_core *parent, in __clk_set_parent() argument
1519 old_parent = __clk_set_parent_before(clk, parent); in __clk_set_parent()
1521 trace_clk_set_parent(clk, parent); in __clk_set_parent()
1524 if (parent && clk->ops->set_parent) in __clk_set_parent()
1525 ret = clk->ops->set_parent(clk->hw, p_index); in __clk_set_parent()
1527 trace_clk_set_parent_complete(clk, parent); in __clk_set_parent()
1531 clk_reparent(clk, old_parent); in __clk_set_parent()
1534 if (clk->prepare_count) { in __clk_set_parent()
1536 clk_core_disable(clk); in __clk_set_parent()
1544 __clk_set_parent_after(clk, parent, old_parent); in __clk_set_parent()
1565 static int __clk_speculate_rates(struct clk_core *clk, in __clk_speculate_rates() argument
1574 new_rate = clk_recalc(clk, parent_rate); in __clk_speculate_rates()
1577 if (clk->notifier_count) in __clk_speculate_rates()
1578 ret = __clk_notify(clk, PRE_RATE_CHANGE, clk->rate, new_rate); in __clk_speculate_rates()
1582 __func__, clk->name, ret); in __clk_speculate_rates()
1586 hlist_for_each_entry(child, &clk->children, child_node) { in __clk_speculate_rates()
1596 static void clk_calc_subtree(struct clk_core *clk, unsigned long new_rate, in clk_calc_subtree() argument
1601 clk->new_rate = new_rate; in clk_calc_subtree()
1602 clk->new_parent = new_parent; in clk_calc_subtree()
1603 clk->new_parent_index = p_index; in clk_calc_subtree()
1605 clk->new_child = NULL; in clk_calc_subtree()
1606 if (new_parent && new_parent != clk->parent) in clk_calc_subtree()
1607 new_parent->new_child = clk; in clk_calc_subtree()
1609 hlist_for_each_entry(child, &clk->children, child_node) { in clk_calc_subtree()
1619 static struct clk_core *clk_calc_new_rates(struct clk_core *clk, in clk_calc_new_rates() argument
1622 struct clk_core *top = clk; in clk_calc_new_rates()
1633 if (IS_ERR_OR_NULL(clk)) in clk_calc_new_rates()
1637 parent = old_parent = clk->parent; in clk_calc_new_rates()
1641 clk_core_get_boundaries(clk, &min_rate, &max_rate); in clk_calc_new_rates()
1644 if (clk->ops->determine_rate) { in clk_calc_new_rates()
1646 ret = clk->ops->determine_rate(clk->hw, rate, in clk_calc_new_rates()
1656 } else if (clk->ops->round_rate) { in clk_calc_new_rates()
1657 ret = clk->ops->round_rate(clk->hw, rate, in clk_calc_new_rates()
1665 } else if (!parent || !(clk->flags & CLK_SET_RATE_PARENT)) { in clk_calc_new_rates()
1667 clk->new_rate = clk->rate; in clk_calc_new_rates()
1678 (clk->flags & CLK_SET_PARENT_GATE) && clk->prepare_count) { in clk_calc_new_rates()
1680 __func__, clk->name); in clk_calc_new_rates()
1685 if (parent && clk->num_parents > 1) { in clk_calc_new_rates()
1686 p_index = clk_fetch_parent_index(clk, parent); in clk_calc_new_rates()
1689 __func__, parent->name, clk->name); in clk_calc_new_rates()
1694 if ((clk->flags & CLK_SET_RATE_PARENT) && parent && in clk_calc_new_rates()
1699 clk_calc_subtree(clk, new_rate, parent, p_index); in clk_calc_new_rates()
1709 static struct clk_core *clk_propagate_rate_change(struct clk_core *clk, in clk_propagate_rate_change() argument
1715 if (clk->rate == clk->new_rate) in clk_propagate_rate_change()
1718 if (clk->notifier_count) { in clk_propagate_rate_change()
1719 ret = __clk_notify(clk, event, clk->rate, clk->new_rate); in clk_propagate_rate_change()
1721 fail_clk = clk; in clk_propagate_rate_change()
1724 hlist_for_each_entry(child, &clk->children, child_node) { in clk_propagate_rate_change()
1726 if (child->new_parent && child->new_parent != clk) in clk_propagate_rate_change()
1734 if (clk->new_child) { in clk_propagate_rate_change()
1735 tmp_clk = clk_propagate_rate_change(clk->new_child, event); in clk_propagate_rate_change()
1747 static void clk_change_rate(struct clk_core *clk) in clk_change_rate() argument
1756 old_rate = clk->rate; in clk_change_rate()
1758 if (clk->new_parent) in clk_change_rate()
1759 best_parent_rate = clk->new_parent->rate; in clk_change_rate()
1760 else if (clk->parent) in clk_change_rate()
1761 best_parent_rate = clk->parent->rate; in clk_change_rate()
1763 if (clk->new_parent && clk->new_parent != clk->parent) { in clk_change_rate()
1764 old_parent = __clk_set_parent_before(clk, clk->new_parent); in clk_change_rate()
1765 trace_clk_set_parent(clk, clk->new_parent); in clk_change_rate()
1767 if (clk->ops->set_rate_and_parent) { in clk_change_rate()
1769 clk->ops->set_rate_and_parent(clk->hw, clk->new_rate, in clk_change_rate()
1771 clk->new_parent_index); in clk_change_rate()
1772 } else if (clk->ops->set_parent) { in clk_change_rate()
1773 clk->ops->set_parent(clk->hw, clk->new_parent_index); in clk_change_rate()
1776 trace_clk_set_parent_complete(clk, clk->new_parent); in clk_change_rate()
1777 __clk_set_parent_after(clk, clk->new_parent, old_parent); in clk_change_rate()
1780 trace_clk_set_rate(clk, clk->new_rate); in clk_change_rate()
1782 if (!skip_set_rate && clk->ops->set_rate) in clk_change_rate()
1783 clk->ops->set_rate(clk->hw, clk->new_rate, best_parent_rate); in clk_change_rate()
1785 trace_clk_set_rate_complete(clk, clk->new_rate); in clk_change_rate()
1787 clk->rate = clk_recalc(clk, best_parent_rate); in clk_change_rate()
1789 if (clk->notifier_count && old_rate != clk->rate) in clk_change_rate()
1790 __clk_notify(clk, POST_RATE_CHANGE, old_rate, clk->rate); in clk_change_rate()
1796 hlist_for_each_entry_safe(child, tmp, &clk->children, child_node) { in clk_change_rate()
1798 if (child->new_parent && child->new_parent != clk) in clk_change_rate()
1804 if (clk->new_child) in clk_change_rate()
1805 clk_change_rate(clk->new_child); in clk_change_rate()
1808 static int clk_core_set_rate_nolock(struct clk_core *clk, in clk_core_set_rate_nolock() argument
1815 if (!clk) in clk_core_set_rate_nolock()
1819 if (rate == clk_core_get_rate_nolock(clk)) in clk_core_set_rate_nolock()
1822 if ((clk->flags & CLK_SET_RATE_GATE) && clk->prepare_count) in clk_core_set_rate_nolock()
1826 top = clk_calc_new_rates(clk, rate); in clk_core_set_rate_nolock()
1842 clk->req_rate = req_rate; in clk_core_set_rate_nolock()
1868 int clk_set_rate(struct clk *clk, unsigned long rate) in clk_set_rate() argument
1872 if (!clk) in clk_set_rate()
1878 ret = clk_core_set_rate_nolock(clk->core, rate); in clk_set_rate()
1894 int clk_set_rate_range(struct clk *clk, unsigned long min, unsigned long max) in clk_set_rate_range() argument
1898 if (!clk) in clk_set_rate_range()
1903 __func__, clk->core->name, clk->dev_id, clk->con_id, in clk_set_rate_range()
1910 if (min != clk->min_rate || max != clk->max_rate) { in clk_set_rate_range()
1911 clk->min_rate = min; in clk_set_rate_range()
1912 clk->max_rate = max; in clk_set_rate_range()
1913 ret = clk_core_set_rate_nolock(clk->core, clk->core->req_rate); in clk_set_rate_range()
1929 int clk_set_min_rate(struct clk *clk, unsigned long rate) in clk_set_min_rate() argument
1931 if (!clk) in clk_set_min_rate()
1934 return clk_set_rate_range(clk, rate, clk->max_rate); in clk_set_min_rate()
1945 int clk_set_max_rate(struct clk *clk, unsigned long rate) in clk_set_max_rate() argument
1947 if (!clk) in clk_set_max_rate()
1950 return clk_set_rate_range(clk, clk->min_rate, rate); in clk_set_max_rate()
1960 struct clk *clk_get_parent(struct clk *clk) in clk_get_parent() argument
1962 struct clk *parent; in clk_get_parent()
1965 parent = __clk_get_parent(clk); in clk_get_parent()
1981 static struct clk_core *__clk_init_parent(struct clk_core *clk) in __clk_init_parent() argument
1988 if (!clk->num_parents) in __clk_init_parent()
1991 if (clk->num_parents == 1) { in __clk_init_parent()
1992 if (IS_ERR_OR_NULL(clk->parent)) in __clk_init_parent()
1993 clk->parent = clk_core_lookup(clk->parent_names[0]); in __clk_init_parent()
1994 ret = clk->parent; in __clk_init_parent()
1998 if (!clk->ops->get_parent) { in __clk_init_parent()
1999 WARN(!clk->ops->get_parent, in __clk_init_parent()
2011 index = clk->ops->get_parent(clk->hw); in __clk_init_parent()
2013 if (!clk->parents) in __clk_init_parent()
2014 clk->parents = in __clk_init_parent()
2015 kcalloc(clk->num_parents, sizeof(struct clk *), in __clk_init_parent()
2018 ret = clk_core_get_parent_by_index(clk, index); in __clk_init_parent()
2024 static void clk_core_reparent(struct clk_core *clk, in clk_core_reparent() argument
2027 clk_reparent(clk, new_parent); in clk_core_reparent()
2028 __clk_recalc_accuracies(clk); in clk_core_reparent()
2029 __clk_recalc_rates(clk, POST_RATE_CHANGE); in clk_core_reparent()
2042 bool clk_has_parent(struct clk *clk, struct clk *parent) in clk_has_parent() argument
2048 if (!clk || !parent) in clk_has_parent()
2051 core = clk->core; in clk_has_parent()
2066 static int clk_core_set_parent(struct clk_core *clk, struct clk_core *parent) in clk_core_set_parent() argument
2072 if (!clk) in clk_core_set_parent()
2078 if (clk->parent == parent) in clk_core_set_parent()
2082 if ((clk->num_parents > 1) && (!clk->ops->set_parent)) { in clk_core_set_parent()
2088 if ((clk->flags & CLK_SET_PARENT_GATE) && clk->prepare_count) { in clk_core_set_parent()
2095 p_index = clk_fetch_parent_index(clk, parent); in clk_core_set_parent()
2099 __func__, parent->name, clk->name); in clk_core_set_parent()
2106 ret = __clk_speculate_rates(clk, p_rate); in clk_core_set_parent()
2113 ret = __clk_set_parent(clk, parent, p_index); in clk_core_set_parent()
2117 __clk_recalc_rates(clk, ABORT_RATE_CHANGE); in clk_core_set_parent()
2119 __clk_recalc_rates(clk, POST_RATE_CHANGE); in clk_core_set_parent()
2120 __clk_recalc_accuracies(clk); in clk_core_set_parent()
2146 int clk_set_parent(struct clk *clk, struct clk *parent) in clk_set_parent() argument
2148 if (!clk) in clk_set_parent()
2151 return clk_core_set_parent(clk->core, parent ? parent->core : NULL); in clk_set_parent()
2175 int clk_set_phase(struct clk *clk, int degrees) in clk_set_phase() argument
2179 if (!clk) in clk_set_phase()
2189 trace_clk_set_phase(clk->core, degrees); in clk_set_phase()
2191 if (clk->core->ops->set_phase) in clk_set_phase()
2192 ret = clk->core->ops->set_phase(clk->core->hw, degrees); in clk_set_phase()
2194 trace_clk_set_phase_complete(clk->core, degrees); in clk_set_phase()
2197 clk->core->phase = degrees; in clk_set_phase()
2205 static int clk_core_get_phase(struct clk_core *clk) in clk_core_get_phase() argument
2209 if (!clk) in clk_core_get_phase()
2213 ret = clk->phase; in clk_core_get_phase()
2228 int clk_get_phase(struct clk *clk) in clk_get_phase() argument
2230 if (!clk) in clk_get_phase()
2233 return clk_core_get_phase(clk->core); in clk_get_phase()
2247 bool clk_is_match(const struct clk *p, const struct clk *q) in clk_is_match()
2270 static int __clk_init(struct device *dev, struct clk *clk_user) in __clk_init()
2275 struct clk_core *clk; in __clk_init() local
2281 clk = clk_user->core; in __clk_init()
2286 if (clk_core_lookup(clk->name)) { in __clk_init()
2288 __func__, clk->name); in __clk_init()
2294 if (clk->ops->set_rate && in __clk_init()
2295 !((clk->ops->round_rate || clk->ops->determine_rate) && in __clk_init()
2296 clk->ops->recalc_rate)) { in __clk_init()
2298 __func__, clk->name); in __clk_init()
2303 if (clk->ops->set_parent && !clk->ops->get_parent) { in __clk_init()
2305 __func__, clk->name); in __clk_init()
2310 if (clk->ops->set_rate_and_parent && in __clk_init()
2311 !(clk->ops->set_parent && clk->ops->set_rate)) { in __clk_init()
2313 __func__, clk->name); in __clk_init()
2319 for (i = 0; i < clk->num_parents; i++) in __clk_init()
2320 WARN(!clk->parent_names[i], in __clk_init()
2322 __func__, clk->name); in __clk_init()
2334 if (clk->num_parents > 1 && !clk->parents) { in __clk_init()
2335 clk->parents = kcalloc(clk->num_parents, sizeof(struct clk *), in __clk_init()
2343 if (clk->parents) in __clk_init()
2344 for (i = 0; i < clk->num_parents; i++) in __clk_init()
2345 clk->parents[i] = in __clk_init()
2346 clk_core_lookup(clk->parent_names[i]); in __clk_init()
2349 clk->parent = __clk_init_parent(clk); in __clk_init()
2361 if (clk->parent) in __clk_init()
2362 hlist_add_head(&clk->child_node, in __clk_init()
2363 &clk->parent->children); in __clk_init()
2364 else if (clk->flags & CLK_IS_ROOT) in __clk_init()
2365 hlist_add_head(&clk->child_node, &clk_root_list); in __clk_init()
2367 hlist_add_head(&clk->child_node, &clk_orphan_list); in __clk_init()
2376 if (clk->ops->recalc_accuracy) in __clk_init()
2377 clk->accuracy = clk->ops->recalc_accuracy(clk->hw, in __clk_init()
2378 __clk_get_accuracy(clk->parent)); in __clk_init()
2379 else if (clk->parent) in __clk_init()
2380 clk->accuracy = clk->parent->accuracy; in __clk_init()
2382 clk->accuracy = 0; in __clk_init()
2389 if (clk->ops->get_phase) in __clk_init()
2390 clk->phase = clk->ops->get_phase(clk->hw); in __clk_init()
2392 clk->phase = 0; in __clk_init()
2400 if (clk->ops->recalc_rate) in __clk_init()
2401 rate = clk->ops->recalc_rate(clk->hw, in __clk_init()
2402 clk_core_get_rate_nolock(clk->parent)); in __clk_init()
2403 else if (clk->parent) in __clk_init()
2404 rate = clk->parent->rate; in __clk_init()
2407 clk->rate = clk->req_rate = rate; in __clk_init()
2416 if (!strcmp(clk->name, orphan->parent_names[i])) in __clk_init()
2417 clk_core_reparent(orphan, clk); in __clk_init()
2422 if (!strcmp(clk->name, orphan->parent_names[i])) { in __clk_init()
2423 clk_core_reparent(orphan, clk); in __clk_init()
2436 if (clk->ops->init) in __clk_init()
2437 clk->ops->init(clk->hw); in __clk_init()
2439 kref_init(&clk->ref); in __clk_init()
2444 clk_debug_register(clk); in __clk_init()
2449 struct clk *__clk_create_clk(struct clk_hw *hw, const char *dev_id, in __clk_create_clk()
2452 struct clk *clk; in __clk_create_clk() local
2456 return (struct clk *) hw; in __clk_create_clk()
2458 clk = kzalloc(sizeof(*clk), GFP_KERNEL); in __clk_create_clk()
2459 if (!clk) in __clk_create_clk()
2462 clk->core = hw->core; in __clk_create_clk()
2463 clk->dev_id = dev_id; in __clk_create_clk()
2464 clk->con_id = con_id; in __clk_create_clk()
2465 clk->max_rate = ULONG_MAX; in __clk_create_clk()
2468 hlist_add_head(&clk->clks_node, &hw->core->clks); in __clk_create_clk()
2471 return clk; in __clk_create_clk()
2474 void __clk_free_clk(struct clk *clk) in __clk_free_clk() argument
2477 hlist_del(&clk->clks_node); in __clk_free_clk()
2480 kfree(clk); in __clk_free_clk()
2494 struct clk *clk_register(struct device *dev, struct clk_hw *hw) in clk_register()
2497 struct clk_core *clk; in clk_register() local
2499 clk = kzalloc(sizeof(*clk), GFP_KERNEL); in clk_register()
2500 if (!clk) { in clk_register()
2506 clk->name = kstrdup_const(hw->init->name, GFP_KERNEL); in clk_register()
2507 if (!clk->name) { in clk_register()
2512 clk->ops = hw->init->ops; in clk_register()
2514 clk->owner = dev->driver->owner; in clk_register()
2515 clk->hw = hw; in clk_register()
2516 clk->flags = hw->init->flags; in clk_register()
2517 clk->num_parents = hw->init->num_parents; in clk_register()
2518 hw->core = clk; in clk_register()
2521 clk->parent_names = kcalloc(clk->num_parents, sizeof(char *), in clk_register()
2524 if (!clk->parent_names) { in clk_register()
2532 for (i = 0; i < clk->num_parents; i++) { in clk_register()
2533 clk->parent_names[i] = kstrdup_const(hw->init->parent_names[i], in clk_register()
2535 if (!clk->parent_names[i]) { in clk_register()
2542 INIT_HLIST_HEAD(&clk->clks); in clk_register()
2544 hw->clk = __clk_create_clk(hw, NULL, NULL); in clk_register()
2545 if (IS_ERR(hw->clk)) { in clk_register()
2547 ret = PTR_ERR(hw->clk); in clk_register()
2551 ret = __clk_init(dev, hw->clk); in clk_register()
2553 return hw->clk; in clk_register()
2555 __clk_free_clk(hw->clk); in clk_register()
2556 hw->clk = NULL; in clk_register()
2560 kfree_const(clk->parent_names[i]); in clk_register()
2561 kfree(clk->parent_names); in clk_register()
2563 kfree_const(clk->name); in clk_register()
2565 kfree(clk); in clk_register()
2577 struct clk_core *clk = container_of(ref, struct clk_core, ref); in __clk_release() local
2578 int i = clk->num_parents; in __clk_release()
2582 kfree(clk->parents); in __clk_release()
2584 kfree_const(clk->parent_names[i]); in __clk_release()
2586 kfree(clk->parent_names); in __clk_release()
2587 kfree_const(clk->name); in __clk_release()
2588 kfree(clk); in __clk_release()
2630 void clk_unregister(struct clk *clk) in clk_unregister() argument
2634 if (!clk || WARN_ON_ONCE(IS_ERR(clk))) in clk_unregister()
2637 clk_debug_unregister(clk->core); in clk_unregister()
2641 if (clk->core->ops == &clk_nodrv_ops) { in clk_unregister()
2643 clk->core->name); in clk_unregister()
2651 clk->core->ops = &clk_nodrv_ops; in clk_unregister()
2654 if (!hlist_empty(&clk->core->children)) { in clk_unregister()
2659 hlist_for_each_entry_safe(child, t, &clk->core->children, in clk_unregister()
2664 hlist_del_init(&clk->core->child_node); in clk_unregister()
2666 if (clk->core->prepare_count) in clk_unregister()
2668 __func__, clk->core->name); in clk_unregister()
2669 kref_put(&clk->core->ref, __clk_release); in clk_unregister()
2677 clk_unregister(*(struct clk **)res); in devm_clk_release()
2689 struct clk *devm_clk_register(struct device *dev, struct clk_hw *hw) in devm_clk_register()
2691 struct clk *clk; in devm_clk_register() local
2692 struct clk **clkp; in devm_clk_register()
2698 clk = clk_register(dev, hw); in devm_clk_register()
2699 if (!IS_ERR(clk)) { in devm_clk_register()
2700 *clkp = clk; in devm_clk_register()
2706 return clk; in devm_clk_register()
2712 struct clk *c = res; in devm_clk_match()
2726 void devm_clk_unregister(struct device *dev, struct clk *clk) in devm_clk_unregister() argument
2728 WARN_ON(devres_release(dev, devm_clk_release, devm_clk_match, clk)); in devm_clk_unregister()
2735 int __clk_get(struct clk *clk) in __clk_get() argument
2737 struct clk_core *core = !clk ? NULL : clk->core; in __clk_get()
2748 void __clk_put(struct clk *clk) in __clk_put() argument
2752 if (!clk || WARN_ON_ONCE(IS_ERR(clk))) in __clk_put()
2757 hlist_del(&clk->clks_node); in __clk_put()
2758 if (clk->min_rate > clk->core->req_rate || in __clk_put()
2759 clk->max_rate < clk->core->req_rate) in __clk_put()
2760 clk_core_set_rate_nolock(clk->core, clk->core->req_rate); in __clk_put()
2762 owner = clk->core->owner; in __clk_put()
2763 kref_put(&clk->core->ref, __clk_release); in __clk_put()
2769 kfree(clk); in __clk_put()
2795 int clk_notifier_register(struct clk *clk, struct notifier_block *nb) in clk_notifier_register() argument
2800 if (!clk || !nb) in clk_notifier_register()
2807 if (cn->clk == clk) in clk_notifier_register()
2811 if (cn->clk != clk) { in clk_notifier_register()
2816 cn->clk = clk; in clk_notifier_register()
2824 clk->core->notifier_count++; in clk_notifier_register()
2844 int clk_notifier_unregister(struct clk *clk, struct notifier_block *nb) in clk_notifier_unregister() argument
2849 if (!clk || !nb) in clk_notifier_unregister()
2855 if (cn->clk == clk) in clk_notifier_unregister()
2858 if (cn->clk == clk) { in clk_notifier_unregister()
2861 clk->core->notifier_count--; in clk_notifier_unregister()
2893 struct clk *(*get)(struct of_phandle_args *clkspec, void *data);
2903 struct clk *of_clk_src_simple_get(struct of_phandle_args *clkspec, in of_clk_src_simple_get()
2910 struct clk *of_clk_src_onecell_get(struct of_phandle_args *clkspec, void *data) in of_clk_src_onecell_get()
2931 struct clk *(*clk_src_get)(struct of_phandle_args *clkspec, in of_clk_add_provider()
2980 struct clk *__of_clk_get_from_provider(struct of_phandle_args *clkspec, in __of_clk_get_from_provider()
2984 struct clk *clk = ERR_PTR(-EPROBE_DEFER); in __of_clk_get_from_provider() local
2993 clk = provider->get(clkspec, provider->data); in __of_clk_get_from_provider()
2994 if (!IS_ERR(clk)) { in __of_clk_get_from_provider()
2995 clk = __clk_create_clk(__clk_get_hw(clk), dev_id, in __of_clk_get_from_provider()
2998 if (!IS_ERR(clk) && !__clk_get(clk)) { in __of_clk_get_from_provider()
2999 __clk_free_clk(clk); in __of_clk_get_from_provider()
3000 clk = ERR_PTR(-ENOENT); in __of_clk_get_from_provider()
3008 return clk; in __of_clk_get_from_provider()
3019 struct clk *of_clk_get_from_provider(struct of_phandle_args *clkspec) in of_clk_get_from_provider()
3090 struct clk *clk = of_clk_get(np, i); in parent_ready() local
3093 if (!IS_ERR(clk)) { in parent_ready()
3094 clk_put(clk); in parent_ready()
3100 if (PTR_ERR(clk) == -EPROBE_DEFER) in parent_ready()