summaryrefslogtreecommitdiffstats
path: root/sound
diff options
context:
space:
mode:
authorTakashi Iwai <tiwai@suse.de>2013-01-09 09:28:20 +0100
committerTakashi Iwai <tiwai@suse.de>2013-01-12 08:44:23 +0100
commit980428cecc4ca767bd9dd61fc286cd4124fd34af (patch)
treebe0551dd98256ee9f008629bb87596402722c21d /sound
parentf3fc0b0b1fe31e0ec9a72ab85b421e74c696f00d (diff)
downloadblackbird-obmc-linux-980428cecc4ca767bd9dd61fc286cd4124fd34af.tar.gz
blackbird-obmc-linux-980428cecc4ca767bd9dd61fc286cd4124fd34af.zip
ALSA: hda - Clear the dropped paths properly
When a DAC is reassigned from surrounds to front or ADCs are reduced due to incomplete imux, we clear the path indices but the path instances remain as is. Since the paths might be still referred through the whole path list parsing (e.g. is_active_nid()), we should clear these path instances as well. Signed-off-by: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to 'sound')
-rw-r--r--sound/pci/hda/hda_generic.c16
1 files changed, 15 insertions, 1 deletions
diff --git a/sound/pci/hda/hda_generic.c b/sound/pci/hda/hda_generic.c
index 26e8d83b5672..a9bf188fe849 100644
--- a/sound/pci/hda/hda_generic.c
+++ b/sound/pci/hda/hda_generic.c
@@ -331,6 +331,15 @@ snd_hda_add_new_path(struct hda_codec *codec, hda_nid_t from_nid,
}
EXPORT_SYMBOL_HDA(snd_hda_add_new_path);
+/* clear the given path as invalid so that it won't be picked up later */
+static void invalidate_nid_path(struct hda_codec *codec, int idx)
+{
+ struct nid_path *path = snd_hda_get_path_from_idx(codec, idx);
+ if (!path)
+ return;
+ memset(path, 0, sizeof(*path));
+}
+
/* look for an empty DAC slot */
static hda_nid_t look_for_dac(struct hda_codec *codec, hda_nid_t pin,
bool is_digital)
@@ -891,10 +900,12 @@ static int try_assign_dacs(struct hda_codec *codec, int num_outs,
dacs[i] = look_for_dac(codec, pin, false);
if (!dacs[i] && !i) {
+ /* try to steal the DAC of surrounds for the front */
for (j = 1; j < num_outs; j++) {
if (is_reachable_path(codec, dacs[j], pin)) {
dacs[0] = dacs[j];
dacs[j] = 0;
+ invalidate_nid_path(codec, path_idx[j]);
path_idx[j] = 0;
break;
}
@@ -2046,9 +2057,12 @@ static int check_dyn_adc_switch(struct hda_codec *codec)
continue;
if (n != nums) {
spec->adc_nids[nums] = spec->adc_nids[n];
- for (i = 0; i < imux->num_items; i++)
+ for (i = 0; i < imux->num_items; i++) {
+ invalidate_nid_path(codec,
+ spec->input_paths[i][nums]);
spec->input_paths[i][nums] =
spec->input_paths[i][n];
+ }
}
nums++;
}
OpenPOWER on IntegriCloud