diff options
Diffstat (limited to 'sound/soc/fsl/fsl_asrc_m2m.c')
-rw-r--r-- | sound/soc/fsl/fsl_asrc_m2m.c | 18 |
1 files changed, 16 insertions, 2 deletions
diff --git a/sound/soc/fsl/fsl_asrc_m2m.c b/sound/soc/fsl/fsl_asrc_m2m.c index 9f0314970cbb..2684518d26ee 100644 --- a/sound/soc/fsl/fsl_asrc_m2m.c +++ b/sound/soc/fsl/fsl_asrc_m2m.c @@ -174,8 +174,11 @@ static int fsl_asrc_dmaconfig(struct fsl_asrc_pair *pair, struct dma_chan *chan, slave_config.direction = DMA_MEM_TO_DEV; slave_config.dst_addr = dma_addr; slave_config.dst_addr_width = buswidth; - slave_config.dst_maxburst = - m2m->watermark[IN] * pair->channels; + if (asrc_priv->dma_type == DMA_SDMA) + slave_config.dst_maxburst = + m2m->watermark[IN] * pair->channels; + else + slave_config.dst_maxburst = 1; } else { slave_config.direction = DMA_DEV_TO_MEM; slave_config.src_addr = dma_addr; @@ -283,6 +286,9 @@ static int fsl_asrc_prepare_io_buffer(struct fsl_asrc_pair *pair, *dma_len -= last_period_size * word_size * pair->channels; *dma_len = *dma_len / (word_size * pair->channels) * (word_size * pair->channels); + if (asrc_priv->dma_type == DMA_EDMA) + *dma_len = *dma_len / (word_size * pair->channels * m2m->watermark[OUT]) + * (word_size * pair->channels * m2m->watermark[OUT]); } *sg_nodes = *dma_len / ASRC_MAX_BUFFER_SIZE + 1; @@ -625,11 +631,13 @@ static long fsl_asrc_calc_last_period_size(struct fsl_asrc_pair *pair, struct asrc_convert_buffer *pbuf) { struct fsl_asrc_m2m *m2m = pair->private; + struct fsl_asrc *asrc_priv = pair->asrc_priv; unsigned int out_length; unsigned int in_width, out_width; unsigned int channels = pair->channels; unsigned int in_samples, out_samples; unsigned int last_period_size; + unsigned int remain; switch (m2m->word_width[IN]) { case ASRC_WIDTH_24_BIT: @@ -672,6 +680,12 @@ static long fsl_asrc_calc_last_period_size(struct fsl_asrc_pair *pair, m2m->last_period_size = last_period_size + 1 + ASRC_OUTPUT_LAST_SAMPLE; + if (asrc_priv->dma_type == DMA_EDMA) { + remain = pbuf->output_buffer_length % (out_width * channels * m2m->watermark[OUT]); + if (remain) + m2m->last_period_size += remain / (out_width * channels); + } + return 0; } |