From: "Andrew F. Davis" <afd@ti.com>
To: Guenter Roeck <linux@roeck-us.net>,
Hardware Monitoring <linux-hwmon@vger.kernel.org>
Cc: Jean Delvare <jdelvare@suse.de>
Subject: Re: [PATCH] hwmon: (ina3221) Fix negative limits
Date: Mon, 27 Jun 2016 09:49:58 -0500 [thread overview]
Message-ID: <57713D16.6000701@ti.com> (raw)
In-Reply-To: <1466822827-31231-1-git-send-email-linux@roeck-us.net>
On 06/24/2016 09:47 PM, Guenter Roeck wrote:
> The result of an integer divide by an unsigned is undefined.
> This causes unexpected results when writing negative values
> into the limit registers.
>
> Maintain the shunt_resistors variables as signed integer to avoid
> the problem. Also, for simplicity and ease of use, clamp shunt
> resistor value on writes instead of rejecting bad values.
>
> Cc: Andrew F. Davis <afd@ti.com>
> Signed-off-by: Guenter Roeck <linux@roeck-us.net>
> ---
Acked-by: Andrew F. Davis <afd@ti.com>
> drivers/hwmon/ina3221.c | 13 ++++++-------
> 1 file changed, 6 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/hwmon/ina3221.c b/drivers/hwmon/ina3221.c
> index d055b6a2266b..e6b49500c52a 100644
> --- a/drivers/hwmon/ina3221.c
> +++ b/drivers/hwmon/ina3221.c
> @@ -95,7 +95,7 @@ static const unsigned int register_channel[] = {
> struct ina3221_data {
> struct regmap *regmap;
> struct regmap_field *fields[F_MAX_FIELDS];
> - unsigned int shunt_resistors[INA3221_NUM_CHANNELS];
> + int shunt_resistors[INA3221_NUM_CHANNELS];
> };
>
> static int ina3221_read_value(struct ina3221_data *ina, unsigned int reg,
> @@ -155,7 +155,7 @@ static ssize_t ina3221_show_current(struct device *dev,
> struct ina3221_data *ina = dev_get_drvdata(dev);
> unsigned int reg = sd_attr->index;
> unsigned int channel = register_channel[reg];
> - unsigned int resistance_uo = ina->shunt_resistors[channel];
> + int resistance_uo = ina->shunt_resistors[channel];
> int val, current_ma, voltage_nv, ret;
>
> ret = ina3221_read_value(ina, reg, &val);
> @@ -176,7 +176,7 @@ static ssize_t ina3221_set_current(struct device *dev,
> struct ina3221_data *ina = dev_get_drvdata(dev);
> unsigned int reg = sd_attr->index;
> unsigned int channel = register_channel[reg];
> - unsigned int resistance_uo = ina->shunt_resistors[channel];
> + int resistance_uo = ina->shunt_resistors[channel];
> int val, current_ma, voltage_uv, ret;
>
> ret = kstrtoint(buf, 0, ¤t_ma);
> @@ -223,15 +223,14 @@ static ssize_t ina3221_set_shunt(struct device *dev,
> struct sensor_device_attribute *sd_attr = to_sensor_dev_attr(attr);
> struct ina3221_data *ina = dev_get_drvdata(dev);
> unsigned int channel = sd_attr->index;
> - unsigned int val;
> + int val;
> int ret;
>
> - ret = kstrtouint(buf, 0, &val);
> + ret = kstrtoint(buf, 0, &val);
> if (ret)
> return ret;
>
> - if (val == 0)
> - return -EINVAL;
> + val = clamp_val(val, 1, INT_MAX);
>
> ina->shunt_resistors[channel] = val;
>
>
prev parent reply other threads:[~2016-06-27 14:50 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-06-25 2:47 [PATCH] hwmon: (ina3221) Fix negative limits Guenter Roeck
2016-06-27 14:49 ` Andrew F. Davis [this message]
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=57713D16.6000701@ti.com \
--to=afd@ti.com \
--cc=jdelvare@suse.de \
--cc=linux-hwmon@vger.kernel.org \
--cc=linux@roeck-us.net \
/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