[PATCH v2 10/12] ASoC: SOF: Intel: hda: make sure DAI widget is set up before IPC

Péter Ujfalusi peter.ujfalusi at linux.intel.com
Thu Sep 23 14:54:11 CEST 2021



On 17/09/2021 17:36, Daniel Baluta wrote:
> From: Ranjani Sridharan <ranjani.sridharan at linux.intel.com>
> 
> With the implementation of the dynamic pipeline feature, widgets
> will only be setup when a PCM is opened during the
> hw_params ioctl. The BE hw_params callback is responsible for
> sending the DAI_CONFIG for the DAI widgets in the DSP.
> With dynamic pipelines, the DAI widgets will need to set up
> first before sending the DAI_CONFIG IPC in the BE hw_params.
> 
> Update the BE hw_params/hw_free callbacks for all ALH, HDA and SSP
> DAIs to set up/free the DAI widget before/after DAI_CONFIG IPC.
> 
> Signed-off-by: Ranjani Sridharan <ranjani.sridharan at linux.intel.com>
> Reviewed-by: Guennadi Liakhovetski <guennadi.liakhovetski at linux.intel.com>
> Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart at linux.intel.com>
> Reviewed-by: Kai Vehmanen <kai.vehmanen at linux.intel.com>
> Signed-off-by: Daniel Baluta <daniel.baluta at nxp.com>
> ---
>  sound/soc/sof/intel/hda-dai.c | 176 ++++++++++++++++++++-------------
>  sound/soc/sof/intel/hda.c     | 177 +++++++++++++++++++++++++---------
>  sound/soc/sof/intel/hda.h     |   5 +
>  sound/soc/sof/sof-audio.c     |   1 +
>  sound/soc/sof/sof-audio.h     |   2 +-
>  sound/soc/sof/topology.c      |   3 -
>  6 files changed, 245 insertions(+), 119 deletions(-)
> 
> diff --git a/sound/soc/sof/intel/hda-dai.c b/sound/soc/sof/intel/hda-dai.c
> index 2f54a659b78a..d1ec8bfb6002 100644
> --- a/sound/soc/sof/intel/hda-dai.c
> +++ b/sound/soc/sof/intel/hda-dai.c
> @@ -155,49 +155,70 @@ static int hda_link_dma_params(struct hdac_ext_stream *stream,
>  	return 0;
>  }
>  
> -/* Send DAI_CONFIG IPC to the DAI that matches the dai_name and direction */
> -static int hda_link_config_ipc(struct sof_intel_hda_stream *hda_stream,
> -			       const char *dai_name, int channel, int dir)
> +/* Update config for the DAI widget */
> +static struct sof_ipc_dai_config *hda_dai_update_config(struct snd_soc_dapm_widget *w,
> +							int channel)
>  {
> +	struct snd_sof_widget *swidget = w->dobj.private;
>  	struct sof_ipc_dai_config *config;
>  	struct snd_sof_dai *sof_dai;
> -	struct sof_ipc_reply reply;
> -	int ret = 0;
>  
> -	list_for_each_entry(sof_dai, &hda_stream->sdev->dai_list, list) {
> -		if (!sof_dai->cpu_dai_name)
> -			continue;
> +	if (!swidget) {
> +		dev_err(swidget->scomp->dev, "error: No private data for widget %s\n", w->name);

NULL pointer dereference, just return NULL without the print. The caller
is printing anyways.

> +		return NULL;
> +	}
>  

-- 
Péter


More information about the Alsa-devel mailing list