diff options
-rw-r--r-- | arch/arm/mach-omap2/Makefile | 2 | ||||
-rw-r--r-- | arch/arm/mach-omap2/io.c | 2 | ||||
-rw-r--r-- | arch/arm/mach-omap2/powerdomain.c | 112 |
3 files changed, 87 insertions, 29 deletions
diff --git a/arch/arm/mach-omap2/Makefile b/arch/arm/mach-omap2/Makefile index b32678b848bc..4a54e5afbac5 100644 --- a/arch/arm/mach-omap2/Makefile +++ b/arch/arm/mach-omap2/Makefile | |||
@@ -13,7 +13,7 @@ clock-common = clock.o clock_common_data.o clockdomain.o | |||
13 | obj-$(CONFIG_ARCH_OMAP2) += $(omap-2-3-common) $(prcm-common) $(clock-common) | 13 | obj-$(CONFIG_ARCH_OMAP2) += $(omap-2-3-common) $(prcm-common) $(clock-common) |
14 | obj-$(CONFIG_ARCH_OMAP3) += $(omap-2-3-common) $(prcm-common) $(clock-common) \ | 14 | obj-$(CONFIG_ARCH_OMAP3) += $(omap-2-3-common) $(prcm-common) $(clock-common) \ |
15 | $(omap-3-4-common) | 15 | $(omap-3-4-common) |
16 | obj-$(CONFIG_ARCH_OMAP4) += $(omap-3-4-common) prcm.o clock.o | 16 | obj-$(CONFIG_ARCH_OMAP4) += $(omap-3-4-common) $(prcm-common) clock.o |
17 | 17 | ||
18 | obj-$(CONFIG_OMAP_MCBSP) += mcbsp.o | 18 | obj-$(CONFIG_OMAP_MCBSP) += mcbsp.o |
19 | 19 | ||
diff --git a/arch/arm/mach-omap2/io.c b/arch/arm/mach-omap2/io.c index 5a7996402c53..aa237ff644d6 100644 --- a/arch/arm/mach-omap2/io.c +++ b/arch/arm/mach-omap2/io.c | |||
@@ -312,12 +312,12 @@ void __init omap2_init_common_hw(struct omap_sdrc_params *sdrc_cs0, | |||
312 | else if (cpu_is_omap34xx()) | 312 | else if (cpu_is_omap34xx()) |
313 | hwmods = omap34xx_hwmods; | 313 | hwmods = omap34xx_hwmods; |
314 | 314 | ||
315 | pwrdm_init(powerdomains_omap); | ||
315 | #ifndef CONFIG_ARCH_OMAP4 /* FIXME: Remove this once the clkdev is ready */ | 316 | #ifndef CONFIG_ARCH_OMAP4 /* FIXME: Remove this once the clkdev is ready */ |
316 | /* The OPP tables have to be registered before a clk init */ | 317 | /* The OPP tables have to be registered before a clk init */ |
317 | omap_hwmod_init(hwmods); | 318 | omap_hwmod_init(hwmods); |
318 | omap2_mux_init(); | 319 | omap2_mux_init(); |
319 | omap_pm_if_early_init(mpu_opps, dsp_opps, l3_opps); | 320 | omap_pm_if_early_init(mpu_opps, dsp_opps, l3_opps); |
320 | pwrdm_init(powerdomains_omap); | ||
321 | clkdm_init(clockdomains_omap, clkdm_pwrdm_autodeps); | 321 | clkdm_init(clockdomains_omap, clkdm_pwrdm_autodeps); |
322 | #endif | 322 | #endif |
323 | omap2_clk_init(); | 323 | omap2_clk_init(); |
diff --git a/arch/arm/mach-omap2/powerdomain.c b/arch/arm/mach-omap2/powerdomain.c index e503050dda06..c0de05097b5d 100644 --- a/arch/arm/mach-omap2/powerdomain.c +++ b/arch/arm/mach-omap2/powerdomain.c | |||
@@ -6,6 +6,8 @@ | |||
6 | * | 6 | * |
7 | * Written by Paul Walmsley | 7 | * Written by Paul Walmsley |
8 | * | 8 | * |
9 | * Added OMAP4 specific support by Abhijit Pagare <abhijitpagare@ti.com> | ||
10 | * | ||
9 | * This program is free software; you can redistribute it and/or modify | 11 | * This program is free software; you can redistribute it and/or modify |
10 | * it under the terms of the GNU General Public License version 2 as | 12 | * it under the terms of the GNU General Public License version 2 as |
11 | * published by the Free Software Foundation. | 13 | * published by the Free Software Foundation. |
@@ -26,8 +28,10 @@ | |||
26 | 28 | ||
27 | #include "cm.h" | 29 | #include "cm.h" |
28 | #include "cm-regbits-34xx.h" | 30 | #include "cm-regbits-34xx.h" |
31 | #include "cm-regbits-44xx.h" | ||
29 | #include "prm.h" | 32 | #include "prm.h" |
30 | #include "prm-regbits-34xx.h" | 33 | #include "prm-regbits-34xx.h" |
34 | #include "prm-regbits-44xx.h" | ||
31 | 35 | ||
32 | #include <plat/cpu.h> | 36 | #include <plat/cpu.h> |
33 | #include <plat/powerdomain.h> | 37 | #include <plat/powerdomain.h> |
@@ -40,6 +44,38 @@ enum { | |||
40 | PWRDM_STATE_PREV, | 44 | PWRDM_STATE_PREV, |
41 | }; | 45 | }; |
42 | 46 | ||
47 | /* Variable holding value of the CPU dependent PWRSTCTRL Register Offset */ | ||
48 | static u16 pwrstctrl_reg_offs; | ||
49 | |||
50 | /* Variable holding value of the CPU dependent PWRSTST Register Offset */ | ||
51 | static u16 pwrstst_reg_offs; | ||
52 | |||
53 | /* OMAP3 and OMAP4 specific register bit initialisations | ||
54 | * Notice that the names here are not according to each power | ||
55 | * domain but the bit mapping used applies to all of them | ||
56 | */ | ||
57 | |||
58 | /* OMAP3 and OMAP4 Memory Onstate Masks (common across all power domains) */ | ||
59 | #define OMAP_MEM0_ONSTATE_MASK OMAP3430_SHAREDL1CACHEFLATONSTATE_MASK | ||
60 | #define OMAP_MEM1_ONSTATE_MASK OMAP3430_L1FLATMEMONSTATE_MASK | ||
61 | #define OMAP_MEM2_ONSTATE_MASK OMAP3430_SHAREDL2CACHEFLATONSTATE_MASK | ||
62 | #define OMAP_MEM3_ONSTATE_MASK OMAP3430_L2FLATMEMONSTATE_MASK | ||
63 | #define OMAP_MEM4_ONSTATE_MASK OMAP4430_OCP_NRET_BANK_ONSTATE_MASK | ||
64 | |||
65 | /* OMAP3 and OMAP4 Memory Retstate Masks (common across all power domains) */ | ||
66 | #define OMAP_MEM0_RETSTATE_MASK OMAP3430_SHAREDL1CACHEFLATRETSTATE | ||
67 | #define OMAP_MEM1_RETSTATE_MASK OMAP3430_L1FLATMEMRETSTATE | ||
68 | #define OMAP_MEM2_RETSTATE_MASK OMAP3430_SHAREDL2CACHEFLATRETSTATE | ||
69 | #define OMAP_MEM3_RETSTATE_MASK OMAP3430_L2FLATMEMRETSTATE | ||
70 | #define OMAP_MEM4_RETSTATE_MASK OMAP4430_OCP_NRET_BANK_RETSTATE_MASK | ||
71 | |||
72 | /* OMAP3 and OMAP4 Memory Status bits */ | ||
73 | #define OMAP_MEM0_STATEST_MASK OMAP3430_SHAREDL1CACHEFLATSTATEST_MASK | ||
74 | #define OMAP_MEM1_STATEST_MASK OMAP3430_L1FLATMEMSTATEST_MASK | ||
75 | #define OMAP_MEM2_STATEST_MASK OMAP3430_SHAREDL2CACHEFLATSTATEST_MASK | ||
76 | #define OMAP_MEM3_STATEST_MASK OMAP3430_L2FLATMEMSTATEST_MASK | ||
77 | #define OMAP_MEM4_STATEST_MASK OMAP4430_OCP_NRET_BANK_STATEST_MASK | ||
78 | |||
43 | /* pwrdm_list contains all registered struct powerdomains */ | 79 | /* pwrdm_list contains all registered struct powerdomains */ |
44 | static LIST_HEAD(pwrdm_list); | 80 | static LIST_HEAD(pwrdm_list); |
45 | 81 | ||
@@ -181,6 +217,18 @@ void pwrdm_init(struct powerdomain **pwrdm_list) | |||
181 | { | 217 | { |
182 | struct powerdomain **p = NULL; | 218 | struct powerdomain **p = NULL; |
183 | 219 | ||
220 | if (cpu_is_omap24xx() | cpu_is_omap34xx()) { | ||
221 | pwrstctrl_reg_offs = OMAP2_PM_PWSTCTRL; | ||
222 | pwrstst_reg_offs = OMAP2_PM_PWSTST; | ||
223 | } else if (cpu_is_omap44xx()) { | ||
224 | pwrstctrl_reg_offs = OMAP4_PM_PWSTCTRL; | ||
225 | pwrstst_reg_offs = OMAP4_PM_PWSTST; | ||
226 | } else { | ||
227 | printk(KERN_ERR "Power Domain struct not supported for " \ | ||
228 | "this CPU\n"); | ||
229 | return; | ||
230 | } | ||
231 | |||
184 | if (pwrdm_list) { | 232 | if (pwrdm_list) { |
185 | for (p = pwrdm_list; *p; p++) { | 233 | for (p = pwrdm_list; *p; p++) { |
186 | pwrdm_register(*p); | 234 | pwrdm_register(*p); |
@@ -710,7 +758,7 @@ int pwrdm_set_next_pwrst(struct powerdomain *pwrdm, u8 pwrst) | |||
710 | 758 | ||
711 | prm_rmw_mod_reg_bits(OMAP_POWERSTATE_MASK, | 759 | prm_rmw_mod_reg_bits(OMAP_POWERSTATE_MASK, |
712 | (pwrst << OMAP_POWERSTATE_SHIFT), | 760 | (pwrst << OMAP_POWERSTATE_SHIFT), |
713 | pwrdm->prcm_offs, OMAP2_PM_PWSTCTRL); | 761 | pwrdm->prcm_offs, pwrstctrl_reg_offs); |
714 | 762 | ||
715 | return 0; | 763 | return 0; |
716 | } | 764 | } |
@@ -728,8 +776,8 @@ int pwrdm_read_next_pwrst(struct powerdomain *pwrdm) | |||
728 | if (!pwrdm) | 776 | if (!pwrdm) |
729 | return -EINVAL; | 777 | return -EINVAL; |
730 | 778 | ||
731 | return prm_read_mod_bits_shift(pwrdm->prcm_offs, OMAP2_PM_PWSTCTRL, | 779 | return prm_read_mod_bits_shift(pwrdm->prcm_offs, |
732 | OMAP_POWERSTATE_MASK); | 780 | pwrstctrl_reg_offs, OMAP_POWERSTATE_MASK); |
733 | } | 781 | } |
734 | 782 | ||
735 | /** | 783 | /** |
@@ -745,8 +793,8 @@ int pwrdm_read_pwrst(struct powerdomain *pwrdm) | |||
745 | if (!pwrdm) | 793 | if (!pwrdm) |
746 | return -EINVAL; | 794 | return -EINVAL; |
747 | 795 | ||
748 | return prm_read_mod_bits_shift(pwrdm->prcm_offs, OMAP2_PM_PWSTST, | 796 | return prm_read_mod_bits_shift(pwrdm->prcm_offs, |
749 | OMAP_POWERSTATEST_MASK); | 797 | pwrstst_reg_offs, OMAP_POWERSTATEST_MASK); |
750 | } | 798 | } |
751 | 799 | ||
752 | /** | 800 | /** |
@@ -796,7 +844,7 @@ int pwrdm_set_logic_retst(struct powerdomain *pwrdm, u8 pwrst) | |||
796 | */ | 844 | */ |
797 | prm_rmw_mod_reg_bits(OMAP3430_LOGICL1CACHERETSTATE, | 845 | prm_rmw_mod_reg_bits(OMAP3430_LOGICL1CACHERETSTATE, |
798 | (pwrst << __ffs(OMAP3430_LOGICL1CACHERETSTATE)), | 846 | (pwrst << __ffs(OMAP3430_LOGICL1CACHERETSTATE)), |
799 | pwrdm->prcm_offs, OMAP2_PM_PWSTCTRL); | 847 | pwrdm->prcm_offs, pwrstctrl_reg_offs); |
800 | 848 | ||
801 | return 0; | 849 | return 0; |
802 | } | 850 | } |
@@ -839,16 +887,19 @@ int pwrdm_set_mem_onst(struct powerdomain *pwrdm, u8 bank, u8 pwrst) | |||
839 | */ | 887 | */ |
840 | switch (bank) { | 888 | switch (bank) { |
841 | case 0: | 889 | case 0: |
842 | m = OMAP3430_SHAREDL1CACHEFLATONSTATE_MASK; | 890 | m = OMAP_MEM0_ONSTATE_MASK; |
843 | break; | 891 | break; |
844 | case 1: | 892 | case 1: |
845 | m = OMAP3430_L1FLATMEMONSTATE_MASK; | 893 | m = OMAP_MEM1_ONSTATE_MASK; |
846 | break; | 894 | break; |
847 | case 2: | 895 | case 2: |
848 | m = OMAP3430_SHAREDL2CACHEFLATONSTATE_MASK; | 896 | m = OMAP_MEM2_ONSTATE_MASK; |
849 | break; | 897 | break; |
850 | case 3: | 898 | case 3: |
851 | m = OMAP3430_L2FLATMEMONSTATE_MASK; | 899 | m = OMAP_MEM3_ONSTATE_MASK; |
900 | break; | ||
901 | case 4: | ||
902 | m = OMAP_MEM4_ONSTATE_MASK; | ||
852 | break; | 903 | break; |
853 | default: | 904 | default: |
854 | WARN_ON(1); /* should never happen */ | 905 | WARN_ON(1); /* should never happen */ |
@@ -856,7 +907,7 @@ int pwrdm_set_mem_onst(struct powerdomain *pwrdm, u8 bank, u8 pwrst) | |||
856 | } | 907 | } |
857 | 908 | ||
858 | prm_rmw_mod_reg_bits(m, (pwrst << __ffs(m)), | 909 | prm_rmw_mod_reg_bits(m, (pwrst << __ffs(m)), |
859 | pwrdm->prcm_offs, OMAP2_PM_PWSTCTRL); | 910 | pwrdm->prcm_offs, pwrstctrl_reg_offs); |
860 | 911 | ||
861 | return 0; | 912 | return 0; |
862 | } | 913 | } |
@@ -900,16 +951,19 @@ int pwrdm_set_mem_retst(struct powerdomain *pwrdm, u8 bank, u8 pwrst) | |||
900 | */ | 951 | */ |
901 | switch (bank) { | 952 | switch (bank) { |
902 | case 0: | 953 | case 0: |
903 | m = OMAP3430_SHAREDL1CACHEFLATRETSTATE; | 954 | m = OMAP_MEM0_RETSTATE_MASK; |
904 | break; | 955 | break; |
905 | case 1: | 956 | case 1: |
906 | m = OMAP3430_L1FLATMEMRETSTATE; | 957 | m = OMAP_MEM1_RETSTATE_MASK; |
907 | break; | 958 | break; |
908 | case 2: | 959 | case 2: |
909 | m = OMAP3430_SHAREDL2CACHEFLATRETSTATE; | 960 | m = OMAP_MEM2_RETSTATE_MASK; |
910 | break; | 961 | break; |
911 | case 3: | 962 | case 3: |
912 | m = OMAP3430_L2FLATMEMRETSTATE; | 963 | m = OMAP_MEM3_RETSTATE_MASK; |
964 | break; | ||
965 | case 4: | ||
966 | m = OMAP_MEM4_RETSTATE_MASK; | ||
913 | break; | 967 | break; |
914 | default: | 968 | default: |
915 | WARN_ON(1); /* should never happen */ | 969 | WARN_ON(1); /* should never happen */ |
@@ -917,7 +971,7 @@ int pwrdm_set_mem_retst(struct powerdomain *pwrdm, u8 bank, u8 pwrst) | |||
917 | } | 971 | } |
918 | 972 | ||
919 | prm_rmw_mod_reg_bits(m, (pwrst << __ffs(m)), pwrdm->prcm_offs, | 973 | prm_rmw_mod_reg_bits(m, (pwrst << __ffs(m)), pwrdm->prcm_offs, |
920 | OMAP2_PM_PWSTCTRL); | 974 | pwrstctrl_reg_offs); |
921 | 975 | ||
922 | return 0; | 976 | return 0; |
923 | } | 977 | } |
@@ -936,8 +990,8 @@ int pwrdm_read_logic_pwrst(struct powerdomain *pwrdm) | |||
936 | if (!pwrdm) | 990 | if (!pwrdm) |
937 | return -EINVAL; | 991 | return -EINVAL; |
938 | 992 | ||
939 | return prm_read_mod_bits_shift(pwrdm->prcm_offs, OMAP2_PM_PWSTST, | 993 | return prm_read_mod_bits_shift(pwrdm->prcm_offs, |
940 | OMAP3430_LOGICSTATEST); | 994 | pwrstst_reg_offs, OMAP3430_LOGICSTATEST); |
941 | } | 995 | } |
942 | 996 | ||
943 | /** | 997 | /** |
@@ -994,23 +1048,27 @@ int pwrdm_read_mem_pwrst(struct powerdomain *pwrdm, u8 bank) | |||
994 | */ | 1048 | */ |
995 | switch (bank) { | 1049 | switch (bank) { |
996 | case 0: | 1050 | case 0: |
997 | m = OMAP3430_SHAREDL1CACHEFLATSTATEST_MASK; | 1051 | m = OMAP_MEM0_STATEST_MASK; |
998 | break; | 1052 | break; |
999 | case 1: | 1053 | case 1: |
1000 | m = OMAP3430_L1FLATMEMSTATEST_MASK; | 1054 | m = OMAP_MEM1_STATEST_MASK; |
1001 | break; | 1055 | break; |
1002 | case 2: | 1056 | case 2: |
1003 | m = OMAP3430_SHAREDL2CACHEFLATSTATEST_MASK; | 1057 | m = OMAP_MEM2_STATEST_MASK; |
1004 | break; | 1058 | break; |
1005 | case 3: | 1059 | case 3: |
1006 | m = OMAP3430_L2FLATMEMSTATEST_MASK; | 1060 | m = OMAP_MEM3_STATEST_MASK; |
1061 | break; | ||
1062 | case 4: | ||
1063 | m = OMAP_MEM4_STATEST_MASK; | ||
1007 | break; | 1064 | break; |
1008 | default: | 1065 | default: |
1009 | WARN_ON(1); /* should never happen */ | 1066 | WARN_ON(1); /* should never happen */ |
1010 | return -EEXIST; | 1067 | return -EEXIST; |
1011 | } | 1068 | } |
1012 | 1069 | ||
1013 | return prm_read_mod_bits_shift(pwrdm->prcm_offs, OMAP2_PM_PWSTST, m); | 1070 | return prm_read_mod_bits_shift(pwrdm->prcm_offs, |
1071 | pwrstst_reg_offs, m); | ||
1014 | } | 1072 | } |
1015 | 1073 | ||
1016 | /** | 1074 | /** |
@@ -1114,7 +1172,7 @@ int pwrdm_enable_hdwr_sar(struct powerdomain *pwrdm) | |||
1114 | pwrdm->name); | 1172 | pwrdm->name); |
1115 | 1173 | ||
1116 | prm_rmw_mod_reg_bits(0, 1 << OMAP3430ES2_SAVEANDRESTORE_SHIFT, | 1174 | prm_rmw_mod_reg_bits(0, 1 << OMAP3430ES2_SAVEANDRESTORE_SHIFT, |
1117 | pwrdm->prcm_offs, OMAP2_PM_PWSTCTRL); | 1175 | pwrdm->prcm_offs, pwrstctrl_reg_offs); |
1118 | 1176 | ||
1119 | return 0; | 1177 | return 0; |
1120 | } | 1178 | } |
@@ -1142,7 +1200,7 @@ int pwrdm_disable_hdwr_sar(struct powerdomain *pwrdm) | |||
1142 | pwrdm->name); | 1200 | pwrdm->name); |
1143 | 1201 | ||
1144 | prm_rmw_mod_reg_bits(1 << OMAP3430ES2_SAVEANDRESTORE_SHIFT, 0, | 1202 | prm_rmw_mod_reg_bits(1 << OMAP3430ES2_SAVEANDRESTORE_SHIFT, 0, |
1145 | pwrdm->prcm_offs, OMAP2_PM_PWSTCTRL); | 1203 | pwrdm->prcm_offs, pwrstctrl_reg_offs); |
1146 | 1204 | ||
1147 | return 0; | 1205 | return 0; |
1148 | } | 1206 | } |
@@ -1183,10 +1241,10 @@ int pwrdm_wait_transition(struct powerdomain *pwrdm) | |||
1183 | */ | 1241 | */ |
1184 | 1242 | ||
1185 | /* XXX Is this udelay() value meaningful? */ | 1243 | /* XXX Is this udelay() value meaningful? */ |
1186 | while ((prm_read_mod_reg(pwrdm->prcm_offs, OMAP2_PM_PWSTST) & | 1244 | while ((prm_read_mod_reg(pwrdm->prcm_offs, pwrstst_reg_offs) & |
1187 | OMAP_INTRANSITION) && | 1245 | OMAP_INTRANSITION) && |
1188 | (c++ < PWRDM_TRANSITION_BAILOUT)) | 1246 | (c++ < PWRDM_TRANSITION_BAILOUT)) |
1189 | udelay(1); | 1247 | udelay(1); |
1190 | 1248 | ||
1191 | if (c > PWRDM_TRANSITION_BAILOUT) { | 1249 | if (c > PWRDM_TRANSITION_BAILOUT) { |
1192 | printk(KERN_ERR "powerdomain: waited too long for " | 1250 | printk(KERN_ERR "powerdomain: waited too long for " |