diff options
author | Michael Hennerich <michael.hennerich@analog.com> | 2011-02-24 16:19:50 -0500 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2011-02-28 17:40:56 -0500 |
commit | a2396dfc63d4b133d0b820db978065367529f6ac (patch) | |
tree | a37304276cccd6f55bb5ab975c3088a66dee6db1 /drivers/staging | |
parent | dcfb0863eec8ff0a3b2cee13e4f0e5bb5f0c3122 (diff) |
IIO: ADC: AD799x: 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/ad799x.h | 1 | ||||
-rw-r--r-- | drivers/staging/iio/adc/ad799x_core.c | 12 | ||||
-rw-r--r-- | drivers/staging/iio/adc/ad799x_ring.c | 43 |
3 files changed, 29 insertions, 27 deletions
diff --git a/drivers/staging/iio/adc/ad799x.h b/drivers/staging/iio/adc/ad799x.h index 81a20d524b7..a421362c77f 100644 --- a/drivers/staging/iio/adc/ad799x.h +++ b/drivers/staging/iio/adc/ad799x.h | |||
@@ -116,6 +116,7 @@ struct ad799x_state { | |||
116 | struct work_struct poll_work; | 116 | struct work_struct poll_work; |
117 | struct work_struct work_thresh; | 117 | struct work_struct work_thresh; |
118 | atomic_t protect_ring; | 118 | atomic_t protect_ring; |
119 | size_t d_size; | ||
119 | struct iio_trigger *trig; | 120 | struct iio_trigger *trig; |
120 | struct regulator *reg; | 121 | struct regulator *reg; |
121 | s64 last_timestamp; | 122 | s64 last_timestamp; |
diff --git a/drivers/staging/iio/adc/ad799x_core.c b/drivers/staging/iio/adc/ad799x_core.c index 89ccf375a18..e50841b3ac6 100644 --- a/drivers/staging/iio/adc/ad799x_core.c +++ b/drivers/staging/iio/adc/ad799x_core.c | |||
@@ -123,6 +123,9 @@ static AD799X_SCAN_EL(5); | |||
123 | static AD799X_SCAN_EL(6); | 123 | static AD799X_SCAN_EL(6); |
124 | static AD799X_SCAN_EL(7); | 124 | static AD799X_SCAN_EL(7); |
125 | 125 | ||
126 | static IIO_SCAN_EL_TIMESTAMP(8); | ||
127 | static IIO_CONST_ATTR_SCAN_EL_TYPE(timestamp, s, 64, 64) | ||
128 | |||
126 | static ssize_t ad799x_show_type(struct device *dev, | 129 | static ssize_t ad799x_show_type(struct device *dev, |
127 | struct device_attribute *attr, | 130 | struct device_attribute *attr, |
128 | char *buf) | 131 | char *buf) |
@@ -471,6 +474,9 @@ static struct attribute *ad7991_5_9_3_4_scan_el_attrs[] = { | |||
471 | &iio_const_attr_in2_index.dev_attr.attr, | 474 | &iio_const_attr_in2_index.dev_attr.attr, |
472 | &iio_scan_el_in3.dev_attr.attr, | 475 | &iio_scan_el_in3.dev_attr.attr, |
473 | &iio_const_attr_in3_index.dev_attr.attr, | 476 | &iio_const_attr_in3_index.dev_attr.attr, |
477 | &iio_const_attr_timestamp_index.dev_attr.attr, | ||
478 | &iio_scan_el_timestamp.dev_attr.attr, | ||
479 | &iio_const_attr_timestamp_type.dev_attr.attr, | ||
474 | &iio_dev_attr_in_type.dev_attr.attr, | 480 | &iio_dev_attr_in_type.dev_attr.attr, |
475 | NULL, | 481 | NULL, |
476 | }; | 482 | }; |
@@ -497,6 +503,9 @@ static struct attribute *ad7992_scan_el_attrs[] = { | |||
497 | &iio_const_attr_in0_index.dev_attr.attr, | 503 | &iio_const_attr_in0_index.dev_attr.attr, |
498 | &iio_scan_el_in1.dev_attr.attr, | 504 | &iio_scan_el_in1.dev_attr.attr, |
499 | &iio_const_attr_in1_index.dev_attr.attr, | 505 | &iio_const_attr_in1_index.dev_attr.attr, |
506 | &iio_const_attr_timestamp_index.dev_attr.attr, | ||
507 | &iio_scan_el_timestamp.dev_attr.attr, | ||
508 | &iio_const_attr_timestamp_type.dev_attr.attr, | ||
500 | &iio_dev_attr_in_type.dev_attr.attr, | 509 | &iio_dev_attr_in_type.dev_attr.attr, |
501 | NULL, | 510 | NULL, |
502 | }; | 511 | }; |
@@ -541,6 +550,9 @@ static struct attribute *ad7997_8_scan_el_attrs[] = { | |||
541 | &iio_const_attr_in6_index.dev_attr.attr, | 550 | &iio_const_attr_in6_index.dev_attr.attr, |
542 | &iio_scan_el_in7.dev_attr.attr, | 551 | &iio_scan_el_in7.dev_attr.attr, |
543 | &iio_const_attr_in7_index.dev_attr.attr, | 552 | &iio_const_attr_in7_index.dev_attr.attr, |
553 | &iio_const_attr_timestamp_index.dev_attr.attr, | ||
554 | &iio_scan_el_timestamp.dev_attr.attr, | ||
555 | &iio_const_attr_timestamp_type.dev_attr.attr, | ||
544 | &iio_dev_attr_in_type.dev_attr.attr, | 556 | &iio_dev_attr_in_type.dev_attr.attr, |
545 | NULL, | 557 | NULL, |
546 | }; | 558 | }; |
diff --git a/drivers/staging/iio/adc/ad799x_ring.c b/drivers/staging/iio/adc/ad799x_ring.c index 975cdcbf083..56abc395f17 100644 --- a/drivers/staging/iio/adc/ad799x_ring.c +++ b/drivers/staging/iio/adc/ad799x_ring.c | |||
@@ -73,8 +73,6 @@ static int ad799x_ring_preenable(struct iio_dev *indio_dev) | |||
73 | { | 73 | { |
74 | struct iio_ring_buffer *ring = indio_dev->ring; | 74 | struct iio_ring_buffer *ring = indio_dev->ring; |
75 | struct ad799x_state *st = indio_dev->dev_data; | 75 | struct ad799x_state *st = indio_dev->dev_data; |
76 | size_t d_size; | ||
77 | unsigned long numvals; | ||
78 | 76 | ||
79 | /* | 77 | /* |
80 | * Need to figure out the current mode based upon the requested | 78 | * Need to figure out the current mode based upon the requested |
@@ -84,15 +82,19 @@ static int ad799x_ring_preenable(struct iio_dev *indio_dev) | |||
84 | if (st->id == ad7997 || st->id == ad7998) | 82 | if (st->id == ad7997 || st->id == ad7998) |
85 | ad799x_set_scan_mode(st, ring->scan_mask); | 83 | ad799x_set_scan_mode(st, ring->scan_mask); |
86 | 84 | ||
87 | numvals = ring->scan_count; | 85 | st->d_size = ring->scan_count * 2; |
88 | 86 | ||
89 | if (ring->access.set_bytes_per_datum) { | 87 | if (ring->scan_timestamp) { |
90 | d_size = numvals*2 + sizeof(s64); | 88 | st->d_size += sizeof(s64); |
91 | if (d_size % 8) | 89 | |
92 | d_size += 8 - (d_size % 8); | 90 | if (st->d_size % sizeof(s64)) |
93 | ring->access.set_bytes_per_datum(ring, d_size); | 91 | st->d_size += sizeof(s64) - (st->d_size % sizeof(s64)); |
94 | } | 92 | } |
95 | 93 | ||
94 | if (indio_dev->ring->access.set_bytes_per_datum) | ||
95 | indio_dev->ring->access.set_bytes_per_datum(indio_dev->ring, | ||
96 | st->d_size); | ||
97 | |||
96 | return 0; | 98 | return 0; |
97 | } | 99 | } |
98 | 100 | ||
@@ -130,29 +132,13 @@ static void ad799x_poll_bh_to_ring(struct work_struct *work_s) | |||
130 | s64 time_ns; | 132 | s64 time_ns; |
131 | __u8 *rxbuf; | 133 | __u8 *rxbuf; |
132 | int b_sent; | 134 | int b_sent; |
133 | size_t d_size; | ||
134 | u8 cmd; | 135 | u8 cmd; |
135 | 136 | ||
136 | unsigned long numvals = ring->scan_count; | ||
137 | |||
138 | /* Ensure the timestamp is 8 byte aligned */ | ||
139 | d_size = numvals*2 + sizeof(s64); | ||
140 | |||
141 | if (d_size % sizeof(s64)) | ||
142 | d_size += sizeof(s64) - (d_size % sizeof(s64)); | ||
143 | |||
144 | /* Ensure only one copy of this function running at a time */ | 137 | /* Ensure only one copy of this function running at a time */ |
145 | if (atomic_inc_return(&st->protect_ring) > 1) | 138 | if (atomic_inc_return(&st->protect_ring) > 1) |
146 | return; | 139 | return; |
147 | 140 | ||
148 | /* Monitor mode prevents reading. Whilst not currently implemented | 141 | rxbuf = kmalloc(st->d_size, GFP_KERNEL); |
149 | * might as well have this test in here in the meantime as it does | ||
150 | * no harm. | ||
151 | */ | ||
152 | if (numvals == 0) | ||
153 | return; | ||
154 | |||
155 | rxbuf = kmalloc(d_size, GFP_KERNEL); | ||
156 | if (rxbuf == NULL) | 142 | if (rxbuf == NULL) |
157 | return; | 143 | return; |
158 | 144 | ||
@@ -177,13 +163,15 @@ static void ad799x_poll_bh_to_ring(struct work_struct *work_s) | |||
177 | } | 163 | } |
178 | 164 | ||
179 | b_sent = i2c_smbus_read_i2c_block_data(st->client, | 165 | b_sent = i2c_smbus_read_i2c_block_data(st->client, |
180 | cmd, numvals*2, rxbuf); | 166 | cmd, ring->scan_count * 2, rxbuf); |
181 | if (b_sent < 0) | 167 | if (b_sent < 0) |
182 | goto done; | 168 | goto done; |
183 | 169 | ||
184 | time_ns = iio_get_time_ns(); | 170 | time_ns = iio_get_time_ns(); |
185 | 171 | ||
186 | memcpy(rxbuf + d_size - sizeof(s64), &time_ns, sizeof(time_ns)); | 172 | if (ring->scan_timestamp) |
173 | memcpy(rxbuf + st->d_size - sizeof(s64), | ||
174 | &time_ns, sizeof(time_ns)); | ||
187 | 175 | ||
188 | ring->access.store_to(&ring_sw->buf, rxbuf, time_ns); | 176 | ring->access.store_to(&ring_sw->buf, rxbuf, time_ns); |
189 | done: | 177 | done: |
@@ -213,6 +201,7 @@ int ad799x_register_ring_funcs_and_init(struct iio_dev *indio_dev) | |||
213 | indio_dev->ring->preenable = &ad799x_ring_preenable; | 201 | indio_dev->ring->preenable = &ad799x_ring_preenable; |
214 | indio_dev->ring->postenable = &iio_triggered_ring_postenable; | 202 | indio_dev->ring->postenable = &iio_triggered_ring_postenable; |
215 | indio_dev->ring->predisable = &iio_triggered_ring_predisable; | 203 | indio_dev->ring->predisable = &iio_triggered_ring_predisable; |
204 | indio_dev->ring->scan_timestamp = true; | ||
216 | 205 | ||
217 | INIT_WORK(&st->poll_work, &ad799x_poll_bh_to_ring); | 206 | INIT_WORK(&st->poll_work, &ad799x_poll_bh_to_ring); |
218 | 207 | ||