Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/lrg/voltage-2.6
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/lrg/voltage-2.6: regulator: wm8350-regulator - fix the logic of checking REGULATOR_MODE_STANDBY mode regulator: wm831x-ldo - fix the logic to set REGULATOR_MODE_IDLE and REGULATOR_MODE_STANDBY modes regulator: ab8500 - fix off-by-one value range checking for selector regulator: 88pm8607 - fix value range checking for accessing info->vol_table regulator: isl6271a-regulator - fix regulator_desc parameter for regulator_register() regulator: ad5398 - fix a memory leak regulator: Update e-mail address for Liam Girdwood regulator: set max8998->dev to &pdev->dev. regulator: tps6586x-regulator - fix bit_mask parameter for tps6586x_set_bits() regulator: tps6586x-regulator - fix value range checking for val regulator: max8998 - set max8998->num_regulators regulator: max8998 - fix memory allocation size for max8998->rdev regulator: tps6507x - remove incorrect comments regulator: max1586 - improve the logic of choosing selector regulator: ab8500 - fix the logic to remove already registered regulators in error path regulator: ab3100 - fix the logic to remove already registered regulators in error path regulator/ab8500: move dereference below the check for NULL
This commit is contained in:
Коммит
3a919cf0bf
|
@ -13,7 +13,7 @@ regulators (where voltage output is controllable) and current sinks (where
|
|||
current limit is controllable).
|
||||
|
||||
(C) 2008 Wolfson Microelectronics PLC.
|
||||
Author: Liam Girdwood <lg@opensource.wolfsonmicro.com>
|
||||
Author: Liam Girdwood <lrg@slimlogic.co.uk>
|
||||
|
||||
|
||||
Nomenclature
|
||||
|
|
|
@ -215,7 +215,7 @@ static int pm8607_list_voltage(struct regulator_dev *rdev, unsigned index)
|
|||
struct pm8607_regulator_info *info = rdev_get_drvdata(rdev);
|
||||
int ret = -EINVAL;
|
||||
|
||||
if (info->vol_table && (index < (2 << info->vol_nbits))) {
|
||||
if (info->vol_table && (index < (1 << info->vol_nbits))) {
|
||||
ret = info->vol_table[index];
|
||||
if (info->slope_double)
|
||||
ret <<= 1;
|
||||
|
@ -233,7 +233,7 @@ static int choose_voltage(struct regulator_dev *rdev, int min_uV, int max_uV)
|
|||
max_uV = max_uV >> 1;
|
||||
}
|
||||
if (info->vol_table) {
|
||||
for (i = 0; i < (2 << info->vol_nbits); i++) {
|
||||
for (i = 0; i < (1 << info->vol_nbits); i++) {
|
||||
if (!info->vol_table[i])
|
||||
break;
|
||||
if ((min_uV <= info->vol_table[i])
|
||||
|
|
|
@ -634,12 +634,9 @@ static int __devinit ab3100_regulators_probe(struct platform_device *pdev)
|
|||
"%s: failed to register regulator %s err %d\n",
|
||||
__func__, ab3100_regulator_desc[i].name,
|
||||
err);
|
||||
i--;
|
||||
/* remove the already registered regulators */
|
||||
while (i > 0) {
|
||||
while (--i >= 0)
|
||||
regulator_unregister(ab3100_regulators[i].rdev);
|
||||
i--;
|
||||
}
|
||||
return err;
|
||||
}
|
||||
|
||||
|
|
|
@ -157,7 +157,7 @@ static int ab8500_list_voltage(struct regulator_dev *rdev, unsigned selector)
|
|||
if (info->fixed_uV)
|
||||
return info->fixed_uV;
|
||||
|
||||
if (selector > info->voltages_len)
|
||||
if (selector >= info->voltages_len)
|
||||
return -EINVAL;
|
||||
|
||||
return info->supported_voltages[selector];
|
||||
|
@ -344,13 +344,14 @@ static inline struct ab8500_regulator_info *find_regulator_info(int id)
|
|||
static __devinit int ab8500_regulator_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct ab8500 *ab8500 = dev_get_drvdata(pdev->dev.parent);
|
||||
struct ab8500_platform_data *pdata = dev_get_platdata(ab8500->dev);
|
||||
struct ab8500_platform_data *pdata;
|
||||
int i, err;
|
||||
|
||||
if (!ab8500) {
|
||||
dev_err(&pdev->dev, "null mfd parent\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
pdata = dev_get_platdata(ab8500->dev);
|
||||
|
||||
/* register all regulators */
|
||||
for (i = 0; i < ARRAY_SIZE(ab8500_regulator_info); i++) {
|
||||
|
@ -368,11 +369,9 @@ static __devinit int ab8500_regulator_probe(struct platform_device *pdev)
|
|||
dev_err(&pdev->dev, "failed to register regulator %s\n",
|
||||
info->desc.name);
|
||||
/* when we fail, un-register all earlier regulators */
|
||||
i--;
|
||||
while (i > 0) {
|
||||
while (--i >= 0) {
|
||||
info = &ab8500_regulator_info[i];
|
||||
regulator_unregister(info->regulator);
|
||||
i--;
|
||||
}
|
||||
return err;
|
||||
}
|
||||
|
|
|
@ -25,7 +25,7 @@ struct ad5398_chip_info {
|
|||
unsigned int current_level;
|
||||
unsigned int current_mask;
|
||||
unsigned int current_offset;
|
||||
struct regulator_dev rdev;
|
||||
struct regulator_dev *rdev;
|
||||
};
|
||||
|
||||
static int ad5398_calc_current(struct ad5398_chip_info *chip,
|
||||
|
@ -211,7 +211,6 @@ MODULE_DEVICE_TABLE(i2c, ad5398_id);
|
|||
static int __devinit ad5398_probe(struct i2c_client *client,
|
||||
const struct i2c_device_id *id)
|
||||
{
|
||||
struct regulator_dev *rdev;
|
||||
struct regulator_init_data *init_data = client->dev.platform_data;
|
||||
struct ad5398_chip_info *chip;
|
||||
const struct ad5398_current_data_format *df =
|
||||
|
@ -233,9 +232,10 @@ static int __devinit ad5398_probe(struct i2c_client *client,
|
|||
chip->current_offset = df->current_offset;
|
||||
chip->current_mask = (chip->current_level - 1) << chip->current_offset;
|
||||
|
||||
rdev = regulator_register(&ad5398_reg, &client->dev, init_data, chip);
|
||||
if (IS_ERR(rdev)) {
|
||||
ret = PTR_ERR(rdev);
|
||||
chip->rdev = regulator_register(&ad5398_reg, &client->dev,
|
||||
init_data, chip);
|
||||
if (IS_ERR(chip->rdev)) {
|
||||
ret = PTR_ERR(chip->rdev);
|
||||
dev_err(&client->dev, "failed to register %s %s\n",
|
||||
id->name, ad5398_reg.name);
|
||||
goto err;
|
||||
|
@ -254,7 +254,7 @@ static int __devexit ad5398_remove(struct i2c_client *client)
|
|||
{
|
||||
struct ad5398_chip_info *chip = i2c_get_clientdata(client);
|
||||
|
||||
regulator_unregister(&chip->rdev);
|
||||
regulator_unregister(chip->rdev);
|
||||
kfree(chip);
|
||||
i2c_set_clientdata(client, NULL);
|
||||
|
||||
|
|
|
@ -165,7 +165,7 @@ static int __devinit isl6271a_probe(struct i2c_client *i2c,
|
|||
mutex_init(&pmic->mtx);
|
||||
|
||||
for (i = 0; i < 3; i++) {
|
||||
pmic->rdev[i] = regulator_register(&isl_rd[0], &i2c->dev,
|
||||
pmic->rdev[i] = regulator_register(&isl_rd[i], &i2c->dev,
|
||||
init_data, pmic);
|
||||
if (IS_ERR(pmic->rdev[i])) {
|
||||
dev_err(&i2c->dev, "failed to register %s\n", id->name);
|
||||
|
|
|
@ -121,14 +121,14 @@ static int max1586_v6_set(struct regulator_dev *rdev, int min_uV, int max_uV)
|
|||
if (max_uV < MAX1586_V6_MIN_UV || max_uV > MAX1586_V6_MAX_UV)
|
||||
return -EINVAL;
|
||||
|
||||
if (min_uV >= 3000000)
|
||||
selector = 3;
|
||||
if (min_uV < 3000000)
|
||||
selector = 2;
|
||||
if (min_uV < 2500000)
|
||||
selector = 1;
|
||||
if (min_uV < 1800000)
|
||||
selector = 0;
|
||||
else if (min_uV < 2500000)
|
||||
selector = 1;
|
||||
else if (min_uV < 3000000)
|
||||
selector = 2;
|
||||
else if (min_uV >= 3000000)
|
||||
selector = 3;
|
||||
|
||||
if (max1586_v6_calc_voltage(selector) > max_uV)
|
||||
return -EINVAL;
|
||||
|
|
|
@ -549,7 +549,7 @@ static __devinit int max8998_pmic_probe(struct platform_device *pdev)
|
|||
if (!max8998)
|
||||
return -ENOMEM;
|
||||
|
||||
size = sizeof(struct regulator_dev *) * (pdata->num_regulators + 1);
|
||||
size = sizeof(struct regulator_dev *) * pdata->num_regulators;
|
||||
max8998->rdev = kzalloc(size, GFP_KERNEL);
|
||||
if (!max8998->rdev) {
|
||||
kfree(max8998);
|
||||
|
@ -557,7 +557,9 @@ static __devinit int max8998_pmic_probe(struct platform_device *pdev)
|
|||
}
|
||||
|
||||
rdev = max8998->rdev;
|
||||
max8998->dev = &pdev->dev;
|
||||
max8998->iodev = iodev;
|
||||
max8998->num_regulators = pdata->num_regulators;
|
||||
platform_set_drvdata(pdev, max8998);
|
||||
|
||||
for (i = 0; i < pdata->num_regulators; i++) {
|
||||
|
@ -583,7 +585,7 @@ static __devinit int max8998_pmic_probe(struct platform_device *pdev)
|
|||
|
||||
return 0;
|
||||
err:
|
||||
for (i = 0; i <= max8998->num_regulators; i++)
|
||||
for (i = 0; i < max8998->num_regulators; i++)
|
||||
if (rdev[i])
|
||||
regulator_unregister(rdev[i]);
|
||||
|
||||
|
@ -599,7 +601,7 @@ static int __devexit max8998_pmic_remove(struct platform_device *pdev)
|
|||
struct regulator_dev **rdev = max8998->rdev;
|
||||
int i;
|
||||
|
||||
for (i = 0; i <= max8998->num_regulators; i++)
|
||||
for (i = 0; i < max8998->num_regulators; i++)
|
||||
if (rdev[i])
|
||||
regulator_unregister(rdev[i]);
|
||||
|
||||
|
|
|
@ -626,12 +626,6 @@ fail:
|
|||
return error;
|
||||
}
|
||||
|
||||
/**
|
||||
* tps6507x_remove - TPS6507x driver i2c remove handler
|
||||
* @client: i2c driver client device structure
|
||||
*
|
||||
* Unregister TPS driver as an i2c client device driver
|
||||
*/
|
||||
static int __devexit tps6507x_pmic_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct tps6507x_dev *tps6507x_dev = platform_get_drvdata(pdev);
|
||||
|
|
|
@ -133,7 +133,7 @@ static int tps6586x_ldo_get_voltage(struct regulator_dev *rdev)
|
|||
mask = ((1 << ri->volt_nbits) - 1) << ri->volt_shift;
|
||||
val = (val & mask) >> ri->volt_shift;
|
||||
|
||||
if (val > ri->desc.n_voltages)
|
||||
if (val >= ri->desc.n_voltages)
|
||||
BUG();
|
||||
|
||||
return ri->voltages[val] * 1000;
|
||||
|
@ -150,7 +150,7 @@ static int tps6586x_dvm_set_voltage(struct regulator_dev *rdev,
|
|||
if (ret)
|
||||
return ret;
|
||||
|
||||
return tps6586x_set_bits(parent, ri->go_reg, ri->go_bit);
|
||||
return tps6586x_set_bits(parent, ri->go_reg, 1 << ri->go_bit);
|
||||
}
|
||||
|
||||
static int tps6586x_regulator_enable(struct regulator_dev *rdev)
|
||||
|
|
|
@ -215,8 +215,7 @@ static int wm831x_gp_ldo_set_mode(struct regulator_dev *rdev,
|
|||
|
||||
case REGULATOR_MODE_IDLE:
|
||||
ret = wm831x_set_bits(wm831x, ctrl_reg,
|
||||
WM831X_LDO1_LP_MODE,
|
||||
WM831X_LDO1_LP_MODE);
|
||||
WM831X_LDO1_LP_MODE, 0);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
|
@ -225,10 +224,12 @@ static int wm831x_gp_ldo_set_mode(struct regulator_dev *rdev,
|
|||
WM831X_LDO1_ON_MODE);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
break;
|
||||
|
||||
case REGULATOR_MODE_STANDBY:
|
||||
ret = wm831x_set_bits(wm831x, ctrl_reg,
|
||||
WM831X_LDO1_LP_MODE, 0);
|
||||
WM831X_LDO1_LP_MODE,
|
||||
WM831X_LDO1_LP_MODE);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
|
|
|
@ -1129,7 +1129,7 @@ static unsigned int wm8350_dcdc_get_mode(struct regulator_dev *rdev)
|
|||
mode = REGULATOR_MODE_NORMAL;
|
||||
} else if (!active && !sleep)
|
||||
mode = REGULATOR_MODE_IDLE;
|
||||
else if (!sleep)
|
||||
else if (sleep)
|
||||
mode = REGULATOR_MODE_STANDBY;
|
||||
|
||||
return mode;
|
||||
|
|
Загрузка…
Ссылка в новой задаче