diff options
author | Thara Gopinath <thara@ti.com> | 2010-12-10 12:45:23 -0500 |
---|---|---|
committer | Kevin Hilman <khilman@deeprootsystems.com> | 2010-12-22 17:31:47 -0500 |
commit | bd38107b565a41d994aa22db0962ffcc34ebef02 (patch) | |
tree | a0cba450e77d2761904547ab2b6e5ad11d2464d8 /arch | |
parent | 7bc3ed9ae632b9c94d3721d555d3452e24ca8ee3 (diff) |
OMAP4: Adding voltage driver support
OMAP4 has three scalable voltage domains vdd_mpu, vdd_iva
and vdd_core. This patch adds the voltage tables and other
configurable voltage processor and voltage controller
settings to control these three scalable domains in OMAP4.
Signed-off-by: Thara Gopinath <thara@ti.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
Diffstat (limited to 'arch')
-rw-r--r-- | arch/arm/mach-omap2/Makefile | 2 | ||||
-rw-r--r-- | arch/arm/mach-omap2/control.h | 12 | ||||
-rw-r--r-- | arch/arm/mach-omap2/voltage.c | 279 | ||||
-rw-r--r-- | arch/arm/plat-omap/include/plat/voltage.h | 12 |
4 files changed, 304 insertions, 1 deletions
diff --git a/arch/arm/mach-omap2/Makefile b/arch/arm/mach-omap2/Makefile index c6efd25fe03c..4ab82f6f15b1 100644 --- a/arch/arm/mach-omap2/Makefile +++ b/arch/arm/mach-omap2/Makefile | |||
@@ -62,7 +62,7 @@ obj-$(CONFIG_ARCH_OMAP2) += pm24xx.o | |||
62 | obj-$(CONFIG_ARCH_OMAP2) += sleep24xx.o pm_bus.o voltage.o | 62 | obj-$(CONFIG_ARCH_OMAP2) += sleep24xx.o pm_bus.o voltage.o |
63 | obj-$(CONFIG_ARCH_OMAP3) += pm34xx.o sleep34xx.o voltage.o \ | 63 | obj-$(CONFIG_ARCH_OMAP3) += pm34xx.o sleep34xx.o voltage.o \ |
64 | cpuidle34xx.o pm_bus.o | 64 | cpuidle34xx.o pm_bus.o |
65 | obj-$(CONFIG_ARCH_OMAP4) += pm44xx.o pm_bus.o | 65 | obj-$(CONFIG_ARCH_OMAP4) += pm44xx.o voltage.o pm_bus.o |
66 | obj-$(CONFIG_PM_DEBUG) += pm-debug.o | 66 | obj-$(CONFIG_PM_DEBUG) += pm-debug.o |
67 | obj-$(CONFIG_OMAP_SMARTREFLEX) += sr_device.o smartreflex.o | 67 | obj-$(CONFIG_OMAP_SMARTREFLEX) += sr_device.o smartreflex.o |
68 | obj-$(CONFIG_OMAP_SMARTREFLEX_CLASS3) += smartreflex-class3.o | 68 | obj-$(CONFIG_OMAP_SMARTREFLEX_CLASS3) += smartreflex-class3.o |
diff --git a/arch/arm/mach-omap2/control.h b/arch/arm/mach-omap2/control.h index b3df5c3300a9..b32cf4e341d4 100644 --- a/arch/arm/mach-omap2/control.h +++ b/arch/arm/mach-omap2/control.h | |||
@@ -181,6 +181,18 @@ | |||
181 | #define OMAP3630_CONTROL_FUSE_OPP50_VDD2 (OMAP2_CONTROL_GENERAL + 0x0128) | 181 | #define OMAP3630_CONTROL_FUSE_OPP50_VDD2 (OMAP2_CONTROL_GENERAL + 0x0128) |
182 | #define OMAP3630_CONTROL_FUSE_OPP100_VDD2 (OMAP2_CONTROL_GENERAL + 0x012C) | 182 | #define OMAP3630_CONTROL_FUSE_OPP100_VDD2 (OMAP2_CONTROL_GENERAL + 0x012C) |
183 | 183 | ||
184 | /* OMAP44xx control efuse offsets */ | ||
185 | #define OMAP44XX_CONTROL_FUSE_IVA_OPP50 0x22C | ||
186 | #define OMAP44XX_CONTROL_FUSE_IVA_OPP100 0x22F | ||
187 | #define OMAP44XX_CONTROL_FUSE_IVA_OPPTURBO 0x232 | ||
188 | #define OMAP44XX_CONTROL_FUSE_IVA_OPPNITRO 0x235 | ||
189 | #define OMAP44XX_CONTROL_FUSE_MPU_OPP50 0x240 | ||
190 | #define OMAP44XX_CONTROL_FUSE_MPU_OPP100 0x243 | ||
191 | #define OMAP44XX_CONTROL_FUSE_MPU_OPPTURBO 0x246 | ||
192 | #define OMAP44XX_CONTROL_FUSE_MPU_OPPNITRO 0x249 | ||
193 | #define OMAP44XX_CONTROL_FUSE_CORE_OPP50 0x254 | ||
194 | #define OMAP44XX_CONTROL_FUSE_CORE_OPP100 0x257 | ||
195 | |||
184 | /* AM35XX only CONTROL_GENERAL register offsets */ | 196 | /* AM35XX only CONTROL_GENERAL register offsets */ |
185 | #define AM35XX_CONTROL_MSUSPENDMUX_6 (OMAP2_CONTROL_GENERAL + 0x0038) | 197 | #define AM35XX_CONTROL_MSUSPENDMUX_6 (OMAP2_CONTROL_GENERAL + 0x0038) |
186 | #define AM35XX_CONTROL_DEVCONF2 (OMAP2_CONTROL_GENERAL + 0x0310) | 198 | #define AM35XX_CONTROL_DEVCONF2 (OMAP2_CONTROL_GENERAL + 0x0310) |
diff --git a/arch/arm/mach-omap2/voltage.c b/arch/arm/mach-omap2/voltage.c index b27fa4f241fd..ed6079c94c57 100644 --- a/arch/arm/mach-omap2/voltage.c +++ b/arch/arm/mach-omap2/voltage.c | |||
@@ -29,6 +29,10 @@ | |||
29 | #include <plat/voltage.h> | 29 | #include <plat/voltage.h> |
30 | 30 | ||
31 | #include "prm-regbits-34xx.h" | 31 | #include "prm-regbits-34xx.h" |
32 | #include "prm-regbits-44xx.h" | ||
33 | #include "prm44xx.h" | ||
34 | #include "prcm44xx.h" | ||
35 | #include "prminst44xx.h" | ||
32 | #include "control.h" | 36 | #include "control.h" |
33 | 37 | ||
34 | #define VP_IDLE_TIMEOUT 200 | 38 | #define VP_IDLE_TIMEOUT 200 |
@@ -190,6 +194,51 @@ static struct omap_vdd_info omap3_vdd_info[] = { | |||
190 | 194 | ||
191 | #define OMAP3_NR_SCALABLE_VDD ARRAY_SIZE(omap3_vdd_info) | 195 | #define OMAP3_NR_SCALABLE_VDD ARRAY_SIZE(omap3_vdd_info) |
192 | 196 | ||
197 | /* OMAP4 VDD sturctures */ | ||
198 | static struct omap_vdd_info omap4_vdd_info[] = { | ||
199 | { | ||
200 | .vp_offs = { | ||
201 | .vpconfig = OMAP4_PRM_VP_MPU_CONFIG_OFFSET, | ||
202 | .vstepmin = OMAP4_PRM_VP_MPU_VSTEPMIN_OFFSET, | ||
203 | .vstepmax = OMAP4_PRM_VP_MPU_VSTEPMAX_OFFSET, | ||
204 | .vlimitto = OMAP4_PRM_VP_MPU_VLIMITTO_OFFSET, | ||
205 | .vstatus = OMAP4_PRM_VP_MPU_STATUS_OFFSET, | ||
206 | .voltage = OMAP4_PRM_VP_MPU_VOLTAGE_OFFSET, | ||
207 | }, | ||
208 | .voltdm = { | ||
209 | .name = "mpu", | ||
210 | }, | ||
211 | }, | ||
212 | { | ||
213 | .vp_offs = { | ||
214 | .vpconfig = OMAP4_PRM_VP_IVA_CONFIG_OFFSET, | ||
215 | .vstepmin = OMAP4_PRM_VP_IVA_VSTEPMIN_OFFSET, | ||
216 | .vstepmax = OMAP4_PRM_VP_IVA_VSTEPMAX_OFFSET, | ||
217 | .vlimitto = OMAP4_PRM_VP_IVA_VLIMITTO_OFFSET, | ||
218 | .vstatus = OMAP4_PRM_VP_IVA_STATUS_OFFSET, | ||
219 | .voltage = OMAP4_PRM_VP_IVA_VOLTAGE_OFFSET, | ||
220 | }, | ||
221 | .voltdm = { | ||
222 | .name = "iva", | ||
223 | }, | ||
224 | }, | ||
225 | { | ||
226 | .vp_offs = { | ||
227 | .vpconfig = OMAP4_PRM_VP_CORE_CONFIG_OFFSET, | ||
228 | .vstepmin = OMAP4_PRM_VP_CORE_VSTEPMIN_OFFSET, | ||
229 | .vstepmax = OMAP4_PRM_VP_CORE_VSTEPMAX_OFFSET, | ||
230 | .vlimitto = OMAP4_PRM_VP_CORE_VLIMITTO_OFFSET, | ||
231 | .vstatus = OMAP4_PRM_VP_CORE_STATUS_OFFSET, | ||
232 | .voltage = OMAP4_PRM_VP_CORE_VOLTAGE_OFFSET, | ||
233 | }, | ||
234 | .voltdm = { | ||
235 | .name = "core", | ||
236 | }, | ||
237 | }, | ||
238 | }; | ||
239 | |||
240 | #define OMAP4_NR_SCALABLE_VDD ARRAY_SIZE(omap4_vdd_info) | ||
241 | |||
193 | /* | 242 | /* |
194 | * Structures containing OMAP3430/OMAP3630 voltage supported and various | 243 | * Structures containing OMAP3430/OMAP3630 voltage supported and various |
195 | * voltage dependent data for each VDD. | 244 | * voltage dependent data for each VDD. |
@@ -234,6 +283,31 @@ static struct omap_volt_data omap36xx_vddcore_volt_data[] = { | |||
234 | VOLT_DATA_DEFINE(0, 0, 0, 0), | 283 | VOLT_DATA_DEFINE(0, 0, 0, 0), |
235 | }; | 284 | }; |
236 | 285 | ||
286 | /* | ||
287 | * Structures containing OMAP4430 voltage supported and various | ||
288 | * voltage dependent data for each VDD. | ||
289 | */ | ||
290 | static struct omap_volt_data omap44xx_vdd_mpu_volt_data[] = { | ||
291 | VOLT_DATA_DEFINE(OMAP4430_VDD_MPU_OPP50_UV, OMAP44XX_CONTROL_FUSE_MPU_OPP50, 0xf4, 0x0c), | ||
292 | VOLT_DATA_DEFINE(OMAP4430_VDD_MPU_OPP100_UV, OMAP44XX_CONTROL_FUSE_MPU_OPP100, 0xf9, 0x16), | ||
293 | VOLT_DATA_DEFINE(OMAP4430_VDD_MPU_OPPTURBO_UV, OMAP44XX_CONTROL_FUSE_MPU_OPPTURBO, 0xfa, 0x23), | ||
294 | VOLT_DATA_DEFINE(OMAP4430_VDD_MPU_OPPNITRO_UV, OMAP44XX_CONTROL_FUSE_MPU_OPPNITRO, 0xfa, 0x27), | ||
295 | VOLT_DATA_DEFINE(0, 0, 0, 0), | ||
296 | }; | ||
297 | |||
298 | static struct omap_volt_data omap44xx_vdd_iva_volt_data[] = { | ||
299 | VOLT_DATA_DEFINE(OMAP4430_VDD_IVA_OPP50_UV, OMAP44XX_CONTROL_FUSE_IVA_OPP50, 0xf4, 0x0c), | ||
300 | VOLT_DATA_DEFINE(OMAP4430_VDD_IVA_OPP100_UV, OMAP44XX_CONTROL_FUSE_IVA_OPP100, 0xf9, 0x16), | ||
301 | VOLT_DATA_DEFINE(OMAP4430_VDD_IVA_OPPTURBO_UV, OMAP44XX_CONTROL_FUSE_IVA_OPPTURBO, 0xfa, 0x23), | ||
302 | VOLT_DATA_DEFINE(0, 0, 0, 0), | ||
303 | }; | ||
304 | |||
305 | static struct omap_volt_data omap44xx_vdd_core_volt_data[] = { | ||
306 | VOLT_DATA_DEFINE(OMAP4430_VDD_CORE_OPP50_UV, OMAP44XX_CONTROL_FUSE_CORE_OPP50, 0xf4, 0x0c), | ||
307 | VOLT_DATA_DEFINE(OMAP4430_VDD_CORE_OPP100_UV, OMAP44XX_CONTROL_FUSE_CORE_OPP100, 0xf9, 0x16), | ||
308 | VOLT_DATA_DEFINE(0, 0, 0, 0), | ||
309 | }; | ||
310 | |||
237 | static struct dentry *voltage_dir; | 311 | static struct dentry *voltage_dir; |
238 | 312 | ||
239 | /* Init function pointers */ | 313 | /* Init function pointers */ |
@@ -250,6 +324,17 @@ static void omap3_voltage_write_reg(u32 val, u16 mod, u8 offset) | |||
250 | omap2_prm_write_mod_reg(val, mod, offset); | 324 | omap2_prm_write_mod_reg(val, mod, offset); |
251 | } | 325 | } |
252 | 326 | ||
327 | static u32 omap4_voltage_read_reg(u16 mod, u8 offset) | ||
328 | { | ||
329 | return omap4_prminst_read_inst_reg(OMAP4430_PRM_PARTITION, | ||
330 | mod, offset); | ||
331 | } | ||
332 | |||
333 | static void omap4_voltage_write_reg(u32 val, u16 mod, u8 offset) | ||
334 | { | ||
335 | omap4_prminst_write_inst_reg(val, OMAP4430_PRM_PARTITION, mod, offset); | ||
336 | } | ||
337 | |||
253 | /* Voltage debugfs support */ | 338 | /* Voltage debugfs support */ |
254 | static int vp_volt_debug_get(void *data, u64 *val) | 339 | static int vp_volt_debug_get(void *data, u64 *val) |
255 | { | 340 | { |
@@ -841,6 +926,195 @@ static int __init omap3_vdd_data_configure(struct omap_vdd_info *vdd) | |||
841 | return 0; | 926 | return 0; |
842 | } | 927 | } |
843 | 928 | ||
929 | /* OMAP4 specific voltage init functions */ | ||
930 | static void __init omap4_vc_init(struct omap_vdd_info *vdd) | ||
931 | { | ||
932 | u32 vc_val; | ||
933 | u16 mod; | ||
934 | static bool is_initialized; | ||
935 | |||
936 | if (!vdd->pmic_info || !vdd->pmic_info->uv_to_vsel) { | ||
937 | pr_err("%s: PMIC info requried to configure vc for" | ||
938 | "vdd_%s not populated.Hence cannot initialize vc\n", | ||
939 | __func__, vdd->voltdm.name); | ||
940 | return; | ||
941 | } | ||
942 | |||
943 | if (!vdd->read_reg || !vdd->write_reg) { | ||
944 | pr_err("%s: No read/write API for accessing vdd_%s regs\n", | ||
945 | __func__, vdd->voltdm.name); | ||
946 | return; | ||
947 | } | ||
948 | |||
949 | mod = vdd->vc_reg.prm_mod; | ||
950 | |||
951 | /* Set up the SMPS_SA(i2c slave address in VC */ | ||
952 | vc_val = vdd->read_reg(mod, vdd->vc_reg.smps_sa_reg); | ||
953 | vc_val &= ~vdd->vc_reg.smps_sa_mask; | ||
954 | vc_val |= vdd->pmic_info->i2c_slave_addr << vdd->vc_reg.smps_sa_shift; | ||
955 | vdd->write_reg(vc_val, mod, vdd->vc_reg.smps_sa_reg); | ||
956 | |||
957 | /* Setup the VOLRA(pmic reg addr) in VC */ | ||
958 | vc_val = vdd->read_reg(mod, vdd->vc_reg.smps_volra_reg); | ||
959 | vc_val &= ~vdd->vc_reg.smps_volra_mask; | ||
960 | vc_val |= vdd->pmic_info->pmic_reg << vdd->vc_reg.smps_volra_shift; | ||
961 | vdd->write_reg(vc_val, mod, vdd->vc_reg.smps_volra_reg); | ||
962 | |||
963 | /* TODO: Configure setup times and CMD_VAL values*/ | ||
964 | |||
965 | if (is_initialized) | ||
966 | return; | ||
967 | |||
968 | /* Generic VC parameters init */ | ||
969 | vc_val = (OMAP4430_RAV_VDD_MPU_L_MASK | OMAP4430_CMD_VDD_MPU_L_MASK | | ||
970 | OMAP4430_RAV_VDD_IVA_L_MASK | OMAP4430_CMD_VDD_IVA_L_MASK | | ||
971 | OMAP4430_RAV_VDD_CORE_L_MASK | OMAP4430_CMD_VDD_CORE_L_MASK); | ||
972 | vdd->write_reg(vc_val, mod, OMAP4_PRM_VC_CFG_CHANNEL_OFFSET); | ||
973 | |||
974 | vc_val = (0x60 << OMAP4430_SCLL_SHIFT | 0x26 << OMAP4430_SCLH_SHIFT); | ||
975 | vdd->write_reg(vc_val, mod, OMAP4_PRM_VC_CFG_I2C_CLK_OFFSET); | ||
976 | |||
977 | is_initialized = true; | ||
978 | } | ||
979 | |||
980 | /* Sets up all the VDD related info for OMAP4 */ | ||
981 | static int __init omap4_vdd_data_configure(struct omap_vdd_info *vdd) | ||
982 | { | ||
983 | struct clk *sys_ck; | ||
984 | u32 sys_clk_speed, timeout_val, waittime; | ||
985 | |||
986 | if (!vdd->pmic_info) { | ||
987 | pr_err("%s: PMIC info requried to configure vdd_%s not" | ||
988 | "populated.Hence cannot initialize vdd_%s\n", | ||
989 | __func__, vdd->voltdm.name, vdd->voltdm.name); | ||
990 | return -EINVAL; | ||
991 | } | ||
992 | |||
993 | if (!strcmp(vdd->voltdm.name, "mpu")) { | ||
994 | vdd->volt_data = omap44xx_vdd_mpu_volt_data; | ||
995 | vdd->vp_reg.tranxdone_status = | ||
996 | OMAP4430_VP_MPU_TRANXDONE_ST_MASK; | ||
997 | vdd->vc_reg.cmdval_reg = OMAP4_PRM_VC_VAL_CMD_VDD_MPU_L_OFFSET; | ||
998 | vdd->vc_reg.smps_sa_shift = | ||
999 | OMAP4430_SA_VDD_MPU_L_PRM_VC_SMPS_SA_SHIFT; | ||
1000 | vdd->vc_reg.smps_sa_mask = | ||
1001 | OMAP4430_SA_VDD_MPU_L_PRM_VC_SMPS_SA_MASK; | ||
1002 | vdd->vc_reg.smps_volra_shift = OMAP4430_VOLRA_VDD_MPU_L_SHIFT; | ||
1003 | vdd->vc_reg.smps_volra_mask = OMAP4430_VOLRA_VDD_MPU_L_MASK; | ||
1004 | vdd->vc_reg.voltsetup_reg = | ||
1005 | OMAP4_PRM_VOLTSETUP_MPU_RET_SLEEP_OFFSET; | ||
1006 | vdd->prm_irqst_reg = OMAP4_PRM_IRQSTATUS_MPU_2_OFFSET; | ||
1007 | } else if (!strcmp(vdd->voltdm.name, "core")) { | ||
1008 | vdd->volt_data = omap44xx_vdd_core_volt_data; | ||
1009 | vdd->vp_reg.tranxdone_status = | ||
1010 | OMAP4430_VP_CORE_TRANXDONE_ST_MASK; | ||
1011 | vdd->vc_reg.cmdval_reg = | ||
1012 | OMAP4_PRM_VC_VAL_CMD_VDD_CORE_L_OFFSET; | ||
1013 | vdd->vc_reg.smps_sa_shift = OMAP4430_SA_VDD_CORE_L_0_6_SHIFT; | ||
1014 | vdd->vc_reg.smps_sa_mask = OMAP4430_SA_VDD_CORE_L_0_6_MASK; | ||
1015 | vdd->vc_reg.smps_volra_shift = OMAP4430_VOLRA_VDD_CORE_L_SHIFT; | ||
1016 | vdd->vc_reg.smps_volra_mask = OMAP4430_VOLRA_VDD_CORE_L_MASK; | ||
1017 | vdd->vc_reg.voltsetup_reg = | ||
1018 | OMAP4_PRM_VOLTSETUP_CORE_RET_SLEEP_OFFSET; | ||
1019 | vdd->prm_irqst_reg = OMAP4_PRM_IRQSTATUS_MPU_OFFSET; | ||
1020 | } else if (!strcmp(vdd->voltdm.name, "iva")) { | ||
1021 | vdd->volt_data = omap44xx_vdd_iva_volt_data; | ||
1022 | vdd->vp_reg.tranxdone_status = | ||
1023 | OMAP4430_VP_IVA_TRANXDONE_ST_MASK; | ||
1024 | vdd->vc_reg.cmdval_reg = OMAP4_PRM_VC_VAL_CMD_VDD_IVA_L_OFFSET; | ||
1025 | vdd->vc_reg.smps_sa_shift = | ||
1026 | OMAP4430_SA_VDD_IVA_L_PRM_VC_SMPS_SA_SHIFT; | ||
1027 | vdd->vc_reg.smps_sa_mask = | ||
1028 | OMAP4430_SA_VDD_IVA_L_PRM_VC_SMPS_SA_MASK; | ||
1029 | vdd->vc_reg.smps_volra_shift = OMAP4430_VOLRA_VDD_IVA_L_SHIFT; | ||
1030 | vdd->vc_reg.smps_volra_mask = OMAP4430_VOLRA_VDD_IVA_L_MASK; | ||
1031 | vdd->vc_reg.voltsetup_reg = | ||
1032 | OMAP4_PRM_VOLTSETUP_IVA_RET_SLEEP_OFFSET; | ||
1033 | vdd->prm_irqst_reg = OMAP4_PRM_IRQSTATUS_MPU_OFFSET; | ||
1034 | } else { | ||
1035 | pr_warning("%s: vdd_%s does not exisit in OMAP4\n", | ||
1036 | __func__, vdd->voltdm.name); | ||
1037 | return -EINVAL; | ||
1038 | } | ||
1039 | |||
1040 | /* | ||
1041 | * Sys clk rate is require to calculate vp timeout value and | ||
1042 | * smpswaittimemin and smpswaittimemax. | ||
1043 | */ | ||
1044 | sys_ck = clk_get(NULL, "sys_clkin_ck"); | ||
1045 | if (IS_ERR(sys_ck)) { | ||
1046 | pr_warning("%s: Could not get the sys clk to calculate" | ||
1047 | "various vdd_%s params\n", __func__, vdd->voltdm.name); | ||
1048 | return -EINVAL; | ||
1049 | } | ||
1050 | sys_clk_speed = clk_get_rate(sys_ck); | ||
1051 | clk_put(sys_ck); | ||
1052 | /* Divide to avoid overflow */ | ||
1053 | sys_clk_speed /= 1000; | ||
1054 | |||
1055 | /* Generic voltage parameters */ | ||
1056 | vdd->curr_volt = 1200000; | ||
1057 | vdd->ocp_mod = OMAP4430_PRM_OCP_SOCKET_INST; | ||
1058 | vdd->read_reg = omap4_voltage_read_reg; | ||
1059 | vdd->write_reg = omap4_voltage_write_reg; | ||
1060 | vdd->volt_scale = vp_forceupdate_scale_voltage; | ||
1061 | vdd->vp_enabled = false; | ||
1062 | |||
1063 | /* VC parameters */ | ||
1064 | vdd->vc_reg.prm_mod = OMAP4430_PRM_DEVICE_INST; | ||
1065 | vdd->vc_reg.smps_sa_reg = OMAP4_PRM_VC_SMPS_SA_OFFSET; | ||
1066 | vdd->vc_reg.smps_volra_reg = OMAP4_PRM_VC_VAL_SMPS_RA_VOL_OFFSET; | ||
1067 | vdd->vc_reg.bypass_val_reg = OMAP4_PRM_VC_VAL_BYPASS_OFFSET; | ||
1068 | vdd->vc_reg.data_shift = OMAP4430_DATA_SHIFT; | ||
1069 | vdd->vc_reg.slaveaddr_shift = OMAP4430_SLAVEADDR_SHIFT; | ||
1070 | vdd->vc_reg.regaddr_shift = OMAP4430_REGADDR_SHIFT; | ||
1071 | vdd->vc_reg.valid = OMAP4430_VALID_MASK; | ||
1072 | vdd->vc_reg.cmd_on_shift = OMAP4430_ON_SHIFT; | ||
1073 | vdd->vc_reg.cmd_on_mask = OMAP4430_ON_MASK; | ||
1074 | vdd->vc_reg.cmd_onlp_shift = OMAP4430_ONLP_SHIFT; | ||
1075 | vdd->vc_reg.cmd_ret_shift = OMAP4430_RET_SHIFT; | ||
1076 | vdd->vc_reg.cmd_off_shift = OMAP4430_OFF_SHIFT; | ||
1077 | |||
1078 | vdd->vp_reg.prm_mod = OMAP4430_PRM_DEVICE_INST; | ||
1079 | |||
1080 | /* VPCONFIG bit fields */ | ||
1081 | vdd->vp_reg.vpconfig_erroroffset = (vdd->pmic_info->vp_erroroffset << | ||
1082 | OMAP4430_ERROROFFSET_SHIFT); | ||
1083 | vdd->vp_reg.vpconfig_errorgain_mask = OMAP4430_ERRORGAIN_MASK; | ||
1084 | vdd->vp_reg.vpconfig_errorgain_shift = OMAP4430_ERRORGAIN_SHIFT; | ||
1085 | vdd->vp_reg.vpconfig_initvoltage_shift = OMAP4430_INITVOLTAGE_SHIFT; | ||
1086 | vdd->vp_reg.vpconfig_initvoltage_mask = OMAP4430_INITVOLTAGE_MASK; | ||
1087 | vdd->vp_reg.vpconfig_timeouten = OMAP4430_TIMEOUTEN_MASK; | ||
1088 | vdd->vp_reg.vpconfig_initvdd = OMAP4430_INITVDD_MASK; | ||
1089 | vdd->vp_reg.vpconfig_forceupdate = OMAP4430_FORCEUPDATE_MASK; | ||
1090 | vdd->vp_reg.vpconfig_vpenable = OMAP4430_VPENABLE_MASK; | ||
1091 | |||
1092 | /* VSTEPMIN VSTEPMAX bit fields */ | ||
1093 | waittime = ((vdd->pmic_info->step_size / vdd->pmic_info->slew_rate) * | ||
1094 | sys_clk_speed) / 1000; | ||
1095 | vdd->vp_reg.vstepmin_smpswaittimemin = waittime; | ||
1096 | vdd->vp_reg.vstepmax_smpswaittimemax = waittime; | ||
1097 | vdd->vp_reg.vstepmin_stepmin = vdd->pmic_info->vp_vstepmin; | ||
1098 | vdd->vp_reg.vstepmax_stepmax = vdd->pmic_info->vp_vstepmax; | ||
1099 | vdd->vp_reg.vstepmin_smpswaittimemin_shift = | ||
1100 | OMAP4430_SMPSWAITTIMEMIN_SHIFT; | ||
1101 | vdd->vp_reg.vstepmax_smpswaittimemax_shift = | ||
1102 | OMAP4430_SMPSWAITTIMEMAX_SHIFT; | ||
1103 | vdd->vp_reg.vstepmin_stepmin_shift = OMAP4430_VSTEPMIN_SHIFT; | ||
1104 | vdd->vp_reg.vstepmax_stepmax_shift = OMAP4430_VSTEPMAX_SHIFT; | ||
1105 | |||
1106 | /* VLIMITTO bit fields */ | ||
1107 | timeout_val = (sys_clk_speed * vdd->pmic_info->vp_timeout_us) / 1000; | ||
1108 | vdd->vp_reg.vlimitto_timeout = timeout_val; | ||
1109 | vdd->vp_reg.vlimitto_vddmin = vdd->pmic_info->vp_vddmin; | ||
1110 | vdd->vp_reg.vlimitto_vddmax = vdd->pmic_info->vp_vddmax; | ||
1111 | vdd->vp_reg.vlimitto_vddmin_shift = OMAP4430_VDDMIN_SHIFT; | ||
1112 | vdd->vp_reg.vlimitto_vddmax_shift = OMAP4430_VDDMAX_SHIFT; | ||
1113 | vdd->vp_reg.vlimitto_timeout_shift = OMAP4430_TIMEOUT_SHIFT; | ||
1114 | |||
1115 | return 0; | ||
1116 | } | ||
1117 | |||
844 | /* Public functions */ | 1118 | /* Public functions */ |
845 | /** | 1119 | /** |
846 | * omap_voltage_get_nom_volt() - Gets the current non-auto-compensated voltage | 1120 | * omap_voltage_get_nom_volt() - Gets the current non-auto-compensated voltage |
@@ -1283,6 +1557,11 @@ static int __init omap_voltage_early_init(void) | |||
1283 | nr_scalable_vdd = OMAP3_NR_SCALABLE_VDD; | 1557 | nr_scalable_vdd = OMAP3_NR_SCALABLE_VDD; |
1284 | vc_init = omap3_vc_init; | 1558 | vc_init = omap3_vc_init; |
1285 | vdd_data_configure = omap3_vdd_data_configure; | 1559 | vdd_data_configure = omap3_vdd_data_configure; |
1560 | } else if (cpu_is_omap44xx()) { | ||
1561 | vdd_info = omap4_vdd_info; | ||
1562 | nr_scalable_vdd = OMAP4_NR_SCALABLE_VDD; | ||
1563 | vc_init = omap4_vc_init; | ||
1564 | vdd_data_configure = omap4_vdd_data_configure; | ||
1286 | } else { | 1565 | } else { |
1287 | pr_warning("%s: voltage driver support not added\n", __func__); | 1566 | pr_warning("%s: voltage driver support not added\n", __func__); |
1288 | } | 1567 | } |
diff --git a/arch/arm/plat-omap/include/plat/voltage.h b/arch/arm/plat-omap/include/plat/voltage.h index 2f4f59abd19f..0ff123399f3b 100644 --- a/arch/arm/plat-omap/include/plat/voltage.h +++ b/arch/arm/plat-omap/include/plat/voltage.h | |||
@@ -44,6 +44,18 @@ | |||
44 | #define OMAP3630_VDD_CORE_OPP50_UV 1000000 | 44 | #define OMAP3630_VDD_CORE_OPP50_UV 1000000 |
45 | #define OMAP3630_VDD_CORE_OPP100_UV 1200000 | 45 | #define OMAP3630_VDD_CORE_OPP100_UV 1200000 |
46 | 46 | ||
47 | #define OMAP4430_VDD_MPU_OPP50_UV 930000 | ||
48 | #define OMAP4430_VDD_MPU_OPP100_UV 1100000 | ||
49 | #define OMAP4430_VDD_MPU_OPPTURBO_UV 1260000 | ||
50 | #define OMAP4430_VDD_MPU_OPPNITRO_UV 1350000 | ||
51 | |||
52 | #define OMAP4430_VDD_IVA_OPP50_UV 930000 | ||
53 | #define OMAP4430_VDD_IVA_OPP100_UV 1100000 | ||
54 | #define OMAP4430_VDD_IVA_OPPTURBO_UV 1260000 | ||
55 | |||
56 | #define OMAP4430_VDD_CORE_OPP50_UV 930000 | ||
57 | #define OMAP4430_VDD_CORE_OPP100_UV 1100000 | ||
58 | |||
47 | /** | 59 | /** |
48 | * struct voltagedomain - omap voltage domain global structure. | 60 | * struct voltagedomain - omap voltage domain global structure. |
49 | * @name: Name of the voltage domain which can be used as a unique | 61 | * @name: Name of the voltage domain which can be used as a unique |