summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorH Hartley Sweeten <hsweeten@visionengravers.com>2015-01-14 10:05:12 -0700
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2015-01-17 14:32:55 -0800
commit421f1b6832efd618c5ce3e639642a49d38ba5a37 (patch)
treeb49270e95cdb0ebc7a4a1962aa04ba0cd762e275 /drivers
parent296e3f1816dbdb5f1c3213386756e362263b17b5 (diff)
staging: comedi: pcl818: use common function to setup dma
THe pcl818_ai_setup_dma() and pcl818_ai_setup_next_dma() functions are similar other than the buffer switch and the inclusion of the "unread_samples" in pcl818_ai_setup_next_dma() when calculating the dma size. Merge these two functions by initializing the 'dma->cur_dma' in the callers and passing '0' for the "unread_samples" when first starting the DMA. 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>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/staging/comedi/drivers/pcl818.c48
1 files changed, 13 insertions, 35 deletions
diff --git a/drivers/staging/comedi/drivers/pcl818.c b/drivers/staging/comedi/drivers/pcl818.c
index fa7b4e22953f..ba2e1373f43d 100644
--- a/drivers/staging/comedi/drivers/pcl818.c
+++ b/drivers/staging/comedi/drivers/pcl818.c
@@ -332,49 +332,22 @@ static void pcl818_start_pacer(struct comedi_device *dev, bool load_counters)
}
static void pcl818_ai_setup_dma(struct comedi_device *dev,
- struct comedi_subdevice *s)
-{
- struct pcl818_private *devpriv = dev->private;
- struct comedi_isadma *dma = devpriv->dma;
- struct comedi_isadma_desc *desc = &dma->desc[0];
- unsigned int nsamples;
-
- comedi_isadma_disable(dma->chan);
-
- dma->cur_dma = 0;
-
- /*
- * Determine dma size based on the buffer maxsize and the number of
- * samples remaining in the command.
- */
- nsamples = comedi_bytes_to_samples(s, desc->maxsize);
- nsamples = comedi_nsamples_left(s, nsamples);
- desc->size = comedi_samples_to_bytes(s, nsamples);
- comedi_isadma_program(desc);
-}
-
-static void pcl818_ai_setup_next_dma(struct comedi_device *dev,
- struct comedi_subdevice *s,
- unsigned int unread_samples)
+ struct comedi_subdevice *s,
+ unsigned int unread_samples)
{
struct pcl818_private *devpriv = dev->private;
struct comedi_isadma *dma = devpriv->dma;
- struct comedi_isadma_desc *desc;
- unsigned int max_samples;
+ struct comedi_isadma_desc *desc = &dma->desc[dma->cur_dma];
+ unsigned int max_samples = comedi_bytes_to_samples(s, desc->maxsize);
unsigned int nsamples;
comedi_isadma_disable(dma->chan);
- dma->cur_dma = 1 - dma->cur_dma;
- desc = &dma->desc[dma->cur_dma];
-
/*
* Determine dma size based on the buffer maxsize plus the number of
* unread samples and the number of samples remaining in the command.
*/
- max_samples = comedi_bytes_to_samples(s, desc->maxsize);
- nsamples = max_samples + unread_samples;
- nsamples = comedi_nsamples_left(s, nsamples);
+ nsamples = comedi_nsamples_left(s, max_samples + unread_samples);
if (nsamples > unread_samples) {
nsamples -= unread_samples;
desc->size = comedi_samples_to_bytes(s, nsamples);
@@ -554,7 +527,9 @@ static void pcl818_handle_dma(struct comedi_device *dev,
unsigned int val;
int i;
- pcl818_ai_setup_next_dma(dev, s, nsamples);
+ /* restart dma with the next buffer */
+ dma->cur_dma = 1 - dma->cur_dma;
+ pcl818_ai_setup_dma(dev, s, nsamples);
for (i = 0; i < nsamples; i++) {
val = ptr[i];
@@ -790,6 +765,7 @@ static int pcl818_ai_cmd(struct comedi_device *dev,
struct comedi_subdevice *s)
{
struct pcl818_private *devpriv = dev->private;
+ struct comedi_isadma *dma = devpriv->dma;
struct comedi_cmd *cmd = &s->async->cmd;
unsigned int ctrl = 0;
unsigned int seglen;
@@ -815,8 +791,10 @@ static int pcl818_ai_cmd(struct comedi_device *dev,
outb(PCL818_CNTENABLE_PACER_ENA, dev->iobase + PCL818_CNTENABLE_REG);
- if (devpriv->dma) {
- pcl818_ai_setup_dma(dev, s);
+ if (dma) {
+ /* setup and enable dma for the first buffer */
+ dma->cur_dma = 0;
+ pcl818_ai_setup_dma(dev, s, 0);
ctrl |= PCL818_CTRL_INTE | PCL818_CTRL_IRQ(dev->irq) |
PCL818_CTRL_DMAE;