Commit 8a7d6003 authored by Takashi Iwai's avatar Takashi Iwai

ALSA: hda - Skip jack and others for non-existing PCM streams

When CONFIG_SND_DYNAMIC_MINORS isn't set, there are only limited
number of devices available, and HD-audio, especially with HDMI/DP
codec, will fail to create more than two devices.

The driver warns about the lack of such devices and skips the PCM
device creations, but the HDMI driver still tries to create the
corresponding JACK, SPDIF and ELD controls even for the non-existing
PCM substreams.  This results in confusion on user-space, and even may
break the operation.

Similarly, Intel HDMI/DP codec builds the ELD notification from i915
graphics driver, and this may be broken if a notification is sent for
the non-existing PCM stream.

This patch adds the check of the existence of the assigned PCM
substream in the both scenarios above, and skips the further operation
if the PCM substream is not assigned.

Fixes: 9152085d ("ALSA: hda - add DP MST audio support")
Cc: <stable@vger.kernel.org>
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent 3a230f7d
...@@ -1383,6 +1383,8 @@ static void hdmi_pcm_setup_pin(struct hdmi_spec *spec, ...@@ -1383,6 +1383,8 @@ static void hdmi_pcm_setup_pin(struct hdmi_spec *spec,
pcm = get_pcm_rec(spec, per_pin->pcm_idx); pcm = get_pcm_rec(spec, per_pin->pcm_idx);
else else
return; return;
if (!pcm->pcm)
return;
if (!test_bit(per_pin->pcm_idx, &spec->pcm_in_use)) if (!test_bit(per_pin->pcm_idx, &spec->pcm_in_use))
return; return;
...@@ -2151,8 +2153,13 @@ static int generic_hdmi_build_controls(struct hda_codec *codec) ...@@ -2151,8 +2153,13 @@ static int generic_hdmi_build_controls(struct hda_codec *codec)
int dev, err; int dev, err;
int pin_idx, pcm_idx; int pin_idx, pcm_idx;
for (pcm_idx = 0; pcm_idx < spec->pcm_used; pcm_idx++) { for (pcm_idx = 0; pcm_idx < spec->pcm_used; pcm_idx++) {
if (!get_pcm_rec(spec, pcm_idx)->pcm) {
/* no PCM: mark this for skipping permanently */
set_bit(pcm_idx, &spec->pcm_bitmap);
continue;
}
err = generic_hdmi_build_jack(codec, pcm_idx); err = generic_hdmi_build_jack(codec, pcm_idx);
if (err < 0) if (err < 0)
return err; return err;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment