Commit 68b921ad7f35e0323ce0d9fe94e5701a112f257c
Committed by
Paul Walmsley
1 parent
4aef7a2a5a
Exists in
master
and in
4 other branches
OMAP: clockdomain: Arch specific funcs for sleep/wakeup of clkdm
Define the following architecture specific funtions for omap2/3/4 .clkdm_sleep .clkdm_wakeup Convert the platform-independent framework to call these functions. Also rename the api's by removing the omap2_ preamble. Hence call omap2_clkdm_wakeup as clkdm_wakeup and omap2_clkdm_sleep as clkdm_sleep. Signed-off-by: Rajendra Nayak <rnayak@ti.com> [paul@pwsan.com: fixed omap3_clkdm_clear_all_sleepdeps() and omap2_clkdm_clear_all_wkdeps() to test against the correct loop termination condition; thanks to Kevin Hilman for finding and helping fix] Cc: Kevin Hilman <khilman@ti.com> Signed-off-by: Paul Walmsley <paul@pwsan.com>
Showing 9 changed files with 96 additions and 58 deletions Side-by-side Diff
- arch/arm/mach-omap2/Makefile
- arch/arm/mach-omap2/clockdomain.c
- arch/arm/mach-omap2/clockdomain.h
- arch/arm/mach-omap2/clockdomain2xxx_3xxx.c
- arch/arm/mach-omap2/clockdomain44xx.c
- arch/arm/mach-omap2/clockdomains44xx_data.c
- arch/arm/mach-omap2/pm.c
- arch/arm/mach-omap2/pm24xx.c
- arch/arm/mach-omap2/pm34xx.c
arch/arm/mach-omap2/Makefile
arch/arm/mach-omap2/clockdomain.c
... | ... | @@ -355,7 +355,7 @@ |
355 | 355 | */ |
356 | 356 | list_for_each_entry(clkdm, &clkdm_list, node) { |
357 | 357 | if (clkdm->flags & CLKDM_CAN_FORCE_WAKEUP) |
358 | - omap2_clkdm_wakeup(clkdm); | |
358 | + clkdm_wakeup(clkdm); | |
359 | 359 | else if (clkdm->flags & CLKDM_CAN_DISABLE_AUTO) |
360 | 360 | omap2_clkdm_deny_idle(clkdm); |
361 | 361 | |
... | ... | @@ -765,7 +765,7 @@ |
765 | 765 | } |
766 | 766 | |
767 | 767 | /** |
768 | - * omap2_clkdm_sleep - force clockdomain sleep transition | |
768 | + * clkdm_sleep - force clockdomain sleep transition | |
769 | 769 | * @clkdm: struct clockdomain * |
770 | 770 | * |
771 | 771 | * Instruct the CM to force a sleep transition on the specified |
... | ... | @@ -773,7 +773,7 @@ |
773 | 773 | * clockdomain does not support software-initiated sleep; 0 upon |
774 | 774 | * success. |
775 | 775 | */ |
776 | -int omap2_clkdm_sleep(struct clockdomain *clkdm) | |
776 | +int clkdm_sleep(struct clockdomain *clkdm) | |
777 | 777 | { |
778 | 778 | if (!clkdm) |
779 | 779 | return -EINVAL; |
780 | 780 | |
781 | 781 | |
... | ... | @@ -784,33 +784,16 @@ |
784 | 784 | return -EINVAL; |
785 | 785 | } |
786 | 786 | |
787 | + if (!arch_clkdm || !arch_clkdm->clkdm_sleep) | |
788 | + return -EINVAL; | |
789 | + | |
787 | 790 | pr_debug("clockdomain: forcing sleep on %s\n", clkdm->name); |
788 | 791 | |
789 | - if (cpu_is_omap24xx()) { | |
790 | - | |
791 | - omap2_cm_set_mod_reg_bits(OMAP24XX_FORCESTATE_MASK, | |
792 | - clkdm->pwrdm.ptr->prcm_offs, OMAP2_PM_PWSTCTRL); | |
793 | - | |
794 | - } else if (cpu_is_omap34xx()) { | |
795 | - | |
796 | - omap3xxx_cm_clkdm_force_sleep(clkdm->pwrdm.ptr->prcm_offs, | |
797 | - clkdm->clktrctrl_mask); | |
798 | - | |
799 | - } else if (cpu_is_omap44xx()) { | |
800 | - | |
801 | - omap4_cminst_clkdm_force_sleep(clkdm->prcm_partition, | |
802 | - clkdm->cm_inst, | |
803 | - clkdm->clkdm_offs); | |
804 | - | |
805 | - } else { | |
806 | - BUG(); | |
807 | - }; | |
808 | - | |
809 | - return 0; | |
792 | + return arch_clkdm->clkdm_sleep(clkdm); | |
810 | 793 | } |
811 | 794 | |
812 | 795 | /** |
813 | - * omap2_clkdm_wakeup - force clockdomain wakeup transition | |
796 | + * clkdm_wakeup - force clockdomain wakeup transition | |
814 | 797 | * @clkdm: struct clockdomain * |
815 | 798 | * |
816 | 799 | * Instruct the CM to force a wakeup transition on the specified |
... | ... | @@ -818,7 +801,7 @@ |
818 | 801 | * clockdomain does not support software-controlled wakeup; 0 upon |
819 | 802 | * success. |
820 | 803 | */ |
821 | -int omap2_clkdm_wakeup(struct clockdomain *clkdm) | |
804 | +int clkdm_wakeup(struct clockdomain *clkdm) | |
822 | 805 | { |
823 | 806 | if (!clkdm) |
824 | 807 | return -EINVAL; |
825 | 808 | |
... | ... | @@ -829,29 +812,12 @@ |
829 | 812 | return -EINVAL; |
830 | 813 | } |
831 | 814 | |
815 | + if (!arch_clkdm || !arch_clkdm->clkdm_wakeup) | |
816 | + return -EINVAL; | |
817 | + | |
832 | 818 | pr_debug("clockdomain: forcing wakeup on %s\n", clkdm->name); |
833 | 819 | |
834 | - if (cpu_is_omap24xx()) { | |
835 | - | |
836 | - omap2_cm_clear_mod_reg_bits(OMAP24XX_FORCESTATE_MASK, | |
837 | - clkdm->pwrdm.ptr->prcm_offs, OMAP2_PM_PWSTCTRL); | |
838 | - | |
839 | - } else if (cpu_is_omap34xx()) { | |
840 | - | |
841 | - omap3xxx_cm_clkdm_force_wakeup(clkdm->pwrdm.ptr->prcm_offs, | |
842 | - clkdm->clktrctrl_mask); | |
843 | - | |
844 | - } else if (cpu_is_omap44xx()) { | |
845 | - | |
846 | - omap4_cminst_clkdm_force_wakeup(clkdm->prcm_partition, | |
847 | - clkdm->cm_inst, | |
848 | - clkdm->clkdm_offs); | |
849 | - | |
850 | - } else { | |
851 | - BUG(); | |
852 | - }; | |
853 | - | |
854 | - return 0; | |
820 | + return arch_clkdm->clkdm_wakeup(clkdm); | |
855 | 821 | } |
856 | 822 | |
857 | 823 | /** |
... | ... | @@ -990,7 +956,7 @@ |
990 | 956 | _clkdm_add_autodeps(clkdm); |
991 | 957 | _enable_hwsup(clkdm); |
992 | 958 | } else { |
993 | - omap2_clkdm_wakeup(clkdm); | |
959 | + clkdm_wakeup(clkdm); | |
994 | 960 | } |
995 | 961 | |
996 | 962 | pwrdm_wait_transition(clkdm->pwrdm.ptr); |
... | ... | @@ -1062,7 +1028,7 @@ |
1062 | 1028 | _clkdm_del_autodeps(clkdm); |
1063 | 1029 | _enable_hwsup(clkdm); |
1064 | 1030 | } else { |
1065 | - omap2_clkdm_sleep(clkdm); | |
1031 | + clkdm_sleep(clkdm); | |
1066 | 1032 | } |
1067 | 1033 | |
1068 | 1034 | pwrdm_clkdm_state_switch(clkdm); |
arch/arm/mach-omap2/clockdomain.h
... | ... | @@ -170,8 +170,8 @@ |
170 | 170 | void omap2_clkdm_allow_idle(struct clockdomain *clkdm); |
171 | 171 | void omap2_clkdm_deny_idle(struct clockdomain *clkdm); |
172 | 172 | |
173 | -int omap2_clkdm_wakeup(struct clockdomain *clkdm); | |
174 | -int omap2_clkdm_sleep(struct clockdomain *clkdm); | |
173 | +int clkdm_wakeup(struct clockdomain *clkdm); | |
174 | +int clkdm_sleep(struct clockdomain *clkdm); | |
175 | 175 | |
176 | 176 | int omap2_clkdm_clk_enable(struct clockdomain *clkdm, struct clk *clk); |
177 | 177 | int omap2_clkdm_clk_disable(struct clockdomain *clkdm, struct clk *clk); |
... | ... | @@ -182,6 +182,7 @@ |
182 | 182 | |
183 | 183 | extern struct clkdm_ops omap2_clkdm_operations; |
184 | 184 | extern struct clkdm_ops omap3_clkdm_operations; |
185 | +extern struct clkdm_ops omap4_clkdm_operations; | |
185 | 186 | |
186 | 187 | #endif |
arch/arm/mach-omap2/clockdomain2xxx_3xxx.c
... | ... | @@ -20,6 +20,7 @@ |
20 | 20 | #include "cm2xxx_3xxx.h" |
21 | 21 | #include "cm-regbits-24xx.h" |
22 | 22 | #include "cm-regbits-34xx.h" |
23 | +#include "prm-regbits-24xx.h" | |
23 | 24 | #include "clockdomain.h" |
24 | 25 | |
25 | 26 | static int omap2_clkdm_add_wkdep(struct clockdomain *clkdm1, |
26 | 27 | |
... | ... | @@ -111,11 +112,43 @@ |
111 | 112 | return 0; |
112 | 113 | } |
113 | 114 | |
115 | +static int omap2_clkdm_sleep(struct clockdomain *clkdm) | |
116 | +{ | |
117 | + omap2_cm_set_mod_reg_bits(OMAP24XX_FORCESTATE_MASK, | |
118 | + clkdm->pwrdm.ptr->prcm_offs, | |
119 | + OMAP2_PM_PWSTCTRL); | |
120 | + return 0; | |
121 | +} | |
122 | + | |
123 | +static int omap2_clkdm_wakeup(struct clockdomain *clkdm) | |
124 | +{ | |
125 | + omap2_cm_clear_mod_reg_bits(OMAP24XX_FORCESTATE_MASK, | |
126 | + clkdm->pwrdm.ptr->prcm_offs, | |
127 | + OMAP2_PM_PWSTCTRL); | |
128 | + return 0; | |
129 | +} | |
130 | + | |
131 | +static int omap3_clkdm_sleep(struct clockdomain *clkdm) | |
132 | +{ | |
133 | + omap3xxx_cm_clkdm_force_sleep(clkdm->pwrdm.ptr->prcm_offs, | |
134 | + clkdm->clktrctrl_mask); | |
135 | + return 0; | |
136 | +} | |
137 | + | |
138 | +static int omap3_clkdm_wakeup(struct clockdomain *clkdm) | |
139 | +{ | |
140 | + omap3xxx_cm_clkdm_force_wakeup(clkdm->pwrdm.ptr->prcm_offs, | |
141 | + clkdm->clktrctrl_mask); | |
142 | + return 0; | |
143 | +} | |
144 | + | |
114 | 145 | struct clkdm_ops omap2_clkdm_operations = { |
115 | 146 | .clkdm_add_wkdep = omap2_clkdm_add_wkdep, |
116 | 147 | .clkdm_del_wkdep = omap2_clkdm_del_wkdep, |
117 | 148 | .clkdm_read_wkdep = omap2_clkdm_read_wkdep, |
118 | 149 | .clkdm_clear_all_wkdeps = omap2_clkdm_clear_all_wkdeps, |
150 | + .clkdm_sleep = omap2_clkdm_sleep, | |
151 | + .clkdm_wakeup = omap2_clkdm_wakeup, | |
119 | 152 | }; |
120 | 153 | |
121 | 154 | struct clkdm_ops omap3_clkdm_operations = { |
... | ... | @@ -127,5 +160,7 @@ |
127 | 160 | .clkdm_del_sleepdep = omap3_clkdm_del_sleepdep, |
128 | 161 | .clkdm_read_sleepdep = omap3_clkdm_read_sleepdep, |
129 | 162 | .clkdm_clear_all_sleepdeps = omap3_clkdm_clear_all_sleepdeps, |
163 | + .clkdm_sleep = omap3_clkdm_sleep, | |
164 | + .clkdm_wakeup = omap3_clkdm_wakeup, | |
130 | 165 | }; |
arch/arm/mach-omap2/clockdomain44xx.c
1 | +/* | |
2 | + * OMAP4 clockdomain control | |
3 | + * | |
4 | + * Copyright (C) 2008-2010 Texas Instruments, Inc. | |
5 | + * Copyright (C) 2008-2010 Nokia Corporation | |
6 | + * | |
7 | + * Derived from mach-omap2/clockdomain.c written by Paul Walmsley | |
8 | + * Rajendra Nayak <rnayak@ti.com> | |
9 | + * | |
10 | + * This program is free software; you can redistribute it and/or modify | |
11 | + * it under the terms of the GNU General Public License version 2 as | |
12 | + * published by the Free Software Foundation. | |
13 | + */ | |
14 | + | |
15 | +#include "clockdomain.h" | |
16 | +#include "cminst44xx.h" | |
17 | + | |
18 | +static int omap4_clkdm_sleep(struct clockdomain *clkdm) | |
19 | +{ | |
20 | + omap4_cminst_clkdm_force_sleep(clkdm->prcm_partition, | |
21 | + clkdm->cm_inst, clkdm->clkdm_offs); | |
22 | + return 0; | |
23 | +} | |
24 | + | |
25 | +static int omap4_clkdm_wakeup(struct clockdomain *clkdm) | |
26 | +{ | |
27 | + omap4_cminst_clkdm_force_wakeup(clkdm->prcm_partition, | |
28 | + clkdm->cm_inst, clkdm->clkdm_offs); | |
29 | + return 0; | |
30 | +} | |
31 | + | |
32 | +struct clkdm_ops omap4_clkdm_operations = { | |
33 | + .clkdm_sleep = omap4_clkdm_sleep, | |
34 | + .clkdm_wakeup = omap4_clkdm_wakeup, | |
35 | +}; |
arch/arm/mach-omap2/clockdomains44xx_data.c
arch/arm/mach-omap2/pm.c
... | ... | @@ -124,7 +124,7 @@ |
124 | 124 | (pwrdm->flags & PWRDM_HAS_LOWPOWERSTATECHANGE)) { |
125 | 125 | sleep_switch = LOWPOWERSTATE_SWITCH; |
126 | 126 | } else { |
127 | - omap2_clkdm_wakeup(pwrdm->pwrdm_clkdms[0]); | |
127 | + clkdm_wakeup(pwrdm->pwrdm_clkdms[0]); | |
128 | 128 | pwrdm_wait_transition(pwrdm); |
129 | 129 | sleep_switch = FORCEWAKEUP_SWITCH; |
130 | 130 | } |
... | ... | @@ -142,7 +142,7 @@ |
142 | 142 | if (pwrdm->pwrdm_clkdms[0]->flags & CLKDM_CAN_ENABLE_AUTO) |
143 | 143 | omap2_clkdm_allow_idle(pwrdm->pwrdm_clkdms[0]); |
144 | 144 | else |
145 | - omap2_clkdm_sleep(pwrdm->pwrdm_clkdms[0]); | |
145 | + clkdm_sleep(pwrdm->pwrdm_clkdms[0]); | |
146 | 146 | break; |
147 | 147 | case LOWPOWERSTATE_SWITCH: |
148 | 148 | pwrdm_set_lowpwrstchange(pwrdm); |
arch/arm/mach-omap2/pm24xx.c
... | ... | @@ -370,7 +370,7 @@ |
370 | 370 | omap2_clkdm_allow_idle(clkdm); |
371 | 371 | else if (clkdm->flags & CLKDM_CAN_FORCE_SLEEP && |
372 | 372 | atomic_read(&clkdm->usecount) == 0) |
373 | - omap2_clkdm_sleep(clkdm); | |
373 | + clkdm_sleep(clkdm); | |
374 | 374 | return 0; |
375 | 375 | } |
376 | 376 | |
377 | 377 | |
... | ... | @@ -405,11 +405,11 @@ |
405 | 405 | |
406 | 406 | pwrdm = clkdm_get_pwrdm(dsp_clkdm); |
407 | 407 | pwrdm_set_next_pwrst(pwrdm, PWRDM_POWER_OFF); |
408 | - omap2_clkdm_sleep(dsp_clkdm); | |
408 | + clkdm_sleep(dsp_clkdm); | |
409 | 409 | |
410 | 410 | pwrdm = clkdm_get_pwrdm(gfx_clkdm); |
411 | 411 | pwrdm_set_next_pwrst(pwrdm, PWRDM_POWER_OFF); |
412 | - omap2_clkdm_sleep(gfx_clkdm); | |
412 | + clkdm_sleep(gfx_clkdm); | |
413 | 413 | |
414 | 414 | /* |
415 | 415 | * Clear clockdomain wakeup dependencies and enable |
arch/arm/mach-omap2/pm34xx.c