ALSA: hda - Add a fake mute feature
[pandora-kernel.git] / sound / pci / hda / patch_conexant.c
1 /*
2  * HD audio interface patch for Conexant HDA audio codec
3  *
4  * Copyright (c) 2006 Pototskiy Akex <alex.pototskiy@gmail.com>
5  *                    Takashi Iwai <tiwai@suse.de>
6  *                    Tobin Davis  <tdavis@dsl-only.net>
7  *
8  *  This driver is free software; you can redistribute it and/or modify
9  *  it under the terms of the GNU General Public License as published by
10  *  the Free Software Foundation; either version 2 of the License, or
11  *  (at your option) any later version.
12  *
13  *  This driver is distributed in the hope that it will be useful,
14  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
15  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  *  GNU General Public License for more details.
17  *
18  *  You should have received a copy of the GNU General Public License
19  *  along with this program; if not, write to the Free Software
20  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
21  */
22
23 #include <linux/init.h>
24 #include <linux/delay.h>
25 #include <linux/slab.h>
26 #include <linux/pci.h>
27 #include <linux/module.h>
28 #include <sound/core.h>
29 #include <sound/jack.h>
30
31 #include "hda_codec.h"
32 #include "hda_local.h"
33 #include "hda_beep.h"
34
35 #define CXT_PIN_DIR_IN              0x00
36 #define CXT_PIN_DIR_OUT             0x01
37 #define CXT_PIN_DIR_INOUT           0x02
38 #define CXT_PIN_DIR_IN_NOMICBIAS    0x03
39 #define CXT_PIN_DIR_INOUT_NOMICBIAS 0x04
40
41 #define CONEXANT_HP_EVENT       0x37
42 #define CONEXANT_MIC_EVENT      0x38
43 #define CONEXANT_LINE_EVENT     0x39
44
45 /* Conexant 5051 specific */
46
47 #define CXT5051_SPDIF_OUT       0x12
48 #define CXT5051_PORTB_EVENT     0x38
49 #define CXT5051_PORTC_EVENT     0x39
50
51 #define AUTO_MIC_PORTB          (1 << 1)
52 #define AUTO_MIC_PORTC          (1 << 2)
53
54 struct pin_dac_pair {
55         hda_nid_t pin;
56         hda_nid_t dac;
57         int type;
58 };
59
60 struct imux_info {
61         hda_nid_t pin;          /* input pin NID */
62         hda_nid_t adc;          /* connected ADC NID */ 
63         hda_nid_t boost;        /* optional boost volume NID */
64         int index;              /* corresponding to autocfg.input */
65 };
66
67 struct conexant_spec {
68
69         const struct snd_kcontrol_new *mixers[5];
70         int num_mixers;
71         hda_nid_t vmaster_nid;
72
73         const struct hda_verb *init_verbs[5];   /* initialization verbs
74                                                  * don't forget NULL
75                                                  * termination!
76                                                  */
77         unsigned int num_init_verbs;
78
79         /* playback */
80         struct hda_multi_out multiout;  /* playback set-up
81                                          * max_channels, dacs must be set
82                                          * dig_out_nid and hp_nid are optional
83                                          */
84         unsigned int cur_eapd;
85         unsigned int hp_present;
86         unsigned int line_present;
87         unsigned int auto_mic;
88         int auto_mic_ext;               /* imux_pins[] index for ext mic */
89         int auto_mic_dock;              /* imux_pins[] index for dock mic */
90         int auto_mic_int;               /* imux_pins[] index for int mic */
91         unsigned int need_dac_fix;
92         hda_nid_t slave_dig_outs[2];
93
94         /* capture */
95         unsigned int num_adc_nids;
96         const hda_nid_t *adc_nids;
97         hda_nid_t dig_in_nid;           /* digital-in NID; optional */
98
99         unsigned int cur_adc_idx;
100         hda_nid_t cur_adc;
101         unsigned int cur_adc_stream_tag;
102         unsigned int cur_adc_format;
103
104         const struct hda_pcm_stream *capture_stream;
105
106         /* capture source */
107         const struct hda_input_mux *input_mux;
108         const hda_nid_t *capsrc_nids;
109         unsigned int cur_mux[3];
110
111         /* channel model */
112         const struct hda_channel_mode *channel_mode;
113         int num_channel_mode;
114
115         /* PCM information */
116         struct hda_pcm pcm_rec[2];      /* used in build_pcms() */
117
118         unsigned int spdif_route;
119
120         /* dynamic controls, init_verbs and input_mux */
121         struct auto_pin_cfg autocfg;
122         struct hda_input_mux private_imux;
123         struct imux_info imux_info[HDA_MAX_NUM_INPUTS];
124         hda_nid_t private_adc_nids[HDA_MAX_NUM_INPUTS];
125         hda_nid_t private_dac_nids[AUTO_CFG_MAX_OUTS];
126         struct pin_dac_pair dac_info[8];
127         int dac_info_filled;
128
129         unsigned int port_d_mode;
130         unsigned int auto_mute:1;       /* used in auto-parser */
131         unsigned int detect_line:1;     /* Line-out detection enabled */
132         unsigned int automute_lines:1;  /* automute line-out as well */
133         unsigned int automute_hp_lo:1;  /* both HP and LO available */
134         unsigned int dell_automute:1;
135         unsigned int dell_vostro:1;
136         unsigned int ideapad:1;
137         unsigned int thinkpad:1;
138         unsigned int hp_laptop:1;
139         unsigned int asus:1;
140         unsigned int pin_eapd_ctrls:1;
141         unsigned int single_adc_amp:1;
142
143         unsigned int adc_switching:1;
144
145         unsigned int ext_mic_present;
146         unsigned int recording;
147         void (*capture_prepare)(struct hda_codec *codec);
148         void (*capture_cleanup)(struct hda_codec *codec);
149
150         /* OLPC XO-1.5 supports DC input mode (e.g. for use with analog sensors)
151          * through the microphone jack.
152          * When the user enables this through a mixer switch, both internal and
153          * external microphones are disabled. Gain is fixed at 0dB. In this mode,
154          * we also allow the bias to be configured through a separate mixer
155          * control. */
156         unsigned int dc_enable;
157         unsigned int dc_input_bias; /* offset into cxt5066_olpc_dc_bias */
158         unsigned int mic_boost; /* offset into cxt5066_analog_mic_boost */
159
160         unsigned int beep_amp;
161
162         /* extra EAPD pins */
163         unsigned int num_eapds;
164         hda_nid_t eapds[4];
165 };
166
167 static int conexant_playback_pcm_open(struct hda_pcm_stream *hinfo,
168                                       struct hda_codec *codec,
169                                       struct snd_pcm_substream *substream)
170 {
171         struct conexant_spec *spec = codec->spec;
172         return snd_hda_multi_out_analog_open(codec, &spec->multiout, substream,
173                                              hinfo);
174 }
175
176 static int conexant_playback_pcm_prepare(struct hda_pcm_stream *hinfo,
177                                          struct hda_codec *codec,
178                                          unsigned int stream_tag,
179                                          unsigned int format,
180                                          struct snd_pcm_substream *substream)
181 {
182         struct conexant_spec *spec = codec->spec;
183         return snd_hda_multi_out_analog_prepare(codec, &spec->multiout,
184                                                 stream_tag,
185                                                 format, substream);
186 }
187
188 static int conexant_playback_pcm_cleanup(struct hda_pcm_stream *hinfo,
189                                          struct hda_codec *codec,
190                                          struct snd_pcm_substream *substream)
191 {
192         struct conexant_spec *spec = codec->spec;
193         return snd_hda_multi_out_analog_cleanup(codec, &spec->multiout);
194 }
195
196 /*
197  * Digital out
198  */
199 static int conexant_dig_playback_pcm_open(struct hda_pcm_stream *hinfo,
200                                           struct hda_codec *codec,
201                                           struct snd_pcm_substream *substream)
202 {
203         struct conexant_spec *spec = codec->spec;
204         return snd_hda_multi_out_dig_open(codec, &spec->multiout);
205 }
206
207 static int conexant_dig_playback_pcm_close(struct hda_pcm_stream *hinfo,
208                                          struct hda_codec *codec,
209                                          struct snd_pcm_substream *substream)
210 {
211         struct conexant_spec *spec = codec->spec;
212         return snd_hda_multi_out_dig_close(codec, &spec->multiout);
213 }
214
215 static int conexant_dig_playback_pcm_prepare(struct hda_pcm_stream *hinfo,
216                                          struct hda_codec *codec,
217                                          unsigned int stream_tag,
218                                          unsigned int format,
219                                          struct snd_pcm_substream *substream)
220 {
221         struct conexant_spec *spec = codec->spec;
222         return snd_hda_multi_out_dig_prepare(codec, &spec->multiout,
223                                              stream_tag,
224                                              format, substream);
225 }
226
227 /*
228  * Analog capture
229  */
230 static int conexant_capture_pcm_prepare(struct hda_pcm_stream *hinfo,
231                                       struct hda_codec *codec,
232                                       unsigned int stream_tag,
233                                       unsigned int format,
234                                       struct snd_pcm_substream *substream)
235 {
236         struct conexant_spec *spec = codec->spec;
237         if (spec->capture_prepare)
238                 spec->capture_prepare(codec);
239         snd_hda_codec_setup_stream(codec, spec->adc_nids[substream->number],
240                                    stream_tag, 0, format);
241         return 0;
242 }
243
244 static int conexant_capture_pcm_cleanup(struct hda_pcm_stream *hinfo,
245                                       struct hda_codec *codec,
246                                       struct snd_pcm_substream *substream)
247 {
248         struct conexant_spec *spec = codec->spec;
249         snd_hda_codec_cleanup_stream(codec, spec->adc_nids[substream->number]);
250         if (spec->capture_cleanup)
251                 spec->capture_cleanup(codec);
252         return 0;
253 }
254
255
256
257 static const struct hda_pcm_stream conexant_pcm_analog_playback = {
258         .substreams = 1,
259         .channels_min = 2,
260         .channels_max = 2,
261         .nid = 0, /* fill later */
262         .ops = {
263                 .open = conexant_playback_pcm_open,
264                 .prepare = conexant_playback_pcm_prepare,
265                 .cleanup = conexant_playback_pcm_cleanup
266         },
267 };
268
269 static const struct hda_pcm_stream conexant_pcm_analog_capture = {
270         .substreams = 1,
271         .channels_min = 2,
272         .channels_max = 2,
273         .nid = 0, /* fill later */
274         .ops = {
275                 .prepare = conexant_capture_pcm_prepare,
276                 .cleanup = conexant_capture_pcm_cleanup
277         },
278 };
279
280
281 static const struct hda_pcm_stream conexant_pcm_digital_playback = {
282         .substreams = 1,
283         .channels_min = 2,
284         .channels_max = 2,
285         .nid = 0, /* fill later */
286         .ops = {
287                 .open = conexant_dig_playback_pcm_open,
288                 .close = conexant_dig_playback_pcm_close,
289                 .prepare = conexant_dig_playback_pcm_prepare
290         },
291 };
292
293 static const struct hda_pcm_stream conexant_pcm_digital_capture = {
294         .substreams = 1,
295         .channels_min = 2,
296         .channels_max = 2,
297         /* NID is set in alc_build_pcms */
298 };
299
300 static int cx5051_capture_pcm_prepare(struct hda_pcm_stream *hinfo,
301                                       struct hda_codec *codec,
302                                       unsigned int stream_tag,
303                                       unsigned int format,
304                                       struct snd_pcm_substream *substream)
305 {
306         struct conexant_spec *spec = codec->spec;
307         spec->cur_adc = spec->adc_nids[spec->cur_adc_idx];
308         spec->cur_adc_stream_tag = stream_tag;
309         spec->cur_adc_format = format;
310         snd_hda_codec_setup_stream(codec, spec->cur_adc, stream_tag, 0, format);
311         return 0;
312 }
313
314 static int cx5051_capture_pcm_cleanup(struct hda_pcm_stream *hinfo,
315                                       struct hda_codec *codec,
316                                       struct snd_pcm_substream *substream)
317 {
318         struct conexant_spec *spec = codec->spec;
319         snd_hda_codec_cleanup_stream(codec, spec->cur_adc);
320         spec->cur_adc = 0;
321         return 0;
322 }
323
324 static const struct hda_pcm_stream cx5051_pcm_analog_capture = {
325         .substreams = 1,
326         .channels_min = 2,
327         .channels_max = 2,
328         .nid = 0, /* fill later */
329         .ops = {
330                 .prepare = cx5051_capture_pcm_prepare,
331                 .cleanup = cx5051_capture_pcm_cleanup
332         },
333 };
334
335 static int conexant_build_pcms(struct hda_codec *codec)
336 {
337         struct conexant_spec *spec = codec->spec;
338         struct hda_pcm *info = spec->pcm_rec;
339
340         codec->num_pcms = 1;
341         codec->pcm_info = info;
342
343         info->name = "CONEXANT Analog";
344         info->stream[SNDRV_PCM_STREAM_PLAYBACK] = conexant_pcm_analog_playback;
345         info->stream[SNDRV_PCM_STREAM_PLAYBACK].channels_max =
346                 spec->multiout.max_channels;
347         info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid =
348                 spec->multiout.dac_nids[0];
349         if (spec->capture_stream)
350                 info->stream[SNDRV_PCM_STREAM_CAPTURE] = *spec->capture_stream;
351         else {
352                 if (codec->vendor_id == 0x14f15051)
353                         info->stream[SNDRV_PCM_STREAM_CAPTURE] =
354                                 cx5051_pcm_analog_capture;
355                 else {
356                         info->stream[SNDRV_PCM_STREAM_CAPTURE] =
357                                 conexant_pcm_analog_capture;
358                         info->stream[SNDRV_PCM_STREAM_CAPTURE].substreams =
359                                 spec->num_adc_nids;
360                 }
361         }
362         info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->adc_nids[0];
363
364         if (spec->multiout.dig_out_nid) {
365                 info++;
366                 codec->num_pcms++;
367                 info->name = "Conexant Digital";
368                 info->pcm_type = HDA_PCM_TYPE_SPDIF;
369                 info->stream[SNDRV_PCM_STREAM_PLAYBACK] =
370                         conexant_pcm_digital_playback;
371                 info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid =
372                         spec->multiout.dig_out_nid;
373                 if (spec->dig_in_nid) {
374                         info->stream[SNDRV_PCM_STREAM_CAPTURE] =
375                                 conexant_pcm_digital_capture;
376                         info->stream[SNDRV_PCM_STREAM_CAPTURE].nid =
377                                 spec->dig_in_nid;
378                 }
379                 if (spec->slave_dig_outs[0])
380                         codec->slave_dig_outs = spec->slave_dig_outs;
381         }
382
383         return 0;
384 }
385
386 static int conexant_mux_enum_info(struct snd_kcontrol *kcontrol,
387                                   struct snd_ctl_elem_info *uinfo)
388 {
389         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
390         struct conexant_spec *spec = codec->spec;
391
392         return snd_hda_input_mux_info(spec->input_mux, uinfo);
393 }
394
395 static int conexant_mux_enum_get(struct snd_kcontrol *kcontrol,
396                                  struct snd_ctl_elem_value *ucontrol)
397 {
398         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
399         struct conexant_spec *spec = codec->spec;
400         unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
401
402         ucontrol->value.enumerated.item[0] = spec->cur_mux[adc_idx];
403         return 0;
404 }
405
406 static int conexant_mux_enum_put(struct snd_kcontrol *kcontrol,
407                                  struct snd_ctl_elem_value *ucontrol)
408 {
409         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
410         struct conexant_spec *spec = codec->spec;
411         unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
412
413         return snd_hda_input_mux_put(codec, spec->input_mux, ucontrol,
414                                      spec->capsrc_nids[adc_idx],
415                                      &spec->cur_mux[adc_idx]);
416 }
417
418 static int conexant_init_jacks(struct hda_codec *codec)
419 {
420 #ifdef CONFIG_SND_HDA_INPUT_JACK
421         struct conexant_spec *spec = codec->spec;
422         int i;
423
424         for (i = 0; i < spec->num_init_verbs; i++) {
425                 const struct hda_verb *hv;
426
427                 hv = spec->init_verbs[i];
428                 while (hv->nid) {
429                         int err = 0;
430                         switch (hv->param ^ AC_USRSP_EN) {
431                         case CONEXANT_HP_EVENT:
432                                 err = snd_hda_input_jack_add(codec, hv->nid,
433                                                 SND_JACK_HEADPHONE, NULL);
434                                 snd_hda_input_jack_report(codec, hv->nid);
435                                 break;
436                         case CXT5051_PORTC_EVENT:
437                         case CONEXANT_MIC_EVENT:
438                                 err = snd_hda_input_jack_add(codec, hv->nid,
439                                                 SND_JACK_MICROPHONE, NULL);
440                                 snd_hda_input_jack_report(codec, hv->nid);
441                                 break;
442                         }
443                         if (err < 0)
444                                 return err;
445                         ++hv;
446                 }
447         }
448 #endif /* CONFIG_SND_HDA_INPUT_JACK */
449         return 0;
450 }
451
452 static void conexant_set_power(struct hda_codec *codec, hda_nid_t fg,
453                                unsigned int power_state)
454 {
455         if (power_state == AC_PWRST_D3)
456                 msleep(100);
457         snd_hda_codec_read(codec, fg, 0, AC_VERB_SET_POWER_STATE,
458                             power_state);
459         /* partial workaround for "azx_get_response timeout" */
460         if (power_state == AC_PWRST_D0)
461                 msleep(10);
462         snd_hda_codec_set_power_to_all(codec, fg, power_state, true);
463 }
464
465 static int conexant_init(struct hda_codec *codec)
466 {
467         struct conexant_spec *spec = codec->spec;
468         int i;
469
470         for (i = 0; i < spec->num_init_verbs; i++)
471                 snd_hda_sequence_write(codec, spec->init_verbs[i]);
472         return 0;
473 }
474
475 static void conexant_free(struct hda_codec *codec)
476 {
477         snd_hda_input_jack_free(codec);
478         snd_hda_detach_beep_device(codec);
479         kfree(codec->spec);
480 }
481
482 static const struct snd_kcontrol_new cxt_capture_mixers[] = {
483         {
484                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
485                 .name = "Capture Source",
486                 .info = conexant_mux_enum_info,
487                 .get = conexant_mux_enum_get,
488                 .put = conexant_mux_enum_put
489         },
490         {}
491 };
492
493 #ifdef CONFIG_SND_HDA_INPUT_BEEP
494 /* additional beep mixers; the actual parameters are overwritten at build */
495 static const struct snd_kcontrol_new cxt_beep_mixer[] = {
496         HDA_CODEC_VOLUME_MONO("Beep Playback Volume", 0, 1, 0, HDA_OUTPUT),
497         HDA_CODEC_MUTE_BEEP_MONO("Beep Playback Switch", 0, 1, 0, HDA_OUTPUT),
498         { } /* end */
499 };
500 #endif
501
502 static const char * const slave_vols[] = {
503         "Headphone Playback Volume",
504         "Speaker Playback Volume",
505         "Front Playback Volume",
506         "Surround Playback Volume",
507         "CLFE Playback Volume",
508         NULL
509 };
510
511 static const char * const slave_sws[] = {
512         "Headphone Playback Switch",
513         "Speaker Playback Switch",
514         "Front Playback Switch",
515         "Surround Playback Switch",
516         "CLFE Playback Switch",
517         NULL
518 };
519
520 static int conexant_build_controls(struct hda_codec *codec)
521 {
522         struct conexant_spec *spec = codec->spec;
523         unsigned int i;
524         int err;
525
526         for (i = 0; i < spec->num_mixers; i++) {
527                 err = snd_hda_add_new_ctls(codec, spec->mixers[i]);
528                 if (err < 0)
529                         return err;
530         }
531         if (spec->multiout.dig_out_nid) {
532                 err = snd_hda_create_spdif_out_ctls(codec,
533                                                     spec->multiout.dig_out_nid,
534                                                     spec->multiout.dig_out_nid);
535                 if (err < 0)
536                         return err;
537                 err = snd_hda_create_spdif_share_sw(codec,
538                                                     &spec->multiout);
539                 if (err < 0)
540                         return err;
541                 spec->multiout.share_spdif = 1;
542         } 
543         if (spec->dig_in_nid) {
544                 err = snd_hda_create_spdif_in_ctls(codec,spec->dig_in_nid);
545                 if (err < 0)
546                         return err;
547         }
548
549         /* if we have no master control, let's create it */
550         if (spec->vmaster_nid &&
551             !snd_hda_find_mixer_ctl(codec, "Master Playback Volume")) {
552                 unsigned int vmaster_tlv[4];
553                 snd_hda_set_vmaster_tlv(codec, spec->vmaster_nid,
554                                         HDA_OUTPUT, vmaster_tlv);
555                 err = snd_hda_add_vmaster(codec, "Master Playback Volume",
556                                           vmaster_tlv, slave_vols);
557                 if (err < 0)
558                         return err;
559         }
560         if (spec->vmaster_nid &&
561             !snd_hda_find_mixer_ctl(codec, "Master Playback Switch")) {
562                 err = snd_hda_add_vmaster(codec, "Master Playback Switch",
563                                           NULL, slave_sws);
564                 if (err < 0)
565                         return err;
566         }
567
568         if (spec->input_mux) {
569                 err = snd_hda_add_new_ctls(codec, cxt_capture_mixers);
570                 if (err < 0)
571                         return err;
572         }
573
574 #ifdef CONFIG_SND_HDA_INPUT_BEEP
575         /* create beep controls if needed */
576         if (spec->beep_amp) {
577                 const struct snd_kcontrol_new *knew;
578                 for (knew = cxt_beep_mixer; knew->name; knew++) {
579                         struct snd_kcontrol *kctl;
580                         kctl = snd_ctl_new1(knew, codec);
581                         if (!kctl)
582                                 return -ENOMEM;
583                         kctl->private_value = spec->beep_amp;
584                         err = snd_hda_ctl_add(codec, 0, kctl);
585                         if (err < 0)
586                                 return err;
587                 }
588         }
589 #endif
590
591         return 0;
592 }
593
594 #ifdef CONFIG_SND_HDA_POWER_SAVE
595 static int conexant_suspend(struct hda_codec *codec, pm_message_t state)
596 {
597         snd_hda_shutup_pins(codec);
598         return 0;
599 }
600 #endif
601
602 static const struct hda_codec_ops conexant_patch_ops = {
603         .build_controls = conexant_build_controls,
604         .build_pcms = conexant_build_pcms,
605         .init = conexant_init,
606         .free = conexant_free,
607         .set_power_state = conexant_set_power,
608 #ifdef CONFIG_SND_HDA_POWER_SAVE
609         .suspend = conexant_suspend,
610 #endif
611         .reboot_notify = snd_hda_shutup_pins,
612 };
613
614 #ifdef CONFIG_SND_HDA_INPUT_BEEP
615 #define set_beep_amp(spec, nid, idx, dir) \
616         ((spec)->beep_amp = HDA_COMPOSE_AMP_VAL(nid, 1, idx, dir))
617 #else
618 #define set_beep_amp(spec, nid, idx, dir) /* NOP */
619 #endif
620
621 static int patch_conexant_auto(struct hda_codec *codec);
622 /*
623  * EAPD control
624  * the private value = nid | (invert << 8)
625  */
626
627 #define cxt_eapd_info           snd_ctl_boolean_mono_info
628
629 static int cxt_eapd_get(struct snd_kcontrol *kcontrol,
630                              struct snd_ctl_elem_value *ucontrol)
631 {
632         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
633         struct conexant_spec *spec = codec->spec;
634         int invert = (kcontrol->private_value >> 8) & 1;
635         if (invert)
636                 ucontrol->value.integer.value[0] = !spec->cur_eapd;
637         else
638                 ucontrol->value.integer.value[0] = spec->cur_eapd;
639         return 0;
640
641 }
642
643 static int cxt_eapd_put(struct snd_kcontrol *kcontrol,
644                              struct snd_ctl_elem_value *ucontrol)
645 {
646         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
647         struct conexant_spec *spec = codec->spec;
648         int invert = (kcontrol->private_value >> 8) & 1;
649         hda_nid_t nid = kcontrol->private_value & 0xff;
650         unsigned int eapd;
651
652         eapd = !!ucontrol->value.integer.value[0];
653         if (invert)
654                 eapd = !eapd;
655         if (eapd == spec->cur_eapd)
656                 return 0;
657         
658         spec->cur_eapd = eapd;
659         snd_hda_codec_write_cache(codec, nid,
660                                   0, AC_VERB_SET_EAPD_BTLENABLE,
661                                   eapd ? 0x02 : 0x00);
662         return 1;
663 }
664
665 /* controls for test mode */
666 #ifdef CONFIG_SND_DEBUG
667
668 #define CXT_EAPD_SWITCH(xname, nid, mask) \
669         { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = 0,  \
670           .info = cxt_eapd_info, \
671           .get = cxt_eapd_get, \
672           .put = cxt_eapd_put, \
673           .private_value = nid | (mask<<16) }
674
675
676
677 static int conexant_ch_mode_info(struct snd_kcontrol *kcontrol,
678                                  struct snd_ctl_elem_info *uinfo)
679 {
680         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
681         struct conexant_spec *spec = codec->spec;
682         return snd_hda_ch_mode_info(codec, uinfo, spec->channel_mode,
683                                     spec->num_channel_mode);
684 }
685
686 static int conexant_ch_mode_get(struct snd_kcontrol *kcontrol,
687                                 struct snd_ctl_elem_value *ucontrol)
688 {
689         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
690         struct conexant_spec *spec = codec->spec;
691         return snd_hda_ch_mode_get(codec, ucontrol, spec->channel_mode,
692                                    spec->num_channel_mode,
693                                    spec->multiout.max_channels);
694 }
695
696 static int conexant_ch_mode_put(struct snd_kcontrol *kcontrol,
697                                 struct snd_ctl_elem_value *ucontrol)
698 {
699         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
700         struct conexant_spec *spec = codec->spec;
701         int err = snd_hda_ch_mode_put(codec, ucontrol, spec->channel_mode,
702                                       spec->num_channel_mode,
703                                       &spec->multiout.max_channels);
704         if (err >= 0 && spec->need_dac_fix)
705                 spec->multiout.num_dacs = spec->multiout.max_channels / 2;
706         return err;
707 }
708
709 #define CXT_PIN_MODE(xname, nid, dir) \
710         { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = 0,  \
711           .info = conexant_ch_mode_info, \
712           .get = conexant_ch_mode_get, \
713           .put = conexant_ch_mode_put, \
714           .private_value = nid | (dir<<16) }
715
716 #endif /* CONFIG_SND_DEBUG */
717
718 /* Conexant 5045 specific */
719
720 static const hda_nid_t cxt5045_dac_nids[1] = { 0x19 };
721 static const hda_nid_t cxt5045_adc_nids[1] = { 0x1a };
722 static const hda_nid_t cxt5045_capsrc_nids[1] = { 0x1a };
723 #define CXT5045_SPDIF_OUT       0x18
724
725 static const struct hda_channel_mode cxt5045_modes[1] = {
726         { 2, NULL },
727 };
728
729 static const struct hda_input_mux cxt5045_capture_source = {
730         .num_items = 2,
731         .items = {
732                 { "IntMic", 0x1 },
733                 { "ExtMic", 0x2 },
734         }
735 };
736
737 static const struct hda_input_mux cxt5045_capture_source_benq = {
738         .num_items = 5,
739         .items = {
740                 { "IntMic", 0x1 },
741                 { "ExtMic", 0x2 },
742                 { "LineIn", 0x3 },
743                 { "CD",     0x4 },
744                 { "Mixer",  0x0 },
745         }
746 };
747
748 static const struct hda_input_mux cxt5045_capture_source_hp530 = {
749         .num_items = 2,
750         .items = {
751                 { "ExtMic", 0x1 },
752                 { "IntMic", 0x2 },
753         }
754 };
755
756 /* turn on/off EAPD (+ mute HP) as a master switch */
757 static int cxt5045_hp_master_sw_put(struct snd_kcontrol *kcontrol,
758                                     struct snd_ctl_elem_value *ucontrol)
759 {
760         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
761         struct conexant_spec *spec = codec->spec;
762         unsigned int bits;
763
764         if (!cxt_eapd_put(kcontrol, ucontrol))
765                 return 0;
766
767         /* toggle internal speakers mute depending of presence of
768          * the headphone jack
769          */
770         bits = (!spec->hp_present && spec->cur_eapd) ? 0 : HDA_AMP_MUTE;
771         snd_hda_codec_amp_stereo(codec, 0x10, HDA_OUTPUT, 0,
772                                  HDA_AMP_MUTE, bits);
773
774         bits = spec->cur_eapd ? 0 : HDA_AMP_MUTE;
775         snd_hda_codec_amp_stereo(codec, 0x11, HDA_OUTPUT, 0,
776                                  HDA_AMP_MUTE, bits);
777         return 1;
778 }
779
780 /* bind volumes of both NID 0x10 and 0x11 */
781 static const struct hda_bind_ctls cxt5045_hp_bind_master_vol = {
782         .ops = &snd_hda_bind_vol,
783         .values = {
784                 HDA_COMPOSE_AMP_VAL(0x10, 3, 0, HDA_OUTPUT),
785                 HDA_COMPOSE_AMP_VAL(0x11, 3, 0, HDA_OUTPUT),
786                 0
787         },
788 };
789
790 /* toggle input of built-in and mic jack appropriately */
791 static void cxt5045_hp_automic(struct hda_codec *codec)
792 {
793         static const struct hda_verb mic_jack_on[] = {
794                 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
795                 {0x12, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},
796                 {}
797         };
798         static const struct hda_verb mic_jack_off[] = {
799                 {0x12, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
800                 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},
801                 {}
802         };
803         unsigned int present;
804
805         present = snd_hda_jack_detect(codec, 0x12);
806         if (present)
807                 snd_hda_sequence_write(codec, mic_jack_on);
808         else
809                 snd_hda_sequence_write(codec, mic_jack_off);
810 }
811
812
813 /* mute internal speaker if HP is plugged */
814 static void cxt5045_hp_automute(struct hda_codec *codec)
815 {
816         struct conexant_spec *spec = codec->spec;
817         unsigned int bits;
818
819         spec->hp_present = snd_hda_jack_detect(codec, 0x11);
820
821         bits = (spec->hp_present || !spec->cur_eapd) ? HDA_AMP_MUTE : 0; 
822         snd_hda_codec_amp_stereo(codec, 0x10, HDA_OUTPUT, 0,
823                                  HDA_AMP_MUTE, bits);
824 }
825
826 /* unsolicited event for HP jack sensing */
827 static void cxt5045_hp_unsol_event(struct hda_codec *codec,
828                                    unsigned int res)
829 {
830         res >>= 26;
831         switch (res) {
832         case CONEXANT_HP_EVENT:
833                 cxt5045_hp_automute(codec);
834                 break;
835         case CONEXANT_MIC_EVENT:
836                 cxt5045_hp_automic(codec);
837                 break;
838
839         }
840 }
841
842 static const struct snd_kcontrol_new cxt5045_mixers[] = {
843         HDA_CODEC_VOLUME("Internal Mic Capture Volume", 0x1a, 0x01, HDA_INPUT),
844         HDA_CODEC_MUTE("Internal Mic Capture Switch", 0x1a, 0x01, HDA_INPUT),
845         HDA_CODEC_VOLUME("Mic Capture Volume", 0x1a, 0x02, HDA_INPUT),
846         HDA_CODEC_MUTE("Mic Capture Switch", 0x1a, 0x02, HDA_INPUT),
847         HDA_CODEC_VOLUME("PCM Playback Volume", 0x17, 0x0, HDA_INPUT),
848         HDA_CODEC_MUTE("PCM Playback Switch", 0x17, 0x0, HDA_INPUT),
849         HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x17, 0x1, HDA_INPUT),
850         HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x17, 0x1, HDA_INPUT),
851         HDA_CODEC_VOLUME("Mic Playback Volume", 0x17, 0x2, HDA_INPUT),
852         HDA_CODEC_MUTE("Mic Playback Switch", 0x17, 0x2, HDA_INPUT),
853         HDA_BIND_VOL("Master Playback Volume", &cxt5045_hp_bind_master_vol),
854         {
855                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
856                 .name = "Master Playback Switch",
857                 .info = cxt_eapd_info,
858                 .get = cxt_eapd_get,
859                 .put = cxt5045_hp_master_sw_put,
860                 .private_value = 0x10,
861         },
862
863         {}
864 };
865
866 static const struct snd_kcontrol_new cxt5045_benq_mixers[] = {
867         HDA_CODEC_VOLUME("CD Capture Volume", 0x1a, 0x04, HDA_INPUT),
868         HDA_CODEC_MUTE("CD Capture Switch", 0x1a, 0x04, HDA_INPUT),
869         HDA_CODEC_VOLUME("CD Playback Volume", 0x17, 0x4, HDA_INPUT),
870         HDA_CODEC_MUTE("CD Playback Switch", 0x17, 0x4, HDA_INPUT),
871
872         HDA_CODEC_VOLUME("Line In Capture Volume", 0x1a, 0x03, HDA_INPUT),
873         HDA_CODEC_MUTE("Line In Capture Switch", 0x1a, 0x03, HDA_INPUT),
874         HDA_CODEC_VOLUME("Line In Playback Volume", 0x17, 0x3, HDA_INPUT),
875         HDA_CODEC_MUTE("Line In Playback Switch", 0x17, 0x3, HDA_INPUT),
876
877         HDA_CODEC_VOLUME("Mixer Capture Volume", 0x1a, 0x0, HDA_INPUT),
878         HDA_CODEC_MUTE("Mixer Capture Switch", 0x1a, 0x0, HDA_INPUT),
879
880         {}
881 };
882
883 static const struct snd_kcontrol_new cxt5045_mixers_hp530[] = {
884         HDA_CODEC_VOLUME("Internal Mic Capture Volume", 0x1a, 0x02, HDA_INPUT),
885         HDA_CODEC_MUTE("Internal Mic Capture Switch", 0x1a, 0x02, HDA_INPUT),
886         HDA_CODEC_VOLUME("Mic Capture Volume", 0x1a, 0x01, HDA_INPUT),
887         HDA_CODEC_MUTE("Mic Capture Switch", 0x1a, 0x01, HDA_INPUT),
888         HDA_CODEC_VOLUME("PCM Playback Volume", 0x17, 0x0, HDA_INPUT),
889         HDA_CODEC_MUTE("PCM Playback Switch", 0x17, 0x0, HDA_INPUT),
890         HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x17, 0x2, HDA_INPUT),
891         HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x17, 0x2, HDA_INPUT),
892         HDA_CODEC_VOLUME("Mic Playback Volume", 0x17, 0x1, HDA_INPUT),
893         HDA_CODEC_MUTE("Mic Playback Switch", 0x17, 0x1, HDA_INPUT),
894         HDA_BIND_VOL("Master Playback Volume", &cxt5045_hp_bind_master_vol),
895         {
896                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
897                 .name = "Master Playback Switch",
898                 .info = cxt_eapd_info,
899                 .get = cxt_eapd_get,
900                 .put = cxt5045_hp_master_sw_put,
901                 .private_value = 0x10,
902         },
903
904         {}
905 };
906
907 static const struct hda_verb cxt5045_init_verbs[] = {
908         /* Line in, Mic */
909         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN|AC_PINCTL_VREF_80 },
910         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN|AC_PINCTL_VREF_80 },
911         /* HP, Amp  */
912         {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
913         {0x10, AC_VERB_SET_CONNECT_SEL, 0x1},
914         {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
915         {0x11, AC_VERB_SET_CONNECT_SEL, 0x1},
916         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
917         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
918         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
919         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
920         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
921         /* Record selector: Internal mic */
922         {0x1a, AC_VERB_SET_CONNECT_SEL,0x1},
923         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE,
924          AC_AMP_SET_INPUT|AC_AMP_SET_RIGHT|AC_AMP_SET_LEFT|0x17},
925         /* SPDIF route: PCM */
926         {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
927         { 0x13, AC_VERB_SET_CONNECT_SEL, 0x0 },
928         /* EAPD */
929         {0x10, AC_VERB_SET_EAPD_BTLENABLE, 0x2 }, /* default on */ 
930         { } /* end */
931 };
932
933 static const struct hda_verb cxt5045_benq_init_verbs[] = {
934         /* Internal Mic, Mic */
935         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN|AC_PINCTL_VREF_80 },
936         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN|AC_PINCTL_VREF_80 },
937         /* Line In,HP, Amp  */
938         {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
939         {0x10, AC_VERB_SET_CONNECT_SEL, 0x1},
940         {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
941         {0x11, AC_VERB_SET_CONNECT_SEL, 0x1},
942         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
943         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
944         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
945         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
946         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
947         /* Record selector: Internal mic */
948         {0x1a, AC_VERB_SET_CONNECT_SEL, 0x1},
949         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE,
950          AC_AMP_SET_INPUT|AC_AMP_SET_RIGHT|AC_AMP_SET_LEFT|0x17},
951         /* SPDIF route: PCM */
952         {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
953         {0x13, AC_VERB_SET_CONNECT_SEL, 0x0},
954         /* EAPD */
955         {0x10, AC_VERB_SET_EAPD_BTLENABLE, 0x2}, /* default on */
956         { } /* end */
957 };
958
959 static const struct hda_verb cxt5045_hp_sense_init_verbs[] = {
960         /* pin sensing on HP jack */
961         {0x11, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | CONEXANT_HP_EVENT},
962         { } /* end */
963 };
964
965 static const struct hda_verb cxt5045_mic_sense_init_verbs[] = {
966         /* pin sensing on HP jack */
967         {0x12, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | CONEXANT_MIC_EVENT},
968         { } /* end */
969 };
970
971 #ifdef CONFIG_SND_DEBUG
972 /* Test configuration for debugging, modelled after the ALC260 test
973  * configuration.
974  */
975 static const struct hda_input_mux cxt5045_test_capture_source = {
976         .num_items = 5,
977         .items = {
978                 { "MIXER", 0x0 },
979                 { "MIC1 pin", 0x1 },
980                 { "LINE1 pin", 0x2 },
981                 { "HP-OUT pin", 0x3 },
982                 { "CD pin", 0x4 },
983         },
984 };
985
986 static const struct snd_kcontrol_new cxt5045_test_mixer[] = {
987
988         /* Output controls */
989         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x10, 0x0, HDA_OUTPUT),
990         HDA_CODEC_MUTE("Speaker Playback Switch", 0x10, 0x0, HDA_OUTPUT),
991         HDA_CODEC_VOLUME("Node 11 Playback Volume", 0x11, 0x0, HDA_OUTPUT),
992         HDA_CODEC_MUTE("Node 11 Playback Switch", 0x11, 0x0, HDA_OUTPUT),
993         HDA_CODEC_VOLUME("Node 12 Playback Volume", 0x12, 0x0, HDA_OUTPUT),
994         HDA_CODEC_MUTE("Node 12 Playback Switch", 0x12, 0x0, HDA_OUTPUT),
995         
996         /* Modes for retasking pin widgets */
997         CXT_PIN_MODE("HP-OUT pin mode", 0x11, CXT_PIN_DIR_INOUT),
998         CXT_PIN_MODE("LINE1 pin mode", 0x12, CXT_PIN_DIR_INOUT),
999
1000         /* EAPD Switch Control */
1001         CXT_EAPD_SWITCH("External Amplifier", 0x10, 0x0),
1002
1003         /* Loopback mixer controls */
1004
1005         HDA_CODEC_VOLUME("Mixer-1 Volume", 0x17, 0x0, HDA_INPUT),
1006         HDA_CODEC_MUTE("Mixer-1 Switch", 0x17, 0x0, HDA_INPUT),
1007         HDA_CODEC_VOLUME("Mixer-2 Volume", 0x17, 0x1, HDA_INPUT),
1008         HDA_CODEC_MUTE("Mixer-2 Switch", 0x17, 0x1, HDA_INPUT),
1009         HDA_CODEC_VOLUME("Mixer-3 Volume", 0x17, 0x2, HDA_INPUT),
1010         HDA_CODEC_MUTE("Mixer-3 Switch", 0x17, 0x2, HDA_INPUT),
1011         HDA_CODEC_VOLUME("Mixer-4 Volume", 0x17, 0x3, HDA_INPUT),
1012         HDA_CODEC_MUTE("Mixer-4 Switch", 0x17, 0x3, HDA_INPUT),
1013         HDA_CODEC_VOLUME("Mixer-5 Volume", 0x17, 0x4, HDA_INPUT),
1014         HDA_CODEC_MUTE("Mixer-5 Switch", 0x17, 0x4, HDA_INPUT),
1015         {
1016                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1017                 .name = "Input Source",
1018                 .info = conexant_mux_enum_info,
1019                 .get = conexant_mux_enum_get,
1020                 .put = conexant_mux_enum_put,
1021         },
1022         /* Audio input controls */
1023         HDA_CODEC_VOLUME("Input-1 Volume", 0x1a, 0x0, HDA_INPUT),
1024         HDA_CODEC_MUTE("Input-1 Switch", 0x1a, 0x0, HDA_INPUT),
1025         HDA_CODEC_VOLUME("Input-2 Volume", 0x1a, 0x1, HDA_INPUT),
1026         HDA_CODEC_MUTE("Input-2 Switch", 0x1a, 0x1, HDA_INPUT),
1027         HDA_CODEC_VOLUME("Input-3 Volume", 0x1a, 0x2, HDA_INPUT),
1028         HDA_CODEC_MUTE("Input-3 Switch", 0x1a, 0x2, HDA_INPUT),
1029         HDA_CODEC_VOLUME("Input-4 Volume", 0x1a, 0x3, HDA_INPUT),
1030         HDA_CODEC_MUTE("Input-4 Switch", 0x1a, 0x3, HDA_INPUT),
1031         HDA_CODEC_VOLUME("Input-5 Volume", 0x1a, 0x4, HDA_INPUT),
1032         HDA_CODEC_MUTE("Input-5 Switch", 0x1a, 0x4, HDA_INPUT),
1033         { } /* end */
1034 };
1035
1036 static const struct hda_verb cxt5045_test_init_verbs[] = {
1037         /* Set connections */
1038         { 0x10, AC_VERB_SET_CONNECT_SEL, 0x0 },
1039         { 0x11, AC_VERB_SET_CONNECT_SEL, 0x0 },
1040         { 0x12, AC_VERB_SET_CONNECT_SEL, 0x0 },
1041         /* Enable retasking pins as output, initially without power amp */
1042         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1043         {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1044
1045         /* Disable digital (SPDIF) pins initially, but users can enable
1046          * them via a mixer switch.  In the case of SPDIF-out, this initverb
1047          * payload also sets the generation to 0, output to be in "consumer"
1048          * PCM format, copyright asserted, no pre-emphasis and no validity
1049          * control.
1050          */
1051         {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1052         {0x18, AC_VERB_SET_DIGI_CONVERT_1, 0},
1053
1054         /* Start with output sum widgets muted and their output gains at min */
1055         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
1056         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
1057
1058         /* Unmute retasking pin widget output buffers since the default
1059          * state appears to be output.  As the pin mode is changed by the
1060          * user the pin mode control will take care of enabling the pin's
1061          * input/output buffers as needed.
1062          */
1063         {0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1064         {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1065
1066         /* Mute capture amp left and right */
1067         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
1068
1069         /* Set ADC connection select to match default mixer setting (mic1
1070          * pin)
1071          */
1072         {0x1a, AC_VERB_SET_CONNECT_SEL, 0x00},
1073         {0x17, AC_VERB_SET_CONNECT_SEL, 0x00},
1074
1075         /* Mute all inputs to mixer widget (even unconnected ones) */
1076         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, /* Mixer pin */
1077         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, /* Mic1 pin */
1078         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, /* Line pin */
1079         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, /* HP pin */
1080         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, /* CD pin */
1081
1082         { }
1083 };
1084 #endif
1085
1086
1087 /* initialize jack-sensing, too */
1088 static int cxt5045_init(struct hda_codec *codec)
1089 {
1090         conexant_init(codec);
1091         cxt5045_hp_automute(codec);
1092         return 0;
1093 }
1094
1095
1096 enum {
1097         CXT5045_LAPTOP_HPSENSE,
1098         CXT5045_LAPTOP_MICSENSE,
1099         CXT5045_LAPTOP_HPMICSENSE,
1100         CXT5045_BENQ,
1101         CXT5045_LAPTOP_HP530,
1102 #ifdef CONFIG_SND_DEBUG
1103         CXT5045_TEST,
1104 #endif
1105         CXT5045_AUTO,
1106         CXT5045_MODELS
1107 };
1108
1109 static const char * const cxt5045_models[CXT5045_MODELS] = {
1110         [CXT5045_LAPTOP_HPSENSE]        = "laptop-hpsense",
1111         [CXT5045_LAPTOP_MICSENSE]       = "laptop-micsense",
1112         [CXT5045_LAPTOP_HPMICSENSE]     = "laptop-hpmicsense",
1113         [CXT5045_BENQ]                  = "benq",
1114         [CXT5045_LAPTOP_HP530]          = "laptop-hp530",
1115 #ifdef CONFIG_SND_DEBUG
1116         [CXT5045_TEST]          = "test",
1117 #endif
1118         [CXT5045_AUTO]                  = "auto",
1119 };
1120
1121 static const struct snd_pci_quirk cxt5045_cfg_tbl[] = {
1122         SND_PCI_QUIRK(0x103c, 0x30d5, "HP 530", CXT5045_LAPTOP_HP530),
1123         SND_PCI_QUIRK(0x1179, 0xff31, "Toshiba P105", CXT5045_LAPTOP_MICSENSE),
1124         SND_PCI_QUIRK(0x152d, 0x0753, "Benq R55E", CXT5045_BENQ),
1125         SND_PCI_QUIRK(0x1734, 0x10ad, "Fujitsu Si1520", CXT5045_LAPTOP_MICSENSE),
1126         SND_PCI_QUIRK(0x1734, 0x10cb, "Fujitsu Si3515", CXT5045_LAPTOP_HPMICSENSE),
1127         SND_PCI_QUIRK(0x1734, 0x110e, "Fujitsu V5505",
1128                       CXT5045_LAPTOP_HPMICSENSE),
1129         SND_PCI_QUIRK(0x1509, 0x1e40, "FIC", CXT5045_LAPTOP_HPMICSENSE),
1130         SND_PCI_QUIRK(0x1509, 0x2f05, "FIC", CXT5045_LAPTOP_HPMICSENSE),
1131         SND_PCI_QUIRK(0x1509, 0x2f06, "FIC", CXT5045_LAPTOP_HPMICSENSE),
1132         SND_PCI_QUIRK_MASK(0x1631, 0xff00, 0xc100, "Packard Bell",
1133                            CXT5045_LAPTOP_HPMICSENSE),
1134         SND_PCI_QUIRK(0x8086, 0x2111, "Conexant Reference board", CXT5045_LAPTOP_HPSENSE),
1135         {}
1136 };
1137
1138 static int patch_cxt5045(struct hda_codec *codec)
1139 {
1140         struct conexant_spec *spec;
1141         int board_config;
1142
1143         board_config = snd_hda_check_board_config(codec, CXT5045_MODELS,
1144                                                   cxt5045_models,
1145                                                   cxt5045_cfg_tbl);
1146         if (board_config < 0)
1147                 board_config = CXT5045_AUTO; /* model=auto as default */
1148         if (board_config == CXT5045_AUTO)
1149                 return patch_conexant_auto(codec);
1150
1151         spec = kzalloc(sizeof(*spec), GFP_KERNEL);
1152         if (!spec)
1153                 return -ENOMEM;
1154         codec->spec = spec;
1155         codec->pin_amp_workaround = 1;
1156
1157         spec->multiout.max_channels = 2;
1158         spec->multiout.num_dacs = ARRAY_SIZE(cxt5045_dac_nids);
1159         spec->multiout.dac_nids = cxt5045_dac_nids;
1160         spec->multiout.dig_out_nid = CXT5045_SPDIF_OUT;
1161         spec->num_adc_nids = 1;
1162         spec->adc_nids = cxt5045_adc_nids;
1163         spec->capsrc_nids = cxt5045_capsrc_nids;
1164         spec->input_mux = &cxt5045_capture_source;
1165         spec->num_mixers = 1;
1166         spec->mixers[0] = cxt5045_mixers;
1167         spec->num_init_verbs = 1;
1168         spec->init_verbs[0] = cxt5045_init_verbs;
1169         spec->spdif_route = 0;
1170         spec->num_channel_mode = ARRAY_SIZE(cxt5045_modes);
1171         spec->channel_mode = cxt5045_modes;
1172
1173         set_beep_amp(spec, 0x16, 0, 1);
1174
1175         codec->patch_ops = conexant_patch_ops;
1176
1177         switch (board_config) {
1178         case CXT5045_LAPTOP_HPSENSE:
1179                 codec->patch_ops.unsol_event = cxt5045_hp_unsol_event;
1180                 spec->input_mux = &cxt5045_capture_source;
1181                 spec->num_init_verbs = 2;
1182                 spec->init_verbs[1] = cxt5045_hp_sense_init_verbs;
1183                 spec->mixers[0] = cxt5045_mixers;
1184                 codec->patch_ops.init = cxt5045_init;
1185                 break;
1186         case CXT5045_LAPTOP_MICSENSE:
1187                 codec->patch_ops.unsol_event = cxt5045_hp_unsol_event;
1188                 spec->input_mux = &cxt5045_capture_source;
1189                 spec->num_init_verbs = 2;
1190                 spec->init_verbs[1] = cxt5045_mic_sense_init_verbs;
1191                 spec->mixers[0] = cxt5045_mixers;
1192                 codec->patch_ops.init = cxt5045_init;
1193                 break;
1194         default:
1195         case CXT5045_LAPTOP_HPMICSENSE:
1196                 codec->patch_ops.unsol_event = cxt5045_hp_unsol_event;
1197                 spec->input_mux = &cxt5045_capture_source;
1198                 spec->num_init_verbs = 3;
1199                 spec->init_verbs[1] = cxt5045_hp_sense_init_verbs;
1200                 spec->init_verbs[2] = cxt5045_mic_sense_init_verbs;
1201                 spec->mixers[0] = cxt5045_mixers;
1202                 codec->patch_ops.init = cxt5045_init;
1203                 break;
1204         case CXT5045_BENQ:
1205                 codec->patch_ops.unsol_event = cxt5045_hp_unsol_event;
1206                 spec->input_mux = &cxt5045_capture_source_benq;
1207                 spec->num_init_verbs = 1;
1208                 spec->init_verbs[0] = cxt5045_benq_init_verbs;
1209                 spec->mixers[0] = cxt5045_mixers;
1210                 spec->mixers[1] = cxt5045_benq_mixers;
1211                 spec->num_mixers = 2;
1212                 codec->patch_ops.init = cxt5045_init;
1213                 break;
1214         case CXT5045_LAPTOP_HP530:
1215                 codec->patch_ops.unsol_event = cxt5045_hp_unsol_event;
1216                 spec->input_mux = &cxt5045_capture_source_hp530;
1217                 spec->num_init_verbs = 2;
1218                 spec->init_verbs[1] = cxt5045_hp_sense_init_verbs;
1219                 spec->mixers[0] = cxt5045_mixers_hp530;
1220                 codec->patch_ops.init = cxt5045_init;
1221                 break;
1222 #ifdef CONFIG_SND_DEBUG
1223         case CXT5045_TEST:
1224                 spec->input_mux = &cxt5045_test_capture_source;
1225                 spec->mixers[0] = cxt5045_test_mixer;
1226                 spec->init_verbs[0] = cxt5045_test_init_verbs;
1227                 break;
1228                 
1229 #endif  
1230         }
1231
1232         switch (codec->subsystem_id >> 16) {
1233         case 0x103c:
1234         case 0x1631:
1235         case 0x1734:
1236         case 0x17aa:
1237                 /* HP, Packard Bell, Fujitsu-Siemens & Lenovo laptops have
1238                  * really bad sound over 0dB on NID 0x17. Fix max PCM level to
1239                  * 0 dB (originally it has 0x2b steps with 0dB offset 0x14)
1240                  */
1241                 snd_hda_override_amp_caps(codec, 0x17, HDA_INPUT,
1242                                           (0x14 << AC_AMPCAP_OFFSET_SHIFT) |
1243                                           (0x14 << AC_AMPCAP_NUM_STEPS_SHIFT) |
1244                                           (0x05 << AC_AMPCAP_STEP_SIZE_SHIFT) |
1245                                           (1 << AC_AMPCAP_MUTE_SHIFT));
1246                 break;
1247         }
1248
1249         if (spec->beep_amp)
1250                 snd_hda_attach_beep_device(codec, spec->beep_amp);
1251
1252         return 0;
1253 }
1254
1255
1256 /* Conexant 5047 specific */
1257 #define CXT5047_SPDIF_OUT       0x11
1258
1259 static const hda_nid_t cxt5047_dac_nids[1] = { 0x10 }; /* 0x1c */
1260 static const hda_nid_t cxt5047_adc_nids[1] = { 0x12 };
1261 static const hda_nid_t cxt5047_capsrc_nids[1] = { 0x1a };
1262
1263 static const struct hda_channel_mode cxt5047_modes[1] = {
1264         { 2, NULL },
1265 };
1266
1267 static const struct hda_input_mux cxt5047_toshiba_capture_source = {
1268         .num_items = 2,
1269         .items = {
1270                 { "ExtMic", 0x2 },
1271                 { "Line-In", 0x1 },
1272         }
1273 };
1274
1275 /* turn on/off EAPD (+ mute HP) as a master switch */
1276 static int cxt5047_hp_master_sw_put(struct snd_kcontrol *kcontrol,
1277                                     struct snd_ctl_elem_value *ucontrol)
1278 {
1279         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1280         struct conexant_spec *spec = codec->spec;
1281         unsigned int bits;
1282
1283         if (!cxt_eapd_put(kcontrol, ucontrol))
1284                 return 0;
1285
1286         /* toggle internal speakers mute depending of presence of
1287          * the headphone jack
1288          */
1289         bits = (!spec->hp_present && spec->cur_eapd) ? 0 : HDA_AMP_MUTE;
1290         /* NOTE: Conexat codec needs the index for *OUTPUT* amp of
1291          * pin widgets unlike other codecs.  In this case, we need to
1292          * set index 0x01 for the volume from the mixer amp 0x19.
1293          */
1294         snd_hda_codec_amp_stereo(codec, 0x1d, HDA_OUTPUT, 0x01,
1295                                  HDA_AMP_MUTE, bits);
1296         bits = spec->cur_eapd ? 0 : HDA_AMP_MUTE;
1297         snd_hda_codec_amp_stereo(codec, 0x13, HDA_OUTPUT, 0,
1298                                  HDA_AMP_MUTE, bits);
1299         return 1;
1300 }
1301
1302 /* mute internal speaker if HP is plugged */
1303 static void cxt5047_hp_automute(struct hda_codec *codec)
1304 {
1305         struct conexant_spec *spec = codec->spec;
1306         unsigned int bits;
1307
1308         spec->hp_present = snd_hda_jack_detect(codec, 0x13);
1309
1310         bits = (spec->hp_present || !spec->cur_eapd) ? HDA_AMP_MUTE : 0;
1311         /* See the note in cxt5047_hp_master_sw_put */
1312         snd_hda_codec_amp_stereo(codec, 0x1d, HDA_OUTPUT, 0x01,
1313                                  HDA_AMP_MUTE, bits);
1314 }
1315
1316 /* toggle input of built-in and mic jack appropriately */
1317 static void cxt5047_hp_automic(struct hda_codec *codec)
1318 {
1319         static const struct hda_verb mic_jack_on[] = {
1320                 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
1321                 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1322                 {}
1323         };
1324         static const struct hda_verb mic_jack_off[] = {
1325                 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
1326                 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1327                 {}
1328         };
1329         unsigned int present;
1330
1331         present = snd_hda_jack_detect(codec, 0x15);
1332         if (present)
1333                 snd_hda_sequence_write(codec, mic_jack_on);
1334         else
1335                 snd_hda_sequence_write(codec, mic_jack_off);
1336 }
1337
1338 /* unsolicited event for HP jack sensing */
1339 static void cxt5047_hp_unsol_event(struct hda_codec *codec,
1340                                   unsigned int res)
1341 {
1342         switch (res >> 26) {
1343         case CONEXANT_HP_EVENT:
1344                 cxt5047_hp_automute(codec);
1345                 break;
1346         case CONEXANT_MIC_EVENT:
1347                 cxt5047_hp_automic(codec);
1348                 break;
1349         }
1350 }
1351
1352 static const struct snd_kcontrol_new cxt5047_base_mixers[] = {
1353         HDA_CODEC_VOLUME("Mic Playback Volume", 0x19, 0x02, HDA_INPUT),
1354         HDA_CODEC_MUTE("Mic Playback Switch", 0x19, 0x02, HDA_INPUT),
1355         HDA_CODEC_VOLUME("Mic Boost Volume", 0x1a, 0x0, HDA_OUTPUT),
1356         HDA_CODEC_VOLUME("Capture Volume", 0x12, 0x03, HDA_INPUT),
1357         HDA_CODEC_MUTE("Capture Switch", 0x12, 0x03, HDA_INPUT),
1358         HDA_CODEC_VOLUME("PCM Volume", 0x10, 0x00, HDA_OUTPUT),
1359         HDA_CODEC_MUTE("PCM Switch", 0x10, 0x00, HDA_OUTPUT),
1360         {
1361                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1362                 .name = "Master Playback Switch",
1363                 .info = cxt_eapd_info,
1364                 .get = cxt_eapd_get,
1365                 .put = cxt5047_hp_master_sw_put,
1366                 .private_value = 0x13,
1367         },
1368
1369         {}
1370 };
1371
1372 static const struct snd_kcontrol_new cxt5047_hp_spk_mixers[] = {
1373         /* See the note in cxt5047_hp_master_sw_put */
1374         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x1d, 0x01, HDA_OUTPUT),
1375         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x13, 0x00, HDA_OUTPUT),
1376         {}
1377 };
1378
1379 static const struct snd_kcontrol_new cxt5047_hp_only_mixers[] = {
1380         HDA_CODEC_VOLUME("Master Playback Volume", 0x13, 0x00, HDA_OUTPUT),
1381         { } /* end */
1382 };
1383
1384 static const struct hda_verb cxt5047_init_verbs[] = {
1385         /* Line in, Mic, Built-in Mic */
1386         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
1387         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN|AC_PINCTL_VREF_50 },
1388         {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN|AC_PINCTL_VREF_50 },
1389         /* HP, Speaker  */
1390         {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP },
1391         {0x13, AC_VERB_SET_CONNECT_SEL, 0x0}, /* mixer(0x19) */
1392         {0x1d, AC_VERB_SET_CONNECT_SEL, 0x1}, /* mixer(0x19) */
1393         /* Record selector: Mic */
1394         {0x12, AC_VERB_SET_CONNECT_SEL,0x03},
1395         {0x19, AC_VERB_SET_AMP_GAIN_MUTE,
1396          AC_AMP_SET_INPUT|AC_AMP_SET_RIGHT|AC_AMP_SET_LEFT|0x17},
1397         {0x1A, AC_VERB_SET_CONNECT_SEL,0x02},
1398         {0x1A, AC_VERB_SET_AMP_GAIN_MUTE,
1399          AC_AMP_SET_OUTPUT|AC_AMP_SET_RIGHT|AC_AMP_SET_LEFT|0x00},
1400         {0x1A, AC_VERB_SET_AMP_GAIN_MUTE,
1401          AC_AMP_SET_OUTPUT|AC_AMP_SET_RIGHT|AC_AMP_SET_LEFT|0x03},
1402         /* SPDIF route: PCM */
1403         { 0x18, AC_VERB_SET_CONNECT_SEL, 0x0 },
1404         /* Enable unsolicited events */
1405         {0x13, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | CONEXANT_HP_EVENT},
1406         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | CONEXANT_MIC_EVENT},
1407         { } /* end */
1408 };
1409
1410 /* configuration for Toshiba Laptops */
1411 static const struct hda_verb cxt5047_toshiba_init_verbs[] = {
1412         {0x13, AC_VERB_SET_EAPD_BTLENABLE, 0x0}, /* default off */
1413         {}
1414 };
1415
1416 /* Test configuration for debugging, modelled after the ALC260 test
1417  * configuration.
1418  */
1419 #ifdef CONFIG_SND_DEBUG
1420 static const struct hda_input_mux cxt5047_test_capture_source = {
1421         .num_items = 4,
1422         .items = {
1423                 { "LINE1 pin", 0x0 },
1424                 { "MIC1 pin", 0x1 },
1425                 { "MIC2 pin", 0x2 },
1426                 { "CD pin", 0x3 },
1427         },
1428 };
1429
1430 static const struct snd_kcontrol_new cxt5047_test_mixer[] = {
1431
1432         /* Output only controls */
1433         HDA_CODEC_VOLUME("OutAmp-1 Volume", 0x10, 0x0, HDA_OUTPUT),
1434         HDA_CODEC_MUTE("OutAmp-1 Switch", 0x10,0x0, HDA_OUTPUT),
1435         HDA_CODEC_VOLUME("OutAmp-2 Volume", 0x1c, 0x0, HDA_OUTPUT),
1436         HDA_CODEC_MUTE("OutAmp-2 Switch", 0x1c, 0x0, HDA_OUTPUT),
1437         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x1d, 0x0, HDA_OUTPUT),
1438         HDA_CODEC_MUTE("Speaker Playback Switch", 0x1d, 0x0, HDA_OUTPUT),
1439         HDA_CODEC_VOLUME("HeadPhone Playback Volume", 0x13, 0x0, HDA_OUTPUT),
1440         HDA_CODEC_MUTE("HeadPhone Playback Switch", 0x13, 0x0, HDA_OUTPUT),
1441         HDA_CODEC_VOLUME("Line1-Out Playback Volume", 0x14, 0x0, HDA_OUTPUT),
1442         HDA_CODEC_MUTE("Line1-Out Playback Switch", 0x14, 0x0, HDA_OUTPUT),
1443         HDA_CODEC_VOLUME("Line2-Out Playback Volume", 0x15, 0x0, HDA_OUTPUT),
1444         HDA_CODEC_MUTE("Line2-Out Playback Switch", 0x15, 0x0, HDA_OUTPUT),
1445
1446         /* Modes for retasking pin widgets */
1447         CXT_PIN_MODE("LINE1 pin mode", 0x14, CXT_PIN_DIR_INOUT),
1448         CXT_PIN_MODE("MIC1 pin mode", 0x15, CXT_PIN_DIR_INOUT),
1449
1450         /* EAPD Switch Control */
1451         CXT_EAPD_SWITCH("External Amplifier", 0x13, 0x0),
1452
1453         /* Loopback mixer controls */
1454         HDA_CODEC_VOLUME("MIC1 Playback Volume", 0x12, 0x01, HDA_INPUT),
1455         HDA_CODEC_MUTE("MIC1 Playback Switch", 0x12, 0x01, HDA_INPUT),
1456         HDA_CODEC_VOLUME("MIC2 Playback Volume", 0x12, 0x02, HDA_INPUT),
1457         HDA_CODEC_MUTE("MIC2 Playback Switch", 0x12, 0x02, HDA_INPUT),
1458         HDA_CODEC_VOLUME("LINE Playback Volume", 0x12, 0x0, HDA_INPUT),
1459         HDA_CODEC_MUTE("LINE Playback Switch", 0x12, 0x0, HDA_INPUT),
1460         HDA_CODEC_VOLUME("CD Playback Volume", 0x12, 0x04, HDA_INPUT),
1461         HDA_CODEC_MUTE("CD Playback Switch", 0x12, 0x04, HDA_INPUT),
1462
1463         HDA_CODEC_VOLUME("Capture-1 Volume", 0x19, 0x0, HDA_INPUT),
1464         HDA_CODEC_MUTE("Capture-1 Switch", 0x19, 0x0, HDA_INPUT),
1465         HDA_CODEC_VOLUME("Capture-2 Volume", 0x19, 0x1, HDA_INPUT),
1466         HDA_CODEC_MUTE("Capture-2 Switch", 0x19, 0x1, HDA_INPUT),
1467         HDA_CODEC_VOLUME("Capture-3 Volume", 0x19, 0x2, HDA_INPUT),
1468         HDA_CODEC_MUTE("Capture-3 Switch", 0x19, 0x2, HDA_INPUT),
1469         HDA_CODEC_VOLUME("Capture-4 Volume", 0x19, 0x3, HDA_INPUT),
1470         HDA_CODEC_MUTE("Capture-4 Switch", 0x19, 0x3, HDA_INPUT),
1471         {
1472                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1473                 .name = "Input Source",
1474                 .info = conexant_mux_enum_info,
1475                 .get = conexant_mux_enum_get,
1476                 .put = conexant_mux_enum_put,
1477         },
1478         HDA_CODEC_VOLUME("Mic Boost Volume", 0x1a, 0x0, HDA_OUTPUT),
1479
1480         { } /* end */
1481 };
1482
1483 static const struct hda_verb cxt5047_test_init_verbs[] = {
1484         /* Enable retasking pins as output, initially without power amp */
1485         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1486         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1487         {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1488
1489         /* Disable digital (SPDIF) pins initially, but users can enable
1490          * them via a mixer switch.  In the case of SPDIF-out, this initverb
1491          * payload also sets the generation to 0, output to be in "consumer"
1492          * PCM format, copyright asserted, no pre-emphasis and no validity
1493          * control.
1494          */
1495         {0x18, AC_VERB_SET_DIGI_CONVERT_1, 0},
1496
1497         /* Ensure mic1, mic2, line1 pin widgets take input from the 
1498          * OUT1 sum bus when acting as an output.
1499          */
1500         {0x1a, AC_VERB_SET_CONNECT_SEL, 0},
1501         {0x1b, AC_VERB_SET_CONNECT_SEL, 0},
1502
1503         /* Start with output sum widgets muted and their output gains at min */
1504         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
1505         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
1506
1507         /* Unmute retasking pin widget output buffers since the default
1508          * state appears to be output.  As the pin mode is changed by the
1509          * user the pin mode control will take care of enabling the pin's
1510          * input/output buffers as needed.
1511          */
1512         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1513         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1514         {0x13, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1515
1516         /* Mute capture amp left and right */
1517         {0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
1518
1519         /* Set ADC connection select to match default mixer setting (mic1
1520          * pin)
1521          */
1522         {0x12, AC_VERB_SET_CONNECT_SEL, 0x00},
1523
1524         /* Mute all inputs to mixer widget (even unconnected ones) */
1525         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, /* mic1 pin */
1526         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, /* mic2 pin */
1527         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, /* line1 pin */
1528         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, /* line2 pin */
1529         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, /* CD pin */
1530         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)}, /* Beep-gen pin */
1531         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)}, /* Line-out pin */
1532         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)}, /* HP-pin pin */
1533
1534         { }
1535 };
1536 #endif
1537
1538
1539 /* initialize jack-sensing, too */
1540 static int cxt5047_hp_init(struct hda_codec *codec)
1541 {
1542         conexant_init(codec);
1543         cxt5047_hp_automute(codec);
1544         return 0;
1545 }
1546
1547
1548 enum {
1549         CXT5047_LAPTOP,         /* Laptops w/o EAPD support */
1550         CXT5047_LAPTOP_HP,      /* Some HP laptops */
1551         CXT5047_LAPTOP_EAPD,    /* Laptops with EAPD support */
1552 #ifdef CONFIG_SND_DEBUG
1553         CXT5047_TEST,
1554 #endif
1555         CXT5047_AUTO,
1556         CXT5047_MODELS
1557 };
1558
1559 static const char * const cxt5047_models[CXT5047_MODELS] = {
1560         [CXT5047_LAPTOP]        = "laptop",
1561         [CXT5047_LAPTOP_HP]     = "laptop-hp",
1562         [CXT5047_LAPTOP_EAPD]   = "laptop-eapd",
1563 #ifdef CONFIG_SND_DEBUG
1564         [CXT5047_TEST]          = "test",
1565 #endif
1566         [CXT5047_AUTO]          = "auto",
1567 };
1568
1569 static const struct snd_pci_quirk cxt5047_cfg_tbl[] = {
1570         SND_PCI_QUIRK(0x103c, 0x30a5, "HP DV5200T/DV8000T", CXT5047_LAPTOP_HP),
1571         SND_PCI_QUIRK_MASK(0x103c, 0xff00, 0x3000, "HP DV Series",
1572                            CXT5047_LAPTOP),
1573         SND_PCI_QUIRK(0x1179, 0xff31, "Toshiba P100", CXT5047_LAPTOP_EAPD),
1574         {}
1575 };
1576
1577 static int patch_cxt5047(struct hda_codec *codec)
1578 {
1579         struct conexant_spec *spec;
1580         int board_config;
1581
1582         board_config = snd_hda_check_board_config(codec, CXT5047_MODELS,
1583                                                   cxt5047_models,
1584                                                   cxt5047_cfg_tbl);
1585         if (board_config < 0)
1586                 board_config = CXT5047_AUTO; /* model=auto as default */
1587         if (board_config == CXT5047_AUTO)
1588                 return patch_conexant_auto(codec);
1589
1590         spec = kzalloc(sizeof(*spec), GFP_KERNEL);
1591         if (!spec)
1592                 return -ENOMEM;
1593         codec->spec = spec;
1594         codec->pin_amp_workaround = 1;
1595
1596         spec->multiout.max_channels = 2;
1597         spec->multiout.num_dacs = ARRAY_SIZE(cxt5047_dac_nids);
1598         spec->multiout.dac_nids = cxt5047_dac_nids;
1599         spec->multiout.dig_out_nid = CXT5047_SPDIF_OUT;
1600         spec->num_adc_nids = 1;
1601         spec->adc_nids = cxt5047_adc_nids;
1602         spec->capsrc_nids = cxt5047_capsrc_nids;
1603         spec->num_mixers = 1;
1604         spec->mixers[0] = cxt5047_base_mixers;
1605         spec->num_init_verbs = 1;
1606         spec->init_verbs[0] = cxt5047_init_verbs;
1607         spec->spdif_route = 0;
1608         spec->num_channel_mode = ARRAY_SIZE(cxt5047_modes),
1609         spec->channel_mode = cxt5047_modes,
1610
1611         codec->patch_ops = conexant_patch_ops;
1612
1613         switch (board_config) {
1614         case CXT5047_LAPTOP:
1615                 spec->num_mixers = 2;
1616                 spec->mixers[1] = cxt5047_hp_spk_mixers;
1617                 codec->patch_ops.unsol_event = cxt5047_hp_unsol_event;
1618                 break;
1619         case CXT5047_LAPTOP_HP:
1620                 spec->num_mixers = 2;
1621                 spec->mixers[1] = cxt5047_hp_only_mixers;
1622                 codec->patch_ops.unsol_event = cxt5047_hp_unsol_event;
1623                 codec->patch_ops.init = cxt5047_hp_init;
1624                 break;
1625         case CXT5047_LAPTOP_EAPD:
1626                 spec->input_mux = &cxt5047_toshiba_capture_source;
1627                 spec->num_mixers = 2;
1628                 spec->mixers[1] = cxt5047_hp_spk_mixers;
1629                 spec->num_init_verbs = 2;
1630                 spec->init_verbs[1] = cxt5047_toshiba_init_verbs;
1631                 codec->patch_ops.unsol_event = cxt5047_hp_unsol_event;
1632                 break;
1633 #ifdef CONFIG_SND_DEBUG
1634         case CXT5047_TEST:
1635                 spec->input_mux = &cxt5047_test_capture_source;
1636                 spec->mixers[0] = cxt5047_test_mixer;
1637                 spec->init_verbs[0] = cxt5047_test_init_verbs;
1638                 codec->patch_ops.unsol_event = cxt5047_hp_unsol_event;
1639 #endif  
1640         }
1641         spec->vmaster_nid = 0x13;
1642
1643         switch (codec->subsystem_id >> 16) {
1644         case 0x103c:
1645                 /* HP laptops have really bad sound over 0 dB on NID 0x10.
1646                  * Fix max PCM level to 0 dB (originally it has 0x1e steps
1647                  * with 0 dB offset 0x17)
1648                  */
1649                 snd_hda_override_amp_caps(codec, 0x10, HDA_INPUT,
1650                                           (0x17 << AC_AMPCAP_OFFSET_SHIFT) |
1651                                           (0x17 << AC_AMPCAP_NUM_STEPS_SHIFT) |
1652                                           (0x05 << AC_AMPCAP_STEP_SIZE_SHIFT) |
1653                                           (1 << AC_AMPCAP_MUTE_SHIFT));
1654                 break;
1655         }
1656
1657         return 0;
1658 }
1659
1660 /* Conexant 5051 specific */
1661 static const hda_nid_t cxt5051_dac_nids[1] = { 0x10 };
1662 static const hda_nid_t cxt5051_adc_nids[2] = { 0x14, 0x15 };
1663
1664 static const struct hda_channel_mode cxt5051_modes[1] = {
1665         { 2, NULL },
1666 };
1667
1668 static void cxt5051_update_speaker(struct hda_codec *codec)
1669 {
1670         struct conexant_spec *spec = codec->spec;
1671         unsigned int pinctl;
1672         /* headphone pin */
1673         pinctl = (spec->hp_present && spec->cur_eapd) ? PIN_HP : 0;
1674         snd_hda_codec_write(codec, 0x16, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
1675                             pinctl);
1676         /* speaker pin */
1677         pinctl = (!spec->hp_present && spec->cur_eapd) ? PIN_OUT : 0;
1678         snd_hda_codec_write(codec, 0x1a, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
1679                             pinctl);
1680         /* on ideapad there is an aditional speaker (subwoofer) to mute */
1681         if (spec->ideapad)
1682                 snd_hda_codec_write(codec, 0x1b, 0,
1683                                     AC_VERB_SET_PIN_WIDGET_CONTROL,
1684                                     pinctl);
1685 }
1686
1687 /* turn on/off EAPD (+ mute HP) as a master switch */
1688 static int cxt5051_hp_master_sw_put(struct snd_kcontrol *kcontrol,
1689                                     struct snd_ctl_elem_value *ucontrol)
1690 {
1691         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1692
1693         if (!cxt_eapd_put(kcontrol, ucontrol))
1694                 return 0;
1695         cxt5051_update_speaker(codec);
1696         return 1;
1697 }
1698
1699 /* toggle input of built-in and mic jack appropriately */
1700 static void cxt5051_portb_automic(struct hda_codec *codec)
1701 {
1702         struct conexant_spec *spec = codec->spec;
1703         unsigned int present;
1704
1705         if (!(spec->auto_mic & AUTO_MIC_PORTB))
1706                 return;
1707         present = snd_hda_jack_detect(codec, 0x17);
1708         snd_hda_codec_write(codec, 0x14, 0,
1709                             AC_VERB_SET_CONNECT_SEL,
1710                             present ? 0x01 : 0x00);
1711 }
1712
1713 /* switch the current ADC according to the jack state */
1714 static void cxt5051_portc_automic(struct hda_codec *codec)
1715 {
1716         struct conexant_spec *spec = codec->spec;
1717         unsigned int present;
1718         hda_nid_t new_adc;
1719
1720         if (!(spec->auto_mic & AUTO_MIC_PORTC))
1721                 return;
1722         present = snd_hda_jack_detect(codec, 0x18);
1723         if (present)
1724                 spec->cur_adc_idx = 1;
1725         else
1726                 spec->cur_adc_idx = 0;
1727         new_adc = spec->adc_nids[spec->cur_adc_idx];
1728         if (spec->cur_adc && spec->cur_adc != new_adc) {
1729                 /* stream is running, let's swap the current ADC */
1730                 __snd_hda_codec_cleanup_stream(codec, spec->cur_adc, 1);
1731                 spec->cur_adc = new_adc;
1732                 snd_hda_codec_setup_stream(codec, new_adc,
1733                                            spec->cur_adc_stream_tag, 0,
1734                                            spec->cur_adc_format);
1735         }
1736 }
1737
1738 /* mute internal speaker if HP is plugged */
1739 static void cxt5051_hp_automute(struct hda_codec *codec)
1740 {
1741         struct conexant_spec *spec = codec->spec;
1742
1743         spec->hp_present = snd_hda_jack_detect(codec, 0x16);
1744         cxt5051_update_speaker(codec);
1745 }
1746
1747 /* unsolicited event for HP jack sensing */
1748 static void cxt5051_hp_unsol_event(struct hda_codec *codec,
1749                                    unsigned int res)
1750 {
1751         int nid = (res & AC_UNSOL_RES_SUBTAG) >> 20;
1752         switch (res >> 26) {
1753         case CONEXANT_HP_EVENT:
1754                 cxt5051_hp_automute(codec);
1755                 break;
1756         case CXT5051_PORTB_EVENT:
1757                 cxt5051_portb_automic(codec);
1758                 break;
1759         case CXT5051_PORTC_EVENT:
1760                 cxt5051_portc_automic(codec);
1761                 break;
1762         }
1763         snd_hda_input_jack_report(codec, nid);
1764 }
1765
1766 static const struct snd_kcontrol_new cxt5051_playback_mixers[] = {
1767         HDA_CODEC_VOLUME("Master Playback Volume", 0x10, 0x00, HDA_OUTPUT),
1768         {
1769                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1770                 .name = "Master Playback Switch",
1771                 .info = cxt_eapd_info,
1772                 .get = cxt_eapd_get,
1773                 .put = cxt5051_hp_master_sw_put,
1774                 .private_value = 0x1a,
1775         },
1776         {}
1777 };
1778
1779 static const struct snd_kcontrol_new cxt5051_capture_mixers[] = {
1780         HDA_CODEC_VOLUME("Internal Mic Volume", 0x14, 0x00, HDA_INPUT),
1781         HDA_CODEC_MUTE("Internal Mic Switch", 0x14, 0x00, HDA_INPUT),
1782         HDA_CODEC_VOLUME("Mic Volume", 0x14, 0x01, HDA_INPUT),
1783         HDA_CODEC_MUTE("Mic Switch", 0x14, 0x01, HDA_INPUT),
1784         HDA_CODEC_VOLUME("Docking Mic Volume", 0x15, 0x00, HDA_INPUT),
1785         HDA_CODEC_MUTE("Docking Mic Switch", 0x15, 0x00, HDA_INPUT),
1786         {}
1787 };
1788
1789 static const struct snd_kcontrol_new cxt5051_hp_mixers[] = {
1790         HDA_CODEC_VOLUME("Internal Mic Volume", 0x14, 0x00, HDA_INPUT),
1791         HDA_CODEC_MUTE("Internal Mic Switch", 0x14, 0x00, HDA_INPUT),
1792         HDA_CODEC_VOLUME("Mic Volume", 0x15, 0x00, HDA_INPUT),
1793         HDA_CODEC_MUTE("Mic Switch", 0x15, 0x00, HDA_INPUT),
1794         {}
1795 };
1796
1797 static const struct snd_kcontrol_new cxt5051_hp_dv6736_mixers[] = {
1798         HDA_CODEC_VOLUME("Capture Volume", 0x14, 0x00, HDA_INPUT),
1799         HDA_CODEC_MUTE("Capture Switch", 0x14, 0x00, HDA_INPUT),
1800         {}
1801 };
1802
1803 static const struct snd_kcontrol_new cxt5051_f700_mixers[] = {
1804         HDA_CODEC_VOLUME("Capture Volume", 0x14, 0x01, HDA_INPUT),
1805         HDA_CODEC_MUTE("Capture Switch", 0x14, 0x01, HDA_INPUT),
1806         {}
1807 };
1808
1809 static const struct snd_kcontrol_new cxt5051_toshiba_mixers[] = {
1810         HDA_CODEC_VOLUME("Internal Mic Volume", 0x14, 0x00, HDA_INPUT),
1811         HDA_CODEC_MUTE("Internal Mic Switch", 0x14, 0x00, HDA_INPUT),
1812         HDA_CODEC_VOLUME("Mic Volume", 0x14, 0x01, HDA_INPUT),
1813         HDA_CODEC_MUTE("Mic Switch", 0x14, 0x01, HDA_INPUT),
1814         {}
1815 };
1816
1817 static const struct hda_verb cxt5051_init_verbs[] = {
1818         /* Line in, Mic */
1819         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0) | 0x03},
1820         {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
1821         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0) | 0x03},
1822         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
1823         {0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
1824         {0x1d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0) | 0x03},
1825         /* SPK  */
1826         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1827         {0x1a, AC_VERB_SET_CONNECT_SEL, 0x00},
1828         /* HP, Amp  */
1829         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
1830         {0x16, AC_VERB_SET_CONNECT_SEL, 0x00},
1831         /* DAC1 */      
1832         {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1833         /* Record selector: Internal mic */
1834         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0) | 0x44},
1835         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1) | 0x44},
1836         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0) | 0x44},
1837         /* SPDIF route: PCM */
1838         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1839         {0x1c, AC_VERB_SET_CONNECT_SEL, 0x0},
1840         /* EAPD */
1841         {0x1a, AC_VERB_SET_EAPD_BTLENABLE, 0x2}, /* default on */ 
1842         {0x16, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|CONEXANT_HP_EVENT},
1843         { } /* end */
1844 };
1845
1846 static const struct hda_verb cxt5051_hp_dv6736_init_verbs[] = {
1847         /* Line in, Mic */
1848         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0) | 0x03},
1849         {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
1850         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0},
1851         {0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0},
1852         /* SPK  */
1853         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1854         {0x1a, AC_VERB_SET_CONNECT_SEL, 0x00},
1855         /* HP, Amp  */
1856         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
1857         {0x16, AC_VERB_SET_CONNECT_SEL, 0x00},
1858         /* DAC1 */
1859         {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1860         /* Record selector: Internal mic */
1861         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1) | 0x44},
1862         {0x14, AC_VERB_SET_CONNECT_SEL, 0x1},
1863         /* SPDIF route: PCM */
1864         {0x1c, AC_VERB_SET_CONNECT_SEL, 0x0},
1865         /* EAPD */
1866         {0x1a, AC_VERB_SET_EAPD_BTLENABLE, 0x2}, /* default on */
1867         {0x16, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|CONEXANT_HP_EVENT},
1868         { } /* end */
1869 };
1870
1871 static const struct hda_verb cxt5051_f700_init_verbs[] = {
1872         /* Line in, Mic */
1873         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0) | 0x03},
1874         {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
1875         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0},
1876         {0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0},
1877         /* SPK  */
1878         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1879         {0x1a, AC_VERB_SET_CONNECT_SEL, 0x00},
1880         /* HP, Amp  */
1881         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
1882         {0x16, AC_VERB_SET_CONNECT_SEL, 0x00},
1883         /* DAC1 */
1884         {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1885         /* Record selector: Internal mic */
1886         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1) | 0x44},
1887         {0x14, AC_VERB_SET_CONNECT_SEL, 0x1},
1888         /* SPDIF route: PCM */
1889         {0x1c, AC_VERB_SET_CONNECT_SEL, 0x0},
1890         /* EAPD */
1891         {0x1a, AC_VERB_SET_EAPD_BTLENABLE, 0x2}, /* default on */
1892         {0x16, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|CONEXANT_HP_EVENT},
1893         { } /* end */
1894 };
1895
1896 static void cxt5051_init_mic_port(struct hda_codec *codec, hda_nid_t nid,
1897                                  unsigned int event)
1898 {
1899         snd_hda_codec_write(codec, nid, 0,
1900                             AC_VERB_SET_UNSOLICITED_ENABLE,
1901                             AC_USRSP_EN | event);
1902 }
1903
1904 static void cxt5051_init_mic_jack(struct hda_codec *codec, hda_nid_t nid)
1905 {
1906         snd_hda_input_jack_add(codec, nid, SND_JACK_MICROPHONE, NULL);
1907         snd_hda_input_jack_report(codec, nid);
1908 }
1909
1910 static const struct hda_verb cxt5051_ideapad_init_verbs[] = {
1911         /* Subwoofer */
1912         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1913         {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
1914         { } /* end */
1915 };
1916
1917 /* initialize jack-sensing, too */
1918 static int cxt5051_init(struct hda_codec *codec)
1919 {
1920         struct conexant_spec *spec = codec->spec;
1921
1922         conexant_init(codec);
1923
1924         if (spec->auto_mic & AUTO_MIC_PORTB)
1925                 cxt5051_init_mic_port(codec, 0x17, CXT5051_PORTB_EVENT);
1926         if (spec->auto_mic & AUTO_MIC_PORTC)
1927                 cxt5051_init_mic_port(codec, 0x18, CXT5051_PORTC_EVENT);
1928
1929         if (codec->patch_ops.unsol_event) {
1930                 cxt5051_hp_automute(codec);
1931                 cxt5051_portb_automic(codec);
1932                 cxt5051_portc_automic(codec);
1933         }
1934         return 0;
1935 }
1936
1937
1938 enum {
1939         CXT5051_LAPTOP,  /* Laptops w/ EAPD support */
1940         CXT5051_HP,     /* no docking */
1941         CXT5051_HP_DV6736,      /* HP without mic switch */
1942         CXT5051_F700,       /* HP Compaq Presario F700 */
1943         CXT5051_TOSHIBA,        /* Toshiba M300 & co */
1944         CXT5051_IDEAPAD,        /* Lenovo IdeaPad Y430 */
1945         CXT5051_AUTO,           /* auto-parser */
1946         CXT5051_MODELS
1947 };
1948
1949 static const char *const cxt5051_models[CXT5051_MODELS] = {
1950         [CXT5051_LAPTOP]        = "laptop",
1951         [CXT5051_HP]            = "hp",
1952         [CXT5051_HP_DV6736]     = "hp-dv6736",
1953         [CXT5051_F700]          = "hp-700",
1954         [CXT5051_TOSHIBA]       = "toshiba",
1955         [CXT5051_IDEAPAD]       = "ideapad",
1956         [CXT5051_AUTO]          = "auto",
1957 };
1958
1959 static const struct snd_pci_quirk cxt5051_cfg_tbl[] = {
1960         SND_PCI_QUIRK(0x103c, 0x30cf, "HP DV6736", CXT5051_HP_DV6736),
1961         SND_PCI_QUIRK(0x103c, 0x360b, "Compaq Presario CQ60", CXT5051_HP),
1962         SND_PCI_QUIRK(0x103c, 0x30ea, "Compaq Presario F700", CXT5051_F700),
1963         SND_PCI_QUIRK(0x1179, 0xff50, "Toshiba M30x", CXT5051_TOSHIBA),
1964         SND_PCI_QUIRK(0x14f1, 0x0101, "Conexant Reference board",
1965                       CXT5051_LAPTOP),
1966         SND_PCI_QUIRK(0x14f1, 0x5051, "HP Spartan 1.1", CXT5051_HP),
1967         SND_PCI_QUIRK(0x17aa, 0x3a0d, "Lenovo IdeaPad", CXT5051_IDEAPAD),
1968         {}
1969 };
1970
1971 static int patch_cxt5051(struct hda_codec *codec)
1972 {
1973         struct conexant_spec *spec;
1974         int board_config;
1975
1976         board_config = snd_hda_check_board_config(codec, CXT5051_MODELS,
1977                                                   cxt5051_models,
1978                                                   cxt5051_cfg_tbl);
1979         if (board_config < 0)
1980                 board_config = CXT5051_AUTO; /* model=auto as default */
1981         if (board_config == CXT5051_AUTO)
1982                 return patch_conexant_auto(codec);
1983
1984         spec = kzalloc(sizeof(*spec), GFP_KERNEL);
1985         if (!spec)
1986                 return -ENOMEM;
1987         codec->spec = spec;
1988         codec->pin_amp_workaround = 1;
1989
1990         codec->patch_ops = conexant_patch_ops;
1991         codec->patch_ops.init = cxt5051_init;
1992
1993         spec->multiout.max_channels = 2;
1994         spec->multiout.num_dacs = ARRAY_SIZE(cxt5051_dac_nids);
1995         spec->multiout.dac_nids = cxt5051_dac_nids;
1996         spec->multiout.dig_out_nid = CXT5051_SPDIF_OUT;
1997         spec->num_adc_nids = 1; /* not 2; via auto-mic switch */
1998         spec->adc_nids = cxt5051_adc_nids;
1999         spec->num_mixers = 2;
2000         spec->mixers[0] = cxt5051_capture_mixers;
2001         spec->mixers[1] = cxt5051_playback_mixers;
2002         spec->num_init_verbs = 1;
2003         spec->init_verbs[0] = cxt5051_init_verbs;
2004         spec->spdif_route = 0;
2005         spec->num_channel_mode = ARRAY_SIZE(cxt5051_modes);
2006         spec->channel_mode = cxt5051_modes;
2007         spec->cur_adc = 0;
2008         spec->cur_adc_idx = 0;
2009
2010         set_beep_amp(spec, 0x13, 0, HDA_OUTPUT);
2011
2012         codec->patch_ops.unsol_event = cxt5051_hp_unsol_event;
2013
2014         spec->auto_mic = AUTO_MIC_PORTB | AUTO_MIC_PORTC;
2015         switch (board_config) {
2016         case CXT5051_HP:
2017                 spec->mixers[0] = cxt5051_hp_mixers;
2018                 break;
2019         case CXT5051_HP_DV6736:
2020                 spec->init_verbs[0] = cxt5051_hp_dv6736_init_verbs;
2021                 spec->mixers[0] = cxt5051_hp_dv6736_mixers;
2022                 spec->auto_mic = 0;
2023                 break;
2024         case CXT5051_F700:
2025                 spec->init_verbs[0] = cxt5051_f700_init_verbs;
2026                 spec->mixers[0] = cxt5051_f700_mixers;
2027                 spec->auto_mic = 0;
2028                 break;
2029         case CXT5051_TOSHIBA:
2030                 spec->mixers[0] = cxt5051_toshiba_mixers;
2031                 spec->auto_mic = AUTO_MIC_PORTB;
2032                 break;
2033         case CXT5051_IDEAPAD:
2034                 spec->init_verbs[spec->num_init_verbs++] =
2035                         cxt5051_ideapad_init_verbs;
2036                 spec->ideapad = 1;
2037                 break;
2038         }
2039
2040         if (spec->beep_amp)
2041                 snd_hda_attach_beep_device(codec, spec->beep_amp);
2042
2043         conexant_init_jacks(codec);
2044         if (spec->auto_mic & AUTO_MIC_PORTB)
2045                 cxt5051_init_mic_jack(codec, 0x17);
2046         if (spec->auto_mic & AUTO_MIC_PORTC)
2047                 cxt5051_init_mic_jack(codec, 0x18);
2048
2049         return 0;
2050 }
2051
2052 /* Conexant 5066 specific */
2053
2054 static const hda_nid_t cxt5066_dac_nids[1] = { 0x10 };
2055 static const hda_nid_t cxt5066_adc_nids[3] = { 0x14, 0x15, 0x16 };
2056 static const hda_nid_t cxt5066_capsrc_nids[1] = { 0x17 };
2057 static const hda_nid_t cxt5066_digout_pin_nids[2] = { 0x20, 0x22 };
2058
2059 /* OLPC's microphone port is DC coupled for use with external sensors,
2060  * therefore we use a 50% mic bias in order to center the input signal with
2061  * the DC input range of the codec. */
2062 #define CXT5066_OLPC_EXT_MIC_BIAS PIN_VREF50
2063
2064 static const struct hda_channel_mode cxt5066_modes[1] = {
2065         { 2, NULL },
2066 };
2067
2068 #define HP_PRESENT_PORT_A       (1 << 0)
2069 #define HP_PRESENT_PORT_D       (1 << 1)
2070 #define hp_port_a_present(spec) ((spec)->hp_present & HP_PRESENT_PORT_A)
2071 #define hp_port_d_present(spec) ((spec)->hp_present & HP_PRESENT_PORT_D)
2072
2073 static void cxt5066_update_speaker(struct hda_codec *codec)
2074 {
2075         struct conexant_spec *spec = codec->spec;
2076         unsigned int pinctl;
2077
2078         snd_printdd("CXT5066: update speaker, hp_present=%d, cur_eapd=%d\n",
2079                     spec->hp_present, spec->cur_eapd);
2080
2081         /* Port A (HP) */
2082         pinctl = (hp_port_a_present(spec) && spec->cur_eapd) ? PIN_HP : 0;
2083         snd_hda_codec_write(codec, 0x19, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
2084                         pinctl);
2085
2086         /* Port D (HP/LO) */
2087         pinctl = spec->cur_eapd ? spec->port_d_mode : 0;
2088         if (spec->dell_automute || spec->thinkpad) {
2089                 /* Mute if Port A is connected */
2090                 if (hp_port_a_present(spec))
2091                         pinctl = 0;
2092         } else {
2093                 /* Thinkpad/Dell doesn't give pin-D status */
2094                 if (!hp_port_d_present(spec))
2095                         pinctl = 0;
2096         }
2097         snd_hda_codec_write(codec, 0x1c, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
2098                         pinctl);
2099
2100         /* CLASS_D AMP */
2101         pinctl = (!spec->hp_present && spec->cur_eapd) ? PIN_OUT : 0;
2102         snd_hda_codec_write(codec, 0x1f, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
2103                         pinctl);
2104 }
2105
2106 /* turn on/off EAPD (+ mute HP) as a master switch */
2107 static int cxt5066_hp_master_sw_put(struct snd_kcontrol *kcontrol,
2108                                     struct snd_ctl_elem_value *ucontrol)
2109 {
2110         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2111
2112         if (!cxt_eapd_put(kcontrol, ucontrol))
2113                 return 0;
2114
2115         cxt5066_update_speaker(codec);
2116         return 1;
2117 }
2118
2119 static const struct hda_input_mux cxt5066_olpc_dc_bias = {
2120         .num_items = 3,
2121         .items = {
2122                 { "Off", PIN_IN },
2123                 { "50%", PIN_VREF50 },
2124                 { "80%", PIN_VREF80 },
2125         },
2126 };
2127
2128 static int cxt5066_set_olpc_dc_bias(struct hda_codec *codec)
2129 {
2130         struct conexant_spec *spec = codec->spec;
2131         /* Even though port F is the DC input, the bias is controlled on port B.
2132          * we also leave that port as an active input (but unselected) in DC mode
2133          * just in case that is necessary to make the bias setting take effect. */
2134         return snd_hda_codec_write_cache(codec, 0x1a, 0,
2135                 AC_VERB_SET_PIN_WIDGET_CONTROL,
2136                 cxt5066_olpc_dc_bias.items[spec->dc_input_bias].index);
2137 }
2138
2139 /* OLPC defers mic widget control until when capture is started because the
2140  * microphone LED comes on as soon as these settings are put in place. if we
2141  * did this before recording, it would give the false indication that recording
2142  * is happening when it is not. */
2143 static void cxt5066_olpc_select_mic(struct hda_codec *codec)
2144 {
2145         struct conexant_spec *spec = codec->spec;
2146         if (!spec->recording)
2147                 return;
2148
2149         if (spec->dc_enable) {
2150                 /* in DC mode we ignore presence detection and just use the jack
2151                  * through our special DC port */
2152                 const struct hda_verb enable_dc_mode[] = {
2153                         /* disble internal mic, port C */
2154                         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
2155
2156                         /* enable DC capture, port F */
2157                         {0x1e, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2158                         {},
2159                 };
2160
2161                 snd_hda_sequence_write(codec, enable_dc_mode);
2162                 /* port B input disabled (and bias set) through the following call */
2163                 cxt5066_set_olpc_dc_bias(codec);
2164                 return;
2165         }
2166
2167         /* disable DC (port F) */
2168         snd_hda_codec_write(codec, 0x1e, 0, AC_VERB_SET_PIN_WIDGET_CONTROL, 0);
2169
2170         /* external mic, port B */
2171         snd_hda_codec_write(codec, 0x1a, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
2172                 spec->ext_mic_present ? CXT5066_OLPC_EXT_MIC_BIAS : 0);
2173
2174         /* internal mic, port C */
2175         snd_hda_codec_write(codec, 0x1b, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
2176                 spec->ext_mic_present ? 0 : PIN_VREF80);
2177 }
2178
2179 /* toggle input of built-in and mic jack appropriately */
2180 static void cxt5066_olpc_automic(struct hda_codec *codec)
2181 {
2182         struct conexant_spec *spec = codec->spec;
2183         unsigned int present;
2184
2185         if (spec->dc_enable) /* don't do presence detection in DC mode */
2186                 return;
2187
2188         present = snd_hda_codec_read(codec, 0x1a, 0,
2189                                      AC_VERB_GET_PIN_SENSE, 0) & 0x80000000;
2190         if (present)
2191                 snd_printdd("CXT5066: external microphone detected\n");
2192         else
2193                 snd_printdd("CXT5066: external microphone absent\n");
2194
2195         snd_hda_codec_write(codec, 0x17, 0, AC_VERB_SET_CONNECT_SEL,
2196                 present ? 0 : 1);
2197         spec->ext_mic_present = !!present;
2198
2199         cxt5066_olpc_select_mic(codec);
2200 }
2201
2202 /* toggle input of built-in digital mic and mic jack appropriately */
2203 static void cxt5066_vostro_automic(struct hda_codec *codec)
2204 {
2205         unsigned int present;
2206
2207         struct hda_verb ext_mic_present[] = {
2208                 /* enable external mic, port B */
2209                 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2210
2211                 /* switch to external mic input */
2212                 {0x17, AC_VERB_SET_CONNECT_SEL, 0},
2213                 {0x14, AC_VERB_SET_CONNECT_SEL, 0},
2214
2215                 /* disable internal digital mic */
2216                 {0x23, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
2217                 {}
2218         };
2219         static const struct hda_verb ext_mic_absent[] = {
2220                 /* enable internal mic, port C */
2221                 {0x23, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2222
2223                 /* switch to internal mic input */
2224                 {0x14, AC_VERB_SET_CONNECT_SEL, 2},
2225
2226                 /* disable external mic, port B */
2227                 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
2228                 {}
2229         };
2230
2231         present = snd_hda_jack_detect(codec, 0x1a);
2232         if (present) {
2233                 snd_printdd("CXT5066: external microphone detected\n");
2234                 snd_hda_sequence_write(codec, ext_mic_present);
2235         } else {
2236                 snd_printdd("CXT5066: external microphone absent\n");
2237                 snd_hda_sequence_write(codec, ext_mic_absent);
2238         }
2239 }
2240
2241 /* toggle input of built-in digital mic and mic jack appropriately */
2242 static void cxt5066_ideapad_automic(struct hda_codec *codec)
2243 {
2244         unsigned int present;
2245
2246         struct hda_verb ext_mic_present[] = {
2247                 {0x14, AC_VERB_SET_CONNECT_SEL, 0},
2248                 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2249                 {0x23, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
2250                 {}
2251         };
2252         static const struct hda_verb ext_mic_absent[] = {
2253                 {0x14, AC_VERB_SET_CONNECT_SEL, 2},
2254                 {0x23, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2255                 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
2256                 {}
2257         };
2258
2259         present = snd_hda_jack_detect(codec, 0x1b);
2260         if (present) {
2261                 snd_printdd("CXT5066: external microphone detected\n");
2262                 snd_hda_sequence_write(codec, ext_mic_present);
2263         } else {
2264                 snd_printdd("CXT5066: external microphone absent\n");
2265                 snd_hda_sequence_write(codec, ext_mic_absent);
2266         }
2267 }
2268
2269
2270 /* toggle input of built-in digital mic and mic jack appropriately */
2271 static void cxt5066_asus_automic(struct hda_codec *codec)
2272 {
2273         unsigned int present;
2274
2275         present = snd_hda_jack_detect(codec, 0x1b);
2276         snd_printdd("CXT5066: external microphone present=%d\n", present);
2277         snd_hda_codec_write(codec, 0x17, 0, AC_VERB_SET_CONNECT_SEL,
2278                             present ? 1 : 0);
2279 }
2280
2281
2282 /* toggle input of built-in digital mic and mic jack appropriately */
2283 static void cxt5066_hp_laptop_automic(struct hda_codec *codec)
2284 {
2285         unsigned int present;
2286
2287         present = snd_hda_jack_detect(codec, 0x1b);
2288         snd_printdd("CXT5066: external microphone present=%d\n", present);
2289         snd_hda_codec_write(codec, 0x17, 0, AC_VERB_SET_CONNECT_SEL,
2290                             present ? 1 : 3);
2291 }
2292
2293
2294 /* toggle input of built-in digital mic and mic jack appropriately
2295    order is: external mic -> dock mic -> interal mic */
2296 static void cxt5066_thinkpad_automic(struct hda_codec *codec)
2297 {
2298         unsigned int ext_present, dock_present;
2299
2300         static const struct hda_verb ext_mic_present[] = {
2301                 {0x14, AC_VERB_SET_CONNECT_SEL, 0},
2302                 {0x17, AC_VERB_SET_CONNECT_SEL, 1},
2303                 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2304                 {0x23, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
2305                 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
2306                 {}
2307         };
2308         static const struct hda_verb dock_mic_present[] = {
2309                 {0x14, AC_VERB_SET_CONNECT_SEL, 0},
2310                 {0x17, AC_VERB_SET_CONNECT_SEL, 0},
2311                 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2312                 {0x23, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
2313                 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
2314                 {}
2315         };
2316         static const struct hda_verb ext_mic_absent[] = {
2317                 {0x14, AC_VERB_SET_CONNECT_SEL, 2},
2318                 {0x23, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2319                 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
2320                 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
2321                 {}
2322         };
2323
2324         ext_present = snd_hda_jack_detect(codec, 0x1b);
2325         dock_present = snd_hda_jack_detect(codec, 0x1a);
2326         if (ext_present) {
2327                 snd_printdd("CXT5066: external microphone detected\n");
2328                 snd_hda_sequence_write(codec, ext_mic_present);
2329         } else if (dock_present) {
2330                 snd_printdd("CXT5066: dock microphone detected\n");
2331                 snd_hda_sequence_write(codec, dock_mic_present);
2332         } else {
2333                 snd_printdd("CXT5066: external microphone absent\n");
2334                 snd_hda_sequence_write(codec, ext_mic_absent);
2335         }
2336 }
2337
2338 /* mute internal speaker if HP is plugged */
2339 static void cxt5066_hp_automute(struct hda_codec *codec)
2340 {
2341         struct conexant_spec *spec = codec->spec;
2342         unsigned int portA, portD;
2343
2344         /* Port A */
2345         portA = snd_hda_jack_detect(codec, 0x19);
2346
2347         /* Port D */
2348         portD = snd_hda_jack_detect(codec, 0x1c);
2349
2350         spec->hp_present = portA ? HP_PRESENT_PORT_A : 0;
2351         spec->hp_present |= portD ? HP_PRESENT_PORT_D : 0;
2352         snd_printdd("CXT5066: hp automute portA=%x portD=%x present=%d\n",
2353                 portA, portD, spec->hp_present);
2354         cxt5066_update_speaker(codec);
2355 }
2356
2357 /* Dispatch the right mic autoswitch function */
2358 static void cxt5066_automic(struct hda_codec *codec)
2359 {
2360         struct conexant_spec *spec = codec->spec;
2361
2362         if (spec->dell_vostro)
2363                 cxt5066_vostro_automic(codec);
2364         else if (spec->ideapad)
2365                 cxt5066_ideapad_automic(codec);
2366         else if (spec->thinkpad)
2367                 cxt5066_thinkpad_automic(codec);
2368         else if (spec->hp_laptop)
2369                 cxt5066_hp_laptop_automic(codec);
2370         else if (spec->asus)
2371                 cxt5066_asus_automic(codec);
2372 }
2373
2374 /* unsolicited event for jack sensing */
2375 static void cxt5066_olpc_unsol_event(struct hda_codec *codec, unsigned int res)
2376 {
2377         struct conexant_spec *spec = codec->spec;
2378         snd_printdd("CXT5066: unsol event %x (%x)\n", res, res >> 26);
2379         switch (res >> 26) {
2380         case CONEXANT_HP_EVENT:
2381                 cxt5066_hp_automute(codec);
2382                 break;
2383         case CONEXANT_MIC_EVENT:
2384                 /* ignore mic events in DC mode; we're always using the jack */
2385                 if (!spec->dc_enable)
2386                         cxt5066_olpc_automic(codec);
2387                 break;
2388         }
2389 }
2390
2391 /* unsolicited event for jack sensing */
2392 static void cxt5066_unsol_event(struct hda_codec *codec, unsigned int res)
2393 {
2394         snd_printdd("CXT5066: unsol event %x (%x)\n", res, res >> 26);
2395         switch (res >> 26) {
2396         case CONEXANT_HP_EVENT:
2397                 cxt5066_hp_automute(codec);
2398                 break;
2399         case CONEXANT_MIC_EVENT:
2400                 cxt5066_automic(codec);
2401                 break;
2402         }
2403 }
2404
2405
2406 static const struct hda_input_mux cxt5066_analog_mic_boost = {
2407         .num_items = 5,
2408         .items = {
2409                 { "0dB",  0 },
2410                 { "10dB", 1 },
2411                 { "20dB", 2 },
2412                 { "30dB", 3 },
2413                 { "40dB", 4 },
2414         },
2415 };
2416
2417 static void cxt5066_set_mic_boost(struct hda_codec *codec)
2418 {
2419         struct conexant_spec *spec = codec->spec;
2420         snd_hda_codec_write_cache(codec, 0x17, 0,
2421                 AC_VERB_SET_AMP_GAIN_MUTE,
2422                 AC_AMP_SET_RIGHT | AC_AMP_SET_LEFT | AC_AMP_SET_OUTPUT |
2423                         cxt5066_analog_mic_boost.items[spec->mic_boost].index);
2424         if (spec->ideapad || spec->thinkpad) {
2425                 /* adjust the internal mic as well...it is not through 0x17 */
2426                 snd_hda_codec_write_cache(codec, 0x23, 0,
2427                         AC_VERB_SET_AMP_GAIN_MUTE,
2428                         AC_AMP_SET_RIGHT | AC_AMP_SET_LEFT | AC_AMP_SET_INPUT |
2429                                 cxt5066_analog_mic_boost.
2430                                         items[spec->mic_boost].index);
2431         }
2432 }
2433
2434 static int cxt5066_mic_boost_mux_enum_info(struct snd_kcontrol *kcontrol,
2435                                            struct snd_ctl_elem_info *uinfo)
2436 {
2437         return snd_hda_input_mux_info(&cxt5066_analog_mic_boost, uinfo);
2438 }
2439
2440 static int cxt5066_mic_boost_mux_enum_get(struct snd_kcontrol *kcontrol,
2441                                           struct snd_ctl_elem_value *ucontrol)
2442 {
2443         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2444         struct conexant_spec *spec = codec->spec;
2445         ucontrol->value.enumerated.item[0] = spec->mic_boost;
2446         return 0;
2447 }
2448
2449 static int cxt5066_mic_boost_mux_enum_put(struct snd_kcontrol *kcontrol,
2450                                           struct snd_ctl_elem_value *ucontrol)
2451 {
2452         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2453         struct conexant_spec *spec = codec->spec;
2454         const struct hda_input_mux *imux = &cxt5066_analog_mic_boost;
2455         unsigned int idx;
2456         idx = ucontrol->value.enumerated.item[0];
2457         if (idx >= imux->num_items)
2458                 idx = imux->num_items - 1;
2459
2460         spec->mic_boost = idx;
2461         if (!spec->dc_enable)
2462                 cxt5066_set_mic_boost(codec);
2463         return 1;
2464 }
2465
2466 static void cxt5066_enable_dc(struct hda_codec *codec)
2467 {
2468         const struct hda_verb enable_dc_mode[] = {
2469                 /* disable gain */
2470                 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2471
2472                 /* switch to DC input */
2473                 {0x17, AC_VERB_SET_CONNECT_SEL, 3},
2474                 {}
2475         };
2476
2477         /* configure as input source */
2478         snd_hda_sequence_write(codec, enable_dc_mode);
2479         cxt5066_olpc_select_mic(codec); /* also sets configured bias */
2480 }
2481
2482 static void cxt5066_disable_dc(struct hda_codec *codec)
2483 {
2484         /* reconfigure input source */
2485         cxt5066_set_mic_boost(codec);
2486         /* automic also selects the right mic if we're recording */
2487         cxt5066_olpc_automic(codec);
2488 }
2489
2490 static int cxt5066_olpc_dc_get(struct snd_kcontrol *kcontrol,
2491                              struct snd_ctl_elem_value *ucontrol)
2492 {
2493         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2494         struct conexant_spec *spec = codec->spec;
2495         ucontrol->value.integer.value[0] = spec->dc_enable;
2496         return 0;
2497 }
2498
2499 static int cxt5066_olpc_dc_put(struct snd_kcontrol *kcontrol,
2500                              struct snd_ctl_elem_value *ucontrol)
2501 {
2502         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2503         struct conexant_spec *spec = codec->spec;
2504         int dc_enable = !!ucontrol->value.integer.value[0];
2505
2506         if (dc_enable == spec->dc_enable)
2507                 return 0;
2508
2509         spec->dc_enable = dc_enable;
2510         if (dc_enable)
2511                 cxt5066_enable_dc(codec);
2512         else
2513                 cxt5066_disable_dc(codec);
2514
2515         return 1;
2516 }
2517
2518 static int cxt5066_olpc_dc_bias_enum_info(struct snd_kcontrol *kcontrol,
2519                                            struct snd_ctl_elem_info *uinfo)
2520 {
2521         return snd_hda_input_mux_info(&cxt5066_olpc_dc_bias, uinfo);
2522 }
2523
2524 static int cxt5066_olpc_dc_bias_enum_get(struct snd_kcontrol *kcontrol,
2525                                           struct snd_ctl_elem_value *ucontrol)
2526 {
2527         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2528         struct conexant_spec *spec = codec->spec;
2529         ucontrol->value.enumerated.item[0] = spec->dc_input_bias;
2530         return 0;
2531 }
2532
2533 static int cxt5066_olpc_dc_bias_enum_put(struct snd_kcontrol *kcontrol,
2534                                           struct snd_ctl_elem_value *ucontrol)
2535 {
2536         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2537         struct conexant_spec *spec = codec->spec;
2538         const struct hda_input_mux *imux = &cxt5066_analog_mic_boost;
2539         unsigned int idx;
2540
2541         idx = ucontrol->value.enumerated.item[0];
2542         if (idx >= imux->num_items)
2543                 idx = imux->num_items - 1;
2544
2545         spec->dc_input_bias = idx;
2546         if (spec->dc_enable)
2547                 cxt5066_set_olpc_dc_bias(codec);
2548         return 1;
2549 }
2550
2551 static void cxt5066_olpc_capture_prepare(struct hda_codec *codec)
2552 {
2553         struct conexant_spec *spec = codec->spec;
2554         /* mark as recording and configure the microphone widget so that the
2555          * recording LED comes on. */
2556         spec->recording = 1;
2557         cxt5066_olpc_select_mic(codec);
2558 }
2559
2560 static void cxt5066_olpc_capture_cleanup(struct hda_codec *codec)
2561 {
2562         struct conexant_spec *spec = codec->spec;
2563         const struct hda_verb disable_mics[] = {
2564                 /* disable external mic, port B */
2565                 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
2566
2567                 /* disble internal mic, port C */
2568                 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
2569
2570                 /* disable DC capture, port F */
2571                 {0x1e, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
2572                 {},
2573         };
2574
2575         snd_hda_sequence_write(codec, disable_mics);
2576         spec->recording = 0;
2577 }
2578
2579 static void conexant_check_dig_outs(struct hda_codec *codec,
2580                                     const hda_nid_t *dig_pins,
2581                                     int num_pins)
2582 {
2583         struct conexant_spec *spec = codec->spec;
2584         hda_nid_t *nid_loc = &spec->multiout.dig_out_nid;
2585         int i;
2586
2587         for (i = 0; i < num_pins; i++, dig_pins++) {
2588                 unsigned int cfg = snd_hda_codec_get_pincfg(codec, *dig_pins);
2589                 if (get_defcfg_connect(cfg) == AC_JACK_PORT_NONE)
2590                         continue;
2591                 if (snd_hda_get_connections(codec, *dig_pins, nid_loc, 1) != 1)
2592                         continue;
2593                 if (spec->slave_dig_outs[0])
2594                         nid_loc++;
2595                 else
2596                         nid_loc = spec->slave_dig_outs;
2597         }
2598 }
2599
2600 static const struct hda_input_mux cxt5066_capture_source = {
2601         .num_items = 4,
2602         .items = {
2603                 { "Mic B", 0 },
2604                 { "Mic C", 1 },
2605                 { "Mic E", 2 },
2606                 { "Mic F", 3 },
2607         },
2608 };
2609
2610 static const struct hda_bind_ctls cxt5066_bind_capture_vol_others = {
2611         .ops = &snd_hda_bind_vol,
2612         .values = {
2613                 HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_INPUT),
2614                 HDA_COMPOSE_AMP_VAL(0x14, 3, 2, HDA_INPUT),
2615                 0
2616         },
2617 };
2618
2619 static const struct hda_bind_ctls cxt5066_bind_capture_sw_others = {
2620         .ops = &snd_hda_bind_sw,
2621         .values = {
2622                 HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_INPUT),
2623                 HDA_COMPOSE_AMP_VAL(0x14, 3, 2, HDA_INPUT),
2624                 0
2625         },
2626 };
2627
2628 static const struct snd_kcontrol_new cxt5066_mixer_master[] = {
2629         HDA_CODEC_VOLUME("Master Playback Volume", 0x10, 0x00, HDA_OUTPUT),
2630         {}
2631 };
2632
2633 static const struct snd_kcontrol_new cxt5066_mixer_master_olpc[] = {
2634         {
2635                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2636                 .name = "Master Playback Volume",
2637                 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE |
2638                                   SNDRV_CTL_ELEM_ACCESS_TLV_READ |
2639                                   SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK,
2640                 .subdevice = HDA_SUBDEV_AMP_FLAG,
2641                 .info = snd_hda_mixer_amp_volume_info,
2642                 .get = snd_hda_mixer_amp_volume_get,
2643                 .put = snd_hda_mixer_amp_volume_put,
2644                 .tlv = { .c = snd_hda_mixer_amp_tlv },
2645                 /* offset by 28 volume steps to limit minimum gain to -46dB */
2646                 .private_value =
2647                         HDA_COMPOSE_AMP_VAL_OFS(0x10, 3, 0, HDA_OUTPUT, 28),
2648         },
2649         {}
2650 };
2651
2652 static const struct snd_kcontrol_new cxt5066_mixer_olpc_dc[] = {
2653         {
2654                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2655                 .name = "DC Mode Enable Switch",
2656                 .info = snd_ctl_boolean_mono_info,
2657                 .get = cxt5066_olpc_dc_get,
2658                 .put = cxt5066_olpc_dc_put,
2659         },
2660         {
2661                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2662                 .name = "DC Input Bias Enum",
2663                 .info = cxt5066_olpc_dc_bias_enum_info,
2664                 .get = cxt5066_olpc_dc_bias_enum_get,
2665                 .put = cxt5066_olpc_dc_bias_enum_put,
2666         },
2667         {}
2668 };
2669
2670 static const struct snd_kcontrol_new cxt5066_mixers[] = {
2671         {
2672                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2673                 .name = "Master Playback Switch",
2674                 .info = cxt_eapd_info,
2675                 .get = cxt_eapd_get,
2676                 .put = cxt5066_hp_master_sw_put,
2677                 .private_value = 0x1d,
2678         },
2679
2680         {
2681                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2682                 .name = "Analog Mic Boost Capture Enum",
2683                 .info = cxt5066_mic_boost_mux_enum_info,
2684                 .get = cxt5066_mic_boost_mux_enum_get,
2685                 .put = cxt5066_mic_boost_mux_enum_put,
2686         },
2687
2688         HDA_BIND_VOL("Capture Volume", &cxt5066_bind_capture_vol_others),
2689         HDA_BIND_SW("Capture Switch", &cxt5066_bind_capture_sw_others),
2690         {}
2691 };
2692
2693 static const struct snd_kcontrol_new cxt5066_vostro_mixers[] = {
2694         {
2695                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2696                 .name = "Internal Mic Boost Capture Enum",
2697                 .info = cxt5066_mic_boost_mux_enum_info,
2698                 .get = cxt5066_mic_boost_mux_enum_get,
2699                 .put = cxt5066_mic_boost_mux_enum_put,
2700                 .private_value = 0x23 | 0x100,
2701         },
2702         {}
2703 };
2704
2705 static const struct hda_verb cxt5066_init_verbs[] = {
2706         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, /* Port B */
2707         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, /* Port C */
2708         {0x1e, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, /* Port F */
2709         {0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, /* Port E */
2710
2711         /* Speakers  */
2712         {0x1f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2713         {0x1f, AC_VERB_SET_CONNECT_SEL, 0x00}, /* DAC1 */
2714
2715         /* HP, Amp  */
2716         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2717         {0x19, AC_VERB_SET_CONNECT_SEL, 0x00}, /* DAC1 */
2718
2719         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2720         {0x1c, AC_VERB_SET_CONNECT_SEL, 0x00}, /* DAC1 */
2721
2722         /* DAC1 */
2723         {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2724
2725         /* Node 14 connections: 0x17 0x18 0x23 0x24 0x27 */
2726         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0) | 0x50},
2727         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2728         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2) | 0x50},
2729         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
2730         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
2731
2732         /* no digital microphone support yet */
2733         {0x23, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
2734
2735         /* Audio input selector */
2736         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE | 0x3},
2737
2738         /* SPDIF route: PCM */
2739         {0x20, AC_VERB_SET_CONNECT_SEL, 0x0},
2740         {0x22, AC_VERB_SET_CONNECT_SEL, 0x0},
2741
2742         {0x20, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2743         {0x22, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2744
2745         /* EAPD */
2746         {0x1d, AC_VERB_SET_EAPD_BTLENABLE, 0x2}, /* default on */
2747
2748         /* not handling these yet */
2749         {0x19, AC_VERB_SET_UNSOLICITED_ENABLE, 0},
2750         {0x1a, AC_VERB_SET_UNSOLICITED_ENABLE, 0},
2751         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, 0},
2752         {0x1c, AC_VERB_SET_UNSOLICITED_ENABLE, 0},
2753         {0x1d, AC_VERB_SET_UNSOLICITED_ENABLE, 0},
2754         {0x1e, AC_VERB_SET_UNSOLICITED_ENABLE, 0},
2755         {0x20, AC_VERB_SET_UNSOLICITED_ENABLE, 0},
2756         {0x22, AC_VERB_SET_UNSOLICITED_ENABLE, 0},
2757         { } /* end */
2758 };
2759
2760 static const struct hda_verb cxt5066_init_verbs_olpc[] = {
2761         /* Port A: headphones */
2762         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2763         {0x19, AC_VERB_SET_CONNECT_SEL, 0x00}, /* DAC1 */
2764
2765         /* Port B: external microphone */
2766         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
2767
2768         /* Port C: internal microphone */
2769         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
2770
2771         /* Port D: unused */
2772         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
2773
2774         /* Port E: unused, but has primary EAPD */
2775         {0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
2776         {0x1d, AC_VERB_SET_EAPD_BTLENABLE, 0x2}, /* default on */
2777
2778         /* Port F: external DC input through microphone port */
2779         {0x1e, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
2780
2781         /* Port G: internal speakers */
2782         {0x1f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2783         {0x1f, AC_VERB_SET_CONNECT_SEL, 0x00}, /* DAC1 */
2784
2785         /* DAC1 */
2786         {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2787
2788         /* DAC2: unused */
2789         {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2790
2791         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0) | 0x50},
2792         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2793         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
2794         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
2795         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2796         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2797         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
2798         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
2799         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2800         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2801         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
2802         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
2803
2804         /* Disable digital microphone port */
2805         {0x23, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
2806
2807         /* Audio input selectors */
2808         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE | 0x3},
2809         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
2810
2811         /* Disable SPDIF */
2812         {0x20, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
2813         {0x22, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
2814
2815         /* enable unsolicited events for Port A and B */
2816         {0x19, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | CONEXANT_HP_EVENT},
2817         {0x1a, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | CONEXANT_MIC_EVENT},
2818         { } /* end */
2819 };
2820
2821 static const struct hda_verb cxt5066_init_verbs_vostro[] = {
2822         /* Port A: headphones */
2823         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
2824         {0x19, AC_VERB_SET_CONNECT_SEL, 0x00}, /* DAC1 */
2825
2826         /* Port B: external microphone */
2827         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
2828
2829         /* Port C: unused */
2830         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
2831
2832         /* Port D: unused */
2833         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
2834
2835         /* Port E: unused, but has primary EAPD */
2836         {0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
2837         {0x1d, AC_VERB_SET_EAPD_BTLENABLE, 0x2}, /* default on */
2838
2839         /* Port F: unused */
2840         {0x1e, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
2841
2842         /* Port G: internal speakers */
2843         {0x1f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2844         {0x1f, AC_VERB_SET_CONNECT_SEL, 0x00}, /* DAC1 */
2845
2846         /* DAC1 */
2847         {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2848
2849         /* DAC2: unused */
2850         {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2851
2852         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2853         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2854         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
2855         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
2856         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2857         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2858         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
2859         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
2860         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2861         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2862         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
2863         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
2864
2865         /* Digital microphone port */
2866         {0x23, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2867
2868         /* Audio input selectors */
2869         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE | 0x3},
2870         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
2871
2872         /* Disable SPDIF */
2873         {0x20, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
2874         {0x22, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
2875
2876         /* enable unsolicited events for Port A and B */
2877         {0x19, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | CONEXANT_HP_EVENT},
2878         {0x1a, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | CONEXANT_MIC_EVENT},
2879         { } /* end */
2880 };
2881
2882 static const struct hda_verb cxt5066_init_verbs_ideapad[] = {
2883         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, /* Port B */
2884         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, /* Port C */
2885         {0x1e, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, /* Port F */
2886         {0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, /* Port E */
2887
2888         /* Speakers  */
2889         {0x1f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2890         {0x1f, AC_VERB_SET_CONNECT_SEL, 0x00}, /* DAC1 */
2891
2892         /* HP, Amp  */
2893         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2894         {0x19, AC_VERB_SET_CONNECT_SEL, 0x00}, /* DAC1 */
2895
2896         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2897         {0x1c, AC_VERB_SET_CONNECT_SEL, 0x00}, /* DAC1 */
2898
2899         /* DAC1 */
2900         {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2901
2902         /* Node 14 connections: 0x17 0x18 0x23 0x24 0x27 */
2903         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0) | 0x50},
2904         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2905         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2) | 0x50},
2906         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
2907         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
2908         {0x14, AC_VERB_SET_CONNECT_SEL, 2},     /* default to internal mic */
2909
2910         /* Audio input selector */
2911         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE | 0x2},
2912         {0x17, AC_VERB_SET_CONNECT_SEL, 1},     /* route ext mic */
2913
2914         /* SPDIF route: PCM */
2915         {0x20, AC_VERB_SET_CONNECT_SEL, 0x0},
2916         {0x22, AC_VERB_SET_CONNECT_SEL, 0x0},
2917
2918         {0x20, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2919         {0x22, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2920
2921         /* internal microphone */
2922         {0x23, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, /* enable internal mic */
2923
2924         /* EAPD */
2925         {0x1d, AC_VERB_SET_EAPD_BTLENABLE, 0x2}, /* default on */
2926
2927         {0x19, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | CONEXANT_HP_EVENT},
2928         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | CONEXANT_MIC_EVENT},
2929         { } /* end */
2930 };
2931
2932 static const struct hda_verb cxt5066_init_verbs_thinkpad[] = {
2933         {0x1e, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, /* Port F */
2934         {0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, /* Port E */
2935
2936         /* Port G: internal speakers  */
2937         {0x1f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2938         {0x1f, AC_VERB_SET_CONNECT_SEL, 0x00}, /* DAC1 */
2939
2940         /* Port A: HP, Amp  */
2941         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
2942         {0x19, AC_VERB_SET_CONNECT_SEL, 0x00}, /* DAC1 */
2943
2944         /* Port B: Mic Dock */
2945         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
2946
2947         /* Port C: Mic */
2948         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
2949
2950         /* Port D: HP Dock, Amp */
2951         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
2952         {0x1c, AC_VERB_SET_CONNECT_SEL, 0x00}, /* DAC1 */
2953
2954         /* DAC1 */
2955         {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2956
2957         /* Node 14 connections: 0x17 0x18 0x23 0x24 0x27 */
2958         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0) | 0x50},
2959         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2960         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2) | 0x50},
2961         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
2962         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
2963         {0x14, AC_VERB_SET_CONNECT_SEL, 2},     /* default to internal mic */
2964
2965         /* Audio input selector */
2966         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE | 0x2},
2967         {0x17, AC_VERB_SET_CONNECT_SEL, 1},     /* route ext mic */
2968
2969         /* SPDIF route: PCM */
2970         {0x20, AC_VERB_SET_CONNECT_SEL, 0x0},
2971         {0x22, AC_VERB_SET_CONNECT_SEL, 0x0},
2972
2973         {0x20, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2974         {0x22, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2975
2976         /* internal microphone */
2977         {0x23, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, /* enable internal mic */
2978
2979         /* EAPD */
2980         {0x1d, AC_VERB_SET_EAPD_BTLENABLE, 0x2}, /* default on */
2981
2982         /* enable unsolicited events for Port A, B, C and D */
2983         {0x19, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | CONEXANT_HP_EVENT},
2984         {0x1c, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | CONEXANT_HP_EVENT},
2985         {0x1a, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | CONEXANT_MIC_EVENT},
2986         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | CONEXANT_MIC_EVENT},
2987         { } /* end */
2988 };
2989
2990 static const struct hda_verb cxt5066_init_verbs_portd_lo[] = {
2991         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2992         { } /* end */
2993 };
2994
2995
2996 static const struct hda_verb cxt5066_init_verbs_hp_laptop[] = {
2997         {0x14, AC_VERB_SET_CONNECT_SEL, 0x0},
2998         {0x19, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | CONEXANT_HP_EVENT},
2999         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | CONEXANT_MIC_EVENT},
3000         { } /* end */
3001 };
3002
3003 /* initialize jack-sensing, too */
3004 static int cxt5066_init(struct hda_codec *codec)
3005 {
3006         snd_printdd("CXT5066: init\n");
3007         conexant_init(codec);
3008         if (codec->patch_ops.unsol_event) {
3009                 cxt5066_hp_automute(codec);
3010                 cxt5066_automic(codec);
3011         }
3012         cxt5066_set_mic_boost(codec);
3013         return 0;
3014 }
3015
3016 static int cxt5066_olpc_init(struct hda_codec *codec)
3017 {
3018         struct conexant_spec *spec = codec->spec;
3019         snd_printdd("CXT5066: init\n");
3020         conexant_init(codec);
3021         cxt5066_hp_automute(codec);
3022         if (!spec->dc_enable) {
3023                 cxt5066_set_mic_boost(codec);
3024                 cxt5066_olpc_automic(codec);
3025         } else {
3026                 cxt5066_enable_dc(codec);
3027         }
3028         return 0;
3029 }
3030
3031 enum {
3032         CXT5066_LAPTOP,         /* Laptops w/ EAPD support */
3033         CXT5066_DELL_LAPTOP,    /* Dell Laptop */
3034         CXT5066_OLPC_XO_1_5,    /* OLPC XO 1.5 */
3035         CXT5066_DELL_VOSTRO,    /* Dell Vostro 1015i */
3036         CXT5066_IDEAPAD,        /* Lenovo IdeaPad U150 */
3037         CXT5066_THINKPAD,       /* Lenovo ThinkPad T410s, others? */
3038         CXT5066_ASUS,           /* Asus K52JU, Lenovo G560 - Int mic at 0x1a and Ext mic at 0x1b */
3039         CXT5066_HP_LAPTOP,      /* HP Laptop */
3040         CXT5066_AUTO,           /* BIOS auto-parser */
3041         CXT5066_MODELS
3042 };
3043
3044 static const char * const cxt5066_models[CXT5066_MODELS] = {
3045         [CXT5066_LAPTOP]        = "laptop",
3046         [CXT5066_DELL_LAPTOP]   = "dell-laptop",
3047         [CXT5066_OLPC_XO_1_5]   = "olpc-xo-1_5",
3048         [CXT5066_DELL_VOSTRO]   = "dell-vostro",
3049         [CXT5066_IDEAPAD]       = "ideapad",
3050         [CXT5066_THINKPAD]      = "thinkpad",
3051         [CXT5066_ASUS]          = "asus",
3052         [CXT5066_HP_LAPTOP]     = "hp-laptop",
3053         [CXT5066_AUTO]          = "auto",
3054 };
3055
3056 static const struct snd_pci_quirk cxt5066_cfg_tbl[] = {
3057         SND_PCI_QUIRK(0x1025, 0x054c, "Acer Aspire 3830TG", CXT5066_AUTO),
3058         SND_PCI_QUIRK_MASK(0x1025, 0xff00, 0x0400, "Acer", CXT5066_IDEAPAD),
3059         SND_PCI_QUIRK(0x1028, 0x02d8, "Dell Vostro", CXT5066_DELL_VOSTRO),
3060         SND_PCI_QUIRK(0x1028, 0x02f5, "Dell Vostro 320", CXT5066_IDEAPAD),
3061         SND_PCI_QUIRK(0x1028, 0x0401, "Dell Vostro 1014", CXT5066_DELL_VOSTRO),
3062         SND_PCI_QUIRK(0x1028, 0x0402, "Dell Vostro", CXT5066_DELL_VOSTRO),
3063         SND_PCI_QUIRK(0x1028, 0x0408, "Dell Inspiron One 19T", CXT5066_IDEAPAD),
3064         SND_PCI_QUIRK(0x1028, 0x050f, "Dell Inspiron", CXT5066_IDEAPAD),
3065         SND_PCI_QUIRK(0x1028, 0x0510, "Dell Vostro", CXT5066_IDEAPAD),
3066         SND_PCI_QUIRK(0x103c, 0x360b, "HP G60", CXT5066_HP_LAPTOP),
3067         SND_PCI_QUIRK(0x1043, 0x13f3, "Asus A52J", CXT5066_ASUS),
3068         SND_PCI_QUIRK(0x1043, 0x1643, "Asus K52JU", CXT5066_ASUS),
3069         SND_PCI_QUIRK(0x1043, 0x1993, "Asus U50F", CXT5066_ASUS),
3070         SND_PCI_QUIRK(0x1179, 0xff1e, "Toshiba Satellite C650D", CXT5066_IDEAPAD),
3071         SND_PCI_QUIRK(0x1179, 0xff50, "Toshiba Satellite P500-PSPGSC-01800T", CXT5066_OLPC_XO_1_5),
3072         SND_PCI_QUIRK(0x14f1, 0x0101, "Conexant Reference board",
3073                       CXT5066_LAPTOP),
3074         SND_PCI_QUIRK(0x152d, 0x0833, "OLPC XO-1.5", CXT5066_OLPC_XO_1_5),
3075         SND_PCI_QUIRK(0x17aa, 0x20f2, "Lenovo T400s", CXT5066_THINKPAD),
3076         SND_PCI_QUIRK(0x17aa, 0x21c5, "Thinkpad Edge 13", CXT5066_THINKPAD),
3077         SND_PCI_QUIRK(0x17aa, 0x21c6, "Thinkpad Edge 13", CXT5066_ASUS),
3078         SND_PCI_QUIRK(0x17aa, 0x215e, "Lenovo Thinkpad", CXT5066_THINKPAD),
3079         SND_PCI_QUIRK(0x17aa, 0x21cf, "Lenovo T520 & W520", CXT5066_AUTO),
3080         SND_PCI_QUIRK(0x17aa, 0x21da, "Lenovo X220", CXT5066_THINKPAD),
3081         SND_PCI_QUIRK(0x17aa, 0x21db, "Lenovo X220-tablet", CXT5066_THINKPAD),
3082         SND_PCI_QUIRK(0x17aa, 0x3a0d, "Lenovo U350", CXT5066_ASUS),
3083         SND_PCI_QUIRK(0x17aa, 0x38af, "Lenovo G560", CXT5066_ASUS),
3084         SND_PCI_QUIRK(0x17aa, 0x3938, "Lenovo G565", CXT5066_AUTO),
3085         SND_PCI_QUIRK_VENDOR(0x17aa, "Lenovo", CXT5066_IDEAPAD), /* Fallback for Lenovos without dock mic */
3086         SND_PCI_QUIRK(0x1b0a, 0x2092, "CyberpowerPC Gamer Xplorer N57001", CXT5066_AUTO),
3087         {}
3088 };
3089
3090 static int patch_cxt5066(struct hda_codec *codec)
3091 {
3092         struct conexant_spec *spec;
3093         int board_config;
3094
3095         board_config = snd_hda_check_board_config(codec, CXT5066_MODELS,
3096                                                   cxt5066_models, cxt5066_cfg_tbl);
3097         if (board_config < 0)
3098                 board_config = CXT5066_AUTO; /* model=auto as default */
3099         if (board_config == CXT5066_AUTO)
3100                 return patch_conexant_auto(codec);
3101
3102         spec = kzalloc(sizeof(*spec), GFP_KERNEL);
3103         if (!spec)
3104                 return -ENOMEM;
3105         codec->spec = spec;
3106
3107         codec->patch_ops = conexant_patch_ops;
3108         codec->patch_ops.init = conexant_init;
3109
3110         spec->dell_automute = 0;
3111         spec->multiout.max_channels = 2;
3112         spec->multiout.num_dacs = ARRAY_SIZE(cxt5066_dac_nids);
3113         spec->multiout.dac_nids = cxt5066_dac_nids;
3114         conexant_check_dig_outs(codec, cxt5066_digout_pin_nids,
3115             ARRAY_SIZE(cxt5066_digout_pin_nids));
3116         spec->num_adc_nids = 1;
3117         spec->adc_nids = cxt5066_adc_nids;
3118         spec->capsrc_nids = cxt5066_capsrc_nids;
3119         spec->input_mux = &cxt5066_capture_source;
3120
3121         spec->port_d_mode = PIN_HP;
3122
3123         spec->num_init_verbs = 1;
3124         spec->init_verbs[0] = cxt5066_init_verbs;
3125         spec->num_channel_mode = ARRAY_SIZE(cxt5066_modes);
3126         spec->channel_mode = cxt5066_modes;
3127         spec->cur_adc = 0;
3128         spec->cur_adc_idx = 0;
3129
3130         set_beep_amp(spec, 0x13, 0, HDA_OUTPUT);
3131
3132         switch (board_config) {
3133         default:
3134         case CXT5066_LAPTOP:
3135                 spec->mixers[spec->num_mixers++] = cxt5066_mixer_master;
3136                 spec->mixers[spec->num_mixers++] = cxt5066_mixers;
3137                 break;
3138         case CXT5066_DELL_LAPTOP:
3139                 spec->mixers[spec->num_mixers++] = cxt5066_mixer_master;
3140                 spec->mixers[spec->num_mixers++] = cxt5066_mixers;
3141
3142                 spec->port_d_mode = PIN_OUT;
3143                 spec->init_verbs[spec->num_init_verbs] = cxt5066_init_verbs_portd_lo;
3144                 spec->num_init_verbs++;
3145                 spec->dell_automute = 1;
3146                 break;
3147         case CXT5066_ASUS:
3148         case CXT5066_HP_LAPTOP:
3149                 codec->patch_ops.init = cxt5066_init;
3150                 codec->patch_ops.unsol_event = cxt5066_unsol_event;
3151                 spec->init_verbs[spec->num_init_verbs] =
3152                         cxt5066_init_verbs_hp_laptop;
3153                 spec->num_init_verbs++;
3154                 spec->hp_laptop = board_config == CXT5066_HP_LAPTOP;
3155                 spec->asus = board_config == CXT5066_ASUS;
3156                 spec->mixers[spec->num_mixers++] = cxt5066_mixer_master;
3157                 spec->mixers[spec->num_mixers++] = cxt5066_mixers;
3158                 /* no S/PDIF out */
3159                 if (board_config == CXT5066_HP_LAPTOP)
3160                         spec->multiout.dig_out_nid = 0;
3161                 /* input source automatically selected */
3162                 spec->input_mux = NULL;
3163                 spec->port_d_mode = 0;
3164                 spec->mic_boost = 3; /* default 30dB gain */
3165                 break;
3166
3167         case CXT5066_OLPC_XO_1_5:
3168                 codec->patch_ops.init = cxt5066_olpc_init;
3169                 codec->patch_ops.unsol_event = cxt5066_olpc_unsol_event;
3170                 spec->init_verbs[0] = cxt5066_init_verbs_olpc;
3171                 spec->mixers[spec->num_mixers++] = cxt5066_mixer_master_olpc;
3172                 spec->mixers[spec->num_mixers++] = cxt5066_mixer_olpc_dc;
3173                 spec->mixers[spec->num_mixers++] = cxt5066_mixers;
3174                 spec->port_d_mode = 0;
3175                 spec->mic_boost = 3; /* default 30dB gain */
3176
3177                 /* no S/PDIF out */
3178                 spec->multiout.dig_out_nid = 0;
3179
3180                 /* input source automatically selected */
3181                 spec->input_mux = NULL;
3182
3183                 /* our capture hooks which allow us to turn on the microphone LED
3184                  * at the right time */
3185                 spec->capture_prepare = cxt5066_olpc_capture_prepare;
3186                 spec->capture_cleanup = cxt5066_olpc_capture_cleanup;
3187                 break;
3188         case CXT5066_DELL_VOSTRO:
3189                 codec->patch_ops.init = cxt5066_init;
3190                 codec->patch_ops.unsol_event = cxt5066_unsol_event;
3191                 spec->init_verbs[0] = cxt5066_init_verbs_vostro;
3192                 spec->mixers[spec->num_mixers++] = cxt5066_mixer_master_olpc;
3193                 spec->mixers[spec->num_mixers++] = cxt5066_mixers;
3194                 spec->mixers[spec->num_mixers++] = cxt5066_vostro_mixers;
3195                 spec->port_d_mode = 0;
3196                 spec->dell_vostro = 1;
3197                 spec->mic_boost = 3; /* default 30dB gain */
3198
3199                 /* no S/PDIF out */
3200                 spec->multiout.dig_out_nid = 0;
3201
3202                 /* input source automatically selected */
3203                 spec->input_mux = NULL;
3204                 break;
3205         case CXT5066_IDEAPAD:
3206                 codec->patch_ops.init = cxt5066_init;
3207                 codec->patch_ops.unsol_event = cxt5066_unsol_event;
3208                 spec->mixers[spec->num_mixers++] = cxt5066_mixer_master;
3209                 spec->mixers[spec->num_mixers++] = cxt5066_mixers;
3210                 spec->init_verbs[0] = cxt5066_init_verbs_ideapad;
3211                 spec->port_d_mode = 0;
3212                 spec->ideapad = 1;
3213                 spec->mic_boost = 2;    /* default 20dB gain */
3214
3215                 /* no S/PDIF out */
3216                 spec->multiout.dig_out_nid = 0;
3217
3218                 /* input source automatically selected */
3219                 spec->input_mux = NULL;
3220                 break;
3221         case CXT5066_THINKPAD:
3222                 codec->patch_ops.init = cxt5066_init;
3223                 codec->patch_ops.unsol_event = cxt5066_unsol_event;
3224                 spec->mixers[spec->num_mixers++] = cxt5066_mixer_master;
3225                 spec->mixers[spec->num_mixers++] = cxt5066_mixers;
3226                 spec->init_verbs[0] = cxt5066_init_verbs_thinkpad;
3227                 spec->thinkpad = 1;
3228                 spec->port_d_mode = PIN_OUT;
3229                 spec->mic_boost = 2;    /* default 20dB gain */
3230
3231                 /* no S/PDIF out */
3232                 spec->multiout.dig_out_nid = 0;
3233
3234                 /* input source automatically selected */
3235                 spec->input_mux = NULL;
3236                 break;
3237         }
3238
3239         if (spec->beep_amp)
3240                 snd_hda_attach_beep_device(codec, spec->beep_amp);
3241
3242         return 0;
3243 }
3244
3245 /*
3246  * Automatic parser for CX20641 & co
3247  */
3248
3249 static int cx_auto_capture_pcm_prepare(struct hda_pcm_stream *hinfo,
3250                                        struct hda_codec *codec,
3251                                        unsigned int stream_tag,
3252                                        unsigned int format,
3253                                        struct snd_pcm_substream *substream)
3254 {
3255         struct conexant_spec *spec = codec->spec;
3256         hda_nid_t adc = spec->imux_info[spec->cur_mux[0]].adc;
3257         if (spec->adc_switching) {
3258                 spec->cur_adc = adc;
3259                 spec->cur_adc_stream_tag = stream_tag;
3260                 spec->cur_adc_format = format;
3261         }
3262         snd_hda_codec_setup_stream(codec, adc, stream_tag, 0, format);
3263         return 0;
3264 }
3265
3266 static int cx_auto_capture_pcm_cleanup(struct hda_pcm_stream *hinfo,
3267                                        struct hda_codec *codec,
3268                                        struct snd_pcm_substream *substream)
3269 {
3270         struct conexant_spec *spec = codec->spec;
3271         snd_hda_codec_cleanup_stream(codec, spec->cur_adc);
3272         spec->cur_adc = 0;
3273         return 0;
3274 }
3275
3276 static const struct hda_pcm_stream cx_auto_pcm_analog_capture = {
3277         .substreams = 1,
3278         .channels_min = 2,
3279         .channels_max = 2,
3280         .nid = 0, /* fill later */
3281         .ops = {
3282                 .prepare = cx_auto_capture_pcm_prepare,
3283                 .cleanup = cx_auto_capture_pcm_cleanup
3284         },
3285 };
3286
3287 static const hda_nid_t cx_auto_adc_nids[] = { 0x14 };
3288
3289 #define get_connection_index(codec, mux, nid)\
3290         snd_hda_get_conn_index(codec, mux, nid, 0)
3291
3292 /* get an unassigned DAC from the given list.
3293  * Return the nid if found and reduce the DAC list, or return zero if
3294  * not found
3295  */
3296 static hda_nid_t get_unassigned_dac(struct hda_codec *codec, hda_nid_t pin,
3297                                     hda_nid_t *dacs, int *num_dacs)
3298 {
3299         int i, nums = *num_dacs;
3300         hda_nid_t ret = 0;
3301
3302         for (i = 0; i < nums; i++) {
3303                 if (get_connection_index(codec, pin, dacs[i]) >= 0) {
3304                         ret = dacs[i];
3305                         break;
3306                 }
3307         }
3308         if (!ret)
3309                 return 0;
3310         if (--nums > 0)
3311                 memmove(dacs, dacs + 1, nums * sizeof(hda_nid_t));
3312         *num_dacs = nums;
3313         return ret;
3314 }
3315
3316 #define MAX_AUTO_DACS   5
3317
3318 #define DAC_SLAVE_FLAG  0x8000  /* filled dac is a slave */
3319
3320 /* fill analog DAC list from the widget tree */
3321 static int fill_cx_auto_dacs(struct hda_codec *codec, hda_nid_t *dacs)
3322 {
3323         hda_nid_t nid, end_nid;
3324         int nums = 0;
3325
3326         end_nid = codec->start_nid + codec->num_nodes;
3327         for (nid = codec->start_nid; nid < end_nid; nid++) {
3328                 unsigned int wcaps = get_wcaps(codec, nid);
3329                 unsigned int type = get_wcaps_type(wcaps);
3330                 if (type == AC_WID_AUD_OUT && !(wcaps & AC_WCAP_DIGITAL)) {
3331                         dacs[nums++] = nid;
3332                         if (nums >= MAX_AUTO_DACS)
3333                                 break;
3334                 }
3335         }
3336         return nums;
3337 }
3338
3339 /* fill pin_dac_pair list from the pin and dac list */
3340 static int fill_dacs_for_pins(struct hda_codec *codec, hda_nid_t *pins,
3341                               int num_pins, hda_nid_t *dacs, int *rest,
3342                               struct pin_dac_pair *filled, int nums, 
3343                               int type)
3344 {
3345         int i, start = nums;
3346
3347         for (i = 0; i < num_pins; i++, nums++) {
3348                 filled[nums].pin = pins[i];
3349                 filled[nums].type = type;
3350                 filled[nums].dac = get_unassigned_dac(codec, pins[i], dacs, rest);
3351                 if (filled[nums].dac) 
3352                         continue;
3353                 if (filled[start].dac && get_connection_index(codec, pins[i], filled[start].dac) >= 0) {
3354                         filled[nums].dac = filled[start].dac | DAC_SLAVE_FLAG;
3355                         continue;
3356                 }
3357                 if (filled[0].dac && get_connection_index(codec, pins[i], filled[0].dac) >= 0) {
3358                         filled[nums].dac = filled[0].dac | DAC_SLAVE_FLAG;
3359                         continue;
3360                 }
3361                 snd_printdd("Failed to find a DAC for pin 0x%x", pins[i]);
3362         }
3363         return nums;
3364 }
3365
3366 /* parse analog output paths */
3367 static void cx_auto_parse_output(struct hda_codec *codec)
3368 {
3369         struct conexant_spec *spec = codec->spec;
3370         struct auto_pin_cfg *cfg = &spec->autocfg;
3371         hda_nid_t dacs[MAX_AUTO_DACS];
3372         int i, j, nums, rest;
3373
3374         rest = fill_cx_auto_dacs(codec, dacs);
3375         /* parse all analog output pins */
3376         nums = fill_dacs_for_pins(codec, cfg->line_out_pins, cfg->line_outs,
3377                           dacs, &rest, spec->dac_info, 0,
3378                           AUTO_PIN_LINE_OUT);
3379         nums = fill_dacs_for_pins(codec, cfg->hp_pins, cfg->hp_outs,
3380                           dacs, &rest, spec->dac_info, nums,
3381                           AUTO_PIN_HP_OUT);
3382         nums = fill_dacs_for_pins(codec, cfg->speaker_pins, cfg->speaker_outs,
3383                           dacs, &rest, spec->dac_info, nums,
3384                           AUTO_PIN_SPEAKER_OUT);
3385         spec->dac_info_filled = nums;
3386         /* fill multiout struct */
3387         for (i = 0; i < nums; i++) {
3388                 hda_nid_t dac = spec->dac_info[i].dac;
3389                 if (!dac || (dac & DAC_SLAVE_FLAG))
3390                         continue;
3391                 switch (spec->dac_info[i].type) {
3392                 case AUTO_PIN_LINE_OUT:
3393                         spec->private_dac_nids[spec->multiout.num_dacs] = dac;
3394                         spec->multiout.num_dacs++;
3395                         break;
3396                 case AUTO_PIN_HP_OUT:
3397                 case AUTO_PIN_SPEAKER_OUT:
3398                         if (!spec->multiout.hp_nid) {
3399                                 spec->multiout.hp_nid = dac;
3400                                 break;
3401                         }
3402                         for (j = 0; j < ARRAY_SIZE(spec->multiout.extra_out_nid); j++)
3403                                 if (!spec->multiout.extra_out_nid[j]) {
3404                                         spec->multiout.extra_out_nid[j] = dac;
3405                                         break;
3406                                 }
3407                         break;
3408                 }
3409         }
3410         spec->multiout.dac_nids = spec->private_dac_nids;
3411         spec->multiout.max_channels = spec->multiout.num_dacs * 2;
3412
3413         for (i = 0; i < cfg->hp_outs; i++) {
3414                 if (is_jack_detectable(codec, cfg->hp_pins[i])) {
3415                         spec->auto_mute = 1;
3416                         break;
3417                 }
3418         }
3419         if (spec->auto_mute &&
3420             cfg->line_out_pins[0] &&
3421             cfg->line_out_type != AUTO_PIN_SPEAKER_OUT &&
3422             cfg->line_out_pins[0] != cfg->hp_pins[0] &&
3423             cfg->line_out_pins[0] != cfg->speaker_pins[0]) {
3424                 for (i = 0; i < cfg->line_outs; i++) {
3425                         if (is_jack_detectable(codec, cfg->line_out_pins[i])) {
3426                                 spec->detect_line = 1;
3427                                 break;
3428                         }
3429                 }
3430                 spec->automute_lines = spec->detect_line;
3431         }
3432
3433         spec->vmaster_nid = spec->private_dac_nids[0];
3434 }
3435
3436 static void cx_auto_turn_eapd(struct hda_codec *codec, int num_pins,
3437                               hda_nid_t *pins, bool on);
3438
3439 static void do_automute(struct hda_codec *codec, int num_pins,
3440                         hda_nid_t *pins, bool on)
3441 {
3442         struct conexant_spec *spec = codec->spec;
3443         int i;
3444         for (i = 0; i < num_pins; i++)
3445                 snd_hda_codec_write(codec, pins[i], 0,
3446                                     AC_VERB_SET_PIN_WIDGET_CONTROL,
3447                                     on ? PIN_OUT : 0);
3448         if (spec->pin_eapd_ctrls)
3449                 cx_auto_turn_eapd(codec, num_pins, pins, on);
3450 }
3451
3452 static int detect_jacks(struct hda_codec *codec, int num_pins, hda_nid_t *pins)
3453 {
3454         int i, present = 0;
3455
3456         for (i = 0; i < num_pins; i++) {
3457                 hda_nid_t nid = pins[i];
3458                 if (!nid || !is_jack_detectable(codec, nid))
3459                         break;
3460                 snd_hda_input_jack_report(codec, nid);
3461                 present |= snd_hda_jack_detect(codec, nid);
3462         }
3463         return present;
3464 }
3465
3466 /* auto-mute/unmute speaker and line outs according to headphone jack */
3467 static void cx_auto_update_speakers(struct hda_codec *codec)
3468 {
3469         struct conexant_spec *spec = codec->spec;
3470         struct auto_pin_cfg *cfg = &spec->autocfg;
3471         int on = 1;
3472
3473         /* turn on HP EAPD when HP jacks are present */
3474         if (spec->pin_eapd_ctrls) {
3475                 if (spec->auto_mute)
3476                         on = spec->hp_present;
3477                 cx_auto_turn_eapd(codec, cfg->hp_outs, cfg->hp_pins, on);
3478         }
3479
3480         /* mute speakers in auto-mode if HP or LO jacks are plugged */
3481         if (spec->auto_mute)
3482                 on = !(spec->hp_present ||
3483                        (spec->detect_line && spec->line_present));
3484         do_automute(codec, cfg->speaker_outs, cfg->speaker_pins, on);
3485
3486         /* toggle line-out mutes if needed, too */
3487         /* if LO is a copy of either HP or Speaker, don't need to handle it */
3488         if (cfg->line_out_pins[0] == cfg->hp_pins[0] ||
3489             cfg->line_out_pins[0] == cfg->speaker_pins[0])
3490                 return;
3491         if (spec->auto_mute) {
3492                 /* mute LO in auto-mode when HP jack is present */
3493                 if (cfg->line_out_type == AUTO_PIN_SPEAKER_OUT ||
3494                     spec->automute_lines)
3495                         on = !spec->hp_present;
3496                 else
3497                         on = 1;
3498         }
3499         do_automute(codec, cfg->line_outs, cfg->line_out_pins, on);
3500 }
3501
3502 static void cx_auto_hp_automute(struct hda_codec *codec)
3503 {
3504         struct conexant_spec *spec = codec->spec;
3505         struct auto_pin_cfg *cfg = &spec->autocfg;
3506
3507         if (!spec->auto_mute)
3508                 return;
3509         spec->hp_present = detect_jacks(codec, cfg->hp_outs, cfg->hp_pins);
3510         cx_auto_update_speakers(codec);
3511 }
3512
3513 static void cx_auto_line_automute(struct hda_codec *codec)
3514 {
3515         struct conexant_spec *spec = codec->spec;
3516         struct auto_pin_cfg *cfg = &spec->autocfg;
3517
3518         if (!spec->auto_mute || !spec->detect_line)
3519                 return;
3520         spec->line_present = detect_jacks(codec, cfg->line_outs,
3521                                           cfg->line_out_pins);
3522         cx_auto_update_speakers(codec);
3523 }
3524
3525 static int cx_automute_mode_info(struct snd_kcontrol *kcontrol,
3526                                  struct snd_ctl_elem_info *uinfo)
3527 {
3528         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
3529         struct conexant_spec *spec = codec->spec;
3530         static const char * const texts2[] = {
3531                 "Disabled", "Enabled"
3532         };
3533         static const char * const texts3[] = {
3534                 "Disabled", "Speaker Only", "Line-Out+Speaker"
3535         };
3536         const char * const *texts;
3537
3538         uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
3539         uinfo->count = 1;
3540         if (spec->automute_hp_lo) {
3541                 uinfo->value.enumerated.items = 3;
3542                 texts = texts3;
3543         } else {
3544                 uinfo->value.enumerated.items = 2;
3545                 texts = texts2;
3546         }
3547         if (uinfo->value.enumerated.item >= uinfo->value.enumerated.items)
3548                 uinfo->value.enumerated.item = uinfo->value.enumerated.items - 1;
3549         strcpy(uinfo->value.enumerated.name,
3550                texts[uinfo->value.enumerated.item]);
3551         return 0;
3552 }
3553
3554 static int cx_automute_mode_get(struct snd_kcontrol *kcontrol,
3555                                 struct snd_ctl_elem_value *ucontrol)
3556 {
3557         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
3558         struct conexant_spec *spec = codec->spec;
3559         unsigned int val;
3560         if (!spec->auto_mute)
3561                 val = 0;
3562         else if (!spec->automute_lines)
3563                 val = 1;
3564         else
3565                 val = 2;
3566         ucontrol->value.enumerated.item[0] = val;
3567         return 0;
3568 }
3569
3570 static int cx_automute_mode_put(struct snd_kcontrol *kcontrol,
3571                                 struct snd_ctl_elem_value *ucontrol)
3572 {
3573         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
3574         struct conexant_spec *spec = codec->spec;
3575
3576         switch (ucontrol->value.enumerated.item[0]) {
3577         case 0:
3578                 if (!spec->auto_mute)
3579                         return 0;
3580                 spec->auto_mute = 0;
3581                 break;
3582         case 1:
3583                 if (spec->auto_mute && !spec->automute_lines)
3584                         return 0;
3585                 spec->auto_mute = 1;
3586                 spec->automute_lines = 0;
3587                 break;
3588         case 2:
3589                 if (!spec->automute_hp_lo)
3590                         return -EINVAL;
3591                 if (spec->auto_mute && spec->automute_lines)
3592                         return 0;
3593                 spec->auto_mute = 1;
3594                 spec->automute_lines = 1;
3595                 break;
3596         default:
3597                 return -EINVAL;
3598         }
3599         cx_auto_update_speakers(codec);
3600         return 1;
3601 }
3602
3603 static const struct snd_kcontrol_new cx_automute_mode_enum[] = {
3604         {
3605                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
3606                 .name = "Auto-Mute Mode",
3607                 .info = cx_automute_mode_info,
3608                 .get = cx_automute_mode_get,
3609                 .put = cx_automute_mode_put,
3610         },
3611         { }
3612 };
3613
3614 static int cx_auto_mux_enum_info(struct snd_kcontrol *kcontrol,
3615                                  struct snd_ctl_elem_info *uinfo)
3616 {
3617         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
3618         struct conexant_spec *spec = codec->spec;
3619
3620         return snd_hda_input_mux_info(&spec->private_imux, uinfo);
3621 }
3622
3623 static int cx_auto_mux_enum_get(struct snd_kcontrol *kcontrol,
3624                                 struct snd_ctl_elem_value *ucontrol)
3625 {
3626         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
3627         struct conexant_spec *spec = codec->spec;
3628
3629         ucontrol->value.enumerated.item[0] = spec->cur_mux[0];
3630         return 0;
3631 }
3632
3633 /* look for the route the given pin from mux and return the index;
3634  * if do_select is set, actually select the route.
3635  */
3636 static int __select_input_connection(struct hda_codec *codec, hda_nid_t mux,
3637                                      hda_nid_t pin, hda_nid_t *srcp,
3638                                      bool do_select, int depth)
3639 {
3640         hda_nid_t conn[HDA_MAX_NUM_INPUTS];
3641         int i, nums;
3642
3643         switch (get_wcaps_type(get_wcaps(codec, mux))) {
3644         case AC_WID_AUD_IN:
3645         case AC_WID_AUD_SEL:
3646         case AC_WID_AUD_MIX:
3647                 break;
3648         default:
3649                 return -1;
3650         }
3651
3652         nums = snd_hda_get_connections(codec, mux, conn, ARRAY_SIZE(conn));
3653         for (i = 0; i < nums; i++)
3654                 if (conn[i] == pin) {
3655                         if (do_select)
3656                                 snd_hda_codec_write(codec, mux, 0,
3657                                                     AC_VERB_SET_CONNECT_SEL, i);
3658                         if (srcp)
3659                                 *srcp = mux;
3660                         return i;
3661                 }
3662         depth++;
3663         if (depth == 2)
3664                 return -1;
3665         for (i = 0; i < nums; i++) {
3666                 int ret  = __select_input_connection(codec, conn[i], pin, srcp,
3667                                                      do_select, depth);
3668                 if (ret >= 0) {
3669                         if (do_select)
3670                                 snd_hda_codec_write(codec, mux, 0,
3671                                                     AC_VERB_SET_CONNECT_SEL, i);
3672                         return i;
3673                 }
3674         }
3675         return -1;
3676 }
3677
3678 static void select_input_connection(struct hda_codec *codec, hda_nid_t mux,
3679                                    hda_nid_t pin)
3680 {
3681         __select_input_connection(codec, mux, pin, NULL, true, 0);
3682 }
3683
3684 static int get_input_connection(struct hda_codec *codec, hda_nid_t mux,
3685                                 hda_nid_t pin)
3686 {
3687         return __select_input_connection(codec, mux, pin, NULL, false, 0);
3688 }
3689
3690 static int cx_auto_mux_enum_update(struct hda_codec *codec,
3691                                    const struct hda_input_mux *imux,
3692                                    unsigned int idx)
3693 {
3694         struct conexant_spec *spec = codec->spec;
3695         hda_nid_t adc;
3696         int changed = 1;
3697
3698         if (!imux->num_items)
3699                 return 0;
3700         if (idx >= imux->num_items)
3701                 idx = imux->num_items - 1;
3702         if (spec->cur_mux[0] == idx)
3703                 changed = 0;
3704         adc = spec->imux_info[idx].adc;
3705         select_input_connection(codec, spec->imux_info[idx].adc,
3706                                 spec->imux_info[idx].pin);
3707         if (spec->cur_adc && spec->cur_adc != adc) {
3708                 /* stream is running, let's swap the current ADC */
3709                 __snd_hda_codec_cleanup_stream(codec, spec->cur_adc, 1);
3710                 spec->cur_adc = adc;
3711                 snd_hda_codec_setup_stream(codec, adc,
3712                                            spec->cur_adc_stream_tag, 0,
3713                                            spec->cur_adc_format);
3714         }
3715         spec->cur_mux[0] = idx;
3716         return changed;
3717 }
3718
3719 static int cx_auto_mux_enum_put(struct snd_kcontrol *kcontrol,
3720                                 struct snd_ctl_elem_value *ucontrol)
3721 {
3722         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
3723         struct conexant_spec *spec = codec->spec;
3724
3725         return cx_auto_mux_enum_update(codec, &spec->private_imux,
3726                                        ucontrol->value.enumerated.item[0]);
3727 }
3728
3729 static const struct snd_kcontrol_new cx_auto_capture_mixers[] = {
3730         {
3731                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
3732                 .name = "Capture Source",
3733                 .info = cx_auto_mux_enum_info,
3734                 .get = cx_auto_mux_enum_get,
3735                 .put = cx_auto_mux_enum_put
3736         },
3737         {}
3738 };
3739
3740 static bool select_automic(struct hda_codec *codec, int idx, bool detect)
3741 {
3742         struct conexant_spec *spec = codec->spec;
3743         if (idx < 0)
3744                 return false;
3745         if (detect && !snd_hda_jack_detect(codec, spec->imux_info[idx].pin))
3746                 return false;
3747         cx_auto_mux_enum_update(codec, &spec->private_imux, idx);
3748         return true;
3749 }
3750
3751 /* automatic switch internal and external mic */
3752 static void cx_auto_automic(struct hda_codec *codec)
3753 {
3754         struct conexant_spec *spec = codec->spec;
3755
3756         if (!spec->auto_mic)
3757                 return;
3758         if (!select_automic(codec, spec->auto_mic_ext, true))
3759                 if (!select_automic(codec, spec->auto_mic_dock, true))
3760                         select_automic(codec, spec->auto_mic_int, false);
3761 }
3762
3763 static void cx_auto_unsol_event(struct hda_codec *codec, unsigned int res)
3764 {
3765         int nid = (res & AC_UNSOL_RES_SUBTAG) >> 20;
3766         switch (res >> 26) {
3767         case CONEXANT_HP_EVENT:
3768                 cx_auto_hp_automute(codec);
3769                 break;
3770         case CONEXANT_LINE_EVENT:
3771                 cx_auto_line_automute(codec);
3772                 break;
3773         case CONEXANT_MIC_EVENT:
3774                 cx_auto_automic(codec);
3775                 snd_hda_input_jack_report(codec, nid);
3776                 break;
3777         }
3778 }
3779
3780 /* check whether the pin config is suitable for auto-mic switching;
3781  * auto-mic is enabled only when one int-mic and one ext- and/or
3782  * one dock-mic exist
3783  */
3784 static void cx_auto_check_auto_mic(struct hda_codec *codec)
3785 {
3786         struct conexant_spec *spec = codec->spec;
3787         int pset[INPUT_PIN_ATTR_NORMAL + 1];
3788         int i;
3789
3790         for (i = 0; i < ARRAY_SIZE(pset); i++)
3791                 pset[i] = -1;
3792         for (i = 0; i < spec->private_imux.num_items; i++) {
3793                 hda_nid_t pin = spec->imux_info[i].pin;
3794                 unsigned int def_conf = snd_hda_codec_get_pincfg(codec, pin);
3795                 int type, attr;
3796                 attr = snd_hda_get_input_pin_attr(def_conf);
3797                 if (attr == INPUT_PIN_ATTR_UNUSED)
3798                         return; /* invalid entry */
3799                 if (attr > INPUT_PIN_ATTR_NORMAL)
3800                         attr = INPUT_PIN_ATTR_NORMAL;
3801                 if (attr != INPUT_PIN_ATTR_INT &&
3802                     !is_jack_detectable(codec, pin))
3803                         return; /* non-detectable pin */
3804                 type = get_defcfg_device(def_conf);
3805                 if (type != AC_JACK_MIC_IN &&
3806                     (attr != INPUT_PIN_ATTR_DOCK || type != AC_JACK_LINE_IN))
3807                         return; /* no valid input type */
3808                 if (pset[attr] >= 0)
3809                         return; /* already occupied */
3810                 pset[attr] = i;
3811         }
3812         if (pset[INPUT_PIN_ATTR_INT] < 0 ||
3813             (pset[INPUT_PIN_ATTR_NORMAL] < 0 && pset[INPUT_PIN_ATTR_DOCK]))
3814                 return; /* no input to switch*/
3815         spec->auto_mic = 1;
3816         spec->auto_mic_ext = pset[INPUT_PIN_ATTR_NORMAL];
3817         spec->auto_mic_dock = pset[INPUT_PIN_ATTR_DOCK];
3818         spec->auto_mic_int = pset[INPUT_PIN_ATTR_INT];
3819 }
3820
3821 static void cx_auto_parse_input(struct hda_codec *codec)
3822 {
3823         struct conexant_spec *spec = codec->spec;
3824         struct auto_pin_cfg *cfg = &spec->autocfg;
3825         struct hda_input_mux *imux;
3826         int i, j;
3827
3828         imux = &spec->private_imux;
3829         for (i = 0; i < cfg->num_inputs; i++) {
3830                 for (j = 0; j < spec->num_adc_nids; j++) {
3831                         hda_nid_t adc = spec->adc_nids[j];
3832                         int idx = get_input_connection(codec, adc,
3833                                                        cfg->inputs[i].pin);
3834                         if (idx >= 0) {
3835                                 const char *label;
3836                                 label = hda_get_autocfg_input_label(codec, cfg, i);
3837                                 spec->imux_info[imux->num_items].index = i;
3838                                 spec->imux_info[imux->num_items].boost = 0;
3839                                 spec->imux_info[imux->num_items].adc = adc;
3840                                 spec->imux_info[imux->num_items].pin =
3841                                         cfg->inputs[i].pin;
3842                                 snd_hda_add_imux_item(imux, label, idx, NULL);
3843                                 break;
3844                         }
3845                 }
3846         }
3847         if (imux->num_items >= 2 && cfg->num_inputs == imux->num_items)
3848                 cx_auto_check_auto_mic(codec);
3849         if (imux->num_items > 1) {
3850                 for (i = 1; i < imux->num_items; i++) {
3851                         if (spec->imux_info[i].adc != spec->imux_info[0].adc) {
3852                                 spec->adc_switching = 1;
3853                                 break;
3854                         }
3855                 }
3856         }
3857 }
3858
3859 /* get digital-input audio widget corresponding to the given pin */
3860 static hda_nid_t cx_auto_get_dig_in(struct hda_codec *codec, hda_nid_t pin)
3861 {
3862         hda_nid_t nid, end_nid;
3863
3864         end_nid = codec->start_nid + codec->num_nodes;
3865         for (nid = codec->start_nid; nid < end_nid; nid++) {
3866                 unsigned int wcaps = get_wcaps(codec, nid);
3867                 unsigned int type = get_wcaps_type(wcaps);
3868                 if (type == AC_WID_AUD_IN && (wcaps & AC_WCAP_DIGITAL)) {
3869                         if (get_connection_index(codec, nid, pin) >= 0)
3870                                 return nid;
3871                 }
3872         }
3873         return 0;
3874 }
3875
3876 static void cx_auto_parse_digital(struct hda_codec *codec)
3877 {
3878         struct conexant_spec *spec = codec->spec;
3879         struct auto_pin_cfg *cfg = &spec->autocfg;
3880         hda_nid_t nid;
3881
3882         if (cfg->dig_outs &&
3883             snd_hda_get_connections(codec, cfg->dig_out_pins[0], &nid, 1) == 1)
3884                 spec->multiout.dig_out_nid = nid;
3885         if (cfg->dig_in_pin)
3886                 spec->dig_in_nid = cx_auto_get_dig_in(codec, cfg->dig_in_pin);
3887 }
3888
3889 #ifdef CONFIG_SND_HDA_INPUT_BEEP
3890 static void cx_auto_parse_beep(struct hda_codec *codec)
3891 {
3892         struct conexant_spec *spec = codec->spec;
3893         hda_nid_t nid, end_nid;
3894
3895         end_nid = codec->start_nid + codec->num_nodes;
3896         for (nid = codec->start_nid; nid < end_nid; nid++)
3897                 if (get_wcaps_type(get_wcaps(codec, nid)) == AC_WID_BEEP) {
3898                         set_beep_amp(spec, nid, 0, HDA_OUTPUT);
3899                         break;
3900                 }
3901 }
3902 #else
3903 #define cx_auto_parse_beep(codec)
3904 #endif
3905
3906 /* parse EAPDs */
3907 static void cx_auto_parse_eapd(struct hda_codec *codec)
3908 {
3909         struct conexant_spec *spec = codec->spec;
3910         hda_nid_t nid, end_nid;
3911
3912         end_nid = codec->start_nid + codec->num_nodes;
3913         for (nid = codec->start_nid; nid < end_nid; nid++) {
3914                 if (get_wcaps_type(get_wcaps(codec, nid)) != AC_WID_PIN)
3915                         continue;
3916                 if (!(snd_hda_query_pin_caps(codec, nid) & AC_PINCAP_EAPD))
3917                         continue;
3918                 spec->eapds[spec->num_eapds++] = nid;
3919                 if (spec->num_eapds >= ARRAY_SIZE(spec->eapds))
3920                         break;
3921         }
3922
3923         /* NOTE: below is a wild guess; if we have more than two EAPDs,
3924          * it's a new chip, where EAPDs are supposed to be associated to
3925          * pins, and we can control EAPD per pin.
3926          * OTOH, if only one or two EAPDs are found, it's an old chip,
3927          * thus it might control over all pins.
3928          */
3929         spec->pin_eapd_ctrls = spec->num_eapds > 2;
3930 }
3931
3932 static int cx_auto_parse_auto_config(struct hda_codec *codec)
3933 {
3934         struct conexant_spec *spec = codec->spec;
3935         int err;
3936
3937         err = snd_hda_parse_pin_def_config(codec, &spec->autocfg, NULL);
3938         if (err < 0)
3939                 return err;
3940
3941         cx_auto_parse_output(codec);
3942         cx_auto_parse_input(codec);
3943         cx_auto_parse_digital(codec);
3944         cx_auto_parse_beep(codec);
3945         cx_auto_parse_eapd(codec);
3946         return 0;
3947 }
3948
3949 static void cx_auto_turn_eapd(struct hda_codec *codec, int num_pins,
3950                               hda_nid_t *pins, bool on)
3951 {
3952         int i;
3953         for (i = 0; i < num_pins; i++) {
3954                 if (snd_hda_query_pin_caps(codec, pins[i]) & AC_PINCAP_EAPD)
3955                         snd_hda_codec_write(codec, pins[i], 0,
3956                                             AC_VERB_SET_EAPD_BTLENABLE,
3957                                             on ? 0x02 : 0);
3958         }
3959 }
3960
3961 static void select_connection(struct hda_codec *codec, hda_nid_t pin,
3962                               hda_nid_t src)
3963 {
3964         int idx = get_connection_index(codec, pin, src);
3965         if (idx >= 0)
3966                 snd_hda_codec_write(codec, pin, 0,
3967                                     AC_VERB_SET_CONNECT_SEL, idx);
3968 }
3969
3970 static void mute_outputs(struct hda_codec *codec, int num_nids,
3971                          const hda_nid_t *nids)
3972 {
3973         int i, val;
3974
3975         for (i = 0; i < num_nids; i++) {
3976                 hda_nid_t nid = nids[i];
3977                 if (!(get_wcaps(codec, nid) & AC_WCAP_OUT_AMP))
3978                         continue;
3979                 if (query_amp_caps(codec, nid, HDA_OUTPUT) & AC_AMPCAP_MUTE)
3980                         val = AMP_OUT_MUTE;
3981                 else
3982                         val = AMP_OUT_ZERO;
3983                 snd_hda_codec_write(codec, nid, 0,
3984                                     AC_VERB_SET_AMP_GAIN_MUTE, val);
3985         }
3986 }
3987
3988 static void enable_unsol_pins(struct hda_codec *codec, int num_pins,
3989                               hda_nid_t *pins, unsigned int tag)
3990 {
3991         int i;
3992         for (i = 0; i < num_pins; i++)
3993                 snd_hda_codec_write(codec, pins[i], 0,
3994                                     AC_VERB_SET_UNSOLICITED_ENABLE,
3995                                     AC_USRSP_EN | tag);
3996 }
3997
3998 static void cx_auto_init_output(struct hda_codec *codec)
3999 {
4000         struct conexant_spec *spec = codec->spec;
4001         struct auto_pin_cfg *cfg = &spec->autocfg;
4002         hda_nid_t nid;
4003         int i;
4004
4005         mute_outputs(codec, spec->multiout.num_dacs, spec->multiout.dac_nids);
4006         for (i = 0; i < cfg->hp_outs; i++)
4007                 snd_hda_codec_write(codec, cfg->hp_pins[i], 0,
4008                                     AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP);
4009         mute_outputs(codec, cfg->hp_outs, cfg->hp_pins);
4010         mute_outputs(codec, cfg->line_outs, cfg->line_out_pins);
4011         mute_outputs(codec, cfg->speaker_outs, cfg->speaker_pins);
4012         for (i = 0; i < spec->dac_info_filled; i++) {
4013                 nid = spec->dac_info[i].dac;
4014                 if (!nid)
4015                         nid = spec->multiout.dac_nids[0];
4016                 else if (nid & DAC_SLAVE_FLAG)
4017                         nid &= ~DAC_SLAVE_FLAG;
4018                 select_connection(codec, spec->dac_info[i].pin, nid);
4019         }
4020         if (spec->auto_mute) {
4021                 enable_unsol_pins(codec, cfg->hp_outs, cfg->hp_pins,
4022                                   CONEXANT_HP_EVENT);
4023                 spec->hp_present = detect_jacks(codec, cfg->hp_outs,
4024                                                 cfg->hp_pins);
4025                 if (spec->detect_line) {
4026                         enable_unsol_pins(codec, cfg->line_outs,
4027                                           cfg->line_out_pins,
4028                                           CONEXANT_LINE_EVENT);
4029                         spec->line_present =
4030                                 detect_jacks(codec, cfg->line_outs,
4031                                              cfg->line_out_pins);
4032                 }
4033         }
4034         cx_auto_update_speakers(codec);
4035         /* turn on all EAPDs if no individual EAPD control is available */
4036         if (!spec->pin_eapd_ctrls)
4037                 cx_auto_turn_eapd(codec, spec->num_eapds, spec->eapds, true);
4038 }
4039
4040 static void cx_auto_init_input(struct hda_codec *codec)
4041 {
4042         struct conexant_spec *spec = codec->spec;
4043         struct auto_pin_cfg *cfg = &spec->autocfg;
4044         int i, val;
4045
4046         for (i = 0; i < spec->num_adc_nids; i++) {
4047                 hda_nid_t nid = spec->adc_nids[i];
4048                 if (!(get_wcaps(codec, nid) & AC_WCAP_IN_AMP))
4049                         continue;
4050                 if (query_amp_caps(codec, nid, HDA_INPUT) & AC_AMPCAP_MUTE)
4051                         val = AMP_IN_MUTE(0);
4052                 else
4053                         val = AMP_IN_UNMUTE(0);
4054                 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_AMP_GAIN_MUTE,
4055                                     val);
4056         }
4057
4058         for (i = 0; i < cfg->num_inputs; i++) {
4059                 unsigned int type;
4060                 if (cfg->inputs[i].type == AUTO_PIN_MIC)
4061                         type = PIN_VREF80;
4062                 else
4063                         type = PIN_IN;
4064                 snd_hda_codec_write(codec, cfg->inputs[i].pin, 0,
4065                                     AC_VERB_SET_PIN_WIDGET_CONTROL, type);
4066         }
4067
4068         if (spec->auto_mic) {
4069                 if (spec->auto_mic_ext >= 0) {
4070                         snd_hda_codec_write(codec,
4071                                 cfg->inputs[spec->auto_mic_ext].pin, 0,
4072                                 AC_VERB_SET_UNSOLICITED_ENABLE,
4073                                 AC_USRSP_EN | CONEXANT_MIC_EVENT);
4074                 }
4075                 if (spec->auto_mic_dock >= 0) {
4076                         snd_hda_codec_write(codec,
4077                                 cfg->inputs[spec->auto_mic_dock].pin, 0,
4078                                 AC_VERB_SET_UNSOLICITED_ENABLE,
4079                                 AC_USRSP_EN | CONEXANT_MIC_EVENT);
4080                 }
4081                 cx_auto_automic(codec);
4082         } else {
4083                 select_input_connection(codec, spec->imux_info[0].adc,
4084                                         spec->imux_info[0].pin);
4085         }
4086 }
4087
4088 static void cx_auto_init_digital(struct hda_codec *codec)
4089 {
4090         struct conexant_spec *spec = codec->spec;
4091         struct auto_pin_cfg *cfg = &spec->autocfg;
4092
4093         if (spec->multiout.dig_out_nid)
4094                 snd_hda_codec_write(codec, cfg->dig_out_pins[0], 0,
4095                                     AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
4096         if (spec->dig_in_nid)
4097                 snd_hda_codec_write(codec, cfg->dig_in_pin, 0,
4098                                     AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN);
4099 }
4100
4101 static int cx_auto_init(struct hda_codec *codec)
4102 {
4103         /*snd_hda_sequence_write(codec, cx_auto_init_verbs);*/
4104         cx_auto_init_output(codec);
4105         cx_auto_init_input(codec);
4106         cx_auto_init_digital(codec);
4107         return 0;
4108 }
4109
4110 static int cx_auto_add_volume_idx(struct hda_codec *codec, const char *basename,
4111                               const char *dir, int cidx,
4112                               hda_nid_t nid, int hda_dir, int amp_idx)
4113 {
4114         static char name[32];
4115         static struct snd_kcontrol_new knew[] = {
4116                 HDA_CODEC_VOLUME(name, 0, 0, 0),
4117                 HDA_CODEC_MUTE(name, 0, 0, 0),
4118         };
4119         static const char * const sfx[2] = { "Volume", "Switch" };
4120         int i, err;
4121
4122         for (i = 0; i < 2; i++) {
4123                 struct snd_kcontrol *kctl;
4124                 knew[i].private_value = HDA_COMPOSE_AMP_VAL(nid, 3, amp_idx,
4125                                                             hda_dir);
4126                 knew[i].subdevice = HDA_SUBDEV_AMP_FLAG;
4127                 knew[i].index = cidx;
4128                 snprintf(name, sizeof(name), "%s%s %s", basename, dir, sfx[i]);
4129                 kctl = snd_ctl_new1(&knew[i], codec);
4130                 if (!kctl)
4131                         return -ENOMEM;
4132                 err = snd_hda_ctl_add(codec, nid, kctl);
4133                 if (err < 0)
4134                         return err;
4135                 if (!(query_amp_caps(codec, nid, hda_dir) &
4136                       (AC_AMPCAP_MUTE | AC_AMPCAP_MIN_MUTE)))
4137                         break;
4138         }
4139         return 0;
4140 }
4141
4142 #define cx_auto_add_volume(codec, str, dir, cidx, nid, hda_dir)         \
4143         cx_auto_add_volume_idx(codec, str, dir, cidx, nid, hda_dir, 0)
4144
4145 #define cx_auto_add_pb_volume(codec, nid, str, idx)                     \
4146         cx_auto_add_volume(codec, str, " Playback", idx, nid, HDA_OUTPUT)
4147
4148 static int try_add_pb_volume(struct hda_codec *codec, hda_nid_t dac,
4149                              hda_nid_t pin, const char *name, int idx)
4150 {
4151         unsigned int caps;
4152         if (dac && !(dac & DAC_SLAVE_FLAG)) {
4153                 caps = query_amp_caps(codec, dac, HDA_OUTPUT);
4154                 if (caps & AC_AMPCAP_NUM_STEPS)
4155                         return cx_auto_add_pb_volume(codec, dac, name, idx);
4156         }
4157         caps = query_amp_caps(codec, pin, HDA_OUTPUT);
4158         if (caps & AC_AMPCAP_NUM_STEPS)
4159                 return cx_auto_add_pb_volume(codec, pin, name, idx);
4160         return 0;
4161 }
4162
4163 static int cx_auto_build_output_controls(struct hda_codec *codec)
4164 {
4165         struct conexant_spec *spec = codec->spec;
4166         int i, err;
4167         int num_line = 0, num_hp = 0, num_spk = 0;
4168         static const char * const texts[3] = { "Front", "Surround", "CLFE" };
4169
4170         if (spec->dac_info_filled == 1)
4171                 return try_add_pb_volume(codec, spec->dac_info[0].dac,
4172                                          spec->dac_info[0].pin,
4173                                          "Master", 0);
4174
4175         for (i = 0; i < spec->dac_info_filled; i++) {
4176                 const char *label;
4177                 int idx, type;
4178                 hda_nid_t dac = spec->dac_info[i].dac;
4179                 type = spec->dac_info[i].type;
4180                 if (type == AUTO_PIN_LINE_OUT)
4181                         type = spec->autocfg.line_out_type;
4182                 switch (type) {
4183                 case AUTO_PIN_LINE_OUT:
4184                 default:
4185                         label = texts[num_line++];
4186                         idx = 0;
4187                         break;
4188                 case AUTO_PIN_HP_OUT:
4189                         label = "Headphone";
4190                         idx = num_hp++;
4191                         break;
4192                 case AUTO_PIN_SPEAKER_OUT:
4193                         label = "Speaker";
4194                         idx = num_spk++;
4195                         break;
4196                 }
4197                 err = try_add_pb_volume(codec, dac,
4198                                         spec->dac_info[i].pin,
4199                                         label, idx);
4200                 if (err < 0)
4201                         return err;
4202         }
4203
4204         if (spec->auto_mute) {
4205                 err = snd_hda_add_new_ctls(codec, cx_automute_mode_enum);
4206                 if (err < 0)
4207                         return err;
4208         }
4209         
4210         return 0;
4211 }
4212
4213 static int cx_auto_add_capture_volume(struct hda_codec *codec, hda_nid_t nid,
4214                                       const char *label, const char *pfx,
4215                                       int cidx)
4216 {
4217         struct conexant_spec *spec = codec->spec;
4218         int i;
4219
4220         for (i = 0; i < spec->num_adc_nids; i++) {
4221                 hda_nid_t adc_nid = spec->adc_nids[i];
4222                 int idx = get_input_connection(codec, adc_nid, nid);
4223                 if (idx < 0)
4224                         continue;
4225                 if (spec->single_adc_amp)
4226                         idx = 0;
4227                 return cx_auto_add_volume_idx(codec, label, pfx,
4228                                               cidx, adc_nid, HDA_INPUT, idx);
4229         }
4230         return 0;
4231 }
4232
4233 static int cx_auto_add_boost_volume(struct hda_codec *codec, int idx,
4234                                     const char *label, int cidx)
4235 {
4236         struct conexant_spec *spec = codec->spec;
4237         hda_nid_t mux, nid;
4238         int i, con;
4239
4240         nid = spec->imux_info[idx].pin;
4241         if (get_wcaps(codec, nid) & AC_WCAP_IN_AMP)
4242                 return cx_auto_add_volume(codec, label, " Boost", cidx,
4243                                           nid, HDA_INPUT);
4244         con = __select_input_connection(codec, spec->imux_info[idx].adc, nid,
4245                                         &mux, false, 0);
4246         if (con < 0)
4247                 return 0;
4248         for (i = 0; i < idx; i++) {
4249                 if (spec->imux_info[i].boost == mux)
4250                         return 0; /* already present */
4251         }
4252
4253         if (get_wcaps(codec, mux) & AC_WCAP_OUT_AMP) {
4254                 spec->imux_info[idx].boost = mux;
4255                 return cx_auto_add_volume(codec, label, " Boost", 0,
4256                                           mux, HDA_OUTPUT);
4257         }
4258         return 0;
4259 }
4260
4261 static int cx_auto_build_input_controls(struct hda_codec *codec)
4262 {
4263         struct conexant_spec *spec = codec->spec;
4264         struct hda_input_mux *imux = &spec->private_imux;
4265         const char *prev_label;
4266         int input_conn[HDA_MAX_NUM_INPUTS];
4267         int i, j, err, cidx;
4268         int multi_connection;
4269
4270         if (!imux->num_items)
4271                 return 0;
4272
4273         multi_connection = 0;
4274         for (i = 0; i < imux->num_items; i++) {
4275                 cidx = get_input_connection(codec, spec->imux_info[i].adc,
4276                                             spec->imux_info[i].pin);
4277                 if (cidx < 0)
4278                         continue;
4279                 input_conn[i] = spec->imux_info[i].adc;
4280                 if (!spec->single_adc_amp)
4281                         input_conn[i] |= cidx << 8;
4282                 if (i > 0 && input_conn[i] != input_conn[0])
4283                         multi_connection = 1;
4284         }
4285
4286         prev_label = NULL;
4287         cidx = 0;
4288         for (i = 0; i < imux->num_items; i++) {
4289                 hda_nid_t nid = spec->imux_info[i].pin;
4290                 const char *label;
4291
4292                 label = hda_get_autocfg_input_label(codec, &spec->autocfg,
4293                                                     spec->imux_info[i].index);
4294                 if (label == prev_label)
4295                         cidx++;
4296                 else
4297                         cidx = 0;
4298                 prev_label = label;
4299
4300                 err = cx_auto_add_boost_volume(codec, i, label, cidx);
4301                 if (err < 0)
4302                         return err;
4303
4304                 if (!multi_connection) {
4305                         if (i > 0)
4306                                 continue;
4307                         err = cx_auto_add_capture_volume(codec, nid,
4308                                                          "Capture", "", cidx);
4309                 } else {
4310                         bool dup_found = false;
4311                         for (j = 0; j < i; j++) {
4312                                 if (input_conn[j] == input_conn[i]) {
4313                                         dup_found = true;
4314                                         break;
4315                                 }
4316                         }
4317                         if (dup_found)
4318                                 continue;
4319                         err = cx_auto_add_capture_volume(codec, nid,
4320                                                          label, " Capture", cidx);
4321                 }
4322                 if (err < 0)
4323                         return err;
4324         }
4325
4326         if (spec->private_imux.num_items > 1 && !spec->auto_mic) {
4327                 err = snd_hda_add_new_ctls(codec, cx_auto_capture_mixers);
4328                 if (err < 0)
4329                         return err;
4330         }
4331
4332         return 0;
4333 }
4334
4335 static int cx_auto_build_controls(struct hda_codec *codec)
4336 {
4337         int err;
4338
4339         err = cx_auto_build_output_controls(codec);
4340         if (err < 0)
4341                 return err;
4342         err = cx_auto_build_input_controls(codec);
4343         if (err < 0)
4344                 return err;
4345         return conexant_build_controls(codec);
4346 }
4347
4348 static int cx_auto_search_adcs(struct hda_codec *codec)
4349 {
4350         struct conexant_spec *spec = codec->spec;
4351         hda_nid_t nid, end_nid;
4352
4353         end_nid = codec->start_nid + codec->num_nodes;
4354         for (nid = codec->start_nid; nid < end_nid; nid++) {
4355                 unsigned int caps = get_wcaps(codec, nid);
4356                 if (get_wcaps_type(caps) != AC_WID_AUD_IN)
4357                         continue;
4358                 if (caps & AC_WCAP_DIGITAL)
4359                         continue;
4360                 if (snd_BUG_ON(spec->num_adc_nids >=
4361                                ARRAY_SIZE(spec->private_adc_nids)))
4362                         break;
4363                 spec->private_adc_nids[spec->num_adc_nids++] = nid;
4364         }
4365         spec->adc_nids = spec->private_adc_nids;
4366         return 0;
4367 }
4368
4369
4370 static const struct hda_codec_ops cx_auto_patch_ops = {
4371         .build_controls = cx_auto_build_controls,
4372         .build_pcms = conexant_build_pcms,
4373         .init = cx_auto_init,
4374         .free = conexant_free,
4375         .unsol_event = cx_auto_unsol_event,
4376 #ifdef CONFIG_SND_HDA_POWER_SAVE
4377         .suspend = conexant_suspend,
4378 #endif
4379         .reboot_notify = snd_hda_shutup_pins,
4380 };
4381
4382 /*
4383  * pin fix-up
4384  */
4385 struct cxt_pincfg {
4386         hda_nid_t nid;
4387         u32 val;
4388 };
4389
4390 static void apply_pincfg(struct hda_codec *codec, const struct cxt_pincfg *cfg)
4391 {
4392         for (; cfg->nid; cfg++)
4393                 snd_hda_codec_set_pincfg(codec, cfg->nid, cfg->val);
4394
4395 }
4396
4397 static void apply_pin_fixup(struct hda_codec *codec,
4398                             const struct snd_pci_quirk *quirk,
4399                             const struct cxt_pincfg **table)
4400 {
4401         quirk = snd_pci_quirk_lookup(codec->bus->pci, quirk);
4402         if (quirk) {
4403                 snd_printdd(KERN_INFO "hda_codec: applying pincfg for %s\n",
4404                             quirk->name);
4405                 apply_pincfg(codec, table[quirk->value]);
4406         }
4407 }
4408
4409 enum {
4410         CXT_PINCFG_LENOVO_X200,
4411 };
4412
4413 static const struct cxt_pincfg cxt_pincfg_lenovo_x200[] = {
4414         { 0x16, 0x042140ff }, /* HP (seq# overridden) */
4415         { 0x17, 0x21a11000 }, /* dock-mic */
4416         { 0x19, 0x2121103f }, /* dock-HP */
4417         {}
4418 };
4419
4420 static const struct cxt_pincfg *cxt_pincfg_tbl[] = {
4421         [CXT_PINCFG_LENOVO_X200] = cxt_pincfg_lenovo_x200,
4422 };
4423
4424 static const struct snd_pci_quirk cxt_fixups[] = {
4425         SND_PCI_QUIRK(0x17aa, 0x20f2, "Lenovo X200", CXT_PINCFG_LENOVO_X200),
4426         {}
4427 };
4428
4429 /* add "fake" mute amp-caps to DACs on cx5051 so that mixer mute switches
4430  * can be created (bko#42825)
4431  */
4432 static void add_cx5051_fake_mutes(struct hda_codec *codec)
4433 {
4434         static hda_nid_t out_nids[] = {
4435                 0x10, 0x11, 0
4436         };
4437         hda_nid_t *p;
4438
4439         for (p = out_nids; *p; p++)
4440                 snd_hda_override_amp_caps(codec, *p, HDA_OUTPUT,
4441                                           AC_AMPCAP_MIN_MUTE |
4442                                           query_amp_caps(codec, *p, HDA_OUTPUT));
4443 }
4444
4445 static int patch_conexant_auto(struct hda_codec *codec)
4446 {
4447         struct conexant_spec *spec;
4448         int err;
4449
4450         printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
4451                codec->chip_name);
4452
4453         spec = kzalloc(sizeof(*spec), GFP_KERNEL);
4454         if (!spec)
4455                 return -ENOMEM;
4456         codec->spec = spec;
4457         codec->pin_amp_workaround = 1;
4458
4459         switch (codec->vendor_id) {
4460         case 0x14f15045:
4461                 spec->single_adc_amp = 1;
4462                 break;
4463         case 0x14f15051:
4464                 add_cx5051_fake_mutes(codec);
4465                 break;
4466         }
4467
4468         apply_pin_fixup(codec, cxt_fixups, cxt_pincfg_tbl);
4469
4470         err = cx_auto_search_adcs(codec);
4471         if (err < 0)
4472                 return err;
4473         err = cx_auto_parse_auto_config(codec);
4474         if (err < 0) {
4475                 kfree(codec->spec);
4476                 codec->spec = NULL;
4477                 return err;
4478         }
4479         spec->capture_stream = &cx_auto_pcm_analog_capture;
4480         codec->patch_ops = cx_auto_patch_ops;
4481         if (spec->beep_amp)
4482                 snd_hda_attach_beep_device(codec, spec->beep_amp);
4483         return 0;
4484 }
4485
4486 /*
4487  */
4488
4489 static const struct hda_codec_preset snd_hda_preset_conexant[] = {
4490         { .id = 0x14f15045, .name = "CX20549 (Venice)",
4491           .patch = patch_cxt5045 },
4492         { .id = 0x14f15047, .name = "CX20551 (Waikiki)",
4493           .patch = patch_cxt5047 },
4494         { .id = 0x14f15051, .name = "CX20561 (Hermosa)",
4495           .patch = patch_cxt5051 },
4496         { .id = 0x14f15066, .name = "CX20582 (Pebble)",
4497           .patch = patch_cxt5066 },
4498         { .id = 0x14f15067, .name = "CX20583 (Pebble HSF)",
4499           .patch = patch_cxt5066 },
4500         { .id = 0x14f15068, .name = "CX20584",
4501           .patch = patch_cxt5066 },
4502         { .id = 0x14f15069, .name = "CX20585",
4503           .patch = patch_cxt5066 },
4504         { .id = 0x14f1506c, .name = "CX20588",
4505           .patch = patch_cxt5066 },
4506         { .id = 0x14f1506e, .name = "CX20590",
4507           .patch = patch_cxt5066 },
4508         { .id = 0x14f15097, .name = "CX20631",
4509           .patch = patch_conexant_auto },
4510         { .id = 0x14f15098, .name = "CX20632",
4511           .patch = patch_conexant_auto },
4512         { .id = 0x14f150a1, .name = "CX20641",
4513           .patch = patch_conexant_auto },
4514         { .id = 0x14f150a2, .name = "CX20642",
4515           .patch = patch_conexant_auto },
4516         { .id = 0x14f150ab, .name = "CX20651",
4517           .patch = patch_conexant_auto },
4518         { .id = 0x14f150ac, .name = "CX20652",
4519           .patch = patch_conexant_auto },
4520         { .id = 0x14f150b8, .name = "CX20664",
4521           .patch = patch_conexant_auto },
4522         { .id = 0x14f150b9, .name = "CX20665",
4523           .patch = patch_conexant_auto },
4524         {} /* terminator */
4525 };
4526
4527 MODULE_ALIAS("snd-hda-codec-id:14f15045");
4528 MODULE_ALIAS("snd-hda-codec-id:14f15047");
4529 MODULE_ALIAS("snd-hda-codec-id:14f15051");
4530 MODULE_ALIAS("snd-hda-codec-id:14f15066");
4531 MODULE_ALIAS("snd-hda-codec-id:14f15067");
4532 MODULE_ALIAS("snd-hda-codec-id:14f15068");
4533 MODULE_ALIAS("snd-hda-codec-id:14f15069");
4534 MODULE_ALIAS("snd-hda-codec-id:14f1506c");
4535 MODULE_ALIAS("snd-hda-codec-id:14f1506e");
4536 MODULE_ALIAS("snd-hda-codec-id:14f15097");
4537 MODULE_ALIAS("snd-hda-codec-id:14f15098");
4538 MODULE_ALIAS("snd-hda-codec-id:14f150a1");
4539 MODULE_ALIAS("snd-hda-codec-id:14f150a2");
4540 MODULE_ALIAS("snd-hda-codec-id:14f150ab");
4541 MODULE_ALIAS("snd-hda-codec-id:14f150ac");
4542 MODULE_ALIAS("snd-hda-codec-id:14f150b8");
4543 MODULE_ALIAS("snd-hda-codec-id:14f150b9");
4544
4545 MODULE_LICENSE("GPL");
4546 MODULE_DESCRIPTION("Conexant HD-audio codec");
4547
4548 static struct hda_codec_preset_list conexant_list = {
4549         .preset = snd_hda_preset_conexant,
4550         .owner = THIS_MODULE,
4551 };
4552
4553 static int __init patch_conexant_init(void)
4554 {
4555         return snd_hda_add_codec_preset(&conexant_list);
4556 }
4557
4558 static void __exit patch_conexant_exit(void)
4559 {
4560         snd_hda_delete_codec_preset(&conexant_list);
4561 }
4562
4563 module_init(patch_conexant_init)
4564 module_exit(patch_conexant_exit)