14baa9922SRussell King /* 24baa9922SRussell King * arch/arm/include/asm/mach/dma.h 34baa9922SRussell King * 44baa9922SRussell King * Copyright (C) 1998-2000 Russell King 54baa9922SRussell King * 64baa9922SRussell King * This program is free software; you can redistribute it and/or modify 74baa9922SRussell King * it under the terms of the GNU General Public License version 2 as 84baa9922SRussell King * published by the Free Software Foundation. 94baa9922SRussell King * 104baa9922SRussell King * This header file describes the interface between the generic DMA handler 114baa9922SRussell King * (dma.c) and the architecture-specific DMA backends (dma-*.c) 124baa9922SRussell King */ 134baa9922SRussell King 144baa9922SRussell King struct dma_struct; 154baa9922SRussell King typedef struct dma_struct dma_t; 164baa9922SRussell King 174baa9922SRussell King struct dma_ops { 181df81302SRussell King int (*request)(unsigned int, dma_t *); /* optional */ 191df81302SRussell King void (*free)(unsigned int, dma_t *); /* optional */ 201df81302SRussell King void (*enable)(unsigned int, dma_t *); /* mandatory */ 211df81302SRussell King void (*disable)(unsigned int, dma_t *); /* mandatory */ 221df81302SRussell King int (*residue)(unsigned int, dma_t *); /* optional */ 231df81302SRussell King int (*setspeed)(unsigned int, dma_t *, int); /* optional */ 24*8c56afcbSRussell King const char *type; 254baa9922SRussell King }; 264baa9922SRussell King 274baa9922SRussell King struct dma_struct { 284baa9922SRussell King void *addr; /* single DMA address */ 294baa9922SRussell King unsigned long count; /* single DMA size */ 304baa9922SRussell King struct scatterlist buf; /* single DMA */ 314baa9922SRussell King int sgcount; /* number of DMA SG */ 324baa9922SRussell King struct scatterlist *sg; /* DMA Scatter-Gather List */ 334baa9922SRussell King 344baa9922SRussell King unsigned int active:1; /* Transfer active */ 354baa9922SRussell King unsigned int invalid:1; /* Address/Count changed */ 364baa9922SRussell King 374baa9922SRussell King dmamode_t dma_mode; /* DMA mode */ 384baa9922SRussell King int speed; /* DMA speed */ 394baa9922SRussell King 404baa9922SRussell King unsigned int lock; /* Device is allocated */ 414baa9922SRussell King const char *device_id; /* Device name */ 424baa9922SRussell King 43*8c56afcbSRussell King const struct dma_ops *d_ops; 444baa9922SRussell King }; 454baa9922SRussell King 46ad9dd94cSRussell King struct floppy_dma { 47ad9dd94cSRussell King struct dma_struct dma; 48ad9dd94cSRussell King unsigned int fiq; 49ad9dd94cSRussell King }; 50ad9dd94cSRussell King 51ad9dd94cSRussell King struct iomd_dma { 52ad9dd94cSRussell King struct dma_struct dma; 53ad9dd94cSRussell King unsigned int state; 54ad9dd94cSRussell King unsigned long base; /* Controller base address */ 55ad9dd94cSRussell King int irq; /* Controller IRQ */ 56ad9dd94cSRussell King struct scatterlist cur_sg; /* Current controller buffer */ 57ad9dd94cSRussell King }; 58ad9dd94cSRussell King 592f757f2aSRussell King /* 602f757f2aSRussell King * isa_dma_add - add an ISA-style DMA channel 614baa9922SRussell King */ 622f757f2aSRussell King extern int isa_dma_add(unsigned int, dma_t *dma); 634baa9922SRussell King 642f757f2aSRussell King /* 652f757f2aSRussell King * Add the ISA DMA controller. Always takes channels 0-7. 662f757f2aSRussell King */ 672f757f2aSRussell King extern void isa_init_dma(void); 68