diff options
| author | Lars-Peter Clausen <lars@metafoo.de> | 2015-05-15 11:18:38 -0400 |
|---|---|---|
| committer | Jonathan Cameron <jic23@kernel.org> | 2015-05-16 06:01:20 -0400 |
| commit | d046ba268adb87c7780494ecf897cbafbf100d57 (patch) | |
| tree | 5da67104077407d418a7d921b96c34767b8fb724 | |
| parent | 9df560350c90f3d3909fe653399b3584c9a17b61 (diff) | |
iio: adis16400: Fix burst transfer for adis16448
The adis16448, unlike the other chips in this family, in addition to the
hardware channels also sends out the DIAG_STAT register in burst mode
before them. Handle that case by skipping over the first 2 bytes before we
pass the received data to the buffer.
Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>
Fixes: 76ada52f7f5d ("iio:adis16400: Add support for the adis16448")
Cc: <stable@vger.kernel.org>
Signed-off-by: Jonathan Cameron <jic23@kernel.org>
| -rw-r--r-- | drivers/iio/imu/adis16400.h | 1 | ||||
| -rw-r--r-- | drivers/iio/imu/adis16400_buffer.c | 10 | ||||
| -rw-r--r-- | drivers/iio/imu/adis16400_core.c | 3 |
3 files changed, 12 insertions, 2 deletions
diff --git a/drivers/iio/imu/adis16400.h b/drivers/iio/imu/adis16400.h index 1e8fd2e81d45..73b189c1c0fb 100644 --- a/drivers/iio/imu/adis16400.h +++ b/drivers/iio/imu/adis16400.h | |||
| @@ -139,6 +139,7 @@ | |||
| 139 | #define ADIS16400_NO_BURST BIT(1) | 139 | #define ADIS16400_NO_BURST BIT(1) |
| 140 | #define ADIS16400_HAS_SLOW_MODE BIT(2) | 140 | #define ADIS16400_HAS_SLOW_MODE BIT(2) |
| 141 | #define ADIS16400_HAS_SERIAL_NUMBER BIT(3) | 141 | #define ADIS16400_HAS_SERIAL_NUMBER BIT(3) |
| 142 | #define ADIS16400_BURST_DIAG_STAT BIT(4) | ||
| 142 | 143 | ||
| 143 | struct adis16400_state; | 144 | struct adis16400_state; |
| 144 | 145 | ||
diff --git a/drivers/iio/imu/adis16400_buffer.c b/drivers/iio/imu/adis16400_buffer.c index 629ae84d4e62..90c24a23c679 100644 --- a/drivers/iio/imu/adis16400_buffer.c +++ b/drivers/iio/imu/adis16400_buffer.c | |||
| @@ -29,6 +29,8 @@ int adis16400_update_scan_mode(struct iio_dev *indio_dev, | |||
| 29 | 29 | ||
| 30 | /* All but the timestamp channel */ | 30 | /* All but the timestamp channel */ |
| 31 | burst_length = (indio_dev->num_channels - 1) * sizeof(u16); | 31 | burst_length = (indio_dev->num_channels - 1) * sizeof(u16); |
| 32 | if (st->variant->flags & ADIS16400_BURST_DIAG_STAT) | ||
| 33 | burst_length += sizeof(u16); | ||
| 32 | 34 | ||
| 33 | adis->xfer = kcalloc(2, sizeof(*adis->xfer), GFP_KERNEL); | 35 | adis->xfer = kcalloc(2, sizeof(*adis->xfer), GFP_KERNEL); |
| 34 | if (!adis->xfer) | 36 | if (!adis->xfer) |
| @@ -63,6 +65,7 @@ irqreturn_t adis16400_trigger_handler(int irq, void *p) | |||
| 63 | struct adis16400_state *st = iio_priv(indio_dev); | 65 | struct adis16400_state *st = iio_priv(indio_dev); |
| 64 | struct adis *adis = &st->adis; | 66 | struct adis *adis = &st->adis; |
| 65 | u32 old_speed_hz = st->adis.spi->max_speed_hz; | 67 | u32 old_speed_hz = st->adis.spi->max_speed_hz; |
| 68 | void *buffer; | ||
| 66 | int ret; | 69 | int ret; |
| 67 | 70 | ||
| 68 | if (!adis->buffer) | 71 | if (!adis->buffer) |
| @@ -83,7 +86,12 @@ irqreturn_t adis16400_trigger_handler(int irq, void *p) | |||
| 83 | spi_setup(st->adis.spi); | 86 | spi_setup(st->adis.spi); |
| 84 | } | 87 | } |
| 85 | 88 | ||
| 86 | iio_push_to_buffers_with_timestamp(indio_dev, adis->buffer, | 89 | if (st->variant->flags & ADIS16400_BURST_DIAG_STAT) |
| 90 | buffer = adis->buffer + sizeof(u16); | ||
| 91 | else | ||
| 92 | buffer = adis->buffer; | ||
| 93 | |||
| 94 | iio_push_to_buffers_with_timestamp(indio_dev, buffer, | ||
| 87 | pf->timestamp); | 95 | pf->timestamp); |
| 88 | 96 | ||
| 89 | iio_trigger_notify_done(indio_dev->trig); | 97 | iio_trigger_notify_done(indio_dev->trig); |
diff --git a/drivers/iio/imu/adis16400_core.c b/drivers/iio/imu/adis16400_core.c index 7b06e058b000..2fd68f2219a7 100644 --- a/drivers/iio/imu/adis16400_core.c +++ b/drivers/iio/imu/adis16400_core.c | |||
| @@ -778,7 +778,8 @@ static struct adis16400_chip_info adis16400_chips[] = { | |||
| 778 | .channels = adis16448_channels, | 778 | .channels = adis16448_channels, |
| 779 | .num_channels = ARRAY_SIZE(adis16448_channels), | 779 | .num_channels = ARRAY_SIZE(adis16448_channels), |
| 780 | .flags = ADIS16400_HAS_PROD_ID | | 780 | .flags = ADIS16400_HAS_PROD_ID | |
| 781 | ADIS16400_HAS_SERIAL_NUMBER, | 781 | ADIS16400_HAS_SERIAL_NUMBER | |
| 782 | ADIS16400_BURST_DIAG_STAT, | ||
| 782 | .gyro_scale_micro = IIO_DEGREE_TO_RAD(10000), /* 0.01 deg/s */ | 783 | .gyro_scale_micro = IIO_DEGREE_TO_RAD(10000), /* 0.01 deg/s */ |
| 783 | .accel_scale_micro = IIO_G_TO_M_S_2(833), /* 1/1200 g */ | 784 | .accel_scale_micro = IIO_G_TO_M_S_2(833), /* 1/1200 g */ |
| 784 | .temp_scale_nano = 73860000, /* 0.07386 C */ | 785 | .temp_scale_nano = 73860000, /* 0.07386 C */ |
