hwmon: (ina2xx) use DIV_ROUND_CLOSEST() to avoid rounding errors
authorBartosz Golaszewski <bgolaszewski@baylibre.com>
Mon, 12 Jan 2015 13:47:22 +0000 (14:47 +0100)
committerGuenter Roeck <linux@roeck-us.net>
Mon, 26 Jan 2015 05:23:59 +0000 (21:23 -0800)
Use DIV_ROUND_CLOSEST() when dealing with the calibration values to make the
calculations less error prone.

Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
drivers/hwmon/ina2xx.c

index ae110c5..611ec4e 100644 (file)
@@ -186,8 +186,11 @@ static void ina226_set_update_interval(struct ina2xx_data *data)
 
 static int ina2xx_calibrate(struct ina2xx_data *data)
 {
 
 static int ina2xx_calibrate(struct ina2xx_data *data)
 {
-       return i2c_smbus_write_word_swapped(data->client, INA2XX_CALIBRATION,
-                       data->config->calibration_factor / data->rshunt);
+       u16 val = DIV_ROUND_CLOSEST(data->config->calibration_factor,
+                                   data->rshunt);
+
+       return i2c_smbus_write_word_swapped(data->client,
+                                           INA2XX_CALIBRATION, val);
 }
 
 /*
 }
 
 /*
@@ -307,7 +310,8 @@ static int ina2xx_get_value(struct ina2xx_data *data, u8 reg)
                val = (s16)data->regs[reg];
                break;
        case INA2XX_CALIBRATION:
                val = (s16)data->regs[reg];
                break;
        case INA2XX_CALIBRATION:
-               val = data->config->calibration_factor / data->regs[reg];
+               val = DIV_ROUND_CLOSEST(data->config->calibration_factor,
+                                       data->regs[reg]);
                break;
        default:
                /* programmer goofed */
                break;
        default:
                /* programmer goofed */