Commit 80ce1f10 authored by Antoniu Miclaus's avatar Antoniu Miclaus Committed by Jonathan Cameron
Browse files

iio: frequency: adf4371: add ref doubler

parent e01670e3
Loading
Loading
Loading
Loading
+14 −2
Original line number Diff line number Diff line
@@ -45,6 +45,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)
@@ -76,6 +78,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 */
@@ -483,7 +488,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 */
@@ -516,8 +521,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;
@@ -531,7 +542,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 */