aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/mach-omap2
diff options
context:
space:
mode:
authorTero Kristo <t-kristo@ti.com>2012-04-11 12:42:25 -0500
committerZiyann <jaraidaniel@gmail.com>2014-10-01 12:58:42 +0200
commit773ad428d94aab36b7696bb0574cb0cefc4e210a (patch)
treef8795f9030ac973f970f48b73c8cd756696ca66d /arch/arm/mach-omap2
parentb0d638ca5e5a6768e383a274f05eb6e159bd156b (diff)
downloadkernel_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.c14
-rw-r--r--arch/arm/mach-omap2/vp.h12
-rw-r--r--arch/arm/mach-omap2/vp3xxx_data.c12
-rw-r--r--arch/arm/mach-omap2/vp44xx_data.c18
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,
};