Commit 1304ac89 authored by Takashi Iwai's avatar Takashi Iwai

ALSA: hda - Fix mix->DAC deduction for ALC892

The current alc662 parser doesn't set the DAC for the mixer 0x0f
properly for ALC892, which has 4 DACs while ALC662 has 3.
Fixed by implementing alc662_mix_to_dac() more genericly with the
dynamic widget list.
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent 1bc7cf99
...@@ -19105,16 +19105,17 @@ static struct alc_config_preset alc662_presets[] = { ...@@ -19105,16 +19105,17 @@ static struct alc_config_preset alc662_presets[] = {
*/ */
/* convert from MIX nid to DAC */ /* convert from MIX nid to DAC */
static inline hda_nid_t alc662_mix_to_dac(hda_nid_t nid) static hda_nid_t alc662_mix_to_dac(struct hda_codec *codec, hda_nid_t nid)
{ {
if (nid == 0x0f) hda_nid_t list[4];
return 0x02; int i, num;
else if (nid >= 0x0c && nid <= 0x0e)
return nid - 0x0c + 0x02; num = snd_hda_get_connections(codec, nid, list, ARRAY_SIZE(list));
else if (nid == 0x26) /* ALC887-VD has this DAC too */ for (i = 0; i < num; i++) {
return 0x25; if (get_wcaps_type(get_wcaps(codec, list[i])) == AC_WID_AUD_OUT)
else return list[i];
return 0; }
return 0;
} }
/* get MIX nid connected to the given pin targeted to DAC */ /* get MIX nid connected to the given pin targeted to DAC */
...@@ -19126,7 +19127,7 @@ static hda_nid_t alc662_dac_to_mix(struct hda_codec *codec, hda_nid_t pin, ...@@ -19126,7 +19127,7 @@ static hda_nid_t alc662_dac_to_mix(struct hda_codec *codec, hda_nid_t pin,
num = snd_hda_get_connections(codec, pin, mix, ARRAY_SIZE(mix)); num = snd_hda_get_connections(codec, pin, mix, ARRAY_SIZE(mix));
for (i = 0; i < num; i++) { for (i = 0; i < num; i++) {
if (alc662_mix_to_dac(mix[i]) == dac) if (alc662_mix_to_dac(codec, mix[i]) == dac)
return mix[i]; return mix[i];
} }
return 0; return 0;
...@@ -19143,7 +19144,7 @@ static hda_nid_t alc662_look_for_dac(struct hda_codec *codec, hda_nid_t pin) ...@@ -19143,7 +19144,7 @@ static hda_nid_t alc662_look_for_dac(struct hda_codec *codec, hda_nid_t pin)
if (num < 0) if (num < 0)
return 0; return 0;
for (i = 0; i < num; i++) { for (i = 0; i < num; i++) {
hda_nid_t nid = alc662_mix_to_dac(srcs[i]); hda_nid_t nid = alc662_mix_to_dac(codec, srcs[i]);
if (!nid) if (!nid)
continue; continue;
for (j = 0; j < spec->multiout.num_dacs; j++) for (j = 0; j < spec->multiout.num_dacs; j++)
...@@ -19297,7 +19298,7 @@ static void alc662_auto_set_output_and_unmute(struct hda_codec *codec, ...@@ -19297,7 +19298,7 @@ static void alc662_auto_set_output_and_unmute(struct hda_codec *codec,
if (num <= 1) if (num <= 1)
return; return;
for (i = 0; i < num; i++) { for (i = 0; i < num; i++) {
if (alc662_mix_to_dac(srcs[i]) != dac) if (alc662_mix_to_dac(codec, srcs[i]) != dac)
continue; continue;
snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_CONNECT_SEL, i); snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_CONNECT_SEL, i);
return; return;
......
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