diff options
Diffstat (limited to 'arch/arm/mach-omap2/clockdomain.c')
-rw-r--r-- | arch/arm/mach-omap2/clockdomain.c | 91 |
1 files changed, 51 insertions, 40 deletions
diff --git a/arch/arm/mach-omap2/clockdomain.c b/arch/arm/mach-omap2/clockdomain.c index 8664f5a8bfb6..cbb879139c51 100644 --- a/arch/arm/mach-omap2/clockdomain.c +++ b/arch/arm/mach-omap2/clockdomain.c | |||
@@ -174,9 +174,8 @@ void _clkdm_add_autodeps(struct clockdomain *clkdm) | |||
174 | if (IS_ERR(autodep->clkdm.ptr)) | 174 | if (IS_ERR(autodep->clkdm.ptr)) |
175 | continue; | 175 | continue; |
176 | 176 | ||
177 | pr_debug("clockdomain: adding %s sleepdep/wkdep for " | 177 | pr_debug("clockdomain: %s: adding %s sleepdep/wkdep\n", |
178 | "clkdm %s\n", autodep->clkdm.ptr->name, | 178 | clkdm->name, autodep->clkdm.ptr->name); |
179 | clkdm->name); | ||
180 | 179 | ||
181 | clkdm_add_sleepdep(clkdm, autodep->clkdm.ptr); | 180 | clkdm_add_sleepdep(clkdm, autodep->clkdm.ptr); |
182 | clkdm_add_wkdep(clkdm, autodep->clkdm.ptr); | 181 | clkdm_add_wkdep(clkdm, autodep->clkdm.ptr); |
@@ -205,9 +204,8 @@ void _clkdm_del_autodeps(struct clockdomain *clkdm) | |||
205 | if (IS_ERR(autodep->clkdm.ptr)) | 204 | if (IS_ERR(autodep->clkdm.ptr)) |
206 | continue; | 205 | continue; |
207 | 206 | ||
208 | pr_debug("clockdomain: removing %s sleepdep/wkdep for " | 207 | pr_debug("clockdomain: %s: removing %s sleepdep/wkdep\n", |
209 | "clkdm %s\n", autodep->clkdm.ptr->name, | 208 | clkdm->name, autodep->clkdm.ptr->name); |
210 | clkdm->name); | ||
211 | 209 | ||
212 | clkdm_del_sleepdep(clkdm, autodep->clkdm.ptr); | 210 | clkdm_del_sleepdep(clkdm, autodep->clkdm.ptr); |
213 | clkdm_del_wkdep(clkdm, autodep->clkdm.ptr); | 211 | clkdm_del_wkdep(clkdm, autodep->clkdm.ptr); |
@@ -469,14 +467,14 @@ int clkdm_add_wkdep(struct clockdomain *clkdm1, struct clockdomain *clkdm2) | |||
469 | ret = -EINVAL; | 467 | ret = -EINVAL; |
470 | 468 | ||
471 | if (ret) { | 469 | if (ret) { |
472 | pr_debug("clockdomain: hardware cannot set/clear wake up of " | 470 | pr_debug("clockdomain: hardware cannot set/clear wake up of %s when %s wakes up\n", |
473 | "%s when %s wakes up\n", clkdm1->name, clkdm2->name); | 471 | clkdm1->name, clkdm2->name); |
474 | return ret; | 472 | return ret; |
475 | } | 473 | } |
476 | 474 | ||
477 | if (atomic_inc_return(&cd->wkdep_usecount) == 1) { | 475 | if (atomic_inc_return(&cd->wkdep_usecount) == 1) { |
478 | pr_debug("clockdomain: hardware will wake up %s when %s wakes " | 476 | pr_debug("clockdomain: hardware will wake up %s when %s wakes up\n", |
479 | "up\n", clkdm1->name, clkdm2->name); | 477 | clkdm1->name, clkdm2->name); |
480 | 478 | ||
481 | ret = arch_clkdm->clkdm_add_wkdep(clkdm1, clkdm2); | 479 | ret = arch_clkdm->clkdm_add_wkdep(clkdm1, clkdm2); |
482 | } | 480 | } |
@@ -510,14 +508,14 @@ int clkdm_del_wkdep(struct clockdomain *clkdm1, struct clockdomain *clkdm2) | |||
510 | ret = -EINVAL; | 508 | ret = -EINVAL; |
511 | 509 | ||
512 | if (ret) { | 510 | if (ret) { |
513 | pr_debug("clockdomain: hardware cannot set/clear wake up of " | 511 | pr_debug("clockdomain: hardware cannot set/clear wake up of %s when %s wakes up\n", |
514 | "%s when %s wakes up\n", clkdm1->name, clkdm2->name); | 512 | clkdm1->name, clkdm2->name); |
515 | return ret; | 513 | return ret; |
516 | } | 514 | } |
517 | 515 | ||
518 | if (atomic_dec_return(&cd->wkdep_usecount) == 0) { | 516 | if (atomic_dec_return(&cd->wkdep_usecount) == 0) { |
519 | pr_debug("clockdomain: hardware will no longer wake up %s " | 517 | pr_debug("clockdomain: hardware will no longer wake up %s after %s wakes up\n", |
520 | "after %s wakes up\n", clkdm1->name, clkdm2->name); | 518 | clkdm1->name, clkdm2->name); |
521 | 519 | ||
522 | ret = arch_clkdm->clkdm_del_wkdep(clkdm1, clkdm2); | 520 | ret = arch_clkdm->clkdm_del_wkdep(clkdm1, clkdm2); |
523 | } | 521 | } |
@@ -555,8 +553,8 @@ int clkdm_read_wkdep(struct clockdomain *clkdm1, struct clockdomain *clkdm2) | |||
555 | ret = -EINVAL; | 553 | ret = -EINVAL; |
556 | 554 | ||
557 | if (ret) { | 555 | if (ret) { |
558 | pr_debug("clockdomain: hardware cannot set/clear wake up of " | 556 | pr_debug("clockdomain: hardware cannot set/clear wake up of %s when %s wakes up\n", |
559 | "%s when %s wakes up\n", clkdm1->name, clkdm2->name); | 557 | clkdm1->name, clkdm2->name); |
560 | return ret; | 558 | return ret; |
561 | } | 559 | } |
562 | 560 | ||
@@ -613,15 +611,14 @@ int clkdm_add_sleepdep(struct clockdomain *clkdm1, struct clockdomain *clkdm2) | |||
613 | ret = -EINVAL; | 611 | ret = -EINVAL; |
614 | 612 | ||
615 | if (ret) { | 613 | if (ret) { |
616 | pr_debug("clockdomain: hardware cannot set/clear sleep " | 614 | pr_debug("clockdomain: hardware cannot set/clear sleep dependency affecting %s from %s\n", |
617 | "dependency affecting %s from %s\n", clkdm1->name, | 615 | clkdm1->name, clkdm2->name); |
618 | clkdm2->name); | ||
619 | return ret; | 616 | return ret; |
620 | } | 617 | } |
621 | 618 | ||
622 | if (atomic_inc_return(&cd->sleepdep_usecount) == 1) { | 619 | if (atomic_inc_return(&cd->sleepdep_usecount) == 1) { |
623 | pr_debug("clockdomain: will prevent %s from sleeping if %s " | 620 | pr_debug("clockdomain: will prevent %s from sleeping if %s is active\n", |
624 | "is active\n", clkdm1->name, clkdm2->name); | 621 | clkdm1->name, clkdm2->name); |
625 | 622 | ||
626 | ret = arch_clkdm->clkdm_add_sleepdep(clkdm1, clkdm2); | 623 | ret = arch_clkdm->clkdm_add_sleepdep(clkdm1, clkdm2); |
627 | } | 624 | } |
@@ -657,16 +654,14 @@ int clkdm_del_sleepdep(struct clockdomain *clkdm1, struct clockdomain *clkdm2) | |||
657 | ret = -EINVAL; | 654 | ret = -EINVAL; |
658 | 655 | ||
659 | if (ret) { | 656 | if (ret) { |
660 | pr_debug("clockdomain: hardware cannot set/clear sleep " | 657 | pr_debug("clockdomain: hardware cannot set/clear sleep dependency affecting %s from %s\n", |
661 | "dependency affecting %s from %s\n", clkdm1->name, | 658 | clkdm1->name, clkdm2->name); |
662 | clkdm2->name); | ||
663 | return ret; | 659 | return ret; |
664 | } | 660 | } |
665 | 661 | ||
666 | if (atomic_dec_return(&cd->sleepdep_usecount) == 0) { | 662 | if (atomic_dec_return(&cd->sleepdep_usecount) == 0) { |
667 | pr_debug("clockdomain: will no longer prevent %s from " | 663 | pr_debug("clockdomain: will no longer prevent %s from sleeping if %s is active\n", |
668 | "sleeping if %s is active\n", clkdm1->name, | 664 | clkdm1->name, clkdm2->name); |
669 | clkdm2->name); | ||
670 | 665 | ||
671 | ret = arch_clkdm->clkdm_del_sleepdep(clkdm1, clkdm2); | 666 | ret = arch_clkdm->clkdm_del_sleepdep(clkdm1, clkdm2); |
672 | } | 667 | } |
@@ -706,9 +701,8 @@ int clkdm_read_sleepdep(struct clockdomain *clkdm1, struct clockdomain *clkdm2) | |||
706 | ret = -EINVAL; | 701 | ret = -EINVAL; |
707 | 702 | ||
708 | if (ret) { | 703 | if (ret) { |
709 | pr_debug("clockdomain: hardware cannot set/clear sleep " | 704 | pr_debug("clockdomain: hardware cannot set/clear sleep dependency affecting %s from %s\n", |
710 | "dependency affecting %s from %s\n", clkdm1->name, | 705 | clkdm1->name, clkdm2->name); |
711 | clkdm2->name); | ||
712 | return ret; | 706 | return ret; |
713 | } | 707 | } |
714 | 708 | ||
@@ -755,8 +749,8 @@ int clkdm_sleep(struct clockdomain *clkdm) | |||
755 | return -EINVAL; | 749 | return -EINVAL; |
756 | 750 | ||
757 | if (!(clkdm->flags & CLKDM_CAN_FORCE_SLEEP)) { | 751 | if (!(clkdm->flags & CLKDM_CAN_FORCE_SLEEP)) { |
758 | pr_debug("clockdomain: %s does not support forcing " | 752 | pr_debug("clockdomain: %s does not support forcing sleep via software\n", |
759 | "sleep via software\n", clkdm->name); | 753 | clkdm->name); |
760 | return -EINVAL; | 754 | return -EINVAL; |
761 | } | 755 | } |
762 | 756 | ||
@@ -790,8 +784,8 @@ int clkdm_wakeup(struct clockdomain *clkdm) | |||
790 | return -EINVAL; | 784 | return -EINVAL; |
791 | 785 | ||
792 | if (!(clkdm->flags & CLKDM_CAN_FORCE_WAKEUP)) { | 786 | if (!(clkdm->flags & CLKDM_CAN_FORCE_WAKEUP)) { |
793 | pr_debug("clockdomain: %s does not support forcing " | 787 | pr_debug("clockdomain: %s does not support forcing wakeup via software\n", |
794 | "wakeup via software\n", clkdm->name); | 788 | clkdm->name); |
795 | return -EINVAL; | 789 | return -EINVAL; |
796 | } | 790 | } |
797 | 791 | ||
@@ -826,8 +820,8 @@ void clkdm_allow_idle(struct clockdomain *clkdm) | |||
826 | return; | 820 | return; |
827 | 821 | ||
828 | if (!(clkdm->flags & CLKDM_CAN_ENABLE_AUTO)) { | 822 | if (!(clkdm->flags & CLKDM_CAN_ENABLE_AUTO)) { |
829 | pr_debug("clock: automatic idle transitions cannot be enabled " | 823 | pr_debug("clock: %s: automatic idle transitions cannot be enabled\n", |
830 | "on clockdomain %s\n", clkdm->name); | 824 | clkdm->name); |
831 | return; | 825 | return; |
832 | } | 826 | } |
833 | 827 | ||
@@ -861,8 +855,8 @@ void clkdm_deny_idle(struct clockdomain *clkdm) | |||
861 | return; | 855 | return; |
862 | 856 | ||
863 | if (!(clkdm->flags & CLKDM_CAN_DISABLE_AUTO)) { | 857 | if (!(clkdm->flags & CLKDM_CAN_DISABLE_AUTO)) { |
864 | pr_debug("clockdomain: automatic idle transitions cannot be " | 858 | pr_debug("clockdomain: %s: automatic idle transitions cannot be disabled\n", |
865 | "disabled on %s\n", clkdm->name); | 859 | clkdm->name); |
866 | return; | 860 | return; |
867 | } | 861 | } |
868 | 862 | ||
@@ -905,6 +899,23 @@ bool clkdm_in_hwsup(struct clockdomain *clkdm) | |||
905 | return ret; | 899 | return ret; |
906 | } | 900 | } |
907 | 901 | ||
902 | /** | ||
903 | * clkdm_missing_idle_reporting - can @clkdm enter autoidle even if in use? | ||
904 | * @clkdm: struct clockdomain * | ||
905 | * | ||
906 | * Returns true if clockdomain @clkdm has the | ||
907 | * CLKDM_MISSING_IDLE_REPORTING flag set, or false if not or @clkdm is | ||
908 | * null. More information is available in the documentation for the | ||
909 | * CLKDM_MISSING_IDLE_REPORTING macro. | ||
910 | */ | ||
911 | bool clkdm_missing_idle_reporting(struct clockdomain *clkdm) | ||
912 | { | ||
913 | if (!clkdm) | ||
914 | return false; | ||
915 | |||
916 | return (clkdm->flags & CLKDM_MISSING_IDLE_REPORTING) ? true : false; | ||
917 | } | ||
918 | |||
908 | /* Clockdomain-to-clock/hwmod framework interface code */ | 919 | /* Clockdomain-to-clock/hwmod framework interface code */ |
909 | 920 | ||
910 | static int _clkdm_clk_hwmod_enable(struct clockdomain *clkdm) | 921 | static int _clkdm_clk_hwmod_enable(struct clockdomain *clkdm) |
@@ -927,7 +938,7 @@ static int _clkdm_clk_hwmod_enable(struct clockdomain *clkdm) | |||
927 | pwrdm_state_switch(clkdm->pwrdm.ptr); | 938 | pwrdm_state_switch(clkdm->pwrdm.ptr); |
928 | spin_unlock_irqrestore(&clkdm->lock, flags); | 939 | spin_unlock_irqrestore(&clkdm->lock, flags); |
929 | 940 | ||
930 | pr_debug("clockdomain: clkdm %s: enabled\n", clkdm->name); | 941 | pr_debug("clockdomain: %s: enabled\n", clkdm->name); |
931 | 942 | ||
932 | return 0; | 943 | return 0; |
933 | } | 944 | } |
@@ -952,7 +963,7 @@ static int _clkdm_clk_hwmod_disable(struct clockdomain *clkdm) | |||
952 | pwrdm_state_switch(clkdm->pwrdm.ptr); | 963 | pwrdm_state_switch(clkdm->pwrdm.ptr); |
953 | spin_unlock_irqrestore(&clkdm->lock, flags); | 964 | spin_unlock_irqrestore(&clkdm->lock, flags); |
954 | 965 | ||
955 | pr_debug("clockdomain: clkdm %s: disabled\n", clkdm->name); | 966 | pr_debug("clockdomain: %s: disabled\n", clkdm->name); |
956 | 967 | ||
957 | return 0; | 968 | return 0; |
958 | } | 969 | } |