]> git.kernelconcepts.de Git - karo-tx-linux.git/blob - sound/pci/hda/patch_via.c
Merge tag 'scsi-misc' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi...
[karo-tx-linux.git] / sound / pci / hda / patch_via.c
1 /*
2  * Universal Interface for Intel High Definition Audio Codec
3  *
4  * HD audio interface patch for VIA VT17xx/VT18xx/VT20xx codec
5  *
6  *  (C) 2006-2009 VIA Technology, Inc.
7  *  (C) 2006-2008 Takashi Iwai <tiwai@suse.de>
8  *
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.
13  *
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.
18  *
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
22  */
23
24 /* * * * * * * * * * * * * * Release History * * * * * * * * * * * * * * * * */
25 /*                                                                           */
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                           */
45 /*                                                                           */
46 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
47
48
49 #include <linux/init.h>
50 #include <linux/delay.h>
51 #include <linux/slab.h>
52 #include <linux/module.h>
53 #include <sound/core.h>
54 #include <sound/asoundef.h>
55 #include "hda_codec.h"
56 #include "hda_local.h"
57 #include "hda_jack.h"
58
59 /* Pin Widget NID */
60 #define VT1708_HP_PIN_NID       0x20
61 #define VT1708_CD_PIN_NID       0x24
62
63 enum VIA_HDA_CODEC {
64         UNKNOWN = -1,
65         VT1708,
66         VT1709_10CH,
67         VT1709_6CH,
68         VT1708B_8CH,
69         VT1708B_4CH,
70         VT1708S,
71         VT1708BCE,
72         VT1702,
73         VT1718S,
74         VT1716S,
75         VT2002P,
76         VT1812,
77         VT1802,
78         CODEC_TYPES,
79 };
80
81 #define VT2002P_COMPATIBLE(spec) \
82         ((spec)->codec_type == VT2002P ||\
83          (spec)->codec_type == VT1812 ||\
84          (spec)->codec_type == VT1802)
85
86 #define MAX_NID_PATH_DEPTH      5
87
88 /* output-path: DAC -> ... -> pin
89  * idx[] contains the source index number of the next widget;
90  * e.g. idx[0] is the index of the DAC selected by path[1] widget
91  * multi[] indicates whether it's a selector widget with multi-connectors
92  * (i.e. the connection selection is mandatory)
93  * vol_ctl and mute_ctl contains the NIDs for the assigned mixers
94  */
95 struct nid_path {
96         int depth;
97         hda_nid_t path[MAX_NID_PATH_DEPTH];
98         unsigned char idx[MAX_NID_PATH_DEPTH];
99         unsigned char multi[MAX_NID_PATH_DEPTH];
100         unsigned int vol_ctl;
101         unsigned int mute_ctl;
102 };
103
104 /* input-path */
105 struct via_input {
106         hda_nid_t pin;  /* input-pin or aa-mix */
107         int adc_idx;    /* ADC index to be used */
108         int mux_idx;    /* MUX index (if any) */
109         const char *label;      /* input-source label */
110 };
111
112 #define VIA_MAX_ADCS    3
113
114 enum {
115         STREAM_MULTI_OUT = (1 << 0),
116         STREAM_INDEP_HP = (1 << 1),
117 };
118
119 struct via_spec {
120         /* codec parameterization */
121         const struct snd_kcontrol_new *mixers[6];
122         unsigned int num_mixers;
123
124         const struct hda_verb *init_verbs[5];
125         unsigned int num_iverbs;
126
127         char stream_name_analog[32];
128         char stream_name_hp[32];
129         const struct hda_pcm_stream *stream_analog_playback;
130         const struct hda_pcm_stream *stream_analog_capture;
131
132         char stream_name_digital[32];
133         const struct hda_pcm_stream *stream_digital_playback;
134         const struct hda_pcm_stream *stream_digital_capture;
135
136         /* playback */
137         struct hda_multi_out multiout;
138         hda_nid_t slave_dig_outs[2];
139         hda_nid_t hp_dac_nid;
140         hda_nid_t speaker_dac_nid;
141         int hp_indep_shared;    /* indep HP-DAC is shared with side ch */
142         int opened_streams;     /* STREAM_* bits */
143         int active_streams;     /* STREAM_* bits */
144         int aamix_mode;         /* loopback is enabled for output-path? */
145
146         /* Output-paths:
147          * There are different output-paths depending on the setup.
148          * out_path, hp_path and speaker_path are primary paths.  If both
149          * direct DAC and aa-loopback routes are available, these contain
150          * the former paths.  Meanwhile *_mix_path contain the paths with
151          * loopback mixer.  (Since the loopback is only for front channel,
152          * no out_mix_path for surround channels.)
153          * The HP output has another path, hp_indep_path, which is used in
154          * the independent-HP mode.
155          */
156         struct nid_path out_path[HDA_SIDE + 1];
157         struct nid_path out_mix_path;
158         struct nid_path hp_path;
159         struct nid_path hp_mix_path;
160         struct nid_path hp_indep_path;
161         struct nid_path speaker_path;
162         struct nid_path speaker_mix_path;
163
164         /* capture */
165         unsigned int num_adc_nids;
166         hda_nid_t adc_nids[VIA_MAX_ADCS];
167         hda_nid_t mux_nids[VIA_MAX_ADCS];
168         hda_nid_t aa_mix_nid;
169         hda_nid_t dig_in_nid;
170
171         /* capture source */
172         bool dyn_adc_switch;
173         int num_inputs;
174         struct via_input inputs[AUTO_CFG_MAX_INS + 1];
175         unsigned int cur_mux[VIA_MAX_ADCS];
176
177         /* dynamic DAC switching */
178         unsigned int cur_dac_stream_tag;
179         unsigned int cur_dac_format;
180         unsigned int cur_hp_stream_tag;
181         unsigned int cur_hp_format;
182
183         /* dynamic ADC switching */
184         hda_nid_t cur_adc;
185         unsigned int cur_adc_stream_tag;
186         unsigned int cur_adc_format;
187
188         /* PCM information */
189         struct hda_pcm pcm_rec[3];
190
191         /* dynamic controls, init_verbs and input_mux */
192         struct auto_pin_cfg autocfg;
193         struct snd_array kctls;
194         hda_nid_t private_dac_nids[AUTO_CFG_MAX_OUTS];
195
196         /* HP mode source */
197         unsigned int hp_independent_mode;
198         unsigned int dmic_enabled;
199         unsigned int no_pin_power_ctl;
200         enum VIA_HDA_CODEC codec_type;
201
202         /* analog low-power control */
203         bool alc_mode;
204
205         /* smart51 setup */
206         unsigned int smart51_nums;
207         hda_nid_t smart51_pins[2];
208         int smart51_idxs[2];
209         const char *smart51_labels[2];
210         unsigned int smart51_enabled;
211
212         /* work to check hp jack state */
213         struct hda_codec *codec;
214         struct delayed_work vt1708_hp_work;
215         int hp_work_active;
216         int vt1708_jack_detect;
217         int vt1708_hp_present;
218
219         void (*set_widgets_power_state)(struct hda_codec *codec);
220
221         struct hda_loopback_check loopback;
222         int num_loopbacks;
223         struct hda_amp_list loopback_list[8];
224
225         /* bind capture-volume */
226         struct hda_bind_ctls *bind_cap_vol;
227         struct hda_bind_ctls *bind_cap_sw;
228
229         struct mutex config_mutex;
230 };
231
232 static enum VIA_HDA_CODEC get_codec_type(struct hda_codec *codec);
233 static struct via_spec * via_new_spec(struct hda_codec *codec)
234 {
235         struct via_spec *spec;
236
237         spec = kzalloc(sizeof(*spec), GFP_KERNEL);
238         if (spec == NULL)
239                 return NULL;
240
241         mutex_init(&spec->config_mutex);
242         codec->spec = spec;
243         spec->codec = codec;
244         spec->codec_type = get_codec_type(codec);
245         /* VT1708BCE & VT1708S are almost same */
246         if (spec->codec_type == VT1708BCE)
247                 spec->codec_type = VT1708S;
248         return spec;
249 }
250
251 static enum VIA_HDA_CODEC get_codec_type(struct hda_codec *codec)
252 {
253         u32 vendor_id = codec->vendor_id;
254         u16 ven_id = vendor_id >> 16;
255         u16 dev_id = vendor_id & 0xffff;
256         enum VIA_HDA_CODEC codec_type;
257
258         /* get codec type */
259         if (ven_id != 0x1106)
260                 codec_type = UNKNOWN;
261         else if (dev_id >= 0x1708 && dev_id <= 0x170b)
262                 codec_type = VT1708;
263         else if (dev_id >= 0xe710 && dev_id <= 0xe713)
264                 codec_type = VT1709_10CH;
265         else if (dev_id >= 0xe714 && dev_id <= 0xe717)
266                 codec_type = VT1709_6CH;
267         else if (dev_id >= 0xe720 && dev_id <= 0xe723) {
268                 codec_type = VT1708B_8CH;
269                 if (snd_hda_param_read(codec, 0x16, AC_PAR_CONNLIST_LEN) == 0x7)
270                         codec_type = VT1708BCE;
271         } else if (dev_id >= 0xe724 && dev_id <= 0xe727)
272                 codec_type = VT1708B_4CH;
273         else if ((dev_id & 0xfff) == 0x397
274                  && (dev_id >> 12) < 8)
275                 codec_type = VT1708S;
276         else if ((dev_id & 0xfff) == 0x398
277                  && (dev_id >> 12) < 8)
278                 codec_type = VT1702;
279         else if ((dev_id & 0xfff) == 0x428
280                  && (dev_id >> 12) < 8)
281                 codec_type = VT1718S;
282         else if (dev_id == 0x0433 || dev_id == 0xa721)
283                 codec_type = VT1716S;
284         else if (dev_id == 0x0441 || dev_id == 0x4441)
285                 codec_type = VT1718S;
286         else if (dev_id == 0x0438 || dev_id == 0x4438)
287                 codec_type = VT2002P;
288         else if (dev_id == 0x0448)
289                 codec_type = VT1812;
290         else if (dev_id == 0x0440)
291                 codec_type = VT1708S;
292         else if ((dev_id & 0xfff) == 0x446)
293                 codec_type = VT1802;
294         else
295                 codec_type = UNKNOWN;
296         return codec_type;
297 };
298
299 #define VIA_JACK_EVENT          0x20
300 #define VIA_HP_EVENT            0x01
301 #define VIA_GPIO_EVENT          0x02
302 #define VIA_LINE_EVENT          0x03
303
304 enum {
305         VIA_CTL_WIDGET_VOL,
306         VIA_CTL_WIDGET_MUTE,
307         VIA_CTL_WIDGET_ANALOG_MUTE,
308 };
309
310 static void analog_low_current_mode(struct hda_codec *codec);
311 static bool is_aa_path_mute(struct hda_codec *codec);
312
313 #define hp_detect_with_aa(codec) \
314         (snd_hda_get_bool_hint(codec, "analog_loopback_hp_detect") == 1 && \
315          !is_aa_path_mute(codec))
316
317 static void vt1708_stop_hp_work(struct via_spec *spec)
318 {
319         if (spec->codec_type != VT1708 || spec->autocfg.hp_pins[0] == 0)
320                 return;
321         if (spec->hp_work_active) {
322                 snd_hda_codec_write(spec->codec, 0x1, 0, 0xf81, 1);
323                 cancel_delayed_work_sync(&spec->vt1708_hp_work);
324                 spec->hp_work_active = 0;
325         }
326 }
327
328 static void vt1708_update_hp_work(struct via_spec *spec)
329 {
330         if (spec->codec_type != VT1708 || spec->autocfg.hp_pins[0] == 0)
331                 return;
332         if (spec->vt1708_jack_detect &&
333             (spec->active_streams || hp_detect_with_aa(spec->codec))) {
334                 if (!spec->hp_work_active) {
335                         snd_hda_codec_write(spec->codec, 0x1, 0, 0xf81, 0);
336                         schedule_delayed_work(&spec->vt1708_hp_work,
337                                               msecs_to_jiffies(100));
338                         spec->hp_work_active = 1;
339                 }
340         } else if (!hp_detect_with_aa(spec->codec))
341                 vt1708_stop_hp_work(spec);
342 }
343
344 static void set_widgets_power_state(struct hda_codec *codec)
345 {
346         struct via_spec *spec = codec->spec;
347         if (spec->set_widgets_power_state)
348                 spec->set_widgets_power_state(codec);
349 }
350
351 static int analog_input_switch_put(struct snd_kcontrol *kcontrol,
352                                    struct snd_ctl_elem_value *ucontrol)
353 {
354         int change = snd_hda_mixer_amp_switch_put(kcontrol, ucontrol);
355         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
356
357         set_widgets_power_state(codec);
358         analog_low_current_mode(snd_kcontrol_chip(kcontrol));
359         vt1708_update_hp_work(codec->spec);
360         return change;
361 }
362
363 /* modify .put = snd_hda_mixer_amp_switch_put */
364 #define ANALOG_INPUT_MUTE                                               \
365         {               .iface = SNDRV_CTL_ELEM_IFACE_MIXER,            \
366                         .name = NULL,                                   \
367                         .index = 0,                                     \
368                         .info = snd_hda_mixer_amp_switch_info,          \
369                         .get = snd_hda_mixer_amp_switch_get,            \
370                         .put = analog_input_switch_put,                 \
371                         .private_value = HDA_COMPOSE_AMP_VAL(0, 3, 0, 0) }
372
373 static const struct snd_kcontrol_new via_control_templates[] = {
374         HDA_CODEC_VOLUME(NULL, 0, 0, 0),
375         HDA_CODEC_MUTE(NULL, 0, 0, 0),
376         ANALOG_INPUT_MUTE,
377 };
378
379
380 /* add dynamic controls */
381 static struct snd_kcontrol_new *__via_clone_ctl(struct via_spec *spec,
382                                 const struct snd_kcontrol_new *tmpl,
383                                 const char *name)
384 {
385         struct snd_kcontrol_new *knew;
386
387         snd_array_init(&spec->kctls, sizeof(*knew), 32);
388         knew = snd_array_new(&spec->kctls);
389         if (!knew)
390                 return NULL;
391         *knew = *tmpl;
392         if (!name)
393                 name = tmpl->name;
394         if (name) {
395                 knew->name = kstrdup(name, GFP_KERNEL);
396                 if (!knew->name)
397                         return NULL;
398         }
399         return knew;
400 }
401
402 static int __via_add_control(struct via_spec *spec, int type, const char *name,
403                              int idx, unsigned long val)
404 {
405         struct snd_kcontrol_new *knew;
406
407         knew = __via_clone_ctl(spec, &via_control_templates[type], name);
408         if (!knew)
409                 return -ENOMEM;
410         knew->index = idx;
411         if (get_amp_nid_(val))
412                 knew->subdevice = HDA_SUBDEV_AMP_FLAG;
413         knew->private_value = val;
414         return 0;
415 }
416
417 #define via_add_control(spec, type, name, val) \
418         __via_add_control(spec, type, name, 0, val)
419
420 #define via_clone_control(spec, tmpl) __via_clone_ctl(spec, tmpl, NULL)
421
422 static void via_free_kctls(struct hda_codec *codec)
423 {
424         struct via_spec *spec = codec->spec;
425
426         if (spec->kctls.list) {
427                 struct snd_kcontrol_new *kctl = spec->kctls.list;
428                 int i;
429                 for (i = 0; i < spec->kctls.used; i++)
430                         kfree(kctl[i].name);
431         }
432         snd_array_free(&spec->kctls);
433 }
434
435 /* create input playback/capture controls for the given pin */
436 static int via_new_analog_input(struct via_spec *spec, const char *ctlname,
437                                 int type_idx, int idx, int mix_nid)
438 {
439         char name[32];
440         int err;
441
442         sprintf(name, "%s Playback Volume", ctlname);
443         err = __via_add_control(spec, VIA_CTL_WIDGET_VOL, name, type_idx,
444                               HDA_COMPOSE_AMP_VAL(mix_nid, 3, idx, HDA_INPUT));
445         if (err < 0)
446                 return err;
447         sprintf(name, "%s Playback Switch", ctlname);
448         err = __via_add_control(spec, VIA_CTL_WIDGET_ANALOG_MUTE, name, type_idx,
449                               HDA_COMPOSE_AMP_VAL(mix_nid, 3, idx, HDA_INPUT));
450         if (err < 0)
451                 return err;
452         return 0;
453 }
454
455 #define get_connection_index(codec, mux, nid) \
456         snd_hda_get_conn_index(codec, mux, nid, 0)
457
458 static bool check_amp_caps(struct hda_codec *codec, hda_nid_t nid, int dir,
459                            unsigned int mask)
460 {
461         unsigned int caps;
462         if (!nid)
463                 return false;
464         caps = get_wcaps(codec, nid);
465         if (dir == HDA_INPUT)
466                 caps &= AC_WCAP_IN_AMP;
467         else
468                 caps &= AC_WCAP_OUT_AMP;
469         if (!caps)
470                 return false;
471         if (query_amp_caps(codec, nid, dir) & mask)
472                 return true;
473         return false;
474 }
475
476 #define have_mute(codec, nid, dir) \
477         check_amp_caps(codec, nid, dir, AC_AMPCAP_MUTE)
478
479 /* enable/disable the output-route mixers */
480 static void activate_output_mix(struct hda_codec *codec, struct nid_path *path,
481                                 hda_nid_t mix_nid, int idx, bool enable)
482 {
483         int i, num, val;
484
485         if (!path)
486                 return;
487         num = snd_hda_get_conn_list(codec, mix_nid, NULL);
488         for (i = 0; i < num; i++) {
489                 if (i == idx)
490                         val = AMP_IN_UNMUTE(i);
491                 else
492                         val = AMP_IN_MUTE(i);
493                 snd_hda_codec_write(codec, mix_nid, 0,
494                                     AC_VERB_SET_AMP_GAIN_MUTE, val);
495         }
496 }
497
498 /* enable/disable the output-route */
499 static void activate_output_path(struct hda_codec *codec, struct nid_path *path,
500                                  bool enable, bool force)
501 {
502         struct via_spec *spec = codec->spec;
503         int i;
504         for (i = 0; i < path->depth; i++) {
505                 hda_nid_t src, dst;
506                 int idx = path->idx[i];
507                 src = path->path[i];                    
508                 if (i < path->depth - 1)
509                         dst = path->path[i + 1];
510                 else
511                         dst = 0;
512                 if (enable && path->multi[i])
513                         snd_hda_codec_write(codec, dst, 0,
514                                             AC_VERB_SET_CONNECT_SEL, idx);
515                 if (!force && (dst == spec->aa_mix_nid))
516                         continue;
517                 if (have_mute(codec, dst, HDA_INPUT))
518                         activate_output_mix(codec, path, dst, idx, enable);
519                 if (!force && (src == path->vol_ctl || src == path->mute_ctl))
520                         continue;
521                 if (have_mute(codec, src, HDA_OUTPUT)) {
522                         int val = enable ? AMP_OUT_UNMUTE : AMP_OUT_MUTE;
523                         snd_hda_codec_write(codec, src, 0,
524                                             AC_VERB_SET_AMP_GAIN_MUTE, val);
525                 }
526         }
527 }
528
529 /* set the given pin as output */
530 static void init_output_pin(struct hda_codec *codec, hda_nid_t pin,
531                             int pin_type)
532 {
533         if (!pin)
534                 return;
535         snd_hda_codec_write(codec, pin, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
536                             pin_type);
537         if (snd_hda_query_pin_caps(codec, pin) & AC_PINCAP_EAPD)
538                 snd_hda_codec_write(codec, pin, 0,
539                                     AC_VERB_SET_EAPD_BTLENABLE, 0x02);
540 }
541
542 static void via_auto_init_output(struct hda_codec *codec,
543                                  struct nid_path *path, int pin_type)
544 {
545         unsigned int caps;
546         hda_nid_t pin;
547
548         if (!path->depth)
549                 return;
550         pin = path->path[path->depth - 1];
551
552         init_output_pin(codec, pin, pin_type);
553         caps = query_amp_caps(codec, pin, HDA_OUTPUT);
554         if (caps & AC_AMPCAP_MUTE) {
555                 unsigned int val;
556                 val = (caps & AC_AMPCAP_OFFSET) >> AC_AMPCAP_OFFSET_SHIFT;
557                 snd_hda_codec_write(codec, pin, 0, AC_VERB_SET_AMP_GAIN_MUTE,
558                                     AMP_OUT_MUTE | val);
559         }
560         activate_output_path(codec, path, true, true); /* force on */
561 }
562
563 static void via_auto_init_multi_out(struct hda_codec *codec)
564 {
565         struct via_spec *spec = codec->spec;
566         struct nid_path *path;
567         int i;
568
569         for (i = 0; i < spec->autocfg.line_outs + spec->smart51_nums; i++) {
570                 path = &spec->out_path[i];
571                 if (!i && spec->aamix_mode && spec->out_mix_path.depth)
572                         path = &spec->out_mix_path;
573                 via_auto_init_output(codec, path, PIN_OUT);
574         }
575 }
576
577 /* deactivate the inactive headphone-paths */
578 static void deactivate_hp_paths(struct hda_codec *codec)
579 {
580         struct via_spec *spec = codec->spec;
581         int shared = spec->hp_indep_shared;
582
583         if (spec->hp_independent_mode) {
584                 activate_output_path(codec, &spec->hp_path, false, false);
585                 activate_output_path(codec, &spec->hp_mix_path, false, false);
586                 if (shared)
587                         activate_output_path(codec, &spec->out_path[shared],
588                                              false, false);
589         } else if (spec->aamix_mode || !spec->hp_path.depth) {
590                 activate_output_path(codec, &spec->hp_indep_path, false, false);
591                 activate_output_path(codec, &spec->hp_path, false, false);
592         } else {
593                 activate_output_path(codec, &spec->hp_indep_path, false, false);
594                 activate_output_path(codec, &spec->hp_mix_path, false, false);
595         }
596 }
597
598 static void via_auto_init_hp_out(struct hda_codec *codec)
599 {
600         struct via_spec *spec = codec->spec;
601
602         if (!spec->hp_path.depth) {
603                 via_auto_init_output(codec, &spec->hp_mix_path, PIN_HP);
604                 return;
605         }
606         deactivate_hp_paths(codec);
607         if (spec->hp_independent_mode)
608                 via_auto_init_output(codec, &spec->hp_indep_path, PIN_HP);
609         else if (spec->aamix_mode)
610                 via_auto_init_output(codec, &spec->hp_mix_path, PIN_HP);
611         else
612                 via_auto_init_output(codec, &spec->hp_path, PIN_HP);
613 }
614
615 static void via_auto_init_speaker_out(struct hda_codec *codec)
616 {
617         struct via_spec *spec = codec->spec;
618
619         if (!spec->autocfg.speaker_outs)
620                 return;
621         if (!spec->speaker_path.depth) {
622                 via_auto_init_output(codec, &spec->speaker_mix_path, PIN_OUT);
623                 return;
624         }
625         if (!spec->aamix_mode) {
626                 activate_output_path(codec, &spec->speaker_mix_path,
627                                      false, false);
628                 via_auto_init_output(codec, &spec->speaker_path, PIN_OUT);
629         } else {
630                 activate_output_path(codec, &spec->speaker_path, false, false);
631                 via_auto_init_output(codec, &spec->speaker_mix_path, PIN_OUT);
632         }
633 }
634
635 static bool is_smart51_pins(struct hda_codec *codec, hda_nid_t pin);
636 static void via_hp_automute(struct hda_codec *codec);
637
638 static void via_auto_init_analog_input(struct hda_codec *codec)
639 {
640         struct via_spec *spec = codec->spec;
641         const struct auto_pin_cfg *cfg = &spec->autocfg;
642         hda_nid_t conn[HDA_MAX_CONNECTIONS];
643         unsigned int ctl;
644         int i, num_conns;
645
646         /* init ADCs */
647         for (i = 0; i < spec->num_adc_nids; i++) {
648                 snd_hda_codec_write(codec, spec->adc_nids[i], 0,
649                                     AC_VERB_SET_AMP_GAIN_MUTE,
650                                     AMP_IN_UNMUTE(0));
651         }
652
653         /* init pins */
654         for (i = 0; i < cfg->num_inputs; i++) {
655                 hda_nid_t nid = cfg->inputs[i].pin;
656                 if (spec->smart51_enabled && is_smart51_pins(codec, nid))
657                         ctl = PIN_OUT;
658                 else if (cfg->inputs[i].type == AUTO_PIN_MIC)
659                         ctl = PIN_VREF50;
660                 else
661                         ctl = PIN_IN;
662                 snd_hda_codec_write(codec, nid, 0,
663                                     AC_VERB_SET_PIN_WIDGET_CONTROL, ctl);
664         }
665
666         /* init input-src */
667         for (i = 0; i < spec->num_adc_nids; i++) {
668                 int adc_idx = spec->inputs[spec->cur_mux[i]].adc_idx;
669                 /* secondary ADCs must have the unique MUX */
670                 if (i > 0 && !spec->mux_nids[i])
671                         break;
672                 if (spec->mux_nids[adc_idx]) {
673                         int mux_idx = spec->inputs[spec->cur_mux[i]].mux_idx;
674                         snd_hda_codec_write(codec, spec->mux_nids[adc_idx], 0,
675                                             AC_VERB_SET_CONNECT_SEL,
676                                             mux_idx);
677                 }
678                 if (spec->dyn_adc_switch)
679                         break; /* only one input-src */
680         }
681
682         /* init aa-mixer */
683         if (!spec->aa_mix_nid)
684                 return;
685         num_conns = snd_hda_get_connections(codec, spec->aa_mix_nid, conn,
686                                             ARRAY_SIZE(conn));
687         for (i = 0; i < num_conns; i++) {
688                 unsigned int caps = get_wcaps(codec, conn[i]);
689                 if (get_wcaps_type(caps) == AC_WID_PIN)
690                         snd_hda_codec_write(codec, spec->aa_mix_nid, 0,
691                                             AC_VERB_SET_AMP_GAIN_MUTE,
692                                             AMP_IN_MUTE(i));
693         }
694 }
695
696 static void update_power_state(struct hda_codec *codec, hda_nid_t nid,
697                                unsigned int parm)
698 {
699         if (snd_hda_codec_read(codec, nid, 0,
700                                AC_VERB_GET_POWER_STATE, 0) == parm)
701                 return;
702         snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_POWER_STATE, parm);
703 }
704
705 static void set_pin_power_state(struct hda_codec *codec, hda_nid_t nid,
706                                 unsigned int *affected_parm)
707 {
708         unsigned parm;
709         unsigned def_conf = snd_hda_codec_get_pincfg(codec, nid);
710         unsigned no_presence = (def_conf & AC_DEFCFG_MISC)
711                 >> AC_DEFCFG_MISC_SHIFT
712                 & AC_DEFCFG_MISC_NO_PRESENCE; /* do not support pin sense */
713         struct via_spec *spec = codec->spec;
714         unsigned present = 0;
715
716         no_presence |= spec->no_pin_power_ctl;
717         if (!no_presence)
718                 present = snd_hda_jack_detect(codec, nid);
719         if ((spec->smart51_enabled && is_smart51_pins(codec, nid))
720             || ((no_presence || present)
721                 && get_defcfg_connect(def_conf) != AC_JACK_PORT_NONE)) {
722                 *affected_parm = AC_PWRST_D0; /* if it's connected */
723                 parm = AC_PWRST_D0;
724         } else
725                 parm = AC_PWRST_D3;
726
727         update_power_state(codec, nid, parm);
728 }
729
730 static int via_pin_power_ctl_info(struct snd_kcontrol *kcontrol,
731                                   struct snd_ctl_elem_info *uinfo)
732 {
733         static const char * const texts[] = {
734                 "Disabled", "Enabled"
735         };
736
737         uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
738         uinfo->count = 1;
739         uinfo->value.enumerated.items = 2;
740         if (uinfo->value.enumerated.item >= uinfo->value.enumerated.items)
741                 uinfo->value.enumerated.item = uinfo->value.enumerated.items - 1;
742         strcpy(uinfo->value.enumerated.name,
743                texts[uinfo->value.enumerated.item]);
744         return 0;
745 }
746
747 static int via_pin_power_ctl_get(struct snd_kcontrol *kcontrol,
748                                  struct snd_ctl_elem_value *ucontrol)
749 {
750         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
751         struct via_spec *spec = codec->spec;
752         ucontrol->value.enumerated.item[0] = !spec->no_pin_power_ctl;
753         return 0;
754 }
755
756 static int via_pin_power_ctl_put(struct snd_kcontrol *kcontrol,
757                                  struct snd_ctl_elem_value *ucontrol)
758 {
759         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
760         struct via_spec *spec = codec->spec;
761         unsigned int val = !ucontrol->value.enumerated.item[0];
762
763         if (val == spec->no_pin_power_ctl)
764                 return 0;
765         spec->no_pin_power_ctl = val;
766         set_widgets_power_state(codec);
767         analog_low_current_mode(codec);
768         return 1;
769 }
770
771 static const struct snd_kcontrol_new via_pin_power_ctl_enum = {
772         .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
773         .name = "Dynamic Power-Control",
774         .info = via_pin_power_ctl_info,
775         .get = via_pin_power_ctl_get,
776         .put = via_pin_power_ctl_put,
777 };
778
779
780 static int via_independent_hp_info(struct snd_kcontrol *kcontrol,
781                                    struct snd_ctl_elem_info *uinfo)
782 {
783         static const char * const texts[] = { "OFF", "ON" };
784
785         uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
786         uinfo->count = 1;
787         uinfo->value.enumerated.items = 2;
788         if (uinfo->value.enumerated.item >= 2)
789                 uinfo->value.enumerated.item = 1;
790         strcpy(uinfo->value.enumerated.name,
791                texts[uinfo->value.enumerated.item]);
792         return 0;
793 }
794
795 static int via_independent_hp_get(struct snd_kcontrol *kcontrol,
796                                   struct snd_ctl_elem_value *ucontrol)
797 {
798         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
799         struct via_spec *spec = codec->spec;
800
801         ucontrol->value.enumerated.item[0] = spec->hp_independent_mode;
802         return 0;
803 }
804
805 /* adjust spec->multiout setup according to the current flags */
806 static void setup_playback_multi_pcm(struct via_spec *spec)
807 {
808         const struct auto_pin_cfg *cfg = &spec->autocfg;
809         spec->multiout.num_dacs = cfg->line_outs + spec->smart51_nums;
810         spec->multiout.hp_nid = 0;
811         if (!spec->hp_independent_mode) {
812                 if (!spec->hp_indep_shared)
813                         spec->multiout.hp_nid = spec->hp_dac_nid;
814         } else {
815                 if (spec->hp_indep_shared)
816                         spec->multiout.num_dacs = cfg->line_outs - 1;
817         }
818 }
819
820 /* update DAC setups according to indep-HP switch;
821  * this function is called only when indep-HP is modified
822  */
823 static void switch_indep_hp_dacs(struct hda_codec *codec)
824 {
825         struct via_spec *spec = codec->spec;
826         int shared = spec->hp_indep_shared;
827         hda_nid_t shared_dac, hp_dac;
828
829         if (!spec->opened_streams)
830                 return;
831
832         shared_dac = shared ? spec->multiout.dac_nids[shared] : 0;
833         hp_dac = spec->hp_dac_nid;
834         if (spec->hp_independent_mode) {
835                 /* switch to indep-HP mode */
836                 if (spec->active_streams & STREAM_MULTI_OUT) {
837                         __snd_hda_codec_cleanup_stream(codec, hp_dac, 1);
838                         __snd_hda_codec_cleanup_stream(codec, shared_dac, 1);
839                 }
840                 if (spec->active_streams & STREAM_INDEP_HP)
841                         snd_hda_codec_setup_stream(codec, hp_dac,
842                                                    spec->cur_hp_stream_tag, 0,
843                                                    spec->cur_hp_format);
844         } else {
845                 /* back to HP or shared-DAC */
846                 if (spec->active_streams & STREAM_INDEP_HP)
847                         __snd_hda_codec_cleanup_stream(codec, hp_dac, 1);
848                 if (spec->active_streams & STREAM_MULTI_OUT) {
849                         hda_nid_t dac;
850                         int ch;
851                         if (shared_dac) { /* reset mutli-ch DAC */
852                                 dac = shared_dac;
853                                 ch = shared * 2;
854                         } else { /* reset HP DAC */
855                                 dac = hp_dac;
856                                 ch = 0;
857                         }
858                         snd_hda_codec_setup_stream(codec, dac,
859                                                    spec->cur_dac_stream_tag, ch,
860                                                    spec->cur_dac_format);
861                 }
862         }
863         setup_playback_multi_pcm(spec);
864 }
865
866 static int via_independent_hp_put(struct snd_kcontrol *kcontrol,
867                                   struct snd_ctl_elem_value *ucontrol)
868 {
869         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
870         struct via_spec *spec = codec->spec;
871         int cur, shared;
872
873         mutex_lock(&spec->config_mutex);
874         cur = !!ucontrol->value.enumerated.item[0];
875         if (spec->hp_independent_mode == cur) {
876                 mutex_unlock(&spec->config_mutex);
877                 return 0;
878         }
879         spec->hp_independent_mode = cur;
880         shared = spec->hp_indep_shared;
881         deactivate_hp_paths(codec);
882         if (cur)
883                 activate_output_path(codec, &spec->hp_indep_path, true, false);
884         else {
885                 if (shared)
886                         activate_output_path(codec, &spec->out_path[shared],
887                                              true, false);
888                 if (spec->aamix_mode || !spec->hp_path.depth)
889                         activate_output_path(codec, &spec->hp_mix_path,
890                                              true, false);
891                 else
892                         activate_output_path(codec, &spec->hp_path,
893                                              true, false);
894         }
895
896         switch_indep_hp_dacs(codec);
897         mutex_unlock(&spec->config_mutex);
898
899         /* update jack power state */
900         set_widgets_power_state(codec);
901         via_hp_automute(codec);
902         return 1;
903 }
904
905 static const struct snd_kcontrol_new via_hp_mixer = {
906         .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
907         .name = "Independent HP",
908         .info = via_independent_hp_info,
909         .get = via_independent_hp_get,
910         .put = via_independent_hp_put,
911 };
912
913 static int via_hp_build(struct hda_codec *codec)
914 {
915         struct via_spec *spec = codec->spec;
916         struct snd_kcontrol_new *knew;
917         hda_nid_t nid;
918
919         nid = spec->autocfg.hp_pins[0];
920         knew = via_clone_control(spec, &via_hp_mixer);
921         if (knew == NULL)
922                 return -ENOMEM;
923
924         knew->subdevice = HDA_SUBDEV_NID_FLAG | nid;
925
926         return 0;
927 }
928
929 static void notify_aa_path_ctls(struct hda_codec *codec)
930 {
931         struct via_spec *spec = codec->spec;
932         int i;
933
934         for (i = 0; i < spec->smart51_nums; i++) {
935                 struct snd_kcontrol *ctl;
936                 struct snd_ctl_elem_id id;
937                 memset(&id, 0, sizeof(id));
938                 id.iface = SNDRV_CTL_ELEM_IFACE_MIXER;
939                 sprintf(id.name, "%s Playback Volume", spec->smart51_labels[i]);
940                 ctl = snd_hda_find_mixer_ctl(codec, id.name);
941                 if (ctl)
942                         snd_ctl_notify(codec->bus->card,
943                                         SNDRV_CTL_EVENT_MASK_VALUE,
944                                         &ctl->id);
945         }
946 }
947
948 static void mute_aa_path(struct hda_codec *codec, int mute)
949 {
950         struct via_spec *spec = codec->spec;
951         int val = mute ? HDA_AMP_MUTE : HDA_AMP_UNMUTE;
952         int i;
953
954         /* check AA path's mute status */
955         for (i = 0; i < spec->smart51_nums; i++) {
956                 if (spec->smart51_idxs[i] < 0)
957                         continue;
958                 snd_hda_codec_amp_stereo(codec, spec->aa_mix_nid,
959                                          HDA_INPUT, spec->smart51_idxs[i],
960                                          HDA_AMP_MUTE, val);
961         }
962 }
963
964 static bool is_smart51_pins(struct hda_codec *codec, hda_nid_t pin)
965 {
966         struct via_spec *spec = codec->spec;
967         int i;
968
969         for (i = 0; i < spec->smart51_nums; i++)
970                 if (spec->smart51_pins[i] == pin)
971                         return true;
972         return false;
973 }
974
975 static int via_smart51_get(struct snd_kcontrol *kcontrol,
976                            struct snd_ctl_elem_value *ucontrol)
977 {
978         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
979         struct via_spec *spec = codec->spec;
980
981         *ucontrol->value.integer.value = spec->smart51_enabled;
982         return 0;
983 }
984
985 static int via_smart51_put(struct snd_kcontrol *kcontrol,
986                            struct snd_ctl_elem_value *ucontrol)
987 {
988         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
989         struct via_spec *spec = codec->spec;
990         int out_in = *ucontrol->value.integer.value
991                 ? AC_PINCTL_OUT_EN : AC_PINCTL_IN_EN;
992         int i;
993
994         for (i = 0; i < spec->smart51_nums; i++) {
995                 hda_nid_t nid = spec->smart51_pins[i];
996                 unsigned int parm;
997
998                 parm = snd_hda_codec_read(codec, nid, 0,
999                                           AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
1000                 parm &= ~(AC_PINCTL_IN_EN | AC_PINCTL_OUT_EN);
1001                 parm |= out_in;
1002                 snd_hda_codec_write(codec, nid, 0,
1003                                     AC_VERB_SET_PIN_WIDGET_CONTROL,
1004                                     parm);
1005                 if (out_in == AC_PINCTL_OUT_EN) {
1006                         mute_aa_path(codec, 1);
1007                         notify_aa_path_ctls(codec);
1008                 }
1009         }
1010         spec->smart51_enabled = *ucontrol->value.integer.value;
1011         set_widgets_power_state(codec);
1012         return 1;
1013 }
1014
1015 static const struct snd_kcontrol_new via_smart51_mixer = {
1016         .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1017         .name = "Smart 5.1",
1018         .count = 1,
1019         .info = snd_ctl_boolean_mono_info,
1020         .get = via_smart51_get,
1021         .put = via_smart51_put,
1022 };
1023
1024 static int via_smart51_build(struct hda_codec *codec)
1025 {
1026         struct via_spec *spec = codec->spec;
1027
1028         if (!spec->smart51_nums)
1029                 return 0;
1030         if (!via_clone_control(spec, &via_smart51_mixer))
1031                 return -ENOMEM;
1032         return 0;
1033 }
1034
1035 /* check AA path's mute status */
1036 static bool is_aa_path_mute(struct hda_codec *codec)
1037 {
1038         struct via_spec *spec = codec->spec;
1039         const struct hda_amp_list *p;
1040         int i, ch, v;
1041
1042         for (i = 0; i < spec->num_loopbacks; i++) {
1043                 p = &spec->loopback_list[i];
1044                 for (ch = 0; ch < 2; ch++) {
1045                         v = snd_hda_codec_amp_read(codec, p->nid, ch, p->dir,
1046                                                    p->idx);
1047                         if (!(v & HDA_AMP_MUTE) && v > 0)
1048                                 return false;
1049                 }
1050         }
1051         return true;
1052 }
1053
1054 /* enter/exit analog low-current mode */
1055 static void __analog_low_current_mode(struct hda_codec *codec, bool force)
1056 {
1057         struct via_spec *spec = codec->spec;
1058         bool enable;
1059         unsigned int verb, parm;
1060
1061         if (spec->no_pin_power_ctl)
1062                 enable = false;
1063         else
1064                 enable = is_aa_path_mute(codec) && !spec->opened_streams;
1065         if (enable == spec->alc_mode && !force)
1066                 return;
1067         spec->alc_mode = enable;
1068
1069         /* decide low current mode's verb & parameter */
1070         switch (spec->codec_type) {
1071         case VT1708B_8CH:
1072         case VT1708B_4CH:
1073                 verb = 0xf70;
1074                 parm = enable ? 0x02 : 0x00; /* 0x02: 2/3x, 0x00: 1x */
1075                 break;
1076         case VT1708S:
1077         case VT1718S:
1078         case VT1716S:
1079                 verb = 0xf73;
1080                 parm = enable ? 0x51 : 0xe1; /* 0x51: 4/28x, 0xe1: 1x */
1081                 break;
1082         case VT1702:
1083                 verb = 0xf73;
1084                 parm = enable ? 0x01 : 0x1d; /* 0x01: 4/40x, 0x1d: 1x */
1085                 break;
1086         case VT2002P:
1087         case VT1812:
1088         case VT1802:
1089                 verb = 0xf93;
1090                 parm = enable ? 0x00 : 0xe0; /* 0x00: 4/40x, 0xe0: 1x */
1091                 break;
1092         default:
1093                 return;         /* other codecs are not supported */
1094         }
1095         /* send verb */
1096         snd_hda_codec_write(codec, codec->afg, 0, verb, parm);
1097 }
1098
1099 static void analog_low_current_mode(struct hda_codec *codec)
1100 {
1101         return __analog_low_current_mode(codec, false);
1102 }
1103
1104 /*
1105  * generic initialization of ADC, input mixers and output mixers
1106  */
1107 static const struct hda_verb vt1708_init_verbs[] = {
1108         /* power down jack detect function */
1109         {0x1, 0xf81, 0x1},
1110         { }
1111 };
1112
1113 static void set_stream_open(struct hda_codec *codec, int bit, bool active)
1114 {
1115         struct via_spec *spec = codec->spec;
1116
1117         if (active)
1118                 spec->opened_streams |= bit;
1119         else
1120                 spec->opened_streams &= ~bit;
1121         analog_low_current_mode(codec);
1122 }
1123
1124 static int via_playback_multi_pcm_open(struct hda_pcm_stream *hinfo,
1125                                  struct hda_codec *codec,
1126                                  struct snd_pcm_substream *substream)
1127 {
1128         struct via_spec *spec = codec->spec;
1129         const struct auto_pin_cfg *cfg = &spec->autocfg;
1130         int err;
1131
1132         spec->multiout.num_dacs = cfg->line_outs + spec->smart51_nums;
1133         spec->multiout.max_channels = spec->multiout.num_dacs * 2;
1134         set_stream_open(codec, STREAM_MULTI_OUT, true);
1135         err = snd_hda_multi_out_analog_open(codec, &spec->multiout, substream,
1136                                             hinfo);
1137         if (err < 0) {
1138                 set_stream_open(codec, STREAM_MULTI_OUT, false);
1139                 return err;
1140         }
1141         return 0;
1142 }
1143
1144 static int via_playback_multi_pcm_close(struct hda_pcm_stream *hinfo,
1145                                   struct hda_codec *codec,
1146                                   struct snd_pcm_substream *substream)
1147 {
1148         set_stream_open(codec, STREAM_MULTI_OUT, false);
1149         return 0;
1150 }
1151
1152 static int via_playback_hp_pcm_open(struct hda_pcm_stream *hinfo,
1153                                     struct hda_codec *codec,
1154                                     struct snd_pcm_substream *substream)
1155 {
1156         struct via_spec *spec = codec->spec;
1157
1158         if (snd_BUG_ON(!spec->hp_dac_nid))
1159                 return -EINVAL;
1160         set_stream_open(codec, STREAM_INDEP_HP, true);
1161         return 0;
1162 }
1163
1164 static int via_playback_hp_pcm_close(struct hda_pcm_stream *hinfo,
1165                                      struct hda_codec *codec,
1166                                      struct snd_pcm_substream *substream)
1167 {
1168         set_stream_open(codec, STREAM_INDEP_HP, false);
1169         return 0;
1170 }
1171
1172 static int via_playback_multi_pcm_prepare(struct hda_pcm_stream *hinfo,
1173                                           struct hda_codec *codec,
1174                                           unsigned int stream_tag,
1175                                           unsigned int format,
1176                                           struct snd_pcm_substream *substream)
1177 {
1178         struct via_spec *spec = codec->spec;
1179
1180         mutex_lock(&spec->config_mutex);
1181         setup_playback_multi_pcm(spec);
1182         snd_hda_multi_out_analog_prepare(codec, &spec->multiout, stream_tag,
1183                                          format, substream);
1184         /* remember for dynamic DAC switch with indep-HP */
1185         spec->active_streams |= STREAM_MULTI_OUT;
1186         spec->cur_dac_stream_tag = stream_tag;
1187         spec->cur_dac_format = format;
1188         mutex_unlock(&spec->config_mutex);
1189         vt1708_update_hp_work(spec);
1190         return 0;
1191 }
1192
1193 static int via_playback_hp_pcm_prepare(struct hda_pcm_stream *hinfo,
1194                                        struct hda_codec *codec,
1195                                        unsigned int stream_tag,
1196                                        unsigned int format,
1197                                        struct snd_pcm_substream *substream)
1198 {
1199         struct via_spec *spec = codec->spec;
1200
1201         mutex_lock(&spec->config_mutex);
1202         if (spec->hp_independent_mode)
1203                 snd_hda_codec_setup_stream(codec, spec->hp_dac_nid,
1204                                            stream_tag, 0, format);
1205         spec->active_streams |= STREAM_INDEP_HP;
1206         spec->cur_hp_stream_tag = stream_tag;
1207         spec->cur_hp_format = format;
1208         mutex_unlock(&spec->config_mutex);
1209         vt1708_update_hp_work(spec);
1210         return 0;
1211 }
1212
1213 static int via_playback_multi_pcm_cleanup(struct hda_pcm_stream *hinfo,
1214                                     struct hda_codec *codec,
1215                                     struct snd_pcm_substream *substream)
1216 {
1217         struct via_spec *spec = codec->spec;
1218
1219         mutex_lock(&spec->config_mutex);
1220         snd_hda_multi_out_analog_cleanup(codec, &spec->multiout);
1221         spec->active_streams &= ~STREAM_MULTI_OUT;
1222         mutex_unlock(&spec->config_mutex);
1223         vt1708_update_hp_work(spec);
1224         return 0;
1225 }
1226
1227 static int via_playback_hp_pcm_cleanup(struct hda_pcm_stream *hinfo,
1228                                        struct hda_codec *codec,
1229                                        struct snd_pcm_substream *substream)
1230 {
1231         struct via_spec *spec = codec->spec;
1232
1233         mutex_lock(&spec->config_mutex);
1234         if (spec->hp_independent_mode)
1235                 snd_hda_codec_setup_stream(codec, spec->hp_dac_nid, 0, 0, 0);
1236         spec->active_streams &= ~STREAM_INDEP_HP;
1237         mutex_unlock(&spec->config_mutex);
1238         vt1708_update_hp_work(spec);
1239         return 0;
1240 }
1241
1242 /*
1243  * Digital out
1244  */
1245 static int via_dig_playback_pcm_open(struct hda_pcm_stream *hinfo,
1246                                      struct hda_codec *codec,
1247                                      struct snd_pcm_substream *substream)
1248 {
1249         struct via_spec *spec = codec->spec;
1250         return snd_hda_multi_out_dig_open(codec, &spec->multiout);
1251 }
1252
1253 static int via_dig_playback_pcm_close(struct hda_pcm_stream *hinfo,
1254                                       struct hda_codec *codec,
1255                                       struct snd_pcm_substream *substream)
1256 {
1257         struct via_spec *spec = codec->spec;
1258         return snd_hda_multi_out_dig_close(codec, &spec->multiout);
1259 }
1260
1261 static int via_dig_playback_pcm_prepare(struct hda_pcm_stream *hinfo,
1262                                         struct hda_codec *codec,
1263                                         unsigned int stream_tag,
1264                                         unsigned int format,
1265                                         struct snd_pcm_substream *substream)
1266 {
1267         struct via_spec *spec = codec->spec;
1268         return snd_hda_multi_out_dig_prepare(codec, &spec->multiout,
1269                                              stream_tag, format, substream);
1270 }
1271
1272 static int via_dig_playback_pcm_cleanup(struct hda_pcm_stream *hinfo,
1273                                         struct hda_codec *codec,
1274                                         struct snd_pcm_substream *substream)
1275 {
1276         struct via_spec *spec = codec->spec;
1277         snd_hda_multi_out_dig_cleanup(codec, &spec->multiout);
1278         return 0;
1279 }
1280
1281 /*
1282  * Analog capture
1283  */
1284 static int via_capture_pcm_prepare(struct hda_pcm_stream *hinfo,
1285                                    struct hda_codec *codec,
1286                                    unsigned int stream_tag,
1287                                    unsigned int format,
1288                                    struct snd_pcm_substream *substream)
1289 {
1290         struct via_spec *spec = codec->spec;
1291
1292         snd_hda_codec_setup_stream(codec, spec->adc_nids[substream->number],
1293                                    stream_tag, 0, format);
1294         return 0;
1295 }
1296
1297 static int via_capture_pcm_cleanup(struct hda_pcm_stream *hinfo,
1298                                    struct hda_codec *codec,
1299                                    struct snd_pcm_substream *substream)
1300 {
1301         struct via_spec *spec = codec->spec;
1302         snd_hda_codec_cleanup_stream(codec, spec->adc_nids[substream->number]);
1303         return 0;
1304 }
1305
1306 /* analog capture with dynamic ADC switching */
1307 static int via_dyn_adc_capture_pcm_prepare(struct hda_pcm_stream *hinfo,
1308                                            struct hda_codec *codec,
1309                                            unsigned int stream_tag,
1310                                            unsigned int format,
1311                                            struct snd_pcm_substream *substream)
1312 {
1313         struct via_spec *spec = codec->spec;
1314         int adc_idx = spec->inputs[spec->cur_mux[0]].adc_idx;
1315
1316         mutex_lock(&spec->config_mutex);
1317         spec->cur_adc = spec->adc_nids[adc_idx];
1318         spec->cur_adc_stream_tag = stream_tag;
1319         spec->cur_adc_format = format;
1320         snd_hda_codec_setup_stream(codec, spec->cur_adc, stream_tag, 0, format);
1321         mutex_unlock(&spec->config_mutex);
1322         return 0;
1323 }
1324
1325 static int via_dyn_adc_capture_pcm_cleanup(struct hda_pcm_stream *hinfo,
1326                                            struct hda_codec *codec,
1327                                            struct snd_pcm_substream *substream)
1328 {
1329         struct via_spec *spec = codec->spec;
1330
1331         mutex_lock(&spec->config_mutex);
1332         snd_hda_codec_cleanup_stream(codec, spec->cur_adc);
1333         spec->cur_adc = 0;
1334         mutex_unlock(&spec->config_mutex);
1335         return 0;
1336 }
1337
1338 /* re-setup the stream if running; called from input-src put */
1339 static bool via_dyn_adc_pcm_resetup(struct hda_codec *codec, int cur)
1340 {
1341         struct via_spec *spec = codec->spec;
1342         int adc_idx = spec->inputs[cur].adc_idx;
1343         hda_nid_t adc = spec->adc_nids[adc_idx];
1344         bool ret = false;
1345
1346         mutex_lock(&spec->config_mutex);
1347         if (spec->cur_adc && spec->cur_adc != adc) {
1348                 /* stream is running, let's swap the current ADC */
1349                 __snd_hda_codec_cleanup_stream(codec, spec->cur_adc, 1);
1350                 spec->cur_adc = adc;
1351                 snd_hda_codec_setup_stream(codec, adc,
1352                                            spec->cur_adc_stream_tag, 0,
1353                                            spec->cur_adc_format);
1354                 ret = true;
1355         }
1356         mutex_unlock(&spec->config_mutex);
1357         return ret;
1358 }
1359
1360 static const struct hda_pcm_stream via_pcm_analog_playback = {
1361         .substreams = 1,
1362         .channels_min = 2,
1363         .channels_max = 8,
1364         /* NID is set in via_build_pcms */
1365         .ops = {
1366                 .open = via_playback_multi_pcm_open,
1367                 .close = via_playback_multi_pcm_close,
1368                 .prepare = via_playback_multi_pcm_prepare,
1369                 .cleanup = via_playback_multi_pcm_cleanup
1370         },
1371 };
1372
1373 static const struct hda_pcm_stream via_pcm_hp_playback = {
1374         .substreams = 1,
1375         .channels_min = 2,
1376         .channels_max = 2,
1377         /* NID is set in via_build_pcms */
1378         .ops = {
1379                 .open = via_playback_hp_pcm_open,
1380                 .close = via_playback_hp_pcm_close,
1381                 .prepare = via_playback_hp_pcm_prepare,
1382                 .cleanup = via_playback_hp_pcm_cleanup
1383         },
1384 };
1385
1386 static const struct hda_pcm_stream vt1708_pcm_analog_s16_playback = {
1387         .substreams = 1,
1388         .channels_min = 2,
1389         .channels_max = 8,
1390         /* NID is set in via_build_pcms */
1391         /* We got noisy outputs on the right channel on VT1708 when
1392          * 24bit samples are used.  Until any workaround is found,
1393          * disable the 24bit format, so far.
1394          */
1395         .formats = SNDRV_PCM_FMTBIT_S16_LE,
1396         .ops = {
1397                 .open = via_playback_multi_pcm_open,
1398                 .close = via_playback_multi_pcm_close,
1399                 .prepare = via_playback_multi_pcm_prepare,
1400                 .cleanup = via_playback_multi_pcm_cleanup
1401         },
1402 };
1403
1404 static const struct hda_pcm_stream via_pcm_analog_capture = {
1405         .substreams = 1, /* will be changed in via_build_pcms() */
1406         .channels_min = 2,
1407         .channels_max = 2,
1408         /* NID is set in via_build_pcms */
1409         .ops = {
1410                 .prepare = via_capture_pcm_prepare,
1411                 .cleanup = via_capture_pcm_cleanup
1412         },
1413 };
1414
1415 static const struct hda_pcm_stream via_pcm_dyn_adc_analog_capture = {
1416         .substreams = 1,
1417         .channels_min = 2,
1418         .channels_max = 2,
1419         /* NID is set in via_build_pcms */
1420         .ops = {
1421                 .prepare = via_dyn_adc_capture_pcm_prepare,
1422                 .cleanup = via_dyn_adc_capture_pcm_cleanup,
1423         },
1424 };
1425
1426 static const struct hda_pcm_stream via_pcm_digital_playback = {
1427         .substreams = 1,
1428         .channels_min = 2,
1429         .channels_max = 2,
1430         /* NID is set in via_build_pcms */
1431         .ops = {
1432                 .open = via_dig_playback_pcm_open,
1433                 .close = via_dig_playback_pcm_close,
1434                 .prepare = via_dig_playback_pcm_prepare,
1435                 .cleanup = via_dig_playback_pcm_cleanup
1436         },
1437 };
1438
1439 static const struct hda_pcm_stream via_pcm_digital_capture = {
1440         .substreams = 1,
1441         .channels_min = 2,
1442         .channels_max = 2,
1443 };
1444
1445 /*
1446  * slave controls for virtual master
1447  */
1448 static const char * const via_slave_vols[] = {
1449         "Front Playback Volume",
1450         "Surround Playback Volume",
1451         "Center Playback Volume",
1452         "LFE Playback Volume",
1453         "Side Playback Volume",
1454         "Headphone Playback Volume",
1455         "Speaker Playback Volume",
1456         NULL,
1457 };
1458
1459 static const char * const via_slave_sws[] = {
1460         "Front Playback Switch",
1461         "Surround Playback Switch",
1462         "Center Playback Switch",
1463         "LFE Playback Switch",
1464         "Side Playback Switch",
1465         "Headphone Playback Switch",
1466         "Speaker Playback Switch",
1467         NULL,
1468 };
1469
1470 static int via_build_controls(struct hda_codec *codec)
1471 {
1472         struct via_spec *spec = codec->spec;
1473         struct snd_kcontrol *kctl;
1474         int err, i;
1475
1476         spec->no_pin_power_ctl = 1;
1477         if (spec->set_widgets_power_state)
1478                 if (!via_clone_control(spec, &via_pin_power_ctl_enum))
1479                         return -ENOMEM;
1480
1481         for (i = 0; i < spec->num_mixers; i++) {
1482                 err = snd_hda_add_new_ctls(codec, spec->mixers[i]);
1483                 if (err < 0)
1484                         return err;
1485         }
1486
1487         if (spec->multiout.dig_out_nid) {
1488                 err = snd_hda_create_spdif_out_ctls(codec,
1489                                                     spec->multiout.dig_out_nid,
1490                                                     spec->multiout.dig_out_nid);
1491                 if (err < 0)
1492                         return err;
1493                 err = snd_hda_create_spdif_share_sw(codec,
1494                                                     &spec->multiout);
1495                 if (err < 0)
1496                         return err;
1497                 spec->multiout.share_spdif = 1;
1498         }
1499         if (spec->dig_in_nid) {
1500                 err = snd_hda_create_spdif_in_ctls(codec, spec->dig_in_nid);
1501                 if (err < 0)
1502                         return err;
1503         }
1504
1505         /* if we have no master control, let's create it */
1506         if (!snd_hda_find_mixer_ctl(codec, "Master Playback Volume")) {
1507                 unsigned int vmaster_tlv[4];
1508                 snd_hda_set_vmaster_tlv(codec, spec->multiout.dac_nids[0],
1509                                         HDA_OUTPUT, vmaster_tlv);
1510                 err = snd_hda_add_vmaster(codec, "Master Playback Volume",
1511                                           vmaster_tlv, via_slave_vols);
1512                 if (err < 0)
1513                         return err;
1514         }
1515         if (!snd_hda_find_mixer_ctl(codec, "Master Playback Switch")) {
1516                 err = snd_hda_add_vmaster(codec, "Master Playback Switch",
1517                                           NULL, via_slave_sws);
1518                 if (err < 0)
1519                         return err;
1520         }
1521
1522         /* assign Capture Source enums to NID */
1523         kctl = snd_hda_find_mixer_ctl(codec, "Input Source");
1524         for (i = 0; kctl && i < kctl->count; i++) {
1525                 err = snd_hda_add_nid(codec, kctl, i, spec->mux_nids[i]);
1526                 if (err < 0)
1527                         return err;
1528         }
1529
1530         via_free_kctls(codec); /* no longer needed */
1531
1532         err = snd_hda_jack_add_kctls(codec, &spec->autocfg);
1533         if (err < 0)
1534                 return err;
1535
1536         return 0;
1537 }
1538
1539 static int via_build_pcms(struct hda_codec *codec)
1540 {
1541         struct via_spec *spec = codec->spec;
1542         struct hda_pcm *info = spec->pcm_rec;
1543
1544         codec->num_pcms = 0;
1545         codec->pcm_info = info;
1546
1547         if (spec->multiout.num_dacs || spec->num_adc_nids) {
1548                 snprintf(spec->stream_name_analog,
1549                          sizeof(spec->stream_name_analog),
1550                          "%s Analog", codec->chip_name);
1551                 info->name = spec->stream_name_analog;
1552
1553                 if (spec->multiout.num_dacs) {
1554                         if (!spec->stream_analog_playback)
1555                                 spec->stream_analog_playback =
1556                                         &via_pcm_analog_playback;
1557                         info->stream[SNDRV_PCM_STREAM_PLAYBACK] =
1558                                 *spec->stream_analog_playback;
1559                         info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid =
1560                                 spec->multiout.dac_nids[0];
1561                         info->stream[SNDRV_PCM_STREAM_PLAYBACK].channels_max =
1562                                 spec->multiout.max_channels;
1563                 }
1564
1565                 if (!spec->stream_analog_capture) {
1566                         if (spec->dyn_adc_switch)
1567                                 spec->stream_analog_capture =
1568                                         &via_pcm_dyn_adc_analog_capture;
1569                         else
1570                                 spec->stream_analog_capture =
1571                                         &via_pcm_analog_capture;
1572                 }
1573                 if (spec->num_adc_nids) {
1574                         info->stream[SNDRV_PCM_STREAM_CAPTURE] =
1575                                 *spec->stream_analog_capture;
1576                         info->stream[SNDRV_PCM_STREAM_CAPTURE].nid =
1577                                 spec->adc_nids[0];
1578                         if (!spec->dyn_adc_switch)
1579                                 info->stream[SNDRV_PCM_STREAM_CAPTURE].substreams =
1580                                         spec->num_adc_nids;
1581                 }
1582                 codec->num_pcms++;
1583                 info++;
1584         }
1585
1586         if (spec->multiout.dig_out_nid || spec->dig_in_nid) {
1587                 snprintf(spec->stream_name_digital,
1588                          sizeof(spec->stream_name_digital),
1589                          "%s Digital", codec->chip_name);
1590                 info->name = spec->stream_name_digital;
1591                 info->pcm_type = HDA_PCM_TYPE_SPDIF;
1592                 if (spec->multiout.dig_out_nid) {
1593                         if (!spec->stream_digital_playback)
1594                                 spec->stream_digital_playback =
1595                                         &via_pcm_digital_playback;
1596                         info->stream[SNDRV_PCM_STREAM_PLAYBACK] =
1597                                 *spec->stream_digital_playback;
1598                         info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid =
1599                                 spec->multiout.dig_out_nid;
1600                 }
1601                 if (spec->dig_in_nid) {
1602                         if (!spec->stream_digital_capture)
1603                                 spec->stream_digital_capture =
1604                                         &via_pcm_digital_capture;
1605                         info->stream[SNDRV_PCM_STREAM_CAPTURE] =
1606                                 *spec->stream_digital_capture;
1607                         info->stream[SNDRV_PCM_STREAM_CAPTURE].nid =
1608                                 spec->dig_in_nid;
1609                 }
1610                 codec->num_pcms++;
1611                 info++;
1612         }
1613
1614         if (spec->hp_dac_nid) {
1615                 snprintf(spec->stream_name_hp, sizeof(spec->stream_name_hp),
1616                          "%s HP", codec->chip_name);
1617                 info->name = spec->stream_name_hp;
1618                 info->stream[SNDRV_PCM_STREAM_PLAYBACK] = via_pcm_hp_playback;
1619                 info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid =
1620                         spec->hp_dac_nid;
1621                 codec->num_pcms++;
1622                 info++;
1623         }
1624         return 0;
1625 }
1626
1627 static void via_free(struct hda_codec *codec)
1628 {
1629         struct via_spec *spec = codec->spec;
1630
1631         if (!spec)
1632                 return;
1633
1634         via_free_kctls(codec);
1635         vt1708_stop_hp_work(spec);
1636         kfree(spec->bind_cap_vol);
1637         kfree(spec->bind_cap_sw);
1638         kfree(spec);
1639 }
1640
1641 /* mute/unmute outputs */
1642 static void toggle_output_mutes(struct hda_codec *codec, int num_pins,
1643                                 hda_nid_t *pins, bool mute)
1644 {
1645         int i;
1646         for (i = 0; i < num_pins; i++) {
1647                 unsigned int parm = snd_hda_codec_read(codec, pins[i], 0,
1648                                           AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
1649                 if (parm & AC_PINCTL_IN_EN)
1650                         continue;
1651                 if (mute)
1652                         parm &= ~AC_PINCTL_OUT_EN;
1653                 else
1654                         parm |= AC_PINCTL_OUT_EN;
1655                 snd_hda_codec_write(codec, pins[i], 0,
1656                                     AC_VERB_SET_PIN_WIDGET_CONTROL, parm);
1657         }
1658 }
1659
1660 /* mute internal speaker if line-out is plugged */
1661 static void via_line_automute(struct hda_codec *codec, int present)
1662 {
1663         struct via_spec *spec = codec->spec;
1664
1665         if (!spec->autocfg.speaker_outs)
1666                 return;
1667         if (!present)
1668                 present = snd_hda_jack_detect(codec,
1669                                               spec->autocfg.line_out_pins[0]);
1670         toggle_output_mutes(codec, spec->autocfg.speaker_outs,
1671                             spec->autocfg.speaker_pins,
1672                             present);
1673 }
1674
1675 /* mute internal speaker if HP is plugged */
1676 static void via_hp_automute(struct hda_codec *codec)
1677 {
1678         int present = 0;
1679         int nums;
1680         struct via_spec *spec = codec->spec;
1681
1682         if (!spec->hp_independent_mode && spec->autocfg.hp_pins[0] &&
1683             (spec->codec_type != VT1708 || spec->vt1708_jack_detect))
1684                 present = snd_hda_jack_detect(codec, spec->autocfg.hp_pins[0]);
1685
1686         if (spec->smart51_enabled)
1687                 nums = spec->autocfg.line_outs + spec->smart51_nums;
1688         else
1689                 nums = spec->autocfg.line_outs;
1690         toggle_output_mutes(codec, nums, spec->autocfg.line_out_pins, present);
1691
1692         via_line_automute(codec, present);
1693 }
1694
1695 static void via_gpio_control(struct hda_codec *codec)
1696 {
1697         unsigned int gpio_data;
1698         unsigned int vol_counter;
1699         unsigned int vol;
1700         unsigned int master_vol;
1701
1702         struct via_spec *spec = codec->spec;
1703
1704         gpio_data = snd_hda_codec_read(codec, codec->afg, 0,
1705                                        AC_VERB_GET_GPIO_DATA, 0) & 0x03;
1706
1707         vol_counter = (snd_hda_codec_read(codec, codec->afg, 0,
1708                                           0xF84, 0) & 0x3F0000) >> 16;
1709
1710         vol = vol_counter & 0x1F;
1711         master_vol = snd_hda_codec_read(codec, 0x1A, 0,
1712                                         AC_VERB_GET_AMP_GAIN_MUTE,
1713                                         AC_AMP_GET_INPUT);
1714
1715         if (gpio_data == 0x02) {
1716                 /* unmute line out */
1717                 snd_hda_codec_write(codec, spec->autocfg.line_out_pins[0], 0,
1718                                     AC_VERB_SET_PIN_WIDGET_CONTROL,
1719                                     PIN_OUT);
1720                 if (vol_counter & 0x20) {
1721                         /* decrease volume */
1722                         if (vol > master_vol)
1723                                 vol = master_vol;
1724                         snd_hda_codec_amp_stereo(codec, 0x1A, HDA_INPUT,
1725                                                  0, HDA_AMP_VOLMASK,
1726                                                  master_vol-vol);
1727                 } else {
1728                         /* increase volume */
1729                         snd_hda_codec_amp_stereo(codec, 0x1A, HDA_INPUT, 0,
1730                                          HDA_AMP_VOLMASK,
1731                                          ((master_vol+vol) > 0x2A) ? 0x2A :
1732                                           (master_vol+vol));
1733                 }
1734         } else if (!(gpio_data & 0x02)) {
1735                 /* mute line out */
1736                 snd_hda_codec_write(codec, spec->autocfg.line_out_pins[0], 0,
1737                                     AC_VERB_SET_PIN_WIDGET_CONTROL,
1738                                     0);
1739         }
1740 }
1741
1742 /* unsolicited event for jack sensing */
1743 static void via_unsol_event(struct hda_codec *codec,
1744                                   unsigned int res)
1745 {
1746         res >>= 26;
1747         res = snd_hda_jack_get_action(codec, res);
1748
1749         if (res & VIA_JACK_EVENT)
1750                 set_widgets_power_state(codec);
1751
1752         res &= ~VIA_JACK_EVENT;
1753
1754         if (res == VIA_HP_EVENT || res == VIA_LINE_EVENT)
1755                 via_hp_automute(codec);
1756         else if (res == VIA_GPIO_EVENT)
1757                 via_gpio_control(codec);
1758         snd_hda_jack_report_sync(codec);
1759 }
1760
1761 #ifdef CONFIG_PM
1762 static int via_suspend(struct hda_codec *codec, pm_message_t state)
1763 {
1764         struct via_spec *spec = codec->spec;
1765         vt1708_stop_hp_work(spec);
1766         return 0;
1767 }
1768 #endif
1769
1770 #ifdef CONFIG_SND_HDA_POWER_SAVE
1771 static int via_check_power_status(struct hda_codec *codec, hda_nid_t nid)
1772 {
1773         struct via_spec *spec = codec->spec;
1774         return snd_hda_check_amp_list_power(codec, &spec->loopback, nid);
1775 }
1776 #endif
1777
1778 /*
1779  */
1780
1781 static int via_init(struct hda_codec *codec);
1782
1783 static const struct hda_codec_ops via_patch_ops = {
1784         .build_controls = via_build_controls,
1785         .build_pcms = via_build_pcms,
1786         .init = via_init,
1787         .free = via_free,
1788         .unsol_event = via_unsol_event,
1789 #ifdef CONFIG_PM
1790         .suspend = via_suspend,
1791 #endif
1792 #ifdef CONFIG_SND_HDA_POWER_SAVE
1793         .check_power_status = via_check_power_status,
1794 #endif
1795 };
1796
1797 static bool is_empty_dac(struct hda_codec *codec, hda_nid_t dac)
1798 {
1799         struct via_spec *spec = codec->spec;
1800         int i;
1801
1802         for (i = 0; i < spec->multiout.num_dacs; i++) {
1803                 if (spec->multiout.dac_nids[i] == dac)
1804                         return false;
1805         }
1806         if (spec->hp_dac_nid == dac)
1807                 return false;
1808         return true;
1809 }
1810
1811 static bool __parse_output_path(struct hda_codec *codec, hda_nid_t nid,
1812                                 hda_nid_t target_dac, int with_aa_mix,
1813                                 struct nid_path *path, int depth)
1814 {
1815         struct via_spec *spec = codec->spec;
1816         hda_nid_t conn[8];
1817         int i, nums;
1818
1819         if (nid == spec->aa_mix_nid) {
1820                 if (!with_aa_mix)
1821                         return false;
1822                 with_aa_mix = 2; /* mark aa-mix is included */
1823         }
1824
1825         nums = snd_hda_get_connections(codec, nid, conn, ARRAY_SIZE(conn));
1826         for (i = 0; i < nums; i++) {
1827                 if (get_wcaps_type(get_wcaps(codec, conn[i])) != AC_WID_AUD_OUT)
1828                         continue;
1829                 if (conn[i] == target_dac || is_empty_dac(codec, conn[i])) {
1830                         /* aa-mix is requested but not included? */
1831                         if (!(spec->aa_mix_nid && with_aa_mix == 1))
1832                                 goto found;
1833                 }
1834         }
1835         if (depth >= MAX_NID_PATH_DEPTH)
1836                 return false;
1837         for (i = 0; i < nums; i++) {
1838                 unsigned int type;
1839                 type = get_wcaps_type(get_wcaps(codec, conn[i]));
1840                 if (type == AC_WID_AUD_OUT)
1841                         continue;
1842                 if (__parse_output_path(codec, conn[i], target_dac,
1843                                         with_aa_mix, path, depth + 1))
1844                         goto found;
1845         }
1846         return false;
1847
1848  found:
1849         path->path[path->depth] = conn[i];
1850         path->idx[path->depth] = i;
1851         if (nums > 1 && get_wcaps_type(get_wcaps(codec, nid)) != AC_WID_AUD_MIX)
1852                 path->multi[path->depth] = 1;
1853         path->depth++;
1854         return true;
1855 }
1856
1857 static bool parse_output_path(struct hda_codec *codec, hda_nid_t nid,
1858                               hda_nid_t target_dac, int with_aa_mix,
1859                               struct nid_path *path)
1860 {
1861         if (__parse_output_path(codec, nid, target_dac, with_aa_mix, path, 1)) {
1862                 path->path[path->depth] = nid;
1863                 path->depth++;
1864                 snd_printdd("output-path: depth=%d, %02x/%02x/%02x/%02x/%02x\n",
1865                             path->depth, path->path[0], path->path[1],
1866                             path->path[2], path->path[3], path->path[4]);
1867                 return true;
1868         }
1869         return false;
1870 }
1871
1872 static int via_auto_fill_dac_nids(struct hda_codec *codec)
1873 {
1874         struct via_spec *spec = codec->spec;
1875         const struct auto_pin_cfg *cfg = &spec->autocfg;
1876         int i, dac_num;
1877         hda_nid_t nid;
1878
1879         spec->multiout.dac_nids = spec->private_dac_nids;
1880         dac_num = 0;
1881         for (i = 0; i < cfg->line_outs; i++) {
1882                 hda_nid_t dac = 0;
1883                 nid = cfg->line_out_pins[i];
1884                 if (!nid)
1885                         continue;
1886                 if (parse_output_path(codec, nid, 0, 0, &spec->out_path[i]))
1887                         dac = spec->out_path[i].path[0];
1888                 if (!i && parse_output_path(codec, nid, dac, 1,
1889                                             &spec->out_mix_path))
1890                         dac = spec->out_mix_path.path[0];
1891                 if (dac) {
1892                         spec->private_dac_nids[i] = dac;
1893                         dac_num++;
1894                 }
1895         }
1896         if (!spec->out_path[0].depth && spec->out_mix_path.depth) {
1897                 spec->out_path[0] = spec->out_mix_path;
1898                 spec->out_mix_path.depth = 0;
1899         }
1900         spec->multiout.num_dacs = dac_num;
1901         return 0;
1902 }
1903
1904 static int create_ch_ctls(struct hda_codec *codec, const char *pfx,
1905                           int chs, bool check_dac, struct nid_path *path)
1906 {
1907         struct via_spec *spec = codec->spec;
1908         char name[32];
1909         hda_nid_t dac, pin, sel, nid;
1910         int err;
1911
1912         dac = check_dac ? path->path[0] : 0;
1913         pin = path->path[path->depth - 1];
1914         sel = path->depth > 1 ? path->path[1] : 0;
1915
1916         if (dac && check_amp_caps(codec, dac, HDA_OUTPUT, AC_AMPCAP_NUM_STEPS))
1917                 nid = dac;
1918         else if (check_amp_caps(codec, pin, HDA_OUTPUT, AC_AMPCAP_NUM_STEPS))
1919                 nid = pin;
1920         else if (check_amp_caps(codec, sel, HDA_OUTPUT, AC_AMPCAP_NUM_STEPS))
1921                 nid = sel;
1922         else
1923                 nid = 0;
1924         if (nid) {
1925                 sprintf(name, "%s Playback Volume", pfx);
1926                 err = via_add_control(spec, VIA_CTL_WIDGET_VOL, name,
1927                               HDA_COMPOSE_AMP_VAL(nid, chs, 0, HDA_OUTPUT));
1928                 if (err < 0)
1929                         return err;
1930                 path->vol_ctl = nid;
1931         }
1932
1933         if (dac && check_amp_caps(codec, dac, HDA_OUTPUT, AC_AMPCAP_MUTE))
1934                 nid = dac;
1935         else if (check_amp_caps(codec, pin, HDA_OUTPUT, AC_AMPCAP_MUTE))
1936                 nid = pin;
1937         else if (check_amp_caps(codec, sel, HDA_OUTPUT, AC_AMPCAP_MUTE))
1938                 nid = sel;
1939         else
1940                 nid = 0;
1941         if (nid) {
1942                 sprintf(name, "%s Playback Switch", pfx);
1943                 err = via_add_control(spec, VIA_CTL_WIDGET_MUTE, name,
1944                               HDA_COMPOSE_AMP_VAL(nid, chs, 0, HDA_OUTPUT));
1945                 if (err < 0)
1946                         return err;
1947                 path->mute_ctl = nid;
1948         }
1949         return 0;
1950 }
1951
1952 static void mangle_smart51(struct hda_codec *codec)
1953 {
1954         struct via_spec *spec = codec->spec;
1955         struct auto_pin_cfg *cfg = &spec->autocfg;
1956         struct auto_pin_cfg_item *ins = cfg->inputs;
1957         int i, j, nums, attr;
1958         int pins[AUTO_CFG_MAX_INS];
1959
1960         for (attr = INPUT_PIN_ATTR_REAR; attr >= INPUT_PIN_ATTR_NORMAL; attr--) {
1961                 nums = 0;
1962                 for (i = 0; i < cfg->num_inputs; i++) {
1963                         unsigned int def;
1964                         if (ins[i].type > AUTO_PIN_LINE_IN)
1965                                 continue;
1966                         def = snd_hda_codec_get_pincfg(codec, ins[i].pin);
1967                         if (snd_hda_get_input_pin_attr(def) != attr)
1968                                 continue;
1969                         for (j = 0; j < nums; j++)
1970                                 if (ins[pins[j]].type < ins[i].type) {
1971                                         memmove(pins + j + 1, pins + j,
1972                                                 (nums - j) * sizeof(int));
1973                                         break;
1974                                 }
1975                         pins[j] = i;
1976                         nums++;
1977                 }
1978                 if (cfg->line_outs + nums < 3)
1979                         continue;
1980                 for (i = 0; i < nums; i++) {
1981                         hda_nid_t pin = ins[pins[i]].pin;
1982                         spec->smart51_pins[spec->smart51_nums++] = pin;
1983                         cfg->line_out_pins[cfg->line_outs++] = pin;
1984                         if (cfg->line_outs == 3)
1985                                 break;
1986                 }
1987                 return;
1988         }
1989 }
1990
1991 static void copy_path_mixer_ctls(struct nid_path *dst, struct nid_path *src)
1992 {
1993         dst->vol_ctl = src->vol_ctl;
1994         dst->mute_ctl = src->mute_ctl;
1995 }
1996
1997 /* add playback controls from the parsed DAC table */
1998 static int via_auto_create_multi_out_ctls(struct hda_codec *codec)
1999 {
2000         struct via_spec *spec = codec->spec;
2001         struct auto_pin_cfg *cfg = &spec->autocfg;
2002         struct nid_path *path;
2003         static const char * const chname[4] = {
2004                 "Front", "Surround", "C/LFE", "Side"
2005         };
2006         int i, idx, err;
2007         int old_line_outs;
2008
2009         /* check smart51 */
2010         old_line_outs = cfg->line_outs;
2011         if (cfg->line_outs == 1)
2012                 mangle_smart51(codec);
2013
2014         err = via_auto_fill_dac_nids(codec);
2015         if (err < 0)
2016                 return err;
2017
2018         if (spec->multiout.num_dacs < 3) {
2019                 spec->smart51_nums = 0;
2020                 cfg->line_outs = old_line_outs;
2021         }
2022         for (i = 0; i < cfg->line_outs; i++) {
2023                 hda_nid_t pin, dac;
2024                 pin = cfg->line_out_pins[i];
2025                 dac = spec->multiout.dac_nids[i];
2026                 if (!pin || !dac)
2027                         continue;
2028                 path = spec->out_path + i;
2029                 if (i == HDA_CLFE) {
2030                         err = create_ch_ctls(codec, "Center", 1, true, path);
2031                         if (err < 0)
2032                                 return err;
2033                         err = create_ch_ctls(codec, "LFE", 2, true, path);
2034                         if (err < 0)
2035                                 return err;
2036                 } else {
2037                         const char *pfx = chname[i];
2038                         if (cfg->line_out_type == AUTO_PIN_SPEAKER_OUT &&
2039                             cfg->line_outs == 1)
2040                                 pfx = "Speaker";
2041                         err = create_ch_ctls(codec, pfx, 3, true, path);
2042                         if (err < 0)
2043                                 return err;
2044                 }
2045                 if (path != spec->out_path + i)
2046                         copy_path_mixer_ctls(&spec->out_path[i], path);
2047                 if (path == spec->out_path && spec->out_mix_path.depth)
2048                         copy_path_mixer_ctls(&spec->out_mix_path, path);
2049         }
2050
2051         idx = get_connection_index(codec, spec->aa_mix_nid,
2052                                    spec->multiout.dac_nids[0]);
2053         if (idx >= 0) {
2054                 /* add control to mixer */
2055                 const char *name;
2056                 name = spec->out_mix_path.depth ?
2057                         "PCM Loopback Playback Volume" : "PCM Playback Volume";
2058                 err = via_add_control(spec, VIA_CTL_WIDGET_VOL, name,
2059                                       HDA_COMPOSE_AMP_VAL(spec->aa_mix_nid, 3,
2060                                                           idx, HDA_INPUT));
2061                 if (err < 0)
2062                         return err;
2063                 name = spec->out_mix_path.depth ?
2064                         "PCM Loopback Playback Switch" : "PCM Playback Switch";
2065                 err = via_add_control(spec, VIA_CTL_WIDGET_MUTE, name,
2066                                       HDA_COMPOSE_AMP_VAL(spec->aa_mix_nid, 3,
2067                                                           idx, HDA_INPUT));
2068                 if (err < 0)
2069                         return err;
2070         }
2071
2072         cfg->line_outs = old_line_outs;
2073
2074         return 0;
2075 }
2076
2077 static int via_auto_create_hp_ctls(struct hda_codec *codec, hda_nid_t pin)
2078 {
2079         struct via_spec *spec = codec->spec;
2080         struct nid_path *path;
2081         bool check_dac;
2082         int i, err;
2083
2084         if (!pin)
2085                 return 0;
2086
2087         if (!parse_output_path(codec, pin, 0, 0, &spec->hp_indep_path)) {
2088                 for (i = HDA_SIDE; i >= HDA_CLFE; i--) {
2089                         if (i < spec->multiout.num_dacs &&
2090                             parse_output_path(codec, pin,
2091                                               spec->multiout.dac_nids[i], 0,
2092                                               &spec->hp_indep_path)) {
2093                                 spec->hp_indep_shared = i;
2094                                 break;
2095                         }
2096                 }
2097         }
2098         if (spec->hp_indep_path.depth) {
2099                 spec->hp_dac_nid = spec->hp_indep_path.path[0];
2100                 if (!spec->hp_indep_shared)
2101                         spec->hp_path = spec->hp_indep_path;
2102         }
2103         /* optionally check front-path w/o AA-mix */
2104         if (!spec->hp_path.depth)
2105                 parse_output_path(codec, pin,
2106                                   spec->multiout.dac_nids[HDA_FRONT], 0,
2107                                   &spec->hp_path);
2108
2109         if (!parse_output_path(codec, pin, spec->multiout.dac_nids[HDA_FRONT],
2110                                1, &spec->hp_mix_path) && !spec->hp_path.depth)
2111                 return 0;
2112
2113         if (spec->hp_path.depth) {
2114                 path = &spec->hp_path;
2115                 check_dac = true;
2116         } else {
2117                 path = &spec->hp_mix_path;
2118                 check_dac = false;
2119         }
2120         err = create_ch_ctls(codec, "Headphone", 3, check_dac, path);
2121         if (err < 0)
2122                 return err;
2123         if (check_dac)
2124                 copy_path_mixer_ctls(&spec->hp_mix_path, path);
2125         else
2126                 copy_path_mixer_ctls(&spec->hp_path, path);
2127         if (spec->hp_indep_path.depth)
2128                 copy_path_mixer_ctls(&spec->hp_indep_path, path);
2129         return 0;
2130 }
2131
2132 static int via_auto_create_speaker_ctls(struct hda_codec *codec)
2133 {
2134         struct via_spec *spec = codec->spec;
2135         struct nid_path *path;
2136         bool check_dac;
2137         hda_nid_t pin, dac = 0;
2138         int err;
2139
2140         pin = spec->autocfg.speaker_pins[0];
2141         if (!spec->autocfg.speaker_outs || !pin)
2142                 return 0;
2143
2144         if (parse_output_path(codec, pin, 0, 0, &spec->speaker_path))
2145                 dac = spec->speaker_path.path[0];
2146         if (!dac)
2147                 parse_output_path(codec, pin,
2148                                   spec->multiout.dac_nids[HDA_FRONT], 0,
2149                                   &spec->speaker_path);
2150         if (!parse_output_path(codec, pin, spec->multiout.dac_nids[HDA_FRONT],
2151                                1, &spec->speaker_mix_path) && !dac)
2152                 return 0;
2153
2154         /* no AA-path for front? */
2155         if (!spec->out_mix_path.depth && spec->speaker_mix_path.depth)
2156                 dac = 0;
2157
2158         spec->speaker_dac_nid = dac;
2159         spec->multiout.extra_out_nid[0] = dac;
2160         if (dac) {
2161                 path = &spec->speaker_path;
2162                 check_dac = true;
2163         } else {
2164                 path = &spec->speaker_mix_path;
2165                 check_dac = false;
2166         }
2167         err = create_ch_ctls(codec, "Speaker", 3, check_dac, path);
2168         if (err < 0)
2169                 return err;
2170         if (check_dac)
2171                 copy_path_mixer_ctls(&spec->speaker_mix_path, path);
2172         else
2173                 copy_path_mixer_ctls(&spec->speaker_path, path);
2174         return 0;
2175 }
2176
2177 #define via_aamix_ctl_info      via_pin_power_ctl_info
2178
2179 static int via_aamix_ctl_get(struct snd_kcontrol *kcontrol,
2180                              struct snd_ctl_elem_value *ucontrol)
2181 {
2182         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2183         struct via_spec *spec = codec->spec;
2184         ucontrol->value.enumerated.item[0] = spec->aamix_mode;
2185         return 0;
2186 }
2187
2188 static void update_aamix_paths(struct hda_codec *codec, int do_mix,
2189                                struct nid_path *nomix, struct nid_path *mix)
2190 {
2191         if (do_mix) {
2192                 activate_output_path(codec, nomix, false, false);
2193                 activate_output_path(codec, mix, true, false);
2194         } else {
2195                 activate_output_path(codec, mix, false, false);
2196                 activate_output_path(codec, nomix, true, false);
2197         }
2198 }
2199
2200 static int via_aamix_ctl_put(struct snd_kcontrol *kcontrol,
2201                              struct snd_ctl_elem_value *ucontrol)
2202 {
2203         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2204         struct via_spec *spec = codec->spec;
2205         unsigned int val = ucontrol->value.enumerated.item[0];
2206
2207         if (val == spec->aamix_mode)
2208                 return 0;
2209         spec->aamix_mode = val;
2210         /* update front path */
2211         update_aamix_paths(codec, val, &spec->out_path[0], &spec->out_mix_path);
2212         /* update HP path */
2213         if (!spec->hp_independent_mode) {
2214                 update_aamix_paths(codec, val, &spec->hp_path,
2215                                    &spec->hp_mix_path);
2216         }
2217         /* update speaker path */
2218         update_aamix_paths(codec, val, &spec->speaker_path,
2219                            &spec->speaker_mix_path);
2220         return 1;
2221 }
2222
2223 static const struct snd_kcontrol_new via_aamix_ctl_enum = {
2224         .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2225         .name = "Loopback Mixing",
2226         .info = via_aamix_ctl_info,
2227         .get = via_aamix_ctl_get,
2228         .put = via_aamix_ctl_put,
2229 };
2230
2231 static int via_auto_create_loopback_switch(struct hda_codec *codec)
2232 {
2233         struct via_spec *spec = codec->spec;
2234
2235         if (!spec->aa_mix_nid)
2236                 return 0; /* no loopback switching available */
2237         if (!(spec->out_mix_path.depth || spec->hp_mix_path.depth ||
2238               spec->speaker_path.depth))
2239                 return 0; /* no loopback switching available */
2240         if (!via_clone_control(spec, &via_aamix_ctl_enum))
2241                 return -ENOMEM;
2242         return 0;
2243 }
2244
2245 /* look for ADCs */
2246 static int via_fill_adcs(struct hda_codec *codec)
2247 {
2248         struct via_spec *spec = codec->spec;
2249         hda_nid_t nid = codec->start_nid;
2250         int i;
2251
2252         for (i = 0; i < codec->num_nodes; i++, nid++) {
2253                 unsigned int wcaps = get_wcaps(codec, nid);
2254                 if (get_wcaps_type(wcaps) != AC_WID_AUD_IN)
2255                         continue;
2256                 if (wcaps & AC_WCAP_DIGITAL)
2257                         continue;
2258                 if (!(wcaps & AC_WCAP_CONN_LIST))
2259                         continue;
2260                 if (spec->num_adc_nids >= ARRAY_SIZE(spec->adc_nids))
2261                         return -ENOMEM;
2262                 spec->adc_nids[spec->num_adc_nids++] = nid;
2263         }
2264         return 0;
2265 }
2266
2267 /* input-src control */
2268 static int via_mux_enum_info(struct snd_kcontrol *kcontrol,
2269                              struct snd_ctl_elem_info *uinfo)
2270 {
2271         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2272         struct via_spec *spec = codec->spec;
2273
2274         uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
2275         uinfo->count = 1;
2276         uinfo->value.enumerated.items = spec->num_inputs;
2277         if (uinfo->value.enumerated.item >= spec->num_inputs)
2278                 uinfo->value.enumerated.item = spec->num_inputs - 1;
2279         strcpy(uinfo->value.enumerated.name,
2280                spec->inputs[uinfo->value.enumerated.item].label);
2281         return 0;
2282 }
2283
2284 static int via_mux_enum_get(struct snd_kcontrol *kcontrol,
2285                             struct snd_ctl_elem_value *ucontrol)
2286 {
2287         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2288         struct via_spec *spec = codec->spec;
2289         unsigned int idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
2290
2291         ucontrol->value.enumerated.item[0] = spec->cur_mux[idx];
2292         return 0;
2293 }
2294
2295 static int via_mux_enum_put(struct snd_kcontrol *kcontrol,
2296                             struct snd_ctl_elem_value *ucontrol)
2297 {
2298         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2299         struct via_spec *spec = codec->spec;
2300         unsigned int idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
2301         hda_nid_t mux;
2302         int cur;
2303
2304         cur = ucontrol->value.enumerated.item[0];
2305         if (cur < 0 || cur >= spec->num_inputs)
2306                 return -EINVAL;
2307         if (spec->cur_mux[idx] == cur)
2308                 return 0;
2309         spec->cur_mux[idx] = cur;
2310         if (spec->dyn_adc_switch) {
2311                 int adc_idx = spec->inputs[cur].adc_idx;
2312                 mux = spec->mux_nids[adc_idx];
2313                 via_dyn_adc_pcm_resetup(codec, cur);
2314         } else {
2315                 mux = spec->mux_nids[idx];
2316                 if (snd_BUG_ON(!mux))
2317                         return -EINVAL;
2318         }
2319
2320         if (mux) {
2321                 /* switch to D0 beofre change index */
2322                 update_power_state(codec, mux, AC_PWRST_D0);
2323                 snd_hda_codec_write(codec, mux, 0,
2324                                     AC_VERB_SET_CONNECT_SEL,
2325                                     spec->inputs[cur].mux_idx);
2326         }
2327
2328         /* update jack power state */
2329         set_widgets_power_state(codec);
2330         return 0;
2331 }
2332
2333 static const struct snd_kcontrol_new via_input_src_ctl = {
2334         .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2335         /* The multiple "Capture Source" controls confuse alsamixer
2336          * So call somewhat different..
2337          */
2338         /* .name = "Capture Source", */
2339         .name = "Input Source",
2340         .info = via_mux_enum_info,
2341         .get = via_mux_enum_get,
2342         .put = via_mux_enum_put,
2343 };
2344
2345 static int create_input_src_ctls(struct hda_codec *codec, int count)
2346 {
2347         struct via_spec *spec = codec->spec;
2348         struct snd_kcontrol_new *knew;
2349
2350         if (spec->num_inputs <= 1 || !count)
2351                 return 0; /* no need for single src */
2352
2353         knew = via_clone_control(spec, &via_input_src_ctl);
2354         if (!knew)
2355                 return -ENOMEM;
2356         knew->count = count;
2357         return 0;
2358 }
2359
2360 /* add the powersave loopback-list entry */
2361 static void add_loopback_list(struct via_spec *spec, hda_nid_t mix, int idx)
2362 {
2363         struct hda_amp_list *list;
2364
2365         if (spec->num_loopbacks >= ARRAY_SIZE(spec->loopback_list) - 1)
2366                 return;
2367         list = spec->loopback_list + spec->num_loopbacks;
2368         list->nid = mix;
2369         list->dir = HDA_INPUT;
2370         list->idx = idx;
2371         spec->num_loopbacks++;
2372         spec->loopback.amplist = spec->loopback_list;
2373 }
2374
2375 static bool is_reachable_nid(struct hda_codec *codec, hda_nid_t src,
2376                              hda_nid_t dst)
2377 {
2378         return snd_hda_get_conn_index(codec, src, dst, 1) >= 0;
2379 }
2380
2381 /* add the input-route to the given pin */
2382 static bool add_input_route(struct hda_codec *codec, hda_nid_t pin)
2383 {
2384         struct via_spec *spec = codec->spec;
2385         int c, idx;
2386
2387         spec->inputs[spec->num_inputs].adc_idx = -1;
2388         spec->inputs[spec->num_inputs].pin = pin;
2389         for (c = 0; c < spec->num_adc_nids; c++) {
2390                 if (spec->mux_nids[c]) {
2391                         idx = get_connection_index(codec, spec->mux_nids[c],
2392                                                    pin);
2393                         if (idx < 0)
2394                                 continue;
2395                         spec->inputs[spec->num_inputs].mux_idx = idx;
2396                 } else {
2397                         if (!is_reachable_nid(codec, spec->adc_nids[c], pin))
2398                                 continue;
2399                 }
2400                 spec->inputs[spec->num_inputs].adc_idx = c;
2401                 /* Can primary ADC satisfy all inputs? */
2402                 if (!spec->dyn_adc_switch &&
2403                     spec->num_inputs > 0 && spec->inputs[0].adc_idx != c) {
2404                         snd_printd(KERN_INFO
2405                                    "via: dynamic ADC switching enabled\n");
2406                         spec->dyn_adc_switch = 1;
2407                 }
2408                 return true;
2409         }
2410         return false;
2411 }
2412
2413 static int get_mux_nids(struct hda_codec *codec);
2414
2415 /* parse input-routes; fill ADCs, MUXs and input-src entries */
2416 static int parse_analog_inputs(struct hda_codec *codec)
2417 {
2418         struct via_spec *spec = codec->spec;
2419         const struct auto_pin_cfg *cfg = &spec->autocfg;
2420         int i, err;
2421
2422         err = via_fill_adcs(codec);
2423         if (err < 0)
2424                 return err;
2425         err = get_mux_nids(codec);
2426         if (err < 0)
2427                 return err;
2428
2429         /* fill all input-routes */
2430         for (i = 0; i < cfg->num_inputs; i++) {
2431                 if (add_input_route(codec, cfg->inputs[i].pin))
2432                         spec->inputs[spec->num_inputs++].label =
2433                                 hda_get_autocfg_input_label(codec, cfg, i);
2434         }
2435
2436         /* check for internal loopback recording */
2437         if (spec->aa_mix_nid &&
2438             add_input_route(codec, spec->aa_mix_nid))
2439                 spec->inputs[spec->num_inputs++].label = "Stereo Mixer";
2440
2441         return 0;
2442 }
2443
2444 /* create analog-loopback volume/switch controls */
2445 static int create_loopback_ctls(struct hda_codec *codec)
2446 {
2447         struct via_spec *spec = codec->spec;
2448         const struct auto_pin_cfg *cfg = &spec->autocfg;
2449         const char *prev_label = NULL;
2450         int type_idx = 0;
2451         int i, j, err, idx;
2452
2453         if (!spec->aa_mix_nid)
2454                 return 0;
2455
2456         for (i = 0; i < cfg->num_inputs; i++) {
2457                 hda_nid_t pin = cfg->inputs[i].pin;
2458                 const char *label = hda_get_autocfg_input_label(codec, cfg, i);
2459
2460                 if (prev_label && !strcmp(label, prev_label))
2461                         type_idx++;
2462                 else
2463                         type_idx = 0;
2464                 prev_label = label;
2465                 idx = get_connection_index(codec, spec->aa_mix_nid, pin);
2466                 if (idx >= 0) {
2467                         err = via_new_analog_input(spec, label, type_idx,
2468                                                    idx, spec->aa_mix_nid);
2469                         if (err < 0)
2470                                 return err;
2471                         add_loopback_list(spec, spec->aa_mix_nid, idx);
2472                 }
2473
2474                 /* remember the label for smart51 control */
2475                 for (j = 0; j < spec->smart51_nums; j++) {
2476                         if (spec->smart51_pins[j] == pin) {
2477                                 spec->smart51_idxs[j] = idx;
2478                                 spec->smart51_labels[j] = label;
2479                                 break;
2480                         }
2481                 }
2482         }
2483         return 0;
2484 }
2485
2486 /* create mic-boost controls (if present) */
2487 static int create_mic_boost_ctls(struct hda_codec *codec)
2488 {
2489         struct via_spec *spec = codec->spec;
2490         const struct auto_pin_cfg *cfg = &spec->autocfg;
2491         int i, err;
2492
2493         for (i = 0; i < cfg->num_inputs; i++) {
2494                 hda_nid_t pin = cfg->inputs[i].pin;
2495                 unsigned int caps;
2496                 const char *label;
2497                 char name[32];
2498
2499                 if (cfg->inputs[i].type != AUTO_PIN_MIC)
2500                         continue;
2501                 caps = query_amp_caps(codec, pin, HDA_INPUT);
2502                 if (caps == -1 || !(caps & AC_AMPCAP_NUM_STEPS))
2503                         continue;
2504                 label = hda_get_autocfg_input_label(codec, cfg, i);
2505                 snprintf(name, sizeof(name), "%s Boost Volume", label);
2506                 err = via_add_control(spec, VIA_CTL_WIDGET_VOL, name,
2507                               HDA_COMPOSE_AMP_VAL(pin, 3, 0, HDA_INPUT));
2508                 if (err < 0)
2509                         return err;
2510         }
2511         return 0;
2512 }
2513
2514 /* create capture and input-src controls for multiple streams */
2515 static int create_multi_adc_ctls(struct hda_codec *codec)
2516 {
2517         struct via_spec *spec = codec->spec;
2518         int i, err;
2519
2520         /* create capture mixer elements */
2521         for (i = 0; i < spec->num_adc_nids; i++) {
2522                 hda_nid_t adc = spec->adc_nids[i];
2523                 err = __via_add_control(spec, VIA_CTL_WIDGET_VOL,
2524                                         "Capture Volume", i,
2525                                         HDA_COMPOSE_AMP_VAL(adc, 3, 0,
2526                                                             HDA_INPUT));
2527                 if (err < 0)
2528                         return err;
2529                 err = __via_add_control(spec, VIA_CTL_WIDGET_MUTE,
2530                                         "Capture Switch", i,
2531                                         HDA_COMPOSE_AMP_VAL(adc, 3, 0,
2532                                                             HDA_INPUT));
2533                 if (err < 0)
2534                         return err;
2535         }
2536
2537         /* input-source control */
2538         for (i = 0; i < spec->num_adc_nids; i++)
2539                 if (!spec->mux_nids[i])
2540                         break;
2541         err = create_input_src_ctls(codec, i);
2542         if (err < 0)
2543                 return err;
2544         return 0;
2545 }
2546
2547 /* bind capture volume/switch */
2548 static struct snd_kcontrol_new via_bind_cap_vol_ctl =
2549         HDA_BIND_VOL("Capture Volume", 0);
2550 static struct snd_kcontrol_new via_bind_cap_sw_ctl =
2551         HDA_BIND_SW("Capture Switch", 0);
2552
2553 static int init_bind_ctl(struct via_spec *spec, struct hda_bind_ctls **ctl_ret,
2554                          struct hda_ctl_ops *ops)
2555 {
2556         struct hda_bind_ctls *ctl;
2557         int i;
2558
2559         ctl = kzalloc(sizeof(*ctl) + sizeof(long) * 4, GFP_KERNEL);
2560         if (!ctl)
2561                 return -ENOMEM;
2562         ctl->ops = ops;
2563         for (i = 0; i < spec->num_adc_nids; i++)
2564                 ctl->values[i] =
2565                         HDA_COMPOSE_AMP_VAL(spec->adc_nids[i], 3, 0, HDA_INPUT);
2566         *ctl_ret = ctl;
2567         return 0;
2568 }
2569
2570 /* create capture and input-src controls for dynamic ADC-switch case */
2571 static int create_dyn_adc_ctls(struct hda_codec *codec)
2572 {
2573         struct via_spec *spec = codec->spec;
2574         struct snd_kcontrol_new *knew;
2575         int err;
2576
2577         /* set up the bind capture ctls */
2578         err = init_bind_ctl(spec, &spec->bind_cap_vol, &snd_hda_bind_vol);
2579         if (err < 0)
2580                 return err;
2581         err = init_bind_ctl(spec, &spec->bind_cap_sw, &snd_hda_bind_sw);
2582         if (err < 0)
2583                 return err;
2584
2585         /* create capture mixer elements */
2586         knew = via_clone_control(spec, &via_bind_cap_vol_ctl);
2587         if (!knew)
2588                 return -ENOMEM;
2589         knew->private_value = (long)spec->bind_cap_vol;
2590
2591         knew = via_clone_control(spec, &via_bind_cap_sw_ctl);
2592         if (!knew)
2593                 return -ENOMEM;
2594         knew->private_value = (long)spec->bind_cap_sw;
2595
2596         /* input-source control */
2597         err = create_input_src_ctls(codec, 1);
2598         if (err < 0)
2599                 return err;
2600         return 0;
2601 }
2602
2603 /* parse and create capture-related stuff */
2604 static int via_auto_create_analog_input_ctls(struct hda_codec *codec)
2605 {
2606         struct via_spec *spec = codec->spec;
2607         int err;
2608
2609         err = parse_analog_inputs(codec);
2610         if (err < 0)
2611                 return err;
2612         if (spec->dyn_adc_switch)
2613                 err = create_dyn_adc_ctls(codec);
2614         else
2615                 err = create_multi_adc_ctls(codec);
2616         if (err < 0)
2617                 return err;
2618         err = create_loopback_ctls(codec);
2619         if (err < 0)
2620                 return err;
2621         err = create_mic_boost_ctls(codec);
2622         if (err < 0)
2623                 return err;
2624         return 0;
2625 }
2626
2627 static void vt1708_set_pinconfig_connect(struct hda_codec *codec, hda_nid_t nid)
2628 {
2629         unsigned int def_conf;
2630         unsigned char seqassoc;
2631
2632         def_conf = snd_hda_codec_get_pincfg(codec, nid);
2633         seqassoc = (unsigned char) get_defcfg_association(def_conf);
2634         seqassoc = (seqassoc << 4) | get_defcfg_sequence(def_conf);
2635         if (get_defcfg_connect(def_conf) == AC_JACK_PORT_NONE
2636             && (seqassoc == 0xf0 || seqassoc == 0xff)) {
2637                 def_conf = def_conf & (~(AC_JACK_PORT_BOTH << 30));
2638                 snd_hda_codec_set_pincfg(codec, nid, def_conf);
2639         }
2640
2641         return;
2642 }
2643
2644 static int vt1708_jack_detect_get(struct snd_kcontrol *kcontrol,
2645                                      struct snd_ctl_elem_value *ucontrol)
2646 {
2647         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2648         struct via_spec *spec = codec->spec;
2649
2650         if (spec->codec_type != VT1708)
2651                 return 0;
2652         ucontrol->value.integer.value[0] = spec->vt1708_jack_detect;
2653         return 0;
2654 }
2655
2656 static int vt1708_jack_detect_put(struct snd_kcontrol *kcontrol,
2657                                      struct snd_ctl_elem_value *ucontrol)
2658 {
2659         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2660         struct via_spec *spec = codec->spec;
2661         int val;
2662
2663         if (spec->codec_type != VT1708)
2664                 return 0;
2665         val = !!ucontrol->value.integer.value[0];
2666         if (spec->vt1708_jack_detect == val)
2667                 return 0;
2668         spec->vt1708_jack_detect = val;
2669         if (spec->vt1708_jack_detect &&
2670             snd_hda_get_bool_hint(codec, "analog_loopback_hp_detect") != 1) {
2671                 mute_aa_path(codec, 1);
2672                 notify_aa_path_ctls(codec);
2673         }
2674         via_hp_automute(codec);
2675         vt1708_update_hp_work(spec);
2676         return 1;
2677 }
2678
2679 static const struct snd_kcontrol_new vt1708_jack_detect_ctl = {
2680         .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2681         .name = "Jack Detect",
2682         .count = 1,
2683         .info = snd_ctl_boolean_mono_info,
2684         .get = vt1708_jack_detect_get,
2685         .put = vt1708_jack_detect_put,
2686 };
2687
2688 static void fill_dig_outs(struct hda_codec *codec);
2689 static void fill_dig_in(struct hda_codec *codec);
2690
2691 static int via_parse_auto_config(struct hda_codec *codec)
2692 {
2693         struct via_spec *spec = codec->spec;
2694         int err;
2695
2696         err = snd_hda_parse_pin_def_config(codec, &spec->autocfg, NULL);
2697         if (err < 0)
2698                 return err;
2699         if (!spec->autocfg.line_outs && !spec->autocfg.hp_pins[0])
2700                 return -EINVAL;
2701
2702         err = via_auto_create_multi_out_ctls(codec);
2703         if (err < 0)
2704                 return err;
2705         err = via_auto_create_hp_ctls(codec, spec->autocfg.hp_pins[0]);
2706         if (err < 0)
2707                 return err;
2708         err = via_auto_create_speaker_ctls(codec);
2709         if (err < 0)
2710                 return err;
2711         err = via_auto_create_loopback_switch(codec);
2712         if (err < 0)
2713                 return err;
2714         err = via_auto_create_analog_input_ctls(codec);
2715         if (err < 0)
2716                 return err;
2717
2718         spec->multiout.max_channels = spec->multiout.num_dacs * 2;
2719
2720         fill_dig_outs(codec);
2721         fill_dig_in(codec);
2722
2723         if (spec->kctls.list)
2724                 spec->mixers[spec->num_mixers++] = spec->kctls.list;
2725
2726
2727         if (spec->hp_dac_nid && spec->hp_mix_path.depth) {
2728                 err = via_hp_build(codec);
2729                 if (err < 0)
2730                         return err;
2731         }
2732
2733         err = via_smart51_build(codec);
2734         if (err < 0)
2735                 return err;
2736
2737         /* assign slave outs */
2738         if (spec->slave_dig_outs[0])
2739                 codec->slave_dig_outs = spec->slave_dig_outs;
2740
2741         return 1;
2742 }
2743
2744 static void via_auto_init_dig_outs(struct hda_codec *codec)
2745 {
2746         struct via_spec *spec = codec->spec;
2747         if (spec->multiout.dig_out_nid)
2748                 init_output_pin(codec, spec->autocfg.dig_out_pins[0], PIN_OUT);
2749         if (spec->slave_dig_outs[0])
2750                 init_output_pin(codec, spec->autocfg.dig_out_pins[1], PIN_OUT);
2751 }
2752
2753 static void via_auto_init_dig_in(struct hda_codec *codec)
2754 {
2755         struct via_spec *spec = codec->spec;
2756         if (!spec->dig_in_nid)
2757                 return;
2758         snd_hda_codec_write(codec, spec->autocfg.dig_in_pin, 0,
2759                             AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN);
2760 }
2761
2762 /* initialize the unsolicited events */
2763 static void via_auto_init_unsol_event(struct hda_codec *codec)
2764 {
2765         struct via_spec *spec = codec->spec;
2766         struct auto_pin_cfg *cfg = &spec->autocfg;
2767         unsigned int ev;
2768         int i;
2769
2770         if (cfg->hp_pins[0] && is_jack_detectable(codec, cfg->hp_pins[0]))
2771                 snd_hda_jack_detect_enable(codec, cfg->hp_pins[0],
2772                                            VIA_HP_EVENT | VIA_JACK_EVENT);
2773
2774         if (cfg->speaker_pins[0])
2775                 ev = VIA_LINE_EVENT;
2776         else
2777                 ev = 0;
2778         for (i = 0; i < cfg->line_outs; i++) {
2779                 if (cfg->line_out_pins[i] &&
2780                     is_jack_detectable(codec, cfg->line_out_pins[i]))
2781                         snd_hda_jack_detect_enable(codec, cfg->line_out_pins[i],
2782                                                    ev | VIA_JACK_EVENT);
2783         }
2784
2785         for (i = 0; i < cfg->num_inputs; i++) {
2786                 if (is_jack_detectable(codec, cfg->inputs[i].pin))
2787                         snd_hda_jack_detect_enable(codec, cfg->inputs[i].pin,
2788                                                    VIA_JACK_EVENT);
2789         }
2790 }
2791
2792 static int via_init(struct hda_codec *codec)
2793 {
2794         struct via_spec *spec = codec->spec;
2795         int i;
2796
2797         for (i = 0; i < spec->num_iverbs; i++)
2798                 snd_hda_sequence_write(codec, spec->init_verbs[i]);
2799
2800         /* init power states */
2801         set_widgets_power_state(codec);
2802         __analog_low_current_mode(codec, true);
2803
2804         via_auto_init_multi_out(codec);
2805         via_auto_init_hp_out(codec);
2806         via_auto_init_speaker_out(codec);
2807         via_auto_init_analog_input(codec);
2808         via_auto_init_dig_outs(codec);
2809         via_auto_init_dig_in(codec);
2810
2811         via_auto_init_unsol_event(codec);
2812
2813         via_hp_automute(codec);
2814         vt1708_update_hp_work(spec);
2815         snd_hda_jack_report_sync(codec);
2816
2817         return 0;
2818 }
2819
2820 static void vt1708_update_hp_jack_state(struct work_struct *work)
2821 {
2822         struct via_spec *spec = container_of(work, struct via_spec,
2823                                              vt1708_hp_work.work);
2824         if (spec->codec_type != VT1708)
2825                 return;
2826         snd_hda_jack_set_dirty_all(spec->codec);
2827         /* if jack state toggled */
2828         if (spec->vt1708_hp_present
2829             != snd_hda_jack_detect(spec->codec, spec->autocfg.hp_pins[0])) {
2830                 spec->vt1708_hp_present ^= 1;
2831                 via_hp_automute(spec->codec);
2832         }
2833         if (spec->vt1708_jack_detect)
2834                 schedule_delayed_work(&spec->vt1708_hp_work,
2835                                       msecs_to_jiffies(100));
2836 }
2837
2838 static int get_mux_nids(struct hda_codec *codec)
2839 {
2840         struct via_spec *spec = codec->spec;
2841         hda_nid_t nid, conn[8];
2842         unsigned int type;
2843         int i, n;
2844
2845         for (i = 0; i < spec->num_adc_nids; i++) {
2846                 nid = spec->adc_nids[i];
2847                 while (nid) {
2848                         type = get_wcaps_type(get_wcaps(codec, nid));
2849                         if (type == AC_WID_PIN)
2850                                 break;
2851                         n = snd_hda_get_connections(codec, nid, conn,
2852                                                     ARRAY_SIZE(conn));
2853                         if (n <= 0)
2854                                 break;
2855                         if (n > 1) {
2856                                 spec->mux_nids[i] = nid;
2857                                 break;
2858                         }
2859                         nid = conn[0];
2860                 }
2861         }
2862         return 0;
2863 }
2864
2865 static int patch_vt1708(struct hda_codec *codec)
2866 {
2867         struct via_spec *spec;
2868         int err;
2869
2870         /* create a codec specific record */
2871         spec = via_new_spec(codec);
2872         if (spec == NULL)
2873                 return -ENOMEM;
2874
2875         spec->aa_mix_nid = 0x17;
2876
2877         /* Add HP and CD pin config connect bit re-config action */
2878         vt1708_set_pinconfig_connect(codec, VT1708_HP_PIN_NID);
2879         vt1708_set_pinconfig_connect(codec, VT1708_CD_PIN_NID);
2880
2881         /* automatic parse from the BIOS config */
2882         err = via_parse_auto_config(codec);
2883         if (err < 0) {
2884                 via_free(codec);
2885                 return err;
2886         }
2887
2888         /* add jack detect on/off control */
2889         if (!via_clone_control(spec, &vt1708_jack_detect_ctl))
2890                 return -ENOMEM;
2891
2892         /* disable 32bit format on VT1708 */
2893         if (codec->vendor_id == 0x11061708)
2894                 spec->stream_analog_playback = &vt1708_pcm_analog_s16_playback;
2895
2896         spec->init_verbs[spec->num_iverbs++] = vt1708_init_verbs;
2897
2898         codec->patch_ops = via_patch_ops;
2899
2900         INIT_DELAYED_WORK(&spec->vt1708_hp_work, vt1708_update_hp_jack_state);
2901         return 0;
2902 }
2903
2904 static int patch_vt1709(struct hda_codec *codec)
2905 {
2906         struct via_spec *spec;
2907         int err;
2908
2909         /* create a codec specific record */
2910         spec = via_new_spec(codec);
2911         if (spec == NULL)
2912                 return -ENOMEM;
2913
2914         spec->aa_mix_nid = 0x18;
2915
2916         err = via_parse_auto_config(codec);
2917         if (err < 0) {
2918                 via_free(codec);
2919                 return err;
2920         }
2921
2922         codec->patch_ops = via_patch_ops;
2923
2924         return 0;
2925 }
2926
2927 static void set_widgets_power_state_vt1708B(struct hda_codec *codec)
2928 {
2929         struct via_spec *spec = codec->spec;
2930         int imux_is_smixer;
2931         unsigned int parm;
2932         int is_8ch = 0;
2933         if ((spec->codec_type != VT1708B_4CH) &&
2934             (codec->vendor_id != 0x11064397))
2935                 is_8ch = 1;
2936
2937         /* SW0 (17h) = stereo mixer */
2938         imux_is_smixer =
2939         (snd_hda_codec_read(codec, 0x17, 0, AC_VERB_GET_CONNECT_SEL, 0x00)
2940          == ((spec->codec_type == VT1708S) ? 5 : 0));
2941         /* inputs */
2942         /* PW 1/2/5 (1ah/1bh/1eh) */
2943         parm = AC_PWRST_D3;
2944         set_pin_power_state(codec, 0x1a, &parm);
2945         set_pin_power_state(codec, 0x1b, &parm);
2946         set_pin_power_state(codec, 0x1e, &parm);
2947         if (imux_is_smixer)
2948                 parm = AC_PWRST_D0;
2949         /* SW0 (17h), AIW 0/1 (13h/14h) */
2950         update_power_state(codec, 0x17, parm);
2951         update_power_state(codec, 0x13, parm);
2952         update_power_state(codec, 0x14, parm);
2953
2954         /* outputs */
2955         /* PW0 (19h), SW1 (18h), AOW1 (11h) */
2956         parm = AC_PWRST_D3;
2957         set_pin_power_state(codec, 0x19, &parm);
2958         if (spec->smart51_enabled)
2959                 set_pin_power_state(codec, 0x1b, &parm);
2960         update_power_state(codec, 0x18, parm);
2961         update_power_state(codec, 0x11, parm);
2962
2963         /* PW6 (22h), SW2 (26h), AOW2 (24h) */
2964         if (is_8ch) {
2965                 parm = AC_PWRST_D3;
2966                 set_pin_power_state(codec, 0x22, &parm);
2967                 if (spec->smart51_enabled)
2968                         set_pin_power_state(codec, 0x1a, &parm);
2969                 update_power_state(codec, 0x26, parm);
2970                 update_power_state(codec, 0x24, parm);
2971         } else if (codec->vendor_id == 0x11064397) {
2972                 /* PW7(23h), SW2(27h), AOW2(25h) */
2973                 parm = AC_PWRST_D3;
2974                 set_pin_power_state(codec, 0x23, &parm);
2975                 if (spec->smart51_enabled)
2976                         set_pin_power_state(codec, 0x1a, &parm);
2977                 update_power_state(codec, 0x27, parm);
2978                 update_power_state(codec, 0x25, parm);
2979         }
2980
2981         /* PW 3/4/7 (1ch/1dh/23h) */
2982         parm = AC_PWRST_D3;
2983         /* force to D0 for internal Speaker */
2984         set_pin_power_state(codec, 0x1c, &parm);
2985         set_pin_power_state(codec, 0x1d, &parm);
2986         if (is_8ch)
2987                 set_pin_power_state(codec, 0x23, &parm);
2988
2989         /* MW0 (16h), Sw3 (27h), AOW 0/3 (10h/25h) */
2990         update_power_state(codec, 0x16, imux_is_smixer ? AC_PWRST_D0 : parm);
2991         update_power_state(codec, 0x10, parm);
2992         if (is_8ch) {
2993                 update_power_state(codec, 0x25, parm);
2994                 update_power_state(codec, 0x27, parm);
2995         } else if (codec->vendor_id == 0x11064397 && spec->hp_independent_mode)
2996                 update_power_state(codec, 0x25, parm);
2997 }
2998
2999 static int patch_vt1708S(struct hda_codec *codec);
3000 static int patch_vt1708B(struct hda_codec *codec)
3001 {
3002         struct via_spec *spec;
3003         int err;
3004
3005         if (get_codec_type(codec) == VT1708BCE)
3006                 return patch_vt1708S(codec);
3007
3008         /* create a codec specific record */
3009         spec = via_new_spec(codec);
3010         if (spec == NULL)
3011                 return -ENOMEM;
3012
3013         spec->aa_mix_nid = 0x16;
3014
3015         /* automatic parse from the BIOS config */
3016         err = via_parse_auto_config(codec);
3017         if (err < 0) {
3018                 via_free(codec);
3019                 return err;
3020         }
3021
3022         codec->patch_ops = via_patch_ops;
3023
3024         spec->set_widgets_power_state =  set_widgets_power_state_vt1708B;
3025
3026         return 0;
3027 }
3028
3029 /* Patch for VT1708S */
3030 static const struct hda_verb vt1708S_init_verbs[] = {
3031         /* Enable Mic Boost Volume backdoor */
3032         {0x1, 0xf98, 0x1},
3033         /* don't bybass mixer */
3034         {0x1, 0xf88, 0xc0},
3035         { }
3036 };
3037
3038 /* fill out digital output widgets; one for master and one for slave outputs */
3039 static void fill_dig_outs(struct hda_codec *codec)
3040 {
3041         struct via_spec *spec = codec->spec;
3042         int i;
3043
3044         for (i = 0; i < spec->autocfg.dig_outs; i++) {
3045                 hda_nid_t nid;
3046                 int conn;
3047
3048                 nid = spec->autocfg.dig_out_pins[i];
3049                 if (!nid)
3050                         continue;
3051                 conn = snd_hda_get_connections(codec, nid, &nid, 1);
3052                 if (conn < 1)
3053                         continue;
3054                 if (!spec->multiout.dig_out_nid)
3055                         spec->multiout.dig_out_nid = nid;
3056                 else {
3057                         spec->slave_dig_outs[0] = nid;
3058                         break; /* at most two dig outs */
3059                 }
3060         }
3061 }
3062
3063 static void fill_dig_in(struct hda_codec *codec)
3064 {
3065         struct via_spec *spec = codec->spec;
3066         hda_nid_t dig_nid;
3067         int i, err;
3068
3069         if (!spec->autocfg.dig_in_pin)
3070                 return;
3071
3072         dig_nid = codec->start_nid;
3073         for (i = 0; i < codec->num_nodes; i++, dig_nid++) {
3074                 unsigned int wcaps = get_wcaps(codec, dig_nid);
3075                 if (get_wcaps_type(wcaps) != AC_WID_AUD_IN)
3076                         continue;
3077                 if (!(wcaps & AC_WCAP_DIGITAL))
3078                         continue;
3079                 if (!(wcaps & AC_WCAP_CONN_LIST))
3080                         continue;
3081                 err = get_connection_index(codec, dig_nid,
3082                                            spec->autocfg.dig_in_pin);
3083                 if (err >= 0) {
3084                         spec->dig_in_nid = dig_nid;
3085                         break;
3086                 }
3087         }
3088 }
3089
3090 static void override_mic_boost(struct hda_codec *codec, hda_nid_t pin,
3091                                int offset, int num_steps, int step_size)
3092 {
3093         snd_hda_override_amp_caps(codec, pin, HDA_INPUT,
3094                                   (offset << AC_AMPCAP_OFFSET_SHIFT) |
3095                                   (num_steps << AC_AMPCAP_NUM_STEPS_SHIFT) |
3096                                   (step_size << AC_AMPCAP_STEP_SIZE_SHIFT) |
3097                                   (0 << AC_AMPCAP_MUTE_SHIFT));
3098 }
3099
3100 static int patch_vt1708S(struct hda_codec *codec)
3101 {
3102         struct via_spec *spec;
3103         int err;
3104
3105         /* create a codec specific record */
3106         spec = via_new_spec(codec);
3107         if (spec == NULL)
3108                 return -ENOMEM;
3109
3110         spec->aa_mix_nid = 0x16;
3111         override_mic_boost(codec, 0x1a, 0, 3, 40);
3112         override_mic_boost(codec, 0x1e, 0, 3, 40);
3113
3114         /* automatic parse from the BIOS config */
3115         err = via_parse_auto_config(codec);
3116         if (err < 0) {
3117                 via_free(codec);
3118                 return err;
3119         }
3120
3121         spec->init_verbs[spec->num_iverbs++] = vt1708S_init_verbs;
3122
3123         codec->patch_ops = via_patch_ops;
3124
3125         /* correct names for VT1708BCE */
3126         if (get_codec_type(codec) == VT1708BCE) {
3127                 kfree(codec->chip_name);
3128                 codec->chip_name = kstrdup("VT1708BCE", GFP_KERNEL);
3129                 snprintf(codec->bus->card->mixername,
3130                          sizeof(codec->bus->card->mixername),
3131                          "%s %s", codec->vendor_name, codec->chip_name);
3132         }
3133         /* correct names for VT1705 */
3134         if (codec->vendor_id == 0x11064397)     {
3135                 kfree(codec->chip_name);
3136                 codec->chip_name = kstrdup("VT1705", GFP_KERNEL);
3137                 snprintf(codec->bus->card->mixername,
3138                          sizeof(codec->bus->card->mixername),
3139                          "%s %s", codec->vendor_name, codec->chip_name);
3140         }
3141         spec->set_widgets_power_state =  set_widgets_power_state_vt1708B;
3142         return 0;
3143 }
3144
3145 /* Patch for VT1702 */
3146
3147 static const struct hda_verb vt1702_init_verbs[] = {
3148         /* mixer enable */
3149         {0x1, 0xF88, 0x3},
3150         /* GPIO 0~2 */
3151         {0x1, 0xF82, 0x3F},
3152         { }
3153 };
3154
3155 static void set_widgets_power_state_vt1702(struct hda_codec *codec)
3156 {
3157         int imux_is_smixer =
3158         snd_hda_codec_read(codec, 0x13, 0, AC_VERB_GET_CONNECT_SEL, 0x00) == 3;
3159         unsigned int parm;
3160         /* inputs */
3161         /* PW 1/2/5 (14h/15h/18h) */
3162         parm = AC_PWRST_D3;
3163         set_pin_power_state(codec, 0x14, &parm);
3164         set_pin_power_state(codec, 0x15, &parm);
3165         set_pin_power_state(codec, 0x18, &parm);
3166         if (imux_is_smixer)
3167                 parm = AC_PWRST_D0; /* SW0 (13h) = stereo mixer (idx 3) */
3168         /* SW0 (13h), AIW 0/1/2 (12h/1fh/20h) */
3169         update_power_state(codec, 0x13, parm);
3170         update_power_state(codec, 0x12, parm);
3171         update_power_state(codec, 0x1f, parm);
3172         update_power_state(codec, 0x20, parm);
3173
3174         /* outputs */
3175         /* PW 3/4 (16h/17h) */
3176         parm = AC_PWRST_D3;
3177         set_pin_power_state(codec, 0x17, &parm);
3178         set_pin_power_state(codec, 0x16, &parm);
3179         /* MW0 (1ah), AOW 0/1 (10h/1dh) */
3180         update_power_state(codec, 0x1a, imux_is_smixer ? AC_PWRST_D0 : parm);
3181         update_power_state(codec, 0x10, parm);
3182         update_power_state(codec, 0x1d, parm);
3183 }
3184
3185 static int patch_vt1702(struct hda_codec *codec)
3186 {
3187         struct via_spec *spec;
3188         int err;
3189
3190         /* create a codec specific record */
3191         spec = via_new_spec(codec);
3192         if (spec == NULL)
3193                 return -ENOMEM;
3194
3195         spec->aa_mix_nid = 0x1a;
3196
3197         /* limit AA path volume to 0 dB */
3198         snd_hda_override_amp_caps(codec, 0x1A, HDA_INPUT,
3199                                   (0x17 << AC_AMPCAP_OFFSET_SHIFT) |
3200                                   (0x17 << AC_AMPCAP_NUM_STEPS_SHIFT) |
3201                                   (0x5 << AC_AMPCAP_STEP_SIZE_SHIFT) |
3202                                   (1 << AC_AMPCAP_MUTE_SHIFT));
3203
3204         /* automatic parse from the BIOS config */
3205         err = via_parse_auto_config(codec);
3206         if (err < 0) {
3207                 via_free(codec);
3208                 return err;
3209         }
3210
3211         spec->init_verbs[spec->num_iverbs++] = vt1702_init_verbs;
3212
3213         codec->patch_ops = via_patch_ops;
3214
3215         spec->set_widgets_power_state =  set_widgets_power_state_vt1702;
3216         return 0;
3217 }
3218
3219 /* Patch for VT1718S */
3220
3221 static const struct hda_verb vt1718S_init_verbs[] = {
3222         /* Enable MW0 adjust Gain 5 */
3223         {0x1, 0xfb2, 0x10},
3224         /* Enable Boost Volume backdoor */
3225         {0x1, 0xf88, 0x8},
3226
3227         { }
3228 };
3229
3230 static void set_widgets_power_state_vt1718S(struct hda_codec *codec)
3231 {
3232         struct via_spec *spec = codec->spec;
3233         int imux_is_smixer;
3234         unsigned int parm;
3235         /* MUX6 (1eh) = stereo mixer */
3236         imux_is_smixer =
3237         snd_hda_codec_read(codec, 0x1e, 0, AC_VERB_GET_CONNECT_SEL, 0x00) == 5;
3238         /* inputs */
3239         /* PW 5/6/7 (29h/2ah/2bh) */
3240         parm = AC_PWRST_D3;
3241         set_pin_power_state(codec, 0x29, &parm);
3242         set_pin_power_state(codec, 0x2a, &parm);
3243         set_pin_power_state(codec, 0x2b, &parm);
3244         if (imux_is_smixer)
3245                 parm = AC_PWRST_D0;
3246         /* MUX6/7 (1eh/1fh), AIW 0/1 (10h/11h) */
3247         update_power_state(codec, 0x1e, parm);
3248         update_power_state(codec, 0x1f, parm);
3249         update_power_state(codec, 0x10, parm);
3250         update_power_state(codec, 0x11, parm);
3251
3252         /* outputs */
3253         /* PW3 (27h), MW2 (1ah), AOW3 (bh) */
3254         parm = AC_PWRST_D3;
3255         set_pin_power_state(codec, 0x27, &parm);
3256         update_power_state(codec, 0x1a, parm);
3257         update_power_state(codec, 0xb, parm);
3258
3259         /* PW2 (26h), AOW2 (ah) */
3260         parm = AC_PWRST_D3;
3261         set_pin_power_state(codec, 0x26, &parm);
3262         if (spec->smart51_enabled)
3263                 set_pin_power_state(codec, 0x2b, &parm);
3264         update_power_state(codec, 0xa, parm);
3265
3266         /* PW0 (24h), AOW0 (8h) */
3267         parm = AC_PWRST_D3;
3268         set_pin_power_state(codec, 0x24, &parm);
3269         if (!spec->hp_independent_mode) /* check for redirected HP */
3270                 set_pin_power_state(codec, 0x28, &parm);
3271         update_power_state(codec, 0x8, parm);
3272         /* MW9 (21h), Mw2 (1ah), AOW0 (8h) */
3273         update_power_state(codec, 0x21, imux_is_smixer ? AC_PWRST_D0 : parm);
3274
3275         /* PW1 (25h), AOW1 (9h) */
3276         parm = AC_PWRST_D3;
3277         set_pin_power_state(codec, 0x25, &parm);
3278         if (spec->smart51_enabled)
3279                 set_pin_power_state(codec, 0x2a, &parm);
3280         update_power_state(codec, 0x9, parm);
3281
3282         if (spec->hp_independent_mode) {
3283                 /* PW4 (28h), MW3 (1bh), MUX1(34h), AOW4 (ch) */
3284                 parm = AC_PWRST_D3;
3285                 set_pin_power_state(codec, 0x28, &parm);
3286                 update_power_state(codec, 0x1b, parm);
3287                 update_power_state(codec, 0x34, parm);
3288                 update_power_state(codec, 0xc, parm);
3289         }
3290 }
3291
3292 /* Add a connection to the primary DAC from AA-mixer for some codecs
3293  * This isn't listed from the raw info, but the chip has a secret connection.
3294  */
3295 static int add_secret_dac_path(struct hda_codec *codec)
3296 {
3297         struct via_spec *spec = codec->spec;
3298         int i, nums;
3299         hda_nid_t conn[8];
3300         hda_nid_t nid;
3301
3302         if (!spec->aa_mix_nid)
3303                 return 0;
3304         nums = snd_hda_get_connections(codec, spec->aa_mix_nid, conn,
3305                                        ARRAY_SIZE(conn) - 1);
3306         for (i = 0; i < nums; i++) {
3307                 if (get_wcaps_type(get_wcaps(codec, conn[i])) == AC_WID_AUD_OUT)
3308                         return 0;
3309         }
3310
3311         /* find the primary DAC and add to the connection list */
3312         nid = codec->start_nid;
3313         for (i = 0; i < codec->num_nodes; i++, nid++) {
3314                 unsigned int caps = get_wcaps(codec, nid);
3315                 if (get_wcaps_type(caps) == AC_WID_AUD_OUT &&
3316                     !(caps & AC_WCAP_DIGITAL)) {
3317                         conn[nums++] = nid;
3318                         return snd_hda_override_conn_list(codec,
3319                                                           spec->aa_mix_nid,
3320                                                           nums, conn);
3321                 }
3322         }
3323         return 0;
3324 }
3325
3326
3327 static int patch_vt1718S(struct hda_codec *codec)
3328 {
3329         struct via_spec *spec;
3330         int err;
3331
3332         /* create a codec specific record */
3333         spec = via_new_spec(codec);
3334         if (spec == NULL)
3335                 return -ENOMEM;
3336
3337         spec->aa_mix_nid = 0x21;
3338         override_mic_boost(codec, 0x2b, 0, 3, 40);
3339         override_mic_boost(codec, 0x29, 0, 3, 40);
3340         add_secret_dac_path(codec);
3341
3342         /* automatic parse from the BIOS config */
3343         err = via_parse_auto_config(codec);
3344         if (err < 0) {
3345                 via_free(codec);
3346                 return err;
3347         }
3348
3349         spec->init_verbs[spec->num_iverbs++] = vt1718S_init_verbs;
3350
3351         codec->patch_ops = via_patch_ops;
3352
3353         spec->set_widgets_power_state =  set_widgets_power_state_vt1718S;
3354
3355         return 0;
3356 }
3357
3358 /* Patch for VT1716S */
3359
3360 static int vt1716s_dmic_info(struct snd_kcontrol *kcontrol,
3361                             struct snd_ctl_elem_info *uinfo)
3362 {
3363         uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN;
3364         uinfo->count = 1;
3365         uinfo->value.integer.min = 0;
3366         uinfo->value.integer.max = 1;
3367         return 0;
3368 }
3369
3370 static int vt1716s_dmic_get(struct snd_kcontrol *kcontrol,
3371                            struct snd_ctl_elem_value *ucontrol)
3372 {
3373         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
3374         int index = 0;
3375
3376         index = snd_hda_codec_read(codec, 0x26, 0,
3377                                                AC_VERB_GET_CONNECT_SEL, 0);
3378         if (index != -1)
3379                 *ucontrol->value.integer.value = index;
3380
3381         return 0;
3382 }
3383
3384 static int vt1716s_dmic_put(struct snd_kcontrol *kcontrol,
3385                            struct snd_ctl_elem_value *ucontrol)
3386 {
3387         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
3388         struct via_spec *spec = codec->spec;
3389         int index = *ucontrol->value.integer.value;
3390
3391         snd_hda_codec_write(codec, 0x26, 0,
3392                                                AC_VERB_SET_CONNECT_SEL, index);
3393         spec->dmic_enabled = index;
3394         set_widgets_power_state(codec);
3395         return 1;
3396 }
3397
3398 static const struct snd_kcontrol_new vt1716s_dmic_mixer[] = {
3399         HDA_CODEC_VOLUME("Digital Mic Capture Volume", 0x22, 0x0, HDA_INPUT),
3400         {
3401          .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
3402          .name = "Digital Mic Capture Switch",
3403          .subdevice = HDA_SUBDEV_NID_FLAG | 0x26,
3404          .count = 1,
3405          .info = vt1716s_dmic_info,
3406          .get = vt1716s_dmic_get,
3407          .put = vt1716s_dmic_put,
3408          },
3409         {}                      /* end */
3410 };
3411
3412
3413 /* mono-out mixer elements */
3414 static const struct snd_kcontrol_new vt1716S_mono_out_mixer[] = {
3415         HDA_CODEC_MUTE("Mono Playback Switch", 0x2a, 0x0, HDA_OUTPUT),
3416         { } /* end */
3417 };
3418
3419 static const struct hda_verb vt1716S_init_verbs[] = {
3420         /* Enable Boost Volume backdoor */
3421         {0x1, 0xf8a, 0x80},
3422         /* don't bybass mixer */
3423         {0x1, 0xf88, 0xc0},
3424         /* Enable mono output */
3425         {0x1, 0xf90, 0x08},
3426         { }
3427 };
3428
3429 static void set_widgets_power_state_vt1716S(struct hda_codec *codec)
3430 {
3431         struct via_spec *spec = codec->spec;
3432         int imux_is_smixer;
3433         unsigned int parm;
3434         unsigned int mono_out, present;
3435         /* SW0 (17h) = stereo mixer */
3436         imux_is_smixer =
3437         (snd_hda_codec_read(codec, 0x17, 0,
3438                             AC_VERB_GET_CONNECT_SEL, 0x00) ==  5);
3439         /* inputs */
3440         /* PW 1/2/5 (1ah/1bh/1eh) */
3441         parm = AC_PWRST_D3;
3442         set_pin_power_state(codec, 0x1a, &parm);
3443         set_pin_power_state(codec, 0x1b, &parm);
3444         set_pin_power_state(codec, 0x1e, &parm);
3445         if (imux_is_smixer)
3446                 parm = AC_PWRST_D0;
3447         /* SW0 (17h), AIW0(13h) */
3448         update_power_state(codec, 0x17, parm);
3449         update_power_state(codec, 0x13, parm);
3450
3451         parm = AC_PWRST_D3;
3452         set_pin_power_state(codec, 0x1e, &parm);
3453         /* PW11 (22h) */
3454         if (spec->dmic_enabled)
3455                 set_pin_power_state(codec, 0x22, &parm);
3456         else
3457                 update_power_state(codec, 0x22, AC_PWRST_D3);
3458
3459         /* SW2(26h), AIW1(14h) */
3460         update_power_state(codec, 0x26, parm);
3461         update_power_state(codec, 0x14, parm);
3462
3463         /* outputs */
3464         /* PW0 (19h), SW1 (18h), AOW1 (11h) */
3465         parm = AC_PWRST_D3;
3466         set_pin_power_state(codec, 0x19, &parm);
3467         /* Smart 5.1 PW2(1bh) */
3468         if (spec->smart51_enabled)
3469                 set_pin_power_state(codec, 0x1b, &parm);
3470         update_power_state(codec, 0x18, parm);
3471         update_power_state(codec, 0x11, parm);
3472
3473         /* PW7 (23h), SW3 (27h), AOW3 (25h) */
3474         parm = AC_PWRST_D3;
3475         set_pin_power_state(codec, 0x23, &parm);
3476         /* Smart 5.1 PW1(1ah) */
3477         if (spec->smart51_enabled)
3478                 set_pin_power_state(codec, 0x1a, &parm);
3479         update_power_state(codec, 0x27, parm);
3480
3481         /* Smart 5.1 PW5(1eh) */
3482         if (spec->smart51_enabled)
3483                 set_pin_power_state(codec, 0x1e, &parm);
3484         update_power_state(codec, 0x25, parm);
3485
3486         /* Mono out */
3487         /* SW4(28h)->MW1(29h)-> PW12 (2ah)*/
3488         present = snd_hda_jack_detect(codec, 0x1c);
3489
3490         if (present)
3491                 mono_out = 0;
3492         else {
3493                 present = snd_hda_jack_detect(codec, 0x1d);
3494                 if (!spec->hp_independent_mode && present)
3495                         mono_out = 0;
3496                 else
3497                         mono_out = 1;
3498         }
3499         parm = mono_out ? AC_PWRST_D0 : AC_PWRST_D3;
3500         update_power_state(codec, 0x28, parm);
3501         update_power_state(codec, 0x29, parm);
3502         update_power_state(codec, 0x2a, parm);
3503
3504         /* PW 3/4 (1ch/1dh) */
3505         parm = AC_PWRST_D3;
3506         set_pin_power_state(codec, 0x1c, &parm);
3507         set_pin_power_state(codec, 0x1d, &parm);
3508         /* HP Independent Mode, power on AOW3 */
3509         if (spec->hp_independent_mode)
3510                 update_power_state(codec, 0x25, parm);
3511
3512         /* force to D0 for internal Speaker */
3513         /* MW0 (16h), AOW0 (10h) */
3514         update_power_state(codec, 0x16, imux_is_smixer ? AC_PWRST_D0 : parm);
3515         update_power_state(codec, 0x10, mono_out ? AC_PWRST_D0 : parm);
3516 }
3517
3518 static int patch_vt1716S(struct hda_codec *codec)
3519 {
3520         struct via_spec *spec;
3521         int err;
3522
3523         /* create a codec specific record */
3524         spec = via_new_spec(codec);
3525         if (spec == NULL)
3526                 return -ENOMEM;
3527
3528         spec->aa_mix_nid = 0x16;
3529         override_mic_boost(codec, 0x1a, 0, 3, 40);
3530         override_mic_boost(codec, 0x1e, 0, 3, 40);
3531
3532         /* automatic parse from the BIOS config */
3533         err = via_parse_auto_config(codec);
3534         if (err < 0) {
3535                 via_free(codec);
3536                 return err;
3537         }
3538
3539         spec->init_verbs[spec->num_iverbs++]  = vt1716S_init_verbs;
3540
3541         spec->mixers[spec->num_mixers] = vt1716s_dmic_mixer;
3542         spec->num_mixers++;
3543
3544         spec->mixers[spec->num_mixers++] = vt1716S_mono_out_mixer;
3545
3546         codec->patch_ops = via_patch_ops;
3547
3548         spec->set_widgets_power_state = set_widgets_power_state_vt1716S;
3549         return 0;
3550 }
3551
3552 /* for vt2002P */
3553
3554 static const struct hda_verb vt2002P_init_verbs[] = {
3555         /* Class-D speaker related verbs */
3556         {0x1, 0xfe0, 0x4},
3557         {0x1, 0xfe9, 0x80},
3558         {0x1, 0xfe2, 0x22},
3559         /* Enable Boost Volume backdoor */
3560         {0x1, 0xfb9, 0x24},
3561         /* Enable AOW0 to MW9 */
3562         {0x1, 0xfb8, 0x88},
3563         { }
3564 };
3565
3566 static const struct hda_verb vt1802_init_verbs[] = {
3567         /* Enable Boost Volume backdoor */
3568         {0x1, 0xfb9, 0x24},
3569         /* Enable AOW0 to MW9 */
3570         {0x1, 0xfb8, 0x88},
3571         { }
3572 };
3573
3574 static void set_widgets_power_state_vt2002P(struct hda_codec *codec)
3575 {
3576         struct via_spec *spec = codec->spec;
3577         int imux_is_smixer;
3578         unsigned int parm;
3579         unsigned int present;
3580         /* MUX9 (1eh) = stereo mixer */
3581         imux_is_smixer =
3582         snd_hda_codec_read(codec, 0x1e, 0, AC_VERB_GET_CONNECT_SEL, 0x00) == 3;
3583         /* inputs */
3584         /* PW 5/6/7 (29h/2ah/2bh) */
3585         parm = AC_PWRST_D3;
3586         set_pin_power_state(codec, 0x29, &parm);
3587         set_pin_power_state(codec, 0x2a, &parm);
3588         set_pin_power_state(codec, 0x2b, &parm);
3589         parm = AC_PWRST_D0;
3590         /* MUX9/10 (1eh/1fh), AIW 0/1 (10h/11h) */
3591         update_power_state(codec, 0x1e, parm);
3592         update_power_state(codec, 0x1f, parm);
3593         update_power_state(codec, 0x10, parm);
3594         update_power_state(codec, 0x11, parm);
3595
3596         /* outputs */
3597         /* AOW0 (8h)*/
3598         update_power_state(codec, 0x8, parm);
3599
3600         if (spec->codec_type == VT1802) {
3601                 /* PW4 (28h), MW4 (18h), MUX4(38h) */
3602                 parm = AC_PWRST_D3;
3603                 set_pin_power_state(codec, 0x28, &parm);
3604                 update_power_state(codec, 0x18, parm);
3605                 update_power_state(codec, 0x38, parm);
3606         } else {
3607                 /* PW4 (26h), MW4 (1ch), MUX4(37h) */
3608                 parm = AC_PWRST_D3;
3609                 set_pin_power_state(codec, 0x26, &parm);
3610                 update_power_state(codec, 0x1c, parm);
3611                 update_power_state(codec, 0x37, parm);
3612         }
3613
3614         if (spec->codec_type == VT1802) {
3615                 /* PW1 (25h), MW1 (15h), MUX1(35h), AOW1 (9h) */
3616                 parm = AC_PWRST_D3;
3617                 set_pin_power_state(codec, 0x25, &parm);
3618                 update_power_state(codec, 0x15, parm);
3619                 update_power_state(codec, 0x35, parm);
3620         } else {
3621                 /* PW1 (25h), MW1 (19h), MUX1(35h), AOW1 (9h) */
3622                 parm = AC_PWRST_D3;
3623                 set_pin_power_state(codec, 0x25, &parm);
3624                 update_power_state(codec, 0x19, parm);
3625                 update_power_state(codec, 0x35, parm);
3626         }
3627
3628         if (spec->hp_independent_mode)
3629                 update_power_state(codec, 0x9, AC_PWRST_D0);
3630
3631         /* Class-D */
3632         /* PW0 (24h), MW0(18h/14h), MUX0(34h) */
3633         present = snd_hda_jack_detect(codec, 0x25);
3634
3635         parm = AC_PWRST_D3;
3636         set_pin_power_state(codec, 0x24, &parm);
3637         parm = present ? AC_PWRST_D3 : AC_PWRST_D0;
3638         if (spec->codec_type == VT1802)
3639                 update_power_state(codec, 0x14, parm);
3640         else
3641                 update_power_state(codec, 0x18, parm);
3642         update_power_state(codec, 0x34, parm);
3643
3644         /* Mono Out */
3645         present = snd_hda_jack_detect(codec, 0x26);
3646
3647         parm = present ? AC_PWRST_D3 : AC_PWRST_D0;
3648         if (spec->codec_type == VT1802) {
3649                 /* PW15 (33h), MW8(1ch), MUX8(3ch) */
3650                 update_power_state(codec, 0x33, parm);
3651                 update_power_state(codec, 0x1c, parm);
3652                 update_power_state(codec, 0x3c, parm);
3653         } else {
3654                 /* PW15 (31h), MW8(17h), MUX8(3bh) */
3655                 update_power_state(codec, 0x31, parm);
3656                 update_power_state(codec, 0x17, parm);
3657                 update_power_state(codec, 0x3b, parm);
3658         }
3659         /* MW9 (21h) */
3660         if (imux_is_smixer || !is_aa_path_mute(codec))
3661                 update_power_state(codec, 0x21, AC_PWRST_D0);
3662         else
3663                 update_power_state(codec, 0x21, AC_PWRST_D3);
3664 }
3665
3666 /* patch for vt2002P */
3667 static int patch_vt2002P(struct hda_codec *codec)
3668 {
3669         struct via_spec *spec;
3670         int err;
3671
3672         /* create a codec specific record */
3673         spec = via_new_spec(codec);
3674         if (spec == NULL)
3675                 return -ENOMEM;
3676
3677         spec->aa_mix_nid = 0x21;
3678         override_mic_boost(codec, 0x2b, 0, 3, 40);
3679         override_mic_boost(codec, 0x29, 0, 3, 40);
3680         add_secret_dac_path(codec);
3681
3682         /* automatic parse from the BIOS config */
3683         err = via_parse_auto_config(codec);
3684         if (err < 0) {
3685                 via_free(codec);
3686                 return err;
3687         }
3688
3689         if (spec->codec_type == VT1802)
3690                 spec->init_verbs[spec->num_iverbs++] = vt1802_init_verbs;
3691         else
3692                 spec->init_verbs[spec->num_iverbs++] = vt2002P_init_verbs;
3693
3694         codec->patch_ops = via_patch_ops;
3695
3696         spec->set_widgets_power_state =  set_widgets_power_state_vt2002P;
3697         return 0;
3698 }
3699
3700 /* for vt1812 */
3701
3702 static const struct hda_verb vt1812_init_verbs[] = {
3703         /* Enable Boost Volume backdoor */
3704         {0x1, 0xfb9, 0x24},
3705         /* Enable AOW0 to MW9 */
3706         {0x1, 0xfb8, 0xa8},
3707         { }
3708 };
3709
3710 static void set_widgets_power_state_vt1812(struct hda_codec *codec)
3711 {
3712         struct via_spec *spec = codec->spec;
3713         unsigned int parm;
3714         unsigned int present;
3715         /* inputs */
3716         /* PW 5/6/7 (29h/2ah/2bh) */
3717         parm = AC_PWRST_D3;
3718         set_pin_power_state(codec, 0x29, &parm);
3719         set_pin_power_state(codec, 0x2a, &parm);
3720         set_pin_power_state(codec, 0x2b, &parm);
3721         parm = AC_PWRST_D0;
3722         /* MUX10/11 (1eh/1fh), AIW 0/1 (10h/11h) */
3723         update_power_state(codec, 0x1e, parm);
3724         update_power_state(codec, 0x1f, parm);
3725         update_power_state(codec, 0x10, parm);
3726         update_power_state(codec, 0x11, parm);
3727
3728         /* outputs */
3729         /* AOW0 (8h)*/
3730         update_power_state(codec, 0x8, AC_PWRST_D0);
3731
3732         /* PW4 (28h), MW4 (18h), MUX4(38h) */
3733         parm = AC_PWRST_D3;
3734         set_pin_power_state(codec, 0x28, &parm);
3735         update_power_state(codec, 0x18, parm);
3736         update_power_state(codec, 0x38, parm);
3737
3738         /* PW1 (25h), MW1 (15h), MUX1(35h), AOW1 (9h) */
3739         parm = AC_PWRST_D3;
3740         set_pin_power_state(codec, 0x25, &parm);
3741         update_power_state(codec, 0x15, parm);
3742         update_power_state(codec, 0x35, parm);
3743         if (spec->hp_independent_mode)
3744                 update_power_state(codec, 0x9, AC_PWRST_D0);
3745
3746         /* Internal Speaker */
3747         /* PW0 (24h), MW0(14h), MUX0(34h) */
3748         present = snd_hda_jack_detect(codec, 0x25);
3749
3750         parm = AC_PWRST_D3;
3751         set_pin_power_state(codec, 0x24, &parm);
3752         if (present) {
3753                 update_power_state(codec, 0x14, AC_PWRST_D3);
3754                 update_power_state(codec, 0x34, AC_PWRST_D3);
3755         } else {
3756                 update_power_state(codec, 0x14, AC_PWRST_D0);
3757                 update_power_state(codec, 0x34, AC_PWRST_D0);
3758         }
3759
3760
3761         /* Mono Out */
3762         /* PW13 (31h), MW13(1ch), MUX13(3ch), MW14(3eh) */
3763         present = snd_hda_jack_detect(codec, 0x28);
3764
3765         parm = AC_PWRST_D3;
3766         set_pin_power_state(codec, 0x31, &parm);
3767         if (present) {
3768                 update_power_state(codec, 0x1c, AC_PWRST_D3);
3769                 update_power_state(codec, 0x3c, AC_PWRST_D3);
3770                 update_power_state(codec, 0x3e, AC_PWRST_D3);
3771         } else {
3772                 update_power_state(codec, 0x1c, AC_PWRST_D0);
3773                 update_power_state(codec, 0x3c, AC_PWRST_D0);
3774                 update_power_state(codec, 0x3e, AC_PWRST_D0);
3775         }
3776
3777         /* PW15 (33h), MW15 (1dh), MUX15(3dh) */
3778         parm = AC_PWRST_D3;
3779         set_pin_power_state(codec, 0x33, &parm);
3780         update_power_state(codec, 0x1d, parm);
3781         update_power_state(codec, 0x3d, parm);
3782
3783 }
3784
3785 /* patch for vt1812 */
3786 static int patch_vt1812(struct hda_codec *codec)
3787 {
3788         struct via_spec *spec;
3789         int err;
3790
3791         /* create a codec specific record */
3792         spec = via_new_spec(codec);
3793         if (spec == NULL)
3794                 return -ENOMEM;
3795
3796         spec->aa_mix_nid = 0x21;
3797         override_mic_boost(codec, 0x2b, 0, 3, 40);
3798         override_mic_boost(codec, 0x29, 0, 3, 40);
3799         add_secret_dac_path(codec);
3800
3801         /* automatic parse from the BIOS config */
3802         err = via_parse_auto_config(codec);
3803         if (err < 0) {
3804                 via_free(codec);
3805                 return err;
3806         }
3807
3808         spec->init_verbs[spec->num_iverbs++]  = vt1812_init_verbs;
3809
3810         codec->patch_ops = via_patch_ops;
3811
3812         spec->set_widgets_power_state =  set_widgets_power_state_vt1812;
3813         return 0;
3814 }
3815
3816 /*
3817  * patch entries
3818  */
3819 static const struct hda_codec_preset snd_hda_preset_via[] = {
3820         { .id = 0x11061708, .name = "VT1708", .patch = patch_vt1708},
3821         { .id = 0x11061709, .name = "VT1708", .patch = patch_vt1708},
3822         { .id = 0x1106170a, .name = "VT1708", .patch = patch_vt1708},
3823         { .id = 0x1106170b, .name = "VT1708", .patch = patch_vt1708},
3824         { .id = 0x1106e710, .name = "VT1709 10-Ch",
3825           .patch = patch_vt1709},
3826         { .id = 0x1106e711, .name = "VT1709 10-Ch",
3827           .patch = patch_vt1709},
3828         { .id = 0x1106e712, .name = "VT1709 10-Ch",
3829           .patch = patch_vt1709},
3830         { .id = 0x1106e713, .name = "VT1709 10-Ch",
3831           .patch = patch_vt1709},
3832         { .id = 0x1106e714, .name = "VT1709 6-Ch",
3833           .patch = patch_vt1709},
3834         { .id = 0x1106e715, .name = "VT1709 6-Ch",
3835           .patch = patch_vt1709},
3836         { .id = 0x1106e716, .name = "VT1709 6-Ch",
3837           .patch = patch_vt1709},
3838         { .id = 0x1106e717, .name = "VT1709 6-Ch",
3839           .patch = patch_vt1709},
3840         { .id = 0x1106e720, .name = "VT1708B 8-Ch",
3841           .patch = patch_vt1708B},
3842         { .id = 0x1106e721, .name = "VT1708B 8-Ch",
3843           .patch = patch_vt1708B},
3844         { .id = 0x1106e722, .name = "VT1708B 8-Ch",
3845           .patch = patch_vt1708B},
3846         { .id = 0x1106e723, .name = "VT1708B 8-Ch",
3847           .patch = patch_vt1708B},
3848         { .id = 0x1106e724, .name = "VT1708B 4-Ch",
3849           .patch = patch_vt1708B},
3850         { .id = 0x1106e725, .name = "VT1708B 4-Ch",
3851           .patch = patch_vt1708B},
3852         { .id = 0x1106e726, .name = "VT1708B 4-Ch",
3853           .patch = patch_vt1708B},
3854         { .id = 0x1106e727, .name = "VT1708B 4-Ch",
3855           .patch = patch_vt1708B},
3856         { .id = 0x11060397, .name = "VT1708S",
3857           .patch = patch_vt1708S},
3858         { .id = 0x11061397, .name = "VT1708S",
3859           .patch = patch_vt1708S},
3860         { .id = 0x11062397, .name = "VT1708S",
3861           .patch = patch_vt1708S},
3862         { .id = 0x11063397, .name = "VT1708S",
3863           .patch = patch_vt1708S},
3864         { .id = 0x11064397, .name = "VT1705",
3865           .patch = patch_vt1708S},
3866         { .id = 0x11065397, .name = "VT1708S",
3867           .patch = patch_vt1708S},
3868         { .id = 0x11066397, .name = "VT1708S",
3869           .patch = patch_vt1708S},
3870         { .id = 0x11067397, .name = "VT1708S",
3871           .patch = patch_vt1708S},
3872         { .id = 0x11060398, .name = "VT1702",
3873           .patch = patch_vt1702},
3874         { .id = 0x11061398, .name = "VT1702",
3875           .patch = patch_vt1702},
3876         { .id = 0x11062398, .name = "VT1702",
3877           .patch = patch_vt1702},
3878         { .id = 0x11063398, .name = "VT1702",
3879           .patch = patch_vt1702},
3880         { .id = 0x11064398, .name = "VT1702",
3881           .patch = patch_vt1702},
3882         { .id = 0x11065398, .name = "VT1702",
3883           .patch = patch_vt1702},
3884         { .id = 0x11066398, .name = "VT1702",
3885           .patch = patch_vt1702},
3886         { .id = 0x11067398, .name = "VT1702",
3887           .patch = patch_vt1702},
3888         { .id = 0x11060428, .name = "VT1718S",
3889           .patch = patch_vt1718S},
3890         { .id = 0x11064428, .name = "VT1718S",
3891           .patch = patch_vt1718S},
3892         { .id = 0x11060441, .name = "VT2020",
3893           .patch = patch_vt1718S},
3894         { .id = 0x11064441, .name = "VT1828S",
3895           .patch = patch_vt1718S},
3896         { .id = 0x11060433, .name = "VT1716S",
3897           .patch = patch_vt1716S},
3898         { .id = 0x1106a721, .name = "VT1716S",
3899           .patch = patch_vt1716S},
3900         { .id = 0x11060438, .name = "VT2002P", .patch = patch_vt2002P},
3901         { .id = 0x11064438, .name = "VT2002P", .patch = patch_vt2002P},
3902         { .id = 0x11060448, .name = "VT1812", .patch = patch_vt1812},
3903         { .id = 0x11060440, .name = "VT1818S",
3904           .patch = patch_vt1708S},
3905         { .id = 0x11060446, .name = "VT1802",
3906                 .patch = patch_vt2002P},
3907         { .id = 0x11068446, .name = "VT1802",
3908                 .patch = patch_vt2002P},
3909         {} /* terminator */
3910 };
3911
3912 MODULE_ALIAS("snd-hda-codec-id:1106*");
3913
3914 static struct hda_codec_preset_list via_list = {
3915         .preset = snd_hda_preset_via,
3916         .owner = THIS_MODULE,
3917 };
3918
3919 MODULE_LICENSE("GPL");
3920 MODULE_DESCRIPTION("VIA HD-audio codec");
3921
3922 static int __init patch_via_init(void)
3923 {
3924         return snd_hda_add_codec_preset(&via_list);
3925 }
3926
3927 static void __exit patch_via_exit(void)
3928 {
3929         snd_hda_delete_codec_preset(&via_list);
3930 }
3931
3932 module_init(patch_via_init)
3933 module_exit(patch_via_exit)