@@ -47,6 +47,7 @@ enum adrv9025_iio_dev_attr {
4747 ADRV9025_CAL_MASK ,
4848 ADRV9025_DPD_TX_MASK ,
4949 ADRV9025_DPD_RESET ,
50+ ADRV9025_DPD_CONFIG_SET ,
5051 adrv9025_JESD204_FSM_ERROR ,
5152 adrv9025_JESD204_FSM_PAUSED ,
5253 adrv9025_JESD204_FSM_STATE ,
@@ -398,6 +399,20 @@ static ssize_t adrv9025_phy_store(struct device *dev,
398399 ret = adrv9025_dev_err (phy );
399400 }
400401 break ;
402+ case ADRV9025_DPD_CONFIG_SET :
403+ ret = kstrtobool (buf , & enable );
404+ if (ret )
405+ break ;
406+
407+ phy -> dpdTrackingConfig -> txChannelMask = phy -> dpdTxChannel ;
408+
409+ if (enable ) {
410+ ret = adi_adrv9025_DpdTrackingConfigSet (phy -> madDevice ,
411+ phy -> dpdTrackingConfig );
412+ if (ret )
413+ ret = adrv9025_dev_err (phy );
414+ }
415+ break ;
401416 case adrv9025_JESD204_FSM_RESUME :
402417 if (!phy -> jdev ) {
403418 ret = - ENOTSUPP ;
@@ -589,6 +604,9 @@ static IIO_DEVICE_ATTR(dpd_tx_mask, 0644, adrv9025_phy_show,
589604static IIO_DEVICE_ATTR (dpd_reset , 0200 , NULL,
590605 adrv9025_phy_store , ADRV9025_DPD_RESET ) ;
591606
607+ static IIO_DEVICE_ATTR (dpd_tracking_config_set , 0200 , NULL,
608+ adrv9025_phy_store , ADRV9025_DPD_CONFIG_SET ) ;
609+
592610static IIO_DEVICE_ATTR (jesd204_fsm_error , 0444 ,
593611 adrv9025_phy_show ,
594612 NULL,
@@ -624,6 +642,7 @@ static struct attribute *adrv9025_phy_attributes[] = {
624642 & iio_dev_attr_calibrate_mask .dev_attr .attr ,
625643 & iio_dev_attr_dpd_tx_mask .dev_attr .attr ,
626644 & iio_dev_attr_dpd_reset .dev_attr .attr ,
645+ & iio_dev_attr_dpd_tracking_config_set .dev_attr .attr ,
627646 & iio_dev_attr_jesd204_fsm_error .dev_attr .attr ,
628647 & iio_dev_attr_jesd204_fsm_state .dev_attr .attr ,
629648 & iio_dev_attr_jesd204_fsm_paused .dev_attr .attr ,
@@ -2952,6 +2971,72 @@ static int adrv9025_phy_parse_agc_dt(struct iio_dev *iodev, struct device *dev)
29522971 & phy -> agcConfig -> agcSlowloopFastGainChangeBlockEnable , 0 , 0 , 1 );
29532972}
29542973
2974+ static int adrv9025_phy_parse_dpd_config_dt (struct iio_dev * iodev , struct device * dev )
2975+ {
2976+ struct adrv9025_rf_phy * phy = iio_priv (iodev );
2977+ struct device_node * np = dev -> of_node ;
2978+ int ret ;
2979+
2980+ ret = ADRV9025_OF_PROP ("adi,dpd-indirect-regularization-value" ,
2981+ & phy -> dpdTrackingConfig -> dpdIndirectRegularizationValue , 20 , 0 , 63 );
2982+ if (ret )
2983+ return ret ;
2984+
2985+ ret = ADRV9025_OF_PROP ("adi,dpd-direct-regularization-value" ,
2986+ & phy -> dpdTrackingConfig -> dpdDirectRegularizationValue , 35 , 0 , 63 );
2987+ if (ret )
2988+ return ret ;
2989+
2990+ ret = ADRV9025_OF_PROP ("adi,dpd-samples" ,
2991+ & phy -> dpdTrackingConfig -> dpdSamples , 16384 , 4096 , 61440 );
2992+ if (ret )
2993+ return ret ;
2994+
2995+ ret = ADRV9025_OF_PROP ("adi,dpd-m-threshold" ,
2996+ & phy -> dpdTrackingConfig -> dpdMThreshold , 2920 , 0 , 32767 );
2997+ if (ret )
2998+ return ret ;
2999+
3000+ ret = ADRV9025_OF_PROP ("adi,dpd-peak-search-window-size" ,
3001+ & phy -> dpdTrackingConfig -> dpdPeakSearchWindowSize , 65535 , 0 , 16777215 );
3002+ if (ret )
3003+ return ret ;
3004+
3005+ ret = ADRV9025_OF_PROP ("adi,dpd-update-mode" ,
3006+ & phy -> dpdTrackingConfig -> dpdUpdateMode , 0 , 0 , 2 );
3007+ if (ret )
3008+ return ret ;
3009+
3010+ ret = ADRV9025_OF_PROP ("adi,dpd-min-avg-signal-level" ,
3011+ & phy -> dpdTrackingConfig -> minAvgSignalLevel , 519 , 0 , 65535 );
3012+ if (ret )
3013+ return ret ;
3014+
3015+ ret = ADRV9025_OF_PROP ("adi,dpd-mu" ,
3016+ & phy -> dpdTrackingConfig -> dpdMu , 50 , 0 , 100 );
3017+ if (ret )
3018+ return ret ;
3019+
3020+ ret = ADRV9025_OF_PROP ("adi,dpd-min-avg-signal-level-orx" ,
3021+ & phy -> dpdTrackingConfig -> minAvgSignalLevelOrx , 519 , 0 , 65535 );
3022+ if (ret )
3023+ return ret ;
3024+
3025+ ret = ADRV9025_OF_PROP ("adi,dpd-filter-sel" ,
3026+ & phy -> dpdTrackingConfig -> dpdFilterSel , 0 , 0 , 1 );
3027+ if (ret )
3028+ return ret ;
3029+
3030+ ret = ADRV9025_OF_PROP ("adi,dpd-enable-direct-learning" ,
3031+ & phy -> dpdTrackingConfig -> enableDirectLearning , 0 , 0 , 1 );
3032+ if (ret )
3033+ return ret ;
3034+
3035+ return ADRV9025_OF_PROP ("adi,dpd-indirect-regularization-low-power-value" ,
3036+ & phy -> dpdTrackingConfig -> dpdIndirectRegularizationLowPowerValue ,
3037+ 20 , 0 , 63 );
3038+ }
3039+
29553040static int adrv9025_parse_dpd_coef (struct adrv9025_rf_phy * phy , char * data , u32 size )
29563041{
29573042 u8 dpdNumFeatures = 0 , i , j , k , lut ;
@@ -3057,12 +3142,19 @@ static int adrv9025_probe(struct spi_device *spi)
30573142 phy -> dpdModelConfig = kzalloc (sizeof (adi_adrv9025_DpdModelConfig_v2_t ), GFP_KERNEL );
30583143 if (!(phy -> dpdModelConfig ))
30593144 return - ENOMEM ;
3145+ phy -> dpdTrackingConfig = kzalloc (sizeof (adi_adrv9025_DpdTrackingConfig_t ), GFP_KERNEL );
3146+ if (!(phy -> dpdTrackingConfig ))
3147+ return - ENOMEM ;
30603148 mutex_init (& phy -> lock );
30613149
30623150 ret = adrv9025_phy_parse_agc_dt (indio_dev , & spi -> dev );
30633151 if (ret )
30643152 return ret ;
30653153
3154+ ret = adrv9025_phy_parse_dpd_config_dt (indio_dev , & spi -> dev );
3155+ if (ret )
3156+ return ret ;
3157+
30663158 priv = jesd204_dev_priv (jdev );
30673159 priv -> phy = phy ;
30683160
0 commit comments