Linux-Devicetree Archive mirror
 help / color / mirror / Atom feed
From: Delphine_CC_Chiu/WYHQ/Wiwynn <Delphine_CC_Chiu@wiwynn.com>
To: "Carsten Spieß" <mail@carsten-spiess.de>,
	"Jean Delvare" <jdelvare@suse.com>,
	"Guenter Roeck" <linux@roeck-us.net>,
	"Rob Herring" <robh+dt@kernel.org>,
	"Krzysztof Kozlowski" <krzysztof.kozlowski+dt@linaro.org>,
	"Conor Dooley" <conor+dt@kernel.org>,
	"Jonathan Corbet" <corbet@lwn.net>,
	"Geert Uytterhoeven" <geert+renesas@glider.be>,
	"Magnus Damm" <magnus.damm@gmail.com>
Cc: "linux-hwmon@vger.kernel.org" <linux-hwmon@vger.kernel.org>,
	"devicetree@vger.kernel.org" <devicetree@vger.kernel.org>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	"linux-doc@vger.kernel.org" <linux-doc@vger.kernel.org>,
	"linux-renesas-soc@vger.kernel.org"
	<linux-renesas-soc@vger.kernel.org>
Subject: RE: [PATCH v5 1/2] hwmon: (isl28022) new driver for ISL28022 power monitor
Date: Thu, 9 May 2024 08:18:06 +0000	[thread overview]
Message-ID: <PSAPR04MB45987A9E65DE7F1CD08A6C67A5E62@PSAPR04MB4598.apcprd04.prod.outlook.com> (raw)
In-Reply-To: <d510d6f7f65c95d5cff1b8e8a4dcd5675bd100fd.1692623638.git.mail@carsten-spiess.de>

> Driver for Renesas ISL28022 power monitor with I2C interface.
> The device monitors voltage, current via shunt resistor and calculated power.
> 
> Signed-off-by: Carsten Spieß <mail@carsten-spiess.de>

Hi Carsten,

We added support for reading shunt voltage in mV and revise code by some comment from maintainer.
Would you might take a look into it and apply to the patch set? Thank you.

Best Regards,
Delphine CC Chiu
---
 drivers/hwmon/isl28022.c | 88 ++++++++++++++++++++++++++++------------
 1 file changed, 63 insertions(+), 25 deletions(-)

diff --git a/drivers/hwmon/isl28022.c b/drivers/hwmon/isl28022.c
index f0494c3bd483..c5bcefc96256 100644
--- a/drivers/hwmon/isl28022.c
+++ b/drivers/hwmon/isl28022.c
@@ -85,8 +85,6 @@ struct isl28022_data {
        u32                     shunt;
        u32                     gain;
        u32                     average;
-       u16                     config;
-       u16                     calib;
 };

 static int isl28022_read(struct device *dev, enum hwmon_sensor_types type,
@@ -95,20 +93,61 @@ static int isl28022_read(struct device *dev, enum hwmon_sensor_types type,
        struct isl28022_data *data = dev_get_drvdata(dev);
        unsigned int regval;
        int err;
+       u16 sign_bit;

        switch (type) {
        case hwmon_in:
-               switch (attr) {
-               case hwmon_in_input:
-                       err = regmap_read(data->regmap,
-                                         ISL28022_REG_BUS, &regval);
-                       if (err < 0)
-                               return err;
-                       /* driver supports only 60V mode (BRNG 11) */
-                       *val = (long)(((u16)regval) & 0xFFFC);
+               switch (channel) {
+               case 0:
+                       switch (attr) {
+                       case hwmon_in_input:
+                               err = regmap_read(data->regmap,
+                                               ISL28022_REG_BUS, &regval);
+                               if (err < 0)
+                                       return err;
+                               /* driver supports only 60V mode (BRNG 11) */
+                               *val = (long)(((u16)regval) & 0xFFFC);
+                               break;
+                       default:
+                               return -EOPNOTSUPP;
+                       }
+                       break;
+               case 1:
+                       switch (attr) {
+                       case hwmon_in_input:
+                               err = regmap_read(data->regmap,
+                                               ISL28022_REG_SHUNT, &regval);
+                               if (err < 0)
+                                       return err;
+                               switch (data->gain) {
+                               case 8:
+                                       sign_bit = (regval >> 15) & 0x01;
+                                       *val = (long)((((u16)regval) & 0x7FFF) -
+                                              (sign_bit * 32768)) / 100;
+                                       break;
+                               case 4:
+                                       sign_bit = (regval >> 14) & 0x01;
+                                       *val = (long)((((u16)regval) & 0x3FFF) -
+                                              (sign_bit * 16384)) / 100;
+                                       break;
+                               case 2:
+                                       sign_bit = (regval >> 13) & 0x01;
+                                       *val = (long)((((u16)regval) & 0x1FFF) -
+                                              (sign_bit * 8192)) / 100;
+                                       break;
+                               case 1:
+                                       sign_bit = (regval >> 12) & 0x01;
+                                       *val = (long)((((u16)regval) & 0x0FFF) -
+                                              (sign_bit * 4096)) / 100;
+                                       break;
+                               }
+                               break;
+                       default:
+                               return -EOPNOTSUPP;
+                       }
                        break;
                default:
-                       return -EINVAL;
+                       return -EOPNOTSUPP;
                }
                break;
        case hwmon_curr:
@@ -122,7 +161,7 @@ static int isl28022_read(struct device *dev, enum hwmon_sensor_types type,
                                (long)data->shunt;
                        break;
                default:
-                       return -EINVAL;
+                       return -EOPNOTSUPP;
                }
                break;
        case hwmon_power:
@@ -136,11 +175,11 @@ static int isl28022_read(struct device *dev, enum hwmon_sensor_types type,
                                (long)data->shunt) * (long)regval;
                        break;
                default:
-                       return -EINVAL;
+                       return -EOPNOTSUPP;
                }
                break;
        default:
-               return -EINVAL;
+               return -EOPNOTSUPP;
        }

        return 0;
@@ -182,7 +221,8 @@ static umode_t isl28022_is_visible(const void *data, enum hwmon_sensor_types typ

 static const struct hwmon_channel_info *isl28022_info[] = {
        HWMON_CHANNEL_INFO(in,
-                          HWMON_I_INPUT),      /* channel 0: bus voltage (mV) */
+                          HWMON_I_INPUT,       /* channel 0: bus voltage (mV) */
+                          HWMON_I_INPUT),      /* channel 1: shunt voltage (mV) */
        HWMON_CHANNEL_INFO(curr,
                           HWMON_C_INPUT),      /* channel 1: current (mA) */
        HWMON_CHANNEL_INFO(power,
@@ -368,24 +408,22 @@ static int isl28022_read_properties(struct device *dev, struct isl28022_data *da
 static int isl28022_config(struct isl28022_data *data)
 {
        int err;
+       u16 config;
+       u16 calib;

-       data->config = (ISL28022_MODE_CONT_SB << ISL28022_MODE_SHIFT) |
+       config = (ISL28022_MODE_CONT_SB << ISL28022_MODE_SHIFT) |
                        (ISL28022_BRNG_60 << ISL28022_BRNG_SHIFT) |
                        (__ffs(data->gain) << ISL28022_PG_SHIFT) |
                        ((ISL28022_ADC_15_1 + __ffs(data->average)) << ISL28022_SADC_SHIFT) |
                        ((ISL28022_ADC_15_1 + __ffs(data->average)) << ISL28022_BADC_SHIFT);

-       data->calib = data->shunt ? 0x8000 / data->gain : 0;
+       calib = data->shunt ? 0x8000 / data->gain : 0;

-       err = regmap_write(data->regmap, ISL28022_REG_CONFIG, data->config);
+       err = regmap_write(data->regmap, ISL28022_REG_CONFIG, config);
        if (err < 0)
                return err;

-       err = regmap_write(data->regmap, ISL28022_REG_CALIB, data->calib);
-       if (err < 0)
-               return err;
-
-       return 0;
+       return regmap_write(data->regmap, ISL28022_REG_CALIB, calib);;
 }

 static int isl28022_probe(struct i2c_client *client)
@@ -418,7 +456,7 @@ static int isl28022_probe(struct i2c_client *client)

        isl28022_debugfs_init(client, data);

-       hwmon_dev = devm_hwmon_device_register_with_info(dev, "isl28022_hwmon",
+       hwmon_dev = devm_hwmon_device_register_with_info(dev, client->name,
                                                         data, &isl28022_chip_info, NULL);
        if (IS_ERR(hwmon_dev))
                return PTR_ERR(hwmon_dev);
@@ -438,7 +476,7 @@ static struct i2c_driver isl28022_driver = {
        .driver = {
                .name   = "isl28022",
        },
-       .probe_new      = isl28022_probe,
+       .probe  = isl28022_probe,
        .id_table       = isl28022_ids,
 };

--
2.25.1

  parent reply	other threads:[~2024-05-09  8:18 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-08-21 16:40 [PATCH v5 0/2] hwmon: (isl28022) new driver for ISL28022 power monitor Carsten Spieß
2023-08-21 16:40 ` [PATCH v5 1/2] " Carsten Spieß
2023-08-28  9:43   ` Uwe Kleine-König
2023-08-29  2:28   ` Guenter Roeck
2024-05-09  8:18   ` Delphine_CC_Chiu/WYHQ/Wiwynn [this message]
2023-08-21 16:40 ` [PATCH v5 2/2] dt-bindings: hwmon: add renesas,isl28022 Carsten Spieß

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=PSAPR04MB45987A9E65DE7F1CD08A6C67A5E62@PSAPR04MB4598.apcprd04.prod.outlook.com \
    --to=delphine_cc_chiu@wiwynn.com \
    --cc=conor+dt@kernel.org \
    --cc=corbet@lwn.net \
    --cc=devicetree@vger.kernel.org \
    --cc=geert+renesas@glider.be \
    --cc=jdelvare@suse.com \
    --cc=krzysztof.kozlowski+dt@linaro.org \
    --cc=linux-doc@vger.kernel.org \
    --cc=linux-hwmon@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-renesas-soc@vger.kernel.org \
    --cc=linux@roeck-us.net \
    --cc=magnus.damm@gmail.com \
    --cc=mail@carsten-spiess.de \
    --cc=robh+dt@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).