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