@@ -115,6 +115,25 @@ static int ad7949_spi_write_cfg(struct ad7949_adc_chip *ad7949_adc, u16 val,
* time to send a new command to the device
*/
udelay(2);
+
+ /*
+ * Perform extra read cycle to allow configuration, acquisition,
+ * and conversion sequences to complete for new configuration.
+ */
+ (void)memset(&tx, 0, sizeof(tx));
+ (void)memset(ad7949_adc->buffer, 0, AD7949_BUFFER_LEN);
+
+ tx.rx_buf = ad7949_adc->buffer;
+ tx.len = ad7949_spi_cfg_is_read_back(ad7949_adc) ? 4 : 2;
+
+ spi_message_init_with_transfers(&msg, &tx, 1);
+ ret = spi_sync(ad7949_adc->spi, &msg);
+
+ /*
+ * This delay is to avoid a new request before the required time
+ * to send a new command to the device.
+ */
+ udelay(2);
}
return ret;
@@ -247,7 +266,6 @@ static int ad7949_spi_reg_access(struct iio_dev *indio_dev,
static int ad7949_spi_init(struct ad7949_adc_chip *ad7949_adc)
{
int ret;
- int val;
u16 adc_config = 0;
ad7949_adc->current_channel = 0;
@@ -261,13 +279,6 @@ static int ad7949_spi_init(struct ad7949_adc_chip *ad7949_adc)
ret = ad7949_spi_write_cfg(ad7949_adc, adc_config, AD7949_MASK_TOTAL);
- /*
- * Do two dummy conversions to apply the first configuration setting.
- * Required only after the start up of the device.
- */
- ad7949_spi_read_channel(ad7949_adc, &val, ad7949_adc->current_channel);
- ad7949_spi_read_channel(ad7949_adc, &val, ad7949_adc->current_channel);
-
return ret;
}
The AD7949 requires two conversion cycles following any configuration change (including changing the analog channel being sampled). Therefore, adding a dummy read cycle when config is changed and removing the extra cycles at initial configuration. Signed-off-by: Adam Michaelis <adam.michaelis@rockwellcollins.com> --- drivers/iio/adc/ad7949.c | 27 +++++++++++++++++++-------- 1 file changed, 19 insertions(+), 8 deletions(-)