[PATCH 14/25] staging: comedi: pcl812: introduce pcl812_isadma_program()

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Introduce a helper function to program the ISA DMA controller. Program
the ISA DMA as described in Documentation/DMA-ISA-LPC.txt.

Signed-off-by: H Hartley Sweeten <hsweeten@xxxxxxxxxxxxxxxxxxx>
Cc: Ian Abbott <abbotti@xxxxxxxxx>
Cc: Greg Kroah-Hartman <gregkh@xxxxxxxxxxxxxxxxxxx>
---
 drivers/staging/comedi/drivers/pcl812.c | 49 +++++++++++++++++----------------
 1 file changed, 25 insertions(+), 24 deletions(-)

diff --git a/drivers/staging/comedi/drivers/pcl812.c b/drivers/staging/comedi/drivers/pcl812.c
index 2c2e7dd..6b38147 100644
--- a/drivers/staging/comedi/drivers/pcl812.c
+++ b/drivers/staging/comedi/drivers/pcl812.c
@@ -533,6 +533,20 @@ struct pcl812_private {
 	unsigned int ai_eos:1;
 };
 
+static void pcl812_isadma_program(unsigned int dma_chan,
+				  struct pcl812_dma_desc *dma)
+{
+	unsigned long flags;
+
+	flags = claim_dma_lock();
+	clear_dma_ff(dma_chan);
+	set_dma_mode(dma_chan, DMA_MODE_READ);
+	set_dma_addr(dma_chan, dma->hw_addr);
+	set_dma_count(dma_chan, dma->size);
+	enable_dma(dma_chan);
+	release_dma_lock(flags);
+}
+
 static void pcl812_start_pacer(struct comedi_device *dev, bool load_timers)
 {
 	struct pcl812_private *devpriv = dev->private;
@@ -555,7 +569,6 @@ static void pcl812_ai_setup_dma(struct comedi_device *dev,
 	struct pcl812_dma_desc *dma0 = &devpriv->dma_desc[0];
 	struct pcl812_dma_desc *dma1 = &devpriv->dma_desc[1];
 	struct comedi_cmd *cmd = &s->async->cmd;
-	unsigned int dma_flags;
 	unsigned int bytes;
 
 	/*  we use EOS, so adapt DMA buffer to one scan */
@@ -595,13 +608,8 @@ static void pcl812_ai_setup_dma(struct comedi_device *dev,
 		devpriv->ai_eos = 0;
 	}
 	devpriv->cur_dma = 0;
-	set_dma_mode(devpriv->dma, DMA_MODE_READ);
-	dma_flags = claim_dma_lock();
-	clear_dma_ff(devpriv->dma);
-	set_dma_addr(devpriv->dma, dma0->hw_addr);
-	set_dma_count(devpriv->dma, dma0->size);
-	release_dma_lock(dma_flags);
-	enable_dma(devpriv->dma);
+
+	pcl812_isadma_program(devpriv->dma, dma0);
 }
 
 static void pcl812_ai_setup_next_dma(struct comedi_device *dev,
@@ -609,26 +617,19 @@ static void pcl812_ai_setup_next_dma(struct comedi_device *dev,
 {
 	struct pcl812_private *devpriv = dev->private;
 	struct pcl812_dma_desc *dma;
-	unsigned long dma_flags;
+
+	disable_dma(devpriv->dma);
 
 	devpriv->cur_dma = 1 - devpriv->cur_dma;
 	dma = &devpriv->dma_desc[devpriv->cur_dma];
-	disable_dma(devpriv->dma);
-	set_dma_mode(devpriv->dma, DMA_MODE_READ);
-	dma_flags = claim_dma_lock();
-	set_dma_addr(devpriv->dma, dma->hw_addr);
-	if (devpriv->ai_eos) {
-		set_dma_count(devpriv->dma, dma->size);
-	} else {
-		if (devpriv->dma_runs_to_end) {
-			set_dma_count(devpriv->dma, dma->size);
-		} else {
-			set_dma_count(devpriv->dma, devpriv->last_dma_run);
-		}
-		devpriv->dma_runs_to_end--;
+	if (!devpriv->ai_eos) {
+		if (devpriv->dma_runs_to_end)
+			devpriv->dma_runs_to_end--;
+		else
+			dma->size = devpriv->last_dma_run;
 	}
-	release_dma_lock(dma_flags);
-	enable_dma(devpriv->dma);
+
+	pcl812_isadma_program(devpriv->dma, dma);
 }
 
 static void pcl812_ai_set_chan_range(struct comedi_device *dev,
-- 
2.0.3

_______________________________________________
devel mailing list
devel@xxxxxxxxxxxxxxxxxxxxxx
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel



[Index of Archives]     [Linux Driver Backports]     [DMA Engine]     [Linux GPIO]     [Linux SPI]     [Video for Linux]     [Linux USB Devel]     [Linux Coverity]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]
  Powered by Linux