Skip to content

Commit

Permalink
hwmon: (tmp421) fix rounding for negative values
Browse files Browse the repository at this point in the history
[ Upstream commit 724e8af ]

Old code produces -24999 for 0b1110011100000000 input in standard format due to
always rounding up rather than "away from zero".

Use the common macro for division, unify and simplify the conversion code along
the way.

Fixes: 9410700 ("hwmon: Add driver for Texas Instruments TMP421/422/423 sensor chips")
Signed-off-by: Paul Fertser <fercerpav@gmail.com>
Link: https://lore.kernel.org/r/20210924093011.26083-3-fercerpav@gmail.com
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
Signed-off-by: Sasha Levin <sashal@kernel.org>
  • Loading branch information
paulfertser authored and gregkh committed Oct 7, 2021
1 parent 8776ad7 commit d4a6139
Showing 1 changed file with 8 additions and 16 deletions.
24 changes: 8 additions & 16 deletions drivers/hwmon/tmp421.c
Expand Up @@ -100,23 +100,17 @@ struct tmp421_data {
s16 temp[4];
};

static int temp_from_s16(s16 reg)
static int temp_from_raw(u16 reg, bool extended)
{
/* Mask out status bits */
int temp = reg & ~0xf;

return (temp * 1000 + 128) / 256;
}

static int temp_from_u16(u16 reg)
{
/* Mask out status bits */
int temp = reg & ~0xf;

/* Add offset for extended temperature range. */
temp -= 64 * 256;
if (extended)
temp = temp - 64 * 256;
else
temp = (s16)temp;

return (temp * 1000 + 128) / 256;
return DIV_ROUND_CLOSEST(temp * 1000, 256);
}

static int tmp421_update_device(struct tmp421_data *data)
Expand Down Expand Up @@ -172,10 +166,8 @@ static int tmp421_read(struct device *dev, enum hwmon_sensor_types type,

switch (attr) {
case hwmon_temp_input:
if (tmp421->config & TMP421_CONFIG_RANGE)
*val = temp_from_u16(tmp421->temp[channel]);
else
*val = temp_from_s16(tmp421->temp[channel]);
*val = temp_from_raw(tmp421->temp[channel],
tmp421->config & TMP421_CONFIG_RANGE);
return 0;
case hwmon_temp_fault:
/*
Expand Down

0 comments on commit d4a6139

Please sign in to comment.