diff options
Diffstat (limited to 'arch/arm/plat-omap/dma.c')
-rw-r--r-- | arch/arm/plat-omap/dma.c | 37 |
1 files changed, 22 insertions, 15 deletions
diff --git a/arch/arm/plat-omap/dma.c b/arch/arm/plat-omap/dma.c index 8e7c33656b5..c5d0214ef19 100644 --- a/arch/arm/plat-omap/dma.c +++ b/arch/arm/plat-omap/dma.c | |||
@@ -43,6 +43,7 @@ | |||
43 | 43 | ||
44 | #define OMAP_DMA_ACTIVE 0x01 | 44 | #define OMAP_DMA_ACTIVE 0x01 |
45 | #define OMAP_DMA_CCR_EN (1 << 7) | 45 | #define OMAP_DMA_CCR_EN (1 << 7) |
46 | #define OMAP2_DMA_CSR_CLEAR_MASK 0xffe | ||
46 | 47 | ||
47 | #define OMAP_FUNC_MUX_ARM_BASE (0xfffe1000 + 0xec) | 48 | #define OMAP_FUNC_MUX_ARM_BASE (0xfffe1000 + 0xec) |
48 | 49 | ||
@@ -409,8 +410,11 @@ static inline void omap_enable_channel_irq(int lch) | |||
409 | { | 410 | { |
410 | u32 status; | 411 | u32 status; |
411 | 412 | ||
412 | /* Read CSR to make sure it's cleared. */ | 413 | /* Clear CSR */ |
413 | status = OMAP_DMA_CSR_REG(lch); | 414 | if (cpu_class_is_omap1()) |
415 | status = OMAP_DMA_CSR_REG(lch); | ||
416 | else if (cpu_is_omap24xx()) | ||
417 | OMAP_DMA_CSR_REG(lch) = OMAP2_DMA_CSR_CLEAR_MASK; | ||
414 | 418 | ||
415 | /* Enable some nice interrupts. */ | 419 | /* Enable some nice interrupts. */ |
416 | OMAP_DMA_CICR_REG(lch) = dma_chan[lch].enabled_irqs; | 420 | OMAP_DMA_CICR_REG(lch) = dma_chan[lch].enabled_irqs; |
@@ -509,11 +513,13 @@ int omap_request_dma(int dev_id, const char *dev_name, | |||
509 | chan->dev_name = dev_name; | 513 | chan->dev_name = dev_name; |
510 | chan->callback = callback; | 514 | chan->callback = callback; |
511 | chan->data = data; | 515 | chan->data = data; |
512 | chan->enabled_irqs = OMAP_DMA_TOUT_IRQ | OMAP_DMA_DROP_IRQ | | 516 | chan->enabled_irqs = OMAP_DMA_DROP_IRQ | OMAP_DMA_BLOCK_IRQ; |
513 | OMAP_DMA_BLOCK_IRQ; | ||
514 | 517 | ||
515 | if (cpu_is_omap24xx()) | 518 | if (cpu_class_is_omap1()) |
516 | chan->enabled_irqs |= OMAP2_DMA_TRANS_ERR_IRQ; | 519 | chan->enabled_irqs |= OMAP1_DMA_TOUT_IRQ; |
520 | else if (cpu_is_omap24xx()) | ||
521 | chan->enabled_irqs |= OMAP2_DMA_MISALIGNED_ERR_IRQ | | ||
522 | OMAP2_DMA_TRANS_ERR_IRQ; | ||
517 | 523 | ||
518 | if (cpu_is_omap16xx()) { | 524 | if (cpu_is_omap16xx()) { |
519 | /* If the sync device is set, configure it dynamically. */ | 525 | /* If the sync device is set, configure it dynamically. */ |
@@ -533,7 +539,7 @@ int omap_request_dma(int dev_id, const char *dev_name, | |||
533 | 539 | ||
534 | omap_enable_channel_irq(free_ch); | 540 | omap_enable_channel_irq(free_ch); |
535 | /* Clear the CSR register and IRQ status register */ | 541 | /* Clear the CSR register and IRQ status register */ |
536 | OMAP_DMA_CSR_REG(free_ch) = 0x0; | 542 | OMAP_DMA_CSR_REG(free_ch) = OMAP2_DMA_CSR_CLEAR_MASK; |
537 | omap_writel(~0x0, OMAP_DMA4_IRQSTATUS_L0); | 543 | omap_writel(~0x0, OMAP_DMA4_IRQSTATUS_L0); |
538 | } | 544 | } |
539 | 545 | ||
@@ -573,7 +579,7 @@ void omap_free_dma(int lch) | |||
573 | omap_writel(val, OMAP_DMA4_IRQENABLE_L0); | 579 | omap_writel(val, OMAP_DMA4_IRQENABLE_L0); |
574 | 580 | ||
575 | /* Clear the CSR register and IRQ status register */ | 581 | /* Clear the CSR register and IRQ status register */ |
576 | OMAP_DMA_CSR_REG(lch) = 0x0; | 582 | OMAP_DMA_CSR_REG(lch) = OMAP2_DMA_CSR_CLEAR_MASK; |
577 | 583 | ||
578 | val = omap_readl(OMAP_DMA4_IRQSTATUS_L0); | 584 | val = omap_readl(OMAP_DMA4_IRQSTATUS_L0); |
579 | val |= 1 << lch; | 585 | val |= 1 << lch; |
@@ -837,7 +843,7 @@ static int omap1_dma_handle_ch(int ch) | |||
837 | "%d (CSR %04x)\n", ch, csr); | 843 | "%d (CSR %04x)\n", ch, csr); |
838 | return 0; | 844 | return 0; |
839 | } | 845 | } |
840 | if (unlikely(csr & OMAP_DMA_TOUT_IRQ)) | 846 | if (unlikely(csr & OMAP1_DMA_TOUT_IRQ)) |
841 | printk(KERN_WARNING "DMA timeout with device %d\n", | 847 | printk(KERN_WARNING "DMA timeout with device %d\n", |
842 | dma_chan[ch].dev_id); | 848 | dma_chan[ch].dev_id); |
843 | if (unlikely(csr & OMAP_DMA_DROP_IRQ)) | 849 | if (unlikely(csr & OMAP_DMA_DROP_IRQ)) |
@@ -885,20 +891,21 @@ static int omap2_dma_handle_ch(int ch) | |||
885 | return 0; | 891 | return 0; |
886 | if (unlikely(dma_chan[ch].dev_id == -1)) | 892 | if (unlikely(dma_chan[ch].dev_id == -1)) |
887 | return 0; | 893 | return 0; |
888 | /* REVISIT: According to 24xx TRM, there's no TOUT_IE */ | ||
889 | if (unlikely(status & OMAP_DMA_TOUT_IRQ)) | ||
890 | printk(KERN_INFO "DMA timeout with device %d\n", | ||
891 | dma_chan[ch].dev_id); | ||
892 | if (unlikely(status & OMAP_DMA_DROP_IRQ)) | 894 | if (unlikely(status & OMAP_DMA_DROP_IRQ)) |
893 | printk(KERN_INFO | 895 | printk(KERN_INFO |
894 | "DMA synchronization event drop occurred with device " | 896 | "DMA synchronization event drop occurred with device " |
895 | "%d\n", dma_chan[ch].dev_id); | 897 | "%d\n", dma_chan[ch].dev_id); |
896 | |||
897 | if (unlikely(status & OMAP2_DMA_TRANS_ERR_IRQ)) | 898 | if (unlikely(status & OMAP2_DMA_TRANS_ERR_IRQ)) |
898 | printk(KERN_INFO "DMA transaction error with device %d\n", | 899 | printk(KERN_INFO "DMA transaction error with device %d\n", |
899 | dma_chan[ch].dev_id); | 900 | dma_chan[ch].dev_id); |
901 | if (unlikely(status & OMAP2_DMA_SECURE_ERR_IRQ)) | ||
902 | printk(KERN_INFO "DMA secure error with device %d\n", | ||
903 | dma_chan[ch].dev_id); | ||
904 | if (unlikely(status & OMAP2_DMA_MISALIGNED_ERR_IRQ)) | ||
905 | printk(KERN_INFO "DMA misaligned error with device %d\n", | ||
906 | dma_chan[ch].dev_id); | ||
900 | 907 | ||
901 | OMAP_DMA_CSR_REG(ch) = 0x20; | 908 | OMAP_DMA_CSR_REG(ch) = OMAP2_DMA_CSR_CLEAR_MASK; |
902 | 909 | ||
903 | val = omap_readl(OMAP_DMA4_IRQSTATUS_L0); | 910 | val = omap_readl(OMAP_DMA4_IRQSTATUS_L0); |
904 | /* ch in this function is from 0-31 while in register it is 1-32 */ | 911 | /* ch in this function is from 0-31 while in register it is 1-32 */ |