All of lore.kernel.org
 help / color / mirror / Atom feed
* [RFC PATCH v1 0/3] iio: introduce timestamping clock selection
@ 2016-02-11 10:04 Gregor Boirie
  2016-02-11 10:04 ` [RFC PATCH v1 1/3] iio:core: timestamping clock selection support Gregor Boirie
                   ` (3 more replies)
  0 siblings, 4 replies; 12+ messages in thread
From: Gregor Boirie @ 2016-02-11 10:04 UTC (permalink / raw)
  To: linux-iio; +Cc: jic23, lars, Gregor Boirie

First draft implementation of IIO timestamping clock selection support based on
the following principles :
* selected timestamping clock is a per-device attribute which the userspace
  may access through a sysfs file ;
* a single reference clock is used for both buffered samples and events of a
  given device at the same time ;
* userspace may choose amongst the following subset of available POSIX clocks:
  CLOCK_REALTIME, CLOCK_MONOTONIC, CLOCK_MONOTONIC_RAW, CLOCK_REALTIME_COARSE,
  CLOCK_MONOTONIC_COARSE, CLOCK_BOOTTIME and CLOCK_TAI ;
* sample and event timestamps consistency with respect to clock changes is
  ensured by rejecting the ability to select a new clock as long as an events
  chrdev is opened or a buffered samples channel is enabled for a given device.
* no in-kernel API support since AFAIK, consumers work synchronously in direct
  mode, i.e. timestamping may be peformed using traditional kernel time keeping.

Comments are welcome. Regards.

Gregor Boirie (3):
  iio:core: timestamping clock selection support
  iio:core: timestamping clock resolution support
  iio: make drivers use new timestamping clock API

 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/vf610_adc.c                       |   3 +-
 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/humidity/dht11.c                      |  16 +--
 drivers/iio/iio_core.h                            |   3 +
 drivers/iio/imu/inv_mpu6050/inv_mpu_ring.c        |   2 +-
 drivers/iio/industrialio-core.c                   | 130 +++++++++++++++++++++-
 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 +-
 drivers/iio/light/opt3001.c                       |   4 +-
 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/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             |   2 +-
 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 +-
 drivers/staging/iio/magnetometer/hmc5843_core.c   |   2 +-
 include/linux/iio/iio.h                           |  11 +-
 63 files changed, 264 insertions(+), 113 deletions(-)

-- 
2.1.4


^ permalink raw reply	[flat|nested] 12+ messages in thread

* [RFC PATCH v1 1/3] iio:core: timestamping clock selection support
  2016-02-11 10:04 [RFC PATCH v1 0/3] iio: introduce timestamping clock selection Gregor Boirie
@ 2016-02-11 10:04 ` Gregor Boirie
  2016-02-13 14:14   ` Jonathan Cameron
  2016-02-11 10:04 ` [RFC PATCH v1 2/3] iio:core: timestamping clock resolution support Gregor Boirie
                   ` (2 subsequent siblings)
  3 siblings, 1 reply; 12+ messages in thread
From: Gregor Boirie @ 2016-02-11 10:04 UTC (permalink / raw)
  To: linux-iio; +Cc: jic23, lars, Gregor Boirie

Adds a new per-device sysfs attribute "clockid" to allow userspace to select a
particular POSIX clock for buffered samples and events timestamping.

When read, the attribute file returns a stringifi'ed clockid_t matching the
currently selected clock.
Writing a stringifi'ed clockid_t to the attribute file will select the
corresponding clock for the device.

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@parrot.com>
---
 Documentation/ABI/testing/sysfs-bus-iio |   7 +++
 Documentation/DocBook/iio.tmpl          |   2 +-
 drivers/iio/iio_core.h                  |   3 +
 drivers/iio/industrialio-core.c         | 107 ++++++++++++++++++++++++++++++--
 drivers/iio/industrialio-event.c        |  19 +++++-
 drivers/iio/industrialio-trigger.c      |   2 +-
 include/linux/iio/iio.h                 |  10 +--
 7 files changed, 134 insertions(+), 16 deletions(-)

diff --git a/Documentation/ABI/testing/sysfs-bus-iio b/Documentation/ABI/testing/sysfs-bus-iio
index 3c66248..4602006 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/clockid
+KernelVersion:	4.5
+Contact:	linux-iio@vger.kernel.org
+Description:
+		Identifier (clockid_t) of 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..df47dd4 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/iio_core.h b/drivers/iio/iio_core.h
index 3598835..a07d2ec 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/industrialio-core.c b/drivers/iio/industrialio-core.c
index 70cb7eb..97bdb95 100644
--- a/drivers/iio/industrialio-core.c
+++ b/drivers/iio/industrialio-core.c
@@ -174,6 +174,44 @@ ssize_t iio_read_const_attr(struct device *dev,
 }
 EXPORT_SYMBOL(iio_read_const_attr);
 
+/**
+ * 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 (indio_dev->clock_id) {
+	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);
+
 static int __init iio_init(void)
 {
 	int ret;
@@ -904,11 +942,61 @@ 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_clockid(struct device *dev,
+                                struct device_attribute *attr, char *buf)
+{
+	const struct iio_dev *indio_dev = dev_to_iio_dev(dev);
+	return sprintf(buf, "%d\n", indio_dev->clock_id);
+}
+
+static ssize_t iio_store_clockid(struct device *dev,
+                                 struct device_attribute *attr,
+                                 const char *buf, size_t len)
+{
+	int ret;
+	int clk;
+	struct iio_dev *indio_dev = dev_to_iio_dev(dev);
+	const struct iio_event_interface *ev_int = indio_dev->event_interface;
+
+	ret = kstrtoint(buf, 0, &clk);
+	if (ret < 0)
+		return ret;
+
+	switch (clk) {
+	case CLOCK_REALTIME:
+	case CLOCK_MONOTONIC:
+	case CLOCK_MONOTONIC_RAW:
+	case CLOCK_REALTIME_COARSE:
+	case CLOCK_MONOTONIC_COARSE:
+	case CLOCK_BOOTTIME:
+	case CLOCK_TAI:
+		break;
+	default:
+		return -EINVAL;
+	}
+
+	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 = clk;
+	mutex_unlock(&indio_dev->mlock);
+
+	return len;
+}
+
+static DEVICE_ATTR(clockid, S_IRUGO | S_IWUSR,
+                   iio_show_clockid, iio_store_clockid);
+
 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 +1011,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_clockid.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_clockid.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 +1050,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..9480404 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/include/linux/iio/iio.h b/include/linux/iio/iio.h
index ce9e9c1..904a5b0 100644
--- a/include/linux/iio/iio.h
+++ b/include/linux/iio/iio.h
@@ -281,13 +281,7 @@ 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();
-}
+extern s64 iio_get_time_ns(const struct iio_dev*);
 
 /* Device operating modes */
 #define INDIO_DIRECT_MODE		0x01
@@ -466,6 +460,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 +501,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;
-- 
2.1.4


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [RFC PATCH v1 2/3] iio:core: timestamping clock resolution support
  2016-02-11 10:04 [RFC PATCH v1 0/3] iio: introduce timestamping clock selection Gregor Boirie
  2016-02-11 10:04 ` [RFC PATCH v1 1/3] iio:core: timestamping clock selection support Gregor Boirie
@ 2016-02-11 10:04 ` Gregor Boirie
  2016-02-11 10:04 ` [RFC PATCH v1 3/3] iio: make drivers use new timestamping clock API Gregor Boirie
  2016-02-13 14:12 ` [RFC PATCH v1 0/3] iio: introduce timestamping clock selection Jonathan Cameron
  3 siblings, 0 replies; 12+ messages in thread
From: Gregor Boirie @ 2016-02-11 10:04 UTC (permalink / raw)
  To: linux-iio; +Cc: jic23, lars, Gregor Boirie

Adds a new function iio_get_time_res() to retrieve the current timestamping
clock resolution.

Signed-off-by: Gregor Boirie <gregor.boirie@parrot.com>
---
 drivers/iio/industrialio-core.c | 23 +++++++++++++++++++++++
 include/linux/iio/iio.h         |  1 +
 2 files changed, 24 insertions(+)

diff --git a/drivers/iio/industrialio-core.c b/drivers/iio/industrialio-core.c
index 97bdb95..eb56cdf 100644
--- a/drivers/iio/industrialio-core.c
+++ b/drivers/iio/industrialio-core.c
@@ -212,6 +212,29 @@ s64 iio_get_time_ns(const struct iio_dev* indio_dev)
 }
 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 (indio_dev->clock_id) {
+	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;
diff --git a/include/linux/iio/iio.h b/include/linux/iio/iio.h
index 904a5b0..931b0ab 100644
--- a/include/linux/iio/iio.h
+++ b/include/linux/iio/iio.h
@@ -282,6 +282,7 @@ static inline bool iio_channel_has_info(const struct iio_chan_spec *chan,
 }
 
 extern s64 iio_get_time_ns(const struct iio_dev*);
+extern unsigned int iio_get_time_res(const struct iio_dev*);
 
 /* Device operating modes */
 #define INDIO_DIRECT_MODE		0x01
-- 
2.1.4


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [RFC PATCH v1 3/3] iio: make drivers use new timestamping clock API
  2016-02-11 10:04 [RFC PATCH v1 0/3] iio: introduce timestamping clock selection Gregor Boirie
  2016-02-11 10:04 ` [RFC PATCH v1 1/3] iio:core: timestamping clock selection support Gregor Boirie
  2016-02-11 10:04 ` [RFC PATCH v1 2/3] iio:core: timestamping clock resolution support Gregor Boirie
@ 2016-02-11 10:04 ` Gregor Boirie
  2016-02-13 14:19   ` Jonathan Cameron
  2016-02-13 14:12 ` [RFC PATCH v1 0/3] iio: introduce timestamping clock selection Jonathan Cameron
  3 siblings, 1 reply; 12+ messages in thread
From: Gregor Boirie @ 2016-02-11 10:04 UTC (permalink / raw)
  To: linux-iio; +Cc: jic23, lars, Gregor Boirie

Update IIO drivers to pass IIO device as argument to iio_get_time_ns() and
iio_get_time_res().

Signed-off-by: Gregor Boirie <gregor.boirie@parrot.com>
---
 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/vf610_adc.c                       |  3 ++-
 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/humidity/dht11.c                      | 16 ++++++------
 drivers/iio/imu/inv_mpu6050/inv_mpu_ring.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 +++---
 drivers/iio/light/opt3001.c                       |  4 +--
 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/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             |  2 +-
 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 +-
 drivers/staging/iio/magnetometer/hmc5843_core.c   |  2 +-
 56 files changed, 106 insertions(+), 97 deletions(-)

diff --git a/drivers/iio/accel/bma180.c b/drivers/iio/accel/bma180.c
index f04b884..d5f842b 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();
+	int64_t 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..44a65b7 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 7f4994f..6d6019b 100644
--- a/drivers/iio/accel/mma8452.c
+++ b/drivers/iio/accel/mma8452.c
@@ -718,7 +718,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);
@@ -798,7 +798,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 d803e50..b5c9304 100644
--- a/drivers/iio/adc/ina2xx-adc.c
+++ b/drivers/iio/adc/ina2xx-adc.c
@@ -442,7 +442,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
@@ -483,7 +483,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);
@@ -537,7 +537,7 @@ static int ina2xx_buffer_enable(struct iio_dev *indio_dev)
 	trace_printk("Expected work period: %u us\n", sampling_us);
 	trace_printk("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..e1f5420 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/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 06cd49c..d83b6d3 100644
--- a/drivers/iio/chemical/atlas-ph-sensor.c
+++ b/drivers/iio/chemical/atlas-ph-sensor.c
@@ -185,7 +185,7 @@ static irqreturn_t atlas_trigger_handler(int irq, void *private)
 
 	if (ret > 0)
 		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..41dbe20 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..4535b7e 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..54d1c74 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/humidity/dht11.c b/drivers/iio/humidity/dht11.c
index 96185f8..8dbad4e 100644
--- a/drivers/iio/humidity/dht11.c
+++ b/drivers/iio/humidity/dht11.c
@@ -110,7 +110,8 @@ static unsigned char dht11_decode_byte(char *bits)
 	return ret;
 }
 
-static int dht11_decode(struct dht11 *dht11, int offset)
+static int dht11_decode(const struct iio_dev* iio_dev, struct dht11 *dht11,
+		int offset)
 {
 	int i, t;
 	char bits[DHT11_BITS_PER_READ];
@@ -133,7 +134,7 @@ static int dht11_decode(struct dht11 *dht11, int offset)
 	if (((hum_int + hum_dec + temp_int + temp_dec) & 0xff) != checksum)
 		return -EIO;
 
-	dht11->timestamp = ktime_get_real_ns();
+	dht11->timestamp = iio_get_time_ns(iio_dev);
 	if (hum_int < 20) {  /* DHT22 */
 		dht11->temperature = (((temp_int & 0x7f) << 8) + temp_dec) *
 					((temp_int & 0x80) ? -100 : 100);
@@ -161,7 +162,7 @@ static irqreturn_t dht11_handle_irq(int irq, void *data)
 
 	/* TODO: Consider making the handler safe for IRQ sharing */
 	if (dht11->num_edges < DHT11_EDGES_PER_READ && dht11->num_edges >= 0) {
-		dht11->edges[dht11->num_edges].ts = ktime_get_real_ns();
+		dht11->edges[dht11->num_edges].ts = iio_get_time_ns(iio);
 		dht11->edges[dht11->num_edges++].value =
 						gpio_get_value(dht11->gpio);
 
@@ -180,8 +181,9 @@ static int dht11_read_raw(struct iio_dev *iio_dev,
 	int ret, timeres, offset;
 
 	mutex_lock(&dht11->lock);
-	if (dht11->timestamp + DHT11_DATA_VALID_TIME < ktime_get_real_ns()) {
-		timeres = ktime_get_resolution_ns();
+	if (dht11->timestamp + DHT11_DATA_VALID_TIME <
+	    iio_get_time_ns(iio_dev)) {
+		timeres = iio_get_time_res(iio_dev);
 		if (timeres > DHT11_MIN_TIMERES) {
 			dev_err(dht11->dev, "timeresolution %dns too low\n",
 				timeres);
@@ -231,7 +233,7 @@ static int dht11_read_raw(struct iio_dev *iio_dev,
 		offset = DHT11_EDGES_PREAMBLE +
 				dht11->num_edges - DHT11_EDGES_PER_READ;
 		for (; offset >= 0; --offset) {
-			ret = dht11_decode(dht11, offset);
+			ret = dht11_decode(iio_dev, dht11, offset);
 			if (!ret)
 				break;
 		}
@@ -302,7 +304,7 @@ static int dht11_probe(struct platform_device *pdev)
 		return -EINVAL;
 	}
 
-	dht11->timestamp = ktime_get_real_ns() - DHT11_DATA_VALID_TIME - 1;
+	dht11->timestamp = iio_get_time_ns(iio) - DHT11_DATA_VALID_TIME - 1;
 	dht11->num_edges = -1;
 
 	platform_set_drvdata(pdev, iio);
diff --git a/drivers/iio/imu/inv_mpu6050/inv_mpu_ring.c b/drivers/iio/imu/inv_mpu6050/inv_mpu_ring.c
index ba27e27..5c026a3 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, &timestamp, 1,
 				&st->time_stamp_lock);
 
diff --git a/drivers/iio/light/acpi-als.c b/drivers/iio/light/acpi-als.c
index 60537ec..560757e 100644
--- a/drivers/iio/light/acpi-als.c
+++ b/drivers/iio/light/acpi-als.c
@@ -116,7 +116,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 809a961..041c7d7 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/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 c7885f0c..5e6f537 100644
--- a/drivers/iio/pressure/ms5611_core.c
+++ b/drivers/iio/pressure/ms5611_core.c
@@ -190,7 +190,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 93e29fb..53895eb 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 7939ae6..868789a 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 02e930c..327b9e0 100644
--- a/drivers/staging/iio/accel/sca3000_core.c
+++ b/drivers/staging/iio/accel/sca3000_core.c
@@ -775,7 +775,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 f45ebed..c5b5dd6 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..d5823c2 100644
--- a/drivers/staging/iio/adc/ad7606_ring.c
+++ b/drivers/staging/iio/adc/ad7606_ring.c
@@ -77,7 +77,7 @@ 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 2226051..9f24334 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 5b1c165..4ff425d 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/drivers/staging/iio/magnetometer/hmc5843_core.c b/drivers/staging/iio/magnetometer/hmc5843_core.c
index 9489799..f125953 100644
--- a/drivers/staging/iio/magnetometer/hmc5843_core.c
+++ b/drivers/staging/iio/magnetometer/hmc5843_core.c
@@ -436,7 +436,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);
-- 
2.1.4


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* Re: [RFC PATCH v1 0/3] iio: introduce timestamping clock selection
  2016-02-11 10:04 [RFC PATCH v1 0/3] iio: introduce timestamping clock selection Gregor Boirie
                   ` (2 preceding siblings ...)
  2016-02-11 10:04 ` [RFC PATCH v1 3/3] iio: make drivers use new timestamping clock API Gregor Boirie
@ 2016-02-13 14:12 ` Jonathan Cameron
  3 siblings, 0 replies; 12+ messages in thread
From: Jonathan Cameron @ 2016-02-13 14:12 UTC (permalink / raw)
  To: Gregor Boirie, linux-iio; +Cc: lars

On 11/02/16 10:04, Gregor Boirie wrote:
> First draft implementation of IIO timestamping clock selection support based on
> the following principles :
> * selected timestamping clock is a per-device attribute which the userspace
>   may access through a sysfs file ;
> * a single reference clock is used for both buffered samples and events of a
>   given device at the same time ;
> * userspace may choose amongst the following subset of available POSIX clocks:
>   CLOCK_REALTIME, CLOCK_MONOTONIC, CLOCK_MONOTONIC_RAW, CLOCK_REALTIME_COARSE,
>   CLOCK_MONOTONIC_COARSE, CLOCK_BOOTTIME and CLOCK_TAI ;
> * sample and event timestamps consistency with respect to clock changes is
>   ensured by rejecting the ability to select a new clock as long as an events
>   chrdev is opened or a buffered samples channel is enabled for a given device.
> * no in-kernel API support since AFAIK, consumers work synchronously in direct
>   mode, i.e. timestamping may be peformed using traditional kernel time keeping.
consumers can receive timestamp channels which would be effected by this.
However any given device can only feed one such channel to all consumers so
I think your current approach is fine for now (may need to revisit this at
some future date once we get better front end / back end separation for IIO 
done - as then in theory you might not have a sysfs directory for the IIO
device at all - long way off!)
> 
> Comments are welcome. Regards.
> 
> Gregor Boirie (3):
>   iio:core: timestamping clock selection support
>   iio:core: timestamping clock resolution support
>   iio: make drivers use new timestamping clock API
> 
>  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/vf610_adc.c                       |   3 +-
>  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/humidity/dht11.c                      |  16 +--
>  drivers/iio/iio_core.h                            |   3 +
>  drivers/iio/imu/inv_mpu6050/inv_mpu_ring.c        |   2 +-
>  drivers/iio/industrialio-core.c                   | 130 +++++++++++++++++++++-
>  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 +-
>  drivers/iio/light/opt3001.c                       |   4 +-
>  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/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             |   2 +-
>  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 +-
>  drivers/staging/iio/magnetometer/hmc5843_core.c   |   2 +-
>  include/linux/iio/iio.h                           |  11 +-
>  63 files changed, 264 insertions(+), 113 deletions(-)
> 


^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [RFC PATCH v1 1/3] iio:core: timestamping clock selection support
  2016-02-11 10:04 ` [RFC PATCH v1 1/3] iio:core: timestamping clock selection support Gregor Boirie
@ 2016-02-13 14:14   ` Jonathan Cameron
  2016-02-14 17:43     ` Lars-Peter Clausen
  0 siblings, 1 reply; 12+ messages in thread
From: Jonathan Cameron @ 2016-02-13 14:14 UTC (permalink / raw)
  To: Gregor Boirie, linux-iio; +Cc: lars

On 11/02/16 10:04, Gregor Boirie wrote:
> Adds a new per-device sysfs attribute "clockid" to allow userspace to select a
> particular POSIX clock for buffered samples and events timestamping.
> 
> When read, the attribute file returns a stringifi'ed clockid_t matching the
> currently selected clock.
> Writing a stringifi'ed clockid_t to the attribute file will select the
> corresponding clock for the device.
> 
> 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@parrot.com>
> ---
>  Documentation/ABI/testing/sysfs-bus-iio |   7 +++
>  Documentation/DocBook/iio.tmpl          |   2 +-
>  drivers/iio/iio_core.h                  |   3 +
>  drivers/iio/industrialio-core.c         | 107 ++++++++++++++++++++++++++++++--
>  drivers/iio/industrialio-event.c        |  19 +++++-
>  drivers/iio/industrialio-trigger.c      |   2 +-
>  include/linux/iio/iio.h                 |  10 +--
>  7 files changed, 134 insertions(+), 16 deletions(-)
> 
> diff --git a/Documentation/ABI/testing/sysfs-bus-iio b/Documentation/ABI/testing/sysfs-bus-iio
> index 3c66248..4602006 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/clockid
> +KernelVersion:	4.5
> +Contact:	linux-iio@vger.kernel.org
> +Description:
> +		Identifier (clockid_t) of current posix clock used to timestamp
> +		buffered samples and events for device X.
As it's been written into a sysfs attribute I'd normally prefer to see a
descriptive string for something like this.  What do others think?
clockid_t is clearly fixed abi so this makes reasonable sense.  Are there
other sysfs attributes to select the clock already present elsewhere in the
kernel?
> +
>  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..df47dd4 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/iio_core.h b/drivers/iio/iio_core.h
> index 3598835..a07d2ec 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/industrialio-core.c b/drivers/iio/industrialio-core.c
> index 70cb7eb..97bdb95 100644
> --- a/drivers/iio/industrialio-core.c
> +++ b/drivers/iio/industrialio-core.c
> @@ -174,6 +174,44 @@ ssize_t iio_read_const_attr(struct device *dev,
>  }
>  EXPORT_SYMBOL(iio_read_const_attr);
>  
> +/**
> + * 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 (indio_dev->clock_id) {
> +	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);
> +
>  static int __init iio_init(void)
>  {
>  	int ret;
> @@ -904,11 +942,61 @@ 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_clockid(struct device *dev,
> +                                struct device_attribute *attr, char *buf)
> +{
> +	const struct iio_dev *indio_dev = dev_to_iio_dev(dev);
> +	return sprintf(buf, "%d\n", indio_dev->clock_id);
I was rather expecting this to be a write of the actual string. Looks like
an integer at the moment.
> +}
> +
> +static ssize_t iio_store_clockid(struct device *dev,
> +                                 struct device_attribute *attr,
> +                                 const char *buf, size_t len)
> +{
> +	int ret;
> +	int clk;
> +	struct iio_dev *indio_dev = dev_to_iio_dev(dev);
> +	const struct iio_event_interface *ev_int = indio_dev->event_interface;
> +
> +	ret = kstrtoint(buf, 0, &clk);
> +	if (ret < 0)
> +		return ret;
> +
> +	switch (clk) {
> +	case CLOCK_REALTIME:
> +	case CLOCK_MONOTONIC:
> +	case CLOCK_MONOTONIC_RAW:
> +	case CLOCK_REALTIME_COARSE:
> +	case CLOCK_MONOTONIC_COARSE:
> +	case CLOCK_BOOTTIME:
> +	case CLOCK_TAI:
> +		break;
> +	default:
> +		return -EINVAL;
> +	}
> +
> +	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 = clk;
> +	mutex_unlock(&indio_dev->mlock);
> +
> +	return len;
> +}
> +
> +static DEVICE_ATTR(clockid, S_IRUGO | S_IWUSR,
> +                   iio_show_clockid, iio_store_clockid);
> +
>  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 +1011,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_clockid.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_clockid.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 +1050,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..9480404 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);
!!test_bit
(i.e. no spacing preferred).
> +}
> +
>  /**
>   * 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/include/linux/iio/iio.h b/include/linux/iio/iio.h
> index ce9e9c1..904a5b0 100644
> --- a/include/linux/iio/iio.h
> +++ b/include/linux/iio/iio.h
> @@ -281,13 +281,7 @@ 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();
> -}
> +extern s64 iio_get_time_ns(const struct iio_dev*);
>  
>  /* Device operating modes */
>  #define INDIO_DIRECT_MODE		0x01
> @@ -466,6 +460,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 +501,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;
> 


^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [RFC PATCH v1 3/3] iio: make drivers use new timestamping clock API
  2016-02-11 10:04 ` [RFC PATCH v1 3/3] iio: make drivers use new timestamping clock API Gregor Boirie
@ 2016-02-13 14:19   ` Jonathan Cameron
  2016-02-15  9:11     ` Gregor Boirie
  0 siblings, 1 reply; 12+ messages in thread
From: Jonathan Cameron @ 2016-02-13 14:19 UTC (permalink / raw)
  To: Gregor Boirie, linux-iio; +Cc: lars

On 11/02/16 10:04, Gregor Boirie wrote:
> Update IIO drivers to pass IIO device as argument to iio_get_time_ns() and
> iio_get_time_res().
> 
> Signed-off-by: Gregor Boirie <gregor.boirie@parrot.com>
Clearly you need to be careful to ensure we can build the drivers
when only patch one is applied. I'd be tempted to just merge this
into patch one.  Even more fun with patch 2 vs this.
You could work some nasty macro magic, or go through a double name
change, but given the nature of the patches, perhaps leave them as
is for review and I'll splice them into a single patch at time of
application - uggly but simple ;)

Otherwise looks fine to me.

Jonathan
> ---
>  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/vf610_adc.c                       |  3 ++-
>  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/humidity/dht11.c                      | 16 ++++++------
>  drivers/iio/imu/inv_mpu6050/inv_mpu_ring.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 +++---
>  drivers/iio/light/opt3001.c                       |  4 +--
>  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/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             |  2 +-
>  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 +-
>  drivers/staging/iio/magnetometer/hmc5843_core.c   |  2 +-
>  56 files changed, 106 insertions(+), 97 deletions(-)
> 
> diff --git a/drivers/iio/accel/bma180.c b/drivers/iio/accel/bma180.c
> index f04b884..d5f842b 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();
> +	int64_t 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..44a65b7 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 7f4994f..6d6019b 100644
> --- a/drivers/iio/accel/mma8452.c
> +++ b/drivers/iio/accel/mma8452.c
> @@ -718,7 +718,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);
> @@ -798,7 +798,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 d803e50..b5c9304 100644
> --- a/drivers/iio/adc/ina2xx-adc.c
> +++ b/drivers/iio/adc/ina2xx-adc.c
> @@ -442,7 +442,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
> @@ -483,7 +483,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);
> @@ -537,7 +537,7 @@ static int ina2xx_buffer_enable(struct iio_dev *indio_dev)
>  	trace_printk("Expected work period: %u us\n", sampling_us);
>  	trace_printk("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..e1f5420 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/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 06cd49c..d83b6d3 100644
> --- a/drivers/iio/chemical/atlas-ph-sensor.c
> +++ b/drivers/iio/chemical/atlas-ph-sensor.c
> @@ -185,7 +185,7 @@ static irqreturn_t atlas_trigger_handler(int irq, void *private)
>  
>  	if (ret > 0)
>  		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..41dbe20 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..4535b7e 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..54d1c74 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/humidity/dht11.c b/drivers/iio/humidity/dht11.c
> index 96185f8..8dbad4e 100644
> --- a/drivers/iio/humidity/dht11.c
> +++ b/drivers/iio/humidity/dht11.c
> @@ -110,7 +110,8 @@ static unsigned char dht11_decode_byte(char *bits)
>  	return ret;
>  }
>  
> -static int dht11_decode(struct dht11 *dht11, int offset)
> +static int dht11_decode(const struct iio_dev* iio_dev, struct dht11 *dht11,
> +		int offset)
>  {
>  	int i, t;
>  	char bits[DHT11_BITS_PER_READ];
> @@ -133,7 +134,7 @@ static int dht11_decode(struct dht11 *dht11, int offset)
>  	if (((hum_int + hum_dec + temp_int + temp_dec) & 0xff) != checksum)
>  		return -EIO;
>  
> -	dht11->timestamp = ktime_get_real_ns();
> +	dht11->timestamp = iio_get_time_ns(iio_dev);
>  	if (hum_int < 20) {  /* DHT22 */
>  		dht11->temperature = (((temp_int & 0x7f) << 8) + temp_dec) *
>  					((temp_int & 0x80) ? -100 : 100);
> @@ -161,7 +162,7 @@ static irqreturn_t dht11_handle_irq(int irq, void *data)
>  
>  	/* TODO: Consider making the handler safe for IRQ sharing */
>  	if (dht11->num_edges < DHT11_EDGES_PER_READ && dht11->num_edges >= 0) {
> -		dht11->edges[dht11->num_edges].ts = ktime_get_real_ns();
> +		dht11->edges[dht11->num_edges].ts = iio_get_time_ns(iio);
>  		dht11->edges[dht11->num_edges++].value =
>  						gpio_get_value(dht11->gpio);
>  
> @@ -180,8 +181,9 @@ static int dht11_read_raw(struct iio_dev *iio_dev,
>  	int ret, timeres, offset;
>  
>  	mutex_lock(&dht11->lock);
> -	if (dht11->timestamp + DHT11_DATA_VALID_TIME < ktime_get_real_ns()) {
> -		timeres = ktime_get_resolution_ns();
> +	if (dht11->timestamp + DHT11_DATA_VALID_TIME <
> +	    iio_get_time_ns(iio_dev)) {
> +		timeres = iio_get_time_res(iio_dev);
>  		if (timeres > DHT11_MIN_TIMERES) {
>  			dev_err(dht11->dev, "timeresolution %dns too low\n",
>  				timeres);
> @@ -231,7 +233,7 @@ static int dht11_read_raw(struct iio_dev *iio_dev,
>  		offset = DHT11_EDGES_PREAMBLE +
>  				dht11->num_edges - DHT11_EDGES_PER_READ;
>  		for (; offset >= 0; --offset) {
> -			ret = dht11_decode(dht11, offset);
> +			ret = dht11_decode(iio_dev, dht11, offset);
>  			if (!ret)
>  				break;
>  		}
> @@ -302,7 +304,7 @@ static int dht11_probe(struct platform_device *pdev)
>  		return -EINVAL;
>  	}
>  
> -	dht11->timestamp = ktime_get_real_ns() - DHT11_DATA_VALID_TIME - 1;
> +	dht11->timestamp = iio_get_time_ns(iio) - DHT11_DATA_VALID_TIME - 1;
>  	dht11->num_edges = -1;
>  
>  	platform_set_drvdata(pdev, iio);
> diff --git a/drivers/iio/imu/inv_mpu6050/inv_mpu_ring.c b/drivers/iio/imu/inv_mpu6050/inv_mpu_ring.c
> index ba27e27..5c026a3 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, &timestamp, 1,
>  				&st->time_stamp_lock);
>  
> diff --git a/drivers/iio/light/acpi-als.c b/drivers/iio/light/acpi-als.c
> index 60537ec..560757e 100644
> --- a/drivers/iio/light/acpi-als.c
> +++ b/drivers/iio/light/acpi-als.c
> @@ -116,7 +116,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 809a961..041c7d7 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/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 c7885f0c..5e6f537 100644
> --- a/drivers/iio/pressure/ms5611_core.c
> +++ b/drivers/iio/pressure/ms5611_core.c
> @@ -190,7 +190,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 93e29fb..53895eb 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 7939ae6..868789a 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 02e930c..327b9e0 100644
> --- a/drivers/staging/iio/accel/sca3000_core.c
> +++ b/drivers/staging/iio/accel/sca3000_core.c
> @@ -775,7 +775,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 f45ebed..c5b5dd6 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..d5823c2 100644
> --- a/drivers/staging/iio/adc/ad7606_ring.c
> +++ b/drivers/staging/iio/adc/ad7606_ring.c
> @@ -77,7 +77,7 @@ 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 2226051..9f24334 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 5b1c165..4ff425d 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/drivers/staging/iio/magnetometer/hmc5843_core.c b/drivers/staging/iio/magnetometer/hmc5843_core.c
> index 9489799..f125953 100644
> --- a/drivers/staging/iio/magnetometer/hmc5843_core.c
> +++ b/drivers/staging/iio/magnetometer/hmc5843_core.c
> @@ -436,7 +436,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);
> 


^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [RFC PATCH v1 1/3] iio:core: timestamping clock selection support
  2016-02-13 14:14   ` Jonathan Cameron
@ 2016-02-14 17:43     ` Lars-Peter Clausen
  2016-02-15  9:42       ` Gregor Boirie
  0 siblings, 1 reply; 12+ messages in thread
From: Lars-Peter Clausen @ 2016-02-14 17:43 UTC (permalink / raw)
  To: Jonathan Cameron, Gregor Boirie, linux-iio

On 02/13/2016 03:14 PM, Jonathan Cameron wrote:
> On 11/02/16 10:04, Gregor Boirie wrote:
>> Adds a new per-device sysfs attribute "clockid" to allow userspace to select a
>> particular POSIX clock for buffered samples and events timestamping.
>>
>> When read, the attribute file returns a stringifi'ed clockid_t matching the
>> currently selected clock.
>> Writing a stringifi'ed clockid_t to the attribute file will select the
>> corresponding clock for the device.
>>
>> 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@parrot.com>
>> ---
>>  Documentation/ABI/testing/sysfs-bus-iio |   7 +++
>>  Documentation/DocBook/iio.tmpl          |   2 +-
>>  drivers/iio/iio_core.h                  |   3 +
>>  drivers/iio/industrialio-core.c         | 107 ++++++++++++++++++++++++++++++--
>>  drivers/iio/industrialio-event.c        |  19 +++++-
>>  drivers/iio/industrialio-trigger.c      |   2 +-
>>  include/linux/iio/iio.h                 |  10 +--
>>  7 files changed, 134 insertions(+), 16 deletions(-)
>>
>> diff --git a/Documentation/ABI/testing/sysfs-bus-iio b/Documentation/ABI/testing/sysfs-bus-iio
>> index 3c66248..4602006 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/clockid
>> +KernelVersion:	4.5
>> +Contact:	linux-iio@vger.kernel.org
>> +Description:
>> +		Identifier (clockid_t) of current posix clock used to timestamp
>> +		buffered samples and events for device X.
> As it's been written into a sysfs attribute I'd normally prefer to see a
> descriptive string for something like this.  What do others think?
> clockid_t is clearly fixed abi so this makes reasonable sense.  Are there
> other sysfs attributes to select the clock already present elsewhere in the
> kernel?

Very same thoughts here. clockid_t is already ABI so we don't have to be
afraid exposing values that might change, but at the same time a string
would be more suitable for sysfs.

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [RFC PATCH v1 3/3] iio: make drivers use new timestamping clock API
  2016-02-13 14:19   ` Jonathan Cameron
@ 2016-02-15  9:11     ` Gregor Boirie
  0 siblings, 0 replies; 12+ messages in thread
From: Gregor Boirie @ 2016-02-15  9:11 UTC (permalink / raw)
  To: Jonathan Cameron, linux-iio; +Cc: lars

On 02/13/2016 03:19 PM, Jonathan Cameron wrote:
> On 11/02/16 10:04, Gregor Boirie wrote:
>> Update IIO drivers to pass IIO device as argument to iio_get_time_ns() and
>> iio_get_time_res().
>>
>> Signed-off-by: Gregor Boirie <gregor.boirie@parrot.com>
> Clearly you need to be careful to ensure we can build the drivers
> when only patch one is applied. I'd be tempted to just merge this
> into patch one.  Even more fun with patch 2 vs this.
> You could work some nasty macro magic, or go through a double name
> change, but given the nature of the patches, perhaps leave them as
> is for review and I'll splice them into a single patch at time of
> application - uggly but simple ;)
Ok. I'll merge all 3 patches for final submission.
>
> Otherwise looks fine to me.
>
> Jonathan
>
gregor

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [RFC PATCH v1 1/3] iio:core: timestamping clock selection support
  2016-02-14 17:43     ` Lars-Peter Clausen
@ 2016-02-15  9:42       ` Gregor Boirie
  2016-02-17 19:38         ` Jonathan Cameron
  0 siblings, 1 reply; 12+ messages in thread
From: Gregor Boirie @ 2016-02-15  9:42 UTC (permalink / raw)
  To: Lars-Peter Clausen, Jonathan Cameron, linux-iio

On 02/14/2016 06:43 PM, Lars-Peter Clausen wrote:
> On 02/13/2016 03:14 PM, Jonathan Cameron wrote:
>> On 11/02/16 10:04, Gregor Boirie wrote:
>>> diff --git a/Documentation/ABI/testing/sysfs-bus-iio b/Documentation/ABI/testing/sysfs-bus-iio
>>> index 3c66248..4602006 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/clockid
>>> +KernelVersion:	4.5
>>> +Contact:	linux-iio@vger.kernel.org
>>> +Description:
>>> +		Identifier (clockid_t) of current posix clock used to timestamp
>>> +		buffered samples and events for device X.
>> As it's been written into a sysfs attribute I'd normally prefer to see a
>> descriptive string for something like this.  What do others think?
>> clockid_t is clearly fixed abi so this makes reasonable sense.  Are there
>> other sysfs attributes to select the clock already present elsewhere in the
>> kernel?
> Very same thoughts here. clockid_t is already ABI so we don't have to be
> afraid exposing values that might change, but at the same time a string
> would be more suitable for sysfs.
I was driven by simple userspace implementation at the cost of sysfs 
conventions.
Moreover, no kernel side parsing is needed in this way.
Using a stringifi'ed clockid_t allows trivial clock selection with 
following libiio based
code snippet:
</code>
int err;
...
err = iio_device_attr_write(indio_dev, "clockid", 
STRINGIFY(CLOCK_MONOTONIC));
if (err < 0)
goto error;
<code/>

And even simpler retrieval and use of current clock:
</code>
int             err;
long long       clockid;
struct timespec tspec;
...
err = iio_device_attr_read_longlong(indio_dev, "clockid", &clockid);
if (err < 0)
     goto error;
...
clock_gettime((clockid_t) clockid, &tspec);
...
<code/>

Implementing this with a descriptive string is no big deal anyway. I can 
modify this
part if you feel sysfs conventions respect prevails.

gregor.

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [RFC PATCH v1 1/3] iio:core: timestamping clock selection support
  2016-02-15  9:42       ` Gregor Boirie
@ 2016-02-17 19:38         ` Jonathan Cameron
  2016-02-18  9:25           ` Gregor Boirie
  0 siblings, 1 reply; 12+ messages in thread
From: Jonathan Cameron @ 2016-02-17 19:38 UTC (permalink / raw)
  To: Gregor Boirie, Lars-Peter Clausen, linux-iio

On 15/02/16 09:42, Gregor Boirie wrote:
> On 02/14/2016 06:43 PM, Lars-Peter Clausen wrote:
>> On 02/13/2016 03:14 PM, Jonathan Cameron wrote:
>>> On 11/02/16 10:04, Gregor Boirie wrote:
>>>> diff --git a/Documentation/ABI/testing/sysfs-bus-iio b/Documentation/ABI/testing/sysfs-bus-iio
>>>> index 3c66248..4602006 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/clockid
>>>> +KernelVersion:    4.5
>>>> +Contact:    linux-iio@vger.kernel.org
>>>> +Description:
>>>> +        Identifier (clockid_t) of current posix clock used to timestamp
>>>> +        buffered samples and events for device X.
>>> As it's been written into a sysfs attribute I'd normally prefer to see a
>>> descriptive string for something like this.  What do others think?
>>> clockid_t is clearly fixed abi so this makes reasonable sense.  Are there
>>> other sysfs attributes to select the clock already present elsewhere in the
>>> kernel?
>> Very same thoughts here. clockid_t is already ABI so we don't have to be
>> afraid exposing values that might change, but at the same time a string
>> would be more suitable for sysfs.
> I was driven by simple userspace implementation at the cost of sysfs conventions.
> Moreover, no kernel side parsing is needed in this way.
> Using a stringifi'ed clockid_t allows trivial clock selection with following libiio based
> code snippet:
> </code>
> int err;
> ...
> err = iio_device_attr_write(indio_dev, "clockid", STRINGIFY(CLOCK_MONOTONIC));
> if (err < 0)
> goto error;
> <code/>
> 
> And even simpler retrieval and use of current clock:
> </code>
> int             err;
> long long       clockid;
> struct timespec tspec;
> ...
> err = iio_device_attr_read_longlong(indio_dev, "clockid", &clockid);
> if (err < 0)
>     goto error;
> ...
> clock_gettime((clockid_t) clockid, &tspec);
> ...
> <code/>
> 
> Implementing this with a descriptive string is no big deal anyway. I can modify this
> part if you feel sysfs conventions respect prevails.

Sorry to be a pain, but I think that it is worth the somewhat silly jumping through
hoops to sysfsify it.  Keeping sysfs as 'self documenting' as possible is always a good
aim.

Thanks,

Jonathan
> 
> gregor.
> -- 
> To unsubscribe from this list: send the line "unsubscribe linux-iio" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html


^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [RFC PATCH v1 1/3] iio:core: timestamping clock selection support
  2016-02-17 19:38         ` Jonathan Cameron
@ 2016-02-18  9:25           ` Gregor Boirie
  0 siblings, 0 replies; 12+ messages in thread
From: Gregor Boirie @ 2016-02-18  9:25 UTC (permalink / raw)
  To: Jonathan Cameron, Lars-Peter Clausen, linux-iio

On 02/17/2016 08:38 PM, Jonathan Cameron wrote:
> On 15/02/16 09:42, Gregor Boirie wrote:
>> On 02/14/2016 06:43 PM, Lars-Peter Clausen wrote:
>>> On 02/13/2016 03:14 PM, Jonathan Cameron wrote:
>>>> On 11/02/16 10:04, Gregor Boirie wrote:
>>>>> diff --git a/Documentation/ABI/testing/sysfs-bus-iio b/Documentation/ABI/testing/sysfs-bus-iio
>>>>> index 3c66248..4602006 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/clockid
>>>>> +KernelVersion:    4.5
>>>>> +Contact:    linux-iio@vger.kernel.org
>>>>> +Description:
>>>>> +        Identifier (clockid_t) of current posix clock used to timestamp
>>>>> +        buffered samples and events for device X.
>>>> As it's been written into a sysfs attribute I'd normally prefer to see a
>>>> descriptive string for something like this.  What do others think?
>>>> clockid_t is clearly fixed abi so this makes reasonable sense.  Are there
>>>> other sysfs attributes to select the clock already present elsewhere in the
>>>> kernel?
>>> Very same thoughts here. clockid_t is already ABI so we don't have to be
>>> afraid exposing values that might change, but at the same time a string
>>> would be more suitable for sysfs.
>> I was driven by simple userspace implementation at the cost of sysfs conventions.
>> Moreover, no kernel side parsing is needed in this way.
>> Using a stringifi'ed clockid_t allows trivial clock selection with following libiio based
>> code snippet:
>> </code>
>> int err;
>> ...
>> err = iio_device_attr_write(indio_dev, "clockid", STRINGIFY(CLOCK_MONOTONIC));
>> if (err < 0)
>> goto error;
>> <code/>
>>
>> And even simpler retrieval and use of current clock:
>> </code>
>> int             err;
>> long long       clockid;
>> struct timespec tspec;
>> ...
>> err = iio_device_attr_read_longlong(indio_dev, "clockid", &clockid);
>> if (err < 0)
>>      goto error;
>> ...
>> clock_gettime((clockid_t) clockid, &tspec);
>> ...
>> <code/>
>>
>> Implementing this with a descriptive string is no big deal anyway. I can modify this
>> part if you feel sysfs conventions respect prevails.
> Sorry to be a pain, but I think that it is worth the somewhat silly jumping through
> hoops to sysfsify it.  Keeping sysfs as 'self documenting' as possible is always a good
> aim.
No problem, I just wanted to make sure of this point.

>
> Thanks,
>
> Jonathan
>> gregor.
>> -- 
>> To unsubscribe from this list: send the line "unsubscribe linux-iio" in
>> the body of a message to majordomo@vger.kernel.org
>> More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 12+ messages in thread

end of thread, other threads:[~2016-02-18  9:25 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-02-11 10:04 [RFC PATCH v1 0/3] iio: introduce timestamping clock selection Gregor Boirie
2016-02-11 10:04 ` [RFC PATCH v1 1/3] iio:core: timestamping clock selection support Gregor Boirie
2016-02-13 14:14   ` Jonathan Cameron
2016-02-14 17:43     ` Lars-Peter Clausen
2016-02-15  9:42       ` Gregor Boirie
2016-02-17 19:38         ` Jonathan Cameron
2016-02-18  9:25           ` Gregor Boirie
2016-02-11 10:04 ` [RFC PATCH v1 2/3] iio:core: timestamping clock resolution support Gregor Boirie
2016-02-11 10:04 ` [RFC PATCH v1 3/3] iio: make drivers use new timestamping clock API Gregor Boirie
2016-02-13 14:19   ` Jonathan Cameron
2016-02-15  9:11     ` Gregor Boirie
2016-02-13 14:12 ` [RFC PATCH v1 0/3] iio: introduce timestamping clock selection Jonathan Cameron

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.