Message ID | 20210903141423.517028-6-nuno.sa@analog.com (mailing list archive) |
---|---|
State | Accepted |
Headers | show |
Series | Fixes and improvements to the ADIS lib/devices | expand |
On Fri, 3 Sep 2021 16:14:23 +0200 Nuno Sá <nuno.sa@analog.com> wrote: > 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> Applied to the fixes-togreg branch of iio.git and marked for stable. Thanks, Jonathan > --- > drivers/iio/imu/adis16480.c | 14 +++++++++++--- > 1 file changed, 11 insertions(+), 3 deletions(-) > > diff --git a/drivers/iio/imu/adis16480.c b/drivers/iio/imu/adis16480.c > index a869a6e52a16..ed129321a14d 100644 > --- a/drivers/iio/imu/adis16480.c > +++ b/drivers/iio/imu/adis16480.c > @@ -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)
diff --git a/drivers/iio/imu/adis16480.c b/drivers/iio/imu/adis16480.c index a869a6e52a16..ed129321a14d 100644 --- a/drivers/iio/imu/adis16480.c +++ b/drivers/iio/imu/adis16480.c @@ -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)
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> --- drivers/iio/imu/adis16480.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-)