diff options
Diffstat (limited to 'include/asm-blackfin/dma.h')
-rw-r--r-- | include/asm-blackfin/dma.h | 188 |
1 files changed, 188 insertions, 0 deletions
diff --git a/include/asm-blackfin/dma.h b/include/asm-blackfin/dma.h new file mode 100644 index 000000000000..be0d913e5516 --- /dev/null +++ b/include/asm-blackfin/dma.h | |||
@@ -0,0 +1,188 @@ | |||
1 | /* | ||
2 | * File: include/asm-blackfin/simple_bf533_dma.h | ||
3 | * Based on: none - original work | ||
4 | * Author: LG Soft India | ||
5 | * Copyright (C) 2004-2005 Analog Devices Inc. | ||
6 | * Created: Tue Sep 21 2004 | ||
7 | * Description: This file contains the major Data structures and constants | ||
8 | * used for DMA Implementation in BF533 | ||
9 | * Modified: | ||
10 | * | ||
11 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
12 | * | ||
13 | * This program is free software; you can redistribute it and/or modify | ||
14 | * it under the terms of the GNU General Public License as published by | ||
15 | * the Free Software Foundation; either version 2, or (at your option) | ||
16 | * any later version. | ||
17 | * | ||
18 | * This program is distributed in the hope that it will be useful, | ||
19 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
20 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
21 | * GNU General Public License for more details. | ||
22 | * | ||
23 | * You should have received a copy of the GNU General Public License | ||
24 | * along with this program; see the file COPYING. | ||
25 | * If not, write to the Free Software Foundation, | ||
26 | * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||
27 | */ | ||
28 | |||
29 | #ifndef _BLACKFIN_DMA_H_ | ||
30 | #define _BLACKFIN_DMA_H_ | ||
31 | |||
32 | #include <asm/io.h> | ||
33 | #include <linux/slab.h> | ||
34 | #include <asm/irq.h> | ||
35 | #include <asm/signal.h> | ||
36 | #include <asm/semaphore.h> | ||
37 | |||
38 | #include <linux/kernel.h> | ||
39 | #include <asm/mach/dma.h> | ||
40 | #include <linux/mm.h> | ||
41 | #include <linux/interrupt.h> | ||
42 | #include <asm/blackfin.h> | ||
43 | |||
44 | #define MAX_DMA_ADDRESS PAGE_OFFSET | ||
45 | |||
46 | /***************************************************************************** | ||
47 | * Generic DMA Declarations | ||
48 | * | ||
49 | ****************************************************************************/ | ||
50 | enum dma_chan_status { | ||
51 | DMA_CHANNEL_FREE, | ||
52 | DMA_CHANNEL_REQUESTED, | ||
53 | DMA_CHANNEL_ENABLED, | ||
54 | }; | ||
55 | |||
56 | /*------------------------- | ||
57 | * config reg bits value | ||
58 | *-------------------------*/ | ||
59 | #define DATA_SIZE_8 0 | ||
60 | #define DATA_SIZE_16 1 | ||
61 | #define DATA_SIZE_32 2 | ||
62 | |||
63 | #define DMA_FLOW_STOP 0 | ||
64 | #define DMA_FLOW_AUTO 1 | ||
65 | #define DMA_FLOW_ARRAY 4 | ||
66 | #define DMA_FLOW_SMALL 6 | ||
67 | #define DMA_FLOW_LARGE 7 | ||
68 | |||
69 | #define DIMENSION_LINEAR 0 | ||
70 | #define DIMENSION_2D 1 | ||
71 | |||
72 | #define DIR_READ 0 | ||
73 | #define DIR_WRITE 1 | ||
74 | |||
75 | #define INTR_DISABLE 0 | ||
76 | #define INTR_ON_BUF 2 | ||
77 | #define INTR_ON_ROW 3 | ||
78 | |||
79 | struct dmasg { | ||
80 | unsigned long next_desc_addr; | ||
81 | unsigned long start_addr; | ||
82 | unsigned short cfg; | ||
83 | unsigned short x_count; | ||
84 | short x_modify; | ||
85 | unsigned short y_count; | ||
86 | short y_modify; | ||
87 | } __attribute__((packed)); | ||
88 | |||
89 | struct dma_register { | ||
90 | unsigned long next_desc_ptr; /* DMA Next Descriptor Pointer register */ | ||
91 | unsigned long start_addr; /* DMA Start address register */ | ||
92 | |||
93 | unsigned short cfg; /* DMA Configuration register */ | ||
94 | unsigned short dummy1; /* DMA Configuration register */ | ||
95 | |||
96 | unsigned long reserved; | ||
97 | |||
98 | unsigned short x_count; /* DMA x_count register */ | ||
99 | unsigned short dummy2; | ||
100 | |||
101 | short x_modify; /* DMA x_modify register */ | ||
102 | unsigned short dummy3; | ||
103 | |||
104 | unsigned short y_count; /* DMA y_count register */ | ||
105 | unsigned short dummy4; | ||
106 | |||
107 | short y_modify; /* DMA y_modify register */ | ||
108 | unsigned short dummy5; | ||
109 | |||
110 | unsigned long curr_desc_ptr; /* DMA Current Descriptor Pointer | ||
111 | register */ | ||
112 | unsigned short curr_addr_ptr_lo; /* DMA Current Address Pointer | ||
113 | register */ | ||
114 | unsigned short curr_addr_ptr_hi; /* DMA Current Address Pointer | ||
115 | register */ | ||
116 | unsigned short irq_status; /* DMA irq status register */ | ||
117 | unsigned short dummy6; | ||
118 | |||
119 | unsigned short peripheral_map; /* DMA peripheral map register */ | ||
120 | unsigned short dummy7; | ||
121 | |||
122 | unsigned short curr_x_count; /* DMA Current x-count register */ | ||
123 | unsigned short dummy8; | ||
124 | |||
125 | unsigned long reserved2; | ||
126 | |||
127 | unsigned short curr_y_count; /* DMA Current y-count register */ | ||
128 | unsigned short dummy9; | ||
129 | |||
130 | unsigned long reserved3; | ||
131 | |||
132 | }; | ||
133 | |||
134 | typedef irqreturn_t(*dma_interrupt_t) (int irq, void *dev_id); | ||
135 | |||
136 | struct dma_channel { | ||
137 | struct mutex dmalock; | ||
138 | char *device_id; | ||
139 | enum dma_chan_status chan_status; | ||
140 | struct dma_register *regs; | ||
141 | struct dmasg *sg; /* large mode descriptor */ | ||
142 | unsigned int ctrl_num; /* controller number */ | ||
143 | dma_interrupt_t irq_callback; | ||
144 | void *data; | ||
145 | unsigned int dma_enable_flag; | ||
146 | unsigned int loopback_flag; | ||
147 | }; | ||
148 | |||
149 | /******************************************************************************* | ||
150 | * DMA API's | ||
151 | *******************************************************************************/ | ||
152 | /* functions to set register mode */ | ||
153 | void set_dma_start_addr(unsigned int channel, unsigned long addr); | ||
154 | void set_dma_next_desc_addr(unsigned int channel, unsigned long addr); | ||
155 | void set_dma_x_count(unsigned int channel, unsigned short x_count); | ||
156 | void set_dma_x_modify(unsigned int channel, short x_modify); | ||
157 | void set_dma_y_count(unsigned int channel, unsigned short y_count); | ||
158 | void set_dma_y_modify(unsigned int channel, short y_modify); | ||
159 | void set_dma_config(unsigned int channel, unsigned short config); | ||
160 | unsigned short set_bfin_dma_config(char direction, char flow_mode, | ||
161 | char intr_mode, char dma_mode, char width); | ||
162 | |||
163 | /* get curr status for polling */ | ||
164 | unsigned short get_dma_curr_irqstat(unsigned int channel); | ||
165 | unsigned short get_dma_curr_xcount(unsigned int channel); | ||
166 | unsigned short get_dma_curr_ycount(unsigned int channel); | ||
167 | |||
168 | /* set large DMA mode descriptor */ | ||
169 | void set_dma_sg(unsigned int channel, struct dmasg *sg, int nr_sg); | ||
170 | |||
171 | /* check if current channel is in use */ | ||
172 | int dma_channel_active(unsigned int channel); | ||
173 | |||
174 | /* common functions must be called in any mode */ | ||
175 | void free_dma(unsigned int channel); | ||
176 | int dma_channel_active(unsigned int channel); /* check if a channel is in use */ | ||
177 | void disable_dma(unsigned int channel); | ||
178 | void enable_dma(unsigned int channel); | ||
179 | int request_dma(unsigned int channel, char *device_id); | ||
180 | int set_dma_callback(unsigned int channel, dma_interrupt_t callback, | ||
181 | void *data); | ||
182 | void dma_disable_irq(unsigned int channel); | ||
183 | void dma_enable_irq(unsigned int channel); | ||
184 | void clear_dma_irqstat(unsigned int channel); | ||
185 | void *dma_memcpy(void *dest, const void *src, size_t count); | ||
186 | void *safe_dma_memcpy(void *dest, const void *src, size_t count); | ||
187 | |||
188 | #endif | ||