840163c65d0c363d68c80019a2ad552c35a13caa
[linux-2.6.34-lpc32xx.git] / arch / arm / mach-lpc32xx / include / mach / dma.h
1 /*
2  * asm-arm/arch-lpc32xx/dma.h
3  *
4  * Author: Kevin Wells <kevin.wells@nxp.com>
5  *
6  * Copyright (C) 2008 NXP Semiconductors
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; either version 2 of the License, or
11  * (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, write to the Free Software
20  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
21  */
22
23 #ifndef __ASM_ARCH_DMA_H
24 #define __ASM_ARCH_DMA_H
25
26 #include <mach/platform.h>
27
28 #define MAX_DMA_CHANNELS 8
29
30 #define DMA_CH_SDCARD_TX 0
31 #define DMA_CH_SDCARD_RX 1
32 #define DMA_CH_I2S_TX 2
33 #define DMA_CH_I2S_RX 3
34
35 enum {
36         DMA_INT_UNKNOWN = 0,
37         DMA_ERR_INT = 1,
38         DMA_TC_INT = 2,
39 };
40
41 /*
42  * DMA channel control structure
43  */
44 struct dma_config {
45         int ch;         /* Channel # to use */
46         int tc_inten;   /* !0 = Enable TC interrupts for this channel */
47         int err_inten;  /* !0 = Enable error interrupts for this channel */
48         int src_size;   /* Source xfer size - must be 1, 2, or 4 */
49         int src_inc;    /* !0 = Enable source address increment */
50         int src_ahb1;   /* !0 = Use AHB1 for source transfer */
51         int src_bsize;  /* Source burst size (ie, DMAC_CHAN_SRC_BURST_xxx) */
52         u32 src_prph;   /* Source peripheral (ie, DMA_PERID_xxxx) */
53         int dst_size;   /* Destination xfer size - must be 1, 2, or 4 */
54         int dst_inc;    /* !0 = Enable destination address increment */
55         int dst_ahb1;   /* !0 = Use AHB1 for destination transfer */
56         int dst_bsize;  /* Destination burst size (ie, DMAC_CHAN_DEST_BURST_xxx) */
57         u32 dst_prph;   /* Destination peripheral (ie, DMA_PERID_xxxx) */
58         u32 flowctrl;   /* Flow control (ie, DMAC_CHAN_FLOW_xxxxxx) */
59 };
60
61 /*
62  * Channel enable and disable functions
63  */
64 extern int lpc32xx_dma_ch_enable(int ch);
65 extern int lpc32xx_dma_ch_disable(int ch);
66
67 /*
68  * Channel allocation and deallocation functions
69  */
70 extern int lpc32xx_dma_ch_get(struct dma_config *dmachcfg,
71                                 char *name,
72                                 void *irq_handler,
73                                 void *data);
74 extern int lpc32xx_dma_ch_put(int ch);
75 extern int lpc32xx_dma_ch_pause_unpause(int ch, int pause);
76
77 /*
78  * Setup or start an unbound DMA transfer
79  */
80 extern int lpc32xx_dma_start_pflow_xfer(int ch,
81                                         void *src,
82                                         void *dst,
83                                         int enable);
84
85 /*
86  * DMA linked list support
87  */
88 extern u32 lpc32xx_dma_alloc_llist(int ch,
89                                    int entries);
90 extern void lpc32xx_dma_dealloc_llist(int ch);
91 extern u32 lpc32xx_dma_llist_v_to_p(int ch,
92                                     u32 vlist);
93 extern u32 lpc32xx_dma_llist_p_to_v(int ch,
94                                     u32 plist);
95 extern u32 lpc32xx_dma_get_llist_head(int ch);
96 extern void lpc32xx_dma_flush_llist(int ch);
97 extern u32 lpc32xx_dma_queue_llist_entry(int ch,
98                                          void *src,
99                                          void *dst,
100                                          int size);
101 extern u32 lpc32xx_get_free_llist_entry(int ch);
102
103 #endif /* _ASM_ARCH_DMA_H */
104