mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-03 20:34:23 -04:00
iio: adc: ad7124: reduce the number of SPI transfers
The ad7124_init_config_vref() function writes the AD7124_ADC_CONTROL register for each channel that is configured to use the internal reference. The ad7124_write_config()function performs 7 SPI transfers for configuring 2 registers: config_x and filter_x. Reduce the number of SPI transfers: -during the probe by only setting the st->adc_control value in ad7124_init_config_vref() and writing to the device only at the end of ad7124_setup(). -in ad7124_write_config() by grouping writes to the same register. Signed-off-by: Dumitru Ceclan <dumitru.ceclan@analog.com> Reviewed-by: Nuno Sa <nuno.sa@analog.com> Link: https://patch.msgid.link/20240731-ad7124-fix-v1-3-46a76aa4b9be@analog.com Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
This commit is contained in:
committed by
Jonathan Cameron
parent
13fad2607d
commit
b7eef979b7
@@ -378,8 +378,7 @@ static int ad7124_init_config_vref(struct ad7124_state *st, struct ad7124_channe
|
||||
cfg->vref_mv = 2500;
|
||||
st->adc_control &= ~AD7124_ADC_CTRL_REF_EN_MSK;
|
||||
st->adc_control |= AD7124_ADC_CTRL_REF_EN(1);
|
||||
return ad_sd_write_reg(&st->sd, AD7124_ADC_CONTROL,
|
||||
2, st->adc_control);
|
||||
return 0;
|
||||
default:
|
||||
dev_err(&st->sd.spi->dev, "Invalid reference %d\n", refsel);
|
||||
return -EINVAL;
|
||||
@@ -397,24 +396,17 @@ static int ad7124_write_config(struct ad7124_state *st, struct ad7124_channel_co
|
||||
|
||||
tmp = (cfg->buf_positive << 1) + cfg->buf_negative;
|
||||
val = AD7124_CONFIG_BIPOLAR(cfg->bipolar) | AD7124_CONFIG_REF_SEL(cfg->refsel) |
|
||||
AD7124_CONFIG_IN_BUFF(tmp);
|
||||
AD7124_CONFIG_IN_BUFF(tmp) | AD7124_CONFIG_PGA(cfg->pga_bits);
|
||||
|
||||
ret = ad_sd_write_reg(&st->sd, AD7124_CONFIG(cfg->cfg_slot), 2, val);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
tmp = AD7124_FILTER_TYPE_SEL(cfg->filter_type);
|
||||
ret = ad7124_spi_write_mask(st, AD7124_FILTER(cfg->cfg_slot), AD7124_FILTER_TYPE_MSK,
|
||||
tmp, 3);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
ret = ad7124_spi_write_mask(st, AD7124_FILTER(cfg->cfg_slot), AD7124_FILTER_FS_MSK,
|
||||
AD7124_FILTER_FS(cfg->odr_sel_bits), 3);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
return ad7124_spi_write_mask(st, AD7124_CONFIG(cfg->cfg_slot), AD7124_CONFIG_PGA_MSK,
|
||||
AD7124_CONFIG_PGA(cfg->pga_bits), 2);
|
||||
tmp = AD7124_FILTER_TYPE_SEL(cfg->filter_type) |
|
||||
AD7124_FILTER_FS(cfg->odr_sel_bits);
|
||||
return ad7124_spi_write_mask(st, AD7124_FILTER(cfg->cfg_slot),
|
||||
AD7124_FILTER_TYPE_MSK | AD7124_FILTER_FS_MSK,
|
||||
tmp, 3);
|
||||
}
|
||||
|
||||
static struct ad7124_channel_config *ad7124_pop_config(struct ad7124_state *st)
|
||||
@@ -903,9 +895,6 @@ static int ad7124_setup(struct ad7124_state *st)
|
||||
/* Set the power mode */
|
||||
st->adc_control &= ~AD7124_ADC_CTRL_PWR_MSK;
|
||||
st->adc_control |= AD7124_ADC_CTRL_PWR(power_mode);
|
||||
ret = ad_sd_write_reg(&st->sd, AD7124_ADC_CONTROL, 2, st->adc_control);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
mutex_init(&st->cfgs_lock);
|
||||
INIT_KFIFO(st->live_cfgs_fifo);
|
||||
@@ -923,6 +912,10 @@ static int ad7124_setup(struct ad7124_state *st)
|
||||
ad7124_set_channel_odr(st, i, 10);
|
||||
}
|
||||
|
||||
ret = ad_sd_write_reg(&st->sd, AD7124_ADC_CONTROL, 2, st->adc_control);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user