[linux-yocto] [PATCH] ALSA: hda: Fix regression of hdmi eld control created based on invalid pcm

Bruce Ashfield bruce.ashfield at windriver.com
Wed Oct 25 01:05:39 PDT 2017


On 10/24/2017 03:44 AM, Liwei Song wrote:
> From: Wang YanQing <udknight at gmail.com>
> 
> commit 1f7f51a63114bab3a05920f4b1343154e95e2cb6 upstream.

merged.

Bruce

> 
> Commit fb087eaaef72 ("ALSA: hda - hdmi eld control created based on pcm")
> forget to filter out invalid pcm numbers, if there is only one invalid pcm
> number, then this issue causes we create eld control for invalid pcm silently,
> but when there are more than one invalid pcm numbers, then this issue bring
> probe error looks like below dmesg:
> "
> kernel: [    1.647283] snd_hda_intel 0000:00:03.0: bound 0000:00:02.0 (ops 0xc2967540)
> kernel: [    1.651192] snd_hda_intel 0000:00:03.0: Too many HDMI devices
> kernel: [    1.651195] snd_hda_intel 0000:00:03.0: Consider building the kernel with CONFIG_SND_DYNAMIC_MINORS=y
> kernel: [    1.651197] snd_hda_intel 0000:00:03.0: Too many HDMI devices
> kernel: [    1.651199] snd_hda_intel 0000:00:03.0: Consider building the kernel with CONFIG_SND_DYNAMIC_MINORS=y
> kernel: [    1.651201] snd_hda_intel 0000:00:03.0: Too many HDMI devices
> kernel: [    1.651203] snd_hda_intel 0000:00:03.0: Consider building the kernel with CONFIG_SND_DYNAMIC_MINORS=y
> kernel: [    1.651676] snd_hda_intel 0000:00:03.0: control 3:0:0:ELD:0 is already present
> kernel: [    1.651787] snd_hda_codec_hdmi: probe of hdaudioC0D0 failed with error -16
> "
> 
> This patch add invalid pcm number filter before calling hdmi_create_eld_ctl.
> 
> Fixes: fb087eaaef72 ("ALSA: hda - hdmi eld control created based on pcm")
> Signed-off-by: Wang YanQing <udknight at gmail.com>
> Signed-off-by: Takashi Iwai <tiwai at suse.de>
> Signed-off-by: Liwei Song <liwei.song at windriver.com>
> ---
>   sound/pci/hda/hda_codec.c  |  4 +++-
>   sound/pci/hda/hda_codec.h  |  1 +
>   sound/pci/hda/patch_hdmi.c | 14 ++++++++------
>   3 files changed, 12 insertions(+), 7 deletions(-)
> 
> diff --git a/sound/pci/hda/hda_codec.c b/sound/pci/hda/hda_codec.c
> index 70bb365a08d2..9b044b2c573f 100644
> --- a/sound/pci/hda/hda_codec.c
> +++ b/sound/pci/hda/hda_codec.c
> @@ -3402,8 +3402,10 @@ int snd_hda_codec_build_pcms(struct hda_codec *codec)
>   			continue; /* no substreams assigned */
>   
>   		dev = get_empty_pcm_device(bus, cpcm->pcm_type);
> -		if (dev < 0)
> +		if (dev < 0) {
> +			cpcm->device = SNDRV_PCM_INVALID_DEVICE;
>   			continue; /* no fatal error */
> +		}
>   		cpcm->device = dev;
>   		err =  snd_hda_attach_pcm_stream(bus, codec, cpcm);
>   		if (err < 0) {
> diff --git a/sound/pci/hda/hda_codec.h b/sound/pci/hda/hda_codec.h
> index 60ce1cfc300f..681c360f29f9 100644
> --- a/sound/pci/hda/hda_codec.h
> +++ b/sound/pci/hda/hda_codec.h
> @@ -164,6 +164,7 @@ enum {
>   	HDA_PCM_NTYPES
>   };
>   
> +#define SNDRV_PCM_INVALID_DEVICE	(-1)
>   /* for PCM creation */
>   struct hda_pcm {
>   	char *name;
> diff --git a/sound/pci/hda/patch_hdmi.c b/sound/pci/hda/patch_hdmi.c
> index c87ff8e5d1d5..a2d81a77572b 100644
> --- a/sound/pci/hda/patch_hdmi.c
> +++ b/sound/pci/hda/patch_hdmi.c
> @@ -2125,7 +2125,7 @@ static int generic_hdmi_build_jack(struct hda_codec *codec, int pcm_idx)
>   static int generic_hdmi_build_controls(struct hda_codec *codec)
>   {
>   	struct hdmi_spec *spec = codec->spec;
> -	int err;
> +	int dev, err;
>   	int pin_idx, pcm_idx;
>   
>   
> @@ -2153,11 +2153,13 @@ static int generic_hdmi_build_controls(struct hda_codec *codec)
>   			return err;
>   		snd_hda_spdif_ctls_unassign(codec, pcm_idx);
>   
> -		/* add control for ELD Bytes */
> -		err = hdmi_create_eld_ctl(codec, pcm_idx,
> -					get_pcm_rec(spec, pcm_idx)->device);
> -		if (err < 0)
> -			return err;
> +		dev = get_pcm_rec(spec, pcm_idx)->device;
> +		if (dev != SNDRV_PCM_INVALID_DEVICE) {
> +			/* add control for ELD Bytes */
> +			err = hdmi_create_eld_ctl(codec, pcm_idx, dev);
> +			if (err < 0)
> +				return err;
> +		}
>   	}
>   
>   	for (pin_idx = 0; pin_idx < spec->num_pins; pin_idx++) {
> 



More information about the linux-yocto mailing list