diff --git a/sound/pci/hda/hda_generic.c b/sound/pci/hda/hda_generic.c index 758dcc1a07b0d634e1dd93f1502f6bde6390f6fe..06e203df4059b75215657d7796ddee6cb7bdee01 100644 --- a/sound/pci/hda/hda_generic.c +++ b/sound/pci/hda/hda_generic.c @@ -688,7 +688,7 @@ static void activate_amp_in(struct hda_codec *codec, struct nid_path *path, * when aa-mixer is available, we need to enable the path as well */ for (n = 0; n < nums; n++) { - if (n != idx && (!add_aamix || conn[n] != spec->mixer_nid)) + if (n != idx && (!add_aamix || conn[n] != spec->mixer_merge_nid)) continue; activate_amp(codec, nid, HDA_INPUT, n, idx, enable); } @@ -2492,6 +2492,19 @@ static int new_analog_input(struct hda_codec *codec, int input_idx, path->active = true; add_loopback_list(spec, mix_nid, idx); + + if (spec->mixer_nid != spec->mixer_merge_nid && + !spec->loopback_merge_path) { + path = snd_hda_add_new_path(codec, spec->mixer_nid, + spec->mixer_merge_nid, 0); + if (path) { + print_nid_path("loopback-merge", path); + path->active = true; + spec->loopback_merge_path = + snd_hda_get_path_idx(codec, path); + } + } + return 0; } @@ -3847,6 +3860,9 @@ int snd_hda_gen_parse_auto_config(struct hda_codec *codec, parse_user_hints(codec); + if (spec->mixer_nid && !spec->mixer_merge_nid) + spec->mixer_merge_nid = spec->mixer_nid; + if (cfg != &spec->autocfg) { spec->autocfg = *cfg; cfg = &spec->autocfg; @@ -4673,6 +4689,11 @@ static void init_analog_input(struct hda_codec *codec) if (path) snd_hda_activate_path(codec, path, path->active, false); + path = snd_hda_get_path_from_idx(codec, + spec->loopback_merge_path); + if (path) + snd_hda_activate_path(codec, path, path->active, + false); } } } diff --git a/sound/pci/hda/hda_generic.h b/sound/pci/hda/hda_generic.h index 980707fcd30a5ebc919de1dd65a6e7b8f5432e53..d226856b2dfac80e5862e320798353498c5c2dba 100644 --- a/sound/pci/hda/hda_generic.h +++ b/sound/pci/hda/hda_generic.h @@ -107,6 +107,7 @@ struct hda_gen_spec { hda_nid_t adc_nids[AUTO_CFG_MAX_INS]; hda_nid_t dig_in_nid; /* digital-in NID; optional */ hda_nid_t mixer_nid; /* analog-mixer NID */ + hda_nid_t mixer_merge_nid; /* aamix merge-point NID (optional) */ const char *input_labels[HDA_MAX_NUM_INPUTS]; int input_label_idxs[HDA_MAX_NUM_INPUTS]; @@ -163,6 +164,7 @@ struct hda_gen_spec { int digout_paths[AUTO_CFG_MAX_OUTS]; int input_paths[HDA_MAX_NUM_INPUTS][AUTO_CFG_MAX_INS]; int loopback_paths[HDA_MAX_NUM_INPUTS]; + int loopback_merge_path; int digin_path; /* auto-mic stuff */ diff --git a/sound/pci/hda/patch_analog.c b/sound/pci/hda/patch_analog.c index 9d82aab1e5122b6c18d7e7f3458250ed8d8060c2..df8014b2759649cb19c5372eb24afc29d5bde702 100644 --- a/sound/pci/hda/patch_analog.c +++ b/sound/pci/hda/patch_analog.c @@ -3235,6 +3235,7 @@ static int ad1988_parse_auto_config(struct hda_codec *codec) spec = codec->spec; spec->gen.mixer_nid = 0x20; + spec->gen.mixer_merge_nid = 0x21; spec->beep_dev_nid = 0x10; set_beep_amp(spec, 0x10, 0, HDA_OUTPUT); err = ad198x_parse_auto_config(codec); @@ -5153,6 +5154,7 @@ static int ad1882_parse_auto_config(struct hda_codec *codec) spec = codec->spec; spec->gen.mixer_nid = 0x20; + spec->gen.mixer_merge_nid = 0x21; spec->beep_dev_nid = 0x10; set_beep_amp(spec, 0x10, 0, HDA_OUTPUT); err = ad198x_parse_auto_config(codec);