diff options
-rw-r--r-- | sound/pci/hda/hda_generic.c | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/sound/pci/hda/hda_generic.c b/sound/pci/hda/hda_generic.c index 26e8d83..a9bf188 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++; } |