Loading sound/pci/hda/patch_via.c +87 −13 Original line number Diff line number Diff line Loading @@ -3181,7 +3181,8 @@ static void set_widgets_power_state_vt1708B(struct hda_codec *codec) 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 */ Loading Loading @@ -3220,6 +3221,16 @@ static void set_widgets_power_state_vt1708B(struct hda_codec *codec) 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) */ Loading @@ -3239,7 +3250,9 @@ static void set_widgets_power_state_vt1708B(struct hda_codec *codec) 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); Loading Loading @@ -3414,6 +3427,18 @@ static struct hda_verb vt1708S_uniwill_init_verbs[] = { { } }; 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, Loading @@ -3427,6 +3452,19 @@ static struct hda_pcm_stream vt1708S_pcm_analog_playback = { }, }; 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, Loading Loading @@ -3473,6 +3511,9 @@ static int vt1708S_auto_fill_dac_nids(struct via_spec *spec, spec->multiout.dac_nids[i] = 0x10; break; case AUTO_SEQ_CENLFE: if (spec->codec->vendor_id == 0x11064397) spec->multiout.dac_nids[i] = 0x25; else spec->multiout.dac_nids[i] = 0x24; break; case AUTO_SEQ_SURROUND: Loading @@ -3489,6 +3530,9 @@ static int vt1708S_auto_fill_dac_nids(struct via_spec *spec, if (cfg->line_outs == 1) { spec->multiout.num_dacs = 3; spec->multiout.dac_nids[AUTO_SEQ_SURROUND] = 0x11; if (spec->codec->vendor_id == 0x11064397) spec->multiout.dac_nids[AUTO_SEQ_CENLFE] = 0x25; else spec->multiout.dac_nids[AUTO_SEQ_CENLFE] = 0x24; } Loading @@ -3496,15 +3540,18 @@ static int vt1708S_auto_fill_dac_nids(struct via_spec *spec, } /* 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}, {0x1C, 0x18, 0x27, 0} }; hda_nid_t nid, nid_vol, nid_mute; int i, err; Loading @@ -3515,8 +3562,15 @@ static int vt1708S_auto_create_multi_out_ctls(struct via_spec *spec, 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 */ Loading Loading @@ -3670,7 +3724,7 @@ static int vt1708S_parse_auto_config(struct hda_codec *codec) 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]); Loading Loading @@ -3737,17 +3791,29 @@ static int patch_vt1708S(struct hda_codec *codec) } 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"; 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; Loading Loading @@ -3785,6 +3851,14 @@ static int patch_vt1708S(struct hda_codec *codec) 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; } Loading Loading @@ -6003,7 +6077,7 @@ static struct hda_codec_preset snd_hda_preset_via[] = { .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}, Loading Loading
sound/pci/hda/patch_via.c +87 −13 Original line number Diff line number Diff line Loading @@ -3181,7 +3181,8 @@ static void set_widgets_power_state_vt1708B(struct hda_codec *codec) 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 */ Loading Loading @@ -3220,6 +3221,16 @@ static void set_widgets_power_state_vt1708B(struct hda_codec *codec) 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) */ Loading @@ -3239,7 +3250,9 @@ static void set_widgets_power_state_vt1708B(struct hda_codec *codec) 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); Loading Loading @@ -3414,6 +3427,18 @@ static struct hda_verb vt1708S_uniwill_init_verbs[] = { { } }; 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, Loading @@ -3427,6 +3452,19 @@ static struct hda_pcm_stream vt1708S_pcm_analog_playback = { }, }; 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, Loading Loading @@ -3473,6 +3511,9 @@ static int vt1708S_auto_fill_dac_nids(struct via_spec *spec, spec->multiout.dac_nids[i] = 0x10; break; case AUTO_SEQ_CENLFE: if (spec->codec->vendor_id == 0x11064397) spec->multiout.dac_nids[i] = 0x25; else spec->multiout.dac_nids[i] = 0x24; break; case AUTO_SEQ_SURROUND: Loading @@ -3489,6 +3530,9 @@ static int vt1708S_auto_fill_dac_nids(struct via_spec *spec, if (cfg->line_outs == 1) { spec->multiout.num_dacs = 3; spec->multiout.dac_nids[AUTO_SEQ_SURROUND] = 0x11; if (spec->codec->vendor_id == 0x11064397) spec->multiout.dac_nids[AUTO_SEQ_CENLFE] = 0x25; else spec->multiout.dac_nids[AUTO_SEQ_CENLFE] = 0x24; } Loading @@ -3496,15 +3540,18 @@ static int vt1708S_auto_fill_dac_nids(struct via_spec *spec, } /* 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}, {0x1C, 0x18, 0x27, 0} }; hda_nid_t nid, nid_vol, nid_mute; int i, err; Loading @@ -3515,8 +3562,15 @@ static int vt1708S_auto_create_multi_out_ctls(struct via_spec *spec, 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 */ Loading Loading @@ -3670,7 +3724,7 @@ static int vt1708S_parse_auto_config(struct hda_codec *codec) 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]); Loading Loading @@ -3737,17 +3791,29 @@ static int patch_vt1708S(struct hda_codec *codec) } 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"; 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; Loading Loading @@ -3785,6 +3851,14 @@ static int patch_vt1708S(struct hda_codec *codec) 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; } Loading Loading @@ -6003,7 +6077,7 @@ static struct hda_codec_preset snd_hda_preset_via[] = { .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}, Loading