提交 1f7f51a6 编写于 作者: W Wang YanQing 提交者: Takashi Iwai

ALSA: hda: Fix regression of hdmi eld control created based on invalid pcm

Commit fb087eaa ("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: fb087eaa ("ALSA: hda - hdmi eld control created based on pcm")
Signed-off-by: NWang YanQing <udknight@gmail.com>
Signed-off-by: NTakashi Iwai <tiwai@suse.de>
上级 83b033bd
...@@ -3213,8 +3213,10 @@ int snd_hda_codec_build_pcms(struct hda_codec *codec) ...@@ -3213,8 +3213,10 @@ int snd_hda_codec_build_pcms(struct hda_codec *codec)
continue; /* no substreams assigned */ continue; /* no substreams assigned */
dev = get_empty_pcm_device(bus, cpcm->pcm_type); 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 */ continue; /* no fatal error */
}
cpcm->device = dev; cpcm->device = dev;
err = snd_hda_attach_pcm_stream(bus, codec, cpcm); err = snd_hda_attach_pcm_stream(bus, codec, cpcm);
if (err < 0) { if (err < 0) {
......
...@@ -164,6 +164,7 @@ enum { ...@@ -164,6 +164,7 @@ enum {
HDA_PCM_NTYPES HDA_PCM_NTYPES
}; };
#define SNDRV_PCM_INVALID_DEVICE (-1)
/* for PCM creation */ /* for PCM creation */
struct hda_pcm { struct hda_pcm {
char *name; char *name;
......
...@@ -2126,7 +2126,7 @@ static int generic_hdmi_build_jack(struct hda_codec *codec, int pcm_idx) ...@@ -2126,7 +2126,7 @@ static int generic_hdmi_build_jack(struct hda_codec *codec, int pcm_idx)
static int generic_hdmi_build_controls(struct hda_codec *codec) static int generic_hdmi_build_controls(struct hda_codec *codec)
{ {
struct hdmi_spec *spec = codec->spec; struct hdmi_spec *spec = codec->spec;
int err; int dev, err;
int pin_idx, pcm_idx; int pin_idx, pcm_idx;
...@@ -2154,12 +2154,14 @@ static int generic_hdmi_build_controls(struct hda_codec *codec) ...@@ -2154,12 +2154,14 @@ static int generic_hdmi_build_controls(struct hda_codec *codec)
return err; return err;
snd_hda_spdif_ctls_unassign(codec, pcm_idx); snd_hda_spdif_ctls_unassign(codec, pcm_idx);
dev = get_pcm_rec(spec, pcm_idx)->device;
if (dev != SNDRV_PCM_INVALID_DEVICE) {
/* add control for ELD Bytes */ /* add control for ELD Bytes */
err = hdmi_create_eld_ctl(codec, pcm_idx, err = hdmi_create_eld_ctl(codec, pcm_idx, dev);
get_pcm_rec(spec, pcm_idx)->device);
if (err < 0) if (err < 0)
return err; return err;
} }
}
for (pin_idx = 0; pin_idx < spec->num_pins; pin_idx++) { for (pin_idx = 0; pin_idx < spec->num_pins; pin_idx++) {
struct hdmi_spec_per_pin *per_pin = get_pin(spec, pin_idx); struct hdmi_spec_per_pin *per_pin = get_pin(spec, pin_idx);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册