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@xxxxxxxxxxxxxxxxxxx> Cc: Ian Abbott <abbotti@xxxxxxxxx> Cc: Greg Kroah-Hartman <gregkh@xxxxxxxxxxxxxxxxxxx> --- drivers/staging/comedi/drivers/pcl818.c | 48 +++++++++------------------------ 1 file changed, 13 insertions(+), 35 deletions(-) diff --git a/drivers/staging/comedi/drivers/pcl818.c b/drivers/staging/comedi/drivers/pcl818.c index fa7b4e2..ba2e137 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; -- 2.0.3 _______________________________________________ devel mailing list devel@xxxxxxxxxxxxxxxxxxxxxx http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel