]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
iio: adc: ad7124: reduce the number of SPI transfers
authorDumitru Ceclan <mitrutzceclan@gmail.com>
Wed, 31 Jul 2024 12:37:24 +0000 (15:37 +0300)
committerJonathan Cameron <Jonathan.Cameron@huawei.com>
Sat, 3 Aug 2024 15:05:15 +0000 (16:05 +0100)
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>
drivers/iio/adc/ad7124.c

index 3beed78496c5b2f2922c3fec36f0533fd1e29658..05fdd5e7123dd8997a0a4df2b30652b8405f607f 100644 (file)
@@ -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);
-       ret = ad_sd_write_reg(&st->sd, AD7124_CONFIG(cfg->cfg_slot), 2, val);
-       if (ret < 0)
-               return ret;
+             AD7124_CONFIG_IN_BUFF(tmp) | AD7124_CONFIG_PGA(cfg->pga_bits);
 
-       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);
+       ret = ad_sd_write_reg(&st->sd, AD7124_CONFIG(cfg->cfg_slot), 2, val);
        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;
 }