At Wed, 23 Mar 2011 17:56:05 +0800, Lydia Wang wrote:
From: Lydia Wang lydiawang@viatech.com.cn Subject: ALSA: VIA HDA: Add support for VT1705.
Add support for VT1705 codec, which is similiar with VT1708S except it has 6 channels output.
Signed-off-by: Lydia Wang lydiawang@viatech.com.cn
Applied both patches now. Thanks.
Takashi
sound/pci/hda/patch_via.c | 100 ++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 87 insertions(+), 13 deletions(-)
--- a/sound/pci/hda/patch_via.c +++ b/sound/pci/hda/patch_via.c @@ -3181,7 +3181,8 @@ int imux_is_smixer; unsigned int parm; int is_8ch = 0;
- if (spec->codec_type != VT1708B_4CH)
if ((spec->codec_type != VT1708B_4CH) &&
(codec->vendor_id != 0x11064397))
is_8ch = 1;
/* SW0 (17h) = stereo mixer */
@@ -3220,6 +3221,16 @@ AC_VERB_SET_POWER_STATE, parm); snd_hda_codec_write(codec, 0x24, 0, AC_VERB_SET_POWER_STATE, parm);
} else if (codec->vendor_id == 0x11064397) {
/* PW7(23h), SW2(27h), AOW2(25h) */
parm = AC_PWRST_D3;
set_pin_power_state(codec, 0x23, &parm);
if (spec->smart51_enabled)
set_pin_power_state(codec, 0x1a, &parm);
snd_hda_codec_write(codec, 0x27, 0,
AC_VERB_SET_POWER_STATE, parm);
snd_hda_codec_write(codec, 0x25, 0,
AC_VERB_SET_POWER_STATE, parm);
}
/* PW 3/4/7 (1ch/1dh/23h) */
@@ -3239,7 +3250,9 @@ AC_VERB_SET_POWER_STATE, parm); snd_hda_codec_write(codec, 0x27, 0, AC_VERB_SET_POWER_STATE, parm);
- }
- } else if (codec->vendor_id == 0x11064397 && spec->hp_independent_mode)
snd_hda_codec_write(codec, 0x25, 0,
AC_VERB_SET_POWER_STATE, parm);
}
static int patch_vt1708S(struct hda_codec *codec); @@ -3414,6 +3427,18 @@ { } };
+static struct hda_verb vt1705_uniwill_init_verbs[] = {
- {0x1d, AC_VERB_SET_UNSOLICITED_ENABLE,
AC_USRSP_EN | VIA_HP_EVENT | VIA_JACK_EVENT},
- {0x19, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | VIA_JACK_EVENT},
- {0x1a, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | VIA_JACK_EVENT},
- {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | VIA_JACK_EVENT},
- {0x1c, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | VIA_JACK_EVENT},
- {0x1e, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | VIA_JACK_EVENT},
- {0x23, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | VIA_JACK_EVENT},
- { }
+};
static struct hda_pcm_stream vt1708S_pcm_analog_playback = { .substreams = 2, .channels_min = 2, @@ -3427,6 +3452,19 @@ }, };
+static struct hda_pcm_stream vt1705_pcm_analog_playback = {
- .substreams = 2,
- .channels_min = 2,
- .channels_max = 6,
- .nid = 0x10, /* NID to query formats and rates */
- .ops = {
.open = via_playback_pcm_open,
.prepare = via_playback_multi_pcm_prepare,
.cleanup = via_playback_multi_pcm_cleanup,
.close = via_pcm_open_close
- },
+};
static struct hda_pcm_stream vt1708S_pcm_analog_capture = { .substreams = 2, .channels_min = 2, @@ -3473,7 +3511,10 @@ spec->multiout.dac_nids[i] = 0x10; break; case AUTO_SEQ_CENLFE:
spec->multiout.dac_nids[i] = 0x24;
if (spec->codec->vendor_id == 0x11064397)
spec->multiout.dac_nids[i] = 0x25;
else
spec->multiout.dac_nids[i] = 0x24; break; case AUTO_SEQ_SURROUND: spec->multiout.dac_nids[i] = 0x11;
@@ -3489,22 +3530,28 @@ if (cfg->line_outs == 1) { spec->multiout.num_dacs = 3; spec->multiout.dac_nids[AUTO_SEQ_SURROUND] = 0x11;
spec->multiout.dac_nids[AUTO_SEQ_CENLFE] = 0x24;
if (spec->codec->vendor_id == 0x11064397)
spec->multiout.dac_nids[AUTO_SEQ_CENLFE] = 0x25;
else
spec->multiout.dac_nids[AUTO_SEQ_CENLFE] = 0x24;
}
return 0;
}
/* add playback controls from the parsed DAC table */ -static int vt1708S_auto_create_multi_out_ctls(struct via_spec *spec, +static int vt1708S_auto_create_multi_out_ctls(struct hda_codec *codec, const struct auto_pin_cfg *cfg) {
- struct via_spec *spec = codec->spec; char name[32]; static const char * const chname[4] = { "Front", "Surround", "C/LFE", "Side" };
- hda_nid_t nid_vols[] = {0x10, 0x11, 0x24, 0x25};
- hda_nid_t nid_mutes[] = {0x1C, 0x18, 0x26, 0x27};
- hda_nid_t nid_vols[2][4] = { {0x10, 0x11, 0x24, 0x25},
{0x10, 0x11, 0x25, 0} };
- hda_nid_t nid_mutes[2][4] = { {0x1C, 0x18, 0x26, 0x27},
hda_nid_t nid, nid_vol, nid_mute; int i, err;{0x1C, 0x18, 0x27, 0} };
@@ -3515,8 +3562,15 @@ if (!nid && i > AUTO_SEQ_CENLFE) continue;
nid_vol = nid_vols[i];
nid_mute = nid_mutes[i];
if (codec->vendor_id == 0x11064397) {
nid_vol = nid_vols[1][i];
nid_mute = nid_mutes[1][i];
} else {
nid_vol = nid_vols[0][i];
nid_mute = nid_mutes[0][i];
}
if (!nid_vol && !nid_mute)
continue;
if (i == AUTO_SEQ_CENLFE) { /* Center/LFE */
@@ -3670,7 +3724,7 @@ if (!spec->autocfg.line_outs && !spec->autocfg.hp_pins[0]) return 0; /* can't find valid BIOS pin config */
- err = vt1708S_auto_create_multi_out_ctls(spec, &spec->autocfg);
- err = vt1708S_auto_create_multi_out_ctls(codec, &spec->autocfg); if (err < 0) return err; err = vt1708S_auto_create_hp_ctls(spec, spec->autocfg.hp_pins[0]);
@@ -3737,17 +3791,29 @@ }
spec->init_verbs[spec->num_iverbs++] = vt1708S_volume_init_verbs;
- spec->init_verbs[spec->num_iverbs++] = vt1708S_uniwill_init_verbs;
if (codec->vendor_id == 0x11064397)
spec->init_verbs[spec->num_iverbs++] =
vt1705_uniwill_init_verbs;
else
spec->init_verbs[spec->num_iverbs++] =
vt1708S_uniwill_init_verbs;
if (codec->vendor_id == 0x11060440) spec->stream_name_analog = "VT1818S Analog";
else if (codec->vendor_id == 0x11064397)
spec->stream_name_analog = "VT1705 Analog";
else spec->stream_name_analog = "VT1708S Analog";
- spec->stream_analog_playback = &vt1708S_pcm_analog_playback;
if (codec->vendor_id == 0x11064397)
spec->stream_analog_playback = &vt1705_pcm_analog_playback;
else
spec->stream_analog_playback = &vt1708S_pcm_analog_playback;
spec->stream_analog_capture = &vt1708S_pcm_analog_capture;
if (codec->vendor_id == 0x11060440) spec->stream_name_digital = "VT1818S Digital";
else if (codec->vendor_id == 0x11064397)
spec->stream_name_digital = "VT1705 Digital";
else spec->stream_name_digital = "VT1708S Digital"; spec->stream_digital_playback = &vt1708S_pcm_digital_playback;
@@ -3785,6 +3851,14 @@ spec->stream_name_analog = "VT1818S Analog"; spec->stream_name_digital = "VT1818S Digital"; }
- /* correct names for VT1705 */
- if (codec->vendor_id == 0x11064397) {
kfree(codec->chip_name);
codec->chip_name = kstrdup("VT1705", GFP_KERNEL);
snprintf(codec->bus->card->mixername,
sizeof(codec->bus->card->mixername),
"%s %s", codec->vendor_name, codec->chip_name);
- } spec->set_widgets_power_state = set_widgets_power_state_vt1708B; return 0;
} @@ -6003,7 +6077,7 @@ .patch = patch_vt1708S}, { .id = 0x11063397, .name = "VT1708S", .patch = patch_vt1708S},
- { .id = 0x11064397, .name = "VT1708S",
- { .id = 0x11064397, .name = "VT1705", .patch = patch_vt1708S}, { .id = 0x11065397, .name = "VT1708S", .patch = patch_vt1708S},