mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
* [PATCH] regulator: core: allow non-exact matches in regulator_set_voltage_time()
@ 2014-05-21 16:53 Lucas Stach
  2014-05-22  8:34 ` Lucas Stach
  2014-06-01 11:38 ` Mark Brown
  0 siblings, 2 replies; 5+ messages in thread
From: Lucas Stach @ 2014-05-21 16:53 UTC (permalink / raw)
  To: Liam Girdwood; +Cc: Mark Brown, linux-kernel, kernel

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


^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2014-06-02 12:16 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-05-21 16:53 [PATCH] regulator: core: allow non-exact matches in regulator_set_voltage_time() Lucas Stach
2014-05-22  8:34 ` Lucas Stach
2014-06-01 11:38 ` Mark Brown
2014-06-02 10:27   ` Lucas Stach
2014-06-02 12:15     ` Mark Brown

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®