Commit c2a8b623 authored by Paul Cercueil's avatar Paul Cercueil Committed by Jonathan Cameron

iio: adis16400: Compute the scan mask from channel indices

We unfortunately can't use ~0UL for the scan mask to indicate that the
only valid scan mask is all channels selected. The IIO core needs the exact
mask to work correctly and not a super-set of it. So calculate the masked
based on the channels that are available for a particular device.
Signed-off-by: default avatarPaul Cercueil <paul.cercueil@analog.com>
Signed-off-by: default avatarLars-Peter Clausen <lars@metafoo.de>
Fixes: 5eda3550 ("staging:iio:adis16400: Preallocate transfer message")
Cc: <stable@vger.kernel.org>
Signed-off-by: default avatarJonathan Cameron <jic23@kernel.org>
parent 7323d598
...@@ -165,6 +165,7 @@ struct adis16400_state { ...@@ -165,6 +165,7 @@ struct adis16400_state {
int filt_int; int filt_int;
struct adis adis; struct adis adis;
unsigned long avail_scan_mask[2];
}; };
/* At the moment triggers are only used for ring buffer /* At the moment triggers are only used for ring buffer
......
...@@ -796,11 +796,6 @@ static const struct iio_info adis16400_info = { ...@@ -796,11 +796,6 @@ static const struct iio_info adis16400_info = {
.debugfs_reg_access = adis_debugfs_reg_access, .debugfs_reg_access = adis_debugfs_reg_access,
}; };
static const unsigned long adis16400_burst_scan_mask[] = {
~0UL,
0,
};
static const char * const adis16400_status_error_msgs[] = { static const char * const adis16400_status_error_msgs[] = {
[ADIS16400_DIAG_STAT_ZACCL_FAIL] = "Z-axis accelerometer self-test failure", [ADIS16400_DIAG_STAT_ZACCL_FAIL] = "Z-axis accelerometer self-test failure",
[ADIS16400_DIAG_STAT_YACCL_FAIL] = "Y-axis accelerometer self-test failure", [ADIS16400_DIAG_STAT_YACCL_FAIL] = "Y-axis accelerometer self-test failure",
...@@ -848,6 +843,20 @@ static const struct adis_data adis16400_data = { ...@@ -848,6 +843,20 @@ static const struct adis_data adis16400_data = {
BIT(ADIS16400_DIAG_STAT_POWER_LOW), BIT(ADIS16400_DIAG_STAT_POWER_LOW),
}; };
static void adis16400_setup_chan_mask(struct adis16400_state *st)
{
const struct adis16400_chip_info *chip_info = st->variant;
unsigned i;
for (i = 0; i < chip_info->num_channels; i++) {
const struct iio_chan_spec *ch = &chip_info->channels[i];
if (ch->scan_index >= 0 &&
ch->scan_index != ADIS16400_SCAN_TIMESTAMP)
st->avail_scan_mask[0] |= BIT(ch->scan_index);
}
}
static int adis16400_probe(struct spi_device *spi) static int adis16400_probe(struct spi_device *spi)
{ {
struct adis16400_state *st; struct adis16400_state *st;
...@@ -871,8 +880,10 @@ static int adis16400_probe(struct spi_device *spi) ...@@ -871,8 +880,10 @@ static int adis16400_probe(struct spi_device *spi)
indio_dev->info = &adis16400_info; indio_dev->info = &adis16400_info;
indio_dev->modes = INDIO_DIRECT_MODE; indio_dev->modes = INDIO_DIRECT_MODE;
if (!(st->variant->flags & ADIS16400_NO_BURST)) if (!(st->variant->flags & ADIS16400_NO_BURST)) {
indio_dev->available_scan_masks = adis16400_burst_scan_mask; adis16400_setup_chan_mask(st);
indio_dev->available_scan_masks = st->avail_scan_mask;
}
ret = adis_init(&st->adis, indio_dev, spi, &adis16400_data); ret = adis_init(&st->adis, indio_dev, spi, &adis16400_data);
if (ret) if (ret)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment