-
Notifications
You must be signed in to change notification settings - Fork 932
Staging/xlnx/ad9081 jrx update #3123
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -152,6 +152,9 @@ | |
| DBGFS_BIST_PRBS_JTX, | ||
| DBGFS_DEV_API_INFO, | ||
| DBGFS_DEV_CHIP_INFO, | ||
| DBGFS_JESD_RX_RECAL_204C, | ||
| DBGFS_JRX_LMFC_DELAY_LINK0, | ||
| DBGFS_JRX_LMFC_DELAY_LINK1, | ||
| DBGFS_ENTRY_MAX, | ||
| }; | ||
|
|
||
|
|
@@ -637,7 +640,7 @@ | |
| static long ad9081_bb_round_rate(struct clk_hw *hw, unsigned long rate, | ||
| unsigned long *prate) | ||
| { | ||
| struct ad9081_clock *clk_priv = to_clk_priv(hw); | ||
|
Check warning on line 643 in drivers/iio/adc/ad9081.c
|
||
|
|
||
| dev_dbg(&clk_priv->spi->dev, "%s: Rate %lu Hz", __func__, rate); | ||
|
|
||
|
|
@@ -2624,9 +2627,6 @@ | |
| jesd204_fsm_stop(phy->jdev, JESD204_LINKS_ALL); | ||
| jesd204_fsm_clear_errors(phy->jdev, JESD204_LINKS_ALL); | ||
| return jesd204_fsm_start(phy->jdev, JESD204_LINKS_ALL); | ||
| case 20: | ||
| return adi_ad9081_jesd_rx_calibrate_204c(&phy->ad9081, 1, | ||
| phy->ad9081.serdes_info.des_settings.boost_mask, 1); | ||
| default: | ||
| return -EINVAL; | ||
| } | ||
|
|
@@ -3259,7 +3259,7 @@ | |
| struct ad9081_phy *phy = | ||
| container_of(work, struct ad9081_phy, dwork.work); | ||
|
|
||
| ret = adi_ad9081_hal_reg_get(&phy->ad9081, REG_IRQ_STATUS0_ADDR, | ||
|
Check warning on line 3262 in drivers/iio/adc/ad9081.c
|
||
| &status); | ||
|
|
||
| if (!(status & BIT(6))) { | ||
|
|
@@ -3643,7 +3643,7 @@ | |
|
|
||
| for (j = 0; j < 8; j++) | ||
| if (phy->jrx_link_tx[0].logiclane_mapping[j] == i) { | ||
| ret = adi_ad9081_jesd_rx_phy_prbs_test_result_get( | ||
|
Check warning on line 3646 in drivers/iio/adc/ad9081.c
|
||
| &phy->ad9081, j, &prbs_rx_result); | ||
|
|
||
| len += snprintf(phy->dbuf + len, sizeof(phy->dbuf), "%u/%u ", | ||
|
|
@@ -3659,7 +3659,7 @@ | |
|
|
||
| for (j = 0; j < 8; j++) | ||
| if (phy->jrx_link_tx[1].logiclane_mapping[j] == i) { | ||
| ret = adi_ad9081_jesd_rx_phy_prbs_test_result_get(&phy->ad9081, | ||
|
Check warning on line 3662 in drivers/iio/adc/ad9081.c
|
||
| j, &prbs_rx_result); | ||
|
|
||
| len += snprintf(phy->dbuf + len, sizeof(phy->dbuf), "%u/%u ", | ||
|
|
@@ -3722,7 +3722,7 @@ | |
| lane, spo_steps, phy->jrx_link_tx[0].lane_rate_kbps); | ||
|
|
||
| for (i = 0; i < (spo_steps * 3); i += 3) | ||
| if (eye_data[i + 1] || eye_data[i + 2]) | ||
| len += snprintf(phy->dbuf + len, | ||
| sizeof(phy->dbuf), | ||
| "%d,%d,%d\n", eye_data[i], | ||
|
|
@@ -3743,6 +3743,12 @@ | |
| len = snprintf(phy->dbuf, sizeof(phy->dbuf), "AD%X Rev. %u Grade %u\n", | ||
| conv->id, phy->chip_id.dev_revision, phy->chip_id.prod_grade); | ||
| break; | ||
| case DBGFS_JRX_LMFC_DELAY_LINK0: | ||
| val = phy->jrx_link_tx[0].jrx_tpl_phase_adjust; | ||
| break; | ||
| case DBGFS_JRX_LMFC_DELAY_LINK1: | ||
| val = phy->jrx_link_tx[1].jrx_tpl_phase_adjust; | ||
| break; | ||
| default: | ||
| val = entry->val; | ||
| } | ||
|
|
@@ -3870,6 +3876,64 @@ | |
| entry->val = val3 << 16 | (val2 & 0xFF) << 8 | (val & 0xFF); | ||
|
|
||
| return count; | ||
| case DBGFS_JESD_RX_RECAL_204C: { | ||
| adi_ad9081_jrx_fg_cal_result_t fg_cal_res; | ||
|
|
||
| if (val != 1) | ||
| return -EINVAL; | ||
|
|
||
| if (phy->jrx_link_tx[0].jesd_param.jesd_jesdv != JESD204_VERSION_C) | ||
| return -ENOTSUPP; | ||
|
|
||
| if (phy->jrx_link_tx[0].lane_rate_kbps <= | ||
| (AD9081_JESDRX_204C_CAL_THRESH / 1000)) | ||
| return -ERANGE; | ||
|
|
||
| ret = adi_ad9081_jesd_rx_link_enable_set(&phy->ad9081, | ||
| ad9081_link_sel(phy->jrx_link_tx), 1); | ||
| if (ret != 0) | ||
| return ret; | ||
|
|
||
| dev_info(&phy->spi->dev, "running jesd_rx_calibrate_204c, LR %lu kbps", | ||
| phy->jrx_link_tx[0].lane_rate_kbps); | ||
|
|
||
| ret = adi_ad9081_jesd_rx_calibrate_204c(&phy->ad9081, 1, | ||
| phy->ad9081.serdes_info.des_settings.boost_mask, 1); | ||
| if (ret < 0) | ||
| return ret; | ||
|
|
||
| ret = adi_ad9081_jesd_rx_calibrate_204c_status_get( | ||
| &phy->ad9081, &fg_cal_res); | ||
| if (ret < 0) | ||
| return ret; | ||
|
|
||
| if (!fg_cal_res.status) { | ||
| dev_err(&phy->spi->dev, "jesd_rx_calibrate_204c failed, failed lane mask 0x%02x\n", | ||
| fg_cal_res.failed_mask); | ||
| } else { | ||
| dev_info(&phy->spi->dev, "jesd_rx_calibrate_204c success, goodness %u, SPO L %u, SPO R %u\n", | ||
| fg_cal_res.goodness, | ||
| fg_cal_res.spo_left, | ||
| fg_cal_res.spo_right); | ||
| } | ||
|
|
||
| ret = adi_ad9081_jesd_rx_link_enable_set(&phy->ad9081, | ||
| ad9081_link_sel(phy->jrx_link_tx), 0); | ||
| if (ret != 0) | ||
| return ret; | ||
|
|
||
| msleep(10); | ||
|
Collaborator
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. fsleep() |
||
|
|
||
| ret = adi_ad9081_jesd_rx_link_enable_set(&phy->ad9081, | ||
| ad9081_link_sel(phy->jrx_link_tx), 1); | ||
| if (ret != 0) | ||
stefpopa marked this conversation as resolved.
Show resolved
Hide resolved
|
||
| return ret; | ||
|
|
||
| if (!fg_cal_res.status) | ||
| return -EFAULT; | ||
|
|
||
| return count; | ||
| } | ||
| case DBGFS_BIST_JRX_SPO_SWEEP: | ||
| if (ret < 2) | ||
| return -EINVAL; | ||
|
|
@@ -3891,6 +3955,26 @@ | |
|
|
||
| entry->val = lv << 16 | rv; | ||
|
|
||
| return count; | ||
| case DBGFS_JRX_LMFC_DELAY_LINK0: | ||
| if (ret < 1) | ||
| return -EINVAL; | ||
|
|
||
| phy->jrx_link_tx[0].jrx_tpl_phase_adjust = val; | ||
| ret = adi_ad9081_jesd_rx_lmfc_delay_set(&phy->ad9081, AD9081_LINK_0, val); | ||
| if (ret) | ||
stefpopa marked this conversation as resolved.
Show resolved
Hide resolved
|
||
| return ret; | ||
|
|
||
| return count; | ||
| case DBGFS_JRX_LMFC_DELAY_LINK1: | ||
| if (ret < 1) | ||
| return -EINVAL; | ||
|
|
||
| phy->jrx_link_tx[1].jrx_tpl_phase_adjust = val; | ||
| ret = adi_ad9081_jesd_rx_lmfc_delay_set(&phy->ad9081, AD9081_LINK_1, val); | ||
| if (ret) | ||
| return ret; | ||
|
|
||
| return count; | ||
| default: | ||
| break; | ||
|
|
@@ -3973,6 +4057,12 @@ | |
| "api_version", DBGFS_DEV_API_INFO); | ||
| ad9081_add_debugfs_entry(indio_dev, | ||
| "chip_version", DBGFS_DEV_CHIP_INFO); | ||
| ad9081_add_debugfs_entry(indio_dev, | ||
| "jesd_rx_recalibrate_204c", DBGFS_JESD_RX_RECAL_204C); | ||
| ad9081_add_debugfs_entry(indio_dev, | ||
| "adi,tpl-phase-adjust-link0", DBGFS_JRX_LMFC_DELAY_LINK0); | ||
| ad9081_add_debugfs_entry(indio_dev, | ||
| "adi,tpl-phase-adjust-link1", DBGFS_JRX_LMFC_DELAY_LINK1); | ||
|
|
||
| for (i = 0; i < phy->ad9081_debugfs_entry_index; i++) | ||
| debugfs_create_file( phy->debugfs_entry[i].propname, 0644, | ||
|
|
@@ -4925,7 +5015,7 @@ | |
| enum jesd204_state_op_reason reason, | ||
| struct jesd204_link *lnk) | ||
| { | ||
| struct device *dev = jesd204_dev_to_device(jdev); | ||
|
Check warning on line 5018 in drivers/iio/adc/ad9081.c
|
||
| struct ad9081_jesd204_priv *priv = jesd204_dev_priv(jdev); | ||
| struct ad9081_phy *phy = priv->phy; | ||
| struct ad9081_jesd_link *link; | ||
|
|
@@ -4942,7 +5032,7 @@ | |
|
|
||
| switch (lnk->link_id) { | ||
| case DEFRAMER_LINK0_TX: | ||
| case DEFRAMER_LINK1_TX: | ||
| if (phy->tx_disable) | ||
| return -ENODEV; | ||
| link = &phy->jrx_link_tx[0]; | ||
|
|
@@ -4951,7 +5041,7 @@ | |
| break; | ||
| case FRAMER_LINK0_RX: | ||
| case FRAMER_LINK1_RX: | ||
| if (phy->rx_disable) | ||
| return -ENODEV; | ||
| link = &phy->jtx_link_rx[lnk->link_id - FRAMER_LINK0_RX]; | ||
| lnk->sample_rate = phy->adc_frequency_hz; | ||
|
|
@@ -5017,6 +5107,8 @@ | |
| phy->jrx_link_tx[0].lane_cal_rate_kbps != | ||
| phy->jrx_link_tx[0].lane_rate_kbps) { | ||
|
|
||
| adi_ad9081_jrx_fg_cal_result_t fg_cal_res; | ||
|
|
||
| ret = adi_ad9081_jesd_rx_link_enable_set(&phy->ad9081, | ||
| ad9081_link_sel(phy->jrx_link_tx), 1); | ||
| if (ret != 0) | ||
|
|
@@ -5030,6 +5122,22 @@ | |
| if (ret < 0) | ||
| return ret; | ||
|
|
||
| ret = adi_ad9081_jesd_rx_calibrate_204c_status_get( | ||
| &phy->ad9081, &fg_cal_res); | ||
| if (ret < 0) | ||
| return ret; | ||
|
|
||
| if (!fg_cal_res.status) { | ||
| dev_err(dev, "jesd_rx_calibrate_204c failed, failed lane mask 0x%02x\n", | ||
| fg_cal_res.failed_mask); | ||
| return -EFAULT; | ||
| } else { | ||
| dev_info(dev, "jesd_rx_calibrate_204c success, goodness %u, SPO L %u, SPO R %u\n", | ||
| fg_cal_res.goodness, | ||
| fg_cal_res.spo_left, | ||
| fg_cal_res.spo_right); | ||
| } | ||
|
|
||
| ret = adi_ad9081_jesd_rx_link_enable_set(&phy->ad9081, | ||
| ad9081_link_sel(phy->jrx_link_tx), 0); | ||
| if (ret != 0) | ||
|
|
@@ -5056,7 +5164,7 @@ | |
| enum jesd204_state_op_reason reason, | ||
| struct jesd204_link *lnk) | ||
| { | ||
| struct device *dev = jesd204_dev_to_device(jdev); | ||
|
Check warning on line 5167 in drivers/iio/adc/ad9081.c
|
||
| struct ad9081_jesd204_priv *priv = jesd204_dev_priv(jdev); | ||
| struct ad9081_phy *phy = priv->phy; | ||
| int ret; | ||
|
|
@@ -5079,7 +5187,7 @@ | |
| enum jesd204_state_op_reason reason, | ||
| struct jesd204_link *lnk) | ||
| { | ||
| struct device *dev = jesd204_dev_to_device(jdev); | ||
|
Check warning on line 5190 in drivers/iio/adc/ad9081.c
|
||
| struct ad9081_jesd204_priv *priv = jesd204_dev_priv(jdev); | ||
| struct ad9081_phy *phy = priv->phy; | ||
| int ret; | ||
|
|
@@ -5123,7 +5231,7 @@ | |
|
|
||
| static int ad9081_jesd204_uninit(struct jesd204_dev *jdev, enum jesd204_state_op_reason reason) | ||
| { | ||
| struct device *dev = jesd204_dev_to_device(jdev); | ||
|
Check warning on line 5234 in drivers/iio/adc/ad9081.c
|
||
|
|
||
| if (reason != JESD204_STATE_OP_REASON_UNINIT) | ||
| return JESD204_STATE_CHANGE_DONE; | ||
|
|
@@ -5136,7 +5244,7 @@ | |
| static int ad9081_jesd204_setup_stage1(struct jesd204_dev *jdev, | ||
| enum jesd204_state_op_reason reason) | ||
| { | ||
| struct device *dev = jesd204_dev_to_device(jdev); | ||
|
Check warning on line 5247 in drivers/iio/adc/ad9081.c
|
||
| struct ad9081_jesd204_priv *priv = jesd204_dev_priv(jdev); | ||
| struct ad9081_phy *phy = priv->phy; | ||
| adi_cms_jesd_subclass_e subclass = JESD_SUBCLASS_0; | ||
|
|
||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Kind of a nitpick but I would put the above as dbg()