[ARM] Remove '__address' from scatterlist and convert to DMA API
authorRussell King <rmk@dyn-67.arm.linux.org.uk>
Wed, 4 Jan 2006 15:08:30 +0000 (15:08 +0000)
committerRussell King <rmk+kernel@arm.linux.org.uk>
Wed, 4 Jan 2006 15:08:30 +0000 (15:08 +0000)
The old __address element in struct scatterlist remained from older
kernels because the ARM DMA emulation code made use of it.  Move
this field into struct dma_struct, and convert DMA emulation code
to setup a SG entry as required.

Also, convert DMA emulation code to use the new DMA API rather
than the PCI DMA API.

Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
arch/arm/kernel/dma-isa.c
arch/arm/kernel/dma.c
arch/arm/mach-rpc/dma.c
include/asm-arm/mach/dma.h
include/asm-arm/scatterlist.h

index e9a36304ec3e0c7b1db77845e835ec2a5d3ac018..03532769a97f38840bea46f2969c914d857eb9d4 100644 (file)
@@ -18,7 +18,7 @@
  */
 #include <linux/ioport.h>
 #include <linux/init.h>
-#include <linux/pci.h>
+#include <linux/dma-mapping.h>
 
 #include <asm/dma.h>
 #include <asm/io.h>
@@ -65,37 +65,41 @@ static void isa_enable_dma(dmach_t channel, dma_t *dma)
 {
        if (dma->invalid) {
                unsigned long address, length;
-               unsigned int mode, direction;
+               unsigned int mode;
+               enum dma_data_direction direction;
 
                mode = channel & 3;
                switch (dma->dma_mode & DMA_MODE_MASK) {
                case DMA_MODE_READ:
                        mode |= ISA_DMA_MODE_READ;
-                       direction = PCI_DMA_FROMDEVICE;
+                       direction = DMA_FROM_DEVICE;
                        break;
 
                case DMA_MODE_WRITE:
                        mode |= ISA_DMA_MODE_WRITE;
-                       direction = PCI_DMA_TODEVICE;
+                       direction = DMA_TO_DEVICE;
                        break;
 
                case DMA_MODE_CASCADE:
                        mode |= ISA_DMA_MODE_CASCADE;
-                       direction = PCI_DMA_BIDIRECTIONAL;
+                       direction = DMA_BIDIRECTIONAL;
                        break;
 
                default:
-                       direction = PCI_DMA_NONE;
+                       direction = DMA_NONE;
                        break;
                }
 
-               if (!dma->using_sg) {
+               if (!dma->sg) {
                        /*
                         * Cope with ISA-style drivers which expect cache
                         * coherence.
                         */
-                       dma->buf.dma_address = pci_map_single(NULL,
-                               dma->buf.__address, dma->buf.length,
+                       dma->sg = &dma->buf;
+                       dma->sgcount = 1;
+                       dma->buf.length = dma->count;
+                       dma->buf.dma_address = dma_map_single(NULL,
+                               dma->addr, dma->count,
                                direction);
                }
 
index 3aedada71046810420f32671052cf42bf8b2b441..913fd947528c06d64dbf4bb9e1f40a940020225c 100644 (file)
@@ -123,7 +123,6 @@ void set_dma_sg (dmach_t channel, struct scatterlist *sg, int nr_sg)
 
        dma->sg = sg;
        dma->sgcount = nr_sg;
-       dma->using_sg = 1;
        dma->invalid = 1;
 }
 
@@ -139,10 +138,8 @@ void __set_dma_addr (dmach_t channel, void *addr)
                printk(KERN_ERR "dma%d: altering DMA address while "
                       "DMA active\n", channel);
 
-       dma->sg = &dma->buf;
-       dma->sgcount = 1;
-       dma->buf.__address = addr;
-       dma->using_sg = 0;
+       dma->sg = NULL;
+       dma->addr = addr;
        dma->invalid = 1;
 }
 
@@ -158,10 +155,8 @@ void set_dma_count (dmach_t channel, unsigned long count)
                printk(KERN_ERR "dma%d: altering DMA count while "
                       "DMA active\n", channel);
 
-       dma->sg = &dma->buf;
-       dma->sgcount = 1;
-       dma->buf.length = count;
-       dma->using_sg = 0;
+       dma->sg = NULL;
+       dma->count = count;
        dma->invalid = 1;
 }
 
index bc0747439fb36ea5726e03b6d2584d2f9dd99447..bd86ffba8810e9b3b1716df97d60cacb1dfd2857 100644 (file)
@@ -13,7 +13,7 @@
 #include <linux/mman.h>
 #include <linux/init.h>
 #include <linux/interrupt.h>
-#include <linux/pci.h>
+#include <linux/dma-mapping.h>
 
 #include <asm/page.h>
 #include <asm/dma.h>
@@ -148,11 +148,14 @@ static void iomd_enable_dma(dmach_t channel, dma_t *dma)
                 * Cope with ISA-style drivers which expect cache
                 * coherence.
                 */
-               if (!dma->using_sg) {
-                       dma->buf.dma_address = pci_map_single(NULL,
-                               dma->buf.__address, dma->buf.length,
+               if (!dma->sg) {
+                       dma->sg = &dma->buf;
+                       dma->sgcount = 1;
+                       dma->buf.length = dma->count;
+                       dma->buf.dma_address = dma_map_single(NULL,
+                               dma->addr, dma->count,
                                dma->dma_mode == DMA_MODE_READ ?
-                               PCI_DMA_FROMDEVICE : PCI_DMA_TODEVICE);
+                               DMA_FROM_DEVICE : DMA_TO_DEVICE);
                }
 
                iomd_writeb(DMA_CR_C, dma_base + CR);
@@ -239,7 +242,7 @@ static void floppy_enable_dma(dmach_t channel, dma_t *dma)
        unsigned int fiqhandler_length;
        struct pt_regs regs;
 
-       if (dma->using_sg)
+       if (dma->sg)
                BUG();
 
        if (dma->dma_mode == DMA_MODE_READ) {
@@ -252,8 +255,8 @@ static void floppy_enable_dma(dmach_t channel, dma_t *dma)
                fiqhandler_length = &floppy_fiqout_end - &floppy_fiqout_start;
        }
 
-       regs.ARM_r9  = dma->buf.length;
-       regs.ARM_r10 = (unsigned long)dma->buf.__address;
+       regs.ARM_r9  = dma->count;
+       regs.ARM_r10 = (unsigned long)dma->addr;
        regs.ARM_fp  = (unsigned long)FLOPPYDMA_BASE;
 
        if (claim_fiq(&fh)) {
index 31bf716106ee964f8c75a4207e0b8e2e0d62686b..e7c4a20aad531c72de46e36c296aa9fd24d8edb9 100644 (file)
@@ -25,13 +25,15 @@ struct dma_ops {
 };
 
 struct dma_struct {
+       void            *addr;          /* single DMA address           */
+       unsigned long   count;          /* single DMA size              */
        struct scatterlist buf;         /* single DMA                   */
        int             sgcount;        /* number of DMA SG             */
        struct scatterlist *sg;         /* DMA Scatter-Gather List      */
 
        unsigned int    active:1;       /* Transfer active              */
        unsigned int    invalid:1;      /* Address/Count changed        */
-       unsigned int    using_sg:1;     /* using scatter list?          */
+
        dmamode_t       dma_mode;       /* DMA mode                     */
        int             speed;          /* DMA speed                    */
 
index 83b876fb04cc2c0074bed7d43b8c9f4e69173a96..de2f65eb42ed7cad529e8369c3dce85e505f2127 100644 (file)
@@ -9,7 +9,6 @@ struct scatterlist {
        unsigned int    offset;         /* buffer offset                 */
        dma_addr_t      dma_address;    /* dma address                   */
        unsigned int    length;         /* length                        */
-       char            *__address;     /* for set_dma_addr              */
 };
 
 /*