075b72292d269ec4b65b642f8b8d05e7e1ef775a
[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 #define DMA_CH_SLCNAND          4
35
36 enum {
37         DMA_INT_UNKNOWN = 0,
38         DMA_ERR_INT = 1,
39         DMA_TC_INT = 2,
40 };
41
42 /*
43  * DMA channel control structure
44  */
45 struct dma_config {
46         int ch;         /* Channel # to use */
47         int tc_inten;   /* !0 = Enable TC interrupts for this channel */
48         int err_inten;  /* !0 = Enable error interrupts for this channel */
49         int src_size;   /* Source xfer size - must be 1, 2, or 4 */
50         int src_inc;    /* !0 = Enable source address increment */
51         int src_ahb1;   /* !0 = Use AHB1 for source transfer */
52         int src_bsize;  /* Source burst size (ie, DMAC_CHAN_SRC_BURST_xxx) */
53         u32 src_prph;   /* Source peripheral (ie, DMA_PERID_xxxx) */
54         int dst_size;   /* Destination xfer size - must be 1, 2, or 4 */
55         int dst_inc;    /* !0 = Enable destination address increment */
56         int dst_ahb1;   /* !0 = Use AHB1 for destination transfer */
57         int dst_bsize;  /* Destination burst size (ie, DMAC_CHAN_DEST_BURST_xxx) */
58         u32 dst_prph;   /* Destination peripheral (ie, DMA_PERID_xxxx) */
59         u32 flowctrl;   /* Flow control (ie, DMAC_CHAN_FLOW_xxxxxx) */
60 };
61
62 /*
63  * Channel enable and disable functions
64  */
65 extern int lpc32xx_dma_ch_enable(int ch);
66 extern int lpc32xx_dma_ch_disable(int ch);
67
68 /*
69  * Channel allocation and deallocation functions
70  */
71 extern int lpc32xx_dma_ch_get(struct dma_config *dmachcfg,
72                                 char *name,
73                                 void *irq_handler,
74                                 void *data);
75 extern int lpc32xx_dma_ch_put(int ch);
76 extern int lpc32xx_dma_ch_pause_unpause(int ch, int pause);
77
78 /*
79  * Setup or start an unbound DMA transfer
80  */
81 extern int lpc32xx_dma_start_pflow_xfer(int ch,
82                                         void *src,
83                                         void *dst,
84                                         int enable);
85
86 /*
87  * DMA linked list support
88  */
89 extern u32 lpc32xx_dma_alloc_llist(int ch,
90                                    int entries);
91 extern void lpc32xx_dma_dealloc_llist(int ch);
92 extern u32 lpc32xx_dma_llist_v_to_p(int ch,
93                                     u32 vlist);
94 extern u32 lpc32xx_dma_llist_p_to_v(int ch,
95                                     u32 plist);
96 extern u32 lpc32xx_dma_get_llist_head(int ch);
97 extern void lpc32xx_dma_flush_llist(int ch);
98 extern u32 lpc32xx_dma_queue_llist_entry(int ch,
99                                          void *src,
100                                          void *dst,
101                                          int size);
102 extern u32 lpc32xx_get_free_llist_entry(int ch);
103 extern u32 lpc32xx_dma_queue_llist(int ch,
104                                    void *src,
105                                    void *dst,
106                                    int size,
107                                    u32 ctrl);
108 extern int lpc32xx_dma_start_xfer(int chan, u32 config);
109 extern void lpc32xx_dma_force_burst(int ch, int src);
110
111 #endif /* _ASM_ARCH_DMA_H */