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 #include <linux/soc/ti/omap1-io.h>
38 #include <linux/soc/ti/omap1-soc.h>
43 * MAX_LOGICAL_DMA_CH_COUNT: the maximum number of logical DMA
44 * channels that an instance of the SDMA IP block can support. Used
45 * to size arrays. (The actual maximum on a particular SoC may be less
46 * than this -- for example, OMAP1 SDMA instances only support 17 logical
49 #define MAX_LOGICAL_DMA_CH_COUNT 32
53 #define OMAP_DMA_ACTIVE 0x01
55 #define OMAP_FUNC_MUX_ARM_BASE (0xfffe1000 + 0xec)
57 static struct omap_system_dma_plat_info
*p
;
58 static struct omap_dma_dev_attr
*d
;
59 static int enable_1510_mode
;
62 static int dma_lch_count
;
63 static int dma_chan_count
;
64 static int omap_dma_reserve_channels
;
66 static DEFINE_SPINLOCK(dma_chan_lock
);
67 static struct omap_dma_lch
*dma_chan
;
69 static inline void omap_disable_channel_irq(int lch
)
71 /* disable channel interrupts */
72 p
->dma_write(0, CICR
, lch
);
74 p
->dma_read(CSR
, lch
);
77 static inline void set_gdma_dev(int req
, int dev
)
79 u32 reg
= OMAP_FUNC_MUX_ARM_BASE
+ ((req
- 1) / 5) * 4;
80 int shift
= ((req
- 1) % 5) * 6;
84 l
&= ~(0x3f << shift
);
85 l
|= (dev
- 1) << shift
;
89 #if IS_ENABLED(CONFIG_FB_OMAP)
90 void omap_set_dma_priority(int lch
, int dst_port
, int priority
)
97 case OMAP_DMA_PORT_OCP_T1
: /* FFFECC00 */
98 reg
= OMAP_TC_OCPT1_PRIOR
;
100 case OMAP_DMA_PORT_OCP_T2
: /* FFFECCD0 */
101 reg
= OMAP_TC_OCPT2_PRIOR
;
103 case OMAP_DMA_PORT_EMIFF
: /* FFFECC08 */
104 reg
= OMAP_TC_EMIFF_PRIOR
;
106 case OMAP_DMA_PORT_EMIFS
: /* FFFECC04 */
107 reg
= OMAP_TC_EMIFS_PRIOR
;
115 l
|= (priority
& 0xf) << 8;
119 EXPORT_SYMBOL(omap_set_dma_priority
);
122 #if IS_ENABLED(CONFIG_USB_OMAP)
123 #ifdef CONFIG_ARCH_OMAP15XX
124 /* Returns 1 if the DMA module is in OMAP1510-compatible mode, 0 otherwise */
125 static int omap_dma_in_1510_mode(void)
127 return enable_1510_mode
;
130 #define omap_dma_in_1510_mode() 0
133 void omap_set_dma_transfer_params(int lch
, int data_type
, int elem_count
,
134 int frame_count
, int sync_mode
,
135 int dma_trigger
, int src_or_dst_synch
)
140 l
= p
->dma_read(CSDP
, lch
);
143 p
->dma_write(l
, CSDP
, lch
);
145 ccr
= p
->dma_read(CCR
, lch
);
147 if (sync_mode
== OMAP_DMA_SYNC_FRAME
)
149 p
->dma_write(ccr
, CCR
, lch
);
151 ccr
= p
->dma_read(CCR2
, lch
);
153 if (sync_mode
== OMAP_DMA_SYNC_BLOCK
)
155 p
->dma_write(ccr
, CCR2
, lch
);
156 p
->dma_write(elem_count
, CEN
, lch
);
157 p
->dma_write(frame_count
, CFN
, lch
);
159 EXPORT_SYMBOL(omap_set_dma_transfer_params
);
161 void omap_set_dma_channel_mode(int lch
, enum omap_dma_channel_mode mode
)
163 if (!dma_omap15xx()) {
166 l
= p
->dma_read(LCH_CTRL
, lch
);
169 p
->dma_write(l
, LCH_CTRL
, lch
);
172 EXPORT_SYMBOL(omap_set_dma_channel_mode
);
174 /* Note that src_port is only for omap1 */
175 void omap_set_dma_src_params(int lch
, int src_port
, int src_amode
,
176 unsigned long src_start
,
177 int src_ei
, int src_fi
)
182 w
= p
->dma_read(CSDP
, lch
);
185 p
->dma_write(w
, CSDP
, lch
);
187 l
= p
->dma_read(CCR
, lch
);
189 l
|= src_amode
<< 12;
190 p
->dma_write(l
, CCR
, lch
);
192 p
->dma_write(src_start
, CSSA
, lch
);
194 p
->dma_write(src_ei
, CSEI
, lch
);
195 p
->dma_write(src_fi
, CSFI
, lch
);
197 EXPORT_SYMBOL(omap_set_dma_src_params
);
199 void omap_set_dma_src_data_pack(int lch
, int enable
)
203 l
= p
->dma_read(CSDP
, lch
);
207 p
->dma_write(l
, CSDP
, lch
);
209 EXPORT_SYMBOL(omap_set_dma_src_data_pack
);
211 void omap_set_dma_src_burst_mode(int lch
, enum omap_dma_burst_mode burst_mode
)
213 unsigned int burst
= 0;
216 l
= p
->dma_read(CSDP
, lch
);
219 switch (burst_mode
) {
220 case OMAP_DMA_DATA_BURST_DIS
:
222 case OMAP_DMA_DATA_BURST_4
:
225 case OMAP_DMA_DATA_BURST_8
:
227 * not supported by current hardware on OMAP1
231 case OMAP_DMA_DATA_BURST_16
:
232 /* OMAP1 don't support burst 16 */
239 p
->dma_write(l
, CSDP
, lch
);
241 EXPORT_SYMBOL(omap_set_dma_src_burst_mode
);
243 /* Note that dest_port is only for OMAP1 */
244 void omap_set_dma_dest_params(int lch
, int dest_port
, int dest_amode
,
245 unsigned long dest_start
,
246 int dst_ei
, int dst_fi
)
250 l
= p
->dma_read(CSDP
, lch
);
253 p
->dma_write(l
, CSDP
, lch
);
255 l
= p
->dma_read(CCR
, lch
);
257 l
|= dest_amode
<< 14;
258 p
->dma_write(l
, CCR
, lch
);
260 p
->dma_write(dest_start
, CDSA
, lch
);
262 p
->dma_write(dst_ei
, CDEI
, lch
);
263 p
->dma_write(dst_fi
, CDFI
, lch
);
265 EXPORT_SYMBOL(omap_set_dma_dest_params
);
267 void omap_set_dma_dest_data_pack(int lch
, int enable
)
271 l
= p
->dma_read(CSDP
, lch
);
275 p
->dma_write(l
, CSDP
, lch
);
277 EXPORT_SYMBOL(omap_set_dma_dest_data_pack
);
279 void omap_set_dma_dest_burst_mode(int lch
, enum omap_dma_burst_mode burst_mode
)
281 unsigned int burst
= 0;
284 l
= p
->dma_read(CSDP
, lch
);
287 switch (burst_mode
) {
288 case OMAP_DMA_DATA_BURST_DIS
:
290 case OMAP_DMA_DATA_BURST_4
:
293 case OMAP_DMA_DATA_BURST_8
:
296 case OMAP_DMA_DATA_BURST_16
:
297 /* OMAP1 don't support burst 16 */
300 printk(KERN_ERR
"Invalid DMA burst mode\n");
305 p
->dma_write(l
, CSDP
, lch
);
307 EXPORT_SYMBOL(omap_set_dma_dest_burst_mode
);
309 static inline void omap_enable_channel_irq(int lch
)
312 p
->dma_read(CSR
, lch
);
314 /* Enable some nice interrupts. */
315 p
->dma_write(dma_chan
[lch
].enabled_irqs
, CICR
, lch
);
318 void omap_disable_dma_irq(int lch
, u16 bits
)
320 dma_chan
[lch
].enabled_irqs
&= ~bits
;
322 EXPORT_SYMBOL(omap_disable_dma_irq
);
324 static inline void enable_lnk(int lch
)
328 l
= p
->dma_read(CLNK_CTRL
, lch
);
332 /* Set the ENABLE_LNK bits */
333 if (dma_chan
[lch
].next_lch
!= -1)
334 l
= dma_chan
[lch
].next_lch
| (1 << 15);
336 p
->dma_write(l
, CLNK_CTRL
, lch
);
339 static inline void disable_lnk(int lch
)
343 l
= p
->dma_read(CLNK_CTRL
, lch
);
345 /* Disable interrupts */
346 omap_disable_channel_irq(lch
);
348 /* Set the STOP_LNK bit */
351 p
->dma_write(l
, CLNK_CTRL
, lch
);
352 dma_chan
[lch
].flags
&= ~OMAP_DMA_ACTIVE
;
356 int omap_request_dma(int dev_id
, const char *dev_name
,
357 void (*callback
)(int lch
, u16 ch_status
, void *data
),
358 void *data
, int *dma_ch_out
)
360 int ch
, free_ch
= -1;
362 struct omap_dma_lch
*chan
;
364 WARN(strcmp(dev_name
, "DMA engine"), "Using deprecated platform DMA API - please update to DMA engine");
366 spin_lock_irqsave(&dma_chan_lock
, flags
);
367 for (ch
= 0; ch
< dma_chan_count
; ch
++) {
368 if (free_ch
== -1 && dma_chan
[ch
].dev_id
== -1) {
370 /* Exit after first free channel found */
375 spin_unlock_irqrestore(&dma_chan_lock
, flags
);
378 chan
= dma_chan
+ free_ch
;
379 chan
->dev_id
= dev_id
;
381 if (p
->clear_lch_regs
)
382 p
->clear_lch_regs(free_ch
);
384 spin_unlock_irqrestore(&dma_chan_lock
, flags
);
386 chan
->dev_name
= dev_name
;
387 chan
->callback
= callback
;
391 chan
->enabled_irqs
= OMAP_DMA_DROP_IRQ
| OMAP_DMA_BLOCK_IRQ
;
393 chan
->enabled_irqs
|= OMAP1_DMA_TOUT_IRQ
;
395 if (dma_omap16xx()) {
396 /* If the sync device is set, configure it dynamically. */
398 set_gdma_dev(free_ch
+ 1, dev_id
);
399 dev_id
= free_ch
+ 1;
402 * Disable the 1510 compatibility mode and set the sync device
405 p
->dma_write(dev_id
| (1 << 10), CCR
, free_ch
);
407 p
->dma_write(dev_id
, CCR
, free_ch
);
410 *dma_ch_out
= free_ch
;
414 EXPORT_SYMBOL(omap_request_dma
);
416 void omap_free_dma(int lch
)
420 if (dma_chan
[lch
].dev_id
== -1) {
421 pr_err("omap_dma: trying to free unallocated DMA channel %d\n",
426 /* Disable all DMA interrupts for the channel. */
427 omap_disable_channel_irq(lch
);
429 /* Make sure the DMA transfer is stopped. */
430 p
->dma_write(0, CCR
, lch
);
432 spin_lock_irqsave(&dma_chan_lock
, flags
);
433 dma_chan
[lch
].dev_id
= -1;
434 dma_chan
[lch
].next_lch
= -1;
435 dma_chan
[lch
].callback
= NULL
;
436 spin_unlock_irqrestore(&dma_chan_lock
, flags
);
438 EXPORT_SYMBOL(omap_free_dma
);
441 * Clears any DMA state so the DMA engine is ready to restart with new buffers
442 * through omap_start_dma(). Any buffers in flight are discarded.
444 static void omap_clear_dma(int lch
)
448 local_irq_save(flags
);
450 local_irq_restore(flags
);
453 #if IS_ENABLED(CONFIG_USB_OMAP)
454 void omap_start_dma(int lch
)
459 * The CPC/CDAC register needs to be initialized to zero
460 * before starting dma transfer.
463 p
->dma_write(0, CPC
, lch
);
465 p
->dma_write(0, CDAC
, lch
);
467 if (!omap_dma_in_1510_mode() && dma_chan
[lch
].next_lch
!= -1) {
468 int next_lch
, cur_lch
;
469 char dma_chan_link_map
[MAX_LOGICAL_DMA_CH_COUNT
];
471 /* Set the link register of the first channel */
474 memset(dma_chan_link_map
, 0, sizeof(dma_chan_link_map
));
475 dma_chan_link_map
[lch
] = 1;
477 cur_lch
= dma_chan
[lch
].next_lch
;
479 next_lch
= dma_chan
[cur_lch
].next_lch
;
481 /* The loop case: we've been here already */
482 if (dma_chan_link_map
[cur_lch
])
484 /* Mark the current channel */
485 dma_chan_link_map
[cur_lch
] = 1;
488 omap_enable_channel_irq(cur_lch
);
491 } while (next_lch
!= -1);
492 } else if (IS_DMA_ERRATA(DMA_ERRATA_PARALLEL_CHANNELS
))
493 p
->dma_write(lch
, CLNK_CTRL
, lch
);
495 omap_enable_channel_irq(lch
);
497 l
= p
->dma_read(CCR
, lch
);
499 if (IS_DMA_ERRATA(DMA_ERRATA_IFRAME_BUFFERING
))
500 l
|= OMAP_DMA_CCR_BUFFERING_DISABLE
;
501 l
|= OMAP_DMA_CCR_EN
;
504 * As dma_write() uses IO accessors which are weakly ordered, there
505 * is no guarantee that data in coherent DMA memory will be visible
506 * to the DMA device. Add a memory barrier here to ensure that any
507 * such data is visible prior to enabling DMA.
510 p
->dma_write(l
, CCR
, lch
);
512 dma_chan
[lch
].flags
|= OMAP_DMA_ACTIVE
;
514 EXPORT_SYMBOL(omap_start_dma
);
516 void omap_stop_dma(int lch
)
520 /* Disable all interrupts on the channel */
521 omap_disable_channel_irq(lch
);
523 l
= p
->dma_read(CCR
, lch
);
524 if (IS_DMA_ERRATA(DMA_ERRATA_i541
) &&
525 (l
& OMAP_DMA_CCR_SEL_SRC_DST_SYNC
)) {
529 /* Configure No-Standby */
530 l
= p
->dma_read(OCP_SYSCONFIG
, lch
);
532 l
&= ~DMA_SYSCONFIG_MIDLEMODE_MASK
;
533 l
|= DMA_SYSCONFIG_MIDLEMODE(DMA_IDLEMODE_NO_IDLE
);
534 p
->dma_write(l
, OCP_SYSCONFIG
, 0);
536 l
= p
->dma_read(CCR
, lch
);
537 l
&= ~OMAP_DMA_CCR_EN
;
538 p
->dma_write(l
, CCR
, lch
);
540 /* Wait for sDMA FIFO drain */
541 l
= p
->dma_read(CCR
, lch
);
542 while (i
< 100 && (l
& (OMAP_DMA_CCR_RD_ACTIVE
|
543 OMAP_DMA_CCR_WR_ACTIVE
))) {
546 l
= p
->dma_read(CCR
, lch
);
549 pr_err("DMA drain did not complete on lch %d\n", lch
);
550 /* Restore OCP_SYSCONFIG */
551 p
->dma_write(sys_cf
, OCP_SYSCONFIG
, lch
);
553 l
&= ~OMAP_DMA_CCR_EN
;
554 p
->dma_write(l
, CCR
, lch
);
558 * Ensure that data transferred by DMA is visible to any access
559 * after DMA has been disabled. This is important for coherent
564 if (!omap_dma_in_1510_mode() && dma_chan
[lch
].next_lch
!= -1) {
565 int next_lch
, cur_lch
= lch
;
566 char dma_chan_link_map
[MAX_LOGICAL_DMA_CH_COUNT
];
568 memset(dma_chan_link_map
, 0, sizeof(dma_chan_link_map
));
570 /* The loop case: we've been here already */
571 if (dma_chan_link_map
[cur_lch
])
573 /* Mark the current channel */
574 dma_chan_link_map
[cur_lch
] = 1;
576 disable_lnk(cur_lch
);
578 next_lch
= dma_chan
[cur_lch
].next_lch
;
580 } while (next_lch
!= -1);
583 dma_chan
[lch
].flags
&= ~OMAP_DMA_ACTIVE
;
585 EXPORT_SYMBOL(omap_stop_dma
);
588 * Allows changing the DMA callback function or data. This may be needed if
589 * the driver shares a single DMA channel for multiple dma triggers.
592 * Returns current physical source address for the given DMA channel.
593 * If the channel is running the caller must disable interrupts prior calling
594 * this function and process the returned value before re-enabling interrupt to
595 * prevent races with the interrupt handler. Note that in continuous mode there
596 * is a chance for CSSA_L register overflow between the two reads resulting
597 * in incorrect return value.
599 dma_addr_t
omap_get_dma_src_pos(int lch
)
601 dma_addr_t offset
= 0;
604 offset
= p
->dma_read(CPC
, lch
);
606 offset
= p
->dma_read(CSAC
, lch
);
608 if (IS_DMA_ERRATA(DMA_ERRATA_3_3
) && offset
== 0)
609 offset
= p
->dma_read(CSAC
, lch
);
611 if (!dma_omap15xx()) {
613 * CDAC == 0 indicates that the DMA transfer on the channel has
614 * not been started (no data has been transferred so far).
615 * Return the programmed source start address in this case.
617 if (likely(p
->dma_read(CDAC
, lch
)))
618 offset
= p
->dma_read(CSAC
, lch
);
620 offset
= p
->dma_read(CSSA
, lch
);
623 offset
|= (p
->dma_read(CSSA
, lch
) & 0xFFFF0000);
627 EXPORT_SYMBOL(omap_get_dma_src_pos
);
630 * Returns current physical destination address for the given DMA channel.
631 * If the channel is running the caller must disable interrupts prior calling
632 * this function and process the returned value before re-enabling interrupt to
633 * prevent races with the interrupt handler. Note that in continuous mode there
634 * is a chance for CDSA_L register overflow between the two reads resulting
635 * in incorrect return value.
637 dma_addr_t
omap_get_dma_dst_pos(int lch
)
639 dma_addr_t offset
= 0;
642 offset
= p
->dma_read(CPC
, lch
);
644 offset
= p
->dma_read(CDAC
, lch
);
647 * omap 3.2/3.3 erratum: sometimes 0 is returned if CSAC/CDAC is
648 * read before the DMA controller finished disabling the channel.
650 if (!dma_omap15xx() && offset
== 0) {
651 offset
= p
->dma_read(CDAC
, lch
);
653 * CDAC == 0 indicates that the DMA transfer on the channel has
654 * not been started (no data has been transferred so far).
655 * Return the programmed destination start address in this case.
657 if (unlikely(!offset
))
658 offset
= p
->dma_read(CDSA
, lch
);
661 offset
|= (p
->dma_read(CDSA
, lch
) & 0xFFFF0000);
665 EXPORT_SYMBOL(omap_get_dma_dst_pos
);
667 int omap_get_dma_active_status(int lch
)
669 return (p
->dma_read(CCR
, lch
) & OMAP_DMA_CCR_EN
) != 0;
671 EXPORT_SYMBOL(omap_get_dma_active_status
);
674 int omap_dma_running(void)
678 if (omap_lcd_dma_running())
681 for (lch
= 0; lch
< dma_chan_count
; lch
++)
682 if (p
->dma_read(CCR
, lch
) & OMAP_DMA_CCR_EN
)
688 /*----------------------------------------------------------------------------*/
690 static int omap1_dma_handle_ch(int ch
)
694 if (enable_1510_mode
&& ch
>= 6) {
695 csr
= dma_chan
[ch
].saved_csr
;
696 dma_chan
[ch
].saved_csr
= 0;
698 csr
= p
->dma_read(CSR
, ch
);
699 if (enable_1510_mode
&& ch
<= 2 && (csr
>> 7) != 0) {
700 dma_chan
[ch
+ 6].saved_csr
= csr
>> 7;
703 if ((csr
& 0x3f) == 0)
705 if (unlikely(dma_chan
[ch
].dev_id
== -1)) {
706 pr_warn("Spurious interrupt from DMA channel %d (CSR %04x)\n",
710 if (unlikely(csr
& OMAP1_DMA_TOUT_IRQ
))
711 pr_warn("DMA timeout with device %d\n", dma_chan
[ch
].dev_id
);
712 if (unlikely(csr
& OMAP_DMA_DROP_IRQ
))
713 pr_warn("DMA synchronization event drop occurred with device %d\n",
714 dma_chan
[ch
].dev_id
);
715 if (likely(csr
& OMAP_DMA_BLOCK_IRQ
))
716 dma_chan
[ch
].flags
&= ~OMAP_DMA_ACTIVE
;
717 if (likely(dma_chan
[ch
].callback
!= NULL
))
718 dma_chan
[ch
].callback(ch
, csr
, dma_chan
[ch
].data
);
723 static irqreturn_t
omap1_dma_irq_handler(int irq
, void *dev_id
)
725 int ch
= ((int) dev_id
) - 1;
731 handled_now
+= omap1_dma_handle_ch(ch
);
732 if (enable_1510_mode
&& dma_chan
[ch
+ 6].saved_csr
)
733 handled_now
+= omap1_dma_handle_ch(ch
+ 6);
736 handled
+= handled_now
;
739 return handled
? IRQ_HANDLED
: IRQ_NONE
;
742 struct omap_system_dma_plat_info
*omap_get_plat_info(void)
746 EXPORT_SYMBOL_GPL(omap_get_plat_info
);
748 static int omap_system_dma_probe(struct platform_device
*pdev
)
754 p
= pdev
->dev
.platform_data
;
757 "%s: System DMA initialized without platform data\n",
765 if ((d
->dev_caps
& RESERVE_CHANNEL
) && omap_dma_reserve_channels
766 && (omap_dma_reserve_channels
< d
->lch_count
))
767 d
->lch_count
= omap_dma_reserve_channels
;
769 dma_lch_count
= d
->lch_count
;
770 dma_chan_count
= dma_lch_count
;
771 enable_1510_mode
= d
->dev_caps
& ENABLE_1510_MODE
;
773 dma_chan
= devm_kcalloc(&pdev
->dev
, dma_lch_count
,
774 sizeof(*dma_chan
), GFP_KERNEL
);
778 for (ch
= 0; ch
< dma_chan_count
; ch
++) {
781 dma_chan
[ch
].dev_id
= -1;
782 dma_chan
[ch
].next_lch
= -1;
784 if (ch
>= 6 && enable_1510_mode
)
788 * request_irq() doesn't like dev_id (ie. ch) being
789 * zero, so we have to kludge around this.
791 sprintf(&irq_name
[0], "%d", ch
);
792 dma_irq
= platform_get_irq_byname(pdev
, irq_name
);
796 goto exit_dma_irq_fail
;
799 /* INT_DMA_LCD is handled in lcd_dma.c */
800 if (dma_irq
== INT_DMA_LCD
)
803 ret
= request_irq(dma_irq
,
804 omap1_dma_irq_handler
, 0, "DMA",
807 goto exit_dma_irq_fail
;
810 /* reserve dma channels 0 and 1 in high security devices on 34xx */
811 if (d
->dev_caps
& HS_CHANNELS_RESERVED
) {
812 pr_info("Reserving DMA channels 0 and 1 for HS ROM code\n");
813 dma_chan
[0].dev_id
= 0;
814 dma_chan
[1].dev_id
= 1;
823 static void omap_system_dma_remove(struct platform_device
*pdev
)
825 int dma_irq
, irq_rel
= 0;
827 for ( ; irq_rel
< dma_chan_count
; irq_rel
++) {
828 dma_irq
= platform_get_irq(pdev
, irq_rel
);
829 free_irq(dma_irq
, (void *)(irq_rel
+ 1));
833 static struct platform_driver omap_system_dma_driver
= {
834 .probe
= omap_system_dma_probe
,
835 .remove
= omap_system_dma_remove
,
837 .name
= "omap_dma_system"
841 static int __init
omap_system_dma_init(void)
843 return platform_driver_register(&omap_system_dma_driver
);
845 arch_initcall(omap_system_dma_init
);
847 static void __exit
omap_system_dma_exit(void)
849 platform_driver_unregister(&omap_system_dma_driver
);
852 MODULE_DESCRIPTION("OMAP SYSTEM DMA DRIVER");
853 MODULE_LICENSE("GPL");
854 MODULE_AUTHOR("Texas Instruments Inc");
857 * Reserve the omap SDMA channels using cmdline bootarg
858 * "omap_dma_reserve_ch=". The valid range is 1 to 32
860 static int __init
omap_dma_cmdline_reserve_ch(char *str
)
862 if (get_option(&str
, &omap_dma_reserve_channels
) != 1)
863 omap_dma_reserve_channels
= 0;
867 __setup("omap_dma_reserve_ch=", omap_dma_cmdline_reserve_ch
);