X-Git-Url: http://ftp.safe.ca/?a=blobdiff_plain;f=arch%2Fblackfin%2Fkernel%2Fbfin_dma_5xx.c;h=d54f19085f37a13d5b7798f387bd65aa83373ce0;hb=22d5c67c5b0476e463ce4b632ba9ec3953d33a5f;hp=b54446055a43c3360ba8551ef5a80e1205664d4e;hpb=28a44d4bd6bdc7d013405bfc2aa7f126d39a7b2b;p=safe%2Fjmp%2Flinux-2.6 diff --git a/arch/blackfin/kernel/bfin_dma_5xx.c b/arch/blackfin/kernel/bfin_dma_5xx.c index b544460..d54f190 100644 --- a/arch/blackfin/kernel/bfin_dma_5xx.c +++ b/arch/blackfin/kernel/bfin_dma_5xx.c @@ -67,7 +67,7 @@ static int __init blackfin_dma_init(void) for (i = 0; i < MAX_BLACKFIN_DMA_CHANNEL; i++) { dma_ch[i].chan_status = DMA_CHANNEL_FREE; - dma_ch[i].regs = base_addr[i]; + dma_ch[i].regs = dma_io_base_addr[i]; mutex_init(&(dma_ch[i].dmalock)); } /* Mark MEMDMA Channel 0 as requested since we're using it internally */ @@ -90,6 +90,17 @@ int request_dma(unsigned int channel, char *device_id) { pr_debug("request_dma() : BEGIN \n"); + +#if defined(CONFIG_BF561) && ANOMALY_05000182 + if (channel >= CH_IMEM_STREAM0_DEST && channel <= CH_IMEM_STREAM1_DEST) { + if (get_cclk() > 500000000) { + printk(KERN_WARNING + "Request IMDMA failed due to ANOMALY 05000182\n"); + return -EFAULT; + } + } +#endif + mutex_lock(&(dma_ch[channel].dmalock)); if ((dma_ch[channel].chan_status == DMA_CHANNEL_REQUESTED) @@ -104,6 +115,20 @@ int request_dma(unsigned int channel, char *device_id) mutex_unlock(&(dma_ch[channel].dmalock)); +#ifdef CONFIG_BF54x + if (channel >= CH_UART2_RX && channel <= CH_UART3_TX) { + if (strncmp(device_id, "BFIN_UART", 9) == 0) { + dma_ch[channel].regs->peripheral_map &= 0x0FFF; + dma_ch[channel].regs->peripheral_map |= + ((channel - CH_UART2_RX + 0xC)<<12); + } else { + dma_ch[channel].regs->peripheral_map &= 0x0FFF; + dma_ch[channel].regs->peripheral_map |= + ((channel - CH_UART2_RX + 0x6)<<12); + } + } +#endif + dma_ch[channel].device_id = device_id; dma_ch[channel].irq_callback = NULL; @@ -339,13 +364,13 @@ EXPORT_SYMBOL(set_dma_config); unsigned short set_bfin_dma_config(char direction, char flow_mode, - char intr_mode, char dma_mode, char width) + char intr_mode, char dma_mode, char width, char syncmode) { unsigned short config; config = ((direction << 1) | (width << 2) | (dma_mode << 4) | - (intr_mode << 6) | (flow_mode << 12) | RESTART); + (intr_mode << 6) | (flow_mode << 12) | (syncmode << 5)); return config; } EXPORT_SYMBOL(set_bfin_dma_config);