Commit ad577f8d authored by Barry Song's avatar Barry Song Committed by Greg Kroah-Hartman

staging: iio: Add a bits per element element to ring_generic allowing a...

staging: iio: Add a bits per element element to ring_generic allowing a general ring_sw_preenable_function.
Signed-off-by: default avatarBarry Song <21cnbao@gmail.com>
Signed-off-by: default avatarJonathan Cameron <jic23@cam.ac.uk>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent 69584bd6
...@@ -100,6 +100,7 @@ struct iio_ring_access_funcs { ...@@ -100,6 +100,7 @@ struct iio_ring_access_funcs {
* @access_id: device id number * @access_id: device id number
* @length: [DEVICE] number of datums in ring * @length: [DEVICE] number of datums in ring
* @bpd: [DEVICE] size of individual datum including timestamp * @bpd: [DEVICE] size of individual datum including timestamp
* @bpe: [DEVICE] size of individual channel value
* @loopcount: [INTERN] number of times the ring has looped * @loopcount: [INTERN] number of times the ring has looped
* @access_handler: [INTERN] chrdev access handling * @access_handler: [INTERN] chrdev access handling
* @ev_int: [INTERN] chrdev interface for the event chrdev * @ev_int: [INTERN] chrdev interface for the event chrdev
...@@ -121,6 +122,7 @@ struct iio_ring_buffer { ...@@ -121,6 +122,7 @@ struct iio_ring_buffer {
int access_id; int access_id;
int length; int length;
int bpd; int bpd;
int bpe;
int loopcount; int loopcount;
struct iio_handler access_handler; struct iio_handler access_handler;
struct iio_event_interface ev_int; struct iio_event_interface ev_int;
......
...@@ -431,5 +431,30 @@ void iio_sw_rb_free(struct iio_ring_buffer *r) ...@@ -431,5 +431,30 @@ void iio_sw_rb_free(struct iio_ring_buffer *r)
iio_put_ring_buffer(r); iio_put_ring_buffer(r);
} }
EXPORT_SYMBOL(iio_sw_rb_free); EXPORT_SYMBOL(iio_sw_rb_free);
int iio_sw_ring_preenable(struct iio_dev *indio_dev)
{
size_t size;
dev_dbg(&indio_dev->dev, "%s\n", __func__);
/* Check if there are any scan elements enabled, if not fail*/
if (!(indio_dev->scan_count || indio_dev->scan_timestamp))
return -EINVAL;
if (indio_dev->scan_timestamp)
if (indio_dev->scan_count)
/* Timestamp (aligned to s64) and data */
size = (((indio_dev->scan_count * indio_dev->ring->bpe)
+ sizeof(s64) - 1)
& ~(sizeof(s64) - 1))
+ sizeof(s64);
else /* Timestamp only */
size = sizeof(s64);
else /* Data only */
size = indio_dev->scan_count * indio_dev->ring->bpe;
indio_dev->ring->access.set_bpd(indio_dev->ring, size);
return 0;
}
EXPORT_SYMBOL(iio_sw_ring_preenable);
MODULE_DESCRIPTION("Industrialio I/O software ring buffer"); MODULE_DESCRIPTION("Industrialio I/O software ring buffer");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
...@@ -207,7 +207,7 @@ struct iio_sw_ring_buffer { ...@@ -207,7 +207,7 @@ struct iio_sw_ring_buffer {
struct iio_ring_buffer *iio_sw_rb_allocate(struct iio_dev *indio_dev); struct iio_ring_buffer *iio_sw_rb_allocate(struct iio_dev *indio_dev);
void iio_sw_rb_free(struct iio_ring_buffer *ring); void iio_sw_rb_free(struct iio_ring_buffer *ring);
int iio_sw_ring_preenable(struct iio_dev *indio_dev);
#else /* CONFIG_IIO_RING_BUFFER*/ #else /* CONFIG_IIO_RING_BUFFER*/
static inline void iio_ring_sw_register_funcs(struct iio_ring_access_funcs *ra) static inline void iio_ring_sw_register_funcs(struct iio_ring_access_funcs *ra)
......
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