Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
arch
arm
mach-s3c24xx
include
mach
dma.h
Go to the documentation of this file.
1
/* arch/arm/mach-s3c2410/include/mach/dma.h
2
*
3
* Copyright (C) 2003-2006 Simtec Electronics
4
* Ben Dooks <
[email protected]
>
5
*
6
* Samsung S3C24XX DMA support
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 version 2 as
10
* published by the Free Software Foundation.
11
*/
12
13
#ifndef __ASM_ARCH_DMA_H
14
#define __ASM_ARCH_DMA_H __FILE__
15
16
#include <linux/device.h>
17
18
#define MAX_DMA_TRANSFER_SIZE 0x100000
/* Data Unit is half word */
19
20
/* We use `virtual` dma channels to hide the fact we have only a limited
21
* number of DMA channels, and not of all of them (dependent on the device)
22
* can be attached to any DMA source. We therefore let the DMA core handle
23
* the allocation of hardware channels to clients.
24
*/
25
26
enum
dma_ch
{
27
DMACH_DT_PROP
= -1,
/* not yet supported, do not use */
28
DMACH_XD0
= 0,
29
DMACH_XD1
,
30
DMACH_SDI
,
31
DMACH_SPI0
,
32
DMACH_SPI1
,
33
DMACH_UART0
,
34
DMACH_UART1
,
35
DMACH_UART2
,
36
DMACH_TIMER
,
37
DMACH_I2S_IN
,
38
DMACH_I2S_OUT
,
39
DMACH_PCM_IN
,
40
DMACH_PCM_OUT
,
41
DMACH_MIC_IN
,
42
DMACH_USB_EP1
,
43
DMACH_USB_EP2
,
44
DMACH_USB_EP3
,
45
DMACH_USB_EP4
,
46
DMACH_UART0_SRC2
,
/* s3c2412 second uart sources */
47
DMACH_UART1_SRC2
,
48
DMACH_UART2_SRC2
,
49
DMACH_UART3
,
/* s3c2443 has extra uart */
50
DMACH_UART3_SRC2
,
51
DMACH_SPI0_TX
,
/* s3c2443/2416/2450 hsspi0 */
52
DMACH_SPI0_RX
,
/* s3c2443/2416/2450 hsspi0 */
53
DMACH_SPI1_TX
,
/* s3c2443/2450 hsspi1 */
54
DMACH_SPI1_RX
,
/* s3c2443/2450 hsspi1 */
55
DMACH_MAX
,
/* the end entry */
56
};
57
58
static
inline
bool
samsung_dma_has_circular(
void
)
59
{
60
return
false
;
61
}
62
63
static
inline
bool
samsung_dma_is_dmadev(
void
)
64
{
65
return
false
;
66
}
67
68
#include <plat/dma.h>
69
70
#define DMACH_LOW_LEVEL (1<<28)
/* use this to specifiy hardware ch no */
71
72
/* we have 4 dma channels */
73
#if !defined(CONFIG_CPU_S3C2443) && !defined(CONFIG_CPU_S3C2416)
74
#define S3C_DMA_CHANNELS (4)
75
#else
76
#define S3C_DMA_CHANNELS (6)
77
#endif
78
79
/* types */
80
81
enum
s3c2410_dma_state
{
82
S3C2410_DMA_IDLE
,
83
S3C2410_DMA_RUNNING
,
84
S3C2410_DMA_PAUSED
85
};
86
87
/* enum s3c2410_dma_loadst
88
*
89
* This represents the state of the DMA engine, wrt to the loaded / running
90
* transfers. Since we don't have any way of knowing exactly the state of
91
* the DMA transfers, we need to know the state to make decisions on wether
92
* we can
93
*
94
* S3C2410_DMA_NONE
95
*
96
* There are no buffers loaded (the channel should be inactive)
97
*
98
* S3C2410_DMA_1LOADED
99
*
100
* There is one buffer loaded, however it has not been confirmed to be
101
* loaded by the DMA engine. This may be because the channel is not
102
* yet running, or the DMA driver decided that it was too costly to
103
* sit and wait for it to happen.
104
*
105
* S3C2410_DMA_1RUNNING
106
*
107
* The buffer has been confirmed running, and not finisged
108
*
109
* S3C2410_DMA_1LOADED_1RUNNING
110
*
111
* There is a buffer waiting to be loaded by the DMA engine, and one
112
* currently running.
113
*/
114
115
enum
s3c2410_dma_loadst
{
116
S3C2410_DMALOAD_NONE
,
117
S3C2410_DMALOAD_1LOADED
,
118
S3C2410_DMALOAD_1RUNNING
,
119
S3C2410_DMALOAD_1LOADED_1RUNNING
,
120
};
121
122
123
/* flags */
124
125
#define S3C2410_DMAF_SLOW (1<<0)
/* slow, so don't worry about
126
* waiting for reloads */
127
#define S3C2410_DMAF_AUTOSTART (1<<1)
/* auto-start if buffer queued */
128
129
#define S3C2410_DMAF_CIRCULAR (1 << 2)
/* no circular dma support */
130
131
/* dma buffer */
132
133
struct
s3c2410_dma_buf
;
134
135
/* s3c2410_dma_buf
136
*
137
* internally used buffer structure to describe a queued or running
138
* buffer.
139
*/
140
141
struct
s3c2410_dma_buf
{
142
struct
s3c2410_dma_buf
*
next
;
143
int
magic
;
/* magic */
144
int
size
;
/* buffer size in bytes */
145
dma_addr_t
data
;
/* start of DMA data */
146
dma_addr_t
ptr
;
/* where the DMA got to [1] */
147
void
*
id
;
/* client's id */
148
};
149
150
/* [1] is this updated for both recv/send modes? */
151
152
struct
s3c2410_dma_stats
{
153
unsigned
long
loads
;
154
unsigned
long
timeout_longest
;
155
unsigned
long
timeout_shortest
;
156
unsigned
long
timeout_avg
;
157
unsigned
long
timeout_failed
;
158
};
159
160
struct
s3c2410_dma_map;
161
162
/* struct s3c2410_dma_chan
163
*
164
* full state information for each DMA channel
165
*/
166
167
struct
s3c2410_dma_chan
{
168
/* channel state flags and information */
169
unsigned
char
number
;
/* number of this dma channel */
170
unsigned
char
in_use
;
/* channel allocated */
171
unsigned
char
irq_claimed
;
/* irq claimed for channel */
172
unsigned
char
irq_enabled
;
/* irq enabled for channel */
173
unsigned
char
xfer_unit
;
/* size of an transfer */
174
175
/* channel state */
176
177
enum
s3c2410_dma_state
state
;
178
enum
s3c2410_dma_loadst
load_state
;
179
struct
s3c2410_dma_client
*
client
;
180
181
/* channel configuration */
182
enum
dma_data_direction
source
;
183
enum
dma_ch
req_ch
;
184
unsigned
long
dev_addr
;
185
unsigned
long
load_timeout
;
186
unsigned
int
flags
;
/* channel flags */
187
188
struct
s3c24xx_dma_map
*
map
;
/* channel hw maps */
189
190
/* channel's hardware position and configuration */
191
void
__iomem
*
regs
;
/* channels registers */
192
void
__iomem
*
addr_reg
;
/* data address register */
193
unsigned
int
irq
;
/* channel irq */
194
unsigned
long
dcon
;
/* default value of DCON */
195
196
/* driver handles */
197
s3c2410_dma_cbfn_t
callback_fn
;
/* buffer done callback */
198
s3c2410_dma_opfn_t
op_fn
;
/* channel op callback */
199
200
/* stats gathering */
201
struct
s3c2410_dma_stats
*
stats
;
202
struct
s3c2410_dma_stats
stats_store
;
203
204
/* buffer list and information */
205
struct
s3c2410_dma_buf
*
curr
;
/* current dma buffer */
206
struct
s3c2410_dma_buf
*
next
;
/* next buffer to load */
207
struct
s3c2410_dma_buf
*
end
;
/* end of queue */
208
209
/* system device */
210
struct
device
dev
;
211
};
212
213
typedef
unsigned
long
dma_device_t
;
214
215
#endif
/* __ASM_ARCH_DMA_H */
Generated on Thu Jan 10 2013 12:49:29 for Linux Kernel by
1.8.2