From 773ad428d94aab36b7696bb0574cb0cefc4e210a Mon Sep 17 00:00:00 2001 From: Tero Kristo Date: Wed, 11 Apr 2012 12:42:25 -0500 Subject: OMAP3+: VP: introduce SoC limit parameters Introduce Voltage Processor level limit which maps to values per SoC. The actual VP limits are programmed using the following logic: vddmax as the lower value of SoC/PMIC's capability vddmin as the higher value of SoC/PMIC's capability Change-Id: Ib58b41f56f06dfbd59f3e6d1a129fd1496d04d07 [oleksandr.kozaruk@ti.com, nm@ti.com: port for Android] Signed-off-by: Oleksandr Kozaruk Signed-off-by: Nishanth Menon [t-kristo@ti.com: original patch] Signed-off-by: Tero Kristo --- arch/arm/mach-omap2/vp.c | 14 ++++++++++++-- arch/arm/mach-omap2/vp.h | 12 ++++++++++++ arch/arm/mach-omap2/vp3xxx_data.c | 12 ++++++++++++ arch/arm/mach-omap2/vp44xx_data.c | 18 ++++++++++++++++++ 4 files changed, 54 insertions(+), 2 deletions(-) (limited to 'arch/arm/mach-omap2') diff --git a/arch/arm/mach-omap2/vp.c b/arch/arm/mach-omap2/vp.c index 933ecad..a09c17c 100644 --- a/arch/arm/mach-omap2/vp.c +++ b/arch/arm/mach-omap2/vp.c @@ -71,8 +71,18 @@ void __init omap_vp_init(struct voltagedomain *voltdm) sys_clk_rate = voltdm->sys_clk.rate / 1000; timeout = (sys_clk_rate * voltdm->pmic->vp_timeout_us) / 1000; - vddmin = voltdm->pmic->uv_to_vsel(voltdm->pmic->min_volt); - vddmax = voltdm->pmic->uv_to_vsel(voltdm->pmic->max_volt); + + if (!vp->vlimits) { + WARN(1, "%s: voldm_%s: No limits for VP? Using PMIC data\n", + __func__, voltdm->name); + vddmin = voltdm->pmic->uv_to_vsel(voltdm->pmic->min_volt); + vddmax = voltdm->pmic->uv_to_vsel(voltdm->pmic->max_volt); + } else { + vddmin = voltdm->pmic->uv_to_vsel(max(voltdm->pmic->min_volt, + vp->vlimits->vddmin)); + vddmax = voltdm->pmic->uv_to_vsel(min(voltdm->pmic->max_volt, + vp->vlimits->vddmax)); + } waittime = DIV_ROUND_UP(voltdm->pmic->step_size * sys_clk_rate, 1000 * voltdm->pmic->slew_rate); diff --git a/arch/arm/mach-omap2/vp.h b/arch/arm/mach-omap2/vp.h index cb3465a..e7c957b 100644 --- a/arch/arm/mach-omap2/vp.h +++ b/arch/arm/mach-omap2/vp.h @@ -79,6 +79,16 @@ struct omap_vp_common { }; /** + * struct omap_vp_volt_limits - Voltage limit Parameters for SoC + * @vddmin: Minimum voltage in uV + * @vddmax: Maximum voltage in uV + */ +struct omap_vp_volt_limits { + u32 vddmin; + u32 vddmax; +}; + +/** * struct omap_vp_instance - VP register offsets (per-VDD) * @common: pointer to struct omap_vp_common * for this SoC * @vpconfig: PRM_VP*_CONFIG reg offset from PRM start @@ -87,6 +97,7 @@ struct omap_vp_common { * @vstatus: PRM_VP*_VSTATUS reg offset from PRM start * @voltage: PRM_VP*_VOLTAGE reg offset from PRM start * @enabled: flag to keep track of whether vp is enabled or not + * @limits: limits to set based off SoC VP capability. * * XXX vp_common is probably not needed since it is per-SoC */ @@ -100,6 +111,7 @@ struct omap_vp_instance { u8 voltage; u8 id; bool enabled; + struct omap_vp_volt_limits *vlimits; }; extern struct omap_vp_instance omap3_vp_mpu; diff --git a/arch/arm/mach-omap2/vp3xxx_data.c b/arch/arm/mach-omap2/vp3xxx_data.c index 6db2604..ed7a65d 100644 --- a/arch/arm/mach-omap2/vp3xxx_data.c +++ b/arch/arm/mach-omap2/vp3xxx_data.c @@ -57,6 +57,11 @@ static const struct omap_vp_common omap3_vp_common = { .ops = &omap3_vp_ops, }; +struct omap_vp_volt_limits omap3_vp_mpu_limit = { + .vddmin = OMAP3430_VP1_VLIMITTO_VDDMIN, + .vddmax = OMAP3430_VP1_VLIMITTO_VDDMAX, +}; + struct omap_vp_instance omap3_vp_mpu = { .id = OMAP3_PRM_IRQ_VDD_MPU_ID, .common = &omap3_vp_common, @@ -66,6 +71,12 @@ struct omap_vp_instance omap3_vp_mpu = { .vlimitto = OMAP3_PRM_VP1_VLIMITTO_OFFSET, .vstatus = OMAP3_PRM_VP1_STATUS_OFFSET, .voltage = OMAP3_PRM_VP1_VOLTAGE_OFFSET, + .vlimits = &omap3_vp_mpu_limit, +}; + +struct omap_vp_volt_limits omap3_vp_core_limit = { + .vddmin = OMAP3430_VP2_VLIMITTO_VDDMIN, + .vddmax = OMAP3430_VP2_VLIMITTO_VDDMAX, }; struct omap_vp_instance omap3_vp_core = { @@ -77,4 +88,5 @@ struct omap_vp_instance omap3_vp_core = { .vlimitto = OMAP3_PRM_VP2_VLIMITTO_OFFSET, .vstatus = OMAP3_PRM_VP2_STATUS_OFFSET, .voltage = OMAP3_PRM_VP2_VOLTAGE_OFFSET, + .vlimits = &omap3_vp_core_limit, }; diff --git a/arch/arm/mach-omap2/vp44xx_data.c b/arch/arm/mach-omap2/vp44xx_data.c index da6fed9..e82b415 100644 --- a/arch/arm/mach-omap2/vp44xx_data.c +++ b/arch/arm/mach-omap2/vp44xx_data.c @@ -64,6 +64,11 @@ static const struct omap_vp_common omap4_vp_common = { .ops = &omap4_vp_ops, }; +struct omap_vp_volt_limits omap4_vp_mpu_limit = { + .vddmin = OMAP4_VP_MPU_VLIMITTO_VDDMIN, + .vddmax = OMAP4_VP_MPU_VLIMITTO_VDDMAX, +}; + struct omap_vp_instance omap4_vp_mpu = { .id = OMAP4_PRM_IRQ_VDD_MPU_ID, .common = &omap4_vp_common, @@ -73,6 +78,12 @@ struct omap_vp_instance omap4_vp_mpu = { .vlimitto = OMAP4_PRM_VP_MPU_VLIMITTO_OFFSET, .vstatus = OMAP4_PRM_VP_MPU_STATUS_OFFSET, .voltage = OMAP4_PRM_VP_MPU_VOLTAGE_OFFSET, + .vlimits = &omap4_vp_mpu_limit, +}; + +struct omap_vp_volt_limits omap4_vp_iva_limit = { + .vddmin = OMAP4_VP_IVA_VLIMITTO_VDDMIN, + .vddmax = OMAP4_VP_IVA_VLIMITTO_VDDMAX, }; struct omap_vp_instance omap4_vp_iva = { @@ -84,6 +95,12 @@ struct omap_vp_instance omap4_vp_iva = { .vlimitto = OMAP4_PRM_VP_IVA_VLIMITTO_OFFSET, .vstatus = OMAP4_PRM_VP_IVA_STATUS_OFFSET, .voltage = OMAP4_PRM_VP_IVA_VOLTAGE_OFFSET, + .vlimits = &omap4_vp_iva_limit, +}; + +struct omap_vp_volt_limits omap4_vp_core_limit = { + .vddmin = OMAP4_VP_CORE_VLIMITTO_VDDMIN, + .vddmax = OMAP4_VP_CORE_VLIMITTO_VDDMAX, }; struct omap_vp_instance omap4_vp_core = { @@ -95,4 +112,5 @@ struct omap_vp_instance omap4_vp_core = { .vlimitto = OMAP4_PRM_VP_CORE_VLIMITTO_OFFSET, .vstatus = OMAP4_PRM_VP_CORE_STATUS_OFFSET, .voltage = OMAP4_PRM_VP_CORE_VOLTAGE_OFFSET, + .vlimits = &omap4_vp_core_limit, }; -- cgit v1.1