1 // SPDX-License-Identifier: GPL-2.0-only
3 * linux/arch/arm/plat-omap/dma.c
5 * Copyright (C) 2003 - 2008 Nokia Corporation
6 * Author: Juha Yrjölä <juha.yrjola@nokia.com>
7 * DMA channel linking for 1610 by Samuel Ortiz <samuel.ortiz@nokia.com>
8 * Graphics DMA and LCD DMA graphics tranformations
9 * by Imre Deak <imre.deak@nokia.com>
10 * OMAP2/3 support Copyright (C) 2004-2007 Texas Instruments, Inc.
11 * Merged to support both OMAP1 and OMAP2 by Tony Lindgren <tony@atomide.com>
12 * Some functions based on earlier dma-omap.c Copyright (C) 2001 RidgeRun, Inc.
14 * Copyright (C) 2009 Texas Instruments
15 * Added OMAP4 support - Santosh Shilimkar <santosh.shilimkar@ti.com>
17 * Support functions for the OMAP internal DMA channels.
19 * Copyright (C) 2010 Texas Instruments Incorporated - https://www.ti.com/
20 * Converted DMA library into DMA platform driver.
21 * - G, Manjunath Kondaiah <manjugk@ti.com>
24 #include <linux/module.h>
25 #include <linux/init.h>
26 #include <linux/sched.h>
27 #include <linux/spinlock.h>
28 #include <linux/errno.h>
29 #include <linux/interrupt.h>
30 #include <linux/irq.h>
32 #include <linux/slab.h>
33 #include <linux/delay.h>
35 #include <linux/omap-dma.h>
37 #ifdef CONFIG_ARCH_OMAP1
42 * MAX_LOGICAL_DMA_CH_COUNT: the maximum number of logical DMA
43 * channels that an instance of the SDMA IP block can support. Used
44 * to size arrays. (The actual maximum on a particular SoC may be less
45 * than this -- for example, OMAP1 SDMA instances only support 17 logical
48 #define MAX_LOGICAL_DMA_CH_COUNT 32
52 #ifndef CONFIG_ARCH_OMAP1
53 enum { DMA_CH_ALLOC_DONE
, DMA_CH_PARAMS_SET_DONE
, DMA_CH_STARTED
,
54 DMA_CH_QUEUED
, DMA_CH_NOTSTARTED
, DMA_CH_PAUSED
, DMA_CH_LINK_ENABLED
57 enum { DMA_CHAIN_STARTED
, DMA_CHAIN_NOTSTARTED
};
60 #define OMAP_DMA_ACTIVE 0x01
61 #define OMAP2_DMA_CSR_CLEAR_MASK 0xffffffff
63 #define OMAP_FUNC_MUX_ARM_BASE (0xfffe1000 + 0xec)
65 static struct omap_system_dma_plat_info
*p
;
66 static struct omap_dma_dev_attr
*d
;
67 static void omap_clear_dma(int lch
);
68 static int enable_1510_mode
;
71 struct dma_link_info
{
73 int no_of_lchs_linked
;
84 static int dma_lch_count
;
85 static int dma_chan_count
;
86 static int omap_dma_reserve_channels
;
88 static spinlock_t dma_chan_lock
;
89 static struct omap_dma_lch
*dma_chan
;
91 static inline void disable_lnk(int lch
);
92 static void omap_disable_channel_irq(int lch
);
93 static inline void omap_enable_channel_irq(int lch
);
95 #ifdef CONFIG_ARCH_OMAP15XX
96 /* Returns 1 if the DMA module is in OMAP1510-compatible mode, 0 otherwise */
97 static int omap_dma_in_1510_mode(void)
99 return enable_1510_mode
;
102 #define omap_dma_in_1510_mode() 0
105 #ifdef CONFIG_ARCH_OMAP1
106 static inline void set_gdma_dev(int req
, int dev
)
108 u32 reg
= OMAP_FUNC_MUX_ARM_BASE
+ ((req
- 1) / 5) * 4;
109 int shift
= ((req
- 1) % 5) * 6;
113 l
&= ~(0x3f << shift
);
114 l
|= (dev
- 1) << shift
;
118 #define set_gdma_dev(req, dev) do {} while (0)
119 #define omap_readl(reg) 0
120 #define omap_writel(val, reg) do {} while (0)
123 #ifdef CONFIG_ARCH_OMAP1
124 void omap_set_dma_priority(int lch
, int dst_port
, int priority
)
131 case OMAP_DMA_PORT_OCP_T1
: /* FFFECC00 */
132 reg
= OMAP_TC_OCPT1_PRIOR
;
134 case OMAP_DMA_PORT_OCP_T2
: /* FFFECCD0 */
135 reg
= OMAP_TC_OCPT2_PRIOR
;
137 case OMAP_DMA_PORT_EMIFF
: /* FFFECC08 */
138 reg
= OMAP_TC_EMIFF_PRIOR
;
140 case OMAP_DMA_PORT_EMIFS
: /* FFFECC04 */
141 reg
= OMAP_TC_EMIFS_PRIOR
;
149 l
|= (priority
& 0xf) << 8;
155 #ifdef CONFIG_ARCH_OMAP2PLUS
156 void omap_set_dma_priority(int lch
, int dst_port
, int priority
)
160 ccr
= p
->dma_read(CCR
, lch
);
165 p
->dma_write(ccr
, CCR
, lch
);
168 EXPORT_SYMBOL(omap_set_dma_priority
);
170 void omap_set_dma_transfer_params(int lch
, int data_type
, int elem_count
,
171 int frame_count
, int sync_mode
,
172 int dma_trigger
, int src_or_dst_synch
)
176 l
= p
->dma_read(CSDP
, lch
);
179 p
->dma_write(l
, CSDP
, lch
);
184 ccr
= p
->dma_read(CCR
, lch
);
186 if (sync_mode
== OMAP_DMA_SYNC_FRAME
)
188 p
->dma_write(ccr
, CCR
, lch
);
190 ccr
= p
->dma_read(CCR2
, lch
);
192 if (sync_mode
== OMAP_DMA_SYNC_BLOCK
)
194 p
->dma_write(ccr
, CCR2
, lch
);
197 if (dma_omap2plus() && dma_trigger
) {
200 val
= p
->dma_read(CCR
, lch
);
202 /* DMA_SYNCHRO_CONTROL_UPPER depends on the channel number */
203 val
&= ~((1 << 23) | (3 << 19) | 0x1f);
204 val
|= (dma_trigger
& ~0x1f) << 14;
205 val
|= dma_trigger
& 0x1f;
207 if (sync_mode
& OMAP_DMA_SYNC_FRAME
)
212 if (sync_mode
& OMAP_DMA_SYNC_BLOCK
)
217 if (src_or_dst_synch
== OMAP_DMA_DST_SYNC_PREFETCH
) {
218 val
&= ~(1 << 24); /* dest synch */
219 val
|= (1 << 23); /* Prefetch */
220 } else if (src_or_dst_synch
) {
221 val
|= 1 << 24; /* source synch */
223 val
&= ~(1 << 24); /* dest synch */
225 p
->dma_write(val
, CCR
, lch
);
228 p
->dma_write(elem_count
, CEN
, lch
);
229 p
->dma_write(frame_count
, CFN
, lch
);
231 EXPORT_SYMBOL(omap_set_dma_transfer_params
);
233 void omap_set_dma_channel_mode(int lch
, enum omap_dma_channel_mode mode
)
235 if (dma_omap1() && !dma_omap15xx()) {
238 l
= p
->dma_read(LCH_CTRL
, lch
);
241 p
->dma_write(l
, LCH_CTRL
, lch
);
244 EXPORT_SYMBOL(omap_set_dma_channel_mode
);
246 /* Note that src_port is only for omap1 */
247 void omap_set_dma_src_params(int lch
, int src_port
, int src_amode
,
248 unsigned long src_start
,
249 int src_ei
, int src_fi
)
256 w
= p
->dma_read(CSDP
, lch
);
259 p
->dma_write(w
, CSDP
, lch
);
262 l
= p
->dma_read(CCR
, lch
);
264 l
|= src_amode
<< 12;
265 p
->dma_write(l
, CCR
, lch
);
267 p
->dma_write(src_start
, CSSA
, lch
);
269 p
->dma_write(src_ei
, CSEI
, lch
);
270 p
->dma_write(src_fi
, CSFI
, lch
);
272 EXPORT_SYMBOL(omap_set_dma_src_params
);
274 void omap_set_dma_src_data_pack(int lch
, int enable
)
278 l
= p
->dma_read(CSDP
, lch
);
282 p
->dma_write(l
, CSDP
, lch
);
284 EXPORT_SYMBOL(omap_set_dma_src_data_pack
);
286 void omap_set_dma_src_burst_mode(int lch
, enum omap_dma_burst_mode burst_mode
)
288 unsigned int burst
= 0;
291 l
= p
->dma_read(CSDP
, lch
);
294 switch (burst_mode
) {
295 case OMAP_DMA_DATA_BURST_DIS
:
297 case OMAP_DMA_DATA_BURST_4
:
303 case OMAP_DMA_DATA_BURST_8
:
304 if (dma_omap2plus()) {
309 * not supported by current hardware on OMAP1
313 case OMAP_DMA_DATA_BURST_16
:
314 if (dma_omap2plus()) {
318 /* OMAP1 don't support burst 16 */
325 p
->dma_write(l
, CSDP
, lch
);
327 EXPORT_SYMBOL(omap_set_dma_src_burst_mode
);
329 /* Note that dest_port is only for OMAP1 */
330 void omap_set_dma_dest_params(int lch
, int dest_port
, int dest_amode
,
331 unsigned long dest_start
,
332 int dst_ei
, int dst_fi
)
337 l
= p
->dma_read(CSDP
, lch
);
340 p
->dma_write(l
, CSDP
, lch
);
343 l
= p
->dma_read(CCR
, lch
);
345 l
|= dest_amode
<< 14;
346 p
->dma_write(l
, CCR
, lch
);
348 p
->dma_write(dest_start
, CDSA
, lch
);
350 p
->dma_write(dst_ei
, CDEI
, lch
);
351 p
->dma_write(dst_fi
, CDFI
, lch
);
353 EXPORT_SYMBOL(omap_set_dma_dest_params
);
355 void omap_set_dma_dest_data_pack(int lch
, int enable
)
359 l
= p
->dma_read(CSDP
, lch
);
363 p
->dma_write(l
, CSDP
, lch
);
365 EXPORT_SYMBOL(omap_set_dma_dest_data_pack
);
367 void omap_set_dma_dest_burst_mode(int lch
, enum omap_dma_burst_mode burst_mode
)
369 unsigned int burst
= 0;
372 l
= p
->dma_read(CSDP
, lch
);
375 switch (burst_mode
) {
376 case OMAP_DMA_DATA_BURST_DIS
:
378 case OMAP_DMA_DATA_BURST_4
:
384 case OMAP_DMA_DATA_BURST_8
:
390 case OMAP_DMA_DATA_BURST_16
:
391 if (dma_omap2plus()) {
395 /* OMAP1 don't support burst 16 */
398 printk(KERN_ERR
"Invalid DMA burst mode\n");
403 p
->dma_write(l
, CSDP
, lch
);
405 EXPORT_SYMBOL(omap_set_dma_dest_burst_mode
);
407 static inline void omap_enable_channel_irq(int lch
)
411 p
->dma_read(CSR
, lch
);
413 p
->dma_write(OMAP2_DMA_CSR_CLEAR_MASK
, CSR
, lch
);
415 /* Enable some nice interrupts. */
416 p
->dma_write(dma_chan
[lch
].enabled_irqs
, CICR
, lch
);
419 static inline void omap_disable_channel_irq(int lch
)
421 /* disable channel interrupts */
422 p
->dma_write(0, CICR
, lch
);
425 p
->dma_read(CSR
, lch
);
427 p
->dma_write(OMAP2_DMA_CSR_CLEAR_MASK
, CSR
, lch
);
430 void omap_disable_dma_irq(int lch
, u16 bits
)
432 dma_chan
[lch
].enabled_irqs
&= ~bits
;
434 EXPORT_SYMBOL(omap_disable_dma_irq
);
436 static inline void enable_lnk(int lch
)
440 l
= p
->dma_read(CLNK_CTRL
, lch
);
445 /* Set the ENABLE_LNK bits */
446 if (dma_chan
[lch
].next_lch
!= -1)
447 l
= dma_chan
[lch
].next_lch
| (1 << 15);
449 p
->dma_write(l
, CLNK_CTRL
, lch
);
452 static inline void disable_lnk(int lch
)
456 l
= p
->dma_read(CLNK_CTRL
, lch
);
458 /* Disable interrupts */
459 omap_disable_channel_irq(lch
);
462 /* Set the STOP_LNK bit */
466 if (dma_omap2plus()) {
467 /* Clear the ENABLE_LNK bit */
471 p
->dma_write(l
, CLNK_CTRL
, lch
);
472 dma_chan
[lch
].flags
&= ~OMAP_DMA_ACTIVE
;
475 int omap_request_dma(int dev_id
, const char *dev_name
,
476 void (*callback
)(int lch
, u16 ch_status
, void *data
),
477 void *data
, int *dma_ch_out
)
479 int ch
, free_ch
= -1;
481 struct omap_dma_lch
*chan
;
483 WARN(strcmp(dev_name
, "DMA engine"), "Using deprecated platform DMA API - please update to DMA engine");
485 spin_lock_irqsave(&dma_chan_lock
, flags
);
486 for (ch
= 0; ch
< dma_chan_count
; ch
++) {
487 if (free_ch
== -1 && dma_chan
[ch
].dev_id
== -1) {
489 /* Exit after first free channel found */
494 spin_unlock_irqrestore(&dma_chan_lock
, flags
);
497 chan
= dma_chan
+ free_ch
;
498 chan
->dev_id
= dev_id
;
500 if (p
->clear_lch_regs
)
501 p
->clear_lch_regs(free_ch
);
503 spin_unlock_irqrestore(&dma_chan_lock
, flags
);
505 chan
->dev_name
= dev_name
;
506 chan
->callback
= callback
;
510 chan
->enabled_irqs
= OMAP_DMA_DROP_IRQ
| OMAP_DMA_BLOCK_IRQ
;
513 chan
->enabled_irqs
|= OMAP1_DMA_TOUT_IRQ
;
515 if (dma_omap16xx()) {
516 /* If the sync device is set, configure it dynamically. */
518 set_gdma_dev(free_ch
+ 1, dev_id
);
519 dev_id
= free_ch
+ 1;
522 * Disable the 1510 compatibility mode and set the sync device
525 p
->dma_write(dev_id
| (1 << 10), CCR
, free_ch
);
526 } else if (dma_omap1()) {
527 p
->dma_write(dev_id
, CCR
, free_ch
);
530 *dma_ch_out
= free_ch
;
534 EXPORT_SYMBOL(omap_request_dma
);
536 void omap_free_dma(int lch
)
540 if (dma_chan
[lch
].dev_id
== -1) {
541 pr_err("omap_dma: trying to free unallocated DMA channel %d\n",
546 /* Disable all DMA interrupts for the channel. */
547 omap_disable_channel_irq(lch
);
549 /* Make sure the DMA transfer is stopped. */
550 p
->dma_write(0, CCR
, lch
);
552 spin_lock_irqsave(&dma_chan_lock
, flags
);
553 dma_chan
[lch
].dev_id
= -1;
554 dma_chan
[lch
].next_lch
= -1;
555 dma_chan
[lch
].callback
= NULL
;
556 spin_unlock_irqrestore(&dma_chan_lock
, flags
);
558 EXPORT_SYMBOL(omap_free_dma
);
561 * Clears any DMA state so the DMA engine is ready to restart with new buffers
562 * through omap_start_dma(). Any buffers in flight are discarded.
564 static void omap_clear_dma(int lch
)
568 local_irq_save(flags
);
570 local_irq_restore(flags
);
573 void omap_start_dma(int lch
)
578 * The CPC/CDAC register needs to be initialized to zero
579 * before starting dma transfer.
582 p
->dma_write(0, CPC
, lch
);
584 p
->dma_write(0, CDAC
, lch
);
586 if (!omap_dma_in_1510_mode() && dma_chan
[lch
].next_lch
!= -1) {
587 int next_lch
, cur_lch
;
588 char dma_chan_link_map
[MAX_LOGICAL_DMA_CH_COUNT
];
590 /* Set the link register of the first channel */
593 memset(dma_chan_link_map
, 0, sizeof(dma_chan_link_map
));
594 dma_chan_link_map
[lch
] = 1;
596 cur_lch
= dma_chan
[lch
].next_lch
;
598 next_lch
= dma_chan
[cur_lch
].next_lch
;
600 /* The loop case: we've been here already */
601 if (dma_chan_link_map
[cur_lch
])
603 /* Mark the current channel */
604 dma_chan_link_map
[cur_lch
] = 1;
607 omap_enable_channel_irq(cur_lch
);
610 } while (next_lch
!= -1);
611 } else if (IS_DMA_ERRATA(DMA_ERRATA_PARALLEL_CHANNELS
))
612 p
->dma_write(lch
, CLNK_CTRL
, lch
);
614 omap_enable_channel_irq(lch
);
616 l
= p
->dma_read(CCR
, lch
);
618 if (IS_DMA_ERRATA(DMA_ERRATA_IFRAME_BUFFERING
))
619 l
|= OMAP_DMA_CCR_BUFFERING_DISABLE
;
620 l
|= OMAP_DMA_CCR_EN
;
623 * As dma_write() uses IO accessors which are weakly ordered, there
624 * is no guarantee that data in coherent DMA memory will be visible
625 * to the DMA device. Add a memory barrier here to ensure that any
626 * such data is visible prior to enabling DMA.
629 p
->dma_write(l
, CCR
, lch
);
631 dma_chan
[lch
].flags
|= OMAP_DMA_ACTIVE
;
633 EXPORT_SYMBOL(omap_start_dma
);
635 void omap_stop_dma(int lch
)
639 /* Disable all interrupts on the channel */
640 omap_disable_channel_irq(lch
);
642 l
= p
->dma_read(CCR
, lch
);
643 if (IS_DMA_ERRATA(DMA_ERRATA_i541
) &&
644 (l
& OMAP_DMA_CCR_SEL_SRC_DST_SYNC
)) {
648 /* Configure No-Standby */
649 l
= p
->dma_read(OCP_SYSCONFIG
, lch
);
651 l
&= ~DMA_SYSCONFIG_MIDLEMODE_MASK
;
652 l
|= DMA_SYSCONFIG_MIDLEMODE(DMA_IDLEMODE_NO_IDLE
);
653 p
->dma_write(l
, OCP_SYSCONFIG
, 0);
655 l
= p
->dma_read(CCR
, lch
);
656 l
&= ~OMAP_DMA_CCR_EN
;
657 p
->dma_write(l
, CCR
, lch
);
659 /* Wait for sDMA FIFO drain */
660 l
= p
->dma_read(CCR
, lch
);
661 while (i
< 100 && (l
& (OMAP_DMA_CCR_RD_ACTIVE
|
662 OMAP_DMA_CCR_WR_ACTIVE
))) {
665 l
= p
->dma_read(CCR
, lch
);
668 pr_err("DMA drain did not complete on lch %d\n", lch
);
669 /* Restore OCP_SYSCONFIG */
670 p
->dma_write(sys_cf
, OCP_SYSCONFIG
, lch
);
672 l
&= ~OMAP_DMA_CCR_EN
;
673 p
->dma_write(l
, CCR
, lch
);
677 * Ensure that data transferred by DMA is visible to any access
678 * after DMA has been disabled. This is important for coherent
683 if (!omap_dma_in_1510_mode() && dma_chan
[lch
].next_lch
!= -1) {
684 int next_lch
, cur_lch
= lch
;
685 char dma_chan_link_map
[MAX_LOGICAL_DMA_CH_COUNT
];
687 memset(dma_chan_link_map
, 0, sizeof(dma_chan_link_map
));
689 /* The loop case: we've been here already */
690 if (dma_chan_link_map
[cur_lch
])
692 /* Mark the current channel */
693 dma_chan_link_map
[cur_lch
] = 1;
695 disable_lnk(cur_lch
);
697 next_lch
= dma_chan
[cur_lch
].next_lch
;
699 } while (next_lch
!= -1);
702 dma_chan
[lch
].flags
&= ~OMAP_DMA_ACTIVE
;
704 EXPORT_SYMBOL(omap_stop_dma
);
707 * Allows changing the DMA callback function or data. This may be needed if
708 * the driver shares a single DMA channel for multiple dma triggers.
711 * Returns current physical source address for the given DMA channel.
712 * If the channel is running the caller must disable interrupts prior calling
713 * this function and process the returned value before re-enabling interrupt to
714 * prevent races with the interrupt handler. Note that in continuous mode there
715 * is a chance for CSSA_L register overflow between the two reads resulting
716 * in incorrect return value.
718 dma_addr_t
omap_get_dma_src_pos(int lch
)
720 dma_addr_t offset
= 0;
723 offset
= p
->dma_read(CPC
, lch
);
725 offset
= p
->dma_read(CSAC
, lch
);
727 if (IS_DMA_ERRATA(DMA_ERRATA_3_3
) && offset
== 0)
728 offset
= p
->dma_read(CSAC
, lch
);
730 if (!dma_omap15xx()) {
732 * CDAC == 0 indicates that the DMA transfer on the channel has
733 * not been started (no data has been transferred so far).
734 * Return the programmed source start address in this case.
736 if (likely(p
->dma_read(CDAC
, lch
)))
737 offset
= p
->dma_read(CSAC
, lch
);
739 offset
= p
->dma_read(CSSA
, lch
);
743 offset
|= (p
->dma_read(CSSA
, lch
) & 0xFFFF0000);
747 EXPORT_SYMBOL(omap_get_dma_src_pos
);
750 * Returns current physical destination address for the given DMA channel.
751 * If the channel is running the caller must disable interrupts prior calling
752 * this function and process the returned value before re-enabling interrupt to
753 * prevent races with the interrupt handler. Note that in continuous mode there
754 * is a chance for CDSA_L register overflow between the two reads resulting
755 * in incorrect return value.
757 dma_addr_t
omap_get_dma_dst_pos(int lch
)
759 dma_addr_t offset
= 0;
762 offset
= p
->dma_read(CPC
, lch
);
764 offset
= p
->dma_read(CDAC
, lch
);
767 * omap 3.2/3.3 erratum: sometimes 0 is returned if CSAC/CDAC is
768 * read before the DMA controller finished disabling the channel.
770 if (!dma_omap15xx() && offset
== 0) {
771 offset
= p
->dma_read(CDAC
, lch
);
773 * CDAC == 0 indicates that the DMA transfer on the channel has
774 * not been started (no data has been transferred so far).
775 * Return the programmed destination start address in this case.
777 if (unlikely(!offset
))
778 offset
= p
->dma_read(CDSA
, lch
);
782 offset
|= (p
->dma_read(CDSA
, lch
) & 0xFFFF0000);
786 EXPORT_SYMBOL(omap_get_dma_dst_pos
);
788 int omap_get_dma_active_status(int lch
)
790 return (p
->dma_read(CCR
, lch
) & OMAP_DMA_CCR_EN
) != 0;
792 EXPORT_SYMBOL(omap_get_dma_active_status
);
794 int omap_dma_running(void)
799 if (omap_lcd_dma_running())
802 for (lch
= 0; lch
< dma_chan_count
; lch
++)
803 if (p
->dma_read(CCR
, lch
) & OMAP_DMA_CCR_EN
)
809 /*----------------------------------------------------------------------------*/
811 #ifdef CONFIG_ARCH_OMAP1
813 static int omap1_dma_handle_ch(int ch
)
817 if (enable_1510_mode
&& ch
>= 6) {
818 csr
= dma_chan
[ch
].saved_csr
;
819 dma_chan
[ch
].saved_csr
= 0;
821 csr
= p
->dma_read(CSR
, ch
);
822 if (enable_1510_mode
&& ch
<= 2 && (csr
>> 7) != 0) {
823 dma_chan
[ch
+ 6].saved_csr
= csr
>> 7;
826 if ((csr
& 0x3f) == 0)
828 if (unlikely(dma_chan
[ch
].dev_id
== -1)) {
829 pr_warn("Spurious interrupt from DMA channel %d (CSR %04x)\n",
833 if (unlikely(csr
& OMAP1_DMA_TOUT_IRQ
))
834 pr_warn("DMA timeout with device %d\n", dma_chan
[ch
].dev_id
);
835 if (unlikely(csr
& OMAP_DMA_DROP_IRQ
))
836 pr_warn("DMA synchronization event drop occurred with device %d\n",
837 dma_chan
[ch
].dev_id
);
838 if (likely(csr
& OMAP_DMA_BLOCK_IRQ
))
839 dma_chan
[ch
].flags
&= ~OMAP_DMA_ACTIVE
;
840 if (likely(dma_chan
[ch
].callback
!= NULL
))
841 dma_chan
[ch
].callback(ch
, csr
, dma_chan
[ch
].data
);
846 static irqreturn_t
omap1_dma_irq_handler(int irq
, void *dev_id
)
848 int ch
= ((int) dev_id
) - 1;
854 handled_now
+= omap1_dma_handle_ch(ch
);
855 if (enable_1510_mode
&& dma_chan
[ch
+ 6].saved_csr
)
856 handled_now
+= omap1_dma_handle_ch(ch
+ 6);
859 handled
+= handled_now
;
862 return handled
? IRQ_HANDLED
: IRQ_NONE
;
866 #define omap1_dma_irq_handler NULL
869 struct omap_system_dma_plat_info
*omap_get_plat_info(void)
873 EXPORT_SYMBOL_GPL(omap_get_plat_info
);
875 static int omap_system_dma_probe(struct platform_device
*pdev
)
881 p
= pdev
->dev
.platform_data
;
884 "%s: System DMA initialized without platform data\n",
892 if ((d
->dev_caps
& RESERVE_CHANNEL
) && omap_dma_reserve_channels
893 && (omap_dma_reserve_channels
< d
->lch_count
))
894 d
->lch_count
= omap_dma_reserve_channels
;
896 dma_lch_count
= d
->lch_count
;
897 dma_chan_count
= dma_lch_count
;
898 enable_1510_mode
= d
->dev_caps
& ENABLE_1510_MODE
;
900 dma_chan
= devm_kcalloc(&pdev
->dev
, dma_lch_count
,
901 sizeof(*dma_chan
), GFP_KERNEL
);
905 spin_lock_init(&dma_chan_lock
);
906 for (ch
= 0; ch
< dma_chan_count
; ch
++) {
909 dma_chan
[ch
].dev_id
= -1;
910 dma_chan
[ch
].next_lch
= -1;
912 if (ch
>= 6 && enable_1510_mode
)
917 * request_irq() doesn't like dev_id (ie. ch) being
918 * zero, so we have to kludge around this.
920 sprintf(&irq_name
[0], "%d", ch
);
921 dma_irq
= platform_get_irq_byname(pdev
, irq_name
);
925 goto exit_dma_irq_fail
;
928 /* INT_DMA_LCD is handled in lcd_dma.c */
929 if (dma_irq
== INT_DMA_LCD
)
932 ret
= request_irq(dma_irq
,
933 omap1_dma_irq_handler
, 0, "DMA",
936 goto exit_dma_irq_fail
;
940 /* reserve dma channels 0 and 1 in high security devices on 34xx */
941 if (d
->dev_caps
& HS_CHANNELS_RESERVED
) {
942 pr_info("Reserving DMA channels 0 and 1 for HS ROM code\n");
943 dma_chan
[0].dev_id
= 0;
944 dma_chan
[1].dev_id
= 1;
953 static int omap_system_dma_remove(struct platform_device
*pdev
)
955 int dma_irq
, irq_rel
= 0;
960 for ( ; irq_rel
< dma_chan_count
; irq_rel
++) {
961 dma_irq
= platform_get_irq(pdev
, irq_rel
);
962 free_irq(dma_irq
, (void *)(irq_rel
+ 1));
968 static struct platform_driver omap_system_dma_driver
= {
969 .probe
= omap_system_dma_probe
,
970 .remove
= omap_system_dma_remove
,
972 .name
= "omap_dma_system"
976 static int __init
omap_system_dma_init(void)
978 return platform_driver_register(&omap_system_dma_driver
);
980 arch_initcall(omap_system_dma_init
);
982 static void __exit
omap_system_dma_exit(void)
984 platform_driver_unregister(&omap_system_dma_driver
);
987 MODULE_DESCRIPTION("OMAP SYSTEM DMA DRIVER");
988 MODULE_LICENSE("GPL");
989 MODULE_AUTHOR("Texas Instruments Inc");
992 * Reserve the omap SDMA channels using cmdline bootarg
993 * "omap_dma_reserve_ch=". The valid range is 1 to 32
995 static int __init
omap_dma_cmdline_reserve_ch(char *str
)
997 if (get_option(&str
, &omap_dma_reserve_channels
) != 1)
998 omap_dma_reserve_channels
= 0;
1002 __setup("omap_dma_reserve_ch=", omap_dma_cmdline_reserve_ch
);