Commit ebbed04f authored by Dmitry Torokhov's avatar Dmitry Torokhov Committed by Liam Girdwood

Regulators: lp3971 - fail if platform data was not supplied

There is no point in completing probe if platform data is missing so
let's abort loading early.

Also, use kcalloc when allocating several instances of the same data
structure and mark setup_regulators() as __devinit since it is only
called from lp3971_i2c_probe() which is __devinit.
Signed-off-by: default avatarDmitry Torokhov <dtor@mail.ru>
Acked-by: default avatarMark Brown <broonie@opensource.wolfsonmicro.com>
Signed-off-by: default avatarLiam Girdwood <lrg@slimlogic.co.uk>
parent 56c23492
...@@ -431,20 +431,20 @@ static int lp3971_set_bits(struct lp3971 *lp3971, u8 reg, u16 mask, u16 val) ...@@ -431,20 +431,20 @@ static int lp3971_set_bits(struct lp3971 *lp3971, u8 reg, u16 mask, u16 val)
return ret; return ret;
} }
static int setup_regulators(struct lp3971 *lp3971, static int __devinit setup_regulators(struct lp3971 *lp3971,
struct lp3971_platform_data *pdata) struct lp3971_platform_data *pdata)
{ {
int i, err; int i, err;
int num_regulators = pdata->num_regulators;
lp3971->num_regulators = num_regulators; lp3971->num_regulators = pdata->num_regulators;
lp3971->rdev = kzalloc(sizeof(struct regulator_dev *) * num_regulators, lp3971->rdev = kcalloc(pdata->num_regulators,
GFP_KERNEL); sizeof(struct regulator_dev *), GFP_KERNEL);
/* Instantiate the regulators */ /* Instantiate the regulators */
for (i = 0; i < num_regulators; i++) { for (i = 0; i < pdata->num_regulators; i++) {
int id = pdata->regulators[i].id; struct lp3971_regulator_subdev *reg = &pdata->regulators[i];
lp3971->rdev[i] = regulator_register(&regulators[id], lp3971->rdev[i] = regulator_register(&regulators[reg->id],
lp3971->dev, pdata->regulators[i].initdata, lp3971); lp3971->dev, reg->initdata, lp3971);
if (IS_ERR(lp3971->rdev[i])) { if (IS_ERR(lp3971->rdev[i])) {
err = PTR_ERR(lp3971->rdev[i]); err = PTR_ERR(lp3971->rdev[i]);
...@@ -455,10 +455,10 @@ static int setup_regulators(struct lp3971 *lp3971, ...@@ -455,10 +455,10 @@ static int setup_regulators(struct lp3971 *lp3971,
} }
return 0; return 0;
error: error:
for (i = 0; i < num_regulators; i++) while (--i >= 0)
if (lp3971->rdev[i]) regulator_unregister(lp3971->rdev[i]);
regulator_unregister(lp3971->rdev[i]);
kfree(lp3971->rdev); kfree(lp3971->rdev);
lp3971->rdev = NULL; lp3971->rdev = NULL;
return err; return err;
...@@ -472,15 +472,17 @@ static int __devinit lp3971_i2c_probe(struct i2c_client *i2c, ...@@ -472,15 +472,17 @@ static int __devinit lp3971_i2c_probe(struct i2c_client *i2c,
int ret; int ret;
u16 val; u16 val;
lp3971 = kzalloc(sizeof(struct lp3971), GFP_KERNEL); if (!pdata) {
if (lp3971 == NULL) { dev_dbg(&i2c->dev, "No platform init data supplied\n");
ret = -ENOMEM; return -ENODEV;
goto err;
} }
lp3971 = kzalloc(sizeof(struct lp3971), GFP_KERNEL);
if (lp3971 == NULL)
return -ENOMEM;
lp3971->i2c = i2c; lp3971->i2c = i2c;
lp3971->dev = &i2c->dev; lp3971->dev = &i2c->dev;
i2c_set_clientdata(i2c, lp3971);
mutex_init(&lp3971->io_lock); mutex_init(&lp3971->io_lock);
...@@ -493,19 +495,15 @@ static int __devinit lp3971_i2c_probe(struct i2c_client *i2c, ...@@ -493,19 +495,15 @@ static int __devinit lp3971_i2c_probe(struct i2c_client *i2c,
goto err_detect; goto err_detect;
} }
if (pdata) { ret = setup_regulators(lp3971, pdata);
ret = setup_regulators(lp3971, pdata); if (ret < 0)
if (ret < 0) goto err_detect;
goto err_detect;
} else
dev_warn(lp3971->dev, "No platform init data supplied\n");
i2c_set_clientdata(i2c, lp3971);
return 0; return 0;
err_detect: err_detect:
i2c_set_clientdata(i2c, NULL);
kfree(lp3971); kfree(lp3971);
err:
return ret; return ret;
} }
...@@ -513,11 +511,13 @@ static int __devexit lp3971_i2c_remove(struct i2c_client *i2c) ...@@ -513,11 +511,13 @@ static int __devexit lp3971_i2c_remove(struct i2c_client *i2c)
{ {
struct lp3971 *lp3971 = i2c_get_clientdata(i2c); struct lp3971 *lp3971 = i2c_get_clientdata(i2c);
int i; int i;
i2c_set_clientdata(i2c, NULL);
for (i = 0; i < lp3971->num_regulators; i++) for (i = 0; i < lp3971->num_regulators; i++)
if (lp3971->rdev[i]) regulator_unregister(lp3971->rdev[i]);
regulator_unregister(lp3971->rdev[i]);
kfree(lp3971->rdev); kfree(lp3971->rdev);
i2c_set_clientdata(i2c, NULL);
kfree(lp3971); kfree(lp3971);
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