Commit fd6487f8 authored by Jonathan Cameron's avatar Jonathan Cameron Committed by Greg Kroah-Hartman

staging:iio: Add caching of scan_timestamp to the core as well as buffers.

This will be needed when multiple buffer support is added.
Signed-off-by: default avatarJonathan Cameron <jic23@kernel.org>
Acked-by: default avatarLars-Peter Clausen <lars@metafoo.de>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent f5ee7b80
...@@ -80,7 +80,7 @@ static irqreturn_t adis16201_trigger_handler(int irq, void *p) ...@@ -80,7 +80,7 @@ static irqreturn_t adis16201_trigger_handler(int irq, void *p)
data[i] = be16_to_cpup((__be16 *)&(st->rx[i*2])); data[i] = be16_to_cpup((__be16 *)&(st->rx[i*2]));
/* Guaranteed to be aligned with 8 byte boundary */ /* Guaranteed to be aligned with 8 byte boundary */
if (ring->scan_timestamp) if (indio_dev->scan_timestamp)
*((s64 *)(data + ((i + 3)/4)*4)) = pf->timestamp; *((s64 *)(data + ((i + 3)/4)*4)) = pf->timestamp;
ring->access->store_to(ring, (u8 *)data, pf->timestamp); ring->access->store_to(ring, (u8 *)data, pf->timestamp);
......
...@@ -80,7 +80,7 @@ static irqreturn_t adis16203_trigger_handler(int irq, void *p) ...@@ -80,7 +80,7 @@ static irqreturn_t adis16203_trigger_handler(int irq, void *p)
data[i] = be16_to_cpup((__be16 *)&(st->rx[i*2])); data[i] = be16_to_cpup((__be16 *)&(st->rx[i*2]));
/* Guaranteed to be aligned with 8 byte boundary */ /* Guaranteed to be aligned with 8 byte boundary */
if (ring->scan_timestamp) if (indio_dev->scan_timestamp)
*((s64 *)(data + ((i + 3)/4)*4)) = pf->timestamp; *((s64 *)(data + ((i + 3)/4)*4)) = pf->timestamp;
ring->access->store_to(ring, ring->access->store_to(ring,
......
...@@ -77,7 +77,7 @@ static irqreturn_t adis16204_trigger_handler(int irq, void *p) ...@@ -77,7 +77,7 @@ static irqreturn_t adis16204_trigger_handler(int irq, void *p)
data[i] = be16_to_cpup((__be16 *)&(st->rx[i*2])); data[i] = be16_to_cpup((__be16 *)&(st->rx[i*2]));
/* Guaranteed to be aligned with 8 byte boundary */ /* Guaranteed to be aligned with 8 byte boundary */
if (ring->scan_timestamp) if (indio_dev->scan_timestamp)
*((s64 *)(data + ((i + 3)/4)*4)) = pf->timestamp; *((s64 *)(data + ((i + 3)/4)*4)) = pf->timestamp;
ring->access->store_to(ring, (u8 *)data, pf->timestamp); ring->access->store_to(ring, (u8 *)data, pf->timestamp);
......
...@@ -77,7 +77,7 @@ static irqreturn_t adis16209_trigger_handler(int irq, void *p) ...@@ -77,7 +77,7 @@ static irqreturn_t adis16209_trigger_handler(int irq, void *p)
data[i] = be16_to_cpup((__be16 *)&(st->rx[i*2])); data[i] = be16_to_cpup((__be16 *)&(st->rx[i*2]));
/* Guaranteed to be aligned with 8 byte boundary */ /* Guaranteed to be aligned with 8 byte boundary */
if (ring->scan_timestamp) if (indio_dev->scan_timestamp)
*((s64 *)(data + ((i + 3)/4)*4)) = pf->timestamp; *((s64 *)(data + ((i + 3)/4)*4)) = pf->timestamp;
ring->access->store_to(ring, (u8 *)data, pf->timestamp); ring->access->store_to(ring, (u8 *)data, pf->timestamp);
......
...@@ -75,7 +75,7 @@ static irqreturn_t adis16240_trigger_handler(int irq, void *p) ...@@ -75,7 +75,7 @@ static irqreturn_t adis16240_trigger_handler(int irq, void *p)
data[i] = be16_to_cpup((__be16 *)&(st->rx[i*2])); data[i] = be16_to_cpup((__be16 *)&(st->rx[i*2]));
/* Guaranteed to be aligned with 8 byte boundary */ /* Guaranteed to be aligned with 8 byte boundary */
if (ring->scan_timestamp) if (indio_dev->scan_timestamp)
*((s64 *)(data + ((i + 3)/4)*4)) = pf->timestamp; *((s64 *)(data + ((i + 3)/4)*4)) = pf->timestamp;
ring->access->store_to(ring, (u8 *)data, pf->timestamp); ring->access->store_to(ring, (u8 *)data, pf->timestamp);
......
...@@ -150,7 +150,7 @@ static irqreturn_t lis3l02dq_trigger_handler(int irq, void *p) ...@@ -150,7 +150,7 @@ static irqreturn_t lis3l02dq_trigger_handler(int irq, void *p)
len = lis3l02dq_get_buffer_element(indio_dev, data); len = lis3l02dq_get_buffer_element(indio_dev, data);
/* Guaranteed to be aligned with 8 byte boundary */ /* Guaranteed to be aligned with 8 byte boundary */
if (buffer->scan_timestamp) if (indio_dev->scan_timestamp)
*(s64 *)(((phys_addr_t)data + len *(s64 *)(((phys_addr_t)data + len
+ sizeof(s64) - 1) & ~(sizeof(s64) - 1)) + sizeof(s64) - 1) & ~(sizeof(s64) - 1))
= pf->timestamp; = pf->timestamp;
......
...@@ -521,7 +521,7 @@ static irqreturn_t ad7192_trigger_handler(int irq, void *p) ...@@ -521,7 +521,7 @@ static irqreturn_t ad7192_trigger_handler(int irq, void *p)
indio_dev->channels[0].scan_type.realbits/8); indio_dev->channels[0].scan_type.realbits/8);
/* Guaranteed to be aligned with 8 byte boundary */ /* Guaranteed to be aligned with 8 byte boundary */
if (ring->scan_timestamp) if (indio_dev->scan_timestamp)
dat64[1] = pf->timestamp; dat64[1] = pf->timestamp;
ring->access->store_to(ring, (u8 *)dat64, pf->timestamp); ring->access->store_to(ring, (u8 *)dat64, pf->timestamp);
......
...@@ -92,7 +92,7 @@ static irqreturn_t ad7298_trigger_handler(int irq, void *p) ...@@ -92,7 +92,7 @@ static irqreturn_t ad7298_trigger_handler(int irq, void *p)
if (b_sent) if (b_sent)
return b_sent; return b_sent;
if (ring->scan_timestamp) { if (indio_dev->scan_timestamp) {
time_ns = iio_get_time_ns(); time_ns = iio_get_time_ns();
memcpy((u8 *)buf + indio_dev->scan_bytes - sizeof(s64), memcpy((u8 *)buf + indio_dev->scan_bytes - sizeof(s64),
&time_ns, sizeof(time_ns)); &time_ns, sizeof(time_ns));
......
...@@ -40,7 +40,7 @@ static irqreturn_t ad7476_trigger_handler(int irq, void *p) ...@@ -40,7 +40,7 @@ static irqreturn_t ad7476_trigger_handler(int irq, void *p)
time_ns = iio_get_time_ns(); time_ns = iio_get_time_ns();
if (indio_dev->buffer->scan_timestamp) if (indio_dev->scan_timestamp)
memcpy(rxbuf + indio_dev->scan_bytes - sizeof(s64), memcpy(rxbuf + indio_dev->scan_bytes - sizeof(s64),
&time_ns, sizeof(time_ns)); &time_ns, sizeof(time_ns));
......
...@@ -81,9 +81,8 @@ static void ad7606_poll_bh_to_ring(struct work_struct *work_s) ...@@ -81,9 +81,8 @@ static void ad7606_poll_bh_to_ring(struct work_struct *work_s)
time_ns = iio_get_time_ns(); time_ns = iio_get_time_ns();
if (ring->scan_timestamp) if (indio_dev->scan_timestamp)
*((s64 *)(buf + ring->access->get_bytes_per_datum(ring) - *((s64 *)(buf + indio_dev->scan_bytes - sizeof(s64))) = time_ns;
sizeof(s64))) = time_ns;
ring->access->store_to(indio_dev->buffer, buf, time_ns); ring->access->store_to(indio_dev->buffer, buf, time_ns);
done: done:
......
...@@ -386,7 +386,7 @@ static irqreturn_t ad7793_trigger_handler(int irq, void *p) ...@@ -386,7 +386,7 @@ static irqreturn_t ad7793_trigger_handler(int irq, void *p)
indio_dev->channels[0].scan_type.realbits/8); indio_dev->channels[0].scan_type.realbits/8);
/* Guaranteed to be aligned with 8 byte boundary */ /* Guaranteed to be aligned with 8 byte boundary */
if (ring->scan_timestamp) if (indio_dev->scan_timestamp)
dat64[1] = pf->timestamp; dat64[1] = pf->timestamp;
ring->access->store_to(ring, (u8 *)dat64, pf->timestamp); ring->access->store_to(ring, (u8 *)dat64, pf->timestamp);
......
...@@ -72,7 +72,6 @@ static irqreturn_t ad7887_trigger_handler(int irq, void *p) ...@@ -72,7 +72,6 @@ static irqreturn_t ad7887_trigger_handler(int irq, void *p)
struct iio_poll_func *pf = p; struct iio_poll_func *pf = p;
struct iio_dev *indio_dev = pf->indio_dev; struct iio_dev *indio_dev = pf->indio_dev;
struct ad7887_state *st = iio_priv(indio_dev); struct ad7887_state *st = iio_priv(indio_dev);
struct iio_buffer *ring = indio_dev->buffer;
s64 time_ns; s64 time_ns;
__u8 *buf; __u8 *buf;
int b_sent; int b_sent;
...@@ -92,7 +91,7 @@ static irqreturn_t ad7887_trigger_handler(int irq, void *p) ...@@ -92,7 +91,7 @@ static irqreturn_t ad7887_trigger_handler(int irq, void *p)
time_ns = iio_get_time_ns(); time_ns = iio_get_time_ns();
memcpy(buf, st->data, bytes); memcpy(buf, st->data, bytes);
if (ring->scan_timestamp) if (indio_dev->scan_timestamp)
memcpy(buf + indio_dev->scan_bytes - sizeof(s64), memcpy(buf + indio_dev->scan_bytes - sizeof(s64),
&time_ns, sizeof(time_ns)); &time_ns, sizeof(time_ns));
......
...@@ -95,7 +95,7 @@ static irqreturn_t ad799x_trigger_handler(int irq, void *p) ...@@ -95,7 +95,7 @@ static irqreturn_t ad799x_trigger_handler(int irq, void *p)
time_ns = iio_get_time_ns(); time_ns = iio_get_time_ns();
if (ring->scan_timestamp) if (indio_dev->scan_timestamp)
memcpy(rxbuf + indio_dev->scan_bytes - sizeof(s64), memcpy(rxbuf + indio_dev->scan_bytes - sizeof(s64),
&time_ns, sizeof(time_ns)); &time_ns, sizeof(time_ns));
......
...@@ -54,7 +54,7 @@ static irqreturn_t max1363_trigger_handler(int irq, void *p) ...@@ -54,7 +54,7 @@ static irqreturn_t max1363_trigger_handler(int irq, void *p)
d_size = numvals*2; d_size = numvals*2;
else else
d_size = numvals; d_size = numvals;
if (indio_dev->buffer->scan_timestamp) { if (indio_dev->scan_timestamp) {
d_size += sizeof(s64); d_size += sizeof(s64);
if (d_size % sizeof(s64)) if (d_size % sizeof(s64))
d_size += sizeof(s64) - (d_size % sizeof(s64)); d_size += sizeof(s64) - (d_size % sizeof(s64));
...@@ -78,7 +78,7 @@ static irqreturn_t max1363_trigger_handler(int irq, void *p) ...@@ -78,7 +78,7 @@ static irqreturn_t max1363_trigger_handler(int irq, void *p)
time_ns = iio_get_time_ns(); time_ns = iio_get_time_ns();
if (indio_dev->buffer->scan_timestamp) if (indio_dev->scan_timestamp)
memcpy(rxbuf + d_size - sizeof(s64), &time_ns, sizeof(time_ns)); memcpy(rxbuf + d_size - sizeof(s64), &time_ns, sizeof(time_ns));
iio_push_to_buffer(indio_dev->buffer, rxbuf, time_ns); iio_push_to_buffer(indio_dev->buffer, rxbuf, time_ns);
......
...@@ -80,7 +80,7 @@ static irqreturn_t adis16260_trigger_handler(int irq, void *p) ...@@ -80,7 +80,7 @@ static irqreturn_t adis16260_trigger_handler(int irq, void *p)
data[i] = be16_to_cpup((__be16 *)&(st->rx[i*2])); data[i] = be16_to_cpup((__be16 *)&(st->rx[i*2]));
/* Guaranteed to be aligned with 8 byte boundary */ /* Guaranteed to be aligned with 8 byte boundary */
if (ring->scan_timestamp) if (indio_dev->scan_timestamp)
*((s64 *)(data + ((i + 3)/4)*4)) = pf->timestamp; *((s64 *)(data + ((i + 3)/4)*4)) = pf->timestamp;
ring->access->store_to(ring, (u8 *)data, pf->timestamp); ring->access->store_to(ring, (u8 *)data, pf->timestamp);
......
...@@ -306,6 +306,7 @@ struct iio_buffer_setup_ops { ...@@ -306,6 +306,7 @@ struct iio_buffer_setup_ops {
* @masklength: [INTERN] the length of the mask established from * @masklength: [INTERN] the length of the mask established from
* channels * channels
* @active_scan_mask: [INTERN] union of all scan masks requested by buffers * @active_scan_mask: [INTERN] union of all scan masks requested by buffers
* @scan_timestamp: [INTERN] set if any buffers have requested timestamp
* @scan_index_timestamp:[INTERN] cache of the index to the timestamp * @scan_index_timestamp:[INTERN] cache of the index to the timestamp
* @trig: [INTERN] current device trigger (buffer modes) * @trig: [INTERN] current device trigger (buffer modes)
* @pollfunc: [DRIVER] function run on trigger being received * @pollfunc: [DRIVER] function run on trigger being received
...@@ -342,6 +343,7 @@ struct iio_dev { ...@@ -342,6 +343,7 @@ struct iio_dev {
const unsigned long *available_scan_masks; const unsigned long *available_scan_masks;
unsigned masklength; unsigned masklength;
const unsigned long *active_scan_mask; const unsigned long *active_scan_mask;
bool scan_timestamp;
unsigned scan_index_timestamp; unsigned scan_index_timestamp;
struct iio_trigger *trig; struct iio_trigger *trig;
struct iio_poll_func *pollfunc; struct iio_poll_func *pollfunc;
......
...@@ -84,7 +84,7 @@ static irqreturn_t iio_simple_dummy_trigger_h(int irq, void *p) ...@@ -84,7 +84,7 @@ static irqreturn_t iio_simple_dummy_trigger_h(int irq, void *p)
} }
} }
/* Store a timestampe at an 8 byte boundary */ /* Store a timestampe at an 8 byte boundary */
if (buffer->scan_timestamp) if (indio_dev->scan_timestamp)
*(s64 *)(((phys_addr_t)data + len *(s64 *)(((phys_addr_t)data + len
+ sizeof(s64) - 1) & ~(sizeof(s64) - 1)) + sizeof(s64) - 1) & ~(sizeof(s64) - 1))
= iio_get_time_ns(); = iio_get_time_ns();
......
...@@ -185,6 +185,7 @@ static ssize_t iio_scan_el_ts_store(struct device *dev, ...@@ -185,6 +185,7 @@ static ssize_t iio_scan_el_ts_store(struct device *dev,
goto error_ret; goto error_ret;
} }
indio_dev->buffer->scan_timestamp = state; indio_dev->buffer->scan_timestamp = state;
indio_dev->scan_timestamp = state;
error_ret: error_ret:
mutex_unlock(&indio_dev->mlock); mutex_unlock(&indio_dev->mlock);
......
...@@ -72,7 +72,7 @@ static irqreturn_t ade7758_trigger_handler(int irq, void *p) ...@@ -72,7 +72,7 @@ static irqreturn_t ade7758_trigger_handler(int irq, void *p)
*dat32 = get_unaligned_be32(&st->rx_buf[5]) & 0xFFFFFF; *dat32 = get_unaligned_be32(&st->rx_buf[5]) & 0xFFFFFF;
/* Guaranteed to be aligned with 8 byte boundary */ /* Guaranteed to be aligned with 8 byte boundary */
if (ring->scan_timestamp) if (indio_dev->scan_timestamp)
dat64[1] = pf->timestamp; dat64[1] = pf->timestamp;
ring->access->store_to(ring, (u8 *)dat64, pf->timestamp); ring->access->store_to(ring, (u8 *)dat64, pf->timestamp);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment