Commit 68d7d768 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'regulator-3.5' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/regulator

Pull regulator fixes from Mark Brown:
 "A couple of small fixes, plus larger fixes for the gpio-regulator
  driver the most recent changes for which had apparently not been
  tested at all in -next (or elsewhere from the looks of it)."

* tag 'regulator-3.5' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/regulator:
  regulator: core: Properly handle the case min_uV < rdev->desc->min_uV in map_voltage_linear
  regulator: max8649: fix missing regmap in rdev
  regulator: gpio-regulator: populate selector from set_voltage
  regulator: gpio-regulator: Fix finding of smallest value
  regulator: gpio-regulator: do not pass drvdata pointer as reference
  regulator: anatop: Use correct __devexit_p annotation
  regulator: palmas: Fix wrong kfree calls
parents cfaf0251 0bdc81e4
...@@ -224,7 +224,7 @@ static struct platform_driver anatop_regulator_driver = { ...@@ -224,7 +224,7 @@ static struct platform_driver anatop_regulator_driver = {
.of_match_table = of_anatop_regulator_match_tbl, .of_match_table = of_anatop_regulator_match_tbl,
}, },
.probe = anatop_regulator_probe, .probe = anatop_regulator_probe,
.remove = anatop_regulator_remove, .remove = __devexit_p(anatop_regulator_remove),
}; };
static int __init anatop_regulator_init(void) static int __init anatop_regulator_init(void)
......
...@@ -2050,6 +2050,9 @@ int regulator_map_voltage_linear(struct regulator_dev *rdev, ...@@ -2050,6 +2050,9 @@ int regulator_map_voltage_linear(struct regulator_dev *rdev,
return -EINVAL; return -EINVAL;
} }
if (min_uV < rdev->desc->min_uV)
min_uV = rdev->desc->min_uV;
ret = DIV_ROUND_UP(min_uV - rdev->desc->min_uV, rdev->desc->uV_step); ret = DIV_ROUND_UP(min_uV - rdev->desc->min_uV, rdev->desc->uV_step);
if (ret < 0) if (ret < 0)
return ret; return ret;
......
...@@ -101,16 +101,20 @@ static int gpio_regulator_get_value(struct regulator_dev *dev) ...@@ -101,16 +101,20 @@ static int gpio_regulator_get_value(struct regulator_dev *dev)
} }
static int gpio_regulator_set_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); 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++) for (ptr = 0; ptr < data->nr_states; ptr++)
if (data->states[ptr].value < best_val && if (data->states[ptr].value < best_val &&
data->states[ptr].value >= min && data->states[ptr].value >= min &&
data->states[ptr].value <= max) data->states[ptr].value <= max) {
target = data->states[ptr].gpios; target = data->states[ptr].gpios;
best_val = data->states[ptr].value;
if (selector)
*selector = ptr;
}
if (best_val == INT_MAX) if (best_val == INT_MAX)
return -EINVAL; return -EINVAL;
...@@ -128,7 +132,7 @@ static int gpio_regulator_set_voltage(struct regulator_dev *dev, ...@@ -128,7 +132,7 @@ static int gpio_regulator_set_voltage(struct regulator_dev *dev,
int min_uV, int max_uV, int min_uV, int max_uV,
unsigned *selector) 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, static int gpio_regulator_list_voltage(struct regulator_dev *dev,
...@@ -145,7 +149,7 @@ static int gpio_regulator_list_voltage(struct regulator_dev *dev, ...@@ -145,7 +149,7 @@ static int gpio_regulator_list_voltage(struct regulator_dev *dev,
static int gpio_regulator_set_current_limit(struct regulator_dev *dev, static int gpio_regulator_set_current_limit(struct regulator_dev *dev,
int min_uA, int max_uA) 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 = { static struct regulator_ops gpio_regulator_voltage_ops = {
...@@ -286,7 +290,7 @@ static int __devinit gpio_regulator_probe(struct platform_device *pdev) ...@@ -286,7 +290,7 @@ static int __devinit gpio_regulator_probe(struct platform_device *pdev)
cfg.dev = &pdev->dev; cfg.dev = &pdev->dev;
cfg.init_data = config->init_data; cfg.init_data = config->init_data;
cfg.driver_data = &drvdata; cfg.driver_data = drvdata;
drvdata->dev = regulator_register(&drvdata->desc, &cfg); drvdata->dev = regulator_register(&drvdata->desc, &cfg);
if (IS_ERR(drvdata->dev)) { if (IS_ERR(drvdata->dev)) {
......
...@@ -259,6 +259,7 @@ static int __devinit max8649_regulator_probe(struct i2c_client *client, ...@@ -259,6 +259,7 @@ static int __devinit max8649_regulator_probe(struct i2c_client *client,
config.dev = &client->dev; config.dev = &client->dev;
config.init_data = pdata->regulator; config.init_data = pdata->regulator;
config.driver_data = info; config.driver_data = info;
config.regmap = info->regmap;
info->regulator = regulator_register(&dcdc_desc, &config); info->regulator = regulator_register(&dcdc_desc, &config);
if (IS_ERR(info->regulator)) { if (IS_ERR(info->regulator)) {
......
...@@ -775,9 +775,6 @@ static __devinit int palmas_probe(struct platform_device *pdev) ...@@ -775,9 +775,6 @@ static __devinit int palmas_probe(struct platform_device *pdev)
err_unregister_regulator: err_unregister_regulator:
while (--id >= 0) while (--id >= 0)
regulator_unregister(pmic->rdev[id]); regulator_unregister(pmic->rdev[id]);
kfree(pmic->rdev);
kfree(pmic->desc);
kfree(pmic);
return ret; return ret;
} }
...@@ -788,10 +785,6 @@ static int __devexit palmas_remove(struct platform_device *pdev) ...@@ -788,10 +785,6 @@ static int __devexit palmas_remove(struct platform_device *pdev)
for (id = 0; id < PALMAS_NUM_REGS; id++) for (id = 0; id < PALMAS_NUM_REGS; id++)
regulator_unregister(pmic->rdev[id]); regulator_unregister(pmic->rdev[id]);
kfree(pmic->rdev);
kfree(pmic->desc);
kfree(pmic);
return 0; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment