Skip to content

Commit 063e015

Browse files
committed
iio: frequency: ad9172: implement sysref oneshot sequence
Support for performing oneshot sequence as laid out in section "jesd204b serial data interface" and sync procedure of datasheet rev C [1] for device. In addition to the already implemented sysref_enable step, the other steps are also required for a sync to take place. Feature is here implemented for subclass 1 operation with jesd-fsm enabled. [1] https://www.analog.com/media/en/technical-documentation/data-sheets/ad9171.pdf Signed-off-by: Tomas Melin <tomas.melin@vaisala.com>
1 parent 643046a commit 063e015

File tree

4 files changed

+102
-0
lines changed

4 files changed

+102
-0
lines changed

drivers/iio/frequency/ad9172.c

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ struct ad9172_state {
6767
u32 clock_output_config;
6868
u32 scrambling;
6969
u32 sysref_mode;
70+
u32 sysref_err_win;
7071
bool pll_bypass;
7172
signal_type_t syncoutb_type;
7273
signal_coupling_t sysref_coupling;
@@ -928,6 +929,9 @@ static int ad9172_parse_dt(struct spi_device *spi, struct ad9172_state *st)
928929
if (of_property_read_u32(np, "adi,sysref-mode", &st->sysref_mode))
929930
st->sysref_mode = SYSREF_CONT;
930931

932+
st->sysref_err_win = 0;
933+
of_property_read_u32(np, "adi,sysref-error-window", &st->sysref_err_win);
934+
931935
/*Logic lane configuration*/
932936
ret = of_property_read_u8_array(np,"adi,logic-lanes-mapping",
933937
st->logic_lanes, sizeof(st->logic_lanes));
@@ -1001,6 +1005,15 @@ static int ad9172_jesd204_link_enable(struct jesd204_dev *jdev,
10011005

10021006
ad917x_jesd_set_sysref_enable(&st->dac_h, !!st->jesd_subclass);
10031007

1008+
if (lnk->subclass == JESD204_SUBCLASS_1 &&
1009+
st->sysref_mode == SYSREF_ONESHOT) {
1010+
ret = ad917x_jesd_oneshot_sync(&st->dac_h, st->sysref_err_win);
1011+
if (ret) {
1012+
dev_err(dev, "Failed to set oneshot sync (%d)\n", ret);
1013+
return ret;
1014+
}
1015+
}
1016+
10041017
/*Enable Link*/
10051018
ret = ad917x_jesd_enable_link(&st->dac_h, JESD_LINK_ALL,
10061019
reason == JESD204_STATE_OP_REASON_INIT);
@@ -1021,6 +1034,7 @@ static int ad9172_jesd204_link_running(struct jesd204_dev *jdev,
10211034
struct ad9172_state *st = priv->st;
10221035
unsigned long lane_rate_khz;
10231036
int ret;
1037+
bool done;
10241038

10251039
if (reason != JESD204_STATE_OP_REASON_INIT)
10261040
return JESD204_STATE_CHANGE_DONE;
@@ -1040,6 +1054,20 @@ static int ad9172_jesd204_link_running(struct jesd204_dev *jdev,
10401054
return ret;
10411055
}
10421056

1057+
if (lnk->subclass == JESD204_SUBCLASS_1 &&
1058+
st->sysref_mode == SYSREF_ONESHOT) {
1059+
ret = ad917x_jesd_get_sync_rotation_done(&st->dac_h, &done);
1060+
if (ret) {
1061+
dev_err(dev, "Failed sync rotation read (%d)\n", ret);
1062+
return ret;
1063+
}
1064+
1065+
if (!done) {
1066+
dev_err(dev, "JESD204 sync rotation check failed\n");
1067+
return JESD204_STATE_CHANGE_ERROR;
1068+
}
1069+
}
1070+
10431071
return JESD204_STATE_CHANGE_DONE;
10441072
}
10451073

drivers/iio/frequency/ad917x/AD917x.h

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -473,6 +473,27 @@ int ad917x_jesd_set_sysref_enable(ad917x_handle_t *h, uint8_t en);
473473
*/
474474
int ad917x_jesd_get_sysref_enable(ad917x_handle_t *h, uint8_t *en);
475475

476+
/**
477+
* \brief Configure SYSREF for oneshot sync
478+
*
479+
* Configure SYSREF oneshot sequence to align LMFC on next SYSREF
480+
* rising edge signal.
481+
*
482+
* \param h Pointer to the AD917X device reference handle.
483+
* \param err_window Error window in DAC clock cycles for SYSREF
484+
* jitter.
485+
*/
486+
int ad917x_jesd_oneshot_sync(ad917x_handle_t *h, u8 err_window);
487+
488+
/**
489+
* \brief Check if sync rotation has happened
490+
*
491+
* Checks if SYSREF to LMFC synchronization logic has completed.
492+
*
493+
* \param h Pointer to the AD917X device reference handle.
494+
* \param *done Return value indicating if rotation has completed.
495+
*/
496+
int ad917x_jesd_get_sync_rotation_done(ad917x_handle_t *h, bool *done);
476497

477498
/**
478499
* \brief Set the LMFC Delay and Variance for the JESD Links

drivers/iio/frequency/ad917x/ad917x_jesd_api.c

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -243,6 +243,51 @@ int ad917x_jesd_get_cfg_param(ad917x_handle_t *h,
243243
return API_ERROR_OK;
244244
}
245245

246+
int ad917x_jesd_oneshot_sync(ad917x_handle_t *h, u8 err_window)
247+
{
248+
int err;
249+
u8 mode;
250+
251+
if (!h)
252+
return API_ERROR_INVALID_HANDLE_PTR;
253+
254+
err = ad917x_register_write(h, AD917X_SYSREF_ERR_WINDOW_REG,
255+
AD917X_SYSREF_ERR_WIN(err_window));
256+
if (err)
257+
return err;
258+
259+
err = ad917x_register_read(h, AD917X_SYSREF_MODE_REG, &mode);
260+
if (err)
261+
return err;
262+
263+
if (mode & AD917X_SYSREF_MODE_ONESHOT) {
264+
err = ad917x_register_write(h, AD917X_SYSREF_MODE_REG,
265+
mode & ~AD917X_SYSREF_MODE_ONESHOT);
266+
if (err)
267+
return err;
268+
}
269+
270+
return ad917x_register_write(h, AD917X_SYSREF_MODE_REG,
271+
mode | AD917X_SYSREF_MODE_ONESHOT);
272+
}
273+
274+
int ad917x_jesd_get_sync_rotation_done(ad917x_handle_t *h, bool *done)
275+
{
276+
int err;
277+
u8 mode;
278+
279+
if (!h)
280+
return API_ERROR_INVALID_HANDLE_PTR;
281+
282+
err = ad917x_register_read(h, AD917X_SYSREF_MODE_REG, &mode);
283+
if (err)
284+
return err;
285+
286+
*done = (mode & AD917X_SYNC_ROTATION_DONE);
287+
288+
return 0;
289+
}
290+
246291
int ad917x_jesd_set_sysref_enable(ad917x_handle_t *h, uint8_t en)
247292
{
248293
int err;

drivers/iio/frequency/ad917x/ad917x_reg.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,14 @@ int ad917x_register_read_block(ad917x_handle_t *h,
4747
#define AD917X_MAINDAC_PAGE_0 BIT(6)
4848
#define AD917X_MAINDAC_PAGE_1 BIT(7)
4949

50+
#define AD917X_SYSREF_ERR_WINDOW_REG 0x039
51+
#define AD917X_SYSREF_ERR_WIN(x) (((x) & 0x7F) << 0)
52+
53+
#define AD917X_SYSREF_MODE_REG 0x03A
54+
#define AD917X_SYNC_ROTATION_DONE BIT(4)
55+
#define AD917X_SYSREF_MODE_ONESHOT BIT(1)
56+
#define AD917X_SYSREF_MODE_CONTINUOUS BIT(0)
57+
5058
#define AD917X_SYSREF_ROTATION_REG 0x03B
5159
#define AD917X_SYNC_LOGIC_EN BIT(7)
5260
#define AD917X_SYNC_RSV_EN BIT(6)

0 commit comments

Comments
 (0)