iio: adc: ti-ads1015: write config register only on change
authorLadislav Michl <ladis@linux-mips.org>
Thu, 24 Aug 2017 08:25:51 +0000 (10:25 +0200)
committerJonathan Cameron <Jonathan.Cameron@huawei.com>
Sun, 3 Sep 2017 17:10:31 +0000 (18:10 +0100)
There is no point writing ADS1015_CFG_REG when configuration
didn't change. Avoid that.

Cc: Daniel Baluta <daniel.baluta@gmail.com>
Cc: Jonathan Cameron <jic23@kernel.org>
Signed-off-by: Ladislav Michl <ladis@linux-mips.org>
Reviewed-by: Akinobu Mita <akinobu.mita@gmail.com>
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
drivers/iio/adc/ti-ads1015.c

index 731ec38..7503ea5 100644 (file)
@@ -332,7 +332,7 @@ static int ads1015_set_power_state(struct ads1015_data *data, bool on)
 static
 int ads1015_get_adc_result(struct ads1015_data *data, int chan, int *val)
 {
-       int ret, pga, dr, conv_time;
+       int ret, pga, dr, dr_old, conv_time;
        unsigned int old, mask, cfg;
 
        if (chan < 0 || chan >= ADS1015_CHANNELS)
@@ -358,15 +358,14 @@ int ads1015_get_adc_result(struct ads1015_data *data, int chan, int *val)
        }
 
        cfg = (old & ~mask) | (cfg & mask);
-
-       ret = regmap_write(data->regmap, ADS1015_CFG_REG, cfg);
-       if (ret)
-               return ret;
-
-       if (old != cfg || data->conv_invalid) {
-               int dr_old = (old & ADS1015_CFG_DR_MASK) >>
-                               ADS1015_CFG_DR_SHIFT;
-
+       if (old != cfg) {
+               ret = regmap_write(data->regmap, ADS1015_CFG_REG, cfg);
+               if (ret)
+                       return ret;
+               data->conv_invalid = true;
+       }
+       if (data->conv_invalid) {
+               dr_old = (old & ADS1015_CFG_DR_MASK) >> ADS1015_CFG_DR_SHIFT;
                conv_time = DIV_ROUND_UP(USEC_PER_SEC, data->data_rate[dr_old]);
                conv_time += DIV_ROUND_UP(USEC_PER_SEC, data->data_rate[dr]);
                usleep_range(conv_time, conv_time + 1);