]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
iio: adc: ad_sigma_delta: Store information about reset sequence length
authorUwe Kleine-König <u.kleine-koenig@baylibre.com>
Fri, 6 Dec 2024 17:28:39 +0000 (18:28 +0100)
committerJonathan Cameron <Jonathan.Cameron@huawei.com>
Wed, 11 Dec 2024 19:20:48 +0000 (19:20 +0000)
The various chips can be reset using a sequence of SPI transfers with
MOSI = 1. The length of such a sequence varies from chip to chip. Store
that length in struct ad_sigma_delta_info and replace the respective
parameter to ad_sd_reset() with it.

Note the ad7192 used to pass 48 as length but the documentation
specifies 40 as the required length. Assuming the latter is right.
(Using a too long sequence doesn't hurt apart from using a longer spi
transfer than necessary, so this is no relevant fix.)

The motivation for storing this information is that this is useful to
clear a pending R̅D̅Y̅ signal in the next change.

Signed-off-by: Uwe Kleine-König <u.kleine-koenig@baylibre.com>
Link: https://patch.msgid.link/9750db62fce638bf140ff48172c23bff7f785e5b.1733504533.git.u.kleine-koenig@baylibre.com
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
drivers/iio/adc/ad7124.c
drivers/iio/adc/ad7173.c
drivers/iio/adc/ad7192.c
drivers/iio/adc/ad7791.c
drivers/iio/adc/ad7793.c
drivers/iio/adc/ad_sigma_delta.c
include/linux/iio/adc/ad_sigma_delta.h

index b7491198e33c3502b44ece0eefac6eb136d6fa9e..af74bea18a69ffad8bbf0652a7c8ee8bb9566472 100644 (file)
@@ -571,6 +571,7 @@ static const struct ad_sigma_delta_info ad7124_sigma_delta_info = {
        .data_reg = AD7124_DATA,
        .num_slots = 8,
        .irq_flags = IRQF_TRIGGER_FALLING,
+       .num_resetclks = 64,
 };
 
 static int ad7124_read_raw(struct iio_dev *indio_dev,
@@ -756,7 +757,7 @@ static int ad7124_soft_reset(struct ad7124_state *st)
        unsigned int readval, timeout;
        int ret;
 
-       ret = ad_sd_reset(&st->sd, 64);
+       ret = ad_sd_reset(&st->sd);
        if (ret < 0)
                return ret;
 
index c5ac4b7e7c2c64afbae98bf80911ccc5de4d093a..d48b5d98207eabbd45d54ec99d3902a9c7b56be0 100644 (file)
@@ -763,6 +763,7 @@ static struct ad_sigma_delta_info ad7173_sigma_delta_info = {
        .read_mask = BIT(6),
        .status_ch_mask = GENMASK(3, 0),
        .data_reg = AD7173_REG_DATA,
+       .num_resetclks = 64,
 };
 
 static int ad7173_setup(struct iio_dev *indio_dev)
index 1c87db0e04605042e9a824a3d9d88c3291974691..e96a5ae92375d8c46510bec8299162b147522ea7 100644 (file)
@@ -361,6 +361,7 @@ static const struct ad_sigma_delta_info ad7192_sigma_delta_info = {
        .status_ch_mask = GENMASK(3, 0),
        .num_slots = 4,
        .irq_flags = IRQF_TRIGGER_FALLING,
+       .num_resetclks = 40,
 };
 
 static const struct ad_sigma_delta_info ad7194_sigma_delta_info = {
@@ -373,6 +374,7 @@ static const struct ad_sigma_delta_info ad7194_sigma_delta_info = {
        .read_mask = BIT(6),
        .status_ch_mask = GENMASK(3, 0),
        .irq_flags = IRQF_TRIGGER_FALLING,
+       .num_resetclks = 40,
 };
 
 static const struct ad_sd_calib_data ad7192_calib_arr[8] = {
@@ -565,7 +567,7 @@ static int ad7192_setup(struct iio_dev *indio_dev, struct device *dev)
        int i, ret, id;
 
        /* reset the serial interface */
-       ret = ad_sd_reset(&st->sd, 48);
+       ret = ad_sd_reset(&st->sd);
        if (ret < 0)
                return ret;
        usleep_range(500, 1000); /* Wait for at least 500us */
index e1bf13fe2cd76d6ce4995c8baf2f0425df02f3e1..76118fe22db8f325997f5848a3ed13b0200d3a76 100644 (file)
@@ -254,6 +254,7 @@ static const struct ad_sigma_delta_info ad7791_sigma_delta_info = {
        .addr_shift = 4,
        .read_mask = BIT(3),
        .irq_flags = IRQF_TRIGGER_FALLING,
+       .num_resetclks = 32,
 };
 
 static int ad7791_read_raw(struct iio_dev *indio_dev,
index d55c71566707f327818bb75a812e4d309d683211..1b50d9643a63fbced45abd38567029db297e6f86 100644 (file)
@@ -206,6 +206,7 @@ static const struct ad_sigma_delta_info ad7793_sigma_delta_info = {
        .addr_shift = 3,
        .read_mask = BIT(6),
        .irq_flags = IRQF_TRIGGER_FALLING,
+       .num_resetclks = 32,
 };
 
 static const struct ad_sd_calib_data ad7793_calib_arr[6] = {
@@ -265,7 +266,7 @@ static int ad7793_setup(struct iio_dev *indio_dev,
                return ret;
 
        /* reset the serial interface */
-       ret = ad_sd_reset(&st->sd, 32);
+       ret = ad_sd_reset(&st->sd);
        if (ret < 0)
                goto out;
        usleep_range(500, 2000); /* Wait for at least 500us */
index 950baf4160da4c4d1cfe3632c2dd042c7e2a279c..c290d07ab1c57e5e34cf9e35cdcdc443e0c0832d 100644 (file)
@@ -178,13 +178,12 @@ EXPORT_SYMBOL_NS_GPL(ad_sd_read_reg, "IIO_AD_SIGMA_DELTA");
  * ad_sd_reset() - Reset the serial interface
  *
  * @sigma_delta: The sigma delta device
- * @reset_length: Number of SCLKs with DIN = 1
  *
  * Returns 0 on success, an error code otherwise.
  **/
-int ad_sd_reset(struct ad_sigma_delta *sigma_delta,
-       unsigned int reset_length)
+int ad_sd_reset(struct ad_sigma_delta *sigma_delta)
 {
+       unsigned int reset_length = sigma_delta->info->num_resetclks;
        uint8_t *buf;
        unsigned int size;
        int ret;
index 200130e4244df388a7a33491353f02126e57ef4c..417073c52380f60a1a45a4924f4f556b64832295 100644 (file)
@@ -54,6 +54,7 @@ struct iio_dev;
  * @irq_flags: flags for the interrupt used by the triggered buffer
  * @num_slots: Number of sequencer slots
  * @irq_line: IRQ for reading conversions. If 0, spi->irq will be used
+ * @num_resetclks: Number of SPI clk cycles with MOSI=1 to reset the chip.
  */
 struct ad_sigma_delta_info {
        int (*set_channel)(struct ad_sigma_delta *, unsigned int channel);
@@ -70,6 +71,7 @@ struct ad_sigma_delta_info {
        unsigned long irq_flags;
        unsigned int num_slots;
        int irq_line;
+       unsigned int num_resetclks;
 };
 
 /**
@@ -181,8 +183,7 @@ int ad_sd_write_reg(struct ad_sigma_delta *sigma_delta, unsigned int reg,
 int ad_sd_read_reg(struct ad_sigma_delta *sigma_delta, unsigned int reg,
        unsigned int size, unsigned int *val);
 
-int ad_sd_reset(struct ad_sigma_delta *sigma_delta,
-       unsigned int reset_length);
+int ad_sd_reset(struct ad_sigma_delta *sigma_delta);
 
 int ad_sigma_delta_single_conversion(struct iio_dev *indio_dev,
        const struct iio_chan_spec *chan, int *val);