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:
commit
3a919cf0bf
@ -13,7 +13,7 @@ regulators (where voltage output is controllable) and current sinks (where
|
|||||||
current limit is controllable).
|
current limit is controllable).
|
||||||
|
|
||||||
(C) 2008 Wolfson Microelectronics PLC.
|
(C) 2008 Wolfson Microelectronics PLC.
|
||||||
Author: Liam Girdwood <lg@opensource.wolfsonmicro.com>
|
Author: Liam Girdwood <lrg@slimlogic.co.uk>
|
||||||
|
|
||||||
|
|
||||||
Nomenclature
|
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);
|
struct pm8607_regulator_info *info = rdev_get_drvdata(rdev);
|
||||||
int ret = -EINVAL;
|
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];
|
ret = info->vol_table[index];
|
||||||
if (info->slope_double)
|
if (info->slope_double)
|
||||||
ret <<= 1;
|
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;
|
max_uV = max_uV >> 1;
|
||||||
}
|
}
|
||||||
if (info->vol_table) {
|
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])
|
if (!info->vol_table[i])
|
||||||
break;
|
break;
|
||||||
if ((min_uV <= info->vol_table[i])
|
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",
|
"%s: failed to register regulator %s err %d\n",
|
||||||
__func__, ab3100_regulator_desc[i].name,
|
__func__, ab3100_regulator_desc[i].name,
|
||||||
err);
|
err);
|
||||||
i--;
|
|
||||||
/* remove the already registered regulators */
|
/* remove the already registered regulators */
|
||||||
while (i > 0) {
|
while (--i >= 0)
|
||||||
regulator_unregister(ab3100_regulators[i].rdev);
|
regulator_unregister(ab3100_regulators[i].rdev);
|
||||||
i--;
|
|
||||||
}
|
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -157,7 +157,7 @@ static int ab8500_list_voltage(struct regulator_dev *rdev, unsigned selector)
|
|||||||
if (info->fixed_uV)
|
if (info->fixed_uV)
|
||||||
return info->fixed_uV;
|
return info->fixed_uV;
|
||||||
|
|
||||||
if (selector > info->voltages_len)
|
if (selector >= info->voltages_len)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
return info->supported_voltages[selector];
|
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)
|
static __devinit int ab8500_regulator_probe(struct platform_device *pdev)
|
||||||
{
|
{
|
||||||
struct ab8500 *ab8500 = dev_get_drvdata(pdev->dev.parent);
|
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;
|
int i, err;
|
||||||
|
|
||||||
if (!ab8500) {
|
if (!ab8500) {
|
||||||
dev_err(&pdev->dev, "null mfd parent\n");
|
dev_err(&pdev->dev, "null mfd parent\n");
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
pdata = dev_get_platdata(ab8500->dev);
|
||||||
|
|
||||||
/* register all regulators */
|
/* register all regulators */
|
||||||
for (i = 0; i < ARRAY_SIZE(ab8500_regulator_info); i++) {
|
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",
|
dev_err(&pdev->dev, "failed to register regulator %s\n",
|
||||||
info->desc.name);
|
info->desc.name);
|
||||||
/* when we fail, un-register all earlier regulators */
|
/* when we fail, un-register all earlier regulators */
|
||||||
i--;
|
while (--i >= 0) {
|
||||||
while (i > 0) {
|
|
||||||
info = &ab8500_regulator_info[i];
|
info = &ab8500_regulator_info[i];
|
||||||
regulator_unregister(info->regulator);
|
regulator_unregister(info->regulator);
|
||||||
i--;
|
|
||||||
}
|
}
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
@ -25,7 +25,7 @@ struct ad5398_chip_info {
|
|||||||
unsigned int current_level;
|
unsigned int current_level;
|
||||||
unsigned int current_mask;
|
unsigned int current_mask;
|
||||||
unsigned int current_offset;
|
unsigned int current_offset;
|
||||||
struct regulator_dev rdev;
|
struct regulator_dev *rdev;
|
||||||
};
|
};
|
||||||
|
|
||||||
static int ad5398_calc_current(struct ad5398_chip_info *chip,
|
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,
|
static int __devinit ad5398_probe(struct i2c_client *client,
|
||||||
const struct i2c_device_id *id)
|
const struct i2c_device_id *id)
|
||||||
{
|
{
|
||||||
struct regulator_dev *rdev;
|
|
||||||
struct regulator_init_data *init_data = client->dev.platform_data;
|
struct regulator_init_data *init_data = client->dev.platform_data;
|
||||||
struct ad5398_chip_info *chip;
|
struct ad5398_chip_info *chip;
|
||||||
const struct ad5398_current_data_format *df =
|
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_offset = df->current_offset;
|
||||||
chip->current_mask = (chip->current_level - 1) << chip->current_offset;
|
chip->current_mask = (chip->current_level - 1) << chip->current_offset;
|
||||||
|
|
||||||
rdev = regulator_register(&ad5398_reg, &client->dev, init_data, chip);
|
chip->rdev = regulator_register(&ad5398_reg, &client->dev,
|
||||||
if (IS_ERR(rdev)) {
|
init_data, chip);
|
||||||
ret = PTR_ERR(rdev);
|
if (IS_ERR(chip->rdev)) {
|
||||||
|
ret = PTR_ERR(chip->rdev);
|
||||||
dev_err(&client->dev, "failed to register %s %s\n",
|
dev_err(&client->dev, "failed to register %s %s\n",
|
||||||
id->name, ad5398_reg.name);
|
id->name, ad5398_reg.name);
|
||||||
goto err;
|
goto err;
|
||||||
@ -254,7 +254,7 @@ static int __devexit ad5398_remove(struct i2c_client *client)
|
|||||||
{
|
{
|
||||||
struct ad5398_chip_info *chip = i2c_get_clientdata(client);
|
struct ad5398_chip_info *chip = i2c_get_clientdata(client);
|
||||||
|
|
||||||
regulator_unregister(&chip->rdev);
|
regulator_unregister(chip->rdev);
|
||||||
kfree(chip);
|
kfree(chip);
|
||||||
i2c_set_clientdata(client, NULL);
|
i2c_set_clientdata(client, NULL);
|
||||||
|
|
||||||
|
@ -165,7 +165,7 @@ static int __devinit isl6271a_probe(struct i2c_client *i2c,
|
|||||||
mutex_init(&pmic->mtx);
|
mutex_init(&pmic->mtx);
|
||||||
|
|
||||||
for (i = 0; i < 3; i++) {
|
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);
|
init_data, pmic);
|
||||||
if (IS_ERR(pmic->rdev[i])) {
|
if (IS_ERR(pmic->rdev[i])) {
|
||||||
dev_err(&i2c->dev, "failed to register %s\n", id->name);
|
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)
|
if (max_uV < MAX1586_V6_MIN_UV || max_uV > MAX1586_V6_MAX_UV)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
if (min_uV >= 3000000)
|
|
||||||
selector = 3;
|
|
||||||
if (min_uV < 3000000)
|
|
||||||
selector = 2;
|
|
||||||
if (min_uV < 2500000)
|
|
||||||
selector = 1;
|
|
||||||
if (min_uV < 1800000)
|
if (min_uV < 1800000)
|
||||||
selector = 0;
|
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)
|
if (max1586_v6_calc_voltage(selector) > max_uV)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
@ -549,7 +549,7 @@ static __devinit int max8998_pmic_probe(struct platform_device *pdev)
|
|||||||
if (!max8998)
|
if (!max8998)
|
||||||
return -ENOMEM;
|
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);
|
max8998->rdev = kzalloc(size, GFP_KERNEL);
|
||||||
if (!max8998->rdev) {
|
if (!max8998->rdev) {
|
||||||
kfree(max8998);
|
kfree(max8998);
|
||||||
@ -557,7 +557,9 @@ static __devinit int max8998_pmic_probe(struct platform_device *pdev)
|
|||||||
}
|
}
|
||||||
|
|
||||||
rdev = max8998->rdev;
|
rdev = max8998->rdev;
|
||||||
|
max8998->dev = &pdev->dev;
|
||||||
max8998->iodev = iodev;
|
max8998->iodev = iodev;
|
||||||
|
max8998->num_regulators = pdata->num_regulators;
|
||||||
platform_set_drvdata(pdev, max8998);
|
platform_set_drvdata(pdev, max8998);
|
||||||
|
|
||||||
for (i = 0; i < pdata->num_regulators; i++) {
|
for (i = 0; i < pdata->num_regulators; i++) {
|
||||||
@ -583,7 +585,7 @@ static __devinit int max8998_pmic_probe(struct platform_device *pdev)
|
|||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
err:
|
err:
|
||||||
for (i = 0; i <= max8998->num_regulators; i++)
|
for (i = 0; i < max8998->num_regulators; i++)
|
||||||
if (rdev[i])
|
if (rdev[i])
|
||||||
regulator_unregister(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;
|
struct regulator_dev **rdev = max8998->rdev;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = 0; i <= max8998->num_regulators; i++)
|
for (i = 0; i < max8998->num_regulators; i++)
|
||||||
if (rdev[i])
|
if (rdev[i])
|
||||||
regulator_unregister(rdev[i]);
|
regulator_unregister(rdev[i]);
|
||||||
|
|
||||||
|
@ -626,12 +626,6 @@ fail:
|
|||||||
return error;
|
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)
|
static int __devexit tps6507x_pmic_remove(struct platform_device *pdev)
|
||||||
{
|
{
|
||||||
struct tps6507x_dev *tps6507x_dev = platform_get_drvdata(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;
|
mask = ((1 << ri->volt_nbits) - 1) << ri->volt_shift;
|
||||||
val = (val & mask) >> ri->volt_shift;
|
val = (val & mask) >> ri->volt_shift;
|
||||||
|
|
||||||
if (val > ri->desc.n_voltages)
|
if (val >= ri->desc.n_voltages)
|
||||||
BUG();
|
BUG();
|
||||||
|
|
||||||
return ri->voltages[val] * 1000;
|
return ri->voltages[val] * 1000;
|
||||||
@ -150,7 +150,7 @@ static int tps6586x_dvm_set_voltage(struct regulator_dev *rdev,
|
|||||||
if (ret)
|
if (ret)
|
||||||
return 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)
|
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:
|
case REGULATOR_MODE_IDLE:
|
||||||
ret = wm831x_set_bits(wm831x, ctrl_reg,
|
ret = wm831x_set_bits(wm831x, ctrl_reg,
|
||||||
WM831X_LDO1_LP_MODE,
|
WM831X_LDO1_LP_MODE, 0);
|
||||||
WM831X_LDO1_LP_MODE);
|
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
@ -225,10 +224,12 @@ static int wm831x_gp_ldo_set_mode(struct regulator_dev *rdev,
|
|||||||
WM831X_LDO1_ON_MODE);
|
WM831X_LDO1_ON_MODE);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
|
break;
|
||||||
|
|
||||||
case REGULATOR_MODE_STANDBY:
|
case REGULATOR_MODE_STANDBY:
|
||||||
ret = wm831x_set_bits(wm831x, ctrl_reg,
|
ret = wm831x_set_bits(wm831x, ctrl_reg,
|
||||||
WM831X_LDO1_LP_MODE, 0);
|
WM831X_LDO1_LP_MODE,
|
||||||
|
WM831X_LDO1_LP_MODE);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
|
@ -1129,7 +1129,7 @@ static unsigned int wm8350_dcdc_get_mode(struct regulator_dev *rdev)
|
|||||||
mode = REGULATOR_MODE_NORMAL;
|
mode = REGULATOR_MODE_NORMAL;
|
||||||
} else if (!active && !sleep)
|
} else if (!active && !sleep)
|
||||||
mode = REGULATOR_MODE_IDLE;
|
mode = REGULATOR_MODE_IDLE;
|
||||||
else if (!sleep)
|
else if (sleep)
|
||||||
mode = REGULATOR_MODE_STANDBY;
|
mode = REGULATOR_MODE_STANDBY;
|
||||||
|
|
||||||
return mode;
|
return mode;
|
||||||
|
Loading…
Reference in New Issue
Block a user