diff options
Diffstat (limited to 'drivers/staging/comedi/comedi_buf.c')
-rw-r--r-- | drivers/staging/comedi/comedi_buf.c | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/drivers/staging/comedi/comedi_buf.c b/drivers/staging/comedi/comedi_buf.c index df4a9c4bca35..5aa86842fcce 100644 --- a/drivers/staging/comedi/comedi_buf.c +++ b/drivers/staging/comedi/comedi_buf.c @@ -509,3 +509,30 @@ void comedi_buf_memcpy_from(struct comedi_subdevice *s, unsigned int offset, } } EXPORT_SYMBOL_GPL(comedi_buf_memcpy_from); + +/* Writes an array of data points to comedi's buffer */ +unsigned int comedi_write_array_to_buffer(struct comedi_subdevice *s, + const void *data, + unsigned int num_bytes) +{ + struct comedi_async *async = s->async; + unsigned int retval; + + if (num_bytes == 0) + return 0; + + retval = comedi_buf_write_alloc(s, num_bytes); + if (retval != num_bytes) { + dev_warn(s->device->class_dev, "buffer overrun\n"); + async->events |= COMEDI_CB_OVERFLOW; + return 0; + } + + comedi_buf_memcpy_to(s, 0, data, num_bytes); + comedi_buf_write_free(s, num_bytes); + comedi_inc_scan_progress(s, num_bytes); + async->events |= COMEDI_CB_BLOCK; + + return num_bytes; +} +EXPORT_SYMBOL_GPL(comedi_write_array_to_buffer); |