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 /drivers/iio | |
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>
Diffstat (limited to 'drivers/iio')
-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 */ |