iio: frequency: adf41513: handle LE synchronization feature

When LE sync is enabled, it must be set after powering up and it 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>
Signed-off-by: Jonathan Cameron <jic23@kernel.org>
This commit is contained in:
Rodrigo Alencar 2026-06-04 10:59:05 +01:00 committed by Jonathan Cameron
parent b96ef22c7f
commit 2d07e0a292

View File

@ -226,6 +226,7 @@ struct adf41513_data {
bool phase_detector_polarity;
bool logic_lvl_1v8_en;
bool le_sync_en;
};
struct adf41513_pll_settings {
@ -635,13 +636,28 @@ 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_ALL);
st->regs[ADF41513_REG12] &= ~ADF41513_REG12_LE_SELECT_MSK;
ret = adf41513_sync_config(st, ADF41513_SYNC_ALL);
if (ret)
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);
if (ret)
return ret;
}
return 0;
}
static ssize_t adf41513_read_resolution(struct iio_dev *indio_dev,
@ -914,6 +930,8 @@ static int adf41513_parse_fw(struct adf41513_state *st)
"invalid lock detect count: %u\n", tmp);
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;
@ -970,7 +988,18 @@ static int adf41513_setup(struct device *dev, struct adf41513_state *st)
if (ret)
return ret;
return devm_add_action_or_reset(dev, adf41513_close, st);
ret = devm_add_action_or_reset(dev, adf41513_close, st);
if (ret)
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);
if (ret)
return ret;
}
return 0;
}
static int adf41513_pm_suspend(struct device *dev)