From: Dmitry Torokhov <dmitry.torokhov@gmail.com>
To: Liam Girdwood <lrg@slimlogic.co.uk>
Cc: Mark Brown <broonie@opensource.wolfsonmicro.com>,
linux-kernel@vger.kernel.org
Subject: [PATCH 07/14] Regulators: lp3971 - fail if platform data was not supplied
Date: Tue, 23 Feb 2010 23:38:17 -0800 [thread overview]
Message-ID: <20100224073817.15964.82625.stgit@localhost.localdomain> (raw)
In-Reply-To: <20100224073342.15964.8863.stgit@localhost.localdomain>
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: Dmitry Torokhov <dtor@mail.ru>
---
drivers/regulator/lp3971.c | 58 ++++++++++++++++++++++----------------------
1 files changed, 29 insertions(+), 29 deletions(-)
diff --git a/drivers/regulator/lp3971.c b/drivers/regulator/lp3971.c
index 3ea639f..f5532ed 100644
--- a/drivers/regulator/lp3971.c
+++ b/drivers/regulator/lp3971.c
@@ -431,20 +431,20 @@ static int lp3971_set_bits(struct lp3971 *lp3971, u8 reg, u16 mask, u16 val)
return ret;
}
-static int setup_regulators(struct lp3971 *lp3971,
- struct lp3971_platform_data *pdata)
+static int __devinit setup_regulators(struct lp3971 *lp3971,
+ struct lp3971_platform_data *pdata)
{
int i, err;
- int num_regulators = pdata->num_regulators;
- lp3971->num_regulators = num_regulators;
- lp3971->rdev = kzalloc(sizeof(struct regulator_dev *) * num_regulators,
- GFP_KERNEL);
+
+ lp3971->num_regulators = pdata->num_regulators;
+ lp3971->rdev = kcalloc(pdata->num_regulators,
+ sizeof(struct regulator_dev *), GFP_KERNEL);
/* Instantiate the regulators */
- for (i = 0; i < num_regulators; i++) {
- int id = pdata->regulators[i].id;
- lp3971->rdev[i] = regulator_register(®ulators[id],
- lp3971->dev, pdata->regulators[i].initdata, lp3971);
+ for (i = 0; i < pdata->num_regulators; i++) {
+ struct lp3971_regulator_subdev *reg = &pdata->regulators[i];
+ lp3971->rdev[i] = regulator_register(®ulators[reg->id],
+ lp3971->dev, reg->initdata, lp3971);
if (IS_ERR(lp3971->rdev[i])) {
err = PTR_ERR(lp3971->rdev[i]);
@@ -455,10 +455,10 @@ static int setup_regulators(struct lp3971 *lp3971,
}
return 0;
+
error:
- for (i = 0; i < num_regulators; i++)
- if (lp3971->rdev[i])
- regulator_unregister(lp3971->rdev[i]);
+ while (--i >= 0)
+ regulator_unregister(lp3971->rdev[i]);
kfree(lp3971->rdev);
lp3971->rdev = NULL;
return err;
@@ -472,15 +472,17 @@ static int __devinit lp3971_i2c_probe(struct i2c_client *i2c,
int ret;
u16 val;
- lp3971 = kzalloc(sizeof(struct lp3971), GFP_KERNEL);
- if (lp3971 == NULL) {
- ret = -ENOMEM;
- goto err;
+ if (!pdata) {
+ dev_dbg(&i2c->dev, "No platform init data supplied\n");
+ return -ENODEV;
}
+ lp3971 = kzalloc(sizeof(struct lp3971), GFP_KERNEL);
+ if (lp3971 == NULL)
+ return -ENOMEM;
+
lp3971->i2c = i2c;
lp3971->dev = &i2c->dev;
- i2c_set_clientdata(i2c, lp3971);
mutex_init(&lp3971->io_lock);
@@ -493,19 +495,15 @@ static int __devinit lp3971_i2c_probe(struct i2c_client *i2c,
goto err_detect;
}
- if (pdata) {
- ret = setup_regulators(lp3971, pdata);
- if (ret < 0)
- goto err_detect;
- } else
- dev_warn(lp3971->dev, "No platform init data supplied\n");
+ ret = setup_regulators(lp3971, pdata);
+ if (ret < 0)
+ goto err_detect;
+ i2c_set_clientdata(i2c, lp3971);
return 0;
err_detect:
- i2c_set_clientdata(i2c, NULL);
kfree(lp3971);
-err:
return ret;
}
@@ -513,11 +511,13 @@ static int __devexit lp3971_i2c_remove(struct i2c_client *i2c)
{
struct lp3971 *lp3971 = i2c_get_clientdata(i2c);
int i;
+
+ i2c_set_clientdata(i2c, NULL);
+
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);
- i2c_set_clientdata(i2c, NULL);
kfree(lp3971);
return 0;
next prev parent reply other threads:[~2010-02-24 7:38 UTC|newest]
Thread overview: 51+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-02-24 7:37 [PATCH 00/14] Assorted small patches for regulators Dmitry Torokhov
2010-02-24 7:37 ` [PATCH 01/14] Regulators: virtual - use sysfs attribute groups Dmitry Torokhov
2010-02-24 10:50 ` Mark Brown
2010-02-25 10:35 ` Liam Girdwood
2010-02-24 7:37 ` [PATCH 02/14] Regulators: ab3100 - fix probe and remove annotations Dmitry Torokhov
2010-02-24 10:03 ` Mark Brown
2010-02-25 10:36 ` Liam Girdwood
2010-02-24 7:37 ` [PATCH 03/14] Regulators: fixed - annotate probe and remove methods Dmitry Torokhov
2010-02-24 10:43 ` Mark Brown
2010-02-25 10:36 ` Liam Girdwood
2010-02-24 7:38 ` [PATCH 04/14] Regulators: twl-regulator - mark probe function as __devinit Dmitry Torokhov
2010-02-24 10:05 ` Mark Brown
2010-02-25 10:36 ` Liam Girdwood
2010-02-24 7:38 ` [PATCH 05/14] Regulators: tps65023-regulator - mark probe method " Dmitry Torokhov
2010-02-24 11:31 ` Mark Brown
2010-02-25 10:37 ` Liam Girdwood
2010-02-24 7:38 ` [PATCH 06/14] Regulators: tps6507x-regulator " Dmitry Torokhov
2010-02-24 11:32 ` Mark Brown
2010-02-25 10:37 ` Liam Girdwood
2010-02-24 7:38 ` Dmitry Torokhov [this message]
2010-02-24 12:11 ` [PATCH 07/14] Regulators: lp3971 - fail if platform data was not supplied Mark Brown
2010-02-25 10:37 ` Liam Girdwood
2010-02-24 7:38 ` [PATCH 08/14] Regulators: max1586 - annotate probe and remove methods Dmitry Torokhov
2010-02-24 10:06 ` Mark Brown
2010-02-24 10:16 ` Dmitry Torokhov
2010-02-25 10:37 ` Liam Girdwood
2010-02-24 7:38 ` [PATCH 09/14] Regulators: max8660 " Dmitry Torokhov
2010-02-24 10:07 ` Mark Brown
2010-02-25 10:37 ` Liam Girdwood
2010-02-24 7:38 ` [PATCH 10/14] Regulators: pcap-regulator - clean up driver data after removal Dmitry Torokhov
2010-02-24 10:36 ` Mark Brown
2010-02-25 10:38 ` Liam Girdwood
2010-02-24 7:38 ` [PATCH 11/14] Regulators: wm831x-xxx " Dmitry Torokhov
2010-02-24 10:36 ` Mark Brown
2010-02-25 10:38 ` Liam Girdwood
2010-02-24 7:38 ` [PATCH 12/14] Regulators: wm8994 " Dmitry Torokhov
2010-02-24 10:20 ` Mark Brown
2010-02-25 10:39 ` Liam Girdwood
2010-02-24 7:38 ` [PATCH 13/14] Regulators: wm8400 - cleanup platform driver data handling Dmitry Torokhov
2010-02-24 10:25 ` Mark Brown
2010-02-24 19:02 ` Dmitry Torokhov
2010-02-24 19:14 ` Mark Brown
2010-02-24 19:21 ` Dmitry Torokhov
2010-02-24 20:40 ` Mark Brown
2010-02-25 9:55 ` Dmitry Torokhov
2010-02-25 10:43 ` Mark Brown
2010-02-25 11:02 ` Liam Girdwood
2010-02-24 7:38 ` [PATCH 14/14] Regulators: max8925-regulator - clean up driver data after removal Dmitry Torokhov
2010-02-24 10:28 ` Mark Brown
2010-02-25 10:39 ` Liam Girdwood
2010-02-24 10:03 ` [PATCH 00/14] Assorted small patches for regulators Mark Brown
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20100224073817.15964.82625.stgit@localhost.localdomain \
--to=dmitry.torokhov@gmail.com \
--cc=broonie@opensource.wolfsonmicro.com \
--cc=linux-kernel@vger.kernel.org \
--cc=lrg@slimlogic.co.uk \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox