2 * dma.h - Blackfin DMA defines/structures/etc...
4 * Copyright 2004-2008 Analog Devices Inc.
5 * Licensed under the GPL-2 or later.
8 #ifndef _BLACKFIN_DMA_H_
9 #define _BLACKFIN_DMA_H_
11 #include <linux/interrupt.h>
13 #include <asm/blackfin.h>
16 #define MAX_DMA_ADDRESS PAGE_OFFSET
18 /*****************************************************************************
19 * Generic DMA Declarations
21 ****************************************************************************/
22 enum dma_chan_status {
24 DMA_CHANNEL_REQUESTED,
28 /*-------------------------
29 * config reg bits value
30 *-------------------------*/
32 #define DATA_SIZE_16 1
33 #define DATA_SIZE_32 2
35 #define DMA_FLOW_STOP 0
36 #define DMA_FLOW_AUTO 1
37 #define DMA_FLOW_ARRAY 4
38 #define DMA_FLOW_SMALL 6
39 #define DMA_FLOW_LARGE 7
41 #define DIMENSION_LINEAR 0
42 #define DIMENSION_2D 1
47 #define INTR_DISABLE 0
51 #define DMA_NOSYNC_KEEP_DMA_BUF 0
52 #define DMA_SYNC_RESTART 1
55 unsigned long next_desc_addr;
56 unsigned long start_addr;
58 unsigned short x_count;
60 unsigned short y_count;
62 } __attribute__((packed));
65 unsigned long next_desc_ptr; /* DMA Next Descriptor Pointer register */
66 unsigned long start_addr; /* DMA Start address register */
68 unsigned short cfg; /* DMA Configuration register */
69 unsigned short dummy1; /* DMA Configuration register */
71 unsigned long reserved;
73 unsigned short x_count; /* DMA x_count register */
74 unsigned short dummy2;
76 short x_modify; /* DMA x_modify register */
77 unsigned short dummy3;
79 unsigned short y_count; /* DMA y_count register */
80 unsigned short dummy4;
82 short y_modify; /* DMA y_modify register */
83 unsigned short dummy5;
85 unsigned long curr_desc_ptr; /* DMA Current Descriptor Pointer
87 unsigned long curr_addr_ptr; /* DMA Current Address Pointer
89 unsigned short irq_status; /* DMA irq status register */
90 unsigned short dummy6;
92 unsigned short peripheral_map; /* DMA peripheral map register */
93 unsigned short dummy7;
95 unsigned short curr_x_count; /* DMA Current x-count register */
96 unsigned short dummy8;
98 unsigned long reserved2;
100 unsigned short curr_y_count; /* DMA Current y-count register */
101 unsigned short dummy9;
103 unsigned long reserved3;
109 struct mutex dmalock;
110 const char *device_id;
111 enum dma_chan_status chan_status;
112 struct dma_register *regs;
113 struct dmasg *sg; /* large mode descriptor */
114 unsigned int ctrl_num; /* controller number */
117 unsigned int dma_enable_flag;
118 unsigned int loopback_flag;
120 unsigned short saved_peripheral_map;
125 int blackfin_dma_suspend(void);
126 void blackfin_dma_resume(void);
129 /*******************************************************************************
131 *******************************************************************************/
132 /* functions to set register mode */
133 void set_dma_start_addr(unsigned int channel, unsigned long addr);
134 void set_dma_next_desc_addr(unsigned int channel, unsigned long addr);
135 void set_dma_curr_desc_addr(unsigned int channel, unsigned long addr);
136 void set_dma_x_count(unsigned int channel, unsigned short x_count);
137 void set_dma_x_modify(unsigned int channel, short x_modify);
138 void set_dma_y_count(unsigned int channel, unsigned short y_count);
139 void set_dma_y_modify(unsigned int channel, short y_modify);
140 void set_dma_config(unsigned int channel, unsigned short config);
141 unsigned short set_bfin_dma_config(char direction, char flow_mode,
142 char intr_mode, char dma_mode, char width,
144 void set_dma_curr_addr(unsigned int channel, unsigned long addr);
146 /* get curr status for polling */
147 unsigned short get_dma_curr_irqstat(unsigned int channel);
148 unsigned short get_dma_curr_xcount(unsigned int channel);
149 unsigned short get_dma_curr_ycount(unsigned int channel);
150 unsigned long get_dma_next_desc_ptr(unsigned int channel);
151 unsigned long get_dma_curr_desc_ptr(unsigned int channel);
152 unsigned long get_dma_curr_addr(unsigned int channel);
154 /* set large DMA mode descriptor */
155 void set_dma_sg(unsigned int channel, struct dmasg *sg, int nr_sg);
157 /* check if current channel is in use */
158 int dma_channel_active(unsigned int channel);
160 /* common functions must be called in any mode */
161 void free_dma(unsigned int channel);
162 int dma_channel_active(unsigned int channel); /* check if a channel is in use */
163 void disable_dma(unsigned int channel);
164 void enable_dma(unsigned int channel);
165 int request_dma(unsigned int channel, const char *device_id);
166 int set_dma_callback(unsigned int channel, irq_handler_t callback,
168 void dma_disable_irq(unsigned int channel);
169 void dma_enable_irq(unsigned int channel);
170 void clear_dma_irqstat(unsigned int channel);
171 void *dma_memcpy(void *dest, const void *src, size_t count);
172 void *safe_dma_memcpy(void *dest, const void *src, size_t count);
173 void blackfin_dma_early_init(void);
175 extern int channel2irq(unsigned int channel);
176 extern struct dma_register *dma_io_base_addr[MAX_DMA_CHANNELS];