Message ID | 20190114035621.5252-6-martin@martingkelly.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | iio:bmi160: add drdy interrupt support | expand |
On Sun, 13 Jan 2019 19:56:21 -0800 Martin Kelly <martin@martingkelly.com> wrote: > From: Martin Kelly <martin@martingkelly.com> > > Currently, we snap the timestamp after reading from the buffer and > processing the event. When the IIO poll function is triggered by an > interrupt, we can get a slightly more accurate timestamp by snapping it > prior to reading the data, since the data was already generated prior to > entering the trigger handler. This is not going to make a huge difference, > but we might as well improve slightly. > > Signed-off-by: Martin Kelly <martin@martingkelly.com> Could do better by using the standard iio_pollfunc_store_time to grab the timestamp in the interrupt handler itself rather than in it's thread. There is some argument that we should only do that if we know it's 'our' trigger. If we are triggered by someone else, we might report a time before when the sample we then read was actually captured. Still most of the time people will use the devices own trigger, or be running slowly enough they won't care. Anyhow, if we are going to argue this makes any sense use the iio_pollfunc_store_time approach please. As you will probably guess, this isn't the first device with a dataready interrupt! :) Jonathan > --- > drivers/iio/imu/bmi160/bmi160_core.c | 4 ++-- > 1 file changed, 2 insertions(+), 2 deletions(-) > > diff --git a/drivers/iio/imu/bmi160/bmi160_core.c b/drivers/iio/imu/bmi160/bmi160_core.c > index e119965e64a3..4b4456af0971 100644 > --- a/drivers/iio/imu/bmi160/bmi160_core.c > +++ b/drivers/iio/imu/bmi160/bmi160_core.c > @@ -408,6 +408,7 @@ static irqreturn_t bmi160_trigger_handler(int irq, void *p) > { > struct iio_poll_func *pf = p; > struct iio_dev *indio_dev = pf->indio_dev; > + s64 ts = iio_get_time_ns(indio_dev); > struct bmi160_data *data = iio_priv(indio_dev); > __le16 buf[16]; > /* 3 sens x 3 axis x __le16 + 3 x __le16 pad + 4 x __le16 tstamp */ > @@ -423,8 +424,7 @@ static irqreturn_t bmi160_trigger_handler(int irq, void *p) > buf[j++] = sample; > } > > - iio_push_to_buffers_with_timestamp(indio_dev, buf, > - iio_get_time_ns(indio_dev)); > + iio_push_to_buffers_with_timestamp(indio_dev, buf, ts); > done: > iio_trigger_notify_done(indio_dev->trig); > return IRQ_HANDLED;
diff --git a/drivers/iio/imu/bmi160/bmi160_core.c b/drivers/iio/imu/bmi160/bmi160_core.c index e119965e64a3..4b4456af0971 100644 --- a/drivers/iio/imu/bmi160/bmi160_core.c +++ b/drivers/iio/imu/bmi160/bmi160_core.c @@ -408,6 +408,7 @@ static irqreturn_t bmi160_trigger_handler(int irq, void *p) { struct iio_poll_func *pf = p; struct iio_dev *indio_dev = pf->indio_dev; + s64 ts = iio_get_time_ns(indio_dev); struct bmi160_data *data = iio_priv(indio_dev); __le16 buf[16]; /* 3 sens x 3 axis x __le16 + 3 x __le16 pad + 4 x __le16 tstamp */ @@ -423,8 +424,7 @@ static irqreturn_t bmi160_trigger_handler(int irq, void *p) buf[j++] = sample; } - iio_push_to_buffers_with_timestamp(indio_dev, buf, - iio_get_time_ns(indio_dev)); + iio_push_to_buffers_with_timestamp(indio_dev, buf, ts); done: iio_trigger_notify_done(indio_dev->trig); return IRQ_HANDLED;