Lines Matching +full:clock +full:- +full:names

4  * Copyright (C) 2008-2011 Texas Instruments, Inc.
5 * Copyright (C) 2008-2011 Nokia Corporation
30 #include <plat/clock.h>
53 if (!strcmp(name, temp_clkdm->name)) { in _clkdm_lookup()
63 * _clkdm_register - register a clockdomain
67 * Returns -EINVAL if given a null pointer, -EEXIST if a clockdomain is
74 if (!clkdm || !clkdm->name) in _clkdm_register()
75 return -EINVAL; in _clkdm_register()
77 pwrdm = pwrdm_lookup(clkdm->pwrdm.name); in _clkdm_register()
80 clkdm->name, clkdm->pwrdm.name); in _clkdm_register()
81 return -EINVAL; in _clkdm_register()
83 clkdm->pwrdm.ptr = pwrdm; in _clkdm_register()
86 if (_clkdm_lookup(clkdm->name)) in _clkdm_register()
87 return -EEXIST; in _clkdm_register()
89 list_add(&clkdm->node, &clkdm_list); in _clkdm_register()
93 spin_lock_init(&clkdm->lock); in _clkdm_register()
95 pr_debug("clockdomain: registered %s\n", clkdm->name); in _clkdm_register()
100 /* _clkdm_deps_lookup - look up the specified clockdomain in a clkdm list */
107 return ERR_PTR(-EINVAL); in _clkdm_deps_lookup()
109 for (cd = deps; cd->clkdm_name; cd++) { 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()
117 if (!cd->clkdm_name) in _clkdm_deps_lookup()
118 return ERR_PTR(-ENOENT); in _clkdm_deps_lookup()
124 * _autodep_lookup - resolve autodep clkdm names to clkdm pointers; store
127 * Resolve autodep clockdomain names to clockdomain pointers via
132 * clockdomain is in hardware-supervised mode. Meant to be called
146 clkdm = clkdm_lookup(autodep->clkdm.name); 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()
156 * _clkdm_add_autodeps - add auto sleepdeps/wkdeps to clkdm upon clock enable
160 * in hardware-supervised mode. Meant to be called from clock framework
161 * when a clock inside clockdomain 'clkdm' is enabled. No return value.
170 if (!autodeps || clkdm->flags & CLKDM_NO_AUTODEPS) in _clkdm_add_autodeps()
173 for (autodep = autodeps; autodep->clkdm.ptr; autodep++) { in _clkdm_add_autodeps()
174 if (IS_ERR(autodep->clkdm.ptr)) in _clkdm_add_autodeps()
178 "clkdm %s\n", autodep->clkdm.ptr->name, in _clkdm_add_autodeps()
179 clkdm->name); in _clkdm_add_autodeps()
181 clkdm_add_sleepdep(clkdm, autodep->clkdm.ptr); in _clkdm_add_autodeps()
182 clkdm_add_wkdep(clkdm, autodep->clkdm.ptr); in _clkdm_add_autodeps()
187 * _clkdm_add_autodeps - remove auto sleepdeps/wkdeps from clkdm
191 * in hardware-supervised mode. Meant to be called from clock framework
192 * when a clock inside clockdomain 'clkdm' is disabled. No return value.
201 if (!autodeps || clkdm->flags & CLKDM_NO_AUTODEPS) in _clkdm_del_autodeps()
204 for (autodep = autodeps; autodep->clkdm.ptr; autodep++) { in _clkdm_del_autodeps()
205 if (IS_ERR(autodep->clkdm.ptr)) in _clkdm_del_autodeps()
209 "clkdm %s\n", autodep->clkdm.ptr->name, in _clkdm_del_autodeps()
210 clkdm->name); in _clkdm_del_autodeps()
212 clkdm_del_sleepdep(clkdm, autodep->clkdm.ptr); in _clkdm_del_autodeps()
213 clkdm_del_wkdep(clkdm, autodep->clkdm.ptr); in _clkdm_del_autodeps()
218 * _resolve_clkdm_deps() - resolve clkdm_names in @clkdm_deps to clkdms
231 for (cd = clkdm_deps; cd && cd->clkdm_name; cd++) { in _resolve_clkdm_deps()
232 if (cd->clkdm) in _resolve_clkdm_deps()
234 cd->clkdm = _clkdm_lookup(cd->clkdm_name); in _resolve_clkdm_deps()
236 …WARN(!cd->clkdm, "clockdomain: %s: could not find clkdm %s while resolving dependencies - should n… in _resolve_clkdm_deps()
237 clkdm->name, cd->clkdm_name); in _resolve_clkdm_deps()
244 * clkdm_register_platform_funcs - register clockdomain implementation fns
249 * before any other clkdm_register*() function. Returns -EINVAL if
250 * @co is null, -EEXIST if platform functions have already been
256 return -EINVAL; in clkdm_register_platform_funcs()
259 return -EEXIST; in clkdm_register_platform_funcs()
267 * clkdm_register_clkdms - register SoC clockdomains
272 * multiple times. Returns -EACCES if called before
273 * clkdm_register_platform_funcs(); -EINVAL if the argument @cs is
281 return -EACCES; in clkdm_register_clkdms()
284 return -EINVAL; in clkdm_register_clkdms()
293 * clkdm_register_autodeps - register autodeps (if required)
298 * added whenever the first clock inside a clockdomain is enabled, and
299 * removed whenever the last clock inside a clockdomain is disabled.
307 * names into clockdomain pointers.
312 * Returns -EACCES if called before any clockdomains have been
313 * registered, -EINVAL if called with a null @ia argument, -EEXIST if
321 return -EACCES; in clkdm_register_autodeps()
324 return -EINVAL; in clkdm_register_autodeps()
327 return -EEXIST; in clkdm_register_autodeps()
330 for (a = autodeps; a->clkdm.ptr; a++) in clkdm_register_autodeps()
337 * clkdm_complete_init - set up the clockdomain layer
339 * Put all clockdomains into software-supervised mode; PM code should
340 * later enable hardware-supervised mode as appropriate. Must be
341 * called after clkdm_register_clkdms(). Returns -EACCES if called
349 return -EACCES; in clkdm_complete_init()
352 if (clkdm->flags & CLKDM_CAN_FORCE_WAKEUP) in clkdm_complete_init()
354 else if (clkdm->flags & CLKDM_CAN_DISABLE_AUTO) in clkdm_complete_init()
357 _resolve_clkdm_deps(clkdm, clkdm->wkdep_srcs); in clkdm_complete_init()
360 _resolve_clkdm_deps(clkdm, clkdm->sleepdep_srcs); in clkdm_complete_init()
368 * clkdm_lookup - look up a clockdomain by name, return a pointer
384 if (!strcmp(name, temp_clkdm->name)) { in clkdm_lookup()
394 * clkdm_for_each - call function on each registered clockdomain
404 * anything else to indicate failure; or -EINVAL if the function pointer
414 return -EINVAL; in clkdm_for_each()
427 * clkdm_get_pwrdm - return a ptr to the pwrdm that this clkdm resides in
438 return clkdm->pwrdm.ptr; in clkdm_get_pwrdm()
445 * clkdm_add_wkdep - add a wakeup dependency from clkdm2 to clkdm1
452 * Returns -EINVAL if presented with invalid clockdomain pointers,
453 * -ENOENT if @clkdm2 cannot wake up clkdm1 in hardware, or 0 upon
462 return -EINVAL; in clkdm_add_wkdep()
464 cd = _clkdm_deps_lookup(clkdm2, clkdm1->wkdep_srcs); in clkdm_add_wkdep()
468 if (!arch_clkdm || !arch_clkdm->clkdm_add_wkdep) in clkdm_add_wkdep()
469 ret = -EINVAL; in clkdm_add_wkdep()
473 "%s when %s wakes up\n", clkdm1->name, clkdm2->name); in clkdm_add_wkdep()
477 if (atomic_inc_return(&cd->wkdep_usecount) == 1) { in clkdm_add_wkdep()
479 "up\n", clkdm1->name, clkdm2->name); in clkdm_add_wkdep()
481 ret = arch_clkdm->clkdm_add_wkdep(clkdm1, clkdm2); in clkdm_add_wkdep()
488 * clkdm_del_wkdep - remove a wakeup dependency from clkdm2 to clkdm1
493 * wakes up. Returns -EINVAL if presented with invalid clockdomain
494 * pointers, -ENOENT if @clkdm2 cannot wake up clkdm1 in hardware, or
503 return -EINVAL; in clkdm_del_wkdep()
505 cd = _clkdm_deps_lookup(clkdm2, clkdm1->wkdep_srcs); in clkdm_del_wkdep()
509 if (!arch_clkdm || !arch_clkdm->clkdm_del_wkdep) in clkdm_del_wkdep()
510 ret = -EINVAL; in clkdm_del_wkdep()
514 "%s when %s wakes up\n", clkdm1->name, clkdm2->name); in clkdm_del_wkdep()
518 if (atomic_dec_return(&cd->wkdep_usecount) == 0) { in clkdm_del_wkdep()
520 "after %s wakes up\n", clkdm1->name, clkdm2->name); in clkdm_del_wkdep()
522 ret = arch_clkdm->clkdm_del_wkdep(clkdm1, clkdm2); in clkdm_del_wkdep()
529 * clkdm_read_wkdep - read wakeup dependency state from clkdm2 to clkdm1
534 * awoken when @clkdm2 wakes up; 0 if dependency is not set; -EINVAL
535 * if either clockdomain pointer is invalid; or -ENOENT if the hardware
538 * REVISIT: Currently this function only represents software-controllable
548 return -EINVAL; in clkdm_read_wkdep()
550 cd = _clkdm_deps_lookup(clkdm2, clkdm1->wkdep_srcs); in clkdm_read_wkdep()
554 if (!arch_clkdm || !arch_clkdm->clkdm_read_wkdep) in clkdm_read_wkdep()
555 ret = -EINVAL; in clkdm_read_wkdep()
559 "%s when %s wakes up\n", clkdm1->name, clkdm2->name); in clkdm_read_wkdep()
564 return arch_clkdm->clkdm_read_wkdep(clkdm1, clkdm2); in clkdm_read_wkdep()
568 * clkdm_clear_all_wkdeps - remove all wakeup dependencies from target clkdm
571 * Remove all inter-clockdomain wakeup dependencies that could cause
574 * and woken up. Returns -EINVAL if @clkdm pointer is invalid, or
580 return -EINVAL; in clkdm_clear_all_wkdeps()
582 if (!arch_clkdm || !arch_clkdm->clkdm_clear_all_wkdeps) in clkdm_clear_all_wkdeps()
583 return -EINVAL; in clkdm_clear_all_wkdeps()
585 return arch_clkdm->clkdm_clear_all_wkdeps(clkdm); in clkdm_clear_all_wkdeps()
589 * clkdm_add_sleepdep - add a sleep dependency from clkdm2 to clkdm1
594 * retention or off) if @clkdm2 is active. Returns -EINVAL if
596 * that does not support software-configurable hardware sleep
597 * dependencies, -ENOENT if the specified dependency cannot be set in
606 return -EINVAL; in clkdm_add_sleepdep()
608 cd = _clkdm_deps_lookup(clkdm2, clkdm1->sleepdep_srcs); in clkdm_add_sleepdep()
612 if (!arch_clkdm || !arch_clkdm->clkdm_add_sleepdep) in clkdm_add_sleepdep()
613 ret = -EINVAL; in clkdm_add_sleepdep()
617 "dependency affecting %s from %s\n", clkdm1->name, in clkdm_add_sleepdep()
618 clkdm2->name); in clkdm_add_sleepdep()
622 if (atomic_inc_return(&cd->sleepdep_usecount) == 1) { in clkdm_add_sleepdep()
624 "is active\n", clkdm1->name, clkdm2->name); in clkdm_add_sleepdep()
626 ret = arch_clkdm->clkdm_add_sleepdep(clkdm1, clkdm2); in clkdm_add_sleepdep()
633 * clkdm_del_sleepdep - remove a sleep dependency from clkdm2 to clkdm1
638 * off), independent of the activity state of @clkdm2. Returns -EINVAL
640 * that does not support software-configurable hardware sleep dependencies,
641 * -ENOENT if the specified dependency cannot be cleared in hardware, or
650 return -EINVAL; in clkdm_del_sleepdep()
652 cd = _clkdm_deps_lookup(clkdm2, clkdm1->sleepdep_srcs); in clkdm_del_sleepdep()
656 if (!arch_clkdm || !arch_clkdm->clkdm_del_sleepdep) in clkdm_del_sleepdep()
657 ret = -EINVAL; in clkdm_del_sleepdep()
661 "dependency affecting %s from %s\n", clkdm1->name, in clkdm_del_sleepdep()
662 clkdm2->name); in clkdm_del_sleepdep()
666 if (atomic_dec_return(&cd->sleepdep_usecount) == 0) { in clkdm_del_sleepdep()
668 "sleeping if %s is active\n", clkdm1->name, in clkdm_del_sleepdep()
669 clkdm2->name); in clkdm_del_sleepdep()
671 ret = arch_clkdm->clkdm_del_sleepdep(clkdm1, clkdm2); in clkdm_del_sleepdep()
678 * clkdm_read_sleepdep - read sleep dependency state from clkdm2 to clkdm1
685 * of @clkdm2's; -EINVAL if either clockdomain pointer is invalid or called
686 * on a machine that does not support software-configurable hardware sleep
687 * dependencies; or -ENOENT if the hardware is incapable.
689 * REVISIT: Currently this function only represents software-controllable
699 return -EINVAL; in clkdm_read_sleepdep()
701 cd = _clkdm_deps_lookup(clkdm2, clkdm1->sleepdep_srcs); in clkdm_read_sleepdep()
705 if (!arch_clkdm || !arch_clkdm->clkdm_read_sleepdep) in clkdm_read_sleepdep()
706 ret = -EINVAL; in clkdm_read_sleepdep()
710 "dependency affecting %s from %s\n", clkdm1->name, in clkdm_read_sleepdep()
711 clkdm2->name); in clkdm_read_sleepdep()
716 return arch_clkdm->clkdm_read_sleepdep(clkdm1, clkdm2); in clkdm_read_sleepdep()
720 * clkdm_clear_all_sleepdeps - remove all sleep dependencies from target clkdm
723 * Remove all inter-clockdomain sleep dependencies that could prevent
726 * and woken up. Returns -EINVAL if @clkdm pointer is invalid, or
732 return -EINVAL; in clkdm_clear_all_sleepdeps()
734 if (!arch_clkdm || !arch_clkdm->clkdm_clear_all_sleepdeps) in clkdm_clear_all_sleepdeps()
735 return -EINVAL; in clkdm_clear_all_sleepdeps()
737 return arch_clkdm->clkdm_clear_all_sleepdeps(clkdm); in clkdm_clear_all_sleepdeps()
741 * clkdm_sleep - force clockdomain sleep transition
745 * clockdomain @clkdm. Returns -EINVAL if @clkdm is NULL or if
746 * clockdomain does not support software-initiated sleep; 0 upon
755 return -EINVAL; in clkdm_sleep()
757 if (!(clkdm->flags & CLKDM_CAN_FORCE_SLEEP)) { in clkdm_sleep()
759 "sleep via software\n", clkdm->name); in clkdm_sleep()
760 return -EINVAL; in clkdm_sleep()
763 if (!arch_clkdm || !arch_clkdm->clkdm_sleep) in clkdm_sleep()
764 return -EINVAL; in clkdm_sleep()
766 pr_debug("clockdomain: forcing sleep on %s\n", clkdm->name); in clkdm_sleep()
768 spin_lock_irqsave(&clkdm->lock, flags); in clkdm_sleep()
769 clkdm->_flags &= ~_CLKDM_FLAG_HWSUP_ENABLED; in clkdm_sleep()
770 ret = arch_clkdm->clkdm_sleep(clkdm); in clkdm_sleep()
771 spin_unlock_irqrestore(&clkdm->lock, flags); in clkdm_sleep()
776 * clkdm_wakeup - force clockdomain wakeup transition
780 * clockdomain @clkdm. Returns -EINVAL if @clkdm is NULL or if the
781 * clockdomain does not support software-controlled wakeup; 0 upon
790 return -EINVAL; in clkdm_wakeup()
792 if (!(clkdm->flags & CLKDM_CAN_FORCE_WAKEUP)) { in clkdm_wakeup()
794 "wakeup via software\n", clkdm->name); in clkdm_wakeup()
795 return -EINVAL; in clkdm_wakeup()
798 if (!arch_clkdm || !arch_clkdm->clkdm_wakeup) in clkdm_wakeup()
799 return -EINVAL; in clkdm_wakeup()
801 pr_debug("clockdomain: forcing wakeup on %s\n", clkdm->name); in clkdm_wakeup()
803 spin_lock_irqsave(&clkdm->lock, flags); in clkdm_wakeup()
804 clkdm->_flags &= ~_CLKDM_FLAG_HWSUP_ENABLED; in clkdm_wakeup()
805 ret = arch_clkdm->clkdm_wakeup(clkdm); in clkdm_wakeup()
806 ret |= pwrdm_state_switch(clkdm->pwrdm.ptr); in clkdm_wakeup()
807 spin_unlock_irqrestore(&clkdm->lock, flags); in clkdm_wakeup()
812 * clkdm_allow_idle - enable hwsup idle transitions for clkdm
817 * clockdomain has any downstream clocks enabled in the clock
828 if (!(clkdm->flags & CLKDM_CAN_ENABLE_AUTO)) { in clkdm_allow_idle()
829 pr_debug("clock: automatic idle transitions cannot be enabled " in clkdm_allow_idle()
830 "on clockdomain %s\n", clkdm->name); in clkdm_allow_idle()
834 if (!arch_clkdm || !arch_clkdm->clkdm_allow_idle) in clkdm_allow_idle()
838 clkdm->name); in clkdm_allow_idle()
840 spin_lock_irqsave(&clkdm->lock, flags); in clkdm_allow_idle()
841 clkdm->_flags |= _CLKDM_FLAG_HWSUP_ENABLED; in clkdm_allow_idle()
842 arch_clkdm->clkdm_allow_idle(clkdm); in clkdm_allow_idle()
844 spin_unlock_irqrestore(&clkdm->lock, flags); in clkdm_allow_idle()
848 * clkdm_deny_idle - disable hwsup idle transitions for clkdm
853 * downstream clocks enabled in the clock framework, wkdep/sleepdep
863 if (!(clkdm->flags & CLKDM_CAN_DISABLE_AUTO)) { in clkdm_deny_idle()
865 "disabled on %s\n", clkdm->name); in clkdm_deny_idle()
869 if (!arch_clkdm || !arch_clkdm->clkdm_deny_idle) in clkdm_deny_idle()
873 clkdm->name); in clkdm_deny_idle()
875 spin_lock_irqsave(&clkdm->lock, flags); in clkdm_deny_idle()
876 clkdm->_flags &= ~_CLKDM_FLAG_HWSUP_ENABLED; in clkdm_deny_idle()
877 arch_clkdm->clkdm_deny_idle(clkdm); in clkdm_deny_idle()
878 pwrdm_state_switch(clkdm->pwrdm.ptr); in clkdm_deny_idle()
879 spin_unlock_irqrestore(&clkdm->lock, flags); in clkdm_deny_idle()
883 * clkdm_in_hwsup - is clockdomain @clkdm have hardware-supervised idle enabled?
887 * hardware-supervised idle enabled, or false if it does not or if
890 * bits from the hardware; it instead tests an in-memory flag that is
891 * changed whenever the clockdomain code changes the auto-idle mode.
901 spin_lock_irqsave(&clkdm->lock, flags); in clkdm_in_hwsup()
902 ret = (clkdm->_flags & _CLKDM_FLAG_HWSUP_ENABLED) ? true : false; in clkdm_in_hwsup()
903 spin_unlock_irqrestore(&clkdm->lock, flags); in clkdm_in_hwsup()
908 /* Clockdomain-to-clock/hwmod framework interface code */
914 if (!clkdm || !arch_clkdm || !arch_clkdm->clkdm_clk_enable) in _clkdm_clk_hwmod_enable()
915 return -EINVAL; in _clkdm_clk_hwmod_enable()
919 * should be called for every clock instance or hwmod that is in _clkdm_clk_hwmod_enable()
922 if ((atomic_inc_return(&clkdm->usecount) > 1) && autodeps) in _clkdm_clk_hwmod_enable()
925 spin_lock_irqsave(&clkdm->lock, flags); in _clkdm_clk_hwmod_enable()
926 arch_clkdm->clkdm_clk_enable(clkdm); in _clkdm_clk_hwmod_enable()
927 pwrdm_wait_transition(clkdm->pwrdm.ptr); in _clkdm_clk_hwmod_enable()
929 spin_unlock_irqrestore(&clkdm->lock, flags); in _clkdm_clk_hwmod_enable()
931 pr_debug("clockdomain: clkdm %s: enabled\n", clkdm->name); in _clkdm_clk_hwmod_enable()
940 if (!clkdm || !arch_clkdm || !arch_clkdm->clkdm_clk_disable) in _clkdm_clk_hwmod_disable()
941 return -EINVAL; in _clkdm_clk_hwmod_disable()
943 if (atomic_read(&clkdm->usecount) == 0) { in _clkdm_clk_hwmod_disable()
945 return -ERANGE; in _clkdm_clk_hwmod_disable()
948 if (atomic_dec_return(&clkdm->usecount) > 0) in _clkdm_clk_hwmod_disable()
951 spin_lock_irqsave(&clkdm->lock, flags); in _clkdm_clk_hwmod_disable()
952 arch_clkdm->clkdm_clk_disable(clkdm); in _clkdm_clk_hwmod_disable()
954 spin_unlock_irqrestore(&clkdm->lock, flags); in _clkdm_clk_hwmod_disable()
956 pr_debug("clockdomain: clkdm %s: disabled\n", clkdm->name); in _clkdm_clk_hwmod_disable()
962 * clkdm_clk_enable - add an enabled downstream clock to this clkdm
964 * @clk: struct clk * of the enabled downstream clock
968 * clk_enable() code. If the clockdomain is in software-supervised
970 * hardware-supervised idle mode, add clkdm-pwrdm autodependencies, to
972 * by on-chip processors. Returns -EINVAL if passed null pointers;
983 return -EINVAL; in clkdm_clk_enable()
989 * clkdm_clk_disable - remove an enabled downstream clock from this clkdm
991 * @clk: struct clk * of the disabled downstream clock
996 * (software-supervised mode) or remove the clkdm autodependencies
997 * (hardware-supervised mode). Returns -EINVAL if passed null
998 * pointers; -ERANGE if the @clkdm usecount underflows; or returns 0
1009 return -EINVAL; in clkdm_clk_disable()
1015 * clkdm_hwmod_enable - add an enabled downstream hwmod to this clkdm
1022 * If the clockdomain is in software-supervised idle mode, force the
1023 * clockdomain to wake. If the clockdomain is in hardware-supervised idle
1024 * mode, add clkdm-pwrdm autodependencies, to ensure that devices in the
1025 * clockdomain can be read from/written to by on-chip processors.
1026 * Returns -EINVAL if passed null pointers;
1041 return -EINVAL; in clkdm_hwmod_enable()
1047 * clkdm_hwmod_disable - remove an enabled downstream hwmod from this clkdm
1054 * (software-supervised mode) or remove the clkdm autodependencies
1055 * (hardware-supervised mode).
1056 * Returns -EINVAL if passed null pointers; -ERANGE if the @clkdm usecount
1072 return -EINVAL; in clkdm_hwmod_disable()