iio: imu: inv_icm42670: get pts and read data in the same interrupt

Change-Id: I5742e31acf6d2c2c73c0b1e802ae38ba6a9fb31e
Signed-off-by: LiuDiMing Lin <fenrir.lin@rock-chips.com>
This commit is contained in:
LiuDiMing Lin
2025-01-14 10:47:46 +08:00
committed by Fenrir Lin
parent a752728b0f
commit 6661c2e73f
3 changed files with 36 additions and 7 deletions

View File

@@ -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;

View File

@@ -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);

View File

@@ -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;