All of lore.kernel.org
 help / color / mirror / Atom feed
From: Nicolin Chen <nicoleotsuka@gmail.com>
To: linux-hwmon@vger.kernel.org
Subject: [PATCH v2 2/2] hwmon: (ina3221) Implement ti,single-shot DT property
Date: Fri, 04 Jan 2019 19:06:56 -0800	[thread overview]
Message-ID: <20190105030636.533-3-nicoleotsuka@gmail.com> (raw)
In-Reply-To: <20190105030636.533-1-nicoleotsuka@gmail.com>

By default, ina3221, as a hardware monitor, continuously measures
the inputs and generates corresponding data. However, for battery
powered devices, this mode might be power consuming.

The DT binding doc is updated with a new boolean type property to
allow changing the default operating mode from consuming mode to
single-shot mode, which will measure input on demand and then shut
down to save power.

So this patch implements the DT property accordingly.

Signed-off-by: Nicolin Chen <nicoleots...@gmail.com>
---
Changelog
v1->v2:
 * Replaced the useless mode defines with a boolean variable.

 drivers/hwmon/ina3221.c | 20 ++++++++++++++++++++
 1 file changed, 20 insertions(+)

diff --git a/drivers/hwmon/ina3221.c b/drivers/hwmon/ina3221.c
index e90ccac8bebb..4258a6ebe195 100644
--- a/drivers/hwmon/ina3221.c
+++ b/drivers/hwmon/ina3221.c
@@ -111,6 +111,7 @@ struct ina3221_input {
  * @inputs: Array of channel input source specific structures
  * @lock: mutex lock to serialize sysfs attribute accesses
  * @reg_config: Register value of INA3221_CONFIG
+ * @single_shot: running in single-shot operating mode
  */
 struct ina3221_data {
        struct device *pm_dev;
@@ -119,6 +120,8 @@ struct ina3221_data {
        struct ina3221_input inputs[INA3221_NUM_CHANNELS];
        struct mutex lock;
        u32 reg_config;
+
+       bool single_shot;
 };
 
 static inline bool ina3221_is_enabled(struct ina3221_data *ina, int channel)
@@ -188,6 +191,11 @@ static int ina3221_read_in(struct device *dev, u32 attr, 
int channel, long *val)
                if (!ina3221_is_enabled(ina, channel))
                        return -ENODATA;
 
+               /* Write CONFIG register to trigger a single-shot measurement */
+               if (ina->single_shot)
+                       regmap_write(ina->regmap, INA3221_CONFIG,
+                                    ina->reg_config);
+
                ret = ina3221_wait_for_data(ina);
                if (ret)
                        return ret;
@@ -232,6 +240,11 @@ static int ina3221_read_curr(struct device *dev, u32 attr,
                if (!ina3221_is_enabled(ina, channel))
                        return -ENODATA;
 
+               /* Write CONFIG register to trigger a single-shot measurement */
+               if (ina->single_shot)
+                       regmap_write(ina->regmap, INA3221_CONFIG,
+                                    ina->reg_config);
+
                ret = ina3221_wait_for_data(ina);
                if (ret)
                        return ret;
@@ -617,6 +630,9 @@ static int ina3221_probe_from_dt(struct device *dev, struct 
ina3221_data *ina)
        if (!np)
                return 0;
 
+       if (of_property_read_bool(np, "ti,single-shot"))
+               ina->single_shot = true;
+
        for_each_child_of_node(np, child) {
                ret = ina3221_probe_child_from_dt(dev, child, ina);
                if (ret)
@@ -666,6 +682,10 @@ static int ina3221_probe(struct i2c_client *client,
        /* The driver will be reset, so use reset value */
        ina->reg_config = INA3221_CONFIG_DEFAULT;
 
+       /* Clear continuous bit to use single-shot mode */
+       if (ina->single_shot)
+               ina->reg_config &= ~INA3221_CONFIG_MODE_CONTINUOUS;
+
        /* Disable channels if their inputs are disconnected */
        for (i = 0; i < INA3221_NUM_CHANNELS; i++) {
                if (ina->inputs[i].disconnected)
-- 
2.17.1

WARNING: multiple messages have this Message-ID (diff)
From: Nicolin Chen <nicoleotsuka@gmail.com>
To: jdelvare@suse.com, linux@roeck-us.net, robh+dt@kernel.org,
	mark.rutland@arm.com
Cc: linux-hwmon@vger.kernel.org, devicetree@vger.kernel.org,
	linux-kernel@vger.kernel.org
Subject: [PATCH v2 2/2] hwmon: (ina3221) Implement ti,single-shot DT property
Date: Fri,  4 Jan 2019 19:06:36 -0800	[thread overview]
Message-ID: <20190105030636.533-3-nicoleotsuka@gmail.com> (raw)
Message-ID: <20190105030636.cE7B30AU559MKimDOOFTGKuGg9JqNrLKQnT4daP5IKg@z> (raw)
In-Reply-To: <20190105030636.533-1-nicoleotsuka@gmail.com>

By default, ina3221, as a hardware monitor, continuously measures
the inputs and generates corresponding data. However, for battery
powered devices, this mode might be power consuming.

The DT binding doc is updated with a new boolean type property to
allow changing the default operating mode from consuming mode to
single-shot mode, which will measure input on demand and then shut
down to save power.

So this patch implements the DT property accordingly.

Signed-off-by: Nicolin Chen <nicoleotsuka@gmail.com>
---
Changelog
v1->v2:
 * Replaced the useless mode defines with a boolean variable.

 drivers/hwmon/ina3221.c | 20 ++++++++++++++++++++
 1 file changed, 20 insertions(+)

diff --git a/drivers/hwmon/ina3221.c b/drivers/hwmon/ina3221.c
index e90ccac8bebb..4258a6ebe195 100644
--- a/drivers/hwmon/ina3221.c
+++ b/drivers/hwmon/ina3221.c
@@ -111,6 +111,7 @@ struct ina3221_input {
  * @inputs: Array of channel input source specific structures
  * @lock: mutex lock to serialize sysfs attribute accesses
  * @reg_config: Register value of INA3221_CONFIG
+ * @single_shot: running in single-shot operating mode
  */
 struct ina3221_data {
 	struct device *pm_dev;
@@ -119,6 +120,8 @@ struct ina3221_data {
 	struct ina3221_input inputs[INA3221_NUM_CHANNELS];
 	struct mutex lock;
 	u32 reg_config;
+
+	bool single_shot;
 };
 
 static inline bool ina3221_is_enabled(struct ina3221_data *ina, int channel)
@@ -188,6 +191,11 @@ static int ina3221_read_in(struct device *dev, u32 attr, int channel, long *val)
 		if (!ina3221_is_enabled(ina, channel))
 			return -ENODATA;
 
+		/* Write CONFIG register to trigger a single-shot measurement */
+		if (ina->single_shot)
+			regmap_write(ina->regmap, INA3221_CONFIG,
+				     ina->reg_config);
+
 		ret = ina3221_wait_for_data(ina);
 		if (ret)
 			return ret;
@@ -232,6 +240,11 @@ static int ina3221_read_curr(struct device *dev, u32 attr,
 		if (!ina3221_is_enabled(ina, channel))
 			return -ENODATA;
 
+		/* Write CONFIG register to trigger a single-shot measurement */
+		if (ina->single_shot)
+			regmap_write(ina->regmap, INA3221_CONFIG,
+				     ina->reg_config);
+
 		ret = ina3221_wait_for_data(ina);
 		if (ret)
 			return ret;
@@ -617,6 +630,9 @@ static int ina3221_probe_from_dt(struct device *dev, struct ina3221_data *ina)
 	if (!np)
 		return 0;
 
+	if (of_property_read_bool(np, "ti,single-shot"))
+		ina->single_shot = true;
+
 	for_each_child_of_node(np, child) {
 		ret = ina3221_probe_child_from_dt(dev, child, ina);
 		if (ret)
@@ -666,6 +682,10 @@ static int ina3221_probe(struct i2c_client *client,
 	/* The driver will be reset, so use reset value */
 	ina->reg_config = INA3221_CONFIG_DEFAULT;
 
+	/* Clear continuous bit to use single-shot mode */
+	if (ina->single_shot)
+		ina->reg_config &= ~INA3221_CONFIG_MODE_CONTINUOUS;
+
 	/* Disable channels if their inputs are disconnected */
 	for (i = 0; i < INA3221_NUM_CHANNELS; i++) {
 		if (ina->inputs[i].disconnected)
-- 
2.17.1


  parent reply	other threads:[~2019-01-05  3:06 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-01-05  3:06 [PATCH v2 0/2] hwmon (ina3221) Add single-shot mode support Nicolin Chen
2019-01-05  3:06 ` Nicolin Chen
2019-01-05  3:07   ` Nicolin Chen
2019-01-05  3:06   ` [PATCH v2 1/2] dt-bindings: hwmon: ina3221: Add ti,single-shot property Nicolin Chen
2019-01-05  3:06     ` Nicolin Chen
2019-01-05  3:07       ` Nicolin Chen
2019-01-11 21:34       ` Rob Herring
2019-01-05  3:06   ` Nicolin Chen [this message]
2019-01-05  3:06     ` [PATCH v2 2/2] hwmon: (ina3221) Implement ti,single-shot DT property Nicolin Chen
2019-01-05  3:06       ` Nicolin Chen
2019-01-07 19:35       ` Guenter Roeck
2019-01-17 22:30         ` Nicolin Chen
2019-01-17 22:58           ` Guenter Roeck
2019-01-17 23:02             ` Nicolin Chen

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=20190105030636.533-3-nicoleotsuka@gmail.com \
    --to=nicoleotsuka@gmail.com \
    --cc=linux-hwmon@vger.kernel.org \
    /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.