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_10ch(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 * generic initialization of ADC, input mixers and output mixers
2319 static int patch_vt1709_6ch(struct hda_codec *codec)
2321 struct via_spec *spec;
2324 /* create a codec specific record */
2325 spec = via_new_spec(codec);
2329 spec->aa_mix_nid = 0x18;
2331 err = via_parse_auto_config(codec);
2337 codec->patch_ops = via_patch_ops;
2342 static void set_widgets_power_state_vt1708B(struct hda_codec *codec)
2344 struct via_spec *spec = codec->spec;
2348 if ((spec->codec_type != VT1708B_4CH) &&
2349 (codec->vendor_id != 0x11064397))
2352 /* SW0 (17h) = stereo mixer */
2354 (snd_hda_codec_read(codec, 0x17, 0, AC_VERB_GET_CONNECT_SEL, 0x00)
2355 == ((spec->codec_type == VT1708S) ? 5 : 0));
2357 /* PW 1/2/5 (1ah/1bh/1eh) */
2359 set_pin_power_state(codec, 0x1a, &parm);
2360 set_pin_power_state(codec, 0x1b, &parm);
2361 set_pin_power_state(codec, 0x1e, &parm);
2364 /* SW0 (17h), AIW 0/1 (13h/14h) */
2365 snd_hda_codec_write(codec, 0x17, 0, AC_VERB_SET_POWER_STATE, parm);
2366 snd_hda_codec_write(codec, 0x13, 0, AC_VERB_SET_POWER_STATE, parm);
2367 snd_hda_codec_write(codec, 0x14, 0, AC_VERB_SET_POWER_STATE, parm);
2370 /* PW0 (19h), SW1 (18h), AOW1 (11h) */
2372 set_pin_power_state(codec, 0x19, &parm);
2373 if (spec->smart51_enabled)
2374 set_pin_power_state(codec, 0x1b, &parm);
2375 snd_hda_codec_write(codec, 0x18, 0, AC_VERB_SET_POWER_STATE, parm);
2376 snd_hda_codec_write(codec, 0x11, 0, AC_VERB_SET_POWER_STATE, parm);
2378 /* PW6 (22h), SW2 (26h), AOW2 (24h) */
2381 set_pin_power_state(codec, 0x22, &parm);
2382 if (spec->smart51_enabled)
2383 set_pin_power_state(codec, 0x1a, &parm);
2384 snd_hda_codec_write(codec, 0x26, 0,
2385 AC_VERB_SET_POWER_STATE, parm);
2386 snd_hda_codec_write(codec, 0x24, 0,
2387 AC_VERB_SET_POWER_STATE, parm);
2388 } else if (codec->vendor_id == 0x11064397) {
2389 /* PW7(23h), SW2(27h), AOW2(25h) */
2391 set_pin_power_state(codec, 0x23, &parm);
2392 if (spec->smart51_enabled)
2393 set_pin_power_state(codec, 0x1a, &parm);
2394 snd_hda_codec_write(codec, 0x27, 0,
2395 AC_VERB_SET_POWER_STATE, parm);
2396 snd_hda_codec_write(codec, 0x25, 0,
2397 AC_VERB_SET_POWER_STATE, parm);
2400 /* PW 3/4/7 (1ch/1dh/23h) */
2402 /* force to D0 for internal Speaker */
2403 set_pin_power_state(codec, 0x1c, &parm);
2404 set_pin_power_state(codec, 0x1d, &parm);
2406 set_pin_power_state(codec, 0x23, &parm);
2408 /* MW0 (16h), Sw3 (27h), AOW 0/3 (10h/25h) */
2409 snd_hda_codec_write(codec, 0x16, 0, AC_VERB_SET_POWER_STATE,
2410 imux_is_smixer ? AC_PWRST_D0 : parm);
2411 snd_hda_codec_write(codec, 0x10, 0, AC_VERB_SET_POWER_STATE, parm);
2413 snd_hda_codec_write(codec, 0x25, 0,
2414 AC_VERB_SET_POWER_STATE, parm);
2415 snd_hda_codec_write(codec, 0x27, 0,
2416 AC_VERB_SET_POWER_STATE, parm);
2417 } else if (codec->vendor_id == 0x11064397 && spec->hp_independent_mode)
2418 snd_hda_codec_write(codec, 0x25, 0,
2419 AC_VERB_SET_POWER_STATE, parm);
2422 static int patch_vt1708S(struct hda_codec *codec);
2423 static int patch_vt1708B_8ch(struct hda_codec *codec)
2425 struct via_spec *spec;
2428 if (get_codec_type(codec) == VT1708BCE)
2429 return patch_vt1708S(codec);
2430 /* create a codec specific record */
2431 spec = via_new_spec(codec);
2435 spec->aa_mix_nid = 0x16;
2437 /* automatic parse from the BIOS config */
2438 err = via_parse_auto_config(codec);
2444 codec->patch_ops = via_patch_ops;
2446 spec->set_widgets_power_state = set_widgets_power_state_vt1708B;
2451 static int patch_vt1708B_4ch(struct hda_codec *codec)
2453 struct via_spec *spec;
2456 /* create a codec specific record */
2457 spec = via_new_spec(codec);
2461 /* automatic parse from the BIOS config */
2462 err = via_parse_auto_config(codec);
2468 codec->patch_ops = via_patch_ops;
2470 spec->set_widgets_power_state = set_widgets_power_state_vt1708B;
2475 /* Patch for VT1708S */
2476 static const struct hda_verb vt1708S_init_verbs[] = {
2477 /* Enable Mic Boost Volume backdoor */
2479 /* don't bybass mixer */
2484 /* fill out digital output widgets; one for master and one for slave outputs */
2485 static void fill_dig_outs(struct hda_codec *codec)
2487 struct via_spec *spec = codec->spec;
2490 for (i = 0; i < spec->autocfg.dig_outs; i++) {
2494 nid = spec->autocfg.dig_out_pins[i];
2497 conn = snd_hda_get_connections(codec, nid, &nid, 1);
2500 if (!spec->multiout.dig_out_nid)
2501 spec->multiout.dig_out_nid = nid;
2503 spec->slave_dig_outs[0] = nid;
2504 break; /* at most two dig outs */
2509 static void fill_dig_in(struct hda_codec *codec)
2511 struct via_spec *spec = codec->spec;
2515 if (!spec->autocfg.dig_in_pin)
2518 dig_nid = codec->start_nid;
2519 for (i = 0; i < codec->num_nodes; i++, dig_nid++) {
2520 unsigned int wcaps = get_wcaps(codec, dig_nid);
2521 if (get_wcaps_type(wcaps) != AC_WID_AUD_IN)
2523 if (!(wcaps & AC_WCAP_DIGITAL))
2525 if (!(wcaps & AC_WCAP_CONN_LIST))
2527 err = get_connection_index(codec, dig_nid,
2528 spec->autocfg.dig_in_pin);
2530 spec->dig_in_nid = dig_nid;
2536 static void override_mic_boost(struct hda_codec *codec, hda_nid_t pin,
2537 int offset, int num_steps, int step_size)
2539 snd_hda_override_amp_caps(codec, pin, HDA_INPUT,
2540 (offset << AC_AMPCAP_OFFSET_SHIFT) |
2541 (num_steps << AC_AMPCAP_NUM_STEPS_SHIFT) |
2542 (step_size << AC_AMPCAP_STEP_SIZE_SHIFT) |
2543 (0 << AC_AMPCAP_MUTE_SHIFT));
2546 static int patch_vt1708S(struct hda_codec *codec)
2548 struct via_spec *spec;
2551 /* create a codec specific record */
2552 spec = via_new_spec(codec);
2556 spec->aa_mix_nid = 0x16;
2557 override_mic_boost(codec, 0x1a, 0, 3, 40);
2558 override_mic_boost(codec, 0x1e, 0, 3, 40);
2560 /* automatic parse from the BIOS config */
2561 err = via_parse_auto_config(codec);
2567 spec->init_verbs[spec->num_iverbs++] = vt1708S_init_verbs;
2569 codec->patch_ops = via_patch_ops;
2571 /* correct names for VT1708BCE */
2572 if (get_codec_type(codec) == VT1708BCE) {
2573 kfree(codec->chip_name);
2574 codec->chip_name = kstrdup("VT1708BCE", GFP_KERNEL);
2575 snprintf(codec->bus->card->mixername,
2576 sizeof(codec->bus->card->mixername),
2577 "%s %s", codec->vendor_name, codec->chip_name);
2579 /* correct names for VT1705 */
2580 if (codec->vendor_id == 0x11064397) {
2581 kfree(codec->chip_name);
2582 codec->chip_name = kstrdup("VT1705", GFP_KERNEL);
2583 snprintf(codec->bus->card->mixername,
2584 sizeof(codec->bus->card->mixername),
2585 "%s %s", codec->vendor_name, codec->chip_name);
2587 spec->set_widgets_power_state = set_widgets_power_state_vt1708B;
2591 /* Patch for VT1702 */
2593 static const struct hda_verb vt1702_init_verbs[] = {
2601 static void set_widgets_power_state_vt1702(struct hda_codec *codec)
2603 int imux_is_smixer =
2604 snd_hda_codec_read(codec, 0x13, 0, AC_VERB_GET_CONNECT_SEL, 0x00) == 3;
2607 /* PW 1/2/5 (14h/15h/18h) */
2609 set_pin_power_state(codec, 0x14, &parm);
2610 set_pin_power_state(codec, 0x15, &parm);
2611 set_pin_power_state(codec, 0x18, &parm);
2613 parm = AC_PWRST_D0; /* SW0 (13h) = stereo mixer (idx 3) */
2614 /* SW0 (13h), AIW 0/1/2 (12h/1fh/20h) */
2615 snd_hda_codec_write(codec, 0x13, 0, AC_VERB_SET_POWER_STATE, parm);
2616 snd_hda_codec_write(codec, 0x12, 0, AC_VERB_SET_POWER_STATE, parm);
2617 snd_hda_codec_write(codec, 0x1f, 0, AC_VERB_SET_POWER_STATE, parm);
2618 snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_POWER_STATE, parm);
2621 /* PW 3/4 (16h/17h) */
2623 set_pin_power_state(codec, 0x17, &parm);
2624 set_pin_power_state(codec, 0x16, &parm);
2625 /* MW0 (1ah), AOW 0/1 (10h/1dh) */
2626 snd_hda_codec_write(codec, 0x1a, 0, AC_VERB_SET_POWER_STATE,
2627 imux_is_smixer ? AC_PWRST_D0 : parm);
2628 snd_hda_codec_write(codec, 0x10, 0, AC_VERB_SET_POWER_STATE, parm);
2629 snd_hda_codec_write(codec, 0x1d, 0, AC_VERB_SET_POWER_STATE, parm);
2632 static int patch_vt1702(struct hda_codec *codec)
2634 struct via_spec *spec;
2637 /* create a codec specific record */
2638 spec = via_new_spec(codec);
2642 spec->aa_mix_nid = 0x1a;
2644 /* limit AA path volume to 0 dB */
2645 snd_hda_override_amp_caps(codec, 0x1A, HDA_INPUT,
2646 (0x17 << AC_AMPCAP_OFFSET_SHIFT) |
2647 (0x17 << AC_AMPCAP_NUM_STEPS_SHIFT) |
2648 (0x5 << AC_AMPCAP_STEP_SIZE_SHIFT) |
2649 (1 << AC_AMPCAP_MUTE_SHIFT));
2651 /* automatic parse from the BIOS config */
2652 err = via_parse_auto_config(codec);
2658 spec->init_verbs[spec->num_iverbs++] = vt1702_init_verbs;
2660 codec->patch_ops = via_patch_ops;
2662 spec->set_widgets_power_state = set_widgets_power_state_vt1702;
2666 /* Patch for VT1718S */
2668 static const struct hda_verb vt1718S_init_verbs[] = {
2669 /* Enable MW0 adjust Gain 5 */
2671 /* Enable Boost Volume backdoor */
2677 static void set_widgets_power_state_vt1718S(struct hda_codec *codec)
2679 struct via_spec *spec = codec->spec;
2682 /* MUX6 (1eh) = stereo mixer */
2684 snd_hda_codec_read(codec, 0x1e, 0, AC_VERB_GET_CONNECT_SEL, 0x00) == 5;
2686 /* PW 5/6/7 (29h/2ah/2bh) */
2688 set_pin_power_state(codec, 0x29, &parm);
2689 set_pin_power_state(codec, 0x2a, &parm);
2690 set_pin_power_state(codec, 0x2b, &parm);
2693 /* MUX6/7 (1eh/1fh), AIW 0/1 (10h/11h) */
2694 snd_hda_codec_write(codec, 0x1e, 0, AC_VERB_SET_POWER_STATE, parm);
2695 snd_hda_codec_write(codec, 0x1f, 0, AC_VERB_SET_POWER_STATE, parm);
2696 snd_hda_codec_write(codec, 0x10, 0, AC_VERB_SET_POWER_STATE, parm);
2697 snd_hda_codec_write(codec, 0x11, 0, AC_VERB_SET_POWER_STATE, parm);
2700 /* PW3 (27h), MW2 (1ah), AOW3 (bh) */
2702 set_pin_power_state(codec, 0x27, &parm);
2703 snd_hda_codec_write(codec, 0x1a, 0, AC_VERB_SET_POWER_STATE, parm);
2704 snd_hda_codec_write(codec, 0xb, 0, AC_VERB_SET_POWER_STATE, parm);
2706 /* PW2 (26h), AOW2 (ah) */
2708 set_pin_power_state(codec, 0x26, &parm);
2709 if (spec->smart51_enabled)
2710 set_pin_power_state(codec, 0x2b, &parm);
2711 snd_hda_codec_write(codec, 0xa, 0, AC_VERB_SET_POWER_STATE, parm);
2713 /* PW0 (24h), AOW0 (8h) */
2715 set_pin_power_state(codec, 0x24, &parm);
2716 if (!spec->hp_independent_mode) /* check for redirected HP */
2717 set_pin_power_state(codec, 0x28, &parm);
2718 snd_hda_codec_write(codec, 0x8, 0, AC_VERB_SET_POWER_STATE, parm);
2719 /* MW9 (21h), Mw2 (1ah), AOW0 (8h) */
2720 snd_hda_codec_write(codec, 0x21, 0, AC_VERB_SET_POWER_STATE,
2721 imux_is_smixer ? AC_PWRST_D0 : parm);
2723 /* PW1 (25h), AOW1 (9h) */
2725 set_pin_power_state(codec, 0x25, &parm);
2726 if (spec->smart51_enabled)
2727 set_pin_power_state(codec, 0x2a, &parm);
2728 snd_hda_codec_write(codec, 0x9, 0, AC_VERB_SET_POWER_STATE, parm);
2730 if (spec->hp_independent_mode) {
2731 /* PW4 (28h), MW3 (1bh), MUX1(34h), AOW4 (ch) */
2733 set_pin_power_state(codec, 0x28, &parm);
2734 snd_hda_codec_write(codec, 0x1b, 0,
2735 AC_VERB_SET_POWER_STATE, parm);
2736 snd_hda_codec_write(codec, 0x34, 0,
2737 AC_VERB_SET_POWER_STATE, parm);
2738 snd_hda_codec_write(codec, 0xc, 0,
2739 AC_VERB_SET_POWER_STATE, parm);
2743 static int patch_vt1718S(struct hda_codec *codec)
2745 struct via_spec *spec;
2748 /* create a codec specific record */
2749 spec = via_new_spec(codec);
2753 spec->aa_mix_nid = 0x21;
2754 override_mic_boost(codec, 0x2b, 0, 3, 40);
2755 override_mic_boost(codec, 0x29, 0, 3, 40);
2757 /* automatic parse from the BIOS config */
2758 err = via_parse_auto_config(codec);
2764 spec->init_verbs[spec->num_iverbs++] = vt1718S_init_verbs;
2766 codec->patch_ops = via_patch_ops;
2768 spec->set_widgets_power_state = set_widgets_power_state_vt1718S;
2773 /* Patch for VT1716S */
2775 static int vt1716s_dmic_info(struct snd_kcontrol *kcontrol,
2776 struct snd_ctl_elem_info *uinfo)
2778 uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN;
2780 uinfo->value.integer.min = 0;
2781 uinfo->value.integer.max = 1;
2785 static int vt1716s_dmic_get(struct snd_kcontrol *kcontrol,
2786 struct snd_ctl_elem_value *ucontrol)
2788 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2791 index = snd_hda_codec_read(codec, 0x26, 0,
2792 AC_VERB_GET_CONNECT_SEL, 0);
2794 *ucontrol->value.integer.value = index;
2799 static int vt1716s_dmic_put(struct snd_kcontrol *kcontrol,
2800 struct snd_ctl_elem_value *ucontrol)
2802 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2803 struct via_spec *spec = codec->spec;
2804 int index = *ucontrol->value.integer.value;
2806 snd_hda_codec_write(codec, 0x26, 0,
2807 AC_VERB_SET_CONNECT_SEL, index);
2808 spec->dmic_enabled = index;
2809 set_widgets_power_state(codec);
2813 static const struct snd_kcontrol_new vt1716s_dmic_mixer[] = {
2814 HDA_CODEC_VOLUME("Digital Mic Capture Volume", 0x22, 0x0, HDA_INPUT),
2816 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2817 .name = "Digital Mic Capture Switch",
2818 .subdevice = HDA_SUBDEV_NID_FLAG | 0x26,
2820 .info = vt1716s_dmic_info,
2821 .get = vt1716s_dmic_get,
2822 .put = vt1716s_dmic_put,
2828 /* mono-out mixer elements */
2829 static const struct snd_kcontrol_new vt1716S_mono_out_mixer[] = {
2830 HDA_CODEC_MUTE("Mono Playback Switch", 0x2a, 0x0, HDA_OUTPUT),
2834 static const struct hda_verb vt1716S_init_verbs[] = {
2835 /* Enable Boost Volume backdoor */
2837 /* don't bybass mixer */
2839 /* Enable mono output */
2844 static void set_widgets_power_state_vt1716S(struct hda_codec *codec)
2846 struct via_spec *spec = codec->spec;
2849 unsigned int mono_out, present;
2850 /* SW0 (17h) = stereo mixer */
2852 (snd_hda_codec_read(codec, 0x17, 0,
2853 AC_VERB_GET_CONNECT_SEL, 0x00) == 5);
2855 /* PW 1/2/5 (1ah/1bh/1eh) */
2857 set_pin_power_state(codec, 0x1a, &parm);
2858 set_pin_power_state(codec, 0x1b, &parm);
2859 set_pin_power_state(codec, 0x1e, &parm);
2862 /* SW0 (17h), AIW0(13h) */
2863 snd_hda_codec_write(codec, 0x17, 0, AC_VERB_SET_POWER_STATE, parm);
2864 snd_hda_codec_write(codec, 0x13, 0, AC_VERB_SET_POWER_STATE, parm);
2867 set_pin_power_state(codec, 0x1e, &parm);
2869 if (spec->dmic_enabled)
2870 set_pin_power_state(codec, 0x22, &parm);
2872 snd_hda_codec_write(codec, 0x22, 0,
2873 AC_VERB_SET_POWER_STATE, AC_PWRST_D3);
2875 /* SW2(26h), AIW1(14h) */
2876 snd_hda_codec_write(codec, 0x26, 0, AC_VERB_SET_POWER_STATE, parm);
2877 snd_hda_codec_write(codec, 0x14, 0, AC_VERB_SET_POWER_STATE, parm);
2880 /* PW0 (19h), SW1 (18h), AOW1 (11h) */
2882 set_pin_power_state(codec, 0x19, &parm);
2883 /* Smart 5.1 PW2(1bh) */
2884 if (spec->smart51_enabled)
2885 set_pin_power_state(codec, 0x1b, &parm);
2886 snd_hda_codec_write(codec, 0x18, 0, AC_VERB_SET_POWER_STATE, parm);
2887 snd_hda_codec_write(codec, 0x11, 0, AC_VERB_SET_POWER_STATE, parm);
2889 /* PW7 (23h), SW3 (27h), AOW3 (25h) */
2891 set_pin_power_state(codec, 0x23, &parm);
2892 /* Smart 5.1 PW1(1ah) */
2893 if (spec->smart51_enabled)
2894 set_pin_power_state(codec, 0x1a, &parm);
2895 snd_hda_codec_write(codec, 0x27, 0, AC_VERB_SET_POWER_STATE, parm);
2897 /* Smart 5.1 PW5(1eh) */
2898 if (spec->smart51_enabled)
2899 set_pin_power_state(codec, 0x1e, &parm);
2900 snd_hda_codec_write(codec, 0x25, 0, AC_VERB_SET_POWER_STATE, parm);
2903 /* SW4(28h)->MW1(29h)-> PW12 (2ah)*/
2904 present = snd_hda_jack_detect(codec, 0x1c);
2909 present = snd_hda_jack_detect(codec, 0x1d);
2910 if (!spec->hp_independent_mode && present)
2915 parm = mono_out ? AC_PWRST_D0 : AC_PWRST_D3;
2916 snd_hda_codec_write(codec, 0x28, 0, AC_VERB_SET_POWER_STATE, parm);
2917 snd_hda_codec_write(codec, 0x29, 0, AC_VERB_SET_POWER_STATE, parm);
2918 snd_hda_codec_write(codec, 0x2a, 0, AC_VERB_SET_POWER_STATE, parm);
2920 /* PW 3/4 (1ch/1dh) */
2922 set_pin_power_state(codec, 0x1c, &parm);
2923 set_pin_power_state(codec, 0x1d, &parm);
2924 /* HP Independent Mode, power on AOW3 */
2925 if (spec->hp_independent_mode)
2926 snd_hda_codec_write(codec, 0x25, 0,
2927 AC_VERB_SET_POWER_STATE, parm);
2929 /* force to D0 for internal Speaker */
2930 /* MW0 (16h), AOW0 (10h) */
2931 snd_hda_codec_write(codec, 0x16, 0, AC_VERB_SET_POWER_STATE,
2932 imux_is_smixer ? AC_PWRST_D0 : parm);
2933 snd_hda_codec_write(codec, 0x10, 0, AC_VERB_SET_POWER_STATE,
2934 mono_out ? AC_PWRST_D0 : parm);
2937 static int patch_vt1716S(struct hda_codec *codec)
2939 struct via_spec *spec;
2942 /* create a codec specific record */
2943 spec = via_new_spec(codec);
2947 spec->aa_mix_nid = 0x16;
2948 override_mic_boost(codec, 0x1a, 0, 3, 40);
2949 override_mic_boost(codec, 0x1e, 0, 3, 40);
2951 /* automatic parse from the BIOS config */
2952 err = via_parse_auto_config(codec);
2958 spec->init_verbs[spec->num_iverbs++] = vt1716S_init_verbs;
2960 spec->mixers[spec->num_mixers] = vt1716s_dmic_mixer;
2963 spec->mixers[spec->num_mixers++] = vt1716S_mono_out_mixer;
2965 codec->patch_ops = via_patch_ops;
2967 spec->set_widgets_power_state = set_widgets_power_state_vt1716S;
2973 static const struct hda_verb vt2002P_init_verbs[] = {
2974 /* Class-D speaker related verbs */
2978 /* Enable Boost Volume backdoor */
2980 /* Enable AOW0 to MW9 */
2985 static const struct hda_verb vt1802_init_verbs[] = {
2986 /* Enable Boost Volume backdoor */
2988 /* Enable AOW0 to MW9 */
2993 static void set_widgets_power_state_vt2002P(struct hda_codec *codec)
2995 struct via_spec *spec = codec->spec;
2998 unsigned int present;
2999 /* MUX9 (1eh) = stereo mixer */
3001 snd_hda_codec_read(codec, 0x1e, 0, AC_VERB_GET_CONNECT_SEL, 0x00) == 3;
3003 /* PW 5/6/7 (29h/2ah/2bh) */
3005 set_pin_power_state(codec, 0x29, &parm);
3006 set_pin_power_state(codec, 0x2a, &parm);
3007 set_pin_power_state(codec, 0x2b, &parm);
3009 /* MUX9/10 (1eh/1fh), AIW 0/1 (10h/11h) */
3010 snd_hda_codec_write(codec, 0x1e, 0, AC_VERB_SET_POWER_STATE, parm);
3011 snd_hda_codec_write(codec, 0x1f, 0, AC_VERB_SET_POWER_STATE, parm);
3012 snd_hda_codec_write(codec, 0x10, 0, AC_VERB_SET_POWER_STATE, parm);
3013 snd_hda_codec_write(codec, 0x11, 0, AC_VERB_SET_POWER_STATE, parm);
3017 snd_hda_codec_write(codec, 0x8, 0, AC_VERB_SET_POWER_STATE, parm);
3019 if (spec->codec_type == VT1802) {
3020 /* PW4 (28h), MW4 (18h), MUX4(38h) */
3022 set_pin_power_state(codec, 0x28, &parm);
3023 snd_hda_codec_write(codec, 0x18, 0,
3024 AC_VERB_SET_POWER_STATE, parm);
3025 snd_hda_codec_write(codec, 0x38, 0,
3026 AC_VERB_SET_POWER_STATE, parm);
3028 /* PW4 (26h), MW4 (1ch), MUX4(37h) */
3030 set_pin_power_state(codec, 0x26, &parm);
3031 snd_hda_codec_write(codec, 0x1c, 0,
3032 AC_VERB_SET_POWER_STATE, parm);
3033 snd_hda_codec_write(codec, 0x37, 0,
3034 AC_VERB_SET_POWER_STATE, parm);
3037 if (spec->codec_type == VT1802) {
3038 /* PW1 (25h), MW1 (15h), MUX1(35h), AOW1 (9h) */
3040 set_pin_power_state(codec, 0x25, &parm);
3041 snd_hda_codec_write(codec, 0x15, 0,
3042 AC_VERB_SET_POWER_STATE, parm);
3043 snd_hda_codec_write(codec, 0x35, 0,
3044 AC_VERB_SET_POWER_STATE, parm);
3046 /* PW1 (25h), MW1 (19h), MUX1(35h), AOW1 (9h) */
3048 set_pin_power_state(codec, 0x25, &parm);
3049 snd_hda_codec_write(codec, 0x19, 0,
3050 AC_VERB_SET_POWER_STATE, parm);
3051 snd_hda_codec_write(codec, 0x35, 0,
3052 AC_VERB_SET_POWER_STATE, parm);
3055 if (spec->hp_independent_mode)
3056 snd_hda_codec_write(codec, 0x9, 0,
3057 AC_VERB_SET_POWER_STATE, AC_PWRST_D0);
3060 /* PW0 (24h), MW0(18h/14h), MUX0(34h) */
3061 present = snd_hda_jack_detect(codec, 0x25);
3064 set_pin_power_state(codec, 0x24, &parm);
3065 parm = present ? AC_PWRST_D3 : AC_PWRST_D0;
3066 if (spec->codec_type == VT1802)
3067 snd_hda_codec_write(codec, 0x14, 0,
3068 AC_VERB_SET_POWER_STATE, parm);
3070 snd_hda_codec_write(codec, 0x18, 0,
3071 AC_VERB_SET_POWER_STATE, parm);
3072 snd_hda_codec_write(codec, 0x34, 0, AC_VERB_SET_POWER_STATE, parm);
3075 present = snd_hda_jack_detect(codec, 0x26);
3077 parm = present ? AC_PWRST_D3 : AC_PWRST_D0;
3078 if (spec->codec_type == VT1802) {
3079 /* PW15 (33h), MW8(1ch), MUX8(3ch) */
3080 snd_hda_codec_write(codec, 0x33, 0,
3081 AC_VERB_SET_POWER_STATE, parm);
3082 snd_hda_codec_write(codec, 0x1c, 0,
3083 AC_VERB_SET_POWER_STATE, parm);
3084 snd_hda_codec_write(codec, 0x3c, 0,
3085 AC_VERB_SET_POWER_STATE, parm);
3087 /* PW15 (31h), MW8(17h), MUX8(3bh) */
3088 snd_hda_codec_write(codec, 0x31, 0,
3089 AC_VERB_SET_POWER_STATE, parm);
3090 snd_hda_codec_write(codec, 0x17, 0,
3091 AC_VERB_SET_POWER_STATE, parm);
3092 snd_hda_codec_write(codec, 0x3b, 0,
3093 AC_VERB_SET_POWER_STATE, parm);
3096 if (imux_is_smixer || !is_aa_path_mute(codec))
3097 snd_hda_codec_write(codec, 0x21, 0,
3098 AC_VERB_SET_POWER_STATE, AC_PWRST_D0);
3100 snd_hda_codec_write(codec, 0x21, 0,
3101 AC_VERB_SET_POWER_STATE, AC_PWRST_D3);
3104 /* patch for vt2002P */
3105 static int patch_vt2002P(struct hda_codec *codec)
3107 struct via_spec *spec;
3110 /* create a codec specific record */
3111 spec = via_new_spec(codec);
3115 spec->aa_mix_nid = 0x21;
3116 override_mic_boost(codec, 0x2b, 0, 3, 40);
3117 override_mic_boost(codec, 0x29, 0, 3, 40);
3119 /* automatic parse from the BIOS config */
3120 err = via_parse_auto_config(codec);
3126 if (spec->codec_type == VT1802)
3127 spec->init_verbs[spec->num_iverbs++] = vt1802_init_verbs;
3129 spec->init_verbs[spec->num_iverbs++] = vt2002P_init_verbs;
3131 codec->patch_ops = via_patch_ops;
3133 spec->set_widgets_power_state = set_widgets_power_state_vt2002P;
3139 static const struct hda_verb vt1812_init_verbs[] = {
3140 /* Enable Boost Volume backdoor */
3142 /* Enable AOW0 to MW9 */
3147 static void set_widgets_power_state_vt1812(struct hda_codec *codec)
3149 struct via_spec *spec = codec->spec;
3150 int imux_is_smixer =
3151 snd_hda_codec_read(codec, 0x13, 0, AC_VERB_GET_CONNECT_SEL, 0x00) == 3;
3153 unsigned int present;
3154 /* MUX10 (1eh) = stereo mixer */
3156 snd_hda_codec_read(codec, 0x1e, 0, AC_VERB_GET_CONNECT_SEL, 0x00) == 5;
3158 /* PW 5/6/7 (29h/2ah/2bh) */
3160 set_pin_power_state(codec, 0x29, &parm);
3161 set_pin_power_state(codec, 0x2a, &parm);
3162 set_pin_power_state(codec, 0x2b, &parm);
3164 /* MUX10/11 (1eh/1fh), AIW 0/1 (10h/11h) */
3165 snd_hda_codec_write(codec, 0x1e, 0, AC_VERB_SET_POWER_STATE, parm);
3166 snd_hda_codec_write(codec, 0x1f, 0, AC_VERB_SET_POWER_STATE, parm);
3167 snd_hda_codec_write(codec, 0x10, 0, AC_VERB_SET_POWER_STATE, parm);
3168 snd_hda_codec_write(codec, 0x11, 0, AC_VERB_SET_POWER_STATE, parm);
3172 snd_hda_codec_write(codec, 0x8, 0,
3173 AC_VERB_SET_POWER_STATE, AC_PWRST_D0);
3175 /* PW4 (28h), MW4 (18h), MUX4(38h) */
3177 set_pin_power_state(codec, 0x28, &parm);
3178 snd_hda_codec_write(codec, 0x18, 0, AC_VERB_SET_POWER_STATE, parm);
3179 snd_hda_codec_write(codec, 0x38, 0, AC_VERB_SET_POWER_STATE, parm);
3181 /* PW1 (25h), MW1 (15h), MUX1(35h), AOW1 (9h) */
3183 set_pin_power_state(codec, 0x25, &parm);
3184 snd_hda_codec_write(codec, 0x15, 0, AC_VERB_SET_POWER_STATE, parm);
3185 snd_hda_codec_write(codec, 0x35, 0, AC_VERB_SET_POWER_STATE, parm);
3186 if (spec->hp_independent_mode)
3187 snd_hda_codec_write(codec, 0x9, 0,
3188 AC_VERB_SET_POWER_STATE, AC_PWRST_D0);
3190 /* Internal Speaker */
3191 /* PW0 (24h), MW0(14h), MUX0(34h) */
3192 present = snd_hda_jack_detect(codec, 0x25);
3195 set_pin_power_state(codec, 0x24, &parm);
3197 snd_hda_codec_write(codec, 0x14, 0,
3198 AC_VERB_SET_POWER_STATE, AC_PWRST_D3);
3199 snd_hda_codec_write(codec, 0x34, 0,
3200 AC_VERB_SET_POWER_STATE, AC_PWRST_D3);
3202 snd_hda_codec_write(codec, 0x14, 0,
3203 AC_VERB_SET_POWER_STATE, AC_PWRST_D0);
3204 snd_hda_codec_write(codec, 0x34, 0,
3205 AC_VERB_SET_POWER_STATE, AC_PWRST_D0);
3210 /* PW13 (31h), MW13(1ch), MUX13(3ch), MW14(3eh) */
3211 present = snd_hda_jack_detect(codec, 0x28);
3214 set_pin_power_state(codec, 0x31, &parm);
3216 snd_hda_codec_write(codec, 0x1c, 0,
3217 AC_VERB_SET_POWER_STATE, AC_PWRST_D3);
3218 snd_hda_codec_write(codec, 0x3c, 0,
3219 AC_VERB_SET_POWER_STATE, AC_PWRST_D3);
3220 snd_hda_codec_write(codec, 0x3e, 0,
3221 AC_VERB_SET_POWER_STATE, AC_PWRST_D3);
3223 snd_hda_codec_write(codec, 0x1c, 0,
3224 AC_VERB_SET_POWER_STATE, AC_PWRST_D0);
3225 snd_hda_codec_write(codec, 0x3c, 0,
3226 AC_VERB_SET_POWER_STATE, AC_PWRST_D0);
3227 snd_hda_codec_write(codec, 0x3e, 0,
3228 AC_VERB_SET_POWER_STATE, AC_PWRST_D0);
3231 /* PW15 (33h), MW15 (1dh), MUX15(3dh) */
3233 set_pin_power_state(codec, 0x33, &parm);
3234 snd_hda_codec_write(codec, 0x1d, 0, AC_VERB_SET_POWER_STATE, parm);
3235 snd_hda_codec_write(codec, 0x3d, 0, AC_VERB_SET_POWER_STATE, parm);
3239 /* patch for vt1812 */
3240 static int patch_vt1812(struct hda_codec *codec)
3242 struct via_spec *spec;
3245 /* create a codec specific record */
3246 spec = via_new_spec(codec);
3250 spec->aa_mix_nid = 0x21;
3251 override_mic_boost(codec, 0x2b, 0, 3, 40);
3252 override_mic_boost(codec, 0x29, 0, 3, 40);
3254 /* automatic parse from the BIOS config */
3255 err = via_parse_auto_config(codec);
3261 spec->init_verbs[spec->num_iverbs++] = vt1812_init_verbs;
3263 codec->patch_ops = via_patch_ops;
3265 spec->set_widgets_power_state = set_widgets_power_state_vt1812;
3272 static const struct hda_codec_preset snd_hda_preset_via[] = {
3273 { .id = 0x11061708, .name = "VT1708", .patch = patch_vt1708},
3274 { .id = 0x11061709, .name = "VT1708", .patch = patch_vt1708},
3275 { .id = 0x1106170a, .name = "VT1708", .patch = patch_vt1708},
3276 { .id = 0x1106170b, .name = "VT1708", .patch = patch_vt1708},
3277 { .id = 0x1106e710, .name = "VT1709 10-Ch",
3278 .patch = patch_vt1709_10ch},
3279 { .id = 0x1106e711, .name = "VT1709 10-Ch",
3280 .patch = patch_vt1709_10ch},
3281 { .id = 0x1106e712, .name = "VT1709 10-Ch",
3282 .patch = patch_vt1709_10ch},
3283 { .id = 0x1106e713, .name = "VT1709 10-Ch",
3284 .patch = patch_vt1709_10ch},
3285 { .id = 0x1106e714, .name = "VT1709 6-Ch",
3286 .patch = patch_vt1709_6ch},
3287 { .id = 0x1106e715, .name = "VT1709 6-Ch",
3288 .patch = patch_vt1709_6ch},
3289 { .id = 0x1106e716, .name = "VT1709 6-Ch",
3290 .patch = patch_vt1709_6ch},
3291 { .id = 0x1106e717, .name = "VT1709 6-Ch",
3292 .patch = patch_vt1709_6ch},
3293 { .id = 0x1106e720, .name = "VT1708B 8-Ch",
3294 .patch = patch_vt1708B_8ch},
3295 { .id = 0x1106e721, .name = "VT1708B 8-Ch",
3296 .patch = patch_vt1708B_8ch},
3297 { .id = 0x1106e722, .name = "VT1708B 8-Ch",
3298 .patch = patch_vt1708B_8ch},
3299 { .id = 0x1106e723, .name = "VT1708B 8-Ch",
3300 .patch = patch_vt1708B_8ch},
3301 { .id = 0x1106e724, .name = "VT1708B 4-Ch",
3302 .patch = patch_vt1708B_4ch},
3303 { .id = 0x1106e725, .name = "VT1708B 4-Ch",
3304 .patch = patch_vt1708B_4ch},
3305 { .id = 0x1106e726, .name = "VT1708B 4-Ch",
3306 .patch = patch_vt1708B_4ch},
3307 { .id = 0x1106e727, .name = "VT1708B 4-Ch",
3308 .patch = patch_vt1708B_4ch},
3309 { .id = 0x11060397, .name = "VT1708S",
3310 .patch = patch_vt1708S},
3311 { .id = 0x11061397, .name = "VT1708S",
3312 .patch = patch_vt1708S},
3313 { .id = 0x11062397, .name = "VT1708S",
3314 .patch = patch_vt1708S},
3315 { .id = 0x11063397, .name = "VT1708S",
3316 .patch = patch_vt1708S},
3317 { .id = 0x11064397, .name = "VT1705",
3318 .patch = patch_vt1708S},
3319 { .id = 0x11065397, .name = "VT1708S",
3320 .patch = patch_vt1708S},
3321 { .id = 0x11066397, .name = "VT1708S",
3322 .patch = patch_vt1708S},
3323 { .id = 0x11067397, .name = "VT1708S",
3324 .patch = patch_vt1708S},
3325 { .id = 0x11060398, .name = "VT1702",
3326 .patch = patch_vt1702},
3327 { .id = 0x11061398, .name = "VT1702",
3328 .patch = patch_vt1702},
3329 { .id = 0x11062398, .name = "VT1702",
3330 .patch = patch_vt1702},
3331 { .id = 0x11063398, .name = "VT1702",
3332 .patch = patch_vt1702},
3333 { .id = 0x11064398, .name = "VT1702",
3334 .patch = patch_vt1702},
3335 { .id = 0x11065398, .name = "VT1702",
3336 .patch = patch_vt1702},
3337 { .id = 0x11066398, .name = "VT1702",
3338 .patch = patch_vt1702},
3339 { .id = 0x11067398, .name = "VT1702",
3340 .patch = patch_vt1702},
3341 { .id = 0x11060428, .name = "VT1718S",
3342 .patch = patch_vt1718S},
3343 { .id = 0x11064428, .name = "VT1718S",
3344 .patch = patch_vt1718S},
3345 { .id = 0x11060441, .name = "VT2020",
3346 .patch = patch_vt1718S},
3347 { .id = 0x11064441, .name = "VT1828S",
3348 .patch = patch_vt1718S},
3349 { .id = 0x11060433, .name = "VT1716S",
3350 .patch = patch_vt1716S},
3351 { .id = 0x1106a721, .name = "VT1716S",
3352 .patch = patch_vt1716S},
3353 { .id = 0x11060438, .name = "VT2002P", .patch = patch_vt2002P},
3354 { .id = 0x11064438, .name = "VT2002P", .patch = patch_vt2002P},
3355 { .id = 0x11060448, .name = "VT1812", .patch = patch_vt1812},
3356 { .id = 0x11060440, .name = "VT1818S",
3357 .patch = patch_vt1708S},
3358 { .id = 0x11060446, .name = "VT1802",
3359 .patch = patch_vt2002P},
3360 { .id = 0x11068446, .name = "VT1802",
3361 .patch = patch_vt2002P},
3365 MODULE_ALIAS("snd-hda-codec-id:1106*");
3367 static struct hda_codec_preset_list via_list = {
3368 .preset = snd_hda_preset_via,
3369 .owner = THIS_MODULE,
3372 MODULE_LICENSE("GPL");
3373 MODULE_DESCRIPTION("VIA HD-audio codec");
3375 static int __init patch_via_init(void)
3377 return snd_hda_add_codec_preset(&via_list);
3380 static void __exit patch_via_exit(void)
3382 snd_hda_delete_codec_preset(&via_list);
3385 module_init(patch_via_init)
3386 module_exit(patch_via_exit)