xref: /linux/arch/arm/include/asm/mach/dma.h (revision 8c56afcb)
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