On Thu, 2025-01-09 at 15:37 +0200, Antoniu Miclaus wrote: > Add support for the reference doubler. > > Signed-off-by: Antoniu Miclaus <antoniu.miclaus@xxxxxxxxxx> > --- LGTM: Reviewed-by: Nuno Sa <nuno.sa@xxxxxxxxxx> > no changes in v4. > drivers/iio/frequency/adf4371.c | 16 ++++++++++++++-- > 1 file changed, 14 insertions(+), 2 deletions(-) > > diff --git a/drivers/iio/frequency/adf4371.c b/drivers/iio/frequency/adf4371.c > index 50450e7b5464..a57fc24a6799 100644 > --- a/drivers/iio/frequency/adf4371.c > +++ b/drivers/iio/frequency/adf4371.c > @@ -44,6 +44,8 @@ > /* ADF4371_REG22 */ > #define ADF4371_REFIN_MODE_MASK BIT(6) > #define ADF4371_REFIN_MODE(x) FIELD_PREP(ADF4371_REFIN_MODE_MASK, > x) > +#define ADF4371_REF_DOUB_MASK BIT(5) > +#define ADF4371_REF_DOUB(x) FIELD_PREP(ADF4371_REF_DOUB_MASK, x)\ > > /* ADF4371_REG24 */ > #define ADF4371_RF_DIV_SEL_MSK GENMASK(6, 4) > @@ -75,6 +77,9 @@ > #define ADF4371_MAX_FREQ_REFIN 600000000UL /* Hz */ > #define ADF4371_MAX_FREQ_REFIN_SE 500000000UL /* Hz */ > > +#define ADF4371_MIN_CLKIN_DOUB_FREQ 10000000ULL /* Hz */ > +#define ADF4371_MAX_CLKIN_DOUB_FREQ 125000000ULL /* Hz */ > + > /* MOD1 is a 24-bit primary modulus with fixed value of 2^25 */ > #define ADF4371_MODULUS1 33554432ULL > /* MOD2 is the programmable, 14-bit auxiliary fractional modulus */ > @@ -481,7 +486,7 @@ static const struct iio_info adf4371_info = { > static int adf4371_setup(struct adf4371_state *st) > { > unsigned int synth_timeout = 2, timeout = 1, vco_alc_timeout = 1; > - unsigned int vco_band_div, tmp; > + unsigned int vco_band_div, tmp, ref_doubler_en = 0; > int ret; > > /* Perform a software reset */ > @@ -514,8 +519,14 @@ static int adf4371_setup(struct adf4371_state *st) > (!st->ref_diff_en && st->clkin_freq > ADF4371_MAX_FREQ_REFIN_SE)) > return -EINVAL; > > + if (st->clkin_freq < ADF4371_MAX_CLKIN_DOUB_FREQ && > + st->clkin_freq > ADF4371_MIN_CLKIN_DOUB_FREQ) > + ref_doubler_en = 1; > + > ret = regmap_update_bits(st->regmap, ADF4371_REG(0x22), > + ADF4371_REF_DOUB_MASK | > ADF4371_REFIN_MODE_MASK, > + ADF4371_REF_DOUB(ref_doubler_en) | > ADF4371_REFIN_MODE(st->ref_diff_en)); > if (ret < 0) > return ret; > @@ -529,7 +540,8 @@ static int adf4371_setup(struct adf4371_state *st) > */ > do { > st->ref_div_factor++; > - st->fpfd = st->clkin_freq / st->ref_div_factor; > + st->fpfd = st->clkin_freq * (1 + ref_doubler_en) / > + st->ref_div_factor; > } while (st->fpfd > ADF4371_MAX_FREQ_PFD); > > /* Calculate Timeouts */