iio: ad9523-1: Improve reported VCO frequency accuracy
authorLars-Peter Clausen <lars@metafoo.de>
Fri, 17 May 2019 13:37:11 +0000 (16:37 +0300)
committerJonathan Cameron <Jonathan.Cameron@huawei.com>
Sat, 18 May 2019 08:40:37 +0000 (09:40 +0100)
To improve the accuracy of the reported VCO frequency perform all
multiplications before divisions. This reduces rounding errors and makes
sure the reported rates are accurate down to the last digit.

Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>
Signed-off-by: Alexandru Ardelean <alexandru.ardelean@analog.com>
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
drivers/iio/frequency/ad9523.c

index 9b9eee27176c3070a4e7c99f736a8415cb8fec12..ceb1daceeb46f4b2754b92b852f8419b74ec120f 100644 (file)
@@ -862,9 +862,11 @@ static int ad9523_setup(struct iio_dev *indio_dev)
        if (ret < 0)
                return ret;
 
-       st->vco_freq = (pdata->vcxo_freq * (pdata->pll2_freq_doubler_en ? 2 : 1)
-                       / pdata->pll2_r2_div) * AD9523_PLL2_FB_NDIV(pdata->
-                       pll2_ndiv_a_cnt, pdata->pll2_ndiv_b_cnt);
+       st->vco_freq = div_u64((unsigned long long)pdata->vcxo_freq *
+                              (pdata->pll2_freq_doubler_en ? 2 : 1) *
+                              AD9523_PLL2_FB_NDIV(pdata->pll2_ndiv_a_cnt,
+                                                  pdata->pll2_ndiv_b_cnt),
+                              pdata->pll2_r2_div);
 
        ret = ad9523_write(indio_dev, AD9523_PLL2_VCO_CTRL,
                AD9523_PLL2_VCO_CALIBRATE);