From 7a37b7a7556fe6b4108ad7cea25a484b87d11ee9 Mon Sep 17 00:00:00 2001 From: H Hartley Sweeten Date: Mon, 12 Jan 2015 10:55:58 -0700 Subject: [PATCH] staging: comedi: pcl818: remove VIRT_TO_BUS dependancy Use dma_{alloc,free}_coherent() to allocate and free the DMA buffers. This removes the dependancy on VIRT_TO_BUS. Signed-off-by: H Hartley Sweeten Reviewed-by: Ian Abbott Signed-off-by: Greg Kroah-Hartman --- drivers/staging/comedi/Kconfig | 2 +- drivers/staging/comedi/drivers/pcl818.c | 25 ++++++++++++------------- 2 files changed, 13 insertions(+), 14 deletions(-) diff --git a/drivers/staging/comedi/Kconfig b/drivers/staging/comedi/Kconfig index 76d66e02159e..c48ee226724b 100644 --- a/drivers/staging/comedi/Kconfig +++ b/drivers/staging/comedi/Kconfig @@ -188,7 +188,7 @@ config COMEDI_PCL816 config COMEDI_PCL818 tristate "Advantech PCL-718 and PCL-818 ISA card support" - depends on VIRT_TO_BUS && ISA_DMA_API + depends on ISA_DMA_API ---help--- Enable support for Advantech PCL-818 ISA cards PCL-818L, PCL-818H, PCL-818HD, PCL-818HG, PCL-818 and PCL-718 diff --git a/drivers/staging/comedi/drivers/pcl818.c b/drivers/staging/comedi/drivers/pcl818.c index f34c5cc03834..3656ecf10813 100644 --- a/drivers/staging/comedi/drivers/pcl818.c +++ b/drivers/staging/comedi/drivers/pcl818.c @@ -303,13 +303,12 @@ static const struct pcl818_board boardtypes[] = { }; struct pcl818_dma_desc { - unsigned long dmabuf; /* pointers to begin of DMA buffers */ - unsigned int hwdmaptr; /* hardware address of DMA buffers */ + void *virt_addr; /* virtual address of DMA buffer */ + dma_addr_t hw_addr; /* hardware (bus) address of DMA buffer */ }; struct pcl818_private { unsigned int dma; /* used DMA, 0=don't use DMA */ - unsigned int dmapages; unsigned int hwdmasize; struct pcl818_dma_desc dma_desc[2]; int cur_dma; @@ -367,7 +366,7 @@ static void pcl818_ai_setup_dma(struct comedi_device *dev, set_dma_mode(devpriv->dma, DMA_MODE_READ); flags = claim_dma_lock(); clear_dma_ff(devpriv->dma); - set_dma_addr(devpriv->dma, dma->hwdmaptr); + set_dma_addr(devpriv->dma, dma->hw_addr); set_dma_count(devpriv->dma, bytes); release_dma_lock(flags); enable_dma(devpriv->dma); @@ -388,7 +387,7 @@ static void pcl818_ai_setup_next_dma(struct comedi_device *dev, dma = &devpriv->dma_desc[devpriv->cur_dma]; set_dma_mode(devpriv->dma, DMA_MODE_READ); flags = claim_dma_lock(); - set_dma_addr(devpriv->dma, dma->hwdmaptr); + set_dma_addr(devpriv->dma, dma->hw_addr); if (devpriv->dma_runs_to_end || cmd->stop_src == TRIG_NONE) set_dma_count(devpriv->dma, devpriv->hwdmasize); else @@ -565,7 +564,7 @@ static void pcl818_handle_dma(struct comedi_device *dev, { struct pcl818_private *devpriv = dev->private; struct pcl818_dma_desc *dma = &devpriv->dma_desc[devpriv->cur_dma]; - unsigned short *ptr = (unsigned short *)dma->dmabuf; + unsigned short *ptr = dma->virt_addr; unsigned int chan; unsigned int val; int i, len, bufptr; @@ -1072,16 +1071,15 @@ static int pcl818_alloc_dma(struct comedi_device *dev, unsigned int dma_chan) return 0; devpriv->dma = dma_chan; - devpriv->dmapages = 2; /* we need 16KB */ - devpriv->hwdmasize = (1 << devpriv->dmapages) * PAGE_SIZE; + devpriv->hwdmasize = PAGE_SIZE * 4; /* we need 16KB */ for (i = 0; i < 2; i++) { dma = &devpriv->dma_desc[i]; - dma->dmabuf = __get_dma_pages(GFP_KERNEL, devpriv->dmapages); - if (!dma->dmabuf) + dma->virt_addr = dma_alloc_coherent(NULL, devpriv->hwdmasize, + &dma->hw_addr, GFP_KERNEL); + if (!dma->virt_addr) return -ENOMEM; - dma->hwdmaptr = virt_to_bus((void *)dma->dmabuf); } return 0; } @@ -1099,8 +1097,9 @@ static void pcl818_free_dma(struct comedi_device *dev) free_dma(devpriv->dma); for (i = 0; i < 2; i++) { dma = &devpriv->dma_desc[i]; - if (dma->dmabuf) - free_pages(dma->dmabuf, devpriv->dmapages); + if (dma->virt_addr) + dma_free_coherent(NULL, devpriv->hwdmasize, + dma->virt_addr, dma->hw_addr); } }