From bed8d5381c8cf34fd7511cd02bb7e312ec83addf Mon Sep 17 00:00:00 2001 From: H Hartley Sweeten Date: Tue, 13 Jan 2015 10:16:21 -0700 Subject: [PATCH] staging: comedi: pcl818: introduce pcl818_isadma_disable() According to Documentation/DMA-ISA-LPC.txt, the DMA lock needs to be claimed before using any of the ISA DMA routines. Introduce a helper function to disable the ISA DMA controller and add the necessary locking calls. Signed-off-by: H Hartley Sweeten Reviewed-by: Ian Abbott Signed-off-by: Greg Kroah-Hartman --- drivers/staging/comedi/drivers/pcl818.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/drivers/staging/comedi/drivers/pcl818.c b/drivers/staging/comedi/drivers/pcl818.c index 4f5f4e94ae0f..a1279c24afb9 100644 --- a/drivers/staging/comedi/drivers/pcl818.c +++ b/drivers/staging/comedi/drivers/pcl818.c @@ -342,6 +342,15 @@ static void pcl818_isadma_program(unsigned int dma_chan, release_dma_lock(flags); } +static void pcl818_isadma_disable(unsigned int dma_chan) +{ + unsigned long flags; + + flags = claim_dma_lock(); + disable_dma(dma_chan); + release_dma_lock(flags); +} + static void pcl818_start_pacer(struct comedi_device *dev, bool load_counters) { struct pcl818_private *devpriv = dev->private; @@ -364,7 +373,7 @@ static void pcl818_ai_setup_dma(struct comedi_device *dev, struct pcl818_dma_desc *dma = &devpriv->dma_desc[0]; struct comedi_cmd *cmd = &s->async->cmd; - disable_dma(devpriv->dma); /* disable dma */ + pcl818_isadma_disable(devpriv->dma); if (cmd->stop_src == TRIG_COUNT) { dma->size = cmd->stop_arg * comedi_bytes_per_scan(s); devpriv->dma_runs_to_end = dma->size / devpriv->hwdmasize; @@ -388,7 +397,7 @@ static void pcl818_ai_setup_next_dma(struct comedi_device *dev, struct comedi_cmd *cmd = &s->async->cmd; struct pcl818_dma_desc *dma; - disable_dma(devpriv->dma); + pcl818_isadma_disable(devpriv->dma); devpriv->cur_dma = 1 - devpriv->cur_dma; if (devpriv->dma_runs_to_end > -1 || cmd->stop_src == TRIG_NONE) { /* switch dma bufs */ @@ -879,7 +888,7 @@ static int pcl818_ai_cancel(struct comedi_device *dev, return 0; } } - disable_dma(devpriv->dma); + pcl818_isadma_disable(devpriv->dma); } outb(PCL818_CTRL_DISABLE_TRIG, dev->iobase + PCL818_CTRL_REG); -- 2.39.5