From: Maarten ter Huurne <maarten@treewalker.org>
To: Wenyou Yang <wenyou.yang@atmel.com>
Cc: Zubair Lutfullah Kakakhel <Zubair.Kakakhel@imgtec.com>,
Liam Girdwood <lgirdwood@gmail.com>,
Mark Brown <broonie@kernel.org>,
linux-kernel@vger.kernel.org,
Maarten ter Huurne <maarten@treewalker.org>
Subject: [PATCH 5/7] regulator: act8865: Pass of_node via act8865_regulator_data
Date: Sun, 28 Feb 2016 16:53:27 +0100 [thread overview]
Message-ID: <1456674809-16422-5-git-send-email-maarten@treewalker.org> (raw)
In-Reply-To: <1456674809-16422-1-git-send-email-maarten@treewalker.org>
This makes the code easier to read and it avoids a dynamic memory
allocation.
Note that the "too many regulators" error handler was broken prior
to its removal in this commit, since it dereferenced pdata, which
can be NULL in the non-DT case.
Signed-off-by: Maarten ter Huurne <maarten@treewalker.org>
---
drivers/regulator/act8865-regulator.c | 42 +++++++++++++----------------------
include/linux/regulator/act8865.h | 2 ++
2 files changed, 18 insertions(+), 26 deletions(-)
diff --git a/drivers/regulator/act8865-regulator.c b/drivers/regulator/act8865-regulator.c
index 0d1b235..cdfe082 100644
--- a/drivers/regulator/act8865-regulator.c
+++ b/drivers/regulator/act8865-regulator.c
@@ -368,7 +368,6 @@ static struct of_regulator_match act8600_matches[] = {
};
static int act8865_pdata_from_dt(struct device *dev,
- struct device_node **of_node,
struct act8865_platform_data *pdata,
unsigned long type)
{
@@ -419,7 +418,7 @@ static int act8865_pdata_from_dt(struct device *dev,
regulator->id = i;
regulator->name = matches[i].name;
regulator->init_data = matches[i].init_data;
- of_node[i] = matches[i].of_node;
+ regulator->of_node = matches[i].of_node;
regulator++;
}
@@ -427,7 +426,6 @@ static int act8865_pdata_from_dt(struct device *dev,
}
#else
static inline int act8865_pdata_from_dt(struct device *dev,
- struct device_node **of_node,
struct act8865_platform_data *pdata,
unsigned long type)
{
@@ -435,8 +433,8 @@ static inline int act8865_pdata_from_dt(struct device *dev,
}
#endif
-static struct regulator_init_data
-*act8865_get_init_data(int id, struct act8865_platform_data *pdata)
+static struct act8865_regulator_data *act8865_get_regulator_data(
+ int id, struct act8865_platform_data *pdata)
{
int i;
@@ -445,7 +443,7 @@ static struct regulator_init_data
for (i = 0; i < pdata->num_regulators; i++) {
if (pdata->regulators[i].id == id)
- return pdata->regulators[i].init_data;
+ return &pdata->regulators[i];
}
return NULL;
@@ -467,7 +465,6 @@ static int act8865_pmic_probe(struct i2c_client *client,
const struct regulator_desc *regulators;
struct act8865_platform_data pdata_of, *pdata;
struct device *dev = &client->dev;
- struct device_node **of_node;
int i, ret, num_regulators;
struct act8865 *act8865;
struct regmap_config regmap_config = {
@@ -531,25 +528,14 @@ static int act8865_pmic_probe(struct i2c_client *client,
return -EINVAL;
}
- of_node = devm_kzalloc(dev, sizeof(struct device_node *) *
- num_regulators, GFP_KERNEL);
- if (!of_node)
- return -ENOMEM;
-
if (dev->of_node && !pdata) {
- ret = act8865_pdata_from_dt(dev, of_node, &pdata_of, type);
+ ret = act8865_pdata_from_dt(dev, &pdata_of, type);
if (ret < 0)
return ret;
pdata = &pdata_of;
}
- if (pdata->num_regulators > num_regulators) {
- dev_err(dev, "too many regulators: %d\n",
- pdata->num_regulators);
- return -EINVAL;
- }
-
act8865 = devm_kzalloc(dev, sizeof(struct act8865), GFP_KERNEL);
if (!act8865)
return -ENOMEM;
@@ -575,14 +561,19 @@ static int act8865_pmic_probe(struct i2c_client *client,
/* Finally register devices */
for (i = 0; i < num_regulators; i++) {
const struct regulator_desc *desc = ®ulators[i];
- struct regulator_config config = { };
+ struct regulator_config config = {
+ .dev = dev,
+ .regmap = act8865->regmap,
+ .driver_data = act8865,
+ };
+ struct act8865_regulator_data *rdata;
struct regulator_dev *rdev;
- config.dev = dev;
- config.init_data = act8865_get_init_data(desc->id, pdata);
- config.of_node = of_node[i];
- config.driver_data = act8865;
- config.regmap = act8865->regmap;
+ rdata = act8865_get_regulator_data(desc->id, pdata);
+ if (rdata) {
+ config.init_data = rdata->init_data;
+ config.of_node = rdata->of_node;
+ }
rdev = devm_regulator_register(dev, desc, &config);
if (IS_ERR(rdev)) {
@@ -592,7 +583,6 @@ static int act8865_pmic_probe(struct i2c_client *client,
}
i2c_set_clientdata(client, act8865);
- devm_kfree(dev, of_node);
return 0;
}
diff --git a/include/linux/regulator/act8865.h b/include/linux/regulator/act8865.h
index 2eb3860..113d861 100644
--- a/include/linux/regulator/act8865.h
+++ b/include/linux/regulator/act8865.h
@@ -69,11 +69,13 @@ enum {
* @id: regulator id
* @name: regulator name
* @init_data: regulator init data
+ * @of_node: device tree node (optional)
*/
struct act8865_regulator_data {
int id;
const char *name;
struct regulator_init_data *init_data;
+ struct device_node *of_node;
};
/**
--
2.6.2
next prev parent reply other threads:[~2016-02-28 15:54 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-02-28 15:53 [PATCH 1/7] regulator: act8865: Expose act8600 registers via debugfs Maarten ter Huurne
2016-02-28 15:53 ` [PATCH 2/7] regulator: act8865: Remove redundant dev lookups Maarten ter Huurne
2016-02-28 15:53 ` [PATCH 3/7] regulator: act8865: Remove "static" from local variable Maarten ter Huurne
2016-02-28 15:53 ` [PATCH 4/7] regulator: act8865: Rename platform_data field to init_data Maarten ter Huurne
2016-02-28 15:53 ` Maarten ter Huurne [this message]
2016-02-29 11:37 ` [PATCH 5/7] regulator: act8865: Pass of_node via act8865_regulator_data Mark Brown
2016-02-28 15:53 ` [PATCH 6/7] regulator: act8865: Specify fixed voltage of 3.3V for ACT8600's REG9 Maarten ter Huurne
2016-02-28 15:53 ` [PATCH 7/7] regulator: act8865: Init at subsys level Maarten ter Huurne
2016-02-29 11:35 ` Mark Brown
2016-03-17 14:17 ` Maarten ter Huurne
2016-02-29 11:28 ` [PATCH 1/7] regulator: act8865: Expose act8600 registers via debugfs 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=1456674809-16422-5-git-send-email-maarten@treewalker.org \
--to=maarten@treewalker.org \
--cc=Zubair.Kakakhel@imgtec.com \
--cc=broonie@kernel.org \
--cc=lgirdwood@gmail.com \
--cc=linux-kernel@vger.kernel.org \
--cc=wenyou.yang@atmel.com \
/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
Powered by JetHome