aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTakashi Iwai <tiwai@suse.de>2018-04-25 10:19:13 -0400
committerTakashi Iwai <tiwai@suse.de>2018-04-25 10:37:19 -0400
commit8a7d6003df41cb16f6b3b620da044fbd92d2f5ee (patch)
treee26b05b8015dcb44f16275cbaeaabc92b12a4b45
parent3a230f7d09dd0f0eec90bc94abc440ab740c86f1 (diff)
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: 9152085defb6 ("ALSA: hda - add DP MST audio support") Cc: <stable@vger.kernel.org> Signed-off-by: Takashi Iwai <tiwai@suse.de>
-rw-r--r--sound/pci/hda/patch_hdmi.c9
1 files changed, 8 insertions, 1 deletions
diff --git a/sound/pci/hda/patch_hdmi.c b/sound/pci/hda/patch_hdmi.c
index b4f1b6e88305..7d7eb1354eee 100644
--- a/sound/pci/hda/patch_hdmi.c
+++ b/sound/pci/hda/patch_hdmi.c
@@ -1383,6 +1383,8 @@ static void hdmi_pcm_setup_pin(struct hdmi_spec *spec,
1383 pcm = get_pcm_rec(spec, per_pin->pcm_idx); 1383 pcm = get_pcm_rec(spec, per_pin->pcm_idx);
1384 else 1384 else
1385 return; 1385 return;
1386 if (!pcm->pcm)
1387 return;
1386 if (!test_bit(per_pin->pcm_idx, &spec->pcm_in_use)) 1388 if (!test_bit(per_pin->pcm_idx, &spec->pcm_in_use))
1387 return; 1389 return;
1388 1390
@@ -2151,8 +2153,13 @@ static int generic_hdmi_build_controls(struct hda_codec *codec)
2151 int dev, err; 2153 int dev, err;
2152 int pin_idx, pcm_idx; 2154 int pin_idx, pcm_idx;
2153 2155
2154
2155 for (pcm_idx = 0; pcm_idx < spec->pcm_used; pcm_idx++) { 2156 for (pcm_idx = 0; pcm_idx < spec->pcm_used; pcm_idx++) {
2157 if (!get_pcm_rec(spec, pcm_idx)->pcm) {
2158 /* no PCM: mark this for skipping permanently */
2159 set_bit(pcm_idx, &spec->pcm_bitmap);
2160 continue;
2161 }
2162
2156 err = generic_hdmi_build_jack(codec, pcm_idx); 2163 err = generic_hdmi_build_jack(codec, pcm_idx);
2157 if (err < 0) 2164 if (err < 0)
2158 return err; 2165 return err;