staging: comedi: comedi_buf: introduce comedi_buf_read_samples()
authorH Hartley Sweeten <hsweeten@visionengravers.com>
Wed, 22 Oct 2014 21:36:34 +0000 (14:36 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 29 Oct 2014 08:01:19 +0000 (16:01 +0800)
Introduce a generic method to read samples from the async buffer.

The number of requested samples is clampled to the number of samples that
would fill the async buffer. The size of each sample is determined using
the bytes_per_sample() helper. The number of bytes need are then read
from the async buffer using comedi_read_array_from_buffer().

This will allow converting all the comedi drivers to use a common method
to read data from the async buffer.

Since comedi_read_array_from_buffer() sets the COMEDI_CB_BLOCK event after
reading the data, those events can be removed from the drivers.

In addition, comedi_inc_scan_progress() will automatically detect the end of
scan and set the COMEDI_CB_EOS event. Those events can also be removed from
the drivers.

Signed-off-by: H Hartley Sweeten <hsweeten@visionengravers.com>
Reviewed-by: Ian Abbott <abbotti@mev.co.uk>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/comedi/comedi_buf.c
drivers/staging/comedi/comedidev.h

index c60a45ad12b90ef99aa26ba6f44112b9cecf8514..88a7cae97811ec6160aac19c64d5fdd348389fc7 100644 (file)
@@ -575,3 +575,30 @@ unsigned int comedi_read_array_from_buffer(struct comedi_subdevice *s,
        return num_bytes;
 }
 EXPORT_SYMBOL_GPL(comedi_read_array_from_buffer);
+
+/**
+ * comedi_buf_read_samples - read sample data from comedi buffer
+ * @s: comedi_subdevice struct
+ * @data: destination
+ * @nsamples: maximum number of samples to read
+ *
+ * Reads up to nsamples from the comedi buffer associated with the subdevice,
+ * marks it as read and updates the acquisition scan progress.
+ *
+ * Returns the amount of data read in bytes.
+ */
+unsigned int comedi_buf_read_samples(struct comedi_subdevice *s,
+                                    void *data, unsigned int nsamples)
+{
+       unsigned int max_samples;
+       unsigned int nbytes;
+
+       max_samples = s->async->prealloc_bufsz / bytes_per_sample(s);
+       if (nsamples > max_samples)
+               nsamples = max_samples;
+
+       nbytes = nsamples * bytes_per_sample(s);
+
+       return comedi_read_array_from_buffer(s, data, nbytes);
+}
+EXPORT_SYMBOL_GPL(comedi_buf_read_samples);
index fb8ff84dab35452a620696b97ae53bffcee3b009..ba4084bd5ed869bc17cf5c309286e1a9b0f999b4 100644 (file)
@@ -453,6 +453,8 @@ unsigned int comedi_write_array_to_buffer(struct comedi_subdevice *s,
                                          unsigned int num_bytes);
 unsigned int comedi_read_array_from_buffer(struct comedi_subdevice *s,
                                           void *data, unsigned int num_bytes);
+unsigned int comedi_buf_read_samples(struct comedi_subdevice *s,
+                                    void *data, unsigned int nsamples);
 
 /* drivers.c - general comedi driver functions */