On Wed, Jan 8, 2020 at 8:58 PM John Stultz john.stultz@linaro.org wrote:
On Thu, Sep 26, 2019 at 6:50 PM Shengjiu Wang shengjiu.wang@nxp.com wrote:
When set the runtime hardware parameters, we may need to query the capability of DMA to complete the parameters.
This patch is to Extract this operation from dmaengine_pcm_set_runtime_hwparams function to a separate function snd_dmaengine_pcm_refine_runtime_hwparams, that other components which need this feature can call this function.
Signed-off-by: Shengjiu Wang shengjiu.wang@nxp.com Reviewed-by: Nicolin Chen nicoleotsuka@gmail.com
As a heads up, this patch seems to be causing a regression on the HiKey board.
On boot up I'm seeing: [ 17.721424] hi6210_i2s f7118000.i2s: ASoC: can't open component f7118000.i2s: -6
And HDMI audio isn't working. With this patch reverted, audio works again.
diff --git a/sound/core/pcm_dmaengine.c b/sound/core/pcm_dmaengine.c index 89a05926ac73..5749a8a49784 100644 --- a/sound/core/pcm_dmaengine.c +++ b/sound/core/pcm_dmaengine.c @@ -369,4 +369,87 @@ int snd_dmaengine_pcm_close_release_chan(struct snd_pcm_substream *substream)
...
ret = dma_get_slave_caps(chan, &dma_caps);if (ret == 0) {if (dma_caps.cmd_pause && dma_caps.cmd_resume)hw->info |= SNDRV_PCM_INFO_PAUSE | SNDRV_PCM_INFO_RESUME;if (dma_caps.residue_granularity <= DMA_RESIDUE_GRANULARITY_SEGMENT)hw->info |= SNDRV_PCM_INFO_BATCH;if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)addr_widths = dma_caps.dst_addr_widths;elseaddr_widths = dma_caps.src_addr_widths;}It seems a failing ret from dma_get_slave_caps() here is being returned...
/** If SND_DMAENGINE_PCM_DAI_FLAG_PACK is set keep* hw.formats set to 0, meaning no restrictions are in place.* In this case it's the responsibility of the DAI driver to* provide the supported format information.*/if (!(dma_data->flags & SND_DMAENGINE_PCM_DAI_FLAG_PACK))/** Prepare formats mask for valid/allowed sample types. If the* dma does not have support for the given physical word size,* it needs to be masked out so user space can not use the* format which produces corrupted audio.* In case the dma driver does not implement the slave_caps the* default assumption is that it supports 1, 2 and 4 bytes* widths.*/for (i = SNDRV_PCM_FORMAT_FIRST; i <= SNDRV_PCM_FORMAT_LAST; i++) {int bits = snd_pcm_format_physical_width(i);/** Enable only samples with DMA supported physical* widths*/switch (bits) {case 8:case 16:case 24:case 32:case 64:if (addr_widths & (1 << (bits / 8)))hw->formats |= pcm_format_to_bits(i);break;default:/* Unsupported types */break;}}return ret;... down here.
Where as in the old code...
diff --git a/sound/soc/soc-generic-dmaengine-pcm.c b/sound/soc/soc-generic-dmaengine-pcm.c index 748f5f641002..b9f147eaf7c4 100644 --- a/sound/soc/soc-generic-dmaengine-pcm.c +++ b/sound/soc/soc-generic-dmaengine-pcm.c
@@ -145,56 +140,12 @@ static int dmaengine_pcm_set_runtime_hwparams(struct snd_pcm_substream *substrea if (pcm->flags & SND_DMAENGINE_PCM_FLAG_NO_RESIDUE) hw.info |= SNDRV_PCM_INFO_BATCH;
ret = dma_get_slave_caps(chan, &dma_caps);if (ret == 0) {if (dma_caps.cmd_pause && dma_caps.cmd_resume)hw.info |= SNDRV_PCM_INFO_PAUSE | SNDRV_PCM_INFO_RESUME;if (dma_caps.residue_granularity <= DMA_RESIDUE_GRANULARITY_SEGMENT)hw.info |= SNDRV_PCM_INFO_BATCH;if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)addr_widths = dma_caps.dst_addr_widths;elseaddr_widths = dma_caps.src_addr_widths;}...the ret from dma_get_slave_caps() checked above, but is not actually returned.
Suggestions on how to sort this out?
Just wanted to check in on this, as I'm still seeing this regression with -rc6.
thanks -john