Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

iio:core: timestamping clock selection support

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

Following clocks, as listed in clock_gettime(2), are supported:
CLOCK_REALTIME, CLOCK_MONOTONIC, CLOCK_MONOTONIC_RAW,
CLOCK_REALTIME_COARSE, CLOCK_MONOTONIC_COARSE, CLOCK_BOOTTIME and
CLOCK_TAI.

Signed-off-by: Gregor Boirie <gregor.boirie@parrot.com>
Acked-by: Sanchayan Maity <maitysanchayan@gmail.com>
Signed-off-by: Jonathan Cameron <jic23@kernel.org>

authored by

Gregor Boirie and committed by
Jonathan Cameron
bc2b7dab eaaa7ec7

+327 -114
+7
Documentation/ABI/testing/sysfs-bus-iio
··· 32 32 Description of the physical chip / device for device X. 33 33 Typically a part number. 34 34 35 + What: /sys/bus/iio/devices/iio:deviceX/timestamp_clock 36 + KernelVersion: 4.5 37 + Contact: linux-iio@vger.kernel.org 38 + Description: 39 + String identifying current posix clock used to timestamp 40 + buffered samples and events for device X. 41 + 35 42 What: /sys/bus/iio/devices/iio:deviceX/sampling_frequency 36 43 What: /sys/bus/iio/devices/iio:deviceX/buffer/sampling_frequency 37 44 What: /sys/bus/iio/devices/triggerX/sampling_frequency
+1 -1
Documentation/DocBook/iio.tmpl
··· 594 594 595 595 irqreturn_t sensor_iio_pollfunc(int irq, void *p) 596 596 { 597 - pf->timestamp = iio_get_time_ns(); 597 + pf->timestamp = iio_get_time_ns((struct indio_dev *)p); 598 598 return IRQ_WAKE_THREAD; 599 599 } 600 600
+1 -1
drivers/iio/accel/bma180.c
··· 654 654 struct iio_poll_func *pf = p; 655 655 struct iio_dev *indio_dev = pf->indio_dev; 656 656 struct bma180_data *data = iio_priv(indio_dev); 657 - int64_t time_ns = iio_get_time_ns(); 657 + s64 time_ns = iio_get_time_ns(indio_dev); 658 658 int bit, ret, i = 0; 659 659 660 660 mutex_lock(&data->mutex);
+2 -2
drivers/iio/accel/bmc150-accel-core.c
··· 901 901 */ 902 902 if (!irq) { 903 903 data->old_timestamp = data->timestamp; 904 - data->timestamp = iio_get_time_ns(); 904 + data->timestamp = iio_get_time_ns(indio_dev); 905 905 } 906 906 907 907 /* ··· 1303 1303 int i; 1304 1304 1305 1305 data->old_timestamp = data->timestamp; 1306 - data->timestamp = iio_get_time_ns(); 1306 + data->timestamp = iio_get_time_ns(indio_dev); 1307 1307 1308 1308 for (i = 0; i < BMC150_ACCEL_TRIGGERS; i++) { 1309 1309 if (data->triggers[i].enabled) {
+1 -1
drivers/iio/accel/kxcjk-1013.c
··· 1129 1129 struct iio_dev *indio_dev = private; 1130 1130 struct kxcjk1013_data *data = iio_priv(indio_dev); 1131 1131 1132 - data->timestamp = iio_get_time_ns(); 1132 + data->timestamp = iio_get_time_ns(indio_dev); 1133 1133 1134 1134 if (data->dready_trigger_on) 1135 1135 iio_trigger_poll(data->dready_trig);
+2 -1
drivers/iio/accel/mma7455_core.c
··· 97 97 if (ret) 98 98 goto done; 99 99 100 - iio_push_to_buffers_with_timestamp(indio_dev, buf, iio_get_time_ns()); 100 + iio_push_to_buffers_with_timestamp(indio_dev, buf, 101 + iio_get_time_ns(indio_dev)); 101 102 102 103 done: 103 104 iio_trigger_notify_done(indio_dev->trig);
+2 -2
drivers/iio/accel/mma8452.c
··· 917 917 static void mma8452_transient_interrupt(struct iio_dev *indio_dev) 918 918 { 919 919 struct mma8452_data *data = iio_priv(indio_dev); 920 - s64 ts = iio_get_time_ns(); 920 + s64 ts = iio_get_time_ns(indio_dev); 921 921 int src; 922 922 923 923 src = i2c_smbus_read_byte_data(data->client, data->chip_info->ev_src); ··· 997 997 goto done; 998 998 999 999 iio_push_to_buffers_with_timestamp(indio_dev, buffer, 1000 - iio_get_time_ns()); 1000 + iio_get_time_ns(indio_dev)); 1001 1001 1002 1002 done: 1003 1003 iio_trigger_notify_done(indio_dev->trig);
+1 -1
drivers/iio/accel/mma9551.c
··· 391 391 iio_push_event(indio_dev, 392 392 IIO_MOD_EVENT_CODE(IIO_INCLI, 0, (mma_axis + 1), 393 393 IIO_EV_TYPE_ROC, IIO_EV_DIR_RISING), 394 - iio_get_time_ns()); 394 + iio_get_time_ns(indio_dev)); 395 395 396 396 out: 397 397 mutex_unlock(&data->mutex);
+1 -1
drivers/iio/accel/mma9553.c
··· 1001 1001 struct iio_dev *indio_dev = private; 1002 1002 struct mma9553_data *data = iio_priv(indio_dev); 1003 1003 1004 - data->timestamp = iio_get_time_ns(); 1004 + data->timestamp = iio_get_time_ns(indio_dev); 1005 1005 /* 1006 1006 * Since we only configure the interrupt pin when an 1007 1007 * event is enabled, we are sure we have at least
+1 -1
drivers/iio/adc/ad7291.c
··· 115 115 u16 t_status, v_status; 116 116 u16 command; 117 117 int i; 118 - s64 timestamp = iio_get_time_ns(); 118 + s64 timestamp = iio_get_time_ns(indio_dev); 119 119 120 120 if (ad7291_i2c_read(chip, AD7291_T_ALERT_STATUS, &t_status)) 121 121 return IRQ_HANDLED;
+1 -1
drivers/iio/adc/ad7298.c
··· 163 163 goto done; 164 164 165 165 iio_push_to_buffers_with_timestamp(indio_dev, st->rx_buf, 166 - iio_get_time_ns()); 166 + iio_get_time_ns(indio_dev)); 167 167 168 168 done: 169 169 iio_trigger_notify_done(indio_dev->trig);
+1 -1
drivers/iio/adc/ad7476.c
··· 70 70 goto done; 71 71 72 72 iio_push_to_buffers_with_timestamp(indio_dev, st->data, 73 - iio_get_time_ns()); 73 + iio_get_time_ns(indio_dev)); 74 74 done: 75 75 iio_trigger_notify_done(indio_dev->trig); 76 76
+1 -1
drivers/iio/adc/ad7887.c
··· 122 122 goto done; 123 123 124 124 iio_push_to_buffers_with_timestamp(indio_dev, st->data, 125 - iio_get_time_ns()); 125 + iio_get_time_ns(indio_dev)); 126 126 done: 127 127 iio_trigger_notify_done(indio_dev->trig); 128 128
+1 -1
drivers/iio/adc/ad7923.c
··· 181 181 goto done; 182 182 183 183 iio_push_to_buffers_with_timestamp(indio_dev, st->rx_buf, 184 - iio_get_time_ns()); 184 + iio_get_time_ns(indio_dev)); 185 185 186 186 done: 187 187 iio_trigger_notify_done(indio_dev->trig);
+2 -2
drivers/iio/adc/ad799x.c
··· 212 212 goto out; 213 213 214 214 iio_push_to_buffers_with_timestamp(indio_dev, st->rx_buf, 215 - iio_get_time_ns()); 215 + iio_get_time_ns(indio_dev)); 216 216 out: 217 217 iio_trigger_notify_done(indio_dev->trig); 218 218 ··· 502 502 (i >> 1), 503 503 IIO_EV_TYPE_THRESH, 504 504 IIO_EV_DIR_FALLING), 505 - iio_get_time_ns()); 505 + iio_get_time_ns(indio_dev)); 506 506 } 507 507 508 508 done:
+1 -1
drivers/iio/adc/cc10001_adc.c
··· 186 186 187 187 if (!sample_invalid) 188 188 iio_push_to_buffers_with_timestamp(indio_dev, data, 189 - iio_get_time_ns()); 189 + iio_get_time_ns(indio_dev)); 190 190 iio_trigger_notify_done(indio_dev->trig); 191 191 192 192 return IRQ_HANDLED;
+1 -1
drivers/iio/adc/hi8435.c
··· 400 400 iio_push_event(idev, 401 401 IIO_UNMOD_EVENT_CODE(IIO_VOLTAGE, i, 402 402 IIO_EV_TYPE_THRESH, dir), 403 - iio_get_time_ns()); 403 + iio_get_time_ns(idev)); 404 404 } 405 405 } 406 406
+3 -3
drivers/iio/adc/ina2xx-adc.c
··· 465 465 s64 time_a, time_b; 466 466 unsigned int alert; 467 467 468 - time_a = iio_get_time_ns(); 468 + time_a = iio_get_time_ns(indio_dev); 469 469 470 470 /* 471 471 * Because the timer thread and the chip conversion clock ··· 504 504 data[i++] = val; 505 505 } 506 506 507 - time_b = iio_get_time_ns(); 507 + time_b = iio_get_time_ns(indio_dev); 508 508 509 509 iio_push_to_buffers_with_timestamp(indio_dev, 510 510 (unsigned int *)data, time_a); ··· 554 554 dev_dbg(&indio_dev->dev, "Async readout mode: %d\n", 555 555 chip->allow_async_readout); 556 556 557 - chip->prev_ns = iio_get_time_ns(); 557 + chip->prev_ns = iio_get_time_ns(indio_dev); 558 558 559 559 chip->task = kthread_run(ina2xx_capture_thread, (void *)indio_dev, 560 560 "%s:%d-%uus", indio_dev->name, indio_dev->id,
+3 -2
drivers/iio/adc/max1363.c
··· 788 788 { 789 789 struct iio_dev *indio_dev = private; 790 790 struct max1363_state *st = iio_priv(indio_dev); 791 - s64 timestamp = iio_get_time_ns(); 791 + s64 timestamp = iio_get_time_ns(indio_dev); 792 792 unsigned long mask, loc; 793 793 u8 rx; 794 794 u8 tx[2] = { st->setupbyte, ··· 1506 1506 if (b_sent < 0) 1507 1507 goto done_free; 1508 1508 1509 - iio_push_to_buffers_with_timestamp(indio_dev, rxbuf, iio_get_time_ns()); 1509 + iio_push_to_buffers_with_timestamp(indio_dev, rxbuf, 1510 + iio_get_time_ns(indio_dev)); 1510 1511 1511 1512 done_free: 1512 1513 kfree(rxbuf);
+2 -1
drivers/iio/adc/ti-adc081c.c
··· 139 139 if (ret < 0) 140 140 goto out; 141 141 buf[0] = ret; 142 - iio_push_to_buffers_with_timestamp(indio_dev, buf, iio_get_time_ns()); 142 + iio_push_to_buffers_with_timestamp(indio_dev, buf, 143 + iio_get_time_ns(indio_dev)); 143 144 out: 144 145 iio_trigger_notify_done(indio_dev->trig); 145 146 return IRQ_HANDLED;
+2 -1
drivers/iio/adc/ti-ads1015.c
··· 288 288 buf[0] = res; 289 289 mutex_unlock(&data->lock); 290 290 291 - iio_push_to_buffers_with_timestamp(indio_dev, buf, iio_get_time_ns()); 291 + iio_push_to_buffers_with_timestamp(indio_dev, buf, 292 + iio_get_time_ns(indio_dev)); 292 293 293 294 err: 294 295 iio_trigger_notify_done(indio_dev->trig);
+2 -1
drivers/iio/adc/vf610_adc.c
··· 594 594 if (iio_buffer_enabled(indio_dev)) { 595 595 info->buffer[0] = info->value; 596 596 iio_push_to_buffers_with_timestamp(indio_dev, 597 - info->buffer, iio_get_time_ns()); 597 + info->buffer, 598 + iio_get_time_ns(indio_dev)); 598 599 iio_trigger_notify_done(indio_dev->trig); 599 600 } else 600 601 complete(&info->completion);
+2 -2
drivers/iio/adc/xilinx-xadc-events.c
··· 46 46 iio_push_event(indio_dev, 47 47 IIO_UNMOD_EVENT_CODE(chan->type, chan->channel, 48 48 IIO_EV_TYPE_THRESH, IIO_EV_DIR_RISING), 49 - iio_get_time_ns()); 49 + iio_get_time_ns(indio_dev)); 50 50 } else { 51 51 /* 52 52 * For other channels we don't know whether it is a upper or ··· 56 56 iio_push_event(indio_dev, 57 57 IIO_UNMOD_EVENT_CODE(chan->type, chan->channel, 58 58 IIO_EV_TYPE_THRESH, IIO_EV_DIR_EITHER), 59 - iio_get_time_ns()); 59 + iio_get_time_ns(indio_dev)); 60 60 } 61 61 } 62 62
+1 -1
drivers/iio/chemical/atlas-ph-sensor.c
··· 343 343 344 344 if (!ret) 345 345 iio_push_to_buffers_with_timestamp(indio_dev, data->buffer, 346 - iio_get_time_ns()); 346 + iio_get_time_ns(indio_dev)); 347 347 348 348 iio_trigger_notify_done(indio_dev->trig); 349 349
+1 -1
drivers/iio/common/st_sensors/st_sensors_buffer.c
··· 62 62 if (sdata->hw_irq_trigger) 63 63 timestamp = sdata->hw_timestamp; 64 64 else 65 - timestamp = iio_get_time_ns(); 65 + timestamp = iio_get_time_ns(indio_dev); 66 66 67 67 len = st_sensors_get_buffer_element(indio_dev, sdata->buffer_data); 68 68 if (len < 0)
+1 -1
drivers/iio/common/st_sensors/st_sensors_trigger.c
··· 29 29 struct st_sensor_data *sdata = iio_priv(indio_dev); 30 30 31 31 /* Get the time stamp as close in time as possible */ 32 - sdata->hw_timestamp = iio_get_time_ns(); 32 + sdata->hw_timestamp = iio_get_time_ns(indio_dev); 33 33 return IRQ_WAKE_THREAD; 34 34 } 35 35
+3 -3
drivers/iio/dac/ad5421.c
··· 242 242 0, 243 243 IIO_EV_TYPE_THRESH, 244 244 IIO_EV_DIR_RISING), 245 - iio_get_time_ns()); 245 + iio_get_time_ns(indio_dev)); 246 246 } 247 247 248 248 if (events & AD5421_FAULT_UNDER_CURRENT) { ··· 251 251 0, 252 252 IIO_EV_TYPE_THRESH, 253 253 IIO_EV_DIR_FALLING), 254 - iio_get_time_ns()); 254 + iio_get_time_ns(indio_dev)); 255 255 } 256 256 257 257 if (events & AD5421_FAULT_TEMP_OVER_140) { ··· 260 260 0, 261 261 IIO_EV_TYPE_MAG, 262 262 IIO_EV_DIR_RISING), 263 - iio_get_time_ns()); 263 + iio_get_time_ns(indio_dev)); 264 264 } 265 265 266 266 old_fault = fault;
+1 -1
drivers/iio/dac/ad5504.c
··· 223 223 0, 224 224 IIO_EV_TYPE_THRESH, 225 225 IIO_EV_DIR_RISING), 226 - iio_get_time_ns()); 226 + iio_get_time_ns((struct iio_dev *)private)); 227 227 228 228 return IRQ_HANDLED; 229 229 }
+2 -1
drivers/iio/dummy/iio_simple_dummy_buffer.c
··· 85 85 } 86 86 } 87 87 88 - iio_push_to_buffers_with_timestamp(indio_dev, data, iio_get_time_ns()); 88 + iio_push_to_buffers_with_timestamp(indio_dev, data, 89 + iio_get_time_ns(indio_dev)); 89 90 90 91 kfree(data); 91 92
+1 -1
drivers/iio/dummy/iio_simple_dummy_events.c
··· 158 158 struct iio_dev *indio_dev = private; 159 159 struct iio_dummy_state *st = iio_priv(indio_dev); 160 160 161 - st->event_timestamp = iio_get_time_ns(); 161 + st->event_timestamp = iio_get_time_ns(indio_dev); 162 162 return IRQ_WAKE_THREAD; 163 163 } 164 164
+15 -15
drivers/iio/gyro/bmg160_core.c
··· 885 885 886 886 if (val & BMG160_ANY_MOTION_BIT_X) 887 887 iio_push_event(indio_dev, IIO_MOD_EVENT_CODE(IIO_ANGL_VEL, 888 - 0, 889 - IIO_MOD_X, 890 - IIO_EV_TYPE_ROC, 891 - dir), 892 - iio_get_time_ns()); 888 + 0, 889 + IIO_MOD_X, 890 + IIO_EV_TYPE_ROC, 891 + dir), 892 + iio_get_time_ns(indio_dev)); 893 893 if (val & BMG160_ANY_MOTION_BIT_Y) 894 894 iio_push_event(indio_dev, IIO_MOD_EVENT_CODE(IIO_ANGL_VEL, 895 - 0, 896 - IIO_MOD_Y, 897 - IIO_EV_TYPE_ROC, 898 - dir), 899 - iio_get_time_ns()); 895 + 0, 896 + IIO_MOD_Y, 897 + IIO_EV_TYPE_ROC, 898 + dir), 899 + iio_get_time_ns(indio_dev)); 900 900 if (val & BMG160_ANY_MOTION_BIT_Z) 901 901 iio_push_event(indio_dev, IIO_MOD_EVENT_CODE(IIO_ANGL_VEL, 902 - 0, 903 - IIO_MOD_Z, 904 - IIO_EV_TYPE_ROC, 905 - dir), 906 - iio_get_time_ns()); 902 + 0, 903 + IIO_MOD_Z, 904 + IIO_EV_TYPE_ROC, 905 + dir), 906 + iio_get_time_ns(indio_dev)); 907 907 908 908 ack_intr_status: 909 909 if (!data->dready_trigger_on) {
+3
drivers/iio/iio_core.h
··· 79 79 void iio_device_wakeup_eventset(struct iio_dev *indio_dev); 80 80 int iio_event_getfd(struct iio_dev *indio_dev); 81 81 82 + struct iio_event_interface; 83 + bool iio_event_enabled(const struct iio_event_interface *ev_int); 84 + 82 85 #endif
+2 -1
drivers/iio/imu/bmi160/bmi160_core.c
··· 411 411 buf[j++] = sample; 412 412 } 413 413 414 - iio_push_to_buffers_with_timestamp(indio_dev, buf, iio_get_time_ns()); 414 + iio_push_to_buffers_with_timestamp(indio_dev, buf, 415 + iio_get_time_ns(indio_dev)); 415 416 done: 416 417 iio_trigger_notify_done(indio_dev->trig); 417 418 return IRQ_HANDLED;
+1 -1
drivers/iio/imu/inv_mpu6050/inv_mpu_ring.c
··· 107 107 struct inv_mpu6050_state *st = iio_priv(indio_dev); 108 108 s64 timestamp; 109 109 110 - timestamp = iio_get_time_ns(); 110 + timestamp = iio_get_time_ns(indio_dev); 111 111 kfifo_in_spinlocked(&st->timestamps, &timestamp, 1, 112 112 &st->time_stamp_lock); 113 113
+175 -4
drivers/iio/industrialio-core.c
··· 178 178 } 179 179 EXPORT_SYMBOL(iio_read_const_attr); 180 180 181 + static int iio_device_set_clock(struct iio_dev *indio_dev, clockid_t clock_id) 182 + { 183 + int ret; 184 + const struct iio_event_interface *ev_int = indio_dev->event_interface; 185 + 186 + ret = mutex_lock_interruptible(&indio_dev->mlock); 187 + if (ret) 188 + return ret; 189 + if ((ev_int && iio_event_enabled(ev_int)) || 190 + iio_buffer_enabled(indio_dev)) { 191 + mutex_unlock(&indio_dev->mlock); 192 + return -EBUSY; 193 + } 194 + indio_dev->clock_id = clock_id; 195 + mutex_unlock(&indio_dev->mlock); 196 + 197 + return 0; 198 + } 199 + 200 + /** 201 + * iio_get_time_ns() - utility function to get a time stamp for events etc 202 + * @indio_dev: device 203 + */ 204 + s64 iio_get_time_ns(const struct iio_dev *indio_dev) 205 + { 206 + struct timespec tp; 207 + 208 + switch (iio_device_get_clock(indio_dev)) { 209 + case CLOCK_REALTIME: 210 + ktime_get_real_ts(&tp); 211 + break; 212 + case CLOCK_MONOTONIC: 213 + ktime_get_ts(&tp); 214 + break; 215 + case CLOCK_MONOTONIC_RAW: 216 + getrawmonotonic(&tp); 217 + break; 218 + case CLOCK_REALTIME_COARSE: 219 + tp = current_kernel_time(); 220 + break; 221 + case CLOCK_MONOTONIC_COARSE: 222 + tp = get_monotonic_coarse(); 223 + break; 224 + case CLOCK_BOOTTIME: 225 + get_monotonic_boottime(&tp); 226 + break; 227 + case CLOCK_TAI: 228 + timekeeping_clocktai(&tp); 229 + break; 230 + default: 231 + BUG(); 232 + } 233 + 234 + return timespec_to_ns(&tp); 235 + } 236 + EXPORT_SYMBOL(iio_get_time_ns); 237 + 238 + /** 239 + * iio_get_time_res() - utility function to get time stamp clock resolution in 240 + * nano seconds. 241 + * @indio_dev: device 242 + */ 243 + unsigned int iio_get_time_res(const struct iio_dev *indio_dev) 244 + { 245 + switch (iio_device_get_clock(indio_dev)) { 246 + case CLOCK_REALTIME: 247 + case CLOCK_MONOTONIC: 248 + case CLOCK_MONOTONIC_RAW: 249 + case CLOCK_BOOTTIME: 250 + case CLOCK_TAI: 251 + return hrtimer_resolution; 252 + case CLOCK_REALTIME_COARSE: 253 + case CLOCK_MONOTONIC_COARSE: 254 + return LOW_RES_NSEC; 255 + default: 256 + BUG(); 257 + } 258 + } 259 + EXPORT_SYMBOL(iio_get_time_res); 260 + 181 261 static int __init iio_init(void) 182 262 { 183 263 int ret; ··· 1070 990 1071 991 static DEVICE_ATTR(name, S_IRUGO, iio_show_dev_name, NULL); 1072 992 993 + static ssize_t iio_show_timestamp_clock(struct device *dev, 994 + struct device_attribute *attr, 995 + char *buf) 996 + { 997 + const struct iio_dev *indio_dev = dev_to_iio_dev(dev); 998 + const clockid_t clk = iio_device_get_clock(indio_dev); 999 + const char *name; 1000 + ssize_t sz; 1001 + 1002 + switch (clk) { 1003 + case CLOCK_REALTIME: 1004 + name = "realtime\n"; 1005 + sz = sizeof("realtime\n"); 1006 + break; 1007 + case CLOCK_MONOTONIC: 1008 + name = "monotonic\n"; 1009 + sz = sizeof("monotonic\n"); 1010 + break; 1011 + case CLOCK_MONOTONIC_RAW: 1012 + name = "monotonic_raw\n"; 1013 + sz = sizeof("monotonic_raw\n"); 1014 + break; 1015 + case CLOCK_REALTIME_COARSE: 1016 + name = "realtime_coarse\n"; 1017 + sz = sizeof("realtime_coarse\n"); 1018 + break; 1019 + case CLOCK_MONOTONIC_COARSE: 1020 + name = "monotonic_coarse\n"; 1021 + sz = sizeof("monotonic_coarse\n"); 1022 + break; 1023 + case CLOCK_BOOTTIME: 1024 + name = "boottime\n"; 1025 + sz = sizeof("boottime\n"); 1026 + break; 1027 + case CLOCK_TAI: 1028 + name = "tai\n"; 1029 + sz = sizeof("tai\n"); 1030 + break; 1031 + default: 1032 + BUG(); 1033 + } 1034 + 1035 + memcpy(buf, name, sz); 1036 + return sz; 1037 + } 1038 + 1039 + static ssize_t iio_store_timestamp_clock(struct device *dev, 1040 + struct device_attribute *attr, 1041 + const char *buf, size_t len) 1042 + { 1043 + clockid_t clk; 1044 + int ret; 1045 + 1046 + if (sysfs_streq(buf, "realtime")) 1047 + clk = CLOCK_REALTIME; 1048 + else if (sysfs_streq(buf, "monotonic")) 1049 + clk = CLOCK_MONOTONIC; 1050 + else if (sysfs_streq(buf, "monotonic_raw")) 1051 + clk = CLOCK_MONOTONIC_RAW; 1052 + else if (sysfs_streq(buf, "realtime_coarse")) 1053 + clk = CLOCK_REALTIME_COARSE; 1054 + else if (sysfs_streq(buf, "monotonic_coarse")) 1055 + clk = CLOCK_MONOTONIC_COARSE; 1056 + else if (sysfs_streq(buf, "boottime")) 1057 + clk = CLOCK_BOOTTIME; 1058 + else if (sysfs_streq(buf, "tai")) 1059 + clk = CLOCK_TAI; 1060 + else 1061 + return -EINVAL; 1062 + 1063 + ret = iio_device_set_clock(dev_to_iio_dev(dev), clk); 1064 + if (ret) 1065 + return ret; 1066 + 1067 + return len; 1068 + } 1069 + 1070 + static DEVICE_ATTR(current_timestamp_clock, S_IRUGO | S_IWUSR, 1071 + iio_show_timestamp_clock, iio_store_timestamp_clock); 1072 + 1073 1073 static int iio_device_register_sysfs(struct iio_dev *indio_dev) 1074 1074 { 1075 1075 int i, ret = 0, attrcount, attrn, attrcount_orig = 0; 1076 1076 struct iio_dev_attr *p; 1077 - struct attribute **attr; 1077 + struct attribute **attr, *clk = NULL; 1078 1078 1079 1079 /* First count elements in any existing group */ 1080 1080 if (indio_dev->info->attrs) { ··· 1169 1009 */ 1170 1010 if (indio_dev->channels) 1171 1011 for (i = 0; i < indio_dev->num_channels; i++) { 1172 - ret = iio_device_add_channel_sysfs(indio_dev, 1173 - &indio_dev 1174 - ->channels[i]); 1012 + const struct iio_chan_spec *chan = 1013 + &indio_dev->channels[i]; 1014 + 1015 + if (chan->type == IIO_TIMESTAMP) 1016 + clk = &dev_attr_current_timestamp_clock.attr; 1017 + 1018 + ret = iio_device_add_channel_sysfs(indio_dev, chan); 1175 1019 if (ret < 0) 1176 1020 goto error_clear_attrs; 1177 1021 attrcount += ret; 1178 1022 } 1179 1023 1024 + if (indio_dev->event_interface) 1025 + clk = &dev_attr_current_timestamp_clock.attr; 1026 + 1180 1027 if (indio_dev->name) 1028 + attrcount++; 1029 + if (clk) 1181 1030 attrcount++; 1182 1031 1183 1032 indio_dev->chan_attr_group.attrs = kcalloc(attrcount + 1, ··· 1208 1039 indio_dev->chan_attr_group.attrs[attrn++] = &p->dev_attr.attr; 1209 1040 if (indio_dev->name) 1210 1041 indio_dev->chan_attr_group.attrs[attrn++] = &dev_attr_name.attr; 1042 + if (clk) 1043 + indio_dev->chan_attr_group.attrs[attrn++] = clk; 1211 1044 1212 1045 indio_dev->groups[indio_dev->groupcounter++] = 1213 1046 &indio_dev->chan_attr_group;
+16 -3
drivers/iio/industrialio-event.c
··· 44 44 struct mutex read_lock; 45 45 }; 46 46 47 + bool iio_event_enabled(const struct iio_event_interface *ev_int) 48 + { 49 + return !!test_bit(IIO_BUSY_BIT_POS, &ev_int->flags); 50 + } 51 + 47 52 /** 48 53 * iio_push_event() - try to add event to the list for userspace reading 49 54 * @indio_dev: IIO device structure ··· 65 60 int copied; 66 61 67 62 /* Does anyone care? */ 68 - if (test_bit(IIO_BUSY_BIT_POS, &ev_int->flags)) { 63 + if (iio_event_enabled(ev_int)) { 69 64 70 65 ev.id = ev_code; 71 66 ev.timestamp = timestamp; ··· 185 180 if (ev_int == NULL) 186 181 return -ENODEV; 187 182 188 - if (test_and_set_bit(IIO_BUSY_BIT_POS, &ev_int->flags)) 189 - return -EBUSY; 183 + fd = mutex_lock_interruptible(&indio_dev->mlock); 184 + if (fd) 185 + return fd; 186 + 187 + if (test_and_set_bit(IIO_BUSY_BIT_POS, &ev_int->flags)) { 188 + fd = -EBUSY; 189 + goto unlock; 190 + } 190 191 191 192 iio_device_get(indio_dev); 192 193 ··· 205 194 kfifo_reset_out(&ev_int->det_events); 206 195 } 207 196 197 + unlock: 198 + mutex_unlock(&indio_dev->mlock); 208 199 return fd; 209 200 } 210 201
+1 -1
drivers/iio/industrialio-trigger.c
··· 289 289 irqreturn_t iio_pollfunc_store_time(int irq, void *p) 290 290 { 291 291 struct iio_poll_func *pf = p; 292 - pf->timestamp = iio_get_time_ns(); 292 + pf->timestamp = iio_get_time_ns(pf->indio_dev); 293 293 return IRQ_WAKE_THREAD; 294 294 } 295 295 EXPORT_SYMBOL(iio_pollfunc_store_time);
+1 -1
drivers/iio/light/acpi-als.c
··· 118 118 struct iio_dev *indio_dev = acpi_driver_data(device); 119 119 struct acpi_als *als = iio_priv(indio_dev); 120 120 s32 *buffer = als->evt_buffer; 121 - s64 time_ns = iio_get_time_ns(); 121 + s64 time_ns = iio_get_time_ns(indio_dev); 122 122 s32 val; 123 123 int ret; 124 124
+1 -1
drivers/iio/light/adjd_s311.c
··· 118 118 struct iio_poll_func *pf = p; 119 119 struct iio_dev *indio_dev = pf->indio_dev; 120 120 struct adjd_s311_data *data = iio_priv(indio_dev); 121 - s64 time_ns = iio_get_time_ns(); 121 + s64 time_ns = iio_get_time_ns(indio_dev); 122 122 int i, j = 0; 123 123 124 124 int ret = adjd_s311_req_data(indio_dev);
+1 -1
drivers/iio/light/apds9300.c
··· 396 396 IIO_UNMOD_EVENT_CODE(IIO_INTENSITY, 0, 397 397 IIO_EV_TYPE_THRESH, 398 398 IIO_EV_DIR_EITHER), 399 - iio_get_time_ns()); 399 + iio_get_time_ns(dev_info)); 400 400 401 401 apds9300_clear_intr(data); 402 402
+2 -2
drivers/iio/light/apds9960.c
··· 807 807 IIO_UNMOD_EVENT_CODE(IIO_INTENSITY, 0, 808 808 IIO_EV_TYPE_THRESH, 809 809 IIO_EV_DIR_EITHER), 810 - iio_get_time_ns()); 810 + iio_get_time_ns(indio_dev)); 811 811 regmap_write(data->regmap, APDS9960_REG_CICLEAR, 1); 812 812 } 813 813 ··· 816 816 IIO_UNMOD_EVENT_CODE(IIO_PROXIMITY, 0, 817 817 IIO_EV_TYPE_THRESH, 818 818 IIO_EV_DIR_EITHER), 819 - iio_get_time_ns()); 819 + iio_get_time_ns(indio_dev)); 820 820 regmap_write(data->regmap, APDS9960_REG_PICLEAR, 1); 821 821 } 822 822
+1 -1
drivers/iio/light/cm36651.c
··· 268 268 CM36651_CMD_READ_RAW_PROXIMITY, 269 269 IIO_EV_TYPE_THRESH, ev_dir); 270 270 271 - iio_push_event(indio_dev, ev_code, iio_get_time_ns()); 271 + iio_push_event(indio_dev, ev_code, iio_get_time_ns(indio_dev)); 272 272 273 273 return IRQ_HANDLED; 274 274 }
+4 -4
drivers/iio/light/gp2ap020a00f.c
··· 851 851 GP2AP020A00F_SCAN_MODE_PROXIMITY, 852 852 IIO_EV_TYPE_ROC, 853 853 IIO_EV_DIR_RISING), 854 - iio_get_time_ns()); 854 + iio_get_time_ns(indio_dev)); 855 855 } else { 856 856 iio_push_event(indio_dev, 857 857 IIO_UNMOD_EVENT_CODE( ··· 859 859 GP2AP020A00F_SCAN_MODE_PROXIMITY, 860 860 IIO_EV_TYPE_ROC, 861 861 IIO_EV_DIR_FALLING), 862 - iio_get_time_ns()); 862 + iio_get_time_ns(indio_dev)); 863 863 } 864 864 } 865 865 ··· 925 925 IIO_MOD_LIGHT_CLEAR, 926 926 IIO_EV_TYPE_THRESH, 927 927 IIO_EV_DIR_RISING), 928 - iio_get_time_ns()); 928 + iio_get_time_ns(indio_dev)); 929 929 } 930 930 931 931 if (test_bit(GP2AP020A00F_FLAG_ALS_FALLING_EV, &priv->flags)) { ··· 939 939 IIO_MOD_LIGHT_CLEAR, 940 940 IIO_EV_TYPE_THRESH, 941 941 IIO_EV_DIR_FALLING), 942 - iio_get_time_ns()); 942 + iio_get_time_ns(indio_dev)); 943 943 } 944 944 } 945 945
+1 -1
drivers/iio/light/isl29125.c
··· 188 188 } 189 189 190 190 iio_push_to_buffers_with_timestamp(indio_dev, data->buffer, 191 - iio_get_time_ns()); 191 + iio_get_time_ns(indio_dev)); 192 192 193 193 done: 194 194 iio_trigger_notify_done(indio_dev->trig);
+1 -1
drivers/iio/light/lm3533-als.c
··· 267 267 0, 268 268 IIO_EV_TYPE_THRESH, 269 269 IIO_EV_DIR_EITHER), 270 - iio_get_time_ns()); 270 + iio_get_time_ns(indio_dev)); 271 271 out: 272 272 return IRQ_HANDLED; 273 273 }
+4 -3
drivers/iio/light/ltr501.c
··· 1256 1256 buf[j++] = psdata & LTR501_PS_DATA_MASK; 1257 1257 } 1258 1258 1259 - iio_push_to_buffers_with_timestamp(indio_dev, buf, iio_get_time_ns()); 1259 + iio_push_to_buffers_with_timestamp(indio_dev, buf, 1260 + iio_get_time_ns(indio_dev)); 1260 1261 1261 1262 done: 1262 1263 iio_trigger_notify_done(indio_dev->trig); ··· 1283 1282 IIO_UNMOD_EVENT_CODE(IIO_INTENSITY, 0, 1284 1283 IIO_EV_TYPE_THRESH, 1285 1284 IIO_EV_DIR_EITHER), 1286 - iio_get_time_ns()); 1285 + iio_get_time_ns(indio_dev)); 1287 1286 1288 1287 if (status & LTR501_STATUS_PS_INTR) 1289 1288 iio_push_event(indio_dev, 1290 1289 IIO_UNMOD_EVENT_CODE(IIO_PROXIMITY, 0, 1291 1290 IIO_EV_TYPE_THRESH, 1292 1291 IIO_EV_DIR_EITHER), 1293 - iio_get_time_ns()); 1292 + iio_get_time_ns(indio_dev)); 1294 1293 1295 1294 return IRQ_HANDLED; 1296 1295 }
+2 -1
drivers/iio/light/max44000.c
··· 511 511 } 512 512 mutex_unlock(&data->lock); 513 513 514 - iio_push_to_buffers_with_timestamp(indio_dev, buf, iio_get_time_ns()); 514 + iio_push_to_buffers_with_timestamp(indio_dev, buf, 515 + iio_get_time_ns(indio_dev)); 515 516 iio_trigger_notify_done(indio_dev->trig); 516 517 return IRQ_HANDLED; 517 518
+2 -2
drivers/iio/light/opt3001.c
··· 713 713 IIO_UNMOD_EVENT_CODE(IIO_LIGHT, 0, 714 714 IIO_EV_TYPE_THRESH, 715 715 IIO_EV_DIR_RISING), 716 - iio_get_time_ns()); 716 + iio_get_time_ns(iio)); 717 717 if (ret & OPT3001_CONFIGURATION_FL) 718 718 iio_push_event(iio, 719 719 IIO_UNMOD_EVENT_CODE(IIO_LIGHT, 0, 720 720 IIO_EV_TYPE_THRESH, 721 721 IIO_EV_DIR_FALLING), 722 - iio_get_time_ns()); 722 + iio_get_time_ns(iio)); 723 723 } else if (ret & OPT3001_CONFIGURATION_CRF) { 724 724 ret = i2c_smbus_read_word_swapped(opt->client, OPT3001_RESULT); 725 725 if (ret < 0) {
+1 -1
drivers/iio/light/stk3310.c
··· 528 528 struct iio_dev *indio_dev = private; 529 529 struct stk3310_data *data = iio_priv(indio_dev); 530 530 531 - data->timestamp = iio_get_time_ns(); 531 + data->timestamp = iio_get_time_ns(indio_dev); 532 532 533 533 return IRQ_WAKE_THREAD; 534 534 }
+1 -1
drivers/iio/light/tcs3414.c
··· 216 216 } 217 217 218 218 iio_push_to_buffers_with_timestamp(indio_dev, data->buffer, 219 - iio_get_time_ns()); 219 + iio_get_time_ns(indio_dev)); 220 220 221 221 done: 222 222 iio_trigger_notify_done(indio_dev->trig);
+1 -1
drivers/iio/light/tcs3472.c
··· 202 202 } 203 203 204 204 iio_push_to_buffers_with_timestamp(indio_dev, data->buffer, 205 - iio_get_time_ns()); 205 + iio_get_time_ns(indio_dev)); 206 206 207 207 done: 208 208 iio_trigger_notify_done(indio_dev->trig);
+1 -1
drivers/iio/light/tsl2563.c
··· 630 630 0, 631 631 IIO_EV_TYPE_THRESH, 632 632 IIO_EV_DIR_EITHER), 633 - iio_get_time_ns()); 633 + iio_get_time_ns(dev_info)); 634 634 635 635 /* clear the interrupt and push the event */ 636 636 i2c_smbus_write_byte(chip->client, TSL2563_CMD | TSL2563_CLEARINT);
+1 -1
drivers/iio/light/us5182d.c
··· 833 833 dir = ret & US5182D_CFG0_PROX ? IIO_EV_DIR_RISING : IIO_EV_DIR_FALLING; 834 834 ev = IIO_UNMOD_EVENT_CODE(IIO_PROXIMITY, 1, IIO_EV_TYPE_THRESH, dir); 835 835 836 - iio_push_event(indio_dev, ev, iio_get_time_ns()); 836 + iio_push_event(indio_dev, ev, iio_get_time_ns(indio_dev)); 837 837 838 838 ret = i2c_smbus_write_byte_data(data->client, US5182D_REG_CFG0, 839 839 ret & ~US5182D_CFG0_PX_IRQ);
+2 -1
drivers/iio/magnetometer/ak8975.c
··· 829 829 buff[1] = clamp_t(s16, le16_to_cpu(buff[1]), -def->range, def->range); 830 830 buff[2] = clamp_t(s16, le16_to_cpu(buff[2]), -def->range, def->range); 831 831 832 - iio_push_to_buffers_with_timestamp(indio_dev, buff, iio_get_time_ns()); 832 + iio_push_to_buffers_with_timestamp(indio_dev, buff, 833 + iio_get_time_ns(indio_dev)); 833 834 return; 834 835 835 836 unlock:
+1 -1
drivers/iio/magnetometer/hmc5843_core.c
··· 451 451 goto done; 452 452 453 453 iio_push_to_buffers_with_timestamp(indio_dev, data->buffer, 454 - iio_get_time_ns()); 454 + iio_get_time_ns(indio_dev)); 455 455 456 456 done: 457 457 iio_trigger_notify_done(indio_dev->trig);
+1 -1
drivers/iio/magnetometer/mag3110.c
··· 261 261 } 262 262 263 263 iio_push_to_buffers_with_timestamp(indio_dev, buffer, 264 - iio_get_time_ns()); 264 + iio_get_time_ns(indio_dev)); 265 265 266 266 done: 267 267 iio_trigger_notify_done(indio_dev->trig);
+1 -1
drivers/iio/pressure/mpl3115.c
··· 171 171 mutex_unlock(&data->lock); 172 172 173 173 iio_push_to_buffers_with_timestamp(indio_dev, buffer, 174 - iio_get_time_ns()); 174 + iio_get_time_ns(indio_dev)); 175 175 176 176 done: 177 177 iio_trigger_notify_done(indio_dev->trig);
+2 -1
drivers/iio/pressure/ms5611_core.c
··· 224 224 if (ret < 0) 225 225 goto err; 226 226 227 - iio_push_to_buffers_with_timestamp(indio_dev, buf, iio_get_time_ns()); 227 + iio_push_to_buffers_with_timestamp(indio_dev, buf, 228 + iio_get_time_ns(indio_dev)); 228 229 229 230 err: 230 231 iio_trigger_notify_done(indio_dev->trig);
+1 -1
drivers/iio/proximity/pulsedlight-lidar-lite-v2.c
··· 238 238 ret = lidar_get_measurement(data, data->buffer); 239 239 if (!ret) { 240 240 iio_push_to_buffers_with_timestamp(indio_dev, data->buffer, 241 - iio_get_time_ns()); 241 + iio_get_time_ns(indio_dev)); 242 242 } else if (ret != -EINVAL) { 243 243 dev_err(&data->client->dev, "cannot read LIDAR measurement"); 244 244 }
+2 -2
drivers/iio/proximity/sx9500.c
··· 492 492 dir = new_prox ? IIO_EV_DIR_FALLING : IIO_EV_DIR_RISING; 493 493 ev = IIO_UNMOD_EVENT_CODE(IIO_PROXIMITY, chan, 494 494 IIO_EV_TYPE_THRESH, dir); 495 - iio_push_event(indio_dev, ev, iio_get_time_ns()); 495 + iio_push_event(indio_dev, ev, iio_get_time_ns(indio_dev)); 496 496 data->prox_stat[chan] = new_prox; 497 497 } 498 498 } ··· 669 669 } 670 670 671 671 iio_push_to_buffers_with_timestamp(indio_dev, data->buffer, 672 - iio_get_time_ns()); 672 + iio_get_time_ns(indio_dev)); 673 673 674 674 out: 675 675 mutex_unlock(&data->mutex);
+1 -1
drivers/staging/iio/accel/lis3l02dq_core.c
··· 451 451 struct iio_dev *indio_dev = private; 452 452 u8 t; 453 453 454 - s64 timestamp = iio_get_time_ns(); 454 + s64 timestamp = iio_get_time_ns(indio_dev); 455 455 456 456 lis3l02dq_spi_read_reg_8(indio_dev, 457 457 LIS3L02DQ_REG_WAKE_UP_SRC_ADDR,
+1 -1
drivers/staging/iio/accel/sca3000_core.c
··· 774 774 struct iio_dev *indio_dev = private; 775 775 struct sca3000_state *st = iio_priv(indio_dev); 776 776 int ret, val; 777 - s64 last_timestamp = iio_get_time_ns(); 777 + s64 last_timestamp = iio_get_time_ns(indio_dev); 778 778 779 779 /* 780 780 * Could lead if badly timed to an extra read of status reg,
+4 -4
drivers/staging/iio/adc/ad7280a.c
··· 705 705 IIO_EV_DIR_RISING, 706 706 IIO_EV_TYPE_THRESH, 707 707 0, 0, 0), 708 - iio_get_time_ns()); 708 + iio_get_time_ns(indio_dev)); 709 709 else if (((channels[i] >> 11) & 0xFFF) <= 710 710 st->cell_threshlow) 711 711 iio_push_event(indio_dev, ··· 715 715 IIO_EV_DIR_FALLING, 716 716 IIO_EV_TYPE_THRESH, 717 717 0, 0, 0), 718 - iio_get_time_ns()); 718 + iio_get_time_ns(indio_dev)); 719 719 } else { 720 720 if (((channels[i] >> 11) & 0xFFF) >= st->aux_threshhigh) 721 721 iio_push_event(indio_dev, ··· 724 724 0, 725 725 IIO_EV_TYPE_THRESH, 726 726 IIO_EV_DIR_RISING), 727 - iio_get_time_ns()); 727 + iio_get_time_ns(indio_dev)); 728 728 else if (((channels[i] >> 11) & 0xFFF) <= 729 729 st->aux_threshlow) 730 730 iio_push_event(indio_dev, ··· 733 733 0, 734 734 IIO_EV_TYPE_THRESH, 735 735 IIO_EV_DIR_FALLING), 736 - iio_get_time_ns()); 736 + iio_get_time_ns(indio_dev)); 737 737 } 738 738 } 739 739
+2 -1
drivers/staging/iio/adc/ad7606_ring.c
··· 77 77 goto done; 78 78 } 79 79 80 - iio_push_to_buffers_with_timestamp(indio_dev, buf, iio_get_time_ns()); 80 + iio_push_to_buffers_with_timestamp(indio_dev, buf, 81 + iio_get_time_ns(indio_dev)); 81 82 done: 82 83 gpio_set_value(st->pdata->gpio_convst, 0); 83 84 iio_trigger_notify_done(indio_dev->trig);
+2 -1
drivers/staging/iio/adc/ad7816.c
··· 253 253 254 254 static irqreturn_t ad7816_event_handler(int irq, void *private) 255 255 { 256 - iio_push_event(private, IIO_EVENT_CODE_AD7816_OTI, iio_get_time_ns()); 256 + iio_push_event(private, IIO_EVENT_CODE_AD7816_OTI, 257 + iio_get_time_ns((struct iio_dev *)private)); 257 258 return IRQ_HANDLED; 258 259 } 259 260
+2 -2
drivers/staging/iio/addac/adt7316.c
··· 1752 1752 if ((chip->id & ID_FAMILY_MASK) != ID_ADT75XX) 1753 1753 stat1 &= 0x1F; 1754 1754 1755 - time = iio_get_time_ns(); 1755 + time = iio_get_time_ns(indio_dev); 1756 1756 if (stat1 & BIT(0)) 1757 1757 iio_push_event(indio_dev, 1758 1758 IIO_UNMOD_EVENT_CODE(IIO_TEMP, 0, ··· 1804 1804 0, 1805 1805 IIO_EV_TYPE_THRESH, 1806 1806 IIO_EV_DIR_RISING), 1807 - iio_get_time_ns()); 1807 + iio_get_time_ns(indio_dev)); 1808 1808 } 1809 1809 1810 1810 return IRQ_HANDLED;
+1 -1
drivers/staging/iio/cdc/ad7150.c
··· 493 493 struct iio_dev *indio_dev = private; 494 494 struct ad7150_chip_info *chip = iio_priv(indio_dev); 495 495 u8 int_status; 496 - s64 timestamp = iio_get_time_ns(); 496 + s64 timestamp = iio_get_time_ns(indio_dev); 497 497 int ret; 498 498 499 499 ret = i2c_smbus_read_byte_data(chip->client, AD7150_STATUS);
+1 -1
drivers/staging/iio/light/tsl2x7x_core.c
··· 1554 1554 { 1555 1555 struct iio_dev *indio_dev = private; 1556 1556 struct tsl2X7X_chip *chip = iio_priv(indio_dev); 1557 - s64 timestamp = iio_get_time_ns(); 1557 + s64 timestamp = iio_get_time_ns(indio_dev); 1558 1558 int ret; 1559 1559 u8 value; 1560 1560
+14 -8
include/linux/iio/iio.h
··· 312 312 }, \ 313 313 } 314 314 315 - /** 316 - * iio_get_time_ns() - utility function to get a time stamp for events etc 317 - **/ 318 - static inline s64 iio_get_time_ns(void) 319 - { 320 - return ktime_get_real_ns(); 321 - } 315 + s64 iio_get_time_ns(const struct iio_dev *indio_dev); 316 + unsigned int iio_get_time_res(const struct iio_dev *indio_dev); 322 317 323 318 /* Device operating modes */ 324 319 #define INDIO_DIRECT_MODE 0x01 ··· 492 497 * @chan_attr_group: [INTERN] group for all attrs in base directory 493 498 * @name: [DRIVER] name of the device. 494 499 * @info: [DRIVER] callbacks and constant info from driver 500 + * @clock_id: [INTERN] timestamping clock posix identifier 495 501 * @info_exist_lock: [INTERN] lock to prevent use during removal 496 502 * @setup_ops: [DRIVER] callbacks to call before and after buffer 497 503 * enable/disable ··· 533 537 struct attribute_group chan_attr_group; 534 538 const char *name; 535 539 const struct iio_info *info; 540 + clockid_t clock_id; 536 541 struct mutex info_exist_lock; 537 542 const struct iio_buffer_setup_ops *setup_ops; 538 543 struct cdev chrdev; ··· 562 565 563 566 /** 564 567 * iio_device_put() - reference counted deallocation of struct device 565 - * @indio_dev: IIO device structure containing the device 568 + * @indio_dev: IIO device structure containing the device 566 569 **/ 567 570 static inline void iio_device_put(struct iio_dev *indio_dev) 568 571 { 569 572 if (indio_dev) 570 573 put_device(&indio_dev->dev); 574 + } 575 + 576 + /** 577 + * iio_device_get_clock() - Retrieve current timestamping clock for the device 578 + * @indio_dev: IIO device structure containing the device 579 + */ 580 + static inline clockid_t iio_device_get_clock(const struct iio_dev *indio_dev) 581 + { 582 + return indio_dev->clock_id; 571 583 } 572 584 573 585 /**