]> pilppa.org Git - linux-2.6-omap-h63xx.git/blob - arch/blackfin/kernel/bfin_dma_5xx.c
ed7d2859a626d07ae47c7008e717eb1857f6a671
[linux-2.6-omap-h63xx.git] / arch / blackfin / kernel / bfin_dma_5xx.c
1 /*
2  * bfin_dma_5xx.c - Blackfin DMA implementation
3  *
4  * Copyright 2004-2006 Analog Devices Inc.
5  * Licensed under the GPL-2 or later.
6  */
7
8 #include <linux/errno.h>
9 #include <linux/interrupt.h>
10 #include <linux/kernel.h>
11 #include <linux/module.h>
12 #include <linux/param.h>
13 #include <linux/proc_fs.h>
14 #include <linux/sched.h>
15 #include <linux/seq_file.h>
16 #include <linux/spinlock.h>
17
18 #include <asm/blackfin.h>
19 #include <asm/cacheflush.h>
20 #include <asm/dma.h>
21 #include <asm/uaccess.h>
22
23 /**************************************************************************
24  * Global Variables
25 ***************************************************************************/
26
27 static struct dma_channel dma_ch[MAX_DMA_CHANNELS];
28
29 /*------------------------------------------------------------------------------
30  *       Set the Buffer Clear bit in the Configuration register of specific DMA
31  *       channel. This will stop the descriptor based DMA operation.
32  *-----------------------------------------------------------------------------*/
33 static void clear_dma_buffer(unsigned int channel)
34 {
35         dma_ch[channel].regs->cfg |= RESTART;
36         SSYNC();
37         dma_ch[channel].regs->cfg &= ~RESTART;
38 }
39
40 static int __init blackfin_dma_init(void)
41 {
42         int i;
43
44         printk(KERN_INFO "Blackfin DMA Controller\n");
45
46         for (i = 0; i < MAX_DMA_CHANNELS; i++) {
47                 dma_ch[i].chan_status = DMA_CHANNEL_FREE;
48                 dma_ch[i].regs = dma_io_base_addr[i];
49                 mutex_init(&(dma_ch[i].dmalock));
50         }
51         /* Mark MEMDMA Channel 0 as requested since we're using it internally */
52         request_dma(CH_MEM_STREAM0_DEST, "Blackfin dma_memcpy");
53         request_dma(CH_MEM_STREAM0_SRC, "Blackfin dma_memcpy");
54
55 #if defined(CONFIG_DEB_DMA_URGENT)
56         bfin_write_EBIU_DDRQUE(bfin_read_EBIU_DDRQUE()
57                          | DEB1_URGENT | DEB2_URGENT | DEB3_URGENT);
58 #endif
59
60         return 0;
61 }
62 arch_initcall(blackfin_dma_init);
63
64 #ifdef CONFIG_PROC_FS
65 static int proc_dma_show(struct seq_file *m, void *v)
66 {
67         int i;
68
69         for (i = 0; i < MAX_DMA_CHANNELS; ++i)
70                 if (dma_ch[i].chan_status != DMA_CHANNEL_FREE)
71                         seq_printf(m, "%2d: %s\n", i, dma_ch[i].device_id);
72
73         return 0;
74 }
75
76 static int proc_dma_open(struct inode *inode, struct file *file)
77 {
78         return single_open(file, proc_dma_show, NULL);
79 }
80
81 static const struct file_operations proc_dma_operations = {
82         .open           = proc_dma_open,
83         .read           = seq_read,
84         .llseek         = seq_lseek,
85         .release        = single_release,
86 };
87
88 static int __init proc_dma_init(void)
89 {
90         return proc_create("dma", 0, NULL, &proc_dma_operations) != NULL;
91 }
92 late_initcall(proc_dma_init);
93 #endif
94
95 /*------------------------------------------------------------------------------
96  *      Request the specific DMA channel from the system.
97  *-----------------------------------------------------------------------------*/
98 int request_dma(unsigned int channel, const char *device_id)
99 {
100         pr_debug("request_dma() : BEGIN \n");
101
102         if (device_id == NULL)
103                 printk(KERN_WARNING "request_dma(%u): no device_id given\n", channel);
104
105 #if defined(CONFIG_BF561) && ANOMALY_05000182
106         if (channel >= CH_IMEM_STREAM0_DEST && channel <= CH_IMEM_STREAM1_DEST) {
107                 if (get_cclk() > 500000000) {
108                         printk(KERN_WARNING
109                                "Request IMDMA failed due to ANOMALY 05000182\n");
110                         return -EFAULT;
111                 }
112         }
113 #endif
114
115         mutex_lock(&(dma_ch[channel].dmalock));
116
117         if ((dma_ch[channel].chan_status == DMA_CHANNEL_REQUESTED)
118             || (dma_ch[channel].chan_status == DMA_CHANNEL_ENABLED)) {
119                 mutex_unlock(&(dma_ch[channel].dmalock));
120                 pr_debug("DMA CHANNEL IN USE  \n");
121                 return -EBUSY;
122         } else {
123                 dma_ch[channel].chan_status = DMA_CHANNEL_REQUESTED;
124                 pr_debug("DMA CHANNEL IS ALLOCATED  \n");
125         }
126
127         mutex_unlock(&(dma_ch[channel].dmalock));
128
129 #ifdef CONFIG_BF54x
130         if (channel >= CH_UART2_RX && channel <= CH_UART3_TX) {
131                 unsigned int per_map;
132                 per_map = dma_ch[channel].regs->peripheral_map & 0xFFF;
133                 if (strncmp(device_id, "BFIN_UART", 9) == 0)
134                         dma_ch[channel].regs->peripheral_map = per_map |
135                                 ((channel - CH_UART2_RX + 0xC)<<12);
136                 else
137                         dma_ch[channel].regs->peripheral_map = per_map |
138                                 ((channel - CH_UART2_RX + 0x6)<<12);
139         }
140 #endif
141
142         dma_ch[channel].device_id = device_id;
143         dma_ch[channel].irq = 0;
144
145         /* This is to be enabled by putting a restriction -
146          * you have to request DMA, before doing any operations on
147          * descriptor/channel
148          */
149         pr_debug("request_dma() : END  \n");
150         return channel;
151 }
152 EXPORT_SYMBOL(request_dma);
153
154 int set_dma_callback(unsigned int channel, irq_handler_t callback, void *data)
155 {
156         BUG_ON(!(dma_ch[channel].chan_status != DMA_CHANNEL_FREE
157                && channel < MAX_DMA_CHANNELS));
158
159         if (callback != NULL) {
160                 int ret;
161                 unsigned int irq = channel2irq(channel);
162
163                 ret = request_irq(irq, callback, IRQF_DISABLED,
164                         dma_ch[channel].device_id, data);
165                 if (ret)
166                         return ret;
167
168                 dma_ch[channel].irq = irq;
169                 dma_ch[channel].data = data;
170         }
171         return 0;
172 }
173 EXPORT_SYMBOL(set_dma_callback);
174
175 void free_dma(unsigned int channel)
176 {
177         pr_debug("freedma() : BEGIN \n");
178         BUG_ON(!(dma_ch[channel].chan_status != DMA_CHANNEL_FREE
179                && channel < MAX_DMA_CHANNELS));
180
181         /* Halt the DMA */
182         disable_dma(channel);
183         clear_dma_buffer(channel);
184
185         if (dma_ch[channel].irq)
186                 free_irq(dma_ch[channel].irq, dma_ch[channel].data);
187
188         /* Clear the DMA Variable in the Channel */
189         mutex_lock(&(dma_ch[channel].dmalock));
190         dma_ch[channel].chan_status = DMA_CHANNEL_FREE;
191         mutex_unlock(&(dma_ch[channel].dmalock));
192
193         pr_debug("freedma() : END \n");
194 }
195 EXPORT_SYMBOL(free_dma);
196
197 void dma_enable_irq(unsigned int channel)
198 {
199         pr_debug("dma_enable_irq() : BEGIN \n");
200         enable_irq(dma_ch[channel].irq);
201 }
202 EXPORT_SYMBOL(dma_enable_irq);
203
204 void dma_disable_irq(unsigned int channel)
205 {
206         pr_debug("dma_disable_irq() : BEGIN \n");
207         disable_irq(dma_ch[channel].irq);
208 }
209 EXPORT_SYMBOL(dma_disable_irq);
210
211 int dma_channel_active(unsigned int channel)
212 {
213         if (dma_ch[channel].chan_status == DMA_CHANNEL_FREE) {
214                 return 0;
215         } else {
216                 return 1;
217         }
218 }
219 EXPORT_SYMBOL(dma_channel_active);
220
221 /*------------------------------------------------------------------------------
222 *       stop the specific DMA channel.
223 *-----------------------------------------------------------------------------*/
224 void disable_dma(unsigned int channel)
225 {
226         pr_debug("stop_dma() : BEGIN \n");
227         dma_ch[channel].regs->cfg &= ~DMAEN;    /* Clean the enable bit */
228         SSYNC();
229         dma_ch[channel].chan_status = DMA_CHANNEL_REQUESTED;
230         /* Needs to be enabled Later */
231         pr_debug("stop_dma() : END \n");
232         return;
233 }
234 EXPORT_SYMBOL(disable_dma);
235
236 void enable_dma(unsigned int channel)
237 {
238         pr_debug("enable_dma() : BEGIN \n");
239         dma_ch[channel].chan_status = DMA_CHANNEL_ENABLED;
240         dma_ch[channel].regs->curr_x_count = 0;
241         dma_ch[channel].regs->curr_y_count = 0;
242
243         dma_ch[channel].regs->cfg |= DMAEN;     /* Set the enable bit */
244         pr_debug("enable_dma() : END \n");
245         return;
246 }
247 EXPORT_SYMBOL(enable_dma);
248
249 /*------------------------------------------------------------------------------
250 *               Set the Start Address register for the specific DMA channel
251 *               This function can be used for register based DMA,
252 *               to setup the start address
253 *               addr:           Starting address of the DMA Data to be transferred.
254 *-----------------------------------------------------------------------------*/
255 void set_dma_start_addr(unsigned int channel, unsigned long addr)
256 {
257         pr_debug("set_dma_start_addr() : BEGIN \n");
258         dma_ch[channel].regs->start_addr = addr;
259         pr_debug("set_dma_start_addr() : END\n");
260 }
261 EXPORT_SYMBOL(set_dma_start_addr);
262
263 void set_dma_next_desc_addr(unsigned int channel, unsigned long addr)
264 {
265         pr_debug("set_dma_next_desc_addr() : BEGIN \n");
266         dma_ch[channel].regs->next_desc_ptr = addr;
267         pr_debug("set_dma_next_desc_addr() : END\n");
268 }
269 EXPORT_SYMBOL(set_dma_next_desc_addr);
270
271 void set_dma_curr_desc_addr(unsigned int channel, unsigned long addr)
272 {
273         pr_debug("set_dma_curr_desc_addr() : BEGIN \n");
274         dma_ch[channel].regs->curr_desc_ptr = addr;
275         pr_debug("set_dma_curr_desc_addr() : END\n");
276 }
277 EXPORT_SYMBOL(set_dma_curr_desc_addr);
278
279 void set_dma_x_count(unsigned int channel, unsigned short x_count)
280 {
281         dma_ch[channel].regs->x_count = x_count;
282 }
283 EXPORT_SYMBOL(set_dma_x_count);
284
285 void set_dma_y_count(unsigned int channel, unsigned short y_count)
286 {
287         dma_ch[channel].regs->y_count = y_count;
288 }
289 EXPORT_SYMBOL(set_dma_y_count);
290
291 void set_dma_x_modify(unsigned int channel, short x_modify)
292 {
293         dma_ch[channel].regs->x_modify = x_modify;
294 }
295 EXPORT_SYMBOL(set_dma_x_modify);
296
297 void set_dma_y_modify(unsigned int channel, short y_modify)
298 {
299         dma_ch[channel].regs->y_modify = y_modify;
300 }
301 EXPORT_SYMBOL(set_dma_y_modify);
302
303 void set_dma_config(unsigned int channel, unsigned short config)
304 {
305         dma_ch[channel].regs->cfg = config;
306 }
307 EXPORT_SYMBOL(set_dma_config);
308
309 unsigned short
310 set_bfin_dma_config(char direction, char flow_mode,
311                     char intr_mode, char dma_mode, char width, char syncmode)
312 {
313         unsigned short config;
314
315         config =
316             ((direction << 1) | (width << 2) | (dma_mode << 4) |
317              (intr_mode << 6) | (flow_mode << 12) | (syncmode << 5));
318         return config;
319 }
320 EXPORT_SYMBOL(set_bfin_dma_config);
321
322 void set_dma_sg(unsigned int channel, struct dmasg *sg, int nr_sg)
323 {
324         dma_ch[channel].regs->cfg |= ((nr_sg & 0x0F) << 8);
325         dma_ch[channel].regs->next_desc_ptr = (unsigned int)sg;
326 }
327 EXPORT_SYMBOL(set_dma_sg);
328
329 void set_dma_curr_addr(unsigned int channel, unsigned long addr)
330 {
331         dma_ch[channel].regs->curr_addr_ptr = addr;
332 }
333 EXPORT_SYMBOL(set_dma_curr_addr);
334
335 /*------------------------------------------------------------------------------
336  *      Get the DMA status of a specific DMA channel from the system.
337  *-----------------------------------------------------------------------------*/
338 unsigned short get_dma_curr_irqstat(unsigned int channel)
339 {
340         return dma_ch[channel].regs->irq_status;
341 }
342 EXPORT_SYMBOL(get_dma_curr_irqstat);
343
344 /*------------------------------------------------------------------------------
345  *      Clear the DMA_DONE bit in DMA status. Stop the DMA completion interrupt.
346  *-----------------------------------------------------------------------------*/
347 void clear_dma_irqstat(unsigned int channel)
348 {
349         dma_ch[channel].regs->irq_status |= 3;
350 }
351 EXPORT_SYMBOL(clear_dma_irqstat);
352
353 /*------------------------------------------------------------------------------
354  *      Get current DMA xcount of a specific DMA channel from the system.
355  *-----------------------------------------------------------------------------*/
356 unsigned short get_dma_curr_xcount(unsigned int channel)
357 {
358         return dma_ch[channel].regs->curr_x_count;
359 }
360 EXPORT_SYMBOL(get_dma_curr_xcount);
361
362 /*------------------------------------------------------------------------------
363  *      Get current DMA ycount of a specific DMA channel from the system.
364  *-----------------------------------------------------------------------------*/
365 unsigned short get_dma_curr_ycount(unsigned int channel)
366 {
367         return dma_ch[channel].regs->curr_y_count;
368 }
369 EXPORT_SYMBOL(get_dma_curr_ycount);
370
371 unsigned long get_dma_next_desc_ptr(unsigned int channel)
372 {
373         return dma_ch[channel].regs->next_desc_ptr;
374 }
375 EXPORT_SYMBOL(get_dma_next_desc_ptr);
376
377 unsigned long get_dma_curr_desc_ptr(unsigned int channel)
378 {
379         return dma_ch[channel].regs->curr_desc_ptr;
380 }
381 EXPORT_SYMBOL(get_dma_curr_desc_ptr);
382
383 unsigned long get_dma_curr_addr(unsigned int channel)
384 {
385         return dma_ch[channel].regs->curr_addr_ptr;
386 }
387 EXPORT_SYMBOL(get_dma_curr_addr);
388
389 #ifdef CONFIG_PM
390 # ifndef MAX_DMA_SUSPEND_CHANNELS
391 #  define MAX_DMA_SUSPEND_CHANNELS MAX_DMA_CHANNELS
392 # endif
393 int blackfin_dma_suspend(void)
394 {
395         int i;
396
397         for (i = 0; i < MAX_DMA_SUSPEND_CHANNELS; ++i) {
398                 if (dma_ch[i].chan_status == DMA_CHANNEL_ENABLED) {
399                         printk(KERN_ERR "DMA Channel %d failed to suspend\n", i);
400                         return -EBUSY;
401                 }
402
403                 dma_ch[i].saved_peripheral_map = dma_ch[i].regs->peripheral_map;
404         }
405
406         return 0;
407 }
408
409 void blackfin_dma_resume(void)
410 {
411         int i;
412         for (i = 0; i < MAX_DMA_SUSPEND_CHANNELS; ++i)
413                 dma_ch[i].regs->peripheral_map = dma_ch[i].saved_peripheral_map;
414 }
415 #endif
416
417 /**
418  *      blackfin_dma_early_init - minimal DMA init
419  *
420  * Setup a few DMA registers so we can safely do DMA transfers early on in
421  * the kernel booting process.  Really this just means using dma_memcpy().
422  */
423 void __init blackfin_dma_early_init(void)
424 {
425         bfin_write_MDMA_S0_CONFIG(0);
426 }
427
428 /**
429  *      __dma_memcpy - program the MDMA registers
430  *
431  * Actually program MDMA0 and wait for the transfer to finish.  Disable IRQs
432  * while programming registers so that everything is fully configured.  Wait
433  * for DMA to finish with IRQs enabled.  If interrupted, the initial DMA_DONE
434  * check will make sure we don't clobber any existing transfer.
435  */
436 static void __dma_memcpy(u32 daddr, s16 dmod, u32 saddr, s16 smod, size_t cnt, u32 conf)
437 {
438         static DEFINE_SPINLOCK(mdma_lock);
439         unsigned long flags;
440
441         spin_lock_irqsave(&mdma_lock, flags);
442
443         if (bfin_read_MDMA_S0_CONFIG())
444                 while (!(bfin_read_MDMA_D0_IRQ_STATUS() & DMA_DONE))
445                         continue;
446
447         if (conf & DMA2D) {
448                 /* For larger bit sizes, we've already divided down cnt so it
449                  * is no longer a multiple of 64k.  So we have to break down
450                  * the limit here so it is a multiple of the incoming size.
451                  * There is no limitation here in terms of total size other
452                  * than the hardware though as the bits lost in the shift are
453                  * made up by MODIFY (== we can hit the whole address space).
454                  * X: (2^(16 - 0)) * 1 == (2^(16 - 1)) * 2 == (2^(16 - 2)) * 4
455                  */
456                 u32 shift = abs(dmod) >> 1;
457                 size_t ycnt = cnt >> (16 - shift);
458                 cnt = 1 << (16 - shift);
459                 bfin_write_MDMA_D0_Y_COUNT(ycnt);
460                 bfin_write_MDMA_S0_Y_COUNT(ycnt);
461                 bfin_write_MDMA_D0_Y_MODIFY(dmod);
462                 bfin_write_MDMA_S0_Y_MODIFY(smod);
463         }
464
465         bfin_write_MDMA_D0_START_ADDR(daddr);
466         bfin_write_MDMA_D0_X_COUNT(cnt);
467         bfin_write_MDMA_D0_X_MODIFY(dmod);
468         bfin_write_MDMA_D0_IRQ_STATUS(DMA_DONE | DMA_ERR);
469
470         bfin_write_MDMA_S0_START_ADDR(saddr);
471         bfin_write_MDMA_S0_X_COUNT(cnt);
472         bfin_write_MDMA_S0_X_MODIFY(smod);
473         bfin_write_MDMA_S0_IRQ_STATUS(DMA_DONE | DMA_ERR);
474
475         bfin_write_MDMA_S0_CONFIG(DMAEN | conf);
476         bfin_write_MDMA_D0_CONFIG(WNR | DI_EN | DMAEN | conf);
477
478         spin_unlock_irqrestore(&mdma_lock, flags);
479
480         SSYNC();
481
482         while (!(bfin_read_MDMA_D0_IRQ_STATUS() & DMA_DONE))
483                 if (bfin_read_MDMA_S0_CONFIG())
484                         continue;
485                 else
486                         return;
487
488         bfin_write_MDMA_D0_IRQ_STATUS(DMA_DONE | DMA_ERR);
489
490         bfin_write_MDMA_S0_CONFIG(0);
491         bfin_write_MDMA_D0_CONFIG(0);
492 }
493
494 /**
495  *      _dma_memcpy - translate C memcpy settings into MDMA settings
496  *
497  * Handle all the high level steps before we touch the MDMA registers.  So
498  * handle caching, tweaking of sizes, and formatting of addresses.
499  */
500 static void *_dma_memcpy(void *pdst, const void *psrc, size_t size)
501 {
502         u32 conf, shift;
503         s16 mod;
504         unsigned long dst = (unsigned long)pdst;
505         unsigned long src = (unsigned long)psrc;
506
507         if (size == 0)
508                 return NULL;
509
510         if (bfin_addr_dcachable(src))
511                 blackfin_dcache_flush_range(src, src + size);
512
513         if (bfin_addr_dcachable(dst))
514                 blackfin_dcache_invalidate_range(dst, dst + size);
515
516         if (dst % 4 == 0 && src % 4 == 0 && size % 4 == 0) {
517                 conf = WDSIZE_32;
518                 shift = 2;
519         } else if (dst % 2 == 0 && src % 2 == 0 && size % 2 == 0) {
520                 conf = WDSIZE_16;
521                 shift = 1;
522         } else {
523                 conf = WDSIZE_8;
524                 shift = 0;
525         }
526
527         /* If the two memory regions have a chance of overlapping, make
528          * sure the memcpy still works as expected.  Do this by having the
529          * copy run backwards instead.
530          */
531         mod = 1 << shift;
532         if (src < dst) {
533                 mod *= -1;
534                 dst += size + mod;
535                 src += size + mod;
536         }
537         size >>= shift;
538
539         if (size > 0x10000)
540                 conf |= DMA2D;
541
542         __dma_memcpy(dst, mod, src, mod, size, conf);
543
544         return pdst;
545 }
546
547 /**
548  *      dma_memcpy - DMA memcpy under mutex lock
549  *
550  * Do not check arguments before starting the DMA memcpy.  Break the transfer
551  * up into two pieces.  The first transfer is in multiples of 64k and the
552  * second transfer is the piece smaller than 64k.
553  */
554 void *dma_memcpy(void *dst, const void *src, size_t size)
555 {
556         size_t bulk, rest;
557         bulk = size & ~0xffff;
558         rest = size - bulk;
559         if (bulk)
560                 _dma_memcpy(dst, src, bulk);
561         _dma_memcpy(dst + bulk, src + bulk, rest);
562         return dst;
563 }
564 EXPORT_SYMBOL(dma_memcpy);
565
566 /**
567  *      safe_dma_memcpy - DMA memcpy w/argument checking
568  *
569  * Verify arguments are safe before heading to dma_memcpy().
570  */
571 void *safe_dma_memcpy(void *dst, const void *src, size_t size)
572 {
573         if (!access_ok(VERIFY_WRITE, dst, size))
574                 return NULL;
575         if (!access_ok(VERIFY_READ, src, size))
576                 return NULL;
577         return dma_memcpy(dst, src, size);
578 }
579 EXPORT_SYMBOL(safe_dma_memcpy);
580
581 static void _dma_out(unsigned long addr, unsigned long buf, unsigned short len,
582                      u16 size, u16 dma_size)
583 {
584         blackfin_dcache_flush_range(buf, buf + len * size);
585         __dma_memcpy(addr, 0, buf, size, len, dma_size);
586 }
587
588 static void _dma_in(unsigned long addr, unsigned long buf, unsigned short len,
589                     u16 size, u16 dma_size)
590 {
591         blackfin_dcache_invalidate_range(buf, buf + len * size);
592         __dma_memcpy(buf, size, addr, 0, len, dma_size);
593 }
594
595 #define MAKE_DMA_IO(io, bwl, isize, dmasize, cnst) \
596 void dma_##io##s##bwl(unsigned long addr, cnst void *buf, unsigned short len) \
597 { \
598         _dma_##io(addr, (unsigned long)buf, len, isize, WDSIZE_##dmasize); \
599 } \
600 EXPORT_SYMBOL(dma_##io##s##bwl)
601 MAKE_DMA_IO(out, b, 1,  8, const);
602 MAKE_DMA_IO(in,  b, 1,  8, );
603 MAKE_DMA_IO(out, w, 2, 16, const);
604 MAKE_DMA_IO(in,  w, 2, 16, );
605 MAKE_DMA_IO(out, l, 4, 32, const);
606 MAKE_DMA_IO(in,  l, 4, 32, );