aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTony Lindgren <tony@atomide.com>2008-07-03 05:24:37 -0400
committerTony Lindgren <tony@atomide.com>2008-07-03 05:24:37 -0400
commit97b7f715589fb997e430c6aa824abbd9fd5ed42d (patch)
treed5e7d0b71875f487328cc1c1ddf0b9ae336ab724
parent0499bdeb1dec30325aa282a83f9374fa849aa01c (diff)
ARM: OMAP: DMA: Clean-up code
DMA clean-up, mostly checkpatch.pl fixes. Signed-off-by: Tony Lindgren <tony@atomide.com>
-rw-r--r--arch/arm/plat-omap/dma.c255
-rw-r--r--include/asm-arm/arch-omap/dma.h161
2 files changed, 235 insertions, 181 deletions
diff --git a/arch/arm/plat-omap/dma.c b/arch/arm/plat-omap/dma.c
index 18e757a9ec6b..fac8e994f588 100644
--- a/arch/arm/plat-omap/dma.c
+++ b/arch/arm/plat-omap/dma.c
@@ -1,7 +1,7 @@
1/* 1/*
2 * linux/arch/arm/plat-omap/dma.c 2 * linux/arch/arm/plat-omap/dma.c
3 * 3 *
4 * Copyright (C) 2003 Nokia Corporation 4 * Copyright (C) 2003 - 2008 Nokia Corporation
5 * Author: Juha Yrjölä <juha.yrjola@nokia.com> 5 * Author: Juha Yrjölä <juha.yrjola@nokia.com>
6 * DMA channel linking for 1610 by Samuel Ortiz <samuel.ortiz@nokia.com> 6 * DMA channel linking for 1610 by Samuel Ortiz <samuel.ortiz@nokia.com>
7 * Graphics DMA and LCD DMA graphics tranformations 7 * Graphics DMA and LCD DMA graphics tranformations
@@ -25,11 +25,11 @@
25#include <linux/errno.h> 25#include <linux/errno.h>
26#include <linux/interrupt.h> 26#include <linux/interrupt.h>
27#include <linux/irq.h> 27#include <linux/irq.h>
28#include <linux/io.h>
28 29
29#include <asm/system.h> 30#include <asm/system.h>
30#include <asm/hardware.h> 31#include <asm/hardware.h>
31#include <asm/dma.h> 32#include <asm/dma.h>
32#include <asm/io.h>
33 33
34#include <asm/arch/tc.h> 34#include <asm/arch/tc.h>
35 35
@@ -43,13 +43,13 @@ enum { DMA_CH_ALLOC_DONE, DMA_CH_PARAMS_SET_DONE, DMA_CH_STARTED,
43enum { DMA_CHAIN_STARTED, DMA_CHAIN_NOTSTARTED }; 43enum { DMA_CHAIN_STARTED, DMA_CHAIN_NOTSTARTED };
44#endif 44#endif
45 45
46#define OMAP_DMA_ACTIVE 0x01 46#define OMAP_DMA_ACTIVE 0x01
47#define OMAP_DMA_CCR_EN (1 << 7) 47#define OMAP_DMA_CCR_EN (1 << 7)
48#define OMAP2_DMA_CSR_CLEAR_MASK 0xffe 48#define OMAP2_DMA_CSR_CLEAR_MASK 0xffe
49 49
50#define OMAP_FUNC_MUX_ARM_BASE (0xfffe1000 + 0xec) 50#define OMAP_FUNC_MUX_ARM_BASE (0xfffe1000 + 0xec)
51 51
52static int enable_1510_mode = 0; 52static int enable_1510_mode;
53 53
54struct omap_dma_lch { 54struct omap_dma_lch {
55 int next_lch; 55 int next_lch;
@@ -57,7 +57,7 @@ struct omap_dma_lch {
57 u16 saved_csr; 57 u16 saved_csr;
58 u16 enabled_irqs; 58 u16 enabled_irqs;
59 const char *dev_name; 59 const char *dev_name;
60 void (* callback)(int lch, u16 ch_status, void *data); 60 void (*callback)(int lch, u16 ch_status, void *data);
61 void *data; 61 void *data;
62 62
63#ifndef CONFIG_ARCH_OMAP1 63#ifndef CONFIG_ARCH_OMAP1
@@ -245,6 +245,7 @@ void omap_set_dma_priority(int lch, int dst_port, int priority)
245 dma_write(ccr, CCR(lch)); 245 dma_write(ccr, CCR(lch));
246 } 246 }
247} 247}
248EXPORT_SYMBOL(omap_set_dma_priority);
248 249
249void omap_set_dma_transfer_params(int lch, int data_type, int elem_count, 250void omap_set_dma_transfer_params(int lch, int data_type, int elem_count,
250 int frame_count, int sync_mode, 251 int frame_count, int sync_mode,
@@ -307,6 +308,7 @@ void omap_set_dma_transfer_params(int lch, int data_type, int elem_count,
307 dma_write(elem_count, CEN(lch)); 308 dma_write(elem_count, CEN(lch));
308 dma_write(frame_count, CFN(lch)); 309 dma_write(frame_count, CFN(lch));
309} 310}
311EXPORT_SYMBOL(omap_set_dma_transfer_params);
310 312
311void omap_set_dma_color_mode(int lch, enum omap_dma_color_mode mode, u32 color) 313void omap_set_dma_color_mode(int lch, enum omap_dma_color_mode mode, u32 color)
312{ 314{
@@ -346,6 +348,7 @@ void omap_set_dma_color_mode(int lch, enum omap_dma_color_mode mode, u32 color)
346 } 348 }
347 dma_write(w, LCH_CTRL(lch)); 349 dma_write(w, LCH_CTRL(lch));
348} 350}
351EXPORT_SYMBOL(omap_set_dma_color_mode);
349 352
350void omap_set_dma_write_mode(int lch, enum omap_dma_write_mode mode) 353void omap_set_dma_write_mode(int lch, enum omap_dma_write_mode mode)
351{ 354{
@@ -358,6 +361,7 @@ void omap_set_dma_write_mode(int lch, enum omap_dma_write_mode mode)
358 dma_write(csdp, CSDP(lch)); 361 dma_write(csdp, CSDP(lch));
359 } 362 }
360} 363}
364EXPORT_SYMBOL(omap_set_dma_write_mode);
361 365
362void omap_set_dma_channel_mode(int lch, enum omap_dma_channel_mode mode) 366void omap_set_dma_channel_mode(int lch, enum omap_dma_channel_mode mode)
363{ 367{
@@ -377,6 +381,8 @@ void omap_set_dma_src_params(int lch, int src_port, int src_amode,
377 unsigned long src_start, 381 unsigned long src_start,
378 int src_ei, int src_fi) 382 int src_ei, int src_fi)
379{ 383{
384 u32 l;
385
380 if (cpu_class_is_omap1()) { 386 if (cpu_class_is_omap1()) {
381 u16 w; 387 u16 w;
382 388
@@ -384,34 +390,27 @@ void omap_set_dma_src_params(int lch, int src_port, int src_amode,
384 w &= ~(0x1f << 2); 390 w &= ~(0x1f << 2);
385 w |= src_port << 2; 391 w |= src_port << 2;
386 dma_write(w, CSDP(lch)); 392 dma_write(w, CSDP(lch));
393 }
387 394
388 w = dma_read(CCR(lch)); 395 l = dma_read(CCR(lch));
389 w &= ~(0x03 << 12); 396 l &= ~(0x03 << 12);
390 w |= src_amode << 12; 397 l |= src_amode << 12;
391 dma_write(w, CCR(lch)); 398 dma_write(l, CCR(lch));
392 399
400 if (cpu_class_is_omap1()) {
393 dma_write(src_start >> 16, CSSA_U(lch)); 401 dma_write(src_start >> 16, CSSA_U(lch));
394 dma_write((u16)src_start, CSSA_L(lch)); 402 dma_write((u16)src_start, CSSA_L(lch));
395
396 dma_write(src_ei, CSEI(lch));
397 dma_write(src_fi, CSFI(lch));
398 } 403 }
399 404
400 if (cpu_class_is_omap2()) { 405 if (cpu_class_is_omap2())
401 u32 l;
402
403 l = dma_read(CCR(lch));
404 l &= ~(0x03 << 12);
405 l |= src_amode << 12;
406 dma_write(l, CCR(lch));
407
408 dma_write(src_start, CSSA(lch)); 406 dma_write(src_start, CSSA(lch));
409 dma_write(src_ei, CSEI(lch)); 407
410 dma_write(src_fi, CSFI(lch)); 408 dma_write(src_ei, CSEI(lch));
411 } 409 dma_write(src_fi, CSFI(lch));
412} 410}
411EXPORT_SYMBOL(omap_set_dma_src_params);
413 412
414void omap_set_dma_params(int lch, struct omap_dma_channel_params * params) 413void omap_set_dma_params(int lch, struct omap_dma_channel_params *params)
415{ 414{
416 omap_set_dma_transfer_params(lch, params->data_type, 415 omap_set_dma_transfer_params(lch, params->data_type,
417 params->elem_count, params->frame_count, 416 params->elem_count, params->frame_count,
@@ -428,16 +427,17 @@ void omap_set_dma_params(int lch, struct omap_dma_channel_params * params)
428 omap_dma_set_prio_lch(lch, params->read_prio, 427 omap_dma_set_prio_lch(lch, params->read_prio,
429 params->write_prio); 428 params->write_prio);
430} 429}
430EXPORT_SYMBOL(omap_set_dma_params);
431 431
432void omap_set_dma_src_index(int lch, int eidx, int fidx) 432void omap_set_dma_src_index(int lch, int eidx, int fidx)
433{ 433{
434 if (cpu_class_is_omap2()) { 434 if (cpu_class_is_omap2())
435 REVISIT_24XX();
436 return; 435 return;
437 } 436
438 dma_write(eidx, CSEI(lch)); 437 dma_write(eidx, CSEI(lch));
439 dma_write(fidx, CSFI(lch)); 438 dma_write(fidx, CSFI(lch));
440} 439}
440EXPORT_SYMBOL(omap_set_dma_src_index);
441 441
442void omap_set_dma_src_data_pack(int lch, int enable) 442void omap_set_dma_src_data_pack(int lch, int enable)
443{ 443{
@@ -449,6 +449,7 @@ void omap_set_dma_src_data_pack(int lch, int enable)
449 l |= (1 << 6); 449 l |= (1 << 6);
450 dma_write(l, CSDP(lch)); 450 dma_write(l, CSDP(lch));
451} 451}
452EXPORT_SYMBOL(omap_set_dma_src_data_pack);
452 453
453void omap_set_dma_src_burst_mode(int lch, enum omap_dma_burst_mode burst_mode) 454void omap_set_dma_src_burst_mode(int lch, enum omap_dma_burst_mode burst_mode)
454{ 455{
@@ -491,6 +492,7 @@ void omap_set_dma_src_burst_mode(int lch, enum omap_dma_burst_mode burst_mode)
491 l |= (burst << 7); 492 l |= (burst << 7);
492 dma_write(l, CSDP(lch)); 493 dma_write(l, CSDP(lch));
493} 494}
495EXPORT_SYMBOL(omap_set_dma_src_burst_mode);
494 496
495/* Note that dest_port is only for OMAP1 */ 497/* Note that dest_port is only for OMAP1 */
496void omap_set_dma_dest_params(int lch, int dest_port, int dest_amode, 498void omap_set_dma_dest_params(int lch, int dest_port, int dest_amode,
@@ -522,16 +524,17 @@ void omap_set_dma_dest_params(int lch, int dest_port, int dest_amode,
522 dma_write(dst_ei, CDEI(lch)); 524 dma_write(dst_ei, CDEI(lch));
523 dma_write(dst_fi, CDFI(lch)); 525 dma_write(dst_fi, CDFI(lch));
524} 526}
527EXPORT_SYMBOL(omap_set_dma_dest_params);
525 528
526void omap_set_dma_dest_index(int lch, int eidx, int fidx) 529void omap_set_dma_dest_index(int lch, int eidx, int fidx)
527{ 530{
528 if (cpu_class_is_omap2()) { 531 if (cpu_class_is_omap2())
529 REVISIT_24XX();
530 return; 532 return;
531 } 533
532 dma_write(eidx, CDEI(lch)); 534 dma_write(eidx, CDEI(lch));
533 dma_write(fidx, CDFI(lch)); 535 dma_write(fidx, CDFI(lch));
534} 536}
537EXPORT_SYMBOL(omap_set_dma_dest_index);
535 538
536void omap_set_dma_dest_data_pack(int lch, int enable) 539void omap_set_dma_dest_data_pack(int lch, int enable)
537{ 540{
@@ -543,6 +546,7 @@ void omap_set_dma_dest_data_pack(int lch, int enable)
543 l |= 1 << 13; 546 l |= 1 << 13;
544 dma_write(l, CSDP(lch)); 547 dma_write(l, CSDP(lch));
545} 548}
549EXPORT_SYMBOL(omap_set_dma_dest_data_pack);
546 550
547void omap_set_dma_dest_burst_mode(int lch, enum omap_dma_burst_mode burst_mode) 551void omap_set_dma_dest_burst_mode(int lch, enum omap_dma_burst_mode burst_mode)
548{ 552{
@@ -583,6 +587,7 @@ void omap_set_dma_dest_burst_mode(int lch, enum omap_dma_burst_mode burst_mode)
583 l |= (burst << 14); 587 l |= (burst << 14);
584 dma_write(l, CSDP(lch)); 588 dma_write(l, CSDP(lch));
585} 589}
590EXPORT_SYMBOL(omap_set_dma_dest_burst_mode);
586 591
587static inline void omap_enable_channel_irq(int lch) 592static inline void omap_enable_channel_irq(int lch)
588{ 593{
@@ -608,11 +613,13 @@ void omap_enable_dma_irq(int lch, u16 bits)
608{ 613{
609 dma_chan[lch].enabled_irqs |= bits; 614 dma_chan[lch].enabled_irqs |= bits;
610} 615}
616EXPORT_SYMBOL(omap_enable_dma_irq);
611 617
612void omap_disable_dma_irq(int lch, u16 bits) 618void omap_disable_dma_irq(int lch, u16 bits)
613{ 619{
614 dma_chan[lch].enabled_irqs &= ~bits; 620 dma_chan[lch].enabled_irqs &= ~bits;
615} 621}
622EXPORT_SYMBOL(omap_disable_dma_irq);
616 623
617static inline void enable_lnk(int lch) 624static inline void enable_lnk(int lch)
618{ 625{
@@ -628,8 +635,9 @@ static inline void enable_lnk(int lch)
628 l = dma_chan[lch].next_lch | (1 << 15); 635 l = dma_chan[lch].next_lch | (1 << 15);
629 636
630#ifndef CONFIG_ARCH_OMAP1 637#ifndef CONFIG_ARCH_OMAP1
631 if (dma_chan[lch].next_linked_ch != -1) 638 if (cpu_class_is_omap2())
632 l = dma_chan[lch].next_linked_ch | (1 << 15); 639 if (dma_chan[lch].next_linked_ch != -1)
640 l = dma_chan[lch].next_linked_ch | (1 << 15);
633#endif 641#endif
634 642
635 dma_write(l, CLNK_CTRL(lch)); 643 dma_write(l, CLNK_CTRL(lch));
@@ -671,7 +679,7 @@ static inline void omap2_enable_irq_lch(int lch)
671} 679}
672 680
673int omap_request_dma(int dev_id, const char *dev_name, 681int omap_request_dma(int dev_id, const char *dev_name,
674 void (* callback)(int lch, u16 ch_status, void *data), 682 void (*callback)(int lch, u16 ch_status, void *data),
675 void *data, int *dma_ch_out) 683 void *data, int *dma_ch_out)
676{ 684{
677 int ch, free_ch = -1; 685 int ch, free_ch = -1;
@@ -704,10 +712,14 @@ int omap_request_dma(int dev_id, const char *dev_name,
704 chan->dev_name = dev_name; 712 chan->dev_name = dev_name;
705 chan->callback = callback; 713 chan->callback = callback;
706 chan->data = data; 714 chan->data = data;
715
707#ifndef CONFIG_ARCH_OMAP1 716#ifndef CONFIG_ARCH_OMAP1
708 chan->chain_id = -1; 717 if (cpu_class_is_omap2()) {
709 chan->next_linked_ch = -1; 718 chan->chain_id = -1;
719 chan->next_linked_ch = -1;
720 }
710#endif 721#endif
722
711 chan->enabled_irqs = OMAP_DMA_DROP_IRQ | OMAP_DMA_BLOCK_IRQ; 723 chan->enabled_irqs = OMAP_DMA_DROP_IRQ | OMAP_DMA_BLOCK_IRQ;
712 724
713 if (cpu_class_is_omap1()) 725 if (cpu_class_is_omap1())
@@ -722,8 +734,10 @@ int omap_request_dma(int dev_id, const char *dev_name,
722 set_gdma_dev(free_ch + 1, dev_id); 734 set_gdma_dev(free_ch + 1, dev_id);
723 dev_id = free_ch + 1; 735 dev_id = free_ch + 1;
724 } 736 }
725 /* Disable the 1510 compatibility mode and set the sync device 737 /*
726 * id. */ 738 * Disable the 1510 compatibility mode and set the sync device
739 * id.
740 */
727 dma_write(dev_id | (1 << 10), CCR(free_ch)); 741 dma_write(dev_id | (1 << 10), CCR(free_ch));
728 } else if (cpu_is_omap730() || cpu_is_omap15xx()) { 742 } else if (cpu_is_omap730() || cpu_is_omap15xx()) {
729 dma_write(dev_id, CCR(free_ch)); 743 dma_write(dev_id, CCR(free_ch));
@@ -731,7 +745,6 @@ int omap_request_dma(int dev_id, const char *dev_name,
731 745
732 if (cpu_class_is_omap2()) { 746 if (cpu_class_is_omap2()) {
733 omap2_enable_irq_lch(free_ch); 747 omap2_enable_irq_lch(free_ch);
734
735 omap_enable_channel_irq(free_ch); 748 omap_enable_channel_irq(free_ch);
736 /* Clear the CSR register and IRQ status register */ 749 /* Clear the CSR register and IRQ status register */
737 dma_write(OMAP2_DMA_CSR_CLEAR_MASK, CSR(free_ch)); 750 dma_write(OMAP2_DMA_CSR_CLEAR_MASK, CSR(free_ch));
@@ -742,6 +755,7 @@ int omap_request_dma(int dev_id, const char *dev_name,
742 755
743 return 0; 756 return 0;
744} 757}
758EXPORT_SYMBOL(omap_request_dma);
745 759
746void omap_free_dma(int lch) 760void omap_free_dma(int lch)
747{ 761{
@@ -749,11 +763,12 @@ void omap_free_dma(int lch)
749 763
750 spin_lock_irqsave(&dma_chan_lock, flags); 764 spin_lock_irqsave(&dma_chan_lock, flags);
751 if (dma_chan[lch].dev_id == -1) { 765 if (dma_chan[lch].dev_id == -1) {
752 printk("omap_dma: trying to free nonallocated DMA channel %d\n", 766 pr_err("omap_dma: trying to free unallocated DMA channel %d\n",
753 lch); 767 lch);
754 spin_unlock_irqrestore(&dma_chan_lock, flags); 768 spin_unlock_irqrestore(&dma_chan_lock, flags);
755 return; 769 return;
756 } 770 }
771
757 dma_chan[lch].dev_id = -1; 772 dma_chan[lch].dev_id = -1;
758 dma_chan[lch].next_lch = -1; 773 dma_chan[lch].next_lch = -1;
759 dma_chan[lch].callback = NULL; 774 dma_chan[lch].callback = NULL;
@@ -785,6 +800,7 @@ void omap_free_dma(int lch)
785 omap_clear_dma(lch); 800 omap_clear_dma(lch);
786 } 801 }
787} 802}
803EXPORT_SYMBOL(omap_free_dma);
788 804
789/** 805/**
790 * @brief omap_dma_set_global_params : Set global priority settings for dma 806 * @brief omap_dma_set_global_params : Set global priority settings for dma
@@ -878,6 +894,7 @@ void omap_clear_dma(int lch)
878 894
879 local_irq_restore(flags); 895 local_irq_restore(flags);
880} 896}
897EXPORT_SYMBOL(omap_clear_dma);
881 898
882void omap_start_dma(int lch) 899void omap_start_dma(int lch)
883{ 900{
@@ -916,8 +933,10 @@ void omap_start_dma(int lch)
916 933
917 l = dma_read(CCR(lch)); 934 l = dma_read(CCR(lch));
918 935
919 /* Errata: On ES2.0 BUFFERING disable must be set. 936 /*
920 * This will always fail on ES1.0 */ 937 * Errata: On ES2.0 BUFFERING disable must be set.
938 * This will always fail on ES1.0
939 */
921 if (cpu_is_omap24xx()) 940 if (cpu_is_omap24xx())
922 l |= OMAP_DMA_CCR_EN; 941 l |= OMAP_DMA_CCR_EN;
923 942
@@ -926,6 +945,7 @@ void omap_start_dma(int lch)
926 945
927 dma_chan[lch].flags |= OMAP_DMA_ACTIVE; 946 dma_chan[lch].flags |= OMAP_DMA_ACTIVE;
928} 947}
948EXPORT_SYMBOL(omap_start_dma);
929 949
930void omap_stop_dma(int lch) 950void omap_stop_dma(int lch)
931{ 951{
@@ -962,13 +982,14 @@ void omap_stop_dma(int lch)
962 982
963 dma_chan[lch].flags &= ~OMAP_DMA_ACTIVE; 983 dma_chan[lch].flags &= ~OMAP_DMA_ACTIVE;
964} 984}
985EXPORT_SYMBOL(omap_stop_dma);
965 986
966/* 987/*
967 * Allows changing the DMA callback function or data. This may be needed if 988 * Allows changing the DMA callback function or data. This may be needed if
968 * the driver shares a single DMA channel for multiple dma triggers. 989 * the driver shares a single DMA channel for multiple dma triggers.
969 */ 990 */
970int omap_set_dma_callback(int lch, 991int omap_set_dma_callback(int lch,
971 void (* callback)(int lch, u16 ch_status, void *data), 992 void (*callback)(int lch, u16 ch_status, void *data),
972 void *data) 993 void *data)
973{ 994{
974 unsigned long flags; 995 unsigned long flags;
@@ -988,6 +1009,7 @@ int omap_set_dma_callback(int lch,
988 1009
989 return 0; 1010 return 0;
990} 1011}
1012EXPORT_SYMBOL(omap_set_dma_callback);
991 1013
992/* 1014/*
993 * Returns current physical source address for the given DMA channel. 1015 * Returns current physical source address for the given DMA channel.
@@ -1018,6 +1040,7 @@ dma_addr_t omap_get_dma_src_pos(int lch)
1018 1040
1019 return offset; 1041 return offset;
1020} 1042}
1043EXPORT_SYMBOL(omap_get_dma_src_pos);
1021 1044
1022/* 1045/*
1023 * Returns current physical destination address for the given DMA channel. 1046 * Returns current physical destination address for the given DMA channel.
@@ -1048,16 +1071,7 @@ dma_addr_t omap_get_dma_dst_pos(int lch)
1048 1071
1049 return offset; 1072 return offset;
1050} 1073}
1051 1074EXPORT_SYMBOL(omap_get_dma_dst_pos);
1052/*
1053 * Returns current source transfer counting for the given DMA channel.
1054 * Can be used to monitor the progress of a transfer inside a block.
1055 * It must be called with disabled interrupts.
1056 */
1057int omap_get_dma_src_addr_counter(int lch)
1058{
1059 return (dma_addr_t)dma_read(CSAC(lch));
1060}
1061 1075
1062int omap_get_dma_active_status(int lch) 1076int omap_get_dma_active_status(int lch)
1063{ 1077{
@@ -1086,7 +1100,7 @@ int omap_dma_running(void)
1086 * For this DMA link to start, you still need to start (see omap_start_dma) 1100 * For this DMA link to start, you still need to start (see omap_start_dma)
1087 * the first one. That will fire up the entire queue. 1101 * the first one. That will fire up the entire queue.
1088 */ 1102 */
1089void omap_dma_link_lch (int lch_head, int lch_queue) 1103void omap_dma_link_lch(int lch_head, int lch_queue)
1090{ 1104{
1091 if (omap_dma_in_1510_mode()) { 1105 if (omap_dma_in_1510_mode()) {
1092 printk(KERN_ERR "DMA linking is not supported in 1510 mode\n"); 1106 printk(KERN_ERR "DMA linking is not supported in 1510 mode\n");
@@ -1103,11 +1117,12 @@ void omap_dma_link_lch (int lch_head, int lch_queue)
1103 1117
1104 dma_chan[lch_head].next_lch = lch_queue; 1118 dma_chan[lch_head].next_lch = lch_queue;
1105} 1119}
1120EXPORT_SYMBOL(omap_dma_link_lch);
1106 1121
1107/* 1122/*
1108 * Once the DMA queue is stopped, we can destroy it. 1123 * Once the DMA queue is stopped, we can destroy it.
1109 */ 1124 */
1110void omap_dma_unlink_lch (int lch_head, int lch_queue) 1125void omap_dma_unlink_lch(int lch_head, int lch_queue)
1111{ 1126{
1112 if (omap_dma_in_1510_mode()) { 1127 if (omap_dma_in_1510_mode()) {
1113 printk(KERN_ERR "DMA linking is not supported in 1510 mode\n"); 1128 printk(KERN_ERR "DMA linking is not supported in 1510 mode\n");
@@ -1122,7 +1137,6 @@ void omap_dma_unlink_lch (int lch_head, int lch_queue)
1122 dump_stack(); 1137 dump_stack();
1123 } 1138 }
1124 1139
1125
1126 if ((dma_chan[lch_head].flags & OMAP_DMA_ACTIVE) || 1140 if ((dma_chan[lch_head].flags & OMAP_DMA_ACTIVE) ||
1127 (dma_chan[lch_head].flags & OMAP_DMA_ACTIVE)) { 1141 (dma_chan[lch_head].flags & OMAP_DMA_ACTIVE)) {
1128 printk(KERN_ERR "omap_dma: You need to stop the DMA channels " 1142 printk(KERN_ERR "omap_dma: You need to stop the DMA channels "
@@ -1132,6 +1146,9 @@ void omap_dma_unlink_lch (int lch_head, int lch_queue)
1132 1146
1133 dma_chan[lch_head].next_lch = -1; 1147 dma_chan[lch_head].next_lch = -1;
1134} 1148}
1149EXPORT_SYMBOL(omap_dma_unlink_lch);
1150
1151/*----------------------------------------------------------------------------*/
1135 1152
1136#ifndef CONFIG_ARCH_OMAP1 1153#ifndef CONFIG_ARCH_OMAP1
1137/* Create chain of DMA channesls */ 1154/* Create chain of DMA channesls */
@@ -1255,6 +1272,7 @@ int omap_request_dma_chain(int dev_id, const char *dev_name,
1255 for (i = 0; i < (no_of_chans - 1); i++) 1272 for (i = 0; i < (no_of_chans - 1); i++)
1256 create_dma_lch_chain(channels[i], channels[i + 1]); 1273 create_dma_lch_chain(channels[i], channels[i + 1]);
1257 } 1274 }
1275
1258 return 0; 1276 return 0;
1259} 1277}
1260EXPORT_SYMBOL(omap_request_dma_chain); 1278EXPORT_SYMBOL(omap_request_dma_chain);
@@ -1297,6 +1315,7 @@ int omap_modify_dma_chain_params(int chain_id,
1297 */ 1315 */
1298 omap_set_dma_params(channels[i], &params); 1316 omap_set_dma_params(channels[i], &params);
1299 } 1317 }
1318
1300 return 0; 1319 return 0;
1301} 1320}
1302EXPORT_SYMBOL(omap_modify_dma_chain_params); 1321EXPORT_SYMBOL(omap_modify_dma_chain_params);
@@ -1340,6 +1359,7 @@ int omap_free_dma_chain(int chain_id)
1340 dma_linked_lch[chain_id].linked_dmach_q = NULL; 1359 dma_linked_lch[chain_id].linked_dmach_q = NULL;
1341 dma_linked_lch[chain_id].chain_mode = -1; 1360 dma_linked_lch[chain_id].chain_mode = -1;
1342 dma_linked_lch[chain_id].chain_state = -1; 1361 dma_linked_lch[chain_id].chain_state = -1;
1362
1343 return (0); 1363 return (0);
1344} 1364}
1345EXPORT_SYMBOL(omap_free_dma_chain); 1365EXPORT_SYMBOL(omap_free_dma_chain);
@@ -1370,6 +1390,7 @@ int omap_dma_chain_status(int chain_id)
1370 1390
1371 if (OMAP_DMA_CHAIN_QEMPTY(chain_id)) 1391 if (OMAP_DMA_CHAIN_QEMPTY(chain_id))
1372 return OMAP_DMA_CHAIN_INACTIVE; 1392 return OMAP_DMA_CHAIN_INACTIVE;
1393
1373 return OMAP_DMA_CHAIN_ACTIVE; 1394 return OMAP_DMA_CHAIN_ACTIVE;
1374} 1395}
1375EXPORT_SYMBOL(omap_dma_chain_status); 1396EXPORT_SYMBOL(omap_dma_chain_status);
@@ -1395,8 +1416,10 @@ int omap_dma_chain_a_transfer(int chain_id, int src_start, int dest_start,
1395 u32 l, lch; 1416 u32 l, lch;
1396 int start_dma = 0; 1417 int start_dma = 0;
1397 1418
1398 /* if buffer size is less than 1 then there is 1419 /*
1399 * no use of starting the chain */ 1420 * if buffer size is less than 1 then there is
1421 * no use of starting the chain
1422 */
1400 if (elem_count < 1) { 1423 if (elem_count < 1) {
1401 printk(KERN_ERR "Invalid buffer size\n"); 1424 printk(KERN_ERR "Invalid buffer size\n");
1402 return -EINVAL; 1425 return -EINVAL;
@@ -1441,12 +1464,16 @@ int omap_dma_chain_a_transfer(int chain_id, int src_start, int dest_start,
1441 dma_write(elem_count, CEN(lch)); 1464 dma_write(elem_count, CEN(lch));
1442 dma_write(frame_count, CFN(lch)); 1465 dma_write(frame_count, CFN(lch));
1443 1466
1444 /* If the chain is dynamically linked, 1467 /*
1445 * then we may have to start the chain if its not active */ 1468 * If the chain is dynamically linked,
1469 * then we may have to start the chain if its not active
1470 */
1446 if (dma_linked_lch[chain_id].chain_mode == OMAP_DMA_DYNAMIC_CHAIN) { 1471 if (dma_linked_lch[chain_id].chain_mode == OMAP_DMA_DYNAMIC_CHAIN) {
1447 1472
1448 /* In Dynamic chain, if the chain is not started, 1473 /*
1449 * queue the channel */ 1474 * In Dynamic chain, if the chain is not started,
1475 * queue the channel
1476 */
1450 if (dma_linked_lch[chain_id].chain_state == 1477 if (dma_linked_lch[chain_id].chain_state ==
1451 DMA_CHAIN_NOTSTARTED) { 1478 DMA_CHAIN_NOTSTARTED) {
1452 /* Enable the link in previous channel */ 1479 /* Enable the link in previous channel */
@@ -1456,8 +1483,10 @@ int omap_dma_chain_a_transfer(int chain_id, int src_start, int dest_start,
1456 dma_chan[lch].state = DMA_CH_QUEUED; 1483 dma_chan[lch].state = DMA_CH_QUEUED;
1457 } 1484 }
1458 1485
1459 /* Chain is already started, make sure its active, 1486 /*
1460 * if not then start the chain */ 1487 * Chain is already started, make sure its active,
1488 * if not then start the chain
1489 */
1461 else { 1490 else {
1462 start_dma = 1; 1491 start_dma = 1;
1463 1492
@@ -1504,6 +1533,7 @@ int omap_dma_chain_a_transfer(int chain_id, int src_start, int dest_start,
1504 dma_chan[lch].flags |= OMAP_DMA_ACTIVE; 1533 dma_chan[lch].flags |= OMAP_DMA_ACTIVE;
1505 } 1534 }
1506 } 1535 }
1536
1507 return 0; 1537 return 0;
1508} 1538}
1509EXPORT_SYMBOL(omap_dma_chain_a_transfer); 1539EXPORT_SYMBOL(omap_dma_chain_a_transfer);
@@ -1555,6 +1585,7 @@ int omap_start_dma_chain_transfers(int chain_id)
1555 dma_write(l, CCR(channels[0])); 1585 dma_write(l, CCR(channels[0]));
1556 1586
1557 dma_chan[channels[0]].flags |= OMAP_DMA_ACTIVE; 1587 dma_chan[channels[0]].flags |= OMAP_DMA_ACTIVE;
1588
1558 return 0; 1589 return 0;
1559} 1590}
1560EXPORT_SYMBOL(omap_start_dma_chain_transfers); 1591EXPORT_SYMBOL(omap_start_dma_chain_transfers);
@@ -1586,7 +1617,8 @@ int omap_stop_dma_chain_transfers(int chain_id)
1586 } 1617 }
1587 channels = dma_linked_lch[chain_id].linked_dmach_q; 1618 channels = dma_linked_lch[chain_id].linked_dmach_q;
1588 1619
1589 /* DMA Errata: 1620 /*
1621 * DMA Errata:
1590 * Special programming model needed to disable DMA before end of block 1622 * Special programming model needed to disable DMA before end of block
1591 */ 1623 */
1592 sys_cf = dma_read(OCP_SYSCONFIG); 1624 sys_cf = dma_read(OCP_SYSCONFIG);
@@ -1614,6 +1646,7 @@ int omap_stop_dma_chain_transfers(int chain_id)
1614 1646
1615 /* Errata - put in the old value */ 1647 /* Errata - put in the old value */
1616 dma_write(sys_cf, OCP_SYSCONFIG); 1648 dma_write(sys_cf, OCP_SYSCONFIG);
1649
1617 return 0; 1650 return 0;
1618} 1651}
1619EXPORT_SYMBOL(omap_stop_dma_chain_transfers); 1652EXPORT_SYMBOL(omap_stop_dma_chain_transfers);
@@ -1729,7 +1762,7 @@ int omap_get_dma_chain_src_pos(int chain_id)
1729 return dma_read(CSAC(lch)); 1762 return dma_read(CSAC(lch));
1730} 1763}
1731EXPORT_SYMBOL(omap_get_dma_chain_src_pos); 1764EXPORT_SYMBOL(omap_get_dma_chain_src_pos);
1732#endif 1765#endif /* ifndef CONFIG_ARCH_OMAP1 */
1733 1766
1734/*----------------------------------------------------------------------------*/ 1767/*----------------------------------------------------------------------------*/
1735 1768
@@ -1765,6 +1798,7 @@ static int omap1_dma_handle_ch(int ch)
1765 dma_chan[ch].flags &= ~OMAP_DMA_ACTIVE; 1798 dma_chan[ch].flags &= ~OMAP_DMA_ACTIVE;
1766 if (likely(dma_chan[ch].callback != NULL)) 1799 if (likely(dma_chan[ch].callback != NULL))
1767 dma_chan[ch].callback(ch, csr, dma_chan[ch].data); 1800 dma_chan[ch].callback(ch, csr, dma_chan[ch].data);
1801
1768 return 1; 1802 return 1;
1769} 1803}
1770 1804
@@ -1799,7 +1833,8 @@ static int omap2_dma_handle_ch(int ch)
1799 1833
1800 if (!status) { 1834 if (!status) {
1801 if (printk_ratelimit()) 1835 if (printk_ratelimit())
1802 printk(KERN_WARNING "Spurious DMA IRQ for lch %d\n", ch); 1836 printk(KERN_WARNING "Spurious DMA IRQ for lch %d\n",
1837 ch);
1803 dma_write(1 << ch, IRQSTATUS_L0); 1838 dma_write(1 << ch, IRQSTATUS_L0);
1804 return 0; 1839 return 0;
1805 } 1840 }
@@ -1887,7 +1922,7 @@ static struct irqaction omap24xx_dma_irq;
1887static struct lcd_dma_info { 1922static struct lcd_dma_info {
1888 spinlock_t lock; 1923 spinlock_t lock;
1889 int reserved; 1924 int reserved;
1890 void (* callback)(u16 status, void *data); 1925 void (*callback)(u16 status, void *data);
1891 void *cb_data; 1926 void *cb_data;
1892 1927
1893 int active; 1928 int active;
@@ -1909,6 +1944,7 @@ void omap_set_lcd_dma_b1(unsigned long addr, u16 fb_xres, u16 fb_yres,
1909 lcd_dma.xres = fb_xres; 1944 lcd_dma.xres = fb_xres;
1910 lcd_dma.yres = fb_yres; 1945 lcd_dma.yres = fb_yres;
1911} 1946}
1947EXPORT_SYMBOL(omap_set_lcd_dma_b1);
1912 1948
1913void omap_set_lcd_dma_src_port(int port) 1949void omap_set_lcd_dma_src_port(int port)
1914{ 1950{
@@ -1919,12 +1955,13 @@ void omap_set_lcd_dma_ext_controller(int external)
1919{ 1955{
1920 lcd_dma.ext_ctrl = external; 1956 lcd_dma.ext_ctrl = external;
1921} 1957}
1958EXPORT_SYMBOL(omap_set_lcd_dma_ext_controller);
1922 1959
1923void omap_set_lcd_dma_single_transfer(int single) 1960void omap_set_lcd_dma_single_transfer(int single)
1924{ 1961{
1925 lcd_dma.single_transfer = single; 1962 lcd_dma.single_transfer = single;
1926} 1963}
1927 1964EXPORT_SYMBOL(omap_set_lcd_dma_single_transfer);
1928 1965
1929void omap_set_lcd_dma_b1_rotation(int rotate) 1966void omap_set_lcd_dma_b1_rotation(int rotate)
1930{ 1967{
@@ -1935,6 +1972,7 @@ void omap_set_lcd_dma_b1_rotation(int rotate)
1935 } 1972 }
1936 lcd_dma.rotate = rotate; 1973 lcd_dma.rotate = rotate;
1937} 1974}
1975EXPORT_SYMBOL(omap_set_lcd_dma_b1_rotation);
1938 1976
1939void omap_set_lcd_dma_b1_mirror(int mirror) 1977void omap_set_lcd_dma_b1_mirror(int mirror)
1940{ 1978{
@@ -1944,6 +1982,7 @@ void omap_set_lcd_dma_b1_mirror(int mirror)
1944 } 1982 }
1945 lcd_dma.mirror = mirror; 1983 lcd_dma.mirror = mirror;
1946} 1984}
1985EXPORT_SYMBOL(omap_set_lcd_dma_b1_mirror);
1947 1986
1948void omap_set_lcd_dma_b1_vxres(unsigned long vxres) 1987void omap_set_lcd_dma_b1_vxres(unsigned long vxres)
1949{ 1988{
@@ -1954,6 +1993,7 @@ void omap_set_lcd_dma_b1_vxres(unsigned long vxres)
1954 } 1993 }
1955 lcd_dma.vxres = vxres; 1994 lcd_dma.vxres = vxres;
1956} 1995}
1996EXPORT_SYMBOL(omap_set_lcd_dma_b1_vxres);
1957 1997
1958void omap_set_lcd_dma_b1_scale(unsigned int xscale, unsigned int yscale) 1998void omap_set_lcd_dma_b1_scale(unsigned int xscale, unsigned int yscale)
1959{ 1999{
@@ -1964,6 +2004,7 @@ void omap_set_lcd_dma_b1_scale(unsigned int xscale, unsigned int yscale)
1964 lcd_dma.xscale = xscale; 2004 lcd_dma.xscale = xscale;
1965 lcd_dma.yscale = yscale; 2005 lcd_dma.yscale = yscale;
1966} 2006}
2007EXPORT_SYMBOL(omap_set_lcd_dma_b1_scale);
1967 2008
1968static void set_b1_regs(void) 2009static void set_b1_regs(void)
1969{ 2010{
@@ -1994,8 +2035,11 @@ static void set_b1_regs(void)
1994 xscale = lcd_dma.xscale ? lcd_dma.xscale : 1; 2035 xscale = lcd_dma.xscale ? lcd_dma.xscale : 1;
1995 yscale = lcd_dma.yscale ? lcd_dma.yscale : 1; 2036 yscale = lcd_dma.yscale ? lcd_dma.yscale : 1;
1996 BUG_ON(vxres < lcd_dma.xres); 2037 BUG_ON(vxres < lcd_dma.xres);
1997#define PIXADDR(x,y) (lcd_dma.addr + ((y) * vxres * yscale + (x) * xscale) * es) 2038
2039#define PIXADDR(x, y) (lcd_dma.addr + \
2040 ((y) * vxres * yscale + (x) * xscale) * es)
1998#define PIXSTEP(sx, sy, dx, dy) (PIXADDR(dx, dy) - PIXADDR(sx, sy) - es + 1) 2041#define PIXSTEP(sx, sy, dx, dy) (PIXADDR(dx, dy) - PIXADDR(sx, sy) - es + 1)
2042
1999 switch (lcd_dma.rotate) { 2043 switch (lcd_dma.rotate) {
2000 case 0: 2044 case 0:
2001 if (!lcd_dma.mirror) { 2045 if (!lcd_dma.mirror) {
@@ -2004,8 +2048,8 @@ static void set_b1_regs(void)
2004 /* 1510 DMA requires the bottom address to be 2 more 2048 /* 1510 DMA requires the bottom address to be 2 more
2005 * than the actual last memory access location. */ 2049 * than the actual last memory access location. */
2006 if (omap_dma_in_1510_mode() && 2050 if (omap_dma_in_1510_mode() &&
2007 lcd_dma.data_type == OMAP_DMA_DATA_TYPE_S32) 2051 lcd_dma.data_type == OMAP_DMA_DATA_TYPE_S32)
2008 bottom += 2; 2052 bottom += 2;
2009 ei = PIXSTEP(0, 0, 1, 0); 2053 ei = PIXSTEP(0, 0, 1, 0);
2010 fi = PIXSTEP(lcd_dma.xres - 1, 0, 0, 1); 2054 fi = PIXSTEP(lcd_dma.xres - 1, 0, 0, 1);
2011 } else { 2055 } else {
@@ -2132,7 +2176,7 @@ static irqreturn_t lcd_dma_irq_handler(int irq, void *dev_id)
2132 return IRQ_HANDLED; 2176 return IRQ_HANDLED;
2133} 2177}
2134 2178
2135int omap_request_lcd_dma(void (* callback)(u16 status, void *data), 2179int omap_request_lcd_dma(void (*callback)(u16 status, void *data),
2136 void *data) 2180 void *data)
2137{ 2181{
2138 spin_lock_irq(&lcd_dma.lock); 2182 spin_lock_irq(&lcd_dma.lock);
@@ -2158,6 +2202,7 @@ int omap_request_lcd_dma(void (* callback)(u16 status, void *data),
2158 2202
2159 return 0; 2203 return 0;
2160} 2204}
2205EXPORT_SYMBOL(omap_request_lcd_dma);
2161 2206
2162void omap_free_lcd_dma(void) 2207void omap_free_lcd_dma(void)
2163{ 2208{
@@ -2174,12 +2219,14 @@ void omap_free_lcd_dma(void)
2174 lcd_dma.reserved = 0; 2219 lcd_dma.reserved = 0;
2175 spin_unlock(&lcd_dma.lock); 2220 spin_unlock(&lcd_dma.lock);
2176} 2221}
2222EXPORT_SYMBOL(omap_free_lcd_dma);
2177 2223
2178void omap_enable_lcd_dma(void) 2224void omap_enable_lcd_dma(void)
2179{ 2225{
2180 u16 w; 2226 u16 w;
2181 2227
2182 /* Set the Enable bit only if an external controller is 2228 /*
2229 * Set the Enable bit only if an external controller is
2183 * connected. Otherwise the OMAP internal controller will 2230 * connected. Otherwise the OMAP internal controller will
2184 * start the transfer when it gets enabled. 2231 * start the transfer when it gets enabled.
2185 */ 2232 */
@@ -2196,6 +2243,7 @@ void omap_enable_lcd_dma(void)
2196 w |= 1 << 7; 2243 w |= 1 << 7;
2197 omap_writew(w, OMAP1610_DMA_LCD_CCR); 2244 omap_writew(w, OMAP1610_DMA_LCD_CCR);
2198} 2245}
2246EXPORT_SYMBOL(omap_enable_lcd_dma);
2199 2247
2200void omap_setup_lcd_dma(void) 2248void omap_setup_lcd_dma(void)
2201{ 2249{
@@ -2211,16 +2259,18 @@ void omap_setup_lcd_dma(void)
2211 u16 w; 2259 u16 w;
2212 2260
2213 w = omap_readw(OMAP1610_DMA_LCD_CCR); 2261 w = omap_readw(OMAP1610_DMA_LCD_CCR);
2214 /* If DMA was already active set the end_prog bit to have 2262 /*
2263 * If DMA was already active set the end_prog bit to have
2215 * the programmed register set loaded into the active 2264 * the programmed register set loaded into the active
2216 * register set. 2265 * register set.
2217 */ 2266 */
2218 w |= 1 << 11; /* End_prog */ 2267 w |= 1 << 11; /* End_prog */
2219 if (!lcd_dma.single_transfer) 2268 if (!lcd_dma.single_transfer)
2220 w |= (3 << 8); /* Auto_init, repeat */ 2269 w |= (3 << 8); /* Auto_init, repeat */
2221 omap_writew(w, OMAP1610_DMA_LCD_CCR); 2270 omap_writew(w, OMAP1610_DMA_LCD_CCR);
2222 } 2271 }
2223} 2272}
2273EXPORT_SYMBOL(omap_setup_lcd_dma);
2224 2274
2225void omap_stop_lcd_dma(void) 2275void omap_stop_lcd_dma(void)
2226{ 2276{
@@ -2238,6 +2288,7 @@ void omap_stop_lcd_dma(void)
2238 w &= ~(1 << 8); 2288 w &= ~(1 << 8);
2239 omap_writew(w, OMAP1610_DMA_LCD_CTRL); 2289 omap_writew(w, OMAP1610_DMA_LCD_CTRL);
2240} 2290}
2291EXPORT_SYMBOL(omap_stop_lcd_dma);
2241 2292
2242/*----------------------------------------------------------------------------*/ 2293/*----------------------------------------------------------------------------*/
2243 2294
@@ -2327,8 +2378,10 @@ static int __init omap_init_dma(void)
2327 continue; 2378 continue;
2328 2379
2329 if (cpu_class_is_omap1()) { 2380 if (cpu_class_is_omap1()) {
2330 /* request_irq() doesn't like dev_id (ie. ch) being 2381 /*
2331 * zero, so we have to kludge around this. */ 2382 * request_irq() doesn't like dev_id (ie. ch) being
2383 * zero, so we have to kludge around this.
2384 */
2332 r = request_irq(omap1_dma_irq[ch], 2385 r = request_irq(omap1_dma_irq[ch],
2333 omap1_dma_irq_handler, 0, "DMA", 2386 omap1_dma_irq_handler, 0, "DMA",
2334 (void *) (ch + 1)); 2387 (void *) (ch + 1));
@@ -2373,48 +2426,4 @@ static int __init omap_init_dma(void)
2373 2426
2374arch_initcall(omap_init_dma); 2427arch_initcall(omap_init_dma);
2375 2428
2376EXPORT_SYMBOL(omap_get_dma_src_pos);
2377EXPORT_SYMBOL(omap_get_dma_dst_pos);
2378EXPORT_SYMBOL(omap_get_dma_src_addr_counter);
2379EXPORT_SYMBOL(omap_clear_dma);
2380EXPORT_SYMBOL(omap_set_dma_priority);
2381EXPORT_SYMBOL(omap_request_dma);
2382EXPORT_SYMBOL(omap_free_dma);
2383EXPORT_SYMBOL(omap_start_dma);
2384EXPORT_SYMBOL(omap_stop_dma);
2385EXPORT_SYMBOL(omap_set_dma_callback);
2386EXPORT_SYMBOL(omap_enable_dma_irq);
2387EXPORT_SYMBOL(omap_disable_dma_irq);
2388
2389EXPORT_SYMBOL(omap_set_dma_transfer_params);
2390EXPORT_SYMBOL(omap_set_dma_color_mode);
2391EXPORT_SYMBOL(omap_set_dma_write_mode);
2392
2393EXPORT_SYMBOL(omap_set_dma_src_params);
2394EXPORT_SYMBOL(omap_set_dma_src_index);
2395EXPORT_SYMBOL(omap_set_dma_src_data_pack);
2396EXPORT_SYMBOL(omap_set_dma_src_burst_mode);
2397
2398EXPORT_SYMBOL(omap_set_dma_dest_params);
2399EXPORT_SYMBOL(omap_set_dma_dest_index);
2400EXPORT_SYMBOL(omap_set_dma_dest_data_pack);
2401EXPORT_SYMBOL(omap_set_dma_dest_burst_mode);
2402
2403EXPORT_SYMBOL(omap_set_dma_params);
2404
2405EXPORT_SYMBOL(omap_dma_link_lch);
2406EXPORT_SYMBOL(omap_dma_unlink_lch);
2407
2408EXPORT_SYMBOL(omap_request_lcd_dma);
2409EXPORT_SYMBOL(omap_free_lcd_dma);
2410EXPORT_SYMBOL(omap_enable_lcd_dma);
2411EXPORT_SYMBOL(omap_setup_lcd_dma);
2412EXPORT_SYMBOL(omap_stop_lcd_dma);
2413EXPORT_SYMBOL(omap_set_lcd_dma_b1);
2414EXPORT_SYMBOL(omap_set_lcd_dma_single_transfer);
2415EXPORT_SYMBOL(omap_set_lcd_dma_ext_controller);
2416EXPORT_SYMBOL(omap_set_lcd_dma_b1_rotation);
2417EXPORT_SYMBOL(omap_set_lcd_dma_b1_vxres);
2418EXPORT_SYMBOL(omap_set_lcd_dma_b1_scale);
2419EXPORT_SYMBOL(omap_set_lcd_dma_b1_mirror);
2420 2429
diff --git a/include/asm-arm/arch-omap/dma.h b/include/asm-arm/arch-omap/dma.h
index d188100f8f45..f4dcb9587869 100644
--- a/include/asm-arm/arch-omap/dma.h
+++ b/include/asm-arm/arch-omap/dma.h
@@ -216,63 +216,98 @@
216#define OMAP24XX_DMA_GPMC 4 /* S_DMA_3 */ 216#define OMAP24XX_DMA_GPMC 4 /* S_DMA_3 */
217#define OMAP24XX_DMA_GFX 5 /* S_DMA_4 */ 217#define OMAP24XX_DMA_GFX 5 /* S_DMA_4 */
218#define OMAP24XX_DMA_DSS 6 /* S_DMA_5 */ 218#define OMAP24XX_DMA_DSS 6 /* S_DMA_5 */
219#define OMAP24XX_DMA_VLYNQ_TX 7 /* S_DMA_6 */ 219#define OMAP242X_DMA_VLYNQ_TX 7 /* S_DMA_6 */
220#define OMAP24XX_DMA_EXT_DMAREQ2 7 /* S_DMA_6 */
220#define OMAP24XX_DMA_CWT 8 /* S_DMA_7 */ 221#define OMAP24XX_DMA_CWT 8 /* S_DMA_7 */
221#define OMAP24XX_DMA_AES_TX 9 /* S_DMA_8 */ 222#define OMAP24XX_DMA_AES_TX 9 /* S_DMA_8 */
222#define OMAP24XX_DMA_AES_RX 10 /* S_DMA_9 */ 223#define OMAP24XX_DMA_AES_RX 10 /* S_DMA_9 */
223#define OMAP24XX_DMA_DES_TX 11 /* S_DMA_10 */ 224#define OMAP24XX_DMA_DES_TX 11 /* S_DMA_10 */
224#define OMAP24XX_DMA_DES_RX 12 /* S_DMA_11 */ 225#define OMAP24XX_DMA_DES_RX 12 /* S_DMA_11 */
225#define OMAP24XX_DMA_SHA1MD5_RX 13 /* S_DMA_12 */ 226#define OMAP24XX_DMA_SHA1MD5_RX 13 /* S_DMA_12 */
226#define OMAP24XX_DMA_EXT_DMAREQ2 14 /* S_DMA_13 */ 227#define OMAP34XX_DMA_SHA2MD5_RX 13 /* S_DMA_12 */
227#define OMAP24XX_DMA_EXT_DMAREQ3 15 /* S_DMA_14 */ 228#define OMAP242X_DMA_EXT_DMAREQ2 14 /* S_DMA_13 */
228#define OMAP24XX_DMA_EXT_DMAREQ4 16 /* S_DMA_15 */ 229#define OMAP242X_DMA_EXT_DMAREQ3 15 /* S_DMA_14 */
229#define OMAP24XX_DMA_EAC_AC_RD 17 /* S_DMA_16 */ 230#define OMAP242X_DMA_EXT_DMAREQ4 16 /* S_DMA_15 */
230#define OMAP24XX_DMA_EAC_AC_WR 18 /* S_DMA_17 */ 231#define OMAP242X_DMA_EAC_AC_RD 17 /* S_DMA_16 */
231#define OMAP24XX_DMA_EAC_MD_UL_RD 19 /* S_DMA_18 */ 232#define OMAP242X_DMA_EAC_AC_WR 18 /* S_DMA_17 */
232#define OMAP24XX_DMA_EAC_MD_UL_WR 20 /* S_DMA_19 */ 233#define OMAP242X_DMA_EAC_MD_UL_RD 19 /* S_DMA_18 */
233#define OMAP24XX_DMA_EAC_MD_DL_RD 21 /* S_DMA_20 */ 234#define OMAP242X_DMA_EAC_MD_UL_WR 20 /* S_DMA_19 */
234#define OMAP24XX_DMA_EAC_MD_DL_WR 22 /* S_DMA_21 */ 235#define OMAP242X_DMA_EAC_MD_DL_RD 21 /* S_DMA_20 */
235#define OMAP24XX_DMA_EAC_BT_UL_RD 23 /* S_DMA_22 */ 236#define OMAP242X_DMA_EAC_MD_DL_WR 22 /* S_DMA_21 */
236#define OMAP24XX_DMA_EAC_BT_UL_WR 24 /* S_DMA_23 */ 237#define OMAP242X_DMA_EAC_BT_UL_RD 23 /* S_DMA_22 */
237#define OMAP24XX_DMA_EAC_BT_DL_RD 25 /* S_DMA_24 */ 238#define OMAP242X_DMA_EAC_BT_UL_WR 24 /* S_DMA_23 */
238#define OMAP24XX_DMA_EAC_BT_DL_WR 26 /* S_DMA_25 */ 239#define OMAP242X_DMA_EAC_BT_DL_RD 25 /* S_DMA_24 */
240#define OMAP242X_DMA_EAC_BT_DL_WR 26 /* S_DMA_25 */
241#define OMAP243X_DMA_EXT_DMAREQ3 14 /* S_DMA_13 */
242#define OMAP24XX_DMA_SPI3_TX0 15 /* S_DMA_14 */
243#define OMAP24XX_DMA_SPI3_RX0 16 /* S_DMA_15 */
244#define OMAP24XX_DMA_MCBSP3_TX 17 /* S_DMA_16 */
245#define OMAP24XX_DMA_MCBSP3_RX 18 /* S_DMA_17 */
246#define OMAP24XX_DMA_MCBSP4_TX 19 /* S_DMA_18 */
247#define OMAP24XX_DMA_MCBSP4_RX 20 /* S_DMA_19 */
248#define OMAP24XX_DMA_MCBSP5_TX 21 /* S_DMA_20 */
249#define OMAP24XX_DMA_MCBSP5_RX 22 /* S_DMA_21 */
250#define OMAP24XX_DMA_SPI3_TX1 23 /* S_DMA_22 */
251#define OMAP24XX_DMA_SPI3_RX1 24 /* S_DMA_23 */
252#define OMAP243X_DMA_EXT_DMAREQ4 25 /* S_DMA_24 */
253#define OMAP243X_DMA_EXT_DMAREQ5 26 /* S_DMA_25 */
254#define OMAP34XX_DMA_I2C3_TX 25 /* S_DMA_24 */
255#define OMAP34XX_DMA_I2C3_RX 26 /* S_DMA_25 */
239#define OMAP24XX_DMA_I2C1_TX 27 /* S_DMA_26 */ 256#define OMAP24XX_DMA_I2C1_TX 27 /* S_DMA_26 */
240#define OMAP24XX_DMA_I2C1_RX 28 /* S_DMA_27 */ 257#define OMAP24XX_DMA_I2C1_RX 28 /* S_DMA_27 */
241#define OMAP24XX_DMA_I2C2_TX 29 /* S_DMA_28 */ 258#define OMAP24XX_DMA_I2C2_TX 29 /* S_DMA_28 */
242#define OMAP24XX_DMA_I2C2_RX 30 /* S_DMA_29 */ 259#define OMAP24XX_DMA_I2C2_RX 30 /* S_DMA_29 */
243#define OMAP24XX_DMA_MCBSP1_TX 31 /* SDMA_30 */ 260#define OMAP24XX_DMA_MCBSP1_TX 31 /* S_DMA_30 */
244#define OMAP24XX_DMA_MCBSP1_RX 32 /* SDMA_31 */ 261#define OMAP24XX_DMA_MCBSP1_RX 32 /* S_DMA_31 */
245#define OMAP24XX_DMA_MCBSP2_TX 33 /* SDMA_32 */ 262#define OMAP24XX_DMA_MCBSP2_TX 33 /* S_DMA_32 */
246#define OMAP24XX_DMA_MCBSP2_RX 34 /* SDMA_33 */ 263#define OMAP24XX_DMA_MCBSP2_RX 34 /* S_DMA_33 */
247#define OMAP24XX_DMA_SPI1_TX0 35 /* SDMA_34 */ 264#define OMAP24XX_DMA_SPI1_TX0 35 /* S_DMA_34 */
248#define OMAP24XX_DMA_SPI1_RX0 36 /* SDMA_35 */ 265#define OMAP24XX_DMA_SPI1_RX0 36 /* S_DMA_35 */
249#define OMAP24XX_DMA_SPI1_TX1 37 /* SDMA_36 */ 266#define OMAP24XX_DMA_SPI1_TX1 37 /* S_DMA_36 */
250#define OMAP24XX_DMA_SPI1_RX1 38 /* SDMA_37 */ 267#define OMAP24XX_DMA_SPI1_RX1 38 /* S_DMA_37 */
251#define OMAP24XX_DMA_SPI1_TX2 39 /* SDMA_38 */ 268#define OMAP24XX_DMA_SPI1_TX2 39 /* S_DMA_38 */
252#define OMAP24XX_DMA_SPI1_RX2 40 /* SDMA_39 */ 269#define OMAP24XX_DMA_SPI1_RX2 40 /* S_DMA_39 */
253#define OMAP24XX_DMA_SPI1_TX3 41 /* SDMA_40 */ 270#define OMAP24XX_DMA_SPI1_TX3 41 /* S_DMA_40 */
254#define OMAP24XX_DMA_SPI1_RX3 42 /* SDMA_41 */ 271#define OMAP24XX_DMA_SPI1_RX3 42 /* S_DMA_41 */
255#define OMAP24XX_DMA_SPI2_TX0 43 /* SDMA_42 */ 272#define OMAP24XX_DMA_SPI2_TX0 43 /* S_DMA_42 */
256#define OMAP24XX_DMA_SPI2_RX0 44 /* SDMA_43 */ 273#define OMAP24XX_DMA_SPI2_RX0 44 /* S_DMA_43 */
257#define OMAP24XX_DMA_SPI2_TX1 45 /* SDMA_44 */ 274#define OMAP24XX_DMA_SPI2_TX1 45 /* S_DMA_44 */
258#define OMAP24XX_DMA_SPI2_RX1 46 /* SDMA_45 */ 275#define OMAP24XX_DMA_SPI2_RX1 46 /* S_DMA_45 */
259 276#define OMAP24XX_DMA_MMC2_TX 47 /* S_DMA_46 */
260#define OMAP24XX_DMA_UART1_TX 49 /* SDMA_48 */ 277#define OMAP24XX_DMA_MMC2_RX 48 /* S_DMA_47 */
261#define OMAP24XX_DMA_UART1_RX 50 /* SDMA_49 */ 278#define OMAP24XX_DMA_UART1_TX 49 /* S_DMA_48 */
262#define OMAP24XX_DMA_UART2_TX 51 /* SDMA_50 */ 279#define OMAP24XX_DMA_UART1_RX 50 /* S_DMA_49 */
263#define OMAP24XX_DMA_UART2_RX 52 /* SDMA_51 */ 280#define OMAP24XX_DMA_UART2_TX 51 /* S_DMA_50 */
264#define OMAP24XX_DMA_UART3_TX 53 /* SDMA_52 */ 281#define OMAP24XX_DMA_UART2_RX 52 /* S_DMA_51 */
265#define OMAP24XX_DMA_UART3_RX 54 /* SDMA_53 */ 282#define OMAP24XX_DMA_UART3_TX 53 /* S_DMA_52 */
266#define OMAP24XX_DMA_USB_W2FC_TX0 55 /* SDMA_54 */ 283#define OMAP24XX_DMA_UART3_RX 54 /* S_DMA_53 */
267#define OMAP24XX_DMA_USB_W2FC_RX0 56 /* SDMA_55 */ 284#define OMAP24XX_DMA_USB_W2FC_TX0 55 /* S_DMA_54 */
268#define OMAP24XX_DMA_USB_W2FC_TX1 57 /* SDMA_56 */ 285#define OMAP24XX_DMA_USB_W2FC_RX0 56 /* S_DMA_55 */
269#define OMAP24XX_DMA_USB_W2FC_RX1 58 /* SDMA_57 */ 286#define OMAP24XX_DMA_USB_W2FC_TX1 57 /* S_DMA_56 */
270#define OMAP24XX_DMA_USB_W2FC_TX2 59 /* SDMA_58 */ 287#define OMAP24XX_DMA_USB_W2FC_RX1 58 /* S_DMA_57 */
271#define OMAP24XX_DMA_USB_W2FC_RX2 60 /* SDMA_59 */ 288#define OMAP24XX_DMA_USB_W2FC_TX2 59 /* S_DMA_58 */
272#define OMAP24XX_DMA_MMC1_TX 61 /* SDMA_60 */ 289#define OMAP24XX_DMA_USB_W2FC_RX2 60 /* S_DMA_59 */
273#define OMAP24XX_DMA_MMC1_RX 62 /* SDMA_61 */ 290#define OMAP24XX_DMA_MMC1_TX 61 /* S_DMA_60 */
274#define OMAP24XX_DMA_MS 63 /* SDMA_62 */ 291#define OMAP24XX_DMA_MMC1_RX 62 /* S_DMA_61 */
275#define OMAP24XX_DMA_EXT_DMAREQ5 64 /* S_DMA_63 */ 292#define OMAP24XX_DMA_MS 63 /* S_DMA_62 */
293#define OMAP242X_DMA_EXT_DMAREQ5 64 /* S_DMA_63 */
294#define OMAP243X_DMA_EXT_DMAREQ6 64 /* S_DMA_63 */
295#define OMAP34XX_DMA_EXT_DMAREQ3 64 /* S_DMA_63 */
296#define OMAP34XX_DMA_AES2_TX 65 /* S_DMA_64 */
297#define OMAP34XX_DMA_AES2_RX 66 /* S_DMA_65 */
298#define OMAP34XX_DMA_DES2_TX 67 /* S_DMA_66 */
299#define OMAP34XX_DMA_DES2_RX 68 /* S_DMA_67 */
300#define OMAP34XX_DMA_SHA1MD5_RX 69 /* S_DMA_68 */
301#define OMAP34XX_DMA_SPI4_TX0 70 /* S_DMA_69 */
302#define OMAP34XX_DMA_SPI4_RX0 71 /* S_DMA_70 */
303#define OMAP34XX_DSS_DMA0 72 /* S_DMA_71 */
304#define OMAP34XX_DSS_DMA1 73 /* S_DMA_72 */
305#define OMAP34XX_DSS_DMA2 74 /* S_DMA_73 */
306#define OMAP34XX_DSS_DMA3 75 /* S_DMA_74 */
307#define OMAP34XX_DMA_MMC3_TX 77 /* S_DMA_76 */
308#define OMAP34XX_DMA_MMC3_RX 78 /* S_DMA_77 */
309#define OMAP34XX_DMA_USIM_TX 79 /* S_DMA_78 */
310#define OMAP34XX_DMA_USIM_RX 80 /* S_DMA_79 */
276 311
277/*----------------------------------------------------------------------------*/ 312/*----------------------------------------------------------------------------*/
278 313
@@ -378,6 +413,11 @@ enum omap_dma_burst_mode {
378 OMAP_DMA_DATA_BURST_16, 413 OMAP_DMA_DATA_BURST_16,
379}; 414};
380 415
416enum end_type {
417 OMAP_DMA_LITTLE_ENDIAN = 0,
418 OMAP_DMA_BIG_ENDIAN
419};
420
381enum omap_dma_color_mode { 421enum omap_dma_color_mode {
382 OMAP_DMA_COLOR_DIS = 0, 422 OMAP_DMA_COLOR_DIS = 0,
383 OMAP_DMA_CONSTANT_FILL, 423 OMAP_DMA_CONSTANT_FILL,
@@ -403,18 +443,21 @@ struct omap_dma_channel_params {
403 int frame_count; /* number of frames in a element */ 443 int frame_count; /* number of frames in a element */
404 444
405 int src_port; /* Only on OMAP1 REVISIT: Is this needed? */ 445 int src_port; /* Only on OMAP1 REVISIT: Is this needed? */
406 int src_amode; /* constant , post increment, indexed , double indexed */ 446 int src_amode; /* constant, post increment, indexed,
447 double indexed */
407 unsigned long src_start; /* source address : physical */ 448 unsigned long src_start; /* source address : physical */
408 int src_ei; /* source element index */ 449 int src_ei; /* source element index */
409 int src_fi; /* source frame index */ 450 int src_fi; /* source frame index */
410 451
411 int dst_port; /* Only on OMAP1 REVISIT: Is this needed? */ 452 int dst_port; /* Only on OMAP1 REVISIT: Is this needed? */
412 int dst_amode; /* constant , post increment, indexed , double indexed */ 453 int dst_amode; /* constant, post increment, indexed,
454 double indexed */
413 unsigned long dst_start; /* source address : physical */ 455 unsigned long dst_start; /* source address : physical */
414 int dst_ei; /* source element index */ 456 int dst_ei; /* source element index */
415 int dst_fi; /* source frame index */ 457 int dst_fi; /* source frame index */
416 458
417 int trigger; /* trigger attached if the channel is synchronized */ 459 int trigger; /* trigger attached if the channel is
460 synchronized */
418 int sync_mode; /* sycn on element, frame , block or packet */ 461 int sync_mode; /* sycn on element, frame , block or packet */
419 int src_or_dst_synch; /* source synch(1) or destination synch(0) */ 462 int src_or_dst_synch; /* source synch(1) or destination synch(0) */
420 463
@@ -431,8 +474,8 @@ struct omap_dma_channel_params {
431 474
432extern void omap_set_dma_priority(int lch, int dst_port, int priority); 475extern void omap_set_dma_priority(int lch, int dst_port, int priority);
433extern int omap_request_dma(int dev_id, const char *dev_name, 476extern int omap_request_dma(int dev_id, const char *dev_name,
434 void (* callback)(int lch, u16 ch_status, void *data), 477 void (*callback)(int lch, u16 ch_status, void *data),
435 void *data, int *dma_ch); 478 void *data, int *dma_ch);
436extern void omap_enable_dma_irq(int ch, u16 irq_bits); 479extern void omap_enable_dma_irq(int ch, u16 irq_bits);
437extern void omap_disable_dma_irq(int ch, u16 irq_bits); 480extern void omap_disable_dma_irq(int ch, u16 irq_bits);
438extern void omap_free_dma(int ch); 481extern void omap_free_dma(int ch);
@@ -464,17 +507,16 @@ extern void omap_set_dma_dest_burst_mode(int lch,
464 enum omap_dma_burst_mode burst_mode); 507 enum omap_dma_burst_mode burst_mode);
465 508
466extern void omap_set_dma_params(int lch, 509extern void omap_set_dma_params(int lch,
467 struct omap_dma_channel_params * params); 510 struct omap_dma_channel_params *params);
468 511
469extern void omap_dma_link_lch (int lch_head, int lch_queue); 512extern void omap_dma_link_lch(int lch_head, int lch_queue);
470extern void omap_dma_unlink_lch (int lch_head, int lch_queue); 513extern void omap_dma_unlink_lch(int lch_head, int lch_queue);
471 514
472extern int omap_set_dma_callback(int lch, 515extern int omap_set_dma_callback(int lch,
473 void (* callback)(int lch, u16 ch_status, void *data), 516 void (*callback)(int lch, u16 ch_status, void *data),
474 void *data); 517 void *data);
475extern dma_addr_t omap_get_dma_src_pos(int lch); 518extern dma_addr_t omap_get_dma_src_pos(int lch);
476extern dma_addr_t omap_get_dma_dst_pos(int lch); 519extern dma_addr_t omap_get_dma_dst_pos(int lch);
477extern int omap_get_dma_src_addr_counter(int lch);
478extern void omap_clear_dma(int lch); 520extern void omap_clear_dma(int lch);
479extern int omap_get_dma_active_status(int lch); 521extern int omap_get_dma_active_status(int lch);
480extern int omap_dma_running(void); 522extern int omap_dma_running(void);
@@ -482,6 +524,9 @@ extern void omap_dma_set_global_params(int arb_rate, int max_fifo_depth,
482 int tparams); 524 int tparams);
483extern int omap_dma_set_prio_lch(int lch, unsigned char read_prio, 525extern int omap_dma_set_prio_lch(int lch, unsigned char read_prio,
484 unsigned char write_prio); 526 unsigned char write_prio);
527extern void omap_set_dma_dst_endian_type(int lch, enum end_type etype);
528extern void omap_set_dma_src_endian_type(int lch, enum end_type etype);
529extern int omap_get_dma_index(int lch, int *ei, int *fi);
485 530
486/* Chaining APIs */ 531/* Chaining APIs */
487#ifndef CONFIG_ARCH_OMAP1 532#ifndef CONFIG_ARCH_OMAP1
@@ -507,7 +552,7 @@ extern int omap_dma_chain_status(int chain_id);
507#endif 552#endif
508 553
509/* LCD DMA functions */ 554/* LCD DMA functions */
510extern int omap_request_lcd_dma(void (* callback)(u16 status, void *data), 555extern int omap_request_lcd_dma(void (*callback)(u16 status, void *data),
511 void *data); 556 void *data);
512extern void omap_free_lcd_dma(void); 557extern void omap_free_lcd_dma(void);
513extern void omap_setup_lcd_dma(void); 558extern void omap_setup_lcd_dma(void);