All of lore.kernel.org
 help / color / mirror / Atom feed
From: <atull@opensource.altera.com>
To: linux@roeck-us.net, jdelvare@suse.de
Cc: lm-sensors@lm-sensors.org, lgirdwood@gmail.com,
	broonie@kernel.org, linux-kernel@vger.kernel.org,
	delicious.quinoa@gmail.com, dinguyen@opensource.altera.com,
	yvanderv@opensource.altera.com,
	Alan Tull <atull@opensource.altera.com>
Subject: [lm-sensors] [PATCH v2 1/2] pmbus: add regulator support
Date: Fri, 22 Aug 2014 21:11:33 +0000	[thread overview]
Message-ID: <1408741894-24879-2-git-send-email-atull@opensource.altera.com> (raw)
In-Reply-To: <1408741894-24879-1-git-send-email-atull@opensource.altera.com>

From: Alan Tull <atull@opensource.altera.com>

To add a regulator, the pmbus device driver needs to add
regulator_desc information to its pmbus_driver_info struct.
The regulator_init_data can be intialized from either
platform data or the device tree.

Signed-off-by: Alan Tull <atull@opensource.altera.com>

v2: Remove '#include <linux/regulator/machine.h>'
    Only one regulator per pmbus device
    Get regulator_init_data from pdata or device tree
---
 drivers/hwmon/pmbus/pmbus.h      |    5 ++++
 drivers/hwmon/pmbus/pmbus_core.c |   51 ++++++++++++++++++++++++++++++++++++++
 include/linux/i2c/pmbus.h        |    1 +
 3 files changed, 57 insertions(+)

diff --git a/drivers/hwmon/pmbus/pmbus.h b/drivers/hwmon/pmbus/pmbus.h
index fa9beb3..93fadc3 100644
--- a/drivers/hwmon/pmbus/pmbus.h
+++ b/drivers/hwmon/pmbus/pmbus.h
@@ -19,6 +19,8 @@
  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  */
 
+#include <linux/regulator/driver.h>
+
 #ifndef PMBUS_H
 #define PMBUS_H
 
@@ -365,6 +367,9 @@ struct pmbus_driver_info {
 	 */
 	int (*identify)(struct i2c_client *client,
 			struct pmbus_driver_info *info);
+
+	/* Regulator functionality, if supported by this chip driver. */
+	const struct regulator_desc *reg_desc;
 };
 
 /* Function declarations */
diff --git a/drivers/hwmon/pmbus/pmbus_core.c b/drivers/hwmon/pmbus/pmbus_core.c
index 291d11f..472baff 100644
--- a/drivers/hwmon/pmbus/pmbus_core.c
+++ b/drivers/hwmon/pmbus/pmbus_core.c
@@ -29,6 +29,8 @@
 #include <linux/hwmon-sysfs.h>
 #include <linux/jiffies.h>
 #include <linux/i2c/pmbus.h>
+#include <linux/regulator/of_regulator.h>
+#include <linux/regulator/driver.h>
 #include "pmbus.h"
 
 /*
@@ -1727,6 +1729,48 @@ static int pmbus_init_common(struct i2c_client *client, struct pmbus_data *data,
 	return 0;
 }
 
+#if IS_ENABLED(CONFIG_REGULATOR)
+static int pmbus_regulator_register(struct pmbus_data *data,
+				    const struct pmbus_platform_data *pdata)
+{
+	struct device *dev = data->dev;
+	struct device_node *np = dev->of_node;
+	const struct pmbus_driver_info *info = data->info;
+	const struct regulator_desc *reg_desc = info->reg_desc;
+	struct regulator_dev *rdev;
+	struct regulator_config config = { };
+
+	if (!reg_desc)
+		return 0;
+
+	if (pdata && pdata->reg_init_data) {
+		config.init_data = pdata->reg_init_data;
+	} else {
+		config.init_data = of_get_regulator_init_data(dev, np);
+		if (!config.init_data)
+			return -ENOMEM;
+	}
+
+	config.dev = dev;
+	config.driver_data = data;
+
+	rdev = devm_regulator_register(dev, reg_desc, &config);
+	if (IS_ERR(rdev)) {
+		dev_err(dev, "failed to register regulator %s\n",
+			reg_desc->name);
+		return PTR_ERR(rdev);
+	}
+
+	return 0;
+}
+#else
+static int pmbus_regulator_register(struct pmbus_data *data,
+				    const struct pmbus_platform_data *pdata)
+{
+	return 0;
+}
+#endif
+
 int pmbus_do_probe(struct i2c_client *client, const struct i2c_device_id *id,
 		   struct pmbus_driver_info *info)
 {
@@ -1781,8 +1825,15 @@ int pmbus_do_probe(struct i2c_client *client, const struct i2c_device_id *id,
 		dev_err(dev, "Failed to register hwmon device\n");
 		goto out_kfree;
 	}
+
+	ret = pmbus_regulator_register(data, pdata);
+	if (ret)
+		goto out_unregister;
+
 	return 0;
 
+out_unregister:
+	hwmon_device_unregister(data->hwmon_dev);
 out_kfree:
 	kfree(data->group.attrs);
 	return ret;
diff --git a/include/linux/i2c/pmbus.h b/include/linux/i2c/pmbus.h
index 69280db..15e08da 100644
--- a/include/linux/i2c/pmbus.h
+++ b/include/linux/i2c/pmbus.h
@@ -40,6 +40,7 @@
 
 struct pmbus_platform_data {
 	u32 flags;		/* Device specific flags */
+	struct regulator_init_data *reg_init_data;
 };
 
 #endif /* _PMBUS_H_ */
-- 
1.7.9.5


_______________________________________________
lm-sensors mailing list
lm-sensors@lm-sensors.org
http://lists.lm-sensors.org/mailman/listinfo/lm-sensors

WARNING: multiple messages have this Message-ID (diff)
From: <atull@opensource.altera.com>
To: <linux@roeck-us.net>, <jdelvare@suse.de>
Cc: <lm-sensors@lm-sensors.org>, <lgirdwood@gmail.com>,
	<broonie@kernel.org>, <linux-kernel@vger.kernel.org>,
	<delicious.quinoa@gmail.com>, <dinguyen@opensource.altera.com>,
	<yvanderv@opensource.altera.com>,
	Alan Tull <atull@opensource.altera.com>
Subject: [PATCH v2 1/2] pmbus: add regulator support
Date: Fri, 22 Aug 2014 16:11:33 -0500	[thread overview]
Message-ID: <1408741894-24879-2-git-send-email-atull@opensource.altera.com> (raw)
In-Reply-To: <1408741894-24879-1-git-send-email-atull@opensource.altera.com>

From: Alan Tull <atull@opensource.altera.com>

To add a regulator, the pmbus device driver needs to add
regulator_desc information to its pmbus_driver_info struct.
The regulator_init_data can be intialized from either
platform data or the device tree.

Signed-off-by: Alan Tull <atull@opensource.altera.com>

v2: Remove '#include <linux/regulator/machine.h>'
    Only one regulator per pmbus device
    Get regulator_init_data from pdata or device tree
---
 drivers/hwmon/pmbus/pmbus.h      |    5 ++++
 drivers/hwmon/pmbus/pmbus_core.c |   51 ++++++++++++++++++++++++++++++++++++++
 include/linux/i2c/pmbus.h        |    1 +
 3 files changed, 57 insertions(+)

diff --git a/drivers/hwmon/pmbus/pmbus.h b/drivers/hwmon/pmbus/pmbus.h
index fa9beb3..93fadc3 100644
--- a/drivers/hwmon/pmbus/pmbus.h
+++ b/drivers/hwmon/pmbus/pmbus.h
@@ -19,6 +19,8 @@
  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  */
 
+#include <linux/regulator/driver.h>
+
 #ifndef PMBUS_H
 #define PMBUS_H
 
@@ -365,6 +367,9 @@ struct pmbus_driver_info {
 	 */
 	int (*identify)(struct i2c_client *client,
 			struct pmbus_driver_info *info);
+
+	/* Regulator functionality, if supported by this chip driver. */
+	const struct regulator_desc *reg_desc;
 };
 
 /* Function declarations */
diff --git a/drivers/hwmon/pmbus/pmbus_core.c b/drivers/hwmon/pmbus/pmbus_core.c
index 291d11f..472baff 100644
--- a/drivers/hwmon/pmbus/pmbus_core.c
+++ b/drivers/hwmon/pmbus/pmbus_core.c
@@ -29,6 +29,8 @@
 #include <linux/hwmon-sysfs.h>
 #include <linux/jiffies.h>
 #include <linux/i2c/pmbus.h>
+#include <linux/regulator/of_regulator.h>
+#include <linux/regulator/driver.h>
 #include "pmbus.h"
 
 /*
@@ -1727,6 +1729,48 @@ static int pmbus_init_common(struct i2c_client *client, struct pmbus_data *data,
 	return 0;
 }
 
+#if IS_ENABLED(CONFIG_REGULATOR)
+static int pmbus_regulator_register(struct pmbus_data *data,
+				    const struct pmbus_platform_data *pdata)
+{
+	struct device *dev = data->dev;
+	struct device_node *np = dev->of_node;
+	const struct pmbus_driver_info *info = data->info;
+	const struct regulator_desc *reg_desc = info->reg_desc;
+	struct regulator_dev *rdev;
+	struct regulator_config config = { };
+
+	if (!reg_desc)
+		return 0;
+
+	if (pdata && pdata->reg_init_data) {
+		config.init_data = pdata->reg_init_data;
+	} else {
+		config.init_data = of_get_regulator_init_data(dev, np);
+		if (!config.init_data)
+			return -ENOMEM;
+	}
+
+	config.dev = dev;
+	config.driver_data = data;
+
+	rdev = devm_regulator_register(dev, reg_desc, &config);
+	if (IS_ERR(rdev)) {
+		dev_err(dev, "failed to register regulator %s\n",
+			reg_desc->name);
+		return PTR_ERR(rdev);
+	}
+
+	return 0;
+}
+#else
+static int pmbus_regulator_register(struct pmbus_data *data,
+				    const struct pmbus_platform_data *pdata)
+{
+	return 0;
+}
+#endif
+
 int pmbus_do_probe(struct i2c_client *client, const struct i2c_device_id *id,
 		   struct pmbus_driver_info *info)
 {
@@ -1781,8 +1825,15 @@ int pmbus_do_probe(struct i2c_client *client, const struct i2c_device_id *id,
 		dev_err(dev, "Failed to register hwmon device\n");
 		goto out_kfree;
 	}
+
+	ret = pmbus_regulator_register(data, pdata);
+	if (ret)
+		goto out_unregister;
+
 	return 0;
 
+out_unregister:
+	hwmon_device_unregister(data->hwmon_dev);
 out_kfree:
 	kfree(data->group.attrs);
 	return ret;
diff --git a/include/linux/i2c/pmbus.h b/include/linux/i2c/pmbus.h
index 69280db..15e08da 100644
--- a/include/linux/i2c/pmbus.h
+++ b/include/linux/i2c/pmbus.h
@@ -40,6 +40,7 @@
 
 struct pmbus_platform_data {
 	u32 flags;		/* Device specific flags */
+	struct regulator_init_data *reg_init_data;
 };
 
 #endif /* _PMBUS_H_ */
-- 
1.7.9.5


  reply	other threads:[~2014-08-22 21:11 UTC|newest]

Thread overview: 26+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-08-22 21:11 [lm-sensors] [PATCH v2 0/2] dd regulator support for pmbus and ltc2978 atull
2014-08-22 21:11 ` atull
2014-08-22 21:11 ` atull [this message]
2014-08-22 21:11   ` [PATCH v2 1/2] pmbus: add regulator support atull
2014-08-22 21:44   ` [lm-sensors] " Mark Brown
2014-08-22 21:44     ` Mark Brown
2014-08-23  0:31     ` [lm-sensors] " atull
2014-08-23  0:31       ` atull
2014-08-23 14:00       ` [lm-sensors] " Guenter Roeck
2014-08-23 14:00         ` Guenter Roeck
2014-08-23 14:54         ` [lm-sensors] " Mark Brown
2014-08-23 14:54           ` Mark Brown
2014-08-24  0:48           ` [lm-sensors] " Alan Tull
2014-08-24  0:48             ` Alan Tull
2014-08-22 21:11 ` [lm-sensors] [PATCH v2 2/2] pmbus: ltc2978: add regulator gating atull
2014-08-22 21:11   ` atull
2014-08-22 21:45   ` [lm-sensors] " Mark Brown
2014-08-22 21:45     ` Mark Brown
2014-08-23 15:10     ` [lm-sensors] " Guenter Roeck
2014-08-23 15:10       ` Guenter Roeck
2014-08-23 15:53       ` [lm-sensors] " Mark Brown
2014-08-23 15:53         ` Mark Brown
2014-08-24 13:30       ` [lm-sensors] " Alan Tull
2014-08-24 13:30         ` Alan Tull
2014-08-25 17:02         ` [lm-sensors] " Guenter Roeck
2014-08-25 17:02           ` Guenter Roeck

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=1408741894-24879-2-git-send-email-atull@opensource.altera.com \
    --to=atull@opensource.altera.com \
    --cc=broonie@kernel.org \
    --cc=delicious.quinoa@gmail.com \
    --cc=dinguyen@opensource.altera.com \
    --cc=jdelvare@suse.de \
    --cc=lgirdwood@gmail.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux@roeck-us.net \
    --cc=lm-sensors@lm-sensors.org \
    --cc=yvanderv@opensource.altera.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.