iio: adis16480: fix devices that do not support sleep mode
authorNuno Sá <nuno.sa@analog.com>
Fri, 3 Sep 2021 14:14:23 +0000 (16:14 +0200)
committerJonathan Cameron <Jonathan.Cameron@huawei.com>
Sun, 26 Sep 2021 15:22:25 +0000 (16:22 +0100)
Not all devices supported by this driver support being put to sleep
mode. For those devices, when calling 'adis16480_stop_device()' on the
unbind path, we where actually writing in the SYNC_SCALE register.

Fixes: 80cbc848c4fa0 ("iio: imu: adis16480: Add support for ADIS16490")
Fixes: 82e7a1b250170 ("iio: imu: adis16480: Add support for ADIS1649x family of devices")
Signed-off-by: Nuno Sá <nuno.sa@analog.com>
Link: https://lore.kernel.org/r/20210903141423.517028-6-nuno.sa@analog.com
Cc: <Stable@vger.kernel.org>
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
drivers/iio/imu/adis16480.c

index a869a6e52a16bec9eca5e196bd6c2ccef85d8ed7..ed129321a14da1175bb29cfae062a90879056e2c 100644 (file)
@@ -144,6 +144,7 @@ struct adis16480_chip_info {
        unsigned int max_dec_rate;
        const unsigned int *filter_freqs;
        bool has_pps_clk_mode;
+       bool has_sleep_cnt;
        const struct adis_data adis_data;
 };
 
@@ -939,6 +940,7 @@ static const struct adis16480_chip_info adis16480_chip_info[] = {
                .temp_scale = 5650, /* 5.65 milli degree Celsius */
                .int_clk = 2460000,
                .max_dec_rate = 2048,
+               .has_sleep_cnt = true,
                .filter_freqs = adis16480_def_filter_freqs,
                .adis_data = ADIS16480_DATA(16375, &adis16485_timeouts, 0),
        },
@@ -952,6 +954,7 @@ static const struct adis16480_chip_info adis16480_chip_info[] = {
                .temp_scale = 5650, /* 5.65 milli degree Celsius */
                .int_clk = 2460000,
                .max_dec_rate = 2048,
+               .has_sleep_cnt = true,
                .filter_freqs = adis16480_def_filter_freqs,
                .adis_data = ADIS16480_DATA(16480, &adis16480_timeouts, 0),
        },
@@ -965,6 +968,7 @@ static const struct adis16480_chip_info adis16480_chip_info[] = {
                .temp_scale = 5650, /* 5.65 milli degree Celsius */
                .int_clk = 2460000,
                .max_dec_rate = 2048,
+               .has_sleep_cnt = true,
                .filter_freqs = adis16480_def_filter_freqs,
                .adis_data = ADIS16480_DATA(16485, &adis16485_timeouts, 0),
        },
@@ -978,6 +982,7 @@ static const struct adis16480_chip_info adis16480_chip_info[] = {
                .temp_scale = 5650, /* 5.65 milli degree Celsius */
                .int_clk = 2460000,
                .max_dec_rate = 2048,
+               .has_sleep_cnt = true,
                .filter_freqs = adis16480_def_filter_freqs,
                .adis_data = ADIS16480_DATA(16488, &adis16485_timeouts, 0),
        },
@@ -1425,9 +1430,12 @@ static int adis16480_probe(struct spi_device *spi)
        if (ret)
                return ret;
 
-       ret = devm_add_action_or_reset(&spi->dev, adis16480_stop, indio_dev);
-       if (ret)
-               return ret;
+       if (st->chip_info->has_sleep_cnt) {
+               ret = devm_add_action_or_reset(&spi->dev, adis16480_stop,
+                                              indio_dev);
+               if (ret)
+                       return ret;
+       }
 
        ret = adis16480_config_irq_pin(spi->dev.of_node, st);
        if (ret)