hwmon: (ina2xx) Cast to s16 on shunt and current regs
All devices supported by ina2xx are bidirectional and report the measured shunt voltage and power values as a signed 16 bit, but the current driver implementation caches all registers as u16, leading to an incorrect sign extension when reporting to userspace in ina2xx_get_value(). This patch fixes the problem by casting the signed registers to s16. Tested on an INA219. Signed-off-by: Fabio Baltieri <fabio.baltieri@gmail.com> Cc: stable@vger.kernel.org # 3.10+ Signed-off-by: Guenter Roeck <linux@roeck-us.net>
This commit is contained in:
parent
5c02c392cd
commit
c0214f9894
|
@ -148,7 +148,8 @@ static int ina2xx_get_value(struct ina2xx_data *data, u8 reg)
|
|||
|
||||
switch (reg) {
|
||||
case INA2XX_SHUNT_VOLTAGE:
|
||||
val = DIV_ROUND_CLOSEST(data->regs[reg],
|
||||
/* signed register */
|
||||
val = DIV_ROUND_CLOSEST((s16)data->regs[reg],
|
||||
data->config->shunt_div);
|
||||
break;
|
||||
case INA2XX_BUS_VOLTAGE:
|
||||
|
@ -160,8 +161,8 @@ static int ina2xx_get_value(struct ina2xx_data *data, u8 reg)
|
|||
val = data->regs[reg] * data->config->power_lsb;
|
||||
break;
|
||||
case INA2XX_CURRENT:
|
||||
/* LSB=1mA (selected). Is in mA */
|
||||
val = data->regs[reg];
|
||||
/* signed register, LSB=1mA (selected), in mA */
|
||||
val = (s16)data->regs[reg];
|
||||
break;
|
||||
default:
|
||||
/* programmer goofed */
|
||||
|
|
Loading…
Reference in New Issue