@@ -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 ,
@@ -2937,6 +2956,72 @@ static int adrv9025_phy_parse_agc_dt(struct iio_dev *iodev, struct device *dev)
29372956 & phy -> agcConfig -> agcSlowloopFastGainChangeBlockEnable , 0 , 0 , 1 );
29382957}
29392958
2959+ static int adrv9025_phy_parse_dpd_config_dt (struct iio_dev * iodev , struct device * dev )
2960+ {
2961+ struct adrv9025_rf_phy * phy = iio_priv (iodev );
2962+ struct device_node * np = dev -> of_node ;
2963+ int ret ;
2964+
2965+ ret = ADRV9025_OF_PROP ("adi,dpd-indirect-regularization-value" ,
2966+ & phy -> dpdTrackingConfig -> dpdIndirectRegularizationValue , 20 , 0 , 63 );
2967+ if (ret )
2968+ return ret ;
2969+
2970+ ret = ADRV9025_OF_PROP ("adi,dpd-direct-regularization-value" ,
2971+ & phy -> dpdTrackingConfig -> dpdDirectRegularizationValue , 35 , 0 , 63 );
2972+ if (ret )
2973+ return ret ;
2974+
2975+ ret = ADRV9025_OF_PROP ("adi,dpd-samples" ,
2976+ & phy -> dpdTrackingConfig -> dpdSamples , 16384 , 4096 , 61440 );
2977+ if (ret )
2978+ return ret ;
2979+
2980+ ret = ADRV9025_OF_PROP ("adi,dpd-m-threshold" ,
2981+ & phy -> dpdTrackingConfig -> dpdMThreshold , 2920 , 0 , 32767 );
2982+ if (ret )
2983+ return ret ;
2984+
2985+ ret = ADRV9025_OF_PROP ("adi,dpd-peak-search-window-size" ,
2986+ & phy -> dpdTrackingConfig -> dpdPeakSearchWindowSize , 65535 , 0 , 16777215 );
2987+ if (ret )
2988+ return ret ;
2989+
2990+ ret = ADRV9025_OF_PROP ("adi,dpd-update-mode" ,
2991+ & phy -> dpdTrackingConfig -> dpdUpdateMode , 0 , 0 , 2 );
2992+ if (ret )
2993+ return ret ;
2994+
2995+ ret = ADRV9025_OF_PROP ("adi,dpd-min-avg-signal-level" ,
2996+ & phy -> dpdTrackingConfig -> minAvgSignalLevel , 519 , 0 , 65535 );
2997+ if (ret )
2998+ return ret ;
2999+
3000+ ret = ADRV9025_OF_PROP ("adi,dpd-mu" ,
3001+ & phy -> dpdTrackingConfig -> dpdMu , 50 , 0 , 100 );
3002+ if (ret )
3003+ return ret ;
3004+
3005+ ret = ADRV9025_OF_PROP ("adi,dpd-min-avg-signal-level-orx" ,
3006+ & phy -> dpdTrackingConfig -> minAvgSignalLevelOrx , 519 , 0 , 65535 );
3007+ if (ret )
3008+ return ret ;
3009+
3010+ ret = ADRV9025_OF_PROP ("adi,dpd-filter-sel" ,
3011+ & phy -> dpdTrackingConfig -> dpdFilterSel , 0 , 0 , 1 );
3012+ if (ret )
3013+ return ret ;
3014+
3015+ ret = ADRV9025_OF_PROP ("adi,dpd-enable-direct-learning" ,
3016+ & phy -> dpdTrackingConfig -> enableDirectLearning , 0 , 0 , 1 );
3017+ if (ret )
3018+ return ret ;
3019+
3020+ return ADRV9025_OF_PROP ("adi,dpd-indirect-regularization-low-power-value" ,
3021+ & phy -> dpdTrackingConfig -> dpdIndirectRegularizationLowPowerValue ,
3022+ 20 , 0 , 63 );
3023+ }
3024+
29403025static int adrv9025_parse_dpd_coef (struct adrv9025_rf_phy * phy , char * data , u32 size )
29413026{
29423027 u8 dpdNumFeatures = 0 , i , j , k , lut ;
@@ -3042,12 +3127,19 @@ static int adrv9025_probe(struct spi_device *spi)
30423127 phy -> dpdModelConfig = kzalloc (sizeof (adi_adrv9025_DpdModelConfig_v2_t ), GFP_KERNEL );
30433128 if (!(phy -> dpdModelConfig ))
30443129 return - ENOMEM ;
3130+ phy -> dpdTrackingConfig = kzalloc (sizeof (adi_adrv9025_DpdTrackingConfig_t ), GFP_KERNEL );
3131+ if (!(phy -> dpdTrackingConfig ))
3132+ return - ENOMEM ;
30453133 mutex_init (& phy -> lock );
30463134
30473135 ret = adrv9025_phy_parse_agc_dt (indio_dev , & spi -> dev );
30483136 if (ret )
30493137 return ret ;
30503138
3139+ ret = adrv9025_phy_parse_dpd_config_dt (indio_dev , & spi -> dev );
3140+ if (ret )
3141+ return ret ;
3142+
30513143 priv = jesd204_dev_priv (jdev );
30523144 priv -> phy = phy ;
30533145
0 commit comments