2 * Universal Interface for Intel High Definition Audio Codec
4 * HD audio interface patch for VIA VT17xx/VT18xx/VT20xx codec
6 * (C) 2006-2009 VIA Technology, Inc.
7 * (C) 2006-2008 Takashi Iwai <tiwai@suse.de>
9 * This driver is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
14 * This driver is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
24 /* * * * * * * * * * * * * * Release History * * * * * * * * * * * * * * * * */
26 /* 2006-03-03 Lydia Wang Create the basic patch to support VT1708 codec */
27 /* 2006-03-14 Lydia Wang Modify hard code for some pin widget nid */
28 /* 2006-08-02 Lydia Wang Add support to VT1709 codec */
29 /* 2006-09-08 Lydia Wang Fix internal loopback recording source select bug */
30 /* 2007-09-12 Lydia Wang Add EAPD enable during driver initialization */
31 /* 2007-09-17 Lydia Wang Add VT1708B codec support */
32 /* 2007-11-14 Lydia Wang Add VT1708A codec HP and CD pin connect config */
33 /* 2008-02-03 Lydia Wang Fix Rear channels and Back channels inverse issue */
34 /* 2008-03-06 Lydia Wang Add VT1702 codec and VT1708S codec support */
35 /* 2008-04-09 Lydia Wang Add mute front speaker when HP plugin */
36 /* 2008-04-09 Lydia Wang Add Independent HP feature */
37 /* 2008-05-28 Lydia Wang Add second S/PDIF Out support for VT1702 */
38 /* 2008-09-15 Logan Li Add VT1708S Mic Boost workaround/backdoor */
39 /* 2009-02-16 Logan Li Add support for VT1718S */
40 /* 2009-03-13 Logan Li Add support for VT1716S */
41 /* 2009-04-14 Lydai Wang Add support for VT1828S and VT2020 */
42 /* 2009-07-08 Lydia Wang Add support for VT2002P */
43 /* 2009-07-21 Lydia Wang Add support for VT1812 */
44 /* 2009-09-19 Lydia Wang Add support for VT1818S */
46 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
49 #include <linux/init.h>
50 #include <linux/delay.h>
51 #include <linux/slab.h>
52 #include <sound/core.h>
53 #include <sound/asoundef.h>
54 #include "hda_codec.h"
55 #include "hda_local.h"
58 #define VT1708_HP_PIN_NID 0x20
59 #define VT1708_CD_PIN_NID 0x24
79 #define VT2002P_COMPATIBLE(spec) \
80 ((spec)->codec_type == VT2002P ||\
81 (spec)->codec_type == VT1812 ||\
82 (spec)->codec_type == VT1802)
84 #define MAX_NID_PATH_DEPTH 5
86 /* output-path: DAC -> ... -> pin
87 * idx[] contains the source index number of the next widget;
88 * e.g. idx[0] is the index of the DAC selected by path[1] widget
89 * multi[] indicates whether it's a selector widget with multi-connectors
90 * (i.e. the connection selection is mandatory)
91 * vol_ctl and mute_ctl contains the NIDs for the assigned mixers
95 hda_nid_t path[MAX_NID_PATH_DEPTH];
96 unsigned char idx[MAX_NID_PATH_DEPTH];
97 unsigned char multi[MAX_NID_PATH_DEPTH];
99 unsigned int mute_ctl;
103 /* codec parameterization */
104 const struct snd_kcontrol_new *mixers[6];
105 unsigned int num_mixers;
107 const struct hda_verb *init_verbs[5];
108 unsigned int num_iverbs;
110 char stream_name_analog[32];
111 char stream_name_hp[32];
112 const struct hda_pcm_stream *stream_analog_playback;
113 const struct hda_pcm_stream *stream_analog_capture;
115 char stream_name_digital[32];
116 const struct hda_pcm_stream *stream_digital_playback;
117 const struct hda_pcm_stream *stream_digital_capture;
120 struct hda_multi_out multiout;
121 hda_nid_t slave_dig_outs[2];
122 hda_nid_t hp_dac_nid;
123 int num_active_streams;
125 struct nid_path out_path[4];
126 struct nid_path hp_path;
127 struct nid_path hp_dep_path;
128 struct nid_path speaker_path;
131 unsigned int num_adc_nids;
132 hda_nid_t adc_nids[3];
133 hda_nid_t mux_nids[3];
134 hda_nid_t aa_mix_nid;
135 hda_nid_t dig_in_nid;
138 const struct hda_input_mux *input_mux;
139 unsigned int cur_mux[3];
141 /* PCM information */
142 struct hda_pcm pcm_rec[3];
144 /* dynamic controls, init_verbs and input_mux */
145 struct auto_pin_cfg autocfg;
146 struct snd_array kctls;
147 struct hda_input_mux private_imux[2];
148 hda_nid_t private_dac_nids[AUTO_CFG_MAX_OUTS];
151 unsigned int hp_independent_mode;
152 unsigned int dmic_enabled;
153 unsigned int no_pin_power_ctl;
154 enum VIA_HDA_CODEC codec_type;
157 unsigned int smart51_nums;
158 hda_nid_t smart51_pins[2];
160 const char *smart51_labels[2];
161 unsigned int smart51_enabled;
163 /* work to check hp jack state */
164 struct hda_codec *codec;
165 struct delayed_work vt1708_hp_work;
166 int vt1708_jack_detect;
167 int vt1708_hp_present;
169 void (*set_widgets_power_state)(struct hda_codec *codec);
171 struct hda_loopback_check loopback;
173 struct hda_amp_list loopback_list[8];
176 static enum VIA_HDA_CODEC get_codec_type(struct hda_codec *codec);
177 static struct via_spec * via_new_spec(struct hda_codec *codec)
179 struct via_spec *spec;
181 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
187 spec->codec_type = get_codec_type(codec);
188 /* VT1708BCE & VT1708S are almost same */
189 if (spec->codec_type == VT1708BCE)
190 spec->codec_type = VT1708S;
194 static enum VIA_HDA_CODEC get_codec_type(struct hda_codec *codec)
196 u32 vendor_id = codec->vendor_id;
197 u16 ven_id = vendor_id >> 16;
198 u16 dev_id = vendor_id & 0xffff;
199 enum VIA_HDA_CODEC codec_type;
202 if (ven_id != 0x1106)
203 codec_type = UNKNOWN;
204 else if (dev_id >= 0x1708 && dev_id <= 0x170b)
206 else if (dev_id >= 0xe710 && dev_id <= 0xe713)
207 codec_type = VT1709_10CH;
208 else if (dev_id >= 0xe714 && dev_id <= 0xe717)
209 codec_type = VT1709_6CH;
210 else if (dev_id >= 0xe720 && dev_id <= 0xe723) {
211 codec_type = VT1708B_8CH;
212 if (snd_hda_param_read(codec, 0x16, AC_PAR_CONNLIST_LEN) == 0x7)
213 codec_type = VT1708BCE;
214 } else if (dev_id >= 0xe724 && dev_id <= 0xe727)
215 codec_type = VT1708B_4CH;
216 else if ((dev_id & 0xfff) == 0x397
217 && (dev_id >> 12) < 8)
218 codec_type = VT1708S;
219 else if ((dev_id & 0xfff) == 0x398
220 && (dev_id >> 12) < 8)
222 else if ((dev_id & 0xfff) == 0x428
223 && (dev_id >> 12) < 8)
224 codec_type = VT1718S;
225 else if (dev_id == 0x0433 || dev_id == 0xa721)
226 codec_type = VT1716S;
227 else if (dev_id == 0x0441 || dev_id == 0x4441)
228 codec_type = VT1718S;
229 else if (dev_id == 0x0438 || dev_id == 0x4438)
230 codec_type = VT2002P;
231 else if (dev_id == 0x0448)
233 else if (dev_id == 0x0440)
234 codec_type = VT1708S;
235 else if ((dev_id & 0xfff) == 0x446)
238 codec_type = UNKNOWN;
242 #define VIA_JACK_EVENT 0x20
243 #define VIA_HP_EVENT 0x01
244 #define VIA_GPIO_EVENT 0x02
245 #define VIA_LINE_EVENT 0x03
250 VIA_CTL_WIDGET_ANALOG_MUTE,
253 static void analog_low_current_mode(struct hda_codec *codec);
254 static bool is_aa_path_mute(struct hda_codec *codec);
256 static void vt1708_start_hp_work(struct via_spec *spec)
258 if (spec->codec_type != VT1708 || spec->autocfg.hp_pins[0] == 0)
260 snd_hda_codec_write(spec->codec, 0x1, 0, 0xf81,
261 !spec->vt1708_jack_detect);
262 if (!delayed_work_pending(&spec->vt1708_hp_work))
263 schedule_delayed_work(&spec->vt1708_hp_work,
264 msecs_to_jiffies(100));
267 static void vt1708_stop_hp_work(struct via_spec *spec)
269 if (spec->codec_type != VT1708 || spec->autocfg.hp_pins[0] == 0)
271 if (snd_hda_get_bool_hint(spec->codec, "analog_loopback_hp_detect") == 1
272 && !is_aa_path_mute(spec->codec))
274 snd_hda_codec_write(spec->codec, 0x1, 0, 0xf81,
275 !spec->vt1708_jack_detect);
276 cancel_delayed_work_sync(&spec->vt1708_hp_work);
279 static void set_widgets_power_state(struct hda_codec *codec)
281 struct via_spec *spec = codec->spec;
282 if (spec->set_widgets_power_state)
283 spec->set_widgets_power_state(codec);
286 static int analog_input_switch_put(struct snd_kcontrol *kcontrol,
287 struct snd_ctl_elem_value *ucontrol)
289 int change = snd_hda_mixer_amp_switch_put(kcontrol, ucontrol);
290 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
292 set_widgets_power_state(codec);
293 analog_low_current_mode(snd_kcontrol_chip(kcontrol));
294 if (snd_hda_get_bool_hint(codec, "analog_loopback_hp_detect") == 1) {
295 if (is_aa_path_mute(codec))
296 vt1708_start_hp_work(codec->spec);
298 vt1708_stop_hp_work(codec->spec);
303 /* modify .put = snd_hda_mixer_amp_switch_put */
304 #define ANALOG_INPUT_MUTE \
305 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
308 .info = snd_hda_mixer_amp_switch_info, \
309 .get = snd_hda_mixer_amp_switch_get, \
310 .put = analog_input_switch_put, \
311 .private_value = HDA_COMPOSE_AMP_VAL(0, 3, 0, 0) }
313 static const struct snd_kcontrol_new via_control_templates[] = {
314 HDA_CODEC_VOLUME(NULL, 0, 0, 0),
315 HDA_CODEC_MUTE(NULL, 0, 0, 0),
320 /* add dynamic controls */
321 static struct snd_kcontrol_new *__via_clone_ctl(struct via_spec *spec,
322 const struct snd_kcontrol_new *tmpl,
325 struct snd_kcontrol_new *knew;
327 snd_array_init(&spec->kctls, sizeof(*knew), 32);
328 knew = snd_array_new(&spec->kctls);
335 knew->name = kstrdup(name, GFP_KERNEL);
342 static int __via_add_control(struct via_spec *spec, int type, const char *name,
343 int idx, unsigned long val)
345 struct snd_kcontrol_new *knew;
347 knew = __via_clone_ctl(spec, &via_control_templates[type], name);
351 if (get_amp_nid_(val))
352 knew->subdevice = HDA_SUBDEV_AMP_FLAG;
353 knew->private_value = val;
357 #define via_add_control(spec, type, name, val) \
358 __via_add_control(spec, type, name, 0, val)
360 #define via_clone_control(spec, tmpl) __via_clone_ctl(spec, tmpl, NULL)
362 static void via_free_kctls(struct hda_codec *codec)
364 struct via_spec *spec = codec->spec;
366 if (spec->kctls.list) {
367 struct snd_kcontrol_new *kctl = spec->kctls.list;
369 for (i = 0; i < spec->kctls.used; i++)
372 snd_array_free(&spec->kctls);
375 /* create input playback/capture controls for the given pin */
376 static int via_new_analog_input(struct via_spec *spec, const char *ctlname,
377 int type_idx, int idx, int mix_nid)
382 sprintf(name, "%s Playback Volume", ctlname);
383 err = __via_add_control(spec, VIA_CTL_WIDGET_VOL, name, type_idx,
384 HDA_COMPOSE_AMP_VAL(mix_nid, 3, idx, HDA_INPUT));
387 sprintf(name, "%s Playback Switch", ctlname);
388 err = __via_add_control(spec, VIA_CTL_WIDGET_ANALOG_MUTE, name, type_idx,
389 HDA_COMPOSE_AMP_VAL(mix_nid, 3, idx, HDA_INPUT));
395 /* return the index of the given widget nid as the source of mux;
396 * return -1 if not found;
397 * if num_conns is non-NULL, set the total number of connections
399 static int __get_connection_index(struct hda_codec *codec, hda_nid_t mux,
400 hda_nid_t nid, int *num_conns)
402 hda_nid_t conn[HDA_MAX_NUM_INPUTS];
405 nums = snd_hda_get_connections(codec, mux, conn, ARRAY_SIZE(conn));
408 for (i = 0; i < nums; i++)
414 #define get_connection_index(codec, mux, nid) \
415 __get_connection_index(codec, mux, nid, NULL)
417 static bool check_amp_caps(struct hda_codec *codec, hda_nid_t nid, int dir,
423 caps = get_wcaps(codec, nid);
424 if (dir == HDA_INPUT)
425 caps &= AC_WCAP_IN_AMP;
427 caps &= AC_WCAP_OUT_AMP;
430 if (query_amp_caps(codec, nid, dir) & mask)
435 #define have_mute(codec, nid, dir) \
436 check_amp_caps(codec, nid, dir, AC_AMPCAP_MUTE)
438 /* enable/disable the output-route */
439 static void activate_output_path(struct hda_codec *codec, struct nid_path *path,
440 bool enable, bool force)
443 for (i = 0; i < path->depth; i++) {
445 int idx = path->idx[i];
447 if (i < path->depth - 1)
448 dst = path->path[i + 1];
451 if (enable && path->multi[i])
452 snd_hda_codec_write(codec, dst, 0,
453 AC_VERB_SET_CONNECT_SEL, idx);
454 if (have_mute(codec, dst, HDA_INPUT)) {
455 int val = enable ? AMP_IN_UNMUTE(idx) :
457 snd_hda_codec_write(codec, dst, 0,
458 AC_VERB_SET_AMP_GAIN_MUTE, val);
460 if (!force && (src == path->vol_ctl || src == path->mute_ctl))
462 if (have_mute(codec, src, HDA_OUTPUT)) {
463 int val = enable ? AMP_OUT_UNMUTE : AMP_OUT_MUTE;
464 snd_hda_codec_write(codec, src, 0,
465 AC_VERB_SET_AMP_GAIN_MUTE, val);
470 /* set the given pin as output */
471 static void init_output_pin(struct hda_codec *codec, hda_nid_t pin,
476 snd_hda_codec_write(codec, pin, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
478 if (snd_hda_query_pin_caps(codec, pin) & AC_PINCAP_EAPD)
479 snd_hda_codec_write(codec, pin, 0,
480 AC_VERB_SET_EAPD_BTLENABLE, 0x02);
483 static void via_auto_init_output(struct hda_codec *codec,
484 struct nid_path *path, int pin_type,
487 struct via_spec *spec = codec->spec;
494 pin = path->path[path->depth - 1];
496 init_output_pin(codec, pin, pin_type);
497 caps = query_amp_caps(codec, pin, HDA_OUTPUT);
498 if (caps & AC_AMPCAP_MUTE) {
500 val = (caps & AC_AMPCAP_OFFSET) >> AC_AMPCAP_OFFSET_SHIFT;
501 snd_hda_codec_write(codec, pin, 0, AC_VERB_SET_AMP_GAIN_MUTE,
505 activate_output_path(codec, path, true, force);
507 /* initialize the AA-path */
508 if (!spec->aa_mix_nid)
510 for (i = path->depth - 1; i > 0; i--) {
512 idx = get_connection_index(codec, nid, spec->aa_mix_nid);
514 if (have_mute(codec, nid, HDA_INPUT))
515 snd_hda_codec_write(codec, nid, 0,
516 AC_VERB_SET_AMP_GAIN_MUTE,
523 static void via_auto_init_multi_out(struct hda_codec *codec)
525 struct via_spec *spec = codec->spec;
528 for (i = 0; i < spec->autocfg.line_outs + spec->smart51_nums; i++)
529 via_auto_init_output(codec, &spec->out_path[i], PIN_OUT, true);
532 static void via_auto_init_hp_out(struct hda_codec *codec)
534 struct via_spec *spec = codec->spec;
536 if (!spec->hp_dac_nid) {
537 via_auto_init_output(codec, &spec->hp_dep_path, PIN_HP, true);
540 if (spec->hp_independent_mode) {
541 activate_output_path(codec, &spec->hp_dep_path, false, false);
542 via_auto_init_output(codec, &spec->hp_path, PIN_HP, true);
544 activate_output_path(codec, &spec->hp_path, false, false);
545 via_auto_init_output(codec, &spec->hp_dep_path, PIN_HP, true);
549 static void via_auto_init_speaker_out(struct hda_codec *codec)
551 struct via_spec *spec = codec->spec;
553 if (spec->autocfg.speaker_outs)
554 via_auto_init_output(codec, &spec->speaker_path, PIN_OUT, true);
557 static bool is_smart51_pins(struct hda_codec *codec, hda_nid_t pin);
559 static void via_auto_init_analog_input(struct hda_codec *codec)
561 struct via_spec *spec = codec->spec;
562 const struct auto_pin_cfg *cfg = &spec->autocfg;
563 hda_nid_t conn[HDA_MAX_CONNECTIONS];
568 for (i = 0; i < spec->num_adc_nids; i++) {
569 snd_hda_codec_write(codec, spec->adc_nids[i], 0,
570 AC_VERB_SET_AMP_GAIN_MUTE,
575 for (i = 0; i < cfg->num_inputs; i++) {
576 hda_nid_t nid = cfg->inputs[i].pin;
577 if (spec->smart51_enabled && is_smart51_pins(codec, nid))
579 else if (cfg->inputs[i].type == AUTO_PIN_MIC)
583 snd_hda_codec_write(codec, nid, 0,
584 AC_VERB_SET_PIN_WIDGET_CONTROL, ctl);
588 for (i = 0; i < spec->num_adc_nids; i++) {
589 const struct hda_input_mux *imux = spec->input_mux;
590 if (!imux || !spec->mux_nids[i])
592 snd_hda_codec_write(codec, spec->mux_nids[i], 0,
593 AC_VERB_SET_CONNECT_SEL,
594 imux->items[spec->cur_mux[i]].index);
598 if (!spec->aa_mix_nid)
600 num_conns = snd_hda_get_connections(codec, spec->aa_mix_nid, conn,
602 for (i = 0; i < num_conns; i++) {
603 unsigned int caps = get_wcaps(codec, conn[i]);
604 if (get_wcaps_type(caps) == AC_WID_PIN)
605 snd_hda_codec_write(codec, spec->aa_mix_nid, 0,
606 AC_VERB_SET_AMP_GAIN_MUTE,
611 static void set_pin_power_state(struct hda_codec *codec, hda_nid_t nid,
612 unsigned int *affected_parm)
615 unsigned def_conf = snd_hda_codec_get_pincfg(codec, nid);
616 unsigned no_presence = (def_conf & AC_DEFCFG_MISC)
617 >> AC_DEFCFG_MISC_SHIFT
618 & AC_DEFCFG_MISC_NO_PRESENCE; /* do not support pin sense */
619 struct via_spec *spec = codec->spec;
620 unsigned present = 0;
622 no_presence |= spec->no_pin_power_ctl;
624 present = snd_hda_jack_detect(codec, nid);
625 if ((spec->smart51_enabled && is_smart51_pins(codec, nid))
626 || ((no_presence || present)
627 && get_defcfg_connect(def_conf) != AC_JACK_PORT_NONE)) {
628 *affected_parm = AC_PWRST_D0; /* if it's connected */
633 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_POWER_STATE, parm);
636 static int via_pin_power_ctl_info(struct snd_kcontrol *kcontrol,
637 struct snd_ctl_elem_info *uinfo)
639 static const char * const texts[] = {
640 "Disabled", "Enabled"
643 uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
645 uinfo->value.enumerated.items = 2;
646 if (uinfo->value.enumerated.item >= uinfo->value.enumerated.items)
647 uinfo->value.enumerated.item = uinfo->value.enumerated.items - 1;
648 strcpy(uinfo->value.enumerated.name,
649 texts[uinfo->value.enumerated.item]);
653 static int via_pin_power_ctl_get(struct snd_kcontrol *kcontrol,
654 struct snd_ctl_elem_value *ucontrol)
656 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
657 struct via_spec *spec = codec->spec;
658 ucontrol->value.enumerated.item[0] = !spec->no_pin_power_ctl;
662 static int via_pin_power_ctl_put(struct snd_kcontrol *kcontrol,
663 struct snd_ctl_elem_value *ucontrol)
665 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
666 struct via_spec *spec = codec->spec;
667 unsigned int val = !ucontrol->value.enumerated.item[0];
669 if (val == spec->no_pin_power_ctl)
671 spec->no_pin_power_ctl = val;
672 set_widgets_power_state(codec);
676 static const struct snd_kcontrol_new via_pin_power_ctl_enum = {
677 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
678 .name = "Dynamic Power-Control",
679 .info = via_pin_power_ctl_info,
680 .get = via_pin_power_ctl_get,
681 .put = via_pin_power_ctl_put,
688 static int via_mux_enum_info(struct snd_kcontrol *kcontrol,
689 struct snd_ctl_elem_info *uinfo)
691 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
692 struct via_spec *spec = codec->spec;
693 return snd_hda_input_mux_info(spec->input_mux, uinfo);
696 static int via_mux_enum_get(struct snd_kcontrol *kcontrol,
697 struct snd_ctl_elem_value *ucontrol)
699 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
700 struct via_spec *spec = codec->spec;
701 unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
703 ucontrol->value.enumerated.item[0] = spec->cur_mux[adc_idx];
707 static int via_mux_enum_put(struct snd_kcontrol *kcontrol,
708 struct snd_ctl_elem_value *ucontrol)
710 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
711 struct via_spec *spec = codec->spec;
712 unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
715 if (!spec->mux_nids[adc_idx])
717 /* switch to D0 beofre change index */
718 if (snd_hda_codec_read(codec, spec->mux_nids[adc_idx], 0,
719 AC_VERB_GET_POWER_STATE, 0x00) != AC_PWRST_D0)
720 snd_hda_codec_write(codec, spec->mux_nids[adc_idx], 0,
721 AC_VERB_SET_POWER_STATE, AC_PWRST_D0);
723 ret = snd_hda_input_mux_put(codec, spec->input_mux, ucontrol,
724 spec->mux_nids[adc_idx],
725 &spec->cur_mux[adc_idx]);
726 /* update jack power state */
727 set_widgets_power_state(codec);
732 static int via_independent_hp_info(struct snd_kcontrol *kcontrol,
733 struct snd_ctl_elem_info *uinfo)
735 static const char * const texts[] = { "OFF", "ON" };
737 uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
739 uinfo->value.enumerated.items = 2;
740 if (uinfo->value.enumerated.item >= 2)
741 uinfo->value.enumerated.item = 1;
742 strcpy(uinfo->value.enumerated.name,
743 texts[uinfo->value.enumerated.item]);
747 static int via_independent_hp_get(struct snd_kcontrol *kcontrol,
748 struct snd_ctl_elem_value *ucontrol)
750 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
751 struct via_spec *spec = codec->spec;
753 ucontrol->value.enumerated.item[0] = spec->hp_independent_mode;
757 static int via_independent_hp_put(struct snd_kcontrol *kcontrol,
758 struct snd_ctl_elem_value *ucontrol)
760 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
761 struct via_spec *spec = codec->spec;
763 spec->hp_independent_mode = !!ucontrol->value.enumerated.item[0];
764 if (spec->hp_independent_mode) {
765 activate_output_path(codec, &spec->hp_dep_path, false, false);
766 activate_output_path(codec, &spec->hp_path, true, false);
768 activate_output_path(codec, &spec->hp_path, false, false);
769 activate_output_path(codec, &spec->hp_dep_path, true, false);
772 /* update jack power state */
773 set_widgets_power_state(codec);
777 static const struct snd_kcontrol_new via_hp_mixer = {
778 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
779 .name = "Independent HP",
780 .info = via_independent_hp_info,
781 .get = via_independent_hp_get,
782 .put = via_independent_hp_put,
785 static int via_hp_build(struct hda_codec *codec)
787 struct via_spec *spec = codec->spec;
788 struct snd_kcontrol_new *knew;
791 nid = spec->autocfg.hp_pins[0];
792 knew = via_clone_control(spec, &via_hp_mixer);
796 knew->subdevice = HDA_SUBDEV_NID_FLAG | nid;
801 static void notify_aa_path_ctls(struct hda_codec *codec)
803 struct via_spec *spec = codec->spec;
806 for (i = 0; i < spec->smart51_nums; i++) {
807 struct snd_kcontrol *ctl;
808 struct snd_ctl_elem_id id;
809 memset(&id, 0, sizeof(id));
810 id.iface = SNDRV_CTL_ELEM_IFACE_MIXER;
811 sprintf(id.name, "%s Playback Volume", spec->smart51_labels[i]);
812 ctl = snd_hda_find_mixer_ctl(codec, id.name);
814 snd_ctl_notify(codec->bus->card,
815 SNDRV_CTL_EVENT_MASK_VALUE,
820 static void mute_aa_path(struct hda_codec *codec, int mute)
822 struct via_spec *spec = codec->spec;
823 int val = mute ? HDA_AMP_MUTE : HDA_AMP_UNMUTE;
826 /* check AA path's mute status */
827 for (i = 0; i < spec->smart51_nums; i++) {
828 if (spec->smart51_idxs[i] < 0)
830 snd_hda_codec_amp_stereo(codec, spec->aa_mix_nid,
831 HDA_INPUT, spec->smart51_idxs[i],
836 static bool is_smart51_pins(struct hda_codec *codec, hda_nid_t pin)
838 struct via_spec *spec = codec->spec;
841 for (i = 0; i < spec->smart51_nums; i++)
842 if (spec->smart51_pins[i] == pin)
847 static int via_smart51_info(struct snd_kcontrol *kcontrol,
848 struct snd_ctl_elem_info *uinfo)
850 uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN;
852 uinfo->value.integer.min = 0;
853 uinfo->value.integer.max = 1;
857 static int via_smart51_get(struct snd_kcontrol *kcontrol,
858 struct snd_ctl_elem_value *ucontrol)
860 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
861 struct via_spec *spec = codec->spec;
865 for (i = 0; i < spec->smart51_nums; i++) {
866 hda_nid_t nid = spec->smart51_pins[i];
868 ctl = snd_hda_codec_read(codec, nid, 0,
869 AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
870 if ((ctl & AC_PINCTL_IN_EN) && !(ctl & AC_PINCTL_OUT_EN))
873 *ucontrol->value.integer.value = on;
877 static int via_smart51_put(struct snd_kcontrol *kcontrol,
878 struct snd_ctl_elem_value *ucontrol)
880 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
881 struct via_spec *spec = codec->spec;
882 int out_in = *ucontrol->value.integer.value
883 ? AC_PINCTL_OUT_EN : AC_PINCTL_IN_EN;
886 for (i = 0; i < spec->smart51_nums; i++) {
887 hda_nid_t nid = spec->smart51_pins[i];
890 parm = snd_hda_codec_read(codec, nid, 0,
891 AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
892 parm &= ~(AC_PINCTL_IN_EN | AC_PINCTL_OUT_EN);
894 snd_hda_codec_write(codec, nid, 0,
895 AC_VERB_SET_PIN_WIDGET_CONTROL,
897 if (out_in == AC_PINCTL_OUT_EN) {
898 mute_aa_path(codec, 1);
899 notify_aa_path_ctls(codec);
902 spec->smart51_enabled = *ucontrol->value.integer.value;
903 set_widgets_power_state(codec);
907 static const struct snd_kcontrol_new via_smart51_mixer = {
908 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
911 .info = via_smart51_info,
912 .get = via_smart51_get,
913 .put = via_smart51_put,
916 static int via_smart51_build(struct hda_codec *codec)
918 struct via_spec *spec = codec->spec;
920 if (!spec->smart51_nums)
922 if (!via_clone_control(spec, &via_smart51_mixer))
927 /* check AA path's mute status */
928 static bool is_aa_path_mute(struct hda_codec *codec)
930 struct via_spec *spec = codec->spec;
931 const struct hda_amp_list *p;
934 for (i = 0; i < spec->num_loopbacks; i++) {
935 p = &spec->loopback_list[i];
936 for (ch = 0; ch < 2; ch++) {
937 v = snd_hda_codec_amp_read(codec, p->nid, ch, p->dir,
939 if (!(v & HDA_AMP_MUTE) && v > 0)
946 /* enter/exit analog low-current mode */
947 static void analog_low_current_mode(struct hda_codec *codec)
949 struct via_spec *spec = codec->spec;
951 unsigned int verb, parm;
953 enable = is_aa_path_mute(codec) && (spec->num_active_streams > 0);
955 /* decide low current mode's verb & parameter */
956 switch (spec->codec_type) {
960 parm = enable ? 0x02 : 0x00; /* 0x02: 2/3x, 0x00: 1x */
966 parm = enable ? 0x51 : 0xe1; /* 0x51: 4/28x, 0xe1: 1x */
970 parm = enable ? 0x01 : 0x1d; /* 0x01: 4/40x, 0x1d: 1x */
976 parm = enable ? 0x00 : 0xe0; /* 0x00: 4/40x, 0xe0: 1x */
979 return; /* other codecs are not supported */
982 snd_hda_codec_write(codec, codec->afg, 0, verb, parm);
986 * generic initialization of ADC, input mixers and output mixers
988 static const struct hda_verb vt1708_init_verbs[] = {
989 /* power down jack detect function */
994 static void set_stream_active(struct hda_codec *codec, bool active)
996 struct via_spec *spec = codec->spec;
999 spec->num_active_streams++;
1001 spec->num_active_streams--;
1002 analog_low_current_mode(codec);
1005 static int via_playback_multi_pcm_open(struct hda_pcm_stream *hinfo,
1006 struct hda_codec *codec,
1007 struct snd_pcm_substream *substream)
1009 struct via_spec *spec = codec->spec;
1012 if (!spec->hp_independent_mode)
1013 spec->multiout.hp_nid = spec->hp_dac_nid;
1014 set_stream_active(codec, true);
1015 err = snd_hda_multi_out_analog_open(codec, &spec->multiout, substream,
1018 spec->multiout.hp_nid = 0;
1019 set_stream_active(codec, false);
1025 static int via_playback_multi_pcm_close(struct hda_pcm_stream *hinfo,
1026 struct hda_codec *codec,
1027 struct snd_pcm_substream *substream)
1029 struct via_spec *spec = codec->spec;
1031 spec->multiout.hp_nid = 0;
1032 set_stream_active(codec, false);
1036 static int via_playback_hp_pcm_open(struct hda_pcm_stream *hinfo,
1037 struct hda_codec *codec,
1038 struct snd_pcm_substream *substream)
1040 struct via_spec *spec = codec->spec;
1042 if (snd_BUG_ON(!spec->hp_dac_nid))
1044 if (!spec->hp_independent_mode || spec->multiout.hp_nid)
1046 set_stream_active(codec, true);
1050 static int via_playback_hp_pcm_close(struct hda_pcm_stream *hinfo,
1051 struct hda_codec *codec,
1052 struct snd_pcm_substream *substream)
1054 set_stream_active(codec, false);
1058 static int via_playback_multi_pcm_prepare(struct hda_pcm_stream *hinfo,
1059 struct hda_codec *codec,
1060 unsigned int stream_tag,
1061 unsigned int format,
1062 struct snd_pcm_substream *substream)
1064 struct via_spec *spec = codec->spec;
1066 snd_hda_multi_out_analog_prepare(codec, &spec->multiout, stream_tag,
1068 vt1708_start_hp_work(spec);
1072 static int via_playback_hp_pcm_prepare(struct hda_pcm_stream *hinfo,
1073 struct hda_codec *codec,
1074 unsigned int stream_tag,
1075 unsigned int format,
1076 struct snd_pcm_substream *substream)
1078 struct via_spec *spec = codec->spec;
1080 snd_hda_codec_setup_stream(codec, spec->hp_dac_nid,
1081 stream_tag, 0, format);
1082 vt1708_start_hp_work(spec);
1086 static int via_playback_multi_pcm_cleanup(struct hda_pcm_stream *hinfo,
1087 struct hda_codec *codec,
1088 struct snd_pcm_substream *substream)
1090 struct via_spec *spec = codec->spec;
1092 snd_hda_multi_out_analog_cleanup(codec, &spec->multiout);
1093 vt1708_stop_hp_work(spec);
1097 static int via_playback_hp_pcm_cleanup(struct hda_pcm_stream *hinfo,
1098 struct hda_codec *codec,
1099 struct snd_pcm_substream *substream)
1101 struct via_spec *spec = codec->spec;
1103 snd_hda_codec_setup_stream(codec, spec->hp_dac_nid, 0, 0, 0);
1104 vt1708_stop_hp_work(spec);
1111 static int via_dig_playback_pcm_open(struct hda_pcm_stream *hinfo,
1112 struct hda_codec *codec,
1113 struct snd_pcm_substream *substream)
1115 struct via_spec *spec = codec->spec;
1116 return snd_hda_multi_out_dig_open(codec, &spec->multiout);
1119 static int via_dig_playback_pcm_close(struct hda_pcm_stream *hinfo,
1120 struct hda_codec *codec,
1121 struct snd_pcm_substream *substream)
1123 struct via_spec *spec = codec->spec;
1124 return snd_hda_multi_out_dig_close(codec, &spec->multiout);
1127 static int via_dig_playback_pcm_prepare(struct hda_pcm_stream *hinfo,
1128 struct hda_codec *codec,
1129 unsigned int stream_tag,
1130 unsigned int format,
1131 struct snd_pcm_substream *substream)
1133 struct via_spec *spec = codec->spec;
1134 return snd_hda_multi_out_dig_prepare(codec, &spec->multiout,
1135 stream_tag, format, substream);
1138 static int via_dig_playback_pcm_cleanup(struct hda_pcm_stream *hinfo,
1139 struct hda_codec *codec,
1140 struct snd_pcm_substream *substream)
1142 struct via_spec *spec = codec->spec;
1143 snd_hda_multi_out_dig_cleanup(codec, &spec->multiout);
1150 static int via_capture_pcm_prepare(struct hda_pcm_stream *hinfo,
1151 struct hda_codec *codec,
1152 unsigned int stream_tag,
1153 unsigned int format,
1154 struct snd_pcm_substream *substream)
1156 struct via_spec *spec = codec->spec;
1158 snd_hda_codec_setup_stream(codec, spec->adc_nids[substream->number],
1159 stream_tag, 0, format);
1163 static int via_capture_pcm_cleanup(struct hda_pcm_stream *hinfo,
1164 struct hda_codec *codec,
1165 struct snd_pcm_substream *substream)
1167 struct via_spec *spec = codec->spec;
1168 snd_hda_codec_cleanup_stream(codec, spec->adc_nids[substream->number]);
1172 static const struct hda_pcm_stream via_pcm_analog_playback = {
1176 /* NID is set in via_build_pcms */
1178 .open = via_playback_multi_pcm_open,
1179 .close = via_playback_multi_pcm_close,
1180 .prepare = via_playback_multi_pcm_prepare,
1181 .cleanup = via_playback_multi_pcm_cleanup
1185 static const struct hda_pcm_stream via_pcm_hp_playback = {
1189 /* NID is set in via_build_pcms */
1191 .open = via_playback_hp_pcm_open,
1192 .close = via_playback_hp_pcm_close,
1193 .prepare = via_playback_hp_pcm_prepare,
1194 .cleanup = via_playback_hp_pcm_cleanup
1198 static const struct hda_pcm_stream vt1708_pcm_analog_s16_playback = {
1202 /* NID is set in via_build_pcms */
1203 /* We got noisy outputs on the right channel on VT1708 when
1204 * 24bit samples are used. Until any workaround is found,
1205 * disable the 24bit format, so far.
1207 .formats = SNDRV_PCM_FMTBIT_S16_LE,
1209 .open = via_playback_multi_pcm_open,
1210 .close = via_playback_multi_pcm_close,
1211 .prepare = via_playback_multi_pcm_prepare,
1212 .cleanup = via_playback_multi_pcm_cleanup
1216 static const struct hda_pcm_stream via_pcm_analog_capture = {
1217 .substreams = 1, /* will be changed in via_build_pcms() */
1220 /* NID is set in via_build_pcms */
1222 .prepare = via_capture_pcm_prepare,
1223 .cleanup = via_capture_pcm_cleanup
1227 static const struct hda_pcm_stream via_pcm_digital_playback = {
1231 /* NID is set in via_build_pcms */
1233 .open = via_dig_playback_pcm_open,
1234 .close = via_dig_playback_pcm_close,
1235 .prepare = via_dig_playback_pcm_prepare,
1236 .cleanup = via_dig_playback_pcm_cleanup
1240 static const struct hda_pcm_stream via_pcm_digital_capture = {
1247 * slave controls for virtual master
1249 static const char * const via_slave_vols[] = {
1250 "Front Playback Volume",
1251 "Surround Playback Volume",
1252 "Center Playback Volume",
1253 "LFE Playback Volume",
1254 "Side Playback Volume",
1255 "Headphone Playback Volume",
1256 "Speaker Playback Volume",
1260 static const char * const via_slave_sws[] = {
1261 "Front Playback Switch",
1262 "Surround Playback Switch",
1263 "Center Playback Switch",
1264 "LFE Playback Switch",
1265 "Side Playback Switch",
1266 "Headphone Playback Switch",
1267 "Speaker Playback Switch",
1271 static int via_build_controls(struct hda_codec *codec)
1273 struct via_spec *spec = codec->spec;
1274 struct snd_kcontrol *kctl;
1277 if (spec->set_widgets_power_state)
1278 if (!via_clone_control(spec, &via_pin_power_ctl_enum))
1281 for (i = 0; i < spec->num_mixers; i++) {
1282 err = snd_hda_add_new_ctls(codec, spec->mixers[i]);
1287 if (spec->multiout.dig_out_nid) {
1288 err = snd_hda_create_spdif_out_ctls(codec,
1289 spec->multiout.dig_out_nid,
1290 spec->multiout.dig_out_nid);
1293 err = snd_hda_create_spdif_share_sw(codec,
1297 spec->multiout.share_spdif = 1;
1299 if (spec->dig_in_nid) {
1300 err = snd_hda_create_spdif_in_ctls(codec, spec->dig_in_nid);
1305 /* if we have no master control, let's create it */
1306 if (!snd_hda_find_mixer_ctl(codec, "Master Playback Volume")) {
1307 unsigned int vmaster_tlv[4];
1308 snd_hda_set_vmaster_tlv(codec, spec->multiout.dac_nids[0],
1309 HDA_OUTPUT, vmaster_tlv);
1310 err = snd_hda_add_vmaster(codec, "Master Playback Volume",
1311 vmaster_tlv, via_slave_vols);
1315 if (!snd_hda_find_mixer_ctl(codec, "Master Playback Switch")) {
1316 err = snd_hda_add_vmaster(codec, "Master Playback Switch",
1317 NULL, via_slave_sws);
1322 /* assign Capture Source enums to NID */
1323 kctl = snd_hda_find_mixer_ctl(codec, "Input Source");
1324 for (i = 0; kctl && i < kctl->count; i++) {
1325 err = snd_hda_add_nid(codec, kctl, i, spec->mux_nids[i]);
1330 /* init power states */
1331 set_widgets_power_state(codec);
1332 analog_low_current_mode(codec);
1334 via_free_kctls(codec); /* no longer needed */
1338 static int via_build_pcms(struct hda_codec *codec)
1340 struct via_spec *spec = codec->spec;
1341 struct hda_pcm *info = spec->pcm_rec;
1343 codec->num_pcms = 1;
1344 codec->pcm_info = info;
1346 snprintf(spec->stream_name_analog, sizeof(spec->stream_name_analog),
1347 "%s Analog", codec->chip_name);
1348 info->name = spec->stream_name_analog;
1350 if (!spec->stream_analog_playback)
1351 spec->stream_analog_playback = &via_pcm_analog_playback;
1352 info->stream[SNDRV_PCM_STREAM_PLAYBACK] =
1353 *spec->stream_analog_playback;
1354 info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid =
1355 spec->multiout.dac_nids[0];
1356 info->stream[SNDRV_PCM_STREAM_PLAYBACK].channels_max =
1357 spec->multiout.max_channels;
1359 if (!spec->stream_analog_capture)
1360 spec->stream_analog_capture = &via_pcm_analog_capture;
1361 info->stream[SNDRV_PCM_STREAM_CAPTURE] =
1362 *spec->stream_analog_capture;
1363 info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->adc_nids[0];
1364 info->stream[SNDRV_PCM_STREAM_CAPTURE].substreams =
1367 if (spec->multiout.dig_out_nid || spec->dig_in_nid) {
1370 snprintf(spec->stream_name_digital,
1371 sizeof(spec->stream_name_digital),
1372 "%s Digital", codec->chip_name);
1373 info->name = spec->stream_name_digital;
1374 info->pcm_type = HDA_PCM_TYPE_SPDIF;
1375 if (spec->multiout.dig_out_nid) {
1376 if (!spec->stream_digital_playback)
1377 spec->stream_digital_playback =
1378 &via_pcm_digital_playback;
1379 info->stream[SNDRV_PCM_STREAM_PLAYBACK] =
1380 *spec->stream_digital_playback;
1381 info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid =
1382 spec->multiout.dig_out_nid;
1384 if (spec->dig_in_nid) {
1385 if (!spec->stream_digital_capture)
1386 spec->stream_digital_capture =
1387 &via_pcm_digital_capture;
1388 info->stream[SNDRV_PCM_STREAM_CAPTURE] =
1389 *spec->stream_digital_capture;
1390 info->stream[SNDRV_PCM_STREAM_CAPTURE].nid =
1395 if (spec->hp_dac_nid) {
1398 snprintf(spec->stream_name_hp, sizeof(spec->stream_name_hp),
1399 "%s HP", codec->chip_name);
1400 info->name = spec->stream_name_hp;
1401 info->stream[SNDRV_PCM_STREAM_PLAYBACK] = via_pcm_hp_playback;
1402 info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid =
1408 static void via_free(struct hda_codec *codec)
1410 struct via_spec *spec = codec->spec;
1415 via_free_kctls(codec);
1416 vt1708_stop_hp_work(spec);
1420 /* mute/unmute outputs */
1421 static void toggle_output_mutes(struct hda_codec *codec, int num_pins,
1422 hda_nid_t *pins, bool mute)
1425 for (i = 0; i < num_pins; i++)
1426 snd_hda_codec_write(codec, pins[i], 0,
1427 AC_VERB_SET_PIN_WIDGET_CONTROL,
1428 mute ? 0 : PIN_OUT);
1431 /* mute internal speaker if line-out is plugged */
1432 static void via_line_automute(struct hda_codec *codec, int present)
1434 struct via_spec *spec = codec->spec;
1436 if (!spec->autocfg.speaker_outs)
1439 present = snd_hda_jack_detect(codec,
1440 spec->autocfg.line_out_pins[0]);
1441 toggle_output_mutes(codec, spec->autocfg.speaker_outs,
1442 spec->autocfg.speaker_pins,
1446 /* mute internal speaker if HP is plugged */
1447 static void via_hp_automute(struct hda_codec *codec)
1450 struct via_spec *spec = codec->spec;
1452 if (!spec->hp_independent_mode && spec->autocfg.hp_pins[0]) {
1453 present = snd_hda_jack_detect(codec, spec->autocfg.hp_pins[0]);
1454 toggle_output_mutes(codec, spec->autocfg.line_outs,
1455 spec->autocfg.line_out_pins,
1458 via_line_automute(codec, present);
1461 static void via_gpio_control(struct hda_codec *codec)
1463 unsigned int gpio_data;
1464 unsigned int vol_counter;
1466 unsigned int master_vol;
1468 struct via_spec *spec = codec->spec;
1470 gpio_data = snd_hda_codec_read(codec, codec->afg, 0,
1471 AC_VERB_GET_GPIO_DATA, 0) & 0x03;
1473 vol_counter = (snd_hda_codec_read(codec, codec->afg, 0,
1474 0xF84, 0) & 0x3F0000) >> 16;
1476 vol = vol_counter & 0x1F;
1477 master_vol = snd_hda_codec_read(codec, 0x1A, 0,
1478 AC_VERB_GET_AMP_GAIN_MUTE,
1481 if (gpio_data == 0x02) {
1482 /* unmute line out */
1483 snd_hda_codec_write(codec, spec->autocfg.line_out_pins[0], 0,
1484 AC_VERB_SET_PIN_WIDGET_CONTROL,
1486 if (vol_counter & 0x20) {
1487 /* decrease volume */
1488 if (vol > master_vol)
1490 snd_hda_codec_amp_stereo(codec, 0x1A, HDA_INPUT,
1494 /* increase volume */
1495 snd_hda_codec_amp_stereo(codec, 0x1A, HDA_INPUT, 0,
1497 ((master_vol+vol) > 0x2A) ? 0x2A :
1500 } else if (!(gpio_data & 0x02)) {
1502 snd_hda_codec_write(codec, spec->autocfg.line_out_pins[0], 0,
1503 AC_VERB_SET_PIN_WIDGET_CONTROL,
1508 /* unsolicited event for jack sensing */
1509 static void via_unsol_event(struct hda_codec *codec,
1514 if (res & VIA_JACK_EVENT)
1515 set_widgets_power_state(codec);
1517 res &= ~VIA_JACK_EVENT;
1519 if (res == VIA_HP_EVENT)
1520 via_hp_automute(codec);
1521 else if (res == VIA_GPIO_EVENT)
1522 via_gpio_control(codec);
1523 else if (res == VIA_LINE_EVENT)
1524 via_line_automute(codec, false);
1527 #ifdef SND_HDA_NEEDS_RESUME
1528 static int via_suspend(struct hda_codec *codec, pm_message_t state)
1530 struct via_spec *spec = codec->spec;
1531 vt1708_stop_hp_work(spec);
1536 #ifdef CONFIG_SND_HDA_POWER_SAVE
1537 static int via_check_power_status(struct hda_codec *codec, hda_nid_t nid)
1539 struct via_spec *spec = codec->spec;
1540 return snd_hda_check_amp_list_power(codec, &spec->loopback, nid);
1547 static int via_init(struct hda_codec *codec);
1549 static const struct hda_codec_ops via_patch_ops = {
1550 .build_controls = via_build_controls,
1551 .build_pcms = via_build_pcms,
1554 .unsol_event = via_unsol_event,
1555 #ifdef SND_HDA_NEEDS_RESUME
1556 .suspend = via_suspend,
1558 #ifdef CONFIG_SND_HDA_POWER_SAVE
1559 .check_power_status = via_check_power_status,
1563 static bool is_empty_dac(struct hda_codec *codec, hda_nid_t dac)
1565 struct via_spec *spec = codec->spec;
1568 for (i = 0; i < spec->multiout.num_dacs; i++) {
1569 if (spec->multiout.dac_nids[i] == dac)
1572 if (spec->hp_dac_nid == dac)
1577 static bool __parse_output_path(struct hda_codec *codec, hda_nid_t nid,
1578 hda_nid_t target_dac, struct nid_path *path,
1579 int depth, int wid_type)
1584 nums = snd_hda_get_connections(codec, nid, conn, ARRAY_SIZE(conn));
1585 for (i = 0; i < nums; i++) {
1586 if (get_wcaps_type(get_wcaps(codec, conn[i])) != AC_WID_AUD_OUT)
1588 if (conn[i] == target_dac || is_empty_dac(codec, conn[i]))
1591 if (depth >= MAX_NID_PATH_DEPTH)
1593 for (i = 0; i < nums; i++) {
1595 type = get_wcaps_type(get_wcaps(codec, conn[i]));
1596 if (type == AC_WID_AUD_OUT ||
1597 (wid_type != -1 && type != wid_type))
1599 if (__parse_output_path(codec, conn[i], target_dac,
1600 path, depth + 1, AC_WID_AUD_SEL))
1606 path->path[path->depth] = conn[i];
1607 path->idx[path->depth] = i;
1608 if (nums > 1 && get_wcaps_type(get_wcaps(codec, nid)) != AC_WID_AUD_MIX)
1609 path->multi[path->depth] = 1;
1614 static bool parse_output_path(struct hda_codec *codec, hda_nid_t nid,
1615 hda_nid_t target_dac, struct nid_path *path)
1617 if (__parse_output_path(codec, nid, target_dac, path, 1, -1)) {
1618 path->path[path->depth] = nid;
1625 static int via_auto_fill_dac_nids(struct hda_codec *codec)
1627 struct via_spec *spec = codec->spec;
1628 const struct auto_pin_cfg *cfg = &spec->autocfg;
1632 spec->multiout.dac_nids = spec->private_dac_nids;
1633 spec->multiout.num_dacs = cfg->line_outs;
1634 for (i = 0; i < cfg->line_outs; i++) {
1635 nid = cfg->line_out_pins[i];
1638 if (parse_output_path(codec, nid, 0, &spec->out_path[i]))
1639 spec->private_dac_nids[i] = spec->out_path[i].path[0];
1644 static int create_ch_ctls(struct hda_codec *codec, const char *pfx,
1645 int chs, bool check_dac, struct nid_path *path)
1647 struct via_spec *spec = codec->spec;
1649 hda_nid_t dac, pin, sel, nid;
1652 dac = check_dac ? path->path[0] : 0;
1653 pin = path->path[path->depth - 1];
1654 sel = path->depth > 1 ? path->path[1] : 0;
1656 if (dac && check_amp_caps(codec, dac, HDA_OUTPUT, AC_AMPCAP_NUM_STEPS))
1658 else if (check_amp_caps(codec, pin, HDA_OUTPUT, AC_AMPCAP_NUM_STEPS))
1660 else if (check_amp_caps(codec, sel, HDA_OUTPUT, AC_AMPCAP_NUM_STEPS))
1665 sprintf(name, "%s Playback Volume", pfx);
1666 err = via_add_control(spec, VIA_CTL_WIDGET_VOL, name,
1667 HDA_COMPOSE_AMP_VAL(nid, chs, 0, HDA_OUTPUT));
1670 path->vol_ctl = nid;
1673 if (dac && check_amp_caps(codec, dac, HDA_OUTPUT, AC_AMPCAP_MUTE))
1675 else if (check_amp_caps(codec, pin, HDA_OUTPUT, AC_AMPCAP_MUTE))
1677 else if (check_amp_caps(codec, sel, HDA_OUTPUT, AC_AMPCAP_MUTE))
1682 sprintf(name, "%s Playback Switch", pfx);
1683 err = via_add_control(spec, VIA_CTL_WIDGET_MUTE, name,
1684 HDA_COMPOSE_AMP_VAL(nid, chs, 0, HDA_OUTPUT));
1687 path->mute_ctl = nid;
1692 static void mangle_smart51(struct hda_codec *codec)
1694 struct via_spec *spec = codec->spec;
1695 struct auto_pin_cfg *cfg = &spec->autocfg;
1696 struct auto_pin_cfg_item *ins = cfg->inputs;
1697 int i, j, nums, attr;
1698 int pins[AUTO_CFG_MAX_INS];
1700 for (attr = INPUT_PIN_ATTR_REAR; attr >= INPUT_PIN_ATTR_NORMAL; attr--) {
1702 for (i = 0; i < cfg->num_inputs; i++) {
1704 if (ins[i].type > AUTO_PIN_LINE_IN)
1706 def = snd_hda_codec_get_pincfg(codec, ins[i].pin);
1707 if (snd_hda_get_input_pin_attr(def) != attr)
1709 for (j = 0; j < nums; j++)
1710 if (ins[pins[j]].type < ins[i].type) {
1711 memmove(pins + j + 1, pins + j,
1712 (nums - j - 1) * sizeof(int));
1718 if (cfg->line_outs + nums < 3)
1720 for (i = 0; i < nums; i++) {
1721 hda_nid_t pin = ins[pins[i]].pin;
1722 spec->smart51_pins[spec->smart51_nums++] = pin;
1723 cfg->line_out_pins[cfg->line_outs++] = pin;
1724 if (cfg->line_outs == 3)
1731 /* add playback controls from the parsed DAC table */
1732 static int via_auto_create_multi_out_ctls(struct hda_codec *codec)
1734 struct via_spec *spec = codec->spec;
1735 struct auto_pin_cfg *cfg = &spec->autocfg;
1736 static const char * const chname[4] = {
1737 "Front", "Surround", "C/LFE", "Side"
1743 old_line_outs = cfg->line_outs;
1744 if (cfg->line_outs == 1)
1745 mangle_smart51(codec);
1747 err = via_auto_fill_dac_nids(codec);
1751 for (i = 0; i < cfg->line_outs; i++) {
1753 pin = cfg->line_out_pins[i];
1754 dac = spec->multiout.dac_nids[i];
1757 if (i == HDA_CLFE) {
1758 err = create_ch_ctls(codec, "Center", 1, true,
1759 &spec->out_path[i]);
1762 err = create_ch_ctls(codec, "LFE", 2, true,
1763 &spec->out_path[i]);
1767 const char *pfx = chname[i];
1768 if (cfg->line_out_type == AUTO_PIN_SPEAKER_OUT &&
1769 cfg->line_outs == 1)
1771 err = create_ch_ctls(codec, pfx, 3, true,
1772 &spec->out_path[i]);
1778 idx = get_connection_index(codec, spec->aa_mix_nid,
1779 spec->multiout.dac_nids[0]);
1781 /* add control to mixer */
1782 err = via_add_control(spec, VIA_CTL_WIDGET_VOL,
1783 "PCM Playback Volume",
1784 HDA_COMPOSE_AMP_VAL(spec->aa_mix_nid, 3,
1788 err = via_add_control(spec, VIA_CTL_WIDGET_MUTE,
1789 "PCM Playback Switch",
1790 HDA_COMPOSE_AMP_VAL(spec->aa_mix_nid, 3,
1796 cfg->line_outs = old_line_outs;
1801 static int via_auto_create_hp_ctls(struct hda_codec *codec, hda_nid_t pin)
1803 struct via_spec *spec = codec->spec;
1804 struct nid_path *path;
1810 if (parse_output_path(codec, pin, 0, &spec->hp_path))
1811 spec->hp_dac_nid = spec->hp_path.path[0];
1813 if (!parse_output_path(codec, pin, spec->multiout.dac_nids[HDA_FRONT],
1814 &spec->hp_dep_path) &&
1818 if (spec->hp_dac_nid)
1819 path = &spec->hp_path;
1821 path = &spec->hp_dep_path;
1822 err = create_ch_ctls(codec, "Headphone", 3, false, path);
1825 if (spec->hp_dac_nid) {
1826 spec->hp_dep_path.vol_ctl = spec->hp_path.vol_ctl;
1827 spec->hp_dep_path.mute_ctl = spec->hp_path.mute_ctl;
1833 static int via_auto_create_speaker_ctls(struct hda_codec *codec)
1835 struct via_spec *spec = codec->spec;
1838 pin = spec->autocfg.speaker_pins[0];
1839 if (!spec->autocfg.speaker_outs || !pin)
1842 if (parse_output_path(codec, pin, 0, &spec->speaker_path)) {
1843 dac = spec->speaker_path.path[0];
1844 spec->multiout.extra_out_nid[0] = dac;
1845 return create_ch_ctls(codec, "Speaker", 3, true,
1846 &spec->speaker_path);
1848 if (parse_output_path(codec, pin, spec->multiout.dac_nids[HDA_FRONT],
1849 &spec->speaker_path))
1850 return create_ch_ctls(codec, "Speaker", 3, false,
1851 &spec->speaker_path);
1857 static int via_fill_adcs(struct hda_codec *codec)
1859 struct via_spec *spec = codec->spec;
1860 hda_nid_t nid = codec->start_nid;
1863 for (i = 0; i < codec->num_nodes; i++, nid++) {
1864 unsigned int wcaps = get_wcaps(codec, nid);
1865 if (get_wcaps_type(wcaps) != AC_WID_AUD_IN)
1867 if (wcaps & AC_WCAP_DIGITAL)
1869 if (!(wcaps & AC_WCAP_CONN_LIST))
1871 if (spec->num_adc_nids >= ARRAY_SIZE(spec->adc_nids))
1873 spec->adc_nids[spec->num_adc_nids++] = nid;
1878 static int get_mux_nids(struct hda_codec *codec);
1880 static const struct snd_kcontrol_new via_input_src_ctl = {
1881 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1882 /* The multiple "Capture Source" controls confuse alsamixer
1883 * So call somewhat different..
1885 /* .name = "Capture Source", */
1886 .name = "Input Source",
1887 .info = via_mux_enum_info,
1888 .get = via_mux_enum_get,
1889 .put = via_mux_enum_put,
1892 static void add_loopback_list(struct via_spec *spec, hda_nid_t mix, int idx)
1894 struct hda_amp_list *list;
1896 if (spec->num_loopbacks >= ARRAY_SIZE(spec->loopback_list) - 1)
1898 list = spec->loopback_list + spec->num_loopbacks;
1900 list->dir = HDA_INPUT;
1902 spec->num_loopbacks++;
1903 spec->loopback.amplist = spec->loopback_list;
1906 /* create playback/capture controls for input pins */
1907 static int via_auto_create_analog_input_ctls(struct hda_codec *codec,
1908 const struct auto_pin_cfg *cfg)
1910 struct via_spec *spec = codec->spec;
1911 struct hda_input_mux *imux = &spec->private_imux[0];
1912 int i, j, err, idx, idx2, type, type_idx = 0;
1913 const char *prev_label = NULL;
1915 hda_nid_t pin_idxs[8];
1918 err = via_fill_adcs(codec);
1921 err = get_mux_nids(codec);
1924 cap_nid = spec->mux_nids[0];
1926 num_idxs = snd_hda_get_connections(codec, cap_nid, pin_idxs,
1927 ARRAY_SIZE(pin_idxs));
1931 /* for internal loopback recording select */
1932 for (idx = 0; idx < num_idxs; idx++) {
1933 if (pin_idxs[idx] == spec->aa_mix_nid) {
1934 snd_hda_add_imux_item(imux, "Stereo Mixer", idx, NULL);
1939 for (i = 0; i < cfg->num_inputs; i++) {
1941 type = cfg->inputs[i].type;
1942 for (idx = 0; idx < num_idxs; idx++)
1943 if (pin_idxs[idx] == cfg->inputs[i].pin)
1945 if (idx >= num_idxs)
1947 label = hda_get_autocfg_input_label(codec, cfg, i);
1948 if (prev_label && !strcmp(label, prev_label))
1953 idx2 = get_connection_index(codec, spec->aa_mix_nid,
1956 err = via_new_analog_input(spec, label, type_idx,
1957 idx2, spec->aa_mix_nid);
1960 add_loopback_list(spec, spec->aa_mix_nid, idx2);
1962 snd_hda_add_imux_item(imux, label, idx, NULL);
1964 /* remember the label for smart51 control */
1965 for (j = 0; j < spec->smart51_nums; j++) {
1966 if (spec->smart51_pins[j] == cfg->inputs[i].pin) {
1967 spec->smart51_idxs[j] = idx;
1968 spec->smart51_labels[j] = label;
1974 /* create capture mixer elements */
1975 for (i = 0; i < spec->num_adc_nids; i++) {
1976 hda_nid_t adc = spec->adc_nids[i];
1977 err = __via_add_control(spec, VIA_CTL_WIDGET_VOL,
1978 "Capture Volume", i,
1979 HDA_COMPOSE_AMP_VAL(adc, 3, 0,
1983 err = __via_add_control(spec, VIA_CTL_WIDGET_MUTE,
1984 "Capture Switch", i,
1985 HDA_COMPOSE_AMP_VAL(adc, 3, 0,
1991 /* input-source control */
1992 for (i = 0; i < spec->num_adc_nids; i++)
1993 if (!spec->mux_nids[i])
1996 struct snd_kcontrol_new *knew;
1997 knew = via_clone_control(spec, &via_input_src_ctl);
2004 for (i = 0; i < cfg->num_inputs; i++) {
2005 hda_nid_t pin = cfg->inputs[i].pin;
2010 if (cfg->inputs[i].type != AUTO_PIN_MIC)
2012 caps = query_amp_caps(codec, pin, HDA_INPUT);
2013 if (caps == -1 || !(caps & AC_AMPCAP_NUM_STEPS))
2015 label = hda_get_autocfg_input_label(codec, cfg, i);
2016 snprintf(name, sizeof(name), "%s Boost Volume", label);
2017 err = via_add_control(spec, VIA_CTL_WIDGET_VOL, name,
2018 HDA_COMPOSE_AMP_VAL(pin, 3, 0, HDA_INPUT));
2026 static void vt1708_set_pinconfig_connect(struct hda_codec *codec, hda_nid_t nid)
2028 unsigned int def_conf;
2029 unsigned char seqassoc;
2031 def_conf = snd_hda_codec_get_pincfg(codec, nid);
2032 seqassoc = (unsigned char) get_defcfg_association(def_conf);
2033 seqassoc = (seqassoc << 4) | get_defcfg_sequence(def_conf);
2034 if (get_defcfg_connect(def_conf) == AC_JACK_PORT_NONE
2035 && (seqassoc == 0xf0 || seqassoc == 0xff)) {
2036 def_conf = def_conf & (~(AC_JACK_PORT_BOTH << 30));
2037 snd_hda_codec_set_pincfg(codec, nid, def_conf);
2043 static int vt1708_jack_detect_get(struct snd_kcontrol *kcontrol,
2044 struct snd_ctl_elem_value *ucontrol)
2046 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2047 struct via_spec *spec = codec->spec;
2049 if (spec->codec_type != VT1708)
2051 spec->vt1708_jack_detect =
2052 !((snd_hda_codec_read(codec, 0x1, 0, 0xf84, 0) >> 8) & 0x1);
2053 ucontrol->value.integer.value[0] = spec->vt1708_jack_detect;
2057 static int vt1708_jack_detect_put(struct snd_kcontrol *kcontrol,
2058 struct snd_ctl_elem_value *ucontrol)
2060 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2061 struct via_spec *spec = codec->spec;
2064 if (spec->codec_type != VT1708)
2066 spec->vt1708_jack_detect = ucontrol->value.integer.value[0];
2067 change = (0x1 & (snd_hda_codec_read(codec, 0x1, 0, 0xf84, 0) >> 8))
2068 == !spec->vt1708_jack_detect;
2069 if (spec->vt1708_jack_detect) {
2070 mute_aa_path(codec, 1);
2071 notify_aa_path_ctls(codec);
2076 static const struct snd_kcontrol_new vt1708_jack_detect_ctl = {
2077 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2078 .name = "Jack Detect",
2080 .info = snd_ctl_boolean_mono_info,
2081 .get = vt1708_jack_detect_get,
2082 .put = vt1708_jack_detect_put,
2085 static void fill_dig_outs(struct hda_codec *codec);
2086 static void fill_dig_in(struct hda_codec *codec);
2088 static int via_parse_auto_config(struct hda_codec *codec)
2090 struct via_spec *spec = codec->spec;
2093 err = snd_hda_parse_pin_def_config(codec, &spec->autocfg, NULL);
2096 if (!spec->autocfg.line_outs && !spec->autocfg.hp_pins[0])
2099 err = via_auto_create_multi_out_ctls(codec);
2102 err = via_auto_create_hp_ctls(codec, spec->autocfg.hp_pins[0]);
2105 err = via_auto_create_speaker_ctls(codec);
2108 err = via_auto_create_analog_input_ctls(codec, &spec->autocfg);
2112 spec->multiout.max_channels = spec->multiout.num_dacs * 2;
2114 fill_dig_outs(codec);
2117 if (spec->kctls.list)
2118 spec->mixers[spec->num_mixers++] = spec->kctls.list;
2120 spec->init_verbs[spec->num_iverbs++] = vt1708_init_verbs;
2122 spec->input_mux = &spec->private_imux[0];
2124 if (spec->hp_dac_nid && spec->hp_dep_path.depth) {
2125 err = via_hp_build(codec);
2130 err = via_smart51_build(codec);
2134 /* assign slave outs */
2135 if (spec->slave_dig_outs[0])
2136 codec->slave_dig_outs = spec->slave_dig_outs;
2141 static void via_auto_init_dig_outs(struct hda_codec *codec)
2143 struct via_spec *spec = codec->spec;
2144 if (spec->multiout.dig_out_nid)
2145 init_output_pin(codec, spec->autocfg.dig_out_pins[0], PIN_OUT);
2146 if (spec->slave_dig_outs[0])
2147 init_output_pin(codec, spec->autocfg.dig_out_pins[1], PIN_OUT);
2150 static void via_auto_init_dig_in(struct hda_codec *codec)
2152 struct via_spec *spec = codec->spec;
2153 if (!spec->dig_in_nid)
2155 snd_hda_codec_write(codec, spec->autocfg.dig_in_pin, 0,
2156 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN);
2159 /* initialize the unsolicited events */
2160 static void via_auto_init_unsol_event(struct hda_codec *codec)
2162 struct via_spec *spec = codec->spec;
2163 struct auto_pin_cfg *cfg = &spec->autocfg;
2167 if (cfg->hp_pins[0] && is_jack_detectable(codec, cfg->hp_pins[0]))
2168 snd_hda_codec_write(codec, cfg->hp_pins[0], 0,
2169 AC_VERB_SET_UNSOLICITED_ENABLE,
2170 AC_USRSP_EN | VIA_HP_EVENT | VIA_JACK_EVENT);
2172 if (cfg->speaker_pins[0])
2173 ev = VIA_LINE_EVENT;
2176 for (i = 0; i < cfg->line_outs; i++) {
2177 if (cfg->line_out_pins[i] &&
2178 is_jack_detectable(codec, cfg->line_out_pins[i]))
2179 snd_hda_codec_write(codec, cfg->line_out_pins[0], 0,
2180 AC_VERB_SET_UNSOLICITED_ENABLE,
2181 AC_USRSP_EN | ev | VIA_JACK_EVENT);
2184 for (i = 0; i < cfg->num_inputs; i++) {
2185 if (is_jack_detectable(codec, cfg->inputs[i].pin))
2186 snd_hda_codec_write(codec, cfg->inputs[i].pin, 0,
2187 AC_VERB_SET_UNSOLICITED_ENABLE,
2188 AC_USRSP_EN | VIA_JACK_EVENT);
2192 static int via_init(struct hda_codec *codec)
2194 struct via_spec *spec = codec->spec;
2197 for (i = 0; i < spec->num_iverbs; i++)
2198 snd_hda_sequence_write(codec, spec->init_verbs[i]);
2200 via_auto_init_multi_out(codec);
2201 via_auto_init_hp_out(codec);
2202 via_auto_init_speaker_out(codec);
2203 via_auto_init_analog_input(codec);
2204 via_auto_init_dig_outs(codec);
2205 via_auto_init_dig_in(codec);
2207 via_auto_init_unsol_event(codec);
2209 via_hp_automute(codec);
2210 via_line_automute(codec, false);
2215 static void vt1708_update_hp_jack_state(struct work_struct *work)
2217 struct via_spec *spec = container_of(work, struct via_spec,
2218 vt1708_hp_work.work);
2219 if (spec->codec_type != VT1708)
2221 /* if jack state toggled */
2222 if (spec->vt1708_hp_present
2223 != snd_hda_jack_detect(spec->codec, spec->autocfg.hp_pins[0])) {
2224 spec->vt1708_hp_present ^= 1;
2225 via_hp_automute(spec->codec);
2227 vt1708_start_hp_work(spec);
2230 static int get_mux_nids(struct hda_codec *codec)
2232 struct via_spec *spec = codec->spec;
2233 hda_nid_t nid, conn[8];
2237 for (i = 0; i < spec->num_adc_nids; i++) {
2238 nid = spec->adc_nids[i];
2240 type = get_wcaps_type(get_wcaps(codec, nid));
2241 if (type == AC_WID_PIN)
2243 n = snd_hda_get_connections(codec, nid, conn,
2248 spec->mux_nids[i] = nid;
2257 static int patch_vt1708(struct hda_codec *codec)
2259 struct via_spec *spec;
2262 /* create a codec specific record */
2263 spec = via_new_spec(codec);
2267 spec->aa_mix_nid = 0x17;
2269 /* Add HP and CD pin config connect bit re-config action */
2270 vt1708_set_pinconfig_connect(codec, VT1708_HP_PIN_NID);
2271 vt1708_set_pinconfig_connect(codec, VT1708_CD_PIN_NID);
2273 /* automatic parse from the BIOS config */
2274 err = via_parse_auto_config(codec);
2280 /* add jack detect on/off control */
2281 if (!via_clone_control(spec, &vt1708_jack_detect_ctl))
2284 /* disable 32bit format on VT1708 */
2285 if (codec->vendor_id == 0x11061708)
2286 spec->stream_analog_playback = &vt1708_pcm_analog_s16_playback;
2288 codec->patch_ops = via_patch_ops;
2290 INIT_DELAYED_WORK(&spec->vt1708_hp_work, vt1708_update_hp_jack_state);
2294 static int patch_vt1709(struct hda_codec *codec)
2296 struct via_spec *spec;
2299 /* create a codec specific record */
2300 spec = via_new_spec(codec);
2304 spec->aa_mix_nid = 0x18;
2306 err = via_parse_auto_config(codec);
2312 codec->patch_ops = via_patch_ops;
2317 static void set_widgets_power_state_vt1708B(struct hda_codec *codec)
2319 struct via_spec *spec = codec->spec;
2323 if ((spec->codec_type != VT1708B_4CH) &&
2324 (codec->vendor_id != 0x11064397))
2327 /* SW0 (17h) = stereo mixer */
2329 (snd_hda_codec_read(codec, 0x17, 0, AC_VERB_GET_CONNECT_SEL, 0x00)
2330 == ((spec->codec_type == VT1708S) ? 5 : 0));
2332 /* PW 1/2/5 (1ah/1bh/1eh) */
2334 set_pin_power_state(codec, 0x1a, &parm);
2335 set_pin_power_state(codec, 0x1b, &parm);
2336 set_pin_power_state(codec, 0x1e, &parm);
2339 /* SW0 (17h), AIW 0/1 (13h/14h) */
2340 snd_hda_codec_write(codec, 0x17, 0, AC_VERB_SET_POWER_STATE, parm);
2341 snd_hda_codec_write(codec, 0x13, 0, AC_VERB_SET_POWER_STATE, parm);
2342 snd_hda_codec_write(codec, 0x14, 0, AC_VERB_SET_POWER_STATE, parm);
2345 /* PW0 (19h), SW1 (18h), AOW1 (11h) */
2347 set_pin_power_state(codec, 0x19, &parm);
2348 if (spec->smart51_enabled)
2349 set_pin_power_state(codec, 0x1b, &parm);
2350 snd_hda_codec_write(codec, 0x18, 0, AC_VERB_SET_POWER_STATE, parm);
2351 snd_hda_codec_write(codec, 0x11, 0, AC_VERB_SET_POWER_STATE, parm);
2353 /* PW6 (22h), SW2 (26h), AOW2 (24h) */
2356 set_pin_power_state(codec, 0x22, &parm);
2357 if (spec->smart51_enabled)
2358 set_pin_power_state(codec, 0x1a, &parm);
2359 snd_hda_codec_write(codec, 0x26, 0,
2360 AC_VERB_SET_POWER_STATE, parm);
2361 snd_hda_codec_write(codec, 0x24, 0,
2362 AC_VERB_SET_POWER_STATE, parm);
2363 } else if (codec->vendor_id == 0x11064397) {
2364 /* PW7(23h), SW2(27h), AOW2(25h) */
2366 set_pin_power_state(codec, 0x23, &parm);
2367 if (spec->smart51_enabled)
2368 set_pin_power_state(codec, 0x1a, &parm);
2369 snd_hda_codec_write(codec, 0x27, 0,
2370 AC_VERB_SET_POWER_STATE, parm);
2371 snd_hda_codec_write(codec, 0x25, 0,
2372 AC_VERB_SET_POWER_STATE, parm);
2375 /* PW 3/4/7 (1ch/1dh/23h) */
2377 /* force to D0 for internal Speaker */
2378 set_pin_power_state(codec, 0x1c, &parm);
2379 set_pin_power_state(codec, 0x1d, &parm);
2381 set_pin_power_state(codec, 0x23, &parm);
2383 /* MW0 (16h), Sw3 (27h), AOW 0/3 (10h/25h) */
2384 snd_hda_codec_write(codec, 0x16, 0, AC_VERB_SET_POWER_STATE,
2385 imux_is_smixer ? AC_PWRST_D0 : parm);
2386 snd_hda_codec_write(codec, 0x10, 0, AC_VERB_SET_POWER_STATE, parm);
2388 snd_hda_codec_write(codec, 0x25, 0,
2389 AC_VERB_SET_POWER_STATE, parm);
2390 snd_hda_codec_write(codec, 0x27, 0,
2391 AC_VERB_SET_POWER_STATE, parm);
2392 } else if (codec->vendor_id == 0x11064397 && spec->hp_independent_mode)
2393 snd_hda_codec_write(codec, 0x25, 0,
2394 AC_VERB_SET_POWER_STATE, parm);
2397 static int patch_vt1708S(struct hda_codec *codec);
2398 static int patch_vt1708B(struct hda_codec *codec)
2400 struct via_spec *spec;
2403 if (get_codec_type(codec) == VT1708BCE)
2404 return patch_vt1708S(codec);
2406 /* create a codec specific record */
2407 spec = via_new_spec(codec);
2411 spec->aa_mix_nid = 0x16;
2413 /* automatic parse from the BIOS config */
2414 err = via_parse_auto_config(codec);
2420 codec->patch_ops = via_patch_ops;
2422 spec->set_widgets_power_state = set_widgets_power_state_vt1708B;
2427 /* Patch for VT1708S */
2428 static const struct hda_verb vt1708S_init_verbs[] = {
2429 /* Enable Mic Boost Volume backdoor */
2431 /* don't bybass mixer */
2436 /* fill out digital output widgets; one for master and one for slave outputs */
2437 static void fill_dig_outs(struct hda_codec *codec)
2439 struct via_spec *spec = codec->spec;
2442 for (i = 0; i < spec->autocfg.dig_outs; i++) {
2446 nid = spec->autocfg.dig_out_pins[i];
2449 conn = snd_hda_get_connections(codec, nid, &nid, 1);
2452 if (!spec->multiout.dig_out_nid)
2453 spec->multiout.dig_out_nid = nid;
2455 spec->slave_dig_outs[0] = nid;
2456 break; /* at most two dig outs */
2461 static void fill_dig_in(struct hda_codec *codec)
2463 struct via_spec *spec = codec->spec;
2467 if (!spec->autocfg.dig_in_pin)
2470 dig_nid = codec->start_nid;
2471 for (i = 0; i < codec->num_nodes; i++, dig_nid++) {
2472 unsigned int wcaps = get_wcaps(codec, dig_nid);
2473 if (get_wcaps_type(wcaps) != AC_WID_AUD_IN)
2475 if (!(wcaps & AC_WCAP_DIGITAL))
2477 if (!(wcaps & AC_WCAP_CONN_LIST))
2479 err = get_connection_index(codec, dig_nid,
2480 spec->autocfg.dig_in_pin);
2482 spec->dig_in_nid = dig_nid;
2488 static void override_mic_boost(struct hda_codec *codec, hda_nid_t pin,
2489 int offset, int num_steps, int step_size)
2491 snd_hda_override_amp_caps(codec, pin, HDA_INPUT,
2492 (offset << AC_AMPCAP_OFFSET_SHIFT) |
2493 (num_steps << AC_AMPCAP_NUM_STEPS_SHIFT) |
2494 (step_size << AC_AMPCAP_STEP_SIZE_SHIFT) |
2495 (0 << AC_AMPCAP_MUTE_SHIFT));
2498 static int patch_vt1708S(struct hda_codec *codec)
2500 struct via_spec *spec;
2503 /* create a codec specific record */
2504 spec = via_new_spec(codec);
2508 spec->aa_mix_nid = 0x16;
2509 override_mic_boost(codec, 0x1a, 0, 3, 40);
2510 override_mic_boost(codec, 0x1e, 0, 3, 40);
2512 /* automatic parse from the BIOS config */
2513 err = via_parse_auto_config(codec);
2519 spec->init_verbs[spec->num_iverbs++] = vt1708S_init_verbs;
2521 codec->patch_ops = via_patch_ops;
2523 /* correct names for VT1708BCE */
2524 if (get_codec_type(codec) == VT1708BCE) {
2525 kfree(codec->chip_name);
2526 codec->chip_name = kstrdup("VT1708BCE", GFP_KERNEL);
2527 snprintf(codec->bus->card->mixername,
2528 sizeof(codec->bus->card->mixername),
2529 "%s %s", codec->vendor_name, codec->chip_name);
2531 /* correct names for VT1705 */
2532 if (codec->vendor_id == 0x11064397) {
2533 kfree(codec->chip_name);
2534 codec->chip_name = kstrdup("VT1705", GFP_KERNEL);
2535 snprintf(codec->bus->card->mixername,
2536 sizeof(codec->bus->card->mixername),
2537 "%s %s", codec->vendor_name, codec->chip_name);
2539 spec->set_widgets_power_state = set_widgets_power_state_vt1708B;
2543 /* Patch for VT1702 */
2545 static const struct hda_verb vt1702_init_verbs[] = {
2553 static void set_widgets_power_state_vt1702(struct hda_codec *codec)
2555 int imux_is_smixer =
2556 snd_hda_codec_read(codec, 0x13, 0, AC_VERB_GET_CONNECT_SEL, 0x00) == 3;
2559 /* PW 1/2/5 (14h/15h/18h) */
2561 set_pin_power_state(codec, 0x14, &parm);
2562 set_pin_power_state(codec, 0x15, &parm);
2563 set_pin_power_state(codec, 0x18, &parm);
2565 parm = AC_PWRST_D0; /* SW0 (13h) = stereo mixer (idx 3) */
2566 /* SW0 (13h), AIW 0/1/2 (12h/1fh/20h) */
2567 snd_hda_codec_write(codec, 0x13, 0, AC_VERB_SET_POWER_STATE, parm);
2568 snd_hda_codec_write(codec, 0x12, 0, AC_VERB_SET_POWER_STATE, parm);
2569 snd_hda_codec_write(codec, 0x1f, 0, AC_VERB_SET_POWER_STATE, parm);
2570 snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_POWER_STATE, parm);
2573 /* PW 3/4 (16h/17h) */
2575 set_pin_power_state(codec, 0x17, &parm);
2576 set_pin_power_state(codec, 0x16, &parm);
2577 /* MW0 (1ah), AOW 0/1 (10h/1dh) */
2578 snd_hda_codec_write(codec, 0x1a, 0, AC_VERB_SET_POWER_STATE,
2579 imux_is_smixer ? AC_PWRST_D0 : parm);
2580 snd_hda_codec_write(codec, 0x10, 0, AC_VERB_SET_POWER_STATE, parm);
2581 snd_hda_codec_write(codec, 0x1d, 0, AC_VERB_SET_POWER_STATE, parm);
2584 static int patch_vt1702(struct hda_codec *codec)
2586 struct via_spec *spec;
2589 /* create a codec specific record */
2590 spec = via_new_spec(codec);
2594 spec->aa_mix_nid = 0x1a;
2596 /* limit AA path volume to 0 dB */
2597 snd_hda_override_amp_caps(codec, 0x1A, HDA_INPUT,
2598 (0x17 << AC_AMPCAP_OFFSET_SHIFT) |
2599 (0x17 << AC_AMPCAP_NUM_STEPS_SHIFT) |
2600 (0x5 << AC_AMPCAP_STEP_SIZE_SHIFT) |
2601 (1 << AC_AMPCAP_MUTE_SHIFT));
2603 /* automatic parse from the BIOS config */
2604 err = via_parse_auto_config(codec);
2610 spec->init_verbs[spec->num_iverbs++] = vt1702_init_verbs;
2612 codec->patch_ops = via_patch_ops;
2614 spec->set_widgets_power_state = set_widgets_power_state_vt1702;
2618 /* Patch for VT1718S */
2620 static const struct hda_verb vt1718S_init_verbs[] = {
2621 /* Enable MW0 adjust Gain 5 */
2623 /* Enable Boost Volume backdoor */
2629 static void set_widgets_power_state_vt1718S(struct hda_codec *codec)
2631 struct via_spec *spec = codec->spec;
2634 /* MUX6 (1eh) = stereo mixer */
2636 snd_hda_codec_read(codec, 0x1e, 0, AC_VERB_GET_CONNECT_SEL, 0x00) == 5;
2638 /* PW 5/6/7 (29h/2ah/2bh) */
2640 set_pin_power_state(codec, 0x29, &parm);
2641 set_pin_power_state(codec, 0x2a, &parm);
2642 set_pin_power_state(codec, 0x2b, &parm);
2645 /* MUX6/7 (1eh/1fh), AIW 0/1 (10h/11h) */
2646 snd_hda_codec_write(codec, 0x1e, 0, AC_VERB_SET_POWER_STATE, parm);
2647 snd_hda_codec_write(codec, 0x1f, 0, AC_VERB_SET_POWER_STATE, parm);
2648 snd_hda_codec_write(codec, 0x10, 0, AC_VERB_SET_POWER_STATE, parm);
2649 snd_hda_codec_write(codec, 0x11, 0, AC_VERB_SET_POWER_STATE, parm);
2652 /* PW3 (27h), MW2 (1ah), AOW3 (bh) */
2654 set_pin_power_state(codec, 0x27, &parm);
2655 snd_hda_codec_write(codec, 0x1a, 0, AC_VERB_SET_POWER_STATE, parm);
2656 snd_hda_codec_write(codec, 0xb, 0, AC_VERB_SET_POWER_STATE, parm);
2658 /* PW2 (26h), AOW2 (ah) */
2660 set_pin_power_state(codec, 0x26, &parm);
2661 if (spec->smart51_enabled)
2662 set_pin_power_state(codec, 0x2b, &parm);
2663 snd_hda_codec_write(codec, 0xa, 0, AC_VERB_SET_POWER_STATE, parm);
2665 /* PW0 (24h), AOW0 (8h) */
2667 set_pin_power_state(codec, 0x24, &parm);
2668 if (!spec->hp_independent_mode) /* check for redirected HP */
2669 set_pin_power_state(codec, 0x28, &parm);
2670 snd_hda_codec_write(codec, 0x8, 0, AC_VERB_SET_POWER_STATE, parm);
2671 /* MW9 (21h), Mw2 (1ah), AOW0 (8h) */
2672 snd_hda_codec_write(codec, 0x21, 0, AC_VERB_SET_POWER_STATE,
2673 imux_is_smixer ? AC_PWRST_D0 : parm);
2675 /* PW1 (25h), AOW1 (9h) */
2677 set_pin_power_state(codec, 0x25, &parm);
2678 if (spec->smart51_enabled)
2679 set_pin_power_state(codec, 0x2a, &parm);
2680 snd_hda_codec_write(codec, 0x9, 0, AC_VERB_SET_POWER_STATE, parm);
2682 if (spec->hp_independent_mode) {
2683 /* PW4 (28h), MW3 (1bh), MUX1(34h), AOW4 (ch) */
2685 set_pin_power_state(codec, 0x28, &parm);
2686 snd_hda_codec_write(codec, 0x1b, 0,
2687 AC_VERB_SET_POWER_STATE, parm);
2688 snd_hda_codec_write(codec, 0x34, 0,
2689 AC_VERB_SET_POWER_STATE, parm);
2690 snd_hda_codec_write(codec, 0xc, 0,
2691 AC_VERB_SET_POWER_STATE, parm);
2695 static int patch_vt1718S(struct hda_codec *codec)
2697 struct via_spec *spec;
2700 /* create a codec specific record */
2701 spec = via_new_spec(codec);
2705 spec->aa_mix_nid = 0x21;
2706 override_mic_boost(codec, 0x2b, 0, 3, 40);
2707 override_mic_boost(codec, 0x29, 0, 3, 40);
2709 /* automatic parse from the BIOS config */
2710 err = via_parse_auto_config(codec);
2716 spec->init_verbs[spec->num_iverbs++] = vt1718S_init_verbs;
2718 codec->patch_ops = via_patch_ops;
2720 spec->set_widgets_power_state = set_widgets_power_state_vt1718S;
2725 /* Patch for VT1716S */
2727 static int vt1716s_dmic_info(struct snd_kcontrol *kcontrol,
2728 struct snd_ctl_elem_info *uinfo)
2730 uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN;
2732 uinfo->value.integer.min = 0;
2733 uinfo->value.integer.max = 1;
2737 static int vt1716s_dmic_get(struct snd_kcontrol *kcontrol,
2738 struct snd_ctl_elem_value *ucontrol)
2740 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2743 index = snd_hda_codec_read(codec, 0x26, 0,
2744 AC_VERB_GET_CONNECT_SEL, 0);
2746 *ucontrol->value.integer.value = index;
2751 static int vt1716s_dmic_put(struct snd_kcontrol *kcontrol,
2752 struct snd_ctl_elem_value *ucontrol)
2754 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2755 struct via_spec *spec = codec->spec;
2756 int index = *ucontrol->value.integer.value;
2758 snd_hda_codec_write(codec, 0x26, 0,
2759 AC_VERB_SET_CONNECT_SEL, index);
2760 spec->dmic_enabled = index;
2761 set_widgets_power_state(codec);
2765 static const struct snd_kcontrol_new vt1716s_dmic_mixer[] = {
2766 HDA_CODEC_VOLUME("Digital Mic Capture Volume", 0x22, 0x0, HDA_INPUT),
2768 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2769 .name = "Digital Mic Capture Switch",
2770 .subdevice = HDA_SUBDEV_NID_FLAG | 0x26,
2772 .info = vt1716s_dmic_info,
2773 .get = vt1716s_dmic_get,
2774 .put = vt1716s_dmic_put,
2780 /* mono-out mixer elements */
2781 static const struct snd_kcontrol_new vt1716S_mono_out_mixer[] = {
2782 HDA_CODEC_MUTE("Mono Playback Switch", 0x2a, 0x0, HDA_OUTPUT),
2786 static const struct hda_verb vt1716S_init_verbs[] = {
2787 /* Enable Boost Volume backdoor */
2789 /* don't bybass mixer */
2791 /* Enable mono output */
2796 static void set_widgets_power_state_vt1716S(struct hda_codec *codec)
2798 struct via_spec *spec = codec->spec;
2801 unsigned int mono_out, present;
2802 /* SW0 (17h) = stereo mixer */
2804 (snd_hda_codec_read(codec, 0x17, 0,
2805 AC_VERB_GET_CONNECT_SEL, 0x00) == 5);
2807 /* PW 1/2/5 (1ah/1bh/1eh) */
2809 set_pin_power_state(codec, 0x1a, &parm);
2810 set_pin_power_state(codec, 0x1b, &parm);
2811 set_pin_power_state(codec, 0x1e, &parm);
2814 /* SW0 (17h), AIW0(13h) */
2815 snd_hda_codec_write(codec, 0x17, 0, AC_VERB_SET_POWER_STATE, parm);
2816 snd_hda_codec_write(codec, 0x13, 0, AC_VERB_SET_POWER_STATE, parm);
2819 set_pin_power_state(codec, 0x1e, &parm);
2821 if (spec->dmic_enabled)
2822 set_pin_power_state(codec, 0x22, &parm);
2824 snd_hda_codec_write(codec, 0x22, 0,
2825 AC_VERB_SET_POWER_STATE, AC_PWRST_D3);
2827 /* SW2(26h), AIW1(14h) */
2828 snd_hda_codec_write(codec, 0x26, 0, AC_VERB_SET_POWER_STATE, parm);
2829 snd_hda_codec_write(codec, 0x14, 0, AC_VERB_SET_POWER_STATE, parm);
2832 /* PW0 (19h), SW1 (18h), AOW1 (11h) */
2834 set_pin_power_state(codec, 0x19, &parm);
2835 /* Smart 5.1 PW2(1bh) */
2836 if (spec->smart51_enabled)
2837 set_pin_power_state(codec, 0x1b, &parm);
2838 snd_hda_codec_write(codec, 0x18, 0, AC_VERB_SET_POWER_STATE, parm);
2839 snd_hda_codec_write(codec, 0x11, 0, AC_VERB_SET_POWER_STATE, parm);
2841 /* PW7 (23h), SW3 (27h), AOW3 (25h) */
2843 set_pin_power_state(codec, 0x23, &parm);
2844 /* Smart 5.1 PW1(1ah) */
2845 if (spec->smart51_enabled)
2846 set_pin_power_state(codec, 0x1a, &parm);
2847 snd_hda_codec_write(codec, 0x27, 0, AC_VERB_SET_POWER_STATE, parm);
2849 /* Smart 5.1 PW5(1eh) */
2850 if (spec->smart51_enabled)
2851 set_pin_power_state(codec, 0x1e, &parm);
2852 snd_hda_codec_write(codec, 0x25, 0, AC_VERB_SET_POWER_STATE, parm);
2855 /* SW4(28h)->MW1(29h)-> PW12 (2ah)*/
2856 present = snd_hda_jack_detect(codec, 0x1c);
2861 present = snd_hda_jack_detect(codec, 0x1d);
2862 if (!spec->hp_independent_mode && present)
2867 parm = mono_out ? AC_PWRST_D0 : AC_PWRST_D3;
2868 snd_hda_codec_write(codec, 0x28, 0, AC_VERB_SET_POWER_STATE, parm);
2869 snd_hda_codec_write(codec, 0x29, 0, AC_VERB_SET_POWER_STATE, parm);
2870 snd_hda_codec_write(codec, 0x2a, 0, AC_VERB_SET_POWER_STATE, parm);
2872 /* PW 3/4 (1ch/1dh) */
2874 set_pin_power_state(codec, 0x1c, &parm);
2875 set_pin_power_state(codec, 0x1d, &parm);
2876 /* HP Independent Mode, power on AOW3 */
2877 if (spec->hp_independent_mode)
2878 snd_hda_codec_write(codec, 0x25, 0,
2879 AC_VERB_SET_POWER_STATE, parm);
2881 /* force to D0 for internal Speaker */
2882 /* MW0 (16h), AOW0 (10h) */
2883 snd_hda_codec_write(codec, 0x16, 0, AC_VERB_SET_POWER_STATE,
2884 imux_is_smixer ? AC_PWRST_D0 : parm);
2885 snd_hda_codec_write(codec, 0x10, 0, AC_VERB_SET_POWER_STATE,
2886 mono_out ? AC_PWRST_D0 : parm);
2889 static int patch_vt1716S(struct hda_codec *codec)
2891 struct via_spec *spec;
2894 /* create a codec specific record */
2895 spec = via_new_spec(codec);
2899 spec->aa_mix_nid = 0x16;
2900 override_mic_boost(codec, 0x1a, 0, 3, 40);
2901 override_mic_boost(codec, 0x1e, 0, 3, 40);
2903 /* automatic parse from the BIOS config */
2904 err = via_parse_auto_config(codec);
2910 spec->init_verbs[spec->num_iverbs++] = vt1716S_init_verbs;
2912 spec->mixers[spec->num_mixers] = vt1716s_dmic_mixer;
2915 spec->mixers[spec->num_mixers++] = vt1716S_mono_out_mixer;
2917 codec->patch_ops = via_patch_ops;
2919 spec->set_widgets_power_state = set_widgets_power_state_vt1716S;
2925 static const struct hda_verb vt2002P_init_verbs[] = {
2926 /* Class-D speaker related verbs */
2930 /* Enable Boost Volume backdoor */
2932 /* Enable AOW0 to MW9 */
2937 static const struct hda_verb vt1802_init_verbs[] = {
2938 /* Enable Boost Volume backdoor */
2940 /* Enable AOW0 to MW9 */
2945 static void set_widgets_power_state_vt2002P(struct hda_codec *codec)
2947 struct via_spec *spec = codec->spec;
2950 unsigned int present;
2951 /* MUX9 (1eh) = stereo mixer */
2953 snd_hda_codec_read(codec, 0x1e, 0, AC_VERB_GET_CONNECT_SEL, 0x00) == 3;
2955 /* PW 5/6/7 (29h/2ah/2bh) */
2957 set_pin_power_state(codec, 0x29, &parm);
2958 set_pin_power_state(codec, 0x2a, &parm);
2959 set_pin_power_state(codec, 0x2b, &parm);
2961 /* MUX9/10 (1eh/1fh), AIW 0/1 (10h/11h) */
2962 snd_hda_codec_write(codec, 0x1e, 0, AC_VERB_SET_POWER_STATE, parm);
2963 snd_hda_codec_write(codec, 0x1f, 0, AC_VERB_SET_POWER_STATE, parm);
2964 snd_hda_codec_write(codec, 0x10, 0, AC_VERB_SET_POWER_STATE, parm);
2965 snd_hda_codec_write(codec, 0x11, 0, AC_VERB_SET_POWER_STATE, parm);
2969 snd_hda_codec_write(codec, 0x8, 0, AC_VERB_SET_POWER_STATE, parm);
2971 if (spec->codec_type == VT1802) {
2972 /* PW4 (28h), MW4 (18h), MUX4(38h) */
2974 set_pin_power_state(codec, 0x28, &parm);
2975 snd_hda_codec_write(codec, 0x18, 0,
2976 AC_VERB_SET_POWER_STATE, parm);
2977 snd_hda_codec_write(codec, 0x38, 0,
2978 AC_VERB_SET_POWER_STATE, parm);
2980 /* PW4 (26h), MW4 (1ch), MUX4(37h) */
2982 set_pin_power_state(codec, 0x26, &parm);
2983 snd_hda_codec_write(codec, 0x1c, 0,
2984 AC_VERB_SET_POWER_STATE, parm);
2985 snd_hda_codec_write(codec, 0x37, 0,
2986 AC_VERB_SET_POWER_STATE, parm);
2989 if (spec->codec_type == VT1802) {
2990 /* PW1 (25h), MW1 (15h), MUX1(35h), AOW1 (9h) */
2992 set_pin_power_state(codec, 0x25, &parm);
2993 snd_hda_codec_write(codec, 0x15, 0,
2994 AC_VERB_SET_POWER_STATE, parm);
2995 snd_hda_codec_write(codec, 0x35, 0,
2996 AC_VERB_SET_POWER_STATE, parm);
2998 /* PW1 (25h), MW1 (19h), MUX1(35h), AOW1 (9h) */
3000 set_pin_power_state(codec, 0x25, &parm);
3001 snd_hda_codec_write(codec, 0x19, 0,
3002 AC_VERB_SET_POWER_STATE, parm);
3003 snd_hda_codec_write(codec, 0x35, 0,
3004 AC_VERB_SET_POWER_STATE, parm);
3007 if (spec->hp_independent_mode)
3008 snd_hda_codec_write(codec, 0x9, 0,
3009 AC_VERB_SET_POWER_STATE, AC_PWRST_D0);
3012 /* PW0 (24h), MW0(18h/14h), MUX0(34h) */
3013 present = snd_hda_jack_detect(codec, 0x25);
3016 set_pin_power_state(codec, 0x24, &parm);
3017 parm = present ? AC_PWRST_D3 : AC_PWRST_D0;
3018 if (spec->codec_type == VT1802)
3019 snd_hda_codec_write(codec, 0x14, 0,
3020 AC_VERB_SET_POWER_STATE, parm);
3022 snd_hda_codec_write(codec, 0x18, 0,
3023 AC_VERB_SET_POWER_STATE, parm);
3024 snd_hda_codec_write(codec, 0x34, 0, AC_VERB_SET_POWER_STATE, parm);
3027 present = snd_hda_jack_detect(codec, 0x26);
3029 parm = present ? AC_PWRST_D3 : AC_PWRST_D0;
3030 if (spec->codec_type == VT1802) {
3031 /* PW15 (33h), MW8(1ch), MUX8(3ch) */
3032 snd_hda_codec_write(codec, 0x33, 0,
3033 AC_VERB_SET_POWER_STATE, parm);
3034 snd_hda_codec_write(codec, 0x1c, 0,
3035 AC_VERB_SET_POWER_STATE, parm);
3036 snd_hda_codec_write(codec, 0x3c, 0,
3037 AC_VERB_SET_POWER_STATE, parm);
3039 /* PW15 (31h), MW8(17h), MUX8(3bh) */
3040 snd_hda_codec_write(codec, 0x31, 0,
3041 AC_VERB_SET_POWER_STATE, parm);
3042 snd_hda_codec_write(codec, 0x17, 0,
3043 AC_VERB_SET_POWER_STATE, parm);
3044 snd_hda_codec_write(codec, 0x3b, 0,
3045 AC_VERB_SET_POWER_STATE, parm);
3048 if (imux_is_smixer || !is_aa_path_mute(codec))
3049 snd_hda_codec_write(codec, 0x21, 0,
3050 AC_VERB_SET_POWER_STATE, AC_PWRST_D0);
3052 snd_hda_codec_write(codec, 0x21, 0,
3053 AC_VERB_SET_POWER_STATE, AC_PWRST_D3);
3056 /* patch for vt2002P */
3057 static int patch_vt2002P(struct hda_codec *codec)
3059 struct via_spec *spec;
3062 /* create a codec specific record */
3063 spec = via_new_spec(codec);
3067 spec->aa_mix_nid = 0x21;
3068 override_mic_boost(codec, 0x2b, 0, 3, 40);
3069 override_mic_boost(codec, 0x29, 0, 3, 40);
3071 /* automatic parse from the BIOS config */
3072 err = via_parse_auto_config(codec);
3078 if (spec->codec_type == VT1802)
3079 spec->init_verbs[spec->num_iverbs++] = vt1802_init_verbs;
3081 spec->init_verbs[spec->num_iverbs++] = vt2002P_init_verbs;
3083 codec->patch_ops = via_patch_ops;
3085 spec->set_widgets_power_state = set_widgets_power_state_vt2002P;
3091 static const struct hda_verb vt1812_init_verbs[] = {
3092 /* Enable Boost Volume backdoor */
3094 /* Enable AOW0 to MW9 */
3099 static void set_widgets_power_state_vt1812(struct hda_codec *codec)
3101 struct via_spec *spec = codec->spec;
3102 int imux_is_smixer =
3103 snd_hda_codec_read(codec, 0x13, 0, AC_VERB_GET_CONNECT_SEL, 0x00) == 3;
3105 unsigned int present;
3106 /* MUX10 (1eh) = stereo mixer */
3108 snd_hda_codec_read(codec, 0x1e, 0, AC_VERB_GET_CONNECT_SEL, 0x00) == 5;
3110 /* PW 5/6/7 (29h/2ah/2bh) */
3112 set_pin_power_state(codec, 0x29, &parm);
3113 set_pin_power_state(codec, 0x2a, &parm);
3114 set_pin_power_state(codec, 0x2b, &parm);
3116 /* MUX10/11 (1eh/1fh), AIW 0/1 (10h/11h) */
3117 snd_hda_codec_write(codec, 0x1e, 0, AC_VERB_SET_POWER_STATE, parm);
3118 snd_hda_codec_write(codec, 0x1f, 0, AC_VERB_SET_POWER_STATE, parm);
3119 snd_hda_codec_write(codec, 0x10, 0, AC_VERB_SET_POWER_STATE, parm);
3120 snd_hda_codec_write(codec, 0x11, 0, AC_VERB_SET_POWER_STATE, parm);
3124 snd_hda_codec_write(codec, 0x8, 0,
3125 AC_VERB_SET_POWER_STATE, AC_PWRST_D0);
3127 /* PW4 (28h), MW4 (18h), MUX4(38h) */
3129 set_pin_power_state(codec, 0x28, &parm);
3130 snd_hda_codec_write(codec, 0x18, 0, AC_VERB_SET_POWER_STATE, parm);
3131 snd_hda_codec_write(codec, 0x38, 0, AC_VERB_SET_POWER_STATE, parm);
3133 /* PW1 (25h), MW1 (15h), MUX1(35h), AOW1 (9h) */
3135 set_pin_power_state(codec, 0x25, &parm);
3136 snd_hda_codec_write(codec, 0x15, 0, AC_VERB_SET_POWER_STATE, parm);
3137 snd_hda_codec_write(codec, 0x35, 0, AC_VERB_SET_POWER_STATE, parm);
3138 if (spec->hp_independent_mode)
3139 snd_hda_codec_write(codec, 0x9, 0,
3140 AC_VERB_SET_POWER_STATE, AC_PWRST_D0);
3142 /* Internal Speaker */
3143 /* PW0 (24h), MW0(14h), MUX0(34h) */
3144 present = snd_hda_jack_detect(codec, 0x25);
3147 set_pin_power_state(codec, 0x24, &parm);
3149 snd_hda_codec_write(codec, 0x14, 0,
3150 AC_VERB_SET_POWER_STATE, AC_PWRST_D3);
3151 snd_hda_codec_write(codec, 0x34, 0,
3152 AC_VERB_SET_POWER_STATE, AC_PWRST_D3);
3154 snd_hda_codec_write(codec, 0x14, 0,
3155 AC_VERB_SET_POWER_STATE, AC_PWRST_D0);
3156 snd_hda_codec_write(codec, 0x34, 0,
3157 AC_VERB_SET_POWER_STATE, AC_PWRST_D0);
3162 /* PW13 (31h), MW13(1ch), MUX13(3ch), MW14(3eh) */
3163 present = snd_hda_jack_detect(codec, 0x28);
3166 set_pin_power_state(codec, 0x31, &parm);
3168 snd_hda_codec_write(codec, 0x1c, 0,
3169 AC_VERB_SET_POWER_STATE, AC_PWRST_D3);
3170 snd_hda_codec_write(codec, 0x3c, 0,
3171 AC_VERB_SET_POWER_STATE, AC_PWRST_D3);
3172 snd_hda_codec_write(codec, 0x3e, 0,
3173 AC_VERB_SET_POWER_STATE, AC_PWRST_D3);
3175 snd_hda_codec_write(codec, 0x1c, 0,
3176 AC_VERB_SET_POWER_STATE, AC_PWRST_D0);
3177 snd_hda_codec_write(codec, 0x3c, 0,
3178 AC_VERB_SET_POWER_STATE, AC_PWRST_D0);
3179 snd_hda_codec_write(codec, 0x3e, 0,
3180 AC_VERB_SET_POWER_STATE, AC_PWRST_D0);
3183 /* PW15 (33h), MW15 (1dh), MUX15(3dh) */
3185 set_pin_power_state(codec, 0x33, &parm);
3186 snd_hda_codec_write(codec, 0x1d, 0, AC_VERB_SET_POWER_STATE, parm);
3187 snd_hda_codec_write(codec, 0x3d, 0, AC_VERB_SET_POWER_STATE, parm);
3191 /* patch for vt1812 */
3192 static int patch_vt1812(struct hda_codec *codec)
3194 struct via_spec *spec;
3197 /* create a codec specific record */
3198 spec = via_new_spec(codec);
3202 spec->aa_mix_nid = 0x21;
3203 override_mic_boost(codec, 0x2b, 0, 3, 40);
3204 override_mic_boost(codec, 0x29, 0, 3, 40);
3206 /* automatic parse from the BIOS config */
3207 err = via_parse_auto_config(codec);
3213 spec->init_verbs[spec->num_iverbs++] = vt1812_init_verbs;
3215 codec->patch_ops = via_patch_ops;
3217 spec->set_widgets_power_state = set_widgets_power_state_vt1812;
3224 static const struct hda_codec_preset snd_hda_preset_via[] = {
3225 { .id = 0x11061708, .name = "VT1708", .patch = patch_vt1708},
3226 { .id = 0x11061709, .name = "VT1708", .patch = patch_vt1708},
3227 { .id = 0x1106170a, .name = "VT1708", .patch = patch_vt1708},
3228 { .id = 0x1106170b, .name = "VT1708", .patch = patch_vt1708},
3229 { .id = 0x1106e710, .name = "VT1709 10-Ch",
3230 .patch = patch_vt1709},
3231 { .id = 0x1106e711, .name = "VT1709 10-Ch",
3232 .patch = patch_vt1709},
3233 { .id = 0x1106e712, .name = "VT1709 10-Ch",
3234 .patch = patch_vt1709},
3235 { .id = 0x1106e713, .name = "VT1709 10-Ch",
3236 .patch = patch_vt1709},
3237 { .id = 0x1106e714, .name = "VT1709 6-Ch",
3238 .patch = patch_vt1709},
3239 { .id = 0x1106e715, .name = "VT1709 6-Ch",
3240 .patch = patch_vt1709},
3241 { .id = 0x1106e716, .name = "VT1709 6-Ch",
3242 .patch = patch_vt1709},
3243 { .id = 0x1106e717, .name = "VT1709 6-Ch",
3244 .patch = patch_vt1709},
3245 { .id = 0x1106e720, .name = "VT1708B 8-Ch",
3246 .patch = patch_vt1708B},
3247 { .id = 0x1106e721, .name = "VT1708B 8-Ch",
3248 .patch = patch_vt1708B},
3249 { .id = 0x1106e722, .name = "VT1708B 8-Ch",
3250 .patch = patch_vt1708B},
3251 { .id = 0x1106e723, .name = "VT1708B 8-Ch",
3252 .patch = patch_vt1708B},
3253 { .id = 0x1106e724, .name = "VT1708B 4-Ch",
3254 .patch = patch_vt1708B},
3255 { .id = 0x1106e725, .name = "VT1708B 4-Ch",
3256 .patch = patch_vt1708B},
3257 { .id = 0x1106e726, .name = "VT1708B 4-Ch",
3258 .patch = patch_vt1708B},
3259 { .id = 0x1106e727, .name = "VT1708B 4-Ch",
3260 .patch = patch_vt1708B},
3261 { .id = 0x11060397, .name = "VT1708S",
3262 .patch = patch_vt1708S},
3263 { .id = 0x11061397, .name = "VT1708S",
3264 .patch = patch_vt1708S},
3265 { .id = 0x11062397, .name = "VT1708S",
3266 .patch = patch_vt1708S},
3267 { .id = 0x11063397, .name = "VT1708S",
3268 .patch = patch_vt1708S},
3269 { .id = 0x11064397, .name = "VT1705",
3270 .patch = patch_vt1708S},
3271 { .id = 0x11065397, .name = "VT1708S",
3272 .patch = patch_vt1708S},
3273 { .id = 0x11066397, .name = "VT1708S",
3274 .patch = patch_vt1708S},
3275 { .id = 0x11067397, .name = "VT1708S",
3276 .patch = patch_vt1708S},
3277 { .id = 0x11060398, .name = "VT1702",
3278 .patch = patch_vt1702},
3279 { .id = 0x11061398, .name = "VT1702",
3280 .patch = patch_vt1702},
3281 { .id = 0x11062398, .name = "VT1702",
3282 .patch = patch_vt1702},
3283 { .id = 0x11063398, .name = "VT1702",
3284 .patch = patch_vt1702},
3285 { .id = 0x11064398, .name = "VT1702",
3286 .patch = patch_vt1702},
3287 { .id = 0x11065398, .name = "VT1702",
3288 .patch = patch_vt1702},
3289 { .id = 0x11066398, .name = "VT1702",
3290 .patch = patch_vt1702},
3291 { .id = 0x11067398, .name = "VT1702",
3292 .patch = patch_vt1702},
3293 { .id = 0x11060428, .name = "VT1718S",
3294 .patch = patch_vt1718S},
3295 { .id = 0x11064428, .name = "VT1718S",
3296 .patch = patch_vt1718S},
3297 { .id = 0x11060441, .name = "VT2020",
3298 .patch = patch_vt1718S},
3299 { .id = 0x11064441, .name = "VT1828S",
3300 .patch = patch_vt1718S},
3301 { .id = 0x11060433, .name = "VT1716S",
3302 .patch = patch_vt1716S},
3303 { .id = 0x1106a721, .name = "VT1716S",
3304 .patch = patch_vt1716S},
3305 { .id = 0x11060438, .name = "VT2002P", .patch = patch_vt2002P},
3306 { .id = 0x11064438, .name = "VT2002P", .patch = patch_vt2002P},
3307 { .id = 0x11060448, .name = "VT1812", .patch = patch_vt1812},
3308 { .id = 0x11060440, .name = "VT1818S",
3309 .patch = patch_vt1708S},
3310 { .id = 0x11060446, .name = "VT1802",
3311 .patch = patch_vt2002P},
3312 { .id = 0x11068446, .name = "VT1802",
3313 .patch = patch_vt2002P},
3317 MODULE_ALIAS("snd-hda-codec-id:1106*");
3319 static struct hda_codec_preset_list via_list = {
3320 .preset = snd_hda_preset_via,
3321 .owner = THIS_MODULE,
3324 MODULE_LICENSE("GPL");
3325 MODULE_DESCRIPTION("VIA HD-audio codec");
3327 static int __init patch_via_init(void)
3329 return snd_hda_add_codec_preset(&via_list);
3332 static void __exit patch_via_exit(void)
3334 snd_hda_delete_codec_preset(&via_list);
3337 module_init(patch_via_init)
3338 module_exit(patch_via_exit)