summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--arch/arm/mach-omap2/vp.c58
1 files changed, 19 insertions, 39 deletions
diff --git a/arch/arm/mach-omap2/vp.c b/arch/arm/mach-omap2/vp.c
index 24020ea2b7e..66bd700a2b9 100644
--- a/arch/arm/mach-omap2/vp.c
+++ b/arch/arm/mach-omap2/vp.c
@@ -9,31 +9,18 @@
#include "prm-regbits-44xx.h"
#include "prm44xx.h"
-static void vp_latch_vsel(struct voltagedomain *voltdm)
+static u32 _vp_set_init_voltage(struct voltagedomain *voltdm, u32 volt)
{
struct omap_vp_instance *vp = voltdm->vp;
u32 vpconfig;
- unsigned long uvdc;
char vsel;
- uvdc = omap_voltage_get_nom_volt(voltdm);
- if (!uvdc) {
- pr_warning("%s: unable to find current voltage for vdd_%s\n",
- __func__, voltdm->name);
- return;
- }
-
- if (!voltdm->pmic || !voltdm->pmic->uv_to_vsel) {
- pr_warning("%s: PMIC function to convert voltage in uV to"
- " vsel not registered\n", __func__);
- return;
- }
-
- vsel = voltdm->pmic->uv_to_vsel(uvdc);
+ vsel = voltdm->pmic->uv_to_vsel(volt);
vpconfig = voltdm->read(vp->vpconfig);
vpconfig &= ~(vp->common->vpconfig_initvoltage_mask |
- vp->common->vpconfig_initvdd);
+ vp->common->vpconfig_forceupdate |
+ vp->common->vpconfig_initvdd);
vpconfig |= vsel << __ffs(vp->common->vpconfig_initvoltage_mask);
voltdm->write(vpconfig, vp->vpconfig);
@@ -43,6 +30,8 @@ static void vp_latch_vsel(struct voltagedomain *voltdm)
/* Clear initVDD copy trigger bit */
voltdm->write(vpconfig, vp->vpconfig);
+
+ return vpconfig;
}
/* Generic voltage init functions */
@@ -149,22 +138,11 @@ int omap_vp_forceupdate_scale(struct voltagedomain *voltdm,
return -ETIMEDOUT;
}
- /* Configure for VP-Force Update */
- vpconfig = voltdm->read(vp->vpconfig);
- vpconfig &= ~(vp->common->vpconfig_initvdd |
- vp->common->vpconfig_forceupdate |
- vp->common->vpconfig_initvoltage_mask);
- vpconfig |= ((target_vsel <<
- __ffs(vp->common->vpconfig_initvoltage_mask)));
- voltdm->write(vpconfig, vp->vpconfig);
-
- /* Trigger initVDD value copy to voltage processor */
- vpconfig |= vp->common->vpconfig_initvdd;
- voltdm->write(vpconfig, vp->vpconfig);
+ vpconfig = _vp_set_init_voltage(voltdm, target_volt);
/* Force update of voltage */
- vpconfig |= vp->common->vpconfig_forceupdate;
- voltdm->write(vpconfig, vp->vpconfig);
+ voltdm->write(vpconfig | vp->common->vpconfig_forceupdate,
+ voltdm->vp->vpconfig);
/*
* Wait for TransactionDone. Typical latency is <200us.
@@ -197,12 +175,7 @@ int omap_vp_forceupdate_scale(struct voltagedomain *voltdm,
"to clear the TRANXDONE status\n",
__func__, voltdm->name);
- vpconfig = voltdm->read(vp->vpconfig);
- /* Clear initVDD copy trigger bit */
- vpconfig &= ~vp->common->vpconfig_initvdd;
- voltdm->write(vpconfig, vp->vpconfig);
/* Clear force bit */
- vpconfig &= ~vp->common->vpconfig_forceupdate;
voltdm->write(vpconfig, vp->vpconfig);
return 0;
@@ -218,7 +191,7 @@ int omap_vp_forceupdate_scale(struct voltagedomain *voltdm,
void omap_vp_enable(struct voltagedomain *voltdm)
{
struct omap_vp_instance *vp;
- u32 vpconfig;
+ u32 vpconfig, volt;
if (!voltdm || IS_ERR(voltdm)) {
pr_warning("%s: VDD specified does not exist!\n", __func__);
@@ -236,12 +209,19 @@ void omap_vp_enable(struct voltagedomain *voltdm)
if (vp->enabled)
return;
- vp_latch_vsel(voltdm);
+ volt = voltdm_get_voltage(voltdm);
+ if (!volt) {
+ pr_warning("%s: unable to find current voltage for %s\n",
+ __func__, voltdm->name);
+ return;
+ }
+
+ vpconfig = _vp_set_init_voltage(voltdm, volt);
/* Enable VP */
- vpconfig = voltdm->read(vp->vpconfig);
vpconfig |= vp->common->vpconfig_vpenable;
voltdm->write(vpconfig, vp->vpconfig);
+
vp->enabled = true;
}