* [PATCH 2/3] iio: frequency: adf4371: add differential ref
2024-12-06 15:22 [PATCH 1/3] dt-bindings: iio: adf4371: add differential ref Antoniu Miclaus
@ 2024-12-06 15:22 ` Antoniu Miclaus
2024-12-06 15:22 ` [PATCH 3/3] iio: frequency: adf4371: add ref doubler Antoniu Miclaus
2024-12-08 16:41 ` [PATCH 1/3] dt-bindings: iio: adf4371: add differential ref Jonathan Cameron
2 siblings, 0 replies; 5+ messages in thread
From: Antoniu Miclaus @ 2024-12-06 15:22 UTC (permalink / raw)
To: jic23, robh, conor+dt, linux-iio, devicetree, linux-kernel,
linux-pwm
Cc: Antoniu Miclaus
Add support for differential input reference clock.
Signed-off-by: Antoniu Miclaus <antoniu.miclaus@analog.com>
---
drivers/iio/frequency/adf4371.c | 19 +++++++++++++++++++
1 file changed, 19 insertions(+)
diff --git a/drivers/iio/frequency/adf4371.c b/drivers/iio/frequency/adf4371.c
index b27088464826..55bee06fb42d 100644
--- a/drivers/iio/frequency/adf4371.c
+++ b/drivers/iio/frequency/adf4371.c
@@ -41,6 +41,10 @@
#define ADF4371_MOD2WORD_MSK GENMASK(5, 0)
#define ADF4371_MOD2WORD(x) FIELD_PREP(ADF4371_MOD2WORD_MSK, x)
+/* ADF4371_REG22 */
+#define ADF4371_REFIN_MODE_MASK BIT(6)
+#define ADF4371_REFIN_MODE(x) FIELD_PREP(ADF4371_REFIN_MODE_MASK, x)
+
/* ADF4371_REG24 */
#define ADF4371_RF_DIV_SEL_MSK GENMASK(6, 4)
#define ADF4371_RF_DIV_SEL(x) FIELD_PREP(ADF4371_RF_DIV_SEL_MSK, x)
@@ -69,6 +73,7 @@
#define ADF4371_MAX_FREQ_PFD 250000000UL /* Hz */
#define ADF4371_MAX_FREQ_REFIN 600000000UL /* Hz */
+#define ADF4371_MAX_FREQ_REFIN_SE 500000000UL /* Hz */
/* MOD1 is a 24-bit primary modulus with fixed value of 2^25 */
#define ADF4371_MODULUS1 33554432ULL
@@ -476,6 +481,7 @@ 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;
+ bool ref_diff_en;
int ret;
/* Perform a software reset */
@@ -497,12 +503,25 @@ static int adf4371_setup(struct adf4371_state *st)
return ret;
}
+ ref_diff_en = device_property_read_bool(&st->spi->dev, "adi,ref-differential-enable");
+
/* Set address in ascending order, so the bulk_write() will work */
ret = regmap_update_bits(st->regmap, ADF4371_REG(0x0),
ADF4371_ADDR_ASC_MSK | ADF4371_ADDR_ASC_R_MSK,
ADF4371_ADDR_ASC(1) | ADF4371_ADDR_ASC_R(1));
if (ret < 0)
return ret;
+
+ if ((ref_diff_en && st->clkin_freq > ADF4371_MAX_FREQ_REFIN) ||
+ (!ref_diff_en && st->clkin_freq > ADF4371_MAX_FREQ_REFIN_SE))
+ return -EINVAL;
+
+ ret = regmap_update_bits(st->regmap, ADF4371_REG(0x22),
+ ADF4371_REFIN_MODE_MASK,
+ ADF4371_REFIN_MODE(ref_diff_en));
+ if (ret < 0)
+ return ret;
+
/*
* Calculate and maximize PFD frequency
* fPFD = REFIN × ((1 + D)/(R × (1 + T)))
--
2.47.1
^ permalink raw reply related [flat|nested] 5+ messages in thread* [PATCH 3/3] iio: frequency: adf4371: add ref doubler
2024-12-06 15:22 [PATCH 1/3] dt-bindings: iio: adf4371: add differential ref Antoniu Miclaus
2024-12-06 15:22 ` [PATCH 2/3] iio: frequency: " Antoniu Miclaus
@ 2024-12-06 15:22 ` Antoniu Miclaus
2024-12-08 16:42 ` Jonathan Cameron
2024-12-08 16:41 ` [PATCH 1/3] dt-bindings: iio: adf4371: add differential ref Jonathan Cameron
2 siblings, 1 reply; 5+ messages in thread
From: Antoniu Miclaus @ 2024-12-06 15:22 UTC (permalink / raw)
To: jic23, robh, conor+dt, linux-iio, devicetree, linux-kernel,
linux-pwm
Cc: Antoniu Miclaus
Add support for the reference doubler.
Signed-off-by: Antoniu Miclaus <antoniu.miclaus@analog.com>
---
drivers/iio/frequency/adf4371.c | 14 ++++++++++++--
1 file changed, 12 insertions(+), 2 deletions(-)
diff --git a/drivers/iio/frequency/adf4371.c b/drivers/iio/frequency/adf4371.c
index 55bee06fb42d..dc01f2aafb9a 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 */
@@ -480,7 +485,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;
bool ref_diff_en;
int ret;
@@ -516,6 +521,10 @@ static int adf4371_setup(struct adf4371_state *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_REFIN_MODE_MASK,
ADF4371_REFIN_MODE(ref_diff_en));
@@ -531,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 */
--
2.47.1
^ permalink raw reply related [flat|nested] 5+ messages in thread* Re: [PATCH 3/3] iio: frequency: adf4371: add ref doubler
2024-12-06 15:22 ` [PATCH 3/3] iio: frequency: adf4371: add ref doubler Antoniu Miclaus
@ 2024-12-08 16:42 ` Jonathan Cameron
0 siblings, 0 replies; 5+ messages in thread
From: Jonathan Cameron @ 2024-12-08 16:42 UTC (permalink / raw)
To: Antoniu Miclaus
Cc: robh, conor+dt, linux-iio, devicetree, linux-kernel, linux-pwm
On Fri, 6 Dec 2024 17:22:06 +0200
Antoniu Miclaus <antoniu.miclaus@analog.com> wrote:
> Add support for the reference doubler.
>
> Signed-off-by: Antoniu Miclaus <antoniu.miclaus@analog.com>
> ---
> drivers/iio/frequency/adf4371.c | 14 ++++++++++++--
> 1 file changed, 12 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/iio/frequency/adf4371.c b/drivers/iio/frequency/adf4371.c
> index 55bee06fb42d..dc01f2aafb9a 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 */
> @@ -480,7 +485,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;
> bool ref_diff_en;
> int ret;
>
> @@ -516,6 +521,10 @@ static int adf4371_setup(struct adf4371_state *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_REFIN_MODE_MASK,
> ADF4371_REFIN_MODE(ref_diff_en));
> @@ -531,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);
No need for brackets on the previous line.
Otherwise this looks good to me.
> } while (st->fpfd > ADF4371_MAX_FREQ_PFD);
>
> /* Calculate Timeouts */
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH 1/3] dt-bindings: iio: adf4371: add differential ref
2024-12-06 15:22 [PATCH 1/3] dt-bindings: iio: adf4371: add differential ref Antoniu Miclaus
2024-12-06 15:22 ` [PATCH 2/3] iio: frequency: " Antoniu Miclaus
2024-12-06 15:22 ` [PATCH 3/3] iio: frequency: adf4371: add ref doubler Antoniu Miclaus
@ 2024-12-08 16:41 ` Jonathan Cameron
2 siblings, 0 replies; 5+ messages in thread
From: Jonathan Cameron @ 2024-12-08 16:41 UTC (permalink / raw)
To: Antoniu Miclaus
Cc: robh, conor+dt, linux-iio, devicetree, linux-kernel, linux-pwm
On Fri, 6 Dec 2024 17:22:04 +0200
Antoniu Miclaus <antoniu.miclaus@analog.com> wrote:
> Add support for differential input reference clock.
If it's an input clock, why not a named clock?
>
> Signed-off-by: Antoniu Miclaus <antoniu.miclaus@analog.com>
> ---
> Documentation/devicetree/bindings/iio/frequency/adf4371.yaml | 5 +++++
> 1 file changed, 5 insertions(+)
>
> diff --git a/Documentation/devicetree/bindings/iio/frequency/adf4371.yaml b/Documentation/devicetree/bindings/iio/frequency/adf4371.yaml
> index 1cb2adaf66f9..dd9a592d0026 100644
> --- a/Documentation/devicetree/bindings/iio/frequency/adf4371.yaml
> +++ b/Documentation/devicetree/bindings/iio/frequency/adf4371.yaml
> @@ -40,6 +40,11 @@ properties:
> output stage will shut down until the ADF4371/ADF4372 achieves lock as
> measured by the digital lock detect circuitry.
>
> + adi,ref-differential-enable:
> + type: boolean
> + description:
> + If this property is present, differential input reference is enabled.
> +
> required:
> - compatible
> - reg
^ permalink raw reply [flat|nested] 5+ messages in thread