1
2
3
4
5
6
7
8
9#ifndef STE_DMA40_H
10#define STE_DMA40_H
11
12#include <linux/dmaengine.h>
13#include <linux/workqueue.h>
14#include <linux/interrupt.h>
15
16
17
18
19
20
21
22#define STEDMA40_MAX_SEG_SIZE 0xFFFF
23
24
25#define STEDMA40_DEV_DST_MEMORY (-1)
26#define STEDMA40_DEV_SRC_MEMORY (-1)
27
28enum stedma40_mode {
29 STEDMA40_MODE_LOGICAL = 0,
30 STEDMA40_MODE_PHYSICAL,
31 STEDMA40_MODE_OPERATION,
32};
33
34enum stedma40_mode_opt {
35 STEDMA40_PCHAN_BASIC_MODE = 0,
36 STEDMA40_LCHAN_SRC_LOG_DST_LOG = 0,
37 STEDMA40_PCHAN_MODULO_MODE,
38 STEDMA40_PCHAN_DOUBLE_DST_MODE,
39 STEDMA40_LCHAN_SRC_PHY_DST_LOG,
40 STEDMA40_LCHAN_SRC_LOG_DST_PHY,
41};
42
43#define STEDMA40_ESIZE_8_BIT 0x0
44#define STEDMA40_ESIZE_16_BIT 0x1
45#define STEDMA40_ESIZE_32_BIT 0x2
46#define STEDMA40_ESIZE_64_BIT 0x3
47
48
49#define STEDMA40_PSIZE_PHY_1 0x4
50#define STEDMA40_PSIZE_PHY_2 0x0
51#define STEDMA40_PSIZE_PHY_4 0x1
52#define STEDMA40_PSIZE_PHY_8 0x2
53#define STEDMA40_PSIZE_PHY_16 0x3
54
55
56
57
58
59#define STEDMA40_PSIZE_LOG_1 STEDMA40_PSIZE_PHY_2
60#define STEDMA40_PSIZE_LOG_4 STEDMA40_PSIZE_PHY_4
61#define STEDMA40_PSIZE_LOG_8 STEDMA40_PSIZE_PHY_8
62#define STEDMA40_PSIZE_LOG_16 STEDMA40_PSIZE_PHY_16
63
64
65#define STEDMA40_MAX_PHYS 32
66
67enum stedma40_flow_ctrl {
68 STEDMA40_NO_FLOW_CTRL,
69 STEDMA40_FLOW_CTRL,
70};
71
72enum stedma40_periph_data_width {
73 STEDMA40_BYTE_WIDTH = STEDMA40_ESIZE_8_BIT,
74 STEDMA40_HALFWORD_WIDTH = STEDMA40_ESIZE_16_BIT,
75 STEDMA40_WORD_WIDTH = STEDMA40_ESIZE_32_BIT,
76 STEDMA40_DOUBLEWORD_WIDTH = STEDMA40_ESIZE_64_BIT
77};
78
79enum stedma40_xfer_dir {
80 STEDMA40_MEM_TO_MEM = 1,
81 STEDMA40_MEM_TO_PERIPH,
82 STEDMA40_PERIPH_TO_MEM,
83 STEDMA40_PERIPH_TO_PERIPH
84};
85
86
87
88
89
90
91
92
93
94
95struct stedma40_half_channel_info {
96 bool big_endian;
97 enum stedma40_periph_data_width data_width;
98 int psize;
99 enum stedma40_flow_ctrl flow_ctrl;
100};
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119struct stedma40_chan_cfg {
120 enum stedma40_xfer_dir dir;
121 bool high_priority;
122 enum stedma40_mode mode;
123 enum stedma40_mode_opt mode_opt;
124 int src_dev_type;
125 int dst_dev_type;
126 struct stedma40_half_channel_info src_info;
127 struct stedma40_half_channel_info dst_info;
128};
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143struct stedma40_platform_data {
144 u32 dev_len;
145 const dma_addr_t *dev_tx;
146 const dma_addr_t *dev_rx;
147 int *memcpy;
148 u32 memcpy_len;
149 struct stedma40_chan_cfg *memcpy_conf_phy;
150 struct stedma40_chan_cfg *memcpy_conf_log;
151 int disabled_channels[STEDMA40_MAX_PHYS];
152};
153
154#ifdef CONFIG_STE_DMA40
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169bool stedma40_filter(struct dma_chan *chan, void *data);
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184struct dma_async_tx_descriptor *stedma40_memcpy_sg(struct dma_chan *chan,
185 struct scatterlist *sgl_dst,
186 struct scatterlist *sgl_src,
187 unsigned int sgl_len,
188 unsigned long flags);
189
190
191
192
193
194
195
196
197
198
199
200
201static inline struct
202dma_async_tx_descriptor *stedma40_slave_mem(struct dma_chan *chan,
203 dma_addr_t addr,
204 unsigned int size,
205 enum dma_data_direction direction,
206 unsigned long flags)
207{
208 struct scatterlist sg;
209 sg_init_table(&sg, 1);
210 sg.dma_address = addr;
211 sg.length = size;
212
213 return chan->device->device_prep_slave_sg(chan, &sg, 1,
214 direction, flags);
215}
216
217#else
218static inline bool stedma40_filter(struct dma_chan *chan, void *data)
219{
220 return false;
221}
222
223static inline struct
224dma_async_tx_descriptor *stedma40_slave_mem(struct dma_chan *chan,
225 dma_addr_t addr,
226 unsigned int size,
227 enum dma_data_direction direction,
228 unsigned long flags)
229{
230 return NULL;
231}
232#endif
233
234#endif
235