diff options
author | Chen Liangjun <b36089@freescale.com> | 2012-10-26 15:10:09 +0800 |
---|---|---|
committer | Chen Liangjun <b36089@freescale.com> | 2012-11-06 13:43:41 +0800 |
commit | 9e81e368be12a07cdff2b54ec7e7a13e82aa38ec (patch) | |
tree | fa3c1dd6108f9879fef8297b0557c30162ddce6d /drivers | |
parent | 07eeb987cd59cecd527ba4658ef8220e8f0c13ad (diff) |
ENGR00231773-3 ASRC: use kzalloc to allocate buffer to support scatterlist
For ASRC's "memory -> ASRC -> memory" using, new driver would support
model below: user input one buffer into ASRC and an corresponding output
buffer would be poped out. There is no timing requirement between this
input buffer and next input buffer. Thus driver would not use the cyclic
way to config SDMA and scatterlist is used. buffer allocated by
dma_alloc_coherent() can't support scatterlist well.
In this patch, use kzalloc to allocate buffer to support scatterlist.
Signed-off-by: Chen Liangjun <b36089@freescale.com>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/mxc/asrc/mxc_asrc.c | 52 |
1 files changed, 13 insertions, 39 deletions
diff --git a/drivers/mxc/asrc/mxc_asrc.c b/drivers/mxc/asrc/mxc_asrc.c index 8ce2197be9b2..f9a646a9a227 100644 --- a/drivers/mxc/asrc/mxc_asrc.c +++ b/drivers/mxc/asrc/mxc_asrc.c @@ -873,22 +873,15 @@ static void asrc_output_task_worker(struct work_struct *w) /* asrc output work struct */ } - static void mxc_free_dma_buf(struct asrc_pair_params *params) { if (params->input_dma_total.dma_vaddr != NULL) { - dma_free_coherent(g_asrc->dev, - params->input_dma_total.length, - params->input_dma_total.dma_vaddr, - params->input_dma_total.dma_paddr); + kfree(params->input_dma_total.dma_vaddr); params->input_dma_total.dma_vaddr = NULL; } if (params->output_dma_total.dma_vaddr != NULL) { - dma_free_coherent(g_asrc->dev, - params->output_dma_total.length, - params->output_dma_total.dma_vaddr, - params->output_dma_total.dma_paddr); + kfree(params->input_dma_total.dma_vaddr); params->output_dma_total.dma_vaddr = NULL; } @@ -897,42 +890,25 @@ static void mxc_free_dma_buf(struct asrc_pair_params *params) static int mxc_allocate_dma_buf(struct asrc_pair_params *params) { - int i; struct dma_block *input_a, *output_a; input_a = ¶ms->input_dma_total; output_a = ¶ms->output_dma_total; - input_a->dma_vaddr = - dma_alloc_coherent(g_asrc->dev, - input_a->length, &input_a->dma_paddr, - GFP_KERNEL | GFP_DMA); - if (!input_a->dma_vaddr) + input_a->dma_vaddr = kzalloc(input_a->length, GFP_KERNEL); + if (!input_a->dma_vaddr) { + pr_err("fail to allocate input dma buffer!\n"); goto exit; - - for (i = 0; i < params->buffer_num; i++) { - params->input_dma[i].dma_vaddr = - input_a->dma_vaddr + i * params->input_buffer_size; - params->input_dma[i].dma_paddr = - input_a->dma_paddr + i * params->input_buffer_size; - if (params->input_dma[i].dma_vaddr == NULL) - goto exit; } + input_a->dma_paddr = virt_to_dma(NULL, input_a->dma_vaddr); - output_a->dma_vaddr = - dma_alloc_coherent(g_asrc->dev, - output_a->length, &output_a->dma_paddr, - GFP_KERNEL | GFP_DMA); - if (!output_a->dma_vaddr) + output_a->dma_vaddr = kzalloc(output_a->length, GFP_KERNEL); + if (!output_a->dma_vaddr) { + pr_err("fail to allocate output dma buffer!\n"); goto exit; - for (i = 0; i < params->buffer_num; i++) { - params->output_dma[i].dma_vaddr = - output_a->dma_vaddr + i * params->output_buffer_size; - params->output_dma[i].dma_paddr = - output_a->dma_paddr + i * params->output_buffer_size; - if (params->output_dma[i].dma_vaddr == NULL) - goto exit; } + output_a->dma_paddr = virt_to_dma(NULL, output_a->dma_vaddr); + return 0; exit: @@ -1079,10 +1055,8 @@ static long asrc_ioctl(struct file *file, else params->buffer_num = config.buffer_num; - params->input_dma_total.length = - params->input_buffer_size * params->buffer_num; - params->output_dma_total.length = - params->output_buffer_size * params->buffer_num; + params->input_dma_total.length = ASRC_DMA_BUFFER_SIZE; + params->output_dma_total.length = ASRC_DMA_BUFFER_SIZE; err = mxc_allocate_dma_buf(params); if (err < 0) |