Merge branch 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jack/linux-fs
[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 = 0;
1510         codec->pcm_info = info;
1511
1512         if (spec->multiout.num_dacs || spec->num_adc_nids) {
1513                 snprintf(spec->stream_name_analog,
1514                          sizeof(spec->stream_name_analog),
1515                          "%s Analog", codec->chip_name);
1516                 info->name = spec->stream_name_analog;
1517
1518                 if (spec->multiout.num_dacs) {
1519                         if (!spec->stream_analog_playback)
1520                                 spec->stream_analog_playback =
1521                                         &via_pcm_analog_playback;
1522                         info->stream[SNDRV_PCM_STREAM_PLAYBACK] =
1523                                 *spec->stream_analog_playback;
1524                         info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid =
1525                                 spec->multiout.dac_nids[0];
1526                         info->stream[SNDRV_PCM_STREAM_PLAYBACK].channels_max =
1527                                 spec->multiout.max_channels;
1528                 }
1529
1530                 if (!spec->stream_analog_capture) {
1531                         if (spec->dyn_adc_switch)
1532                                 spec->stream_analog_capture =
1533                                         &via_pcm_dyn_adc_analog_capture;
1534                         else
1535                                 spec->stream_analog_capture =
1536                                         &via_pcm_analog_capture;
1537                 }
1538                 if (spec->num_adc_nids) {
1539                         info->stream[SNDRV_PCM_STREAM_CAPTURE] =
1540                                 *spec->stream_analog_capture;
1541                         info->stream[SNDRV_PCM_STREAM_CAPTURE].nid =
1542                                 spec->adc_nids[0];
1543                         if (!spec->dyn_adc_switch)
1544                                 info->stream[SNDRV_PCM_STREAM_CAPTURE].substreams =
1545                                         spec->num_adc_nids;
1546                 }
1547                 codec->num_pcms++;
1548                 info++;
1549         }
1550
1551         if (spec->multiout.dig_out_nid || spec->dig_in_nid) {
1552                 snprintf(spec->stream_name_digital,
1553                          sizeof(spec->stream_name_digital),
1554                          "%s Digital", codec->chip_name);
1555                 info->name = spec->stream_name_digital;
1556                 info->pcm_type = HDA_PCM_TYPE_SPDIF;
1557                 if (spec->multiout.dig_out_nid) {
1558                         if (!spec->stream_digital_playback)
1559                                 spec->stream_digital_playback =
1560                                         &via_pcm_digital_playback;
1561                         info->stream[SNDRV_PCM_STREAM_PLAYBACK] =
1562                                 *spec->stream_digital_playback;
1563                         info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid =
1564                                 spec->multiout.dig_out_nid;
1565                 }
1566                 if (spec->dig_in_nid) {
1567                         if (!spec->stream_digital_capture)
1568                                 spec->stream_digital_capture =
1569                                         &via_pcm_digital_capture;
1570                         info->stream[SNDRV_PCM_STREAM_CAPTURE] =
1571                                 *spec->stream_digital_capture;
1572                         info->stream[SNDRV_PCM_STREAM_CAPTURE].nid =
1573                                 spec->dig_in_nid;
1574                 }
1575                 codec->num_pcms++;
1576                 info++;
1577         }
1578
1579         if (spec->hp_dac_nid) {
1580                 snprintf(spec->stream_name_hp, sizeof(spec->stream_name_hp),
1581                          "%s HP", codec->chip_name);
1582                 info->name = spec->stream_name_hp;
1583                 info->stream[SNDRV_PCM_STREAM_PLAYBACK] = via_pcm_hp_playback;
1584                 info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid =
1585                         spec->hp_dac_nid;
1586                 codec->num_pcms++;
1587                 info++;
1588         }
1589         return 0;
1590 }
1591
1592 static void via_free(struct hda_codec *codec)
1593 {
1594         struct via_spec *spec = codec->spec;
1595
1596         if (!spec)
1597                 return;
1598
1599         via_free_kctls(codec);
1600         vt1708_stop_hp_work(spec);
1601         kfree(spec->bind_cap_vol);
1602         kfree(spec->bind_cap_sw);
1603         kfree(spec);
1604 }
1605
1606 /* mute/unmute outputs */
1607 static void toggle_output_mutes(struct hda_codec *codec, int num_pins,
1608                                 hda_nid_t *pins, bool mute)
1609 {
1610         int i;
1611         for (i = 0; i < num_pins; i++) {
1612                 unsigned int parm = snd_hda_codec_read(codec, pins[i], 0,
1613                                           AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
1614                 if (parm & AC_PINCTL_IN_EN)
1615                         continue;
1616                 if (mute)
1617                         parm &= ~AC_PINCTL_OUT_EN;
1618                 else
1619                         parm |= AC_PINCTL_OUT_EN;
1620                 snd_hda_codec_write(codec, pins[i], 0,
1621                                     AC_VERB_SET_PIN_WIDGET_CONTROL, parm);
1622         }
1623 }
1624
1625 /* mute internal speaker if line-out is plugged */
1626 static void via_line_automute(struct hda_codec *codec, int present)
1627 {
1628         struct via_spec *spec = codec->spec;
1629
1630         if (!spec->autocfg.speaker_outs)
1631                 return;
1632         if (!present)
1633                 present = snd_hda_jack_detect(codec,
1634                                               spec->autocfg.line_out_pins[0]);
1635         toggle_output_mutes(codec, spec->autocfg.speaker_outs,
1636                             spec->autocfg.speaker_pins,
1637                             present);
1638 }
1639
1640 /* mute internal speaker if HP is plugged */
1641 static void via_hp_automute(struct hda_codec *codec)
1642 {
1643         int present = 0;
1644         int nums;
1645         struct via_spec *spec = codec->spec;
1646
1647         if (!spec->hp_independent_mode && spec->autocfg.hp_pins[0])
1648                 present = snd_hda_jack_detect(codec, spec->autocfg.hp_pins[0]);
1649
1650         if (spec->smart51_enabled)
1651                 nums = spec->autocfg.line_outs + spec->smart51_nums;
1652         else
1653                 nums = spec->autocfg.line_outs;
1654         toggle_output_mutes(codec, nums, spec->autocfg.line_out_pins, present);
1655
1656         via_line_automute(codec, present);
1657 }
1658
1659 static void via_gpio_control(struct hda_codec *codec)
1660 {
1661         unsigned int gpio_data;
1662         unsigned int vol_counter;
1663         unsigned int vol;
1664         unsigned int master_vol;
1665
1666         struct via_spec *spec = codec->spec;
1667
1668         gpio_data = snd_hda_codec_read(codec, codec->afg, 0,
1669                                        AC_VERB_GET_GPIO_DATA, 0) & 0x03;
1670
1671         vol_counter = (snd_hda_codec_read(codec, codec->afg, 0,
1672                                           0xF84, 0) & 0x3F0000) >> 16;
1673
1674         vol = vol_counter & 0x1F;
1675         master_vol = snd_hda_codec_read(codec, 0x1A, 0,
1676                                         AC_VERB_GET_AMP_GAIN_MUTE,
1677                                         AC_AMP_GET_INPUT);
1678
1679         if (gpio_data == 0x02) {
1680                 /* unmute line out */
1681                 snd_hda_codec_write(codec, spec->autocfg.line_out_pins[0], 0,
1682                                     AC_VERB_SET_PIN_WIDGET_CONTROL,
1683                                     PIN_OUT);
1684                 if (vol_counter & 0x20) {
1685                         /* decrease volume */
1686                         if (vol > master_vol)
1687                                 vol = master_vol;
1688                         snd_hda_codec_amp_stereo(codec, 0x1A, HDA_INPUT,
1689                                                  0, HDA_AMP_VOLMASK,
1690                                                  master_vol-vol);
1691                 } else {
1692                         /* increase volume */
1693                         snd_hda_codec_amp_stereo(codec, 0x1A, HDA_INPUT, 0,
1694                                          HDA_AMP_VOLMASK,
1695                                          ((master_vol+vol) > 0x2A) ? 0x2A :
1696                                           (master_vol+vol));
1697                 }
1698         } else if (!(gpio_data & 0x02)) {
1699                 /* mute line out */
1700                 snd_hda_codec_write(codec, spec->autocfg.line_out_pins[0], 0,
1701                                     AC_VERB_SET_PIN_WIDGET_CONTROL,
1702                                     0);
1703         }
1704 }
1705
1706 /* unsolicited event for jack sensing */
1707 static void via_unsol_event(struct hda_codec *codec,
1708                                   unsigned int res)
1709 {
1710         res >>= 26;
1711
1712         if (res & VIA_JACK_EVENT)
1713                 set_widgets_power_state(codec);
1714
1715         res &= ~VIA_JACK_EVENT;
1716
1717         if (res == VIA_HP_EVENT || res == VIA_LINE_EVENT)
1718                 via_hp_automute(codec);
1719         else if (res == VIA_GPIO_EVENT)
1720                 via_gpio_control(codec);
1721 }
1722
1723 #ifdef CONFIG_PM
1724 static int via_suspend(struct hda_codec *codec, pm_message_t state)
1725 {
1726         struct via_spec *spec = codec->spec;
1727         vt1708_stop_hp_work(spec);
1728         return 0;
1729 }
1730 #endif
1731
1732 #ifdef CONFIG_SND_HDA_POWER_SAVE
1733 static int via_check_power_status(struct hda_codec *codec, hda_nid_t nid)
1734 {
1735         struct via_spec *spec = codec->spec;
1736         return snd_hda_check_amp_list_power(codec, &spec->loopback, nid);
1737 }
1738 #endif
1739
1740 /*
1741  */
1742
1743 static int via_init(struct hda_codec *codec);
1744
1745 static const struct hda_codec_ops via_patch_ops = {
1746         .build_controls = via_build_controls,
1747         .build_pcms = via_build_pcms,
1748         .init = via_init,
1749         .free = via_free,
1750         .unsol_event = via_unsol_event,
1751 #ifdef CONFIG_PM
1752         .suspend = via_suspend,
1753 #endif
1754 #ifdef CONFIG_SND_HDA_POWER_SAVE
1755         .check_power_status = via_check_power_status,
1756 #endif
1757 };
1758
1759 static bool is_empty_dac(struct hda_codec *codec, hda_nid_t dac)
1760 {
1761         struct via_spec *spec = codec->spec;
1762         int i;
1763
1764         for (i = 0; i < spec->multiout.num_dacs; i++) {
1765                 if (spec->multiout.dac_nids[i] == dac)
1766                         return false;
1767         }
1768         if (spec->hp_dac_nid == dac)
1769                 return false;
1770         return true;
1771 }
1772
1773 static bool __parse_output_path(struct hda_codec *codec, hda_nid_t nid,
1774                                 hda_nid_t target_dac, int with_aa_mix,
1775                                 struct nid_path *path, int depth)
1776 {
1777         struct via_spec *spec = codec->spec;
1778         hda_nid_t conn[8];
1779         int i, nums;
1780
1781         if (nid == spec->aa_mix_nid) {
1782                 if (!with_aa_mix)
1783                         return false;
1784                 with_aa_mix = 2; /* mark aa-mix is included */
1785         }
1786
1787         nums = snd_hda_get_connections(codec, nid, conn, ARRAY_SIZE(conn));
1788         for (i = 0; i < nums; i++) {
1789                 if (get_wcaps_type(get_wcaps(codec, conn[i])) != AC_WID_AUD_OUT)
1790                         continue;
1791                 if (conn[i] == target_dac || is_empty_dac(codec, conn[i])) {
1792                         /* aa-mix is requested but not included? */
1793                         if (!(spec->aa_mix_nid && with_aa_mix == 1))
1794                                 goto found;
1795                 }
1796         }
1797         if (depth >= MAX_NID_PATH_DEPTH)
1798                 return false;
1799         for (i = 0; i < nums; i++) {
1800                 unsigned int type;
1801                 type = get_wcaps_type(get_wcaps(codec, conn[i]));
1802                 if (type == AC_WID_AUD_OUT)
1803                         continue;
1804                 if (__parse_output_path(codec, conn[i], target_dac,
1805                                         with_aa_mix, path, depth + 1))
1806                         goto found;
1807         }
1808         return false;
1809
1810  found:
1811         path->path[path->depth] = conn[i];
1812         path->idx[path->depth] = i;
1813         if (nums > 1 && get_wcaps_type(get_wcaps(codec, nid)) != AC_WID_AUD_MIX)
1814                 path->multi[path->depth] = 1;
1815         path->depth++;
1816         return true;
1817 }
1818
1819 static bool parse_output_path(struct hda_codec *codec, hda_nid_t nid,
1820                               hda_nid_t target_dac, int with_aa_mix,
1821                               struct nid_path *path)
1822 {
1823         if (__parse_output_path(codec, nid, target_dac, with_aa_mix, path, 1)) {
1824                 path->path[path->depth] = nid;
1825                 path->depth++;
1826                 snd_printdd("output-path: depth=%d, %02x/%02x/%02x/%02x/%02x\n",
1827                             path->depth, path->path[0], path->path[1],
1828                             path->path[2], path->path[3], path->path[4]);
1829                 return true;
1830         }
1831         return false;
1832 }
1833
1834 static int via_auto_fill_dac_nids(struct hda_codec *codec)
1835 {
1836         struct via_spec *spec = codec->spec;
1837         const struct auto_pin_cfg *cfg = &spec->autocfg;
1838         int i, dac_num;
1839         hda_nid_t nid;
1840
1841         spec->multiout.dac_nids = spec->private_dac_nids;
1842         dac_num = 0;
1843         for (i = 0; i < cfg->line_outs; i++) {
1844                 hda_nid_t dac = 0;
1845                 nid = cfg->line_out_pins[i];
1846                 if (!nid)
1847                         continue;
1848                 if (parse_output_path(codec, nid, 0, 0, &spec->out_path[i]))
1849                         dac = spec->out_path[i].path[0];
1850                 if (!i && parse_output_path(codec, nid, dac, 1,
1851                                             &spec->out_mix_path))
1852                         dac = spec->out_mix_path.path[0];
1853                 if (dac) {
1854                         spec->private_dac_nids[i] = dac;
1855                         dac_num++;
1856                 }
1857         }
1858         if (!spec->out_path[0].depth && spec->out_mix_path.depth) {
1859                 spec->out_path[0] = spec->out_mix_path;
1860                 spec->out_mix_path.depth = 0;
1861         }
1862         spec->multiout.num_dacs = dac_num;
1863         return 0;
1864 }
1865
1866 static int create_ch_ctls(struct hda_codec *codec, const char *pfx,
1867                           int chs, bool check_dac, struct nid_path *path)
1868 {
1869         struct via_spec *spec = codec->spec;
1870         char name[32];
1871         hda_nid_t dac, pin, sel, nid;
1872         int err;
1873
1874         dac = check_dac ? path->path[0] : 0;
1875         pin = path->path[path->depth - 1];
1876         sel = path->depth > 1 ? path->path[1] : 0;
1877
1878         if (dac && check_amp_caps(codec, dac, HDA_OUTPUT, AC_AMPCAP_NUM_STEPS))
1879                 nid = dac;
1880         else if (check_amp_caps(codec, pin, HDA_OUTPUT, AC_AMPCAP_NUM_STEPS))
1881                 nid = pin;
1882         else if (check_amp_caps(codec, sel, HDA_OUTPUT, AC_AMPCAP_NUM_STEPS))
1883                 nid = sel;
1884         else
1885                 nid = 0;
1886         if (nid) {
1887                 sprintf(name, "%s Playback Volume", pfx);
1888                 err = via_add_control(spec, VIA_CTL_WIDGET_VOL, name,
1889                               HDA_COMPOSE_AMP_VAL(nid, chs, 0, HDA_OUTPUT));
1890                 if (err < 0)
1891                         return err;
1892                 path->vol_ctl = nid;
1893         }
1894
1895         if (dac && check_amp_caps(codec, dac, HDA_OUTPUT, AC_AMPCAP_MUTE))
1896                 nid = dac;
1897         else if (check_amp_caps(codec, pin, HDA_OUTPUT, AC_AMPCAP_MUTE))
1898                 nid = pin;
1899         else if (check_amp_caps(codec, sel, HDA_OUTPUT, AC_AMPCAP_MUTE))
1900                 nid = sel;
1901         else
1902                 nid = 0;
1903         if (nid) {
1904                 sprintf(name, "%s Playback Switch", pfx);
1905                 err = via_add_control(spec, VIA_CTL_WIDGET_MUTE, name,
1906                               HDA_COMPOSE_AMP_VAL(nid, chs, 0, HDA_OUTPUT));
1907                 if (err < 0)
1908                         return err;
1909                 path->mute_ctl = nid;
1910         }
1911         return 0;
1912 }
1913
1914 static void mangle_smart51(struct hda_codec *codec)
1915 {
1916         struct via_spec *spec = codec->spec;
1917         struct auto_pin_cfg *cfg = &spec->autocfg;
1918         struct auto_pin_cfg_item *ins = cfg->inputs;
1919         int i, j, nums, attr;
1920         int pins[AUTO_CFG_MAX_INS];
1921
1922         for (attr = INPUT_PIN_ATTR_REAR; attr >= INPUT_PIN_ATTR_NORMAL; attr--) {
1923                 nums = 0;
1924                 for (i = 0; i < cfg->num_inputs; i++) {
1925                         unsigned int def;
1926                         if (ins[i].type > AUTO_PIN_LINE_IN)
1927                                 continue;
1928                         def = snd_hda_codec_get_pincfg(codec, ins[i].pin);
1929                         if (snd_hda_get_input_pin_attr(def) != attr)
1930                                 continue;
1931                         for (j = 0; j < nums; j++)
1932                                 if (ins[pins[j]].type < ins[i].type) {
1933                                         memmove(pins + j + 1, pins + j,
1934                                                 (nums - j) * sizeof(int));
1935                                         break;
1936                                 }
1937                         pins[j] = i;
1938                         nums++;
1939                 }
1940                 if (cfg->line_outs + nums < 3)
1941                         continue;
1942                 for (i = 0; i < nums; i++) {
1943                         hda_nid_t pin = ins[pins[i]].pin;
1944                         spec->smart51_pins[spec->smart51_nums++] = pin;
1945                         cfg->line_out_pins[cfg->line_outs++] = pin;
1946                         if (cfg->line_outs == 3)
1947                                 break;
1948                 }
1949                 return;
1950         }
1951 }
1952
1953 static void copy_path_mixer_ctls(struct nid_path *dst, struct nid_path *src)
1954 {
1955         dst->vol_ctl = src->vol_ctl;
1956         dst->mute_ctl = src->mute_ctl;
1957 }
1958
1959 /* add playback controls from the parsed DAC table */
1960 static int via_auto_create_multi_out_ctls(struct hda_codec *codec)
1961 {
1962         struct via_spec *spec = codec->spec;
1963         struct auto_pin_cfg *cfg = &spec->autocfg;
1964         struct nid_path *path;
1965         static const char * const chname[4] = {
1966                 "Front", "Surround", "C/LFE", "Side"
1967         };
1968         int i, idx, err;
1969         int old_line_outs;
1970
1971         /* check smart51 */
1972         old_line_outs = cfg->line_outs;
1973         if (cfg->line_outs == 1)
1974                 mangle_smart51(codec);
1975
1976         err = via_auto_fill_dac_nids(codec);
1977         if (err < 0)
1978                 return err;
1979
1980         if (spec->multiout.num_dacs < 3) {
1981                 spec->smart51_nums = 0;
1982                 cfg->line_outs = old_line_outs;
1983         }
1984         for (i = 0; i < cfg->line_outs; i++) {
1985                 hda_nid_t pin, dac;
1986                 pin = cfg->line_out_pins[i];
1987                 dac = spec->multiout.dac_nids[i];
1988                 if (!pin || !dac)
1989                         continue;
1990                 path = spec->out_path + i;
1991                 if (i == HDA_CLFE) {
1992                         err = create_ch_ctls(codec, "Center", 1, true, path);
1993                         if (err < 0)
1994                                 return err;
1995                         err = create_ch_ctls(codec, "LFE", 2, true, path);
1996                         if (err < 0)
1997                                 return err;
1998                 } else {
1999                         const char *pfx = chname[i];
2000                         if (cfg->line_out_type == AUTO_PIN_SPEAKER_OUT &&
2001                             cfg->line_outs == 1)
2002                                 pfx = "Speaker";
2003                         err = create_ch_ctls(codec, pfx, 3, true, path);
2004                         if (err < 0)
2005                                 return err;
2006                 }
2007                 if (path != spec->out_path + i)
2008                         copy_path_mixer_ctls(&spec->out_path[i], path);
2009                 if (path == spec->out_path && spec->out_mix_path.depth)
2010                         copy_path_mixer_ctls(&spec->out_mix_path, path);
2011         }
2012
2013         idx = get_connection_index(codec, spec->aa_mix_nid,
2014                                    spec->multiout.dac_nids[0]);
2015         if (idx >= 0) {
2016                 /* add control to mixer */
2017                 const char *name;
2018                 name = spec->out_mix_path.depth ?
2019                         "PCM Loopback Playback Volume" : "PCM Playback Volume";
2020                 err = via_add_control(spec, VIA_CTL_WIDGET_VOL, name,
2021                                       HDA_COMPOSE_AMP_VAL(spec->aa_mix_nid, 3,
2022                                                           idx, HDA_INPUT));
2023                 if (err < 0)
2024                         return err;
2025                 name = spec->out_mix_path.depth ?
2026                         "PCM Loopback Playback Switch" : "PCM Playback Switch";
2027                 err = via_add_control(spec, VIA_CTL_WIDGET_MUTE, name,
2028                                       HDA_COMPOSE_AMP_VAL(spec->aa_mix_nid, 3,
2029                                                           idx, HDA_INPUT));
2030                 if (err < 0)
2031                         return err;
2032         }
2033
2034         cfg->line_outs = old_line_outs;
2035
2036         return 0;
2037 }
2038
2039 static int via_auto_create_hp_ctls(struct hda_codec *codec, hda_nid_t pin)
2040 {
2041         struct via_spec *spec = codec->spec;
2042         struct nid_path *path;
2043         bool check_dac;
2044         int i, err;
2045
2046         if (!pin)
2047                 return 0;
2048
2049         if (!parse_output_path(codec, pin, 0, 0, &spec->hp_indep_path)) {
2050                 for (i = HDA_SIDE; i >= HDA_CLFE; i--) {
2051                         if (i < spec->multiout.num_dacs &&
2052                             parse_output_path(codec, pin,
2053                                               spec->multiout.dac_nids[i], 0,
2054                                               &spec->hp_indep_path)) {
2055                                 spec->hp_indep_shared = i;
2056                                 break;
2057                         }
2058                 }
2059         }
2060         if (spec->hp_indep_path.depth) {
2061                 spec->hp_dac_nid = spec->hp_indep_path.path[0];
2062                 if (!spec->hp_indep_shared)
2063                         spec->hp_path = spec->hp_indep_path;
2064         }
2065         /* optionally check front-path w/o AA-mix */
2066         if (!spec->hp_path.depth)
2067                 parse_output_path(codec, pin,
2068                                   spec->multiout.dac_nids[HDA_FRONT], 0,
2069                                   &spec->hp_path);
2070
2071         if (!parse_output_path(codec, pin, spec->multiout.dac_nids[HDA_FRONT],
2072                                1, &spec->hp_mix_path) && !spec->hp_path.depth)
2073                 return 0;
2074
2075         if (spec->hp_path.depth) {
2076                 path = &spec->hp_path;
2077                 check_dac = true;
2078         } else {
2079                 path = &spec->hp_mix_path;
2080                 check_dac = false;
2081         }
2082         err = create_ch_ctls(codec, "Headphone", 3, check_dac, path);
2083         if (err < 0)
2084                 return err;
2085         if (check_dac)
2086                 copy_path_mixer_ctls(&spec->hp_mix_path, path);
2087         else
2088                 copy_path_mixer_ctls(&spec->hp_path, path);
2089         if (spec->hp_indep_path.depth)
2090                 copy_path_mixer_ctls(&spec->hp_indep_path, path);
2091         return 0;
2092 }
2093
2094 static int via_auto_create_speaker_ctls(struct hda_codec *codec)
2095 {
2096         struct via_spec *spec = codec->spec;
2097         struct nid_path *path;
2098         bool check_dac;
2099         hda_nid_t pin, dac = 0;
2100         int err;
2101
2102         pin = spec->autocfg.speaker_pins[0];
2103         if (!spec->autocfg.speaker_outs || !pin)
2104                 return 0;
2105
2106         if (parse_output_path(codec, pin, 0, 0, &spec->speaker_path))
2107                 dac = spec->speaker_path.path[0];
2108         if (!dac)
2109                 parse_output_path(codec, pin,
2110                                   spec->multiout.dac_nids[HDA_FRONT], 0,
2111                                   &spec->speaker_path);
2112         if (!parse_output_path(codec, pin, spec->multiout.dac_nids[HDA_FRONT],
2113                                1, &spec->speaker_mix_path) && !dac)
2114                 return 0;
2115
2116         /* no AA-path for front? */
2117         if (!spec->out_mix_path.depth && spec->speaker_mix_path.depth)
2118                 dac = 0;
2119
2120         spec->speaker_dac_nid = dac;
2121         spec->multiout.extra_out_nid[0] = dac;
2122         if (dac) {
2123                 path = &spec->speaker_path;
2124                 check_dac = true;
2125         } else {
2126                 path = &spec->speaker_mix_path;
2127                 check_dac = false;
2128         }
2129         err = create_ch_ctls(codec, "Speaker", 3, check_dac, path);
2130         if (err < 0)
2131                 return err;
2132         if (check_dac)
2133                 copy_path_mixer_ctls(&spec->speaker_mix_path, path);
2134         else
2135                 copy_path_mixer_ctls(&spec->speaker_path, path);
2136         return 0;
2137 }
2138
2139 #define via_aamix_ctl_info      via_pin_power_ctl_info
2140
2141 static int via_aamix_ctl_get(struct snd_kcontrol *kcontrol,
2142                              struct snd_ctl_elem_value *ucontrol)
2143 {
2144         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2145         struct via_spec *spec = codec->spec;
2146         ucontrol->value.enumerated.item[0] = spec->aamix_mode;
2147         return 0;
2148 }
2149
2150 static void update_aamix_paths(struct hda_codec *codec, int do_mix,
2151                                struct nid_path *nomix, struct nid_path *mix)
2152 {
2153         if (do_mix) {
2154                 activate_output_path(codec, nomix, false, false);
2155                 activate_output_path(codec, mix, true, false);
2156         } else {
2157                 activate_output_path(codec, mix, false, false);
2158                 activate_output_path(codec, nomix, true, false);
2159         }
2160 }
2161
2162 static int via_aamix_ctl_put(struct snd_kcontrol *kcontrol,
2163                              struct snd_ctl_elem_value *ucontrol)
2164 {
2165         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2166         struct via_spec *spec = codec->spec;
2167         unsigned int val = ucontrol->value.enumerated.item[0];
2168
2169         if (val == spec->aamix_mode)
2170                 return 0;
2171         spec->aamix_mode = val;
2172         /* update front path */
2173         update_aamix_paths(codec, val, &spec->out_path[0], &spec->out_mix_path);
2174         /* update HP path */
2175         if (!spec->hp_independent_mode) {
2176                 update_aamix_paths(codec, val, &spec->hp_path,
2177                                    &spec->hp_mix_path);
2178         }
2179         /* update speaker path */
2180         update_aamix_paths(codec, val, &spec->speaker_path,
2181                            &spec->speaker_mix_path);
2182         return 1;
2183 }
2184
2185 static const struct snd_kcontrol_new via_aamix_ctl_enum = {
2186         .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2187         .name = "Loopback Mixing",
2188         .info = via_aamix_ctl_info,
2189         .get = via_aamix_ctl_get,
2190         .put = via_aamix_ctl_put,
2191 };
2192
2193 static int via_auto_create_loopback_switch(struct hda_codec *codec)
2194 {
2195         struct via_spec *spec = codec->spec;
2196
2197         if (!spec->aa_mix_nid || !spec->out_mix_path.depth)
2198                 return 0; /* no loopback switching available */
2199         if (!via_clone_control(spec, &via_aamix_ctl_enum))
2200                 return -ENOMEM;
2201         return 0;
2202 }
2203
2204 /* look for ADCs */
2205 static int via_fill_adcs(struct hda_codec *codec)
2206 {
2207         struct via_spec *spec = codec->spec;
2208         hda_nid_t nid = codec->start_nid;
2209         int i;
2210
2211         for (i = 0; i < codec->num_nodes; i++, nid++) {
2212                 unsigned int wcaps = get_wcaps(codec, nid);
2213                 if (get_wcaps_type(wcaps) != AC_WID_AUD_IN)
2214                         continue;
2215                 if (wcaps & AC_WCAP_DIGITAL)
2216                         continue;
2217                 if (!(wcaps & AC_WCAP_CONN_LIST))
2218                         continue;
2219                 if (spec->num_adc_nids >= ARRAY_SIZE(spec->adc_nids))
2220                         return -ENOMEM;
2221                 spec->adc_nids[spec->num_adc_nids++] = nid;
2222         }
2223         return 0;
2224 }
2225
2226 /* input-src control */
2227 static int via_mux_enum_info(struct snd_kcontrol *kcontrol,
2228                              struct snd_ctl_elem_info *uinfo)
2229 {
2230         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2231         struct via_spec *spec = codec->spec;
2232
2233         uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
2234         uinfo->count = 1;
2235         uinfo->value.enumerated.items = spec->num_inputs;
2236         if (uinfo->value.enumerated.item >= spec->num_inputs)
2237                 uinfo->value.enumerated.item = spec->num_inputs - 1;
2238         strcpy(uinfo->value.enumerated.name,
2239                spec->inputs[uinfo->value.enumerated.item].label);
2240         return 0;
2241 }
2242
2243 static int via_mux_enum_get(struct snd_kcontrol *kcontrol,
2244                             struct snd_ctl_elem_value *ucontrol)
2245 {
2246         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2247         struct via_spec *spec = codec->spec;
2248         unsigned int idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
2249
2250         ucontrol->value.enumerated.item[0] = spec->cur_mux[idx];
2251         return 0;
2252 }
2253
2254 static int via_mux_enum_put(struct snd_kcontrol *kcontrol,
2255                             struct snd_ctl_elem_value *ucontrol)
2256 {
2257         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2258         struct via_spec *spec = codec->spec;
2259         unsigned int idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
2260         hda_nid_t mux;
2261         int cur;
2262
2263         cur = ucontrol->value.enumerated.item[0];
2264         if (cur < 0 || cur >= spec->num_inputs)
2265                 return -EINVAL;
2266         if (spec->cur_mux[idx] == cur)
2267                 return 0;
2268         spec->cur_mux[idx] = cur;
2269         if (spec->dyn_adc_switch) {
2270                 int adc_idx = spec->inputs[cur].adc_idx;
2271                 mux = spec->mux_nids[adc_idx];
2272                 via_dyn_adc_pcm_resetup(codec, cur);
2273         } else {
2274                 mux = spec->mux_nids[idx];
2275                 if (snd_BUG_ON(!mux))
2276                         return -EINVAL;
2277         }
2278
2279         if (mux) {
2280                 /* switch to D0 beofre change index */
2281                 if (snd_hda_codec_read(codec, mux, 0,
2282                                AC_VERB_GET_POWER_STATE, 0x00) != AC_PWRST_D0)
2283                         snd_hda_codec_write(codec, mux, 0,
2284                                     AC_VERB_SET_POWER_STATE, AC_PWRST_D0);
2285                 snd_hda_codec_write(codec, mux, 0,
2286                                     AC_VERB_SET_CONNECT_SEL,
2287                                     spec->inputs[cur].mux_idx);
2288         }
2289
2290         /* update jack power state */
2291         set_widgets_power_state(codec);
2292         return 0;
2293 }
2294
2295 static const struct snd_kcontrol_new via_input_src_ctl = {
2296         .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2297         /* The multiple "Capture Source" controls confuse alsamixer
2298          * So call somewhat different..
2299          */
2300         /* .name = "Capture Source", */
2301         .name = "Input Source",
2302         .info = via_mux_enum_info,
2303         .get = via_mux_enum_get,
2304         .put = via_mux_enum_put,
2305 };
2306
2307 static int create_input_src_ctls(struct hda_codec *codec, int count)
2308 {
2309         struct via_spec *spec = codec->spec;
2310         struct snd_kcontrol_new *knew;
2311
2312         if (spec->num_inputs <= 1 || !count)
2313                 return 0; /* no need for single src */
2314
2315         knew = via_clone_control(spec, &via_input_src_ctl);
2316         if (!knew)
2317                 return -ENOMEM;
2318         knew->count = count;
2319         return 0;
2320 }
2321
2322 /* add the powersave loopback-list entry */
2323 static void add_loopback_list(struct via_spec *spec, hda_nid_t mix, int idx)
2324 {
2325         struct hda_amp_list *list;
2326
2327         if (spec->num_loopbacks >= ARRAY_SIZE(spec->loopback_list) - 1)
2328                 return;
2329         list = spec->loopback_list + spec->num_loopbacks;
2330         list->nid = mix;
2331         list->dir = HDA_INPUT;
2332         list->idx = idx;
2333         spec->num_loopbacks++;
2334         spec->loopback.amplist = spec->loopback_list;
2335 }
2336
2337 static bool is_reachable_nid(struct hda_codec *codec, hda_nid_t src,
2338                              hda_nid_t dst)
2339 {
2340         return snd_hda_get_conn_index(codec, src, dst, 1) >= 0;
2341 }
2342
2343 /* add the input-route to the given pin */
2344 static bool add_input_route(struct hda_codec *codec, hda_nid_t pin)
2345 {
2346         struct via_spec *spec = codec->spec;
2347         int c, idx;
2348
2349         spec->inputs[spec->num_inputs].adc_idx = -1;
2350         spec->inputs[spec->num_inputs].pin = pin;
2351         for (c = 0; c < spec->num_adc_nids; c++) {
2352                 if (spec->mux_nids[c]) {
2353                         idx = get_connection_index(codec, spec->mux_nids[c],
2354                                                    pin);
2355                         if (idx < 0)
2356                                 continue;
2357                         spec->inputs[spec->num_inputs].mux_idx = idx;
2358                 } else {
2359                         if (!is_reachable_nid(codec, spec->adc_nids[c], pin))
2360                                 continue;
2361                 }
2362                 spec->inputs[spec->num_inputs].adc_idx = c;
2363                 /* Can primary ADC satisfy all inputs? */
2364                 if (!spec->dyn_adc_switch &&
2365                     spec->num_inputs > 0 && spec->inputs[0].adc_idx != c) {
2366                         snd_printd(KERN_INFO
2367                                    "via: dynamic ADC switching enabled\n");
2368                         spec->dyn_adc_switch = 1;
2369                 }
2370                 return true;
2371         }
2372         return false;
2373 }
2374
2375 static int get_mux_nids(struct hda_codec *codec);
2376
2377 /* parse input-routes; fill ADCs, MUXs and input-src entries */
2378 static int parse_analog_inputs(struct hda_codec *codec)
2379 {
2380         struct via_spec *spec = codec->spec;
2381         const struct auto_pin_cfg *cfg = &spec->autocfg;
2382         int i, err;
2383
2384         err = via_fill_adcs(codec);
2385         if (err < 0)
2386                 return err;
2387         err = get_mux_nids(codec);
2388         if (err < 0)
2389                 return err;
2390
2391         /* fill all input-routes */
2392         for (i = 0; i < cfg->num_inputs; i++) {
2393                 if (add_input_route(codec, cfg->inputs[i].pin))
2394                         spec->inputs[spec->num_inputs++].label =
2395                                 hda_get_autocfg_input_label(codec, cfg, i);
2396         }
2397
2398         /* check for internal loopback recording */
2399         if (spec->aa_mix_nid &&
2400             add_input_route(codec, spec->aa_mix_nid))
2401                 spec->inputs[spec->num_inputs++].label = "Stereo Mixer";
2402
2403         return 0;
2404 }
2405
2406 /* create analog-loopback volume/switch controls */
2407 static int create_loopback_ctls(struct hda_codec *codec)
2408 {
2409         struct via_spec *spec = codec->spec;
2410         const struct auto_pin_cfg *cfg = &spec->autocfg;
2411         const char *prev_label = NULL;
2412         int type_idx = 0;
2413         int i, j, err, idx;
2414
2415         if (!spec->aa_mix_nid)
2416                 return 0;
2417
2418         for (i = 0; i < cfg->num_inputs; i++) {
2419                 hda_nid_t pin = cfg->inputs[i].pin;
2420                 const char *label = hda_get_autocfg_input_label(codec, cfg, i);
2421
2422                 if (prev_label && !strcmp(label, prev_label))
2423                         type_idx++;
2424                 else
2425                         type_idx = 0;
2426                 prev_label = label;
2427                 idx = get_connection_index(codec, spec->aa_mix_nid, pin);
2428                 if (idx >= 0) {
2429                         err = via_new_analog_input(spec, label, type_idx,
2430                                                    idx, spec->aa_mix_nid);
2431                         if (err < 0)
2432                                 return err;
2433                         add_loopback_list(spec, spec->aa_mix_nid, idx);
2434                 }
2435
2436                 /* remember the label for smart51 control */
2437                 for (j = 0; j < spec->smart51_nums; j++) {
2438                         if (spec->smart51_pins[j] == pin) {
2439                                 spec->smart51_idxs[j] = idx;
2440                                 spec->smart51_labels[j] = label;
2441                                 break;
2442                         }
2443                 }
2444         }
2445         return 0;
2446 }
2447
2448 /* create mic-boost controls (if present) */
2449 static int create_mic_boost_ctls(struct hda_codec *codec)
2450 {
2451         struct via_spec *spec = codec->spec;
2452         const struct auto_pin_cfg *cfg = &spec->autocfg;
2453         int i, err;
2454
2455         for (i = 0; i < cfg->num_inputs; i++) {
2456                 hda_nid_t pin = cfg->inputs[i].pin;
2457                 unsigned int caps;
2458                 const char *label;
2459                 char name[32];
2460
2461                 if (cfg->inputs[i].type != AUTO_PIN_MIC)
2462                         continue;
2463                 caps = query_amp_caps(codec, pin, HDA_INPUT);
2464                 if (caps == -1 || !(caps & AC_AMPCAP_NUM_STEPS))
2465                         continue;
2466                 label = hda_get_autocfg_input_label(codec, cfg, i);
2467                 snprintf(name, sizeof(name), "%s Boost Volume", label);
2468                 err = via_add_control(spec, VIA_CTL_WIDGET_VOL, name,
2469                               HDA_COMPOSE_AMP_VAL(pin, 3, 0, HDA_INPUT));
2470                 if (err < 0)
2471                         return err;
2472         }
2473         return 0;
2474 }
2475
2476 /* create capture and input-src controls for multiple streams */
2477 static int create_multi_adc_ctls(struct hda_codec *codec)
2478 {
2479         struct via_spec *spec = codec->spec;
2480         int i, err;
2481
2482         /* create capture mixer elements */
2483         for (i = 0; i < spec->num_adc_nids; i++) {
2484                 hda_nid_t adc = spec->adc_nids[i];
2485                 err = __via_add_control(spec, VIA_CTL_WIDGET_VOL,
2486                                         "Capture Volume", i,
2487                                         HDA_COMPOSE_AMP_VAL(adc, 3, 0,
2488                                                             HDA_INPUT));
2489                 if (err < 0)
2490                         return err;
2491                 err = __via_add_control(spec, VIA_CTL_WIDGET_MUTE,
2492                                         "Capture Switch", i,
2493                                         HDA_COMPOSE_AMP_VAL(adc, 3, 0,
2494                                                             HDA_INPUT));
2495                 if (err < 0)
2496                         return err;
2497         }
2498
2499         /* input-source control */
2500         for (i = 0; i < spec->num_adc_nids; i++)
2501                 if (!spec->mux_nids[i])
2502                         break;
2503         err = create_input_src_ctls(codec, i);
2504         if (err < 0)
2505                 return err;
2506         return 0;
2507 }
2508
2509 /* bind capture volume/switch */
2510 static struct snd_kcontrol_new via_bind_cap_vol_ctl =
2511         HDA_BIND_VOL("Capture Volume", 0);
2512 static struct snd_kcontrol_new via_bind_cap_sw_ctl =
2513         HDA_BIND_SW("Capture Switch", 0);
2514
2515 static int init_bind_ctl(struct via_spec *spec, struct hda_bind_ctls **ctl_ret,
2516                          struct hda_ctl_ops *ops)
2517 {
2518         struct hda_bind_ctls *ctl;
2519         int i;
2520
2521         ctl = kzalloc(sizeof(*ctl) + sizeof(long) * 4, GFP_KERNEL);
2522         if (!ctl)
2523                 return -ENOMEM;
2524         ctl->ops = ops;
2525         for (i = 0; i < spec->num_adc_nids; i++)
2526                 ctl->values[i] =
2527                         HDA_COMPOSE_AMP_VAL(spec->adc_nids[i], 3, 0, HDA_INPUT);
2528         *ctl_ret = ctl;
2529         return 0;
2530 }
2531
2532 /* create capture and input-src controls for dynamic ADC-switch case */
2533 static int create_dyn_adc_ctls(struct hda_codec *codec)
2534 {
2535         struct via_spec *spec = codec->spec;
2536         struct snd_kcontrol_new *knew;
2537         int err;
2538
2539         /* set up the bind capture ctls */
2540         err = init_bind_ctl(spec, &spec->bind_cap_vol, &snd_hda_bind_vol);
2541         if (err < 0)
2542                 return err;
2543         err = init_bind_ctl(spec, &spec->bind_cap_sw, &snd_hda_bind_sw);
2544         if (err < 0)
2545                 return err;
2546
2547         /* create capture mixer elements */
2548         knew = via_clone_control(spec, &via_bind_cap_vol_ctl);
2549         if (!knew)
2550                 return -ENOMEM;
2551         knew->private_value = (long)spec->bind_cap_vol;
2552
2553         knew = via_clone_control(spec, &via_bind_cap_sw_ctl);
2554         if (!knew)
2555                 return -ENOMEM;
2556         knew->private_value = (long)spec->bind_cap_sw;
2557
2558         /* input-source control */
2559         err = create_input_src_ctls(codec, 1);
2560         if (err < 0)
2561                 return err;
2562         return 0;
2563 }
2564
2565 /* parse and create capture-related stuff */
2566 static int via_auto_create_analog_input_ctls(struct hda_codec *codec)
2567 {
2568         struct via_spec *spec = codec->spec;
2569         int err;
2570
2571         err = parse_analog_inputs(codec);
2572         if (err < 0)
2573                 return err;
2574         if (spec->dyn_adc_switch)
2575                 err = create_dyn_adc_ctls(codec);
2576         else
2577                 err = create_multi_adc_ctls(codec);
2578         if (err < 0)
2579                 return err;
2580         err = create_loopback_ctls(codec);
2581         if (err < 0)
2582                 return err;
2583         err = create_mic_boost_ctls(codec);
2584         if (err < 0)
2585                 return err;
2586         return 0;
2587 }
2588
2589 static void vt1708_set_pinconfig_connect(struct hda_codec *codec, hda_nid_t nid)
2590 {
2591         unsigned int def_conf;
2592         unsigned char seqassoc;
2593
2594         def_conf = snd_hda_codec_get_pincfg(codec, nid);
2595         seqassoc = (unsigned char) get_defcfg_association(def_conf);
2596         seqassoc = (seqassoc << 4) | get_defcfg_sequence(def_conf);
2597         if (get_defcfg_connect(def_conf) == AC_JACK_PORT_NONE
2598             && (seqassoc == 0xf0 || seqassoc == 0xff)) {
2599                 def_conf = def_conf & (~(AC_JACK_PORT_BOTH << 30));
2600                 snd_hda_codec_set_pincfg(codec, nid, def_conf);
2601         }
2602
2603         return;
2604 }
2605
2606 static int vt1708_jack_detect_get(struct snd_kcontrol *kcontrol,
2607                                      struct snd_ctl_elem_value *ucontrol)
2608 {
2609         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2610         struct via_spec *spec = codec->spec;
2611
2612         if (spec->codec_type != VT1708)
2613                 return 0;
2614         spec->vt1708_jack_detect =
2615                 !((snd_hda_codec_read(codec, 0x1, 0, 0xf84, 0) >> 8) & 0x1);
2616         ucontrol->value.integer.value[0] = spec->vt1708_jack_detect;
2617         return 0;
2618 }
2619
2620 static int vt1708_jack_detect_put(struct snd_kcontrol *kcontrol,
2621                                      struct snd_ctl_elem_value *ucontrol)
2622 {
2623         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2624         struct via_spec *spec = codec->spec;
2625         int change;
2626
2627         if (spec->codec_type != VT1708)
2628                 return 0;
2629         spec->vt1708_jack_detect = ucontrol->value.integer.value[0];
2630         change = (0x1 & (snd_hda_codec_read(codec, 0x1, 0, 0xf84, 0) >> 8))
2631                 == !spec->vt1708_jack_detect;
2632         if (spec->vt1708_jack_detect) {
2633                 mute_aa_path(codec, 1);
2634                 notify_aa_path_ctls(codec);
2635         }
2636         return change;
2637 }
2638
2639 static const struct snd_kcontrol_new vt1708_jack_detect_ctl = {
2640         .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2641         .name = "Jack Detect",
2642         .count = 1,
2643         .info = snd_ctl_boolean_mono_info,
2644         .get = vt1708_jack_detect_get,
2645         .put = vt1708_jack_detect_put,
2646 };
2647
2648 static void fill_dig_outs(struct hda_codec *codec);
2649 static void fill_dig_in(struct hda_codec *codec);
2650
2651 static int via_parse_auto_config(struct hda_codec *codec)
2652 {
2653         struct via_spec *spec = codec->spec;
2654         int err;
2655
2656         err = snd_hda_parse_pin_def_config(codec, &spec->autocfg, NULL);
2657         if (err < 0)
2658                 return err;
2659         if (!spec->autocfg.line_outs && !spec->autocfg.hp_pins[0])
2660                 return -EINVAL;
2661
2662         err = via_auto_create_multi_out_ctls(codec);
2663         if (err < 0)
2664                 return err;
2665         err = via_auto_create_hp_ctls(codec, spec->autocfg.hp_pins[0]);
2666         if (err < 0)
2667                 return err;
2668         err = via_auto_create_speaker_ctls(codec);
2669         if (err < 0)
2670                 return err;
2671         err = via_auto_create_loopback_switch(codec);
2672         if (err < 0)
2673                 return err;
2674         err = via_auto_create_analog_input_ctls(codec);
2675         if (err < 0)
2676                 return err;
2677
2678         spec->multiout.max_channels = spec->multiout.num_dacs * 2;
2679
2680         fill_dig_outs(codec);
2681         fill_dig_in(codec);
2682
2683         if (spec->kctls.list)
2684                 spec->mixers[spec->num_mixers++] = spec->kctls.list;
2685
2686
2687         if (spec->hp_dac_nid && spec->hp_mix_path.depth) {
2688                 err = via_hp_build(codec);
2689                 if (err < 0)
2690                         return err;
2691         }
2692
2693         err = via_smart51_build(codec);
2694         if (err < 0)
2695                 return err;
2696
2697         /* assign slave outs */
2698         if (spec->slave_dig_outs[0])
2699                 codec->slave_dig_outs = spec->slave_dig_outs;
2700
2701         return 1;
2702 }
2703
2704 static void via_auto_init_dig_outs(struct hda_codec *codec)
2705 {
2706         struct via_spec *spec = codec->spec;
2707         if (spec->multiout.dig_out_nid)
2708                 init_output_pin(codec, spec->autocfg.dig_out_pins[0], PIN_OUT);
2709         if (spec->slave_dig_outs[0])
2710                 init_output_pin(codec, spec->autocfg.dig_out_pins[1], PIN_OUT);
2711 }
2712
2713 static void via_auto_init_dig_in(struct hda_codec *codec)
2714 {
2715         struct via_spec *spec = codec->spec;
2716         if (!spec->dig_in_nid)
2717                 return;
2718         snd_hda_codec_write(codec, spec->autocfg.dig_in_pin, 0,
2719                             AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN);
2720 }
2721
2722 /* initialize the unsolicited events */
2723 static void via_auto_init_unsol_event(struct hda_codec *codec)
2724 {
2725         struct via_spec *spec = codec->spec;
2726         struct auto_pin_cfg *cfg = &spec->autocfg;
2727         unsigned int ev;
2728         int i;
2729
2730         if (cfg->hp_pins[0] && is_jack_detectable(codec, cfg->hp_pins[0]))
2731                 snd_hda_codec_write(codec, cfg->hp_pins[0], 0,
2732                                 AC_VERB_SET_UNSOLICITED_ENABLE,
2733                                 AC_USRSP_EN | VIA_HP_EVENT | VIA_JACK_EVENT);
2734
2735         if (cfg->speaker_pins[0])
2736                 ev = VIA_LINE_EVENT;
2737         else
2738                 ev = 0;
2739         for (i = 0; i < cfg->line_outs; i++) {
2740                 if (cfg->line_out_pins[i] &&
2741                     is_jack_detectable(codec, cfg->line_out_pins[i]))
2742                         snd_hda_codec_write(codec, cfg->line_out_pins[i], 0,
2743                                 AC_VERB_SET_UNSOLICITED_ENABLE,
2744                                 AC_USRSP_EN | ev | VIA_JACK_EVENT);
2745         }
2746
2747         for (i = 0; i < cfg->num_inputs; i++) {
2748                 if (is_jack_detectable(codec, cfg->inputs[i].pin))
2749                         snd_hda_codec_write(codec, cfg->inputs[i].pin, 0,
2750                                 AC_VERB_SET_UNSOLICITED_ENABLE,
2751                                 AC_USRSP_EN | VIA_JACK_EVENT);
2752         }
2753 }
2754
2755 static int via_init(struct hda_codec *codec)
2756 {
2757         struct via_spec *spec = codec->spec;
2758         int i;
2759
2760         for (i = 0; i < spec->num_iverbs; i++)
2761                 snd_hda_sequence_write(codec, spec->init_verbs[i]);
2762
2763         via_auto_init_multi_out(codec);
2764         via_auto_init_hp_out(codec);
2765         via_auto_init_speaker_out(codec);
2766         via_auto_init_analog_input(codec);
2767         via_auto_init_dig_outs(codec);
2768         via_auto_init_dig_in(codec);
2769
2770         via_auto_init_unsol_event(codec);
2771
2772         via_hp_automute(codec);
2773
2774         return 0;
2775 }
2776
2777 static void vt1708_update_hp_jack_state(struct work_struct *work)
2778 {
2779         struct via_spec *spec = container_of(work, struct via_spec,
2780                                              vt1708_hp_work.work);
2781         if (spec->codec_type != VT1708)
2782                 return;
2783         /* if jack state toggled */
2784         if (spec->vt1708_hp_present
2785             != snd_hda_jack_detect(spec->codec, spec->autocfg.hp_pins[0])) {
2786                 spec->vt1708_hp_present ^= 1;
2787                 via_hp_automute(spec->codec);
2788         }
2789         vt1708_start_hp_work(spec);
2790 }
2791
2792 static int get_mux_nids(struct hda_codec *codec)
2793 {
2794         struct via_spec *spec = codec->spec;
2795         hda_nid_t nid, conn[8];
2796         unsigned int type;
2797         int i, n;
2798
2799         for (i = 0; i < spec->num_adc_nids; i++) {
2800                 nid = spec->adc_nids[i];
2801                 while (nid) {
2802                         type = get_wcaps_type(get_wcaps(codec, nid));
2803                         if (type == AC_WID_PIN)
2804                                 break;
2805                         n = snd_hda_get_connections(codec, nid, conn,
2806                                                     ARRAY_SIZE(conn));
2807                         if (n <= 0)
2808                                 break;
2809                         if (n > 1) {
2810                                 spec->mux_nids[i] = nid;
2811                                 break;
2812                         }
2813                         nid = conn[0];
2814                 }
2815         }
2816         return 0;
2817 }
2818
2819 static int patch_vt1708(struct hda_codec *codec)
2820 {
2821         struct via_spec *spec;
2822         int err;
2823
2824         /* create a codec specific record */
2825         spec = via_new_spec(codec);
2826         if (spec == NULL)
2827                 return -ENOMEM;
2828
2829         spec->aa_mix_nid = 0x17;
2830
2831         /* Add HP and CD pin config connect bit re-config action */
2832         vt1708_set_pinconfig_connect(codec, VT1708_HP_PIN_NID);
2833         vt1708_set_pinconfig_connect(codec, VT1708_CD_PIN_NID);
2834
2835         /* automatic parse from the BIOS config */
2836         err = via_parse_auto_config(codec);
2837         if (err < 0) {
2838                 via_free(codec);
2839                 return err;
2840         }
2841
2842         /* add jack detect on/off control */
2843         if (!via_clone_control(spec, &vt1708_jack_detect_ctl))
2844                 return -ENOMEM;
2845
2846         /* disable 32bit format on VT1708 */
2847         if (codec->vendor_id == 0x11061708)
2848                 spec->stream_analog_playback = &vt1708_pcm_analog_s16_playback;
2849
2850         spec->init_verbs[spec->num_iverbs++] = vt1708_init_verbs;
2851
2852         codec->patch_ops = via_patch_ops;
2853
2854         INIT_DELAYED_WORK(&spec->vt1708_hp_work, vt1708_update_hp_jack_state);
2855         return 0;
2856 }
2857
2858 static int patch_vt1709(struct hda_codec *codec)
2859 {
2860         struct via_spec *spec;
2861         int err;
2862
2863         /* create a codec specific record */
2864         spec = via_new_spec(codec);
2865         if (spec == NULL)
2866                 return -ENOMEM;
2867
2868         spec->aa_mix_nid = 0x18;
2869
2870         err = via_parse_auto_config(codec);
2871         if (err < 0) {
2872                 via_free(codec);
2873                 return err;
2874         }
2875
2876         codec->patch_ops = via_patch_ops;
2877
2878         return 0;
2879 }
2880
2881 static void set_widgets_power_state_vt1708B(struct hda_codec *codec)
2882 {
2883         struct via_spec *spec = codec->spec;
2884         int imux_is_smixer;
2885         unsigned int parm;
2886         int is_8ch = 0;
2887         if ((spec->codec_type != VT1708B_4CH) &&
2888             (codec->vendor_id != 0x11064397))
2889                 is_8ch = 1;
2890
2891         /* SW0 (17h) = stereo mixer */
2892         imux_is_smixer =
2893         (snd_hda_codec_read(codec, 0x17, 0, AC_VERB_GET_CONNECT_SEL, 0x00)
2894          == ((spec->codec_type == VT1708S) ? 5 : 0));
2895         /* inputs */
2896         /* PW 1/2/5 (1ah/1bh/1eh) */
2897         parm = AC_PWRST_D3;
2898         set_pin_power_state(codec, 0x1a, &parm);
2899         set_pin_power_state(codec, 0x1b, &parm);
2900         set_pin_power_state(codec, 0x1e, &parm);
2901         if (imux_is_smixer)
2902                 parm = AC_PWRST_D0;
2903         /* SW0 (17h), AIW 0/1 (13h/14h) */
2904         snd_hda_codec_write(codec, 0x17, 0, AC_VERB_SET_POWER_STATE, parm);
2905         snd_hda_codec_write(codec, 0x13, 0, AC_VERB_SET_POWER_STATE, parm);
2906         snd_hda_codec_write(codec, 0x14, 0, AC_VERB_SET_POWER_STATE, parm);
2907
2908         /* outputs */
2909         /* PW0 (19h), SW1 (18h), AOW1 (11h) */
2910         parm = AC_PWRST_D3;
2911         set_pin_power_state(codec, 0x19, &parm);
2912         if (spec->smart51_enabled)
2913                 set_pin_power_state(codec, 0x1b, &parm);
2914         snd_hda_codec_write(codec, 0x18, 0, AC_VERB_SET_POWER_STATE, parm);
2915         snd_hda_codec_write(codec, 0x11, 0, AC_VERB_SET_POWER_STATE, parm);
2916
2917         /* PW6 (22h), SW2 (26h), AOW2 (24h) */
2918         if (is_8ch) {
2919                 parm = AC_PWRST_D3;
2920                 set_pin_power_state(codec, 0x22, &parm);
2921                 if (spec->smart51_enabled)
2922                         set_pin_power_state(codec, 0x1a, &parm);
2923                 snd_hda_codec_write(codec, 0x26, 0,
2924                                     AC_VERB_SET_POWER_STATE, parm);
2925                 snd_hda_codec_write(codec, 0x24, 0,
2926                                     AC_VERB_SET_POWER_STATE, parm);
2927         } else if (codec->vendor_id == 0x11064397) {
2928                 /* PW7(23h), SW2(27h), AOW2(25h) */
2929                 parm = AC_PWRST_D3;
2930                 set_pin_power_state(codec, 0x23, &parm);
2931                 if (spec->smart51_enabled)
2932                         set_pin_power_state(codec, 0x1a, &parm);
2933                 snd_hda_codec_write(codec, 0x27, 0,
2934                                     AC_VERB_SET_POWER_STATE, parm);
2935                 snd_hda_codec_write(codec, 0x25, 0,
2936                                     AC_VERB_SET_POWER_STATE, parm);
2937         }
2938
2939         /* PW 3/4/7 (1ch/1dh/23h) */
2940         parm = AC_PWRST_D3;
2941         /* force to D0 for internal Speaker */
2942         set_pin_power_state(codec, 0x1c, &parm);
2943         set_pin_power_state(codec, 0x1d, &parm);
2944         if (is_8ch)
2945                 set_pin_power_state(codec, 0x23, &parm);
2946
2947         /* MW0 (16h), Sw3 (27h), AOW 0/3 (10h/25h) */
2948         snd_hda_codec_write(codec, 0x16, 0, AC_VERB_SET_POWER_STATE,
2949                             imux_is_smixer ? AC_PWRST_D0 : parm);
2950         snd_hda_codec_write(codec, 0x10, 0, AC_VERB_SET_POWER_STATE, parm);
2951         if (is_8ch) {
2952                 snd_hda_codec_write(codec, 0x25, 0,
2953                                     AC_VERB_SET_POWER_STATE, parm);
2954                 snd_hda_codec_write(codec, 0x27, 0,
2955                                     AC_VERB_SET_POWER_STATE, parm);
2956         } else if (codec->vendor_id == 0x11064397 && spec->hp_independent_mode)
2957                 snd_hda_codec_write(codec, 0x25, 0,
2958                                     AC_VERB_SET_POWER_STATE, parm);
2959 }
2960
2961 static int patch_vt1708S(struct hda_codec *codec);
2962 static int patch_vt1708B(struct hda_codec *codec)
2963 {
2964         struct via_spec *spec;
2965         int err;
2966
2967         if (get_codec_type(codec) == VT1708BCE)
2968                 return patch_vt1708S(codec);
2969
2970         /* create a codec specific record */
2971         spec = via_new_spec(codec);
2972         if (spec == NULL)
2973                 return -ENOMEM;
2974
2975         spec->aa_mix_nid = 0x16;
2976
2977         /* automatic parse from the BIOS config */
2978         err = via_parse_auto_config(codec);
2979         if (err < 0) {
2980                 via_free(codec);
2981                 return err;
2982         }
2983
2984         codec->patch_ops = via_patch_ops;
2985
2986         spec->set_widgets_power_state =  set_widgets_power_state_vt1708B;
2987
2988         return 0;
2989 }
2990
2991 /* Patch for VT1708S */
2992 static const struct hda_verb vt1708S_init_verbs[] = {
2993         /* Enable Mic Boost Volume backdoor */
2994         {0x1, 0xf98, 0x1},
2995         /* don't bybass mixer */
2996         {0x1, 0xf88, 0xc0},
2997         { }
2998 };
2999
3000 /* fill out digital output widgets; one for master and one for slave outputs */
3001 static void fill_dig_outs(struct hda_codec *codec)
3002 {
3003         struct via_spec *spec = codec->spec;
3004         int i;
3005
3006         for (i = 0; i < spec->autocfg.dig_outs; i++) {
3007                 hda_nid_t nid;
3008                 int conn;
3009
3010                 nid = spec->autocfg.dig_out_pins[i];
3011                 if (!nid)
3012                         continue;
3013                 conn = snd_hda_get_connections(codec, nid, &nid, 1);
3014                 if (conn < 1)
3015                         continue;
3016                 if (!spec->multiout.dig_out_nid)
3017                         spec->multiout.dig_out_nid = nid;
3018                 else {
3019                         spec->slave_dig_outs[0] = nid;
3020                         break; /* at most two dig outs */
3021                 }
3022         }
3023 }
3024
3025 static void fill_dig_in(struct hda_codec *codec)
3026 {
3027         struct via_spec *spec = codec->spec;
3028         hda_nid_t dig_nid;
3029         int i, err;
3030
3031         if (!spec->autocfg.dig_in_pin)
3032                 return;
3033
3034         dig_nid = codec->start_nid;
3035         for (i = 0; i < codec->num_nodes; i++, dig_nid++) {
3036                 unsigned int wcaps = get_wcaps(codec, dig_nid);
3037                 if (get_wcaps_type(wcaps) != AC_WID_AUD_IN)
3038                         continue;
3039                 if (!(wcaps & AC_WCAP_DIGITAL))
3040                         continue;
3041                 if (!(wcaps & AC_WCAP_CONN_LIST))
3042                         continue;
3043                 err = get_connection_index(codec, dig_nid,
3044                                            spec->autocfg.dig_in_pin);
3045                 if (err >= 0) {
3046                         spec->dig_in_nid = dig_nid;
3047                         break;
3048                 }
3049         }
3050 }
3051
3052 static void override_mic_boost(struct hda_codec *codec, hda_nid_t pin,
3053                                int offset, int num_steps, int step_size)
3054 {
3055         snd_hda_override_amp_caps(codec, pin, HDA_INPUT,
3056                                   (offset << AC_AMPCAP_OFFSET_SHIFT) |
3057                                   (num_steps << AC_AMPCAP_NUM_STEPS_SHIFT) |
3058                                   (step_size << AC_AMPCAP_STEP_SIZE_SHIFT) |
3059                                   (0 << AC_AMPCAP_MUTE_SHIFT));
3060 }
3061
3062 static int patch_vt1708S(struct hda_codec *codec)
3063 {
3064         struct via_spec *spec;
3065         int err;
3066
3067         /* create a codec specific record */
3068         spec = via_new_spec(codec);
3069         if (spec == NULL)
3070                 return -ENOMEM;
3071
3072         spec->aa_mix_nid = 0x16;
3073         override_mic_boost(codec, 0x1a, 0, 3, 40);
3074         override_mic_boost(codec, 0x1e, 0, 3, 40);
3075
3076         /* automatic parse from the BIOS config */
3077         err = via_parse_auto_config(codec);
3078         if (err < 0) {
3079                 via_free(codec);
3080                 return err;
3081         }
3082
3083         spec->init_verbs[spec->num_iverbs++] = vt1708S_init_verbs;
3084
3085         codec->patch_ops = via_patch_ops;
3086
3087         /* correct names for VT1708BCE */
3088         if (get_codec_type(codec) == VT1708BCE) {
3089                 kfree(codec->chip_name);
3090                 codec->chip_name = kstrdup("VT1708BCE", GFP_KERNEL);
3091                 snprintf(codec->bus->card->mixername,
3092                          sizeof(codec->bus->card->mixername),
3093                          "%s %s", codec->vendor_name, codec->chip_name);
3094         }
3095         /* correct names for VT1705 */
3096         if (codec->vendor_id == 0x11064397)     {
3097                 kfree(codec->chip_name);
3098                 codec->chip_name = kstrdup("VT1705", GFP_KERNEL);
3099                 snprintf(codec->bus->card->mixername,
3100                          sizeof(codec->bus->card->mixername),
3101                          "%s %s", codec->vendor_name, codec->chip_name);
3102         }
3103         spec->set_widgets_power_state =  set_widgets_power_state_vt1708B;
3104         return 0;
3105 }
3106
3107 /* Patch for VT1702 */
3108
3109 static const struct hda_verb vt1702_init_verbs[] = {
3110         /* mixer enable */
3111         {0x1, 0xF88, 0x3},
3112         /* GPIO 0~2 */
3113         {0x1, 0xF82, 0x3F},
3114         { }
3115 };
3116
3117 static void set_widgets_power_state_vt1702(struct hda_codec *codec)
3118 {
3119         int imux_is_smixer =
3120         snd_hda_codec_read(codec, 0x13, 0, AC_VERB_GET_CONNECT_SEL, 0x00) == 3;
3121         unsigned int parm;
3122         /* inputs */
3123         /* PW 1/2/5 (14h/15h/18h) */
3124         parm = AC_PWRST_D3;
3125         set_pin_power_state(codec, 0x14, &parm);
3126         set_pin_power_state(codec, 0x15, &parm);
3127         set_pin_power_state(codec, 0x18, &parm);
3128         if (imux_is_smixer)
3129                 parm = AC_PWRST_D0; /* SW0 (13h) = stereo mixer (idx 3) */
3130         /* SW0 (13h), AIW 0/1/2 (12h/1fh/20h) */
3131         snd_hda_codec_write(codec, 0x13, 0, AC_VERB_SET_POWER_STATE, parm);
3132         snd_hda_codec_write(codec, 0x12, 0, AC_VERB_SET_POWER_STATE, parm);
3133         snd_hda_codec_write(codec, 0x1f, 0, AC_VERB_SET_POWER_STATE, parm);
3134         snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_POWER_STATE, parm);
3135
3136         /* outputs */
3137         /* PW 3/4 (16h/17h) */
3138         parm = AC_PWRST_D3;
3139         set_pin_power_state(codec, 0x17, &parm);
3140         set_pin_power_state(codec, 0x16, &parm);
3141         /* MW0 (1ah), AOW 0/1 (10h/1dh) */
3142         snd_hda_codec_write(codec, 0x1a, 0, AC_VERB_SET_POWER_STATE,
3143                             imux_is_smixer ? AC_PWRST_D0 : parm);
3144         snd_hda_codec_write(codec, 0x10, 0, AC_VERB_SET_POWER_STATE, parm);
3145         snd_hda_codec_write(codec, 0x1d, 0, AC_VERB_SET_POWER_STATE, parm);
3146 }
3147
3148 static int patch_vt1702(struct hda_codec *codec)
3149 {
3150         struct via_spec *spec;
3151         int err;
3152
3153         /* create a codec specific record */
3154         spec = via_new_spec(codec);
3155         if (spec == NULL)
3156                 return -ENOMEM;
3157
3158         spec->aa_mix_nid = 0x1a;
3159
3160         /* limit AA path volume to 0 dB */
3161         snd_hda_override_amp_caps(codec, 0x1A, HDA_INPUT,
3162                                   (0x17 << AC_AMPCAP_OFFSET_SHIFT) |
3163                                   (0x17 << AC_AMPCAP_NUM_STEPS_SHIFT) |
3164                                   (0x5 << AC_AMPCAP_STEP_SIZE_SHIFT) |
3165                                   (1 << AC_AMPCAP_MUTE_SHIFT));
3166
3167         /* automatic parse from the BIOS config */
3168         err = via_parse_auto_config(codec);
3169         if (err < 0) {
3170                 via_free(codec);
3171                 return err;
3172         }
3173
3174         spec->init_verbs[spec->num_iverbs++] = vt1702_init_verbs;
3175
3176         codec->patch_ops = via_patch_ops;
3177
3178         spec->set_widgets_power_state =  set_widgets_power_state_vt1702;
3179         return 0;
3180 }
3181
3182 /* Patch for VT1718S */
3183
3184 static const struct hda_verb vt1718S_init_verbs[] = {
3185         /* Enable MW0 adjust Gain 5 */
3186         {0x1, 0xfb2, 0x10},
3187         /* Enable Boost Volume backdoor */
3188         {0x1, 0xf88, 0x8},
3189
3190         { }
3191 };
3192
3193 static void set_widgets_power_state_vt1718S(struct hda_codec *codec)
3194 {
3195         struct via_spec *spec = codec->spec;
3196         int imux_is_smixer;
3197         unsigned int parm;
3198         /* MUX6 (1eh) = stereo mixer */
3199         imux_is_smixer =
3200         snd_hda_codec_read(codec, 0x1e, 0, AC_VERB_GET_CONNECT_SEL, 0x00) == 5;
3201         /* inputs */
3202         /* PW 5/6/7 (29h/2ah/2bh) */
3203         parm = AC_PWRST_D3;
3204         set_pin_power_state(codec, 0x29, &parm);
3205         set_pin_power_state(codec, 0x2a, &parm);
3206         set_pin_power_state(codec, 0x2b, &parm);
3207         if (imux_is_smixer)
3208                 parm = AC_PWRST_D0;
3209         /* MUX6/7 (1eh/1fh), AIW 0/1 (10h/11h) */
3210         snd_hda_codec_write(codec, 0x1e, 0, AC_VERB_SET_POWER_STATE, parm);
3211         snd_hda_codec_write(codec, 0x1f, 0, AC_VERB_SET_POWER_STATE, parm);
3212         snd_hda_codec_write(codec, 0x10, 0, AC_VERB_SET_POWER_STATE, parm);
3213         snd_hda_codec_write(codec, 0x11, 0, AC_VERB_SET_POWER_STATE, parm);
3214
3215         /* outputs */
3216         /* PW3 (27h), MW2 (1ah), AOW3 (bh) */
3217         parm = AC_PWRST_D3;
3218         set_pin_power_state(codec, 0x27, &parm);
3219         snd_hda_codec_write(codec, 0x1a, 0, AC_VERB_SET_POWER_STATE, parm);
3220         snd_hda_codec_write(codec, 0xb, 0, AC_VERB_SET_POWER_STATE, parm);
3221
3222         /* PW2 (26h), AOW2 (ah) */
3223         parm = AC_PWRST_D3;
3224         set_pin_power_state(codec, 0x26, &parm);
3225         if (spec->smart51_enabled)
3226                 set_pin_power_state(codec, 0x2b, &parm);
3227         snd_hda_codec_write(codec, 0xa, 0, AC_VERB_SET_POWER_STATE, parm);
3228
3229         /* PW0 (24h), AOW0 (8h) */
3230         parm = AC_PWRST_D3;
3231         set_pin_power_state(codec, 0x24, &parm);
3232         if (!spec->hp_independent_mode) /* check for redirected HP */
3233                 set_pin_power_state(codec, 0x28, &parm);
3234         snd_hda_codec_write(codec, 0x8, 0, AC_VERB_SET_POWER_STATE, parm);
3235         /* MW9 (21h), Mw2 (1ah), AOW0 (8h) */
3236         snd_hda_codec_write(codec, 0x21, 0, AC_VERB_SET_POWER_STATE,
3237                             imux_is_smixer ? AC_PWRST_D0 : parm);
3238
3239         /* PW1 (25h), AOW1 (9h) */
3240         parm = AC_PWRST_D3;
3241         set_pin_power_state(codec, 0x25, &parm);
3242         if (spec->smart51_enabled)
3243                 set_pin_power_state(codec, 0x2a, &parm);
3244         snd_hda_codec_write(codec, 0x9, 0, AC_VERB_SET_POWER_STATE, parm);
3245
3246         if (spec->hp_independent_mode) {
3247                 /* PW4 (28h), MW3 (1bh), MUX1(34h), AOW4 (ch) */
3248                 parm = AC_PWRST_D3;
3249                 set_pin_power_state(codec, 0x28, &parm);
3250                 snd_hda_codec_write(codec, 0x1b, 0,
3251                                     AC_VERB_SET_POWER_STATE, parm);
3252                 snd_hda_codec_write(codec, 0x34, 0,
3253                                     AC_VERB_SET_POWER_STATE, parm);
3254                 snd_hda_codec_write(codec, 0xc, 0,
3255                                     AC_VERB_SET_POWER_STATE, parm);
3256         }
3257 }
3258
3259 /* Add a connection to the primary DAC from AA-mixer for some codecs
3260  * This isn't listed from the raw info, but the chip has a secret connection.
3261  */
3262 static int add_secret_dac_path(struct hda_codec *codec)
3263 {
3264         struct via_spec *spec = codec->spec;
3265         int i, nums;
3266         hda_nid_t conn[8];
3267         hda_nid_t nid;
3268
3269         if (!spec->aa_mix_nid)
3270                 return 0;
3271         nums = snd_hda_get_connections(codec, spec->aa_mix_nid, conn,
3272                                        ARRAY_SIZE(conn) - 1);
3273         for (i = 0; i < nums; i++) {
3274                 if (get_wcaps_type(get_wcaps(codec, conn[i])) == AC_WID_AUD_OUT)
3275                         return 0;
3276         }
3277
3278         /* find the primary DAC and add to the connection list */
3279         nid = codec->start_nid;
3280         for (i = 0; i < codec->num_nodes; i++, nid++) {
3281                 unsigned int caps = get_wcaps(codec, nid);
3282                 if (get_wcaps_type(caps) == AC_WID_AUD_OUT &&
3283                     !(caps & AC_WCAP_DIGITAL)) {
3284                         conn[nums++] = nid;
3285                         return snd_hda_override_conn_list(codec,
3286                                                           spec->aa_mix_nid,
3287                                                           nums, conn);
3288                 }
3289         }
3290         return 0;
3291 }
3292
3293
3294 static int patch_vt1718S(struct hda_codec *codec)
3295 {
3296         struct via_spec *spec;
3297         int err;
3298
3299         /* create a codec specific record */
3300         spec = via_new_spec(codec);
3301         if (spec == NULL)
3302                 return -ENOMEM;
3303
3304         spec->aa_mix_nid = 0x21;
3305         override_mic_boost(codec, 0x2b, 0, 3, 40);
3306         override_mic_boost(codec, 0x29, 0, 3, 40);
3307         add_secret_dac_path(codec);
3308
3309         /* automatic parse from the BIOS config */
3310         err = via_parse_auto_config(codec);
3311         if (err < 0) {
3312                 via_free(codec);
3313                 return err;
3314         }
3315
3316         spec->init_verbs[spec->num_iverbs++] = vt1718S_init_verbs;
3317
3318         codec->patch_ops = via_patch_ops;
3319
3320         spec->set_widgets_power_state =  set_widgets_power_state_vt1718S;
3321
3322         return 0;
3323 }
3324
3325 /* Patch for VT1716S */
3326
3327 static int vt1716s_dmic_info(struct snd_kcontrol *kcontrol,
3328                             struct snd_ctl_elem_info *uinfo)
3329 {
3330         uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN;
3331         uinfo->count = 1;
3332         uinfo->value.integer.min = 0;
3333         uinfo->value.integer.max = 1;
3334         return 0;
3335 }
3336
3337 static int vt1716s_dmic_get(struct snd_kcontrol *kcontrol,
3338                            struct snd_ctl_elem_value *ucontrol)
3339 {
3340         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
3341         int index = 0;
3342
3343         index = snd_hda_codec_read(codec, 0x26, 0,
3344                                                AC_VERB_GET_CONNECT_SEL, 0);
3345         if (index != -1)
3346                 *ucontrol->value.integer.value = index;
3347
3348         return 0;
3349 }
3350
3351 static int vt1716s_dmic_put(struct snd_kcontrol *kcontrol,
3352                            struct snd_ctl_elem_value *ucontrol)
3353 {
3354         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
3355         struct via_spec *spec = codec->spec;
3356         int index = *ucontrol->value.integer.value;
3357
3358         snd_hda_codec_write(codec, 0x26, 0,
3359                                                AC_VERB_SET_CONNECT_SEL, index);
3360         spec->dmic_enabled = index;
3361         set_widgets_power_state(codec);
3362         return 1;
3363 }
3364
3365 static const struct snd_kcontrol_new vt1716s_dmic_mixer[] = {
3366         HDA_CODEC_VOLUME("Digital Mic Capture Volume", 0x22, 0x0, HDA_INPUT),
3367         {
3368          .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
3369          .name = "Digital Mic Capture Switch",
3370          .subdevice = HDA_SUBDEV_NID_FLAG | 0x26,
3371          .count = 1,
3372          .info = vt1716s_dmic_info,
3373          .get = vt1716s_dmic_get,
3374          .put = vt1716s_dmic_put,
3375          },
3376         {}                      /* end */
3377 };
3378
3379
3380 /* mono-out mixer elements */
3381 static const struct snd_kcontrol_new vt1716S_mono_out_mixer[] = {
3382         HDA_CODEC_MUTE("Mono Playback Switch", 0x2a, 0x0, HDA_OUTPUT),
3383         { } /* end */
3384 };
3385
3386 static const struct hda_verb vt1716S_init_verbs[] = {
3387         /* Enable Boost Volume backdoor */
3388         {0x1, 0xf8a, 0x80},
3389         /* don't bybass mixer */
3390         {0x1, 0xf88, 0xc0},
3391         /* Enable mono output */
3392         {0x1, 0xf90, 0x08},
3393         { }
3394 };
3395
3396 static void set_widgets_power_state_vt1716S(struct hda_codec *codec)
3397 {
3398         struct via_spec *spec = codec->spec;
3399         int imux_is_smixer;
3400         unsigned int parm;
3401         unsigned int mono_out, present;
3402         /* SW0 (17h) = stereo mixer */
3403         imux_is_smixer =
3404         (snd_hda_codec_read(codec, 0x17, 0,
3405                             AC_VERB_GET_CONNECT_SEL, 0x00) ==  5);
3406         /* inputs */
3407         /* PW 1/2/5 (1ah/1bh/1eh) */
3408         parm = AC_PWRST_D3;
3409         set_pin_power_state(codec, 0x1a, &parm);
3410         set_pin_power_state(codec, 0x1b, &parm);
3411         set_pin_power_state(codec, 0x1e, &parm);
3412         if (imux_is_smixer)
3413                 parm = AC_PWRST_D0;
3414         /* SW0 (17h), AIW0(13h) */
3415         snd_hda_codec_write(codec, 0x17, 0, AC_VERB_SET_POWER_STATE, parm);
3416         snd_hda_codec_write(codec, 0x13, 0, AC_VERB_SET_POWER_STATE, parm);
3417
3418         parm = AC_PWRST_D3;
3419         set_pin_power_state(codec, 0x1e, &parm);
3420         /* PW11 (22h) */
3421         if (spec->dmic_enabled)
3422                 set_pin_power_state(codec, 0x22, &parm);
3423         else
3424                 snd_hda_codec_write(codec, 0x22, 0,
3425                                     AC_VERB_SET_POWER_STATE, AC_PWRST_D3);
3426
3427         /* SW2(26h), AIW1(14h) */
3428         snd_hda_codec_write(codec, 0x26, 0, AC_VERB_SET_POWER_STATE, parm);
3429         snd_hda_codec_write(codec, 0x14, 0, AC_VERB_SET_POWER_STATE, parm);
3430
3431         /* outputs */
3432         /* PW0 (19h), SW1 (18h), AOW1 (11h) */
3433         parm = AC_PWRST_D3;
3434         set_pin_power_state(codec, 0x19, &parm);
3435         /* Smart 5.1 PW2(1bh) */
3436         if (spec->smart51_enabled)
3437                 set_pin_power_state(codec, 0x1b, &parm);
3438         snd_hda_codec_write(codec, 0x18, 0, AC_VERB_SET_POWER_STATE, parm);
3439         snd_hda_codec_write(codec, 0x11, 0, AC_VERB_SET_POWER_STATE, parm);
3440
3441         /* PW7 (23h), SW3 (27h), AOW3 (25h) */
3442         parm = AC_PWRST_D3;
3443         set_pin_power_state(codec, 0x23, &parm);
3444         /* Smart 5.1 PW1(1ah) */
3445         if (spec->smart51_enabled)
3446                 set_pin_power_state(codec, 0x1a, &parm);
3447         snd_hda_codec_write(codec, 0x27, 0, AC_VERB_SET_POWER_STATE, parm);
3448
3449         /* Smart 5.1 PW5(1eh) */
3450         if (spec->smart51_enabled)
3451                 set_pin_power_state(codec, 0x1e, &parm);
3452         snd_hda_codec_write(codec, 0x25, 0, AC_VERB_SET_POWER_STATE, parm);
3453
3454         /* Mono out */
3455         /* SW4(28h)->MW1(29h)-> PW12 (2ah)*/
3456         present = snd_hda_jack_detect(codec, 0x1c);
3457
3458         if (present)
3459                 mono_out = 0;
3460         else {
3461                 present = snd_hda_jack_detect(codec, 0x1d);
3462                 if (!spec->hp_independent_mode && present)
3463                         mono_out = 0;
3464                 else
3465                         mono_out = 1;
3466         }
3467         parm = mono_out ? AC_PWRST_D0 : AC_PWRST_D3;
3468         snd_hda_codec_write(codec, 0x28, 0, AC_VERB_SET_POWER_STATE, parm);
3469         snd_hda_codec_write(codec, 0x29, 0, AC_VERB_SET_POWER_STATE, parm);
3470         snd_hda_codec_write(codec, 0x2a, 0, AC_VERB_SET_POWER_STATE, parm);
3471
3472         /* PW 3/4 (1ch/1dh) */
3473         parm = AC_PWRST_D3;
3474         set_pin_power_state(codec, 0x1c, &parm);
3475         set_pin_power_state(codec, 0x1d, &parm);
3476         /* HP Independent Mode, power on AOW3 */
3477         if (spec->hp_independent_mode)
3478                 snd_hda_codec_write(codec, 0x25, 0,
3479                                     AC_VERB_SET_POWER_STATE, parm);
3480
3481         /* force to D0 for internal Speaker */
3482         /* MW0 (16h), AOW0 (10h) */
3483         snd_hda_codec_write(codec, 0x16, 0, AC_VERB_SET_POWER_STATE,
3484                             imux_is_smixer ? AC_PWRST_D0 : parm);
3485         snd_hda_codec_write(codec, 0x10, 0, AC_VERB_SET_POWER_STATE,
3486                             mono_out ? AC_PWRST_D0 : parm);
3487 }
3488
3489 static int patch_vt1716S(struct hda_codec *codec)
3490 {
3491         struct via_spec *spec;
3492         int err;
3493
3494         /* create a codec specific record */
3495         spec = via_new_spec(codec);
3496         if (spec == NULL)
3497                 return -ENOMEM;
3498
3499         spec->aa_mix_nid = 0x16;
3500         override_mic_boost(codec, 0x1a, 0, 3, 40);
3501         override_mic_boost(codec, 0x1e, 0, 3, 40);
3502
3503         /* automatic parse from the BIOS config */
3504         err = via_parse_auto_config(codec);
3505         if (err < 0) {
3506                 via_free(codec);
3507                 return err;
3508         }
3509
3510         spec->init_verbs[spec->num_iverbs++]  = vt1716S_init_verbs;
3511
3512         spec->mixers[spec->num_mixers] = vt1716s_dmic_mixer;
3513         spec->num_mixers++;
3514
3515         spec->mixers[spec->num_mixers++] = vt1716S_mono_out_mixer;
3516
3517         codec->patch_ops = via_patch_ops;
3518
3519         spec->set_widgets_power_state = set_widgets_power_state_vt1716S;
3520         return 0;
3521 }
3522
3523 /* for vt2002P */
3524
3525 static const struct hda_verb vt2002P_init_verbs[] = {
3526         /* Class-D speaker related verbs */
3527         {0x1, 0xfe0, 0x4},
3528         {0x1, 0xfe9, 0x80},
3529         {0x1, 0xfe2, 0x22},
3530         /* Enable Boost Volume backdoor */
3531         {0x1, 0xfb9, 0x24},
3532         /* Enable AOW0 to MW9 */
3533         {0x1, 0xfb8, 0x88},
3534         { }
3535 };
3536
3537 static const struct hda_verb vt1802_init_verbs[] = {
3538         /* Enable Boost Volume backdoor */
3539         {0x1, 0xfb9, 0x24},
3540         /* Enable AOW0 to MW9 */
3541         {0x1, 0xfb8, 0x88},
3542         { }
3543 };
3544
3545 static void set_widgets_power_state_vt2002P(struct hda_codec *codec)
3546 {
3547         struct via_spec *spec = codec->spec;
3548         int imux_is_smixer;
3549         unsigned int parm;
3550         unsigned int present;
3551         /* MUX9 (1eh) = stereo mixer */
3552         imux_is_smixer =
3553         snd_hda_codec_read(codec, 0x1e, 0, AC_VERB_GET_CONNECT_SEL, 0x00) == 3;
3554         /* inputs */
3555         /* PW 5/6/7 (29h/2ah/2bh) */
3556         parm = AC_PWRST_D3;
3557         set_pin_power_state(codec, 0x29, &parm);
3558         set_pin_power_state(codec, 0x2a, &parm);
3559         set_pin_power_state(codec, 0x2b, &parm);
3560         parm = AC_PWRST_D0;
3561         /* MUX9/10 (1eh/1fh), AIW 0/1 (10h/11h) */
3562         snd_hda_codec_write(codec, 0x1e, 0, AC_VERB_SET_POWER_STATE, parm);
3563         snd_hda_codec_write(codec, 0x1f, 0, AC_VERB_SET_POWER_STATE, parm);
3564         snd_hda_codec_write(codec, 0x10, 0, AC_VERB_SET_POWER_STATE, parm);
3565         snd_hda_codec_write(codec, 0x11, 0, AC_VERB_SET_POWER_STATE, parm);
3566
3567         /* outputs */
3568         /* AOW0 (8h)*/
3569         snd_hda_codec_write(codec, 0x8, 0, AC_VERB_SET_POWER_STATE, parm);
3570
3571         if (spec->codec_type == VT1802) {
3572                 /* PW4 (28h), MW4 (18h), MUX4(38h) */
3573                 parm = AC_PWRST_D3;
3574                 set_pin_power_state(codec, 0x28, &parm);
3575                 snd_hda_codec_write(codec, 0x18, 0,
3576                                     AC_VERB_SET_POWER_STATE, parm);
3577                 snd_hda_codec_write(codec, 0x38, 0,
3578                                     AC_VERB_SET_POWER_STATE, parm);
3579         } else {
3580                 /* PW4 (26h), MW4 (1ch), MUX4(37h) */
3581                 parm = AC_PWRST_D3;
3582                 set_pin_power_state(codec, 0x26, &parm);
3583                 snd_hda_codec_write(codec, 0x1c, 0,
3584                                     AC_VERB_SET_POWER_STATE, parm);
3585                 snd_hda_codec_write(codec, 0x37, 0,
3586                                     AC_VERB_SET_POWER_STATE, parm);
3587         }
3588
3589         if (spec->codec_type == VT1802) {
3590                 /* PW1 (25h), MW1 (15h), MUX1(35h), AOW1 (9h) */
3591                 parm = AC_PWRST_D3;
3592                 set_pin_power_state(codec, 0x25, &parm);
3593                 snd_hda_codec_write(codec, 0x15, 0,
3594                                     AC_VERB_SET_POWER_STATE, parm);
3595                 snd_hda_codec_write(codec, 0x35, 0,
3596                                     AC_VERB_SET_POWER_STATE, parm);
3597         } else {
3598                 /* PW1 (25h), MW1 (19h), MUX1(35h), AOW1 (9h) */
3599                 parm = AC_PWRST_D3;
3600                 set_pin_power_state(codec, 0x25, &parm);
3601                 snd_hda_codec_write(codec, 0x19, 0,
3602                                     AC_VERB_SET_POWER_STATE, parm);
3603                 snd_hda_codec_write(codec, 0x35, 0,
3604                                     AC_VERB_SET_POWER_STATE, parm);
3605         }
3606
3607         if (spec->hp_independent_mode)
3608                 snd_hda_codec_write(codec, 0x9, 0,
3609                                     AC_VERB_SET_POWER_STATE, AC_PWRST_D0);
3610
3611         /* Class-D */
3612         /* PW0 (24h), MW0(18h/14h), MUX0(34h) */
3613         present = snd_hda_jack_detect(codec, 0x25);
3614
3615         parm = AC_PWRST_D3;
3616         set_pin_power_state(codec, 0x24, &parm);
3617         parm = present ? AC_PWRST_D3 : AC_PWRST_D0;
3618         if (spec->codec_type == VT1802)
3619                 snd_hda_codec_write(codec, 0x14, 0,
3620                                     AC_VERB_SET_POWER_STATE, parm);
3621         else
3622                 snd_hda_codec_write(codec, 0x18, 0,
3623                                     AC_VERB_SET_POWER_STATE, parm);
3624         snd_hda_codec_write(codec, 0x34, 0, AC_VERB_SET_POWER_STATE, parm);
3625
3626         /* Mono Out */
3627         present = snd_hda_jack_detect(codec, 0x26);
3628
3629         parm = present ? AC_PWRST_D3 : AC_PWRST_D0;
3630         if (spec->codec_type == VT1802) {
3631                 /* PW15 (33h), MW8(1ch), MUX8(3ch) */
3632                 snd_hda_codec_write(codec, 0x33, 0,
3633                                     AC_VERB_SET_POWER_STATE, parm);
3634                 snd_hda_codec_write(codec, 0x1c, 0,
3635                                     AC_VERB_SET_POWER_STATE, parm);
3636                 snd_hda_codec_write(codec, 0x3c, 0,
3637                                     AC_VERB_SET_POWER_STATE, parm);
3638         } else {
3639                 /* PW15 (31h), MW8(17h), MUX8(3bh) */
3640                 snd_hda_codec_write(codec, 0x31, 0,
3641                                     AC_VERB_SET_POWER_STATE, parm);
3642                 snd_hda_codec_write(codec, 0x17, 0,
3643                                     AC_VERB_SET_POWER_STATE, parm);
3644                 snd_hda_codec_write(codec, 0x3b, 0,
3645                                     AC_VERB_SET_POWER_STATE, parm);
3646         }
3647         /* MW9 (21h) */
3648         if (imux_is_smixer || !is_aa_path_mute(codec))
3649                 snd_hda_codec_write(codec, 0x21, 0,
3650                                     AC_VERB_SET_POWER_STATE, AC_PWRST_D0);
3651         else
3652                 snd_hda_codec_write(codec, 0x21, 0,
3653                                     AC_VERB_SET_POWER_STATE, AC_PWRST_D3);
3654 }
3655
3656 /* patch for vt2002P */
3657 static int patch_vt2002P(struct hda_codec *codec)
3658 {
3659         struct via_spec *spec;
3660         int err;
3661
3662         /* create a codec specific record */
3663         spec = via_new_spec(codec);
3664         if (spec == NULL)
3665                 return -ENOMEM;
3666
3667         spec->aa_mix_nid = 0x21;
3668         override_mic_boost(codec, 0x2b, 0, 3, 40);
3669         override_mic_boost(codec, 0x29, 0, 3, 40);
3670         add_secret_dac_path(codec);
3671
3672         /* automatic parse from the BIOS config */
3673         err = via_parse_auto_config(codec);
3674         if (err < 0) {
3675                 via_free(codec);
3676                 return err;
3677         }
3678
3679         if (spec->codec_type == VT1802)
3680                 spec->init_verbs[spec->num_iverbs++] = vt1802_init_verbs;
3681         else
3682                 spec->init_verbs[spec->num_iverbs++] = vt2002P_init_verbs;
3683
3684         codec->patch_ops = via_patch_ops;
3685
3686         spec->set_widgets_power_state =  set_widgets_power_state_vt2002P;
3687         return 0;
3688 }
3689
3690 /* for vt1812 */
3691
3692 static const struct hda_verb vt1812_init_verbs[] = {
3693         /* Enable Boost Volume backdoor */
3694         {0x1, 0xfb9, 0x24},
3695         /* Enable AOW0 to MW9 */
3696         {0x1, 0xfb8, 0xa8},
3697         { }
3698 };
3699
3700 static void set_widgets_power_state_vt1812(struct hda_codec *codec)
3701 {
3702         struct via_spec *spec = codec->spec;
3703         int imux_is_smixer =
3704         snd_hda_codec_read(codec, 0x13, 0, AC_VERB_GET_CONNECT_SEL, 0x00) == 3;
3705         unsigned int parm;
3706         unsigned int present;
3707         /* MUX10 (1eh) = stereo mixer */
3708         imux_is_smixer =
3709         snd_hda_codec_read(codec, 0x1e, 0, AC_VERB_GET_CONNECT_SEL, 0x00) == 5;
3710         /* inputs */
3711         /* PW 5/6/7 (29h/2ah/2bh) */
3712         parm = AC_PWRST_D3;
3713         set_pin_power_state(codec, 0x29, &parm);
3714         set_pin_power_state(codec, 0x2a, &parm);
3715         set_pin_power_state(codec, 0x2b, &parm);
3716         parm = AC_PWRST_D0;
3717         /* MUX10/11 (1eh/1fh), AIW 0/1 (10h/11h) */
3718         snd_hda_codec_write(codec, 0x1e, 0, AC_VERB_SET_POWER_STATE, parm);
3719         snd_hda_codec_write(codec, 0x1f, 0, AC_VERB_SET_POWER_STATE, parm);
3720         snd_hda_codec_write(codec, 0x10, 0, AC_VERB_SET_POWER_STATE, parm);
3721         snd_hda_codec_write(codec, 0x11, 0, AC_VERB_SET_POWER_STATE, parm);
3722
3723         /* outputs */
3724         /* AOW0 (8h)*/
3725         snd_hda_codec_write(codec, 0x8, 0,
3726                             AC_VERB_SET_POWER_STATE, AC_PWRST_D0);
3727
3728         /* PW4 (28h), MW4 (18h), MUX4(38h) */
3729         parm = AC_PWRST_D3;
3730         set_pin_power_state(codec, 0x28, &parm);
3731         snd_hda_codec_write(codec, 0x18, 0, AC_VERB_SET_POWER_STATE, parm);
3732         snd_hda_codec_write(codec, 0x38, 0, AC_VERB_SET_POWER_STATE, parm);
3733
3734         /* PW1 (25h), MW1 (15h), MUX1(35h), AOW1 (9h) */
3735         parm = AC_PWRST_D3;
3736         set_pin_power_state(codec, 0x25, &parm);
3737         snd_hda_codec_write(codec, 0x15, 0, AC_VERB_SET_POWER_STATE, parm);
3738         snd_hda_codec_write(codec, 0x35, 0, AC_VERB_SET_POWER_STATE, parm);
3739         if (spec->hp_independent_mode)
3740                 snd_hda_codec_write(codec, 0x9, 0,
3741                                     AC_VERB_SET_POWER_STATE, AC_PWRST_D0);
3742
3743         /* Internal Speaker */
3744         /* PW0 (24h), MW0(14h), MUX0(34h) */
3745         present = snd_hda_jack_detect(codec, 0x25);
3746
3747         parm = AC_PWRST_D3;
3748         set_pin_power_state(codec, 0x24, &parm);
3749         if (present) {
3750                 snd_hda_codec_write(codec, 0x14, 0,
3751                                     AC_VERB_SET_POWER_STATE, AC_PWRST_D3);
3752                 snd_hda_codec_write(codec, 0x34, 0,
3753                                     AC_VERB_SET_POWER_STATE, AC_PWRST_D3);
3754         } else {
3755                 snd_hda_codec_write(codec, 0x14, 0,
3756                                     AC_VERB_SET_POWER_STATE, AC_PWRST_D0);
3757                 snd_hda_codec_write(codec, 0x34, 0,
3758                                     AC_VERB_SET_POWER_STATE, AC_PWRST_D0);
3759         }
3760
3761
3762         /* Mono Out */
3763         /* PW13 (31h), MW13(1ch), MUX13(3ch), MW14(3eh) */
3764         present = snd_hda_jack_detect(codec, 0x28);
3765
3766         parm = AC_PWRST_D3;
3767         set_pin_power_state(codec, 0x31, &parm);
3768         if (present) {
3769                 snd_hda_codec_write(codec, 0x1c, 0,
3770                                     AC_VERB_SET_POWER_STATE, AC_PWRST_D3);
3771                 snd_hda_codec_write(codec, 0x3c, 0,
3772                                     AC_VERB_SET_POWER_STATE, AC_PWRST_D3);
3773                 snd_hda_codec_write(codec, 0x3e, 0,
3774                                     AC_VERB_SET_POWER_STATE, AC_PWRST_D3);
3775         } else {
3776                 snd_hda_codec_write(codec, 0x1c, 0,
3777                                     AC_VERB_SET_POWER_STATE, AC_PWRST_D0);
3778                 snd_hda_codec_write(codec, 0x3c, 0,
3779                                     AC_VERB_SET_POWER_STATE, AC_PWRST_D0);
3780                 snd_hda_codec_write(codec, 0x3e, 0,
3781                                     AC_VERB_SET_POWER_STATE, AC_PWRST_D0);
3782         }
3783
3784         /* PW15 (33h), MW15 (1dh), MUX15(3dh) */
3785         parm = AC_PWRST_D3;
3786         set_pin_power_state(codec, 0x33, &parm);
3787         snd_hda_codec_write(codec, 0x1d, 0, AC_VERB_SET_POWER_STATE, parm);
3788         snd_hda_codec_write(codec, 0x3d, 0, AC_VERB_SET_POWER_STATE, parm);
3789
3790 }
3791
3792 /* patch for vt1812 */
3793 static int patch_vt1812(struct hda_codec *codec)
3794 {
3795         struct via_spec *spec;
3796         int err;
3797
3798         /* create a codec specific record */
3799         spec = via_new_spec(codec);
3800         if (spec == NULL)
3801                 return -ENOMEM;
3802
3803         spec->aa_mix_nid = 0x21;
3804         override_mic_boost(codec, 0x2b, 0, 3, 40);
3805         override_mic_boost(codec, 0x29, 0, 3, 40);
3806         add_secret_dac_path(codec);
3807
3808         /* automatic parse from the BIOS config */
3809         err = via_parse_auto_config(codec);
3810         if (err < 0) {
3811                 via_free(codec);
3812                 return err;
3813         }
3814
3815         spec->init_verbs[spec->num_iverbs++]  = vt1812_init_verbs;
3816
3817         codec->patch_ops = via_patch_ops;
3818
3819         spec->set_widgets_power_state =  set_widgets_power_state_vt1812;
3820         return 0;
3821 }
3822
3823 /*
3824  * patch entries
3825  */
3826 static const struct hda_codec_preset snd_hda_preset_via[] = {
3827         { .id = 0x11061708, .name = "VT1708", .patch = patch_vt1708},
3828         { .id = 0x11061709, .name = "VT1708", .patch = patch_vt1708},
3829         { .id = 0x1106170a, .name = "VT1708", .patch = patch_vt1708},
3830         { .id = 0x1106170b, .name = "VT1708", .patch = patch_vt1708},
3831         { .id = 0x1106e710, .name = "VT1709 10-Ch",
3832           .patch = patch_vt1709},
3833         { .id = 0x1106e711, .name = "VT1709 10-Ch",
3834           .patch = patch_vt1709},
3835         { .id = 0x1106e712, .name = "VT1709 10-Ch",
3836           .patch = patch_vt1709},
3837         { .id = 0x1106e713, .name = "VT1709 10-Ch",
3838           .patch = patch_vt1709},
3839         { .id = 0x1106e714, .name = "VT1709 6-Ch",
3840           .patch = patch_vt1709},
3841         { .id = 0x1106e715, .name = "VT1709 6-Ch",
3842           .patch = patch_vt1709},
3843         { .id = 0x1106e716, .name = "VT1709 6-Ch",
3844           .patch = patch_vt1709},
3845         { .id = 0x1106e717, .name = "VT1709 6-Ch",
3846           .patch = patch_vt1709},
3847         { .id = 0x1106e720, .name = "VT1708B 8-Ch",
3848           .patch = patch_vt1708B},
3849         { .id = 0x1106e721, .name = "VT1708B 8-Ch",
3850           .patch = patch_vt1708B},
3851         { .id = 0x1106e722, .name = "VT1708B 8-Ch",
3852           .patch = patch_vt1708B},
3853         { .id = 0x1106e723, .name = "VT1708B 8-Ch",
3854           .patch = patch_vt1708B},
3855         { .id = 0x1106e724, .name = "VT1708B 4-Ch",
3856           .patch = patch_vt1708B},
3857         { .id = 0x1106e725, .name = "VT1708B 4-Ch",
3858           .patch = patch_vt1708B},
3859         { .id = 0x1106e726, .name = "VT1708B 4-Ch",
3860           .patch = patch_vt1708B},
3861         { .id = 0x1106e727, .name = "VT1708B 4-Ch",
3862           .patch = patch_vt1708B},
3863         { .id = 0x11060397, .name = "VT1708S",
3864           .patch = patch_vt1708S},
3865         { .id = 0x11061397, .name = "VT1708S",
3866           .patch = patch_vt1708S},
3867         { .id = 0x11062397, .name = "VT1708S",
3868           .patch = patch_vt1708S},
3869         { .id = 0x11063397, .name = "VT1708S",
3870           .patch = patch_vt1708S},
3871         { .id = 0x11064397, .name = "VT1705",
3872           .patch = patch_vt1708S},
3873         { .id = 0x11065397, .name = "VT1708S",
3874           .patch = patch_vt1708S},
3875         { .id = 0x11066397, .name = "VT1708S",
3876           .patch = patch_vt1708S},
3877         { .id = 0x11067397, .name = "VT1708S",
3878           .patch = patch_vt1708S},
3879         { .id = 0x11060398, .name = "VT1702",
3880           .patch = patch_vt1702},
3881         { .id = 0x11061398, .name = "VT1702",
3882           .patch = patch_vt1702},
3883         { .id = 0x11062398, .name = "VT1702",
3884           .patch = patch_vt1702},
3885         { .id = 0x11063398, .name = "VT1702",
3886           .patch = patch_vt1702},
3887         { .id = 0x11064398, .name = "VT1702",
3888           .patch = patch_vt1702},
3889         { .id = 0x11065398, .name = "VT1702",
3890           .patch = patch_vt1702},
3891         { .id = 0x11066398, .name = "VT1702",
3892           .patch = patch_vt1702},
3893         { .id = 0x11067398, .name = "VT1702",
3894           .patch = patch_vt1702},
3895         { .id = 0x11060428, .name = "VT1718S",
3896           .patch = patch_vt1718S},
3897         { .id = 0x11064428, .name = "VT1718S",
3898           .patch = patch_vt1718S},
3899         { .id = 0x11060441, .name = "VT2020",
3900           .patch = patch_vt1718S},
3901         { .id = 0x11064441, .name = "VT1828S",
3902           .patch = patch_vt1718S},
3903         { .id = 0x11060433, .name = "VT1716S",
3904           .patch = patch_vt1716S},
3905         { .id = 0x1106a721, .name = "VT1716S",
3906           .patch = patch_vt1716S},
3907         { .id = 0x11060438, .name = "VT2002P", .patch = patch_vt2002P},
3908         { .id = 0x11064438, .name = "VT2002P", .patch = patch_vt2002P},
3909         { .id = 0x11060448, .name = "VT1812", .patch = patch_vt1812},
3910         { .id = 0x11060440, .name = "VT1818S",
3911           .patch = patch_vt1708S},
3912         { .id = 0x11060446, .name = "VT1802",
3913                 .patch = patch_vt2002P},
3914         { .id = 0x11068446, .name = "VT1802",
3915                 .patch = patch_vt2002P},
3916         {} /* terminator */
3917 };
3918
3919 MODULE_ALIAS("snd-hda-codec-id:1106*");
3920
3921 static struct hda_codec_preset_list via_list = {
3922         .preset = snd_hda_preset_via,
3923         .owner = THIS_MODULE,
3924 };
3925
3926 MODULE_LICENSE("GPL");
3927 MODULE_DESCRIPTION("VIA HD-audio codec");
3928
3929 static int __init patch_via_init(void)
3930 {
3931         return snd_hda_add_codec_preset(&via_list);
3932 }
3933
3934 static void __exit patch_via_exit(void)
3935 {
3936         snd_hda_delete_codec_preset(&via_list);
3937 }
3938
3939 module_init(patch_via_init)
3940 module_exit(patch_via_exit)