ACK/Cmnt: [SRU][E][PATCH] UBUNTU: SAUCE: ASoC: SOF: Intel: fix HDA codec driver probe with multiple controllers

Stefan Bader stefan.bader at canonical.com
Fri Jan 24 07:18:10 UTC 2020


On 19.01.20 04:55, Hui Wang wrote:
> From: Kai Vehmanen <kai.vehmanen at linux.intel.com>
> 
> BugLink: https://bugs.launchpad.net/bugs/1860248
> 
> In case system has multiple HDA controllers, it can happen that
> same HDA codec driver is used for codecs of multiple controllers.
> In this case, SOF may fail to probe the HDA driver and SOF
> initialization fails.
> 
> SOF HDA code currently relies that a call to request_module() will
> also run device matching logic to attach driver to the codec instance.
> However if driver for another HDA controller was already loaded and it
> already loaded the HDA codec driver, this breaks current logic in SOF.
> In this case the request_module() SOF does becomes a no-op and HDA
> Codec driver is not attached to the codec instance sitting on the HDA
> bus SOF is controlling. Typical scenario would be a system with both
> external and internal GPUs, with driver of the external GPU loaded
> first.
> 
> Fix this by adding similar logic as is used in legacy HDA driver
> where an explicit device_attach() call is done after request_module().
> 
> Also add logic to propagate errors reported by device_attach() back
> to caller. This also works in the case where drivers are not built
> as modules.
> 
> Signed-off-by: Kai Vehmanen <kai.vehmanen at linux.intel.com>
> Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart at linux.intel.com>
> Link: https://lore.kernel.org/r/20200110235751.3404-8-pierre-louis.bossart@linux.intel.com
> Signed-off-by: Mark Brown <broonie at kernel.org>
> (cherry picked from commit 2c63bea714780f8e1fc9cb7bc10deda26fada25b
> git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound.git)
> Signed-off-by: Hui Wang <hui.wang at canonical.com>
Acked-by: Stefan Bader <stefan.bader at canonical.com>
> ---

As Seth mentioned that this got upstream by now, we should adjust the reference
when applying to Eoan.

-Stefan

>  sound/soc/sof/intel/hda-codec.c | 19 ++++++++++++-------
>  1 file changed, 12 insertions(+), 7 deletions(-)
> 
> diff --git a/sound/soc/sof/intel/hda-codec.c b/sound/soc/sof/intel/hda-codec.c
> index 0d8437b080bf..2aa98b0de002 100644
> --- a/sound/soc/sof/intel/hda-codec.c
> +++ b/sound/soc/sof/intel/hda-codec.c
> @@ -23,19 +23,18 @@
>  #define IDISP_VID_INTEL	0x80860000
>  
>  /* load the legacy HDA codec driver */
> -#ifdef MODULE
> -static void hda_codec_load_module(struct hda_codec *codec)
> +static int hda_codec_load_module(struct hda_codec *codec)
>  {
> +#ifdef MODULE
>  	char alias[MODULE_NAME_LEN];
>  	const char *module = alias;
>  
>  	snd_hdac_codec_modalias(&codec->core, alias, sizeof(alias));
>  	dev_dbg(&codec->core.dev, "loading codec module: %s\n", module);
>  	request_module(module);
> -}
> -#else
> -static void hda_codec_load_module(struct hda_codec *codec) {}
>  #endif
> +	return device_attach(hda_codec_dev(codec));
> +}
>  
>  #endif /* CONFIG_SND_SOC_SOF_HDA_AUDIO_CODEC */
>  
> @@ -76,10 +75,16 @@ static int hda_codec_probe(struct snd_sof_dev *sdev, int address)
>  	/* use legacy bus only for HDA codecs, idisp uses ext bus */
>  	if ((resp & 0xFFFF0000) != IDISP_VID_INTEL) {
>  		hdev->type = HDA_DEV_LEGACY;
> -		hda_codec_load_module(&hda_priv->codec);
> +		ret = hda_codec_load_module(&hda_priv->codec);
> +		/*
> +		 * handle ret==0 (no driver bound) as an error, but pass
> +		 * other return codes without modification
> +		 */
> +		if (ret == 0)
> +			ret = -ENOENT;
>  	}
>  
> -	return 0;
> +	return ret;
>  #else
>  	hdev = devm_kzalloc(sdev->dev, sizeof(*hdev), GFP_KERNEL);
>  	if (!hdev)
> 


-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: OpenPGP digital signature
URL: <https://lists.ubuntu.com/archives/kernel-team/attachments/20200124/95ab4627/attachment-0001.sig>


More information about the kernel-team mailing list