staging: iio: Add a bits per element element to ring_generic allowing a general ring_...
authorBarry Song <21cnbao@gmail.com>
Sun, 11 Jul 2010 15:39:16 +0000 (16:39 +0100)
committerGreg Kroah-Hartman <gregkh@suse.de>
Thu, 22 Jul 2010 18:38:29 +0000 (11:38 -0700)
Signed-off-by: Barry Song <21cnbao@gmail.com>
Signed-off-by: Jonathan Cameron <jic23@cam.ac.uk>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/staging/iio/ring_generic.h
drivers/staging/iio/ring_sw.c
drivers/staging/iio/ring_sw.h

index 524a0b39b39824f774392e206221f0a21f946c37..a872d3904a33e8af6f33c535d2e157b7d6871c3d 100644 (file)
@@ -100,6 +100,7 @@ struct iio_ring_access_funcs {
  * @access_id:         device id number
  * @length:            [DEVICE] number of datums in ring
  * @bpd:               [DEVICE] size of individual datum including timestamp
+ * @bpe:               [DEVICE] size of individual channel value
  * @loopcount:         [INTERN] number of times the ring has looped
  * @access_handler:    [INTERN] chrdev access handling
  * @ev_int:            [INTERN] chrdev interface for the event chrdev
@@ -121,6 +122,7 @@ struct iio_ring_buffer {
        int                             access_id;
        int                             length;
        int                             bpd;
+       int                             bpe;
        int                             loopcount;
        struct iio_handler              access_handler;
        struct iio_event_interface      ev_int;
index 294272d0619fd0567143392d41bb6dae1babfe30..ca0e79e426cfbfa5d2fc71170af82bd659dce607 100644 (file)
@@ -431,5 +431,30 @@ void iio_sw_rb_free(struct iio_ring_buffer *r)
                iio_put_ring_buffer(r);
 }
 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_LICENSE("GPL");
index fd677f008365115abd0b23f7b47d740e5ff873c9..5c22936523a02d0cad535c03e0039108ae368758 100644 (file)
@@ -207,7 +207,7 @@ struct iio_sw_ring_buffer {
 struct iio_ring_buffer *iio_sw_rb_allocate(struct iio_dev *indio_dev);
 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*/
 static inline void iio_ring_sw_register_funcs(struct iio_ring_access_funcs *ra)