[PATCH v2 3/6] iio: frequency: adf41513: handle LE synchronization feature

Rodrigo Alencar via B4 Relay
2025-12-19T12:34:54Z

From: Rodrigo Alencar <rodrigo.alencar@analog.com>

When LE sync is enabled, it is must be set after powering up and must be
disabled when powering down. It is recommended when using the PLL as
a frequency synthesizer, where reference signal will always be present
while the device is being configured.

Signed-off-by: Rodrigo Alencar <rodrigo.alencar@analog.com>
---
drivers/iio/frequency/adf41513.c | 33 ++++++++++++++++++++++++++++++---
1 file changed, 30 insertions(+), 3 deletions(-)

diff --git a/drivers/iio/frequency/adf41513.c b/drivers/iio/frequency/adf41513.c
index a967dc4479e7..ecce4911b296 100644
--- a/drivers/iio/frequency/adf41513.c
+++ b/drivers/iio/frequency/adf41513.c
@@ -220,6 +220,7 @@ struct adf41513_data {

u8 muxout_select;
bool muxout_1v8_en;
+ bool le_sync_en;
};

struct adf41513_pll_settings {
@@ -731,13 +732,25 @@ static int adf41513_set_frequency(struct adf41513_state *st, u64 freq_uhz, u16 s
static int adf41513_suspend(struct adf41513_state *st)
{
st->regs[ADF41513_REG6] |= FIELD_PREP(ADF41513_REG6_POWER_DOWN_MSK, 1);
+ st->regs[ADF41513_REG12] &= ~ADF41513_REG12_LE_SELECT_MSK;
return adf41513_sync_config(st, ADF41513_SYNC_DIFF);
}

static int adf41513_resume(struct adf41513_state *st)
{
+ int ret;
+
st->regs[ADF41513_REG6] &= ~ADF41513_REG6_POWER_DOWN_MSK;
- return adf41513_sync_config(st, ADF41513_SYNC_DIFF);
+ ret = adf41513_sync_config(st, ADF41513_SYNC_DIFF);
+ if (ret < 0)
+ return ret;
+
+ if (st->data.le_sync_en) {
+ st->regs[ADF41513_REG12] |= ADF41513_REG12_LE_SELECT_MSK;
+ ret = adf41513_sync_config(st, ADF41513_SYNC_DIFF);
+ }
+
+ return ret;
}

static ssize_t adf41513_read_uhz(struct iio_dev *indio_dev,
@@ -1061,6 +1074,9 @@ static int adf41513_parse_fw(struct adf41513_state *st)
st->data.lock_detect_count = tmp;
}

+ /* load enable sync */
+ st->data.le_sync_en = device_property_read_bool(dev, "adi,le-sync-enable");
+
st->data.freq_resolution_uhz = MICROHZ_PER_HZ;

return 0;
@@ -1068,6 +1084,7 @@ static int adf41513_parse_fw(struct adf41513_state *st)

static int adf41513_setup(struct adf41513_state *st)
{
+ int ret;
u32 tmp;

memset(st->regs_hw, 0xFF, sizeof(st->regs_hw));
@@ -1108,8 +1125,18 @@ static int adf41513_setup(struct adf41513_state *st)
st->data.muxout_1v8_en ? 0 : 1);

/* perform initialization sequence with power-up frequency */
- return adf41513_set_frequency(st, (u64)st->data.power_up_frequency_hz * MICROHZ_PER_HZ,
- ADF41513_SYNC_ALL);
+ ret = adf41513_set_frequency(st,
+ (u64)st->data.power_up_frequency_hz * MICROHZ_PER_HZ,
+ ADF41513_SYNC_ALL);
+ if (ret < 0)
+ return ret;
+
+ if (st->data.le_sync_en) {
+ st->regs[ADF41513_REG12] |= ADF41513_REG12_LE_SELECT_MSK;
+ ret = adf41513_sync_config(st, ADF41513_SYNC_DIFF);
+ }
+
+ return ret;
}

static void adf41513_power_down(void *data)

--
2.43.0