diff options
author | Tero Kristo <t-kristo@ti.com> | 2012-04-11 12:42:25 -0500 |
---|---|---|
committer | Ziyann <jaraidaniel@gmail.com> | 2014-10-01 12:58:42 +0200 |
commit | 773ad428d94aab36b7696bb0574cb0cefc4e210a (patch) | |
tree | f8795f9030ac973f970f48b73c8cd756696ca66d /arch/arm/mach-omap2 | |
parent | b0d638ca5e5a6768e383a274f05eb6e159bd156b (diff) | |
download | kernel_samsung_tuna-773ad428d94aab36b7696bb0574cb0cefc4e210a.zip kernel_samsung_tuna-773ad428d94aab36b7696bb0574cb0cefc4e210a.tar.gz kernel_samsung_tuna-773ad428d94aab36b7696bb0574cb0cefc4e210a.tar.bz2 |
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 <oleksandr.kozaruk@ti.com>
Signed-off-by: Nishanth Menon <nm@ti.com>
[t-kristo@ti.com: original patch]
Signed-off-by: Tero Kristo <t-kristo@ti.com>
Diffstat (limited to 'arch/arm/mach-omap2')
-rw-r--r-- | arch/arm/mach-omap2/vp.c | 14 | ||||
-rw-r--r-- | arch/arm/mach-omap2/vp.h | 12 | ||||
-rw-r--r-- | arch/arm/mach-omap2/vp3xxx_data.c | 12 | ||||
-rw-r--r-- | arch/arm/mach-omap2/vp44xx_data.c | 18 |
4 files changed, 54 insertions, 2 deletions
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, }; |