[Sound-open-firmware] [PATCH] dw-dma: recover dma status when release

Pan, Xiuli xiuli.pan at linux.intel.com
Fri Mar 30 11:04:37 CEST 2018


Ping.

On 3/30/2018 16:58, Xiuli Pan wrote:
> From: Pan Xiuli <xiuli.pan at linux.intel.com>
>
> Resume pause will re-start DMA, which will cause the DMA status diff
> from buffer COMP. Add a release function to recover the status mainily
> for LLI now.
>
> This patch fixes pause/resume noise issues.
>
> Tested-by: Keyon Jie <yang.jie at linux.intel.com>
> Signed-off-by: Pan Xiuli <xiuli.pan at linux.intel.com>
>
> ---
> Test with:
> Mininow max rt5651
> SOF 1.1-stable: 98d3a838cb397e91d6c032cf9b39d3748102803e
> SOF-Tool 1.1-stable: 78ad1ccce5ac689680adc32f8136f5bf551b0f7c
> https://github.com/plbossart/sound/tree/topic/sof-v4.14:
> c33cfed51fff5eb156dcf70ba849e6ffb3008377
> ---
>   src/audio/dai.c      | 21 ++++++++++++++++++---
>   src/drivers/dw-dma.c | 16 ++++++++++------
>   2 files changed, 28 insertions(+), 9 deletions(-)
>
> diff --git a/src/audio/dai.c b/src/audio/dai.c
> index 79e877f..9865e02 100644
> --- a/src/audio/dai.c
> +++ b/src/audio/dai.c
> @@ -558,12 +558,27 @@ static int dai_comp_trigger(struct comp_dev *dev, int cmd)
>   	switch (cmd) {
>   	case COMP_TRIGGER_START:
>   		dai_pointer_init(dev);
> -		/* fall through */
> -	case COMP_TRIGGER_RELEASE:
> -
>   		/* only start the DAI if we are not XRUN handling */
>   		if (dd->xrun == 0) {
> +			/* start the DAI */
> +			ret = dma_start(dd->dma, dd->chan);
> +			if (ret < 0)
> +				return ret;
> +			dai_trigger(dd->dai, cmd, dev->params.direction);
> +		} else {
> +			dd->xrun = 0;
> +		}
>   
> +		/* update starting wallclock */
> +		platform_dai_wallclock(dev, &dd->wallclock);
> +		break;
> +	case COMP_TRIGGER_RELEASE:
> +		/* only start the DAI if we are not XRUN handling */
> +		if (dd->xrun == 0) {
> +			/* recover the dma status */
> +			ret = dma_release(dd->dma, dd->chan);
> +			if (ret < 0)
> +				return ret;
>   			/* start the DAI */
>   			ret = dma_start(dd->dma, dd->chan);
>   			if (ret < 0)
> diff --git a/src/drivers/dw-dma.c b/src/drivers/dw-dma.c
> index aac524e..a21ecc5 100644
> --- a/src/drivers/dw-dma.c
> +++ b/src/drivers/dw-dma.c
> @@ -430,18 +430,22 @@ out:
>   static int dw_dma_release(struct dma *dma, int channel)
>   {
>   	struct dma_pdata *p = dma_get_drvdata(dma);
> +	struct dw_lli2 *lli;
>   	uint32_t flags;
>   
>   	spin_lock_irq(&dma->lock, flags);
>   
>   	trace_dma("Dpr");
>   
> -	if (p->chan[channel].status == COMP_STATE_PAUSED) {
> -		dw_dma_chan_reload_lli(dma, channel);
> -	}
> -
> -	/* resume and reload DMA */
> -	p->chan[channel].status = COMP_STATE_ACTIVE;
> +	/* get current lli */
> +#if DW_USE_HW_LLI
> +	lli = (struct dw_lli2 *)dw_read(dma, DW_LLP(channel));
> +#else
> +	lli = p->chan[channel].lli_current;
> +#endif
> +	/* get next lli and recover the lli to head for restart */
> +	lli = (struct dw_lli2 *)lli->llp;
> +	p->chan[channel].lli = lli;
>   
>   	spin_unlock_irq(&dma->lock, flags);
>   	return 0;



More information about the Sound-open-firmware mailing list