From 2d07e0a292a271976237bdeb36da4658b31f3b13 Mon Sep 17 00:00:00 2001 From: Rodrigo Alencar Date: Thu, 4 Jun 2026 10:59:05 +0100 Subject: [PATCH] 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 Signed-off-by: Jonathan Cameron --- drivers/iio/frequency/adf41513.c | 33 ++++++++++++++++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/drivers/iio/frequency/adf41513.c b/drivers/iio/frequency/adf41513.c index 1a084e6b3c65..cc27edfbda9a 100644 --- a/drivers/iio/frequency/adf41513.c +++ b/drivers/iio/frequency/adf41513.c @@ -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)