1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23#undef DEBUG
24
25#include <linux/module.h>
26#include <linux/init.h>
27#include <linux/kernel.h>
28#include <linux/interrupt.h>
29#include <linux/errno.h>
30
31#include <asm/system.h>
32#include <asm/irq.h>
33#include <mach/hardware.h>
34#include <asm/dma.h>
35#include <mach/imx-dma.h>
36
37struct imx_dma_channel imx_dma_channels[IMX_DMA_CHANNELS];
38
39
40
41
42
43
44
45
46
47
48
49static inline int imx_dma_sg_next(imx_dmach_t dma_ch, unsigned int lastcount)
50{
51 struct imx_dma_channel *imxdma = &imx_dma_channels[dma_ch];
52 unsigned int nextcount;
53 unsigned int nextaddr;
54
55 if (!imxdma->name) {
56 printk(KERN_CRIT "%s: called for not allocated channel %d\n",
57 __func__, dma_ch);
58 return 0;
59 }
60
61 imxdma->resbytes -= lastcount;
62
63 if (!imxdma->sg) {
64 pr_debug("imxdma%d: no sg data\n", dma_ch);
65 return 0;
66 }
67
68 imxdma->sgbc += lastcount;
69 if ((imxdma->sgbc >= imxdma->sg->length) || !imxdma->resbytes) {
70 if ((imxdma->sgcount <= 1) || !imxdma->resbytes) {
71 pr_debug("imxdma%d: sg transfer limit reached\n",
72 dma_ch);
73 imxdma->sgcount=0;
74 imxdma->sg = NULL;
75 return 0;
76 } else {
77 imxdma->sgcount--;
78 imxdma->sg++;
79 imxdma->sgbc = 0;
80 }
81 }
82 nextcount = imxdma->sg->length - imxdma->sgbc;
83 nextaddr = imxdma->sg->dma_address + imxdma->sgbc;
84
85 if(imxdma->resbytes < nextcount)
86 nextcount = imxdma->resbytes;
87
88 if ((imxdma->dma_mode & DMA_MODE_MASK) == DMA_MODE_READ)
89 DAR(dma_ch) = nextaddr;
90 else
91 SAR(dma_ch) = nextaddr;
92
93 CNTR(dma_ch) = nextcount;
94 pr_debug("imxdma%d: next sg chunk dst 0x%08x, src 0x%08x, size 0x%08x\n",
95 dma_ch, DAR(dma_ch), SAR(dma_ch), CNTR(dma_ch));
96
97 return nextcount;
98}
99
100
101
102
103
104
105
106
107
108
109static int
110imx_dma_setup_sg_base(imx_dmach_t dma_ch,
111 struct scatterlist *sg, unsigned int sgcount)
112{
113 struct imx_dma_channel *imxdma = &imx_dma_channels[dma_ch];
114
115 imxdma->sg = sg;
116 imxdma->sgcount = sgcount;
117 imxdma->sgbc = 0;
118 return imx_dma_sg_next(dma_ch, 0);
119}
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138int
139imx_dma_setup_single(imx_dmach_t dma_ch, dma_addr_t dma_address,
140 unsigned int dma_length, unsigned int dev_addr,
141 dmamode_t dmamode)
142{
143 struct imx_dma_channel *imxdma = &imx_dma_channels[dma_ch];
144
145 imxdma->sg = NULL;
146 imxdma->sgcount = 0;
147 imxdma->dma_mode = dmamode;
148 imxdma->resbytes = dma_length;
149
150 if (!dma_address) {
151 printk(KERN_ERR "imxdma%d: imx_dma_setup_single null address\n",
152 dma_ch);
153 return -EINVAL;
154 }
155
156 if (!dma_length) {
157 printk(KERN_ERR "imxdma%d: imx_dma_setup_single zero length\n",
158 dma_ch);
159 return -EINVAL;
160 }
161
162 if ((dmamode & DMA_MODE_MASK) == DMA_MODE_READ) {
163 pr_debug("imxdma%d: mx_dma_setup_single2dev dma_addressg=0x%08x dma_length=%d dev_addr=0x%08x for read\n",
164 dma_ch, (unsigned int)dma_address, dma_length,
165 dev_addr);
166 SAR(dma_ch) = dev_addr;
167 DAR(dma_ch) = (unsigned int)dma_address;
168 } else if ((dmamode & DMA_MODE_MASK) == DMA_MODE_WRITE) {
169 pr_debug("imxdma%d: mx_dma_setup_single2dev dma_addressg=0x%08x dma_length=%d dev_addr=0x%08x for write\n",
170 dma_ch, (unsigned int)dma_address, dma_length,
171 dev_addr);
172 SAR(dma_ch) = (unsigned int)dma_address;
173 DAR(dma_ch) = dev_addr;
174 } else {
175 printk(KERN_ERR "imxdma%d: imx_dma_setup_single bad dmamode\n",
176 dma_ch);
177 return -EINVAL;
178 }
179
180 CNTR(dma_ch) = dma_length;
181
182 return 0;
183}
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223int
224imx_dma_setup_sg(imx_dmach_t dma_ch,
225 struct scatterlist *sg, unsigned int sgcount, unsigned int dma_length,
226 unsigned int dev_addr, dmamode_t dmamode)
227{
228 int res;
229 struct imx_dma_channel *imxdma = &imx_dma_channels[dma_ch];
230
231 imxdma->sg = NULL;
232 imxdma->sgcount = 0;
233 imxdma->dma_mode = dmamode;
234 imxdma->resbytes = dma_length;
235
236 if (!sg || !sgcount) {
237 printk(KERN_ERR "imxdma%d: imx_dma_setup_sg epty sg list\n",
238 dma_ch);
239 return -EINVAL;
240 }
241
242 if (!sg->length) {
243 printk(KERN_ERR "imxdma%d: imx_dma_setup_sg zero length\n",
244 dma_ch);
245 return -EINVAL;
246 }
247
248 if ((dmamode & DMA_MODE_MASK) == DMA_MODE_READ) {
249 pr_debug("imxdma%d: mx_dma_setup_sg2dev sg=%p sgcount=%d total length=%d dev_addr=0x%08x for read\n",
250 dma_ch, sg, sgcount, dma_length, dev_addr);
251 SAR(dma_ch) = dev_addr;
252 } else if ((dmamode & DMA_MODE_MASK) == DMA_MODE_WRITE) {
253 pr_debug("imxdma%d: mx_dma_setup_sg2dev sg=%p sgcount=%d total length=%d dev_addr=0x%08x for write\n",
254 dma_ch, sg, sgcount, dma_length, dev_addr);
255 DAR(dma_ch) = dev_addr;
256 } else {
257 printk(KERN_ERR "imxdma%d: imx_dma_setup_sg bad dmamode\n",
258 dma_ch);
259 return -EINVAL;
260 }
261
262 res = imx_dma_setup_sg_base(dma_ch, sg, sgcount);
263 if (res <= 0) {
264 printk(KERN_ERR "imxdma%d: no sg chunk ready\n", dma_ch);
265 return -EINVAL;
266 }
267
268 return 0;
269}
270
271
272
273
274
275
276
277
278
279
280int
281imx_dma_setup_handlers(imx_dmach_t dma_ch,
282 void (*irq_handler) (int, void *),
283 void (*err_handler) (int, void *, int),
284 void *data)
285{
286 struct imx_dma_channel *imxdma = &imx_dma_channels[dma_ch];
287 unsigned long flags;
288
289 if (!imxdma->name) {
290 printk(KERN_CRIT "%s: called for not allocated channel %d\n",
291 __func__, dma_ch);
292 return -ENODEV;
293 }
294
295 local_irq_save(flags);
296 DISR = (1 << dma_ch);
297 imxdma->irq_handler = irq_handler;
298 imxdma->err_handler = err_handler;
299 imxdma->data = data;
300 local_irq_restore(flags);
301 return 0;
302}
303
304
305
306
307
308
309
310
311
312
313
314
315void imx_dma_enable(imx_dmach_t dma_ch)
316{
317 struct imx_dma_channel *imxdma = &imx_dma_channels[dma_ch];
318 unsigned long flags;
319
320 pr_debug("imxdma%d: imx_dma_enable\n", dma_ch);
321
322 if (!imxdma->name) {
323 printk(KERN_CRIT "%s: called for not allocated channel %d\n",
324 __func__, dma_ch);
325 return;
326 }
327
328 local_irq_save(flags);
329 DISR = (1 << dma_ch);
330 DIMR &= ~(1 << dma_ch);
331 CCR(dma_ch) |= CCR_CEN;
332 local_irq_restore(flags);
333}
334
335
336
337
338
339void imx_dma_disable(imx_dmach_t dma_ch)
340{
341 unsigned long flags;
342
343 pr_debug("imxdma%d: imx_dma_disable\n", dma_ch);
344
345 local_irq_save(flags);
346 DIMR |= (1 << dma_ch);
347 CCR(dma_ch) &= ~CCR_CEN;
348 DISR = (1 << dma_ch);
349 local_irq_restore(flags);
350}
351
352
353
354
355
356
357int imx_dma_request(imx_dmach_t dma_ch, const char *name)
358{
359 struct imx_dma_channel *imxdma = &imx_dma_channels[dma_ch];
360 unsigned long flags;
361
362
363 if (!name)
364 return -EINVAL;
365
366 if (dma_ch >= IMX_DMA_CHANNELS) {
367 printk(KERN_CRIT "%s: called for non-existed channel %d\n",
368 __func__, dma_ch);
369 return -EINVAL;
370 }
371
372 local_irq_save(flags);
373 if (imxdma->name) {
374 local_irq_restore(flags);
375 return -ENODEV;
376 }
377
378 imxdma->name = name;
379 imxdma->irq_handler = NULL;
380 imxdma->err_handler = NULL;
381 imxdma->data = NULL;
382 imxdma->sg = NULL;
383 local_irq_restore(flags);
384 return 0;
385}
386
387
388
389
390
391void imx_dma_free(imx_dmach_t dma_ch)
392{
393 unsigned long flags;
394 struct imx_dma_channel *imxdma = &imx_dma_channels[dma_ch];
395
396 if (!imxdma->name) {
397 printk(KERN_CRIT
398 "%s: trying to free channel %d which is already freed\n",
399 __func__, dma_ch);
400 return;
401 }
402
403 local_irq_save(flags);
404
405 DIMR |= (1 << dma_ch);
406 CCR(dma_ch) &= ~CCR_CEN;
407 imxdma->name = NULL;
408 local_irq_restore(flags);
409}
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424imx_dmach_t imx_dma_request_by_prio(const char *name, imx_dma_prio prio)
425{
426 int i;
427 int best;
428
429 switch (prio) {
430 case (DMA_PRIO_HIGH):
431 best = 8;
432 break;
433 case (DMA_PRIO_MEDIUM):
434 best = 4;
435 break;
436 case (DMA_PRIO_LOW):
437 default:
438 best = 0;
439 break;
440 }
441
442 for (i = best; i < IMX_DMA_CHANNELS; i++) {
443 if (!imx_dma_request(i, name)) {
444 return i;
445 }
446 }
447
448 for (i = best - 1; i >= 0; i--) {
449 if (!imx_dma_request(i, name)) {
450 return i;
451 }
452 }
453
454 printk(KERN_ERR "%s: no free DMA channel found\n", __func__);
455
456 return -ENODEV;
457}
458
459static irqreturn_t dma_err_handler(int irq, void *dev_id)
460{
461 int i, disr = DISR;
462 struct imx_dma_channel *channel;
463 unsigned int err_mask = DBTOSR | DRTOSR | DSESR | DBOSR;
464 int errcode;
465
466 DISR = disr & err_mask;
467 for (i = 0; i < IMX_DMA_CHANNELS; i++) {
468 if(!(err_mask & (1 << i)))
469 continue;
470 channel = &imx_dma_channels[i];
471 errcode = 0;
472
473 if (DBTOSR & (1 << i)) {
474 DBTOSR = (1 << i);
475 errcode |= IMX_DMA_ERR_BURST;
476 }
477 if (DRTOSR & (1 << i)) {
478 DRTOSR = (1 << i);
479 errcode |= IMX_DMA_ERR_REQUEST;
480 }
481 if (DSESR & (1 << i)) {
482 DSESR = (1 << i);
483 errcode |= IMX_DMA_ERR_TRANSFER;
484 }
485 if (DBOSR & (1 << i)) {
486 DBOSR = (1 << i);
487 errcode |= IMX_DMA_ERR_BUFFER;
488 }
489
490
491
492
493
494
495
496
497 if (channel->name && channel->err_handler) {
498 channel->err_handler(i, channel->data, errcode);
499 continue;
500 }
501
502 imx_dma_channels[i].sg = NULL;
503
504 printk(KERN_WARNING
505 "DMA timeout on channel %d (%s) -%s%s%s%s\n",
506 i, channel->name,
507 errcode&IMX_DMA_ERR_BURST? " burst":"",
508 errcode&IMX_DMA_ERR_REQUEST? " request":"",
509 errcode&IMX_DMA_ERR_TRANSFER? " transfer":"",
510 errcode&IMX_DMA_ERR_BUFFER? " buffer":"");
511 }
512 return IRQ_HANDLED;
513}
514
515static irqreturn_t dma_irq_handler(int irq, void *dev_id)
516{
517 int i, disr = DISR;
518
519 pr_debug("imxdma: dma_irq_handler called, disr=0x%08x\n",
520 disr);
521
522 DISR = disr;
523 for (i = 0; i < IMX_DMA_CHANNELS; i++) {
524 if (disr & (1 << i)) {
525 struct imx_dma_channel *channel = &imx_dma_channels[i];
526 if (channel->name) {
527 if (imx_dma_sg_next(i, CNTR(i))) {
528 CCR(i) &= ~CCR_CEN;
529 mb();
530 CCR(i) |= CCR_CEN;
531 } else {
532 if (channel->irq_handler)
533 channel->irq_handler(i,
534 channel->data);
535 }
536 } else {
537
538
539
540
541 printk(KERN_WARNING
542 "spurious IRQ for DMA channel %d\n", i);
543 }
544 }
545 }
546 return IRQ_HANDLED;
547}
548
549static int __init imx_dma_init(void)
550{
551 int ret;
552 int i;
553
554
555 DCR = DCR_DRST;
556
557 ret = request_irq(DMA_INT, dma_irq_handler, 0, "DMA", NULL);
558 if (ret) {
559 printk(KERN_CRIT "Wow! Can't register IRQ for DMA\n");
560 return ret;
561 }
562
563 ret = request_irq(DMA_ERR, dma_err_handler, 0, "DMA", NULL);
564 if (ret) {
565 printk(KERN_CRIT "Wow! Can't register ERRIRQ for DMA\n");
566 free_irq(DMA_INT, NULL);
567 }
568
569
570 DCR = DCR_DEN;
571
572
573 DISR = (1 << IMX_DMA_CHANNELS) - 1;
574
575
576 DIMR = (1 << IMX_DMA_CHANNELS) - 1;
577
578 for (i = 0; i < IMX_DMA_CHANNELS; i++) {
579 imx_dma_channels[i].sg = NULL;
580 imx_dma_channels[i].dma_num = i;
581 }
582
583 return ret;
584}
585
586arch_initcall(imx_dma_init);
587
588EXPORT_SYMBOL(imx_dma_setup_single);
589EXPORT_SYMBOL(imx_dma_setup_sg);
590EXPORT_SYMBOL(imx_dma_setup_handlers);
591EXPORT_SYMBOL(imx_dma_enable);
592EXPORT_SYMBOL(imx_dma_disable);
593EXPORT_SYMBOL(imx_dma_request);
594EXPORT_SYMBOL(imx_dma_free);
595EXPORT_SYMBOL(imx_dma_request_by_prio);
596EXPORT_SYMBOL(imx_dma_channels);
597