ALSA: hda - Fix pin configuration of HP Pavilion dv7
[pandora-kernel.git] / sound / pci / hda / patch_cirrus.c
1 /*
2  * HD audio interface patch for Cirrus Logic CS420x chip
3  *
4  * Copyright (c) 2009 Takashi Iwai <tiwai@suse.de>
5  *
6  *  This driver is free software; you can redistribute it and/or modify
7  *  it under the terms of the GNU General Public License as published by
8  *  the Free Software Foundation; either version 2 of the License, or
9  *  (at your option) any later version.
10  *
11  *  This driver is distributed in the hope that it will be useful,
12  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  *  GNU General Public License for more details.
15  *
16  *  You should have received a copy of the GNU General Public License
17  *  along with this program; if not, write to the Free Software
18  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
19  */
20
21 #include <linux/init.h>
22 #include <linux/delay.h>
23 #include <linux/slab.h>
24 #include <linux/pci.h>
25 #include <linux/module.h>
26 #include <sound/core.h>
27 #include "hda_codec.h"
28 #include "hda_local.h"
29 #include "hda_auto_parser.h"
30 #include "hda_jack.h"
31 #include <sound/tlv.h>
32
33 /*
34  */
35
36 struct cs_spec {
37         struct hda_gen_spec gen;
38
39         struct auto_pin_cfg autocfg;
40         struct hda_multi_out multiout;
41         struct snd_kcontrol *vmaster_sw;
42         struct snd_kcontrol *vmaster_vol;
43
44         hda_nid_t dac_nid[AUTO_CFG_MAX_OUTS];
45         hda_nid_t slave_dig_outs[2];
46
47         unsigned int input_idx[AUTO_PIN_LAST];
48         unsigned int capsrc_idx[AUTO_PIN_LAST];
49         hda_nid_t adc_nid[AUTO_PIN_LAST];
50         unsigned int adc_idx[AUTO_PIN_LAST];
51         unsigned int num_inputs;
52         unsigned int cur_input;
53         unsigned int automic_idx;
54         hda_nid_t cur_adc;
55         unsigned int cur_adc_stream_tag;
56         unsigned int cur_adc_format;
57         hda_nid_t dig_in;
58
59         const struct hda_bind_ctls *capture_bind[2];
60
61         unsigned int gpio_mask;
62         unsigned int gpio_dir;
63         unsigned int gpio_data;
64         unsigned int gpio_eapd_hp; /* EAPD GPIO bit for headphones */
65         unsigned int gpio_eapd_speaker; /* EAPD GPIO bit for speakers */
66
67         struct hda_pcm pcm_rec[2];      /* PCM information */
68
69         unsigned int hp_detect:1;
70         unsigned int mic_detect:1;
71         unsigned int speaker_2_1:1;
72         /* CS421x */
73         unsigned int spdif_detect:1;
74         unsigned int sense_b:1;
75         hda_nid_t vendor_nid;
76         struct hda_input_mux input_mux;
77         unsigned int last_input;
78 };
79
80 /* available models with CS420x */
81 enum {
82         CS420X_MBP53,
83         CS420X_MBP55,
84         CS420X_IMAC27,
85         CS420X_GPIO_13,
86         CS420X_GPIO_23,
87         CS420X_MBP101,
88         CS420X_MBP81,
89         CS420X_AUTO,
90         /* aliases */
91         CS420X_IMAC27_122 = CS420X_GPIO_23,
92         CS420X_APPLE = CS420X_GPIO_13,
93 };
94
95 /* CS421x boards */
96 enum {
97         CS421X_CDB4210,
98         CS421X_SENSE_B,
99 };
100
101 /* Vendor-specific processing widget */
102 #define CS420X_VENDOR_NID       0x11
103 #define CS_DIG_OUT1_PIN_NID     0x10
104 #define CS_DIG_OUT2_PIN_NID     0x15
105 #define CS_DMIC1_PIN_NID        0x0e
106 #define CS_DMIC2_PIN_NID        0x12
107
108 /* coef indices */
109 #define IDX_SPDIF_STAT          0x0000
110 #define IDX_SPDIF_CTL           0x0001
111 #define IDX_ADC_CFG             0x0002
112 /* SZC bitmask, 4 modes below:
113  * 0 = immediate,
114  * 1 = digital immediate, analog zero-cross
115  * 2 = digtail & analog soft-ramp
116  * 3 = digital soft-ramp, analog zero-cross
117  */
118 #define   CS_COEF_ADC_SZC_MASK          (3 << 0)
119 #define   CS_COEF_ADC_MIC_SZC_MODE      (3 << 0) /* SZC setup for mic */
120 #define   CS_COEF_ADC_LI_SZC_MODE       (3 << 0) /* SZC setup for line-in */
121 /* PGA mode: 0 = differential, 1 = signle-ended */
122 #define   CS_COEF_ADC_MIC_PGA_MODE      (1 << 5) /* PGA setup for mic */
123 #define   CS_COEF_ADC_LI_PGA_MODE       (1 << 6) /* PGA setup for line-in */
124 #define IDX_DAC_CFG             0x0003
125 /* SZC bitmask, 4 modes below:
126  * 0 = Immediate
127  * 1 = zero-cross
128  * 2 = soft-ramp
129  * 3 = soft-ramp on zero-cross
130  */
131 #define   CS_COEF_DAC_HP_SZC_MODE       (3 << 0) /* nid 0x02 */
132 #define   CS_COEF_DAC_LO_SZC_MODE       (3 << 2) /* nid 0x03 */
133 #define   CS_COEF_DAC_SPK_SZC_MODE      (3 << 4) /* nid 0x04 */
134
135 #define IDX_BEEP_CFG            0x0004
136 /* 0x0008 - test reg key */
137 /* 0x0009 - 0x0014 -> 12 test regs */
138 /* 0x0015 - visibility reg */
139
140 /*
141  * Cirrus Logic CS4210
142  *
143  * 1 DAC => HP(sense) / Speakers,
144  * 1 ADC <= LineIn(sense) / MicIn / DMicIn,
145  * 1 SPDIF OUT => SPDIF Trasmitter(sense)
146 */
147 #define CS4210_DAC_NID          0x02
148 #define CS4210_ADC_NID          0x03
149 #define CS4210_VENDOR_NID       0x0B
150 #define CS421X_DMIC_PIN_NID     0x09 /* Port E */
151 #define CS421X_SPDIF_PIN_NID    0x0A /* Port H */
152
153 #define CS421X_IDX_DEV_CFG      0x01
154 #define CS421X_IDX_ADC_CFG      0x02
155 #define CS421X_IDX_DAC_CFG      0x03
156 #define CS421X_IDX_SPK_CTL      0x04
157
158 #define SPDIF_EVENT             0x04
159
160 /* Cirrus Logic CS4213 is like CS4210 but does not have SPDIF input/output */
161 #define CS4213_VENDOR_NID       0x09
162
163
164 static inline int cs_vendor_coef_get(struct hda_codec *codec, unsigned int idx)
165 {
166         struct cs_spec *spec = codec->spec;
167         snd_hda_codec_write(codec, spec->vendor_nid, 0,
168                             AC_VERB_SET_COEF_INDEX, idx);
169         return snd_hda_codec_read(codec, spec->vendor_nid, 0,
170                                   AC_VERB_GET_PROC_COEF, 0);
171 }
172
173 static inline void cs_vendor_coef_set(struct hda_codec *codec, unsigned int idx,
174                                       unsigned int coef)
175 {
176         struct cs_spec *spec = codec->spec;
177         snd_hda_codec_write(codec, spec->vendor_nid, 0,
178                             AC_VERB_SET_COEF_INDEX, idx);
179         snd_hda_codec_write(codec, spec->vendor_nid, 0,
180                             AC_VERB_SET_PROC_COEF, coef);
181 }
182
183
184 #define HP_EVENT        1
185 #define MIC_EVENT       2
186
187 /*
188  * PCM callbacks
189  */
190 static int cs_playback_pcm_open(struct hda_pcm_stream *hinfo,
191                                 struct hda_codec *codec,
192                                 struct snd_pcm_substream *substream)
193 {
194         struct cs_spec *spec = codec->spec;
195         return snd_hda_multi_out_analog_open(codec, &spec->multiout, substream,
196                                              hinfo);
197 }
198
199 static int cs_playback_pcm_prepare(struct hda_pcm_stream *hinfo,
200                                    struct hda_codec *codec,
201                                    unsigned int stream_tag,
202                                    unsigned int format,
203                                    struct snd_pcm_substream *substream)
204 {
205         struct cs_spec *spec = codec->spec;
206         return snd_hda_multi_out_analog_prepare(codec, &spec->multiout,
207                                                 stream_tag, format, substream);
208 }
209
210 static int cs_playback_pcm_cleanup(struct hda_pcm_stream *hinfo,
211                                    struct hda_codec *codec,
212                                    struct snd_pcm_substream *substream)
213 {
214         struct cs_spec *spec = codec->spec;
215         return snd_hda_multi_out_analog_cleanup(codec, &spec->multiout);
216 }
217
218 /*
219  * Digital out
220  */
221 static int cs_dig_playback_pcm_open(struct hda_pcm_stream *hinfo,
222                                     struct hda_codec *codec,
223                                     struct snd_pcm_substream *substream)
224 {
225         struct cs_spec *spec = codec->spec;
226         return snd_hda_multi_out_dig_open(codec, &spec->multiout);
227 }
228
229 static int cs_dig_playback_pcm_close(struct hda_pcm_stream *hinfo,
230                                      struct hda_codec *codec,
231                                      struct snd_pcm_substream *substream)
232 {
233         struct cs_spec *spec = codec->spec;
234         return snd_hda_multi_out_dig_close(codec, &spec->multiout);
235 }
236
237 static int cs_dig_playback_pcm_prepare(struct hda_pcm_stream *hinfo,
238                                        struct hda_codec *codec,
239                                        unsigned int stream_tag,
240                                        unsigned int format,
241                                        struct snd_pcm_substream *substream)
242 {
243         struct cs_spec *spec = codec->spec;
244         return snd_hda_multi_out_dig_prepare(codec, &spec->multiout, stream_tag,
245                                              format, substream);
246 }
247
248 static int cs_dig_playback_pcm_cleanup(struct hda_pcm_stream *hinfo,
249                                        struct hda_codec *codec,
250                                        struct snd_pcm_substream *substream)
251 {
252         struct cs_spec *spec = codec->spec;
253         return snd_hda_multi_out_dig_cleanup(codec, &spec->multiout);
254 }
255
256 static void cs_update_input_select(struct hda_codec *codec)
257 {
258         struct cs_spec *spec = codec->spec;
259         if (spec->cur_adc)
260                 snd_hda_codec_write(codec, spec->cur_adc, 0,
261                                     AC_VERB_SET_CONNECT_SEL,
262                                     spec->adc_idx[spec->cur_input]);
263 }
264
265 /*
266  * Analog capture
267  */
268 static int cs_capture_pcm_prepare(struct hda_pcm_stream *hinfo,
269                                   struct hda_codec *codec,
270                                   unsigned int stream_tag,
271                                   unsigned int format,
272                                   struct snd_pcm_substream *substream)
273 {
274         struct cs_spec *spec = codec->spec;
275         spec->cur_adc = spec->adc_nid[spec->cur_input];
276         spec->cur_adc_stream_tag = stream_tag;
277         spec->cur_adc_format = format;
278         cs_update_input_select(codec);
279         snd_hda_codec_setup_stream(codec, spec->cur_adc, stream_tag, 0, format);
280         return 0;
281 }
282
283 static int cs_capture_pcm_cleanup(struct hda_pcm_stream *hinfo,
284                                   struct hda_codec *codec,
285                                   struct snd_pcm_substream *substream)
286 {
287         struct cs_spec *spec = codec->spec;
288         snd_hda_codec_cleanup_stream(codec, spec->cur_adc);
289         spec->cur_adc = 0;
290         return 0;
291 }
292
293 /*
294  */
295 static const struct hda_pcm_stream cs_pcm_analog_playback = {
296         .substreams = 1,
297         .channels_min = 2,
298         .channels_max = 2,
299         .ops = {
300                 .open = cs_playback_pcm_open,
301                 .prepare = cs_playback_pcm_prepare,
302                 .cleanup = cs_playback_pcm_cleanup
303         },
304 };
305
306 static const struct hda_pcm_stream cs_pcm_analog_capture = {
307         .substreams = 1,
308         .channels_min = 2,
309         .channels_max = 2,
310         .ops = {
311                 .prepare = cs_capture_pcm_prepare,
312                 .cleanup = cs_capture_pcm_cleanup
313         },
314 };
315
316 static const struct hda_pcm_stream cs_pcm_digital_playback = {
317         .substreams = 1,
318         .channels_min = 2,
319         .channels_max = 2,
320         .ops = {
321                 .open = cs_dig_playback_pcm_open,
322                 .close = cs_dig_playback_pcm_close,
323                 .prepare = cs_dig_playback_pcm_prepare,
324                 .cleanup = cs_dig_playback_pcm_cleanup
325         },
326 };
327
328 static const struct hda_pcm_stream cs_pcm_digital_capture = {
329         .substreams = 1,
330         .channels_min = 2,
331         .channels_max = 2,
332 };
333
334 static int cs_build_pcms(struct hda_codec *codec)
335 {
336         struct cs_spec *spec = codec->spec;
337         struct hda_pcm *info = spec->pcm_rec;
338
339         codec->pcm_info = info;
340         codec->num_pcms = 0;
341
342         info->name = "Cirrus Analog";
343         info->stream[SNDRV_PCM_STREAM_PLAYBACK] = cs_pcm_analog_playback;
344         info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = spec->dac_nid[0];
345         info->stream[SNDRV_PCM_STREAM_PLAYBACK].channels_max =
346                 spec->multiout.max_channels;
347         if (spec->speaker_2_1)
348                 info->stream[SNDRV_PCM_STREAM_PLAYBACK].chmap =
349                         snd_pcm_2_1_chmaps;
350         info->stream[SNDRV_PCM_STREAM_CAPTURE] = cs_pcm_analog_capture;
351         info->stream[SNDRV_PCM_STREAM_CAPTURE].nid =
352                 spec->adc_nid[spec->cur_input];
353         codec->num_pcms++;
354
355         if (!spec->multiout.dig_out_nid && !spec->dig_in)
356                 return 0;
357
358         info++;
359         info->name = "Cirrus Digital";
360         info->pcm_type = spec->autocfg.dig_out_type[0];
361         if (!info->pcm_type)
362                 info->pcm_type = HDA_PCM_TYPE_SPDIF;
363         if (spec->multiout.dig_out_nid) {
364                 info->stream[SNDRV_PCM_STREAM_PLAYBACK] =
365                         cs_pcm_digital_playback;
366                 info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid =
367                         spec->multiout.dig_out_nid;
368         }
369         if (spec->dig_in) {
370                 info->stream[SNDRV_PCM_STREAM_CAPTURE] =
371                         cs_pcm_digital_capture;
372                 info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->dig_in;
373         }
374         codec->num_pcms++;
375
376         return 0;
377 }
378
379 /*
380  * parse codec topology
381  */
382
383 static hda_nid_t get_dac(struct hda_codec *codec, hda_nid_t pin)
384 {
385         hda_nid_t dac;
386         if (!pin)
387                 return 0;
388         if (snd_hda_get_connections(codec, pin, &dac, 1) != 1)
389                 return 0;
390         return dac;
391 }
392
393 static int is_ext_mic(struct hda_codec *codec, unsigned int idx)
394 {
395         struct cs_spec *spec = codec->spec;
396         struct auto_pin_cfg *cfg = &spec->autocfg;
397         hda_nid_t pin = cfg->inputs[idx].pin;
398         unsigned int val;
399         if (!is_jack_detectable(codec, pin))
400                 return 0;
401         val = snd_hda_codec_get_pincfg(codec, pin);
402         return (snd_hda_get_input_pin_attr(val) != INPUT_PIN_ATTR_INT);
403 }
404
405 static hda_nid_t get_adc(struct hda_codec *codec, hda_nid_t pin,
406                          unsigned int *idxp)
407 {
408         int i, idx;
409         hda_nid_t nid;
410
411         nid = codec->start_nid;
412         for (i = 0; i < codec->num_nodes; i++, nid++) {
413                 unsigned int type;
414                 type = get_wcaps_type(get_wcaps(codec, nid));
415                 if (type != AC_WID_AUD_IN)
416                         continue;
417                 idx = snd_hda_get_conn_index(codec, nid, pin, false);
418                 if (idx >= 0) {
419                         *idxp = idx;
420                         return nid;
421                 }
422         }
423         return 0;
424 }
425
426 static int is_active_pin(struct hda_codec *codec, hda_nid_t nid)
427 {
428         unsigned int val;
429         val = snd_hda_codec_get_pincfg(codec, nid);
430         return (get_defcfg_connect(val) != AC_JACK_PORT_NONE);
431 }
432
433 static int parse_output(struct hda_codec *codec)
434 {
435         struct cs_spec *spec = codec->spec;
436         struct auto_pin_cfg *cfg = &spec->autocfg;
437         int i, extra_nids;
438         hda_nid_t dac;
439
440         for (i = 0; i < cfg->line_outs; i++) {
441                 dac = get_dac(codec, cfg->line_out_pins[i]);
442                 if (!dac)
443                         break;
444                 spec->dac_nid[i] = dac;
445         }
446         spec->multiout.num_dacs = i;
447         spec->multiout.dac_nids = spec->dac_nid;
448         spec->multiout.max_channels = i * 2;
449
450         if (cfg->line_out_type == AUTO_PIN_SPEAKER_OUT && i == 2)
451                 spec->speaker_2_1 = 1; /* assume 2.1 speakers */
452
453         /* add HP and speakers */
454         extra_nids = 0;
455         for (i = 0; i < cfg->hp_outs; i++) {
456                 dac = get_dac(codec, cfg->hp_pins[i]);
457                 if (!dac)
458                         break;
459                 if (!i)
460                         spec->multiout.hp_nid = dac;
461                 else
462                         spec->multiout.extra_out_nid[extra_nids++] = dac;
463         }
464         for (i = 0; i < cfg->speaker_outs; i++) {
465                 dac = get_dac(codec, cfg->speaker_pins[i]);
466                 if (!dac)
467                         break;
468                 spec->multiout.extra_out_nid[extra_nids++] = dac;
469         }
470
471         if (cfg->line_out_type == AUTO_PIN_SPEAKER_OUT) {
472                 cfg->speaker_outs = cfg->line_outs;
473                 memcpy(cfg->speaker_pins, cfg->line_out_pins,
474                        sizeof(cfg->speaker_pins));
475                 cfg->line_outs = 0;
476                 memset(cfg->line_out_pins, 0, sizeof(cfg->line_out_pins));
477         }
478
479         return 0;
480 }
481
482 static int parse_input(struct hda_codec *codec)
483 {
484         struct cs_spec *spec = codec->spec;
485         struct auto_pin_cfg *cfg = &spec->autocfg;
486         int i;
487
488         for (i = 0; i < cfg->num_inputs; i++) {
489                 hda_nid_t pin = cfg->inputs[i].pin;
490                 spec->input_idx[spec->num_inputs] = i;
491                 spec->capsrc_idx[i] = spec->num_inputs++;
492                 spec->cur_input = i;
493                 spec->adc_nid[i] = get_adc(codec, pin, &spec->adc_idx[i]);
494         }
495         if (!spec->num_inputs)
496                 return 0;
497
498         /* check whether the automatic mic switch is available */
499         if (spec->num_inputs == 2 &&
500             cfg->inputs[0].type == AUTO_PIN_MIC &&
501             cfg->inputs[1].type == AUTO_PIN_MIC) {
502                 if (is_ext_mic(codec, cfg->inputs[0].pin)) {
503                         if (!is_ext_mic(codec, cfg->inputs[1].pin)) {
504                                 spec->mic_detect = 1;
505                                 spec->automic_idx = 0;
506                         }
507                 } else {
508                         if (is_ext_mic(codec, cfg->inputs[1].pin)) {
509                                 spec->mic_detect = 1;
510                                 spec->automic_idx = 1;
511                         }
512                 }
513         }
514         return 0;
515 }
516
517
518 static int parse_digital_output(struct hda_codec *codec)
519 {
520         struct cs_spec *spec = codec->spec;
521         struct auto_pin_cfg *cfg = &spec->autocfg;
522         hda_nid_t nid;
523
524         if (!cfg->dig_outs)
525                 return 0;
526         if (snd_hda_get_connections(codec, cfg->dig_out_pins[0], &nid, 1) < 1)
527                 return 0;
528         spec->multiout.dig_out_nid = nid;
529         spec->multiout.share_spdif = 1;
530         if (cfg->dig_outs > 1 &&
531             snd_hda_get_connections(codec, cfg->dig_out_pins[1], &nid, 1) > 0) {
532                 spec->slave_dig_outs[0] = nid;
533                 codec->slave_dig_outs = spec->slave_dig_outs;
534         }
535         return 0;
536 }
537
538 static int parse_digital_input(struct hda_codec *codec)
539 {
540         struct cs_spec *spec = codec->spec;
541         struct auto_pin_cfg *cfg = &spec->autocfg;
542         int idx;
543
544         if (cfg->dig_in_pin)
545                 spec->dig_in = get_adc(codec, cfg->dig_in_pin, &idx);
546         return 0;
547 }
548
549 /*
550  * create mixer controls
551  */
552
553 static const char * const dir_sfx[2] = { "Playback", "Capture" };
554
555 static int add_mute(struct hda_codec *codec, const char *name, int index,
556                     unsigned int pval, int dir, struct snd_kcontrol **kctlp)
557 {
558         char tmp[44];
559         struct snd_kcontrol_new knew =
560                 HDA_CODEC_MUTE_IDX(tmp, index, 0, 0, HDA_OUTPUT);
561         knew.private_value = pval;
562         snprintf(tmp, sizeof(tmp), "%s %s Switch", name, dir_sfx[dir]);
563         *kctlp = snd_ctl_new1(&knew, codec);
564         (*kctlp)->id.subdevice = HDA_SUBDEV_AMP_FLAG;
565         return snd_hda_ctl_add(codec, 0, *kctlp);
566 }
567
568 static int add_volume(struct hda_codec *codec, const char *name,
569                       int index, unsigned int pval, int dir,
570                       struct snd_kcontrol **kctlp)
571 {
572         char tmp[44];
573         struct snd_kcontrol_new knew =
574                 HDA_CODEC_VOLUME_IDX(tmp, index, 0, 0, HDA_OUTPUT);
575         knew.private_value = pval;
576         snprintf(tmp, sizeof(tmp), "%s %s Volume", name, dir_sfx[dir]);
577         *kctlp = snd_ctl_new1(&knew, codec);
578         (*kctlp)->id.subdevice = HDA_SUBDEV_AMP_FLAG;
579         return snd_hda_ctl_add(codec, 0, *kctlp);
580 }
581
582 static void fix_volume_caps(struct hda_codec *codec, hda_nid_t dac)
583 {
584         unsigned int caps;
585
586         /* set the upper-limit for mixer amp to 0dB */
587         caps = query_amp_caps(codec, dac, HDA_OUTPUT);
588         caps &= ~(0x7f << AC_AMPCAP_NUM_STEPS_SHIFT);
589         caps |= ((caps >> AC_AMPCAP_OFFSET_SHIFT) & 0x7f)
590                 << AC_AMPCAP_NUM_STEPS_SHIFT;
591         snd_hda_override_amp_caps(codec, dac, HDA_OUTPUT, caps);
592 }
593
594 static int add_vmaster(struct hda_codec *codec, hda_nid_t dac)
595 {
596         struct cs_spec *spec = codec->spec;
597         unsigned int tlv[4];
598         int err;
599
600         spec->vmaster_sw =
601                 snd_ctl_make_virtual_master("Master Playback Switch", NULL);
602         err = snd_hda_ctl_add(codec, dac, spec->vmaster_sw);
603         if (err < 0)
604                 return err;
605
606         snd_hda_set_vmaster_tlv(codec, dac, HDA_OUTPUT, tlv);
607         spec->vmaster_vol =
608                 snd_ctl_make_virtual_master("Master Playback Volume", tlv);
609         err = snd_hda_ctl_add(codec, dac, spec->vmaster_vol);
610         if (err < 0)
611                 return err;
612         return 0;
613 }
614
615 static int add_output(struct hda_codec *codec, hda_nid_t dac, int idx,
616                       int num_ctls, int type)
617 {
618         struct cs_spec *spec = codec->spec;
619         const char *name;
620         int err, index;
621         struct snd_kcontrol *kctl;
622         static const char * const speakers[] = {
623                 "Front Speaker", "Surround Speaker", "Bass Speaker"
624         };
625         static const char * const line_outs[] = {
626                 "Front Line Out", "Surround Line Out", "Bass Line Out"
627         };
628
629         fix_volume_caps(codec, dac);
630         if (!spec->vmaster_sw) {
631                 err = add_vmaster(codec, dac);
632                 if (err < 0)
633                         return err;
634         }
635
636         index = 0;
637         switch (type) {
638         case AUTO_PIN_HP_OUT:
639                 name = "Headphone";
640                 index = idx;
641                 break;
642         case AUTO_PIN_SPEAKER_OUT:
643                 if (spec->speaker_2_1)
644                         name = idx ? "Bass Speaker" : "Speaker";
645                 else if (num_ctls > 1)
646                         name = speakers[idx];
647                 else
648                         name = "Speaker";
649                 break;
650         default:
651                 if (num_ctls > 1)
652                         name = line_outs[idx];
653                 else
654                         name = "Line Out";
655                 break;
656         }
657
658         err = add_mute(codec, name, index,
659                        HDA_COMPOSE_AMP_VAL(dac, 3, 0, HDA_OUTPUT), 0, &kctl);
660         if (err < 0)
661                 return err;
662         err = snd_ctl_add_slave(spec->vmaster_sw, kctl);
663         if (err < 0)
664                 return err;
665
666         err = add_volume(codec, name, index,
667                          HDA_COMPOSE_AMP_VAL(dac, 3, 0, HDA_OUTPUT), 0, &kctl);
668         if (err < 0)
669                 return err;
670         err = snd_ctl_add_slave(spec->vmaster_vol, kctl);
671         if (err < 0)
672                 return err;
673
674         return 0;
675 }               
676
677 static int build_output(struct hda_codec *codec)
678 {
679         struct cs_spec *spec = codec->spec;
680         struct auto_pin_cfg *cfg = &spec->autocfg;
681         int i, err;
682
683         for (i = 0; i < cfg->line_outs; i++) {
684                 err = add_output(codec, get_dac(codec, cfg->line_out_pins[i]),
685                                  i, cfg->line_outs, cfg->line_out_type);
686                 if (err < 0)
687                         return err;
688         }
689         for (i = 0; i < cfg->hp_outs; i++) {
690                 err = add_output(codec, get_dac(codec, cfg->hp_pins[i]),
691                                  i, cfg->hp_outs, AUTO_PIN_HP_OUT);
692                 if (err < 0)
693                         return err;
694         }
695         for (i = 0; i < cfg->speaker_outs; i++) {
696                 err = add_output(codec, get_dac(codec, cfg->speaker_pins[i]),
697                                  i, cfg->speaker_outs, AUTO_PIN_SPEAKER_OUT);
698                 if (err < 0)
699                         return err;
700         }
701         return 0;
702 }
703
704 /*
705  */
706
707 static const struct snd_kcontrol_new cs_capture_ctls[] = {
708         HDA_BIND_SW("Capture Switch", 0),
709         HDA_BIND_VOL("Capture Volume", 0),
710 };
711
712 static int change_cur_input(struct hda_codec *codec, unsigned int idx,
713                             int force)
714 {
715         struct cs_spec *spec = codec->spec;
716         
717         if (spec->cur_input == idx && !force)
718                 return 0;
719         if (spec->cur_adc && spec->cur_adc != spec->adc_nid[idx]) {
720                 /* stream is running, let's swap the current ADC */
721                 __snd_hda_codec_cleanup_stream(codec, spec->cur_adc, 1);
722                 spec->cur_adc = spec->adc_nid[idx];
723                 snd_hda_codec_setup_stream(codec, spec->cur_adc,
724                                            spec->cur_adc_stream_tag, 0,
725                                            spec->cur_adc_format);
726         }
727         spec->cur_input = idx;
728         cs_update_input_select(codec);
729         return 1;
730 }
731
732 static int cs_capture_source_info(struct snd_kcontrol *kcontrol,
733                                   struct snd_ctl_elem_info *uinfo)
734 {
735         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
736         struct cs_spec *spec = codec->spec;
737         struct auto_pin_cfg *cfg = &spec->autocfg;
738         unsigned int idx;
739
740         uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
741         uinfo->count = 1;
742         uinfo->value.enumerated.items = spec->num_inputs;
743         if (uinfo->value.enumerated.item >= spec->num_inputs)
744                 uinfo->value.enumerated.item = spec->num_inputs - 1;
745         idx = spec->input_idx[uinfo->value.enumerated.item];
746         snd_hda_get_pin_label(codec, cfg->inputs[idx].pin, cfg,
747                               uinfo->value.enumerated.name,
748                               sizeof(uinfo->value.enumerated.name), NULL);
749         return 0;
750 }
751
752 static int cs_capture_source_get(struct snd_kcontrol *kcontrol,
753                                  struct snd_ctl_elem_value *ucontrol)
754 {
755         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
756         struct cs_spec *spec = codec->spec;
757         ucontrol->value.enumerated.item[0] = spec->capsrc_idx[spec->cur_input];
758         return 0;
759 }
760
761 static int cs_capture_source_put(struct snd_kcontrol *kcontrol,
762                                  struct snd_ctl_elem_value *ucontrol)
763 {
764         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
765         struct cs_spec *spec = codec->spec;
766         unsigned int idx = ucontrol->value.enumerated.item[0];
767
768         if (idx >= spec->num_inputs)
769                 return -EINVAL;
770         idx = spec->input_idx[idx];
771         return change_cur_input(codec, idx, 0);
772 }
773
774 static const struct snd_kcontrol_new cs_capture_source = {
775         .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
776         .name = "Capture Source",
777         .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
778         .info = cs_capture_source_info,
779         .get = cs_capture_source_get,
780         .put = cs_capture_source_put,
781 };
782
783 static const struct hda_bind_ctls *make_bind_capture(struct hda_codec *codec,
784                                                struct hda_ctl_ops *ops)
785 {
786         struct cs_spec *spec = codec->spec;
787         struct hda_bind_ctls *bind;
788         int i, n;
789
790         bind = kzalloc(sizeof(*bind) + sizeof(long) * (spec->num_inputs + 1),
791                        GFP_KERNEL);
792         if (!bind)
793                 return NULL;
794         bind->ops = ops;
795         n = 0;
796         for (i = 0; i < AUTO_PIN_LAST; i++) {
797                 if (!spec->adc_nid[i])
798                         continue;
799                 bind->values[n++] =
800                         HDA_COMPOSE_AMP_VAL(spec->adc_nid[i], 3,
801                                             spec->adc_idx[i], HDA_INPUT);
802         }
803         return bind;
804 }
805
806 /* add a (input-boost) volume control to the given input pin */
807 static int add_input_volume_control(struct hda_codec *codec,
808                                     struct auto_pin_cfg *cfg,
809                                     int item)
810 {
811         hda_nid_t pin = cfg->inputs[item].pin;
812         u32 caps;
813         const char *label;
814         struct snd_kcontrol *kctl;
815                 
816         if (!(get_wcaps(codec, pin) & AC_WCAP_IN_AMP))
817                 return 0;
818         caps = query_amp_caps(codec, pin, HDA_INPUT);
819         caps = (caps & AC_AMPCAP_NUM_STEPS) >> AC_AMPCAP_NUM_STEPS_SHIFT;
820         if (caps <= 1)
821                 return 0;
822         label = hda_get_autocfg_input_label(codec, cfg, item);
823         return add_volume(codec, label, 0,
824                           HDA_COMPOSE_AMP_VAL(pin, 3, 0, HDA_INPUT), 1, &kctl);
825 }
826
827 static int build_input(struct hda_codec *codec)
828 {
829         struct cs_spec *spec = codec->spec;
830         int i, err;
831
832         if (!spec->num_inputs)
833                 return 0;
834
835         /* make bind-capture */
836         spec->capture_bind[0] = make_bind_capture(codec, &snd_hda_bind_sw);
837         spec->capture_bind[1] = make_bind_capture(codec, &snd_hda_bind_vol);
838         for (i = 0; i < 2; i++) {
839                 struct snd_kcontrol *kctl;
840                 int n;
841                 if (!spec->capture_bind[i])
842                         return -ENOMEM;
843                 kctl = snd_ctl_new1(&cs_capture_ctls[i], codec);
844                 if (!kctl)
845                         return -ENOMEM;
846                 kctl->private_value = (long)spec->capture_bind[i];
847                 err = snd_hda_ctl_add(codec, 0, kctl);
848                 if (err < 0)
849                         return err;
850                 for (n = 0; n < AUTO_PIN_LAST; n++) {
851                         if (!spec->adc_nid[n])
852                                 continue;
853                         err = snd_hda_add_nid(codec, kctl, 0, spec->adc_nid[n]);
854                         if (err < 0)
855                                 return err;
856                 }
857         }
858         
859         if (spec->num_inputs > 1 && !spec->mic_detect) {
860                 err = snd_hda_ctl_add(codec, 0,
861                                       snd_ctl_new1(&cs_capture_source, codec));
862                 if (err < 0)
863                         return err;
864         }
865
866         for (i = 0; i < spec->num_inputs; i++) {
867                 err = add_input_volume_control(codec, &spec->autocfg, i);
868                 if (err < 0)
869                         return err;
870         }
871
872         return 0;
873 }
874
875 /*
876  */
877
878 static int build_digital_output(struct hda_codec *codec)
879 {
880         struct cs_spec *spec = codec->spec;
881         int err;
882
883         if (!spec->multiout.dig_out_nid)
884                 return 0;
885
886         err = snd_hda_create_dig_out_ctls(codec, spec->multiout.dig_out_nid,
887                                           spec->multiout.dig_out_nid,
888                                           spec->pcm_rec[1].pcm_type);
889         if (err < 0)
890                 return err;
891         err = snd_hda_create_spdif_share_sw(codec, &spec->multiout);
892         if (err < 0)
893                 return err;
894         return 0;
895 }
896
897 static int build_digital_input(struct hda_codec *codec)
898 {
899         struct cs_spec *spec = codec->spec;
900         if (spec->dig_in)
901                 return snd_hda_create_spdif_in_ctls(codec, spec->dig_in);
902         return 0;
903 }
904
905 /*
906  * auto-mute and auto-mic switching
907  * CS421x auto-output redirecting
908  * HP/SPK/SPDIF
909  */
910
911 static void cs_automute(struct hda_codec *codec, struct hda_jack_tbl *tbl)
912 {
913         struct cs_spec *spec = codec->spec;
914         struct auto_pin_cfg *cfg = &spec->autocfg;
915         unsigned int hp_present;
916         unsigned int spdif_present;
917         hda_nid_t nid;
918         int i;
919
920         spdif_present = 0;
921         if (cfg->dig_outs) {
922                 nid = cfg->dig_out_pins[0];
923                 if (is_jack_detectable(codec, nid)) {
924                         /*
925                         TODO: SPDIF output redirect when SENSE_B is enabled.
926                         Shared (SENSE_A) jack (e.g HP/mini-TOSLINK)
927                         assumed.
928                         */
929                         if (snd_hda_jack_detect(codec, nid)
930                                 /* && spec->sense_b */)
931                                 spdif_present = 1;
932                 }
933         }
934
935         hp_present = 0;
936         for (i = 0; i < cfg->hp_outs; i++) {
937                 nid = cfg->hp_pins[i];
938                 if (!is_jack_detectable(codec, nid))
939                         continue;
940                 hp_present = snd_hda_jack_detect(codec, nid);
941                 if (hp_present)
942                         break;
943         }
944
945         /* mute speakers if spdif or hp jack is plugged in */
946         for (i = 0; i < cfg->speaker_outs; i++) {
947                 int pin_ctl = hp_present ? 0 : PIN_OUT;
948                 /* detect on spdif is specific to CS4210 */
949                 if (spdif_present && (spec->vendor_nid == CS4210_VENDOR_NID))
950                         pin_ctl = 0;
951
952                 nid = cfg->speaker_pins[i];
953                 snd_hda_set_pin_ctl(codec, nid, pin_ctl);
954         }
955         if (spec->gpio_eapd_hp) {
956                 unsigned int gpio = hp_present ?
957                         spec->gpio_eapd_hp : spec->gpio_eapd_speaker;
958                 snd_hda_codec_write(codec, 0x01, 0,
959                                     AC_VERB_SET_GPIO_DATA, gpio);
960         }
961
962         /* specific to CS4210 */
963         if (spec->vendor_nid == CS4210_VENDOR_NID) {
964                 /* mute HPs if spdif jack (SENSE_B) is present */
965                 for (i = 0; i < cfg->hp_outs; i++) {
966                         nid = cfg->hp_pins[i];
967                         snd_hda_set_pin_ctl(codec, nid,
968                                 (spdif_present && spec->sense_b) ? 0 : PIN_HP);
969                 }
970
971                 /* SPDIF TX on/off */
972                 if (cfg->dig_outs) {
973                         nid = cfg->dig_out_pins[0];
974                         snd_hda_set_pin_ctl(codec, nid,
975                                 spdif_present ? PIN_OUT : 0);
976
977                 }
978                 /* Update board GPIOs if neccessary ... */
979         }
980 }
981
982 /*
983  * Auto-input redirect for CS421x
984  * Switch max 3 inputs of a single ADC (nid 3)
985 */
986
987 static void cs_automic(struct hda_codec *codec, struct hda_jack_tbl *tbl)
988 {
989         struct cs_spec *spec = codec->spec;
990         struct auto_pin_cfg *cfg = &spec->autocfg;
991         hda_nid_t nid;
992         unsigned int present;
993
994         nid = cfg->inputs[spec->automic_idx].pin;
995         present = snd_hda_jack_detect(codec, nid);
996
997         /* specific to CS421x, single ADC */
998         if (spec->vendor_nid == CS420X_VENDOR_NID) {
999                 if (present)
1000                         change_cur_input(codec, spec->automic_idx, 0);
1001                 else
1002                         change_cur_input(codec, !spec->automic_idx, 0);
1003         } else {
1004                 if (present) {
1005                         if (spec->cur_input != spec->automic_idx) {
1006                                 spec->last_input = spec->cur_input;
1007                                 spec->cur_input = spec->automic_idx;
1008                         }
1009                 } else  {
1010                         spec->cur_input = spec->last_input;
1011                 }
1012                 cs_update_input_select(codec);
1013         }
1014 }
1015
1016 /*
1017  */
1018
1019 static void init_output(struct hda_codec *codec)
1020 {
1021         struct cs_spec *spec = codec->spec;
1022         struct auto_pin_cfg *cfg = &spec->autocfg;
1023         int i;
1024
1025         /* mute first */
1026         for (i = 0; i < spec->multiout.num_dacs; i++)
1027                 snd_hda_codec_write(codec, spec->multiout.dac_nids[i], 0,
1028                                     AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
1029         if (spec->multiout.hp_nid)
1030                 snd_hda_codec_write(codec, spec->multiout.hp_nid, 0,
1031                                     AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
1032         for (i = 0; i < ARRAY_SIZE(spec->multiout.extra_out_nid); i++) {
1033                 if (!spec->multiout.extra_out_nid[i])
1034                         break;
1035                 snd_hda_codec_write(codec, spec->multiout.extra_out_nid[i], 0,
1036                                     AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
1037         }
1038
1039         /* set appropriate pin controls */
1040         for (i = 0; i < cfg->line_outs; i++)
1041                 snd_hda_set_pin_ctl(codec, cfg->line_out_pins[i], PIN_OUT);
1042         /* HP */
1043         for (i = 0; i < cfg->hp_outs; i++) {
1044                 hda_nid_t nid = cfg->hp_pins[i];
1045                 snd_hda_set_pin_ctl(codec, nid, PIN_HP);
1046                 if (!cfg->speaker_outs)
1047                         continue;
1048                 if (get_wcaps(codec, nid) & AC_WCAP_UNSOL_CAP) {
1049                         snd_hda_jack_detect_enable_callback(codec, nid, HP_EVENT, cs_automute);
1050                         spec->hp_detect = 1;
1051                 }
1052         }
1053
1054         /* Speaker */
1055         for (i = 0; i < cfg->speaker_outs; i++)
1056                 snd_hda_set_pin_ctl(codec, cfg->speaker_pins[i], PIN_OUT);
1057
1058         /* SPDIF is enabled on presence detect for CS421x */
1059         if (spec->hp_detect || spec->spdif_detect)
1060                 cs_automute(codec, NULL);
1061 }
1062
1063 static void init_input(struct hda_codec *codec)
1064 {
1065         struct cs_spec *spec = codec->spec;
1066         struct auto_pin_cfg *cfg = &spec->autocfg;
1067         unsigned int coef;
1068         int i;
1069
1070         for (i = 0; i < cfg->num_inputs; i++) {
1071                 unsigned int ctl;
1072                 hda_nid_t pin = cfg->inputs[i].pin;
1073                 if (!spec->adc_nid[i])
1074                         continue;
1075                 /* set appropriate pin control and mute first */
1076                 ctl = PIN_IN;
1077                 if (cfg->inputs[i].type == AUTO_PIN_MIC)
1078                         ctl |= snd_hda_get_default_vref(codec, pin);
1079                 snd_hda_set_pin_ctl(codec, pin, ctl);
1080                 snd_hda_codec_write(codec, spec->adc_nid[i], 0,
1081                                     AC_VERB_SET_AMP_GAIN_MUTE,
1082                                     AMP_IN_MUTE(spec->adc_idx[i]));
1083                 if (spec->mic_detect && spec->automic_idx == i)
1084                         snd_hda_jack_detect_enable_callback(codec, pin, MIC_EVENT, cs_automic);
1085         }
1086         /* CS420x has multiple ADC, CS421x has single ADC */
1087         if (spec->vendor_nid == CS420X_VENDOR_NID) {
1088                 change_cur_input(codec, spec->cur_input, 1);
1089                 if (spec->mic_detect)
1090                         cs_automic(codec, NULL);
1091
1092                 coef = cs_vendor_coef_get(codec, IDX_BEEP_CFG);
1093                 if (is_active_pin(codec, CS_DMIC2_PIN_NID))
1094                         coef |= 1 << 4; /* DMIC2 2 chan on, GPIO1 off */
1095                 if (is_active_pin(codec, CS_DMIC1_PIN_NID))
1096                         coef |= 1 << 3; /* DMIC1 2 chan on, GPIO0 off
1097                                          * No effect if SPDIF_OUT2 is
1098                                          * selected in IDX_SPDIF_CTL.
1099                                         */
1100
1101                 cs_vendor_coef_set(codec, IDX_BEEP_CFG, coef);
1102         } else {
1103                 if (spec->mic_detect)
1104                         cs_automic(codec, NULL);
1105                 else  {
1106                         spec->cur_adc = spec->adc_nid[spec->cur_input];
1107                         cs_update_input_select(codec);
1108                 }
1109         }
1110 }
1111
1112 static const struct hda_verb cs_coef_init_verbs[] = {
1113         {0x11, AC_VERB_SET_PROC_STATE, 1},
1114         {0x11, AC_VERB_SET_COEF_INDEX, IDX_DAC_CFG},
1115         {0x11, AC_VERB_SET_PROC_COEF,
1116          (0x002a /* DAC1/2/3 SZCMode Soft Ramp */
1117           | 0x0040 /* Mute DACs on FIFO error */
1118           | 0x1000 /* Enable DACs High Pass Filter */
1119           | 0x0400 /* Disable Coefficient Auto increment */
1120           )},
1121         /* ADC1/2 - Digital and Analog Soft Ramp */
1122         {0x11, AC_VERB_SET_COEF_INDEX, IDX_ADC_CFG},
1123         {0x11, AC_VERB_SET_PROC_COEF, 0x000a},
1124         /* Beep */
1125         {0x11, AC_VERB_SET_COEF_INDEX, IDX_BEEP_CFG},
1126         {0x11, AC_VERB_SET_PROC_COEF, 0x0007}, /* Enable Beep thru DAC1/2/3 */
1127
1128         {} /* terminator */
1129 };
1130
1131 /* Errata: CS4207 rev C0/C1/C2 Silicon
1132  *
1133  * http://www.cirrus.com/en/pubs/errata/ER880C3.pdf
1134  *
1135  * 6. At high temperature (TA > +85°C), the digital supply current (IVD)
1136  * may be excessive (up to an additional 200 Î¼A), which is most easily
1137  * observed while the part is being held in reset (RESET# active low).
1138  *
1139  * Root Cause: At initial powerup of the device, the logic that drives
1140  * the clock and write enable to the S/PDIF SRC RAMs is not properly
1141  * initialized.
1142  * Certain random patterns will cause a steady leakage current in those
1143  * RAM cells. The issue will resolve once the SRCs are used (turned on).
1144  *
1145  * Workaround: The following verb sequence briefly turns on the S/PDIF SRC
1146  * blocks, which will alleviate the issue.
1147  */
1148
1149 static const struct hda_verb cs_errata_init_verbs[] = {
1150         {0x01, AC_VERB_SET_POWER_STATE, 0x00}, /* AFG: D0 */
1151         {0x11, AC_VERB_SET_PROC_STATE, 0x01},  /* VPW: processing on */
1152
1153         {0x11, AC_VERB_SET_COEF_INDEX, 0x0008},
1154         {0x11, AC_VERB_SET_PROC_COEF, 0x9999},
1155         {0x11, AC_VERB_SET_COEF_INDEX, 0x0017},
1156         {0x11, AC_VERB_SET_PROC_COEF, 0xa412},
1157         {0x11, AC_VERB_SET_COEF_INDEX, 0x0001},
1158         {0x11, AC_VERB_SET_PROC_COEF, 0x0009},
1159
1160         {0x07, AC_VERB_SET_POWER_STATE, 0x00}, /* S/PDIF Rx: D0 */
1161         {0x08, AC_VERB_SET_POWER_STATE, 0x00}, /* S/PDIF Tx: D0 */
1162
1163         {0x11, AC_VERB_SET_COEF_INDEX, 0x0017},
1164         {0x11, AC_VERB_SET_PROC_COEF, 0x2412},
1165         {0x11, AC_VERB_SET_COEF_INDEX, 0x0008},
1166         {0x11, AC_VERB_SET_PROC_COEF, 0x0000},
1167         {0x11, AC_VERB_SET_COEF_INDEX, 0x0001},
1168         {0x11, AC_VERB_SET_PROC_COEF, 0x0008},
1169         {0x11, AC_VERB_SET_PROC_STATE, 0x00},
1170
1171 #if 0 /* Don't to set to D3 as we are in power-up sequence */
1172         {0x07, AC_VERB_SET_POWER_STATE, 0x03}, /* S/PDIF Rx: D3 */
1173         {0x08, AC_VERB_SET_POWER_STATE, 0x03}, /* S/PDIF Tx: D3 */
1174         /*{0x01, AC_VERB_SET_POWER_STATE, 0x03},*/ /* AFG: D3 This is already handled */
1175 #endif
1176
1177         {} /* terminator */
1178 };
1179
1180 /* SPDIF setup */
1181 static void init_digital(struct hda_codec *codec)
1182 {
1183         unsigned int coef;
1184
1185         coef = 0x0002; /* SRC_MUTE soft-mute on SPDIF (if no lock) */
1186         coef |= 0x0008; /* Replace with mute on error */
1187         if (is_active_pin(codec, CS_DIG_OUT2_PIN_NID))
1188                 coef |= 0x4000; /* RX to TX1 or TX2 Loopthru / SPDIF2
1189                                  * SPDIF_OUT2 is shared with GPIO1 and
1190                                  * DMIC_SDA2.
1191                                  */
1192         cs_vendor_coef_set(codec, IDX_SPDIF_CTL, coef);
1193 }
1194
1195 static int cs_init(struct hda_codec *codec)
1196 {
1197         struct cs_spec *spec = codec->spec;
1198
1199         /* init_verb sequence for C0/C1/C2 errata*/
1200         snd_hda_sequence_write(codec, cs_errata_init_verbs);
1201
1202         snd_hda_sequence_write(codec, cs_coef_init_verbs);
1203
1204         snd_hda_gen_apply_verbs(codec);
1205
1206         if (spec->gpio_mask) {
1207                 snd_hda_codec_write(codec, 0x01, 0, AC_VERB_SET_GPIO_MASK,
1208                                     spec->gpio_mask);
1209                 snd_hda_codec_write(codec, 0x01, 0, AC_VERB_SET_GPIO_DIRECTION,
1210                                     spec->gpio_dir);
1211                 snd_hda_codec_write(codec, 0x01, 0, AC_VERB_SET_GPIO_DATA,
1212                                     spec->gpio_data);
1213         }
1214
1215         init_output(codec);
1216         init_input(codec);
1217         init_digital(codec);
1218
1219         return 0;
1220 }
1221
1222 static int cs_build_controls(struct hda_codec *codec)
1223 {
1224         struct cs_spec *spec = codec->spec;
1225         int err;
1226
1227         err = build_output(codec);
1228         if (err < 0)
1229                 return err;
1230         err = build_input(codec);
1231         if (err < 0)
1232                 return err;
1233         err = build_digital_output(codec);
1234         if (err < 0)
1235                 return err;
1236         err = build_digital_input(codec);
1237         if (err < 0)
1238                 return err;
1239         err = cs_init(codec);
1240         if (err < 0)
1241                 return err;
1242
1243         err = snd_hda_jack_add_kctls(codec, &spec->autocfg);
1244         if (err < 0)
1245                 return err;
1246
1247         return 0;
1248 }
1249
1250 static void cs_free(struct hda_codec *codec)
1251 {
1252         struct cs_spec *spec = codec->spec;
1253         kfree(spec->capture_bind[0]);
1254         kfree(spec->capture_bind[1]);
1255         snd_hda_gen_free(&spec->gen);
1256         kfree(codec->spec);
1257 }
1258
1259 static const struct hda_codec_ops cs_patch_ops = {
1260         .build_controls = cs_build_controls,
1261         .build_pcms = cs_build_pcms,
1262         .init = cs_init,
1263         .free = cs_free,
1264         .unsol_event = snd_hda_jack_unsol_event,
1265 };
1266
1267 static int cs_parse_auto_config(struct hda_codec *codec)
1268 {
1269         struct cs_spec *spec = codec->spec;
1270         int err;
1271
1272         err = snd_hda_parse_pin_def_config(codec, &spec->autocfg, NULL);
1273         if (err < 0)
1274                 return err;
1275
1276         err = parse_output(codec);
1277         if (err < 0)
1278                 return err;
1279         err = parse_input(codec);
1280         if (err < 0)
1281                 return err;
1282         err = parse_digital_output(codec);
1283         if (err < 0)
1284                 return err;
1285         err = parse_digital_input(codec);
1286         if (err < 0)
1287                 return err;
1288         return 0;
1289 }
1290
1291 static const struct hda_model_fixup cs420x_models[] = {
1292         { .id = CS420X_MBP53, .name = "mbp53" },
1293         { .id = CS420X_MBP55, .name = "mbp55" },
1294         { .id = CS420X_IMAC27, .name = "imac27" },
1295         { .id = CS420X_IMAC27_122, .name = "imac27_122" },
1296         { .id = CS420X_APPLE, .name = "apple" },
1297         { .id = CS420X_MBP101, .name = "mbp101" },
1298         { .id = CS420X_MBP81, .name = "mbp81" },
1299         {}
1300 };
1301
1302 static const struct snd_pci_quirk cs420x_fixup_tbl[] = {
1303         SND_PCI_QUIRK(0x10de, 0x0ac0, "MacBookPro 5,3", CS420X_MBP53),
1304         SND_PCI_QUIRK(0x10de, 0x0d94, "MacBookAir 3,1(2)", CS420X_MBP55),
1305         SND_PCI_QUIRK(0x10de, 0xcb79, "MacBookPro 5,5", CS420X_MBP55),
1306         SND_PCI_QUIRK(0x10de, 0xcb89, "MacBookPro 7,1", CS420X_MBP55),
1307         /* this conflicts with too many other models */
1308         /*SND_PCI_QUIRK(0x8086, 0x7270, "IMac 27 Inch", CS420X_IMAC27),*/
1309
1310         /* codec SSID */
1311         SND_PCI_QUIRK(0x106b, 0x1c00, "MacBookPro 8,1", CS420X_MBP81),
1312         SND_PCI_QUIRK(0x106b, 0x2000, "iMac 12,2", CS420X_IMAC27_122),
1313         SND_PCI_QUIRK(0x106b, 0x2800, "MacBookPro 10,1", CS420X_MBP101),
1314         SND_PCI_QUIRK_VENDOR(0x106b, "Apple", CS420X_APPLE),
1315         {} /* terminator */
1316 };
1317
1318 static const struct hda_pintbl mbp53_pincfgs[] = {
1319         { 0x09, 0x012b4050 },
1320         { 0x0a, 0x90100141 },
1321         { 0x0b, 0x90100140 },
1322         { 0x0c, 0x018b3020 },
1323         { 0x0d, 0x90a00110 },
1324         { 0x0e, 0x400000f0 },
1325         { 0x0f, 0x01cbe030 },
1326         { 0x10, 0x014be060 },
1327         { 0x12, 0x400000f0 },
1328         { 0x15, 0x400000f0 },
1329         {} /* terminator */
1330 };
1331
1332 static const struct hda_pintbl mbp55_pincfgs[] = {
1333         { 0x09, 0x012b4030 },
1334         { 0x0a, 0x90100121 },
1335         { 0x0b, 0x90100120 },
1336         { 0x0c, 0x400000f0 },
1337         { 0x0d, 0x90a00110 },
1338         { 0x0e, 0x400000f0 },
1339         { 0x0f, 0x400000f0 },
1340         { 0x10, 0x014be040 },
1341         { 0x12, 0x400000f0 },
1342         { 0x15, 0x400000f0 },
1343         {} /* terminator */
1344 };
1345
1346 static const struct hda_pintbl imac27_pincfgs[] = {
1347         { 0x09, 0x012b4050 },
1348         { 0x0a, 0x90100140 },
1349         { 0x0b, 0x90100142 },
1350         { 0x0c, 0x018b3020 },
1351         { 0x0d, 0x90a00110 },
1352         { 0x0e, 0x400000f0 },
1353         { 0x0f, 0x01cbe030 },
1354         { 0x10, 0x014be060 },
1355         { 0x12, 0x01ab9070 },
1356         { 0x15, 0x400000f0 },
1357         {} /* terminator */
1358 };
1359
1360 static const struct hda_pintbl mbp101_pincfgs[] = {
1361         { 0x0d, 0x40ab90f0 },
1362         { 0x0e, 0x90a600f0 },
1363         { 0x12, 0x50a600f0 },
1364         {} /* terminator */
1365 };
1366
1367 static void cs420x_fixup_gpio_13(struct hda_codec *codec,
1368                                  const struct hda_fixup *fix, int action)
1369 {
1370         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
1371                 struct cs_spec *spec = codec->spec;
1372                 spec->gpio_eapd_hp = 2; /* GPIO1 = headphones */
1373                 spec->gpio_eapd_speaker = 8; /* GPIO3 = speakers */
1374                 spec->gpio_mask = spec->gpio_dir =
1375                         spec->gpio_eapd_hp | spec->gpio_eapd_speaker;
1376         }
1377 }
1378
1379 static void cs420x_fixup_gpio_23(struct hda_codec *codec,
1380                                  const struct hda_fixup *fix, int action)
1381 {
1382         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
1383                 struct cs_spec *spec = codec->spec;
1384                 spec->gpio_eapd_hp = 4; /* GPIO2 = headphones */
1385                 spec->gpio_eapd_speaker = 8; /* GPIO3 = speakers */
1386                 spec->gpio_mask = spec->gpio_dir =
1387                         spec->gpio_eapd_hp | spec->gpio_eapd_speaker;
1388         }
1389 }
1390
1391 static const struct hda_fixup cs420x_fixups[] = {
1392         [CS420X_MBP53] = {
1393                 .type = HDA_FIXUP_PINS,
1394                 .v.pins = mbp53_pincfgs,
1395                 .chained = true,
1396                 .chain_id = CS420X_APPLE,
1397         },
1398         [CS420X_MBP55] = {
1399                 .type = HDA_FIXUP_PINS,
1400                 .v.pins = mbp55_pincfgs,
1401                 .chained = true,
1402                 .chain_id = CS420X_GPIO_13,
1403         },
1404         [CS420X_IMAC27] = {
1405                 .type = HDA_FIXUP_PINS,
1406                 .v.pins = imac27_pincfgs,
1407                 .chained = true,
1408                 .chain_id = CS420X_GPIO_13,
1409         },
1410         [CS420X_GPIO_13] = {
1411                 .type = HDA_FIXUP_FUNC,
1412                 .v.func = cs420x_fixup_gpio_13,
1413         },
1414         [CS420X_GPIO_23] = {
1415                 .type = HDA_FIXUP_FUNC,
1416                 .v.func = cs420x_fixup_gpio_23,
1417         },
1418         [CS420X_MBP101] = {
1419                 .type = HDA_FIXUP_PINS,
1420                 .v.pins = mbp101_pincfgs,
1421                 .chained = true,
1422                 .chain_id = CS420X_GPIO_13,
1423         },
1424         [CS420X_MBP81] = {
1425                 .type = HDA_FIXUP_VERBS,
1426                 .v.verbs = (const struct hda_verb[]) {
1427                         /* internal mic ADC2: right only, single ended */
1428                         {0x11, AC_VERB_SET_COEF_INDEX, IDX_ADC_CFG},
1429                         {0x11, AC_VERB_SET_PROC_COEF, 0x102a},
1430                         {}
1431                 },
1432                 .chained = true,
1433                 .chain_id = CS420X_GPIO_13,
1434         },
1435 };
1436
1437 static int patch_cs420x(struct hda_codec *codec)
1438 {
1439         struct cs_spec *spec;
1440         int err;
1441
1442         spec = kzalloc(sizeof(*spec), GFP_KERNEL);
1443         if (!spec)
1444                 return -ENOMEM;
1445         codec->spec = spec;
1446         snd_hda_gen_init(&spec->gen);
1447
1448         spec->vendor_nid = CS420X_VENDOR_NID;
1449
1450         snd_hda_pick_fixup(codec, cs420x_models, cs420x_fixup_tbl,
1451                            cs420x_fixups);
1452         snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
1453
1454         err = cs_parse_auto_config(codec);
1455         if (err < 0)
1456                 goto error;
1457
1458         codec->patch_ops = cs_patch_ops;
1459
1460         snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
1461
1462         return 0;
1463
1464  error:
1465         cs_free(codec);
1466         codec->spec = NULL;
1467         return err;
1468 }
1469
1470 /*
1471  * Cirrus Logic CS4210
1472  *
1473  * 1 DAC => HP(sense) / Speakers,
1474  * 1 ADC <= LineIn(sense) / MicIn / DMicIn,
1475  * 1 SPDIF OUT => SPDIF Trasmitter(sense)
1476 */
1477
1478 /* CS4210 board names */
1479 static const struct hda_model_fixup cs421x_models[] = {
1480         { .id = CS421X_CDB4210, .name = "cdb4210" },
1481         {}
1482 };
1483
1484 static const struct snd_pci_quirk cs421x_fixup_tbl[] = {
1485         /* Test Intel board + CDB2410  */
1486         SND_PCI_QUIRK(0x8086, 0x5001, "DP45SG/CDB4210", CS421X_CDB4210),
1487         {} /* terminator */
1488 };
1489
1490 /* CS4210 board pinconfigs */
1491 /* Default CS4210 (CDB4210)*/
1492 static const struct hda_pintbl cdb4210_pincfgs[] = {
1493         { 0x05, 0x0321401f },
1494         { 0x06, 0x90170010 },
1495         { 0x07, 0x03813031 },
1496         { 0x08, 0xb7a70037 },
1497         { 0x09, 0xb7a6003e },
1498         { 0x0a, 0x034510f0 },
1499         {} /* terminator */
1500 };
1501
1502 /* Setup GPIO/SENSE for each board (if used) */
1503 static void cs421x_fixup_sense_b(struct hda_codec *codec,
1504                                  const struct hda_fixup *fix, int action)
1505 {
1506         struct cs_spec *spec = codec->spec;
1507         if (action == HDA_FIXUP_ACT_PRE_PROBE)
1508                 spec->sense_b = 1;
1509 }
1510
1511 static const struct hda_fixup cs421x_fixups[] = {
1512         [CS421X_CDB4210] = {
1513                 .type = HDA_FIXUP_PINS,
1514                 .v.pins = cdb4210_pincfgs,
1515                 .chained = true,
1516                 .chain_id = CS421X_SENSE_B,
1517         },
1518         [CS421X_SENSE_B] = {
1519                 .type = HDA_FIXUP_FUNC,
1520                 .v.func = cs421x_fixup_sense_b,
1521         }
1522 };
1523
1524 static const struct hda_verb cs421x_coef_init_verbs[] = {
1525         {0x0B, AC_VERB_SET_PROC_STATE, 1},
1526         {0x0B, AC_VERB_SET_COEF_INDEX, CS421X_IDX_DEV_CFG},
1527         /*
1528             Disable Coefficient Index Auto-Increment(DAI)=1,
1529             PDREF=0
1530         */
1531         {0x0B, AC_VERB_SET_PROC_COEF, 0x0001 },
1532
1533         {0x0B, AC_VERB_SET_COEF_INDEX, CS421X_IDX_ADC_CFG},
1534         /* ADC SZCMode = Digital Soft Ramp */
1535         {0x0B, AC_VERB_SET_PROC_COEF, 0x0002 },
1536
1537         {0x0B, AC_VERB_SET_COEF_INDEX, CS421X_IDX_DAC_CFG},
1538         {0x0B, AC_VERB_SET_PROC_COEF,
1539          (0x0002 /* DAC SZCMode = Digital Soft Ramp */
1540           | 0x0004 /* Mute DAC on FIFO error */
1541           | 0x0008 /* Enable DAC High Pass Filter */
1542           )},
1543         {} /* terminator */
1544 };
1545
1546 /* Errata: CS4210 rev A1 Silicon
1547  *
1548  * http://www.cirrus.com/en/pubs/errata/
1549  *
1550  * Description:
1551  * 1. Performance degredation is present in the ADC.
1552  * 2. Speaker output is not completely muted upon HP detect.
1553  * 3. Noise is present when clipping occurs on the amplified
1554  *    speaker outputs.
1555  *
1556  * Workaround:
1557  * The following verb sequence written to the registers during
1558  * initialization will correct the issues listed above.
1559  */
1560
1561 static const struct hda_verb cs421x_coef_init_verbs_A1_silicon_fixes[] = {
1562         {0x0B, AC_VERB_SET_PROC_STATE, 0x01},  /* VPW: processing on */
1563
1564         {0x0B, AC_VERB_SET_COEF_INDEX, 0x0006},
1565         {0x0B, AC_VERB_SET_PROC_COEF, 0x9999}, /* Test mode: on */
1566
1567         {0x0B, AC_VERB_SET_COEF_INDEX, 0x000A},
1568         {0x0B, AC_VERB_SET_PROC_COEF, 0x14CB}, /* Chop double */
1569
1570         {0x0B, AC_VERB_SET_COEF_INDEX, 0x0011},
1571         {0x0B, AC_VERB_SET_PROC_COEF, 0xA2D0}, /* Increase ADC current */
1572
1573         {0x0B, AC_VERB_SET_COEF_INDEX, 0x001A},
1574         {0x0B, AC_VERB_SET_PROC_COEF, 0x02A9}, /* Mute speaker */
1575
1576         {0x0B, AC_VERB_SET_COEF_INDEX, 0x001B},
1577         {0x0B, AC_VERB_SET_PROC_COEF, 0X1006}, /* Remove noise */
1578
1579         {} /* terminator */
1580 };
1581
1582 /* Speaker Amp Gain is controlled by the vendor widget's coef 4 */
1583 static const DECLARE_TLV_DB_SCALE(cs421x_speaker_boost_db_scale, 900, 300, 0);
1584
1585 static int cs421x_boost_vol_info(struct snd_kcontrol *kcontrol,
1586                                 struct snd_ctl_elem_info *uinfo)
1587 {
1588         uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
1589         uinfo->count = 1;
1590         uinfo->value.integer.min = 0;
1591         uinfo->value.integer.max = 3;
1592         return 0;
1593 }
1594
1595 static int cs421x_boost_vol_get(struct snd_kcontrol *kcontrol,
1596                                 struct snd_ctl_elem_value *ucontrol)
1597 {
1598         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1599
1600         ucontrol->value.integer.value[0] =
1601                 cs_vendor_coef_get(codec, CS421X_IDX_SPK_CTL) & 0x0003;
1602         return 0;
1603 }
1604
1605 static int cs421x_boost_vol_put(struct snd_kcontrol *kcontrol,
1606                                 struct snd_ctl_elem_value *ucontrol)
1607 {
1608         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1609
1610         unsigned int vol = ucontrol->value.integer.value[0];
1611         unsigned int coef =
1612                 cs_vendor_coef_get(codec, CS421X_IDX_SPK_CTL);
1613         unsigned int original_coef = coef;
1614
1615         coef &= ~0x0003;
1616         coef |= (vol & 0x0003);
1617         if (original_coef == coef)
1618                 return 0;
1619         else {
1620                 cs_vendor_coef_set(codec, CS421X_IDX_SPK_CTL, coef);
1621                 return 1;
1622         }
1623 }
1624
1625 static const struct snd_kcontrol_new cs421x_speaker_bost_ctl = {
1626
1627         .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1628         .access = (SNDRV_CTL_ELEM_ACCESS_READWRITE |
1629                         SNDRV_CTL_ELEM_ACCESS_TLV_READ),
1630         .name = "Speaker Boost Playback Volume",
1631         .info = cs421x_boost_vol_info,
1632         .get = cs421x_boost_vol_get,
1633         .put = cs421x_boost_vol_put,
1634         .tlv = { .p = cs421x_speaker_boost_db_scale },
1635 };
1636
1637 static void cs4210_pinmux_init(struct hda_codec *codec)
1638 {
1639         struct cs_spec *spec = codec->spec;
1640         unsigned int def_conf, coef;
1641
1642         /* GPIO, DMIC_SCL, DMIC_SDA and SENSE_B are multiplexed */
1643         coef = cs_vendor_coef_get(codec, CS421X_IDX_DEV_CFG);
1644
1645         if (spec->gpio_mask)
1646                 coef |= 0x0008; /* B1,B2 are GPIOs */
1647         else
1648                 coef &= ~0x0008;
1649
1650         if (spec->sense_b)
1651                 coef |= 0x0010; /* B2 is SENSE_B, not inverted  */
1652         else
1653                 coef &= ~0x0010;
1654
1655         cs_vendor_coef_set(codec, CS421X_IDX_DEV_CFG, coef);
1656
1657         if ((spec->gpio_mask || spec->sense_b) &&
1658             is_active_pin(codec, CS421X_DMIC_PIN_NID)) {
1659
1660                 /*
1661                     GPIO or SENSE_B forced - disconnect the DMIC pin.
1662                 */
1663                 def_conf = snd_hda_codec_get_pincfg(codec, CS421X_DMIC_PIN_NID);
1664                 def_conf &= ~AC_DEFCFG_PORT_CONN;
1665                 def_conf |= (AC_JACK_PORT_NONE << AC_DEFCFG_PORT_CONN_SHIFT);
1666                 snd_hda_codec_set_pincfg(codec, CS421X_DMIC_PIN_NID, def_conf);
1667         }
1668 }
1669
1670 static void init_cs421x_digital(struct hda_codec *codec)
1671 {
1672         struct cs_spec *spec = codec->spec;
1673         struct auto_pin_cfg *cfg = &spec->autocfg;
1674         int i;
1675
1676
1677         for (i = 0; i < cfg->dig_outs; i++) {
1678                 hda_nid_t nid = cfg->dig_out_pins[i];
1679                 if (!cfg->speaker_outs)
1680                         continue;
1681                 if (get_wcaps(codec, nid) & AC_WCAP_UNSOL_CAP) {
1682                         snd_hda_jack_detect_enable_callback(codec, nid, SPDIF_EVENT, cs_automute);
1683                         spec->spdif_detect = 1;
1684                 }
1685         }
1686 }
1687
1688 static int cs421x_init(struct hda_codec *codec)
1689 {
1690         struct cs_spec *spec = codec->spec;
1691
1692         if (spec->vendor_nid == CS4210_VENDOR_NID) {
1693                 snd_hda_sequence_write(codec, cs421x_coef_init_verbs);
1694                 snd_hda_sequence_write(codec, cs421x_coef_init_verbs_A1_silicon_fixes);
1695                 cs4210_pinmux_init(codec);
1696         }
1697
1698         if (spec->gpio_mask) {
1699                 snd_hda_codec_write(codec, 0x01, 0, AC_VERB_SET_GPIO_MASK,
1700                                     spec->gpio_mask);
1701                 snd_hda_codec_write(codec, 0x01, 0, AC_VERB_SET_GPIO_DIRECTION,
1702                                     spec->gpio_dir);
1703                 snd_hda_codec_write(codec, 0x01, 0, AC_VERB_SET_GPIO_DATA,
1704                                     spec->gpio_data);
1705         }
1706
1707         init_output(codec);
1708         init_input(codec);
1709         init_cs421x_digital(codec);
1710
1711         return 0;
1712 }
1713
1714 /*
1715  * CS4210 Input MUX (1 ADC)
1716  */
1717 static int cs421x_mux_enum_info(struct snd_kcontrol *kcontrol,
1718                                         struct snd_ctl_elem_info *uinfo)
1719 {
1720         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1721         struct cs_spec *spec = codec->spec;
1722
1723         return snd_hda_input_mux_info(&spec->input_mux, uinfo);
1724 }
1725
1726 static int cs421x_mux_enum_get(struct snd_kcontrol *kcontrol,
1727                                         struct snd_ctl_elem_value *ucontrol)
1728 {
1729         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1730         struct cs_spec *spec = codec->spec;
1731
1732         ucontrol->value.enumerated.item[0] = spec->cur_input;
1733         return 0;
1734 }
1735
1736 static int cs421x_mux_enum_put(struct snd_kcontrol *kcontrol,
1737                                         struct snd_ctl_elem_value *ucontrol)
1738 {
1739         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1740         struct cs_spec *spec = codec->spec;
1741
1742         return snd_hda_input_mux_put(codec, &spec->input_mux, ucontrol,
1743                                 spec->adc_nid[0], &spec->cur_input);
1744
1745 }
1746
1747 static const struct snd_kcontrol_new cs421x_capture_source = {
1748         .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1749         .name = "Capture Source",
1750         .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
1751         .info = cs421x_mux_enum_info,
1752         .get = cs421x_mux_enum_get,
1753         .put = cs421x_mux_enum_put,
1754 };
1755
1756 static int cs421x_add_input_volume_control(struct hda_codec *codec, int item)
1757 {
1758         struct cs_spec *spec = codec->spec;
1759         struct auto_pin_cfg *cfg = &spec->autocfg;
1760         const struct hda_input_mux *imux = &spec->input_mux;
1761         hda_nid_t pin = cfg->inputs[item].pin;
1762         struct snd_kcontrol *kctl;
1763         u32 caps;
1764
1765         if (!(get_wcaps(codec, pin) & AC_WCAP_IN_AMP))
1766                 return 0;
1767
1768         caps = query_amp_caps(codec, pin, HDA_INPUT);
1769         caps = (caps & AC_AMPCAP_NUM_STEPS) >> AC_AMPCAP_NUM_STEPS_SHIFT;
1770         if (caps <= 1)
1771                 return 0;
1772
1773         return add_volume(codec,  imux->items[item].label, 0,
1774                           HDA_COMPOSE_AMP_VAL(pin, 3, 0, HDA_INPUT), 1, &kctl);
1775 }
1776
1777 /* add a (input-boost) volume control to the given input pin */
1778 static int build_cs421x_input(struct hda_codec *codec)
1779 {
1780         struct cs_spec *spec = codec->spec;
1781         struct auto_pin_cfg *cfg = &spec->autocfg;
1782         struct hda_input_mux *imux = &spec->input_mux;
1783         int i, err, type_idx;
1784         const char *label;
1785
1786         if (!spec->num_inputs)
1787                 return 0;
1788
1789         /* make bind-capture */
1790         spec->capture_bind[0] = make_bind_capture(codec, &snd_hda_bind_sw);
1791         spec->capture_bind[1] = make_bind_capture(codec, &snd_hda_bind_vol);
1792         for (i = 0; i < 2; i++) {
1793                 struct snd_kcontrol *kctl;
1794                 int n;
1795                 if (!spec->capture_bind[i])
1796                         return -ENOMEM;
1797                 kctl = snd_ctl_new1(&cs_capture_ctls[i], codec);
1798                 if (!kctl)
1799                         return -ENOMEM;
1800                 kctl->private_value = (long)spec->capture_bind[i];
1801                 err = snd_hda_ctl_add(codec, 0, kctl);
1802                 if (err < 0)
1803                         return err;
1804                 for (n = 0; n < AUTO_PIN_LAST; n++) {
1805                         if (!spec->adc_nid[n])
1806                                 continue;
1807                         err = snd_hda_add_nid(codec, kctl, 0, spec->adc_nid[n]);
1808                         if (err < 0)
1809                                 return err;
1810                 }
1811         }
1812
1813         /* Add Input MUX Items + Capture Volume/Switch */
1814         for (i = 0; i < spec->num_inputs; i++) {
1815                 label = hda_get_autocfg_input_label(codec, cfg, i);
1816                 snd_hda_add_imux_item(imux, label, spec->adc_idx[i], &type_idx);
1817
1818                 err = cs421x_add_input_volume_control(codec, i);
1819                 if (err < 0)
1820                         return err;
1821         }
1822
1823         /*
1824             Add 'Capture Source' Switch if
1825                 * 2 inputs and no mic detec
1826                 * 3 inputs
1827         */
1828         if ((spec->num_inputs == 2 && !spec->mic_detect) ||
1829             (spec->num_inputs == 3)) {
1830
1831                 err = snd_hda_ctl_add(codec, spec->adc_nid[0],
1832                               snd_ctl_new1(&cs421x_capture_source, codec));
1833                 if (err < 0)
1834                         return err;
1835         }
1836
1837         return 0;
1838 }
1839
1840 /* Single DAC (Mute/Gain) */
1841 static int build_cs421x_output(struct hda_codec *codec)
1842 {
1843         hda_nid_t dac = CS4210_DAC_NID;
1844         struct cs_spec *spec = codec->spec;
1845         struct auto_pin_cfg *cfg = &spec->autocfg;
1846         struct snd_kcontrol *kctl;
1847         int err;
1848         char *name = "Master";
1849
1850         fix_volume_caps(codec, dac);
1851
1852         err = add_mute(codec, name, 0,
1853                         HDA_COMPOSE_AMP_VAL(dac, 3, 0, HDA_OUTPUT), 0, &kctl);
1854         if (err < 0)
1855                 return err;
1856
1857         err = add_volume(codec, name, 0,
1858                         HDA_COMPOSE_AMP_VAL(dac, 3, 0, HDA_OUTPUT), 0, &kctl);
1859         if (err < 0)
1860                 return err;
1861
1862         if (cfg->speaker_outs && (spec->vendor_nid == CS4210_VENDOR_NID)) {
1863                 err = snd_hda_ctl_add(codec, 0,
1864                         snd_ctl_new1(&cs421x_speaker_bost_ctl, codec));
1865                 if (err < 0)
1866                         return err;
1867         }
1868         return err;
1869 }
1870
1871 static int cs421x_build_controls(struct hda_codec *codec)
1872 {
1873         struct cs_spec *spec = codec->spec;
1874         int err;
1875
1876         err = build_cs421x_output(codec);
1877         if (err < 0)
1878                 return err;
1879         err = build_cs421x_input(codec);
1880         if (err < 0)
1881                 return err;
1882         err = build_digital_output(codec);
1883         if (err < 0)
1884                 return err;
1885         err =  cs421x_init(codec);
1886         if (err < 0)
1887                 return err;
1888
1889         err = snd_hda_jack_add_kctls(codec, &spec->autocfg);
1890         if (err < 0)
1891                 return err;
1892
1893         return 0;
1894 }
1895
1896 static int parse_cs421x_input(struct hda_codec *codec)
1897 {
1898         struct cs_spec *spec = codec->spec;
1899         struct auto_pin_cfg *cfg = &spec->autocfg;
1900         int i;
1901
1902         for (i = 0; i < cfg->num_inputs; i++) {
1903                 hda_nid_t pin = cfg->inputs[i].pin;
1904                 spec->adc_nid[i] = get_adc(codec, pin, &spec->adc_idx[i]);
1905                 spec->cur_input = spec->last_input = i;
1906                 spec->num_inputs++;
1907
1908                 /* check whether the automatic mic switch is available */
1909                 if (is_ext_mic(codec, i) && cfg->num_inputs >= 2) {
1910                         spec->mic_detect = 1;
1911                         spec->automic_idx = i;
1912                 }
1913         }
1914         return 0;
1915 }
1916
1917 static int cs421x_parse_auto_config(struct hda_codec *codec)
1918 {
1919         struct cs_spec *spec = codec->spec;
1920         int err;
1921
1922         err = snd_hda_parse_pin_def_config(codec, &spec->autocfg, NULL);
1923         if (err < 0)
1924                 return err;
1925         err = parse_output(codec);
1926         if (err < 0)
1927                 return err;
1928         err = parse_cs421x_input(codec);
1929         if (err < 0)
1930                 return err;
1931         err = parse_digital_output(codec);
1932         if (err < 0)
1933                 return err;
1934         return 0;
1935 }
1936
1937 #ifdef CONFIG_PM
1938 /*
1939         Manage PDREF, when transitioning to D3hot
1940         (DAC,ADC) -> D3, PDREF=1, AFG->D3
1941 */
1942 static int cs421x_suspend(struct hda_codec *codec)
1943 {
1944         struct cs_spec *spec = codec->spec;
1945         unsigned int coef;
1946
1947         snd_hda_shutup_pins(codec);
1948
1949         snd_hda_codec_write(codec, CS4210_DAC_NID, 0,
1950                             AC_VERB_SET_POWER_STATE,  AC_PWRST_D3);
1951         snd_hda_codec_write(codec, CS4210_ADC_NID, 0,
1952                             AC_VERB_SET_POWER_STATE,  AC_PWRST_D3);
1953
1954         if (spec->vendor_nid == CS4210_VENDOR_NID) {
1955                 coef = cs_vendor_coef_get(codec, CS421X_IDX_DEV_CFG);
1956                 coef |= 0x0004; /* PDREF */
1957                 cs_vendor_coef_set(codec, CS421X_IDX_DEV_CFG, coef);
1958         }
1959
1960         return 0;
1961 }
1962 #endif
1963
1964 static const struct hda_codec_ops cs421x_patch_ops = {
1965         .build_controls = cs421x_build_controls,
1966         .build_pcms = cs_build_pcms,
1967         .init = cs421x_init,
1968         .free = cs_free,
1969         .unsol_event = snd_hda_jack_unsol_event,
1970 #ifdef CONFIG_PM
1971         .suspend = cs421x_suspend,
1972 #endif
1973 };
1974
1975 static int patch_cs4210(struct hda_codec *codec)
1976 {
1977         struct cs_spec *spec;
1978         int err;
1979
1980         spec = kzalloc(sizeof(*spec), GFP_KERNEL);
1981         if (!spec)
1982                 return -ENOMEM;
1983         codec->spec = spec;
1984         snd_hda_gen_init(&spec->gen);
1985
1986         spec->vendor_nid = CS4210_VENDOR_NID;
1987
1988         snd_hda_pick_fixup(codec, cs421x_models, cs421x_fixup_tbl,
1989                            cs421x_fixups);
1990         snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
1991
1992         /*
1993             Update the GPIO/DMIC/SENSE_B pinmux before the configuration
1994             is auto-parsed. If GPIO or SENSE_B is forced, DMIC input
1995             is disabled.
1996         */
1997         cs4210_pinmux_init(codec);
1998
1999         err = cs421x_parse_auto_config(codec);
2000         if (err < 0)
2001                 goto error;
2002
2003         codec->patch_ops = cs421x_patch_ops;
2004
2005         snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
2006
2007         return 0;
2008
2009  error:
2010         cs_free(codec);
2011         codec->spec = NULL;
2012         return err;
2013 }
2014
2015 static int patch_cs4213(struct hda_codec *codec)
2016 {
2017         struct cs_spec *spec;
2018         int err;
2019
2020         spec = kzalloc(sizeof(*spec), GFP_KERNEL);
2021         if (!spec)
2022                 return -ENOMEM;
2023         codec->spec = spec;
2024         snd_hda_gen_init(&spec->gen);
2025
2026         spec->vendor_nid = CS4213_VENDOR_NID;
2027
2028         err = cs421x_parse_auto_config(codec);
2029         if (err < 0)
2030                 goto error;
2031
2032         codec->patch_ops = cs421x_patch_ops;
2033         return 0;
2034
2035  error:
2036         cs_free(codec);
2037         codec->spec = NULL;
2038         return err;
2039 }
2040
2041
2042 /*
2043  * patch entries
2044  */
2045 static const struct hda_codec_preset snd_hda_preset_cirrus[] = {
2046         { .id = 0x10134206, .name = "CS4206", .patch = patch_cs420x },
2047         { .id = 0x10134207, .name = "CS4207", .patch = patch_cs420x },
2048         { .id = 0x10134210, .name = "CS4210", .patch = patch_cs4210 },
2049         { .id = 0x10134213, .name = "CS4213", .patch = patch_cs4213 },
2050         {} /* terminator */
2051 };
2052
2053 MODULE_ALIAS("snd-hda-codec-id:10134206");
2054 MODULE_ALIAS("snd-hda-codec-id:10134207");
2055 MODULE_ALIAS("snd-hda-codec-id:10134210");
2056 MODULE_ALIAS("snd-hda-codec-id:10134213");
2057
2058 MODULE_LICENSE("GPL");
2059 MODULE_DESCRIPTION("Cirrus Logic HD-audio codec");
2060
2061 static struct hda_codec_preset_list cirrus_list = {
2062         .preset = snd_hda_preset_cirrus,
2063         .owner = THIS_MODULE,
2064 };
2065
2066 static int __init patch_cirrus_init(void)
2067 {
2068         return snd_hda_add_codec_preset(&cirrus_list);
2069 }
2070
2071 static void __exit patch_cirrus_exit(void)
2072 {
2073         snd_hda_delete_codec_preset(&cirrus_list);
2074 }
2075
2076 module_init(patch_cirrus_init)
2077 module_exit(patch_cirrus_exit)