|
@@ -19,20 +19,9 @@
|
|
|
#include <linux/jiffies.h>
|
|
|
#include <linux/irq.h>
|
|
|
#include <linux/interrupt.h>
|
|
|
-#include <linux/kfifo.h>
|
|
|
#include <linux/poll.h>
|
|
|
#include "inv_mpu_iio.h"
|
|
|
|
|
|
-static void inv_clear_kfifo(struct inv_mpu6050_state *st)
|
|
|
-{
|
|
|
- unsigned long flags;
|
|
|
-
|
|
|
- /* take the spin lock sem to avoid interrupt kick in */
|
|
|
- spin_lock_irqsave(&st->time_stamp_lock, flags);
|
|
|
- kfifo_reset(&st->timestamps);
|
|
|
- spin_unlock_irqrestore(&st->time_stamp_lock, flags);
|
|
|
-}
|
|
|
-
|
|
|
int inv_reset_fifo(struct iio_dev *indio_dev)
|
|
|
{
|
|
|
int result;
|
|
@@ -62,9 +51,6 @@ int inv_reset_fifo(struct iio_dev *indio_dev)
|
|
|
if (result)
|
|
|
goto reset_fifo_fail;
|
|
|
|
|
|
- /* clear timestamps fifo */
|
|
|
- inv_clear_kfifo(st);
|
|
|
-
|
|
|
/* enable interrupt */
|
|
|
if (st->chip_config.accl_fifo_enable ||
|
|
|
st->chip_config.gyro_fifo_enable) {
|
|
@@ -98,23 +84,6 @@ reset_fifo_fail:
|
|
|
return result;
|
|
|
}
|
|
|
|
|
|
-/**
|
|
|
- * inv_mpu6050_irq_handler() - Cache a timestamp at each data ready interrupt.
|
|
|
- */
|
|
|
-irqreturn_t inv_mpu6050_irq_handler(int irq, void *p)
|
|
|
-{
|
|
|
- struct iio_poll_func *pf = p;
|
|
|
- struct iio_dev *indio_dev = pf->indio_dev;
|
|
|
- struct inv_mpu6050_state *st = iio_priv(indio_dev);
|
|
|
- s64 timestamp;
|
|
|
-
|
|
|
- timestamp = iio_get_time_ns(indio_dev);
|
|
|
- kfifo_in_spinlocked(&st->timestamps, ×tamp, 1,
|
|
|
- &st->time_stamp_lock);
|
|
|
-
|
|
|
- return IRQ_WAKE_THREAD;
|
|
|
-}
|
|
|
-
|
|
|
/**
|
|
|
* inv_mpu6050_read_fifo() - Transfer data from hardware FIFO to KFIFO.
|
|
|
*/
|
|
@@ -127,7 +96,7 @@ irqreturn_t inv_mpu6050_read_fifo(int irq, void *p)
|
|
|
int result;
|
|
|
u8 data[INV_MPU6050_OUTPUT_DATA_SIZE];
|
|
|
u16 fifo_count;
|
|
|
- s64 timestamp;
|
|
|
+ s64 timestamp = pf->timestamp;
|
|
|
int int_status;
|
|
|
|
|
|
mutex_lock(&st->lock);
|
|
@@ -171,28 +140,17 @@ irqreturn_t inv_mpu6050_read_fifo(int irq, void *p)
|
|
|
goto flush_fifo;
|
|
|
if (fifo_count > INV_MPU6050_FIFO_THRESHOLD)
|
|
|
goto flush_fifo;
|
|
|
- /* Timestamp mismatch. */
|
|
|
- if (kfifo_len(&st->timestamps) >
|
|
|
- fifo_count / bytes_per_datum + INV_MPU6050_TIME_STAMP_TOR)
|
|
|
- goto flush_fifo;
|
|
|
do {
|
|
|
result = regmap_bulk_read(st->map, st->reg->fifo_r_w,
|
|
|
data, bytes_per_datum);
|
|
|
if (result)
|
|
|
goto flush_fifo;
|
|
|
-
|
|
|
- result = kfifo_out(&st->timestamps, ×tamp, 1);
|
|
|
- /* when there is no timestamp, put timestamp as 0 */
|
|
|
- if (result == 0)
|
|
|
- timestamp = 0;
|
|
|
-
|
|
|
/* skip first samples if needed */
|
|
|
if (st->skip_samples)
|
|
|
st->skip_samples--;
|
|
|
else
|
|
|
iio_push_to_buffers_with_timestamp(indio_dev, data,
|
|
|
timestamp);
|
|
|
-
|
|
|
fifo_count -= bytes_per_datum;
|
|
|
} while (fifo_count >= bytes_per_datum);
|
|
|
|