During the porting of my machine to 3.5-rc1 some glitches in the
gpio-regulator from different changes popped up.
This series fixes these.
While doing this, I noticed a possible uninitialized use of "selector" in
_regulator_do_set_voltage, where I'm not sure what the correct fix would be.
To summarize, before
if (rdev->desc->ops->list_voltage)
best_val = rdev->desc->ops->list_voltage(rdev, selector);
else
best_val = -1;
selector is set in the set_voltage callback or if the new map_voltage returns
a non-error value. If it returns an error value or the else clause is reached
selector is used uninitialized in the list_voltage and set_voltage_time_sel
call.
As written above, I'm not sure what the correct fix would be here.
Heiko Stuebner (3):
regulator: gpio-regulator: do not pass drvdata pointer as reference
regulator: gpio-regulator: Fix finding of smallest value
regulator: gpio-regulator: populate selector from set_voltage
drivers/regulator/gpio-regulator.c | 16 ++++++++++------
1 files changed, 10 insertions(+), 6 deletions(-)
--
1.7.2.3
Commit c172708d38a4 (regulator: core: Use a struct to pass in
regulator runtime configuration) added the drvdata pointer
only per reference to the new config array in the gpio-regulator.
Signed-off-by: Heiko Stuebner <[email protected]>
---
drivers/regulator/gpio-regulator.c | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/drivers/regulator/gpio-regulator.c b/drivers/regulator/gpio-regulator.c
index 9997d7a..ebe2b5c 100644
--- a/drivers/regulator/gpio-regulator.c
+++ b/drivers/regulator/gpio-regulator.c
@@ -286,7 +286,7 @@ static int __devinit gpio_regulator_probe(struct platform_device *pdev)
cfg.dev = &pdev->dev;
cfg.init_data = config->init_data;
- cfg.driver_data = &drvdata;
+ cfg.driver_data = drvdata;
drvdata->dev = regulator_register(&drvdata->desc, &cfg);
if (IS_ERR(drvdata->dev)) {
--
1.7.2.3
Commit 4dbd8f63f07a (regulator: gpio-regulator: Set the smallest
voltage/current in the specified range) forgot to set the newly
introduced best_val.
Therefore it stayed always at INT_MAX thus breaking the setting
of the voltage.
Included is also an init value for target, as warnings about
a possibly uninitialised target started appearing with this fix.
Signed-off-by: Heiko Stuebner <[email protected]>
---
drivers/regulator/gpio-regulator.c | 6 ++++--
1 files changed, 4 insertions(+), 2 deletions(-)
diff --git a/drivers/regulator/gpio-regulator.c b/drivers/regulator/gpio-regulator.c
index ebe2b5c..2c38bea 100644
--- a/drivers/regulator/gpio-regulator.c
+++ b/drivers/regulator/gpio-regulator.c
@@ -104,13 +104,15 @@ static int gpio_regulator_set_value(struct regulator_dev *dev,
int min, int max)
{
struct gpio_regulator_data *data = rdev_get_drvdata(dev);
- int ptr, target, state, best_val = INT_MAX;
+ int ptr, target = 0, state, best_val = INT_MAX;
for (ptr = 0; ptr < data->nr_states; ptr++)
if (data->states[ptr].value < best_val &&
data->states[ptr].value >= min &&
- data->states[ptr].value <= max)
+ data->states[ptr].value <= max) {
target = data->states[ptr].gpios;
+ best_val = data->states[ptr].value;
+ }
if (best_val == INT_MAX)
return -EINVAL;
--
1.7.2.3
This was missing until now and the underlying
_regulator_do_set_voltage is using this value when calling list_voltage.
Signed-off-by: Heiko Stuebner <[email protected]>
---
drivers/regulator/gpio-regulator.c | 8 +++++---
1 files changed, 5 insertions(+), 3 deletions(-)
diff --git a/drivers/regulator/gpio-regulator.c b/drivers/regulator/gpio-regulator.c
index 2c38bea..242851a 100644
--- a/drivers/regulator/gpio-regulator.c
+++ b/drivers/regulator/gpio-regulator.c
@@ -101,7 +101,7 @@ static int gpio_regulator_get_value(struct regulator_dev *dev)
}
static int gpio_regulator_set_value(struct regulator_dev *dev,
- int min, int max)
+ int min, int max, unsigned *selector)
{
struct gpio_regulator_data *data = rdev_get_drvdata(dev);
int ptr, target = 0, state, best_val = INT_MAX;
@@ -112,6 +112,8 @@ static int gpio_regulator_set_value(struct regulator_dev *dev,
data->states[ptr].value <= max) {
target = data->states[ptr].gpios;
best_val = data->states[ptr].value;
+ if (selector)
+ *selector = ptr;
}
if (best_val == INT_MAX)
@@ -130,7 +132,7 @@ static int gpio_regulator_set_voltage(struct regulator_dev *dev,
int min_uV, int max_uV,
unsigned *selector)
{
- return gpio_regulator_set_value(dev, min_uV, max_uV);
+ return gpio_regulator_set_value(dev, min_uV, max_uV, selector);
}
static int gpio_regulator_list_voltage(struct regulator_dev *dev,
@@ -147,7 +149,7 @@ static int gpio_regulator_list_voltage(struct regulator_dev *dev,
static int gpio_regulator_set_current_limit(struct regulator_dev *dev,
int min_uA, int max_uA)
{
- return gpio_regulator_set_value(dev, min_uA, max_uA);
+ return gpio_regulator_set_value(dev, min_uA, max_uA, NULL);
}
static struct regulator_ops gpio_regulator_voltage_ops = {
--
1.7.2.3
2012/6/4 Heiko St?bner <[email protected]>:
> Commit c172708d38a4 (regulator: core: Use a struct to pass in
> regulator runtime configuration) added the drvdata pointer
> only per reference to the new config array in the gpio-regulator.
>
> Signed-off-by: Heiko Stuebner <[email protected]>
Acked-by: Axel Lin <[email protected]>
2012/6/4 Heiko St?bner <[email protected]>:
> Commit 4dbd8f63f07a (regulator: gpio-regulator: Set the smallest
> voltage/current in the specified range) forgot to set the newly
> introduced best_val.
>
> Therefore it stayed always at INT_MAX thus breaking the setting
> of the voltage.
>
> Included is also an init value for target, as warnings about
> a possibly uninitialised target started appearing with this fix.
>
> Signed-off-by: Heiko Stuebner <[email protected]>
Acked-by: Axel Lin <[email protected]>
2012/6/4 Heiko St?bner <[email protected]>:
> This was missing until now and the underlying
> _regulator_do_set_voltage is using this value when calling list_voltage.
>
> Signed-off-by: Heiko Stuebner <[email protected]>
Acked-by: Axel Lin <[email protected]>
On Sun, Jun 03, 2012 at 09:30:33PM +0200, Heiko St?bner wrote:
> Commit c172708d38a4 (regulator: core: Use a struct to pass in
> regulator runtime configuration) added the drvdata pointer
> only per reference to the new config array in the gpio-regulator.
Applied all, thanks.