mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-06 10:58:48 +09:00
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:
committed by
Fenrir Lin
parent
a752728b0f
commit
6661c2e73f
@@ -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;
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user