mbox series

[V4,0/4] update supported sample format

Message ID cover.1569296075.git.shengjiu.wang@nxp.com
Headers show
Series update supported sample format | expand

Message

Shengjiu Wang Sept. 24, 2019, 10:52 a.m. UTC
This patch serial is to update the supported format for fsl_asrc
and fix some format issue.

Shengjiu Wang (4):
  ASoC: fsl_asrc: Use in(out)put_format instead of in(out)put_word_width
  ASoC: fsl_asrc: update supported sample format
  ASoC: pcm_dmaengine: Extract snd_dmaengine_pcm_refine_runtime_hwparams
  ASoC: fsl_asrc: Fix error with S24_3LE format bitstream in i.MX8

changes in v2
- extract snd_dmaengine_pcm_set_runtime_hwparams in one
  separate path.
- 4th patch depends on 3rd patch

changes in v3
- Fix build report by kbuild test robot <lkp@intel.com>
- change snd_dmaengine_pcm_set_runtime_hwparams to
  snd_dmaengine_pcm_refine_runtime_hwparams

changes in v4
- update according to Nicolin's comments.

 include/sound/dmaengine_pcm.h         |  5 ++
 sound/core/pcm_dmaengine.c            | 83 +++++++++++++++++++++++++++
 sound/soc/fsl/fsl_asrc.c              | 65 ++++++++++++++-------
 sound/soc/fsl/fsl_asrc.h              |  7 ++-
 sound/soc/fsl/fsl_asrc_dma.c          | 59 ++++++++++++++++---
 sound/soc/soc-generic-dmaengine-pcm.c | 61 ++------------------
 6 files changed, 193 insertions(+), 87 deletions(-)

-- 
2.21.0

Comments

Nicolin Chen Sept. 24, 2019, 9:43 p.m. UTC | #1
On Tue, Sep 24, 2019 at 06:52:35PM +0800, Shengjiu Wang wrote:
> There is error "aplay: pcm_write:2023: write error: Input/output error"

> on i.MX8QM/i.MX8QXP platform for S24_3LE format.

> 

> In i.MX8QM/i.MX8QXP, the DMA is EDMA, which don't support 24bit

> sample, but we didn't add any constraint, that cause issues.

> 

> So we need to query the caps of dma, then update the hw parameters

> according to the caps.

> 

> Signed-off-by: Shengjiu Wang <shengjiu.wang@nxp.com>

> ---

>  sound/soc/fsl/fsl_asrc.c     |  4 +--

>  sound/soc/fsl/fsl_asrc.h     |  3 ++

>  sound/soc/fsl/fsl_asrc_dma.c | 59 +++++++++++++++++++++++++++++++-----

>  3 files changed, 56 insertions(+), 10 deletions(-)

> 

> @@ -270,12 +268,17 @@ static int fsl_asrc_dma_hw_free(struct snd_pcm_substream *substream)

>  

>  static int fsl_asrc_dma_startup(struct snd_pcm_substream *substream)

>  {

> +	bool tx = substream->stream == SNDRV_PCM_STREAM_PLAYBACK;

>  	struct snd_soc_pcm_runtime *rtd = substream->private_data;

>  	struct snd_pcm_runtime *runtime = substream->runtime;

>  	struct snd_soc_component *component = snd_soc_rtdcom_lookup(rtd, DRV_NAME);

> +	struct snd_dmaengine_dai_dma_data *dma_data;

>  	struct device *dev = component->dev;

>  	struct fsl_asrc *asrc_priv = dev_get_drvdata(dev);

>  	struct fsl_asrc_pair *pair;

> +	struct dma_chan *tmp_chan = NULL;

> +	u8 dir = tx ? OUT : IN;

> +	int ret = 0;

>  

>  	pair = kzalloc(sizeof(struct fsl_asrc_pair), GFP_KERNEL);


Sorry, I didn't catch it previously. We would need to release
this memory also for all error-out paths, as the code doesn't
have any error-out routine, prior to applying this change.

>  	if (!pair)

> @@ -285,11 +288,51 @@ static int fsl_asrc_dma_startup(struct snd_pcm_substream *substream)


> +	/* Request a dummy pair, which will be released later.

> +	 * Request pair function needs channel num as input, for this

> +	 * dummy pair, we just request "1" channel temporary.

> +	 */


"temporary" => "temporarily"

> +	ret = fsl_asrc_request_pair(1, pair);

> +	if (ret < 0) {

> +		dev_err(dev, "failed to request asrc pair\n");

> +		return ret;

> +	}

> +

> +	/* Request a dummy dma channel, which will be release later. */


"release" => "released"