lkml.org 
[lkml]   [2014]   [May]   [21]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
From
Subject[PATCH] regulator: core: allow non-exact matches in regulator_set_voltage_time()
Date
Currently this function only provides a valid output if both
old_uV and new_uV are exact voltages that can be provided by the
regulator.
This is almost impossible to achive as the consumer has
no way to know the exact voltages provided by the regulator.
Also it creates an unexpected twist in the API, as a user
could possibly not use the same voltage parameters for
set_voltage_time() as for set_voltage_time().

This breaks the current cpufreq users of this function, as they
stick in the raw voltages retrieved from their operating points,
which may or may not match one of the regulator voltages.

To make this function behave as expected employ the same logic
as used when calling set_voltage() and round the voltages to
the closest matching voltage supported by the regulator.

Signed-off-by: Lucas Stach <l.stach@pengutronix.de>
---
drivers/regulator/core.c | 11 +++++++----
1 file changed, 7 insertions(+), 4 deletions(-)

diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c
index 9a09f3cdbabb..29ab83f49da9 100644
--- a/drivers/regulator/core.c
+++ b/drivers/regulator/core.c
@@ -2477,7 +2477,7 @@ int regulator_set_voltage_time(struct regulator *regulator,
struct regulator_ops *ops = rdev->desc->ops;
int old_sel = -1;
int new_sel = -1;
- int voltage;
+ int voltage, best_match_old_uV = INT_MAX, best_match_new_uV = INT_MAX;
int i;

/* Currently requires operations to do this */
@@ -2486,16 +2486,19 @@ int regulator_set_voltage_time(struct regulator *regulator,
return -EINVAL;

for (i = 0; i < rdev->desc->n_voltages; i++) {
- /* We only look for exact voltage matches here */
voltage = regulator_list_voltage(regulator, i);
if (voltage < 0)
return -EINVAL;
if (voltage == 0)
continue;
- if (voltage == old_uV)
+ if (voltage >= old_uV && voltage < best_match_old_uV) {
old_sel = i;
- if (voltage == new_uV)
+ best_match_old_uV = voltage;
+ }
+ if (voltage >= new_uV && voltage < best_match_new_uV) {
new_sel = i;
+ best_match_new_uV = voltage;
+ }
}

if (old_sel < 0 || new_sel < 0)
--
2.0.0.rc0


\
 
 \ /
  Last update: 2014-05-21 19:41    [W:0.050 / U:0.024 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site