At Mon, 12 Dec 2011 13:37:41 +0800, David Henningsson wrote:
With the auto-parser we can choose the dac nid for vmaster from the DACs we already know, instead of hard-coding it. This is more future-proof and was actually wrong on one machine.
Reported-by: David Chen david.chen@canonical.com Signed-off-by: David Henningsson david.henningsson@canonical.com
Unfortunately this doesn't work correctly for some codecs. Codecs like ALC262 have no volume in DAC (e.g. 0x02) but only in mixer (e.g. 0x0c).
In future, we should build up the I/O paths like in patch_via.c, so that such info can be checked more easily.
thanks,
Takashi
sound/pci/hda/patch_realtek.c | 32 ++++++++++---------------------- 1 files changed, 10 insertions(+), 22 deletions(-)
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index 8a74c1e..31dd675 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c @@ -3153,6 +3153,7 @@ static int alc_auto_fill_dac_nids(struct hda_codec *codec) } }
- spec->vmaster_nid = spec->multiout.dac_nids[0]; return 0;
}
@@ -4175,8 +4176,10 @@ static int patch_alc880(struct hda_codec *codec) #endif }
- if (board_config != ALC_MODEL_AUTO)
if (board_config != ALC_MODEL_AUTO) {
spec->vmaster_nid = 0x0c;
setup_preset(codec, &alc880_presets[board_config]);
}
if (!spec->no_analog && !spec->adc_nids) { alc_auto_fill_adc_caps(codec);
@@ -4196,8 +4199,6 @@ static int patch_alc880(struct hda_codec *codec)
alc_apply_fixup(codec, ALC_FIXUP_ACT_PROBE);
- spec->vmaster_nid = 0x0c;
- codec->patch_ops = alc_patch_ops; if (board_config == ALC_MODEL_AUTO) spec->init_hook = alc_auto_init_std;
@@ -4304,8 +4305,10 @@ static int patch_alc260(struct hda_codec *codec) #endif }
- if (board_config != ALC_MODEL_AUTO)
if (board_config != ALC_MODEL_AUTO) { setup_preset(codec, &alc260_presets[board_config]);
spec->vmaster_nid = 0x08;
}
if (!spec->no_analog && !spec->adc_nids) { alc_auto_fill_adc_caps(codec);
@@ -4325,8 +4328,6 @@ static int patch_alc260(struct hda_codec *codec)
alc_apply_fixup(codec, ALC_FIXUP_ACT_PROBE);
- spec->vmaster_nid = 0x08;
- codec->patch_ops = alc_patch_ops; if (board_config == ALC_MODEL_AUTO) spec->init_hook = alc_auto_init_std;
@@ -4698,8 +4699,10 @@ static int patch_alc882(struct hda_codec *codec) goto error; }
- if (board_config != ALC_MODEL_AUTO)
if (board_config != ALC_MODEL_AUTO) { setup_preset(codec, &alc882_presets[board_config]);
spec->vmaster_nid = 0x0c;
}
if (!spec->no_analog && !spec->adc_nids) { alc_auto_fill_adc_caps(codec);
@@ -4719,8 +4722,6 @@ static int patch_alc882(struct hda_codec *codec)
alc_apply_fixup(codec, ALC_FIXUP_ACT_PROBE);
- spec->vmaster_nid = 0x0c;
- codec->patch_ops = alc_patch_ops; if (board_config == ALC_MODEL_AUTO) spec->init_hook = alc_auto_init_std;
@@ -4899,8 +4900,6 @@ static int patch_alc262(struct hda_codec *codec)
alc_apply_fixup(codec, ALC_FIXUP_ACT_PROBE);
- spec->vmaster_nid = 0x0c;
- codec->patch_ops = alc_patch_ops; spec->init_hook = alc_auto_init_std; spec->shutup = alc_eapd_shutup;
@@ -5012,8 +5011,6 @@ static int patch_alc268(struct hda_codec *codec) if (!spec->no_analog && !spec->cap_mixer) set_capture_mixer(codec);
- spec->vmaster_nid = 0x02;
- codec->patch_ops = alc_patch_ops; spec->init_hook = alc_auto_init_std; spec->shutup = alc_eapd_shutup;
@@ -5568,8 +5565,6 @@ static int patch_alc269(struct hda_codec *codec)
alc_apply_fixup(codec, ALC_FIXUP_ACT_PROBE);
- spec->vmaster_nid = 0x02;
- codec->patch_ops = alc_patch_ops;
#ifdef CONFIG_PM codec->patch_ops.resume = alc269_resume; @@ -5674,8 +5669,6 @@ static int patch_alc861(struct hda_codec *codec) set_beep_amp(spec, 0x23, 0, HDA_OUTPUT); }
spec->vmaster_nid = 0x03;
alc_apply_fixup(codec, ALC_FIXUP_ACT_PROBE);
codec->patch_ops = alc_patch_ops;
@@ -5800,8 +5793,6 @@ static int patch_alc861vd(struct hda_codec *codec) set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT); }
spec->vmaster_nid = 0x02;
alc_apply_fixup(codec, ALC_FIXUP_ACT_PROBE);
codec->patch_ops = alc_patch_ops;
@@ -6184,7 +6175,6 @@ static int patch_alc662(struct hda_codec *codec) break; } }
spec->vmaster_nid = 0x02;
alc_apply_fixup(codec, ALC_FIXUP_ACT_PROBE);
@@ -6240,8 +6230,6 @@ static int patch_alc680(struct hda_codec *codec) if (!spec->no_analog && !spec->cap_mixer) set_capture_mixer(codec);
- spec->vmaster_nid = 0x02;
- codec->patch_ops = alc_patch_ops; spec->init_hook = alc_auto_init_std;
-- 1.7.5.4