Lines Matching refs:clkdm
47 struct clockdomain *clkdm, *temp_clkdm; in _clkdm_lookup() local
52 clkdm = NULL; in _clkdm_lookup()
56 clkdm = temp_clkdm; in _clkdm_lookup()
61 return clkdm; in _clkdm_lookup()
72 static int _clkdm_register(struct clockdomain *clkdm) in _clkdm_register() argument
76 if (!clkdm || !clkdm->name) in _clkdm_register()
79 pwrdm = pwrdm_lookup(clkdm->pwrdm.name); in _clkdm_register()
82 clkdm->name, clkdm->pwrdm.name); in _clkdm_register()
85 clkdm->pwrdm.ptr = pwrdm; in _clkdm_register()
88 if (_clkdm_lookup(clkdm->name)) in _clkdm_register()
91 list_add(&clkdm->node, &clkdm_list); in _clkdm_register()
93 pwrdm_add_clkdm(pwrdm, clkdm); in _clkdm_register()
95 pr_debug("clockdomain: registered %s\n", clkdm->name); in _clkdm_register()
101 static struct clkdm_dep *_clkdm_deps_lookup(struct clockdomain *clkdm, in _clkdm_deps_lookup() argument
106 if (!clkdm || !deps) in _clkdm_deps_lookup()
110 if (!cd->clkdm && cd->clkdm_name) in _clkdm_deps_lookup()
111 cd->clkdm = _clkdm_lookup(cd->clkdm_name); in _clkdm_deps_lookup()
113 if (cd->clkdm == clkdm) in _clkdm_deps_lookup()
141 struct clockdomain *clkdm; in _autodep_lookup() local
146 clkdm = clkdm_lookup(autodep->clkdm.name); in _autodep_lookup()
147 if (!clkdm) { in _autodep_lookup()
149 autodep->clkdm.name); in _autodep_lookup()
150 clkdm = ERR_PTR(-ENOENT); in _autodep_lookup()
152 autodep->clkdm.ptr = clkdm; in _autodep_lookup()
164 static void _resolve_clkdm_deps(struct clockdomain *clkdm, in _resolve_clkdm_deps() argument
170 if (cd->clkdm) in _resolve_clkdm_deps()
172 cd->clkdm = _clkdm_lookup(cd->clkdm_name); in _resolve_clkdm_deps()
174 …WARN(!cd->clkdm, "clockdomain: %s: could not find clkdm %s while resolving dependencies - should n… in _resolve_clkdm_deps()
175 clkdm->name, cd->clkdm_name); in _resolve_clkdm_deps()
446 for (a = autodeps; a->clkdm.ptr; a++) in clkdm_register_autodeps()
462 struct clockdomain *clkdm; in clkdm_complete_init() local
467 list_for_each_entry(clkdm, &clkdm_list, node) { in clkdm_complete_init()
468 if (clkdm->flags & CLKDM_CAN_FORCE_WAKEUP) in clkdm_complete_init()
469 clkdm_wakeup(clkdm); in clkdm_complete_init()
470 else if (clkdm->flags & CLKDM_CAN_DISABLE_AUTO) in clkdm_complete_init()
471 clkdm_deny_idle(clkdm); in clkdm_complete_init()
473 _resolve_clkdm_deps(clkdm, clkdm->wkdep_srcs); in clkdm_complete_init()
474 clkdm_clear_all_wkdeps(clkdm); in clkdm_complete_init()
476 _resolve_clkdm_deps(clkdm, clkdm->sleepdep_srcs); in clkdm_complete_init()
477 clkdm_clear_all_sleepdeps(clkdm); in clkdm_complete_init()
492 struct clockdomain *clkdm, *temp_clkdm; in clkdm_lookup() local
497 clkdm = NULL; in clkdm_lookup()
501 clkdm = temp_clkdm; in clkdm_lookup()
506 return clkdm; in clkdm_lookup()
523 int clkdm_for_each(int (*fn)(struct clockdomain *clkdm, void *user), in clkdm_for_each() argument
526 struct clockdomain *clkdm; in clkdm_for_each() local
532 list_for_each_entry(clkdm, &clkdm_list, node) { in clkdm_for_each()
533 ret = (*fn)(clkdm, user); in clkdm_for_each()
549 struct powerdomain *clkdm_get_pwrdm(struct clockdomain *clkdm) in clkdm_get_pwrdm() argument
551 if (!clkdm) in clkdm_get_pwrdm()
554 return clkdm->pwrdm.ptr; in clkdm_get_pwrdm()
584 pwrdm_lock(cd->clkdm->pwrdm.ptr); in clkdm_add_wkdep()
586 pwrdm_unlock(cd->clkdm->pwrdm.ptr); in clkdm_add_wkdep()
613 pwrdm_lock(cd->clkdm->pwrdm.ptr); in clkdm_del_wkdep()
615 pwrdm_unlock(cd->clkdm->pwrdm.ptr); in clkdm_del_wkdep()
669 int clkdm_clear_all_wkdeps(struct clockdomain *clkdm) in clkdm_clear_all_wkdeps() argument
671 if (!clkdm) in clkdm_clear_all_wkdeps()
677 return arch_clkdm->clkdm_clear_all_wkdeps(clkdm); in clkdm_clear_all_wkdeps()
704 pwrdm_lock(cd->clkdm->pwrdm.ptr); in clkdm_add_sleepdep()
706 pwrdm_unlock(cd->clkdm->pwrdm.ptr); in clkdm_add_sleepdep()
735 pwrdm_lock(cd->clkdm->pwrdm.ptr); in clkdm_del_sleepdep()
737 pwrdm_unlock(cd->clkdm->pwrdm.ptr); in clkdm_del_sleepdep()
793 int clkdm_clear_all_sleepdeps(struct clockdomain *clkdm) in clkdm_clear_all_sleepdeps() argument
795 if (!clkdm) in clkdm_clear_all_sleepdeps()
801 return arch_clkdm->clkdm_clear_all_sleepdeps(clkdm); in clkdm_clear_all_sleepdeps()
813 int clkdm_sleep_nolock(struct clockdomain *clkdm) in clkdm_sleep_nolock() argument
817 if (!clkdm) in clkdm_sleep_nolock()
820 if (!(clkdm->flags & CLKDM_CAN_FORCE_SLEEP)) { in clkdm_sleep_nolock()
822 clkdm->name); in clkdm_sleep_nolock()
829 pr_debug("clockdomain: forcing sleep on %s\n", clkdm->name); in clkdm_sleep_nolock()
831 clkdm->_flags &= ~_CLKDM_FLAG_HWSUP_ENABLED; in clkdm_sleep_nolock()
832 ret = arch_clkdm->clkdm_sleep(clkdm); in clkdm_sleep_nolock()
833 ret |= pwrdm_state_switch_nolock(clkdm->pwrdm.ptr); in clkdm_sleep_nolock()
847 int clkdm_sleep(struct clockdomain *clkdm) in clkdm_sleep() argument
851 pwrdm_lock(clkdm->pwrdm.ptr); in clkdm_sleep()
852 ret = clkdm_sleep_nolock(clkdm); in clkdm_sleep()
853 pwrdm_unlock(clkdm->pwrdm.ptr); in clkdm_sleep()
867 int clkdm_wakeup_nolock(struct clockdomain *clkdm) in clkdm_wakeup_nolock() argument
871 if (!clkdm) in clkdm_wakeup_nolock()
874 if (!(clkdm->flags & CLKDM_CAN_FORCE_WAKEUP)) { in clkdm_wakeup_nolock()
876 clkdm->name); in clkdm_wakeup_nolock()
883 pr_debug("clockdomain: forcing wakeup on %s\n", clkdm->name); in clkdm_wakeup_nolock()
885 clkdm->_flags &= ~_CLKDM_FLAG_HWSUP_ENABLED; in clkdm_wakeup_nolock()
886 ret = arch_clkdm->clkdm_wakeup(clkdm); in clkdm_wakeup_nolock()
887 ret |= pwrdm_state_switch_nolock(clkdm->pwrdm.ptr); in clkdm_wakeup_nolock()
901 int clkdm_wakeup(struct clockdomain *clkdm) in clkdm_wakeup() argument
905 pwrdm_lock(clkdm->pwrdm.ptr); in clkdm_wakeup()
906 ret = clkdm_wakeup_nolock(clkdm); in clkdm_wakeup()
907 pwrdm_unlock(clkdm->pwrdm.ptr); in clkdm_wakeup()
923 void clkdm_allow_idle_nolock(struct clockdomain *clkdm) in clkdm_allow_idle_nolock() argument
925 if (!clkdm) in clkdm_allow_idle_nolock()
928 if (!(clkdm->flags & CLKDM_CAN_ENABLE_AUTO)) { in clkdm_allow_idle_nolock()
930 clkdm->name); in clkdm_allow_idle_nolock()
938 clkdm->name); in clkdm_allow_idle_nolock()
940 clkdm->_flags |= _CLKDM_FLAG_HWSUP_ENABLED; in clkdm_allow_idle_nolock()
941 arch_clkdm->clkdm_allow_idle(clkdm); in clkdm_allow_idle_nolock()
942 pwrdm_state_switch_nolock(clkdm->pwrdm.ptr); in clkdm_allow_idle_nolock()
955 void clkdm_allow_idle(struct clockdomain *clkdm) in clkdm_allow_idle() argument
957 pwrdm_lock(clkdm->pwrdm.ptr); in clkdm_allow_idle()
958 clkdm_allow_idle_nolock(clkdm); in clkdm_allow_idle()
959 pwrdm_unlock(clkdm->pwrdm.ptr); in clkdm_allow_idle()
972 void clkdm_deny_idle_nolock(struct clockdomain *clkdm) in clkdm_deny_idle_nolock() argument
974 if (!clkdm) in clkdm_deny_idle_nolock()
977 if (!(clkdm->flags & CLKDM_CAN_DISABLE_AUTO)) { in clkdm_deny_idle_nolock()
979 clkdm->name); in clkdm_deny_idle_nolock()
987 clkdm->name); in clkdm_deny_idle_nolock()
989 clkdm->_flags &= ~_CLKDM_FLAG_HWSUP_ENABLED; in clkdm_deny_idle_nolock()
990 arch_clkdm->clkdm_deny_idle(clkdm); in clkdm_deny_idle_nolock()
991 pwrdm_state_switch_nolock(clkdm->pwrdm.ptr); in clkdm_deny_idle_nolock()
1003 void clkdm_deny_idle(struct clockdomain *clkdm) in clkdm_deny_idle() argument
1005 pwrdm_lock(clkdm->pwrdm.ptr); in clkdm_deny_idle()
1006 clkdm_deny_idle_nolock(clkdm); in clkdm_deny_idle()
1007 pwrdm_unlock(clkdm->pwrdm.ptr); in clkdm_deny_idle()
1021 bool clkdm_in_hwsup(struct clockdomain *clkdm) in clkdm_in_hwsup() argument
1025 if (!clkdm) in clkdm_in_hwsup()
1028 ret = (clkdm->_flags & _CLKDM_FLAG_HWSUP_ENABLED) ? true : false; in clkdm_in_hwsup()
1042 bool clkdm_missing_idle_reporting(struct clockdomain *clkdm) in clkdm_missing_idle_reporting() argument
1044 if (!clkdm) in clkdm_missing_idle_reporting()
1047 return (clkdm->flags & CLKDM_MISSING_IDLE_REPORTING) ? true : false; in clkdm_missing_idle_reporting()
1063 void clkdm_add_autodeps(struct clockdomain *clkdm) in clkdm_add_autodeps() argument
1067 if (!autodeps || clkdm->flags & CLKDM_NO_AUTODEPS) in clkdm_add_autodeps()
1070 for (autodep = autodeps; autodep->clkdm.ptr; autodep++) { in clkdm_add_autodeps()
1071 if (IS_ERR(autodep->clkdm.ptr)) in clkdm_add_autodeps()
1075 clkdm->name, autodep->clkdm.ptr->name); in clkdm_add_autodeps()
1077 _clkdm_add_sleepdep(clkdm, autodep->clkdm.ptr); in clkdm_add_autodeps()
1078 _clkdm_add_wkdep(clkdm, autodep->clkdm.ptr); in clkdm_add_autodeps()
1093 void clkdm_del_autodeps(struct clockdomain *clkdm) in clkdm_del_autodeps() argument
1097 if (!autodeps || clkdm->flags & CLKDM_NO_AUTODEPS) in clkdm_del_autodeps()
1100 for (autodep = autodeps; autodep->clkdm.ptr; autodep++) { in clkdm_del_autodeps()
1101 if (IS_ERR(autodep->clkdm.ptr)) in clkdm_del_autodeps()
1105 clkdm->name, autodep->clkdm.ptr->name); in clkdm_del_autodeps()
1107 _clkdm_del_sleepdep(clkdm, autodep->clkdm.ptr); in clkdm_del_autodeps()
1108 _clkdm_del_wkdep(clkdm, autodep->clkdm.ptr); in clkdm_del_autodeps()
1114 static int _clkdm_clk_hwmod_enable(struct clockdomain *clkdm) in _clkdm_clk_hwmod_enable() argument
1116 if (!clkdm || !arch_clkdm || !arch_clkdm->clkdm_clk_enable) in _clkdm_clk_hwmod_enable()
1119 pwrdm_lock(clkdm->pwrdm.ptr); in _clkdm_clk_hwmod_enable()
1126 clkdm->usecount++; in _clkdm_clk_hwmod_enable()
1127 if (clkdm->usecount > 1 && autodeps) { in _clkdm_clk_hwmod_enable()
1128 pwrdm_unlock(clkdm->pwrdm.ptr); in _clkdm_clk_hwmod_enable()
1132 arch_clkdm->clkdm_clk_enable(clkdm); in _clkdm_clk_hwmod_enable()
1133 pwrdm_state_switch_nolock(clkdm->pwrdm.ptr); in _clkdm_clk_hwmod_enable()
1134 pwrdm_unlock(clkdm->pwrdm.ptr); in _clkdm_clk_hwmod_enable()
1136 pr_debug("clockdomain: %s: enabled\n", clkdm->name); in _clkdm_clk_hwmod_enable()
1155 int clkdm_clk_enable(struct clockdomain *clkdm, struct clk *clk) in clkdm_clk_enable() argument
1165 return _clkdm_clk_hwmod_enable(clkdm); in clkdm_clk_enable()
1181 int clkdm_clk_disable(struct clockdomain *clkdm, struct clk *clk) in clkdm_clk_disable() argument
1183 if (!clkdm || !clk || !arch_clkdm || !arch_clkdm->clkdm_clk_disable) in clkdm_clk_disable()
1186 pwrdm_lock(clkdm->pwrdm.ptr); in clkdm_clk_disable()
1189 if ((__clk_get_enable_count(clk) == 0) && clkdm->usecount == 0) in clkdm_clk_disable()
1192 if (clkdm->usecount == 0) { in clkdm_clk_disable()
1193 pwrdm_unlock(clkdm->pwrdm.ptr); in clkdm_clk_disable()
1198 clkdm->usecount--; in clkdm_clk_disable()
1199 if (clkdm->usecount > 0) { in clkdm_clk_disable()
1200 pwrdm_unlock(clkdm->pwrdm.ptr); in clkdm_clk_disable()
1204 arch_clkdm->clkdm_clk_disable(clkdm); in clkdm_clk_disable()
1205 pwrdm_state_switch_nolock(clkdm->pwrdm.ptr); in clkdm_clk_disable()
1207 pr_debug("clockdomain: %s: disabled\n", clkdm->name); in clkdm_clk_disable()
1210 pwrdm_unlock(clkdm->pwrdm.ptr); in clkdm_clk_disable()
1230 int clkdm_hwmod_enable(struct clockdomain *clkdm, struct omap_hwmod *oh) in clkdm_hwmod_enable() argument
1244 return _clkdm_clk_hwmod_enable(clkdm); in clkdm_hwmod_enable()
1261 int clkdm_hwmod_disable(struct clockdomain *clkdm, struct omap_hwmod *oh) in clkdm_hwmod_disable() argument
1272 if (!clkdm || !oh || !arch_clkdm || !arch_clkdm->clkdm_clk_disable) in clkdm_hwmod_disable()
1275 pwrdm_lock(clkdm->pwrdm.ptr); in clkdm_hwmod_disable()
1277 if (clkdm->usecount == 0) { in clkdm_hwmod_disable()
1278 pwrdm_unlock(clkdm->pwrdm.ptr); in clkdm_hwmod_disable()
1283 clkdm->usecount--; in clkdm_hwmod_disable()
1284 if (clkdm->usecount > 0) { in clkdm_hwmod_disable()
1285 pwrdm_unlock(clkdm->pwrdm.ptr); in clkdm_hwmod_disable()
1289 arch_clkdm->clkdm_clk_disable(clkdm); in clkdm_hwmod_disable()
1290 pwrdm_state_switch_nolock(clkdm->pwrdm.ptr); in clkdm_hwmod_disable()
1291 pwrdm_unlock(clkdm->pwrdm.ptr); in clkdm_hwmod_disable()
1293 pr_debug("clockdomain: %s: disabled\n", clkdm->name); in clkdm_hwmod_disable()