diff options
Diffstat (limited to 'drivers/iio/imu/adis16400_buffer.c')
-rw-r--r-- | drivers/iio/imu/adis16400_buffer.c | 26 |
1 files changed, 18 insertions, 8 deletions
diff --git a/drivers/iio/imu/adis16400_buffer.c b/drivers/iio/imu/adis16400_buffer.c index 6e727ffe5262..90c24a23c679 100644 --- a/drivers/iio/imu/adis16400_buffer.c +++ b/drivers/iio/imu/adis16400_buffer.c | |||
@@ -18,7 +18,8 @@ int adis16400_update_scan_mode(struct iio_dev *indio_dev, | |||
18 | { | 18 | { |
19 | struct adis16400_state *st = iio_priv(indio_dev); | 19 | struct adis16400_state *st = iio_priv(indio_dev); |
20 | struct adis *adis = &st->adis; | 20 | struct adis *adis = &st->adis; |
21 | uint16_t *tx; | 21 | unsigned int burst_length; |
22 | u8 *tx; | ||
22 | 23 | ||
23 | if (st->variant->flags & ADIS16400_NO_BURST) | 24 | if (st->variant->flags & ADIS16400_NO_BURST) |
24 | return adis_update_scan_mode(indio_dev, scan_mask); | 25 | return adis_update_scan_mode(indio_dev, scan_mask); |
@@ -26,26 +27,29 @@ int adis16400_update_scan_mode(struct iio_dev *indio_dev, | |||
26 | kfree(adis->xfer); | 27 | kfree(adis->xfer); |
27 | kfree(adis->buffer); | 28 | kfree(adis->buffer); |
28 | 29 | ||
30 | /* All but the timestamp channel */ | ||
31 | burst_length = (indio_dev->num_channels - 1) * sizeof(u16); | ||
32 | if (st->variant->flags & ADIS16400_BURST_DIAG_STAT) | ||
33 | burst_length += sizeof(u16); | ||
34 | |||
29 | adis->xfer = kcalloc(2, sizeof(*adis->xfer), GFP_KERNEL); | 35 | adis->xfer = kcalloc(2, sizeof(*adis->xfer), GFP_KERNEL); |
30 | if (!adis->xfer) | 36 | if (!adis->xfer) |
31 | return -ENOMEM; | 37 | return -ENOMEM; |
32 | 38 | ||
33 | adis->buffer = kzalloc(indio_dev->scan_bytes + sizeof(u16), | 39 | adis->buffer = kzalloc(burst_length + sizeof(u16), GFP_KERNEL); |
34 | GFP_KERNEL); | ||
35 | if (!adis->buffer) | 40 | if (!adis->buffer) |
36 | return -ENOMEM; | 41 | return -ENOMEM; |
37 | 42 | ||
38 | tx = adis->buffer + indio_dev->scan_bytes; | 43 | tx = adis->buffer + burst_length; |
39 | |||
40 | tx[0] = ADIS_READ_REG(ADIS16400_GLOB_CMD); | 44 | tx[0] = ADIS_READ_REG(ADIS16400_GLOB_CMD); |
41 | tx[1] = 0; | 45 | tx[1] = 0; |
42 | 46 | ||
43 | adis->xfer[0].tx_buf = tx; | 47 | adis->xfer[0].tx_buf = tx; |
44 | adis->xfer[0].bits_per_word = 8; | 48 | adis->xfer[0].bits_per_word = 8; |
45 | adis->xfer[0].len = 2; | 49 | adis->xfer[0].len = 2; |
46 | adis->xfer[1].tx_buf = tx; | 50 | adis->xfer[1].rx_buf = adis->buffer; |
47 | adis->xfer[1].bits_per_word = 8; | 51 | adis->xfer[1].bits_per_word = 8; |
48 | adis->xfer[1].len = indio_dev->scan_bytes; | 52 | adis->xfer[1].len = burst_length; |
49 | 53 | ||
50 | spi_message_init(&adis->msg); | 54 | spi_message_init(&adis->msg); |
51 | spi_message_add_tail(&adis->xfer[0], &adis->msg); | 55 | spi_message_add_tail(&adis->xfer[0], &adis->msg); |
@@ -61,6 +65,7 @@ irqreturn_t adis16400_trigger_handler(int irq, void *p) | |||
61 | struct adis16400_state *st = iio_priv(indio_dev); | 65 | struct adis16400_state *st = iio_priv(indio_dev); |
62 | struct adis *adis = &st->adis; | 66 | struct adis *adis = &st->adis; |
63 | u32 old_speed_hz = st->adis.spi->max_speed_hz; | 67 | u32 old_speed_hz = st->adis.spi->max_speed_hz; |
68 | void *buffer; | ||
64 | int ret; | 69 | int ret; |
65 | 70 | ||
66 | if (!adis->buffer) | 71 | if (!adis->buffer) |
@@ -81,7 +86,12 @@ irqreturn_t adis16400_trigger_handler(int irq, void *p) | |||
81 | spi_setup(st->adis.spi); | 86 | spi_setup(st->adis.spi); |
82 | } | 87 | } |
83 | 88 | ||
84 | 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, | ||
85 | pf->timestamp); | 95 | pf->timestamp); |
86 | 96 | ||
87 | iio_trigger_notify_done(indio_dev->trig); | 97 | iio_trigger_notify_done(indio_dev->trig); |