Skip to content

Commit

Permalink
iio: adis16400: Compute the scan mask from channel indices
Browse files Browse the repository at this point in the history
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: Paul Cercueil <[email protected]>
Signed-off-by: Lars-Peter Clausen <[email protected]>
Fixes: 5eda355 ("staging:iio:adis16400: Preallocate transfer message")
Cc: <[email protected]>
Signed-off-by: Jonathan Cameron <[email protected]>
  • Loading branch information
Paul Cercueil authored and jic23 committed May 16, 2015
1 parent 7323d59 commit c2a8b62
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 7 deletions.
1 change: 1 addition & 0 deletions drivers/iio/imu/adis16400.h
Original file line number Diff line number Diff line change
Expand Up @@ -165,6 +165,7 @@ struct adis16400_state {
int filt_int;

struct adis adis;
unsigned long avail_scan_mask[2];
};

/* At the moment triggers are only used for ring buffer
Expand Down
25 changes: 18 additions & 7 deletions drivers/iio/imu/adis16400_core.c
Original file line number Diff line number Diff line change
Expand Up @@ -796,11 +796,6 @@ static const struct iio_info adis16400_info = {
.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[] = {
[ADIS16400_DIAG_STAT_ZACCL_FAIL] = "Z-axis accelerometer self-test failure",
[ADIS16400_DIAG_STAT_YACCL_FAIL] = "Y-axis accelerometer self-test failure",
Expand Down Expand Up @@ -848,6 +843,20 @@ static const struct adis_data adis16400_data = {
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)
{
struct adis16400_state *st;
Expand All @@ -871,8 +880,10 @@ static int adis16400_probe(struct spi_device *spi)
indio_dev->info = &adis16400_info;
indio_dev->modes = INDIO_DIRECT_MODE;

if (!(st->variant->flags & ADIS16400_NO_BURST))
indio_dev->available_scan_masks = adis16400_burst_scan_mask;
if (!(st->variant->flags & ADIS16400_NO_BURST)) {
adis16400_setup_chan_mask(st);
indio_dev->available_scan_masks = st->avail_scan_mask;
}

ret = adis_init(&st->adis, indio_dev, spi, &adis16400_data);
if (ret)
Expand Down

0 comments on commit c2a8b62

Please sign in to comment.