diff --git a/drivers/iio/imu/inv_icm42670/inv_icm42670_core.c b/drivers/iio/imu/inv_icm42670/inv_icm42670_core.c index abb39f4a2396..17793dd32965 100644 --- a/drivers/iio/imu/inv_icm42670/inv_icm42670_core.c +++ b/drivers/iio/imu/inv_icm42670/inv_icm42670_core.c @@ -1013,6 +1013,11 @@ static int icm42670_chip_init(struct icm42670_data *data, icm42670_bus_setup bus return ret; } +static irqreturn_t icm42670_do_nothing(int irq, void *private) +{ + return IRQ_HANDLED; +} + int icm42670_core_probe(struct regmap *regmap, int irq, const char *name, int chip_type, icm42670_bus_setup bus_setup) @@ -1115,9 +1120,13 @@ int icm42670_core_probe(struct regmap *regmap, indio_dev->info = &icm42670_info; indio_dev->modes = INDIO_BUFFER_TRIGGERED; - ret = devm_iio_triggered_buffer_setup(dev, indio_dev, - iio_pollfunc_store_time, - data->enable_fifo ? icm42670_read_fifo : icm42670_read_data, NULL); + if (data->enable_fifo) { + ret = devm_iio_triggered_buffer_setup(dev, indio_dev, + iio_pollfunc_store_time, icm42670_read_fifo, NULL); + } else { + ret = devm_iio_triggered_buffer_setup(dev, indio_dev, + icm42670_do_nothing, NULL, NULL); + } if (ret < 0) goto uninit; diff --git a/drivers/iio/imu/inv_icm42670/inv_icm42670_ring.c b/drivers/iio/imu/inv_icm42670/inv_icm42670_ring.c index 14280b51a67e..8c9f2dd0d9a0 100644 --- a/drivers/iio/imu/inv_icm42670/inv_icm42670_ring.c +++ b/drivers/iio/imu/inv_icm42670/inv_icm42670_ring.c @@ -287,8 +287,7 @@ reset_fail: irqreturn_t icm42670_read_data(int irq, void *p) { - struct iio_poll_func *pf = p; - struct iio_dev *indio_dev = pf->indio_dev; + struct iio_dev *indio_dev = p; struct icm42670_data *st = iio_priv(indio_dev); const struct device *dev = regmap_get_device(st->regmap); int ret, int_drdy; @@ -319,7 +318,7 @@ irqreturn_t icm42670_read_data(int irq, void *p) goto read_fail; } - iio_push_to_buffers_with_timestamp(indio_dev, &(data[0]), pf->timestamp); + iio_push_to_buffers_with_timestamp(indio_dev, &(data[0]), st->data_timestamp); mutex_unlock(&st->lock); iio_trigger_notify_done(indio_dev->trig); diff --git a/drivers/iio/imu/inv_icm42670/inv_icm42670_trigger.c b/drivers/iio/imu/inv_icm42670/inv_icm42670_trigger.c index e1364454c891..d95f711a196d 100644 --- a/drivers/iio/imu/inv_icm42670/inv_icm42670_trigger.c +++ b/drivers/iio/imu/inv_icm42670/inv_icm42670_trigger.c @@ -102,6 +102,18 @@ static const struct iio_trigger_ops inv_mpu_trigger_ops = { .set_trigger_state = &inv_mpu_data_rdy_trigger_set_state, }; +static irqreturn_t iio_ext_irq(int irq, void *private) +{ + struct iio_dev *indio_dev = private; + struct icm42670_data *data = iio_priv(indio_dev); + ktime_t irq_pts = ktime_get(); + + data->data_timestamp = ktime_to_ns(irq_pts); + iio_trigger_generic_data_rdy_poll(irq, data->trig); + + return IRQ_WAKE_THREAD; +} + int icm42670_probe_trigger(struct iio_dev *indio_dev, int irq_type) { int ret; @@ -114,11 +126,20 @@ int icm42670_probe_trigger(struct iio_dev *indio_dev, int irq_type) if (!data->trig) return -ENOMEM; - ret = devm_request_irq(&indio_dev->dev, data->irq, + if (data->enable_fifo) { + ret = devm_request_irq(&indio_dev->dev, data->irq, &iio_trigger_generic_data_rdy_poll, irq_type, "inv_mpu", data->trig); + } else { + ret = devm_request_threaded_irq(&indio_dev->dev, data->irq, + &iio_ext_irq, + &icm42670_read_data, + IRQF_SHARED, + "inv_mpu", + indio_dev); + } if (ret) return ret;