On Sun, May 7, 2017 at 5:21 AM, Jonathan Cameron <jic23@xxxxxxxxxx> wrote: > On 05/05/17 01:32, Matt Ranostay wrote: >> Using iio_trigger_poll() can oops when multiple interrupts >> happen before the first is handled. >> > Ah. I see. This should cause all sorts of trouble and warnings. > > It's calling the irq_chip infrastructure without going through the > dance necessary to make that happen from an irq context. > > This is indeed the simplest fix. Yeah only saw this because of a lightning storm last week (which never happens here :)). - Matt > > Jonathan >> Use iio_trigger_poll_chained() instead and use the timestamp >> when processed, since it will be in theory be 2 ms max latency. >> >> Fixes: 24ddb0e4bba4 ("iio: Add AS3935 lightning sensor support") >> Cc: stable@xxxxxxxxxxxxxxx >> Signed-off-by: Matt Ranostay <matt.ranostay@xxxxxxxxxxxx> >> --- >> drivers/iio/proximity/as3935.c | 4 ++-- >> 1 file changed, 2 insertions(+), 2 deletions(-) >> >> diff --git a/drivers/iio/proximity/as3935.c b/drivers/iio/proximity/as3935.c >> index ddf9bee89f77..d98d38227f26 100644 >> --- a/drivers/iio/proximity/as3935.c >> +++ b/drivers/iio/proximity/as3935.c >> @@ -215,7 +215,7 @@ static irqreturn_t as3935_trigger_handler(int irq, void *private) >> >> st->buffer[0] = val & AS3935_DATA_MASK; >> iio_push_to_buffers_with_timestamp(indio_dev, &st->buffer, >> - pf->timestamp); >> + iio_get_time_ns(indio_dev)); >> err_read: >> iio_trigger_notify_done(indio_dev->trig); >> >> @@ -244,7 +244,7 @@ static void as3935_event_work(struct work_struct *work) >> >> switch (val) { >> case AS3935_EVENT_INT: >> - iio_trigger_poll(st->trig); >> + iio_trigger_poll_chained(st->trig); >> break; >> case AS3935_NOISE_INT: >> dev_warn(&st->spi->dev, "noise level is too high\n"); >> >