diff options
Diffstat (limited to 'arch/arm/plat-mxc/dma-mx1-mx2.c')
-rw-r--r-- | arch/arm/plat-mxc/dma-mx1-mx2.c | 207 |
1 files changed, 117 insertions, 90 deletions
diff --git a/arch/arm/plat-mxc/dma-mx1-mx2.c b/arch/arm/plat-mxc/dma-mx1-mx2.c index 9c1b3f9c4f4d..e16014b0d13c 100644 --- a/arch/arm/plat-mxc/dma-mx1-mx2.c +++ b/arch/arm/plat-mxc/dma-mx1-mx2.c | |||
@@ -128,6 +128,18 @@ struct imx_dma_channel { | |||
128 | int hw_chaining; | 128 | int hw_chaining; |
129 | }; | 129 | }; |
130 | 130 | ||
131 | static void __iomem *imx_dmav1_baseaddr; | ||
132 | |||
133 | static void imx_dmav1_writel(unsigned val, unsigned offset) | ||
134 | { | ||
135 | __raw_writel(val, imx_dmav1_baseaddr + offset); | ||
136 | } | ||
137 | |||
138 | static unsigned imx_dmav1_readl(unsigned offset) | ||
139 | { | ||
140 | return __raw_readl(imx_dmav1_baseaddr + offset); | ||
141 | } | ||
142 | |||
131 | static struct imx_dma_channel imx_dma_channels[IMX_DMA_CHANNELS]; | 143 | static struct imx_dma_channel imx_dma_channels[IMX_DMA_CHANNELS]; |
132 | 144 | ||
133 | static struct clk *dma_clk; | 145 | static struct clk *dma_clk; |
@@ -140,7 +152,6 @@ static int imx_dma_hw_chain(struct imx_dma_channel *imxdma) | |||
140 | return 0; | 152 | return 0; |
141 | } | 153 | } |
142 | 154 | ||
143 | |||
144 | /* | 155 | /* |
145 | * imx_dma_sg_next - prepare next chunk for scatter-gather DMA emulation | 156 | * imx_dma_sg_next - prepare next chunk for scatter-gather DMA emulation |
146 | */ | 157 | */ |
@@ -160,17 +171,17 @@ static inline int imx_dma_sg_next(int channel, struct scatterlist *sg) | |||
160 | imxdma->resbytes -= now; | 171 | imxdma->resbytes -= now; |
161 | 172 | ||
162 | if ((imxdma->dma_mode & DMA_MODE_MASK) == DMA_MODE_READ) | 173 | if ((imxdma->dma_mode & DMA_MODE_MASK) == DMA_MODE_READ) |
163 | __raw_writel(sg->dma_address, DMA_BASE + DMA_DAR(channel)); | 174 | imx_dmav1_writel(sg->dma_address, DMA_DAR(channel)); |
164 | else | 175 | else |
165 | __raw_writel(sg->dma_address, DMA_BASE + DMA_SAR(channel)); | 176 | imx_dmav1_writel(sg->dma_address, DMA_SAR(channel)); |
166 | 177 | ||
167 | __raw_writel(now, DMA_BASE + DMA_CNTR(channel)); | 178 | imx_dmav1_writel(now, DMA_CNTR(channel)); |
168 | 179 | ||
169 | pr_debug("imxdma%d: next sg chunk dst 0x%08x, src 0x%08x, " | 180 | pr_debug("imxdma%d: next sg chunk dst 0x%08x, src 0x%08x, " |
170 | "size 0x%08x\n", channel, | 181 | "size 0x%08x\n", channel, |
171 | __raw_readl(DMA_BASE + DMA_DAR(channel)), | 182 | imx_dmav1_readl(DMA_DAR(channel)), |
172 | __raw_readl(DMA_BASE + DMA_SAR(channel)), | 183 | imx_dmav1_readl(DMA_SAR(channel)), |
173 | __raw_readl(DMA_BASE + DMA_CNTR(channel))); | 184 | imx_dmav1_readl(DMA_CNTR(channel))); |
174 | 185 | ||
175 | return now; | 186 | return now; |
176 | } | 187 | } |
@@ -218,27 +229,26 @@ imx_dma_setup_single(int channel, dma_addr_t dma_address, | |||
218 | channel, __func__, (unsigned int)dma_address, | 229 | channel, __func__, (unsigned int)dma_address, |
219 | dma_length, dev_addr); | 230 | dma_length, dev_addr); |
220 | 231 | ||
221 | __raw_writel(dev_addr, DMA_BASE + DMA_SAR(channel)); | 232 | imx_dmav1_writel(dev_addr, DMA_SAR(channel)); |
222 | __raw_writel(dma_address, DMA_BASE + DMA_DAR(channel)); | 233 | imx_dmav1_writel(dma_address, DMA_DAR(channel)); |
223 | __raw_writel(imxdma->ccr_from_device, | 234 | imx_dmav1_writel(imxdma->ccr_from_device, DMA_CCR(channel)); |
224 | DMA_BASE + DMA_CCR(channel)); | ||
225 | } else if ((dmamode & DMA_MODE_MASK) == DMA_MODE_WRITE) { | 235 | } else if ((dmamode & DMA_MODE_MASK) == DMA_MODE_WRITE) { |
226 | pr_debug("imxdma%d: %s dma_addressg=0x%08x dma_length=%d " | 236 | pr_debug("imxdma%d: %s dma_addressg=0x%08x dma_length=%d " |
227 | "dev_addr=0x%08x for write\n", | 237 | "dev_addr=0x%08x for write\n", |
228 | channel, __func__, (unsigned int)dma_address, | 238 | channel, __func__, (unsigned int)dma_address, |
229 | dma_length, dev_addr); | 239 | dma_length, dev_addr); |
230 | 240 | ||
231 | __raw_writel(dma_address, DMA_BASE + DMA_SAR(channel)); | 241 | imx_dmav1_writel(dma_address, DMA_SAR(channel)); |
232 | __raw_writel(dev_addr, DMA_BASE + DMA_DAR(channel)); | 242 | imx_dmav1_writel(dev_addr, DMA_DAR(channel)); |
233 | __raw_writel(imxdma->ccr_to_device, | 243 | imx_dmav1_writel(imxdma->ccr_to_device, |
234 | DMA_BASE + DMA_CCR(channel)); | 244 | DMA_CCR(channel)); |
235 | } else { | 245 | } else { |
236 | printk(KERN_ERR "imxdma%d: imx_dma_setup_single bad dmamode\n", | 246 | printk(KERN_ERR "imxdma%d: imx_dma_setup_single bad dmamode\n", |
237 | channel); | 247 | channel); |
238 | return -EINVAL; | 248 | return -EINVAL; |
239 | } | 249 | } |
240 | 250 | ||
241 | __raw_writel(dma_length, DMA_BASE + DMA_CNTR(channel)); | 251 | imx_dmav1_writel(dma_length, DMA_CNTR(channel)); |
242 | 252 | ||
243 | return 0; | 253 | return 0; |
244 | } | 254 | } |
@@ -316,17 +326,15 @@ imx_dma_setup_sg(int channel, | |||
316 | "dev_addr=0x%08x for read\n", | 326 | "dev_addr=0x%08x for read\n", |
317 | channel, __func__, sg, sgcount, dma_length, dev_addr); | 327 | channel, __func__, sg, sgcount, dma_length, dev_addr); |
318 | 328 | ||
319 | __raw_writel(dev_addr, DMA_BASE + DMA_SAR(channel)); | 329 | imx_dmav1_writel(dev_addr, DMA_SAR(channel)); |
320 | __raw_writel(imxdma->ccr_from_device, | 330 | imx_dmav1_writel(imxdma->ccr_from_device, DMA_CCR(channel)); |
321 | DMA_BASE + DMA_CCR(channel)); | ||
322 | } else if ((dmamode & DMA_MODE_MASK) == DMA_MODE_WRITE) { | 331 | } else if ((dmamode & DMA_MODE_MASK) == DMA_MODE_WRITE) { |
323 | pr_debug("imxdma%d: %s sg=%p sgcount=%d total length=%d " | 332 | pr_debug("imxdma%d: %s sg=%p sgcount=%d total length=%d " |
324 | "dev_addr=0x%08x for write\n", | 333 | "dev_addr=0x%08x for write\n", |
325 | channel, __func__, sg, sgcount, dma_length, dev_addr); | 334 | channel, __func__, sg, sgcount, dma_length, dev_addr); |
326 | 335 | ||
327 | __raw_writel(dev_addr, DMA_BASE + DMA_DAR(channel)); | 336 | imx_dmav1_writel(dev_addr, DMA_DAR(channel)); |
328 | __raw_writel(imxdma->ccr_to_device, | 337 | imx_dmav1_writel(imxdma->ccr_to_device, DMA_CCR(channel)); |
329 | DMA_BASE + DMA_CCR(channel)); | ||
330 | } else { | 338 | } else { |
331 | printk(KERN_ERR "imxdma%d: imx_dma_setup_sg bad dmamode\n", | 339 | printk(KERN_ERR "imxdma%d: imx_dma_setup_sg bad dmamode\n", |
332 | channel); | 340 | channel); |
@@ -360,7 +368,7 @@ imx_dma_config_channel(int channel, unsigned int config_port, | |||
360 | imxdma->ccr_from_device = config_port | (config_mem << 2) | dreq; | 368 | imxdma->ccr_from_device = config_port | (config_mem << 2) | dreq; |
361 | imxdma->ccr_to_device = config_mem | (config_port << 2) | dreq; | 369 | imxdma->ccr_to_device = config_mem | (config_port << 2) | dreq; |
362 | 370 | ||
363 | __raw_writel(dmareq, DMA_BASE + DMA_RSSR(channel)); | 371 | imx_dmav1_writel(dmareq, DMA_RSSR(channel)); |
364 | 372 | ||
365 | return 0; | 373 | return 0; |
366 | } | 374 | } |
@@ -368,7 +376,7 @@ EXPORT_SYMBOL(imx_dma_config_channel); | |||
368 | 376 | ||
369 | void imx_dma_config_burstlen(int channel, unsigned int burstlen) | 377 | void imx_dma_config_burstlen(int channel, unsigned int burstlen) |
370 | { | 378 | { |
371 | __raw_writel(burstlen, DMA_BASE + DMA_BLR(channel)); | 379 | imx_dmav1_writel(burstlen, DMA_BLR(channel)); |
372 | } | 380 | } |
373 | EXPORT_SYMBOL(imx_dma_config_burstlen); | 381 | EXPORT_SYMBOL(imx_dma_config_burstlen); |
374 | 382 | ||
@@ -398,7 +406,7 @@ imx_dma_setup_handlers(int channel, | |||
398 | } | 406 | } |
399 | 407 | ||
400 | local_irq_save(flags); | 408 | local_irq_save(flags); |
401 | __raw_writel(1 << channel, DMA_BASE + DMA_DISR); | 409 | imx_dmav1_writel(1 << channel, DMA_DISR); |
402 | imxdma->irq_handler = irq_handler; | 410 | imxdma->irq_handler = irq_handler; |
403 | imxdma->err_handler = err_handler; | 411 | imxdma->err_handler = err_handler; |
404 | imxdma->data = data; | 412 | imxdma->data = data; |
@@ -462,22 +470,21 @@ void imx_dma_enable(int channel) | |||
462 | 470 | ||
463 | local_irq_save(flags); | 471 | local_irq_save(flags); |
464 | 472 | ||
465 | __raw_writel(1 << channel, DMA_BASE + DMA_DISR); | 473 | imx_dmav1_writel(1 << channel, DMA_DISR); |
466 | __raw_writel(__raw_readl(DMA_BASE + DMA_DIMR) & ~(1 << channel), | 474 | imx_dmav1_writel(imx_dmav1_readl(DMA_DIMR) & ~(1 << channel), DMA_DIMR); |
467 | DMA_BASE + DMA_DIMR); | 475 | imx_dmav1_writel(imx_dmav1_readl(DMA_CCR(channel)) | CCR_CEN | |
468 | __raw_writel(__raw_readl(DMA_BASE + DMA_CCR(channel)) | CCR_CEN | | 476 | CCR_ACRPT, DMA_CCR(channel)); |
469 | CCR_ACRPT, | ||
470 | DMA_BASE + DMA_CCR(channel)); | ||
471 | 477 | ||
472 | #ifdef CONFIG_ARCH_MX2 | 478 | #ifdef CONFIG_ARCH_MX2 |
473 | if (imxdma->sg && imx_dma_hw_chain(imxdma)) { | 479 | if ((cpu_is_mx21() || cpu_is_mx27()) && |
480 | imxdma->sg && imx_dma_hw_chain(imxdma)) { | ||
474 | imxdma->sg = sg_next(imxdma->sg); | 481 | imxdma->sg = sg_next(imxdma->sg); |
475 | if (imxdma->sg) { | 482 | if (imxdma->sg) { |
476 | u32 tmp; | 483 | u32 tmp; |
477 | imx_dma_sg_next(channel, imxdma->sg); | 484 | imx_dma_sg_next(channel, imxdma->sg); |
478 | tmp = __raw_readl(DMA_BASE + DMA_CCR(channel)); | 485 | tmp = imx_dmav1_readl(DMA_CCR(channel)); |
479 | __raw_writel(tmp | CCR_RPT | CCR_ACRPT, | 486 | imx_dmav1_writel(tmp | CCR_RPT | CCR_ACRPT, |
480 | DMA_BASE + DMA_CCR(channel)); | 487 | DMA_CCR(channel)); |
481 | } | 488 | } |
482 | } | 489 | } |
483 | #endif | 490 | #endif |
@@ -502,11 +509,10 @@ void imx_dma_disable(int channel) | |||
502 | del_timer(&imxdma->watchdog); | 509 | del_timer(&imxdma->watchdog); |
503 | 510 | ||
504 | local_irq_save(flags); | 511 | local_irq_save(flags); |
505 | __raw_writel(__raw_readl(DMA_BASE + DMA_DIMR) | (1 << channel), | 512 | imx_dmav1_writel(imx_dmav1_readl(DMA_DIMR) | (1 << channel), DMA_DIMR); |
506 | DMA_BASE + DMA_DIMR); | 513 | imx_dmav1_writel(imx_dmav1_readl(DMA_CCR(channel)) & ~CCR_CEN, |
507 | __raw_writel(__raw_readl(DMA_BASE + DMA_CCR(channel)) & ~CCR_CEN, | 514 | DMA_CCR(channel)); |
508 | DMA_BASE + DMA_CCR(channel)); | 515 | imx_dmav1_writel(1 << channel, DMA_DISR); |
509 | __raw_writel(1 << channel, DMA_BASE + DMA_DISR); | ||
510 | imxdma->in_use = 0; | 516 | imxdma->in_use = 0; |
511 | local_irq_restore(flags); | 517 | local_irq_restore(flags); |
512 | } | 518 | } |
@@ -517,7 +523,7 @@ static void imx_dma_watchdog(unsigned long chno) | |||
517 | { | 523 | { |
518 | struct imx_dma_channel *imxdma = &imx_dma_channels[chno]; | 524 | struct imx_dma_channel *imxdma = &imx_dma_channels[chno]; |
519 | 525 | ||
520 | __raw_writel(0, DMA_BASE + DMA_CCR(chno)); | 526 | imx_dmav1_writel(0, DMA_CCR(chno)); |
521 | imxdma->in_use = 0; | 527 | imxdma->in_use = 0; |
522 | imxdma->sg = NULL; | 528 | imxdma->sg = NULL; |
523 | 529 | ||
@@ -533,17 +539,17 @@ static irqreturn_t dma_err_handler(int irq, void *dev_id) | |||
533 | unsigned int err_mask; | 539 | unsigned int err_mask; |
534 | int errcode; | 540 | int errcode; |
535 | 541 | ||
536 | disr = __raw_readl(DMA_BASE + DMA_DISR); | 542 | disr = imx_dmav1_readl(DMA_DISR); |
537 | 543 | ||
538 | err_mask = __raw_readl(DMA_BASE + DMA_DBTOSR) | | 544 | err_mask = imx_dmav1_readl(DMA_DBTOSR) | |
539 | __raw_readl(DMA_BASE + DMA_DRTOSR) | | 545 | imx_dmav1_readl(DMA_DRTOSR) | |
540 | __raw_readl(DMA_BASE + DMA_DSESR) | | 546 | imx_dmav1_readl(DMA_DSESR) | |
541 | __raw_readl(DMA_BASE + DMA_DBOSR); | 547 | imx_dmav1_readl(DMA_DBOSR); |
542 | 548 | ||
543 | if (!err_mask) | 549 | if (!err_mask) |
544 | return IRQ_HANDLED; | 550 | return IRQ_HANDLED; |
545 | 551 | ||
546 | __raw_writel(disr & err_mask, DMA_BASE + DMA_DISR); | 552 | imx_dmav1_writel(disr & err_mask, DMA_DISR); |
547 | 553 | ||
548 | for (i = 0; i < IMX_DMA_CHANNELS; i++) { | 554 | for (i = 0; i < IMX_DMA_CHANNELS; i++) { |
549 | if (!(err_mask & (1 << i))) | 555 | if (!(err_mask & (1 << i))) |
@@ -551,20 +557,20 @@ static irqreturn_t dma_err_handler(int irq, void *dev_id) | |||
551 | imxdma = &imx_dma_channels[i]; | 557 | imxdma = &imx_dma_channels[i]; |
552 | errcode = 0; | 558 | errcode = 0; |
553 | 559 | ||
554 | if (__raw_readl(DMA_BASE + DMA_DBTOSR) & (1 << i)) { | 560 | if (imx_dmav1_readl(DMA_DBTOSR) & (1 << i)) { |
555 | __raw_writel(1 << i, DMA_BASE + DMA_DBTOSR); | 561 | imx_dmav1_writel(1 << i, DMA_DBTOSR); |
556 | errcode |= IMX_DMA_ERR_BURST; | 562 | errcode |= IMX_DMA_ERR_BURST; |
557 | } | 563 | } |
558 | if (__raw_readl(DMA_BASE + DMA_DRTOSR) & (1 << i)) { | 564 | if (imx_dmav1_readl(DMA_DRTOSR) & (1 << i)) { |
559 | __raw_writel(1 << i, DMA_BASE + DMA_DRTOSR); | 565 | imx_dmav1_writel(1 << i, DMA_DRTOSR); |
560 | errcode |= IMX_DMA_ERR_REQUEST; | 566 | errcode |= IMX_DMA_ERR_REQUEST; |
561 | } | 567 | } |
562 | if (__raw_readl(DMA_BASE + DMA_DSESR) & (1 << i)) { | 568 | if (imx_dmav1_readl(DMA_DSESR) & (1 << i)) { |
563 | __raw_writel(1 << i, DMA_BASE + DMA_DSESR); | 569 | imx_dmav1_writel(1 << i, DMA_DSESR); |
564 | errcode |= IMX_DMA_ERR_TRANSFER; | 570 | errcode |= IMX_DMA_ERR_TRANSFER; |
565 | } | 571 | } |
566 | if (__raw_readl(DMA_BASE + DMA_DBOSR) & (1 << i)) { | 572 | if (imx_dmav1_readl(DMA_DBOSR) & (1 << i)) { |
567 | __raw_writel(1 << i, DMA_BASE + DMA_DBOSR); | 573 | imx_dmav1_writel(1 << i, DMA_DBOSR); |
568 | errcode |= IMX_DMA_ERR_BUFFER; | 574 | errcode |= IMX_DMA_ERR_BUFFER; |
569 | } | 575 | } |
570 | if (imxdma->name && imxdma->err_handler) { | 576 | if (imxdma->name && imxdma->err_handler) { |
@@ -607,7 +613,7 @@ static void dma_irq_handle_channel(int chno) | |||
607 | if (imxdma->sg) { | 613 | if (imxdma->sg) { |
608 | imx_dma_sg_next(chno, imxdma->sg); | 614 | imx_dma_sg_next(chno, imxdma->sg); |
609 | 615 | ||
610 | tmp = __raw_readl(DMA_BASE + DMA_CCR(chno)); | 616 | tmp = imx_dmav1_readl(DMA_CCR(chno)); |
611 | 617 | ||
612 | if (imx_dma_hw_chain(imxdma)) { | 618 | if (imx_dma_hw_chain(imxdma)) { |
613 | /* FIXME: The timeout should probably be | 619 | /* FIXME: The timeout should probably be |
@@ -617,15 +623,13 @@ static void dma_irq_handle_channel(int chno) | |||
617 | jiffies + msecs_to_jiffies(500)); | 623 | jiffies + msecs_to_jiffies(500)); |
618 | 624 | ||
619 | tmp |= CCR_CEN | CCR_RPT | CCR_ACRPT; | 625 | tmp |= CCR_CEN | CCR_RPT | CCR_ACRPT; |
620 | __raw_writel(tmp, DMA_BASE + | 626 | imx_dmav1_writel(tmp, DMA_CCR(chno)); |
621 | DMA_CCR(chno)); | ||
622 | } else { | 627 | } else { |
623 | __raw_writel(tmp & ~CCR_CEN, DMA_BASE + | 628 | imx_dmav1_writel(tmp & ~CCR_CEN, DMA_CCR(chno)); |
624 | DMA_CCR(chno)); | ||
625 | tmp |= CCR_CEN; | 629 | tmp |= CCR_CEN; |
626 | } | 630 | } |
627 | 631 | ||
628 | __raw_writel(tmp, DMA_BASE + DMA_CCR(chno)); | 632 | imx_dmav1_writel(tmp, DMA_CCR(chno)); |
629 | 633 | ||
630 | if (imxdma->prog_handler) | 634 | if (imxdma->prog_handler) |
631 | imxdma->prog_handler(chno, imxdma->data, | 635 | imxdma->prog_handler(chno, imxdma->data, |
@@ -640,7 +644,7 @@ static void dma_irq_handle_channel(int chno) | |||
640 | } | 644 | } |
641 | } | 645 | } |
642 | 646 | ||
643 | __raw_writel(0, DMA_BASE + DMA_CCR(chno)); | 647 | imx_dmav1_writel(0, DMA_CCR(chno)); |
644 | imxdma->in_use = 0; | 648 | imxdma->in_use = 0; |
645 | if (imxdma->irq_handler) | 649 | if (imxdma->irq_handler) |
646 | imxdma->irq_handler(chno, imxdma->data); | 650 | imxdma->irq_handler(chno, imxdma->data); |
@@ -651,15 +655,16 @@ static irqreturn_t dma_irq_handler(int irq, void *dev_id) | |||
651 | int i, disr; | 655 | int i, disr; |
652 | 656 | ||
653 | #ifdef CONFIG_ARCH_MX2 | 657 | #ifdef CONFIG_ARCH_MX2 |
654 | dma_err_handler(irq, dev_id); | 658 | if (cpu_is_mx21() || cpu_is_mx27()) |
659 | dma_err_handler(irq, dev_id); | ||
655 | #endif | 660 | #endif |
656 | 661 | ||
657 | disr = __raw_readl(DMA_BASE + DMA_DISR); | 662 | disr = imx_dmav1_readl(DMA_DISR); |
658 | 663 | ||
659 | pr_debug("imxdma: dma_irq_handler called, disr=0x%08x\n", | 664 | pr_debug("imxdma: dma_irq_handler called, disr=0x%08x\n", |
660 | disr); | 665 | disr); |
661 | 666 | ||
662 | __raw_writel(disr, DMA_BASE + DMA_DISR); | 667 | imx_dmav1_writel(disr, DMA_DISR); |
663 | for (i = 0; i < IMX_DMA_CHANNELS; i++) { | 668 | for (i = 0; i < IMX_DMA_CHANNELS; i++) { |
664 | if (disr & (1 << i)) | 669 | if (disr & (1 << i)) |
665 | dma_irq_handle_channel(i); | 670 | dma_irq_handle_channel(i); |
@@ -699,17 +704,19 @@ int imx_dma_request(int channel, const char *name) | |||
699 | local_irq_restore(flags); /* request_irq() can block */ | 704 | local_irq_restore(flags); /* request_irq() can block */ |
700 | 705 | ||
701 | #ifdef CONFIG_ARCH_MX2 | 706 | #ifdef CONFIG_ARCH_MX2 |
702 | ret = request_irq(MXC_INT_DMACH0 + channel, dma_irq_handler, 0, "DMA", | 707 | if (cpu_is_mx21() || cpu_is_mx27()) { |
703 | NULL); | 708 | ret = request_irq(MX2x_INT_DMACH0 + channel, |
704 | if (ret) { | 709 | dma_irq_handler, 0, "DMA", NULL); |
705 | imxdma->name = NULL; | 710 | if (ret) { |
706 | printk(KERN_CRIT "Can't register IRQ %d for DMA channel %d\n", | 711 | imxdma->name = NULL; |
707 | MXC_INT_DMACH0 + channel, channel); | 712 | pr_crit("Can't register IRQ %d for DMA channel %d\n", |
708 | return ret; | 713 | MX2x_INT_DMACH0 + channel, channel); |
714 | return ret; | ||
715 | } | ||
716 | init_timer(&imxdma->watchdog); | ||
717 | imxdma->watchdog.function = &imx_dma_watchdog; | ||
718 | imxdma->watchdog.data = channel; | ||
709 | } | 719 | } |
710 | init_timer(&imxdma->watchdog); | ||
711 | imxdma->watchdog.function = &imx_dma_watchdog; | ||
712 | imxdma->watchdog.data = channel; | ||
713 | #endif | 720 | #endif |
714 | 721 | ||
715 | return ret; | 722 | return ret; |
@@ -738,7 +745,8 @@ void imx_dma_free(int channel) | |||
738 | imxdma->name = NULL; | 745 | imxdma->name = NULL; |
739 | 746 | ||
740 | #ifdef CONFIG_ARCH_MX2 | 747 | #ifdef CONFIG_ARCH_MX2 |
741 | free_irq(MXC_INT_DMACH0 + channel, NULL); | 748 | if (cpu_is_mx21() || cpu_is_mx27()) |
749 | free_irq(MX2x_INT_DMACH0 + channel, NULL); | ||
742 | #endif | 750 | #endif |
743 | 751 | ||
744 | local_irq_restore(flags); | 752 | local_irq_restore(flags); |
@@ -796,34 +804,53 @@ static int __init imx_dma_init(void) | |||
796 | int ret = 0; | 804 | int ret = 0; |
797 | int i; | 805 | int i; |
798 | 806 | ||
807 | #ifdef CONFIG_ARCH_MX1 | ||
808 | if (cpu_is_mx1()) | ||
809 | imx_dmav1_baseaddr = MX1_IO_ADDRESS(MX1_DMA_BASE_ADDR); | ||
810 | else | ||
811 | #endif | ||
812 | #ifdef CONFIG_MACH_MX21 | ||
813 | if (cpu_is_mx21()) | ||
814 | imx_dmav1_baseaddr = MX21_IO_ADDRESS(MX21_DMA_BASE_ADDR); | ||
815 | else | ||
816 | #endif | ||
817 | #ifdef CONFIG_MACH_MX27 | ||
818 | if (cpu_is_mx27()) | ||
819 | imx_dmav1_baseaddr = MX27_IO_ADDRESS(MX27_DMA_BASE_ADDR); | ||
820 | else | ||
821 | #endif | ||
822 | BUG(); | ||
823 | |||
799 | dma_clk = clk_get(NULL, "dma"); | 824 | dma_clk = clk_get(NULL, "dma"); |
800 | clk_enable(dma_clk); | 825 | clk_enable(dma_clk); |
801 | 826 | ||
802 | /* reset DMA module */ | 827 | /* reset DMA module */ |
803 | __raw_writel(DCR_DRST, DMA_BASE + DMA_DCR); | 828 | imx_dmav1_writel(DCR_DRST, DMA_DCR); |
804 | 829 | ||
805 | #ifdef CONFIG_ARCH_MX1 | 830 | #ifdef CONFIG_ARCH_MX1 |
806 | ret = request_irq(DMA_INT, dma_irq_handler, 0, "DMA", NULL); | 831 | if (cpu_is_mx1()) { |
807 | if (ret) { | 832 | ret = request_irq(MX1_DMA_INT, dma_irq_handler, 0, "DMA", NULL); |
808 | printk(KERN_CRIT "Wow! Can't register IRQ for DMA\n"); | 833 | if (ret) { |
809 | return ret; | 834 | pr_crit("Wow! Can't register IRQ for DMA\n"); |
810 | } | 835 | return ret; |
836 | } | ||
811 | 837 | ||
812 | ret = request_irq(DMA_ERR, dma_err_handler, 0, "DMA", NULL); | 838 | ret = request_irq(MX1_DMA_ERR, dma_err_handler, 0, "DMA", NULL); |
813 | if (ret) { | 839 | if (ret) { |
814 | printk(KERN_CRIT "Wow! Can't register ERRIRQ for DMA\n"); | 840 | pr_crit("Wow! Can't register ERRIRQ for DMA\n"); |
815 | free_irq(DMA_INT, NULL); | 841 | free_irq(MX1_DMA_INT, NULL); |
816 | return ret; | 842 | return ret; |
843 | } | ||
817 | } | 844 | } |
818 | #endif | 845 | #endif |
819 | /* enable DMA module */ | 846 | /* enable DMA module */ |
820 | __raw_writel(DCR_DEN, DMA_BASE + DMA_DCR); | 847 | imx_dmav1_writel(DCR_DEN, DMA_DCR); |
821 | 848 | ||
822 | /* clear all interrupts */ | 849 | /* clear all interrupts */ |
823 | __raw_writel((1 << IMX_DMA_CHANNELS) - 1, DMA_BASE + DMA_DISR); | 850 | imx_dmav1_writel((1 << IMX_DMA_CHANNELS) - 1, DMA_DISR); |
824 | 851 | ||
825 | /* disable interrupts */ | 852 | /* disable interrupts */ |
826 | __raw_writel((1 << IMX_DMA_CHANNELS) - 1, DMA_BASE + DMA_DIMR); | 853 | imx_dmav1_writel((1 << IMX_DMA_CHANNELS) - 1, DMA_DIMR); |
827 | 854 | ||
828 | for (i = 0; i < IMX_DMA_CHANNELS; i++) { | 855 | for (i = 0; i < IMX_DMA_CHANNELS; i++) { |
829 | imx_dma_channels[i].sg = NULL; | 856 | imx_dma_channels[i].sg = NULL; |