staging: comedi: addi_apci_3120: use dma_alloc_coherent()
authorIan Abbott <abbotti@mev.co.uk>
Fri, 12 Sep 2014 11:19:56 +0000 (12:19 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 19 Sep 2014 22:39:39 +0000 (15:39 -0700)
Use `dma_alloc_coherent()` to allocate the DMA buffers instead of
using `__get_free_pages()` to allocate and `virt_to_bus()` to get the
hardware address.  The coherent buffers are fairly small - at most 4
pages (although there are two of them).  Use of `virt_to_bus()` is
discouraged.

Note: `struct addi_private` is used by some other ADDI-DATA drivers as
well, but this is the only one using the affected members.

Signed-off-by: Ian Abbott <abbotti@mev.co.uk>
Reviewed-by: H Hartley Sweeten <hsweeten@visionengravers.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/comedi/Kconfig
drivers/staging/comedi/drivers/addi-data/addi_common.h
drivers/staging/comedi/drivers/addi_apci_3120.c

index 9eaffd4df1542fde7cee7e7bda6978f7926fa3af..06826f46929a7920ec495d50b85cd0de3c68f156 100644 (file)
@@ -677,7 +677,7 @@ config COMEDI_ADDI_APCI_2200
 
 config COMEDI_ADDI_APCI_3120
        tristate "ADDI-DATA APCI_3120/3001 support"
-       depends on VIRT_TO_BUS
+       depends on HAS_DMA
        select COMEDI_FC
        ---help---
          Enable support for ADDI-DATA APCI_3120/3001 cards
index 88295e40eb6ac01453013eca5b0fc7aa2167d89e..e2a3ffeee5cfedcad1d647ac5a11e6453e6d0554 100644 (file)
@@ -107,10 +107,9 @@ struct addi_private {
        unsigned char b_DmaDoubleBuffer;        /*  we can use double buffering */
        unsigned int ui_DmaActualBuffer;        /*  which buffer is used now */
        unsigned short *ul_DmaBufferVirtual[2]; /*  pointers to DMA buffer */
-       unsigned int ul_DmaBufferHw[2]; /*  hw address of DMA buff */
+       dma_addr_t ul_DmaBufferHw[2];           /*  hw address of DMA buff */
        unsigned int ui_DmaBufferSize[2];       /*  size of dma buffer in bytes */
        unsigned int ui_DmaBufferUsesize[2];    /*  which size we may now used for transfer */
-       unsigned int ui_DmaBufferPageOrder[2];  /*  log2 of pages in buffer */
        unsigned char b_DigitalOutputRegister;  /*  Digital Output Register */
        unsigned char b_OutputMemoryStatus;
        unsigned char b_TimerSelectMode;        /*  Contain data written at iobase + 0C */
index 57c36ed9588ca911046e1513409d35e75e98e661..1025541fb4a3b1a78f08452bdbbb910d5affbb54 100644 (file)
@@ -95,17 +95,16 @@ static int apci3120_auto_attach(struct comedi_device *dev,
        for (i = 0; i < 2; i++) {
                for (order = 2; order >= 0; order--) {
                        devpriv->ul_DmaBufferVirtual[i] =
-                           (void *)__get_free_pages(GFP_KERNEL, order);
+                           dma_alloc_coherent(dev->hw_dev, PAGE_SIZE << order,
+                                              &devpriv->ul_DmaBufferHw[i],
+                                              GFP_KERNEL);
 
                        if (devpriv->ul_DmaBufferVirtual[i])
                                break;
                }
                if (!devpriv->ul_DmaBufferVirtual[i])
                        break;
-               devpriv->ui_DmaBufferPageOrder[i] = order;
                devpriv->ui_DmaBufferSize[i] = PAGE_SIZE << order;
-               devpriv->ul_DmaBufferHw[i] =
-                   virt_to_bus(devpriv->ul_DmaBufferVirtual[i]);
        }
        if (!devpriv->ul_DmaBufferVirtual[0])
                devpriv->us_UseDma = 0;
@@ -198,15 +197,16 @@ static void apci3120_detach(struct comedi_device *dev)
                apci3120_reset(dev);
        comedi_pci_detach(dev);
        if (devpriv) {
-               if (devpriv->ul_DmaBufferVirtual[0]) {
-                       free_pages((unsigned long)devpriv->
-                               ul_DmaBufferVirtual[0],
-                               devpriv->ui_DmaBufferPageOrder[0]);
-               }
-               if (devpriv->ul_DmaBufferVirtual[1]) {
-                       free_pages((unsigned long)devpriv->
-                               ul_DmaBufferVirtual[1],
-                               devpriv->ui_DmaBufferPageOrder[1]);
+               unsigned int i;
+
+               for (i = 0; i < 2; i++) {
+                       if (devpriv->ul_DmaBufferVirtual[i]) {
+                               dma_free_coherent(dev->hw_dev,
+                                                 devpriv->ui_DmaBufferSize[i],
+                                                 devpriv->
+                                                 ul_DmaBufferVirtual[i],
+                                                 devpriv->ul_DmaBufferHw[i]);
+                       }
                }
        }
 }