···11/*22 * linux/arch/arm/plat-omap/dma.c33 *44- * Copyright (C) 2003 Nokia Corporation44+ * Copyright (C) 2003 - 2008 Nokia Corporation55 * Author: Juha Yrjölä <juha.yrjola@nokia.com>66 * DMA channel linking for 1610 by Samuel Ortiz <samuel.ortiz@nokia.com>77 * Graphics DMA and LCD DMA graphics tranformations···2525#include <linux/errno.h>2626#include <linux/interrupt.h>2727#include <linux/irq.h>2828+#include <linux/io.h>28292930#include <asm/system.h>3031#include <asm/hardware.h>3132#include <asm/dma.h>3232-#include <asm/io.h>33333434#include <asm/arch/tc.h>3535···4343enum { DMA_CHAIN_STARTED, DMA_CHAIN_NOTSTARTED };4444#endif45454646-#define OMAP_DMA_ACTIVE 0x014747-#define OMAP_DMA_CCR_EN (1 << 7)4646+#define OMAP_DMA_ACTIVE 0x014747+#define OMAP_DMA_CCR_EN (1 << 7)4848#define OMAP2_DMA_CSR_CLEAR_MASK 0xffe49495050-#define OMAP_FUNC_MUX_ARM_BASE (0xfffe1000 + 0xec)5050+#define OMAP_FUNC_MUX_ARM_BASE (0xfffe1000 + 0xec)51515252-static int enable_1510_mode = 0;5252+static int enable_1510_mode;53535454struct omap_dma_lch {5555 int next_lch;···5757 u16 saved_csr;5858 u16 enabled_irqs;5959 const char *dev_name;6060- void (* callback)(int lch, u16 ch_status, void *data);6060+ void (*callback)(int lch, u16 ch_status, void *data);6161 void *data;62626363#ifndef CONFIG_ARCH_OMAP1···245245 dma_write(ccr, CCR(lch));246246 }247247}248248+EXPORT_SYMBOL(omap_set_dma_priority);248249249250void omap_set_dma_transfer_params(int lch, int data_type, int elem_count,250251 int frame_count, int sync_mode,···308307 dma_write(elem_count, CEN(lch));309308 dma_write(frame_count, CFN(lch));310309}310310+EXPORT_SYMBOL(omap_set_dma_transfer_params);311311312312void omap_set_dma_color_mode(int lch, enum omap_dma_color_mode mode, u32 color)313313{···348346 }349347 dma_write(w, LCH_CTRL(lch));350348}349349+EXPORT_SYMBOL(omap_set_dma_color_mode);351350352351void omap_set_dma_write_mode(int lch, enum omap_dma_write_mode mode)353352{···361358 dma_write(csdp, CSDP(lch));362359 }363360}361361+EXPORT_SYMBOL(omap_set_dma_write_mode);364362365363void omap_set_dma_channel_mode(int lch, enum omap_dma_channel_mode mode)366364{···381377 unsigned long src_start,382378 int src_ei, int src_fi)383379{380380+ u32 l;381381+384382 if (cpu_class_is_omap1()) {385383 u16 w;386384···390384 w &= ~(0x1f << 2);391385 w |= src_port << 2;392386 dma_write(w, CSDP(lch));387387+ }393388394394- w = dma_read(CCR(lch));395395- w &= ~(0x03 << 12);396396- w |= src_amode << 12;397397- dma_write(w, CCR(lch));389389+ l = dma_read(CCR(lch));390390+ l &= ~(0x03 << 12);391391+ l |= src_amode << 12;392392+ dma_write(l, CCR(lch));398393394394+ if (cpu_class_is_omap1()) {399395 dma_write(src_start >> 16, CSSA_U(lch));400396 dma_write((u16)src_start, CSSA_L(lch));401401-402402- dma_write(src_ei, CSEI(lch));403403- dma_write(src_fi, CSFI(lch));404397 }405398406406- if (cpu_class_is_omap2()) {407407- u32 l;408408-409409- l = dma_read(CCR(lch));410410- l &= ~(0x03 << 12);411411- l |= src_amode << 12;412412- dma_write(l, CCR(lch));413413-399399+ if (cpu_class_is_omap2())414400 dma_write(src_start, CSSA(lch));415415- dma_write(src_ei, CSEI(lch));416416- dma_write(src_fi, CSFI(lch));417417- }418418-}419401420420-void omap_set_dma_params(int lch, struct omap_dma_channel_params * params)402402+ dma_write(src_ei, CSEI(lch));403403+ dma_write(src_fi, CSFI(lch));404404+}405405+EXPORT_SYMBOL(omap_set_dma_src_params);406406+407407+void omap_set_dma_params(int lch, struct omap_dma_channel_params *params)421408{422409 omap_set_dma_transfer_params(lch, params->data_type,423410 params->elem_count, params->frame_count,···427428 omap_dma_set_prio_lch(lch, params->read_prio,428429 params->write_prio);429430}431431+EXPORT_SYMBOL(omap_set_dma_params);430432431433void omap_set_dma_src_index(int lch, int eidx, int fidx)432434{433433- if (cpu_class_is_omap2()) {434434- REVISIT_24XX();435435+ if (cpu_class_is_omap2())435436 return;436436- }437437+437438 dma_write(eidx, CSEI(lch));438439 dma_write(fidx, CSFI(lch));439440}441441+EXPORT_SYMBOL(omap_set_dma_src_index);440442441443void omap_set_dma_src_data_pack(int lch, int enable)442444{···449449 l |= (1 << 6);450450 dma_write(l, CSDP(lch));451451}452452+EXPORT_SYMBOL(omap_set_dma_src_data_pack);452453453454void omap_set_dma_src_burst_mode(int lch, enum omap_dma_burst_mode burst_mode)454455{···492491 l |= (burst << 7);493492 dma_write(l, CSDP(lch));494493}494494+EXPORT_SYMBOL(omap_set_dma_src_burst_mode);495495496496/* Note that dest_port is only for OMAP1 */497497void omap_set_dma_dest_params(int lch, int dest_port, int dest_amode,···524522 dma_write(dst_ei, CDEI(lch));525523 dma_write(dst_fi, CDFI(lch));526524}525525+EXPORT_SYMBOL(omap_set_dma_dest_params);527526528527void omap_set_dma_dest_index(int lch, int eidx, int fidx)529528{530530- if (cpu_class_is_omap2()) {531531- REVISIT_24XX();529529+ if (cpu_class_is_omap2())532530 return;533533- }531531+534532 dma_write(eidx, CDEI(lch));535533 dma_write(fidx, CDFI(lch));536534}535535+EXPORT_SYMBOL(omap_set_dma_dest_index);537536538537void omap_set_dma_dest_data_pack(int lch, int enable)539538{···546543 l |= 1 << 13;547544 dma_write(l, CSDP(lch));548545}546546+EXPORT_SYMBOL(omap_set_dma_dest_data_pack);549547550548void omap_set_dma_dest_burst_mode(int lch, enum omap_dma_burst_mode burst_mode)551549{···587583 l |= (burst << 14);588584 dma_write(l, CSDP(lch));589585}586586+EXPORT_SYMBOL(omap_set_dma_dest_burst_mode);590587591588static inline void omap_enable_channel_irq(int lch)592589{···613608{614609 dma_chan[lch].enabled_irqs |= bits;615610}611611+EXPORT_SYMBOL(omap_enable_dma_irq);616612617613void omap_disable_dma_irq(int lch, u16 bits)618614{619615 dma_chan[lch].enabled_irqs &= ~bits;620616}617617+EXPORT_SYMBOL(omap_disable_dma_irq);621618622619static inline void enable_lnk(int lch)623620{···635628 l = dma_chan[lch].next_lch | (1 << 15);636629637630#ifndef CONFIG_ARCH_OMAP1638638- if (dma_chan[lch].next_linked_ch != -1)639639- l = dma_chan[lch].next_linked_ch | (1 << 15);631631+ if (cpu_class_is_omap2())632632+ if (dma_chan[lch].next_linked_ch != -1)633633+ l = dma_chan[lch].next_linked_ch | (1 << 15);640634#endif641635642636 dma_write(l, CLNK_CTRL(lch));···679671}680672681673int omap_request_dma(int dev_id, const char *dev_name,682682- void (* callback)(int lch, u16 ch_status, void *data),674674+ void (*callback)(int lch, u16 ch_status, void *data),683675 void *data, int *dma_ch_out)684676{685677 int ch, free_ch = -1;···712704 chan->dev_name = dev_name;713705 chan->callback = callback;714706 chan->data = data;707707+715708#ifndef CONFIG_ARCH_OMAP1716716- chan->chain_id = -1;717717- chan->next_linked_ch = -1;709709+ if (cpu_class_is_omap2()) {710710+ chan->chain_id = -1;711711+ chan->next_linked_ch = -1;712712+ }718713#endif714714+719715 chan->enabled_irqs = OMAP_DMA_DROP_IRQ | OMAP_DMA_BLOCK_IRQ;720716721717 if (cpu_class_is_omap1())···734722 set_gdma_dev(free_ch + 1, dev_id);735723 dev_id = free_ch + 1;736724 }737737- /* Disable the 1510 compatibility mode and set the sync device738738- * id. */725725+ /*726726+ * Disable the 1510 compatibility mode and set the sync device727727+ * id.728728+ */739729 dma_write(dev_id | (1 << 10), CCR(free_ch));740730 } else if (cpu_is_omap730() || cpu_is_omap15xx()) {741731 dma_write(dev_id, CCR(free_ch));···745731746732 if (cpu_class_is_omap2()) {747733 omap2_enable_irq_lch(free_ch);748748-749734 omap_enable_channel_irq(free_ch);750735 /* Clear the CSR register and IRQ status register */751736 dma_write(OMAP2_DMA_CSR_CLEAR_MASK, CSR(free_ch));···755742756743 return 0;757744}745745+EXPORT_SYMBOL(omap_request_dma);758746759747void omap_free_dma(int lch)760748{···763749764750 spin_lock_irqsave(&dma_chan_lock, flags);765751 if (dma_chan[lch].dev_id == -1) {766766- printk("omap_dma: trying to free nonallocated DMA channel %d\n",752752+ pr_err("omap_dma: trying to free unallocated DMA channel %d\n",767753 lch);768754 spin_unlock_irqrestore(&dma_chan_lock, flags);769755 return;770756 }757757+771758 dma_chan[lch].dev_id = -1;772759 dma_chan[lch].next_lch = -1;773760 dma_chan[lch].callback = NULL;···800785 omap_clear_dma(lch);801786 }802787}788788+EXPORT_SYMBOL(omap_free_dma);803789804790/**805791 * @brief omap_dma_set_global_params : Set global priority settings for dma···894878895879 local_irq_restore(flags);896880}881881+EXPORT_SYMBOL(omap_clear_dma);897882898883void omap_start_dma(int lch)899884{···933916934917 l = dma_read(CCR(lch));935918936936- /* Errata: On ES2.0 BUFFERING disable must be set.937937- * This will always fail on ES1.0 */919919+ /*920920+ * Errata: On ES2.0 BUFFERING disable must be set.921921+ * This will always fail on ES1.0922922+ */938923 if (cpu_is_omap24xx())939924 l |= OMAP_DMA_CCR_EN;940925···945926946927 dma_chan[lch].flags |= OMAP_DMA_ACTIVE;947928}929929+EXPORT_SYMBOL(omap_start_dma);948930949931void omap_stop_dma(int lch)950932{···982962983963 dma_chan[lch].flags &= ~OMAP_DMA_ACTIVE;984964}965965+EXPORT_SYMBOL(omap_stop_dma);985966986967/*987968 * Allows changing the DMA callback function or data. This may be needed if988969 * the driver shares a single DMA channel for multiple dma triggers.989970 */990971int omap_set_dma_callback(int lch,991991- void (* callback)(int lch, u16 ch_status, void *data),972972+ void (*callback)(int lch, u16 ch_status, void *data),992973 void *data)993974{994975 unsigned long flags;···10099881010989 return 0;1011990}991991+EXPORT_SYMBOL(omap_set_dma_callback);10129921013993/*1014994 * Returns current physical source address for the given DMA channel.···1040101810411019 return offset;10421020}10211021+EXPORT_SYMBOL(omap_get_dma_src_pos);1043102210441023/*10451024 * Returns current physical destination address for the given DMA channel.···1071104810721049 return offset;10731050}10741074-10751075-/*10761076- * Returns current source transfer counting for the given DMA channel.10771077- * Can be used to monitor the progress of a transfer inside a block.10781078- * It must be called with disabled interrupts.10791079- */10801080-int omap_get_dma_src_addr_counter(int lch)10811081-{10821082- return (dma_addr_t)dma_read(CSAC(lch));10831083-}10511051+EXPORT_SYMBOL(omap_get_dma_dst_pos);1084105210851053int omap_get_dma_active_status(int lch)10861054{···11001086 * For this DMA link to start, you still need to start (see omap_start_dma)11011087 * the first one. That will fire up the entire queue.11021088 */11031103-void omap_dma_link_lch (int lch_head, int lch_queue)10891089+void omap_dma_link_lch(int lch_head, int lch_queue)11041090{11051091 if (omap_dma_in_1510_mode()) {11061092 printk(KERN_ERR "DMA linking is not supported in 1510 mode\n");···1117110311181104 dma_chan[lch_head].next_lch = lch_queue;11191105}11061106+EXPORT_SYMBOL(omap_dma_link_lch);1120110711211108/*11221109 * Once the DMA queue is stopped, we can destroy it.11231110 */11241124-void omap_dma_unlink_lch (int lch_head, int lch_queue)11111111+void omap_dma_unlink_lch(int lch_head, int lch_queue)11251112{11261113 if (omap_dma_in_1510_mode()) {11271114 printk(KERN_ERR "DMA linking is not supported in 1510 mode\n");···11371122 dump_stack();11381123 }1139112411401140-11411125 if ((dma_chan[lch_head].flags & OMAP_DMA_ACTIVE) ||11421126 (dma_chan[lch_head].flags & OMAP_DMA_ACTIVE)) {11431127 printk(KERN_ERR "omap_dma: You need to stop the DMA channels "···1146113211471133 dma_chan[lch_head].next_lch = -1;11481134}11351135+EXPORT_SYMBOL(omap_dma_unlink_lch);11361136+11371137+/*----------------------------------------------------------------------------*/1149113811501139#ifndef CONFIG_ARCH_OMAP111511140/* Create chain of DMA channesls */···12721255 for (i = 0; i < (no_of_chans - 1); i++)12731256 create_dma_lch_chain(channels[i], channels[i + 1]);12741257 }12581258+12751259 return 0;12761260}12771261EXPORT_SYMBOL(omap_request_dma_chain);···13151297 */13161298 omap_set_dma_params(channels[i], ¶ms);13171299 }13001300+13181301 return 0;13191302}13201303EXPORT_SYMBOL(omap_modify_dma_chain_params);···13591340 dma_linked_lch[chain_id].linked_dmach_q = NULL;13601341 dma_linked_lch[chain_id].chain_mode = -1;13611342 dma_linked_lch[chain_id].chain_state = -1;13431343+13621344 return (0);13631345}13641346EXPORT_SYMBOL(omap_free_dma_chain);···1390137013911371 if (OMAP_DMA_CHAIN_QEMPTY(chain_id))13921372 return OMAP_DMA_CHAIN_INACTIVE;13731373+13931374 return OMAP_DMA_CHAIN_ACTIVE;13941375}13951376EXPORT_SYMBOL(omap_dma_chain_status);···14161395 u32 l, lch;14171396 int start_dma = 0;1418139714191419- /* if buffer size is less than 1 then there is14201420- * no use of starting the chain */13981398+ /*13991399+ * if buffer size is less than 1 then there is14001400+ * no use of starting the chain14011401+ */14211402 if (elem_count < 1) {14221403 printk(KERN_ERR "Invalid buffer size\n");14231404 return -EINVAL;···14641441 dma_write(elem_count, CEN(lch));14651442 dma_write(frame_count, CFN(lch));1466144314671467- /* If the chain is dynamically linked,14681468- * then we may have to start the chain if its not active */14441444+ /*14451445+ * If the chain is dynamically linked,14461446+ * then we may have to start the chain if its not active14471447+ */14691448 if (dma_linked_lch[chain_id].chain_mode == OMAP_DMA_DYNAMIC_CHAIN) {1470144914711471- /* In Dynamic chain, if the chain is not started,14721472- * queue the channel */14501450+ /*14511451+ * In Dynamic chain, if the chain is not started,14521452+ * queue the channel14531453+ */14731454 if (dma_linked_lch[chain_id].chain_state ==14741455 DMA_CHAIN_NOTSTARTED) {14751456 /* Enable the link in previous channel */···14831456 dma_chan[lch].state = DMA_CH_QUEUED;14841457 }1485145814861486- /* Chain is already started, make sure its active,14871487- * if not then start the chain */14591459+ /*14601460+ * Chain is already started, make sure its active,14611461+ * if not then start the chain14621462+ */14881463 else {14891464 start_dma = 1;14901465···15331504 dma_chan[lch].flags |= OMAP_DMA_ACTIVE;15341505 }15351506 }15071507+15361508 return 0;15371509}15381510EXPORT_SYMBOL(omap_dma_chain_a_transfer);···15851555 dma_write(l, CCR(channels[0]));1586155615871557 dma_chan[channels[0]].flags |= OMAP_DMA_ACTIVE;15581558+15881559 return 0;15891560}15901561EXPORT_SYMBOL(omap_start_dma_chain_transfers);···16171586 }16181587 channels = dma_linked_lch[chain_id].linked_dmach_q;1619158816201620- /* DMA Errata:15891589+ /*15901590+ * DMA Errata:16211591 * Special programming model needed to disable DMA before end of block16221592 */16231593 sys_cf = dma_read(OCP_SYSCONFIG);···1646161416471615 /* Errata - put in the old value */16481616 dma_write(sys_cf, OCP_SYSCONFIG);16171617+16491618 return 0;16501619}16511620EXPORT_SYMBOL(omap_stop_dma_chain_transfers);···17621729 return dma_read(CSAC(lch));17631730}17641731EXPORT_SYMBOL(omap_get_dma_chain_src_pos);17651765-#endif17321732+#endif /* ifndef CONFIG_ARCH_OMAP1 */1766173317671734/*----------------------------------------------------------------------------*/17681735···17981765 dma_chan[ch].flags &= ~OMAP_DMA_ACTIVE;17991766 if (likely(dma_chan[ch].callback != NULL))18001767 dma_chan[ch].callback(ch, csr, dma_chan[ch].data);17681768+18011769 return 1;18021770}18031771···1833179918341800 if (!status) {18351801 if (printk_ratelimit())18361836- printk(KERN_WARNING "Spurious DMA IRQ for lch %d\n", ch);18021802+ printk(KERN_WARNING "Spurious DMA IRQ for lch %d\n",18031803+ ch);18371804 dma_write(1 << ch, IRQSTATUS_L0);18381805 return 0;18391806 }···19221887static struct lcd_dma_info {19231888 spinlock_t lock;19241889 int reserved;19251925- void (* callback)(u16 status, void *data);18901890+ void (*callback)(u16 status, void *data);19261891 void *cb_data;1927189219281893 int active;···19441909 lcd_dma.xres = fb_xres;19451910 lcd_dma.yres = fb_yres;19461911}19121912+EXPORT_SYMBOL(omap_set_lcd_dma_b1);1947191319481914void omap_set_lcd_dma_src_port(int port)19491915{···19551919{19561920 lcd_dma.ext_ctrl = external;19571921}19221922+EXPORT_SYMBOL(omap_set_lcd_dma_ext_controller);1958192319591924void omap_set_lcd_dma_single_transfer(int single)19601925{19611926 lcd_dma.single_transfer = single;19621927}19631963-19281928+EXPORT_SYMBOL(omap_set_lcd_dma_single_transfer);1964192919651930void omap_set_lcd_dma_b1_rotation(int rotate)19661931{···19721935 }19731936 lcd_dma.rotate = rotate;19741937}19381938+EXPORT_SYMBOL(omap_set_lcd_dma_b1_rotation);1975193919761940void omap_set_lcd_dma_b1_mirror(int mirror)19771941{···19821944 }19831945 lcd_dma.mirror = mirror;19841946}19471947+EXPORT_SYMBOL(omap_set_lcd_dma_b1_mirror);1985194819861949void omap_set_lcd_dma_b1_vxres(unsigned long vxres)19871950{···19931954 }19941955 lcd_dma.vxres = vxres;19951956}19571957+EXPORT_SYMBOL(omap_set_lcd_dma_b1_vxres);1996195819971959void omap_set_lcd_dma_b1_scale(unsigned int xscale, unsigned int yscale)19981960{···20041964 lcd_dma.xscale = xscale;20051965 lcd_dma.yscale = yscale;20061966}19671967+EXPORT_SYMBOL(omap_set_lcd_dma_b1_scale);2007196820081969static void set_b1_regs(void)20091970{···20351994 xscale = lcd_dma.xscale ? lcd_dma.xscale : 1;20361995 yscale = lcd_dma.yscale ? lcd_dma.yscale : 1;20371996 BUG_ON(vxres < lcd_dma.xres);20382038-#define PIXADDR(x,y) (lcd_dma.addr + ((y) * vxres * yscale + (x) * xscale) * es)19971997+19981998+#define PIXADDR(x, y) (lcd_dma.addr + \19991999+ ((y) * vxres * yscale + (x) * xscale) * es)20392000#define PIXSTEP(sx, sy, dx, dy) (PIXADDR(dx, dy) - PIXADDR(sx, sy) - es + 1)20012001+20402002 switch (lcd_dma.rotate) {20412003 case 0:20422004 if (!lcd_dma.mirror) {···20482004 /* 1510 DMA requires the bottom address to be 2 more20492005 * than the actual last memory access location. */20502006 if (omap_dma_in_1510_mode() &&20512051- lcd_dma.data_type == OMAP_DMA_DATA_TYPE_S32)20522052- bottom += 2;20072007+ lcd_dma.data_type == OMAP_DMA_DATA_TYPE_S32)20082008+ bottom += 2;20532009 ei = PIXSTEP(0, 0, 1, 0);20542010 fi = PIXSTEP(lcd_dma.xres - 1, 0, 0, 1);20552011 } else {···21762132 return IRQ_HANDLED;21772133}2178213421792179-int omap_request_lcd_dma(void (* callback)(u16 status, void *data),21352135+int omap_request_lcd_dma(void (*callback)(u16 status, void *data),21802136 void *data)21812137{21822138 spin_lock_irq(&lcd_dma.lock);···2202215822032159 return 0;22042160}21612161+EXPORT_SYMBOL(omap_request_lcd_dma);2205216222062163void omap_free_lcd_dma(void)22072164{···22192174 lcd_dma.reserved = 0;22202175 spin_unlock(&lcd_dma.lock);22212176}21772177+EXPORT_SYMBOL(omap_free_lcd_dma);2222217822232179void omap_enable_lcd_dma(void)22242180{22252181 u16 w;2226218222272227- /* Set the Enable bit only if an external controller is21832183+ /*21842184+ * Set the Enable bit only if an external controller is22282185 * connected. Otherwise the OMAP internal controller will22292186 * start the transfer when it gets enabled.22302187 */···22432196 w |= 1 << 7;22442197 omap_writew(w, OMAP1610_DMA_LCD_CCR);22452198}21992199+EXPORT_SYMBOL(omap_enable_lcd_dma);2246220022472201void omap_setup_lcd_dma(void)22482202{···22592211 u16 w;2260221222612213 w = omap_readw(OMAP1610_DMA_LCD_CCR);22622262- /* If DMA was already active set the end_prog bit to have22142214+ /*22152215+ * If DMA was already active set the end_prog bit to have22632216 * the programmed register set loaded into the active22642217 * register set.22652218 */22662219 w |= 1 << 11; /* End_prog */22672220 if (!lcd_dma.single_transfer)22682268- w |= (3 << 8); /* Auto_init, repeat */22212221+ w |= (3 << 8); /* Auto_init, repeat */22692222 omap_writew(w, OMAP1610_DMA_LCD_CCR);22702223 }22712224}22252225+EXPORT_SYMBOL(omap_setup_lcd_dma);2272222622732227void omap_stop_lcd_dma(void)22742228{···22882238 w &= ~(1 << 8);22892239 omap_writew(w, OMAP1610_DMA_LCD_CTRL);22902240}22412241+EXPORT_SYMBOL(omap_stop_lcd_dma);2291224222922243/*----------------------------------------------------------------------------*/22932244···23782327 continue;2379232823802329 if (cpu_class_is_omap1()) {23812381- /* request_irq() doesn't like dev_id (ie. ch) being23822382- * zero, so we have to kludge around this. */23302330+ /*23312331+ * request_irq() doesn't like dev_id (ie. ch) being23322332+ * zero, so we have to kludge around this.23332333+ */23832334 r = request_irq(omap1_dma_irq[ch],23842335 omap1_dma_irq_handler, 0, "DMA",23852336 (void *) (ch + 1));···2426237324272374arch_initcall(omap_init_dma);2428237524292429-EXPORT_SYMBOL(omap_get_dma_src_pos);24302430-EXPORT_SYMBOL(omap_get_dma_dst_pos);24312431-EXPORT_SYMBOL(omap_get_dma_src_addr_counter);24322432-EXPORT_SYMBOL(omap_clear_dma);24332433-EXPORT_SYMBOL(omap_set_dma_priority);24342434-EXPORT_SYMBOL(omap_request_dma);24352435-EXPORT_SYMBOL(omap_free_dma);24362436-EXPORT_SYMBOL(omap_start_dma);24372437-EXPORT_SYMBOL(omap_stop_dma);24382438-EXPORT_SYMBOL(omap_set_dma_callback);24392439-EXPORT_SYMBOL(omap_enable_dma_irq);24402440-EXPORT_SYMBOL(omap_disable_dma_irq);24412441-24422442-EXPORT_SYMBOL(omap_set_dma_transfer_params);24432443-EXPORT_SYMBOL(omap_set_dma_color_mode);24442444-EXPORT_SYMBOL(omap_set_dma_write_mode);24452445-24462446-EXPORT_SYMBOL(omap_set_dma_src_params);24472447-EXPORT_SYMBOL(omap_set_dma_src_index);24482448-EXPORT_SYMBOL(omap_set_dma_src_data_pack);24492449-EXPORT_SYMBOL(omap_set_dma_src_burst_mode);24502450-24512451-EXPORT_SYMBOL(omap_set_dma_dest_params);24522452-EXPORT_SYMBOL(omap_set_dma_dest_index);24532453-EXPORT_SYMBOL(omap_set_dma_dest_data_pack);24542454-EXPORT_SYMBOL(omap_set_dma_dest_burst_mode);24552455-24562456-EXPORT_SYMBOL(omap_set_dma_params);24572457-24582458-EXPORT_SYMBOL(omap_dma_link_lch);24592459-EXPORT_SYMBOL(omap_dma_unlink_lch);24602460-24612461-EXPORT_SYMBOL(omap_request_lcd_dma);24622462-EXPORT_SYMBOL(omap_free_lcd_dma);24632463-EXPORT_SYMBOL(omap_enable_lcd_dma);24642464-EXPORT_SYMBOL(omap_setup_lcd_dma);24652465-EXPORT_SYMBOL(omap_stop_lcd_dma);24662466-EXPORT_SYMBOL(omap_set_lcd_dma_b1);24672467-EXPORT_SYMBOL(omap_set_lcd_dma_single_transfer);24682468-EXPORT_SYMBOL(omap_set_lcd_dma_ext_controller);24692469-EXPORT_SYMBOL(omap_set_lcd_dma_b1_rotation);24702470-EXPORT_SYMBOL(omap_set_lcd_dma_b1_vxres);24712471-EXPORT_SYMBOL(omap_set_lcd_dma_b1_scale);24722472-EXPORT_SYMBOL(omap_set_lcd_dma_b1_mirror);24732376