diff options
Diffstat (limited to 'drivers/iio/adc/ti-ads124s08.c')
-rw-r--r-- | drivers/iio/adc/ti-ads124s08.c | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/drivers/iio/adc/ti-ads124s08.c b/drivers/iio/adc/ti-ads124s08.c index 4b4fbe33930c..b4a128b19188 100644 --- a/drivers/iio/adc/ti-ads124s08.c +++ b/drivers/iio/adc/ti-ads124s08.c | |||
@@ -99,6 +99,14 @@ struct ads124s_private { | |||
99 | struct gpio_desc *reset_gpio; | 99 | struct gpio_desc *reset_gpio; |
100 | struct spi_device *spi; | 100 | struct spi_device *spi; |
101 | struct mutex lock; | 101 | struct mutex lock; |
102 | /* | ||
103 | * Used to correctly align data. | ||
104 | * Ensure timestamp is naturally aligned. | ||
105 | * Note that the full buffer length may not be needed if not | ||
106 | * all channels are enabled, as long as the alignment of the | ||
107 | * timestamp is maintained. | ||
108 | */ | ||
109 | u32 buffer[ADS124S08_MAX_CHANNELS + sizeof(s64)/sizeof(u32)] __aligned(8); | ||
102 | u8 data[5] ____cacheline_aligned; | 110 | u8 data[5] ____cacheline_aligned; |
103 | }; | 111 | }; |
104 | 112 | ||
@@ -269,7 +277,6 @@ static irqreturn_t ads124s_trigger_handler(int irq, void *p) | |||
269 | struct iio_poll_func *pf = p; | 277 | struct iio_poll_func *pf = p; |
270 | struct iio_dev *indio_dev = pf->indio_dev; | 278 | struct iio_dev *indio_dev = pf->indio_dev; |
271 | struct ads124s_private *priv = iio_priv(indio_dev); | 279 | struct ads124s_private *priv = iio_priv(indio_dev); |
272 | u32 buffer[ADS124S08_MAX_CHANNELS + sizeof(s64)/sizeof(u16)]; | ||
273 | int scan_index, j = 0; | 280 | int scan_index, j = 0; |
274 | int ret; | 281 | int ret; |
275 | 282 | ||
@@ -284,7 +291,7 @@ static irqreturn_t ads124s_trigger_handler(int irq, void *p) | |||
284 | if (ret) | 291 | if (ret) |
285 | dev_err(&priv->spi->dev, "Start ADC conversions failed\n"); | 292 | dev_err(&priv->spi->dev, "Start ADC conversions failed\n"); |
286 | 293 | ||
287 | buffer[j] = ads124s_read(indio_dev, scan_index); | 294 | priv->buffer[j] = ads124s_read(indio_dev, scan_index); |
288 | ret = ads124s_write_cmd(indio_dev, ADS124S08_STOP_CONV); | 295 | ret = ads124s_write_cmd(indio_dev, ADS124S08_STOP_CONV); |
289 | if (ret) | 296 | if (ret) |
290 | dev_err(&priv->spi->dev, "Stop ADC conversions failed\n"); | 297 | dev_err(&priv->spi->dev, "Stop ADC conversions failed\n"); |
@@ -292,7 +299,7 @@ static irqreturn_t ads124s_trigger_handler(int irq, void *p) | |||
292 | j++; | 299 | j++; |
293 | } | 300 | } |
294 | 301 | ||
295 | iio_push_to_buffers_with_timestamp(indio_dev, buffer, | 302 | iio_push_to_buffers_with_timestamp(indio_dev, priv->buffer, |
296 | pf->timestamp); | 303 | pf->timestamp); |
297 | 304 | ||
298 | iio_trigger_notify_done(indio_dev->trig); | 305 | iio_trigger_notify_done(indio_dev->trig); |