On Fri, 2012-03-02 at 14:42 -0800, Kevin Hilman wrote: > When using the SMPS regulators to scale voltages, the regulator > framework may pass a minimum voltage that is not an exact OPP voltage. > For the VC/VP controlled voltage domains, we must ensure that the > voltage requested is the exact voltage from the OPP table. This is > especially critical when using SR. > > To fix, voltdm_scale() uses the target voltage passed to walk through > the OPP voltages until it finds a voltage that is >= one of the OPP > voltages. I have just one question to this, how about smartreflex class1p5? Do we have any plans for that one? The old implementation at least was using voltdm_scale, so if we modify this function, smartreflex class1p5 doesn't work anymore. Otherwise this patch looks good to me. -Tero > > Cc: Tero Kristo <t-kristo@xxxxxx> > Cc: Nishanth Menon <nm@xxxxxx> > Signed-off-by: Kevin Hilman <khilman@xxxxxx> > --- > Unless there are any objections, this will be queued along with the > rest of the SMPS regulator series from Tero. Currently availble in > my for_3.4/pm/smps-regulator branch at > git://git.kernel.org/pub/scm/linux/kernel/git/khilman/linux-omap-pm.git > > arch/arm/mach-omap2/voltage.c | 21 ++++++++++++++++++--- > 1 file changed, 18 insertions(+), 3 deletions(-) > > diff --git a/arch/arm/mach-omap2/voltage.c b/arch/arm/mach-omap2/voltage.c > index 8a36342..4dc60e8 100644 > --- a/arch/arm/mach-omap2/voltage.c > +++ b/arch/arm/mach-omap2/voltage.c > @@ -73,7 +73,8 @@ unsigned long voltdm_get_voltage(struct voltagedomain *voltdm) > int voltdm_scale(struct voltagedomain *voltdm, > unsigned long target_volt) > { > - int ret; > + int ret, i; > + unsigned long volt = 0; > > if (!voltdm || IS_ERR(voltdm)) { > pr_warning("%s: VDD specified does not exist!\n", __func__); > @@ -86,9 +87,23 @@ int voltdm_scale(struct voltagedomain *voltdm, > return -ENODATA; > } > > - ret = voltdm->scale(voltdm, target_volt); > + /* Adjust voltage to the exact voltage from the OPP table */ > + for (i = 0; voltdm->volt_data[i].volt_nominal != 0; i++) { > + if (voltdm->volt_data[i].volt_nominal >= target_volt) { > + volt = voltdm->volt_data[i].volt_nominal; > + break; > + } > + } > + > + if (!volt) { > + pr_warning("%s: not scaling. OPP voltage for %lu, not found.\n", > + __func__, target_volt); > + return -EINVAL; > + } > + > + ret = voltdm->scale(voltdm, volt); > if (!ret) > - voltdm->nominal_volt = target_volt; > + voltdm->nominal_volt = volt; > > return ret; > } -- To unsubscribe from this list: send the line "unsubscribe linux-omap" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html