[au1000] reinstate 2.6.30 support until 2.6.32 is fixed
[openwrt.git] / target / linux / s3c24xx / patches-2.6.30 / 010-s3c-dma.patch
1 --- a/arch/arm/mach-s3c2410/include/mach/dma.h
2 +++ b/arch/arm/mach-s3c2410/include/mach/dma.h
3 @@ -3,7 +3,7 @@
4 * Copyright (C) 2003,2004,2006 Simtec Electronics
5 * Ben Dooks <ben@simtec.co.uk>
6 *
7 - * Samsung S3C241XX DMA support
8 + * Samsung S3C24XX DMA support
9 *
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License version 2 as
12 @@ -13,8 +13,8 @@
13 #ifndef __ASM_ARCH_DMA_H
14 #define __ASM_ARCH_DMA_H __FILE__
15
16 +#include <plat/dma.h>
17 #include <linux/sysdev.h>
18 -#include <mach/hardware.h>
19
20 #define MAX_DMA_TRANSFER_SIZE 0x100000 /* Data Unit is half word */
21
22 @@ -55,9 +55,9 @@ enum dma_ch {
23
24 /* we have 4 dma channels */
25 #ifndef CONFIG_CPU_S3C2443
26 -#define S3C2410_DMA_CHANNELS (4)
27 +#define S3C_DMA_CHANNELS (4)
28 #else
29 -#define S3C2410_DMA_CHANNELS (6)
30 +#define S3C_DMA_CHANNELS (6)
31 #endif
32
33 /* types */
34 @@ -68,7 +68,6 @@ enum s3c2410_dma_state {
35 S3C2410_DMA_PAUSED
36 };
37
38 -
39 /* enum s3c2410_dma_loadst
40 *
41 * This represents the state of the DMA engine, wrt to the loaded / running
42 @@ -104,32 +103,6 @@ enum s3c2410_dma_loadst {
43 S3C2410_DMALOAD_1LOADED_1RUNNING,
44 };
45
46 -enum s3c2410_dma_buffresult {
47 - S3C2410_RES_OK,
48 - S3C2410_RES_ERR,
49 - S3C2410_RES_ABORT
50 -};
51 -
52 -enum s3c2410_dmasrc {
53 - S3C2410_DMASRC_HW, /* source is memory */
54 - S3C2410_DMASRC_MEM /* source is hardware */
55 -};
56 -
57 -/* enum s3c2410_chan_op
58 - *
59 - * operation codes passed to the DMA code by the user, and also used
60 - * to inform the current channel owner of any changes to the system state
61 -*/
62 -
63 -enum s3c2410_chan_op {
64 - S3C2410_DMAOP_START,
65 - S3C2410_DMAOP_STOP,
66 - S3C2410_DMAOP_PAUSE,
67 - S3C2410_DMAOP_RESUME,
68 - S3C2410_DMAOP_FLUSH,
69 - S3C2410_DMAOP_TIMEOUT, /* internal signal to handler */
70 - S3C2410_DMAOP_STARTED, /* indicate channel started */
71 -};
72
73 /* flags */
74
75 @@ -137,19 +110,18 @@ enum s3c2410_chan_op {
76 * waiting for reloads */
77 #define S3C2410_DMAF_AUTOSTART (1<<1) /* auto-start if buffer queued */
78
79 +#define S3C2410_DMAF_CIRCULAR (0x00) /* circular enqueue not supp. */
80 +
81 /* dma buffer */
82
83 -struct s3c2410_dma_client {
84 - char *name;
85 -};
86 +struct s3c2410_dma_buf;
87
88 -/* s3c2410_dma_buf_s
89 +/* s3c2410_dma_buf
90 *
91 * internally used buffer structure to describe a queued or running
92 * buffer.
93 */
94
95 -struct s3c2410_dma_buf;
96 struct s3c2410_dma_buf {
97 struct s3c2410_dma_buf *next;
98 int magic; /* magic */
99 @@ -161,20 +133,6 @@ struct s3c2410_dma_buf {
100
101 /* [1] is this updated for both recv/send modes? */
102
103 -struct s3c2410_dma_chan;
104 -
105 -/* s3c2410_dma_cbfn_t
106 - *
107 - * buffer callback routine type
108 -*/
109 -
110 -typedef void (*s3c2410_dma_cbfn_t)(struct s3c2410_dma_chan *,
111 - void *buf, int size,
112 - enum s3c2410_dma_buffresult result);
113 -
114 -typedef int (*s3c2410_dma_opfn_t)(struct s3c2410_dma_chan *,
115 - enum s3c2410_chan_op );
116 -
117 struct s3c2410_dma_stats {
118 unsigned long loads;
119 unsigned long timeout_longest;
120 @@ -206,10 +164,10 @@ struct s3c2410_dma_chan {
121
122 /* channel configuration */
123 enum s3c2410_dmasrc source;
124 + enum dma_ch req_ch;
125 unsigned long dev_addr;
126 unsigned long load_timeout;
127 unsigned int flags; /* channel flags */
128 - unsigned int hw_cfg; /* last hw config */
129
130 struct s3c24xx_dma_map *map; /* channel hw maps */
131
132 @@ -236,213 +194,12 @@ struct s3c2410_dma_chan {
133 struct sys_device dev;
134 };
135
136 -/* the currently allocated channel information */
137 -extern struct s3c2410_dma_chan s3c2410_chans[];
138 -
139 -/* note, we don't really use dma_device_t at the moment */
140 typedef unsigned long dma_device_t;
141
142 -/* functions --------------------------------------------------------------- */
143 -
144 -/* s3c2410_dma_request
145 - *
146 - * request a dma channel exclusivley
147 -*/
148 -
149 -extern int s3c2410_dma_request(unsigned int channel,
150 - struct s3c2410_dma_client *, void *dev);
151 -
152 -
153 -/* s3c2410_dma_ctrl
154 - *
155 - * change the state of the dma channel
156 -*/
157 -
158 -extern int s3c2410_dma_ctrl(unsigned int channel, enum s3c2410_chan_op op);
159 -
160 -/* s3c2410_dma_setflags
161 - *
162 - * set the channel's flags to a given state
163 -*/
164 -
165 -extern int s3c2410_dma_setflags(unsigned int channel,
166 - unsigned int flags);
167 -
168 -/* s3c2410_dma_free
169 - *
170 - * free the dma channel (will also abort any outstanding operations)
171 -*/
172 -
173 -extern int s3c2410_dma_free(unsigned int channel, struct s3c2410_dma_client *);
174 -
175 -/* s3c2410_dma_enqueue
176 - *
177 - * place the given buffer onto the queue of operations for the channel.
178 - * The buffer must be allocated from dma coherent memory, or the Dcache/WB
179 - * drained before the buffer is given to the DMA system.
180 -*/
181 -
182 -extern int s3c2410_dma_enqueue(unsigned int channel, void *id,
183 - dma_addr_t data, int size);
184 -
185 -/* s3c2410_dma_config
186 - *
187 - * configure the dma channel
188 -*/
189 -
190 -extern int s3c2410_dma_config(unsigned int channel, int xferunit, int dcon);
191 -
192 -/* s3c2410_dma_devconfig
193 - *
194 - * configure the device we're talking to
195 -*/
196 -
197 -extern int s3c2410_dma_devconfig(int channel, enum s3c2410_dmasrc source,
198 - int hwcfg, unsigned long devaddr);
199 -
200 -/* s3c2410_dma_getposition
201 - *
202 - * get the position that the dma transfer is currently at
203 -*/
204 -
205 -extern int s3c2410_dma_getposition(unsigned int channel,
206 - dma_addr_t *src, dma_addr_t *dest);
207 -
208 -extern int s3c2410_dma_set_opfn(unsigned int, s3c2410_dma_opfn_t rtn);
209 -extern int s3c2410_dma_set_buffdone_fn(unsigned int, s3c2410_dma_cbfn_t rtn);
210 -
211 -/* DMA Register definitions */
212 -
213 -#define S3C2410_DMA_DISRC (0x00)
214 -#define S3C2410_DMA_DISRCC (0x04)
215 -#define S3C2410_DMA_DIDST (0x08)
216 -#define S3C2410_DMA_DIDSTC (0x0C)
217 -#define S3C2410_DMA_DCON (0x10)
218 -#define S3C2410_DMA_DSTAT (0x14)
219 -#define S3C2410_DMA_DCSRC (0x18)
220 -#define S3C2410_DMA_DCDST (0x1C)
221 -#define S3C2410_DMA_DMASKTRIG (0x20)
222 -#define S3C2412_DMA_DMAREQSEL (0x24)
223 -#define S3C2443_DMA_DMAREQSEL (0x24)
224 -
225 -#define S3C2410_DISRCC_INC (1<<0)
226 -#define S3C2410_DISRCC_APB (1<<1)
227 -
228 -#define S3C2410_DMASKTRIG_STOP (1<<2)
229 -#define S3C2410_DMASKTRIG_ON (1<<1)
230 -#define S3C2410_DMASKTRIG_SWTRIG (1<<0)
231 -
232 -#define S3C2410_DCON_DEMAND (0<<31)
233 -#define S3C2410_DCON_HANDSHAKE (1<<31)
234 -#define S3C2410_DCON_SYNC_PCLK (0<<30)
235 -#define S3C2410_DCON_SYNC_HCLK (1<<30)
236 -
237 -#define S3C2410_DCON_INTREQ (1<<29)
238 -
239 -#define S3C2410_DCON_CH0_XDREQ0 (0<<24)
240 -#define S3C2410_DCON_CH0_UART0 (1<<24)
241 -#define S3C2410_DCON_CH0_SDI (2<<24)
242 -#define S3C2410_DCON_CH0_TIMER (3<<24)
243 -#define S3C2410_DCON_CH0_USBEP1 (4<<24)
244 -
245 -#define S3C2410_DCON_CH1_XDREQ1 (0<<24)
246 -#define S3C2410_DCON_CH1_UART1 (1<<24)
247 -#define S3C2410_DCON_CH1_I2SSDI (2<<24)
248 -#define S3C2410_DCON_CH1_SPI (3<<24)
249 -#define S3C2410_DCON_CH1_USBEP2 (4<<24)
250 -
251 -#define S3C2410_DCON_CH2_I2SSDO (0<<24)
252 -#define S3C2410_DCON_CH2_I2SSDI (1<<24)
253 -#define S3C2410_DCON_CH2_SDI (2<<24)
254 -#define S3C2410_DCON_CH2_TIMER (3<<24)
255 -#define S3C2410_DCON_CH2_USBEP3 (4<<24)
256 -
257 -#define S3C2410_DCON_CH3_UART2 (0<<24)
258 -#define S3C2410_DCON_CH3_SDI (1<<24)
259 -#define S3C2410_DCON_CH3_SPI (2<<24)
260 -#define S3C2410_DCON_CH3_TIMER (3<<24)
261 -#define S3C2410_DCON_CH3_USBEP4 (4<<24)
262 -
263 -#define S3C2410_DCON_SRCSHIFT (24)
264 -#define S3C2410_DCON_SRCMASK (7<<24)
265 -
266 -#define S3C2410_DCON_BYTE (0<<20)
267 -#define S3C2410_DCON_HALFWORD (1<<20)
268 -#define S3C2410_DCON_WORD (2<<20)
269 -
270 -#define S3C2410_DCON_AUTORELOAD (0<<22)
271 -#define S3C2410_DCON_NORELOAD (1<<22)
272 -#define S3C2410_DCON_HWTRIG (1<<23)
273 -
274 -#ifdef CONFIG_CPU_S3C2440
275 -#define S3C2440_DIDSTC_CHKINT (1<<2)
276 -
277 -#define S3C2440_DCON_CH0_I2SSDO (5<<24)
278 -#define S3C2440_DCON_CH0_PCMIN (6<<24)
279 -
280 -#define S3C2440_DCON_CH1_PCMOUT (5<<24)
281 -#define S3C2440_DCON_CH1_SDI (6<<24)
282 -
283 -#define S3C2440_DCON_CH2_PCMIN (5<<24)
284 -#define S3C2440_DCON_CH2_MICIN (6<<24)
285 -
286 -#define S3C2440_DCON_CH3_MICIN (5<<24)
287 -#define S3C2440_DCON_CH3_PCMOUT (6<<24)
288 -#endif
289 -
290 -#ifdef CONFIG_CPU_S3C2412
291 -
292 -#define S3C2412_DMAREQSEL_SRC(x) ((x)<<1)
293 -
294 -#define S3C2412_DMAREQSEL_HW (1)
295 -
296 -#define S3C2412_DMAREQSEL_SPI0TX S3C2412_DMAREQSEL_SRC(0)
297 -#define S3C2412_DMAREQSEL_SPI0RX S3C2412_DMAREQSEL_SRC(1)
298 -#define S3C2412_DMAREQSEL_SPI1TX S3C2412_DMAREQSEL_SRC(2)
299 -#define S3C2412_DMAREQSEL_SPI1RX S3C2412_DMAREQSEL_SRC(3)
300 -#define S3C2412_DMAREQSEL_I2STX S3C2412_DMAREQSEL_SRC(4)
301 -#define S3C2412_DMAREQSEL_I2SRX S3C2412_DMAREQSEL_SRC(5)
302 -#define S3C2412_DMAREQSEL_TIMER S3C2412_DMAREQSEL_SRC(9)
303 -#define S3C2412_DMAREQSEL_SDI S3C2412_DMAREQSEL_SRC(10)
304 -#define S3C2412_DMAREQSEL_USBEP1 S3C2412_DMAREQSEL_SRC(13)
305 -#define S3C2412_DMAREQSEL_USBEP2 S3C2412_DMAREQSEL_SRC(14)
306 -#define S3C2412_DMAREQSEL_USBEP3 S3C2412_DMAREQSEL_SRC(15)
307 -#define S3C2412_DMAREQSEL_USBEP4 S3C2412_DMAREQSEL_SRC(16)
308 -#define S3C2412_DMAREQSEL_XDREQ0 S3C2412_DMAREQSEL_SRC(17)
309 -#define S3C2412_DMAREQSEL_XDREQ1 S3C2412_DMAREQSEL_SRC(18)
310 -#define S3C2412_DMAREQSEL_UART0_0 S3C2412_DMAREQSEL_SRC(19)
311 -#define S3C2412_DMAREQSEL_UART0_1 S3C2412_DMAREQSEL_SRC(20)
312 -#define S3C2412_DMAREQSEL_UART1_0 S3C2412_DMAREQSEL_SRC(21)
313 -#define S3C2412_DMAREQSEL_UART1_1 S3C2412_DMAREQSEL_SRC(22)
314 -#define S3C2412_DMAREQSEL_UART2_0 S3C2412_DMAREQSEL_SRC(23)
315 -#define S3C2412_DMAREQSEL_UART2_1 S3C2412_DMAREQSEL_SRC(24)
316 -
317 -#endif
318 -
319 -#define S3C2443_DMAREQSEL_SRC(x) ((x)<<1)
320 -
321 -#define S3C2443_DMAREQSEL_HW (1)
322
323 -#define S3C2443_DMAREQSEL_SPI0TX S3C2443_DMAREQSEL_SRC(0)
324 -#define S3C2443_DMAREQSEL_SPI0RX S3C2443_DMAREQSEL_SRC(1)
325 -#define S3C2443_DMAREQSEL_SPI1TX S3C2443_DMAREQSEL_SRC(2)
326 -#define S3C2443_DMAREQSEL_SPI1RX S3C2443_DMAREQSEL_SRC(3)
327 -#define S3C2443_DMAREQSEL_I2STX S3C2443_DMAREQSEL_SRC(4)
328 -#define S3C2443_DMAREQSEL_I2SRX S3C2443_DMAREQSEL_SRC(5)
329 -#define S3C2443_DMAREQSEL_TIMER S3C2443_DMAREQSEL_SRC(9)
330 -#define S3C2443_DMAREQSEL_SDI S3C2443_DMAREQSEL_SRC(10)
331 -#define S3C2443_DMAREQSEL_XDREQ0 S3C2443_DMAREQSEL_SRC(17)
332 -#define S3C2443_DMAREQSEL_XDREQ1 S3C2443_DMAREQSEL_SRC(18)
333 -#define S3C2443_DMAREQSEL_UART0_0 S3C2443_DMAREQSEL_SRC(19)
334 -#define S3C2443_DMAREQSEL_UART0_1 S3C2443_DMAREQSEL_SRC(20)
335 -#define S3C2443_DMAREQSEL_UART1_0 S3C2443_DMAREQSEL_SRC(21)
336 -#define S3C2443_DMAREQSEL_UART1_1 S3C2443_DMAREQSEL_SRC(22)
337 -#define S3C2443_DMAREQSEL_UART2_0 S3C2443_DMAREQSEL_SRC(23)
338 -#define S3C2443_DMAREQSEL_UART2_1 S3C2443_DMAREQSEL_SRC(24)
339 -#define S3C2443_DMAREQSEL_UART3_0 S3C2443_DMAREQSEL_SRC(25)
340 -#define S3C2443_DMAREQSEL_UART3_1 S3C2443_DMAREQSEL_SRC(26)
341 -#define S3C2443_DMAREQSEL_PCMOUT S3C2443_DMAREQSEL_SRC(27)
342 -#define S3C2443_DMAREQSEL_PCMIN S3C2443_DMAREQSEL_SRC(28)
343 -#define S3C2443_DMAREQSEL_MICIN S3C2443_DMAREQSEL_SRC(29)
344 +static int s3c_dma_has_circular(void)
345 +{
346 + return 0;
347 +}
348
349 #endif /* __ASM_ARCH_DMA_H */
350 --- a/arch/arm/mach-s3c2442/Kconfig
351 +++ b/arch/arm/mach-s3c2442/Kconfig
352 @@ -11,6 +11,7 @@ config CPU_S3C2442
353 select S3C2410_CLOCK
354 select S3C2410_GPIO
355 select S3C2410_PM if PM
356 + select S3C2440_DMA if S3C2410_DMA
357 select CPU_S3C244X
358 select CPU_LLSERIAL_S3C2440
359 help
360 --- /dev/null
361 +++ b/arch/arm/plat-s3c/dma.c
362 @@ -0,0 +1,86 @@
363 +/* linux/arch/arm/plat-s3c/dma.c
364 + *
365 + * Copyright (c) 2003-2005,2006,2009 Simtec Electronics
366 + * Ben Dooks <ben@simtec.co.uk>
367 + * http://armlinux.simtec.co.uk/
368 + *
369 + * S3C DMA core
370 + *
371 + * This program is free software; you can redistribute it and/or modify
372 + * it under the terms of the GNU General Public License version 2 as
373 + * published by the Free Software Foundation.
374 +*/
375 +
376 +struct s3c2410_dma_buf;
377 +
378 +#include <linux/kernel.h>
379 +#include <linux/module.h>
380 +#include <linux/errno.h>
381 +
382 +#include <mach/dma.h>
383 +#include <mach/irqs.h>
384 +
385 +#include <plat/dma-plat.h>
386 +
387 +/* dma channel state information */
388 +struct s3c2410_dma_chan s3c2410_chans[S3C_DMA_CHANNELS];
389 +struct s3c2410_dma_chan *s3c_dma_chan_map[DMACH_MAX];
390 +
391 +/* s3c_dma_lookup_channel
392 + *
393 + * change the dma channel number given into a real dma channel id
394 +*/
395 +
396 +struct s3c2410_dma_chan *s3c_dma_lookup_channel(unsigned int channel)
397 +{
398 + if (channel & DMACH_LOW_LEVEL)
399 + return &s3c2410_chans[channel & ~DMACH_LOW_LEVEL];
400 + else
401 + return s3c_dma_chan_map[channel];
402 +}
403 +
404 +/* do we need to protect the settings of the fields from
405 + * irq?
406 +*/
407 +
408 +int s3c2410_dma_set_opfn(unsigned int channel, s3c2410_dma_opfn_t rtn)
409 +{
410 + struct s3c2410_dma_chan *chan = s3c_dma_lookup_channel(channel);
411 +
412 + if (chan == NULL)
413 + return -EINVAL;
414 +
415 + pr_debug("%s: chan=%p, op rtn=%p\n", __func__, chan, rtn);
416 +
417 + chan->op_fn = rtn;
418 +
419 + return 0;
420 +}
421 +EXPORT_SYMBOL(s3c2410_dma_set_opfn);
422 +
423 +int s3c2410_dma_set_buffdone_fn(unsigned int channel, s3c2410_dma_cbfn_t rtn)
424 +{
425 + struct s3c2410_dma_chan *chan = s3c_dma_lookup_channel(channel);
426 +
427 + if (chan == NULL)
428 + return -EINVAL;
429 +
430 + pr_debug("%s: chan=%p, callback rtn=%p\n", __func__, chan, rtn);
431 +
432 + chan->callback_fn = rtn;
433 +
434 + return 0;
435 +}
436 +EXPORT_SYMBOL(s3c2410_dma_set_buffdone_fn);
437 +
438 +int s3c2410_dma_setflags(unsigned int channel, unsigned int flags)
439 +{
440 + struct s3c2410_dma_chan *chan = s3c_dma_lookup_channel(channel);
441 +
442 + if (chan == NULL)
443 + return -EINVAL;
444 +
445 + chan->flags = flags;
446 + return 0;
447 +}
448 +EXPORT_SYMBOL(s3c2410_dma_setflags);
449 --- /dev/null
450 +++ b/arch/arm/plat-s3c/include/plat/dma-core.h
451 @@ -0,0 +1,22 @@
452 +/* arch/arm/plat-s3c/include/plat/dma.h
453 + *
454 + * Copyright 2008 Openmoko, Inc.
455 + * Copyright 2008 Simtec Electronics
456 + * Ben Dooks <ben@simtec.co.uk>
457 + * http://armlinux.simtec.co.uk/
458 + *
459 + * Samsung S3C DMA core support
460 + *
461 + * This program is free software; you can redistribute it and/or modify
462 + * it under the terms of the GNU General Public License version 2 as
463 + * published by the Free Software Foundation.
464 +*/
465 +
466 +extern struct s3c2410_dma_chan *s3c_dma_lookup_channel(unsigned int channel);
467 +
468 +extern struct s3c2410_dma_chan *s3c_dma_chan_map[];
469 +
470 +/* the currently allocated channel information */
471 +extern struct s3c2410_dma_chan s3c2410_chans[];
472 +
473 +
474 --- /dev/null
475 +++ b/arch/arm/plat-s3c/include/plat/dma.h
476 @@ -0,0 +1,128 @@
477 +/* arch/arm/plat-s3c/include/plat/dma.h
478 + *
479 + * Copyright (C) 2003,2004,2006 Simtec Electronics
480 + * Ben Dooks <ben@simtec.co.uk>
481 + *
482 + * Samsung S3C DMA support
483 + *
484 + * This program is free software; you can redistribute it and/or modify
485 + * it under the terms of the GNU General Public License version 2 as
486 + * published by the Free Software Foundation.
487 +*/
488 +
489 +enum s3c2410_dma_buffresult {
490 + S3C2410_RES_OK,
491 + S3C2410_RES_ERR,
492 + S3C2410_RES_ABORT
493 +};
494 +
495 +enum s3c2410_dmasrc {
496 + S3C2410_DMASRC_HW, /* source is memory */
497 + S3C2410_DMASRC_MEM /* source is hardware */
498 +};
499 +
500 +/* enum s3c2410_chan_op
501 + *
502 + * operation codes passed to the DMA code by the user, and also used
503 + * to inform the current channel owner of any changes to the system state
504 +*/
505 +
506 +enum s3c2410_chan_op {
507 + S3C2410_DMAOP_START,
508 + S3C2410_DMAOP_STOP,
509 + S3C2410_DMAOP_PAUSE,
510 + S3C2410_DMAOP_RESUME,
511 + S3C2410_DMAOP_FLUSH,
512 + S3C2410_DMAOP_TIMEOUT, /* internal signal to handler */
513 + S3C2410_DMAOP_STARTED, /* indicate channel started */
514 +};
515 +
516 +struct s3c2410_dma_client {
517 + char *name;
518 +};
519 +
520 +struct s3c2410_dma_chan;
521 +
522 +/* s3c2410_dma_cbfn_t
523 + *
524 + * buffer callback routine type
525 +*/
526 +
527 +typedef void (*s3c2410_dma_cbfn_t)(struct s3c2410_dma_chan *,
528 + void *buf, int size,
529 + enum s3c2410_dma_buffresult result);
530 +
531 +typedef int (*s3c2410_dma_opfn_t)(struct s3c2410_dma_chan *,
532 + enum s3c2410_chan_op );
533 +
534 +
535 +
536 +/* s3c2410_dma_request
537 + *
538 + * request a dma channel exclusivley
539 +*/
540 +
541 +extern int s3c2410_dma_request(unsigned int channel,
542 + struct s3c2410_dma_client *, void *dev);
543 +
544 +
545 +/* s3c2410_dma_ctrl
546 + *
547 + * change the state of the dma channel
548 +*/
549 +
550 +extern int s3c2410_dma_ctrl(unsigned int channel, enum s3c2410_chan_op op);
551 +
552 +/* s3c2410_dma_setflags
553 + *
554 + * set the channel's flags to a given state
555 +*/
556 +
557 +extern int s3c2410_dma_setflags(unsigned int channel,
558 + unsigned int flags);
559 +
560 +/* s3c2410_dma_free
561 + *
562 + * free the dma channel (will also abort any outstanding operations)
563 +*/
564 +
565 +extern int s3c2410_dma_free(unsigned int channel, struct s3c2410_dma_client *);
566 +
567 +/* s3c2410_dma_enqueue
568 + *
569 + * place the given buffer onto the queue of operations for the channel.
570 + * The buffer must be allocated from dma coherent memory, or the Dcache/WB
571 + * drained before the buffer is given to the DMA system.
572 +*/
573 +
574 +extern int s3c2410_dma_enqueue(unsigned int channel, void *id,
575 + dma_addr_t data, int size);
576 +
577 +
578 +/* s3c2410_dma_config
579 + *
580 + * configure the dma channel
581 +*/
582 +
583 +extern int s3c2410_dma_config(unsigned int channel, int xferunit);
584 +
585 +/* s3c2410_dma_devconfig
586 + *
587 + * configure the device we're talking to
588 +*/
589 +
590 +extern int s3c2410_dma_devconfig(int channel, enum s3c2410_dmasrc source,
591 + unsigned long devaddr);
592 +
593 +/* s3c2410_dma_getposition
594 + *
595 + * get the position that the dma transfer is currently at
596 +*/
597 +
598 +extern int s3c2410_dma_getposition(unsigned int channel,
599 + dma_addr_t *src, dma_addr_t *dest);
600 +
601 +extern int s3c2410_dma_set_opfn(unsigned int, s3c2410_dma_opfn_t rtn);
602 +extern int s3c2410_dma_set_buffdone_fn(unsigned int, s3c2410_dma_cbfn_t rtn);
603 +
604 +
605 --- a/arch/arm/plat-s3c/Kconfig
606 +++ b/arch/arm/plat-s3c/Kconfig
607 @@ -150,6 +150,13 @@ config S3C_GPIO_CFG_S3C64XX
608 Internal configuration to enable S3C64XX style GPIO configuration
609 functions.
610
611 +# DMA
612 +
613 +config S3C_DMA
614 + bool
615 + help
616 + Internal configuration for S3C DMA core
617 +
618 # device definitions to compile in
619
620 config S3C_DEV_HSMMC
621 --- a/arch/arm/plat-s3c/Makefile
622 +++ b/arch/arm/plat-s3c/Makefile
623 @@ -18,6 +18,10 @@ obj-y += pwm-clock.o
624 obj-y += gpio.o
625 obj-y += gpio-config.o
626
627 +# DMA support
628 +
629 +obj-$(CONFIG_S3C_DMA) += dma.o
630 +
631 # PM support
632
633 obj-$(CONFIG_PM) += pm.o
634 @@ -31,3 +35,5 @@ obj-$(CONFIG_S3C_DEV_HSMMC1) += dev-hsmm
635 obj-y += dev-i2c0.o
636 obj-$(CONFIG_S3C_DEV_I2C1) += dev-i2c1.o
637 obj-$(CONFIG_S3C_DEV_FB) += dev-fb.o
638 +obj-$(CONFIG_S3C_DMA) += dma.o
639 +
640 --- a/arch/arm/plat-s3c24xx/dma.c
641 +++ b/arch/arm/plat-s3c24xx/dma.c
642 @@ -31,10 +31,11 @@
643 #include <asm/irq.h>
644 #include <mach/hardware.h>
645 #include <mach/dma.h>
646 -
647 #include <mach/map.h>
648
649 -#include <plat/dma.h>
650 +#include <plat/dma-core.h>
651 +#include <plat/regs-dma.h>
652 +#include <plat/dma-plat.h>
653
654 /* io map for dma */
655 static void __iomem *dma_base;
656 @@ -44,8 +45,6 @@ static int dma_channels;
657
658 static struct s3c24xx_dma_selection dma_sel;
659
660 -/* dma channel state information */
661 -struct s3c2410_dma_chan s3c2410_chans[S3C2410_DMA_CHANNELS];
662
663 /* debugging functions */
664
665 @@ -135,21 +134,6 @@ dmadbg_showregs(const char *fname, int l
666 #define dbg_showchan(chan) do { } while(0)
667 #endif /* CONFIG_S3C2410_DMA_DEBUG */
668
669 -static struct s3c2410_dma_chan *dma_chan_map[DMACH_MAX];
670 -
671 -/* lookup_dma_channel
672 - *
673 - * change the dma channel number given into a real dma channel id
674 -*/
675 -
676 -static struct s3c2410_dma_chan *lookup_dma_channel(unsigned int channel)
677 -{
678 - if (channel & DMACH_LOW_LEVEL)
679 - return &s3c2410_chans[channel & ~DMACH_LOW_LEVEL];
680 - else
681 - return dma_chan_map[channel];
682 -}
683 -
684 /* s3c2410_dma_stats_timeout
685 *
686 * Update DMA stats from timeout info
687 @@ -214,8 +198,6 @@ s3c2410_dma_waitforload(struct s3c2410_d
688 return 0;
689 }
690
691 -
692 -
693 /* s3c2410_dma_loadbuffer
694 *
695 * load a buffer, and update the channel state
696 @@ -453,7 +435,7 @@ s3c2410_dma_canload(struct s3c2410_dma_c
697 int s3c2410_dma_enqueue(unsigned int channel, void *id,
698 dma_addr_t data, int size)
699 {
700 - struct s3c2410_dma_chan *chan = lookup_dma_channel(channel);
701 + struct s3c2410_dma_chan *chan = s3c_dma_lookup_channel(channel);
702 struct s3c2410_dma_buf *buf;
703 unsigned long flags;
704
705 @@ -804,7 +786,7 @@ EXPORT_SYMBOL(s3c2410_dma_request);
706
707 int s3c2410_dma_free(unsigned int channel, struct s3c2410_dma_client *client)
708 {
709 - struct s3c2410_dma_chan *chan = lookup_dma_channel(channel);
710 + struct s3c2410_dma_chan *chan = s3c_dma_lookup_channel(channel);
711 unsigned long flags;
712
713 if (chan == NULL)
714 @@ -836,7 +818,7 @@ int s3c2410_dma_free(unsigned int channe
715 chan->irq_claimed = 0;
716
717 if (!(channel & DMACH_LOW_LEVEL))
718 - dma_chan_map[channel] = NULL;
719 + s3c_dma_chan_map[channel] = NULL;
720
721 local_irq_restore(flags);
722
723 @@ -995,7 +977,7 @@ static int s3c2410_dma_started(struct s3
724 int
725 s3c2410_dma_ctrl(unsigned int channel, enum s3c2410_chan_op op)
726 {
727 - struct s3c2410_dma_chan *chan = lookup_dma_channel(channel);
728 + struct s3c2410_dma_chan *chan = s3c_dma_lookup_channel(channel);
729
730 if (chan == NULL)
731 return -EINVAL;
732 @@ -1038,14 +1020,13 @@ EXPORT_SYMBOL(s3c2410_dma_ctrl);
733 /* s3c2410_dma_config
734 *
735 * xfersize: size of unit in bytes (1,2,4)
736 - * dcon: base value of the DCONx register
737 */
738
739 int s3c2410_dma_config(unsigned int channel,
740 - int xferunit,
741 - int dcon)
742 + int xferunit)
743 {
744 - struct s3c2410_dma_chan *chan = lookup_dma_channel(channel);
745 + struct s3c2410_dma_chan *chan = s3c_dma_lookup_channel(channel);
746 + unsigned int dcon;
747
748 pr_debug("%s: chan=%d, xfer_unit=%d, dcon=%08x\n",
749 __func__, channel, xferunit, dcon);
750 @@ -1055,10 +1036,33 @@ int s3c2410_dma_config(unsigned int chan
751
752 pr_debug("%s: Initial dcon is %08x\n", __func__, dcon);
753
754 - dcon |= chan->dcon & dma_sel.dcon_mask;
755 + dcon = chan->dcon & dma_sel.dcon_mask;
756
757 pr_debug("%s: New dcon is %08x\n", __func__, dcon);
758
759 + switch (chan->req_ch) {
760 + case DMACH_I2S_IN:
761 + case DMACH_I2S_OUT:
762 + case DMACH_PCM_IN:
763 + case DMACH_PCM_OUT:
764 + case DMACH_MIC_IN:
765 + default:
766 + dcon |= S3C2410_DCON_HANDSHAKE;
767 + dcon |= S3C2410_DCON_SYNC_PCLK;
768 + break;
769 +
770 + case DMACH_SDI:
771 + /* note, ensure if need HANDSHAKE or not */
772 + dcon |= S3C2410_DCON_SYNC_PCLK;
773 + break;
774 +
775 + case DMACH_XD0:
776 + case DMACH_XD1:
777 + dcon |= S3C2410_DCON_HANDSHAKE;
778 + dcon |= S3C2410_DCON_SYNC_HCLK;
779 + break;
780 + }
781 +
782 switch (xferunit) {
783 case 1:
784 dcon |= S3C2410_DCON_BYTE;
785 @@ -1089,10 +1093,10 @@ int s3c2410_dma_config(unsigned int chan
786 }
787
788 EXPORT_SYMBOL(s3c2410_dma_config);
789 -
790 +#if 0 /* moved to plat-s3c? */
791 int s3c2410_dma_setflags(unsigned int channel, unsigned int flags)
792 {
793 - struct s3c2410_dma_chan *chan = lookup_dma_channel(channel);
794 + struct s3c2410_dma_chan *chan = s3c_dma_lookup_channel(channel);
795
796 if (chan == NULL)
797 return -EINVAL;
798 @@ -1105,43 +1109,7 @@ int s3c2410_dma_setflags(unsigned int ch
799 }
800
801 EXPORT_SYMBOL(s3c2410_dma_setflags);
802 -
803 -
804 -/* do we need to protect the settings of the fields from
805 - * irq?
806 -*/
807 -
808 -int s3c2410_dma_set_opfn(unsigned int channel, s3c2410_dma_opfn_t rtn)
809 -{
810 - struct s3c2410_dma_chan *chan = lookup_dma_channel(channel);
811 -
812 - if (chan == NULL)
813 - return -EINVAL;
814 -
815 - pr_debug("%s: chan=%p, op rtn=%p\n", __func__, chan, rtn);
816 -
817 - chan->op_fn = rtn;
818 -
819 - return 0;
820 -}
821 -
822 -EXPORT_SYMBOL(s3c2410_dma_set_opfn);
823 -
824 -int s3c2410_dma_set_buffdone_fn(unsigned int channel, s3c2410_dma_cbfn_t rtn)
825 -{
826 - struct s3c2410_dma_chan *chan = lookup_dma_channel(channel);
827 -
828 - if (chan == NULL)
829 - return -EINVAL;
830 -
831 - pr_debug("%s: chan=%p, callback rtn=%p\n", __func__, chan, rtn);
832 -
833 - chan->callback_fn = rtn;
834 -
835 - return 0;
836 -}
837 -
838 -EXPORT_SYMBOL(s3c2410_dma_set_buffdone_fn);
839 +#endif
840
841 /* s3c2410_dma_devconfig
842 *
843 @@ -1150,29 +1118,38 @@ EXPORT_SYMBOL(s3c2410_dma_set_buffdone_f
844 * source: S3C2410_DMASRC_HW: source is hardware
845 * S3C2410_DMASRC_MEM: source is memory
846 *
847 - * hwcfg: the value for xxxSTCn register,
848 - * bit 0: 0=increment pointer, 1=leave pointer
849 - * bit 1: 0=source is AHB, 1=source is APB
850 - *
851 * devaddr: physical address of the source
852 */
853
854 int s3c2410_dma_devconfig(int channel,
855 enum s3c2410_dmasrc source,
856 - int hwcfg,
857 unsigned long devaddr)
858 {
859 - struct s3c2410_dma_chan *chan = lookup_dma_channel(channel);
860 + struct s3c2410_dma_chan *chan = s3c_dma_lookup_channel(channel);
861 + unsigned int hwcfg;
862
863 if (chan == NULL)
864 return -EINVAL;
865
866 - pr_debug("%s: source=%d, hwcfg=%08x, devaddr=%08lx\n",
867 - __func__, (int)source, hwcfg, devaddr);
868 + pr_debug("%s: source=%d, devaddr=%08lx\n",
869 + __func__, (int)source, devaddr);
870
871 chan->source = source;
872 chan->dev_addr = devaddr;
873 - chan->hw_cfg = hwcfg;
874 +
875 + switch (chan->req_ch) {
876 + case DMACH_XD0:
877 + case DMACH_XD1:
878 + hwcfg = 0; /* AHB */
879 + break;
880 +
881 + default:
882 + hwcfg = S3C2410_DISRCC_APB;
883 + }
884 +
885 + /* always assume our peripheral desintation is a fixed
886 + * address in memory. */
887 + hwcfg |= S3C2410_DISRCC_INC;
888
889 switch (source) {
890 case S3C2410_DMASRC_HW:
891 @@ -1219,7 +1196,7 @@ EXPORT_SYMBOL(s3c2410_dma_devconfig);
892
893 int s3c2410_dma_getposition(unsigned int channel, dma_addr_t *src, dma_addr_t *dst)
894 {
895 - struct s3c2410_dma_chan *chan = lookup_dma_channel(channel);
896 + struct s3c2410_dma_chan *chan = s3c_dma_lookup_channel(channel);
897
898 if (chan == NULL)
899 return -EINVAL;
900 @@ -1278,8 +1255,8 @@ static int s3c2410_dma_resume(struct sys
901
902 printk(KERN_INFO "dma%d: restoring configuration\n", cp->number);
903
904 - s3c2410_dma_config(no, cp->xfer_unit, cp->dcon);
905 - s3c2410_dma_devconfig(no, cp->source, cp->hw_cfg, cp->dev_addr);
906 + s3c2410_dma_config(no, cp->xfer_unit);
907 + s3c2410_dma_devconfig(no, cp->source, cp->dev_addr);
908
909 /* re-select the dma source for this channel */
910
911 @@ -1476,7 +1453,8 @@ static struct s3c2410_dma_chan *s3c2410_
912 found:
913 dmach = &s3c2410_chans[ch];
914 dmach->map = ch_map;
915 - dma_chan_map[channel] = dmach;
916 + dmach->req_ch = channel;
917 + s3c_dma_chan_map[channel] = dmach;
918
919 /* select the channel */
920
921 --- a/arch/arm/plat-s3c24xx/include/plat/dma.h
922 +++ /dev/null
923 @@ -1,82 +0,0 @@
924 -/* linux/include/asm-arm/plat-s3c24xx/dma.h
925 - *
926 - * Copyright (C) 2006 Simtec Electronics
927 - * Ben Dooks <ben@simtec.co.uk>
928 - *
929 - * Samsung S3C24XX DMA support
930 - *
931 - * This program is free software; you can redistribute it and/or modify
932 - * it under the terms of the GNU General Public License version 2 as
933 - * published by the Free Software Foundation.
934 -*/
935 -
936 -extern struct sysdev_class dma_sysclass;
937 -extern struct s3c2410_dma_chan s3c2410_chans[S3C2410_DMA_CHANNELS];
938 -
939 -#define DMA_CH_VALID (1<<31)
940 -#define DMA_CH_NEVER (1<<30)
941 -
942 -struct s3c24xx_dma_addr {
943 - unsigned long from;
944 - unsigned long to;
945 -};
946 -
947 -/* struct s3c24xx_dma_map
948 - *
949 - * this holds the mapping information for the channel selected
950 - * to be connected to the specified device
951 -*/
952 -
953 -struct s3c24xx_dma_map {
954 - const char *name;
955 - struct s3c24xx_dma_addr hw_addr;
956 -
957 - unsigned long channels[S3C2410_DMA_CHANNELS];
958 - unsigned long channels_rx[S3C2410_DMA_CHANNELS];
959 -};
960 -
961 -struct s3c24xx_dma_selection {
962 - struct s3c24xx_dma_map *map;
963 - unsigned long map_size;
964 - unsigned long dcon_mask;
965 -
966 - void (*select)(struct s3c2410_dma_chan *chan,
967 - struct s3c24xx_dma_map *map);
968 -
969 - void (*direction)(struct s3c2410_dma_chan *chan,
970 - struct s3c24xx_dma_map *map,
971 - enum s3c2410_dmasrc dir);
972 -};
973 -
974 -extern int s3c24xx_dma_init_map(struct s3c24xx_dma_selection *sel);
975 -
976 -/* struct s3c24xx_dma_order_ch
977 - *
978 - * channel map for one of the `enum dma_ch` dma channels. the list
979 - * entry contains a set of low-level channel numbers, orred with
980 - * DMA_CH_VALID, which are checked in the order in the array.
981 -*/
982 -
983 -struct s3c24xx_dma_order_ch {
984 - unsigned int list[S3C2410_DMA_CHANNELS]; /* list of channels */
985 - unsigned int flags; /* flags */
986 -};
987 -
988 -/* struct s3c24xx_dma_order
989 - *
990 - * information provided by either the core or the board to give the
991 - * dma system a hint on how to allocate channels
992 -*/
993 -
994 -struct s3c24xx_dma_order {
995 - struct s3c24xx_dma_order_ch channels[DMACH_MAX];
996 -};
997 -
998 -extern int s3c24xx_dma_order_set(struct s3c24xx_dma_order *map);
999 -
1000 -/* DMA init code, called from the cpu support code */
1001 -
1002 -extern int s3c2410_dma_init(void);
1003 -
1004 -extern int s3c24xx_dma_init(unsigned int channels, unsigned int irq,
1005 - unsigned int stride);
1006 --- /dev/null
1007 +++ b/arch/arm/plat-s3c24xx/include/plat/dma-plat.h
1008 @@ -0,0 +1,84 @@
1009 +/* linux/arch/arm/plat-s3c24xx/include/plat/dma-plat.h
1010 + *
1011 + * Copyright (C) 2006 Simtec Electronics
1012 + * Ben Dooks <ben@simtec.co.uk>
1013 + *
1014 + * Samsung S3C24XX DMA support
1015 + *
1016 + * This program is free software; you can redistribute it and/or modify
1017 + * it under the terms of the GNU General Public License version 2 as
1018 + * published by the Free Software Foundation.
1019 +*/
1020 +
1021 +#include <plat/dma-core.h>
1022 +
1023 +extern struct sysdev_class dma_sysclass;
1024 +extern struct s3c2410_dma_chan s3c2410_chans[S3C_DMA_CHANNELS];
1025 +
1026 +#define DMA_CH_VALID (1<<31)
1027 +#define DMA_CH_NEVER (1<<30)
1028 +
1029 +struct s3c24xx_dma_addr {
1030 + unsigned long from;
1031 + unsigned long to;
1032 +};
1033 +
1034 +/* struct s3c24xx_dma_map
1035 + *
1036 + * this holds the mapping information for the channel selected
1037 + * to be connected to the specified device
1038 +*/
1039 +
1040 +struct s3c24xx_dma_map {
1041 + const char *name;
1042 + struct s3c24xx_dma_addr hw_addr;
1043 +
1044 + unsigned long channels[S3C_DMA_CHANNELS];
1045 + unsigned long channels_rx[S3C_DMA_CHANNELS];
1046 +};
1047 +
1048 +struct s3c24xx_dma_selection {
1049 + struct s3c24xx_dma_map *map;
1050 + unsigned long map_size;
1051 + unsigned long dcon_mask;
1052 +
1053 + void (*select)(struct s3c2410_dma_chan *chan,
1054 + struct s3c24xx_dma_map *map);
1055 +
1056 + void (*direction)(struct s3c2410_dma_chan *chan,
1057 + struct s3c24xx_dma_map *map,
1058 + enum s3c2410_dmasrc dir);
1059 +};
1060 +
1061 +extern int s3c24xx_dma_init_map(struct s3c24xx_dma_selection *sel);
1062 +
1063 +/* struct s3c24xx_dma_order_ch
1064 + *
1065 + * channel map for one of the `enum dma_ch` dma channels. the list
1066 + * entry contains a set of low-level channel numbers, orred with
1067 + * DMA_CH_VALID, which are checked in the order in the array.
1068 +*/
1069 +
1070 +struct s3c24xx_dma_order_ch {
1071 + unsigned int list[S3C_DMA_CHANNELS]; /* list of channels */
1072 + unsigned int flags; /* flags */
1073 +};
1074 +
1075 +/* struct s3c24xx_dma_order
1076 + *
1077 + * information provided by either the core or the board to give the
1078 + * dma system a hint on how to allocate channels
1079 +*/
1080 +
1081 +struct s3c24xx_dma_order {
1082 + struct s3c24xx_dma_order_ch channels[DMACH_MAX];
1083 +};
1084 +
1085 +extern int s3c24xx_dma_order_set(struct s3c24xx_dma_order *map);
1086 +
1087 +/* DMA init code, called from the cpu support code */
1088 +
1089 +extern int s3c2410_dma_init(void);
1090 +
1091 +extern int s3c24xx_dma_init(unsigned int channels, unsigned int irq,
1092 + unsigned int stride);
1093 --- /dev/null
1094 +++ b/arch/arm/plat-s3c24xx/include/plat/regs-dma.h
1095 @@ -0,0 +1,145 @@
1096 +/* arch/arm/mach-s3c2410/include/mach/dma.h
1097 + *
1098 + * Copyright (C) 2003,2004,2006 Simtec Electronics
1099 + * Ben Dooks <ben@simtec.co.uk>
1100 + *
1101 + * Samsung S3C24XX DMA support
1102 + *
1103 + * This program is free software; you can redistribute it and/or modify
1104 + * it under the terms of the GNU General Public License version 2 as
1105 + * published by the Free Software Foundation.
1106 +*/
1107 +
1108 +/* DMA Register definitions */
1109 +
1110 +#define S3C2410_DMA_DISRC (0x00)
1111 +#define S3C2410_DMA_DISRCC (0x04)
1112 +#define S3C2410_DMA_DIDST (0x08)
1113 +#define S3C2410_DMA_DIDSTC (0x0C)
1114 +#define S3C2410_DMA_DCON (0x10)
1115 +#define S3C2410_DMA_DSTAT (0x14)
1116 +#define S3C2410_DMA_DCSRC (0x18)
1117 +#define S3C2410_DMA_DCDST (0x1C)
1118 +#define S3C2410_DMA_DMASKTRIG (0x20)
1119 +#define S3C2412_DMA_DMAREQSEL (0x24)
1120 +#define S3C2443_DMA_DMAREQSEL (0x24)
1121 +
1122 +#define S3C2410_DISRCC_INC (1<<0)
1123 +#define S3C2410_DISRCC_APB (1<<1)
1124 +
1125 +#define S3C2410_DMASKTRIG_STOP (1<<2)
1126 +#define S3C2410_DMASKTRIG_ON (1<<1)
1127 +#define S3C2410_DMASKTRIG_SWTRIG (1<<0)
1128 +
1129 +#define S3C2410_DCON_DEMAND (0<<31)
1130 +#define S3C2410_DCON_HANDSHAKE (1<<31)
1131 +#define S3C2410_DCON_SYNC_PCLK (0<<30)
1132 +#define S3C2410_DCON_SYNC_HCLK (1<<30)
1133 +
1134 +#define S3C2410_DCON_INTREQ (1<<29)
1135 +
1136 +#define S3C2410_DCON_CH0_XDREQ0 (0<<24)
1137 +#define S3C2410_DCON_CH0_UART0 (1<<24)
1138 +#define S3C2410_DCON_CH0_SDI (2<<24)
1139 +#define S3C2410_DCON_CH0_TIMER (3<<24)
1140 +#define S3C2410_DCON_CH0_USBEP1 (4<<24)
1141 +
1142 +#define S3C2410_DCON_CH1_XDREQ1 (0<<24)
1143 +#define S3C2410_DCON_CH1_UART1 (1<<24)
1144 +#define S3C2410_DCON_CH1_I2SSDI (2<<24)
1145 +#define S3C2410_DCON_CH1_SPI (3<<24)
1146 +#define S3C2410_DCON_CH1_USBEP2 (4<<24)
1147 +
1148 +#define S3C2410_DCON_CH2_I2SSDO (0<<24)
1149 +#define S3C2410_DCON_CH2_I2SSDI (1<<24)
1150 +#define S3C2410_DCON_CH2_SDI (2<<24)
1151 +#define S3C2410_DCON_CH2_TIMER (3<<24)
1152 +#define S3C2410_DCON_CH2_USBEP3 (4<<24)
1153 +
1154 +#define S3C2410_DCON_CH3_UART2 (0<<24)
1155 +#define S3C2410_DCON_CH3_SDI (1<<24)
1156 +#define S3C2410_DCON_CH3_SPI (2<<24)
1157 +#define S3C2410_DCON_CH3_TIMER (3<<24)
1158 +#define S3C2410_DCON_CH3_USBEP4 (4<<24)
1159 +
1160 +#define S3C2410_DCON_SRCSHIFT (24)
1161 +#define S3C2410_DCON_SRCMASK (7<<24)
1162 +
1163 +#define S3C2410_DCON_BYTE (0<<20)
1164 +#define S3C2410_DCON_HALFWORD (1<<20)
1165 +#define S3C2410_DCON_WORD (2<<20)
1166 +
1167 +#define S3C2410_DCON_AUTORELOAD (0<<22)
1168 +#define S3C2410_DCON_NORELOAD (1<<22)
1169 +#define S3C2410_DCON_HWTRIG (1<<23)
1170 +
1171 +#if defined(CONFIG_CPU_S3C2440) || defined(CONFIG_CPU_S3C2442)
1172 +#define S3C2440_DIDSTC_CHKINT (1<<2)
1173 +
1174 +#define S3C2440_DCON_CH0_I2SSDO (5<<24)
1175 +#define S3C2440_DCON_CH0_PCMIN (6<<24)
1176 +
1177 +#define S3C2440_DCON_CH1_PCMOUT (5<<24)
1178 +#define S3C2440_DCON_CH1_SDI (6<<24)
1179 +
1180 +#define S3C2440_DCON_CH2_PCMIN (5<<24)
1181 +#define S3C2440_DCON_CH2_MICIN (6<<24)
1182 +
1183 +#define S3C2440_DCON_CH3_MICIN (5<<24)
1184 +#define S3C2440_DCON_CH3_PCMOUT (6<<24)
1185 +#endif
1186 +
1187 +#ifdef CONFIG_CPU_S3C2412
1188 +
1189 +#define S3C2412_DMAREQSEL_SRC(x) ((x)<<1)
1190 +
1191 +#define S3C2412_DMAREQSEL_HW (1)
1192 +
1193 +#define S3C2412_DMAREQSEL_SPI0TX S3C2412_DMAREQSEL_SRC(0)
1194 +#define S3C2412_DMAREQSEL_SPI0RX S3C2412_DMAREQSEL_SRC(1)
1195 +#define S3C2412_DMAREQSEL_SPI1TX S3C2412_DMAREQSEL_SRC(2)
1196 +#define S3C2412_DMAREQSEL_SPI1RX S3C2412_DMAREQSEL_SRC(3)
1197 +#define S3C2412_DMAREQSEL_I2STX S3C2412_DMAREQSEL_SRC(4)
1198 +#define S3C2412_DMAREQSEL_I2SRX S3C2412_DMAREQSEL_SRC(5)
1199 +#define S3C2412_DMAREQSEL_TIMER S3C2412_DMAREQSEL_SRC(9)
1200 +#define S3C2412_DMAREQSEL_SDI S3C2412_DMAREQSEL_SRC(10)
1201 +#define S3C2412_DMAREQSEL_USBEP1 S3C2412_DMAREQSEL_SRC(13)
1202 +#define S3C2412_DMAREQSEL_USBEP2 S3C2412_DMAREQSEL_SRC(14)
1203 +#define S3C2412_DMAREQSEL_USBEP3 S3C2412_DMAREQSEL_SRC(15)
1204 +#define S3C2412_DMAREQSEL_USBEP4 S3C2412_DMAREQSEL_SRC(16)
1205 +#define S3C2412_DMAREQSEL_XDREQ0 S3C2412_DMAREQSEL_SRC(17)
1206 +#define S3C2412_DMAREQSEL_XDREQ1 S3C2412_DMAREQSEL_SRC(18)
1207 +#define S3C2412_DMAREQSEL_UART0_0 S3C2412_DMAREQSEL_SRC(19)
1208 +#define S3C2412_DMAREQSEL_UART0_1 S3C2412_DMAREQSEL_SRC(20)
1209 +#define S3C2412_DMAREQSEL_UART1_0 S3C2412_DMAREQSEL_SRC(21)
1210 +#define S3C2412_DMAREQSEL_UART1_1 S3C2412_DMAREQSEL_SRC(22)
1211 +#define S3C2412_DMAREQSEL_UART2_0 S3C2412_DMAREQSEL_SRC(23)
1212 +#define S3C2412_DMAREQSEL_UART2_1 S3C2412_DMAREQSEL_SRC(24)
1213 +
1214 +#endif
1215 +
1216 +#define S3C2443_DMAREQSEL_SRC(x) ((x)<<1)
1217 +
1218 +#define S3C2443_DMAREQSEL_HW (1)
1219 +
1220 +#define S3C2443_DMAREQSEL_SPI0TX S3C2443_DMAREQSEL_SRC(0)
1221 +#define S3C2443_DMAREQSEL_SPI0RX S3C2443_DMAREQSEL_SRC(1)
1222 +#define S3C2443_DMAREQSEL_SPI1TX S3C2443_DMAREQSEL_SRC(2)
1223 +#define S3C2443_DMAREQSEL_SPI1RX S3C2443_DMAREQSEL_SRC(3)
1224 +#define S3C2443_DMAREQSEL_I2STX S3C2443_DMAREQSEL_SRC(4)
1225 +#define S3C2443_DMAREQSEL_I2SRX S3C2443_DMAREQSEL_SRC(5)
1226 +#define S3C2443_DMAREQSEL_TIMER S3C2443_DMAREQSEL_SRC(9)
1227 +#define S3C2443_DMAREQSEL_SDI S3C2443_DMAREQSEL_SRC(10)
1228 +#define S3C2443_DMAREQSEL_XDREQ0 S3C2443_DMAREQSEL_SRC(17)
1229 +#define S3C2443_DMAREQSEL_XDREQ1 S3C2443_DMAREQSEL_SRC(18)
1230 +#define S3C2443_DMAREQSEL_UART0_0 S3C2443_DMAREQSEL_SRC(19)
1231 +#define S3C2443_DMAREQSEL_UART0_1 S3C2443_DMAREQSEL_SRC(20)
1232 +#define S3C2443_DMAREQSEL_UART1_0 S3C2443_DMAREQSEL_SRC(21)
1233 +#define S3C2443_DMAREQSEL_UART1_1 S3C2443_DMAREQSEL_SRC(22)
1234 +#define S3C2443_DMAREQSEL_UART2_0 S3C2443_DMAREQSEL_SRC(23)
1235 +#define S3C2443_DMAREQSEL_UART2_1 S3C2443_DMAREQSEL_SRC(24)
1236 +#define S3C2443_DMAREQSEL_UART3_0 S3C2443_DMAREQSEL_SRC(25)
1237 +#define S3C2443_DMAREQSEL_UART3_1 S3C2443_DMAREQSEL_SRC(26)
1238 +#define S3C2443_DMAREQSEL_PCMOUT S3C2443_DMAREQSEL_SRC(27)
1239 +#define S3C2443_DMAREQSEL_PCMIN S3C2443_DMAREQSEL_SRC(28)
1240 +#define S3C2443_DMAREQSEL_MICIN S3C2443_DMAREQSEL_SRC(29)
1241 --- a/arch/arm/plat-s3c24xx/Kconfig
1242 +++ b/arch/arm/plat-s3c24xx/Kconfig
1243 @@ -71,6 +71,7 @@ config PM_SIMTEC
1244 config S3C2410_DMA
1245 bool "S3C2410 DMA support"
1246 depends on ARCH_S3C2410
1247 + select S3C_DMA
1248 help
1249 S3C2410 DMA support. This is needed for drivers like sound which
1250 use the S3C2410's DMA system to move data to and from the
1251 --- a/arch/arm/mach-s3c2410/dma.c
1252 +++ b/arch/arm/mach-s3c2410/dma.c
1253 @@ -17,14 +17,16 @@
1254 #include <linux/sysdev.h>
1255 #include <linux/serial_core.h>
1256
1257 +#include <mach/map.h>
1258 #include <mach/dma.h>
1259
1260 #include <plat/cpu.h>
1261 -#include <plat/dma.h>
1262 +#include <plat/dma-plat.h>
1263
1264 #include <plat/regs-serial.h>
1265 #include <mach/regs-gpio.h>
1266 #include <plat/regs-ac97.h>
1267 +#include <plat/regs-dma.h>
1268 #include <mach/regs-mem.h>
1269 #include <mach/regs-lcd.h>
1270 #include <mach/regs-sdi.h>
1271 --- a/arch/arm/mach-s3c2440/dma.c
1272 +++ b/arch/arm/mach-s3c2440/dma.c
1273 @@ -17,14 +17,16 @@
1274 #include <linux/sysdev.h>
1275 #include <linux/serial_core.h>
1276
1277 +#include <mach/map.h>
1278 #include <mach/dma.h>
1279
1280 -#include <plat/dma.h>
1281 +#include <plat/dma-plat.h>
1282 #include <plat/cpu.h>
1283
1284 #include <plat/regs-serial.h>
1285 #include <mach/regs-gpio.h>
1286 #include <plat/regs-ac97.h>
1287 +#include <plat/regs-dma.h>
1288 #include <mach/regs-mem.h>
1289 #include <mach/regs-lcd.h>
1290 #include <mach/regs-sdi.h>
1291 --- a/sound/soc/s3c24xx/s3c24xx-pcm.c
1292 +++ b/sound/soc/s3c24xx/s3c24xx-pcm.c
1293 @@ -218,24 +218,17 @@ static int s3c24xx_pcm_prepare(struct sn
1294 * sync to pclk, half-word transfers to the IIS-FIFO. */
1295 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
1296 s3c2410_dma_devconfig(prtd->params->channel,
1297 - S3C2410_DMASRC_MEM, S3C2410_DISRCC_INC |
1298 - S3C2410_DISRCC_APB, prtd->params->dma_addr);
1299 -
1300 - s3c2410_dma_config(prtd->params->channel,
1301 - prtd->params->dma_size,
1302 - S3C2410_DCON_SYNC_PCLK |
1303 - S3C2410_DCON_HANDSHAKE);
1304 + S3C2410_DMASRC_MEM,
1305 + prtd->params->dma_addr);
1306 } else {
1307 - s3c2410_dma_config(prtd->params->channel,
1308 - prtd->params->dma_size,
1309 - S3C2410_DCON_HANDSHAKE |
1310 - S3C2410_DCON_SYNC_PCLK);
1311 -
1312 s3c2410_dma_devconfig(prtd->params->channel,
1313 - S3C2410_DMASRC_HW, 0x3,
1314 - prtd->params->dma_addr);
1315 + S3C2410_DMASRC_HW,
1316 + prtd->params->dma_addr);
1317 }
1318
1319 + s3c2410_dma_config(prtd->params->channel,
1320 + prtd->params->dma_size);
1321 +
1322 /* flush the DMA channel */
1323 s3c2410_dma_ctrl(prtd->params->channel, S3C2410_DMAOP_FLUSH);
1324 prtd->dma_loaded = 0;
This page took 0.091692 seconds and 5 git commands to generate.