On 10/03/16 07:06, maitysanchayan@xxxxxxxxx wrote: > Hello Gregor, > > On 16-03-09 19:05:49, Gregor Boirie wrote: >> Adds a new per-device sysfs attribute "current_timestamp_clock" to allow >> userspace to select a particular POSIX clock for buffered samples and >> events timestamping. >> >> Following clocks, as listed in clock_gettime(2), are supported: >> CLOCK_REALTIME, CLOCK_MONOTONIC, CLOCK_MONOTONIC_RAW, >> CLOCK_REALTIME_COARSE, CLOCK_MONOTONIC_COARSE, CLOCK_BOOTTIME and >> CLOCK_TAI. >> >> Signed-off-by: Gregor Boirie <gregor.boirie@xxxxxxxxxx> Applied with the obvious updates to new drivers to the togreg branch of iio.git. Sorry this one took so long. I thought I'd applied it ages ago! Thanks, Jonathan >> --- >> Documentation/ABI/testing/sysfs-bus-iio | 7 + >> Documentation/DocBook/iio.tmpl | 2 +- >> drivers/iio/accel/bma180.c | 2 +- >> drivers/iio/accel/bmc150-accel-core.c | 4 +- >> drivers/iio/accel/kxcjk-1013.c | 2 +- >> drivers/iio/accel/mma7455_core.c | 3 +- >> drivers/iio/accel/mma8452.c | 4 +- >> drivers/iio/accel/mma9551.c | 2 +- >> drivers/iio/accel/mma9553.c | 2 +- >> drivers/iio/adc/ad7291.c | 2 +- >> drivers/iio/adc/ad7298.c | 2 +- >> drivers/iio/adc/ad7476.c | 2 +- >> drivers/iio/adc/ad7887.c | 2 +- >> drivers/iio/adc/ad7923.c | 2 +- >> drivers/iio/adc/ad799x.c | 4 +- >> drivers/iio/adc/cc10001_adc.c | 2 +- >> drivers/iio/adc/hi8435.c | 2 +- >> drivers/iio/adc/ina2xx-adc.c | 6 +- >> drivers/iio/adc/max1363.c | 5 +- >> drivers/iio/adc/ti-ads1015.c | 3 +- >> drivers/iio/adc/vf610_adc.c | 3 +- > > Thanks for implementing this. > > For what it's worth, I tested this on Colibri Vybrid VF61 for a while and > all seems to work fine. > > So with the testing for vf610_adc driver > > Acked-by: Sanchayan Maity <maitysanchayan@xxxxxxxxx> > > Regards, > Sanchayan. > >> drivers/iio/adc/xilinx-xadc-events.c | 4 +- >> drivers/iio/chemical/atlas-ph-sensor.c | 2 +- >> drivers/iio/dac/ad5421.c | 6 +- >> drivers/iio/dac/ad5504.c | 2 +- >> drivers/iio/dummy/iio_simple_dummy_buffer.c | 3 +- >> drivers/iio/dummy/iio_simple_dummy_events.c | 2 +- >> drivers/iio/gyro/bmg160_core.c | 30 ++-- >> drivers/iio/iio_core.h | 3 + >> drivers/iio/imu/inv_mpu6050/inv_mpu_ring.c | 2 +- >> drivers/iio/industrialio-core.c | 179 +++++++++++++++++++++- >> drivers/iio/industrialio-event.c | 19 ++- >> drivers/iio/industrialio-trigger.c | 2 +- >> drivers/iio/light/acpi-als.c | 2 +- >> drivers/iio/light/adjd_s311.c | 2 +- >> drivers/iio/light/apds9300.c | 2 +- >> drivers/iio/light/apds9960.c | 4 +- >> drivers/iio/light/cm36651.c | 2 +- >> drivers/iio/light/gp2ap020a00f.c | 8 +- >> drivers/iio/light/isl29125.c | 2 +- >> drivers/iio/light/lm3533-als.c | 2 +- >> drivers/iio/light/ltr501.c | 7 +- >> dr> drivers/iio/light/stk3310.c | 2 +- >> drivers/iio/light/tcs3414.c | 2 +- >> drivers/iio/light/tcs3472.c | 2 +- >> drivers/iio/light/tsl2563.c | 2 +- >> drivers/iio/light/us5182d.c | 2 +- >> drivers/iio/magnetometer/hmc5843_core.c | 2 +- >> drivers/iio/magnetometer/mag3110.c | 2 +- >> drivers/iio/pressure/mpl3115.c | 2 +- >> drivers/iio/pressure/ms5611_core.c | 3 +- >> drivers/iio/proximity/pulsedlight-lidar-lite-v2.c | 2 +- >> drivers/iio/proximity/sx9500.c | 4 +- >> drivers/staging/iio/accel/lis3l02dq_core.c | 2 +- >> drivers/staging/iio/accel/sca3000_core.c | 2 +- >> drivers/staging/iio/adc/ad7280a.c | 8 +- >> drivers/staging/iio/adc/ad7606_ring.c | 3 +- >> drivers/staging/iio/adc/ad7816.c | 3 +- >> drivers/staging/iio/addac/adt7316.c | 4 +- >> drivers/staging/iio/cdc/ad7150.c | 2 +- >> drivers/staging/iio/light/tsl2x7x_core.c | 2 +- >> include/linux/iio/iio.h | 22 ++- >> 63 files changed, 317 insertions(+), 108 deletions(-) >> >> diff --git a/Documentation/ABI/testing/sysfs-bus-iio b/Documentation/ABI/testing/sysfs-bus-iio >> index 3c66248..c374b21 100644 >> --- a/Documentation/ABI/testing/sysfs-bus-iio >> +++ b/Documentation/ABI/testing/sysfs-bus-iio >> @@ -32,6 +32,13 @@ Description: >> Description of the physical chip / device for device X. >> Typically a part number. >> >> +What: /sys/bus/iio/devices/iio:deviceX/timestamp_clock >> +KernelVersion: 4.5 >> +Contact: linux-iio@xxxxxxxxxxxxxxx >> +Description: >> + String identifying current posix clock used to timestamp >> + buffered samples and events for device X. >> + >> What: /sys/bus/iio/devices/iio:deviceX/sampling_frequency >> What: /sys/bus/iio/devices/iio:deviceX/buffer/sampling_frequency >> What: /sys/bus/iio/devices/triggerX/sampling_frequency >> diff --git a/Documentation/DocBook/iio.tmpl b/Documentation/DocBook/iio.tmpl >> index f525bf5..e2ab6a1 100644 >> --- a/Documentation/DocBook/iio.tmpl >> +++ b/Documentation/DocBook/iio.tmpl >> @@ -594,7 +594,7 @@ >> >> irqreturn_t sensor_iio_pollfunc(int irq, void *p) >> { >> - pf->timestamp = iio_get_time_ns(); >> + pf->timestamp = iio_get_time_ns((struct indio_dev *)p); >> return IRQ_WAKE_THREAD; >> } >> >> diff --git a/drivers/iio/accel/bma180.c b/drivers/iio/accel/bma180.c >> index f04b884..e3f88ba 100644 >> --- a/drivers/iio/accel/bma180.c >> +++ b/drivers/iio/accel/bma180.c >> @@ -654,7 +654,7 @@ static irqreturn_t bma180_trigger_handler(int irq, void *p) >> struct iio_poll_func *pf = p; >> struct iio_dev *indio_dev = pf->indio_dev; >> struct bma180_data *data = iio_priv(indio_dev); >> - int64_t time_ns = iio_get_time_ns(); >> + s64 time_ns = iio_get_time_ns(indio_dev); >> int bit, ret, i = 0; >> >> mutex_lock(&data->mutex); >> diff --git a/drivers/iio/accel/bmc150-accel-core.c b/drivers/iio/accel/bmc150-accel-core.c >> index c73331f7..0529461 100644 >> --- a/drivers/iio/accel/bmc150-accel-core.c >> +++ b/drivers/iio/accel/bmc150-accel-core.c >> @@ -892,7 +892,7 @@ static int __bmc150_accel_fifo_flush(struct iio_dev *indio_dev, >> */ >> if (!irq) { >> data->old_timestamp = data->timestamp; >> - data->timestamp = iio_get_time_ns(); >> + data->timestamp = iio_get_time_ns(indio_dev); >> } >> >> /* >> @@ -1295,7 +1295,7 @@ static irqreturn_t bmc150_accel_irq_handler(int irq, void *private) >> int i; >> >> data->old_timestamp = data->timestamp; >> - data->timestamp = iio_get_time_ns(); >> + data->timestamp = iio_get_time_ns(indio_dev); >> >> for (i = 0; i < BMC150_ACCEL_TRIGGERS; i++) { >> if (data->triggers[i].enabled) { >> diff --git a/drivers/iio/accel/kxcjk-1013.c b/drivers/iio/accel/kxcjk-1013.c >> index edec1d0..36539a2 100644 >> --- a/drivers/iio/accel/kxcjk-1013.c >> +++ b/drivers/iio/accel/kxcjk-1013.c >> @@ -1131,7 +1131,7 @@ static irqreturn_t kxcjk1013_data_rdy_trig_poll(int irq, void *private) >> struct iio_dev *indio_dev = private; >> struct kxcjk1013_data *data = iio_priv(indio_dev); >> >> - data->timestamp = iio_get_time_ns(); >> + data->timestamp = iio_get_time_ns(indio_dev); >> >> if (data->dready_trigger_on) >> iio_trigger_poll(data->dready_trig); >> diff --git a/drivers/iio/accel/mma7455_core.c b/drivers/iio/accel/mma7455_core.c >> index c633cc2..91e2c04 100644 >> --- a/drivers/iio/accel/mma7455_core.c >> +++ b/drivers/iio/accel/mma7455_core.c >> @@ -97,7 +97,8 @@ static irqreturn_t mma7455_trigger_handler(int irq, void *p) >> if (ret) >> goto done; >> >> - iio_push_to_buffers_with_timestamp(indio_dev, buf, iio_get_time_ns()); >> + iio_push_to_buffers_with_timestamp(indio_dev, buf, >> + iio_get_time_ns(indio_dev)); >> >> done: >> iio_trigger_notify_done(indio_dev->trig); >> diff --git a/drivers/iio/accel/mma8452.c b/drivers/iio/accel/mma8452.c >> index 5ca0d16..b9ca5ad 100644 >> --- a/drivers/iio/accel/mma8452.c >> +++ b/drivers/iio/accel/mma8452.c >> @@ -783,7 +783,7 @@ static int mma8452_write_event_config(struct iio_dev *indio_dev, >> static void mma8452_transient_interrupt(struct iio_dev *indio_dev) >> { >> struct mma8452_data *data = iio_priv(indio_dev); >> - s64 ts = iio_get_time_ns(); >> + s64 ts = iio_get_time_ns(indio_dev); >> int src; >> >> src = i2c_smbus_read_byte_data(data->client, data->chip_info->ev_src); >> @@ -863,7 +863,7 @@ static irqreturn_t mma8452_trigger_handler(int irq, void *p) >> goto done; >> >> iio_push_to_buffers_with_timestamp(indio_dev, buffer, >> - iio_get_time_ns()); >> + iio_get_time_ns(indio_dev)); >> >> done: >> iio_trigger_notify_done(indio_dev->trig); >> diff --git a/drivers/iio/accel/mma9551.c b/drivers/iio/accel/mma9551.c >> index d899a4d..bf27044 100644 >> --- a/drivers/iio/accel/mma9551.c >> +++ b/drivers/iio/accel/mma9551.c >> @@ -391,7 +391,7 @@ static irqreturn_t mma9551_event_handler(int irq, void *private) >> iio_push_event(indio_dev, >> IIO_MOD_EVENT_CODE(IIO_INCLI, 0, (mma_axis + 1), >> IIO_EV_TYPE_ROC, IIO_EV_DIR_RISING), >> - iio_get_time_ns()); >> + iio_get_time_ns(indio_dev)); >> >> out: >> mutex_unlock(&data->mutex); >> diff --git a/drivers/iio/accel/mma9553.c b/drivers/iio/accel/mma9553.c >> index fa7d362..55b4868 100644 >> --- a/drivers/iio/accel/mma9553.c >> +++ b/drivers/iio/accel/mma9553.c >> @@ -1002,7 +1002,7 @@ static irqreturn_t mma9553_irq_handler(int irq, void *private) >> struct iio_dev *indio_dev = private; >> struct mma9553_data *data = iio_priv(indio_dev); >> >> - data->timestamp = iio_get_time_ns(); >> + data->timestamp = iio_get_time_ns(indio_dev); >> /* >> * Since we only configure the interrupt pin when an >> * event is enabled, we are sure we have at least >> diff --git a/drivers/iio/adc/ad7291.c b/drivers/iio/adc/ad7291.c >> index c0eabf1..0376309 100644 >> --- a/drivers/iio/adc/ad7291.c >> +++ b/drivers/iio/adc/ad7291.c >> @@ -115,7 +115,7 @@ static irqreturn_t ad7291_event_handler(int irq, void *private) >> u16 t_status, v_status; >> u16 command; >> int i; >> - s64 timestamp = iio_get_time_ns(); >> + s64 timestamp = iio_get_time_ns(indio_dev); >> >> if (ad7291_i2c_read(chip, AD7291_T_ALERT_STATUS, &t_status)) >> return IRQ_HANDLED; >> diff --git a/drivers/iio/adc/ad7298.c b/drivers/iio/adc/ad7298.c >> index 62bb8f7..5dd0742 100644 >> --- a/drivers/iio/adc/ad7298.c >> +++ b/drivers/iio/adc/ad7298.c >> @@ -163,7 +163,7 @@ static irqreturn_t ad7298_trigger_handler(int irq, void *p) >> goto done; >> >> iio_push_to_buffers_with_timestamp(indio_dev, st->rx_buf, >> - iio_get_time_ns()); >> + iio_get_time_ns(indio_dev)); >> >> done: >> iio_trigger_notify_done(indio_dev->trig); >> diff --git a/drivers/iio/adc/ad7476.c b/drivers/iio/adc/ad7476.c >> index be85c2a..6a14985 100644 >> --- a/drivers/iio/adc/ad7476.c >> +++ b/drivers/iio/adc/ad7476.c >> @@ -70,7 +70,7 @@ static irqreturn_t ad7476_trigger_handler(int irq, void *p) >> goto done; >> >> iio_push_to_buffers_with_timestamp(indio_dev, st->data, >> - iio_get_time_ns()); >> + iio_get_time_ns(indio_dev)); >> done: >> iio_trigger_notify_done(indio_dev->trig); >> >> diff --git a/drivers/iio/adc/ad7887.c b/drivers/iio/adc/ad7887.c >> index 2d3c397..361fae0 100644 >> --- a/drivers/iio/adc/ad7887.c >> +++ b/drivers/iio/adc/ad7887.c >> @@ -122,7 +122,7 @@ static irqreturn_t ad7887_trigger_handler(int irq, void *p) >> goto done; >> >> iio_push_to_buffers_with_timestamp(indio_dev, st->data, >> - iio_get_time_ns()); >> + iio_get_time_ns(indio_dev)); >> done: >> iio_trigger_notify_done(indio_dev->trig); >> >> diff --git a/drivers/iio/adc/ad7923.c b/drivers/iio/adc/ad7923.c >> index 45e29cc..2a82b9e 100644 >> --- a/drivers/iio/adc/ad7923.c >> +++ b/drivers/iio/adc/ad7923.c >> @@ -181,7 +181,7 @@ static irqreturn_t ad7923_trigger_handler(int irq, void *p) >> goto done; >> >> iio_push_to_buffers_with_timestamp(indio_dev, st->rx_buf, >> - iio_get_time_ns()); >> + iio_get_time_ns(indio_dev)); >> >> done: >> iio_trigger_notify_done(indio_dev->trig); >> diff --git a/drivers/iio/adc/ad799x.c b/drivers/iio/adc/ad799x.c >> index 01d7158..ec9dccb 100644 >> --- a/drivers/iio/adc/ad799x.c >> +++ b/drivers/iio/adc/ad799x.c >> @@ -212,7 +212,7 @@ static irqreturn_t ad799x_trigger_handler(int irq, void *p) >> goto out; >> >> iio_push_to_buffers_with_timestamp(indio_dev, st->rx_buf, >> - iio_get_time_ns()); >> + iio_get_time_ns(indio_dev)); >> out: >> iio_trigger_notify_done(indio_dev->trig); >> >> @@ -508,7 +508,7 @@ static irqreturn_t ad799x_event_handler(int irq, void *private) >> (i >> 1), >> IIO_EV_TYPE_THRESH, >> IIO_EV_DIR_FALLING), >> - iio_get_time_ns()); >> + iio_get_time_ns(indio_dev)); >> } >> >> done: >> diff --git a/drivers/iio/adc/cc10001_adc.c b/drivers/iio/adc/cc10001_adc.c >> index 8254f52..91636c0 100644 >> --- a/drivers/iio/adc/cc10001_adc.c >> +++ b/drivers/iio/adc/cc10001_adc.c >> @@ -186,7 +186,7 @@ done: >> >> if (!sample_invalid) >> iio_push_to_buffers_with_timestamp(indio_dev, data, >> - iio_get_time_ns()); >> + iio_get_time_ns(indio_dev)); >> iio_trigger_notify_done(indio_dev->trig); >> >> return IRQ_HANDLED; >> diff --git a/drivers/iio/adc/hi8435.c b/drivers/iio/adc/hi8435.c >> index c73c6c6..c62bdb0 100644 >> --- a/drivers/iio/adc/hi8435.c >> +++ b/drivers/iio/adc/hi8435.c >> @@ -400,7 +400,7 @@ static void hi8435_iio_push_event(struct iio_dev *idev, unsigned int val) >> iio_push_event(idev, >> IIO_UNMOD_EVENT_CODE(IIO_VOLTAGE, i, >> IIO_EV_TYPE_THRESH, dir), >> - iio_get_time_ns()); >> + iio_get_time_ns(idev)); >> } >> } >> >> diff --git a/drivers/iio/adc/ina2xx-adc.c b/drivers/iio/adc/ina2xx-adc.c >> index 65909d5..ee1baf0 100644 >> --- a/drivers/iio/adc/ina2xx-adc.c >> +++ b/drivers/iio/adc/ina2xx-adc.c >> @@ -443,7 +443,7 @@ static int ina2xx_work_buffer(struct iio_dev *indio_dev) >> s64 time_a, time_b; >> unsigned int alert; >> >> - time_a = iio_get_time_ns(); >> + time_a = iio_get_time_ns(indio_dev); >> >> /* >> * Because the timer thread and the chip conversion clock >> @@ -482,7 +482,7 @@ static int ina2xx_work_buffer(struct iio_dev *indio_dev) >> data[i++] = val; >> } >> >> - time_b = iio_get_time_ns(); >> + time_b = iio_get_time_ns(indio_dev); >> >> iio_push_to_buffers_with_timestamp(indio_dev, >> (unsigned int *)data, time_a); >> @@ -532,7 +532,7 @@ static int ina2xx_buffer_enable(struct iio_dev *indio_dev) >> dev_dbg(&indio_dev->dev, "Async readout mode: %d\n", >> chip->allow_async_readout); >> >> - chip->prev_ns = iio_get_time_ns(); >> + chip->prev_ns = iio_get_time_ns(indio_dev); >> >> chip->task = kthread_run(ina2xx_capture_thread, (void *)indio_dev, >> "%s:%d-%uus", indio_dev->name, indio_dev->id, >> diff --git a/drivers/iio/adc/max1363.c b/drivers/iio/adc/max1363.c >> index 929508e..0a4682b 100644 >> --- a/drivers/iio/adc/max1363.c >> +++ b/drivers/iio/adc/max1363.c >> @@ -788,7 +788,7 @@ static irqreturn_t max1363_event_handler(int irq, void *private) >> { >> struct iio_dev *indio_dev = private; >> struct max1363_state *st = iio_priv(indio_dev); >> - s64 timestamp = iio_get_time_ns(); >> + s64 timestamp = iio_get_time_ns(indio_dev); >> unsigned long mask, loc; >> u8 rx; >> u8 tx[2] = { st->setupbyte, >> @@ -1506,7 +1506,8 @@ static irqreturn_t max1363_trigger_handler(int irq, void *p) >> if (b_sent < 0) >> goto done_free; >> >> - iio_push_to_buffers_with_timestamp(indio_dev, rxbuf, iio_get_time_ns()); >> + iio_push_to_buffers_with_timestamp(indio_dev, rxbuf, >> + iio_get_time_ns(indio_dev)); >> >> done_free: >> kfree(rxbuf); >> diff --git a/drivers/iio/adc/ti-ads1015.c b/drivers/iio/adc/ti-ads1015.c >> index 73cbf0b..b5f3eb9 100644 >> --- a/drivers/iio/adc/ti-ads1015.c >> +++ b/drivers/iio/adc/ti-ads1015.c >> @@ -225,7 +225,8 @@ static irqreturn_t ads1015_trigger_handler(int irq, void *p) >> buf[0] = res; >> mutex_unlock(&data->lock); >> >> - iio_push_to_buffers_with_timestamp(indio_dev, buf, iio_get_time_ns()); >> + iio_push_to_buffers_with_timestamp(indio_dev, buf, >> + iio_get_time_ns(indio_dev)); >> >> err: >> iio_trigger_notify_done(indio_dev->trig); >> diff --git a/drivers/iio/adc/vf610_adc.c b/drivers/iio/adc/vf610_adc.c >> index b10f629..33f80a9 100644 >> --- a/drivers/iio/adc/vf610_adc.c >> +++ b/drivers/iio/adc/vf610_adc.c >> @@ -594,7 +594,8 @@ static irqreturn_t vf610_adc_isr(int irq, void *dev_id) >> if (iio_buffer_enabled(indio_dev)) { >> info->buffer[0] = info->value; >> iio_push_to_buffers_with_timestamp(indio_dev, >> - info->buffer, iio_get_time_ns()); >> + info->buffer, >> + iio_get_time_ns(indio_dev)); >> iio_trigger_notify_done(indio_dev->trig); >> } else >> complete(&info->completion); >> diff --git a/drivers/iio/adc/xilinx-xadc-events.c b/drivers/iio/adc/xilinx-xadc-events.c >> index edcf3aa..6d5c2a6 100644 >> --- a/drivers/iio/adc/xilinx-xadc-events.c >> +++ b/drivers/iio/adc/xilinx-xadc-events.c >> @@ -46,7 +46,7 @@ static void xadc_handle_event(struct iio_dev *indio_dev, unsigned int event) >> iio_push_event(indio_dev, >> IIO_UNMOD_EVENT_CODE(chan->type, chan->channel, >> IIO_EV_TYPE_THRESH, IIO_EV_DIR_RISING), >> - iio_get_time_ns()); >> + iio_get_time_ns(indio_dev)); >> } else { >> /* >> * For other channels we don't know whether it is a upper or >> @@ -56,7 +56,7 @@ static void xadc_handle_event(struct iio_dev *indio_dev, unsigned int event) >> iio_push_event(indio_dev, >> IIO_UNMOD_EVENT_CODE(chan->type, chan->channel, >> IIO_EV_TYPE_THRESH, IIO_EV_DIR_EITHER), >> - iio_get_time_ns()); >> + iio_get_time_ns(indio_dev)); >> } >> } >> >> diff --git a/drivers/iio/chemical/atlas-ph-sensor.c b/drivers/iio/chemical/atlas-ph-sensor.c >> index 62b37cd..be37e24 100644 >> --- a/drivers/iio/chemical/atlas-ph-sensor.c >> +++ b/drivers/iio/chemical/atlas-ph-sensor.c >> @@ -183,7 +183,7 @@ static irqreturn_t atlas_trigger_handler(int irq, void *private) >> >> if (!ret) >> iio_push_to_buffers_with_timestamp(indio_dev, data->buffer, >> - iio_get_time_ns()); >> + iio_get_time_ns(indio_dev)); >> >> iio_trigger_notify_done(indio_dev->trig); >> >> diff --git a/drivers/iio/dac/ad5421.c b/drivers/iio/dac/ad5421.c >> index 968712b..559061a 100644 >> --- a/drivers/iio/dac/ad5421.c >> +++ b/drivers/iio/dac/ad5421.c >> @@ -242,7 +242,7 @@ static irqreturn_t ad5421_fault_handler(int irq, void *data) >> 0, >> IIO_EV_TYPE_THRESH, >> IIO_EV_DIR_RISING), >> - iio_get_time_ns()); >> + iio_get_time_ns(indio_dev)); >> } >> >> if (events & AD5421_FAULT_UNDER_CURRENT) { >> @@ -251,7 +251,7 @@ static irqreturn_t ad5421_fault_handler(int irq, void *data) >> 0, >> IIO_EV_TYPE_THRESH, >> IIO_EV_DIR_FALLING), >> - iio_get_time_ns()); >> + iio_get_time_ns(indio_dev)); >> } >> >> if (events & AD5421_FAULT_TEMP_OVER_140) { >> @@ -260,7 +260,7 @@ static irqreturn_t ad5421_fault_handler(int irq, void *data) >> 0, >> IIO_EV_TYPE_MAG, >> IIO_EV_DIR_RISING), >> - iio_get_time_ns()); >> + iio_get_time_ns(indio_dev)); >> } >> >> old_fault = fault; >> diff --git a/drivers/iio/dac/ad5504.c b/drivers/iio/dac/ad5504.c >> index 4e4c20d..788b3d6 100644 >> --- a/drivers/iio/dac/ad5504.c >> +++ b/drivers/iio/dac/ad5504.c >> @@ -223,7 +223,7 @@ static irqreturn_t ad5504_event_handler(int irq, void *private) >> 0, >> IIO_EV_TYPE_THRESH, >> IIO_EV_DIR_RISING), >> - iio_get_time_ns()); >> + iio_get_time_ns((struct iio_dev *)private)); >> >> return IRQ_HANDLED; >> } >> diff --git a/drivers/iio/dummy/iio_simple_dummy_buffer.c b/drivers/iio/dummy/iio_simple_dummy_buffer.c >> index cf44a6f..b383892 100644 >> --- a/drivers/iio/dummy/iio_simple_dummy_buffer.c >> +++ b/drivers/iio/dummy/iio_simple_dummy_buffer.c >> @@ -85,7 +85,8 @@ static irqreturn_t iio_simple_dummy_trigger_h(int irq, void *p) >> } >> } >> >> - iio_push_to_buffers_with_timestamp(indio_dev, data, iio_get_time_ns()); >> + iio_push_to_buffers_with_timestamp(indio_dev, data, >> + iio_get_time_ns(indio_dev)); >> >> kfree(data); >> >> diff --git a/drivers/iio/dummy/iio_simple_dummy_events.c b/drivers/iio/dummy/iio_simple_dummy_events.c >> index 6eb600f..ed63ffd 100644 >> --- a/drivers/iio/dummy/iio_simple_dummy_events.c >> +++ b/drivers/iio/dummy/iio_simple_dummy_events.c >> @@ -158,7 +158,7 @@ static irqreturn_t iio_simple_dummy_get_timestamp(int irq, void *private) >> struct iio_dev *indio_dev = private; >> struct iio_dummy_state *st = iio_priv(indio_dev); >> >> - st->event_timestamp = iio_get_time_ns(); >> + st->event_timestamp = iio_get_time_ns(indio_dev); >> return IRQ_WAKE_THREAD; >> } >> >> diff --git a/drivers/iio/gyro/bmg160_core.c b/drivers/iio/gyro/bmg160_core.c >> index bbce3b0..4cefcc0 100644 >> --- a/drivers/iio/gyro/bmg160_core.c >> +++ b/drivers/iio/gyro/bmg160_core.c >> @@ -884,25 +884,25 @@ static irqreturn_t bmg160_event_handler(int irq, void *private) >> >> if (val & BMG160_ANY_MOTION_BIT_X) >> iio_push_event(indio_dev, IIO_MOD_EVENT_CODE(IIO_ANGL_VEL, >> - 0, >> - IIO_MOD_X, >> - IIO_EV_TYPE_ROC, >> - dir), >> - iio_get_time_ns()); >> + 0, >> + IIO_MOD_X, >> + IIO_EV_TYPE_ROC, >> + dir), >> + iio_get_time_ns(indio_dev)); >> if (val & BMG160_ANY_MOTION_BIT_Y) >> iio_push_event(indio_dev, IIO_MOD_EVENT_CODE(IIO_ANGL_VEL, >> - 0, >> - IIO_MOD_Y, >> - IIO_EV_TYPE_ROC, >> - dir), >> - iio_get_time_ns()); >> + 0, >> + IIO_MOD_Y, >> + IIO_EV_TYPE_ROC, >> + dir), >> + iio_get_time_ns(indio_dev)); >> if (val & BMG160_ANY_MOTION_BIT_Z) >> iio_push_event(indio_dev, IIO_MOD_EVENT_CODE(IIO_ANGL_VEL, >> - 0, >> - IIO_MOD_Z, >> - IIO_EV_TYPE_ROC, >> - dir), >> - iio_get_time_ns()); >> + 0, >> + IIO_MOD_Z, >> + IIO_EV_TYPE_ROC, >> + dir), >> + iio_get_time_ns(indio_dev)); >> >> ack_intr_status: >> if (!data->dready_trigger_on) { >> diff --git a/drivers/iio/iio_core.h b/drivers/iio/iio_core.h >> index 3598835..4c45488 100644 >> --- a/drivers/iio/iio_core.h >> +++ b/drivers/iio/iio_core.h >> @@ -79,4 +79,7 @@ void iio_device_unregister_eventset(struct iio_dev *indio_dev); >> void iio_device_wakeup_eventset(struct iio_dev *indio_dev); >> int iio_event_getfd(struct iio_dev *indio_dev); >> >> +struct iio_event_interface; >> +bool iio_event_enabled(const struct iio_event_interface *ev_int); >> + >> #endif >> diff --git a/drivers/iio/imu/inv_mpu6050/inv_mpu_ring.c b/drivers/iio/imu/inv_mpu6050/inv_mpu_ring.c >> index d070062..3a9f3ea 100644 >> --- a/drivers/iio/imu/inv_mpu6050/inv_mpu_ring.c >> +++ b/drivers/iio/imu/inv_mpu6050/inv_mpu_ring.c >> @@ -107,7 +107,7 @@ irqreturn_t inv_mpu6050_irq_handler(int irq, void *p) >> struct inv_mpu6050_state *st = iio_priv(indio_dev); >> s64 timestamp; >> >> - timestamp = iio_get_time_ns(); >> + timestamp = iio_get_time_ns(indio_dev); >> kfifo_in_spinlocked(&st->timestamps, ×tamp, 1, >> &st->time_stamp_lock); >> >> diff --git a/drivers/iio/industrialio-core.c b/drivers/iio/industrialio-core.c >> index 70cb7eb..dbaf56b 100644 >> --- a/drivers/iio/industrialio-core.c >> +++ b/drivers/iio/industrialio-core.c >> @@ -174,6 +174,86 @@ ssize_t iio_read_const_attr(struct device *dev, >> } >> EXPORT_SYMBOL(iio_read_const_attr); >> >> +static int iio_device_set_clock(struct iio_dev *indio_dev, clockid_t clock_id) >> +{ >> + int ret; >> + const struct iio_event_interface *ev_int = indio_dev->event_interface; >> + >> + ret = mutex_lock_interruptible(&indio_dev->mlock); >> + if (ret) >> + return ret; >> + if ((ev_int && iio_event_enabled(ev_int)) || >> + iio_buffer_enabled(indio_dev)) { >> + mutex_unlock(&indio_dev->mlock); >> + return -EBUSY; >> + } >> + indio_dev->clock_id = clock_id; >> + mutex_unlock(&indio_dev->mlock); >> + >> + return 0; >> +} >> + >> +/** >> + * iio_get_time_ns() - utility function to get a time stamp for events etc >> + * @indio_dev: device >> + */ >> +s64 iio_get_time_ns(const struct iio_dev *indio_dev) >> +{ >> + struct timespec tp; >> + >> + switch (iio_device_get_clock(indio_dev)) { >> + case CLOCK_REALTIME: >> + ktime_get_real_ts(&tp); >> + break; >> + case CLOCK_MONOTONIC: >> + ktime_get_ts(&tp); >> + break; >> + case CLOCK_MONOTONIC_RAW: >> + getrawmonotonic(&tp); >> + break; >> + case CLOCK_REALTIME_COARSE: >> + tp = current_kernel_time(); >> + break; >> + case CLOCK_MONOTONIC_COARSE: >> + tp = get_monotonic_coarse(); >> + break; >> + case CLOCK_BOOTTIME: >> + get_monotonic_boottime(&tp); >> + break; >> + case CLOCK_TAI: >> + timekeeping_clocktai(&tp); >> + break; >> + default: >> + BUG(); >> + } >> + >> + return timespec_to_ns(&tp); >> +} >> +EXPORT_SYMBOL(iio_get_time_ns); >> + >> +/** >> + * iio_get_time_res() - utility function to get time stamp clock resolution in >> + * nano seconds. >> + * @indio_dev: device >> + */ >> +unsigned int iio_get_time_res(const struct iio_dev *indio_dev) >> +{ >> + switch (iio_device_get_clock(indio_dev)) { >> + case CLOCK_REALTIME: >> + case CLOCK_MONOTONIC: >> + case CLOCK_MONOTONIC_RAW: >> + case CLOCK_BOOTTIME: >> + case CLOCK_TAI: >> + return hrtimer_resolution; >> + case CLOCK_REALTIME_COARSE: >> + case CLOCK_MONOTONIC_COARSE: >> + return LOW_RES_NSEC; >> + default: >> + BUG(); >> + } >> +} >> +EXPORT_SYMBOL(iio_get_time_res); >> + >> static int __init iio_init(void) >> { >> int ret; >> @@ -904,11 +984,91 @@ static ssize_t iio_show_dev_name(struct device *dev, >> >> static DEVICE_ATTR(name, S_IRUGO, iio_show_dev_name, NULL); >> >> +static ssize_t iio_show_timestamp_clock(struct device *dev, >> + struct device_attribute *attr, >> + char *buf) >> +{ >> + const struct iio_dev *indio_dev = dev_to_iio_dev(dev); >> + const clockid_t clk = iio_device_get_clock(indio_dev); >> + const char *name; >> + ssize_t sz; >> + >> + switch (clk) { >> + case CLOCK_REALTIME: >> + name = "realtime\n"; >> + sz = sizeof("realtime\n"); >> + break; >> + case CLOCK_MONOTONIC: >> + name = "monotonic\n"; >> + sz = sizeof("monotonic\n"); >> + break; >> + case CLOCK_MONOTONIC_RAW: >> + name = "monotonic_raw\n"; >> + sz = sizeof("monotonic_raw\n"); >> + break; >> + case CLOCK_REALTIME_COARSE: >> + name = "realtime_coarse\n"; >> + sz = sizeof("realtime_coarse\n"); >> + break; >> + case CLOCK_MONOTONIC_COARSE: >> + name = "monotonic_coarse\n"; >> + sz = sizeof("monotonic_coarse\n"); >> + break; >> + case CLOCK_BOOTTIME: >> + name = "boottime\n"; >> + sz = sizeof("boottime\n"); >> + break; >> + case CLOCK_TAI: >> + name = "tai\n"; >> + sz = sizeof("tai\n"); >> + break; >> + default: >> + BUG(); >> + } >> + >> + memcpy(buf, name, sz); >> + return sz; >> +} >> + >> +static ssize_t iio_store_timestamp_clock(struct device *dev, >> + struct device_attribute *attr, >> + const char *buf, size_t len) >> +{ >> + clockid_t clk; >> + int ret; >> + >> + if (sysfs_streq(buf, "realtime")) >> + clk = CLOCK_REALTIME; >> + else if (sysfs_streq(buf, "monotonic")) >> + clk = CLOCK_MONOTONIC; >> + else if (sysfs_streq(buf, "monotonic_raw")) >> + clk = CLOCK_MONOTONIC_RAW; >> + else if (sysfs_streq(buf, "realtime_coarse")) >> + clk = CLOCK_REALTIME_COARSE; >> + else if (sysfs_streq(buf, "monotonic_coarse")) >> + clk = CLOCK_MONOTONIC_COARSE; >> + else if (sysfs_streq(buf, "boottime")) >> + clk = CLOCK_BOOTTIME; >> + else if (sysfs_streq(buf, "tai")) >> + clk = CLOCK_TAI; >> + else >> + return -EINVAL; >> + >> + ret = iio_device_set_clock(dev_to_iio_dev(dev), clk); >> + if (ret) >> + return ret; >> + >> + return len; >> +} >> + >> +static DEVICE_ATTR(current_timestamp_clock, S_IRUGO | S_IWUSR, >> + iio_show_timestamp_clock, iio_store_timestamp_clock); >> + >> static int iio_device_register_sysfs(struct iio_dev *indio_dev) >> { >> int i, ret = 0, attrcount, attrn, attrcount_orig = 0; >> struct iio_dev_attr *p; >> - struct attribute **attr; >> + struct attribute **attr, *clk = NULL; >> >> /* First count elements in any existing group */ >> if (indio_dev->info->attrs) { >> @@ -923,16 +1083,25 @@ static int iio_device_register_sysfs(struct iio_dev *indio_dev) >> */ >> if (indio_dev->channels) >> for (i = 0; i < indio_dev->num_channels; i++) { >> - ret = iio_device_add_channel_sysfs(indio_dev, >> - &indio_dev >> - ->channels[i]); >> + const struct iio_chan_spec *chan = >> + &indio_dev->channels[i]; >> + >> + if (chan->type == IIO_TIMESTAMP) >> + clk = &dev_attr_current_timestamp_clock.attr; >> + >> + ret = iio_device_add_channel_sysfs(indio_dev, chan); >> if (ret < 0) >> goto error_clear_attrs; >> attrcount += ret; >> } >> >> + if (indio_dev->event_interface) >> + clk = &dev_attr_current_timestamp_clock.attr; >> + >> if (indio_dev->name) >> attrcount++; >> + if (clk) >> + attrcount++; >> >> indio_dev->chan_attr_group.attrs = kcalloc(attrcount + 1, >> sizeof(indio_dev->chan_attr_group.attrs[0]), >> @@ -953,6 +1122,8 @@ static int iio_device_register_sysfs(struct iio_dev *indio_dev) >> indio_dev->chan_attr_group.attrs[attrn++] = &p->dev_attr.attr; >> if (indio_dev->name) >> indio_dev->chan_attr_group.attrs[attrn++] = &dev_attr_name.attr; >> + if (clk) >> + indio_dev->chan_attr_group.attrs[attrn++] = clk; >> >> indio_dev->groups[indio_dev->groupcounter++] = >> &indio_dev->chan_attr_group; >> diff --git a/drivers/iio/industrialio-event.c b/drivers/iio/industrialio-event.c >> index cae332b..0ebfc92 100644 >> --- a/drivers/iio/industrialio-event.c >> +++ b/drivers/iio/industrialio-event.c >> @@ -44,6 +44,11 @@ struct iio_event_interface { >> struct mutex read_lock; >> }; >> >> +bool iio_event_enabled(const struct iio_event_interface *ev_int) >> +{ >> + return !!test_bit(IIO_BUSY_BIT_POS, &ev_int->flags); >> +} >> + >> /** >> * iio_push_event() - try to add event to the list for userspace reading >> * @indio_dev: IIO device structure >> @@ -60,7 +65,7 @@ int iio_push_event(struct iio_dev *indio_dev, u64 ev_code, s64 timestamp) >> int copied; >> >> /* Does anyone care? */ >> - if (test_bit(IIO_BUSY_BIT_POS, &ev_int->flags)) { >> + if (iio_event_enabled(ev_int)) { >> >> ev.id = ev_code; >> ev.timestamp = timestamp; >> @@ -180,8 +185,14 @@ int iio_event_getfd(struct iio_dev *indio_dev) >> if (ev_int == NULL) >> return -ENODEV; >> >> - if (test_and_set_bit(IIO_BUSY_BIT_POS, &ev_int->flags)) >> - return -EBUSY; >> + fd = mutex_lock_interruptible(&indio_dev->mlock); >> + if (fd) >> + return fd; >> + >> + if (test_and_set_bit(IIO_BUSY_BIT_POS, &ev_int->flags)) { >> + fd = -EBUSY; >> + goto unlock; >> + } >> >> iio_device_get(indio_dev); >> >> @@ -194,6 +205,8 @@ int iio_event_getfd(struct iio_dev *indio_dev) >> kfifo_reset_out(&ev_int->det_events); >> } >> >> +unlock: >> + mutex_unlock(&indio_dev->mlock); >> return fd; >> } >> >> diff --git a/drivers/iio/industrialio-trigger.c b/drivers/iio/industrialio-trigger.c >> index ae2806a..cf93717 100644 >> --- a/drivers/iio/industrialio-trigger.c >> +++ b/drivers/iio/industrialio-trigger.c >> @@ -251,7 +251,7 @@ static int iio_trigger_detach_poll_func(struct iio_trigger *trig, >> irqreturn_t iio_pollfunc_store_time(int irq, void *p) >> { >> struct iio_poll_func *pf = p; >> - pf->timestamp = iio_get_time_ns(); >> + pf->timestamp = iio_get_time_ns(pf->indio_dev); >> return IRQ_WAKE_THREAD; >> } >> EXPORT_SYMBOL(iio_pollfunc_store_time); >> diff --git a/drivers/iio/light/acpi-als.c b/drivers/iio/light/acpi-als.c >> index 53201d9..f0b47c5 100644 >> --- a/drivers/iio/light/acpi-als.c >> +++ b/drivers/iio/light/acpi-als.c >> @@ -118,7 +118,7 @@ static void acpi_als_notify(struct acpi_device *device, u32 event) >> struct iio_dev *indio_dev = acpi_driver_data(device); >> struct acpi_als *als = iio_priv(indio_dev); >> s32 *buffer = als->evt_buffer; >> - s64 time_ns = iio_get_time_ns(); >> + s64 time_ns = iio_get_time_ns(indio_dev); >> s32 val; >> int ret; >> >> diff --git a/drivers/iio/light/adjd_s311.c b/drivers/iio/light/adjd_s311.c >> index 09ad5f1..0113fc8 100644 >> --- a/drivers/iio/light/adjd_s311.c >> +++ b/drivers/iio/light/adjd_s311.c >> @@ -118,7 +118,7 @@ static irqreturn_t adjd_s311_trigger_handler(int irq, void *p) >> struct iio_poll_func *pf = p; >> struct iio_dev *indio_dev = pf->indio_dev; >> struct adjd_s311_data *data = iio_priv(indio_dev); >> - s64 time_ns = iio_get_time_ns(); >> + s64 time_ns = iio_get_time_ns(indio_dev); >> int i, j = 0; >> >> int ret = adjd_s311_req_data(indio_dev); >> diff --git a/drivers/iio/light/apds9300.c b/drivers/iio/light/apds9300.c >> index e1b9fa5..649b26f 100644 >> --- a/drivers/iio/light/apds9300.c >> +++ b/drivers/iio/light/apds9300.c >> @@ -396,7 +396,7 @@ static irqreturn_t apds9300_interrupt_handler(int irq, void *private) >> IIO_UNMOD_EVENT_CODE(IIO_INTENSITY, 0, >> IIO_EV_TYPE_THRESH, >> IIO_EV_DIR_EITHER), >> - iio_get_time_ns()); >> + iio_get_time_ns(dev_info)); >> >> apds9300_clear_intr(data); >> >> diff --git a/drivers/iio/light/apds9960.c b/drivers/iio/light/apds9960.c >> index f6a07dc..42ef6cf 100644 >> --- a/drivers/iio/light/apds9960.c >> +++ b/drivers/iio/light/apds9960.c >> @@ -801,7 +801,7 @@ static irqreturn_t apds9960_interrupt_handler(int irq, void *private) >> IIO_UNMOD_EVENT_CODE(IIO_INTENSITY, 0, >> IIO_EV_TYPE_THRESH, >> IIO_EV_DIR_EITHER), >> - iio_get_time_ns()); >> + iio_get_time_ns(indio_dev)); >> regmap_write(data->regmap, APDS9960_REG_CICLEAR, 1); >> } >> >> @@ -810,7 +810,7 @@ static irqreturn_t apds9960_interrupt_handler(int irq, void *private) >> IIO_UNMOD_EVENT_CODE(IIO_PROXIMITY, 0, >> IIO_EV_TYPE_THRESH, >> IIO_EV_DIR_EITHER), >> - iio_get_time_ns()); >> + iio_get_time_ns(indio_dev)); >> regmap_write(data->regmap, APDS9960_REG_PICLEAR, 1); >> } >> >> diff --git a/drivers/iio/light/cm36651.c b/drivers/iio/light/cm36651.c >> index c8d7b5e..9d66e89 100644 >> --- a/drivers/iio/light/cm36651.c >> +++ b/drivers/iio/light/cm36651.c >> @@ -268,7 +268,7 @@ static irqreturn_t cm36651_irq_handler(int irq, void *data) >> CM36651_CMD_READ_RAW_PROXIMITY, >> IIO_EV_TYPE_THRESH, ev_dir); >> >> - iio_push_event(indio_dev, ev_code, iio_get_time_ns()); >> + iio_push_event(indio_dev, ev_code, iio_get_time_ns(indio_dev)); >> >> return IRQ_HANDLED; >> } >> diff --git a/drivers/iio/light/gp2ap020a00f.c b/drivers/iio/light/gp2ap020a00f.c >> index 6d41086..f558a2b 100644 >> --- a/drivers/iio/light/gp2ap020a00f.c >> +++ b/drivers/iio/light/gp2ap020a00f.c >> @@ -851,7 +851,7 @@ static irqreturn_t gp2ap020a00f_prox_sensing_handler(int irq, void *data) >> GP2AP020A00F_SCAN_MODE_PROXIMITY, >> IIO_EV_TYPE_ROC, >> IIO_EV_DIR_RISING), >> - iio_get_time_ns()); >> + iio_get_time_ns(indio_dev)); >> } else { >> iio_push_event(indio_dev, >> IIO_UNMOD_EVENT_CODE( >> @@ -859,7 +859,7 @@ static irqreturn_t gp2ap020a00f_prox_sensing_handler(int irq, void *data) >> GP2AP020A00F_SCAN_MODE_PROXIMITY, >> IIO_EV_TYPE_ROC, >> IIO_EV_DIR_FALLING), >> - iio_get_time_ns()); >> + iio_get_time_ns(indio_dev)); >> } >> } >> >> @@ -925,7 +925,7 @@ static irqreturn_t gp2ap020a00f_thresh_event_handler(int irq, void *data) >> IIO_MOD_LIGHT_CLEAR, >> IIO_EV_TYPE_THRESH, >> IIO_EV_DIR_RISING), >> - iio_get_time_ns()); >> + iio_get_time_ns(indio_dev)); >> } >> >> if (test_bit(GP2AP020A00F_FLAG_ALS_FALLING_EV, &priv->flags)) { >> @@ -939,7 +939,7 @@ static irqreturn_t gp2ap020a00f_thresh_event_handler(int irq, void *data) >> IIO_MOD_LIGHT_CLEAR, >> IIO_EV_TYPE_THRESH, >> IIO_EV_DIR_FALLING), >> - iio_get_time_ns()); >> + iio_get_time_ns(indio_dev)); >> } >> } >> >> diff --git a/drivers/iio/light/isl29125.c b/drivers/iio/light/isl29125.c >> index e2945a2..67ccc5e 100644 >> --- a/drivers/iio/light/isl29125.c >> +++ b/drivers/iio/light/isl29125.c >> @@ -189,7 +189,7 @@ static irqreturn_t isl29125_trigger_handler(int irq, void *p) >> } >> >> iio_push_to_buffers_with_timestamp(indio_dev, data->buffer, >> - iio_get_time_ns()); >> + iio_get_time_ns(indio_dev)); >> >> done: >> iio_trigger_notify_done(indio_dev->trig); >> diff --git a/drivers/iio/light/lm3533-als.c b/drivers/iio/light/lm3533-als.c >> index e56937c..f409c20 100644 >> --- a/drivers/iio/light/lm3533-als.c >> +++ b/drivers/iio/light/lm3533-als.c >> @@ -267,7 +267,7 @@ static irqreturn_t lm3533_als_isr(int irq, void *dev_id) >> 0, >> IIO_EV_TYPE_THRESH, >> IIO_EV_DIR_EITHER), >> - iio_get_time_ns()); >> + iio_get_time_ns(indio_dev)); >> out: >> return IRQ_HANDLED; >> } >> diff --git a/drivers/iio/light/ltr501.c b/drivers/iio/light/ltr501.c >> index 6bf89d8..3afc53a 100644 >> --- a/drivers/iio/light/ltr501.c >> +++ b/drivers/iio/light/ltr501.c >> @@ -1256,7 +1256,8 @@ static irqreturn_t ltr501_trigger_handler(int irq, void *p) >> buf[j++] = psdata & LTR501_PS_DATA_MASK; >> } >> >> - iio_push_to_buffers_with_timestamp(indio_dev, buf, iio_get_time_ns()); >> + iio_push_to_buffers_with_timestamp(indio_dev, buf, >> + iio_get_time_ns(indio_dev)); >> >> done: >> iio_trigger_notify_done(indio_dev->trig); >> @@ -1282,14 +1283,14 @@ static irqreturn_t ltr501_interrupt_handler(int irq, void *private) >> IIO_UNMOD_EVENT_CODE(IIO_INTENSITY, 0, >> IIO_EV_TYPE_THRESH, >> IIO_EV_DIR_EITHER), >> - iio_get_time_ns()); >> + iio_get_time_ns(indio_dev)); >> >> if (status & LTR501_STATUS_PS_INTR) >> iio_push_event(indio_dev, >> IIO_UNMOD_EVENT_CODE(IIO_PROXIMITY, 0, >> IIO_EV_TYPE_THRESH, >> IIO_EV_DIR_EITHER), >> - iio_get_time_ns()); >> + iio_get_time_ns(indio_dev)); >> >> return IRQ_HANDLED; >> } >> diff --git a/drivers/iio/light/opt3001.c b/drivers/iio/light/opt3001.c >> index b776c8e..78c9b3a 100644 >> --- a/drivers/iio/light/opt3001.c >> +++ b/drivers/iio/light/opt3001.c >> @@ -713,13 +713,13 @@ static irqreturn_t opt3001_irq(int irq, void *_iio) >> IIO_UNMOD_EVENT_CODE(IIO_LIGHT, 0, >> IIO_EV_TYPE_THRESH, >> IIO_EV_DIR_RISING), >> - iio_get_time_ns()); >> + iio_get_time_ns(iio)); >> if (ret & OPT3001_CONFIGURATION_FL) >> iio_push_event(iio, >> IIO_UNMOD_EVENT_CODE(IIO_LIGHT, 0, >> IIO_EV_TYPE_THRESH, >> IIO_EV_DIR_FALLING), >> - iio_get_time_ns()); >> + iio_get_time_ns(iio)); >> } else if (ret & OPT3001_CONFIGURATION_CRF) { >> ret = i2c_smbus_read_word_swapped(opt->client, OPT3001_RESULT); >> if (ret < 0) { >> diff --git a/drivers/iio/light/stk3310.c b/drivers/iio/light/stk3310.c >> index 42d334b..b48641d 100644 >> --- a/drivers/iio/light/stk3310.c >> +++ b/drivers/iio/light/stk3310.c >> @@ -529,7 +529,7 @@ static irqreturn_t stk3310_irq_handler(int irq, void *private) >> struct iio_dev *indio_dev = private; >> struct stk3310_data *data = iio_priv(indio_dev); >> >> - data->timestamp = iio_get_time_ns(); >> + data->timestamp = iio_get_time_ns(indio_dev); >> >> return IRQ_WAKE_THREAD; >> } >> diff --git a/drivers/iio/light/tcs3414.c b/drivers/iio/light/tcs3414.c >> index f90f8c5..936e764 100644 >> --- a/drivers/iio/light/tcs3414.c >> +++ b/drivers/iio/light/tcs3414.c >> @@ -217,7 +217,7 @@ static irqreturn_t tcs3414_trigger_handler(int irq, void *p) >> } >> >> iio_push_to_buffers_with_timestamp(indio_dev, data->buffer, >> - iio_get_time_ns()); >> + iio_get_time_ns(indio_dev)); >> >> done: >> iio_trigger_notify_done(indio_dev->trig); >> diff --git a/drivers/iio/light/tcs3472.c b/drivers/iio/light/tcs3472.c >> index 1b530bf..95519a3 100644 >> --- a/drivers/iio/light/tcs3472.c >> +++ b/drivers/iio/light/tcs3472.c >> @@ -204,7 +204,7 @@ static irqreturn_t tcs3472_trigger_handler(int irq, void *p) >> } >> >> iio_push_to_buffers_with_timestamp(indio_dev, data->buffer, >> - iio_get_time_ns()); >> + iio_get_time_ns(indio_dev)); >> >> done: >> iio_trigger_notify_done(indio_dev->trig); >> diff --git a/drivers/iio/light/tsl2563.c b/drivers/iio/light/tsl2563.c >> index 12731d6..27dbfdd 100644 >> --- a/drivers/iio/light/tsl2563.c >> +++ b/drivers/iio/light/tsl2563.c >> @@ -630,7 +630,7 @@ static irqreturn_t tsl2563_event_handler(int irq, void *private) >> 0, >> IIO_EV_TYPE_THRESH, >> IIO_EV_DIR_EITHER), >> - iio_get_time_ns()); >> + iio_get_time_ns(dev_info)); >> >> /* clear the interrupt and push the event */ >> i2c_smbus_write_byte(chip->client, TSL2563_CMD | TSL2563_CLEARINT); >> diff --git a/drivers/iio/light/us5182d.c b/drivers/iio/light/us5182d.c >> index 45bc2f7..20c40f7 100644 >> --- a/drivers/iio/light/us5182d.c >> +++ b/drivers/iio/light/us5182d.c >> @@ -833,7 +833,7 @@ static irqreturn_t us5182d_irq_thread_handler(int irq, void *private) >> dir = ret & US5182D_CFG0_PROX ? IIO_EV_DIR_RISING : IIO_EV_DIR_FALLING; >> ev = IIO_UNMOD_EVENT_CODE(IIO_PROXIMITY, 1, IIO_EV_TYPE_THRESH, dir); >> >> - iio_push_event(indio_dev, ev, iio_get_time_ns()); >> + iio_push_event(indio_dev, ev, iio_get_time_ns(indio_dev)); >> >> ret = i2c_smbus_write_byte_data(data->client, US5182D_REG_CFG0, >> ret & ~US5182D_CFG0_PX_IRQ); >> diff --git a/drivers/iio/magnetometer/hmc5843_core.c b/drivers/iio/magnetometer/hmc5843_core.c >> index 77882b4..ba3e2a3 100644 >> --- a/drivers/iio/magnetometer/hmc5843_core.c >> +++ b/drivers/iio/magnetometer/hmc5843_core.c >> @@ -451,7 +451,7 @@ static irqreturn_t hmc5843_trigger_handler(int irq, void *p) >> goto done; >> >> iio_push_to_buffers_with_timestamp(indio_dev, data->buffer, >> - iio_get_time_ns()); >> + iio_get_time_ns(indio_dev)); >> >> done: >> iio_trigger_notify_done(indio_dev->trig); >> diff --git a/drivers/iio/magnetometer/mag3110.c b/drivers/iio/magnetometer/mag3110.c >> index 261d517..f2be4a0 100644 >> --- a/drivers/iio/magnetometer/mag3110.c >> +++ b/drivers/iio/magnetometer/mag3110.c >> @@ -261,7 +261,7 @@ static irqreturn_t mag3110_trigger_handler(int irq, void *p) >> } >> >> iio_push_to_buffers_with_timestamp(indio_dev, buffer, >> - iio_get_time_ns()); >> + iio_get_time_ns(indio_dev)); >> >> done: >> iio_trigger_notify_done(indio_dev->trig); >> diff --git a/drivers/iio/pressure/mpl3115.c b/drivers/iio/pressure/mpl3115.c >> index 01b2e0b..6392d7b 100644 >> --- a/drivers/iio/pressure/mpl3115.c >> +++ b/drivers/iio/pressure/mpl3115.c >> @@ -171,7 +171,7 @@ static irqreturn_t mpl3115_trigger_handler(int irq, void *p) >> mutex_unlock(&data->lock); >> >> iio_push_to_buffers_with_timestamp(indio_dev, buffer, >> - iio_get_time_ns()); >> + iio_get_time_ns(indio_dev)); >> >> done: >> iio_trigger_notify_done(indio_dev->trig); >> diff --git a/drivers/iio/pressure/ms5611_core.c b/drivers/iio/pressure/ms5611_core.c >> index 37dbc04..8bc178b 100644 >> --- a/drivers/iio/pressure/ms5611_core.c >> +++ b/drivers/iio/pressure/ms5611_core.c >> @@ -224,7 +224,8 @@ static irqreturn_t ms5611_trigger_handler(int irq, void *p) >> if (ret < 0) >> goto err; >> >> - iio_push_to_buffers_with_timestamp(indio_dev, buf, iio_get_time_ns()); >> + iio_push_to_buffers_with_timestamp(indio_dev, buf, >> + iio_get_time_ns(indio_dev)); >> >> err: >> iio_trigger_notify_done(indio_dev->trig); >> diff --git a/drivers/iio/proximity/pulsedlight-lidar-lite-v2.c b/drivers/iio/proximity/pulsedlight-lidar-lite-v2.c >> index 4f502386..b216220 100644 >> --- a/drivers/iio/proximity/pulsedlight-lidar-lite-v2.c >> +++ b/drivers/iio/proximity/pulsedlight-lidar-lite-v2.c >> @@ -244,7 +244,7 @@ static irqreturn_t lidar_trigger_handler(int irq, void *private) >> ret = lidar_get_measurement(data, data->buffer); >> if (!ret) { >> iio_push_to_buffers_with_timestamp(indio_dev, data->buffer, >> - iio_get_time_ns()); >> + iio_get_time_ns(indio_dev)); >> } else if (ret != -EINVAL) { >> dev_err(&data->client->dev, "cannot read LIDAR measurement"); >> } >> diff --git a/drivers/iio/proximity/sx9500.c b/drivers/iio/proximity/sx9500.c >> index 66cd09a..1d74b3a 100644 >> --- a/drivers/iio/proximity/sx9500.c >> +++ b/drivers/iio/proximity/sx9500.c >> @@ -492,7 +492,7 @@ static void sx9500_push_events(struct iio_dev *indio_dev) >> dir = new_prox ? IIO_EV_DIR_FALLING : IIO_EV_DIR_RISING; >> ev = IIO_UNMOD_EVENT_CODE(IIO_PROXIMITY, chan, >> IIO_EV_TYPE_THRESH, dir); >> - iio_push_event(indio_dev, ev, iio_get_time_ns()); >> + iio_push_event(indio_dev, ev, iio_get_time_ns(indio_dev)); >> data->prox_stat[chan] = new_prox; >> } >> } >> @@ -669,7 +669,7 @@ static irqreturn_t sx9500_trigger_handler(int irq, void *private) >> } >> >> iio_push_to_buffers_with_timestamp(indio_dev, data->buffer, >> - iio_get_time_ns()); >> + iio_get_time_ns(indio_dev)); >> >> out: >> mutex_unlock(&data->mutex); >> diff --git a/drivers/staging/iio/accel/lis3l02dq_core.c b/drivers/staging/iio/accel/lis3l02dq_core.c >> index 7a6fed3..5c3410a 100644 >> --- a/drivers/staging/iio/accel/lis3l02dq_core.c >> +++ b/drivers/staging/iio/accel/lis3l02dq_core.c >> @@ -451,7 +451,7 @@ static irqreturn_t lis3l02dq_event_handler(int irq, void *private) >> struct iio_dev *indio_dev = private; >> u8 t; >> >> - s64 timestamp = iio_get_time_ns(); >> + s64 timestamp = iio_get_time_ns(indio_dev); >> >> lis3l02dq_spi_read_reg_8(indio_dev, >> LIS3L02DQ_REG_WAKE_UP_SRC_ADDR, >> diff --git a/drivers/staging/iio/accel/sca3000_core.c b/drivers/staging/iio/accel/sca3000_core.c >> index a8f533a..cff7e4a 100644 >> --- a/drivers/staging/iio/accel/sca3000_core.c >> +++ b/drivers/staging/iio/accel/sca3000_core.c >> @@ -774,7 +774,7 @@ static irqreturn_t sca3000_event_handler(int irq, void *private) >> struct iio_dev *indio_dev = private; >> struct sca3000_state *st = iio_priv(indio_dev); >> int ret, val; >> - s64 last_timestamp = iio_get_time_ns(); >> + s64 last_timestamp = iio_get_time_ns(indio_dev); >> >> /* >> * Could lead if badly timed to an extra read of status reg, >> diff --git a/drivers/staging/iio/adc/ad7280a.c b/drivers/staging/iio/adc/ad7280a.c >> index 62e5eca..69fa4eb 100644 >> --- a/drivers/staging/iio/adc/ad7280a.c >> +++ b/drivers/staging/iio/adc/ad7280a.c >> @@ -705,7 +705,7 @@ static irqreturn_t ad7280_event_handler(int irq, void *private) >> IIO_EV_DIR_RISING, >> IIO_EV_TYPE_THRESH, >> 0, 0, 0), >> - iio_get_time_ns()); >> + iio_get_time_ns(indio_dev)); >> else if (((channels[i] >> 11) & 0xFFF) <= >> st->cell_threshlow) >> iio_push_event(indio_dev, >> @@ -715,7 +715,7 @@ static irqreturn_t ad7280_event_handler(int irq, void *private) >> IIO_EV_DIR_FALLING, >> IIO_EV_TYPE_THRESH, >> 0, 0, 0), >> - iio_get_time_ns()); >> + iio_get_time_ns(indio_dev)); >> } else { >> if (((channels[i] >> 11) & 0xFFF) >= st->aux_threshhigh) >> iio_push_event(indio_dev, >> @@ -724,7 +724,7 @@ static irqreturn_t ad7280_event_handler(int irq, void *private) >> 0, >> IIO_EV_TYPE_THRESH, >> IIO_EV_DIR_RISING), >> - iio_get_time_ns()); >> + iio_get_time_ns(indio_dev)); >> else if (((channels[i] >> 11) & 0xFFF) <= >> st->aux_threshlow) >> iio_push_event(indio_dev, >> @@ -733,7 +733,7 @@ static irqreturn_t ad7280_event_handler(int irq, void *private) >> 0, >> IIO_EV_TYPE_THRESH, >> IIO_EV_DIR_FALLING), >> - iio_get_time_ns()); >> + iio_get_time_ns(indio_dev)); >> } >> } >> >> diff --git a/drivers/staging/iio/adc/ad7606_ring.c b/drivers/staging/iio/adc/ad7606_ring.c >> index a6f8eb1..0572df9 100644 >> --- a/drivers/staging/iio/adc/ad7606_ring.c >> +++ b/drivers/staging/iio/adc/ad7606_ring.c >> @@ -77,7 +77,8 @@ static void ad7606_poll_bh_to_ring(struct work_struct *work_s) >> goto done; >> } >> >> - iio_push_to_buffers_with_timestamp(indio_dev, buf, iio_get_time_ns()); >> + iio_push_to_buffers_with_timestamp(indio_dev, buf, >> + iio_get_time_ns(indio_dev)); >> done: >> gpio_set_value(st->pdata->gpio_convst, 0); >> iio_trigger_notify_done(indio_dev->trig); >> diff --git a/drivers/staging/iio/adc/ad7816.c b/drivers/staging/iio/adc/ad7816.c >> index ac3735c..5e8115b 100644 >> --- a/drivers/staging/iio/adc/ad7816.c >> +++ b/drivers/staging/iio/adc/ad7816.c >> @@ -253,7 +253,8 @@ static const struct attribute_group ad7816_attribute_group = { >> >> static irqreturn_t ad7816_event_handler(int irq, void *private) >> { >> - iio_push_event(private, IIO_EVENT_CODE_AD7816_OTI, iio_get_time_ns()); >> + iio_push_event(private, IIO_EVENT_CODE_AD7816_OTI, >> + iio_get_time_ns((struct iio_dev *)private)); >> return IRQ_HANDLED; >> } >> >> diff --git a/drivers/staging/iio/addac/adt7316.c b/drivers/staging/iio/addac/adt7316.c >> index 3adc451..f4ea954 100644 >> --- a/drivers/staging/iio/addac/adt7316.c >> +++ b/drivers/staging/iio/addac/adt7316.c >> @@ -1755,7 +1755,7 @@ static irqreturn_t adt7316_event_handler(int irq, void *private) >> if ((chip->id & ID_FAMILY_MASK) != ID_ADT75XX) >> stat1 &= 0x1F; >> >> - time = iio_get_time_ns(); >> + time = iio_get_time_ns(indio_dev); >> if (stat1 & BIT(0)) >> iio_push_event(indio_dev, >> IIO_UNMOD_EVENT_CODE(IIO_TEMP, 0, >> @@ -1807,7 +1807,7 @@ static irqreturn_t adt7316_event_handler(int irq, void *private) >> 0, >> IIO_EV_TYPE_THRESH, >> IIO_EV_DIR_RISING), >> - iio_get_time_ns()); >> + iio_get_time_ns(indio_dev)); >> } >> >> return IRQ_HANDLED; >> diff --git a/drivers/staging/iio/cdc/ad7150.c b/drivers/staging/iio/cdc/ad7150.c >> index f6b9a10..5578a07 100644 >> --- a/drivers/staging/iio/cdc/ad7150.c >> +++ b/drivers/staging/iio/cdc/ad7150.c >> @@ -493,7 +493,7 @@ static irqreturn_t ad7150_event_handler(int irq, void *private) >> struct iio_dev *indio_dev = private; >> struct ad7150_chip_info *chip = iio_priv(indio_dev); >> u8 int_status; >> - s64 timestamp = iio_get_time_ns(); >> + s64 timestamp = iio_get_time_ns(indio_dev); >> int ret; >> >> ret = i2c_smbus_read_byte_data(chip->client, AD7150_STATUS); >> diff --git a/drivers/staging/iio/light/tsl2x7x_core.c b/drivers/staging/iio/light/tsl2x7x_core.c >> index 2a62718..d35b503 100644 >> --- a/drivers/staging/iio/light/tsl2x7x_core.c >> +++ b/drivers/staging/iio/light/tsl2x7x_core.c >> @@ -1524,7 +1524,7 @@ static irqreturn_t tsl2x7x_event_handler(int irq, void *private) >> { >> struct iio_dev *indio_dev = private; >> struct tsl2X7X_chip *chip = iio_priv(indio_dev); >> - s64 timestamp = iio_get_time_ns(); >> + s64 timestamp = iio_get_time_ns(indio_dev); >> int ret; >> u8 value; >> >> diff --git a/include/linux/iio/iio.h b/include/linux/iio/iio.h >> index b2b1677..8b1db3a 100644 >> --- a/include/linux/iio/iio.h >> +++ b/include/linux/iio/iio.h >> @@ -281,13 +281,8 @@ static inline bool iio_channel_has_info(const struct iio_chan_spec *chan, >> }, \ >> } >> >> -/** >> - * iio_get_time_ns() - utility function to get a time stamp for events etc >> - **/ >> -static inline s64 iio_get_time_ns(void) >> -{ >> - return ktime_get_real_ns(); >> -} >> +s64 iio_get_time_ns(const struct iio_dev *indio_dev); >> +unsigned int iio_get_time_res(const struct iio_dev *indio_dev); >> >> /* Device operating modes */ >> #define INDIO_DIRECT_MODE 0x01 >> @@ -466,6 +461,7 @@ struct iio_buffer_setup_ops { >> * @chan_attr_group: [INTERN] group for all attrs in base directory >> * @name: [DRIVER] name of the device. >> * @info: [DRIVER] callbacks and constant info from driver >> + * @clock_id: [INTERN] timestamping clock posix identifier >> * @info_exist_lock: [INTERN] lock to prevent use during removal >> * @setup_ops: [DRIVER] callbacks to call before and after buffer >> * enable/disable >> @@ -506,6 +502,7 @@ struct iio_dev { >> struct attribute_group chan_attr_group; >> const char *name; >> const struct iio_info *info; >> + clockid_t clock_id; >> struct mutex info_exist_lock; >> const struct iio_buffer_setup_ops *setup_ops; >> struct cdev chrdev; >> @@ -532,7 +529,7 @@ extern struct bus_type iio_bus_type; >> >> /** >> * iio_device_put() - reference counted deallocation of struct device >> - * @indio_dev: IIO device structure containing the device >> + * @indio_dev: IIO device structure containing the device >> **/ >> static inline void iio_device_put(struct iio_dev *indio_dev) >> { >> @@ -541,6 +538,15 @@ static inline void iio_device_put(struct iio_dev *indio_dev) >> } >> >> /** >> + * iio_device_get_clock() - Retrieve current timestamping clock for the device >> + * @indio_dev: IIO device structure containing the device >> + */ >> +static inline clockid_t iio_device_get_clock(const struct iio_dev *indio_dev) >> +{ >> + return indio_dev->clock_id; >> +} >> + >> +/** >> * dev_to_iio_dev() - Get IIO device struct from a device struct >> * @dev: The device embedded in the IIO device >> * >> -- >> 2.1.4 >> > -- > To unsubscribe from this list: send the line "unsubscribe linux-iio" in > the body of a message to majordomo@xxxxxxxxxxxxxxx > More majordomo info at http://vger.kernel.org/majordomo-info.html > -- To unsubscribe from this list: send the line "unsubscribe linux-iio" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html