[linux-yocto] [PATCH] ALSA: hda: Fix regression of hdmi eld control created based on invalid pcm
Bruce Ashfield
bruce.ashfield at windriver.com
Tue Oct 24 08:01:37 PDT 2017
Thanks for the patch, but for which version is this targeted ?
4.12 ?
Bruce
On 10/24/2017 03:44 AM, Liwei Song wrote:
> From: Wang YanQing <udknight at gmail.com>
>
> commit 1f7f51a63114bab3a05920f4b1343154e95e2cb6 upstream.
>
> 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