Skip to content

Commit db276db

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 <[email protected]>
1 parent 643046a commit db276db

File tree

4 files changed

+101
-0
lines changed

4 files changed

+101
-0
lines changed

drivers/iio/frequency/ad9172.c

Lines changed: 26 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,14 @@ 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+
ret = ad917x_jesd_oneshot_sync(&st->dac_h, st->sysref_err_win);
1010+
if (ret != 0) {
1011+
dev_err(dev, "Failed to set oneshot sync (%d)\n", ret);
1012+
return ret;
1013+
}
1014+
}
1015+
10041016
/*Enable Link*/
10051017
ret = ad917x_jesd_enable_link(&st->dac_h, JESD_LINK_ALL,
10061018
reason == JESD204_STATE_OP_REASON_INIT);
@@ -1021,6 +1033,7 @@ static int ad9172_jesd204_link_running(struct jesd204_dev *jdev,
10211033
struct ad9172_state *st = priv->st;
10221034
unsigned long lane_rate_khz;
10231035
int ret;
1036+
bool done;
10241037

10251038
if (reason != JESD204_STATE_OP_REASON_INIT)
10261039
return JESD204_STATE_CHANGE_DONE;
@@ -1040,6 +1053,19 @@ static int ad9172_jesd204_link_running(struct jesd204_dev *jdev,
10401053
return ret;
10411054
}
10421055

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

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: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -243,6 +243,52 @@ 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 == NULL)
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 != API_ERROR_OK)
257+
return err;
258+
259+
err = ad917x_register_read(h, AD917X_SYSREF_MODE_REG, &mode);
260+
if (err != API_ERROR_OK)
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 != API_ERROR_OK)
267+
return err;
268+
}
269+
270+
err = ad917x_register_write(h, AD917X_SYSREF_MODE_REG,
271+
mode | AD917X_SYSREF_MODE_ONESHOT);
272+
return err;
273+
}
274+
275+
int ad917x_jesd_get_sync_rotation_done(ad917x_handle_t *h, bool *done)
276+
{
277+
int err;
278+
uint8_t mode;
279+
280+
if (h == NULL)
281+
return API_ERROR_INVALID_HANDLE_PTR;
282+
283+
err = ad917x_register_read(h, AD917X_SYSREF_MODE_REG, &mode);
284+
if (err != API_ERROR_OK)
285+
return err;
286+
287+
*done = (mode & AD917X_SYNC_ROTATION_DONE);
288+
289+
return API_ERROR_OK;
290+
}
291+
246292
int ad917x_jesd_set_sysref_enable(ad917x_handle_t *h, uint8_t en)
247293
{
248294
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)