diff options
author | Michael Hennerich <michael.hennerich@analog.com> | 2011-02-24 16:19:48 -0500 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2011-02-28 17:40:55 -0500 |
commit | e08d02658cac30a826565d2faebb74586f60d601 (patch) | |
tree | 75586a4d305a12cb9cfb696127cc3183a50cbbdb /drivers/staging | |
parent | 86f702ab1d5f3a181937bf462c176d0c95f95a24 (diff) |
IIO: ADC: AD7887: Update timestamp handling
Add timestamp attributes.
Revise timestamp handling accordingly.
Preset timestamp generation.
Signed-off-by: Michael Hennerich <michael.hennerich@analog.com>
Acked-by: Jonathan Cameron <jic23@cam.ac.uk>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/staging')
-rw-r--r-- | drivers/staging/iio/adc/ad7887.h | 1 | ||||
-rw-r--r-- | drivers/staging/iio/adc/ad7887_ring.c | 36 |
2 files changed, 22 insertions, 15 deletions
diff --git a/drivers/staging/iio/adc/ad7887.h b/drivers/staging/iio/adc/ad7887.h index 8c2a218c949..439c802b38f 100644 --- a/drivers/staging/iio/adc/ad7887.h +++ b/drivers/staging/iio/adc/ad7887.h | |||
@@ -63,6 +63,7 @@ struct ad7887_state { | |||
63 | struct regulator *reg; | 63 | struct regulator *reg; |
64 | struct work_struct poll_work; | 64 | struct work_struct poll_work; |
65 | atomic_t protect_ring; | 65 | atomic_t protect_ring; |
66 | size_t d_size; | ||
66 | u16 int_vref_mv; | 67 | u16 int_vref_mv; |
67 | bool en_dual; | 68 | bool en_dual; |
68 | struct spi_transfer xfer[4]; | 69 | struct spi_transfer xfer[4]; |
diff --git a/drivers/staging/iio/adc/ad7887_ring.c b/drivers/staging/iio/adc/ad7887_ring.c index 6b9cb1f95a1..2d7fe65049d 100644 --- a/drivers/staging/iio/adc/ad7887_ring.c +++ b/drivers/staging/iio/adc/ad7887_ring.c | |||
@@ -27,6 +27,8 @@ | |||
27 | 27 | ||
28 | static IIO_SCAN_EL_C(in0, 0, 0, NULL); | 28 | static IIO_SCAN_EL_C(in0, 0, 0, NULL); |
29 | static IIO_SCAN_EL_C(in1, 1, 0, NULL); | 29 | static IIO_SCAN_EL_C(in1, 1, 0, NULL); |
30 | static IIO_SCAN_EL_TIMESTAMP(2); | ||
31 | static IIO_CONST_ATTR_SCAN_EL_TYPE(timestamp, s, 64, 64); | ||
30 | 32 | ||
31 | static ssize_t ad7887_show_type(struct device *dev, | 33 | static ssize_t ad7887_show_type(struct device *dev, |
32 | struct device_attribute *attr, | 34 | struct device_attribute *attr, |
@@ -47,6 +49,9 @@ static struct attribute *ad7887_scan_el_attrs[] = { | |||
47 | &iio_const_attr_in0_index.dev_attr.attr, | 49 | &iio_const_attr_in0_index.dev_attr.attr, |
48 | &iio_scan_el_in1.dev_attr.attr, | 50 | &iio_scan_el_in1.dev_attr.attr, |
49 | &iio_const_attr_in1_index.dev_attr.attr, | 51 | &iio_const_attr_in1_index.dev_attr.attr, |
52 | &iio_const_attr_timestamp_index.dev_attr.attr, | ||
53 | &iio_scan_el_timestamp.dev_attr.attr, | ||
54 | &iio_const_attr_timestamp_type.dev_attr.attr, | ||
50 | &iio_dev_attr_in_type.dev_attr.attr, | 55 | &iio_dev_attr_in_type.dev_attr.attr, |
51 | NULL, | 56 | NULL, |
52 | }; | 57 | }; |
@@ -118,16 +123,20 @@ static int ad7887_ring_preenable(struct iio_dev *indio_dev) | |||
118 | { | 123 | { |
119 | struct ad7887_state *st = indio_dev->dev_data; | 124 | struct ad7887_state *st = indio_dev->dev_data; |
120 | struct iio_ring_buffer *ring = indio_dev->ring; | 125 | struct iio_ring_buffer *ring = indio_dev->ring; |
121 | size_t d_size; | ||
122 | 126 | ||
123 | if (indio_dev->ring->access.set_bytes_per_datum) { | 127 | st->d_size = ring->scan_count * st->chip_info->storagebits / 8; |
124 | d_size = st->chip_info->storagebits / 8 + sizeof(s64); | 128 | |
125 | if (d_size % 8) | 129 | if (ring->scan_timestamp) { |
126 | d_size += 8 - (d_size % 8); | 130 | st->d_size += sizeof(s64); |
127 | indio_dev->ring->access.set_bytes_per_datum(indio_dev->ring, | 131 | |
128 | d_size); | 132 | if (st->d_size % sizeof(s64)) |
133 | st->d_size += sizeof(s64) - (st->d_size % sizeof(s64)); | ||
129 | } | 134 | } |
130 | 135 | ||
136 | if (indio_dev->ring->access.set_bytes_per_datum) | ||
137 | indio_dev->ring->access.set_bytes_per_datum(indio_dev->ring, | ||
138 | st->d_size); | ||
139 | |||
131 | switch (ring->scan_mask) { | 140 | switch (ring->scan_mask) { |
132 | case (1 << 0): | 141 | case (1 << 0): |
133 | st->ring_msg = &st->msg[AD7887_CH0]; | 142 | st->ring_msg = &st->msg[AD7887_CH0]; |
@@ -186,20 +195,14 @@ static void ad7887_poll_bh_to_ring(struct work_struct *work_s) | |||
186 | s64 time_ns; | 195 | s64 time_ns; |
187 | __u8 *buf; | 196 | __u8 *buf; |
188 | int b_sent; | 197 | int b_sent; |
189 | size_t d_size; | ||
190 | 198 | ||
191 | unsigned int bytes = ring->scan_count * st->chip_info->storagebits / 8; | 199 | unsigned int bytes = ring->scan_count * st->chip_info->storagebits / 8; |
192 | 200 | ||
193 | /* Ensure the timestamp is 8 byte aligned */ | ||
194 | d_size = bytes + sizeof(s64); | ||
195 | if (d_size % sizeof(s64)) | ||
196 | d_size += sizeof(s64) - (d_size % sizeof(s64)); | ||
197 | |||
198 | /* Ensure only one copy of this function running at a time */ | 201 | /* Ensure only one copy of this function running at a time */ |
199 | if (atomic_inc_return(&st->protect_ring) > 1) | 202 | if (atomic_inc_return(&st->protect_ring) > 1) |
200 | return; | 203 | return; |
201 | 204 | ||
202 | buf = kzalloc(d_size, GFP_KERNEL); | 205 | buf = kzalloc(st->d_size, GFP_KERNEL); |
203 | if (buf == NULL) | 206 | if (buf == NULL) |
204 | return; | 207 | return; |
205 | 208 | ||
@@ -210,7 +213,9 @@ static void ad7887_poll_bh_to_ring(struct work_struct *work_s) | |||
210 | time_ns = iio_get_time_ns(); | 213 | time_ns = iio_get_time_ns(); |
211 | 214 | ||
212 | memcpy(buf, st->data, bytes); | 215 | memcpy(buf, st->data, bytes); |
213 | memcpy(buf + d_size - sizeof(s64), &time_ns, sizeof(time_ns)); | 216 | if (ring->scan_timestamp) |
217 | memcpy(buf + st->d_size - sizeof(s64), | ||
218 | &time_ns, sizeof(time_ns)); | ||
214 | 219 | ||
215 | indio_dev->ring->access.store_to(&sw_ring->buf, buf, time_ns); | 220 | indio_dev->ring->access.store_to(&sw_ring->buf, buf, time_ns); |
216 | done: | 221 | done: |
@@ -241,6 +246,7 @@ int ad7887_register_ring_funcs_and_init(struct iio_dev *indio_dev) | |||
241 | indio_dev->ring->predisable = &iio_triggered_ring_predisable; | 246 | indio_dev->ring->predisable = &iio_triggered_ring_predisable; |
242 | indio_dev->ring->postdisable = &ad7887_ring_postdisable; | 247 | indio_dev->ring->postdisable = &ad7887_ring_postdisable; |
243 | indio_dev->ring->scan_el_attrs = &ad7887_scan_el_group; | 248 | indio_dev->ring->scan_el_attrs = &ad7887_scan_el_group; |
249 | indio_dev->ring->scan_timestamp = true; | ||
244 | 250 | ||
245 | INIT_WORK(&st->poll_work, &ad7887_poll_bh_to_ring); | 251 | INIT_WORK(&st->poll_work, &ad7887_poll_bh_to_ring); |
246 | 252 | ||