int set_dma_callback(unsigned int channel, dma_interrupt_t callback, void *data) { int ret_irq = 0; BUG_ON(!(dma_ch[channel].chan_status != DMA_CHANNEL_FREE && channel < MAX_BLACKFIN_DMA_CHANNEL)); if (callback != NULL) { int ret_val; ret_irq = channel2irq(channel); dma_ch[channel].data = data; ret_val = request_irq(ret_irq, (void *)callback, IRQF_DISABLED, dma_ch[channel].device_id, data); if (ret_val) { printk(KERN_NOTICE "Request irq in DMA engine failed.\n"); return -EPERM; } dma_ch[channel].irq_callback = callback; } return 0; }
void dma_disable_irq(unsigned int channel) { int ret_irq; pr_debug("dma_disable_irq() : BEGIN \n"); BUG_ON(!(dma_ch[channel].chan_status != DMA_CHANNEL_FREE && channel < MAX_BLACKFIN_DMA_CHANNEL)); ret_irq = channel2irq(channel); disable_irq(ret_irq); }
int set_dma_callback(unsigned int channel, irq_handler_t callback, void *data) { int ret; unsigned int irq; BUG_ON(channel >= MAX_DMA_CHANNELS || !callback || !atomic_read(&dma_ch[channel].chan_status)); irq = channel2irq(channel); ret = request_irq(irq, callback, 0, dma_ch[channel].device_id, data); if (ret) return ret; dma_ch[channel].irq = irq; dma_ch[channel].data = data; return 0; }
int set_dma_callback(unsigned int channel, irq_handler_t callback, void *data) { BUG_ON(channel >= MAX_DMA_CHANNELS || dma_ch[channel].chan_status == DMA_CHANNEL_FREE); if (callback != NULL) { int ret; unsigned int irq = channel2irq(channel); ret = request_irq(irq, callback, IRQF_DISABLED, dma_ch[channel].device_id, data); if (ret) return ret; dma_ch[channel].irq = irq; dma_ch[channel].data = data; } return 0; }
void free_dma(unsigned int channel) { int ret_irq; pr_debug("freedma() : BEGIN \n"); BUG_ON(!(dma_ch[channel].chan_status != DMA_CHANNEL_FREE && channel < MAX_BLACKFIN_DMA_CHANNEL)); /* Halt the DMA */ disable_dma(channel); clear_dma_buffer(channel); if (dma_ch[channel].irq_callback != NULL) { ret_irq = channel2irq(channel); free_irq(ret_irq, dma_ch[channel].data); } /* Clear the DMA Variable in the Channel */ mutex_lock(&(dma_ch[channel].dmalock)); dma_ch[channel].chan_status = DMA_CHANNEL_FREE; mutex_unlock(&(dma_ch[channel].dmalock)); pr_debug("freedma() : END \n"); }