regulator: gpio-regulator: Fixes for problems that turned up with 3.5-rc1
cover regulator: gpio-regulator: Fixes for problems that turned up with 3.5-rc1
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(-)
Signature · 1 line
1.7.2.3
PATCH 1/3 regulator: gpio-regulator: do not pass drvdata pointer as reference
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.
--- drivers/regulator/gpio-regulator.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-)
drivers/regulator/gpio-regulator.c +1 -1
@@ -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)) {
Signature · 1 line
1.7.2.3
Re: [PATCH 1/3] regulator: gpio-regulator: do not pass drvdata pointer as reference
2012/6/4 Heiko Stübner <[email protected]>:
Quoted 5 lines
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]>
Mark Brown
AppliedRe: [PATCH 1/3] regulator: gpio-regulator: do not pass drvdata pointer as reference
In reply to Heiko StübnerQuoted 3 lines · Heiko Stübner
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.
PATCH 2/3 regulator: gpio-regulator: Fix finding of smallest value
In reply to Heiko StübnerCommit 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.
--- drivers/regulator/gpio-regulator.c | 6 ++++-- 1 files changed, 4 insertions(+), 2 deletions(-)
drivers/regulator/gpio-regulator.c +4 -2
@@ -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 ;
Signature · 1 line
1.7.2.3
Re: [PATCH 2/3] regulator: gpio-regulator: Fix finding of smallest value
2012/6/4 Heiko Stübner <[email protected]>:
Quoted 11 lines
Commit
4dbd8f63f07a(regulator: gpio-regulator: Set the smallest voltage/current in the specified range) forgot to set the newly introducedbest_val.Therefore it stayed always at
INT_MAXthus 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]>
PATCH 3/3 regulator: gpio-regulator: populate selector from set_voltage
In reply to Heiko StübnerThis was missing until now and the underlying _regulator_do_set_voltage is using this value when calling list_voltage.
--- drivers/regulator/gpio-regulator.c | 8 +++++--- 1 files changed, 5 insertions(+), 3 deletions(-)
drivers/regulator/gpio-regulator.c +5 -3
@@ -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 = {
Signature · 1 line
1.7.2.3
Re: [PATCH 3/3] regulator: gpio-regulator: populate selector from set_voltage
2012/6/4 Heiko Stübner <[email protected]>:
Quoted 4 lines
This was missing until now and the underlying
_regulator_do_set_voltageis using this value when callinglist_voltage.Signed-off-by Heiko Stuebner <[email protected]>