OSDN Git Service

Merge tag 'acpi-5.1-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael...
[uclinux-h8/linux.git] / sound / pci / hda / patch_ca0132.c
1 /*
2  * HD audio interface patch for Creative CA0132 chip
3  *
4  * Copyright (c) 2011, Creative Technology Ltd.
5  *
6  * Based on patch_ca0110.c
7  * Copyright (c) 2008 Takashi Iwai <tiwai@suse.de>
8  *
9  *  This driver is free software; you can redistribute it and/or modify
10  *  it under the terms of the GNU General Public License as published by
11  *  the Free Software Foundation; either version 2 of the License, or
12  *  (at your option) any later version.
13  *
14  *  This driver is distributed in the hope that it will be useful,
15  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
16  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  *  GNU General Public License for more details.
18  *
19  *  You should have received a copy of the GNU General Public License
20  *  along with this program; if not, write to the Free Software
21  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
22  */
23
24 #include <linux/init.h>
25 #include <linux/delay.h>
26 #include <linux/slab.h>
27 #include <linux/mutex.h>
28 #include <linux/module.h>
29 #include <linux/firmware.h>
30 #include <linux/kernel.h>
31 #include <linux/types.h>
32 #include <linux/io.h>
33 #include <linux/pci.h>
34 #include <asm/io.h>
35 #include <sound/core.h>
36 #include <sound/hda_codec.h>
37 #include "hda_local.h"
38 #include "hda_auto_parser.h"
39 #include "hda_jack.h"
40
41 #include "ca0132_regs.h"
42
43 /* Enable this to see controls for tuning purpose. */
44 /*#define ENABLE_TUNING_CONTROLS*/
45
46 #ifdef ENABLE_TUNING_CONTROLS
47 #include <sound/tlv.h>
48 #endif
49
50 #define FLOAT_ZERO      0x00000000
51 #define FLOAT_ONE       0x3f800000
52 #define FLOAT_TWO       0x40000000
53 #define FLOAT_THREE     0x40400000
54 #define FLOAT_EIGHT     0x41000000
55 #define FLOAT_MINUS_5   0xc0a00000
56
57 #define UNSOL_TAG_DSP   0x16
58
59 #define DSP_DMA_WRITE_BUFLEN_INIT (1UL<<18)
60 #define DSP_DMA_WRITE_BUFLEN_OVLY (1UL<<15)
61
62 #define DMA_TRANSFER_FRAME_SIZE_NWORDS          8
63 #define DMA_TRANSFER_MAX_FRAME_SIZE_NWORDS      32
64 #define DMA_OVERLAY_FRAME_SIZE_NWORDS           2
65
66 #define MASTERCONTROL                           0x80
67 #define MASTERCONTROL_ALLOC_DMA_CHAN            10
68 #define MASTERCONTROL_QUERY_SPEAKER_EQ_ADDRESS  60
69
70 #define WIDGET_CHIP_CTRL      0x15
71 #define WIDGET_DSP_CTRL       0x16
72
73 #define MEM_CONNID_MICIN1     3
74 #define MEM_CONNID_MICIN2     5
75 #define MEM_CONNID_MICOUT1    12
76 #define MEM_CONNID_MICOUT2    14
77 #define MEM_CONNID_WUH        10
78 #define MEM_CONNID_DSP        16
79 #define MEM_CONNID_DMIC       100
80
81 #define SCP_SET    0
82 #define SCP_GET    1
83
84 #define EFX_FILE   "ctefx.bin"
85 #define DESKTOP_EFX_FILE   "ctefx-desktop.bin"
86 #define R3DI_EFX_FILE  "ctefx-r3di.bin"
87
88 #ifdef CONFIG_SND_HDA_CODEC_CA0132_DSP
89 MODULE_FIRMWARE(EFX_FILE);
90 MODULE_FIRMWARE(DESKTOP_EFX_FILE);
91 MODULE_FIRMWARE(R3DI_EFX_FILE);
92 #endif
93
94 static const char *const dirstr[2] = { "Playback", "Capture" };
95
96 #define NUM_OF_OUTPUTS 3
97 enum {
98         SPEAKER_OUT,
99         HEADPHONE_OUT,
100         SURROUND_OUT
101 };
102
103 enum {
104         DIGITAL_MIC,
105         LINE_MIC_IN
106 };
107
108 /* Strings for Input Source Enum Control */
109 static const char *const in_src_str[3] = {"Rear Mic", "Line", "Front Mic" };
110 #define IN_SRC_NUM_OF_INPUTS 3
111 enum {
112         REAR_MIC,
113         REAR_LINE_IN,
114         FRONT_MIC,
115 };
116
117 enum {
118 #define VNODE_START_NID    0x80
119         VNID_SPK = VNODE_START_NID,                     /* Speaker vnid */
120         VNID_MIC,
121         VNID_HP_SEL,
122         VNID_AMIC1_SEL,
123         VNID_HP_ASEL,
124         VNID_AMIC1_ASEL,
125         VNODE_END_NID,
126 #define VNODES_COUNT  (VNODE_END_NID - VNODE_START_NID)
127
128 #define EFFECT_START_NID    0x90
129 #define OUT_EFFECT_START_NID    EFFECT_START_NID
130         SURROUND = OUT_EFFECT_START_NID,
131         CRYSTALIZER,
132         DIALOG_PLUS,
133         SMART_VOLUME,
134         X_BASS,
135         EQUALIZER,
136         OUT_EFFECT_END_NID,
137 #define OUT_EFFECTS_COUNT  (OUT_EFFECT_END_NID - OUT_EFFECT_START_NID)
138
139 #define IN_EFFECT_START_NID  OUT_EFFECT_END_NID
140         ECHO_CANCELLATION = IN_EFFECT_START_NID,
141         VOICE_FOCUS,
142         MIC_SVM,
143         NOISE_REDUCTION,
144         IN_EFFECT_END_NID,
145 #define IN_EFFECTS_COUNT  (IN_EFFECT_END_NID - IN_EFFECT_START_NID)
146
147         VOICEFX = IN_EFFECT_END_NID,
148         PLAY_ENHANCEMENT,
149         CRYSTAL_VOICE,
150         EFFECT_END_NID,
151         OUTPUT_SOURCE_ENUM,
152         INPUT_SOURCE_ENUM,
153         XBASS_XOVER,
154         EQ_PRESET_ENUM,
155         SMART_VOLUME_ENUM,
156         MIC_BOOST_ENUM,
157         AE5_HEADPHONE_GAIN_ENUM,
158         AE5_SOUND_FILTER_ENUM,
159         ZXR_HEADPHONE_GAIN
160 #define EFFECTS_COUNT  (EFFECT_END_NID - EFFECT_START_NID)
161 };
162
163 /* Effects values size*/
164 #define EFFECT_VALS_MAX_COUNT 12
165
166 /*
167  * Default values for the effect slider controls, they are in order of their
168  * effect NID's. Surround, Crystalizer, Dialog Plus, Smart Volume, and then
169  * X-bass.
170  */
171 static const unsigned int effect_slider_defaults[] = {67, 65, 50, 74, 50};
172 /* Amount of effect level sliders for ca0132_alt controls. */
173 #define EFFECT_LEVEL_SLIDERS 5
174
175 /* Latency introduced by DSP blocks in milliseconds. */
176 #define DSP_CAPTURE_INIT_LATENCY        0
177 #define DSP_CRYSTAL_VOICE_LATENCY       124
178 #define DSP_PLAYBACK_INIT_LATENCY       13
179 #define DSP_PLAY_ENHANCEMENT_LATENCY    30
180 #define DSP_SPEAKER_OUT_LATENCY         7
181
182 struct ct_effect {
183         char name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
184         hda_nid_t nid;
185         int mid; /*effect module ID*/
186         int reqs[EFFECT_VALS_MAX_COUNT]; /*effect module request*/
187         int direct; /* 0:output; 1:input*/
188         int params; /* number of default non-on/off params */
189         /*effect default values, 1st is on/off. */
190         unsigned int def_vals[EFFECT_VALS_MAX_COUNT];
191 };
192
193 #define EFX_DIR_OUT 0
194 #define EFX_DIR_IN  1
195
196 static const struct ct_effect ca0132_effects[EFFECTS_COUNT] = {
197         { .name = "Surround",
198           .nid = SURROUND,
199           .mid = 0x96,
200           .reqs = {0, 1},
201           .direct = EFX_DIR_OUT,
202           .params = 1,
203           .def_vals = {0x3F800000, 0x3F2B851F}
204         },
205         { .name = "Crystalizer",
206           .nid = CRYSTALIZER,
207           .mid = 0x96,
208           .reqs = {7, 8},
209           .direct = EFX_DIR_OUT,
210           .params = 1,
211           .def_vals = {0x3F800000, 0x3F266666}
212         },
213         { .name = "Dialog Plus",
214           .nid = DIALOG_PLUS,
215           .mid = 0x96,
216           .reqs = {2, 3},
217           .direct = EFX_DIR_OUT,
218           .params = 1,
219           .def_vals = {0x00000000, 0x3F000000}
220         },
221         { .name = "Smart Volume",
222           .nid = SMART_VOLUME,
223           .mid = 0x96,
224           .reqs = {4, 5, 6},
225           .direct = EFX_DIR_OUT,
226           .params = 2,
227           .def_vals = {0x3F800000, 0x3F3D70A4, 0x00000000}
228         },
229         { .name = "X-Bass",
230           .nid = X_BASS,
231           .mid = 0x96,
232           .reqs = {24, 23, 25},
233           .direct = EFX_DIR_OUT,
234           .params = 2,
235           .def_vals = {0x3F800000, 0x42A00000, 0x3F000000}
236         },
237         { .name = "Equalizer",
238           .nid = EQUALIZER,
239           .mid = 0x96,
240           .reqs = {9, 10, 11, 12, 13, 14,
241                         15, 16, 17, 18, 19, 20},
242           .direct = EFX_DIR_OUT,
243           .params = 11,
244           .def_vals = {0x00000000, 0x00000000, 0x00000000, 0x00000000,
245                        0x00000000, 0x00000000, 0x00000000, 0x00000000,
246                        0x00000000, 0x00000000, 0x00000000, 0x00000000}
247         },
248         { .name = "Echo Cancellation",
249           .nid = ECHO_CANCELLATION,
250           .mid = 0x95,
251           .reqs = {0, 1, 2, 3},
252           .direct = EFX_DIR_IN,
253           .params = 3,
254           .def_vals = {0x00000000, 0x3F3A9692, 0x00000000, 0x00000000}
255         },
256         { .name = "Voice Focus",
257           .nid = VOICE_FOCUS,
258           .mid = 0x95,
259           .reqs = {6, 7, 8, 9},
260           .direct = EFX_DIR_IN,
261           .params = 3,
262           .def_vals = {0x3F800000, 0x3D7DF3B6, 0x41F00000, 0x41F00000}
263         },
264         { .name = "Mic SVM",
265           .nid = MIC_SVM,
266           .mid = 0x95,
267           .reqs = {44, 45},
268           .direct = EFX_DIR_IN,
269           .params = 1,
270           .def_vals = {0x00000000, 0x3F3D70A4}
271         },
272         { .name = "Noise Reduction",
273           .nid = NOISE_REDUCTION,
274           .mid = 0x95,
275           .reqs = {4, 5},
276           .direct = EFX_DIR_IN,
277           .params = 1,
278           .def_vals = {0x3F800000, 0x3F000000}
279         },
280         { .name = "VoiceFX",
281           .nid = VOICEFX,
282           .mid = 0x95,
283           .reqs = {10, 11, 12, 13, 14, 15, 16, 17, 18},
284           .direct = EFX_DIR_IN,
285           .params = 8,
286           .def_vals = {0x00000000, 0x43C80000, 0x44AF0000, 0x44FA0000,
287                        0x3F800000, 0x3F800000, 0x3F800000, 0x00000000,
288                        0x00000000}
289         }
290 };
291
292 /* Tuning controls */
293 #ifdef ENABLE_TUNING_CONTROLS
294
295 enum {
296 #define TUNING_CTL_START_NID  0xC0
297         WEDGE_ANGLE = TUNING_CTL_START_NID,
298         SVM_LEVEL,
299         EQUALIZER_BAND_0,
300         EQUALIZER_BAND_1,
301         EQUALIZER_BAND_2,
302         EQUALIZER_BAND_3,
303         EQUALIZER_BAND_4,
304         EQUALIZER_BAND_5,
305         EQUALIZER_BAND_6,
306         EQUALIZER_BAND_7,
307         EQUALIZER_BAND_8,
308         EQUALIZER_BAND_9,
309         TUNING_CTL_END_NID
310 #define TUNING_CTLS_COUNT  (TUNING_CTL_END_NID - TUNING_CTL_START_NID)
311 };
312
313 struct ct_tuning_ctl {
314         char name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
315         hda_nid_t parent_nid;
316         hda_nid_t nid;
317         int mid; /*effect module ID*/
318         int req; /*effect module request*/
319         int direct; /* 0:output; 1:input*/
320         unsigned int def_val;/*effect default values*/
321 };
322
323 static const struct ct_tuning_ctl ca0132_tuning_ctls[] = {
324         { .name = "Wedge Angle",
325           .parent_nid = VOICE_FOCUS,
326           .nid = WEDGE_ANGLE,
327           .mid = 0x95,
328           .req = 8,
329           .direct = EFX_DIR_IN,
330           .def_val = 0x41F00000
331         },
332         { .name = "SVM Level",
333           .parent_nid = MIC_SVM,
334           .nid = SVM_LEVEL,
335           .mid = 0x95,
336           .req = 45,
337           .direct = EFX_DIR_IN,
338           .def_val = 0x3F3D70A4
339         },
340         { .name = "EQ Band0",
341           .parent_nid = EQUALIZER,
342           .nid = EQUALIZER_BAND_0,
343           .mid = 0x96,
344           .req = 11,
345           .direct = EFX_DIR_OUT,
346           .def_val = 0x00000000
347         },
348         { .name = "EQ Band1",
349           .parent_nid = EQUALIZER,
350           .nid = EQUALIZER_BAND_1,
351           .mid = 0x96,
352           .req = 12,
353           .direct = EFX_DIR_OUT,
354           .def_val = 0x00000000
355         },
356         { .name = "EQ Band2",
357           .parent_nid = EQUALIZER,
358           .nid = EQUALIZER_BAND_2,
359           .mid = 0x96,
360           .req = 13,
361           .direct = EFX_DIR_OUT,
362           .def_val = 0x00000000
363         },
364         { .name = "EQ Band3",
365           .parent_nid = EQUALIZER,
366           .nid = EQUALIZER_BAND_3,
367           .mid = 0x96,
368           .req = 14,
369           .direct = EFX_DIR_OUT,
370           .def_val = 0x00000000
371         },
372         { .name = "EQ Band4",
373           .parent_nid = EQUALIZER,
374           .nid = EQUALIZER_BAND_4,
375           .mid = 0x96,
376           .req = 15,
377           .direct = EFX_DIR_OUT,
378           .def_val = 0x00000000
379         },
380         { .name = "EQ Band5",
381           .parent_nid = EQUALIZER,
382           .nid = EQUALIZER_BAND_5,
383           .mid = 0x96,
384           .req = 16,
385           .direct = EFX_DIR_OUT,
386           .def_val = 0x00000000
387         },
388         { .name = "EQ Band6",
389           .parent_nid = EQUALIZER,
390           .nid = EQUALIZER_BAND_6,
391           .mid = 0x96,
392           .req = 17,
393           .direct = EFX_DIR_OUT,
394           .def_val = 0x00000000
395         },
396         { .name = "EQ Band7",
397           .parent_nid = EQUALIZER,
398           .nid = EQUALIZER_BAND_7,
399           .mid = 0x96,
400           .req = 18,
401           .direct = EFX_DIR_OUT,
402           .def_val = 0x00000000
403         },
404         { .name = "EQ Band8",
405           .parent_nid = EQUALIZER,
406           .nid = EQUALIZER_BAND_8,
407           .mid = 0x96,
408           .req = 19,
409           .direct = EFX_DIR_OUT,
410           .def_val = 0x00000000
411         },
412         { .name = "EQ Band9",
413           .parent_nid = EQUALIZER,
414           .nid = EQUALIZER_BAND_9,
415           .mid = 0x96,
416           .req = 20,
417           .direct = EFX_DIR_OUT,
418           .def_val = 0x00000000
419         }
420 };
421 #endif
422
423 /* Voice FX Presets */
424 #define VOICEFX_MAX_PARAM_COUNT 9
425
426 struct ct_voicefx {
427         char *name;
428         hda_nid_t nid;
429         int mid;
430         int reqs[VOICEFX_MAX_PARAM_COUNT]; /*effect module request*/
431 };
432
433 struct ct_voicefx_preset {
434         char *name; /*preset name*/
435         unsigned int vals[VOICEFX_MAX_PARAM_COUNT];
436 };
437
438 static const struct ct_voicefx ca0132_voicefx = {
439         .name = "VoiceFX Capture Switch",
440         .nid = VOICEFX,
441         .mid = 0x95,
442         .reqs = {10, 11, 12, 13, 14, 15, 16, 17, 18}
443 };
444
445 static const struct ct_voicefx_preset ca0132_voicefx_presets[] = {
446         { .name = "Neutral",
447           .vals = { 0x00000000, 0x43C80000, 0x44AF0000,
448                     0x44FA0000, 0x3F800000, 0x3F800000,
449                     0x3F800000, 0x00000000, 0x00000000 }
450         },
451         { .name = "Female2Male",
452           .vals = { 0x3F800000, 0x43C80000, 0x44AF0000,
453                     0x44FA0000, 0x3F19999A, 0x3F866666,
454                     0x3F800000, 0x00000000, 0x00000000 }
455         },
456         { .name = "Male2Female",
457           .vals = { 0x3F800000, 0x43C80000, 0x44AF0000,
458                     0x450AC000, 0x4017AE14, 0x3F6B851F,
459                     0x3F800000, 0x00000000, 0x00000000 }
460         },
461         { .name = "ScrappyKid",
462           .vals = { 0x3F800000, 0x43C80000, 0x44AF0000,
463                     0x44FA0000, 0x40400000, 0x3F28F5C3,
464                     0x3F800000, 0x00000000, 0x00000000 }
465         },
466         { .name = "Elderly",
467           .vals = { 0x3F800000, 0x44324000, 0x44BB8000,
468                     0x44E10000, 0x3FB33333, 0x3FB9999A,
469                     0x3F800000, 0x3E3A2E43, 0x00000000 }
470         },
471         { .name = "Orc",
472           .vals = { 0x3F800000, 0x43EA0000, 0x44A52000,
473                     0x45098000, 0x3F266666, 0x3FC00000,
474                     0x3F800000, 0x00000000, 0x00000000 }
475         },
476         { .name = "Elf",
477           .vals = { 0x3F800000, 0x43C70000, 0x44AE6000,
478                     0x45193000, 0x3F8E147B, 0x3F75C28F,
479                     0x3F800000, 0x00000000, 0x00000000 }
480         },
481         { .name = "Dwarf",
482           .vals = { 0x3F800000, 0x43930000, 0x44BEE000,
483                     0x45007000, 0x3F451EB8, 0x3F7851EC,
484                     0x3F800000, 0x00000000, 0x00000000 }
485         },
486         { .name = "AlienBrute",
487           .vals = { 0x3F800000, 0x43BFC5AC, 0x44B28FDF,
488                     0x451F6000, 0x3F266666, 0x3FA7D945,
489                     0x3F800000, 0x3CF5C28F, 0x00000000 }
490         },
491         { .name = "Robot",
492           .vals = { 0x3F800000, 0x43C80000, 0x44AF0000,
493                     0x44FA0000, 0x3FB2718B, 0x3F800000,
494                     0xBC07010E, 0x00000000, 0x00000000 }
495         },
496         { .name = "Marine",
497           .vals = { 0x3F800000, 0x43C20000, 0x44906000,
498                     0x44E70000, 0x3F4CCCCD, 0x3F8A3D71,
499                     0x3F0A3D71, 0x00000000, 0x00000000 }
500         },
501         { .name = "Emo",
502           .vals = { 0x3F800000, 0x43C80000, 0x44AF0000,
503                     0x44FA0000, 0x3F800000, 0x3F800000,
504                     0x3E4CCCCD, 0x00000000, 0x00000000 }
505         },
506         { .name = "DeepVoice",
507           .vals = { 0x3F800000, 0x43A9C5AC, 0x44AA4FDF,
508                     0x44FFC000, 0x3EDBB56F, 0x3F99C4CA,
509                     0x3F800000, 0x00000000, 0x00000000 }
510         },
511         { .name = "Munchkin",
512           .vals = { 0x3F800000, 0x43C80000, 0x44AF0000,
513                     0x44FA0000, 0x3F800000, 0x3F1A043C,
514                     0x3F800000, 0x00000000, 0x00000000 }
515         }
516 };
517
518 /* ca0132 EQ presets, taken from Windows Sound Blaster Z Driver */
519
520 #define EQ_PRESET_MAX_PARAM_COUNT 11
521
522 struct ct_eq {
523         char *name;
524         hda_nid_t nid;
525         int mid;
526         int reqs[EQ_PRESET_MAX_PARAM_COUNT]; /*effect module request*/
527 };
528
529 struct ct_eq_preset {
530         char *name; /*preset name*/
531         unsigned int vals[EQ_PRESET_MAX_PARAM_COUNT];
532 };
533
534 static const struct ct_eq ca0132_alt_eq_enum = {
535         .name = "FX: Equalizer Preset Switch",
536         .nid = EQ_PRESET_ENUM,
537         .mid = 0x96,
538         .reqs = {10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20}
539 };
540
541
542 static const struct ct_eq_preset ca0132_alt_eq_presets[] = {
543         { .name = "Flat",
544          .vals = { 0x00000000, 0x00000000, 0x00000000,
545                    0x00000000, 0x00000000, 0x00000000,
546                    0x00000000, 0x00000000, 0x00000000,
547                    0x00000000, 0x00000000            }
548         },
549         { .name = "Acoustic",
550          .vals = { 0x00000000, 0x00000000, 0x3F8CCCCD,
551                    0x40000000, 0x00000000, 0x00000000,
552                    0x00000000, 0x00000000, 0x40000000,
553                    0x40000000, 0x40000000            }
554         },
555         { .name = "Classical",
556          .vals = { 0x00000000, 0x00000000, 0x40C00000,
557                    0x40C00000, 0x40466666, 0x00000000,
558                    0x00000000, 0x00000000, 0x00000000,
559                    0x40466666, 0x40466666            }
560         },
561         { .name = "Country",
562          .vals = { 0x00000000, 0xBF99999A, 0x00000000,
563                    0x3FA66666, 0x3FA66666, 0x3F8CCCCD,
564                    0x00000000, 0x00000000, 0x40000000,
565                    0x40466666, 0x40800000            }
566         },
567         { .name = "Dance",
568          .vals = { 0x00000000, 0xBF99999A, 0x40000000,
569                    0x40466666, 0x40866666, 0xBF99999A,
570                    0xBF99999A, 0x00000000, 0x00000000,
571                    0x40800000, 0x40800000            }
572         },
573         { .name = "Jazz",
574          .vals = { 0x00000000, 0x00000000, 0x00000000,
575                    0x3F8CCCCD, 0x40800000, 0x40800000,
576                    0x40800000, 0x00000000, 0x3F8CCCCD,
577                    0x40466666, 0x40466666            }
578         },
579         { .name = "New Age",
580          .vals = { 0x00000000, 0x00000000, 0x40000000,
581                    0x40000000, 0x00000000, 0x00000000,
582                    0x00000000, 0x3F8CCCCD, 0x40000000,
583                    0x40000000, 0x40000000            }
584         },
585         { .name = "Pop",
586          .vals = { 0x00000000, 0xBFCCCCCD, 0x00000000,
587                    0x40000000, 0x40000000, 0x00000000,
588                    0xBF99999A, 0xBF99999A, 0x00000000,
589                    0x40466666, 0x40C00000            }
590         },
591         { .name = "Rock",
592          .vals = { 0x00000000, 0xBF99999A, 0xBF99999A,
593                    0x3F8CCCCD, 0x40000000, 0xBF99999A,
594                    0xBF99999A, 0x00000000, 0x00000000,
595                    0x40800000, 0x40800000            }
596         },
597         { .name = "Vocal",
598          .vals = { 0x00000000, 0xC0000000, 0xBF99999A,
599                    0xBF99999A, 0x00000000, 0x40466666,
600                    0x40800000, 0x40466666, 0x00000000,
601                    0x00000000, 0x3F8CCCCD            }
602         }
603 };
604
605 /* DSP command sequences for ca0132_alt_select_out */
606 #define ALT_OUT_SET_MAX_COMMANDS 9 /* Max number of commands in sequence */
607 struct ca0132_alt_out_set {
608         char *name; /*preset name*/
609         unsigned char commands;
610         unsigned int mids[ALT_OUT_SET_MAX_COMMANDS];
611         unsigned int reqs[ALT_OUT_SET_MAX_COMMANDS];
612         unsigned int vals[ALT_OUT_SET_MAX_COMMANDS];
613 };
614
615 static const struct ca0132_alt_out_set alt_out_presets[] = {
616         { .name = "Line Out",
617           .commands = 7,
618           .mids = { 0x96, 0x96, 0x96, 0x8F,
619                     0x96, 0x96, 0x96 },
620           .reqs = { 0x19, 0x17, 0x18, 0x01,
621                     0x1F, 0x15, 0x3A },
622           .vals = { 0x3F000000, 0x42A00000, 0x00000000,
623                     0x00000000, 0x00000000, 0x00000000,
624                     0x00000000 }
625         },
626         { .name = "Headphone",
627           .commands = 7,
628           .mids = { 0x96, 0x96, 0x96, 0x8F,
629                     0x96, 0x96, 0x96 },
630           .reqs = { 0x19, 0x17, 0x18, 0x01,
631                     0x1F, 0x15, 0x3A },
632           .vals = { 0x3F000000, 0x42A00000, 0x00000000,
633                     0x00000000, 0x00000000, 0x00000000,
634                     0x00000000 }
635         },
636         { .name = "Surround",
637           .commands = 8,
638           .mids = { 0x96, 0x8F, 0x96, 0x96,
639                     0x96, 0x96, 0x96, 0x96 },
640           .reqs = { 0x18, 0x01, 0x1F, 0x15,
641                     0x3A, 0x1A, 0x1B, 0x1C },
642           .vals = { 0x00000000, 0x00000000, 0x00000000,
643                     0x00000000, 0x00000000, 0x00000000,
644                     0x00000000, 0x00000000 }
645         }
646 };
647
648 /*
649  * DSP volume setting structs. Req 1 is left volume, req 2 is right volume,
650  * and I don't know what the third req is, but it's always zero. I assume it's
651  * some sort of update or set command to tell the DSP there's new volume info.
652  */
653 #define DSP_VOL_OUT 0
654 #define DSP_VOL_IN  1
655
656 struct ct_dsp_volume_ctl {
657         hda_nid_t vnid;
658         int mid; /* module ID*/
659         unsigned int reqs[3]; /* scp req ID */
660 };
661
662 static const struct ct_dsp_volume_ctl ca0132_alt_vol_ctls[] = {
663         { .vnid = VNID_SPK,
664           .mid = 0x32,
665           .reqs = {3, 4, 2}
666         },
667         { .vnid = VNID_MIC,
668           .mid = 0x37,
669           .reqs = {2, 3, 1}
670         }
671 };
672
673 /* Values for ca0113_mmio_command_set for selecting output. */
674 #define AE5_CA0113_OUT_SET_COMMANDS 6
675 struct ae5_ca0113_output_set {
676         unsigned int group[AE5_CA0113_OUT_SET_COMMANDS];
677         unsigned int target[AE5_CA0113_OUT_SET_COMMANDS];
678         unsigned int vals[AE5_CA0113_OUT_SET_COMMANDS];
679 };
680
681 static const struct ae5_ca0113_output_set ae5_ca0113_output_presets[] = {
682         { .group =  { 0x30, 0x30, 0x48, 0x48, 0x48, 0x30 },
683           .target = { 0x2e, 0x30, 0x0d, 0x17, 0x19, 0x32 },
684           .vals =   { 0x00, 0x00, 0x40, 0x00, 0x00, 0x3f }
685         },
686         { .group =  { 0x30, 0x30, 0x48, 0x48, 0x48, 0x30 },
687           .target = { 0x2e, 0x30, 0x0d, 0x17, 0x19, 0x32 },
688           .vals =   { 0x3f, 0x3f, 0x00, 0x00, 0x00, 0x00 }
689         },
690         { .group =  { 0x30, 0x30, 0x48, 0x48, 0x48, 0x30 },
691           .target = { 0x2e, 0x30, 0x0d, 0x17, 0x19, 0x32 },
692           .vals =   { 0x00, 0x00, 0x40, 0x00, 0x00, 0x3f }
693         }
694 };
695
696 /* ae5 ca0113 command sequences to set headphone gain levels. */
697 #define AE5_HEADPHONE_GAIN_PRESET_MAX_COMMANDS 4
698 struct ae5_headphone_gain_set {
699         char *name;
700         unsigned int vals[AE5_HEADPHONE_GAIN_PRESET_MAX_COMMANDS];
701 };
702
703 static const struct ae5_headphone_gain_set ae5_headphone_gain_presets[] = {
704         { .name = "Low (16-31",
705           .vals = { 0xff, 0x2c, 0xf5, 0x32 }
706         },
707         { .name = "Medium (32-149",
708           .vals = { 0x38, 0xa8, 0x3e, 0x4c }
709         },
710         { .name = "High (150-600",
711           .vals = { 0xff, 0xff, 0xff, 0x7f }
712         }
713 };
714
715 struct ae5_filter_set {
716         char *name;
717         unsigned int val;
718 };
719
720 static const struct ae5_filter_set ae5_filter_presets[] = {
721         { .name = "Slow Roll Off",
722           .val = 0xa0
723         },
724         { .name = "Minimum Phase",
725           .val = 0xc0
726         },
727         { .name = "Fast Roll Off",
728           .val = 0x80
729         }
730 };
731
732 enum hda_cmd_vendor_io {
733         /* for DspIO node */
734         VENDOR_DSPIO_SCP_WRITE_DATA_LOW      = 0x000,
735         VENDOR_DSPIO_SCP_WRITE_DATA_HIGH     = 0x100,
736
737         VENDOR_DSPIO_STATUS                  = 0xF01,
738         VENDOR_DSPIO_SCP_POST_READ_DATA      = 0x702,
739         VENDOR_DSPIO_SCP_READ_DATA           = 0xF02,
740         VENDOR_DSPIO_DSP_INIT                = 0x703,
741         VENDOR_DSPIO_SCP_POST_COUNT_QUERY    = 0x704,
742         VENDOR_DSPIO_SCP_READ_COUNT          = 0xF04,
743
744         /* for ChipIO node */
745         VENDOR_CHIPIO_ADDRESS_LOW            = 0x000,
746         VENDOR_CHIPIO_ADDRESS_HIGH           = 0x100,
747         VENDOR_CHIPIO_STREAM_FORMAT          = 0x200,
748         VENDOR_CHIPIO_DATA_LOW               = 0x300,
749         VENDOR_CHIPIO_DATA_HIGH              = 0x400,
750
751         VENDOR_CHIPIO_8051_WRITE_DIRECT      = 0x500,
752         VENDOR_CHIPIO_8051_READ_DIRECT       = 0xD00,
753
754         VENDOR_CHIPIO_GET_PARAMETER          = 0xF00,
755         VENDOR_CHIPIO_STATUS                 = 0xF01,
756         VENDOR_CHIPIO_HIC_POST_READ          = 0x702,
757         VENDOR_CHIPIO_HIC_READ_DATA          = 0xF03,
758
759         VENDOR_CHIPIO_8051_DATA_WRITE        = 0x707,
760         VENDOR_CHIPIO_8051_DATA_READ         = 0xF07,
761         VENDOR_CHIPIO_8051_PMEM_READ         = 0xF08,
762         VENDOR_CHIPIO_8051_IRAM_WRITE        = 0x709,
763         VENDOR_CHIPIO_8051_IRAM_READ         = 0xF09,
764
765         VENDOR_CHIPIO_CT_EXTENSIONS_ENABLE   = 0x70A,
766         VENDOR_CHIPIO_CT_EXTENSIONS_GET      = 0xF0A,
767
768         VENDOR_CHIPIO_PLL_PMU_WRITE          = 0x70C,
769         VENDOR_CHIPIO_PLL_PMU_READ           = 0xF0C,
770         VENDOR_CHIPIO_8051_ADDRESS_LOW       = 0x70D,
771         VENDOR_CHIPIO_8051_ADDRESS_HIGH      = 0x70E,
772         VENDOR_CHIPIO_FLAG_SET               = 0x70F,
773         VENDOR_CHIPIO_FLAGS_GET              = 0xF0F,
774         VENDOR_CHIPIO_PARAM_SET              = 0x710,
775         VENDOR_CHIPIO_PARAM_GET              = 0xF10,
776
777         VENDOR_CHIPIO_PORT_ALLOC_CONFIG_SET  = 0x711,
778         VENDOR_CHIPIO_PORT_ALLOC_SET         = 0x712,
779         VENDOR_CHIPIO_PORT_ALLOC_GET         = 0xF12,
780         VENDOR_CHIPIO_PORT_FREE_SET          = 0x713,
781
782         VENDOR_CHIPIO_PARAM_EX_ID_GET        = 0xF17,
783         VENDOR_CHIPIO_PARAM_EX_ID_SET        = 0x717,
784         VENDOR_CHIPIO_PARAM_EX_VALUE_GET     = 0xF18,
785         VENDOR_CHIPIO_PARAM_EX_VALUE_SET     = 0x718,
786
787         VENDOR_CHIPIO_DMIC_CTL_SET           = 0x788,
788         VENDOR_CHIPIO_DMIC_CTL_GET           = 0xF88,
789         VENDOR_CHIPIO_DMIC_PIN_SET           = 0x789,
790         VENDOR_CHIPIO_DMIC_PIN_GET           = 0xF89,
791         VENDOR_CHIPIO_DMIC_MCLK_SET          = 0x78A,
792         VENDOR_CHIPIO_DMIC_MCLK_GET          = 0xF8A,
793
794         VENDOR_CHIPIO_EAPD_SEL_SET           = 0x78D
795 };
796
797 /*
798  *  Control flag IDs
799  */
800 enum control_flag_id {
801         /* Connection manager stream setup is bypassed/enabled */
802         CONTROL_FLAG_C_MGR                  = 0,
803         /* DSP DMA is bypassed/enabled */
804         CONTROL_FLAG_DMA                    = 1,
805         /* 8051 'idle' mode is disabled/enabled */
806         CONTROL_FLAG_IDLE_ENABLE            = 2,
807         /* Tracker for the SPDIF-in path is bypassed/enabled */
808         CONTROL_FLAG_TRACKER                = 3,
809         /* DigitalOut to Spdif2Out connection is disabled/enabled */
810         CONTROL_FLAG_SPDIF2OUT              = 4,
811         /* Digital Microphone is disabled/enabled */
812         CONTROL_FLAG_DMIC                   = 5,
813         /* ADC_B rate is 48 kHz/96 kHz */
814         CONTROL_FLAG_ADC_B_96KHZ            = 6,
815         /* ADC_C rate is 48 kHz/96 kHz */
816         CONTROL_FLAG_ADC_C_96KHZ            = 7,
817         /* DAC rate is 48 kHz/96 kHz (affects all DACs) */
818         CONTROL_FLAG_DAC_96KHZ              = 8,
819         /* DSP rate is 48 kHz/96 kHz */
820         CONTROL_FLAG_DSP_96KHZ              = 9,
821         /* SRC clock is 98 MHz/196 MHz (196 MHz forces rate to 96 KHz) */
822         CONTROL_FLAG_SRC_CLOCK_196MHZ       = 10,
823         /* SRC rate is 48 kHz/96 kHz (48 kHz disabled when clock is 196 MHz) */
824         CONTROL_FLAG_SRC_RATE_96KHZ         = 11,
825         /* Decode Loop (DSP->SRC->DSP) is disabled/enabled */
826         CONTROL_FLAG_DECODE_LOOP            = 12,
827         /* De-emphasis filter on DAC-1 disabled/enabled */
828         CONTROL_FLAG_DAC1_DEEMPHASIS        = 13,
829         /* De-emphasis filter on DAC-2 disabled/enabled */
830         CONTROL_FLAG_DAC2_DEEMPHASIS        = 14,
831         /* De-emphasis filter on DAC-3 disabled/enabled */
832         CONTROL_FLAG_DAC3_DEEMPHASIS        = 15,
833         /* High-pass filter on ADC_B disabled/enabled */
834         CONTROL_FLAG_ADC_B_HIGH_PASS        = 16,
835         /* High-pass filter on ADC_C disabled/enabled */
836         CONTROL_FLAG_ADC_C_HIGH_PASS        = 17,
837         /* Common mode on Port_A disabled/enabled */
838         CONTROL_FLAG_PORT_A_COMMON_MODE     = 18,
839         /* Common mode on Port_D disabled/enabled */
840         CONTROL_FLAG_PORT_D_COMMON_MODE     = 19,
841         /* Impedance for ramp generator on Port_A 16 Ohm/10K Ohm */
842         CONTROL_FLAG_PORT_A_10KOHM_LOAD     = 20,
843         /* Impedance for ramp generator on Port_D, 16 Ohm/10K Ohm */
844         CONTROL_FLAG_PORT_D_10KOHM_LOAD     = 21,
845         /* ASI rate is 48kHz/96kHz */
846         CONTROL_FLAG_ASI_96KHZ              = 22,
847         /* DAC power settings able to control attached ports no/yes */
848         CONTROL_FLAG_DACS_CONTROL_PORTS     = 23,
849         /* Clock Stop OK reporting is disabled/enabled */
850         CONTROL_FLAG_CONTROL_STOP_OK_ENABLE = 24,
851         /* Number of control flags */
852         CONTROL_FLAGS_MAX = (CONTROL_FLAG_CONTROL_STOP_OK_ENABLE+1)
853 };
854
855 /*
856  * Control parameter IDs
857  */
858 enum control_param_id {
859         /* 0: None, 1: Mic1In*/
860         CONTROL_PARAM_VIP_SOURCE               = 1,
861         /* 0: force HDA, 1: allow DSP if HDA Spdif1Out stream is idle */
862         CONTROL_PARAM_SPDIF1_SOURCE            = 2,
863         /* Port A output stage gain setting to use when 16 Ohm output
864          * impedance is selected*/
865         CONTROL_PARAM_PORTA_160OHM_GAIN        = 8,
866         /* Port D output stage gain setting to use when 16 Ohm output
867          * impedance is selected*/
868         CONTROL_PARAM_PORTD_160OHM_GAIN        = 10,
869
870         /*
871          * This control param name was found in the 8051 memory, and makes
872          * sense given the fact the AE-5 uses it and has the ASI flag set.
873          */
874         CONTROL_PARAM_ASI                      = 23,
875
876         /* Stream Control */
877
878         /* Select stream with the given ID */
879         CONTROL_PARAM_STREAM_ID                = 24,
880         /* Source connection point for the selected stream */
881         CONTROL_PARAM_STREAM_SOURCE_CONN_POINT = 25,
882         /* Destination connection point for the selected stream */
883         CONTROL_PARAM_STREAM_DEST_CONN_POINT   = 26,
884         /* Number of audio channels in the selected stream */
885         CONTROL_PARAM_STREAMS_CHANNELS         = 27,
886         /*Enable control for the selected stream */
887         CONTROL_PARAM_STREAM_CONTROL           = 28,
888
889         /* Connection Point Control */
890
891         /* Select connection point with the given ID */
892         CONTROL_PARAM_CONN_POINT_ID            = 29,
893         /* Connection point sample rate */
894         CONTROL_PARAM_CONN_POINT_SAMPLE_RATE   = 30,
895
896         /* Node Control */
897
898         /* Select HDA node with the given ID */
899         CONTROL_PARAM_NODE_ID                  = 31
900 };
901
902 /*
903  *  Dsp Io Status codes
904  */
905 enum hda_vendor_status_dspio {
906         /* Success */
907         VENDOR_STATUS_DSPIO_OK                       = 0x00,
908         /* Busy, unable to accept new command, the host must retry */
909         VENDOR_STATUS_DSPIO_BUSY                     = 0x01,
910         /* SCP command queue is full */
911         VENDOR_STATUS_DSPIO_SCP_COMMAND_QUEUE_FULL   = 0x02,
912         /* SCP response queue is empty */
913         VENDOR_STATUS_DSPIO_SCP_RESPONSE_QUEUE_EMPTY = 0x03
914 };
915
916 /*
917  *  Chip Io Status codes
918  */
919 enum hda_vendor_status_chipio {
920         /* Success */
921         VENDOR_STATUS_CHIPIO_OK   = 0x00,
922         /* Busy, unable to accept new command, the host must retry */
923         VENDOR_STATUS_CHIPIO_BUSY = 0x01
924 };
925
926 /*
927  *  CA0132 sample rate
928  */
929 enum ca0132_sample_rate {
930         SR_6_000        = 0x00,
931         SR_8_000        = 0x01,
932         SR_9_600        = 0x02,
933         SR_11_025       = 0x03,
934         SR_16_000       = 0x04,
935         SR_22_050       = 0x05,
936         SR_24_000       = 0x06,
937         SR_32_000       = 0x07,
938         SR_44_100       = 0x08,
939         SR_48_000       = 0x09,
940         SR_88_200       = 0x0A,
941         SR_96_000       = 0x0B,
942         SR_144_000      = 0x0C,
943         SR_176_400      = 0x0D,
944         SR_192_000      = 0x0E,
945         SR_384_000      = 0x0F,
946
947         SR_COUNT        = 0x10,
948
949         SR_RATE_UNKNOWN = 0x1F
950 };
951
952 enum dsp_download_state {
953         DSP_DOWNLOAD_FAILED = -1,
954         DSP_DOWNLOAD_INIT   = 0,
955         DSP_DOWNLOADING     = 1,
956         DSP_DOWNLOADED      = 2
957 };
958
959 /* retrieve parameters from hda format */
960 #define get_hdafmt_chs(fmt)     (fmt & 0xf)
961 #define get_hdafmt_bits(fmt)    ((fmt >> 4) & 0x7)
962 #define get_hdafmt_rate(fmt)    ((fmt >> 8) & 0x7f)
963 #define get_hdafmt_type(fmt)    ((fmt >> 15) & 0x1)
964
965 /*
966  * CA0132 specific
967  */
968
969 struct ca0132_spec {
970         const struct snd_kcontrol_new *mixers[5];
971         unsigned int num_mixers;
972         const struct hda_verb *base_init_verbs;
973         const struct hda_verb *base_exit_verbs;
974         const struct hda_verb *chip_init_verbs;
975         const struct hda_verb *desktop_init_verbs;
976         struct hda_verb *spec_init_verbs;
977         struct auto_pin_cfg autocfg;
978
979         /* Nodes configurations */
980         struct hda_multi_out multiout;
981         hda_nid_t out_pins[AUTO_CFG_MAX_OUTS];
982         hda_nid_t dacs[AUTO_CFG_MAX_OUTS];
983         unsigned int num_outputs;
984         hda_nid_t input_pins[AUTO_PIN_LAST];
985         hda_nid_t adcs[AUTO_PIN_LAST];
986         hda_nid_t dig_out;
987         hda_nid_t dig_in;
988         unsigned int num_inputs;
989         hda_nid_t shared_mic_nid;
990         hda_nid_t shared_out_nid;
991         hda_nid_t unsol_tag_hp;
992         hda_nid_t unsol_tag_front_hp; /* for desktop ca0132 codecs */
993         hda_nid_t unsol_tag_amic1;
994
995         /* chip access */
996         struct mutex chipio_mutex; /* chip access mutex */
997         u32 curr_chip_addx;
998
999         /* DSP download related */
1000         enum dsp_download_state dsp_state;
1001         unsigned int dsp_stream_id;
1002         unsigned int wait_scp;
1003         unsigned int wait_scp_header;
1004         unsigned int wait_num_data;
1005         unsigned int scp_resp_header;
1006         unsigned int scp_resp_data[4];
1007         unsigned int scp_resp_count;
1008         bool startup_check_entered;
1009         bool dsp_reload;
1010
1011         /* mixer and effects related */
1012         unsigned char dmic_ctl;
1013         int cur_out_type;
1014         int cur_mic_type;
1015         long vnode_lvol[VNODES_COUNT];
1016         long vnode_rvol[VNODES_COUNT];
1017         long vnode_lswitch[VNODES_COUNT];
1018         long vnode_rswitch[VNODES_COUNT];
1019         long effects_switch[EFFECTS_COUNT];
1020         long voicefx_val;
1021         long cur_mic_boost;
1022         /* ca0132_alt control related values */
1023         unsigned char in_enum_val;
1024         unsigned char out_enum_val;
1025         unsigned char mic_boost_enum_val;
1026         unsigned char smart_volume_setting;
1027         long fx_ctl_val[EFFECT_LEVEL_SLIDERS];
1028         long xbass_xover_freq;
1029         long eq_preset_val;
1030         unsigned int tlv[4];
1031         struct hda_vmaster_mute_hook vmaster_mute;
1032         /* AE-5 Control values */
1033         unsigned char ae5_headphone_gain_val;
1034         unsigned char ae5_filter_val;
1035         /* ZxR Control Values */
1036         unsigned char zxr_gain_set;
1037
1038         struct hda_codec *codec;
1039         struct delayed_work unsol_hp_work;
1040         int quirk;
1041
1042 #ifdef ENABLE_TUNING_CONTROLS
1043         long cur_ctl_vals[TUNING_CTLS_COUNT];
1044 #endif
1045         /*
1046          * The Recon3D, Sound Blaster Z, Sound Blaster ZxR, and Sound Blaster
1047          * AE-5 all use PCI region 2 to toggle GPIO and other currently unknown
1048          * things.
1049          */
1050         bool use_pci_mmio;
1051         void __iomem *mem_base;
1052
1053         /*
1054          * Whether or not to use the alt functions like alt_select_out,
1055          * alt_select_in, etc. Only used on desktop codecs for now, because of
1056          * surround sound support.
1057          */
1058         bool use_alt_functions;
1059
1060         /*
1061          * Whether or not to use alt controls:  volume effect sliders, EQ
1062          * presets, smart volume presets, and new control names with FX prefix.
1063          * Renames PlayEnhancement and CrystalVoice too.
1064          */
1065         bool use_alt_controls;
1066 };
1067
1068 /*
1069  * CA0132 quirks table
1070  */
1071 enum {
1072         QUIRK_NONE,
1073         QUIRK_ALIENWARE,
1074         QUIRK_ALIENWARE_M17XR4,
1075         QUIRK_SBZ,
1076         QUIRK_ZXR,
1077         QUIRK_ZXR_DBPRO,
1078         QUIRK_R3DI,
1079         QUIRK_R3D,
1080         QUIRK_AE5,
1081 };
1082
1083 #ifdef CONFIG_PCI
1084 #define ca0132_quirk(spec)              ((spec)->quirk)
1085 #define ca0132_use_pci_mmio(spec)       ((spec)->use_pci_mmio)
1086 #define ca0132_use_alt_functions(spec)  ((spec)->use_alt_functions)
1087 #define ca0132_use_alt_controls(spec)   ((spec)->use_alt_controls)
1088 #else
1089 #define ca0132_quirk(spec)              ({ (void)(spec); QUIRK_NONE; })
1090 #define ca0132_use_alt_functions(spec)  ({ (void)(spec); false; })
1091 #define ca0132_use_pci_mmio(spec)       ({ (void)(spec); false; })
1092 #define ca0132_use_alt_controls(spec)   ({ (void)(spec); false; })
1093 #endif
1094
1095 static const struct hda_pintbl alienware_pincfgs[] = {
1096         { 0x0b, 0x90170110 }, /* Builtin Speaker */
1097         { 0x0c, 0x411111f0 }, /* N/A */
1098         { 0x0d, 0x411111f0 }, /* N/A */
1099         { 0x0e, 0x411111f0 }, /* N/A */
1100         { 0x0f, 0x0321101f }, /* HP */
1101         { 0x10, 0x411111f0 }, /* Headset?  disabled for now */
1102         { 0x11, 0x03a11021 }, /* Mic */
1103         { 0x12, 0xd5a30140 }, /* Builtin Mic */
1104         { 0x13, 0x411111f0 }, /* N/A */
1105         { 0x18, 0x411111f0 }, /* N/A */
1106         {}
1107 };
1108
1109 /* Sound Blaster Z pin configs taken from Windows Driver */
1110 static const struct hda_pintbl sbz_pincfgs[] = {
1111         { 0x0b, 0x01017010 }, /* Port G -- Lineout FRONT L/R */
1112         { 0x0c, 0x014510f0 }, /* SPDIF Out 1 */
1113         { 0x0d, 0x014510f0 }, /* Digital Out */
1114         { 0x0e, 0x01c510f0 }, /* SPDIF In */
1115         { 0x0f, 0x0221701f }, /* Port A -- BackPanel HP */
1116         { 0x10, 0x01017012 }, /* Port D -- Center/LFE or FP Hp */
1117         { 0x11, 0x01017014 }, /* Port B -- LineMicIn2 / Rear L/R */
1118         { 0x12, 0x01a170f0 }, /* Port C -- LineIn1 */
1119         { 0x13, 0x908700f0 }, /* What U Hear In*/
1120         { 0x18, 0x50d000f0 }, /* N/A */
1121         {}
1122 };
1123
1124 /* Sound Blaster ZxR pin configs taken from Windows Driver */
1125 static const struct hda_pintbl zxr_pincfgs[] = {
1126         { 0x0b, 0x01047110 }, /* Port G -- Lineout FRONT L/R */
1127         { 0x0c, 0x414510f0 }, /* SPDIF Out 1 - Disabled*/
1128         { 0x0d, 0x014510f0 }, /* Digital Out */
1129         { 0x0e, 0x41c520f0 }, /* SPDIF In - Disabled*/
1130         { 0x0f, 0x0122711f }, /* Port A -- BackPanel HP */
1131         { 0x10, 0x01017111 }, /* Port D -- Center/LFE */
1132         { 0x11, 0x01017114 }, /* Port B -- LineMicIn2 / Rear L/R */
1133         { 0x12, 0x01a271f0 }, /* Port C -- LineIn1 */
1134         { 0x13, 0x908700f0 }, /* What U Hear In*/
1135         { 0x18, 0x50d000f0 }, /* N/A */
1136         {}
1137 };
1138
1139 /* Recon3D pin configs taken from Windows Driver */
1140 static const struct hda_pintbl r3d_pincfgs[] = {
1141         { 0x0b, 0x01014110 }, /* Port G -- Lineout FRONT L/R */
1142         { 0x0c, 0x014510f0 }, /* SPDIF Out 1 */
1143         { 0x0d, 0x014510f0 }, /* Digital Out */
1144         { 0x0e, 0x01c520f0 }, /* SPDIF In */
1145         { 0x0f, 0x0221401f }, /* Port A -- BackPanel HP */
1146         { 0x10, 0x01016011 }, /* Port D -- Center/LFE or FP Hp */
1147         { 0x11, 0x01011014 }, /* Port B -- LineMicIn2 / Rear L/R */
1148         { 0x12, 0x02a090f0 }, /* Port C -- LineIn1 */
1149         { 0x13, 0x908700f0 }, /* What U Hear In*/
1150         { 0x18, 0x50d000f0 }, /* N/A */
1151         {}
1152 };
1153
1154 /* Sound Blaster AE-5 pin configs taken from Windows Driver */
1155 static const struct hda_pintbl ae5_pincfgs[] = {
1156         { 0x0b, 0x01017010 }, /* Port G -- Lineout FRONT L/R */
1157         { 0x0c, 0x014510f0 }, /* SPDIF Out 1 */
1158         { 0x0d, 0x014510f0 }, /* Digital Out */
1159         { 0x0e, 0x01c510f0 }, /* SPDIF In */
1160         { 0x0f, 0x01017114 }, /* Port A -- Rear L/R. */
1161         { 0x10, 0x01017012 }, /* Port D -- Center/LFE or FP Hp */
1162         { 0x11, 0x01a170ff }, /* Port B -- LineMicIn2 / Rear Headphone */
1163         { 0x12, 0x01a170f0 }, /* Port C -- LineIn1 */
1164         { 0x13, 0x908700f0 }, /* What U Hear In*/
1165         { 0x18, 0x50d000f0 }, /* N/A */
1166         {}
1167 };
1168
1169 /* Recon3D integrated pin configs taken from Windows Driver */
1170 static const struct hda_pintbl r3di_pincfgs[] = {
1171         { 0x0b, 0x01014110 }, /* Port G -- Lineout FRONT L/R */
1172         { 0x0c, 0x014510f0 }, /* SPDIF Out 1 */
1173         { 0x0d, 0x014510f0 }, /* Digital Out */
1174         { 0x0e, 0x41c520f0 }, /* SPDIF In */
1175         { 0x0f, 0x0221401f }, /* Port A -- BackPanel HP */
1176         { 0x10, 0x01016011 }, /* Port D -- Center/LFE or FP Hp */
1177         { 0x11, 0x01011014 }, /* Port B -- LineMicIn2 / Rear L/R */
1178         { 0x12, 0x02a090f0 }, /* Port C -- LineIn1 */
1179         { 0x13, 0x908700f0 }, /* What U Hear In*/
1180         { 0x18, 0x500000f0 }, /* N/A */
1181         {}
1182 };
1183
1184 static const struct snd_pci_quirk ca0132_quirks[] = {
1185         SND_PCI_QUIRK(0x1028, 0x057b, "Alienware M17x R4", QUIRK_ALIENWARE_M17XR4),
1186         SND_PCI_QUIRK(0x1028, 0x0685, "Alienware 15 2015", QUIRK_ALIENWARE),
1187         SND_PCI_QUIRK(0x1028, 0x0688, "Alienware 17 2015", QUIRK_ALIENWARE),
1188         SND_PCI_QUIRK(0x1028, 0x0708, "Alienware 15 R2 2016", QUIRK_ALIENWARE),
1189         SND_PCI_QUIRK(0x1102, 0x0010, "Sound Blaster Z", QUIRK_SBZ),
1190         SND_PCI_QUIRK(0x1102, 0x0023, "Sound Blaster Z", QUIRK_SBZ),
1191         SND_PCI_QUIRK(0x1102, 0x0033, "Sound Blaster ZxR", QUIRK_SBZ),
1192         SND_PCI_QUIRK(0x1458, 0xA016, "Recon3Di", QUIRK_R3DI),
1193         SND_PCI_QUIRK(0x1458, 0xA026, "Gigabyte G1.Sniper Z97", QUIRK_R3DI),
1194         SND_PCI_QUIRK(0x1458, 0xA036, "Gigabyte GA-Z170X-Gaming 7", QUIRK_R3DI),
1195         SND_PCI_QUIRK(0x1102, 0x0013, "Recon3D", QUIRK_R3D),
1196         SND_PCI_QUIRK(0x1102, 0x0051, "Sound Blaster AE-5", QUIRK_AE5),
1197         {}
1198 };
1199
1200 /*
1201  * CA0132 codec access
1202  */
1203 static unsigned int codec_send_command(struct hda_codec *codec, hda_nid_t nid,
1204                 unsigned int verb, unsigned int parm, unsigned int *res)
1205 {
1206         unsigned int response;
1207         response = snd_hda_codec_read(codec, nid, 0, verb, parm);
1208         *res = response;
1209
1210         return ((response == -1) ? -1 : 0);
1211 }
1212
1213 static int codec_set_converter_format(struct hda_codec *codec, hda_nid_t nid,
1214                 unsigned short converter_format, unsigned int *res)
1215 {
1216         return codec_send_command(codec, nid, VENDOR_CHIPIO_STREAM_FORMAT,
1217                                 converter_format & 0xffff, res);
1218 }
1219
1220 static int codec_set_converter_stream_channel(struct hda_codec *codec,
1221                                 hda_nid_t nid, unsigned char stream,
1222                                 unsigned char channel, unsigned int *res)
1223 {
1224         unsigned char converter_stream_channel = 0;
1225
1226         converter_stream_channel = (stream << 4) | (channel & 0x0f);
1227         return codec_send_command(codec, nid, AC_VERB_SET_CHANNEL_STREAMID,
1228                                 converter_stream_channel, res);
1229 }
1230
1231 /* Chip access helper function */
1232 static int chipio_send(struct hda_codec *codec,
1233                        unsigned int reg,
1234                        unsigned int data)
1235 {
1236         unsigned int res;
1237         unsigned long timeout = jiffies + msecs_to_jiffies(1000);
1238
1239         /* send bits of data specified by reg */
1240         do {
1241                 res = snd_hda_codec_read(codec, WIDGET_CHIP_CTRL, 0,
1242                                          reg, data);
1243                 if (res == VENDOR_STATUS_CHIPIO_OK)
1244                         return 0;
1245                 msleep(20);
1246         } while (time_before(jiffies, timeout));
1247
1248         return -EIO;
1249 }
1250
1251 /*
1252  * Write chip address through the vendor widget -- NOT protected by the Mutex!
1253  */
1254 static int chipio_write_address(struct hda_codec *codec,
1255                                 unsigned int chip_addx)
1256 {
1257         struct ca0132_spec *spec = codec->spec;
1258         int res;
1259
1260         if (spec->curr_chip_addx == chip_addx)
1261                         return 0;
1262
1263         /* send low 16 bits of the address */
1264         res = chipio_send(codec, VENDOR_CHIPIO_ADDRESS_LOW,
1265                           chip_addx & 0xffff);
1266
1267         if (res != -EIO) {
1268                 /* send high 16 bits of the address */
1269                 res = chipio_send(codec, VENDOR_CHIPIO_ADDRESS_HIGH,
1270                                   chip_addx >> 16);
1271         }
1272
1273         spec->curr_chip_addx = (res < 0) ? ~0U : chip_addx;
1274
1275         return res;
1276 }
1277
1278 /*
1279  * Write data through the vendor widget -- NOT protected by the Mutex!
1280  */
1281 static int chipio_write_data(struct hda_codec *codec, unsigned int data)
1282 {
1283         struct ca0132_spec *spec = codec->spec;
1284         int res;
1285
1286         /* send low 16 bits of the data */
1287         res = chipio_send(codec, VENDOR_CHIPIO_DATA_LOW, data & 0xffff);
1288
1289         if (res != -EIO) {
1290                 /* send high 16 bits of the data */
1291                 res = chipio_send(codec, VENDOR_CHIPIO_DATA_HIGH,
1292                                   data >> 16);
1293         }
1294
1295         /*If no error encountered, automatically increment the address
1296         as per chip behaviour*/
1297         spec->curr_chip_addx = (res != -EIO) ?
1298                                         (spec->curr_chip_addx + 4) : ~0U;
1299         return res;
1300 }
1301
1302 /*
1303  * Write multiple data through the vendor widget -- NOT protected by the Mutex!
1304  */
1305 static int chipio_write_data_multiple(struct hda_codec *codec,
1306                                       const u32 *data,
1307                                       unsigned int count)
1308 {
1309         int status = 0;
1310
1311         if (data == NULL) {
1312                 codec_dbg(codec, "chipio_write_data null ptr\n");
1313                 return -EINVAL;
1314         }
1315
1316         while ((count-- != 0) && (status == 0))
1317                 status = chipio_write_data(codec, *data++);
1318
1319         return status;
1320 }
1321
1322
1323 /*
1324  * Read data through the vendor widget -- NOT protected by the Mutex!
1325  */
1326 static int chipio_read_data(struct hda_codec *codec, unsigned int *data)
1327 {
1328         struct ca0132_spec *spec = codec->spec;
1329         int res;
1330
1331         /* post read */
1332         res = chipio_send(codec, VENDOR_CHIPIO_HIC_POST_READ, 0);
1333
1334         if (res != -EIO) {
1335                 /* read status */
1336                 res = chipio_send(codec, VENDOR_CHIPIO_STATUS, 0);
1337         }
1338
1339         if (res != -EIO) {
1340                 /* read data */
1341                 *data = snd_hda_codec_read(codec, WIDGET_CHIP_CTRL, 0,
1342                                            VENDOR_CHIPIO_HIC_READ_DATA,
1343                                            0);
1344         }
1345
1346         /*If no error encountered, automatically increment the address
1347         as per chip behaviour*/
1348         spec->curr_chip_addx = (res != -EIO) ?
1349                                         (spec->curr_chip_addx + 4) : ~0U;
1350         return res;
1351 }
1352
1353 /*
1354  * Write given value to the given address through the chip I/O widget.
1355  * protected by the Mutex
1356  */
1357 static int chipio_write(struct hda_codec *codec,
1358                 unsigned int chip_addx, const unsigned int data)
1359 {
1360         struct ca0132_spec *spec = codec->spec;
1361         int err;
1362
1363         mutex_lock(&spec->chipio_mutex);
1364
1365         /* write the address, and if successful proceed to write data */
1366         err = chipio_write_address(codec, chip_addx);
1367         if (err < 0)
1368                 goto exit;
1369
1370         err = chipio_write_data(codec, data);
1371         if (err < 0)
1372                 goto exit;
1373
1374 exit:
1375         mutex_unlock(&spec->chipio_mutex);
1376         return err;
1377 }
1378
1379 /*
1380  * Write given value to the given address through the chip I/O widget.
1381  * not protected by the Mutex
1382  */
1383 static int chipio_write_no_mutex(struct hda_codec *codec,
1384                 unsigned int chip_addx, const unsigned int data)
1385 {
1386         int err;
1387
1388
1389         /* write the address, and if successful proceed to write data */
1390         err = chipio_write_address(codec, chip_addx);
1391         if (err < 0)
1392                 goto exit;
1393
1394         err = chipio_write_data(codec, data);
1395         if (err < 0)
1396                 goto exit;
1397
1398 exit:
1399         return err;
1400 }
1401
1402 /*
1403  * Write multiple values to the given address through the chip I/O widget.
1404  * protected by the Mutex
1405  */
1406 static int chipio_write_multiple(struct hda_codec *codec,
1407                                  u32 chip_addx,
1408                                  const u32 *data,
1409                                  unsigned int count)
1410 {
1411         struct ca0132_spec *spec = codec->spec;
1412         int status;
1413
1414         mutex_lock(&spec->chipio_mutex);
1415         status = chipio_write_address(codec, chip_addx);
1416         if (status < 0)
1417                 goto error;
1418
1419         status = chipio_write_data_multiple(codec, data, count);
1420 error:
1421         mutex_unlock(&spec->chipio_mutex);
1422
1423         return status;
1424 }
1425
1426 /*
1427  * Read the given address through the chip I/O widget
1428  * protected by the Mutex
1429  */
1430 static int chipio_read(struct hda_codec *codec,
1431                 unsigned int chip_addx, unsigned int *data)
1432 {
1433         struct ca0132_spec *spec = codec->spec;
1434         int err;
1435
1436         mutex_lock(&spec->chipio_mutex);
1437
1438         /* write the address, and if successful proceed to write data */
1439         err = chipio_write_address(codec, chip_addx);
1440         if (err < 0)
1441                 goto exit;
1442
1443         err = chipio_read_data(codec, data);
1444         if (err < 0)
1445                 goto exit;
1446
1447 exit:
1448         mutex_unlock(&spec->chipio_mutex);
1449         return err;
1450 }
1451
1452 /*
1453  * Set chip control flags through the chip I/O widget.
1454  */
1455 static void chipio_set_control_flag(struct hda_codec *codec,
1456                                     enum control_flag_id flag_id,
1457                                     bool flag_state)
1458 {
1459         unsigned int val;
1460         unsigned int flag_bit;
1461
1462         flag_bit = (flag_state ? 1 : 0);
1463         val = (flag_bit << 7) | (flag_id);
1464         snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
1465                             VENDOR_CHIPIO_FLAG_SET, val);
1466 }
1467
1468 /*
1469  * Set chip parameters through the chip I/O widget.
1470  */
1471 static void chipio_set_control_param(struct hda_codec *codec,
1472                 enum control_param_id param_id, int param_val)
1473 {
1474         struct ca0132_spec *spec = codec->spec;
1475         int val;
1476
1477         if ((param_id < 32) && (param_val < 8)) {
1478                 val = (param_val << 5) | (param_id);
1479                 snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
1480                                     VENDOR_CHIPIO_PARAM_SET, val);
1481         } else {
1482                 mutex_lock(&spec->chipio_mutex);
1483                 if (chipio_send(codec, VENDOR_CHIPIO_STATUS, 0) == 0) {
1484                         snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
1485                                             VENDOR_CHIPIO_PARAM_EX_ID_SET,
1486                                             param_id);
1487                         snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
1488                                             VENDOR_CHIPIO_PARAM_EX_VALUE_SET,
1489                                             param_val);
1490                 }
1491                 mutex_unlock(&spec->chipio_mutex);
1492         }
1493 }
1494
1495 /*
1496  * Set chip parameters through the chip I/O widget. NO MUTEX.
1497  */
1498 static void chipio_set_control_param_no_mutex(struct hda_codec *codec,
1499                 enum control_param_id param_id, int param_val)
1500 {
1501         int val;
1502
1503         if ((param_id < 32) && (param_val < 8)) {
1504                 val = (param_val << 5) | (param_id);
1505                 snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
1506                                     VENDOR_CHIPIO_PARAM_SET, val);
1507         } else {
1508                 if (chipio_send(codec, VENDOR_CHIPIO_STATUS, 0) == 0) {
1509                         snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
1510                                             VENDOR_CHIPIO_PARAM_EX_ID_SET,
1511                                             param_id);
1512                         snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
1513                                             VENDOR_CHIPIO_PARAM_EX_VALUE_SET,
1514                                             param_val);
1515                 }
1516         }
1517 }
1518 /*
1519  * Connect stream to a source point, and then connect
1520  * that source point to a destination point.
1521  */
1522 static void chipio_set_stream_source_dest(struct hda_codec *codec,
1523                                 int streamid, int source_point, int dest_point)
1524 {
1525         chipio_set_control_param_no_mutex(codec,
1526                         CONTROL_PARAM_STREAM_ID, streamid);
1527         chipio_set_control_param_no_mutex(codec,
1528                         CONTROL_PARAM_STREAM_SOURCE_CONN_POINT, source_point);
1529         chipio_set_control_param_no_mutex(codec,
1530                         CONTROL_PARAM_STREAM_DEST_CONN_POINT, dest_point);
1531 }
1532
1533 /*
1534  * Set number of channels in the selected stream.
1535  */
1536 static void chipio_set_stream_channels(struct hda_codec *codec,
1537                                 int streamid, unsigned int channels)
1538 {
1539         chipio_set_control_param_no_mutex(codec,
1540                         CONTROL_PARAM_STREAM_ID, streamid);
1541         chipio_set_control_param_no_mutex(codec,
1542                         CONTROL_PARAM_STREAMS_CHANNELS, channels);
1543 }
1544
1545 /*
1546  * Enable/Disable audio stream.
1547  */
1548 static void chipio_set_stream_control(struct hda_codec *codec,
1549                                 int streamid, int enable)
1550 {
1551         chipio_set_control_param_no_mutex(codec,
1552                         CONTROL_PARAM_STREAM_ID, streamid);
1553         chipio_set_control_param_no_mutex(codec,
1554                         CONTROL_PARAM_STREAM_CONTROL, enable);
1555 }
1556
1557
1558 /*
1559  * Set sampling rate of the connection point. NO MUTEX.
1560  */
1561 static void chipio_set_conn_rate_no_mutex(struct hda_codec *codec,
1562                                 int connid, enum ca0132_sample_rate rate)
1563 {
1564         chipio_set_control_param_no_mutex(codec,
1565                         CONTROL_PARAM_CONN_POINT_ID, connid);
1566         chipio_set_control_param_no_mutex(codec,
1567                         CONTROL_PARAM_CONN_POINT_SAMPLE_RATE, rate);
1568 }
1569
1570 /*
1571  * Set sampling rate of the connection point.
1572  */
1573 static void chipio_set_conn_rate(struct hda_codec *codec,
1574                                 int connid, enum ca0132_sample_rate rate)
1575 {
1576         chipio_set_control_param(codec, CONTROL_PARAM_CONN_POINT_ID, connid);
1577         chipio_set_control_param(codec, CONTROL_PARAM_CONN_POINT_SAMPLE_RATE,
1578                                  rate);
1579 }
1580
1581 /*
1582  * Writes to the 8051's internal address space directly instead of indirectly,
1583  * giving access to the special function registers located at addresses
1584  * 0x80-0xFF.
1585  */
1586 static void chipio_8051_write_direct(struct hda_codec *codec,
1587                 unsigned int addr, unsigned int data)
1588 {
1589         unsigned int verb;
1590
1591         verb = VENDOR_CHIPIO_8051_WRITE_DIRECT | data;
1592         snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0, verb, addr);
1593 }
1594
1595 /*
1596  * Enable clocks.
1597  */
1598 static void chipio_enable_clocks(struct hda_codec *codec)
1599 {
1600         struct ca0132_spec *spec = codec->spec;
1601
1602         mutex_lock(&spec->chipio_mutex);
1603         snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
1604                             VENDOR_CHIPIO_8051_ADDRESS_LOW, 0);
1605         snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
1606                             VENDOR_CHIPIO_PLL_PMU_WRITE, 0xff);
1607         snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
1608                             VENDOR_CHIPIO_8051_ADDRESS_LOW, 5);
1609         snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
1610                             VENDOR_CHIPIO_PLL_PMU_WRITE, 0x0b);
1611         snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
1612                             VENDOR_CHIPIO_8051_ADDRESS_LOW, 6);
1613         snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
1614                             VENDOR_CHIPIO_PLL_PMU_WRITE, 0xff);
1615         mutex_unlock(&spec->chipio_mutex);
1616 }
1617
1618 /*
1619  * CA0132 DSP IO stuffs
1620  */
1621 static int dspio_send(struct hda_codec *codec, unsigned int reg,
1622                       unsigned int data)
1623 {
1624         int res;
1625         unsigned long timeout = jiffies + msecs_to_jiffies(1000);
1626
1627         /* send bits of data specified by reg to dsp */
1628         do {
1629                 res = snd_hda_codec_read(codec, WIDGET_DSP_CTRL, 0, reg, data);
1630                 if ((res >= 0) && (res != VENDOR_STATUS_DSPIO_BUSY))
1631                         return res;
1632                 msleep(20);
1633         } while (time_before(jiffies, timeout));
1634
1635         return -EIO;
1636 }
1637
1638 /*
1639  * Wait for DSP to be ready for commands
1640  */
1641 static void dspio_write_wait(struct hda_codec *codec)
1642 {
1643         int status;
1644         unsigned long timeout = jiffies + msecs_to_jiffies(1000);
1645
1646         do {
1647                 status = snd_hda_codec_read(codec, WIDGET_DSP_CTRL, 0,
1648                                                 VENDOR_DSPIO_STATUS, 0);
1649                 if ((status == VENDOR_STATUS_DSPIO_OK) ||
1650                     (status == VENDOR_STATUS_DSPIO_SCP_RESPONSE_QUEUE_EMPTY))
1651                         break;
1652                 msleep(1);
1653         } while (time_before(jiffies, timeout));
1654 }
1655
1656 /*
1657  * Write SCP data to DSP
1658  */
1659 static int dspio_write(struct hda_codec *codec, unsigned int scp_data)
1660 {
1661         struct ca0132_spec *spec = codec->spec;
1662         int status;
1663
1664         dspio_write_wait(codec);
1665
1666         mutex_lock(&spec->chipio_mutex);
1667         status = dspio_send(codec, VENDOR_DSPIO_SCP_WRITE_DATA_LOW,
1668                             scp_data & 0xffff);
1669         if (status < 0)
1670                 goto error;
1671
1672         status = dspio_send(codec, VENDOR_DSPIO_SCP_WRITE_DATA_HIGH,
1673                                     scp_data >> 16);
1674         if (status < 0)
1675                 goto error;
1676
1677         /* OK, now check if the write itself has executed*/
1678         status = snd_hda_codec_read(codec, WIDGET_DSP_CTRL, 0,
1679                                     VENDOR_DSPIO_STATUS, 0);
1680 error:
1681         mutex_unlock(&spec->chipio_mutex);
1682
1683         return (status == VENDOR_STATUS_DSPIO_SCP_COMMAND_QUEUE_FULL) ?
1684                         -EIO : 0;
1685 }
1686
1687 /*
1688  * Write multiple SCP data to DSP
1689  */
1690 static int dspio_write_multiple(struct hda_codec *codec,
1691                                 unsigned int *buffer, unsigned int size)
1692 {
1693         int status = 0;
1694         unsigned int count;
1695
1696         if (buffer == NULL)
1697                 return -EINVAL;
1698
1699         count = 0;
1700         while (count < size) {
1701                 status = dspio_write(codec, *buffer++);
1702                 if (status != 0)
1703                         break;
1704                 count++;
1705         }
1706
1707         return status;
1708 }
1709
1710 static int dspio_read(struct hda_codec *codec, unsigned int *data)
1711 {
1712         int status;
1713
1714         status = dspio_send(codec, VENDOR_DSPIO_SCP_POST_READ_DATA, 0);
1715         if (status == -EIO)
1716                 return status;
1717
1718         status = dspio_send(codec, VENDOR_DSPIO_STATUS, 0);
1719         if (status == -EIO ||
1720             status == VENDOR_STATUS_DSPIO_SCP_RESPONSE_QUEUE_EMPTY)
1721                 return -EIO;
1722
1723         *data = snd_hda_codec_read(codec, WIDGET_DSP_CTRL, 0,
1724                                    VENDOR_DSPIO_SCP_READ_DATA, 0);
1725
1726         return 0;
1727 }
1728
1729 static int dspio_read_multiple(struct hda_codec *codec, unsigned int *buffer,
1730                                unsigned int *buf_size, unsigned int size_count)
1731 {
1732         int status = 0;
1733         unsigned int size = *buf_size;
1734         unsigned int count;
1735         unsigned int skip_count;
1736         unsigned int dummy;
1737
1738         if (buffer == NULL)
1739                 return -1;
1740
1741         count = 0;
1742         while (count < size && count < size_count) {
1743                 status = dspio_read(codec, buffer++);
1744                 if (status != 0)
1745                         break;
1746                 count++;
1747         }
1748
1749         skip_count = count;
1750         if (status == 0) {
1751                 while (skip_count < size) {
1752                         status = dspio_read(codec, &dummy);
1753                         if (status != 0)
1754                                 break;
1755                         skip_count++;
1756                 }
1757         }
1758         *buf_size = count;
1759
1760         return status;
1761 }
1762
1763 /*
1764  * Construct the SCP header using corresponding fields
1765  */
1766 static inline unsigned int
1767 make_scp_header(unsigned int target_id, unsigned int source_id,
1768                 unsigned int get_flag, unsigned int req,
1769                 unsigned int device_flag, unsigned int resp_flag,
1770                 unsigned int error_flag, unsigned int data_size)
1771 {
1772         unsigned int header = 0;
1773
1774         header = (data_size & 0x1f) << 27;
1775         header |= (error_flag & 0x01) << 26;
1776         header |= (resp_flag & 0x01) << 25;
1777         header |= (device_flag & 0x01) << 24;
1778         header |= (req & 0x7f) << 17;
1779         header |= (get_flag & 0x01) << 16;
1780         header |= (source_id & 0xff) << 8;
1781         header |= target_id & 0xff;
1782
1783         return header;
1784 }
1785
1786 /*
1787  * Extract corresponding fields from SCP header
1788  */
1789 static inline void
1790 extract_scp_header(unsigned int header,
1791                    unsigned int *target_id, unsigned int *source_id,
1792                    unsigned int *get_flag, unsigned int *req,
1793                    unsigned int *device_flag, unsigned int *resp_flag,
1794                    unsigned int *error_flag, unsigned int *data_size)
1795 {
1796         if (data_size)
1797                 *data_size = (header >> 27) & 0x1f;
1798         if (error_flag)
1799                 *error_flag = (header >> 26) & 0x01;
1800         if (resp_flag)
1801                 *resp_flag = (header >> 25) & 0x01;
1802         if (device_flag)
1803                 *device_flag = (header >> 24) & 0x01;
1804         if (req)
1805                 *req = (header >> 17) & 0x7f;
1806         if (get_flag)
1807                 *get_flag = (header >> 16) & 0x01;
1808         if (source_id)
1809                 *source_id = (header >> 8) & 0xff;
1810         if (target_id)
1811                 *target_id = header & 0xff;
1812 }
1813
1814 #define SCP_MAX_DATA_WORDS  (16)
1815
1816 /* Structure to contain any SCP message */
1817 struct scp_msg {
1818         unsigned int hdr;
1819         unsigned int data[SCP_MAX_DATA_WORDS];
1820 };
1821
1822 static void dspio_clear_response_queue(struct hda_codec *codec)
1823 {
1824         unsigned int dummy = 0;
1825         int status = -1;
1826
1827         /* clear all from the response queue */
1828         do {
1829                 status = dspio_read(codec, &dummy);
1830         } while (status == 0);
1831 }
1832
1833 static int dspio_get_response_data(struct hda_codec *codec)
1834 {
1835         struct ca0132_spec *spec = codec->spec;
1836         unsigned int data = 0;
1837         unsigned int count;
1838
1839         if (dspio_read(codec, &data) < 0)
1840                 return -EIO;
1841
1842         if ((data & 0x00ffffff) == spec->wait_scp_header) {
1843                 spec->scp_resp_header = data;
1844                 spec->scp_resp_count = data >> 27;
1845                 count = spec->wait_num_data;
1846                 dspio_read_multiple(codec, spec->scp_resp_data,
1847                                     &spec->scp_resp_count, count);
1848                 return 0;
1849         }
1850
1851         return -EIO;
1852 }
1853
1854 /*
1855  * Send SCP message to DSP
1856  */
1857 static int dspio_send_scp_message(struct hda_codec *codec,
1858                                   unsigned char *send_buf,
1859                                   unsigned int send_buf_size,
1860                                   unsigned char *return_buf,
1861                                   unsigned int return_buf_size,
1862                                   unsigned int *bytes_returned)
1863 {
1864         struct ca0132_spec *spec = codec->spec;
1865         int status = -1;
1866         unsigned int scp_send_size = 0;
1867         unsigned int total_size;
1868         bool waiting_for_resp = false;
1869         unsigned int header;
1870         struct scp_msg *ret_msg;
1871         unsigned int resp_src_id, resp_target_id;
1872         unsigned int data_size, src_id, target_id, get_flag, device_flag;
1873
1874         if (bytes_returned)
1875                 *bytes_returned = 0;
1876
1877         /* get scp header from buffer */
1878         header = *((unsigned int *)send_buf);
1879         extract_scp_header(header, &target_id, &src_id, &get_flag, NULL,
1880                            &device_flag, NULL, NULL, &data_size);
1881         scp_send_size = data_size + 1;
1882         total_size = (scp_send_size * 4);
1883
1884         if (send_buf_size < total_size)
1885                 return -EINVAL;
1886
1887         if (get_flag || device_flag) {
1888                 if (!return_buf || return_buf_size < 4 || !bytes_returned)
1889                         return -EINVAL;
1890
1891                 spec->wait_scp_header = *((unsigned int *)send_buf);
1892
1893                 /* swap source id with target id */
1894                 resp_target_id = src_id;
1895                 resp_src_id = target_id;
1896                 spec->wait_scp_header &= 0xffff0000;
1897                 spec->wait_scp_header |= (resp_src_id << 8) | (resp_target_id);
1898                 spec->wait_num_data = return_buf_size/sizeof(unsigned int) - 1;
1899                 spec->wait_scp = 1;
1900                 waiting_for_resp = true;
1901         }
1902
1903         status = dspio_write_multiple(codec, (unsigned int *)send_buf,
1904                                       scp_send_size);
1905         if (status < 0) {
1906                 spec->wait_scp = 0;
1907                 return status;
1908         }
1909
1910         if (waiting_for_resp) {
1911                 unsigned long timeout = jiffies + msecs_to_jiffies(1000);
1912                 memset(return_buf, 0, return_buf_size);
1913                 do {
1914                         msleep(20);
1915                 } while (spec->wait_scp && time_before(jiffies, timeout));
1916                 waiting_for_resp = false;
1917                 if (!spec->wait_scp) {
1918                         ret_msg = (struct scp_msg *)return_buf;
1919                         memcpy(&ret_msg->hdr, &spec->scp_resp_header, 4);
1920                         memcpy(&ret_msg->data, spec->scp_resp_data,
1921                                spec->wait_num_data);
1922                         *bytes_returned = (spec->scp_resp_count + 1) * 4;
1923                         status = 0;
1924                 } else {
1925                         status = -EIO;
1926                 }
1927                 spec->wait_scp = 0;
1928         }
1929
1930         return status;
1931 }
1932
1933 /**
1934  * Prepare and send the SCP message to DSP
1935  * @codec: the HDA codec
1936  * @mod_id: ID of the DSP module to send the command
1937  * @req: ID of request to send to the DSP module
1938  * @dir: SET or GET
1939  * @data: pointer to the data to send with the request, request specific
1940  * @len: length of the data, in bytes
1941  * @reply: point to the buffer to hold data returned for a reply
1942  * @reply_len: length of the reply buffer returned from GET
1943  *
1944  * Returns zero or a negative error code.
1945  */
1946 static int dspio_scp(struct hda_codec *codec,
1947                 int mod_id, int src_id, int req, int dir, const void *data,
1948                 unsigned int len, void *reply, unsigned int *reply_len)
1949 {
1950         int status = 0;
1951         struct scp_msg scp_send, scp_reply;
1952         unsigned int ret_bytes, send_size, ret_size;
1953         unsigned int send_get_flag, reply_resp_flag, reply_error_flag;
1954         unsigned int reply_data_size;
1955
1956         memset(&scp_send, 0, sizeof(scp_send));
1957         memset(&scp_reply, 0, sizeof(scp_reply));
1958
1959         if ((len != 0 && data == NULL) || (len > SCP_MAX_DATA_WORDS))
1960                 return -EINVAL;
1961
1962         if (dir == SCP_GET && reply == NULL) {
1963                 codec_dbg(codec, "dspio_scp get but has no buffer\n");
1964                 return -EINVAL;
1965         }
1966
1967         if (reply != NULL && (reply_len == NULL || (*reply_len == 0))) {
1968                 codec_dbg(codec, "dspio_scp bad resp buf len parms\n");
1969                 return -EINVAL;
1970         }
1971
1972         scp_send.hdr = make_scp_header(mod_id, src_id, (dir == SCP_GET), req,
1973                                        0, 0, 0, len/sizeof(unsigned int));
1974         if (data != NULL && len > 0) {
1975                 len = min((unsigned int)(sizeof(scp_send.data)), len);
1976                 memcpy(scp_send.data, data, len);
1977         }
1978
1979         ret_bytes = 0;
1980         send_size = sizeof(unsigned int) + len;
1981         status = dspio_send_scp_message(codec, (unsigned char *)&scp_send,
1982                                         send_size, (unsigned char *)&scp_reply,
1983                                         sizeof(scp_reply), &ret_bytes);
1984
1985         if (status < 0) {
1986                 codec_dbg(codec, "dspio_scp: send scp msg failed\n");
1987                 return status;
1988         }
1989
1990         /* extract send and reply headers members */
1991         extract_scp_header(scp_send.hdr, NULL, NULL, &send_get_flag,
1992                            NULL, NULL, NULL, NULL, NULL);
1993         extract_scp_header(scp_reply.hdr, NULL, NULL, NULL, NULL, NULL,
1994                            &reply_resp_flag, &reply_error_flag,
1995                            &reply_data_size);
1996
1997         if (!send_get_flag)
1998                 return 0;
1999
2000         if (reply_resp_flag && !reply_error_flag) {
2001                 ret_size = (ret_bytes - sizeof(scp_reply.hdr))
2002                                         / sizeof(unsigned int);
2003
2004                 if (*reply_len < ret_size*sizeof(unsigned int)) {
2005                         codec_dbg(codec, "reply too long for buf\n");
2006                         return -EINVAL;
2007                 } else if (ret_size != reply_data_size) {
2008                         codec_dbg(codec, "RetLen and HdrLen .NE.\n");
2009                         return -EINVAL;
2010                 } else if (!reply) {
2011                         codec_dbg(codec, "NULL reply\n");
2012                         return -EINVAL;
2013                 } else {
2014                         *reply_len = ret_size*sizeof(unsigned int);
2015                         memcpy(reply, scp_reply.data, *reply_len);
2016                 }
2017         } else {
2018                 codec_dbg(codec, "reply ill-formed or errflag set\n");
2019                 return -EIO;
2020         }
2021
2022         return status;
2023 }
2024
2025 /*
2026  * Set DSP parameters
2027  */
2028 static int dspio_set_param(struct hda_codec *codec, int mod_id,
2029                         int src_id, int req, const void *data, unsigned int len)
2030 {
2031         return dspio_scp(codec, mod_id, src_id, req, SCP_SET, data, len, NULL,
2032                         NULL);
2033 }
2034
2035 static int dspio_set_uint_param(struct hda_codec *codec, int mod_id,
2036                         int req, const unsigned int data)
2037 {
2038         return dspio_set_param(codec, mod_id, 0x20, req, &data,
2039                         sizeof(unsigned int));
2040 }
2041
2042 static int dspio_set_uint_param_no_source(struct hda_codec *codec, int mod_id,
2043                         int req, const unsigned int data)
2044 {
2045         return dspio_set_param(codec, mod_id, 0x00, req, &data,
2046                         sizeof(unsigned int));
2047 }
2048
2049 /*
2050  * Allocate a DSP DMA channel via an SCP message
2051  */
2052 static int dspio_alloc_dma_chan(struct hda_codec *codec, unsigned int *dma_chan)
2053 {
2054         int status = 0;
2055         unsigned int size = sizeof(dma_chan);
2056
2057         codec_dbg(codec, "     dspio_alloc_dma_chan() -- begin\n");
2058         status = dspio_scp(codec, MASTERCONTROL, 0x20,
2059                         MASTERCONTROL_ALLOC_DMA_CHAN, SCP_GET, NULL, 0,
2060                         dma_chan, &size);
2061
2062         if (status < 0) {
2063                 codec_dbg(codec, "dspio_alloc_dma_chan: SCP Failed\n");
2064                 return status;
2065         }
2066
2067         if ((*dma_chan + 1) == 0) {
2068                 codec_dbg(codec, "no free dma channels to allocate\n");
2069                 return -EBUSY;
2070         }
2071
2072         codec_dbg(codec, "dspio_alloc_dma_chan: chan=%d\n", *dma_chan);
2073         codec_dbg(codec, "     dspio_alloc_dma_chan() -- complete\n");
2074
2075         return status;
2076 }
2077
2078 /*
2079  * Free a DSP DMA via an SCP message
2080  */
2081 static int dspio_free_dma_chan(struct hda_codec *codec, unsigned int dma_chan)
2082 {
2083         int status = 0;
2084         unsigned int dummy = 0;
2085
2086         codec_dbg(codec, "     dspio_free_dma_chan() -- begin\n");
2087         codec_dbg(codec, "dspio_free_dma_chan: chan=%d\n", dma_chan);
2088
2089         status = dspio_scp(codec, MASTERCONTROL, 0x20,
2090                         MASTERCONTROL_ALLOC_DMA_CHAN, SCP_SET, &dma_chan,
2091                         sizeof(dma_chan), NULL, &dummy);
2092
2093         if (status < 0) {
2094                 codec_dbg(codec, "dspio_free_dma_chan: SCP Failed\n");
2095                 return status;
2096         }
2097
2098         codec_dbg(codec, "     dspio_free_dma_chan() -- complete\n");
2099
2100         return status;
2101 }
2102
2103 /*
2104  * (Re)start the DSP
2105  */
2106 static int dsp_set_run_state(struct hda_codec *codec)
2107 {
2108         unsigned int dbg_ctrl_reg;
2109         unsigned int halt_state;
2110         int err;
2111
2112         err = chipio_read(codec, DSP_DBGCNTL_INST_OFFSET, &dbg_ctrl_reg);
2113         if (err < 0)
2114                 return err;
2115
2116         halt_state = (dbg_ctrl_reg & DSP_DBGCNTL_STATE_MASK) >>
2117                       DSP_DBGCNTL_STATE_LOBIT;
2118
2119         if (halt_state != 0) {
2120                 dbg_ctrl_reg &= ~((halt_state << DSP_DBGCNTL_SS_LOBIT) &
2121                                   DSP_DBGCNTL_SS_MASK);
2122                 err = chipio_write(codec, DSP_DBGCNTL_INST_OFFSET,
2123                                    dbg_ctrl_reg);
2124                 if (err < 0)
2125                         return err;
2126
2127                 dbg_ctrl_reg |= (halt_state << DSP_DBGCNTL_EXEC_LOBIT) &
2128                                 DSP_DBGCNTL_EXEC_MASK;
2129                 err = chipio_write(codec, DSP_DBGCNTL_INST_OFFSET,
2130                                    dbg_ctrl_reg);
2131                 if (err < 0)
2132                         return err;
2133         }
2134
2135         return 0;
2136 }
2137
2138 /*
2139  * Reset the DSP
2140  */
2141 static int dsp_reset(struct hda_codec *codec)
2142 {
2143         unsigned int res;
2144         int retry = 20;
2145
2146         codec_dbg(codec, "dsp_reset\n");
2147         do {
2148                 res = dspio_send(codec, VENDOR_DSPIO_DSP_INIT, 0);
2149                 retry--;
2150         } while (res == -EIO && retry);
2151
2152         if (!retry) {
2153                 codec_dbg(codec, "dsp_reset timeout\n");
2154                 return -EIO;
2155         }
2156
2157         return 0;
2158 }
2159
2160 /*
2161  * Convert chip address to DSP address
2162  */
2163 static unsigned int dsp_chip_to_dsp_addx(unsigned int chip_addx,
2164                                         bool *code, bool *yram)
2165 {
2166         *code = *yram = false;
2167
2168         if (UC_RANGE(chip_addx, 1)) {
2169                 *code = true;
2170                 return UC_OFF(chip_addx);
2171         } else if (X_RANGE_ALL(chip_addx, 1)) {
2172                 return X_OFF(chip_addx);
2173         } else if (Y_RANGE_ALL(chip_addx, 1)) {
2174                 *yram = true;
2175                 return Y_OFF(chip_addx);
2176         }
2177
2178         return INVALID_CHIP_ADDRESS;
2179 }
2180
2181 /*
2182  * Check if the DSP DMA is active
2183  */
2184 static bool dsp_is_dma_active(struct hda_codec *codec, unsigned int dma_chan)
2185 {
2186         unsigned int dma_chnlstart_reg;
2187
2188         chipio_read(codec, DSPDMAC_CHNLSTART_INST_OFFSET, &dma_chnlstart_reg);
2189
2190         return ((dma_chnlstart_reg & (1 <<
2191                         (DSPDMAC_CHNLSTART_EN_LOBIT + dma_chan))) != 0);
2192 }
2193
2194 static int dsp_dma_setup_common(struct hda_codec *codec,
2195                                 unsigned int chip_addx,
2196                                 unsigned int dma_chan,
2197                                 unsigned int port_map_mask,
2198                                 bool ovly)
2199 {
2200         int status = 0;
2201         unsigned int chnl_prop;
2202         unsigned int dsp_addx;
2203         unsigned int active;
2204         bool code, yram;
2205
2206         codec_dbg(codec, "-- dsp_dma_setup_common() -- Begin ---------\n");
2207
2208         if (dma_chan >= DSPDMAC_DMA_CFG_CHANNEL_COUNT) {
2209                 codec_dbg(codec, "dma chan num invalid\n");
2210                 return -EINVAL;
2211         }
2212
2213         if (dsp_is_dma_active(codec, dma_chan)) {
2214                 codec_dbg(codec, "dma already active\n");
2215                 return -EBUSY;
2216         }
2217
2218         dsp_addx = dsp_chip_to_dsp_addx(chip_addx, &code, &yram);
2219
2220         if (dsp_addx == INVALID_CHIP_ADDRESS) {
2221                 codec_dbg(codec, "invalid chip addr\n");
2222                 return -ENXIO;
2223         }
2224
2225         chnl_prop = DSPDMAC_CHNLPROP_AC_MASK;
2226         active = 0;
2227
2228         codec_dbg(codec, "   dsp_dma_setup_common()    start reg pgm\n");
2229
2230         if (ovly) {
2231                 status = chipio_read(codec, DSPDMAC_CHNLPROP_INST_OFFSET,
2232                                      &chnl_prop);
2233
2234                 if (status < 0) {
2235                         codec_dbg(codec, "read CHNLPROP Reg fail\n");
2236                         return status;
2237                 }
2238                 codec_dbg(codec, "dsp_dma_setup_common() Read CHNLPROP\n");
2239         }
2240
2241         if (!code)
2242                 chnl_prop &= ~(1 << (DSPDMAC_CHNLPROP_MSPCE_LOBIT + dma_chan));
2243         else
2244                 chnl_prop |=  (1 << (DSPDMAC_CHNLPROP_MSPCE_LOBIT + dma_chan));
2245
2246         chnl_prop &= ~(1 << (DSPDMAC_CHNLPROP_DCON_LOBIT + dma_chan));
2247
2248         status = chipio_write(codec, DSPDMAC_CHNLPROP_INST_OFFSET, chnl_prop);
2249         if (status < 0) {
2250                 codec_dbg(codec, "write CHNLPROP Reg fail\n");
2251                 return status;
2252         }
2253         codec_dbg(codec, "   dsp_dma_setup_common()    Write CHNLPROP\n");
2254
2255         if (ovly) {
2256                 status = chipio_read(codec, DSPDMAC_ACTIVE_INST_OFFSET,
2257                                      &active);
2258
2259                 if (status < 0) {
2260                         codec_dbg(codec, "read ACTIVE Reg fail\n");
2261                         return status;
2262                 }
2263                 codec_dbg(codec, "dsp_dma_setup_common() Read ACTIVE\n");
2264         }
2265
2266         active &= (~(1 << (DSPDMAC_ACTIVE_AAR_LOBIT + dma_chan))) &
2267                 DSPDMAC_ACTIVE_AAR_MASK;
2268
2269         status = chipio_write(codec, DSPDMAC_ACTIVE_INST_OFFSET, active);
2270         if (status < 0) {
2271                 codec_dbg(codec, "write ACTIVE Reg fail\n");
2272                 return status;
2273         }
2274
2275         codec_dbg(codec, "   dsp_dma_setup_common()    Write ACTIVE\n");
2276
2277         status = chipio_write(codec, DSPDMAC_AUDCHSEL_INST_OFFSET(dma_chan),
2278                               port_map_mask);
2279         if (status < 0) {
2280                 codec_dbg(codec, "write AUDCHSEL Reg fail\n");
2281                 return status;
2282         }
2283         codec_dbg(codec, "   dsp_dma_setup_common()    Write AUDCHSEL\n");
2284
2285         status = chipio_write(codec, DSPDMAC_IRQCNT_INST_OFFSET(dma_chan),
2286                         DSPDMAC_IRQCNT_BICNT_MASK | DSPDMAC_IRQCNT_CICNT_MASK);
2287         if (status < 0) {
2288                 codec_dbg(codec, "write IRQCNT Reg fail\n");
2289                 return status;
2290         }
2291         codec_dbg(codec, "   dsp_dma_setup_common()    Write IRQCNT\n");
2292
2293         codec_dbg(codec,
2294                    "ChipA=0x%x,DspA=0x%x,dmaCh=%u, "
2295                    "CHSEL=0x%x,CHPROP=0x%x,Active=0x%x\n",
2296                    chip_addx, dsp_addx, dma_chan,
2297                    port_map_mask, chnl_prop, active);
2298
2299         codec_dbg(codec, "-- dsp_dma_setup_common() -- Complete ------\n");
2300
2301         return 0;
2302 }
2303
2304 /*
2305  * Setup the DSP DMA per-transfer-specific registers
2306  */
2307 static int dsp_dma_setup(struct hda_codec *codec,
2308                         unsigned int chip_addx,
2309                         unsigned int count,
2310                         unsigned int dma_chan)
2311 {
2312         int status = 0;
2313         bool code, yram;
2314         unsigned int dsp_addx;
2315         unsigned int addr_field;
2316         unsigned int incr_field;
2317         unsigned int base_cnt;
2318         unsigned int cur_cnt;
2319         unsigned int dma_cfg = 0;
2320         unsigned int adr_ofs = 0;
2321         unsigned int xfr_cnt = 0;
2322         const unsigned int max_dma_count = 1 << (DSPDMAC_XFRCNT_BCNT_HIBIT -
2323                                                 DSPDMAC_XFRCNT_BCNT_LOBIT + 1);
2324
2325         codec_dbg(codec, "-- dsp_dma_setup() -- Begin ---------\n");
2326
2327         if (count > max_dma_count) {
2328                 codec_dbg(codec, "count too big\n");
2329                 return -EINVAL;
2330         }
2331
2332         dsp_addx = dsp_chip_to_dsp_addx(chip_addx, &code, &yram);
2333         if (dsp_addx == INVALID_CHIP_ADDRESS) {
2334                 codec_dbg(codec, "invalid chip addr\n");
2335                 return -ENXIO;
2336         }
2337
2338         codec_dbg(codec, "   dsp_dma_setup()    start reg pgm\n");
2339
2340         addr_field = dsp_addx << DSPDMAC_DMACFG_DBADR_LOBIT;
2341         incr_field   = 0;
2342
2343         if (!code) {
2344                 addr_field <<= 1;
2345                 if (yram)
2346                         addr_field |= (1 << DSPDMAC_DMACFG_DBADR_LOBIT);
2347
2348                 incr_field  = (1 << DSPDMAC_DMACFG_AINCR_LOBIT);
2349         }
2350
2351         dma_cfg = addr_field + incr_field;
2352         status = chipio_write(codec, DSPDMAC_DMACFG_INST_OFFSET(dma_chan),
2353                                 dma_cfg);
2354         if (status < 0) {
2355                 codec_dbg(codec, "write DMACFG Reg fail\n");
2356                 return status;
2357         }
2358         codec_dbg(codec, "   dsp_dma_setup()    Write DMACFG\n");
2359
2360         adr_ofs = (count - 1) << (DSPDMAC_DSPADROFS_BOFS_LOBIT +
2361                                                         (code ? 0 : 1));
2362
2363         status = chipio_write(codec, DSPDMAC_DSPADROFS_INST_OFFSET(dma_chan),
2364                                 adr_ofs);
2365         if (status < 0) {
2366                 codec_dbg(codec, "write DSPADROFS Reg fail\n");
2367                 return status;
2368         }
2369         codec_dbg(codec, "   dsp_dma_setup()    Write DSPADROFS\n");
2370
2371         base_cnt = (count - 1) << DSPDMAC_XFRCNT_BCNT_LOBIT;
2372
2373         cur_cnt  = (count - 1) << DSPDMAC_XFRCNT_CCNT_LOBIT;
2374
2375         xfr_cnt = base_cnt | cur_cnt;
2376
2377         status = chipio_write(codec,
2378                                 DSPDMAC_XFRCNT_INST_OFFSET(dma_chan), xfr_cnt);
2379         if (status < 0) {
2380                 codec_dbg(codec, "write XFRCNT Reg fail\n");
2381                 return status;
2382         }
2383         codec_dbg(codec, "   dsp_dma_setup()    Write XFRCNT\n");
2384
2385         codec_dbg(codec,
2386                    "ChipA=0x%x, cnt=0x%x, DMACFG=0x%x, "
2387                    "ADROFS=0x%x, XFRCNT=0x%x\n",
2388                    chip_addx, count, dma_cfg, adr_ofs, xfr_cnt);
2389
2390         codec_dbg(codec, "-- dsp_dma_setup() -- Complete ---------\n");
2391
2392         return 0;
2393 }
2394
2395 /*
2396  * Start the DSP DMA
2397  */
2398 static int dsp_dma_start(struct hda_codec *codec,
2399                          unsigned int dma_chan, bool ovly)
2400 {
2401         unsigned int reg = 0;
2402         int status = 0;
2403
2404         codec_dbg(codec, "-- dsp_dma_start() -- Begin ---------\n");
2405
2406         if (ovly) {
2407                 status = chipio_read(codec,
2408                                      DSPDMAC_CHNLSTART_INST_OFFSET, &reg);
2409
2410                 if (status < 0) {
2411                         codec_dbg(codec, "read CHNLSTART reg fail\n");
2412                         return status;
2413                 }
2414                 codec_dbg(codec, "-- dsp_dma_start()    Read CHNLSTART\n");
2415
2416                 reg &= ~(DSPDMAC_CHNLSTART_EN_MASK |
2417                                 DSPDMAC_CHNLSTART_DIS_MASK);
2418         }
2419
2420         status = chipio_write(codec, DSPDMAC_CHNLSTART_INST_OFFSET,
2421                         reg | (1 << (dma_chan + DSPDMAC_CHNLSTART_EN_LOBIT)));
2422         if (status < 0) {
2423                 codec_dbg(codec, "write CHNLSTART reg fail\n");
2424                 return status;
2425         }
2426         codec_dbg(codec, "-- dsp_dma_start() -- Complete ---------\n");
2427
2428         return status;
2429 }
2430
2431 /*
2432  * Stop the DSP DMA
2433  */
2434 static int dsp_dma_stop(struct hda_codec *codec,
2435                         unsigned int dma_chan, bool ovly)
2436 {
2437         unsigned int reg = 0;
2438         int status = 0;
2439
2440         codec_dbg(codec, "-- dsp_dma_stop() -- Begin ---------\n");
2441
2442         if (ovly) {
2443                 status = chipio_read(codec,
2444                                      DSPDMAC_CHNLSTART_INST_OFFSET, &reg);
2445
2446                 if (status < 0) {
2447                         codec_dbg(codec, "read CHNLSTART reg fail\n");
2448                         return status;
2449                 }
2450                 codec_dbg(codec, "-- dsp_dma_stop()    Read CHNLSTART\n");
2451                 reg &= ~(DSPDMAC_CHNLSTART_EN_MASK |
2452                                 DSPDMAC_CHNLSTART_DIS_MASK);
2453         }
2454
2455         status = chipio_write(codec, DSPDMAC_CHNLSTART_INST_OFFSET,
2456                         reg | (1 << (dma_chan + DSPDMAC_CHNLSTART_DIS_LOBIT)));
2457         if (status < 0) {
2458                 codec_dbg(codec, "write CHNLSTART reg fail\n");
2459                 return status;
2460         }
2461         codec_dbg(codec, "-- dsp_dma_stop() -- Complete ---------\n");
2462
2463         return status;
2464 }
2465
2466 /**
2467  * Allocate router ports
2468  *
2469  * @codec: the HDA codec
2470  * @num_chans: number of channels in the stream
2471  * @ports_per_channel: number of ports per channel
2472  * @start_device: start device
2473  * @port_map: pointer to the port list to hold the allocated ports
2474  *
2475  * Returns zero or a negative error code.
2476  */
2477 static int dsp_allocate_router_ports(struct hda_codec *codec,
2478                                      unsigned int num_chans,
2479                                      unsigned int ports_per_channel,
2480                                      unsigned int start_device,
2481                                      unsigned int *port_map)
2482 {
2483         int status = 0;
2484         int res;
2485         u8 val;
2486
2487         status = chipio_send(codec, VENDOR_CHIPIO_STATUS, 0);
2488         if (status < 0)
2489                 return status;
2490
2491         val = start_device << 6;
2492         val |= (ports_per_channel - 1) << 4;
2493         val |= num_chans - 1;
2494
2495         snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
2496                             VENDOR_CHIPIO_PORT_ALLOC_CONFIG_SET,
2497                             val);
2498
2499         snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
2500                             VENDOR_CHIPIO_PORT_ALLOC_SET,
2501                             MEM_CONNID_DSP);
2502
2503         status = chipio_send(codec, VENDOR_CHIPIO_STATUS, 0);
2504         if (status < 0)
2505                 return status;
2506
2507         res = snd_hda_codec_read(codec, WIDGET_CHIP_CTRL, 0,
2508                                 VENDOR_CHIPIO_PORT_ALLOC_GET, 0);
2509
2510         *port_map = res;
2511
2512         return (res < 0) ? res : 0;
2513 }
2514
2515 /*
2516  * Free router ports
2517  */
2518 static int dsp_free_router_ports(struct hda_codec *codec)
2519 {
2520         int status = 0;
2521
2522         status = chipio_send(codec, VENDOR_CHIPIO_STATUS, 0);
2523         if (status < 0)
2524                 return status;
2525
2526         snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
2527                             VENDOR_CHIPIO_PORT_FREE_SET,
2528                             MEM_CONNID_DSP);
2529
2530         status = chipio_send(codec, VENDOR_CHIPIO_STATUS, 0);
2531
2532         return status;
2533 }
2534
2535 /*
2536  * Allocate DSP ports for the download stream
2537  */
2538 static int dsp_allocate_ports(struct hda_codec *codec,
2539                         unsigned int num_chans,
2540                         unsigned int rate_multi, unsigned int *port_map)
2541 {
2542         int status;
2543
2544         codec_dbg(codec, "     dsp_allocate_ports() -- begin\n");
2545
2546         if ((rate_multi != 1) && (rate_multi != 2) && (rate_multi != 4)) {
2547                 codec_dbg(codec, "bad rate multiple\n");
2548                 return -EINVAL;
2549         }
2550
2551         status = dsp_allocate_router_ports(codec, num_chans,
2552                                            rate_multi, 0, port_map);
2553
2554         codec_dbg(codec, "     dsp_allocate_ports() -- complete\n");
2555
2556         return status;
2557 }
2558
2559 static int dsp_allocate_ports_format(struct hda_codec *codec,
2560                         const unsigned short fmt,
2561                         unsigned int *port_map)
2562 {
2563         int status;
2564         unsigned int num_chans;
2565
2566         unsigned int sample_rate_div = ((get_hdafmt_rate(fmt) >> 0) & 3) + 1;
2567         unsigned int sample_rate_mul = ((get_hdafmt_rate(fmt) >> 3) & 3) + 1;
2568         unsigned int rate_multi = sample_rate_mul / sample_rate_div;
2569
2570         if ((rate_multi != 1) && (rate_multi != 2) && (rate_multi != 4)) {
2571                 codec_dbg(codec, "bad rate multiple\n");
2572                 return -EINVAL;
2573         }
2574
2575         num_chans = get_hdafmt_chs(fmt) + 1;
2576
2577         status = dsp_allocate_ports(codec, num_chans, rate_multi, port_map);
2578
2579         return status;
2580 }
2581
2582 /*
2583  * free DSP ports
2584  */
2585 static int dsp_free_ports(struct hda_codec *codec)
2586 {
2587         int status;
2588
2589         codec_dbg(codec, "     dsp_free_ports() -- begin\n");
2590
2591         status = dsp_free_router_ports(codec);
2592         if (status < 0) {
2593                 codec_dbg(codec, "free router ports fail\n");
2594                 return status;
2595         }
2596         codec_dbg(codec, "     dsp_free_ports() -- complete\n");
2597
2598         return status;
2599 }
2600
2601 /*
2602  *  HDA DMA engine stuffs for DSP code download
2603  */
2604 struct dma_engine {
2605         struct hda_codec *codec;
2606         unsigned short m_converter_format;
2607         struct snd_dma_buffer *dmab;
2608         unsigned int buf_size;
2609 };
2610
2611
2612 enum dma_state {
2613         DMA_STATE_STOP  = 0,
2614         DMA_STATE_RUN   = 1
2615 };
2616
2617 static int dma_convert_to_hda_format(struct hda_codec *codec,
2618                 unsigned int sample_rate,
2619                 unsigned short channels,
2620                 unsigned short *hda_format)
2621 {
2622         unsigned int format_val;
2623
2624         format_val = snd_hdac_calc_stream_format(sample_rate,
2625                                 channels, SNDRV_PCM_FORMAT_S32_LE, 32, 0);
2626
2627         if (hda_format)
2628                 *hda_format = (unsigned short)format_val;
2629
2630         return 0;
2631 }
2632
2633 /*
2634  *  Reset DMA for DSP download
2635  */
2636 static int dma_reset(struct dma_engine *dma)
2637 {
2638         struct hda_codec *codec = dma->codec;
2639         struct ca0132_spec *spec = codec->spec;
2640         int status;
2641
2642         if (dma->dmab->area)
2643                 snd_hda_codec_load_dsp_cleanup(codec, dma->dmab);
2644
2645         status = snd_hda_codec_load_dsp_prepare(codec,
2646                         dma->m_converter_format,
2647                         dma->buf_size,
2648                         dma->dmab);
2649         if (status < 0)
2650                 return status;
2651         spec->dsp_stream_id = status;
2652         return 0;
2653 }
2654
2655 static int dma_set_state(struct dma_engine *dma, enum dma_state state)
2656 {
2657         bool cmd;
2658
2659         switch (state) {
2660         case DMA_STATE_STOP:
2661                 cmd = false;
2662                 break;
2663         case DMA_STATE_RUN:
2664                 cmd = true;
2665                 break;
2666         default:
2667                 return 0;
2668         }
2669
2670         snd_hda_codec_load_dsp_trigger(dma->codec, cmd);
2671         return 0;
2672 }
2673
2674 static unsigned int dma_get_buffer_size(struct dma_engine *dma)
2675 {
2676         return dma->dmab->bytes;
2677 }
2678
2679 static unsigned char *dma_get_buffer_addr(struct dma_engine *dma)
2680 {
2681         return dma->dmab->area;
2682 }
2683
2684 static int dma_xfer(struct dma_engine *dma,
2685                 const unsigned int *data,
2686                 unsigned int count)
2687 {
2688         memcpy(dma->dmab->area, data, count);
2689         return 0;
2690 }
2691
2692 static void dma_get_converter_format(
2693                 struct dma_engine *dma,
2694                 unsigned short *format)
2695 {
2696         if (format)
2697                 *format = dma->m_converter_format;
2698 }
2699
2700 static unsigned int dma_get_stream_id(struct dma_engine *dma)
2701 {
2702         struct ca0132_spec *spec = dma->codec->spec;
2703
2704         return spec->dsp_stream_id;
2705 }
2706
2707 struct dsp_image_seg {
2708         u32 magic;
2709         u32 chip_addr;
2710         u32 count;
2711         u32 data[0];
2712 };
2713
2714 static const u32 g_magic_value = 0x4c46584d;
2715 static const u32 g_chip_addr_magic_value = 0xFFFFFF01;
2716
2717 static bool is_valid(const struct dsp_image_seg *p)
2718 {
2719         return p->magic == g_magic_value;
2720 }
2721
2722 static bool is_hci_prog_list_seg(const struct dsp_image_seg *p)
2723 {
2724         return g_chip_addr_magic_value == p->chip_addr;
2725 }
2726
2727 static bool is_last(const struct dsp_image_seg *p)
2728 {
2729         return p->count == 0;
2730 }
2731
2732 static size_t dsp_sizeof(const struct dsp_image_seg *p)
2733 {
2734         return sizeof(*p) + p->count*sizeof(u32);
2735 }
2736
2737 static const struct dsp_image_seg *get_next_seg_ptr(
2738                                 const struct dsp_image_seg *p)
2739 {
2740         return (struct dsp_image_seg *)((unsigned char *)(p) + dsp_sizeof(p));
2741 }
2742
2743 /*
2744  * CA0132 chip DSP transfer stuffs.  For DSP download.
2745  */
2746 #define INVALID_DMA_CHANNEL (~0U)
2747
2748 /*
2749  * Program a list of address/data pairs via the ChipIO widget.
2750  * The segment data is in the format of successive pairs of words.
2751  * These are repeated as indicated by the segment's count field.
2752  */
2753 static int dspxfr_hci_write(struct hda_codec *codec,
2754                         const struct dsp_image_seg *fls)
2755 {
2756         int status;
2757         const u32 *data;
2758         unsigned int count;
2759
2760         if (fls == NULL || fls->chip_addr != g_chip_addr_magic_value) {
2761                 codec_dbg(codec, "hci_write invalid params\n");
2762                 return -EINVAL;
2763         }
2764
2765         count = fls->count;
2766         data = (u32 *)(fls->data);
2767         while (count >= 2) {
2768                 status = chipio_write(codec, data[0], data[1]);
2769                 if (status < 0) {
2770                         codec_dbg(codec, "hci_write chipio failed\n");
2771                         return status;
2772                 }
2773                 count -= 2;
2774                 data  += 2;
2775         }
2776         return 0;
2777 }
2778
2779 /**
2780  * Write a block of data into DSP code or data RAM using pre-allocated
2781  * DMA engine.
2782  *
2783  * @codec: the HDA codec
2784  * @fls: pointer to a fast load image
2785  * @reloc: Relocation address for loading single-segment overlays, or 0 for
2786  *         no relocation
2787  * @dma_engine: pointer to DMA engine to be used for DSP download
2788  * @dma_chan: The number of DMA channels used for DSP download
2789  * @port_map_mask: port mapping
2790  * @ovly: TRUE if overlay format is required
2791  *
2792  * Returns zero or a negative error code.
2793  */
2794 static int dspxfr_one_seg(struct hda_codec *codec,
2795                         const struct dsp_image_seg *fls,
2796                         unsigned int reloc,
2797                         struct dma_engine *dma_engine,
2798                         unsigned int dma_chan,
2799                         unsigned int port_map_mask,
2800                         bool ovly)
2801 {
2802         int status = 0;
2803         bool comm_dma_setup_done = false;
2804         const unsigned int *data;
2805         unsigned int chip_addx;
2806         unsigned int words_to_write;
2807         unsigned int buffer_size_words;
2808         unsigned char *buffer_addx;
2809         unsigned short hda_format;
2810         unsigned int sample_rate_div;
2811         unsigned int sample_rate_mul;
2812         unsigned int num_chans;
2813         unsigned int hda_frame_size_words;
2814         unsigned int remainder_words;
2815         const u32 *data_remainder;
2816         u32 chip_addx_remainder;
2817         unsigned int run_size_words;
2818         const struct dsp_image_seg *hci_write = NULL;
2819         unsigned long timeout;
2820         bool dma_active;
2821
2822         if (fls == NULL)
2823                 return -EINVAL;
2824         if (is_hci_prog_list_seg(fls)) {
2825                 hci_write = fls;
2826                 fls = get_next_seg_ptr(fls);
2827         }
2828
2829         if (hci_write && (!fls || is_last(fls))) {
2830                 codec_dbg(codec, "hci_write\n");
2831                 return dspxfr_hci_write(codec, hci_write);
2832         }
2833
2834         if (fls == NULL || dma_engine == NULL || port_map_mask == 0) {
2835                 codec_dbg(codec, "Invalid Params\n");
2836                 return -EINVAL;
2837         }
2838
2839         data = fls->data;
2840         chip_addx = fls->chip_addr,
2841         words_to_write = fls->count;
2842
2843         if (!words_to_write)
2844                 return hci_write ? dspxfr_hci_write(codec, hci_write) : 0;
2845         if (reloc)
2846                 chip_addx = (chip_addx & (0xFFFF0000 << 2)) + (reloc << 2);
2847
2848         if (!UC_RANGE(chip_addx, words_to_write) &&
2849             !X_RANGE_ALL(chip_addx, words_to_write) &&
2850             !Y_RANGE_ALL(chip_addx, words_to_write)) {
2851                 codec_dbg(codec, "Invalid chip_addx Params\n");
2852                 return -EINVAL;
2853         }
2854
2855         buffer_size_words = (unsigned int)dma_get_buffer_size(dma_engine) /
2856                                         sizeof(u32);
2857
2858         buffer_addx = dma_get_buffer_addr(dma_engine);
2859
2860         if (buffer_addx == NULL) {
2861                 codec_dbg(codec, "dma_engine buffer NULL\n");
2862                 return -EINVAL;
2863         }
2864
2865         dma_get_converter_format(dma_engine, &hda_format);
2866         sample_rate_div = ((get_hdafmt_rate(hda_format) >> 0) & 3) + 1;
2867         sample_rate_mul = ((get_hdafmt_rate(hda_format) >> 3) & 3) + 1;
2868         num_chans = get_hdafmt_chs(hda_format) + 1;
2869
2870         hda_frame_size_words = ((sample_rate_div == 0) ? 0 :
2871                         (num_chans * sample_rate_mul / sample_rate_div));
2872
2873         if (hda_frame_size_words == 0) {
2874                 codec_dbg(codec, "frmsz zero\n");
2875                 return -EINVAL;
2876         }
2877
2878         buffer_size_words = min(buffer_size_words,
2879                                 (unsigned int)(UC_RANGE(chip_addx, 1) ?
2880                                 65536 : 32768));
2881         buffer_size_words -= buffer_size_words % hda_frame_size_words;
2882         codec_dbg(codec,
2883                    "chpadr=0x%08x frmsz=%u nchan=%u "
2884                    "rate_mul=%u div=%u bufsz=%u\n",
2885                    chip_addx, hda_frame_size_words, num_chans,
2886                    sample_rate_mul, sample_rate_div, buffer_size_words);
2887
2888         if (buffer_size_words < hda_frame_size_words) {
2889                 codec_dbg(codec, "dspxfr_one_seg:failed\n");
2890                 return -EINVAL;
2891         }
2892
2893         remainder_words = words_to_write % hda_frame_size_words;
2894         data_remainder = data;
2895         chip_addx_remainder = chip_addx;
2896
2897         data += remainder_words;
2898         chip_addx += remainder_words*sizeof(u32);
2899         words_to_write -= remainder_words;
2900
2901         while (words_to_write != 0) {
2902                 run_size_words = min(buffer_size_words, words_to_write);
2903                 codec_dbg(codec, "dspxfr (seg loop)cnt=%u rs=%u remainder=%u\n",
2904                             words_to_write, run_size_words, remainder_words);
2905                 dma_xfer(dma_engine, data, run_size_words*sizeof(u32));
2906                 if (!comm_dma_setup_done) {
2907                         status = dsp_dma_stop(codec, dma_chan, ovly);
2908                         if (status < 0)
2909                                 return status;
2910                         status = dsp_dma_setup_common(codec, chip_addx,
2911                                                 dma_chan, port_map_mask, ovly);
2912                         if (status < 0)
2913                                 return status;
2914                         comm_dma_setup_done = true;
2915                 }
2916
2917                 status = dsp_dma_setup(codec, chip_addx,
2918                                                 run_size_words, dma_chan);
2919                 if (status < 0)
2920                         return status;
2921                 status = dsp_dma_start(codec, dma_chan, ovly);
2922                 if (status < 0)
2923                         return status;
2924                 if (!dsp_is_dma_active(codec, dma_chan)) {
2925                         codec_dbg(codec, "dspxfr:DMA did not start\n");
2926                         return -EIO;
2927                 }
2928                 status = dma_set_state(dma_engine, DMA_STATE_RUN);
2929                 if (status < 0)
2930                         return status;
2931                 if (remainder_words != 0) {
2932                         status = chipio_write_multiple(codec,
2933                                                 chip_addx_remainder,
2934                                                 data_remainder,
2935                                                 remainder_words);
2936                         if (status < 0)
2937                                 return status;
2938                         remainder_words = 0;
2939                 }
2940                 if (hci_write) {
2941                         status = dspxfr_hci_write(codec, hci_write);
2942                         if (status < 0)
2943                                 return status;
2944                         hci_write = NULL;
2945                 }
2946
2947                 timeout = jiffies + msecs_to_jiffies(2000);
2948                 do {
2949                         dma_active = dsp_is_dma_active(codec, dma_chan);
2950                         if (!dma_active)
2951                                 break;
2952                         msleep(20);
2953                 } while (time_before(jiffies, timeout));
2954                 if (dma_active)
2955                         break;
2956
2957                 codec_dbg(codec, "+++++ DMA complete\n");
2958                 dma_set_state(dma_engine, DMA_STATE_STOP);
2959                 status = dma_reset(dma_engine);
2960
2961                 if (status < 0)
2962                         return status;
2963
2964                 data += run_size_words;
2965                 chip_addx += run_size_words*sizeof(u32);
2966                 words_to_write -= run_size_words;
2967         }
2968
2969         if (remainder_words != 0) {
2970                 status = chipio_write_multiple(codec, chip_addx_remainder,
2971                                         data_remainder, remainder_words);
2972         }
2973
2974         return status;
2975 }
2976
2977 /**
2978  * Write the entire DSP image of a DSP code/data overlay to DSP memories
2979  *
2980  * @codec: the HDA codec
2981  * @fls_data: pointer to a fast load image
2982  * @reloc: Relocation address for loading single-segment overlays, or 0 for
2983  *         no relocation
2984  * @sample_rate: sampling rate of the stream used for DSP download
2985  * @channels: channels of the stream used for DSP download
2986  * @ovly: TRUE if overlay format is required
2987  *
2988  * Returns zero or a negative error code.
2989  */
2990 static int dspxfr_image(struct hda_codec *codec,
2991                         const struct dsp_image_seg *fls_data,
2992                         unsigned int reloc,
2993                         unsigned int sample_rate,
2994                         unsigned short channels,
2995                         bool ovly)
2996 {
2997         struct ca0132_spec *spec = codec->spec;
2998         int status;
2999         unsigned short hda_format = 0;
3000         unsigned int response;
3001         unsigned char stream_id = 0;
3002         struct dma_engine *dma_engine;
3003         unsigned int dma_chan;
3004         unsigned int port_map_mask;
3005
3006         if (fls_data == NULL)
3007                 return -EINVAL;
3008
3009         dma_engine = kzalloc(sizeof(*dma_engine), GFP_KERNEL);
3010         if (!dma_engine)
3011                 return -ENOMEM;
3012
3013         dma_engine->dmab = kzalloc(sizeof(*dma_engine->dmab), GFP_KERNEL);
3014         if (!dma_engine->dmab) {
3015                 kfree(dma_engine);
3016                 return -ENOMEM;
3017         }
3018
3019         dma_engine->codec = codec;
3020         dma_convert_to_hda_format(codec, sample_rate, channels, &hda_format);
3021         dma_engine->m_converter_format = hda_format;
3022         dma_engine->buf_size = (ovly ? DSP_DMA_WRITE_BUFLEN_OVLY :
3023                         DSP_DMA_WRITE_BUFLEN_INIT) * 2;
3024
3025         dma_chan = ovly ? INVALID_DMA_CHANNEL : 0;
3026
3027         status = codec_set_converter_format(codec, WIDGET_CHIP_CTRL,
3028                                         hda_format, &response);
3029
3030         if (status < 0) {
3031                 codec_dbg(codec, "set converter format fail\n");
3032                 goto exit;
3033         }
3034
3035         status = snd_hda_codec_load_dsp_prepare(codec,
3036                                 dma_engine->m_converter_format,
3037                                 dma_engine->buf_size,
3038                                 dma_engine->dmab);
3039         if (status < 0)
3040                 goto exit;
3041         spec->dsp_stream_id = status;
3042
3043         if (ovly) {
3044                 status = dspio_alloc_dma_chan(codec, &dma_chan);
3045                 if (status < 0) {
3046                         codec_dbg(codec, "alloc dmachan fail\n");
3047                         dma_chan = INVALID_DMA_CHANNEL;
3048                         goto exit;
3049                 }
3050         }
3051
3052         port_map_mask = 0;
3053         status = dsp_allocate_ports_format(codec, hda_format,
3054                                         &port_map_mask);
3055         if (status < 0) {
3056                 codec_dbg(codec, "alloc ports fail\n");
3057                 goto exit;
3058         }
3059
3060         stream_id = dma_get_stream_id(dma_engine);
3061         status = codec_set_converter_stream_channel(codec,
3062                         WIDGET_CHIP_CTRL, stream_id, 0, &response);
3063         if (status < 0) {
3064                 codec_dbg(codec, "set stream chan fail\n");
3065                 goto exit;
3066         }
3067
3068         while ((fls_data != NULL) && !is_last(fls_data)) {
3069                 if (!is_valid(fls_data)) {
3070                         codec_dbg(codec, "FLS check fail\n");
3071                         status = -EINVAL;
3072                         goto exit;
3073                 }
3074                 status = dspxfr_one_seg(codec, fls_data, reloc,
3075                                         dma_engine, dma_chan,
3076                                         port_map_mask, ovly);
3077                 if (status < 0)
3078                         break;
3079
3080                 if (is_hci_prog_list_seg(fls_data))
3081                         fls_data = get_next_seg_ptr(fls_data);
3082
3083                 if ((fls_data != NULL) && !is_last(fls_data))
3084                         fls_data = get_next_seg_ptr(fls_data);
3085         }
3086
3087         if (port_map_mask != 0)
3088                 status = dsp_free_ports(codec);
3089
3090         if (status < 0)
3091                 goto exit;
3092
3093         status = codec_set_converter_stream_channel(codec,
3094                                 WIDGET_CHIP_CTRL, 0, 0, &response);
3095
3096 exit:
3097         if (ovly && (dma_chan != INVALID_DMA_CHANNEL))
3098                 dspio_free_dma_chan(codec, dma_chan);
3099
3100         if (dma_engine->dmab->area)
3101                 snd_hda_codec_load_dsp_cleanup(codec, dma_engine->dmab);
3102         kfree(dma_engine->dmab);
3103         kfree(dma_engine);
3104
3105         return status;
3106 }
3107
3108 /*
3109  * CA0132 DSP download stuffs.
3110  */
3111 static void dspload_post_setup(struct hda_codec *codec)
3112 {
3113         struct ca0132_spec *spec = codec->spec;
3114         codec_dbg(codec, "---- dspload_post_setup ------\n");
3115         if (!ca0132_use_alt_functions(spec)) {
3116                 /*set DSP speaker to 2.0 configuration*/
3117                 chipio_write(codec, XRAM_XRAM_INST_OFFSET(0x18), 0x08080080);
3118                 chipio_write(codec, XRAM_XRAM_INST_OFFSET(0x19), 0x3f800000);
3119
3120                 /*update write pointer*/
3121                 chipio_write(codec, XRAM_XRAM_INST_OFFSET(0x29), 0x00000002);
3122         }
3123 }
3124
3125 /**
3126  * dspload_image - Download DSP from a DSP Image Fast Load structure.
3127  *
3128  * @codec: the HDA codec
3129  * @fls: pointer to a fast load image
3130  * @ovly: TRUE if overlay format is required
3131  * @reloc: Relocation address for loading single-segment overlays, or 0 for
3132  *         no relocation
3133  * @autostart: TRUE if DSP starts after loading; ignored if ovly is TRUE
3134  * @router_chans: number of audio router channels to be allocated (0 means use
3135  *                internal defaults; max is 32)
3136  *
3137  * Download DSP from a DSP Image Fast Load structure. This structure is a
3138  * linear, non-constant sized element array of structures, each of which
3139  * contain the count of the data to be loaded, the data itself, and the
3140  * corresponding starting chip address of the starting data location.
3141  * Returns zero or a negative error code.
3142  */
3143 static int dspload_image(struct hda_codec *codec,
3144                         const struct dsp_image_seg *fls,
3145                         bool ovly,
3146                         unsigned int reloc,
3147                         bool autostart,
3148                         int router_chans)
3149 {
3150         int status = 0;
3151         unsigned int sample_rate;
3152         unsigned short channels;
3153
3154         codec_dbg(codec, "---- dspload_image begin ------\n");
3155         if (router_chans == 0) {
3156                 if (!ovly)
3157                         router_chans = DMA_TRANSFER_FRAME_SIZE_NWORDS;
3158                 else
3159                         router_chans = DMA_OVERLAY_FRAME_SIZE_NWORDS;
3160         }
3161
3162         sample_rate = 48000;
3163         channels = (unsigned short)router_chans;
3164
3165         while (channels > 16) {
3166                 sample_rate *= 2;
3167                 channels /= 2;
3168         }
3169
3170         do {
3171                 codec_dbg(codec, "Ready to program DMA\n");
3172                 if (!ovly)
3173                         status = dsp_reset(codec);
3174
3175                 if (status < 0)
3176                         break;
3177
3178                 codec_dbg(codec, "dsp_reset() complete\n");
3179                 status = dspxfr_image(codec, fls, reloc, sample_rate, channels,
3180                                       ovly);
3181
3182                 if (status < 0)
3183                         break;
3184
3185                 codec_dbg(codec, "dspxfr_image() complete\n");
3186                 if (autostart && !ovly) {
3187                         dspload_post_setup(codec);
3188                         status = dsp_set_run_state(codec);
3189                 }
3190
3191                 codec_dbg(codec, "LOAD FINISHED\n");
3192         } while (0);
3193
3194         return status;
3195 }
3196
3197 #ifdef CONFIG_SND_HDA_CODEC_CA0132_DSP
3198 static bool dspload_is_loaded(struct hda_codec *codec)
3199 {
3200         unsigned int data = 0;
3201         int status = 0;
3202
3203         status = chipio_read(codec, 0x40004, &data);
3204         if ((status < 0) || (data != 1))
3205                 return false;
3206
3207         return true;
3208 }
3209 #else
3210 #define dspload_is_loaded(codec)        false
3211 #endif
3212
3213 static bool dspload_wait_loaded(struct hda_codec *codec)
3214 {
3215         unsigned long timeout = jiffies + msecs_to_jiffies(2000);
3216
3217         do {
3218                 if (dspload_is_loaded(codec)) {
3219                         codec_info(codec, "ca0132 DSP downloaded and running\n");
3220                         return true;
3221                 }
3222                 msleep(20);
3223         } while (time_before(jiffies, timeout));
3224
3225         codec_err(codec, "ca0132 failed to download DSP\n");
3226         return false;
3227 }
3228
3229 /*
3230  * ca0113 related functions. The ca0113 acts as the HDA bus for the pci-e
3231  * based cards, and has a second mmio region, region2, that's used for special
3232  * commands.
3233  */
3234
3235 /*
3236  * For cards with PCI-E region2 (Sound Blaster Z/ZxR, Recon3D, and AE-5)
3237  * the mmio address 0x320 is used to set GPIO pins. The format for the data
3238  * The first eight bits are just the number of the pin. So far, I've only seen
3239  * this number go to 7.
3240  * AE-5 note: The AE-5 seems to use pins 2 and 3 to somehow set the color value
3241  * of the on-card LED. It seems to use pin 2 for data, then toggles 3 to on and
3242  * then off to send that bit.
3243  */
3244 static void ca0113_mmio_gpio_set(struct hda_codec *codec, unsigned int gpio_pin,
3245                 bool enable)
3246 {
3247         struct ca0132_spec *spec = codec->spec;
3248         unsigned short gpio_data;
3249
3250         gpio_data = gpio_pin & 0xF;
3251         gpio_data |= ((enable << 8) & 0x100);
3252
3253         writew(gpio_data, spec->mem_base + 0x320);
3254 }
3255
3256 /*
3257  * Special pci region2 commands that are only used by the AE-5. They follow
3258  * a set format, and require reads at certain points to seemingly 'clear'
3259  * the response data. My first tests didn't do these reads, and would cause
3260  * the card to get locked up until the memory was read. These commands
3261  * seem to work with three distinct values that I've taken to calling group,
3262  * target-id, and value.
3263  */
3264 static void ca0113_mmio_command_set(struct hda_codec *codec, unsigned int group,
3265                 unsigned int target, unsigned int value)
3266 {
3267         struct ca0132_spec *spec = codec->spec;
3268         unsigned int write_val;
3269
3270         writel(0x0000007e, spec->mem_base + 0x210);
3271         readl(spec->mem_base + 0x210);
3272         writel(0x0000005a, spec->mem_base + 0x210);
3273         readl(spec->mem_base + 0x210);
3274         readl(spec->mem_base + 0x210);
3275
3276         writel(0x00800005, spec->mem_base + 0x20c);
3277         writel(group, spec->mem_base + 0x804);
3278
3279         writel(0x00800005, spec->mem_base + 0x20c);
3280         write_val = (target & 0xff);
3281         write_val |= (value << 8);
3282
3283
3284         writel(write_val, spec->mem_base + 0x204);
3285         /*
3286          * Need delay here or else it goes too fast and works inconsistently.
3287          */
3288         msleep(20);
3289
3290         readl(spec->mem_base + 0x860);
3291         readl(spec->mem_base + 0x854);
3292         readl(spec->mem_base + 0x840);
3293
3294         writel(0x00800004, spec->mem_base + 0x20c);
3295         writel(0x00000000, spec->mem_base + 0x210);
3296         readl(spec->mem_base + 0x210);
3297         readl(spec->mem_base + 0x210);
3298 }
3299
3300 /*
3301  * This second type of command is used for setting the sound filter type.
3302  */
3303 static void ca0113_mmio_command_set_type2(struct hda_codec *codec,
3304                 unsigned int group, unsigned int target, unsigned int value)
3305 {
3306         struct ca0132_spec *spec = codec->spec;
3307         unsigned int write_val;
3308
3309         writel(0x0000007e, spec->mem_base + 0x210);
3310         readl(spec->mem_base + 0x210);
3311         writel(0x0000005a, spec->mem_base + 0x210);
3312         readl(spec->mem_base + 0x210);
3313         readl(spec->mem_base + 0x210);
3314
3315         writel(0x00800003, spec->mem_base + 0x20c);
3316         writel(group, spec->mem_base + 0x804);
3317
3318         writel(0x00800005, spec->mem_base + 0x20c);
3319         write_val = (target & 0xff);
3320         write_val |= (value << 8);
3321
3322
3323         writel(write_val, spec->mem_base + 0x204);
3324         msleep(20);
3325         readl(spec->mem_base + 0x860);
3326         readl(spec->mem_base + 0x854);
3327         readl(spec->mem_base + 0x840);
3328
3329         writel(0x00800004, spec->mem_base + 0x20c);
3330         writel(0x00000000, spec->mem_base + 0x210);
3331         readl(spec->mem_base + 0x210);
3332         readl(spec->mem_base + 0x210);
3333 }
3334
3335 /*
3336  * Setup GPIO for the other variants of Core3D.
3337  */
3338
3339 /*
3340  * Sets up the GPIO pins so that they are discoverable. If this isn't done,
3341  * the card shows as having no GPIO pins.
3342  */
3343 static void ca0132_gpio_init(struct hda_codec *codec)
3344 {
3345         struct ca0132_spec *spec = codec->spec;
3346
3347         switch (ca0132_quirk(spec)) {
3348         case QUIRK_SBZ:
3349         case QUIRK_AE5:
3350                 snd_hda_codec_write(codec, 0x01, 0, 0x793, 0x00);
3351                 snd_hda_codec_write(codec, 0x01, 0, 0x794, 0x53);
3352                 snd_hda_codec_write(codec, 0x01, 0, 0x790, 0x23);
3353                 break;
3354         case QUIRK_R3DI:
3355                 snd_hda_codec_write(codec, 0x01, 0, 0x793, 0x00);
3356                 snd_hda_codec_write(codec, 0x01, 0, 0x794, 0x5B);
3357                 break;
3358         default:
3359                 break;
3360         }
3361
3362 }
3363
3364 /* Sets the GPIO for audio output. */
3365 static void ca0132_gpio_setup(struct hda_codec *codec)
3366 {
3367         struct ca0132_spec *spec = codec->spec;
3368
3369         switch (ca0132_quirk(spec)) {
3370         case QUIRK_SBZ:
3371                 snd_hda_codec_write(codec, 0x01, 0,
3372                                 AC_VERB_SET_GPIO_DIRECTION, 0x07);
3373                 snd_hda_codec_write(codec, 0x01, 0,
3374                                 AC_VERB_SET_GPIO_MASK, 0x07);
3375                 snd_hda_codec_write(codec, 0x01, 0,
3376                                 AC_VERB_SET_GPIO_DATA, 0x04);
3377                 snd_hda_codec_write(codec, 0x01, 0,
3378                                 AC_VERB_SET_GPIO_DATA, 0x06);
3379                 break;
3380         case QUIRK_R3DI:
3381                 snd_hda_codec_write(codec, 0x01, 0,
3382                                 AC_VERB_SET_GPIO_DIRECTION, 0x1E);
3383                 snd_hda_codec_write(codec, 0x01, 0,
3384                                 AC_VERB_SET_GPIO_MASK, 0x1F);
3385                 snd_hda_codec_write(codec, 0x01, 0,
3386                                 AC_VERB_SET_GPIO_DATA, 0x0C);
3387                 break;
3388         default:
3389                 break;
3390         }
3391 }
3392
3393 /*
3394  * GPIO control functions for the Recon3D integrated.
3395  */
3396
3397 enum r3di_gpio_bit {
3398         /* Bit 1 - Switch between front/rear mic. 0 = rear, 1 = front */
3399         R3DI_MIC_SELECT_BIT = 1,
3400         /* Bit 2 - Switch between headphone/line out. 0 = Headphone, 1 = Line */
3401         R3DI_OUT_SELECT_BIT = 2,
3402         /*
3403          * I dunno what this actually does, but it stays on until the dsp
3404          * is downloaded.
3405          */
3406         R3DI_GPIO_DSP_DOWNLOADING = 3,
3407         /*
3408          * Same as above, no clue what it does, but it comes on after the dsp
3409          * is downloaded.
3410          */
3411         R3DI_GPIO_DSP_DOWNLOADED = 4
3412 };
3413
3414 enum r3di_mic_select {
3415         /* Set GPIO bit 1 to 0 for rear mic */
3416         R3DI_REAR_MIC = 0,
3417         /* Set GPIO bit 1 to 1 for front microphone*/
3418         R3DI_FRONT_MIC = 1
3419 };
3420
3421 enum r3di_out_select {
3422         /* Set GPIO bit 2 to 0 for headphone */
3423         R3DI_HEADPHONE_OUT = 0,
3424         /* Set GPIO bit 2 to 1 for speaker */
3425         R3DI_LINE_OUT = 1
3426 };
3427 enum r3di_dsp_status {
3428         /* Set GPIO bit 3 to 1 until DSP is downloaded */
3429         R3DI_DSP_DOWNLOADING = 0,
3430         /* Set GPIO bit 4 to 1 once DSP is downloaded */
3431         R3DI_DSP_DOWNLOADED = 1
3432 };
3433
3434
3435 static void r3di_gpio_mic_set(struct hda_codec *codec,
3436                 enum r3di_mic_select cur_mic)
3437 {
3438         unsigned int cur_gpio;
3439
3440         /* Get the current GPIO Data setup */
3441         cur_gpio = snd_hda_codec_read(codec, 0x01, 0, AC_VERB_GET_GPIO_DATA, 0);
3442
3443         switch (cur_mic) {
3444         case R3DI_REAR_MIC:
3445                 cur_gpio &= ~(1 << R3DI_MIC_SELECT_BIT);
3446                 break;
3447         case R3DI_FRONT_MIC:
3448                 cur_gpio |= (1 << R3DI_MIC_SELECT_BIT);
3449                 break;
3450         }
3451         snd_hda_codec_write(codec, codec->core.afg, 0,
3452                             AC_VERB_SET_GPIO_DATA, cur_gpio);
3453 }
3454
3455 static void r3di_gpio_out_set(struct hda_codec *codec,
3456                 enum r3di_out_select cur_out)
3457 {
3458         unsigned int cur_gpio;
3459
3460         /* Get the current GPIO Data setup */
3461         cur_gpio = snd_hda_codec_read(codec, 0x01, 0, AC_VERB_GET_GPIO_DATA, 0);
3462
3463         switch (cur_out) {
3464         case R3DI_HEADPHONE_OUT:
3465                 cur_gpio &= ~(1 << R3DI_OUT_SELECT_BIT);
3466                 break;
3467         case R3DI_LINE_OUT:
3468                 cur_gpio |= (1 << R3DI_OUT_SELECT_BIT);
3469                 break;
3470         }
3471         snd_hda_codec_write(codec, codec->core.afg, 0,
3472                             AC_VERB_SET_GPIO_DATA, cur_gpio);
3473 }
3474
3475 static void r3di_gpio_dsp_status_set(struct hda_codec *codec,
3476                 enum r3di_dsp_status dsp_status)
3477 {
3478         unsigned int cur_gpio;
3479
3480         /* Get the current GPIO Data setup */
3481         cur_gpio = snd_hda_codec_read(codec, 0x01, 0, AC_VERB_GET_GPIO_DATA, 0);
3482
3483         switch (dsp_status) {
3484         case R3DI_DSP_DOWNLOADING:
3485                 cur_gpio |= (1 << R3DI_GPIO_DSP_DOWNLOADING);
3486                 snd_hda_codec_write(codec, codec->core.afg, 0,
3487                                 AC_VERB_SET_GPIO_DATA, cur_gpio);
3488                 break;
3489         case R3DI_DSP_DOWNLOADED:
3490                 /* Set DOWNLOADING bit to 0. */
3491                 cur_gpio &= ~(1 << R3DI_GPIO_DSP_DOWNLOADING);
3492
3493                 snd_hda_codec_write(codec, codec->core.afg, 0,
3494                                 AC_VERB_SET_GPIO_DATA, cur_gpio);
3495
3496                 cur_gpio |= (1 << R3DI_GPIO_DSP_DOWNLOADED);
3497                 break;
3498         }
3499
3500         snd_hda_codec_write(codec, codec->core.afg, 0,
3501                             AC_VERB_SET_GPIO_DATA, cur_gpio);
3502 }
3503
3504 /*
3505  * PCM callbacks
3506  */
3507 static int ca0132_playback_pcm_prepare(struct hda_pcm_stream *hinfo,
3508                         struct hda_codec *codec,
3509                         unsigned int stream_tag,
3510                         unsigned int format,
3511                         struct snd_pcm_substream *substream)
3512 {
3513         struct ca0132_spec *spec = codec->spec;
3514
3515         snd_hda_codec_setup_stream(codec, spec->dacs[0], stream_tag, 0, format);
3516
3517         return 0;
3518 }
3519
3520 static int ca0132_playback_pcm_cleanup(struct hda_pcm_stream *hinfo,
3521                         struct hda_codec *codec,
3522                         struct snd_pcm_substream *substream)
3523 {
3524         struct ca0132_spec *spec = codec->spec;
3525
3526         if (spec->dsp_state == DSP_DOWNLOADING)
3527                 return 0;
3528
3529         /*If Playback effects are on, allow stream some time to flush
3530          *effects tail*/
3531         if (spec->effects_switch[PLAY_ENHANCEMENT - EFFECT_START_NID])
3532                 msleep(50);
3533
3534         snd_hda_codec_cleanup_stream(codec, spec->dacs[0]);
3535
3536         return 0;
3537 }
3538
3539 static unsigned int ca0132_playback_pcm_delay(struct hda_pcm_stream *info,
3540                         struct hda_codec *codec,
3541                         struct snd_pcm_substream *substream)
3542 {
3543         struct ca0132_spec *spec = codec->spec;
3544         unsigned int latency = DSP_PLAYBACK_INIT_LATENCY;
3545         struct snd_pcm_runtime *runtime = substream->runtime;
3546
3547         if (spec->dsp_state != DSP_DOWNLOADED)
3548                 return 0;
3549
3550         /* Add latency if playback enhancement and either effect is enabled. */
3551         if (spec->effects_switch[PLAY_ENHANCEMENT - EFFECT_START_NID]) {
3552                 if ((spec->effects_switch[SURROUND - EFFECT_START_NID]) ||
3553                     (spec->effects_switch[DIALOG_PLUS - EFFECT_START_NID]))
3554                         latency += DSP_PLAY_ENHANCEMENT_LATENCY;
3555         }
3556
3557         /* Applying Speaker EQ adds latency as well. */
3558         if (spec->cur_out_type == SPEAKER_OUT)
3559                 latency += DSP_SPEAKER_OUT_LATENCY;
3560
3561         return (latency * runtime->rate) / 1000;
3562 }
3563
3564 /*
3565  * Digital out
3566  */
3567 static int ca0132_dig_playback_pcm_open(struct hda_pcm_stream *hinfo,
3568                                         struct hda_codec *codec,
3569                                         struct snd_pcm_substream *substream)
3570 {
3571         struct ca0132_spec *spec = codec->spec;
3572         return snd_hda_multi_out_dig_open(codec, &spec->multiout);
3573 }
3574
3575 static int ca0132_dig_playback_pcm_prepare(struct hda_pcm_stream *hinfo,
3576                         struct hda_codec *codec,
3577                         unsigned int stream_tag,
3578                         unsigned int format,
3579                         struct snd_pcm_substream *substream)
3580 {
3581         struct ca0132_spec *spec = codec->spec;
3582         return snd_hda_multi_out_dig_prepare(codec, &spec->multiout,
3583                                              stream_tag, format, substream);
3584 }
3585
3586 static int ca0132_dig_playback_pcm_cleanup(struct hda_pcm_stream *hinfo,
3587                         struct hda_codec *codec,
3588                         struct snd_pcm_substream *substream)
3589 {
3590         struct ca0132_spec *spec = codec->spec;
3591         return snd_hda_multi_out_dig_cleanup(codec, &spec->multiout);
3592 }
3593
3594 static int ca0132_dig_playback_pcm_close(struct hda_pcm_stream *hinfo,
3595                                          struct hda_codec *codec,
3596                                          struct snd_pcm_substream *substream)
3597 {
3598         struct ca0132_spec *spec = codec->spec;
3599         return snd_hda_multi_out_dig_close(codec, &spec->multiout);
3600 }
3601
3602 /*
3603  * Analog capture
3604  */
3605 static int ca0132_capture_pcm_prepare(struct hda_pcm_stream *hinfo,
3606                                         struct hda_codec *codec,
3607                                         unsigned int stream_tag,
3608                                         unsigned int format,
3609                                         struct snd_pcm_substream *substream)
3610 {
3611         snd_hda_codec_setup_stream(codec, hinfo->nid,
3612                                    stream_tag, 0, format);
3613
3614         return 0;
3615 }
3616
3617 static int ca0132_capture_pcm_cleanup(struct hda_pcm_stream *hinfo,
3618                         struct hda_codec *codec,
3619                         struct snd_pcm_substream *substream)
3620 {
3621         struct ca0132_spec *spec = codec->spec;
3622
3623         if (spec->dsp_state == DSP_DOWNLOADING)
3624                 return 0;
3625
3626         snd_hda_codec_cleanup_stream(codec, hinfo->nid);
3627         return 0;
3628 }
3629
3630 static unsigned int ca0132_capture_pcm_delay(struct hda_pcm_stream *info,
3631                         struct hda_codec *codec,
3632                         struct snd_pcm_substream *substream)
3633 {
3634         struct ca0132_spec *spec = codec->spec;
3635         unsigned int latency = DSP_CAPTURE_INIT_LATENCY;
3636         struct snd_pcm_runtime *runtime = substream->runtime;
3637
3638         if (spec->dsp_state != DSP_DOWNLOADED)
3639                 return 0;
3640
3641         if (spec->effects_switch[CRYSTAL_VOICE - EFFECT_START_NID])
3642                 latency += DSP_CRYSTAL_VOICE_LATENCY;
3643
3644         return (latency * runtime->rate) / 1000;
3645 }
3646
3647 /*
3648  * Controls stuffs.
3649  */
3650
3651 /*
3652  * Mixer controls helpers.
3653  */
3654 #define CA0132_CODEC_VOL_MONO(xname, nid, channel, dir) \
3655         { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
3656           .name = xname, \
3657           .subdevice = HDA_SUBDEV_AMP_FLAG, \
3658           .access = SNDRV_CTL_ELEM_ACCESS_READWRITE | \
3659                         SNDRV_CTL_ELEM_ACCESS_TLV_READ | \
3660                         SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK, \
3661           .info = ca0132_volume_info, \
3662           .get = ca0132_volume_get, \
3663           .put = ca0132_volume_put, \
3664           .tlv = { .c = ca0132_volume_tlv }, \
3665           .private_value = HDA_COMPOSE_AMP_VAL(nid, channel, 0, dir) }
3666
3667 /*
3668  * Creates a mixer control that uses defaults of HDA_CODEC_VOL except for the
3669  * volume put, which is used for setting the DSP volume. This was done because
3670  * the ca0132 functions were taking too much time and causing lag.
3671  */
3672 #define CA0132_ALT_CODEC_VOL_MONO(xname, nid, channel, dir) \
3673         { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
3674           .name = xname, \
3675           .subdevice = HDA_SUBDEV_AMP_FLAG, \
3676           .access = SNDRV_CTL_ELEM_ACCESS_READWRITE | \
3677                         SNDRV_CTL_ELEM_ACCESS_TLV_READ | \
3678                         SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK, \
3679           .info = snd_hda_mixer_amp_volume_info, \
3680           .get = snd_hda_mixer_amp_volume_get, \
3681           .put = ca0132_alt_volume_put, \
3682           .tlv = { .c = snd_hda_mixer_amp_tlv }, \
3683           .private_value = HDA_COMPOSE_AMP_VAL(nid, channel, 0, dir) }
3684
3685 #define CA0132_CODEC_MUTE_MONO(xname, nid, channel, dir) \
3686         { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
3687           .name = xname, \
3688           .subdevice = HDA_SUBDEV_AMP_FLAG, \
3689           .info = snd_hda_mixer_amp_switch_info, \
3690           .get = ca0132_switch_get, \
3691           .put = ca0132_switch_put, \
3692           .private_value = HDA_COMPOSE_AMP_VAL(nid, channel, 0, dir) }
3693
3694 /* stereo */
3695 #define CA0132_CODEC_VOL(xname, nid, dir) \
3696         CA0132_CODEC_VOL_MONO(xname, nid, 3, dir)
3697 #define CA0132_ALT_CODEC_VOL(xname, nid, dir) \
3698         CA0132_ALT_CODEC_VOL_MONO(xname, nid, 3, dir)
3699 #define CA0132_CODEC_MUTE(xname, nid, dir) \
3700         CA0132_CODEC_MUTE_MONO(xname, nid, 3, dir)
3701
3702 /* lookup tables */
3703 /*
3704  * Lookup table with decibel values for the DSP. When volume is changed in
3705  * Windows, the DSP is also sent the dB value in floating point. In Windows,
3706  * these values have decimal points, probably because the Windows driver
3707  * actually uses floating point. We can't here, so I made a lookup table of
3708  * values -90 to 9. -90 is the lowest decibel value for both the ADC's and the
3709  * DAC's, and 9 is the maximum.
3710  */
3711 static const unsigned int float_vol_db_lookup[] = {
3712 0xC2B40000, 0xC2B20000, 0xC2B00000, 0xC2AE0000, 0xC2AC0000, 0xC2AA0000,
3713 0xC2A80000, 0xC2A60000, 0xC2A40000, 0xC2A20000, 0xC2A00000, 0xC29E0000,
3714 0xC29C0000, 0xC29A0000, 0xC2980000, 0xC2960000, 0xC2940000, 0xC2920000,
3715 0xC2900000, 0xC28E0000, 0xC28C0000, 0xC28A0000, 0xC2880000, 0xC2860000,
3716 0xC2840000, 0xC2820000, 0xC2800000, 0xC27C0000, 0xC2780000, 0xC2740000,
3717 0xC2700000, 0xC26C0000, 0xC2680000, 0xC2640000, 0xC2600000, 0xC25C0000,
3718 0xC2580000, 0xC2540000, 0xC2500000, 0xC24C0000, 0xC2480000, 0xC2440000,
3719 0xC2400000, 0xC23C0000, 0xC2380000, 0xC2340000, 0xC2300000, 0xC22C0000,
3720 0xC2280000, 0xC2240000, 0xC2200000, 0xC21C0000, 0xC2180000, 0xC2140000,
3721 0xC2100000, 0xC20C0000, 0xC2080000, 0xC2040000, 0xC2000000, 0xC1F80000,
3722 0xC1F00000, 0xC1E80000, 0xC1E00000, 0xC1D80000, 0xC1D00000, 0xC1C80000,
3723 0xC1C00000, 0xC1B80000, 0xC1B00000, 0xC1A80000, 0xC1A00000, 0xC1980000,
3724 0xC1900000, 0xC1880000, 0xC1800000, 0xC1700000, 0xC1600000, 0xC1500000,
3725 0xC1400000, 0xC1300000, 0xC1200000, 0xC1100000, 0xC1000000, 0xC0E00000,
3726 0xC0C00000, 0xC0A00000, 0xC0800000, 0xC0400000, 0xC0000000, 0xBF800000,
3727 0x00000000, 0x3F800000, 0x40000000, 0x40400000, 0x40800000, 0x40A00000,
3728 0x40C00000, 0x40E00000, 0x41000000, 0x41100000
3729 };
3730
3731 /*
3732  * This table counts from float 0 to 1 in increments of .01, which is
3733  * useful for a few different sliders.
3734  */
3735 static const unsigned int float_zero_to_one_lookup[] = {
3736 0x00000000, 0x3C23D70A, 0x3CA3D70A, 0x3CF5C28F, 0x3D23D70A, 0x3D4CCCCD,
3737 0x3D75C28F, 0x3D8F5C29, 0x3DA3D70A, 0x3DB851EC, 0x3DCCCCCD, 0x3DE147AE,
3738 0x3DF5C28F, 0x3E051EB8, 0x3E0F5C29, 0x3E19999A, 0x3E23D70A, 0x3E2E147B,
3739 0x3E3851EC, 0x3E428F5C, 0x3E4CCCCD, 0x3E570A3D, 0x3E6147AE, 0x3E6B851F,
3740 0x3E75C28F, 0x3E800000, 0x3E851EB8, 0x3E8A3D71, 0x3E8F5C29, 0x3E947AE1,
3741 0x3E99999A, 0x3E9EB852, 0x3EA3D70A, 0x3EA8F5C3, 0x3EAE147B, 0x3EB33333,
3742 0x3EB851EC, 0x3EBD70A4, 0x3EC28F5C, 0x3EC7AE14, 0x3ECCCCCD, 0x3ED1EB85,
3743 0x3ED70A3D, 0x3EDC28F6, 0x3EE147AE, 0x3EE66666, 0x3EEB851F, 0x3EF0A3D7,
3744 0x3EF5C28F, 0x3EFAE148, 0x3F000000, 0x3F028F5C, 0x3F051EB8, 0x3F07AE14,
3745 0x3F0A3D71, 0x3F0CCCCD, 0x3F0F5C29, 0x3F11EB85, 0x3F147AE1, 0x3F170A3D,
3746 0x3F19999A, 0x3F1C28F6, 0x3F1EB852, 0x3F2147AE, 0x3F23D70A, 0x3F266666,
3747 0x3F28F5C3, 0x3F2B851F, 0x3F2E147B, 0x3F30A3D7, 0x3F333333, 0x3F35C28F,
3748 0x3F3851EC, 0x3F3AE148, 0x3F3D70A4, 0x3F400000, 0x3F428F5C, 0x3F451EB8,
3749 0x3F47AE14, 0x3F4A3D71, 0x3F4CCCCD, 0x3F4F5C29, 0x3F51EB85, 0x3F547AE1,
3750 0x3F570A3D, 0x3F59999A, 0x3F5C28F6, 0x3F5EB852, 0x3F6147AE, 0x3F63D70A,
3751 0x3F666666, 0x3F68F5C3, 0x3F6B851F, 0x3F6E147B, 0x3F70A3D7, 0x3F733333,
3752 0x3F75C28F, 0x3F7851EC, 0x3F7AE148, 0x3F7D70A4, 0x3F800000
3753 };
3754
3755 /*
3756  * This table counts from float 10 to 1000, which is the range of the x-bass
3757  * crossover slider in Windows.
3758  */
3759 static const unsigned int float_xbass_xover_lookup[] = {
3760 0x41200000, 0x41A00000, 0x41F00000, 0x42200000, 0x42480000, 0x42700000,
3761 0x428C0000, 0x42A00000, 0x42B40000, 0x42C80000, 0x42DC0000, 0x42F00000,
3762 0x43020000, 0x430C0000, 0x43160000, 0x43200000, 0x432A0000, 0x43340000,
3763 0x433E0000, 0x43480000, 0x43520000, 0x435C0000, 0x43660000, 0x43700000,
3764 0x437A0000, 0x43820000, 0x43870000, 0x438C0000, 0x43910000, 0x43960000,
3765 0x439B0000, 0x43A00000, 0x43A50000, 0x43AA0000, 0x43AF0000, 0x43B40000,
3766 0x43B90000, 0x43BE0000, 0x43C30000, 0x43C80000, 0x43CD0000, 0x43D20000,
3767 0x43D70000, 0x43DC0000, 0x43E10000, 0x43E60000, 0x43EB0000, 0x43F00000,
3768 0x43F50000, 0x43FA0000, 0x43FF0000, 0x44020000, 0x44048000, 0x44070000,
3769 0x44098000, 0x440C0000, 0x440E8000, 0x44110000, 0x44138000, 0x44160000,
3770 0x44188000, 0x441B0000, 0x441D8000, 0x44200000, 0x44228000, 0x44250000,
3771 0x44278000, 0x442A0000, 0x442C8000, 0x442F0000, 0x44318000, 0x44340000,
3772 0x44368000, 0x44390000, 0x443B8000, 0x443E0000, 0x44408000, 0x44430000,
3773 0x44458000, 0x44480000, 0x444A8000, 0x444D0000, 0x444F8000, 0x44520000,
3774 0x44548000, 0x44570000, 0x44598000, 0x445C0000, 0x445E8000, 0x44610000,
3775 0x44638000, 0x44660000, 0x44688000, 0x446B0000, 0x446D8000, 0x44700000,
3776 0x44728000, 0x44750000, 0x44778000, 0x447A0000
3777 };
3778
3779 /* The following are for tuning of products */
3780 #ifdef ENABLE_TUNING_CONTROLS
3781
3782 static unsigned int voice_focus_vals_lookup[] = {
3783 0x41A00000, 0x41A80000, 0x41B00000, 0x41B80000, 0x41C00000, 0x41C80000,
3784 0x41D00000, 0x41D80000, 0x41E00000, 0x41E80000, 0x41F00000, 0x41F80000,
3785 0x42000000, 0x42040000, 0x42080000, 0x420C0000, 0x42100000, 0x42140000,
3786 0x42180000, 0x421C0000, 0x42200000, 0x42240000, 0x42280000, 0x422C0000,
3787 0x42300000, 0x42340000, 0x42380000, 0x423C0000, 0x42400000, 0x42440000,
3788 0x42480000, 0x424C0000, 0x42500000, 0x42540000, 0x42580000, 0x425C0000,
3789 0x42600000, 0x42640000, 0x42680000, 0x426C0000, 0x42700000, 0x42740000,
3790 0x42780000, 0x427C0000, 0x42800000, 0x42820000, 0x42840000, 0x42860000,
3791 0x42880000, 0x428A0000, 0x428C0000, 0x428E0000, 0x42900000, 0x42920000,
3792 0x42940000, 0x42960000, 0x42980000, 0x429A0000, 0x429C0000, 0x429E0000,
3793 0x42A00000, 0x42A20000, 0x42A40000, 0x42A60000, 0x42A80000, 0x42AA0000,
3794 0x42AC0000, 0x42AE0000, 0x42B00000, 0x42B20000, 0x42B40000, 0x42B60000,
3795 0x42B80000, 0x42BA0000, 0x42BC0000, 0x42BE0000, 0x42C00000, 0x42C20000,
3796 0x42C40000, 0x42C60000, 0x42C80000, 0x42CA0000, 0x42CC0000, 0x42CE0000,
3797 0x42D00000, 0x42D20000, 0x42D40000, 0x42D60000, 0x42D80000, 0x42DA0000,
3798 0x42DC0000, 0x42DE0000, 0x42E00000, 0x42E20000, 0x42E40000, 0x42E60000,
3799 0x42E80000, 0x42EA0000, 0x42EC0000, 0x42EE0000, 0x42F00000, 0x42F20000,
3800 0x42F40000, 0x42F60000, 0x42F80000, 0x42FA0000, 0x42FC0000, 0x42FE0000,
3801 0x43000000, 0x43010000, 0x43020000, 0x43030000, 0x43040000, 0x43050000,
3802 0x43060000, 0x43070000, 0x43080000, 0x43090000, 0x430A0000, 0x430B0000,
3803 0x430C0000, 0x430D0000, 0x430E0000, 0x430F0000, 0x43100000, 0x43110000,
3804 0x43120000, 0x43130000, 0x43140000, 0x43150000, 0x43160000, 0x43170000,
3805 0x43180000, 0x43190000, 0x431A0000, 0x431B0000, 0x431C0000, 0x431D0000,
3806 0x431E0000, 0x431F0000, 0x43200000, 0x43210000, 0x43220000, 0x43230000,
3807 0x43240000, 0x43250000, 0x43260000, 0x43270000, 0x43280000, 0x43290000,
3808 0x432A0000, 0x432B0000, 0x432C0000, 0x432D0000, 0x432E0000, 0x432F0000,
3809 0x43300000, 0x43310000, 0x43320000, 0x43330000, 0x43340000
3810 };
3811
3812 static unsigned int mic_svm_vals_lookup[] = {
3813 0x00000000, 0x3C23D70A, 0x3CA3D70A, 0x3CF5C28F, 0x3D23D70A, 0x3D4CCCCD,
3814 0x3D75C28F, 0x3D8F5C29, 0x3DA3D70A, 0x3DB851EC, 0x3DCCCCCD, 0x3DE147AE,
3815 0x3DF5C28F, 0x3E051EB8, 0x3E0F5C29, 0x3E19999A, 0x3E23D70A, 0x3E2E147B,
3816 0x3E3851EC, 0x3E428F5C, 0x3E4CCCCD, 0x3E570A3D, 0x3E6147AE, 0x3E6B851F,
3817 0x3E75C28F, 0x3E800000, 0x3E851EB8, 0x3E8A3D71, 0x3E8F5C29, 0x3E947AE1,
3818 0x3E99999A, 0x3E9EB852, 0x3EA3D70A, 0x3EA8F5C3, 0x3EAE147B, 0x3EB33333,
3819 0x3EB851EC, 0x3EBD70A4, 0x3EC28F5C, 0x3EC7AE14, 0x3ECCCCCD, 0x3ED1EB85,
3820 0x3ED70A3D, 0x3EDC28F6, 0x3EE147AE, 0x3EE66666, 0x3EEB851F, 0x3EF0A3D7,
3821 0x3EF5C28F, 0x3EFAE148, 0x3F000000, 0x3F028F5C, 0x3F051EB8, 0x3F07AE14,
3822 0x3F0A3D71, 0x3F0CCCCD, 0x3F0F5C29, 0x3F11EB85, 0x3F147AE1, 0x3F170A3D,
3823 0x3F19999A, 0x3F1C28F6, 0x3F1EB852, 0x3F2147AE, 0x3F23D70A, 0x3F266666,
3824 0x3F28F5C3, 0x3F2B851F, 0x3F2E147B, 0x3F30A3D7, 0x3F333333, 0x3F35C28F,
3825 0x3F3851EC, 0x3F3AE148, 0x3F3D70A4, 0x3F400000, 0x3F428F5C, 0x3F451EB8,
3826 0x3F47AE14, 0x3F4A3D71, 0x3F4CCCCD, 0x3F4F5C29, 0x3F51EB85, 0x3F547AE1,
3827 0x3F570A3D, 0x3F59999A, 0x3F5C28F6, 0x3F5EB852, 0x3F6147AE, 0x3F63D70A,
3828 0x3F666666, 0x3F68F5C3, 0x3F6B851F, 0x3F6E147B, 0x3F70A3D7, 0x3F733333,
3829 0x3F75C28F, 0x3F7851EC, 0x3F7AE148, 0x3F7D70A4, 0x3F800000
3830 };
3831
3832 static unsigned int equalizer_vals_lookup[] = {
3833 0xC1C00000, 0xC1B80000, 0xC1B00000, 0xC1A80000, 0xC1A00000, 0xC1980000,
3834 0xC1900000, 0xC1880000, 0xC1800000, 0xC1700000, 0xC1600000, 0xC1500000,
3835 0xC1400000, 0xC1300000, 0xC1200000, 0xC1100000, 0xC1000000, 0xC0E00000,
3836 0xC0C00000, 0xC0A00000, 0xC0800000, 0xC0400000, 0xC0000000, 0xBF800000,
3837 0x00000000, 0x3F800000, 0x40000000, 0x40400000, 0x40800000, 0x40A00000,
3838 0x40C00000, 0x40E00000, 0x41000000, 0x41100000, 0x41200000, 0x41300000,
3839 0x41400000, 0x41500000, 0x41600000, 0x41700000, 0x41800000, 0x41880000,
3840 0x41900000, 0x41980000, 0x41A00000, 0x41A80000, 0x41B00000, 0x41B80000,
3841 0x41C00000
3842 };
3843
3844 static int tuning_ctl_set(struct hda_codec *codec, hda_nid_t nid,
3845                           unsigned int *lookup, int idx)
3846 {
3847         int i = 0;
3848
3849         for (i = 0; i < TUNING_CTLS_COUNT; i++)
3850                 if (nid == ca0132_tuning_ctls[i].nid)
3851                         break;
3852
3853         snd_hda_power_up(codec);
3854         dspio_set_param(codec, ca0132_tuning_ctls[i].mid, 0x20,
3855                         ca0132_tuning_ctls[i].req,
3856                         &(lookup[idx]), sizeof(unsigned int));
3857         snd_hda_power_down(codec);
3858
3859         return 1;
3860 }
3861
3862 static int tuning_ctl_get(struct snd_kcontrol *kcontrol,
3863                           struct snd_ctl_elem_value *ucontrol)
3864 {
3865         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
3866         struct ca0132_spec *spec = codec->spec;
3867         hda_nid_t nid = get_amp_nid(kcontrol);
3868         long *valp = ucontrol->value.integer.value;
3869         int idx = nid - TUNING_CTL_START_NID;
3870
3871         *valp = spec->cur_ctl_vals[idx];
3872         return 0;
3873 }
3874
3875 static int voice_focus_ctl_info(struct snd_kcontrol *kcontrol,
3876                               struct snd_ctl_elem_info *uinfo)
3877 {
3878         int chs = get_amp_channels(kcontrol);
3879         uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
3880         uinfo->count = chs == 3 ? 2 : 1;
3881         uinfo->value.integer.min = 20;
3882         uinfo->value.integer.max = 180;
3883         uinfo->value.integer.step = 1;
3884
3885         return 0;
3886 }
3887
3888 static int voice_focus_ctl_put(struct snd_kcontrol *kcontrol,
3889                                 struct snd_ctl_elem_value *ucontrol)
3890 {
3891         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
3892         struct ca0132_spec *spec = codec->spec;
3893         hda_nid_t nid = get_amp_nid(kcontrol);
3894         long *valp = ucontrol->value.integer.value;
3895         int idx;
3896
3897         idx = nid - TUNING_CTL_START_NID;
3898         /* any change? */
3899         if (spec->cur_ctl_vals[idx] == *valp)
3900                 return 0;
3901
3902         spec->cur_ctl_vals[idx] = *valp;
3903
3904         idx = *valp - 20;
3905         tuning_ctl_set(codec, nid, voice_focus_vals_lookup, idx);
3906
3907         return 1;
3908 }
3909
3910 static int mic_svm_ctl_info(struct snd_kcontrol *kcontrol,
3911                               struct snd_ctl_elem_info *uinfo)
3912 {
3913         int chs = get_amp_channels(kcontrol);
3914         uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
3915         uinfo->count = chs == 3 ? 2 : 1;
3916         uinfo->value.integer.min = 0;
3917         uinfo->value.integer.max = 100;
3918         uinfo->value.integer.step = 1;
3919
3920         return 0;
3921 }
3922
3923 static int mic_svm_ctl_put(struct snd_kcontrol *kcontrol,
3924                                 struct snd_ctl_elem_value *ucontrol)
3925 {
3926         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
3927         struct ca0132_spec *spec = codec->spec;
3928         hda_nid_t nid = get_amp_nid(kcontrol);
3929         long *valp = ucontrol->value.integer.value;
3930         int idx;
3931
3932         idx = nid - TUNING_CTL_START_NID;
3933         /* any change? */
3934         if (spec->cur_ctl_vals[idx] == *valp)
3935                 return 0;
3936
3937         spec->cur_ctl_vals[idx] = *valp;
3938
3939         idx = *valp;
3940         tuning_ctl_set(codec, nid, mic_svm_vals_lookup, idx);
3941
3942         return 0;
3943 }
3944
3945 static int equalizer_ctl_info(struct snd_kcontrol *kcontrol,
3946                               struct snd_ctl_elem_info *uinfo)
3947 {
3948         int chs = get_amp_channels(kcontrol);
3949         uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
3950         uinfo->count = chs == 3 ? 2 : 1;
3951         uinfo->value.integer.min = 0;
3952         uinfo->value.integer.max = 48;
3953         uinfo->value.integer.step = 1;
3954
3955         return 0;
3956 }
3957
3958 static int equalizer_ctl_put(struct snd_kcontrol *kcontrol,
3959                                 struct snd_ctl_elem_value *ucontrol)
3960 {
3961         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
3962         struct ca0132_spec *spec = codec->spec;
3963         hda_nid_t nid = get_amp_nid(kcontrol);
3964         long *valp = ucontrol->value.integer.value;
3965         int idx;
3966
3967         idx = nid - TUNING_CTL_START_NID;
3968         /* any change? */
3969         if (spec->cur_ctl_vals[idx] == *valp)
3970                 return 0;
3971
3972         spec->cur_ctl_vals[idx] = *valp;
3973
3974         idx = *valp;
3975         tuning_ctl_set(codec, nid, equalizer_vals_lookup, idx);
3976
3977         return 1;
3978 }
3979
3980 static const SNDRV_CTL_TLVD_DECLARE_DB_SCALE(voice_focus_db_scale, 2000, 100, 0);
3981 static const SNDRV_CTL_TLVD_DECLARE_DB_SCALE(eq_db_scale, -2400, 100, 0);
3982
3983 static int add_tuning_control(struct hda_codec *codec,
3984                                 hda_nid_t pnid, hda_nid_t nid,
3985                                 const char *name, int dir)
3986 {
3987         char namestr[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
3988         int type = dir ? HDA_INPUT : HDA_OUTPUT;
3989         struct snd_kcontrol_new knew =
3990                 HDA_CODEC_VOLUME_MONO(namestr, nid, 1, 0, type);
3991
3992         knew.access = SNDRV_CTL_ELEM_ACCESS_READWRITE |
3993                         SNDRV_CTL_ELEM_ACCESS_TLV_READ;
3994         knew.tlv.c = 0;
3995         knew.tlv.p = 0;
3996         switch (pnid) {
3997         case VOICE_FOCUS:
3998                 knew.info = voice_focus_ctl_info;
3999                 knew.get = tuning_ctl_get;
4000                 knew.put = voice_focus_ctl_put;
4001                 knew.tlv.p = voice_focus_db_scale;
4002                 break;
4003         case MIC_SVM:
4004                 knew.info = mic_svm_ctl_info;
4005                 knew.get = tuning_ctl_get;
4006                 knew.put = mic_svm_ctl_put;
4007                 break;
4008         case EQUALIZER:
4009                 knew.info = equalizer_ctl_info;
4010                 knew.get = tuning_ctl_get;
4011                 knew.put = equalizer_ctl_put;
4012                 knew.tlv.p = eq_db_scale;
4013                 break;
4014         default:
4015                 return 0;
4016         }
4017         knew.private_value =
4018                 HDA_COMPOSE_AMP_VAL(nid, 1, 0, type);
4019         sprintf(namestr, "%s %s Volume", name, dirstr[dir]);
4020         return snd_hda_ctl_add(codec, nid, snd_ctl_new1(&knew, codec));
4021 }
4022
4023 static int add_tuning_ctls(struct hda_codec *codec)
4024 {
4025         int i;
4026         int err;
4027
4028         for (i = 0; i < TUNING_CTLS_COUNT; i++) {
4029                 err = add_tuning_control(codec,
4030                                         ca0132_tuning_ctls[i].parent_nid,
4031                                         ca0132_tuning_ctls[i].nid,
4032                                         ca0132_tuning_ctls[i].name,
4033                                         ca0132_tuning_ctls[i].direct);
4034                 if (err < 0)
4035                         return err;
4036         }
4037
4038         return 0;
4039 }
4040
4041 static void ca0132_init_tuning_defaults(struct hda_codec *codec)
4042 {
4043         struct ca0132_spec *spec = codec->spec;
4044         int i;
4045
4046         /* Wedge Angle defaults to 30.  10 below is 30 - 20.  20 is min. */
4047         spec->cur_ctl_vals[WEDGE_ANGLE - TUNING_CTL_START_NID] = 10;
4048         /* SVM level defaults to 0.74. */
4049         spec->cur_ctl_vals[SVM_LEVEL - TUNING_CTL_START_NID] = 74;
4050
4051         /* EQ defaults to 0dB. */
4052         for (i = 2; i < TUNING_CTLS_COUNT; i++)
4053                 spec->cur_ctl_vals[i] = 24;
4054 }
4055 #endif /*ENABLE_TUNING_CONTROLS*/
4056
4057 /*
4058  * Select the active output.
4059  * If autodetect is enabled, output will be selected based on jack detection.
4060  * If jack inserted, headphone will be selected, else built-in speakers
4061  * If autodetect is disabled, output will be selected based on selection.
4062  */
4063 static int ca0132_select_out(struct hda_codec *codec)
4064 {
4065         struct ca0132_spec *spec = codec->spec;
4066         unsigned int pin_ctl;
4067         int jack_present;
4068         int auto_jack;
4069         unsigned int tmp;
4070         int err;
4071
4072         codec_dbg(codec, "ca0132_select_out\n");
4073
4074         snd_hda_power_up_pm(codec);
4075
4076         auto_jack = spec->vnode_lswitch[VNID_HP_ASEL - VNODE_START_NID];
4077
4078         if (auto_jack)
4079                 jack_present = snd_hda_jack_detect(codec, spec->unsol_tag_hp);
4080         else
4081                 jack_present =
4082                         spec->vnode_lswitch[VNID_HP_SEL - VNODE_START_NID];
4083
4084         if (jack_present)
4085                 spec->cur_out_type = HEADPHONE_OUT;
4086         else
4087                 spec->cur_out_type = SPEAKER_OUT;
4088
4089         if (spec->cur_out_type == SPEAKER_OUT) {
4090                 codec_dbg(codec, "ca0132_select_out speaker\n");
4091                 /*speaker out config*/
4092                 tmp = FLOAT_ONE;
4093                 err = dspio_set_uint_param(codec, 0x80, 0x04, tmp);
4094                 if (err < 0)
4095                         goto exit;
4096                 /*enable speaker EQ*/
4097                 tmp = FLOAT_ONE;
4098                 err = dspio_set_uint_param(codec, 0x8f, 0x00, tmp);
4099                 if (err < 0)
4100                         goto exit;
4101
4102                 /* Setup EAPD */
4103                 snd_hda_codec_write(codec, spec->out_pins[1], 0,
4104                                     VENDOR_CHIPIO_EAPD_SEL_SET, 0x02);
4105                 snd_hda_codec_write(codec, spec->out_pins[0], 0,
4106                                     AC_VERB_SET_EAPD_BTLENABLE, 0x00);
4107                 snd_hda_codec_write(codec, spec->out_pins[0], 0,
4108                                     VENDOR_CHIPIO_EAPD_SEL_SET, 0x00);
4109                 snd_hda_codec_write(codec, spec->out_pins[0], 0,
4110                                     AC_VERB_SET_EAPD_BTLENABLE, 0x02);
4111
4112                 /* disable headphone node */
4113                 pin_ctl = snd_hda_codec_read(codec, spec->out_pins[1], 0,
4114                                         AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
4115                 snd_hda_set_pin_ctl(codec, spec->out_pins[1],
4116                                     pin_ctl & ~PIN_HP);
4117                 /* enable speaker node */
4118                 pin_ctl = snd_hda_codec_read(codec, spec->out_pins[0], 0,
4119                                 AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
4120                 snd_hda_set_pin_ctl(codec, spec->out_pins[0],
4121                                     pin_ctl | PIN_OUT);
4122         } else {
4123                 codec_dbg(codec, "ca0132_select_out hp\n");
4124                 /*headphone out config*/
4125                 tmp = FLOAT_ZERO;
4126                 err = dspio_set_uint_param(codec, 0x80, 0x04, tmp);
4127                 if (err < 0)
4128                         goto exit;
4129                 /*disable speaker EQ*/
4130                 tmp = FLOAT_ZERO;
4131                 err = dspio_set_uint_param(codec, 0x8f, 0x00, tmp);
4132                 if (err < 0)
4133                         goto exit;
4134
4135                 /* Setup EAPD */
4136                 snd_hda_codec_write(codec, spec->out_pins[0], 0,
4137                                     VENDOR_CHIPIO_EAPD_SEL_SET, 0x00);
4138                 snd_hda_codec_write(codec, spec->out_pins[0], 0,
4139                                     AC_VERB_SET_EAPD_BTLENABLE, 0x00);
4140                 snd_hda_codec_write(codec, spec->out_pins[1], 0,
4141                                     VENDOR_CHIPIO_EAPD_SEL_SET, 0x02);
4142                 snd_hda_codec_write(codec, spec->out_pins[0], 0,
4143                                     AC_VERB_SET_EAPD_BTLENABLE, 0x02);
4144
4145                 /* disable speaker*/
4146                 pin_ctl = snd_hda_codec_read(codec, spec->out_pins[0], 0,
4147                                         AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
4148                 snd_hda_set_pin_ctl(codec, spec->out_pins[0],
4149                                     pin_ctl & ~PIN_HP);
4150                 /* enable headphone*/
4151                 pin_ctl = snd_hda_codec_read(codec, spec->out_pins[1], 0,
4152                                         AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
4153                 snd_hda_set_pin_ctl(codec, spec->out_pins[1],
4154                                     pin_ctl | PIN_HP);
4155         }
4156
4157 exit:
4158         snd_hda_power_down_pm(codec);
4159
4160         return err < 0 ? err : 0;
4161 }
4162
4163 static int ae5_headphone_gain_set(struct hda_codec *codec, long val);
4164 static int zxr_headphone_gain_set(struct hda_codec *codec, long val);
4165 static int ca0132_effects_set(struct hda_codec *codec, hda_nid_t nid, long val);
4166
4167 static void ae5_mmio_select_out(struct hda_codec *codec)
4168 {
4169         struct ca0132_spec *spec = codec->spec;
4170         unsigned int i;
4171
4172         for (i = 0; i < AE5_CA0113_OUT_SET_COMMANDS; i++)
4173                 ca0113_mmio_command_set(codec,
4174                         ae5_ca0113_output_presets[spec->cur_out_type].group[i],
4175                         ae5_ca0113_output_presets[spec->cur_out_type].target[i],
4176                         ae5_ca0113_output_presets[spec->cur_out_type].vals[i]);
4177 }
4178
4179 /*
4180  * These are the commands needed to setup output on each of the different card
4181  * types.
4182  */
4183 static void ca0132_alt_select_out_quirk_handler(struct hda_codec *codec)
4184 {
4185         struct ca0132_spec *spec = codec->spec;
4186         unsigned int tmp;
4187
4188         switch (spec->cur_out_type) {
4189         case SPEAKER_OUT:
4190                 switch (ca0132_quirk(spec)) {
4191                 case QUIRK_SBZ:
4192                         ca0113_mmio_gpio_set(codec, 7, false);
4193                         ca0113_mmio_gpio_set(codec, 4, true);
4194                         ca0113_mmio_gpio_set(codec, 1, true);
4195                         chipio_set_control_param(codec, 0x0d, 0x18);
4196                         break;
4197                 case QUIRK_ZXR:
4198                         ca0113_mmio_gpio_set(codec, 2, true);
4199                         ca0113_mmio_gpio_set(codec, 3, true);
4200                         ca0113_mmio_gpio_set(codec, 5, false);
4201                         zxr_headphone_gain_set(codec, 0);
4202                         chipio_set_control_param(codec, 0x0d, 0x24);
4203                         break;
4204                 case QUIRK_R3DI:
4205                         chipio_set_control_param(codec, 0x0d, 0x24);
4206                         r3di_gpio_out_set(codec, R3DI_LINE_OUT);
4207                         break;
4208                 case QUIRK_R3D:
4209                         chipio_set_control_param(codec, 0x0d, 0x24);
4210                         ca0113_mmio_gpio_set(codec, 1, true);
4211                         break;
4212                 case QUIRK_AE5:
4213                         ae5_mmio_select_out(codec);
4214                         ae5_headphone_gain_set(codec, 2);
4215                         tmp = FLOAT_ZERO;
4216                         dspio_set_uint_param(codec, 0x96, 0x29, tmp);
4217                         dspio_set_uint_param(codec, 0x96, 0x2a, tmp);
4218                         chipio_set_control_param(codec, 0x0d, 0xa4);
4219                         chipio_write(codec, 0x18b03c, 0x00000012);
4220                         break;
4221                 default:
4222                         break;
4223                 }
4224                 break;
4225         case HEADPHONE_OUT:
4226                 switch (ca0132_quirk(spec)) {
4227                 case QUIRK_SBZ:
4228                         ca0113_mmio_gpio_set(codec, 7, true);
4229                         ca0113_mmio_gpio_set(codec, 4, true);
4230                         ca0113_mmio_gpio_set(codec, 1, false);
4231                         chipio_set_control_param(codec, 0x0d, 0x12);
4232                         break;
4233                 case QUIRK_ZXR:
4234                         ca0113_mmio_gpio_set(codec, 2, false);
4235                         ca0113_mmio_gpio_set(codec, 3, false);
4236                         ca0113_mmio_gpio_set(codec, 5, true);
4237                         zxr_headphone_gain_set(codec, spec->zxr_gain_set);
4238                         chipio_set_control_param(codec, 0x0d, 0x21);
4239                         break;
4240                 case QUIRK_R3DI:
4241                         chipio_set_control_param(codec, 0x0d, 0x21);
4242                         r3di_gpio_out_set(codec, R3DI_HEADPHONE_OUT);
4243                         break;
4244                 case QUIRK_R3D:
4245                         chipio_set_control_param(codec, 0x0d, 0x21);
4246                         ca0113_mmio_gpio_set(codec, 0x1, false);
4247                         break;
4248                 case QUIRK_AE5:
4249                         ae5_mmio_select_out(codec);
4250                         ae5_headphone_gain_set(codec,
4251                                         spec->ae5_headphone_gain_val);
4252                         tmp = FLOAT_ONE;
4253                         dspio_set_uint_param(codec, 0x96, 0x29, tmp);
4254                         dspio_set_uint_param(codec, 0x96, 0x2a, tmp);
4255                         chipio_set_control_param(codec, 0x0d, 0xa1);
4256                         chipio_write(codec, 0x18b03c, 0x00000012);
4257                         break;
4258                 default:
4259                         break;
4260                 }
4261                 break;
4262         case SURROUND_OUT:
4263                 switch (ca0132_quirk(spec)) {
4264                 case QUIRK_SBZ:
4265                         ca0113_mmio_gpio_set(codec, 7, false);
4266                         ca0113_mmio_gpio_set(codec, 4, true);
4267                         ca0113_mmio_gpio_set(codec, 1, true);
4268                         chipio_set_control_param(codec, 0x0d, 0x18);
4269                         break;
4270                 case QUIRK_ZXR:
4271                         ca0113_mmio_gpio_set(codec, 2, true);
4272                         ca0113_mmio_gpio_set(codec, 3, true);
4273                         ca0113_mmio_gpio_set(codec, 5, false);
4274                         zxr_headphone_gain_set(codec, 0);
4275                         chipio_set_control_param(codec, 0x0d, 0x24);
4276                         break;
4277                 case QUIRK_R3DI:
4278                         chipio_set_control_param(codec, 0x0d, 0x24);
4279                         r3di_gpio_out_set(codec, R3DI_LINE_OUT);
4280                         break;
4281                 case QUIRK_R3D:
4282                         ca0113_mmio_gpio_set(codec, 1, true);
4283                         chipio_set_control_param(codec, 0x0d, 0x24);
4284                         break;
4285                 case QUIRK_AE5:
4286                         ae5_mmio_select_out(codec);
4287                         ae5_headphone_gain_set(codec, 2);
4288                         tmp = FLOAT_ZERO;
4289                         dspio_set_uint_param(codec, 0x96, 0x29, tmp);
4290                         dspio_set_uint_param(codec, 0x96, 0x2a, tmp);
4291                         chipio_set_control_param(codec, 0x0d, 0xa4);
4292                         chipio_write(codec, 0x18b03c, 0x00000012);
4293                         break;
4294                 default:
4295                         break;
4296                 }
4297                 break;
4298         }
4299 }
4300
4301 /*
4302  * This function behaves similarly to the ca0132_select_out funciton above,
4303  * except with a few differences. It adds the ability to select the current
4304  * output with an enumerated control "output source" if the auto detect
4305  * mute switch is set to off. If the auto detect mute switch is enabled, it
4306  * will detect either headphone or lineout(SPEAKER_OUT) from jack detection.
4307  * It also adds the ability to auto-detect the front headphone port. The only
4308  * way to select surround is to disable auto detect, and set Surround with the
4309  * enumerated control.
4310  */
4311 static int ca0132_alt_select_out(struct hda_codec *codec)
4312 {
4313         struct ca0132_spec *spec = codec->spec;
4314         unsigned int pin_ctl;
4315         int jack_present;
4316         int auto_jack;
4317         unsigned int i;
4318         unsigned int tmp;
4319         int err;
4320         /* Default Headphone is rear headphone */
4321         hda_nid_t headphone_nid = spec->out_pins[1];
4322
4323         codec_dbg(codec, "%s\n", __func__);
4324
4325         snd_hda_power_up_pm(codec);
4326
4327         auto_jack = spec->vnode_lswitch[VNID_HP_ASEL - VNODE_START_NID];
4328
4329         /*
4330          * If headphone rear or front is plugged in, set to headphone.
4331          * If neither is plugged in, set to rear line out. Only if
4332          * hp/speaker auto detect is enabled.
4333          */
4334         if (auto_jack) {
4335                 jack_present = snd_hda_jack_detect(codec, spec->unsol_tag_hp) ||
4336                            snd_hda_jack_detect(codec, spec->unsol_tag_front_hp);
4337
4338                 if (jack_present)
4339                         spec->cur_out_type = HEADPHONE_OUT;
4340                 else
4341                         spec->cur_out_type = SPEAKER_OUT;
4342         } else
4343                 spec->cur_out_type = spec->out_enum_val;
4344
4345         /* Begin DSP output switch */
4346         tmp = FLOAT_ONE;
4347         err = dspio_set_uint_param(codec, 0x96, 0x3A, tmp);
4348         if (err < 0)
4349                 goto exit;
4350
4351         ca0132_alt_select_out_quirk_handler(codec);
4352
4353         switch (spec->cur_out_type) {
4354         case SPEAKER_OUT:
4355                 codec_dbg(codec, "%s speaker\n", __func__);
4356
4357                 /* disable headphone node */
4358                 pin_ctl = snd_hda_codec_read(codec, spec->out_pins[1], 0,
4359                                         AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
4360                 snd_hda_set_pin_ctl(codec, spec->out_pins[1],
4361                                     pin_ctl & ~PIN_HP);
4362                 /* enable line-out node */
4363                 pin_ctl = snd_hda_codec_read(codec, spec->out_pins[0], 0,
4364                                 AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
4365                 snd_hda_set_pin_ctl(codec, spec->out_pins[0],
4366                                     pin_ctl | PIN_OUT);
4367                 /* Enable EAPD */
4368                 snd_hda_codec_write(codec, spec->out_pins[0], 0,
4369                         AC_VERB_SET_EAPD_BTLENABLE, 0x01);
4370
4371                 /* If PlayEnhancement is enabled, set different source */
4372                 if (spec->effects_switch[PLAY_ENHANCEMENT - EFFECT_START_NID])
4373                         dspio_set_uint_param(codec, 0x80, 0x04, FLOAT_ONE);
4374                 else
4375                         dspio_set_uint_param(codec, 0x80, 0x04, FLOAT_EIGHT);
4376                 break;
4377         case HEADPHONE_OUT:
4378                 codec_dbg(codec, "%s hp\n", __func__);
4379
4380                 snd_hda_codec_write(codec, spec->out_pins[0], 0,
4381                         AC_VERB_SET_EAPD_BTLENABLE, 0x00);
4382
4383                 /* disable speaker*/
4384                 pin_ctl = snd_hda_codec_read(codec, spec->out_pins[0], 0,
4385                                         AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
4386                 snd_hda_set_pin_ctl(codec, spec->out_pins[0],
4387                                 pin_ctl & ~PIN_HP);
4388
4389                 /* enable headphone, either front or rear */
4390
4391                 if (snd_hda_jack_detect(codec, spec->unsol_tag_front_hp))
4392                         headphone_nid = spec->out_pins[2];
4393                 else if (snd_hda_jack_detect(codec, spec->unsol_tag_hp))
4394                         headphone_nid = spec->out_pins[1];
4395
4396                 pin_ctl = snd_hda_codec_read(codec, headphone_nid, 0,
4397                                         AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
4398                 snd_hda_set_pin_ctl(codec, headphone_nid,
4399                                     pin_ctl | PIN_HP);
4400
4401                 if (spec->effects_switch[PLAY_ENHANCEMENT - EFFECT_START_NID])
4402                         dspio_set_uint_param(codec, 0x80, 0x04, FLOAT_ONE);
4403                 else
4404                         dspio_set_uint_param(codec, 0x80, 0x04, FLOAT_ZERO);
4405                 break;
4406         case SURROUND_OUT:
4407                 codec_dbg(codec, "%s surround\n", __func__);
4408
4409                 /* enable line out node */
4410                 pin_ctl = snd_hda_codec_read(codec, spec->out_pins[0], 0,
4411                                 AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
4412                 snd_hda_set_pin_ctl(codec, spec->out_pins[0],
4413                                                 pin_ctl | PIN_OUT);
4414                 /* Disable headphone out */
4415                 pin_ctl = snd_hda_codec_read(codec, spec->out_pins[1], 0,
4416                                         AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
4417                 snd_hda_set_pin_ctl(codec, spec->out_pins[1],
4418                                     pin_ctl & ~PIN_HP);
4419                 /* Enable EAPD on line out */
4420                 snd_hda_codec_write(codec, spec->out_pins[0], 0,
4421                         AC_VERB_SET_EAPD_BTLENABLE, 0x01);
4422                 /* enable center/lfe out node */
4423                 pin_ctl = snd_hda_codec_read(codec, spec->out_pins[2], 0,
4424                                         AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
4425                 snd_hda_set_pin_ctl(codec, spec->out_pins[2],
4426                                     pin_ctl | PIN_OUT);
4427                 /* Now set rear surround node as out. */
4428                 pin_ctl = snd_hda_codec_read(codec, spec->out_pins[3], 0,
4429                                         AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
4430                 snd_hda_set_pin_ctl(codec, spec->out_pins[3],
4431                                     pin_ctl | PIN_OUT);
4432
4433                 dspio_set_uint_param(codec, 0x80, 0x04, FLOAT_EIGHT);
4434                 break;
4435         }
4436         /*
4437          * Surround always sets it's scp command to req 0x04 to FLOAT_EIGHT.
4438          * With this set though, X_BASS cannot be enabled. So, if we have OutFX
4439          * enabled, we need to make sure X_BASS is off, otherwise everything
4440          * sounds all muffled. Running ca0132_effects_set with X_BASS as the
4441          * effect should sort this out.
4442          */
4443         if (spec->effects_switch[PLAY_ENHANCEMENT - EFFECT_START_NID])
4444                 ca0132_effects_set(codec, X_BASS,
4445                         spec->effects_switch[X_BASS - EFFECT_START_NID]);
4446
4447         /* run through the output dsp commands for the selected output. */
4448         for (i = 0; i < alt_out_presets[spec->cur_out_type].commands; i++) {
4449                 err = dspio_set_uint_param(codec,
4450                 alt_out_presets[spec->cur_out_type].mids[i],
4451                 alt_out_presets[spec->cur_out_type].reqs[i],
4452                 alt_out_presets[spec->cur_out_type].vals[i]);
4453
4454                 if (err < 0)
4455                         goto exit;
4456         }
4457
4458 exit:
4459         snd_hda_power_down_pm(codec);
4460
4461         return err < 0 ? err : 0;
4462 }
4463
4464 static void ca0132_unsol_hp_delayed(struct work_struct *work)
4465 {
4466         struct ca0132_spec *spec = container_of(
4467                 to_delayed_work(work), struct ca0132_spec, unsol_hp_work);
4468         struct hda_jack_tbl *jack;
4469
4470         if (ca0132_use_alt_functions(spec))
4471                 ca0132_alt_select_out(spec->codec);
4472         else
4473                 ca0132_select_out(spec->codec);
4474
4475         jack = snd_hda_jack_tbl_get(spec->codec, spec->unsol_tag_hp);
4476         if (jack) {
4477                 jack->block_report = 0;
4478                 snd_hda_jack_report_sync(spec->codec);
4479         }
4480 }
4481
4482 static void ca0132_set_dmic(struct hda_codec *codec, int enable);
4483 static int ca0132_mic_boost_set(struct hda_codec *codec, long val);
4484 static void resume_mic1(struct hda_codec *codec, unsigned int oldval);
4485 static int stop_mic1(struct hda_codec *codec);
4486 static int ca0132_cvoice_switch_set(struct hda_codec *codec);
4487 static int ca0132_alt_mic_boost_set(struct hda_codec *codec, long val);
4488
4489 /*
4490  * Select the active VIP source
4491  */
4492 static int ca0132_set_vipsource(struct hda_codec *codec, int val)
4493 {
4494         struct ca0132_spec *spec = codec->spec;
4495         unsigned int tmp;
4496
4497         if (spec->dsp_state != DSP_DOWNLOADED)
4498                 return 0;
4499
4500         /* if CrystalVoice if off, vipsource should be 0 */
4501         if (!spec->effects_switch[CRYSTAL_VOICE - EFFECT_START_NID] ||
4502             (val == 0)) {
4503                 chipio_set_control_param(codec, CONTROL_PARAM_VIP_SOURCE, 0);
4504                 chipio_set_conn_rate(codec, MEM_CONNID_MICIN1, SR_96_000);
4505                 chipio_set_conn_rate(codec, MEM_CONNID_MICOUT1, SR_96_000);
4506                 if (spec->cur_mic_type == DIGITAL_MIC)
4507                         tmp = FLOAT_TWO;
4508                 else
4509                         tmp = FLOAT_ONE;
4510                 dspio_set_uint_param(codec, 0x80, 0x00, tmp);
4511                 tmp = FLOAT_ZERO;
4512                 dspio_set_uint_param(codec, 0x80, 0x05, tmp);
4513         } else {
4514                 chipio_set_conn_rate(codec, MEM_CONNID_MICIN1, SR_16_000);
4515                 chipio_set_conn_rate(codec, MEM_CONNID_MICOUT1, SR_16_000);
4516                 if (spec->cur_mic_type == DIGITAL_MIC)
4517                         tmp = FLOAT_TWO;
4518                 else
4519                         tmp = FLOAT_ONE;
4520                 dspio_set_uint_param(codec, 0x80, 0x00, tmp);
4521                 tmp = FLOAT_ONE;
4522                 dspio_set_uint_param(codec, 0x80, 0x05, tmp);
4523                 msleep(20);
4524                 chipio_set_control_param(codec, CONTROL_PARAM_VIP_SOURCE, val);
4525         }
4526
4527         return 1;
4528 }
4529
4530 static int ca0132_alt_set_vipsource(struct hda_codec *codec, int val)
4531 {
4532         struct ca0132_spec *spec = codec->spec;
4533         unsigned int tmp;
4534
4535         if (spec->dsp_state != DSP_DOWNLOADED)
4536                 return 0;
4537
4538         codec_dbg(codec, "%s\n", __func__);
4539
4540         chipio_set_stream_control(codec, 0x03, 0);
4541         chipio_set_stream_control(codec, 0x04, 0);
4542
4543         /* if CrystalVoice is off, vipsource should be 0 */
4544         if (!spec->effects_switch[CRYSTAL_VOICE - EFFECT_START_NID] ||
4545             (val == 0) || spec->in_enum_val == REAR_LINE_IN) {
4546                 codec_dbg(codec, "%s: off.", __func__);
4547                 chipio_set_control_param(codec, CONTROL_PARAM_VIP_SOURCE, 0);
4548
4549                 tmp = FLOAT_ZERO;
4550                 dspio_set_uint_param(codec, 0x80, 0x05, tmp);
4551
4552                 chipio_set_conn_rate(codec, MEM_CONNID_MICIN1, SR_96_000);
4553                 chipio_set_conn_rate(codec, MEM_CONNID_MICOUT1, SR_96_000);
4554                 if (ca0132_quirk(spec) == QUIRK_R3DI)
4555                         chipio_set_conn_rate(codec, 0x0F, SR_96_000);
4556
4557
4558                 if (spec->in_enum_val == REAR_LINE_IN)
4559                         tmp = FLOAT_ZERO;
4560                 else {
4561                         if (ca0132_quirk(spec) == QUIRK_SBZ)
4562                                 tmp = FLOAT_THREE;
4563                         else
4564                                 tmp = FLOAT_ONE;
4565                 }
4566
4567                 dspio_set_uint_param(codec, 0x80, 0x00, tmp);
4568
4569         } else {
4570                 codec_dbg(codec, "%s: on.", __func__);
4571                 chipio_set_conn_rate(codec, MEM_CONNID_MICIN1, SR_16_000);
4572                 chipio_set_conn_rate(codec, MEM_CONNID_MICOUT1, SR_16_000);
4573                 if (ca0132_quirk(spec) == QUIRK_R3DI)
4574                         chipio_set_conn_rate(codec, 0x0F, SR_16_000);
4575
4576                 if (spec->effects_switch[VOICE_FOCUS - EFFECT_START_NID])
4577                         tmp = FLOAT_TWO;
4578                 else
4579                         tmp = FLOAT_ONE;
4580                 dspio_set_uint_param(codec, 0x80, 0x00, tmp);
4581
4582                 tmp = FLOAT_ONE;
4583                 dspio_set_uint_param(codec, 0x80, 0x05, tmp);
4584
4585                 msleep(20);
4586                 chipio_set_control_param(codec, CONTROL_PARAM_VIP_SOURCE, val);
4587         }
4588
4589         chipio_set_stream_control(codec, 0x03, 1);
4590         chipio_set_stream_control(codec, 0x04, 1);
4591
4592         return 1;
4593 }
4594
4595 /*
4596  * Select the active microphone.
4597  * If autodetect is enabled, mic will be selected based on jack detection.
4598  * If jack inserted, ext.mic will be selected, else built-in mic
4599  * If autodetect is disabled, mic will be selected based on selection.
4600  */
4601 static int ca0132_select_mic(struct hda_codec *codec)
4602 {
4603         struct ca0132_spec *spec = codec->spec;
4604         int jack_present;
4605         int auto_jack;
4606
4607         codec_dbg(codec, "ca0132_select_mic\n");
4608
4609         snd_hda_power_up_pm(codec);
4610
4611         auto_jack = spec->vnode_lswitch[VNID_AMIC1_ASEL - VNODE_START_NID];
4612
4613         if (auto_jack)
4614                 jack_present = snd_hda_jack_detect(codec, spec->unsol_tag_amic1);
4615         else
4616                 jack_present =
4617                         spec->vnode_lswitch[VNID_AMIC1_SEL - VNODE_START_NID];
4618
4619         if (jack_present)
4620                 spec->cur_mic_type = LINE_MIC_IN;
4621         else
4622                 spec->cur_mic_type = DIGITAL_MIC;
4623
4624         if (spec->cur_mic_type == DIGITAL_MIC) {
4625                 /* enable digital Mic */
4626                 chipio_set_conn_rate(codec, MEM_CONNID_DMIC, SR_32_000);
4627                 ca0132_set_dmic(codec, 1);
4628                 ca0132_mic_boost_set(codec, 0);
4629                 /* set voice focus */
4630                 ca0132_effects_set(codec, VOICE_FOCUS,
4631                                    spec->effects_switch
4632                                    [VOICE_FOCUS - EFFECT_START_NID]);
4633         } else {
4634                 /* disable digital Mic */
4635                 chipio_set_conn_rate(codec, MEM_CONNID_DMIC, SR_96_000);
4636                 ca0132_set_dmic(codec, 0);
4637                 ca0132_mic_boost_set(codec, spec->cur_mic_boost);
4638                 /* disable voice focus */
4639                 ca0132_effects_set(codec, VOICE_FOCUS, 0);
4640         }
4641
4642         snd_hda_power_down_pm(codec);
4643
4644         return 0;
4645 }
4646
4647 /*
4648  * Select the active input.
4649  * Mic detection isn't used, because it's kind of pointless on the SBZ.
4650  * The front mic has no jack-detection, so the only way to switch to it
4651  * is to do it manually in alsamixer.
4652  */
4653 static int ca0132_alt_select_in(struct hda_codec *codec)
4654 {
4655         struct ca0132_spec *spec = codec->spec;
4656         unsigned int tmp;
4657
4658         codec_dbg(codec, "%s\n", __func__);
4659
4660         snd_hda_power_up_pm(codec);
4661
4662         chipio_set_stream_control(codec, 0x03, 0);
4663         chipio_set_stream_control(codec, 0x04, 0);
4664
4665         spec->cur_mic_type = spec->in_enum_val;
4666
4667         switch (spec->cur_mic_type) {
4668         case REAR_MIC:
4669                 switch (ca0132_quirk(spec)) {
4670                 case QUIRK_SBZ:
4671                 case QUIRK_R3D:
4672                         ca0113_mmio_gpio_set(codec, 0, false);
4673                         tmp = FLOAT_THREE;
4674                         break;
4675                 case QUIRK_ZXR:
4676                         tmp = FLOAT_THREE;
4677                         break;
4678                 case QUIRK_R3DI:
4679                         r3di_gpio_mic_set(codec, R3DI_REAR_MIC);
4680                         tmp = FLOAT_ONE;
4681                         break;
4682                 case QUIRK_AE5:
4683                         ca0113_mmio_command_set(codec, 0x48, 0x28, 0x00);
4684                         tmp = FLOAT_THREE;
4685                         break;
4686                 default:
4687                         tmp = FLOAT_ONE;
4688                         break;
4689                 }
4690
4691                 chipio_set_conn_rate(codec, MEM_CONNID_MICIN1, SR_96_000);
4692                 chipio_set_conn_rate(codec, MEM_CONNID_MICOUT1, SR_96_000);
4693                 if (ca0132_quirk(spec) == QUIRK_R3DI)
4694                         chipio_set_conn_rate(codec, 0x0F, SR_96_000);
4695
4696                 dspio_set_uint_param(codec, 0x80, 0x00, tmp);
4697
4698                 chipio_set_stream_control(codec, 0x03, 1);
4699                 chipio_set_stream_control(codec, 0x04, 1);
4700                 switch (ca0132_quirk(spec)) {
4701                 case QUIRK_SBZ:
4702                         chipio_write(codec, 0x18B098, 0x0000000C);
4703                         chipio_write(codec, 0x18B09C, 0x0000000C);
4704                         break;
4705                 case QUIRK_ZXR:
4706                         chipio_write(codec, 0x18B098, 0x0000000C);
4707                         chipio_write(codec, 0x18B09C, 0x000000CC);
4708                         break;
4709                 case QUIRK_AE5:
4710                         chipio_write(codec, 0x18B098, 0x0000000C);
4711                         chipio_write(codec, 0x18B09C, 0x0000004C);
4712                         break;
4713                 default:
4714                         break;
4715                 }
4716                 ca0132_alt_mic_boost_set(codec, spec->mic_boost_enum_val);
4717                 break;
4718         case REAR_LINE_IN:
4719                 ca0132_mic_boost_set(codec, 0);
4720                 switch (ca0132_quirk(spec)) {
4721                 case QUIRK_SBZ:
4722                 case QUIRK_R3D:
4723                         ca0113_mmio_gpio_set(codec, 0, false);
4724                         break;
4725                 case QUIRK_R3DI:
4726                         r3di_gpio_mic_set(codec, R3DI_REAR_MIC);
4727                         break;
4728                 case QUIRK_AE5:
4729                         ca0113_mmio_command_set(codec, 0x48, 0x28, 0x00);
4730                         break;
4731                 default:
4732                         break;
4733                 }
4734
4735                 chipio_set_conn_rate(codec, MEM_CONNID_MICIN1, SR_96_000);
4736                 chipio_set_conn_rate(codec, MEM_CONNID_MICOUT1, SR_96_000);
4737                 if (ca0132_quirk(spec) == QUIRK_R3DI)
4738                         chipio_set_conn_rate(codec, 0x0F, SR_96_000);
4739
4740                 tmp = FLOAT_ZERO;
4741                 dspio_set_uint_param(codec, 0x80, 0x00, tmp);
4742
4743                 switch (ca0132_quirk(spec)) {
4744                 case QUIRK_SBZ:
4745                 case QUIRK_AE5:
4746                         chipio_write(codec, 0x18B098, 0x00000000);
4747                         chipio_write(codec, 0x18B09C, 0x00000000);
4748                         break;
4749                 default:
4750                         break;
4751                 }
4752                 chipio_set_stream_control(codec, 0x03, 1);
4753                 chipio_set_stream_control(codec, 0x04, 1);
4754                 break;
4755         case FRONT_MIC:
4756                 switch (ca0132_quirk(spec)) {
4757                 case QUIRK_SBZ:
4758                 case QUIRK_R3D:
4759                         ca0113_mmio_gpio_set(codec, 0, true);
4760                         ca0113_mmio_gpio_set(codec, 5, false);
4761                         tmp = FLOAT_THREE;
4762                         break;
4763                 case QUIRK_R3DI:
4764                         r3di_gpio_mic_set(codec, R3DI_FRONT_MIC);
4765                         tmp = FLOAT_ONE;
4766                         break;
4767                 case QUIRK_AE5:
4768                         ca0113_mmio_command_set(codec, 0x48, 0x28, 0x3f);
4769                         tmp = FLOAT_THREE;
4770                         break;
4771                 default:
4772                         tmp = FLOAT_ONE;
4773                         break;
4774                 }
4775
4776                 chipio_set_conn_rate(codec, MEM_CONNID_MICIN1, SR_96_000);
4777                 chipio_set_conn_rate(codec, MEM_CONNID_MICOUT1, SR_96_000);
4778                 if (ca0132_quirk(spec) == QUIRK_R3DI)
4779                         chipio_set_conn_rate(codec, 0x0F, SR_96_000);
4780
4781                 dspio_set_uint_param(codec, 0x80, 0x00, tmp);
4782
4783                 chipio_set_stream_control(codec, 0x03, 1);
4784                 chipio_set_stream_control(codec, 0x04, 1);
4785
4786                 switch (ca0132_quirk(spec)) {
4787                 case QUIRK_SBZ:
4788                         chipio_write(codec, 0x18B098, 0x0000000C);
4789                         chipio_write(codec, 0x18B09C, 0x000000CC);
4790                         break;
4791                 case QUIRK_AE5:
4792                         chipio_write(codec, 0x18B098, 0x0000000C);
4793                         chipio_write(codec, 0x18B09C, 0x0000004C);
4794                         break;
4795                 default:
4796                         break;
4797                 }
4798                 ca0132_alt_mic_boost_set(codec, spec->mic_boost_enum_val);
4799                 break;
4800         }
4801         ca0132_cvoice_switch_set(codec);
4802
4803         snd_hda_power_down_pm(codec);
4804         return 0;
4805 }
4806
4807 /*
4808  * Check if VNODE settings take effect immediately.
4809  */
4810 static bool ca0132_is_vnode_effective(struct hda_codec *codec,
4811                                      hda_nid_t vnid,
4812                                      hda_nid_t *shared_nid)
4813 {
4814         struct ca0132_spec *spec = codec->spec;
4815         hda_nid_t nid;
4816
4817         switch (vnid) {
4818         case VNID_SPK:
4819                 nid = spec->shared_out_nid;
4820                 break;
4821         case VNID_MIC:
4822                 nid = spec->shared_mic_nid;
4823                 break;
4824         default:
4825                 return false;
4826         }
4827
4828         if (shared_nid)
4829                 *shared_nid = nid;
4830
4831         return true;
4832 }
4833
4834 /*
4835 * The following functions are control change helpers.
4836 * They return 0 if no changed.  Return 1 if changed.
4837 */
4838 static int ca0132_voicefx_set(struct hda_codec *codec, int enable)
4839 {
4840         struct ca0132_spec *spec = codec->spec;
4841         unsigned int tmp;
4842
4843         /* based on CrystalVoice state to enable VoiceFX. */
4844         if (enable) {
4845                 tmp = spec->effects_switch[CRYSTAL_VOICE - EFFECT_START_NID] ?
4846                         FLOAT_ONE : FLOAT_ZERO;
4847         } else {
4848                 tmp = FLOAT_ZERO;
4849         }
4850
4851         dspio_set_uint_param(codec, ca0132_voicefx.mid,
4852                              ca0132_voicefx.reqs[0], tmp);
4853
4854         return 1;
4855 }
4856
4857 /*
4858  * Set the effects parameters
4859  */
4860 static int ca0132_effects_set(struct hda_codec *codec, hda_nid_t nid, long val)
4861 {
4862         struct ca0132_spec *spec = codec->spec;
4863         unsigned int on, tmp;
4864         int num_fx = OUT_EFFECTS_COUNT + IN_EFFECTS_COUNT;
4865         int err = 0;
4866         int idx = nid - EFFECT_START_NID;
4867
4868         if ((idx < 0) || (idx >= num_fx))
4869                 return 0; /* no changed */
4870
4871         /* for out effect, qualify with PE */
4872         if ((nid >= OUT_EFFECT_START_NID) && (nid < OUT_EFFECT_END_NID)) {
4873                 /* if PE if off, turn off out effects. */
4874                 if (!spec->effects_switch[PLAY_ENHANCEMENT - EFFECT_START_NID])
4875                         val = 0;
4876                 if (spec->cur_out_type == SURROUND_OUT && nid == X_BASS)
4877                         val = 0;
4878         }
4879
4880         /* for in effect, qualify with CrystalVoice */
4881         if ((nid >= IN_EFFECT_START_NID) && (nid < IN_EFFECT_END_NID)) {
4882                 /* if CrystalVoice if off, turn off in effects. */
4883                 if (!spec->effects_switch[CRYSTAL_VOICE - EFFECT_START_NID])
4884                         val = 0;
4885
4886                 /* Voice Focus applies to 2-ch Mic, Digital Mic */
4887                 if ((nid == VOICE_FOCUS) && (spec->cur_mic_type != DIGITAL_MIC))
4888                         val = 0;
4889
4890                 /* If Voice Focus on SBZ, set to two channel. */
4891                 if ((nid == VOICE_FOCUS) && ca0132_use_pci_mmio(spec)
4892                                 && (spec->cur_mic_type != REAR_LINE_IN)) {
4893                         if (spec->effects_switch[CRYSTAL_VOICE -
4894                                                  EFFECT_START_NID]) {
4895
4896                                 if (spec->effects_switch[VOICE_FOCUS -
4897                                                          EFFECT_START_NID]) {
4898                                         tmp = FLOAT_TWO;
4899                                         val = 1;
4900                                 } else
4901                                         tmp = FLOAT_ONE;
4902
4903                                 dspio_set_uint_param(codec, 0x80, 0x00, tmp);
4904                         }
4905                 }
4906                 /*
4907                  * For SBZ noise reduction, there's an extra command
4908                  * to module ID 0x47. No clue why.
4909                  */
4910                 if ((nid == NOISE_REDUCTION) && ca0132_use_pci_mmio(spec)
4911                                 && (spec->cur_mic_type != REAR_LINE_IN)) {
4912                         if (spec->effects_switch[CRYSTAL_VOICE -
4913                                                  EFFECT_START_NID]) {
4914                                 if (spec->effects_switch[NOISE_REDUCTION -
4915                                                          EFFECT_START_NID])
4916                                         tmp = FLOAT_ONE;
4917                                 else
4918                                         tmp = FLOAT_ZERO;
4919                         } else
4920                                 tmp = FLOAT_ZERO;
4921
4922                         dspio_set_uint_param(codec, 0x47, 0x00, tmp);
4923                 }
4924
4925                 /* If rear line in disable effects. */
4926                 if (ca0132_use_alt_functions(spec) &&
4927                                 spec->in_enum_val == REAR_LINE_IN)
4928                         val = 0;
4929         }
4930
4931         codec_dbg(codec, "ca0132_effect_set: nid=0x%x, val=%ld\n",
4932                     nid, val);
4933
4934         on = (val == 0) ? FLOAT_ZERO : FLOAT_ONE;
4935         err = dspio_set_uint_param(codec, ca0132_effects[idx].mid,
4936                                    ca0132_effects[idx].reqs[0], on);
4937
4938         if (err < 0)
4939                 return 0; /* no changed */
4940
4941         return 1;
4942 }
4943
4944 /*
4945  * Turn on/off Playback Enhancements
4946  */
4947 static int ca0132_pe_switch_set(struct hda_codec *codec)
4948 {
4949         struct ca0132_spec *spec = codec->spec;
4950         hda_nid_t nid;
4951         int i, ret = 0;
4952
4953         codec_dbg(codec, "ca0132_pe_switch_set: val=%ld\n",
4954                     spec->effects_switch[PLAY_ENHANCEMENT - EFFECT_START_NID]);
4955
4956         if (ca0132_use_alt_functions(spec))
4957                 ca0132_alt_select_out(codec);
4958
4959         i = OUT_EFFECT_START_NID - EFFECT_START_NID;
4960         nid = OUT_EFFECT_START_NID;
4961         /* PE affects all out effects */
4962         for (; nid < OUT_EFFECT_END_NID; nid++, i++)
4963                 ret |= ca0132_effects_set(codec, nid, spec->effects_switch[i]);
4964
4965         return ret;
4966 }
4967
4968 /* Check if Mic1 is streaming, if so, stop streaming */
4969 static int stop_mic1(struct hda_codec *codec)
4970 {
4971         struct ca0132_spec *spec = codec->spec;
4972         unsigned int oldval = snd_hda_codec_read(codec, spec->adcs[0], 0,
4973                                                  AC_VERB_GET_CONV, 0);
4974         if (oldval != 0)
4975                 snd_hda_codec_write(codec, spec->adcs[0], 0,
4976                                     AC_VERB_SET_CHANNEL_STREAMID,
4977                                     0);
4978         return oldval;
4979 }
4980
4981 /* Resume Mic1 streaming if it was stopped. */
4982 static void resume_mic1(struct hda_codec *codec, unsigned int oldval)
4983 {
4984         struct ca0132_spec *spec = codec->spec;
4985         /* Restore the previous stream and channel */
4986         if (oldval != 0)
4987                 snd_hda_codec_write(codec, spec->adcs[0], 0,
4988                                     AC_VERB_SET_CHANNEL_STREAMID,
4989                                     oldval);
4990 }
4991
4992 /*
4993  * Turn on/off CrystalVoice
4994  */
4995 static int ca0132_cvoice_switch_set(struct hda_codec *codec)
4996 {
4997         struct ca0132_spec *spec = codec->spec;
4998         hda_nid_t nid;
4999         int i, ret = 0;
5000         unsigned int oldval;
5001
5002         codec_dbg(codec, "ca0132_cvoice_switch_set: val=%ld\n",
5003                     spec->effects_switch[CRYSTAL_VOICE - EFFECT_START_NID]);
5004
5005         i = IN_EFFECT_START_NID - EFFECT_START_NID;
5006         nid = IN_EFFECT_START_NID;
5007         /* CrystalVoice affects all in effects */
5008         for (; nid < IN_EFFECT_END_NID; nid++, i++)
5009                 ret |= ca0132_effects_set(codec, nid, spec->effects_switch[i]);
5010
5011         /* including VoiceFX */
5012         ret |= ca0132_voicefx_set(codec, (spec->voicefx_val ? 1 : 0));
5013
5014         /* set correct vipsource */
5015         oldval = stop_mic1(codec);
5016         if (ca0132_use_alt_functions(spec))
5017                 ret |= ca0132_alt_set_vipsource(codec, 1);
5018         else
5019                 ret |= ca0132_set_vipsource(codec, 1);
5020         resume_mic1(codec, oldval);
5021         return ret;
5022 }
5023
5024 static int ca0132_mic_boost_set(struct hda_codec *codec, long val)
5025 {
5026         struct ca0132_spec *spec = codec->spec;
5027         int ret = 0;
5028
5029         if (val) /* on */
5030                 ret = snd_hda_codec_amp_update(codec, spec->input_pins[0], 0,
5031                                         HDA_INPUT, 0, HDA_AMP_VOLMASK, 3);
5032         else /* off */
5033                 ret = snd_hda_codec_amp_update(codec, spec->input_pins[0], 0,
5034                                         HDA_INPUT, 0, HDA_AMP_VOLMASK, 0);
5035
5036         return ret;
5037 }
5038
5039 static int ca0132_alt_mic_boost_set(struct hda_codec *codec, long val)
5040 {
5041         struct ca0132_spec *spec = codec->spec;
5042         int ret = 0;
5043
5044         ret = snd_hda_codec_amp_update(codec, spec->input_pins[0], 0,
5045                                 HDA_INPUT, 0, HDA_AMP_VOLMASK, val);
5046         return ret;
5047 }
5048
5049 static int ae5_headphone_gain_set(struct hda_codec *codec, long val)
5050 {
5051         unsigned int i;
5052
5053         for (i = 0; i < 4; i++)
5054                 ca0113_mmio_command_set(codec, 0x48, 0x11 + i,
5055                                 ae5_headphone_gain_presets[val].vals[i]);
5056         return 0;
5057 }
5058
5059 /*
5060  * gpio pin 1 is a relay that switches on/off, apparently setting the headphone
5061  * amplifier to handle a 600 ohm load.
5062  */
5063 static int zxr_headphone_gain_set(struct hda_codec *codec, long val)
5064 {
5065         ca0113_mmio_gpio_set(codec, 1, val);
5066
5067         return 0;
5068 }
5069
5070 static int ca0132_vnode_switch_set(struct snd_kcontrol *kcontrol,
5071                                 struct snd_ctl_elem_value *ucontrol)
5072 {
5073         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
5074         hda_nid_t nid = get_amp_nid(kcontrol);
5075         hda_nid_t shared_nid = 0;
5076         bool effective;
5077         int ret = 0;
5078         struct ca0132_spec *spec = codec->spec;
5079         int auto_jack;
5080
5081         if (nid == VNID_HP_SEL) {
5082                 auto_jack =
5083                         spec->vnode_lswitch[VNID_HP_ASEL - VNODE_START_NID];
5084                 if (!auto_jack) {
5085                         if (ca0132_use_alt_functions(spec))
5086                                 ca0132_alt_select_out(codec);
5087                         else
5088                                 ca0132_select_out(codec);
5089                 }
5090                 return 1;
5091         }
5092
5093         if (nid == VNID_AMIC1_SEL) {
5094                 auto_jack =
5095                         spec->vnode_lswitch[VNID_AMIC1_ASEL - VNODE_START_NID];
5096                 if (!auto_jack)
5097                         ca0132_select_mic(codec);
5098                 return 1;
5099         }
5100
5101         if (nid == VNID_HP_ASEL) {
5102                 if (ca0132_use_alt_functions(spec))
5103                         ca0132_alt_select_out(codec);
5104                 else
5105                         ca0132_select_out(codec);
5106                 return 1;
5107         }
5108
5109         if (nid == VNID_AMIC1_ASEL) {
5110                 ca0132_select_mic(codec);
5111                 return 1;
5112         }
5113
5114         /* if effective conditions, then update hw immediately. */
5115         effective = ca0132_is_vnode_effective(codec, nid, &shared_nid);
5116         if (effective) {
5117                 int dir = get_amp_direction(kcontrol);
5118                 int ch = get_amp_channels(kcontrol);
5119                 unsigned long pval;
5120
5121                 mutex_lock(&codec->control_mutex);
5122                 pval = kcontrol->private_value;
5123                 kcontrol->private_value = HDA_COMPOSE_AMP_VAL(shared_nid, ch,
5124                                                                 0, dir);
5125                 ret = snd_hda_mixer_amp_switch_put(kcontrol, ucontrol);
5126                 kcontrol->private_value = pval;
5127                 mutex_unlock(&codec->control_mutex);
5128         }
5129
5130         return ret;
5131 }
5132 /* End of control change helpers. */
5133 /*
5134  * Below I've added controls to mess with the effect levels, I've only enabled
5135  * them on the Sound Blaster Z, but they would probably also work on the
5136  * Chromebook. I figured they were probably tuned specifically for it, and left
5137  * out for a reason.
5138  */
5139
5140 /* Sets DSP effect level from the sliders above the controls */
5141 static int ca0132_alt_slider_ctl_set(struct hda_codec *codec, hda_nid_t nid,
5142                           const unsigned int *lookup, int idx)
5143 {
5144         int i = 0;
5145         unsigned int y;
5146         /*
5147          * For X_BASS, req 2 is actually crossover freq instead of
5148          * effect level
5149          */
5150         if (nid == X_BASS)
5151                 y = 2;
5152         else
5153                 y = 1;
5154
5155         snd_hda_power_up(codec);
5156         if (nid == XBASS_XOVER) {
5157                 for (i = 0; i < OUT_EFFECTS_COUNT; i++)
5158                         if (ca0132_effects[i].nid == X_BASS)
5159                                 break;
5160
5161                 dspio_set_param(codec, ca0132_effects[i].mid, 0x20,
5162                                 ca0132_effects[i].reqs[1],
5163                                 &(lookup[idx - 1]), sizeof(unsigned int));
5164         } else {
5165                 /* Find the actual effect structure */
5166                 for (i = 0; i < OUT_EFFECTS_COUNT; i++)
5167                         if (nid == ca0132_effects[i].nid)
5168                                 break;
5169
5170                 dspio_set_param(codec, ca0132_effects[i].mid, 0x20,
5171                                 ca0132_effects[i].reqs[y],
5172                                 &(lookup[idx]), sizeof(unsigned int));
5173         }
5174
5175         snd_hda_power_down(codec);
5176
5177         return 0;
5178 }
5179
5180 static int ca0132_alt_xbass_xover_slider_ctl_get(struct snd_kcontrol *kcontrol,
5181                           struct snd_ctl_elem_value *ucontrol)
5182 {
5183         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
5184         struct ca0132_spec *spec = codec->spec;
5185         long *valp = ucontrol->value.integer.value;
5186
5187         *valp = spec->xbass_xover_freq;
5188         return 0;
5189 }
5190
5191 static int ca0132_alt_slider_ctl_get(struct snd_kcontrol *kcontrol,
5192                           struct snd_ctl_elem_value *ucontrol)
5193 {
5194         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
5195         struct ca0132_spec *spec = codec->spec;
5196         hda_nid_t nid = get_amp_nid(kcontrol);
5197         long *valp = ucontrol->value.integer.value;
5198         int idx = nid - OUT_EFFECT_START_NID;
5199
5200         *valp = spec->fx_ctl_val[idx];
5201         return 0;
5202 }
5203
5204 /*
5205  * The X-bass crossover starts at 10hz, so the min is 1. The
5206  * frequency is set in multiples of 10.
5207  */
5208 static int ca0132_alt_xbass_xover_slider_info(struct snd_kcontrol *kcontrol,
5209                 struct snd_ctl_elem_info *uinfo)
5210 {
5211         uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
5212         uinfo->count = 1;
5213         uinfo->value.integer.min = 1;
5214         uinfo->value.integer.max = 100;
5215         uinfo->value.integer.step = 1;
5216
5217         return 0;
5218 }
5219
5220 static int ca0132_alt_effect_slider_info(struct snd_kcontrol *kcontrol,
5221                 struct snd_ctl_elem_info *uinfo)
5222 {
5223         int chs = get_amp_channels(kcontrol);
5224
5225         uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
5226         uinfo->count = chs == 3 ? 2 : 1;
5227         uinfo->value.integer.min = 0;
5228         uinfo->value.integer.max = 100;
5229         uinfo->value.integer.step = 1;
5230
5231         return 0;
5232 }
5233
5234 static int ca0132_alt_xbass_xover_slider_put(struct snd_kcontrol *kcontrol,
5235                                 struct snd_ctl_elem_value *ucontrol)
5236 {
5237         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
5238         struct ca0132_spec *spec = codec->spec;
5239         hda_nid_t nid = get_amp_nid(kcontrol);
5240         long *valp = ucontrol->value.integer.value;
5241         int idx;
5242
5243         /* any change? */
5244         if (spec->xbass_xover_freq == *valp)
5245                 return 0;
5246
5247         spec->xbass_xover_freq = *valp;
5248
5249         idx = *valp;
5250         ca0132_alt_slider_ctl_set(codec, nid, float_xbass_xover_lookup, idx);
5251
5252         return 0;
5253 }
5254
5255 static int ca0132_alt_effect_slider_put(struct snd_kcontrol *kcontrol,
5256                                 struct snd_ctl_elem_value *ucontrol)
5257 {
5258         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
5259         struct ca0132_spec *spec = codec->spec;
5260         hda_nid_t nid = get_amp_nid(kcontrol);
5261         long *valp = ucontrol->value.integer.value;
5262         int idx;
5263
5264         idx = nid - EFFECT_START_NID;
5265         /* any change? */
5266         if (spec->fx_ctl_val[idx] == *valp)
5267                 return 0;
5268
5269         spec->fx_ctl_val[idx] = *valp;
5270
5271         idx = *valp;
5272         ca0132_alt_slider_ctl_set(codec, nid, float_zero_to_one_lookup, idx);
5273
5274         return 0;
5275 }
5276
5277
5278 /*
5279  * Mic Boost Enum for alternative ca0132 codecs. I didn't like that the original
5280  * only has off or full 30 dB, and didn't like making a volume slider that has
5281  * traditional 0-100 in alsamixer that goes in big steps. I like enum better.
5282  */
5283 #define MIC_BOOST_NUM_OF_STEPS 4
5284 #define MIC_BOOST_ENUM_MAX_STRLEN 10
5285
5286 static int ca0132_alt_mic_boost_info(struct snd_kcontrol *kcontrol,
5287                                  struct snd_ctl_elem_info *uinfo)
5288 {
5289         char *sfx = "dB";
5290         char namestr[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
5291
5292         uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
5293         uinfo->count = 1;
5294         uinfo->value.enumerated.items = MIC_BOOST_NUM_OF_STEPS;
5295         if (uinfo->value.enumerated.item >= MIC_BOOST_NUM_OF_STEPS)
5296                 uinfo->value.enumerated.item = MIC_BOOST_NUM_OF_STEPS - 1;
5297         sprintf(namestr, "%d %s", (uinfo->value.enumerated.item * 10), sfx);
5298         strcpy(uinfo->value.enumerated.name, namestr);
5299         return 0;
5300 }
5301
5302 static int ca0132_alt_mic_boost_get(struct snd_kcontrol *kcontrol,
5303                                 struct snd_ctl_elem_value *ucontrol)
5304 {
5305         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
5306         struct ca0132_spec *spec = codec->spec;
5307
5308         ucontrol->value.enumerated.item[0] = spec->mic_boost_enum_val;
5309         return 0;
5310 }
5311
5312 static int ca0132_alt_mic_boost_put(struct snd_kcontrol *kcontrol,
5313                                 struct snd_ctl_elem_value *ucontrol)
5314 {
5315         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
5316         struct ca0132_spec *spec = codec->spec;
5317         int sel = ucontrol->value.enumerated.item[0];
5318         unsigned int items = MIC_BOOST_NUM_OF_STEPS;
5319
5320         if (sel >= items)
5321                 return 0;
5322
5323         codec_dbg(codec, "ca0132_alt_mic_boost: boost=%d\n",
5324                     sel);
5325
5326         spec->mic_boost_enum_val = sel;
5327
5328         if (spec->in_enum_val != REAR_LINE_IN)
5329                 ca0132_alt_mic_boost_set(codec, spec->mic_boost_enum_val);
5330
5331         return 1;
5332 }
5333
5334 /*
5335  * Sound BlasterX AE-5 Headphone Gain Controls.
5336  */
5337 #define AE5_HEADPHONE_GAIN_MAX 3
5338 static int ae5_headphone_gain_info(struct snd_kcontrol *kcontrol,
5339                                  struct snd_ctl_elem_info *uinfo)
5340 {
5341         char *sfx = " Ohms)";
5342         char namestr[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
5343
5344         uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
5345         uinfo->count = 1;
5346         uinfo->value.enumerated.items = AE5_HEADPHONE_GAIN_MAX;
5347         if (uinfo->value.enumerated.item >= AE5_HEADPHONE_GAIN_MAX)
5348                 uinfo->value.enumerated.item = AE5_HEADPHONE_GAIN_MAX - 1;
5349         sprintf(namestr, "%s %s",
5350                 ae5_headphone_gain_presets[uinfo->value.enumerated.item].name,
5351                 sfx);
5352         strcpy(uinfo->value.enumerated.name, namestr);
5353         return 0;
5354 }
5355
5356 static int ae5_headphone_gain_get(struct snd_kcontrol *kcontrol,
5357                                 struct snd_ctl_elem_value *ucontrol)
5358 {
5359         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
5360         struct ca0132_spec *spec = codec->spec;
5361
5362         ucontrol->value.enumerated.item[0] = spec->ae5_headphone_gain_val;
5363         return 0;
5364 }
5365
5366 static int ae5_headphone_gain_put(struct snd_kcontrol *kcontrol,
5367                                 struct snd_ctl_elem_value *ucontrol)
5368 {
5369         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
5370         struct ca0132_spec *spec = codec->spec;
5371         int sel = ucontrol->value.enumerated.item[0];
5372         unsigned int items = AE5_HEADPHONE_GAIN_MAX;
5373
5374         if (sel >= items)
5375                 return 0;
5376
5377         codec_dbg(codec, "ae5_headphone_gain: boost=%d\n",
5378                     sel);
5379
5380         spec->ae5_headphone_gain_val = sel;
5381
5382         if (spec->out_enum_val == HEADPHONE_OUT)
5383                 ae5_headphone_gain_set(codec, spec->ae5_headphone_gain_val);
5384
5385         return 1;
5386 }
5387
5388 /*
5389  * Sound BlasterX AE-5 sound filter enumerated control.
5390  */
5391 #define AE5_SOUND_FILTER_MAX 3
5392
5393 static int ae5_sound_filter_info(struct snd_kcontrol *kcontrol,
5394                                  struct snd_ctl_elem_info *uinfo)
5395 {
5396         char namestr[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
5397
5398         uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
5399         uinfo->count = 1;
5400         uinfo->value.enumerated.items = AE5_SOUND_FILTER_MAX;
5401         if (uinfo->value.enumerated.item >= AE5_SOUND_FILTER_MAX)
5402                 uinfo->value.enumerated.item = AE5_SOUND_FILTER_MAX - 1;
5403         sprintf(namestr, "%s",
5404                         ae5_filter_presets[uinfo->value.enumerated.item].name);
5405         strcpy(uinfo->value.enumerated.name, namestr);
5406         return 0;
5407 }
5408
5409 static int ae5_sound_filter_get(struct snd_kcontrol *kcontrol,
5410                                 struct snd_ctl_elem_value *ucontrol)
5411 {
5412         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
5413         struct ca0132_spec *spec = codec->spec;
5414
5415         ucontrol->value.enumerated.item[0] = spec->ae5_filter_val;
5416         return 0;
5417 }
5418
5419 static int ae5_sound_filter_put(struct snd_kcontrol *kcontrol,
5420                                 struct snd_ctl_elem_value *ucontrol)
5421 {
5422         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
5423         struct ca0132_spec *spec = codec->spec;
5424         int sel = ucontrol->value.enumerated.item[0];
5425         unsigned int items = AE5_SOUND_FILTER_MAX;
5426
5427         if (sel >= items)
5428                 return 0;
5429
5430         codec_dbg(codec, "ae5_sound_filter: %s\n",
5431                         ae5_filter_presets[sel].name);
5432
5433         spec->ae5_filter_val = sel;
5434
5435         ca0113_mmio_command_set_type2(codec, 0x48, 0x07,
5436                         ae5_filter_presets[sel].val);
5437
5438         return 1;
5439 }
5440
5441 /*
5442  * Input Select Control for alternative ca0132 codecs. This exists because
5443  * front microphone has no auto-detect, and we need a way to set the rear
5444  * as line-in
5445  */
5446 static int ca0132_alt_input_source_info(struct snd_kcontrol *kcontrol,
5447                                  struct snd_ctl_elem_info *uinfo)
5448 {
5449         uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
5450         uinfo->count = 1;
5451         uinfo->value.enumerated.items = IN_SRC_NUM_OF_INPUTS;
5452         if (uinfo->value.enumerated.item >= IN_SRC_NUM_OF_INPUTS)
5453                 uinfo->value.enumerated.item = IN_SRC_NUM_OF_INPUTS - 1;
5454         strcpy(uinfo->value.enumerated.name,
5455                         in_src_str[uinfo->value.enumerated.item]);
5456         return 0;
5457 }
5458
5459 static int ca0132_alt_input_source_get(struct snd_kcontrol *kcontrol,
5460                                 struct snd_ctl_elem_value *ucontrol)
5461 {
5462         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
5463         struct ca0132_spec *spec = codec->spec;
5464
5465         ucontrol->value.enumerated.item[0] = spec->in_enum_val;
5466         return 0;
5467 }
5468
5469 static int ca0132_alt_input_source_put(struct snd_kcontrol *kcontrol,
5470                                 struct snd_ctl_elem_value *ucontrol)
5471 {
5472         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
5473         struct ca0132_spec *spec = codec->spec;
5474         int sel = ucontrol->value.enumerated.item[0];
5475         unsigned int items = IN_SRC_NUM_OF_INPUTS;
5476
5477         if (sel >= items)
5478                 return 0;
5479
5480         codec_dbg(codec, "ca0132_alt_input_select: sel=%d, preset=%s\n",
5481                     sel, in_src_str[sel]);
5482
5483         spec->in_enum_val = sel;
5484
5485         ca0132_alt_select_in(codec);
5486
5487         return 1;
5488 }
5489
5490 /* Sound Blaster Z Output Select Control */
5491 static int ca0132_alt_output_select_get_info(struct snd_kcontrol *kcontrol,
5492                                  struct snd_ctl_elem_info *uinfo)
5493 {
5494         uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
5495         uinfo->count = 1;
5496         uinfo->value.enumerated.items = NUM_OF_OUTPUTS;
5497         if (uinfo->value.enumerated.item >= NUM_OF_OUTPUTS)
5498                 uinfo->value.enumerated.item = NUM_OF_OUTPUTS - 1;
5499         strcpy(uinfo->value.enumerated.name,
5500                         alt_out_presets[uinfo->value.enumerated.item].name);
5501         return 0;
5502 }
5503
5504 static int ca0132_alt_output_select_get(struct snd_kcontrol *kcontrol,
5505                                 struct snd_ctl_elem_value *ucontrol)
5506 {
5507         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
5508         struct ca0132_spec *spec = codec->spec;
5509
5510         ucontrol->value.enumerated.item[0] = spec->out_enum_val;
5511         return 0;
5512 }
5513
5514 static int ca0132_alt_output_select_put(struct snd_kcontrol *kcontrol,
5515                                 struct snd_ctl_elem_value *ucontrol)
5516 {
5517         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
5518         struct ca0132_spec *spec = codec->spec;
5519         int sel = ucontrol->value.enumerated.item[0];
5520         unsigned int items = NUM_OF_OUTPUTS;
5521         unsigned int auto_jack;
5522
5523         if (sel >= items)
5524                 return 0;
5525
5526         codec_dbg(codec, "ca0132_alt_output_select: sel=%d, preset=%s\n",
5527                     sel, alt_out_presets[sel].name);
5528
5529         spec->out_enum_val = sel;
5530
5531         auto_jack = spec->vnode_lswitch[VNID_HP_ASEL - VNODE_START_NID];
5532
5533         if (!auto_jack)
5534                 ca0132_alt_select_out(codec);
5535
5536         return 1;
5537 }
5538
5539 /*
5540  * Smart Volume output setting control. Three different settings, Normal,
5541  * which takes the value from the smart volume slider. The two others, loud
5542  * and night, disregard the slider value and have uneditable values.
5543  */
5544 #define NUM_OF_SVM_SETTINGS 3
5545 static const char *const out_svm_set_enum_str[3] = {"Normal", "Loud", "Night" };
5546
5547 static int ca0132_alt_svm_setting_info(struct snd_kcontrol *kcontrol,
5548                                  struct snd_ctl_elem_info *uinfo)
5549 {
5550         uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
5551         uinfo->count = 1;
5552         uinfo->value.enumerated.items = NUM_OF_SVM_SETTINGS;
5553         if (uinfo->value.enumerated.item >= NUM_OF_SVM_SETTINGS)
5554                 uinfo->value.enumerated.item = NUM_OF_SVM_SETTINGS - 1;
5555         strcpy(uinfo->value.enumerated.name,
5556                         out_svm_set_enum_str[uinfo->value.enumerated.item]);
5557         return 0;
5558 }
5559
5560 static int ca0132_alt_svm_setting_get(struct snd_kcontrol *kcontrol,
5561                                 struct snd_ctl_elem_value *ucontrol)
5562 {
5563         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
5564         struct ca0132_spec *spec = codec->spec;
5565
5566         ucontrol->value.enumerated.item[0] = spec->smart_volume_setting;
5567         return 0;
5568 }
5569
5570 static int ca0132_alt_svm_setting_put(struct snd_kcontrol *kcontrol,
5571                                 struct snd_ctl_elem_value *ucontrol)
5572 {
5573         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
5574         struct ca0132_spec *spec = codec->spec;
5575         int sel = ucontrol->value.enumerated.item[0];
5576         unsigned int items = NUM_OF_SVM_SETTINGS;
5577         unsigned int idx = SMART_VOLUME - EFFECT_START_NID;
5578         unsigned int tmp;
5579
5580         if (sel >= items)
5581                 return 0;
5582
5583         codec_dbg(codec, "ca0132_alt_svm_setting: sel=%d, preset=%s\n",
5584                     sel, out_svm_set_enum_str[sel]);
5585
5586         spec->smart_volume_setting = sel;
5587
5588         switch (sel) {
5589         case 0:
5590                 tmp = FLOAT_ZERO;
5591                 break;
5592         case 1:
5593                 tmp = FLOAT_ONE;
5594                 break;
5595         case 2:
5596                 tmp = FLOAT_TWO;
5597                 break;
5598         default:
5599                 tmp = FLOAT_ZERO;
5600                 break;
5601         }
5602         /* Req 2 is the Smart Volume Setting req. */
5603         dspio_set_uint_param(codec, ca0132_effects[idx].mid,
5604                         ca0132_effects[idx].reqs[2], tmp);
5605         return 1;
5606 }
5607
5608 /* Sound Blaster Z EQ preset controls */
5609 static int ca0132_alt_eq_preset_info(struct snd_kcontrol *kcontrol,
5610                                  struct snd_ctl_elem_info *uinfo)
5611 {
5612         unsigned int items = ARRAY_SIZE(ca0132_alt_eq_presets);
5613
5614         uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
5615         uinfo->count = 1;
5616         uinfo->value.enumerated.items = items;
5617         if (uinfo->value.enumerated.item >= items)
5618                 uinfo->value.enumerated.item = items - 1;
5619         strcpy(uinfo->value.enumerated.name,
5620                 ca0132_alt_eq_presets[uinfo->value.enumerated.item].name);
5621         return 0;
5622 }
5623
5624 static int ca0132_alt_eq_preset_get(struct snd_kcontrol *kcontrol,
5625                                 struct snd_ctl_elem_value *ucontrol)
5626 {
5627         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
5628         struct ca0132_spec *spec = codec->spec;
5629
5630         ucontrol->value.enumerated.item[0] = spec->eq_preset_val;
5631         return 0;
5632 }
5633
5634 static int ca0132_alt_eq_preset_put(struct snd_kcontrol *kcontrol,
5635                                 struct snd_ctl_elem_value *ucontrol)
5636 {
5637         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
5638         struct ca0132_spec *spec = codec->spec;
5639         int i, err = 0;
5640         int sel = ucontrol->value.enumerated.item[0];
5641         unsigned int items = ARRAY_SIZE(ca0132_alt_eq_presets);
5642
5643         if (sel >= items)
5644                 return 0;
5645
5646         codec_dbg(codec, "%s: sel=%d, preset=%s\n", __func__, sel,
5647                         ca0132_alt_eq_presets[sel].name);
5648         /*
5649          * Idx 0 is default.
5650          * Default needs to qualify with CrystalVoice state.
5651          */
5652         for (i = 0; i < EQ_PRESET_MAX_PARAM_COUNT; i++) {
5653                 err = dspio_set_uint_param(codec, ca0132_alt_eq_enum.mid,
5654                                 ca0132_alt_eq_enum.reqs[i],
5655                                 ca0132_alt_eq_presets[sel].vals[i]);
5656                 if (err < 0)
5657                         break;
5658         }
5659
5660         if (err >= 0)
5661                 spec->eq_preset_val = sel;
5662
5663         return 1;
5664 }
5665
5666 static int ca0132_voicefx_info(struct snd_kcontrol *kcontrol,
5667                                  struct snd_ctl_elem_info *uinfo)
5668 {
5669         unsigned int items = ARRAY_SIZE(ca0132_voicefx_presets);
5670
5671         uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
5672         uinfo->count = 1;
5673         uinfo->value.enumerated.items = items;
5674         if (uinfo->value.enumerated.item >= items)
5675                 uinfo->value.enumerated.item = items - 1;
5676         strcpy(uinfo->value.enumerated.name,
5677                ca0132_voicefx_presets[uinfo->value.enumerated.item].name);
5678         return 0;
5679 }
5680
5681 static int ca0132_voicefx_get(struct snd_kcontrol *kcontrol,
5682                                 struct snd_ctl_elem_value *ucontrol)
5683 {
5684         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
5685         struct ca0132_spec *spec = codec->spec;
5686
5687         ucontrol->value.enumerated.item[0] = spec->voicefx_val;
5688         return 0;
5689 }
5690
5691 static int ca0132_voicefx_put(struct snd_kcontrol *kcontrol,
5692                                 struct snd_ctl_elem_value *ucontrol)
5693 {
5694         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
5695         struct ca0132_spec *spec = codec->spec;
5696         int i, err = 0;
5697         int sel = ucontrol->value.enumerated.item[0];
5698
5699         if (sel >= ARRAY_SIZE(ca0132_voicefx_presets))
5700                 return 0;
5701
5702         codec_dbg(codec, "ca0132_voicefx_put: sel=%d, preset=%s\n",
5703                     sel, ca0132_voicefx_presets[sel].name);
5704
5705         /*
5706          * Idx 0 is default.
5707          * Default needs to qualify with CrystalVoice state.
5708          */
5709         for (i = 0; i < VOICEFX_MAX_PARAM_COUNT; i++) {
5710                 err = dspio_set_uint_param(codec, ca0132_voicefx.mid,
5711                                 ca0132_voicefx.reqs[i],
5712                                 ca0132_voicefx_presets[sel].vals[i]);
5713                 if (err < 0)
5714                         break;
5715         }
5716
5717         if (err >= 0) {
5718                 spec->voicefx_val = sel;
5719                 /* enable voice fx */
5720                 ca0132_voicefx_set(codec, (sel ? 1 : 0));
5721         }
5722
5723         return 1;
5724 }
5725
5726 static int ca0132_switch_get(struct snd_kcontrol *kcontrol,
5727                                 struct snd_ctl_elem_value *ucontrol)
5728 {
5729         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
5730         struct ca0132_spec *spec = codec->spec;
5731         hda_nid_t nid = get_amp_nid(kcontrol);
5732         int ch = get_amp_channels(kcontrol);
5733         long *valp = ucontrol->value.integer.value;
5734
5735         /* vnode */
5736         if ((nid >= VNODE_START_NID) && (nid < VNODE_END_NID)) {
5737                 if (ch & 1) {
5738                         *valp = spec->vnode_lswitch[nid - VNODE_START_NID];
5739                         valp++;
5740                 }
5741                 if (ch & 2) {
5742                         *valp = spec->vnode_rswitch[nid - VNODE_START_NID];
5743                         valp++;
5744                 }
5745                 return 0;
5746         }
5747
5748         /* effects, include PE and CrystalVoice */
5749         if ((nid >= EFFECT_START_NID) && (nid < EFFECT_END_NID)) {
5750                 *valp = spec->effects_switch[nid - EFFECT_START_NID];
5751                 return 0;
5752         }
5753
5754         /* mic boost */
5755         if (nid == spec->input_pins[0]) {
5756                 *valp = spec->cur_mic_boost;
5757                 return 0;
5758         }
5759
5760         return 0;
5761 }
5762
5763 static int ca0132_switch_put(struct snd_kcontrol *kcontrol,
5764                              struct snd_ctl_elem_value *ucontrol)
5765 {
5766         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
5767         struct ca0132_spec *spec = codec->spec;
5768         hda_nid_t nid = get_amp_nid(kcontrol);
5769         int ch = get_amp_channels(kcontrol);
5770         long *valp = ucontrol->value.integer.value;
5771         int changed = 1;
5772
5773         codec_dbg(codec, "ca0132_switch_put: nid=0x%x, val=%ld\n",
5774                     nid, *valp);
5775
5776         snd_hda_power_up(codec);
5777         /* vnode */
5778         if ((nid >= VNODE_START_NID) && (nid < VNODE_END_NID)) {
5779                 if (ch & 1) {
5780                         spec->vnode_lswitch[nid - VNODE_START_NID] = *valp;
5781                         valp++;
5782                 }
5783                 if (ch & 2) {
5784                         spec->vnode_rswitch[nid - VNODE_START_NID] = *valp;
5785                         valp++;
5786                 }
5787                 changed = ca0132_vnode_switch_set(kcontrol, ucontrol);
5788                 goto exit;
5789         }
5790
5791         /* PE */
5792         if (nid == PLAY_ENHANCEMENT) {
5793                 spec->effects_switch[nid - EFFECT_START_NID] = *valp;
5794                 changed = ca0132_pe_switch_set(codec);
5795                 goto exit;
5796         }
5797
5798         /* CrystalVoice */
5799         if (nid == CRYSTAL_VOICE) {
5800                 spec->effects_switch[nid - EFFECT_START_NID] = *valp;
5801                 changed = ca0132_cvoice_switch_set(codec);
5802                 goto exit;
5803         }
5804
5805         /* out and in effects */
5806         if (((nid >= OUT_EFFECT_START_NID) && (nid < OUT_EFFECT_END_NID)) ||
5807             ((nid >= IN_EFFECT_START_NID) && (nid < IN_EFFECT_END_NID))) {
5808                 spec->effects_switch[nid - EFFECT_START_NID] = *valp;
5809                 changed = ca0132_effects_set(codec, nid, *valp);
5810                 goto exit;
5811         }
5812
5813         /* mic boost */
5814         if (nid == spec->input_pins[0]) {
5815                 spec->cur_mic_boost = *valp;
5816                 if (ca0132_use_alt_functions(spec)) {
5817                         if (spec->in_enum_val != REAR_LINE_IN)
5818                                 changed = ca0132_mic_boost_set(codec, *valp);
5819                 } else {
5820                         /* Mic boost does not apply to Digital Mic */
5821                         if (spec->cur_mic_type != DIGITAL_MIC)
5822                                 changed = ca0132_mic_boost_set(codec, *valp);
5823                 }
5824
5825                 goto exit;
5826         }
5827
5828         if (nid == ZXR_HEADPHONE_GAIN) {
5829                 spec->zxr_gain_set = *valp;
5830                 if (spec->cur_out_type == HEADPHONE_OUT)
5831                         changed = zxr_headphone_gain_set(codec, *valp);
5832                 else
5833                         changed = 0;
5834
5835                 goto exit;
5836         }
5837
5838 exit:
5839         snd_hda_power_down(codec);
5840         return changed;
5841 }
5842
5843 /*
5844  * Volume related
5845  */
5846 /*
5847  * Sets the internal DSP decibel level to match the DAC for output, and the
5848  * ADC for input. Currently only the SBZ sets dsp capture volume level, and
5849  * all alternative codecs set DSP playback volume.
5850  */
5851 static void ca0132_alt_dsp_volume_put(struct hda_codec *codec, hda_nid_t nid)
5852 {
5853         struct ca0132_spec *spec = codec->spec;
5854         unsigned int dsp_dir;
5855         unsigned int lookup_val;
5856
5857         if (nid == VNID_SPK)
5858                 dsp_dir = DSP_VOL_OUT;
5859         else
5860                 dsp_dir = DSP_VOL_IN;
5861
5862         lookup_val = spec->vnode_lvol[nid - VNODE_START_NID];
5863
5864         dspio_set_uint_param(codec,
5865                 ca0132_alt_vol_ctls[dsp_dir].mid,
5866                 ca0132_alt_vol_ctls[dsp_dir].reqs[0],
5867                 float_vol_db_lookup[lookup_val]);
5868
5869         lookup_val = spec->vnode_rvol[nid - VNODE_START_NID];
5870
5871         dspio_set_uint_param(codec,
5872                 ca0132_alt_vol_ctls[dsp_dir].mid,
5873                 ca0132_alt_vol_ctls[dsp_dir].reqs[1],
5874                 float_vol_db_lookup[lookup_val]);
5875
5876         dspio_set_uint_param(codec,
5877                 ca0132_alt_vol_ctls[dsp_dir].mid,
5878                 ca0132_alt_vol_ctls[dsp_dir].reqs[2], FLOAT_ZERO);
5879 }
5880
5881 static int ca0132_volume_info(struct snd_kcontrol *kcontrol,
5882                               struct snd_ctl_elem_info *uinfo)
5883 {
5884         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
5885         struct ca0132_spec *spec = codec->spec;
5886         hda_nid_t nid = get_amp_nid(kcontrol);
5887         int ch = get_amp_channels(kcontrol);
5888         int dir = get_amp_direction(kcontrol);
5889         unsigned long pval;
5890         int err;
5891
5892         switch (nid) {
5893         case VNID_SPK:
5894                 /* follow shared_out info */
5895                 nid = spec->shared_out_nid;
5896                 mutex_lock(&codec->control_mutex);
5897                 pval = kcontrol->private_value;
5898                 kcontrol->private_value = HDA_COMPOSE_AMP_VAL(nid, ch, 0, dir);
5899                 err = snd_hda_mixer_amp_volume_info(kcontrol, uinfo);
5900                 kcontrol->private_value = pval;
5901                 mutex_unlock(&codec->control_mutex);
5902                 break;
5903         case VNID_MIC:
5904                 /* follow shared_mic info */
5905                 nid = spec->shared_mic_nid;
5906                 mutex_lock(&codec->control_mutex);
5907                 pval = kcontrol->private_value;
5908                 kcontrol->private_value = HDA_COMPOSE_AMP_VAL(nid, ch, 0, dir);
5909                 err = snd_hda_mixer_amp_volume_info(kcontrol, uinfo);
5910                 kcontrol->private_value = pval;
5911                 mutex_unlock(&codec->control_mutex);
5912                 break;
5913         default:
5914                 err = snd_hda_mixer_amp_volume_info(kcontrol, uinfo);
5915         }
5916         return err;
5917 }
5918
5919 static int ca0132_volume_get(struct snd_kcontrol *kcontrol,
5920                                 struct snd_ctl_elem_value *ucontrol)
5921 {
5922         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
5923         struct ca0132_spec *spec = codec->spec;
5924         hda_nid_t nid = get_amp_nid(kcontrol);
5925         int ch = get_amp_channels(kcontrol);
5926         long *valp = ucontrol->value.integer.value;
5927
5928         /* store the left and right volume */
5929         if (ch & 1) {
5930                 *valp = spec->vnode_lvol[nid - VNODE_START_NID];
5931                 valp++;
5932         }
5933         if (ch & 2) {
5934                 *valp = spec->vnode_rvol[nid - VNODE_START_NID];
5935                 valp++;
5936         }
5937         return 0;
5938 }
5939
5940 static int ca0132_volume_put(struct snd_kcontrol *kcontrol,
5941                                 struct snd_ctl_elem_value *ucontrol)
5942 {
5943         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
5944         struct ca0132_spec *spec = codec->spec;
5945         hda_nid_t nid = get_amp_nid(kcontrol);
5946         int ch = get_amp_channels(kcontrol);
5947         long *valp = ucontrol->value.integer.value;
5948         hda_nid_t shared_nid = 0;
5949         bool effective;
5950         int changed = 1;
5951
5952         /* store the left and right volume */
5953         if (ch & 1) {
5954                 spec->vnode_lvol[nid - VNODE_START_NID] = *valp;
5955                 valp++;
5956         }
5957         if (ch & 2) {
5958                 spec->vnode_rvol[nid - VNODE_START_NID] = *valp;
5959                 valp++;
5960         }
5961
5962         /* if effective conditions, then update hw immediately. */
5963         effective = ca0132_is_vnode_effective(codec, nid, &shared_nid);
5964         if (effective) {
5965                 int dir = get_amp_direction(kcontrol);
5966                 unsigned long pval;
5967
5968                 snd_hda_power_up(codec);
5969                 mutex_lock(&codec->control_mutex);
5970                 pval = kcontrol->private_value;
5971                 kcontrol->private_value = HDA_COMPOSE_AMP_VAL(shared_nid, ch,
5972                                                                 0, dir);
5973                 changed = snd_hda_mixer_amp_volume_put(kcontrol, ucontrol);
5974                 kcontrol->private_value = pval;
5975                 mutex_unlock(&codec->control_mutex);
5976                 snd_hda_power_down(codec);
5977         }
5978
5979         return changed;
5980 }
5981
5982 /*
5983  * This function is the same as the one above, because using an if statement
5984  * inside of the above volume control for the DSP volume would cause too much
5985  * lag. This is a lot more smooth.
5986  */
5987 static int ca0132_alt_volume_put(struct snd_kcontrol *kcontrol,
5988                                 struct snd_ctl_elem_value *ucontrol)
5989 {
5990         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
5991         struct ca0132_spec *spec = codec->spec;
5992         hda_nid_t nid = get_amp_nid(kcontrol);
5993         int ch = get_amp_channels(kcontrol);
5994         long *valp = ucontrol->value.integer.value;
5995         hda_nid_t vnid = 0;
5996         int changed = 1;
5997
5998         switch (nid) {
5999         case 0x02:
6000                 vnid = VNID_SPK;
6001                 break;
6002         case 0x07:
6003                 vnid = VNID_MIC;
6004                 break;
6005         }
6006
6007         /* store the left and right volume */
6008         if (ch & 1) {
6009                 spec->vnode_lvol[vnid - VNODE_START_NID] = *valp;
6010                 valp++;
6011         }
6012         if (ch & 2) {
6013                 spec->vnode_rvol[vnid - VNODE_START_NID] = *valp;
6014                 valp++;
6015         }
6016
6017         snd_hda_power_up(codec);
6018         ca0132_alt_dsp_volume_put(codec, vnid);
6019         mutex_lock(&codec->control_mutex);
6020         changed = snd_hda_mixer_amp_volume_put(kcontrol, ucontrol);
6021         mutex_unlock(&codec->control_mutex);
6022         snd_hda_power_down(codec);
6023
6024         return changed;
6025 }
6026
6027 static int ca0132_volume_tlv(struct snd_kcontrol *kcontrol, int op_flag,
6028                              unsigned int size, unsigned int __user *tlv)
6029 {
6030         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
6031         struct ca0132_spec *spec = codec->spec;
6032         hda_nid_t nid = get_amp_nid(kcontrol);
6033         int ch = get_amp_channels(kcontrol);
6034         int dir = get_amp_direction(kcontrol);
6035         unsigned long pval;
6036         int err;
6037
6038         switch (nid) {
6039         case VNID_SPK:
6040                 /* follow shared_out tlv */
6041                 nid = spec->shared_out_nid;
6042                 mutex_lock(&codec->control_mutex);
6043                 pval = kcontrol->private_value;
6044                 kcontrol->private_value = HDA_COMPOSE_AMP_VAL(nid, ch, 0, dir);
6045                 err = snd_hda_mixer_amp_tlv(kcontrol, op_flag, size, tlv);
6046                 kcontrol->private_value = pval;
6047                 mutex_unlock(&codec->control_mutex);
6048                 break;
6049         case VNID_MIC:
6050                 /* follow shared_mic tlv */
6051                 nid = spec->shared_mic_nid;
6052                 mutex_lock(&codec->control_mutex);
6053                 pval = kcontrol->private_value;
6054                 kcontrol->private_value = HDA_COMPOSE_AMP_VAL(nid, ch, 0, dir);
6055                 err = snd_hda_mixer_amp_tlv(kcontrol, op_flag, size, tlv);
6056                 kcontrol->private_value = pval;
6057                 mutex_unlock(&codec->control_mutex);
6058                 break;
6059         default:
6060                 err = snd_hda_mixer_amp_tlv(kcontrol, op_flag, size, tlv);
6061         }
6062         return err;
6063 }
6064
6065 /* Add volume slider control for effect level */
6066 static int ca0132_alt_add_effect_slider(struct hda_codec *codec, hda_nid_t nid,
6067                                         const char *pfx, int dir)
6068 {
6069         char namestr[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
6070         int type = dir ? HDA_INPUT : HDA_OUTPUT;
6071         struct snd_kcontrol_new knew =
6072                 HDA_CODEC_VOLUME_MONO(namestr, nid, 1, 0, type);
6073
6074         sprintf(namestr, "FX: %s %s Volume", pfx, dirstr[dir]);
6075
6076         knew.tlv.c = NULL;
6077
6078         switch (nid) {
6079         case XBASS_XOVER:
6080                 knew.info = ca0132_alt_xbass_xover_slider_info;
6081                 knew.get = ca0132_alt_xbass_xover_slider_ctl_get;
6082                 knew.put = ca0132_alt_xbass_xover_slider_put;
6083                 break;
6084         default:
6085                 knew.info = ca0132_alt_effect_slider_info;
6086                 knew.get = ca0132_alt_slider_ctl_get;
6087                 knew.put = ca0132_alt_effect_slider_put;
6088                 knew.private_value =
6089                         HDA_COMPOSE_AMP_VAL(nid, 1, 0, type);
6090                 break;
6091         }
6092
6093         return snd_hda_ctl_add(codec, nid, snd_ctl_new1(&knew, codec));
6094 }
6095
6096 /*
6097  * Added FX: prefix for the alternative codecs, because otherwise the surround
6098  * effect would conflict with the Surround sound volume control. Also seems more
6099  * clear as to what the switches do. Left alone for others.
6100  */
6101 static int add_fx_switch(struct hda_codec *codec, hda_nid_t nid,
6102                          const char *pfx, int dir)
6103 {
6104         struct ca0132_spec *spec = codec->spec;
6105         char namestr[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
6106         int type = dir ? HDA_INPUT : HDA_OUTPUT;
6107         struct snd_kcontrol_new knew =
6108                 CA0132_CODEC_MUTE_MONO(namestr, nid, 1, type);
6109         /* If using alt_controls, add FX: prefix. But, don't add FX:
6110          * prefix to OutFX or InFX enable controls.
6111          */
6112         if (ca0132_use_alt_controls(spec) && (nid <= IN_EFFECT_END_NID))
6113                 sprintf(namestr, "FX: %s %s Switch", pfx, dirstr[dir]);
6114         else
6115                 sprintf(namestr, "%s %s Switch", pfx, dirstr[dir]);
6116
6117         return snd_hda_ctl_add(codec, nid, snd_ctl_new1(&knew, codec));
6118 }
6119
6120 static int add_voicefx(struct hda_codec *codec)
6121 {
6122         struct snd_kcontrol_new knew =
6123                 HDA_CODEC_MUTE_MONO(ca0132_voicefx.name,
6124                                     VOICEFX, 1, 0, HDA_INPUT);
6125         knew.info = ca0132_voicefx_info;
6126         knew.get = ca0132_voicefx_get;
6127         knew.put = ca0132_voicefx_put;
6128         return snd_hda_ctl_add(codec, VOICEFX, snd_ctl_new1(&knew, codec));
6129 }
6130
6131 /* Create the EQ Preset control */
6132 static int add_ca0132_alt_eq_presets(struct hda_codec *codec)
6133 {
6134         struct snd_kcontrol_new knew =
6135                 HDA_CODEC_MUTE_MONO(ca0132_alt_eq_enum.name,
6136                                     EQ_PRESET_ENUM, 1, 0, HDA_OUTPUT);
6137         knew.info = ca0132_alt_eq_preset_info;
6138         knew.get = ca0132_alt_eq_preset_get;
6139         knew.put = ca0132_alt_eq_preset_put;
6140         return snd_hda_ctl_add(codec, EQ_PRESET_ENUM,
6141                                 snd_ctl_new1(&knew, codec));
6142 }
6143
6144 /*
6145  * Add enumerated control for the three different settings of the smart volume
6146  * output effect. Normal just uses the slider value, and loud and night are
6147  * their own things that ignore that value.
6148  */
6149 static int ca0132_alt_add_svm_enum(struct hda_codec *codec)
6150 {
6151         struct snd_kcontrol_new knew =
6152                 HDA_CODEC_MUTE_MONO("FX: Smart Volume Setting",
6153                                     SMART_VOLUME_ENUM, 1, 0, HDA_OUTPUT);
6154         knew.info = ca0132_alt_svm_setting_info;
6155         knew.get = ca0132_alt_svm_setting_get;
6156         knew.put = ca0132_alt_svm_setting_put;
6157         return snd_hda_ctl_add(codec, SMART_VOLUME_ENUM,
6158                                 snd_ctl_new1(&knew, codec));
6159
6160 }
6161
6162 /*
6163  * Create an Output Select enumerated control for codecs with surround
6164  * out capabilities.
6165  */
6166 static int ca0132_alt_add_output_enum(struct hda_codec *codec)
6167 {
6168         struct snd_kcontrol_new knew =
6169                 HDA_CODEC_MUTE_MONO("Output Select",
6170                                     OUTPUT_SOURCE_ENUM, 1, 0, HDA_OUTPUT);
6171         knew.info = ca0132_alt_output_select_get_info;
6172         knew.get = ca0132_alt_output_select_get;
6173         knew.put = ca0132_alt_output_select_put;
6174         return snd_hda_ctl_add(codec, OUTPUT_SOURCE_ENUM,
6175                                 snd_ctl_new1(&knew, codec));
6176 }
6177
6178 /*
6179  * Create an Input Source enumerated control for the alternate ca0132 codecs
6180  * because the front microphone has no auto-detect, and Line-in has to be set
6181  * somehow.
6182  */
6183 static int ca0132_alt_add_input_enum(struct hda_codec *codec)
6184 {
6185         struct snd_kcontrol_new knew =
6186                 HDA_CODEC_MUTE_MONO("Input Source",
6187                                     INPUT_SOURCE_ENUM, 1, 0, HDA_INPUT);
6188         knew.info = ca0132_alt_input_source_info;
6189         knew.get = ca0132_alt_input_source_get;
6190         knew.put = ca0132_alt_input_source_put;
6191         return snd_hda_ctl_add(codec, INPUT_SOURCE_ENUM,
6192                                 snd_ctl_new1(&knew, codec));
6193 }
6194
6195 /*
6196  * Add mic boost enumerated control. Switches through 0dB to 30dB. This adds
6197  * more control than the original mic boost, which is either full 30dB or off.
6198  */
6199 static int ca0132_alt_add_mic_boost_enum(struct hda_codec *codec)
6200 {
6201         struct snd_kcontrol_new knew =
6202                 HDA_CODEC_MUTE_MONO("Mic Boost Capture Switch",
6203                                     MIC_BOOST_ENUM, 1, 0, HDA_INPUT);
6204         knew.info = ca0132_alt_mic_boost_info;
6205         knew.get = ca0132_alt_mic_boost_get;
6206         knew.put = ca0132_alt_mic_boost_put;
6207         return snd_hda_ctl_add(codec, MIC_BOOST_ENUM,
6208                                 snd_ctl_new1(&knew, codec));
6209
6210 }
6211
6212 /*
6213  * Add headphone gain enumerated control for the AE-5. This switches between
6214  * three modes, low, medium, and high. When non-headphone outputs are selected,
6215  * it is automatically set to high. This is the same behavior as Windows.
6216  */
6217 static int ae5_add_headphone_gain_enum(struct hda_codec *codec)
6218 {
6219         struct snd_kcontrol_new knew =
6220                 HDA_CODEC_MUTE_MONO("AE-5: Headphone Gain",
6221                                     AE5_HEADPHONE_GAIN_ENUM, 1, 0, HDA_OUTPUT);
6222         knew.info = ae5_headphone_gain_info;
6223         knew.get = ae5_headphone_gain_get;
6224         knew.put = ae5_headphone_gain_put;
6225         return snd_hda_ctl_add(codec, AE5_HEADPHONE_GAIN_ENUM,
6226                                 snd_ctl_new1(&knew, codec));
6227 }
6228
6229 /*
6230  * Add sound filter enumerated control for the AE-5. This adds three different
6231  * settings: Slow Roll Off, Minimum Phase, and Fast Roll Off. From what I've
6232  * read into it, it changes the DAC's interpolation filter.
6233  */
6234 static int ae5_add_sound_filter_enum(struct hda_codec *codec)
6235 {
6236         struct snd_kcontrol_new knew =
6237                 HDA_CODEC_MUTE_MONO("AE-5: Sound Filter",
6238                                     AE5_SOUND_FILTER_ENUM, 1, 0, HDA_OUTPUT);
6239         knew.info = ae5_sound_filter_info;
6240         knew.get = ae5_sound_filter_get;
6241         knew.put = ae5_sound_filter_put;
6242         return snd_hda_ctl_add(codec, AE5_SOUND_FILTER_ENUM,
6243                                 snd_ctl_new1(&knew, codec));
6244 }
6245
6246 static int zxr_add_headphone_gain_switch(struct hda_codec *codec)
6247 {
6248         struct snd_kcontrol_new knew =
6249                 CA0132_CODEC_MUTE_MONO("ZxR: 600 Ohm Gain",
6250                                     ZXR_HEADPHONE_GAIN, 1, HDA_OUTPUT);
6251
6252         return snd_hda_ctl_add(codec, ZXR_HEADPHONE_GAIN,
6253                                 snd_ctl_new1(&knew, codec));
6254 }
6255
6256 /*
6257  * Need to create slave controls for the alternate codecs that have surround
6258  * capabilities.
6259  */
6260 static const char * const ca0132_alt_slave_pfxs[] = {
6261         "Front", "Surround", "Center", "LFE", NULL,
6262 };
6263
6264 /*
6265  * Also need special channel map, because the default one is incorrect.
6266  * I think this has to do with the pin for rear surround being 0x11,
6267  * and the center/lfe being 0x10. Usually the pin order is the opposite.
6268  */
6269 static const struct snd_pcm_chmap_elem ca0132_alt_chmaps[] = {
6270         { .channels = 2,
6271           .map = { SNDRV_CHMAP_FL, SNDRV_CHMAP_FR } },
6272         { .channels = 4,
6273           .map = { SNDRV_CHMAP_FL, SNDRV_CHMAP_FR,
6274                    SNDRV_CHMAP_RL, SNDRV_CHMAP_RR } },
6275         { .channels = 6,
6276           .map = { SNDRV_CHMAP_FL, SNDRV_CHMAP_FR,
6277                    SNDRV_CHMAP_FC, SNDRV_CHMAP_LFE,
6278                    SNDRV_CHMAP_RL, SNDRV_CHMAP_RR } },
6279         { }
6280 };
6281
6282 /* Add the correct chmap for streams with 6 channels. */
6283 static void ca0132_alt_add_chmap_ctls(struct hda_codec *codec)
6284 {
6285         int err = 0;
6286         struct hda_pcm *pcm;
6287
6288         list_for_each_entry(pcm, &codec->pcm_list_head, list) {
6289                 struct hda_pcm_stream *hinfo =
6290                         &pcm->stream[SNDRV_PCM_STREAM_PLAYBACK];
6291                 struct snd_pcm_chmap *chmap;
6292                 const struct snd_pcm_chmap_elem *elem;
6293
6294                 elem = ca0132_alt_chmaps;
6295                 if (hinfo->channels_max == 6) {
6296                         err = snd_pcm_add_chmap_ctls(pcm->pcm,
6297                                         SNDRV_PCM_STREAM_PLAYBACK,
6298                                         elem, hinfo->channels_max, 0, &chmap);
6299                         if (err < 0)
6300                                 codec_dbg(codec, "snd_pcm_add_chmap_ctls failed!");
6301                 }
6302         }
6303 }
6304
6305 /*
6306  * When changing Node IDs for Mixer Controls below, make sure to update
6307  * Node IDs in ca0132_config() as well.
6308  */
6309 static const struct snd_kcontrol_new ca0132_mixer[] = {
6310         CA0132_CODEC_VOL("Master Playback Volume", VNID_SPK, HDA_OUTPUT),
6311         CA0132_CODEC_MUTE("Master Playback Switch", VNID_SPK, HDA_OUTPUT),
6312         CA0132_CODEC_VOL("Capture Volume", VNID_MIC, HDA_INPUT),
6313         CA0132_CODEC_MUTE("Capture Switch", VNID_MIC, HDA_INPUT),
6314         HDA_CODEC_VOLUME("Analog-Mic2 Capture Volume", 0x08, 0, HDA_INPUT),
6315         HDA_CODEC_MUTE("Analog-Mic2 Capture Switch", 0x08, 0, HDA_INPUT),
6316         HDA_CODEC_VOLUME("What U Hear Capture Volume", 0x0a, 0, HDA_INPUT),
6317         HDA_CODEC_MUTE("What U Hear Capture Switch", 0x0a, 0, HDA_INPUT),
6318         CA0132_CODEC_MUTE_MONO("Mic1-Boost (30dB) Capture Switch",
6319                                0x12, 1, HDA_INPUT),
6320         CA0132_CODEC_MUTE_MONO("HP/Speaker Playback Switch",
6321                                VNID_HP_SEL, 1, HDA_OUTPUT),
6322         CA0132_CODEC_MUTE_MONO("AMic1/DMic Capture Switch",
6323                                VNID_AMIC1_SEL, 1, HDA_INPUT),
6324         CA0132_CODEC_MUTE_MONO("HP/Speaker Auto Detect Playback Switch",
6325                                VNID_HP_ASEL, 1, HDA_OUTPUT),
6326         CA0132_CODEC_MUTE_MONO("AMic1/DMic Auto Detect Capture Switch",
6327                                VNID_AMIC1_ASEL, 1, HDA_INPUT),
6328         { } /* end */
6329 };
6330
6331 /*
6332  * Desktop specific control mixer. Removes auto-detect for mic, and adds
6333  * surround controls. Also sets both the Front Playback and Capture Volume
6334  * controls to alt so they set the DSP's decibel level.
6335  */
6336 static const struct snd_kcontrol_new desktop_mixer[] = {
6337         CA0132_ALT_CODEC_VOL("Front Playback Volume", 0x02, HDA_OUTPUT),
6338         CA0132_CODEC_MUTE("Front Playback Switch", VNID_SPK, HDA_OUTPUT),
6339         HDA_CODEC_VOLUME("Surround Playback Volume", 0x04, 0, HDA_OUTPUT),
6340         HDA_CODEC_MUTE("Surround Playback Switch", 0x04, 0, HDA_OUTPUT),
6341         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x03, 1, 0, HDA_OUTPUT),
6342         HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x03, 1, 0, HDA_OUTPUT),
6343         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x03, 2, 0, HDA_OUTPUT),
6344         HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x03, 2, 0, HDA_OUTPUT),
6345         CA0132_ALT_CODEC_VOL("Capture Volume", 0x07, HDA_INPUT),
6346         CA0132_CODEC_MUTE("Capture Switch", VNID_MIC, HDA_INPUT),
6347         HDA_CODEC_VOLUME("What U Hear Capture Volume", 0x0a, 0, HDA_INPUT),
6348         HDA_CODEC_MUTE("What U Hear Capture Switch", 0x0a, 0, HDA_INPUT),
6349         CA0132_CODEC_MUTE_MONO("HP/Speaker Auto Detect Playback Switch",
6350                                 VNID_HP_ASEL, 1, HDA_OUTPUT),
6351         { } /* end */
6352 };
6353
6354 /*
6355  * Same as the Sound Blaster Z, except doesn't use the alt volume for capture
6356  * because it doesn't set decibel levels for the DSP for capture.
6357  */
6358 static const struct snd_kcontrol_new r3di_mixer[] = {
6359         CA0132_ALT_CODEC_VOL("Front Playback Volume", 0x02, HDA_OUTPUT),
6360         CA0132_CODEC_MUTE("Front Playback Switch", VNID_SPK, HDA_OUTPUT),
6361         HDA_CODEC_VOLUME("Surround Playback Volume", 0x04, 0, HDA_OUTPUT),
6362         HDA_CODEC_MUTE("Surround Playback Switch", 0x04, 0, HDA_OUTPUT),
6363         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x03, 1, 0, HDA_OUTPUT),
6364         HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x03, 1, 0, HDA_OUTPUT),
6365         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x03, 2, 0, HDA_OUTPUT),
6366         HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x03, 2, 0, HDA_OUTPUT),
6367         CA0132_CODEC_VOL("Capture Volume", VNID_MIC, HDA_INPUT),
6368         CA0132_CODEC_MUTE("Capture Switch", VNID_MIC, HDA_INPUT),
6369         HDA_CODEC_VOLUME("What U Hear Capture Volume", 0x0a, 0, HDA_INPUT),
6370         HDA_CODEC_MUTE("What U Hear Capture Switch", 0x0a, 0, HDA_INPUT),
6371         CA0132_CODEC_MUTE_MONO("HP/Speaker Auto Detect Playback Switch",
6372                                 VNID_HP_ASEL, 1, HDA_OUTPUT),
6373         { } /* end */
6374 };
6375
6376 static int ca0132_build_controls(struct hda_codec *codec)
6377 {
6378         struct ca0132_spec *spec = codec->spec;
6379         int i, num_fx, num_sliders;
6380         int err = 0;
6381
6382         /* Add Mixer controls */
6383         for (i = 0; i < spec->num_mixers; i++) {
6384                 err = snd_hda_add_new_ctls(codec, spec->mixers[i]);
6385                 if (err < 0)
6386                         return err;
6387         }
6388         /* Setup vmaster with surround slaves for desktop ca0132 devices */
6389         if (ca0132_use_alt_functions(spec)) {
6390                 snd_hda_set_vmaster_tlv(codec, spec->dacs[0], HDA_OUTPUT,
6391                                         spec->tlv);
6392                 snd_hda_add_vmaster(codec, "Master Playback Volume",
6393                                         spec->tlv, ca0132_alt_slave_pfxs,
6394                                         "Playback Volume");
6395                 err = __snd_hda_add_vmaster(codec, "Master Playback Switch",
6396                                             NULL, ca0132_alt_slave_pfxs,
6397                                             "Playback Switch",
6398                                             true, &spec->vmaster_mute.sw_kctl);
6399                 if (err < 0)
6400                         return err;
6401         }
6402
6403         /* Add in and out effects controls.
6404          * VoiceFX, PE and CrystalVoice are added separately.
6405          */
6406         num_fx = OUT_EFFECTS_COUNT + IN_EFFECTS_COUNT;
6407         for (i = 0; i < num_fx; i++) {
6408                 /* Desktop cards break if Echo Cancellation is used. */
6409                 if (ca0132_use_pci_mmio(spec)) {
6410                         if (i == (ECHO_CANCELLATION - IN_EFFECT_START_NID +
6411                                                 OUT_EFFECTS_COUNT))
6412                                 continue;
6413                 }
6414
6415                 err = add_fx_switch(codec, ca0132_effects[i].nid,
6416                                     ca0132_effects[i].name,
6417                                     ca0132_effects[i].direct);
6418                 if (err < 0)
6419                         return err;
6420         }
6421         /*
6422          * If codec has use_alt_controls set to true, add effect level sliders,
6423          * EQ presets, and Smart Volume presets. Also, change names to add FX
6424          * prefix, and change PlayEnhancement and CrystalVoice to match.
6425          */
6426         if (ca0132_use_alt_controls(spec)) {
6427                 err = ca0132_alt_add_svm_enum(codec);
6428                 if (err < 0)
6429                         return err;
6430
6431                 err = add_ca0132_alt_eq_presets(codec);
6432                 if (err < 0)
6433                         return err;
6434
6435                 err = add_fx_switch(codec, PLAY_ENHANCEMENT,
6436                                         "Enable OutFX", 0);
6437                 if (err < 0)
6438                         return err;
6439
6440                 err = add_fx_switch(codec, CRYSTAL_VOICE,
6441                                         "Enable InFX", 1);
6442                 if (err < 0)
6443                         return err;
6444
6445                 num_sliders = OUT_EFFECTS_COUNT - 1;
6446                 for (i = 0; i < num_sliders; i++) {
6447                         err = ca0132_alt_add_effect_slider(codec,
6448                                             ca0132_effects[i].nid,
6449                                             ca0132_effects[i].name,
6450                                             ca0132_effects[i].direct);
6451                         if (err < 0)
6452                                 return err;
6453                 }
6454
6455                 err = ca0132_alt_add_effect_slider(codec, XBASS_XOVER,
6456                                         "X-Bass Crossover", EFX_DIR_OUT);
6457
6458                 if (err < 0)
6459                         return err;
6460         } else {
6461                 err = add_fx_switch(codec, PLAY_ENHANCEMENT,
6462                                         "PlayEnhancement", 0);
6463                 if (err < 0)
6464                         return err;
6465
6466                 err = add_fx_switch(codec, CRYSTAL_VOICE,
6467                                         "CrystalVoice", 1);
6468                 if (err < 0)
6469                         return err;
6470         }
6471         err = add_voicefx(codec);
6472         if (err < 0)
6473                 return err;
6474
6475         /*
6476          * If the codec uses alt_functions, you need the enumerated controls
6477          * to select the new outputs and inputs, plus add the new mic boost
6478          * setting control.
6479          */
6480         if (ca0132_use_alt_functions(spec)) {
6481                 err = ca0132_alt_add_output_enum(codec);
6482                 if (err < 0)
6483                         return err;
6484                 err = ca0132_alt_add_mic_boost_enum(codec);
6485                 if (err < 0)
6486                         return err;
6487                 /*
6488                  * ZxR only has microphone input, there is no front panel
6489                  * header on the card, and aux-in is handled by the DBPro board.
6490                  */
6491                 if (ca0132_quirk(spec) != QUIRK_ZXR) {
6492                         err = ca0132_alt_add_input_enum(codec);
6493                         if (err < 0)
6494                                 return err;
6495                 }
6496         }
6497
6498         if (ca0132_quirk(spec) == QUIRK_AE5) {
6499                 err = ae5_add_headphone_gain_enum(codec);
6500                 if (err < 0)
6501                         return err;
6502                 err = ae5_add_sound_filter_enum(codec);
6503                 if (err < 0)
6504                         return err;
6505         }
6506
6507         if (ca0132_quirk(spec) == QUIRK_ZXR) {
6508                 err = zxr_add_headphone_gain_switch(codec);
6509                 if (err < 0)
6510                         return err;
6511         }
6512 #ifdef ENABLE_TUNING_CONTROLS
6513         add_tuning_ctls(codec);
6514 #endif
6515
6516         err = snd_hda_jack_add_kctls(codec, &spec->autocfg);
6517         if (err < 0)
6518                 return err;
6519
6520         if (spec->dig_out) {
6521                 err = snd_hda_create_spdif_out_ctls(codec, spec->dig_out,
6522                                                     spec->dig_out);
6523                 if (err < 0)
6524                         return err;
6525                 err = snd_hda_create_spdif_share_sw(codec, &spec->multiout);
6526                 if (err < 0)
6527                         return err;
6528                 /* spec->multiout.share_spdif = 1; */
6529         }
6530
6531         if (spec->dig_in) {
6532                 err = snd_hda_create_spdif_in_ctls(codec, spec->dig_in);
6533                 if (err < 0)
6534                         return err;
6535         }
6536
6537         if (ca0132_use_alt_functions(spec))
6538                 ca0132_alt_add_chmap_ctls(codec);
6539
6540         return 0;
6541 }
6542
6543 static int dbpro_build_controls(struct hda_codec *codec)
6544 {
6545         struct ca0132_spec *spec = codec->spec;
6546         int err = 0;
6547
6548         if (spec->dig_out) {
6549                 err = snd_hda_create_spdif_out_ctls(codec, spec->dig_out,
6550                                 spec->dig_out);
6551                 if (err < 0)
6552                         return err;
6553         }
6554
6555         if (spec->dig_in) {
6556                 err = snd_hda_create_spdif_in_ctls(codec, spec->dig_in);
6557                 if (err < 0)
6558                         return err;
6559         }
6560
6561         return 0;
6562 }
6563
6564 /*
6565  * PCM
6566  */
6567 static const struct hda_pcm_stream ca0132_pcm_analog_playback = {
6568         .substreams = 1,
6569         .channels_min = 2,
6570         .channels_max = 6,
6571         .ops = {
6572                 .prepare = ca0132_playback_pcm_prepare,
6573                 .cleanup = ca0132_playback_pcm_cleanup,
6574                 .get_delay = ca0132_playback_pcm_delay,
6575         },
6576 };
6577
6578 static const struct hda_pcm_stream ca0132_pcm_analog_capture = {
6579         .substreams = 1,
6580         .channels_min = 2,
6581         .channels_max = 2,
6582         .ops = {
6583                 .prepare = ca0132_capture_pcm_prepare,
6584                 .cleanup = ca0132_capture_pcm_cleanup,
6585                 .get_delay = ca0132_capture_pcm_delay,
6586         },
6587 };
6588
6589 static const struct hda_pcm_stream ca0132_pcm_digital_playback = {
6590         .substreams = 1,
6591         .channels_min = 2,
6592         .channels_max = 2,
6593         .ops = {
6594                 .open = ca0132_dig_playback_pcm_open,
6595                 .close = ca0132_dig_playback_pcm_close,
6596                 .prepare = ca0132_dig_playback_pcm_prepare,
6597                 .cleanup = ca0132_dig_playback_pcm_cleanup
6598         },
6599 };
6600
6601 static const struct hda_pcm_stream ca0132_pcm_digital_capture = {
6602         .substreams = 1,
6603         .channels_min = 2,
6604         .channels_max = 2,
6605 };
6606
6607 static int ca0132_build_pcms(struct hda_codec *codec)
6608 {
6609         struct ca0132_spec *spec = codec->spec;
6610         struct hda_pcm *info;
6611
6612         info = snd_hda_codec_pcm_new(codec, "CA0132 Analog");
6613         if (!info)
6614                 return -ENOMEM;
6615         if (ca0132_use_alt_functions(spec)) {
6616                 info->own_chmap = true;
6617                 info->stream[SNDRV_PCM_STREAM_PLAYBACK].chmap
6618                         = ca0132_alt_chmaps;
6619         }
6620         info->stream[SNDRV_PCM_STREAM_PLAYBACK] = ca0132_pcm_analog_playback;
6621         info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = spec->dacs[0];
6622         info->stream[SNDRV_PCM_STREAM_PLAYBACK].channels_max =
6623                 spec->multiout.max_channels;
6624         info->stream[SNDRV_PCM_STREAM_CAPTURE] = ca0132_pcm_analog_capture;
6625         info->stream[SNDRV_PCM_STREAM_CAPTURE].substreams = 1;
6626         info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->adcs[0];
6627
6628         /* With the DSP enabled, desktops don't use this ADC. */
6629         if (!ca0132_use_alt_functions(spec)) {
6630                 info = snd_hda_codec_pcm_new(codec, "CA0132 Analog Mic-In2");
6631                 if (!info)
6632                         return -ENOMEM;
6633                 info->stream[SNDRV_PCM_STREAM_CAPTURE] =
6634                         ca0132_pcm_analog_capture;
6635                 info->stream[SNDRV_PCM_STREAM_CAPTURE].substreams = 1;
6636                 info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->adcs[1];
6637         }
6638
6639         info = snd_hda_codec_pcm_new(codec, "CA0132 What U Hear");
6640         if (!info)
6641                 return -ENOMEM;
6642         info->stream[SNDRV_PCM_STREAM_CAPTURE] = ca0132_pcm_analog_capture;
6643         info->stream[SNDRV_PCM_STREAM_CAPTURE].substreams = 1;
6644         info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->adcs[2];
6645
6646         if (!spec->dig_out && !spec->dig_in)
6647                 return 0;
6648
6649         info = snd_hda_codec_pcm_new(codec, "CA0132 Digital");
6650         if (!info)
6651                 return -ENOMEM;
6652         info->pcm_type = HDA_PCM_TYPE_SPDIF;
6653         if (spec->dig_out) {
6654                 info->stream[SNDRV_PCM_STREAM_PLAYBACK] =
6655                         ca0132_pcm_digital_playback;
6656                 info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = spec->dig_out;
6657         }
6658         if (spec->dig_in) {
6659                 info->stream[SNDRV_PCM_STREAM_CAPTURE] =
6660                         ca0132_pcm_digital_capture;
6661                 info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->dig_in;
6662         }
6663
6664         return 0;
6665 }
6666
6667 static int dbpro_build_pcms(struct hda_codec *codec)
6668 {
6669         struct ca0132_spec *spec = codec->spec;
6670         struct hda_pcm *info;
6671
6672         info = snd_hda_codec_pcm_new(codec, "CA0132 Alt Analog");
6673         if (!info)
6674                 return -ENOMEM;
6675         info->stream[SNDRV_PCM_STREAM_CAPTURE] = ca0132_pcm_analog_capture;
6676         info->stream[SNDRV_PCM_STREAM_CAPTURE].substreams = 1;
6677         info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->adcs[0];
6678
6679
6680         if (!spec->dig_out && !spec->dig_in)
6681                 return 0;
6682
6683         info = snd_hda_codec_pcm_new(codec, "CA0132 Digital");
6684         if (!info)
6685                 return -ENOMEM;
6686         info->pcm_type = HDA_PCM_TYPE_SPDIF;
6687         if (spec->dig_out) {
6688                 info->stream[SNDRV_PCM_STREAM_PLAYBACK] =
6689                         ca0132_pcm_digital_playback;
6690                 info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = spec->dig_out;
6691         }
6692         if (spec->dig_in) {
6693                 info->stream[SNDRV_PCM_STREAM_CAPTURE] =
6694                         ca0132_pcm_digital_capture;
6695                 info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->dig_in;
6696         }
6697
6698         return 0;
6699 }
6700
6701 static void init_output(struct hda_codec *codec, hda_nid_t pin, hda_nid_t dac)
6702 {
6703         if (pin) {
6704                 snd_hda_set_pin_ctl(codec, pin, PIN_HP);
6705                 if (get_wcaps(codec, pin) & AC_WCAP_OUT_AMP)
6706                         snd_hda_codec_write(codec, pin, 0,
6707                                             AC_VERB_SET_AMP_GAIN_MUTE,
6708                                             AMP_OUT_UNMUTE);
6709         }
6710         if (dac && (get_wcaps(codec, dac) & AC_WCAP_OUT_AMP))
6711                 snd_hda_codec_write(codec, dac, 0,
6712                                     AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO);
6713 }
6714
6715 static void init_input(struct hda_codec *codec, hda_nid_t pin, hda_nid_t adc)
6716 {
6717         if (pin) {
6718                 snd_hda_set_pin_ctl(codec, pin, PIN_VREF80);
6719                 if (get_wcaps(codec, pin) & AC_WCAP_IN_AMP)
6720                         snd_hda_codec_write(codec, pin, 0,
6721                                             AC_VERB_SET_AMP_GAIN_MUTE,
6722                                             AMP_IN_UNMUTE(0));
6723         }
6724         if (adc && (get_wcaps(codec, adc) & AC_WCAP_IN_AMP)) {
6725                 snd_hda_codec_write(codec, adc, 0, AC_VERB_SET_AMP_GAIN_MUTE,
6726                                     AMP_IN_UNMUTE(0));
6727
6728                 /* init to 0 dB and unmute. */
6729                 snd_hda_codec_amp_stereo(codec, adc, HDA_INPUT, 0,
6730                                          HDA_AMP_VOLMASK, 0x5a);
6731                 snd_hda_codec_amp_stereo(codec, adc, HDA_INPUT, 0,
6732                                          HDA_AMP_MUTE, 0);
6733         }
6734 }
6735
6736 static void refresh_amp_caps(struct hda_codec *codec, hda_nid_t nid, int dir)
6737 {
6738         unsigned int caps;
6739
6740         caps = snd_hda_param_read(codec, nid, dir == HDA_OUTPUT ?
6741                                   AC_PAR_AMP_OUT_CAP : AC_PAR_AMP_IN_CAP);
6742         snd_hda_override_amp_caps(codec, nid, dir, caps);
6743 }
6744
6745 /*
6746  * Switch between Digital built-in mic and analog mic.
6747  */
6748 static void ca0132_set_dmic(struct hda_codec *codec, int enable)
6749 {
6750         struct ca0132_spec *spec = codec->spec;
6751         unsigned int tmp;
6752         u8 val;
6753         unsigned int oldval;
6754
6755         codec_dbg(codec, "ca0132_set_dmic: enable=%d\n", enable);
6756
6757         oldval = stop_mic1(codec);
6758         ca0132_set_vipsource(codec, 0);
6759         if (enable) {
6760                 /* set DMic input as 2-ch */
6761                 tmp = FLOAT_TWO;
6762                 dspio_set_uint_param(codec, 0x80, 0x00, tmp);
6763
6764                 val = spec->dmic_ctl;
6765                 val |= 0x80;
6766                 snd_hda_codec_write(codec, spec->input_pins[0], 0,
6767                                     VENDOR_CHIPIO_DMIC_CTL_SET, val);
6768
6769                 if (!(spec->dmic_ctl & 0x20))
6770                         chipio_set_control_flag(codec, CONTROL_FLAG_DMIC, 1);
6771         } else {
6772                 /* set AMic input as mono */
6773                 tmp = FLOAT_ONE;
6774                 dspio_set_uint_param(codec, 0x80, 0x00, tmp);
6775
6776                 val = spec->dmic_ctl;
6777                 /* clear bit7 and bit5 to disable dmic */
6778                 val &= 0x5f;
6779                 snd_hda_codec_write(codec, spec->input_pins[0], 0,
6780                                     VENDOR_CHIPIO_DMIC_CTL_SET, val);
6781
6782                 if (!(spec->dmic_ctl & 0x20))
6783                         chipio_set_control_flag(codec, CONTROL_FLAG_DMIC, 0);
6784         }
6785         ca0132_set_vipsource(codec, 1);
6786         resume_mic1(codec, oldval);
6787 }
6788
6789 /*
6790  * Initialization for Digital Mic.
6791  */
6792 static void ca0132_init_dmic(struct hda_codec *codec)
6793 {
6794         struct ca0132_spec *spec = codec->spec;
6795         u8 val;
6796
6797         /* Setup Digital Mic here, but don't enable.
6798          * Enable based on jack detect.
6799          */
6800
6801         /* MCLK uses MPIO1, set to enable.
6802          * Bit 2-0: MPIO select
6803          * Bit   3: set to disable
6804          * Bit 7-4: reserved
6805          */
6806         val = 0x01;
6807         snd_hda_codec_write(codec, spec->input_pins[0], 0,
6808                             VENDOR_CHIPIO_DMIC_MCLK_SET, val);
6809
6810         /* Data1 uses MPIO3. Data2 not use
6811          * Bit 2-0: Data1 MPIO select
6812          * Bit   3: set disable Data1
6813          * Bit 6-4: Data2 MPIO select
6814          * Bit   7: set disable Data2
6815          */
6816         val = 0x83;
6817         snd_hda_codec_write(codec, spec->input_pins[0], 0,
6818                             VENDOR_CHIPIO_DMIC_PIN_SET, val);
6819
6820         /* Use Ch-0 and Ch-1. Rate is 48K, mode 1. Disable DMic first.
6821          * Bit 3-0: Channel mask
6822          * Bit   4: set for 48KHz, clear for 32KHz
6823          * Bit   5: mode
6824          * Bit   6: set to select Data2, clear for Data1
6825          * Bit   7: set to enable DMic, clear for AMic
6826          */
6827         if (ca0132_quirk(spec) == QUIRK_ALIENWARE_M17XR4)
6828                 val = 0x33;
6829         else
6830                 val = 0x23;
6831         /* keep a copy of dmic ctl val for enable/disable dmic purpuse */
6832         spec->dmic_ctl = val;
6833         snd_hda_codec_write(codec, spec->input_pins[0], 0,
6834                             VENDOR_CHIPIO_DMIC_CTL_SET, val);
6835 }
6836
6837 /*
6838  * Initialization for Analog Mic 2
6839  */
6840 static void ca0132_init_analog_mic2(struct hda_codec *codec)
6841 {
6842         struct ca0132_spec *spec = codec->spec;
6843
6844         mutex_lock(&spec->chipio_mutex);
6845         snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
6846                             VENDOR_CHIPIO_8051_ADDRESS_LOW, 0x20);
6847         snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
6848                             VENDOR_CHIPIO_8051_ADDRESS_HIGH, 0x19);
6849         snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
6850                             VENDOR_CHIPIO_8051_DATA_WRITE, 0x00);
6851         snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
6852                             VENDOR_CHIPIO_8051_ADDRESS_LOW, 0x2D);
6853         snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
6854                             VENDOR_CHIPIO_8051_ADDRESS_HIGH, 0x19);
6855         snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
6856                             VENDOR_CHIPIO_8051_DATA_WRITE, 0x00);
6857         mutex_unlock(&spec->chipio_mutex);
6858 }
6859
6860 static void ca0132_refresh_widget_caps(struct hda_codec *codec)
6861 {
6862         struct ca0132_spec *spec = codec->spec;
6863         int i;
6864
6865         codec_dbg(codec, "ca0132_refresh_widget_caps.\n");
6866         snd_hda_codec_update_widgets(codec);
6867
6868         for (i = 0; i < spec->multiout.num_dacs; i++)
6869                 refresh_amp_caps(codec, spec->dacs[i], HDA_OUTPUT);
6870
6871         for (i = 0; i < spec->num_outputs; i++)
6872                 refresh_amp_caps(codec, spec->out_pins[i], HDA_OUTPUT);
6873
6874         for (i = 0; i < spec->num_inputs; i++) {
6875                 refresh_amp_caps(codec, spec->adcs[i], HDA_INPUT);
6876                 refresh_amp_caps(codec, spec->input_pins[i], HDA_INPUT);
6877         }
6878 }
6879
6880 /*
6881  * Creates a dummy stream to bind the output to. This seems to have to be done
6882  * after changing the main outputs source and destination streams.
6883  */
6884 static void ca0132_alt_create_dummy_stream(struct hda_codec *codec)
6885 {
6886         struct ca0132_spec *spec = codec->spec;
6887         unsigned int stream_format;
6888
6889         stream_format = snd_hdac_calc_stream_format(48000, 2,
6890                         SNDRV_PCM_FORMAT_S32_LE, 32, 0);
6891
6892         snd_hda_codec_setup_stream(codec, spec->dacs[0], spec->dsp_stream_id,
6893                                         0, stream_format);
6894
6895         snd_hda_codec_cleanup_stream(codec, spec->dacs[0]);
6896 }
6897
6898 /*
6899  * Initialize mic for non-chromebook ca0132 implementations.
6900  */
6901 static void ca0132_alt_init_analog_mics(struct hda_codec *codec)
6902 {
6903         struct ca0132_spec *spec = codec->spec;
6904         unsigned int tmp;
6905
6906         /* Mic 1 Setup */
6907         chipio_set_conn_rate(codec, MEM_CONNID_MICIN1, SR_96_000);
6908         chipio_set_conn_rate(codec, MEM_CONNID_MICOUT1, SR_96_000);
6909         if (ca0132_quirk(spec) == QUIRK_R3DI) {
6910                 chipio_set_conn_rate(codec, 0x0F, SR_96_000);
6911                 tmp = FLOAT_ONE;
6912         } else
6913                 tmp = FLOAT_THREE;
6914         dspio_set_uint_param(codec, 0x80, 0x00, tmp);
6915
6916         /* Mic 2 setup (not present on desktop cards) */
6917         chipio_set_conn_rate(codec, MEM_CONNID_MICIN2, SR_96_000);
6918         chipio_set_conn_rate(codec, MEM_CONNID_MICOUT2, SR_96_000);
6919         if (ca0132_quirk(spec) == QUIRK_R3DI)
6920                 chipio_set_conn_rate(codec, 0x0F, SR_96_000);
6921         tmp = FLOAT_ZERO;
6922         dspio_set_uint_param(codec, 0x80, 0x01, tmp);
6923 }
6924
6925 /*
6926  * Sets the source of stream 0x14 to connpointID 0x48, and the destination
6927  * connpointID to 0x91. If this isn't done, the destination is 0x71, and
6928  * you get no sound. I'm guessing this has to do with the Sound Blaster Z
6929  * having an updated DAC, which changes the destination to that DAC.
6930  */
6931 static void sbz_connect_streams(struct hda_codec *codec)
6932 {
6933         struct ca0132_spec *spec = codec->spec;
6934
6935         mutex_lock(&spec->chipio_mutex);
6936
6937         codec_dbg(codec, "Connect Streams entered, mutex locked and loaded.\n");
6938
6939         chipio_set_stream_channels(codec, 0x0C, 6);
6940         chipio_set_stream_control(codec, 0x0C, 1);
6941
6942         /* This value is 0x43 for 96khz, and 0x83 for 192khz. */
6943         chipio_write_no_mutex(codec, 0x18a020, 0x00000043);
6944
6945         /* Setup stream 0x14 with it's source and destination points */
6946         chipio_set_stream_source_dest(codec, 0x14, 0x48, 0x91);
6947         chipio_set_conn_rate_no_mutex(codec, 0x48, SR_96_000);
6948         chipio_set_conn_rate_no_mutex(codec, 0x91, SR_96_000);
6949         chipio_set_stream_channels(codec, 0x14, 2);
6950         chipio_set_stream_control(codec, 0x14, 1);
6951
6952         codec_dbg(codec, "Connect Streams exited, mutex released.\n");
6953
6954         mutex_unlock(&spec->chipio_mutex);
6955 }
6956
6957 /*
6958  * Write data through ChipIO to setup proper stream destinations.
6959  * Not sure how it exactly works, but it seems to direct data
6960  * to different destinations. Example is f8 to c0, e0 to c0.
6961  * All I know is, if you don't set these, you get no sound.
6962  */
6963 static void sbz_chipio_startup_data(struct hda_codec *codec)
6964 {
6965         struct ca0132_spec *spec = codec->spec;
6966
6967         mutex_lock(&spec->chipio_mutex);
6968         codec_dbg(codec, "Startup Data entered, mutex locked and loaded.\n");
6969
6970         /* These control audio output */
6971         chipio_write_no_mutex(codec, 0x190060, 0x0001f8c0);
6972         chipio_write_no_mutex(codec, 0x190064, 0x0001f9c1);
6973         chipio_write_no_mutex(codec, 0x190068, 0x0001fac6);
6974         chipio_write_no_mutex(codec, 0x19006c, 0x0001fbc7);
6975         /* Signal to update I think */
6976         chipio_write_no_mutex(codec, 0x19042c, 0x00000001);
6977
6978         chipio_set_stream_channels(codec, 0x0C, 6);
6979         chipio_set_stream_control(codec, 0x0C, 1);
6980         /* No clue what these control */
6981         if (ca0132_quirk(spec) == QUIRK_SBZ) {
6982                 chipio_write_no_mutex(codec, 0x190030, 0x0001e0c0);
6983                 chipio_write_no_mutex(codec, 0x190034, 0x0001e1c1);
6984                 chipio_write_no_mutex(codec, 0x190038, 0x0001e4c2);
6985                 chipio_write_no_mutex(codec, 0x19003c, 0x0001e5c3);
6986                 chipio_write_no_mutex(codec, 0x190040, 0x0001e2c4);
6987                 chipio_write_no_mutex(codec, 0x190044, 0x0001e3c5);
6988                 chipio_write_no_mutex(codec, 0x190048, 0x0001e8c6);
6989                 chipio_write_no_mutex(codec, 0x19004c, 0x0001e9c7);
6990                 chipio_write_no_mutex(codec, 0x190050, 0x0001ecc8);
6991                 chipio_write_no_mutex(codec, 0x190054, 0x0001edc9);
6992                 chipio_write_no_mutex(codec, 0x190058, 0x0001eaca);
6993                 chipio_write_no_mutex(codec, 0x19005c, 0x0001ebcb);
6994         } else if (ca0132_quirk(spec) == QUIRK_ZXR) {
6995                 chipio_write_no_mutex(codec, 0x190038, 0x000140c2);
6996                 chipio_write_no_mutex(codec, 0x19003c, 0x000141c3);
6997                 chipio_write_no_mutex(codec, 0x190040, 0x000150c4);
6998                 chipio_write_no_mutex(codec, 0x190044, 0x000151c5);
6999                 chipio_write_no_mutex(codec, 0x190050, 0x000142c8);
7000                 chipio_write_no_mutex(codec, 0x190054, 0x000143c9);
7001                 chipio_write_no_mutex(codec, 0x190058, 0x000152ca);
7002                 chipio_write_no_mutex(codec, 0x19005c, 0x000153cb);
7003         }
7004         chipio_write_no_mutex(codec, 0x19042c, 0x00000001);
7005
7006         codec_dbg(codec, "Startup Data exited, mutex released.\n");
7007         mutex_unlock(&spec->chipio_mutex);
7008 }
7009
7010 /*
7011  * Custom DSP SCP commands where the src value is 0x00 instead of 0x20. This is
7012  * done after the DSP is loaded.
7013  */
7014 static void ca0132_alt_dsp_scp_startup(struct hda_codec *codec)
7015 {
7016         struct ca0132_spec *spec = codec->spec;
7017         unsigned int tmp, i;
7018
7019         /*
7020          * Gotta run these twice, or else mic works inconsistently. Not clear
7021          * why this is, but multiple tests have confirmed it.
7022          */
7023         for (i = 0; i < 2; i++) {
7024                 switch (ca0132_quirk(spec)) {
7025                 case QUIRK_SBZ:
7026                 case QUIRK_AE5:
7027                         tmp = 0x00000003;
7028                         dspio_set_uint_param_no_source(codec, 0x80, 0x0C, tmp);
7029                         tmp = 0x00000000;
7030                         dspio_set_uint_param_no_source(codec, 0x80, 0x0A, tmp);
7031                         tmp = 0x00000001;
7032                         dspio_set_uint_param_no_source(codec, 0x80, 0x0B, tmp);
7033                         tmp = 0x00000004;
7034                         dspio_set_uint_param_no_source(codec, 0x80, 0x0C, tmp);
7035                         tmp = 0x00000005;
7036                         dspio_set_uint_param_no_source(codec, 0x80, 0x0C, tmp);
7037                         tmp = 0x00000000;
7038                         dspio_set_uint_param_no_source(codec, 0x80, 0x0C, tmp);
7039                         break;
7040                 case QUIRK_R3D:
7041                 case QUIRK_R3DI:
7042                         tmp = 0x00000000;
7043                         dspio_set_uint_param_no_source(codec, 0x80, 0x0A, tmp);
7044                         tmp = 0x00000001;
7045                         dspio_set_uint_param_no_source(codec, 0x80, 0x0B, tmp);
7046                         tmp = 0x00000004;
7047                         dspio_set_uint_param_no_source(codec, 0x80, 0x0C, tmp);
7048                         tmp = 0x00000005;
7049                         dspio_set_uint_param_no_source(codec, 0x80, 0x0C, tmp);
7050                         tmp = 0x00000000;
7051                         dspio_set_uint_param_no_source(codec, 0x80, 0x0C, tmp);
7052                         break;
7053                 default:
7054                         break;
7055                 }
7056                 msleep(100);
7057         }
7058 }
7059
7060 static void ca0132_alt_dsp_initial_mic_setup(struct hda_codec *codec)
7061 {
7062         struct ca0132_spec *spec = codec->spec;
7063         unsigned int tmp;
7064
7065         chipio_set_stream_control(codec, 0x03, 0);
7066         chipio_set_stream_control(codec, 0x04, 0);
7067
7068         chipio_set_conn_rate(codec, MEM_CONNID_MICIN1, SR_96_000);
7069         chipio_set_conn_rate(codec, MEM_CONNID_MICOUT1, SR_96_000);
7070
7071         tmp = FLOAT_THREE;
7072         dspio_set_uint_param(codec, 0x80, 0x00, tmp);
7073
7074         chipio_set_stream_control(codec, 0x03, 1);
7075         chipio_set_stream_control(codec, 0x04, 1);
7076
7077         switch (ca0132_quirk(spec)) {
7078         case QUIRK_SBZ:
7079                 chipio_write(codec, 0x18b098, 0x0000000c);
7080                 chipio_write(codec, 0x18b09C, 0x0000000c);
7081                 break;
7082         case QUIRK_AE5:
7083                 chipio_write(codec, 0x18b098, 0x0000000c);
7084                 chipio_write(codec, 0x18b09c, 0x0000004c);
7085                 break;
7086         default:
7087                 break;
7088         }
7089 }
7090
7091 static void ae5_post_dsp_register_set(struct hda_codec *codec)
7092 {
7093         struct ca0132_spec *spec = codec->spec;
7094
7095         chipio_8051_write_direct(codec, 0x93, 0x10);
7096         snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
7097                             VENDOR_CHIPIO_8051_ADDRESS_LOW, 0x44);
7098         snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
7099                             VENDOR_CHIPIO_PLL_PMU_WRITE, 0xc2);
7100
7101         writeb(0xff, spec->mem_base + 0x304);
7102         writeb(0xff, spec->mem_base + 0x304);
7103         writeb(0xff, spec->mem_base + 0x304);
7104         writeb(0xff, spec->mem_base + 0x304);
7105         writeb(0x00, spec->mem_base + 0x100);
7106         writeb(0xff, spec->mem_base + 0x304);
7107         writeb(0x00, spec->mem_base + 0x100);
7108         writeb(0xff, spec->mem_base + 0x304);
7109         writeb(0x00, spec->mem_base + 0x100);
7110         writeb(0xff, spec->mem_base + 0x304);
7111         writeb(0x00, spec->mem_base + 0x100);
7112         writeb(0xff, spec->mem_base + 0x304);
7113
7114         ca0113_mmio_command_set(codec, 0x30, 0x2b, 0x3f);
7115         ca0113_mmio_command_set(codec, 0x30, 0x2d, 0x3f);
7116         ca0113_mmio_command_set(codec, 0x48, 0x07, 0x83);
7117 }
7118
7119 static void ae5_post_dsp_param_setup(struct hda_codec *codec)
7120 {
7121         /*
7122          * Param3 in the 8051's memory is represented by the ascii string 'mch'
7123          * which seems to be 'multichannel'. This is also mentioned in the
7124          * AE-5's registry values in Windows.
7125          */
7126         chipio_set_control_param(codec, 3, 0);
7127         /*
7128          * I believe ASI is 'audio serial interface' and that it's used to
7129          * change colors on the external LED strip connected to the AE-5.
7130          */
7131         chipio_set_control_flag(codec, CONTROL_FLAG_ASI_96KHZ, 1);
7132
7133         snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0, 0x724, 0x83);
7134         chipio_set_control_param(codec, CONTROL_PARAM_ASI, 0);
7135
7136         snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
7137                             VENDOR_CHIPIO_8051_ADDRESS_LOW, 0x92);
7138         snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
7139                             VENDOR_CHIPIO_8051_ADDRESS_HIGH, 0xfa);
7140         snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
7141                             VENDOR_CHIPIO_8051_DATA_WRITE, 0x22);
7142 }
7143
7144 static void ae5_post_dsp_pll_setup(struct hda_codec *codec)
7145 {
7146         snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
7147                             VENDOR_CHIPIO_8051_ADDRESS_LOW, 0x41);
7148         snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
7149                             VENDOR_CHIPIO_PLL_PMU_WRITE, 0xc8);
7150
7151         snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
7152                             VENDOR_CHIPIO_8051_ADDRESS_LOW, 0x45);
7153         snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
7154                             VENDOR_CHIPIO_PLL_PMU_WRITE, 0xcc);
7155
7156         snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
7157                             VENDOR_CHIPIO_8051_ADDRESS_LOW, 0x40);
7158         snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
7159                             VENDOR_CHIPIO_PLL_PMU_WRITE, 0xcb);
7160
7161         snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
7162                             VENDOR_CHIPIO_8051_ADDRESS_LOW, 0x43);
7163         snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
7164                             VENDOR_CHIPIO_PLL_PMU_WRITE, 0xc7);
7165
7166         snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
7167                             VENDOR_CHIPIO_8051_ADDRESS_LOW, 0x51);
7168         snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
7169                             VENDOR_CHIPIO_PLL_PMU_WRITE, 0x8d);
7170 }
7171
7172 static void ae5_post_dsp_stream_setup(struct hda_codec *codec)
7173 {
7174         struct ca0132_spec *spec = codec->spec;
7175
7176         mutex_lock(&spec->chipio_mutex);
7177
7178         snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0, 0x725, 0x81);
7179
7180         chipio_set_conn_rate_no_mutex(codec, 0x70, SR_96_000);
7181
7182         chipio_set_stream_channels(codec, 0x0C, 6);
7183         chipio_set_stream_control(codec, 0x0C, 1);
7184
7185         chipio_set_stream_source_dest(codec, 0x5, 0x43, 0x0);
7186
7187         chipio_set_stream_source_dest(codec, 0x18, 0x9, 0xd0);
7188         chipio_set_conn_rate_no_mutex(codec, 0xd0, SR_96_000);
7189         chipio_set_stream_channels(codec, 0x18, 6);
7190         chipio_set_stream_control(codec, 0x18, 1);
7191
7192         chipio_set_control_param_no_mutex(codec, CONTROL_PARAM_ASI, 4);
7193
7194         snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
7195                             VENDOR_CHIPIO_8051_ADDRESS_LOW, 0x43);
7196         snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
7197                             VENDOR_CHIPIO_PLL_PMU_WRITE, 0xc7);
7198
7199         ca0113_mmio_command_set(codec, 0x48, 0x01, 0x80);
7200
7201         mutex_unlock(&spec->chipio_mutex);
7202 }
7203
7204 static void ae5_post_dsp_startup_data(struct hda_codec *codec)
7205 {
7206         struct ca0132_spec *spec = codec->spec;
7207
7208         mutex_lock(&spec->chipio_mutex);
7209
7210         chipio_write_no_mutex(codec, 0x189000, 0x0001f101);
7211         chipio_write_no_mutex(codec, 0x189004, 0x0001f101);
7212         chipio_write_no_mutex(codec, 0x189024, 0x00014004);
7213         chipio_write_no_mutex(codec, 0x189028, 0x0002000f);
7214
7215         ca0113_mmio_command_set(codec, 0x48, 0x0a, 0x05);
7216         chipio_set_control_param_no_mutex(codec, CONTROL_PARAM_ASI, 7);
7217         ca0113_mmio_command_set(codec, 0x48, 0x0b, 0x12);
7218         ca0113_mmio_command_set(codec, 0x48, 0x04, 0x00);
7219         ca0113_mmio_command_set(codec, 0x48, 0x06, 0x48);
7220         ca0113_mmio_command_set(codec, 0x48, 0x0a, 0x05);
7221         ca0113_mmio_command_set(codec, 0x48, 0x07, 0x83);
7222         ca0113_mmio_command_set(codec, 0x48, 0x0f, 0x00);
7223         ca0113_mmio_command_set(codec, 0x48, 0x10, 0x00);
7224         ca0113_mmio_gpio_set(codec, 0, true);
7225         ca0113_mmio_gpio_set(codec, 1, true);
7226         ca0113_mmio_command_set(codec, 0x48, 0x07, 0x80);
7227
7228         chipio_write_no_mutex(codec, 0x18b03c, 0x00000012);
7229
7230         ca0113_mmio_command_set(codec, 0x48, 0x0f, 0x00);
7231         ca0113_mmio_command_set(codec, 0x48, 0x10, 0x00);
7232
7233         mutex_unlock(&spec->chipio_mutex);
7234 }
7235
7236 /*
7237  * Setup default parameters for DSP
7238  */
7239 static void ca0132_setup_defaults(struct hda_codec *codec)
7240 {
7241         struct ca0132_spec *spec = codec->spec;
7242         unsigned int tmp;
7243         int num_fx;
7244         int idx, i;
7245
7246         if (spec->dsp_state != DSP_DOWNLOADED)
7247                 return;
7248
7249         /* out, in effects + voicefx */
7250         num_fx = OUT_EFFECTS_COUNT + IN_EFFECTS_COUNT + 1;
7251         for (idx = 0; idx < num_fx; idx++) {
7252                 for (i = 0; i <= ca0132_effects[idx].params; i++) {
7253                         dspio_set_uint_param(codec, ca0132_effects[idx].mid,
7254                                              ca0132_effects[idx].reqs[i],
7255                                              ca0132_effects[idx].def_vals[i]);
7256                 }
7257         }
7258
7259         /*remove DSP headroom*/
7260         tmp = FLOAT_ZERO;
7261         dspio_set_uint_param(codec, 0x96, 0x3C, tmp);
7262
7263         /*set speaker EQ bypass attenuation*/
7264         dspio_set_uint_param(codec, 0x8f, 0x01, tmp);
7265
7266         /* set AMic1 and AMic2 as mono mic */
7267         tmp = FLOAT_ONE;
7268         dspio_set_uint_param(codec, 0x80, 0x00, tmp);
7269         dspio_set_uint_param(codec, 0x80, 0x01, tmp);
7270
7271         /* set AMic1 as CrystalVoice input */
7272         tmp = FLOAT_ONE;
7273         dspio_set_uint_param(codec, 0x80, 0x05, tmp);
7274
7275         /* set WUH source */
7276         tmp = FLOAT_TWO;
7277         dspio_set_uint_param(codec, 0x31, 0x00, tmp);
7278 }
7279
7280 /*
7281  * Setup default parameters for Recon3D/Recon3Di DSP.
7282  */
7283
7284 static void r3d_setup_defaults(struct hda_codec *codec)
7285 {
7286         struct ca0132_spec *spec = codec->spec;
7287         unsigned int tmp;
7288         int num_fx;
7289         int idx, i;
7290
7291         if (spec->dsp_state != DSP_DOWNLOADED)
7292                 return;
7293
7294         ca0132_alt_dsp_scp_startup(codec);
7295         ca0132_alt_init_analog_mics(codec);
7296
7297         /*remove DSP headroom*/
7298         tmp = FLOAT_ZERO;
7299         dspio_set_uint_param(codec, 0x96, 0x3C, tmp);
7300
7301         /* set WUH source */
7302         tmp = FLOAT_TWO;
7303         dspio_set_uint_param(codec, 0x31, 0x00, tmp);
7304         chipio_set_conn_rate(codec, MEM_CONNID_WUH, SR_48_000);
7305
7306         /* Set speaker source? */
7307         dspio_set_uint_param(codec, 0x32, 0x00, tmp);
7308
7309         if (ca0132_quirk(spec) == QUIRK_R3DI)
7310                 r3di_gpio_dsp_status_set(codec, R3DI_DSP_DOWNLOADED);
7311
7312         /* Setup effect defaults */
7313         num_fx = OUT_EFFECTS_COUNT + IN_EFFECTS_COUNT + 1;
7314         for (idx = 0; idx < num_fx; idx++) {
7315                 for (i = 0; i <= ca0132_effects[idx].params; i++) {
7316                         dspio_set_uint_param(codec,
7317                                         ca0132_effects[idx].mid,
7318                                         ca0132_effects[idx].reqs[i],
7319                                         ca0132_effects[idx].def_vals[i]);
7320                 }
7321         }
7322 }
7323
7324 /*
7325  * Setup default parameters for the Sound Blaster Z DSP. A lot more going on
7326  * than the Chromebook setup.
7327  */
7328 static void sbz_setup_defaults(struct hda_codec *codec)
7329 {
7330         struct ca0132_spec *spec = codec->spec;
7331         unsigned int tmp;
7332         int num_fx;
7333         int idx, i;
7334
7335         if (spec->dsp_state != DSP_DOWNLOADED)
7336                 return;
7337
7338         ca0132_alt_dsp_scp_startup(codec);
7339         ca0132_alt_init_analog_mics(codec);
7340         sbz_connect_streams(codec);
7341         sbz_chipio_startup_data(codec);
7342
7343         chipio_set_stream_control(codec, 0x03, 1);
7344         chipio_set_stream_control(codec, 0x04, 1);
7345
7346         /*
7347          * Sets internal input loopback to off, used to have a switch to
7348          * enable input loopback, but turned out to be way too buggy.
7349          */
7350         tmp = FLOAT_ONE;
7351         dspio_set_uint_param(codec, 0x37, 0x08, tmp);
7352         dspio_set_uint_param(codec, 0x37, 0x10, tmp);
7353
7354         /*remove DSP headroom*/
7355         tmp = FLOAT_ZERO;
7356         dspio_set_uint_param(codec, 0x96, 0x3C, tmp);
7357
7358         /* set WUH source */
7359         tmp = FLOAT_TWO;
7360         dspio_set_uint_param(codec, 0x31, 0x00, tmp);
7361         chipio_set_conn_rate(codec, MEM_CONNID_WUH, SR_48_000);
7362
7363         /* Set speaker source? */
7364         dspio_set_uint_param(codec, 0x32, 0x00, tmp);
7365
7366         ca0132_alt_dsp_initial_mic_setup(codec);
7367
7368         /* out, in effects + voicefx */
7369         num_fx = OUT_EFFECTS_COUNT + IN_EFFECTS_COUNT + 1;
7370         for (idx = 0; idx < num_fx; idx++) {
7371                 for (i = 0; i <= ca0132_effects[idx].params; i++) {
7372                         dspio_set_uint_param(codec,
7373                                         ca0132_effects[idx].mid,
7374                                         ca0132_effects[idx].reqs[i],
7375                                         ca0132_effects[idx].def_vals[i]);
7376                 }
7377         }
7378
7379         ca0132_alt_create_dummy_stream(codec);
7380 }
7381
7382 /*
7383  * Setup default parameters for the Sound BlasterX AE-5 DSP.
7384  */
7385 static void ae5_setup_defaults(struct hda_codec *codec)
7386 {
7387         struct ca0132_spec *spec = codec->spec;
7388         unsigned int tmp;
7389         int num_fx;
7390         int idx, i;
7391
7392         if (spec->dsp_state != DSP_DOWNLOADED)
7393                 return;
7394
7395         ca0132_alt_dsp_scp_startup(codec);
7396         ca0132_alt_init_analog_mics(codec);
7397         chipio_set_stream_control(codec, 0x03, 1);
7398         chipio_set_stream_control(codec, 0x04, 1);
7399
7400         /* New, unknown SCP req's */
7401         tmp = FLOAT_ZERO;
7402         dspio_set_uint_param(codec, 0x96, 0x29, tmp);
7403         dspio_set_uint_param(codec, 0x96, 0x2a, tmp);
7404         dspio_set_uint_param(codec, 0x80, 0x0d, tmp);
7405         dspio_set_uint_param(codec, 0x80, 0x0e, tmp);
7406
7407         ca0113_mmio_command_set(codec, 0x30, 0x2e, 0x3f);
7408         ca0113_mmio_gpio_set(codec, 0, false);
7409         ca0113_mmio_command_set(codec, 0x30, 0x28, 0x00);
7410
7411         /* Internal loopback off */
7412         tmp = FLOAT_ONE;
7413         dspio_set_uint_param(codec, 0x37, 0x08, tmp);
7414         dspio_set_uint_param(codec, 0x37, 0x10, tmp);
7415
7416         /*remove DSP headroom*/
7417         tmp = FLOAT_ZERO;
7418         dspio_set_uint_param(codec, 0x96, 0x3C, tmp);
7419
7420         /* set WUH source */
7421         tmp = FLOAT_TWO;
7422         dspio_set_uint_param(codec, 0x31, 0x00, tmp);
7423         chipio_set_conn_rate(codec, MEM_CONNID_WUH, SR_48_000);
7424
7425         /* Set speaker source? */
7426         dspio_set_uint_param(codec, 0x32, 0x00, tmp);
7427
7428         ca0132_alt_dsp_initial_mic_setup(codec);
7429         ae5_post_dsp_register_set(codec);
7430         ae5_post_dsp_param_setup(codec);
7431         ae5_post_dsp_pll_setup(codec);
7432         ae5_post_dsp_stream_setup(codec);
7433         ae5_post_dsp_startup_data(codec);
7434
7435         /* out, in effects + voicefx */
7436         num_fx = OUT_EFFECTS_COUNT + IN_EFFECTS_COUNT + 1;
7437         for (idx = 0; idx < num_fx; idx++) {
7438                 for (i = 0; i <= ca0132_effects[idx].params; i++) {
7439                         dspio_set_uint_param(codec,
7440                                         ca0132_effects[idx].mid,
7441                                         ca0132_effects[idx].reqs[i],
7442                                         ca0132_effects[idx].def_vals[i]);
7443                 }
7444         }
7445
7446         ca0132_alt_create_dummy_stream(codec);
7447 }
7448
7449 /*
7450  * Initialization of flags in chip
7451  */
7452 static void ca0132_init_flags(struct hda_codec *codec)
7453 {
7454         struct ca0132_spec *spec = codec->spec;
7455
7456         if (ca0132_use_alt_functions(spec)) {
7457                 chipio_set_control_flag(codec, CONTROL_FLAG_DSP_96KHZ, 1);
7458                 chipio_set_control_flag(codec, CONTROL_FLAG_DAC_96KHZ, 1);
7459                 chipio_set_control_flag(codec, CONTROL_FLAG_ADC_B_96KHZ, 1);
7460                 chipio_set_control_flag(codec, CONTROL_FLAG_ADC_C_96KHZ, 1);
7461                 chipio_set_control_flag(codec, CONTROL_FLAG_SRC_RATE_96KHZ, 1);
7462                 chipio_set_control_flag(codec, CONTROL_FLAG_IDLE_ENABLE, 0);
7463                 chipio_set_control_flag(codec, CONTROL_FLAG_SPDIF2OUT, 0);
7464                 chipio_set_control_flag(codec,
7465                                 CONTROL_FLAG_PORT_D_10KOHM_LOAD, 0);
7466                 chipio_set_control_flag(codec,
7467                                 CONTROL_FLAG_PORT_A_10KOHM_LOAD, 1);
7468         } else {
7469                 chipio_set_control_flag(codec, CONTROL_FLAG_IDLE_ENABLE, 0);
7470                 chipio_set_control_flag(codec,
7471                                 CONTROL_FLAG_PORT_A_COMMON_MODE, 0);
7472                 chipio_set_control_flag(codec,
7473                                 CONTROL_FLAG_PORT_D_COMMON_MODE, 0);
7474                 chipio_set_control_flag(codec,
7475                                 CONTROL_FLAG_PORT_A_10KOHM_LOAD, 0);
7476                 chipio_set_control_flag(codec,
7477                                 CONTROL_FLAG_PORT_D_10KOHM_LOAD, 0);
7478                 chipio_set_control_flag(codec, CONTROL_FLAG_ADC_C_HIGH_PASS, 1);
7479         }
7480 }
7481
7482 /*
7483  * Initialization of parameters in chip
7484  */
7485 static void ca0132_init_params(struct hda_codec *codec)
7486 {
7487         struct ca0132_spec *spec = codec->spec;
7488
7489         if (ca0132_use_alt_functions(spec)) {
7490                 chipio_set_conn_rate(codec, MEM_CONNID_WUH, SR_48_000);
7491                 chipio_set_conn_rate(codec, 0x0B, SR_48_000);
7492                 chipio_set_control_param(codec, CONTROL_PARAM_SPDIF1_SOURCE, 0);
7493                 chipio_set_control_param(codec, 0, 0);
7494                 chipio_set_control_param(codec, CONTROL_PARAM_VIP_SOURCE, 0);
7495         }
7496
7497         chipio_set_control_param(codec, CONTROL_PARAM_PORTA_160OHM_GAIN, 6);
7498         chipio_set_control_param(codec, CONTROL_PARAM_PORTD_160OHM_GAIN, 6);
7499 }
7500
7501 static void ca0132_set_dsp_msr(struct hda_codec *codec, bool is96k)
7502 {
7503         chipio_set_control_flag(codec, CONTROL_FLAG_DSP_96KHZ, is96k);
7504         chipio_set_control_flag(codec, CONTROL_FLAG_DAC_96KHZ, is96k);
7505         chipio_set_control_flag(codec, CONTROL_FLAG_SRC_RATE_96KHZ, is96k);
7506         chipio_set_control_flag(codec, CONTROL_FLAG_SRC_CLOCK_196MHZ, is96k);
7507         chipio_set_control_flag(codec, CONTROL_FLAG_ADC_B_96KHZ, is96k);
7508         chipio_set_control_flag(codec, CONTROL_FLAG_ADC_C_96KHZ, is96k);
7509
7510         chipio_set_conn_rate(codec, MEM_CONNID_MICIN1, SR_96_000);
7511         chipio_set_conn_rate(codec, MEM_CONNID_MICOUT1, SR_96_000);
7512         chipio_set_conn_rate(codec, MEM_CONNID_WUH, SR_48_000);
7513 }
7514
7515 static bool ca0132_download_dsp_images(struct hda_codec *codec)
7516 {
7517         bool dsp_loaded = false;
7518         struct ca0132_spec *spec = codec->spec;
7519         const struct dsp_image_seg *dsp_os_image;
7520         const struct firmware *fw_entry = NULL;
7521         /*
7522          * Alternate firmwares for different variants. The Recon3Di apparently
7523          * can use the default firmware, but I'll leave the option in case
7524          * it needs it again.
7525          */
7526         switch (ca0132_quirk(spec)) {
7527         case QUIRK_SBZ:
7528         case QUIRK_R3D:
7529         case QUIRK_AE5:
7530                 if (request_firmware(&fw_entry, DESKTOP_EFX_FILE,
7531                                         codec->card->dev) != 0)
7532                         codec_dbg(codec, "Desktop firmware not found.");
7533                 else
7534                         codec_dbg(codec, "Desktop firmware selected.");
7535                 break;
7536         case QUIRK_R3DI:
7537                 if (request_firmware(&fw_entry, R3DI_EFX_FILE,
7538                                         codec->card->dev) != 0)
7539                         codec_dbg(codec, "Recon3Di alt firmware not detected.");
7540                 else
7541                         codec_dbg(codec, "Recon3Di firmware selected.");
7542                 break;
7543         default:
7544                 break;
7545         }
7546         /*
7547          * Use default ctefx.bin if no alt firmware is detected, or if none
7548          * exists for your particular codec.
7549          */
7550         if (!fw_entry) {
7551                 codec_dbg(codec, "Default firmware selected.");
7552                 if (request_firmware(&fw_entry, EFX_FILE,
7553                                         codec->card->dev) != 0)
7554                         return false;
7555         }
7556
7557         dsp_os_image = (struct dsp_image_seg *)(fw_entry->data);
7558         if (dspload_image(codec, dsp_os_image, 0, 0, true, 0)) {
7559                 codec_err(codec, "ca0132 DSP load image failed\n");
7560                 goto exit_download;
7561         }
7562
7563         dsp_loaded = dspload_wait_loaded(codec);
7564
7565 exit_download:
7566         release_firmware(fw_entry);
7567
7568         return dsp_loaded;
7569 }
7570
7571 static void ca0132_download_dsp(struct hda_codec *codec)
7572 {
7573         struct ca0132_spec *spec = codec->spec;
7574
7575 #ifndef CONFIG_SND_HDA_CODEC_CA0132_DSP
7576         return; /* NOP */
7577 #endif
7578
7579         if (spec->dsp_state == DSP_DOWNLOAD_FAILED)
7580                 return; /* don't retry failures */
7581
7582         chipio_enable_clocks(codec);
7583         if (spec->dsp_state != DSP_DOWNLOADED) {
7584                 spec->dsp_state = DSP_DOWNLOADING;
7585
7586                 if (!ca0132_download_dsp_images(codec))
7587                         spec->dsp_state = DSP_DOWNLOAD_FAILED;
7588                 else
7589                         spec->dsp_state = DSP_DOWNLOADED;
7590         }
7591
7592         /* For codecs using alt functions, this is already done earlier */
7593         if (spec->dsp_state == DSP_DOWNLOADED && !ca0132_use_alt_functions(spec))
7594                 ca0132_set_dsp_msr(codec, true);
7595 }
7596
7597 static void ca0132_process_dsp_response(struct hda_codec *codec,
7598                                         struct hda_jack_callback *callback)
7599 {
7600         struct ca0132_spec *spec = codec->spec;
7601
7602         codec_dbg(codec, "ca0132_process_dsp_response\n");
7603         if (spec->wait_scp) {
7604                 if (dspio_get_response_data(codec) >= 0)
7605                         spec->wait_scp = 0;
7606         }
7607
7608         dspio_clear_response_queue(codec);
7609 }
7610
7611 static void hp_callback(struct hda_codec *codec, struct hda_jack_callback *cb)
7612 {
7613         struct ca0132_spec *spec = codec->spec;
7614         struct hda_jack_tbl *tbl;
7615
7616         /* Delay enabling the HP amp, to let the mic-detection
7617          * state machine run.
7618          */
7619         cancel_delayed_work_sync(&spec->unsol_hp_work);
7620         schedule_delayed_work(&spec->unsol_hp_work, msecs_to_jiffies(500));
7621         tbl = snd_hda_jack_tbl_get(codec, cb->nid);
7622         if (tbl)
7623                 tbl->block_report = 1;
7624 }
7625
7626 static void amic_callback(struct hda_codec *codec, struct hda_jack_callback *cb)
7627 {
7628         struct ca0132_spec *spec = codec->spec;
7629
7630         if (ca0132_use_alt_functions(spec))
7631                 ca0132_alt_select_in(codec);
7632         else
7633                 ca0132_select_mic(codec);
7634 }
7635
7636 static void ca0132_init_unsol(struct hda_codec *codec)
7637 {
7638         struct ca0132_spec *spec = codec->spec;
7639         snd_hda_jack_detect_enable_callback(codec, spec->unsol_tag_hp, hp_callback);
7640         snd_hda_jack_detect_enable_callback(codec, spec->unsol_tag_amic1,
7641                                             amic_callback);
7642         snd_hda_jack_detect_enable_callback(codec, UNSOL_TAG_DSP,
7643                                             ca0132_process_dsp_response);
7644         /* Front headphone jack detection */
7645         if (ca0132_use_alt_functions(spec))
7646                 snd_hda_jack_detect_enable_callback(codec,
7647                         spec->unsol_tag_front_hp, hp_callback);
7648 }
7649
7650 /*
7651  * Verbs tables.
7652  */
7653
7654 /* Sends before DSP download. */
7655 static struct hda_verb ca0132_base_init_verbs[] = {
7656         /*enable ct extension*/
7657         {0x15, VENDOR_CHIPIO_CT_EXTENSIONS_ENABLE, 0x1},
7658         {}
7659 };
7660
7661 /* Send at exit. */
7662 static struct hda_verb ca0132_base_exit_verbs[] = {
7663         /*set afg to D3*/
7664         {0x01, AC_VERB_SET_POWER_STATE, 0x03},
7665         /*disable ct extension*/
7666         {0x15, VENDOR_CHIPIO_CT_EXTENSIONS_ENABLE, 0},
7667         {}
7668 };
7669
7670 /* Other verbs tables. Sends after DSP download. */
7671
7672 static struct hda_verb ca0132_init_verbs0[] = {
7673         /* chip init verbs */
7674         {0x15, 0x70D, 0xF0},
7675         {0x15, 0x70E, 0xFE},
7676         {0x15, 0x707, 0x75},
7677         {0x15, 0x707, 0xD3},
7678         {0x15, 0x707, 0x09},
7679         {0x15, 0x707, 0x53},
7680         {0x15, 0x707, 0xD4},
7681         {0x15, 0x707, 0xEF},
7682         {0x15, 0x707, 0x75},
7683         {0x15, 0x707, 0xD3},
7684         {0x15, 0x707, 0x09},
7685         {0x15, 0x707, 0x02},
7686         {0x15, 0x707, 0x37},
7687         {0x15, 0x707, 0x78},
7688         {0x15, 0x53C, 0xCE},
7689         {0x15, 0x575, 0xC9},
7690         {0x15, 0x53D, 0xCE},
7691         {0x15, 0x5B7, 0xC9},
7692         {0x15, 0x70D, 0xE8},
7693         {0x15, 0x70E, 0xFE},
7694         {0x15, 0x707, 0x02},
7695         {0x15, 0x707, 0x68},
7696         {0x15, 0x707, 0x62},
7697         {0x15, 0x53A, 0xCE},
7698         {0x15, 0x546, 0xC9},
7699         {0x15, 0x53B, 0xCE},
7700         {0x15, 0x5E8, 0xC9},
7701         {}
7702 };
7703
7704 /* Extra init verbs for desktop cards. */
7705 static struct hda_verb ca0132_init_verbs1[] = {
7706         {0x15, 0x70D, 0x20},
7707         {0x15, 0x70E, 0x19},
7708         {0x15, 0x707, 0x00},
7709         {0x15, 0x539, 0xCE},
7710         {0x15, 0x546, 0xC9},
7711         {0x15, 0x70D, 0xB7},
7712         {0x15, 0x70E, 0x09},
7713         {0x15, 0x707, 0x10},
7714         {0x15, 0x70D, 0xAF},
7715         {0x15, 0x70E, 0x09},
7716         {0x15, 0x707, 0x01},
7717         {0x15, 0x707, 0x05},
7718         {0x15, 0x70D, 0x73},
7719         {0x15, 0x70E, 0x09},
7720         {0x15, 0x707, 0x14},
7721         {0x15, 0x6FF, 0xC4},
7722         {}
7723 };
7724
7725 static void ca0132_init_chip(struct hda_codec *codec)
7726 {
7727         struct ca0132_spec *spec = codec->spec;
7728         int num_fx;
7729         int i;
7730         unsigned int on;
7731
7732         mutex_init(&spec->chipio_mutex);
7733
7734         spec->cur_out_type = SPEAKER_OUT;
7735         if (!ca0132_use_alt_functions(spec))
7736                 spec->cur_mic_type = DIGITAL_MIC;
7737         else
7738                 spec->cur_mic_type = REAR_MIC;
7739
7740         spec->cur_mic_boost = 0;
7741
7742         for (i = 0; i < VNODES_COUNT; i++) {
7743                 spec->vnode_lvol[i] = 0x5a;
7744                 spec->vnode_rvol[i] = 0x5a;
7745                 spec->vnode_lswitch[i] = 0;
7746                 spec->vnode_rswitch[i] = 0;
7747         }
7748
7749         /*
7750          * Default states for effects are in ca0132_effects[].
7751          */
7752         num_fx = OUT_EFFECTS_COUNT + IN_EFFECTS_COUNT;
7753         for (i = 0; i < num_fx; i++) {
7754                 on = (unsigned int)ca0132_effects[i].reqs[0];
7755                 spec->effects_switch[i] = on ? 1 : 0;
7756         }
7757         /*
7758          * Sets defaults for the effect slider controls, only for alternative
7759          * ca0132 codecs. Also sets x-bass crossover frequency to 80hz.
7760          */
7761         if (ca0132_use_alt_controls(spec)) {
7762                 spec->xbass_xover_freq = 8;
7763                 for (i = 0; i < EFFECT_LEVEL_SLIDERS; i++)
7764                         spec->fx_ctl_val[i] = effect_slider_defaults[i];
7765         }
7766
7767         spec->voicefx_val = 0;
7768         spec->effects_switch[PLAY_ENHANCEMENT - EFFECT_START_NID] = 1;
7769         spec->effects_switch[CRYSTAL_VOICE - EFFECT_START_NID] = 0;
7770
7771         /*
7772          * The ZxR doesn't have a front panel header, and it's line-in is on
7773          * the daughter board. So, there is no input enum control, and we need
7774          * to make sure that spec->in_enum_val is set properly.
7775          */
7776         if (ca0132_quirk(spec) == QUIRK_ZXR)
7777                 spec->in_enum_val = REAR_MIC;
7778
7779 #ifdef ENABLE_TUNING_CONTROLS
7780         ca0132_init_tuning_defaults(codec);
7781 #endif
7782 }
7783
7784 /*
7785  * Recon3Di exit specific commands.
7786  */
7787 /* prevents popping noise on shutdown */
7788 static void r3di_gpio_shutdown(struct hda_codec *codec)
7789 {
7790         snd_hda_codec_write(codec, 0x01, 0, AC_VERB_SET_GPIO_DATA, 0x00);
7791 }
7792
7793 /*
7794  * Sound Blaster Z exit specific commands.
7795  */
7796 static void sbz_region2_exit(struct hda_codec *codec)
7797 {
7798         struct ca0132_spec *spec = codec->spec;
7799         unsigned int i;
7800
7801         for (i = 0; i < 4; i++)
7802                 writeb(0x0, spec->mem_base + 0x100);
7803         for (i = 0; i < 8; i++)
7804                 writeb(0xb3, spec->mem_base + 0x304);
7805
7806         ca0113_mmio_gpio_set(codec, 0, false);
7807         ca0113_mmio_gpio_set(codec, 1, false);
7808         ca0113_mmio_gpio_set(codec, 4, true);
7809         ca0113_mmio_gpio_set(codec, 5, false);
7810         ca0113_mmio_gpio_set(codec, 7, false);
7811 }
7812
7813 static void sbz_set_pin_ctl_default(struct hda_codec *codec)
7814 {
7815         hda_nid_t pins[5] = {0x0B, 0x0C, 0x0E, 0x12, 0x13};
7816         unsigned int i;
7817
7818         snd_hda_codec_write(codec, 0x11, 0,
7819                         AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40);
7820
7821         for (i = 0; i < 5; i++)
7822                 snd_hda_codec_write(codec, pins[i], 0,
7823                                 AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00);
7824 }
7825
7826 static void ca0132_clear_unsolicited(struct hda_codec *codec)
7827 {
7828         hda_nid_t pins[7] = {0x0B, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13};
7829         unsigned int i;
7830
7831         for (i = 0; i < 7; i++) {
7832                 snd_hda_codec_write(codec, pins[i], 0,
7833                                 AC_VERB_SET_UNSOLICITED_ENABLE, 0x00);
7834         }
7835 }
7836
7837 /* On shutdown, sends commands in sets of three */
7838 static void sbz_gpio_shutdown_commands(struct hda_codec *codec, int dir,
7839                                                         int mask, int data)
7840 {
7841         if (dir >= 0)
7842                 snd_hda_codec_write(codec, 0x01, 0,
7843                                 AC_VERB_SET_GPIO_DIRECTION, dir);
7844         if (mask >= 0)
7845                 snd_hda_codec_write(codec, 0x01, 0,
7846                                 AC_VERB_SET_GPIO_MASK, mask);
7847
7848         if (data >= 0)
7849                 snd_hda_codec_write(codec, 0x01, 0,
7850                                 AC_VERB_SET_GPIO_DATA, data);
7851 }
7852
7853 static void zxr_dbpro_power_state_shutdown(struct hda_codec *codec)
7854 {
7855         hda_nid_t pins[7] = {0x05, 0x0c, 0x09, 0x0e, 0x08, 0x11, 0x01};
7856         unsigned int i;
7857
7858         for (i = 0; i < 7; i++)
7859                 snd_hda_codec_write(codec, pins[i], 0,
7860                                 AC_VERB_SET_POWER_STATE, 0x03);
7861 }
7862
7863 static void sbz_exit_chip(struct hda_codec *codec)
7864 {
7865         chipio_set_stream_control(codec, 0x03, 0);
7866         chipio_set_stream_control(codec, 0x04, 0);
7867
7868         /* Mess with GPIO */
7869         sbz_gpio_shutdown_commands(codec, 0x07, 0x07, -1);
7870         sbz_gpio_shutdown_commands(codec, 0x07, 0x07, 0x05);
7871         sbz_gpio_shutdown_commands(codec, 0x07, 0x07, 0x01);
7872
7873         chipio_set_stream_control(codec, 0x14, 0);
7874         chipio_set_stream_control(codec, 0x0C, 0);
7875
7876         chipio_set_conn_rate(codec, 0x41, SR_192_000);
7877         chipio_set_conn_rate(codec, 0x91, SR_192_000);
7878
7879         chipio_write(codec, 0x18a020, 0x00000083);
7880
7881         sbz_gpio_shutdown_commands(codec, 0x07, 0x07, 0x03);
7882         sbz_gpio_shutdown_commands(codec, 0x07, 0x07, 0x07);
7883         sbz_gpio_shutdown_commands(codec, 0x07, 0x07, 0x06);
7884
7885         chipio_set_stream_control(codec, 0x0C, 0);
7886
7887         chipio_set_control_param(codec, 0x0D, 0x24);
7888
7889         ca0132_clear_unsolicited(codec);
7890         sbz_set_pin_ctl_default(codec);
7891
7892         snd_hda_codec_write(codec, 0x0B, 0,
7893                 AC_VERB_SET_EAPD_BTLENABLE, 0x00);
7894
7895         sbz_region2_exit(codec);
7896 }
7897
7898 static void r3d_exit_chip(struct hda_codec *codec)
7899 {
7900         ca0132_clear_unsolicited(codec);
7901         snd_hda_codec_write(codec, 0x01, 0, 0x793, 0x00);
7902         snd_hda_codec_write(codec, 0x01, 0, 0x794, 0x5b);
7903 }
7904
7905 static void ae5_exit_chip(struct hda_codec *codec)
7906 {
7907         chipio_set_stream_control(codec, 0x03, 0);
7908         chipio_set_stream_control(codec, 0x04, 0);
7909
7910         ca0113_mmio_command_set(codec, 0x30, 0x32, 0x3f);
7911         ca0113_mmio_command_set(codec, 0x48, 0x07, 0x83);
7912         ca0113_mmio_command_set(codec, 0x48, 0x07, 0x83);
7913         ca0113_mmio_command_set(codec, 0x30, 0x30, 0x00);
7914         ca0113_mmio_command_set(codec, 0x30, 0x2b, 0x00);
7915         ca0113_mmio_command_set(codec, 0x30, 0x2d, 0x00);
7916         ca0113_mmio_gpio_set(codec, 0, false);
7917         ca0113_mmio_gpio_set(codec, 1, false);
7918
7919         snd_hda_codec_write(codec, 0x01, 0, 0x793, 0x00);
7920         snd_hda_codec_write(codec, 0x01, 0, 0x794, 0x53);
7921
7922         chipio_set_control_param(codec, CONTROL_PARAM_ASI, 0);
7923
7924         chipio_set_stream_control(codec, 0x18, 0);
7925         chipio_set_stream_control(codec, 0x0c, 0);
7926
7927         snd_hda_codec_write(codec, 0x01, 0, 0x724, 0x83);
7928 }
7929
7930 static void zxr_exit_chip(struct hda_codec *codec)
7931 {
7932         chipio_set_stream_control(codec, 0x03, 0);
7933         chipio_set_stream_control(codec, 0x04, 0);
7934         chipio_set_stream_control(codec, 0x14, 0);
7935         chipio_set_stream_control(codec, 0x0C, 0);
7936
7937         chipio_set_conn_rate(codec, 0x41, SR_192_000);
7938         chipio_set_conn_rate(codec, 0x91, SR_192_000);
7939
7940         chipio_write(codec, 0x18a020, 0x00000083);
7941
7942         snd_hda_codec_write(codec, 0x01, 0, 0x793, 0x00);
7943         snd_hda_codec_write(codec, 0x01, 0, 0x794, 0x53);
7944
7945         ca0132_clear_unsolicited(codec);
7946         sbz_set_pin_ctl_default(codec);
7947         snd_hda_codec_write(codec, 0x0B, 0, AC_VERB_SET_EAPD_BTLENABLE, 0x00);
7948
7949         ca0113_mmio_gpio_set(codec, 5, false);
7950         ca0113_mmio_gpio_set(codec, 2, false);
7951         ca0113_mmio_gpio_set(codec, 3, false);
7952         ca0113_mmio_gpio_set(codec, 0, false);
7953         ca0113_mmio_gpio_set(codec, 4, true);
7954         ca0113_mmio_gpio_set(codec, 0, true);
7955         ca0113_mmio_gpio_set(codec, 5, true);
7956         ca0113_mmio_gpio_set(codec, 2, false);
7957         ca0113_mmio_gpio_set(codec, 3, false);
7958 }
7959
7960 static void ca0132_exit_chip(struct hda_codec *codec)
7961 {
7962         /* put any chip cleanup stuffs here. */
7963
7964         if (dspload_is_loaded(codec))
7965                 dsp_reset(codec);
7966 }
7967
7968 /*
7969  * This fixes a problem that was hard to reproduce. Very rarely, I would
7970  * boot up, and there would be no sound, but the DSP indicated it had loaded
7971  * properly. I did a few memory dumps to see if anything was different, and
7972  * there were a few areas of memory uninitialized with a1a2a3a4. This function
7973  * checks if those areas are uninitialized, and if they are, it'll attempt to
7974  * reload the card 3 times. Usually it fixes by the second.
7975  */
7976 static void sbz_dsp_startup_check(struct hda_codec *codec)
7977 {
7978         struct ca0132_spec *spec = codec->spec;
7979         unsigned int dsp_data_check[4];
7980         unsigned int cur_address = 0x390;
7981         unsigned int i;
7982         unsigned int failure = 0;
7983         unsigned int reload = 3;
7984
7985         if (spec->startup_check_entered)
7986                 return;
7987
7988         spec->startup_check_entered = true;
7989
7990         for (i = 0; i < 4; i++) {
7991                 chipio_read(codec, cur_address, &dsp_data_check[i]);
7992                 cur_address += 0x4;
7993         }
7994         for (i = 0; i < 4; i++) {
7995                 if (dsp_data_check[i] == 0xa1a2a3a4)
7996                         failure = 1;
7997         }
7998
7999         codec_dbg(codec, "Startup Check: %d ", failure);
8000         if (failure)
8001                 codec_info(codec, "DSP not initialized properly. Attempting to fix.");
8002         /*
8003          * While the failure condition is true, and we haven't reached our
8004          * three reload limit, continue trying to reload the driver and
8005          * fix the issue.
8006          */
8007         while (failure && (reload != 0)) {
8008                 codec_info(codec, "Reloading... Tries left: %d", reload);
8009                 sbz_exit_chip(codec);
8010                 spec->dsp_state = DSP_DOWNLOAD_INIT;
8011                 codec->patch_ops.init(codec);
8012                 failure = 0;
8013                 for (i = 0; i < 4; i++) {
8014                         chipio_read(codec, cur_address, &dsp_data_check[i]);
8015                         cur_address += 0x4;
8016                 }
8017                 for (i = 0; i < 4; i++) {
8018                         if (dsp_data_check[i] == 0xa1a2a3a4)
8019                                 failure = 1;
8020                 }
8021                 reload--;
8022         }
8023
8024         if (!failure && reload < 3)
8025                 codec_info(codec, "DSP fixed.");
8026
8027         if (!failure)
8028                 return;
8029
8030         codec_info(codec, "DSP failed to initialize properly. Either try a full shutdown or a suspend to clear the internal memory.");
8031 }
8032
8033 /*
8034  * This is for the extra volume verbs 0x797 (left) and 0x798 (right). These add
8035  * extra precision for decibel values. If you had the dB value in floating point
8036  * you would take the value after the decimal point, multiply by 64, and divide
8037  * by 2. So for 8.59, it's (59 * 64) / 100. Useful if someone wanted to
8038  * implement fixed point or floating point dB volumes. For now, I'll set them
8039  * to 0 just incase a value has lingered from a boot into Windows.
8040  */
8041 static void ca0132_alt_vol_setup(struct hda_codec *codec)
8042 {
8043         snd_hda_codec_write(codec, 0x02, 0, 0x797, 0x00);
8044         snd_hda_codec_write(codec, 0x02, 0, 0x798, 0x00);
8045         snd_hda_codec_write(codec, 0x03, 0, 0x797, 0x00);
8046         snd_hda_codec_write(codec, 0x03, 0, 0x798, 0x00);
8047         snd_hda_codec_write(codec, 0x04, 0, 0x797, 0x00);
8048         snd_hda_codec_write(codec, 0x04, 0, 0x798, 0x00);
8049         snd_hda_codec_write(codec, 0x07, 0, 0x797, 0x00);
8050         snd_hda_codec_write(codec, 0x07, 0, 0x798, 0x00);
8051 }
8052
8053 /*
8054  * Extra commands that don't really fit anywhere else.
8055  */
8056 static void sbz_pre_dsp_setup(struct hda_codec *codec)
8057 {
8058         struct ca0132_spec *spec = codec->spec;
8059
8060         writel(0x00820680, spec->mem_base + 0x01C);
8061         writel(0x00820680, spec->mem_base + 0x01C);
8062
8063         chipio_write(codec, 0x18b0a4, 0x000000c2);
8064
8065         snd_hda_codec_write(codec, 0x11, 0,
8066                         AC_VERB_SET_PIN_WIDGET_CONTROL, 0x44);
8067 }
8068
8069 static void r3d_pre_dsp_setup(struct hda_codec *codec)
8070 {
8071         chipio_write(codec, 0x18b0a4, 0x000000c2);
8072
8073         snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
8074                             VENDOR_CHIPIO_8051_ADDRESS_LOW, 0x1E);
8075         snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
8076                             VENDOR_CHIPIO_8051_ADDRESS_HIGH, 0x1C);
8077         snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
8078                             VENDOR_CHIPIO_8051_DATA_WRITE, 0x5B);
8079
8080         snd_hda_codec_write(codec, 0x11, 0,
8081                         AC_VERB_SET_PIN_WIDGET_CONTROL, 0x44);
8082 }
8083
8084 static void r3di_pre_dsp_setup(struct hda_codec *codec)
8085 {
8086         chipio_write(codec, 0x18b0a4, 0x000000c2);
8087
8088         snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
8089                             VENDOR_CHIPIO_8051_ADDRESS_LOW, 0x1E);
8090         snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
8091                             VENDOR_CHIPIO_8051_ADDRESS_HIGH, 0x1C);
8092         snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
8093                             VENDOR_CHIPIO_8051_DATA_WRITE, 0x5B);
8094
8095         snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
8096                             VENDOR_CHIPIO_8051_ADDRESS_LOW, 0x20);
8097         snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
8098                             VENDOR_CHIPIO_8051_ADDRESS_HIGH, 0x19);
8099         snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
8100                             VENDOR_CHIPIO_8051_DATA_WRITE, 0x00);
8101         snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
8102                             VENDOR_CHIPIO_8051_DATA_WRITE, 0x40);
8103
8104         snd_hda_codec_write(codec, 0x11, 0,
8105                         AC_VERB_SET_PIN_WIDGET_CONTROL, 0x04);
8106 }
8107
8108 /*
8109  * These are sent before the DSP is downloaded. Not sure
8110  * what they do, or if they're necessary. Could possibly
8111  * be removed. Figure they're better to leave in.
8112  */
8113 static void ca0132_mmio_init(struct hda_codec *codec)
8114 {
8115         struct ca0132_spec *spec = codec->spec;
8116
8117         if (ca0132_quirk(spec) == QUIRK_AE5)
8118                 writel(0x00000001, spec->mem_base + 0x400);
8119         else
8120                 writel(0x00000000, spec->mem_base + 0x400);
8121
8122         if (ca0132_quirk(spec) == QUIRK_AE5)
8123                 writel(0x00000001, spec->mem_base + 0x408);
8124         else
8125                 writel(0x00000000, spec->mem_base + 0x408);
8126
8127         if (ca0132_quirk(spec) == QUIRK_AE5)
8128                 writel(0x00000001, spec->mem_base + 0x40c);
8129         else
8130                 writel(0x00000000, spec->mem_base + 0x40C);
8131
8132         if (ca0132_quirk(spec) == QUIRK_ZXR)
8133                 writel(0x00880640, spec->mem_base + 0x01C);
8134         else
8135                 writel(0x00880680, spec->mem_base + 0x01C);
8136
8137         if (ca0132_quirk(spec) == QUIRK_AE5)
8138                 writel(0x00000080, spec->mem_base + 0xC0C);
8139         else
8140                 writel(0x00000083, spec->mem_base + 0xC0C);
8141
8142         writel(0x00000030, spec->mem_base + 0xC00);
8143         writel(0x00000000, spec->mem_base + 0xC04);
8144
8145         if (ca0132_quirk(spec) == QUIRK_AE5)
8146                 writel(0x00000000, spec->mem_base + 0xC0C);
8147         else
8148                 writel(0x00000003, spec->mem_base + 0xC0C);
8149
8150         writel(0x00000003, spec->mem_base + 0xC0C);
8151         writel(0x00000003, spec->mem_base + 0xC0C);
8152         writel(0x00000003, spec->mem_base + 0xC0C);
8153
8154         if (ca0132_quirk(spec) == QUIRK_AE5)
8155                 writel(0x00000001, spec->mem_base + 0xC08);
8156         else
8157                 writel(0x000000C1, spec->mem_base + 0xC08);
8158
8159         writel(0x000000F1, spec->mem_base + 0xC08);
8160         writel(0x00000001, spec->mem_base + 0xC08);
8161         writel(0x000000C7, spec->mem_base + 0xC08);
8162         writel(0x000000C1, spec->mem_base + 0xC08);
8163         writel(0x00000080, spec->mem_base + 0xC04);
8164
8165         if (ca0132_quirk(spec) == QUIRK_AE5) {
8166                 writel(0x00000000, spec->mem_base + 0x42c);
8167                 writel(0x00000000, spec->mem_base + 0x46c);
8168                 writel(0x00000000, spec->mem_base + 0x4ac);
8169                 writel(0x00000000, spec->mem_base + 0x4ec);
8170                 writel(0x00000000, spec->mem_base + 0x43c);
8171                 writel(0x00000000, spec->mem_base + 0x47c);
8172                 writel(0x00000000, spec->mem_base + 0x4bc);
8173                 writel(0x00000000, spec->mem_base + 0x4fc);
8174                 writel(0x00000600, spec->mem_base + 0x100);
8175                 writel(0x00000014, spec->mem_base + 0x410);
8176                 writel(0x0000060f, spec->mem_base + 0x100);
8177                 writel(0x0000070f, spec->mem_base + 0x100);
8178                 writel(0x00000aff, spec->mem_base + 0x830);
8179                 writel(0x00000000, spec->mem_base + 0x86c);
8180                 writel(0x0000006b, spec->mem_base + 0x800);
8181                 writel(0x00000001, spec->mem_base + 0x86c);
8182                 writel(0x0000006b, spec->mem_base + 0x800);
8183                 writel(0x00000057, spec->mem_base + 0x804);
8184                 writel(0x00800000, spec->mem_base + 0x20c);
8185         }
8186 }
8187
8188 /*
8189  * This function writes to some SFR's, does some region2 writes, and then
8190  * eventually resets the codec with the 0x7ff verb. Not quite sure why it does
8191  * what it does.
8192  */
8193 static void ae5_register_set(struct hda_codec *codec)
8194 {
8195         struct ca0132_spec *spec = codec->spec;
8196
8197         chipio_8051_write_direct(codec, 0x93, 0x10);
8198         snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
8199                             VENDOR_CHIPIO_8051_ADDRESS_LOW, 0x44);
8200         snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
8201                             VENDOR_CHIPIO_PLL_PMU_WRITE, 0xc2);
8202
8203         writeb(0x0f, spec->mem_base + 0x304);
8204         writeb(0x0f, spec->mem_base + 0x304);
8205         writeb(0x0f, spec->mem_base + 0x304);
8206         writeb(0x0f, spec->mem_base + 0x304);
8207         writeb(0x0e, spec->mem_base + 0x100);
8208         writeb(0x1f, spec->mem_base + 0x304);
8209         writeb(0x0c, spec->mem_base + 0x100);
8210         writeb(0x3f, spec->mem_base + 0x304);
8211         writeb(0x08, spec->mem_base + 0x100);
8212         writeb(0x7f, spec->mem_base + 0x304);
8213         writeb(0x00, spec->mem_base + 0x100);
8214         writeb(0xff, spec->mem_base + 0x304);
8215
8216         ca0113_mmio_command_set(codec, 0x30, 0x2d, 0x3f);
8217
8218         chipio_8051_write_direct(codec, 0x90, 0x00);
8219         chipio_8051_write_direct(codec, 0x90, 0x10);
8220
8221         ca0113_mmio_command_set(codec, 0x48, 0x07, 0x83);
8222
8223         chipio_write(codec, 0x18b0a4, 0x000000c2);
8224
8225         snd_hda_codec_write(codec, 0x01, 0, 0x7ff, 0x00);
8226         snd_hda_codec_write(codec, 0x01, 0, 0x7ff, 0x00);
8227 }
8228
8229 /*
8230  * Extra init functions for alternative ca0132 codecs. Done
8231  * here so they don't clutter up the main ca0132_init function
8232  * anymore than they have to.
8233  */
8234 static void ca0132_alt_init(struct hda_codec *codec)
8235 {
8236         struct ca0132_spec *spec = codec->spec;
8237
8238         ca0132_alt_vol_setup(codec);
8239
8240         switch (ca0132_quirk(spec)) {
8241         case QUIRK_SBZ:
8242                 codec_dbg(codec, "SBZ alt_init");
8243                 ca0132_gpio_init(codec);
8244                 sbz_pre_dsp_setup(codec);
8245                 snd_hda_sequence_write(codec, spec->chip_init_verbs);
8246                 snd_hda_sequence_write(codec, spec->desktop_init_verbs);
8247                 break;
8248         case QUIRK_R3DI:
8249                 codec_dbg(codec, "R3DI alt_init");
8250                 ca0132_gpio_init(codec);
8251                 ca0132_gpio_setup(codec);
8252                 r3di_gpio_dsp_status_set(codec, R3DI_DSP_DOWNLOADING);
8253                 r3di_pre_dsp_setup(codec);
8254                 snd_hda_sequence_write(codec, spec->chip_init_verbs);
8255                 snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0, 0x6FF, 0xC4);
8256                 break;
8257         case QUIRK_R3D:
8258                 r3d_pre_dsp_setup(codec);
8259                 snd_hda_sequence_write(codec, spec->chip_init_verbs);
8260                 snd_hda_sequence_write(codec, spec->desktop_init_verbs);
8261                 break;
8262         case QUIRK_AE5:
8263                 ca0132_gpio_init(codec);
8264                 snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
8265                                 VENDOR_CHIPIO_8051_ADDRESS_LOW, 0x49);
8266                 snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
8267                                 VENDOR_CHIPIO_PLL_PMU_WRITE, 0x88);
8268                 chipio_write(codec, 0x18b030, 0x00000020);
8269                 snd_hda_sequence_write(codec, spec->chip_init_verbs);
8270                 snd_hda_sequence_write(codec, spec->desktop_init_verbs);
8271                 ca0113_mmio_command_set(codec, 0x30, 0x32, 0x3f);
8272                 break;
8273         case QUIRK_ZXR:
8274                 snd_hda_sequence_write(codec, spec->chip_init_verbs);
8275                 snd_hda_sequence_write(codec, spec->desktop_init_verbs);
8276                 break;
8277         default:
8278                 break;
8279         }
8280 }
8281
8282 static int ca0132_init(struct hda_codec *codec)
8283 {
8284         struct ca0132_spec *spec = codec->spec;
8285         struct auto_pin_cfg *cfg = &spec->autocfg;
8286         int i;
8287         bool dsp_loaded;
8288
8289         /*
8290          * If the DSP is already downloaded, and init has been entered again,
8291          * there's only two reasons for it. One, the codec has awaken from a
8292          * suspended state, and in that case dspload_is_loaded will return
8293          * false, and the init will be ran again. The other reason it gets
8294          * re entered is on startup for some reason it triggers a suspend and
8295          * resume state. In this case, it will check if the DSP is downloaded,
8296          * and not run the init function again. For codecs using alt_functions,
8297          * it will check if the DSP is loaded properly.
8298          */
8299         if (spec->dsp_state == DSP_DOWNLOADED) {
8300                 dsp_loaded = dspload_is_loaded(codec);
8301                 if (!dsp_loaded) {
8302                         spec->dsp_reload = true;
8303                         spec->dsp_state = DSP_DOWNLOAD_INIT;
8304                 } else {
8305                         if (ca0132_quirk(spec) == QUIRK_SBZ)
8306                                 sbz_dsp_startup_check(codec);
8307                         return 0;
8308                 }
8309         }
8310
8311         if (spec->dsp_state != DSP_DOWNLOAD_FAILED)
8312                 spec->dsp_state = DSP_DOWNLOAD_INIT;
8313         spec->curr_chip_addx = INVALID_CHIP_ADDRESS;
8314
8315         if (ca0132_use_pci_mmio(spec))
8316                 ca0132_mmio_init(codec);
8317
8318         snd_hda_power_up_pm(codec);
8319
8320         if (ca0132_quirk(spec) == QUIRK_AE5)
8321                 ae5_register_set(codec);
8322
8323         ca0132_init_unsol(codec);
8324         ca0132_init_params(codec);
8325         ca0132_init_flags(codec);
8326
8327         snd_hda_sequence_write(codec, spec->base_init_verbs);
8328
8329         if (ca0132_use_alt_functions(spec))
8330                 ca0132_alt_init(codec);
8331
8332         ca0132_download_dsp(codec);
8333
8334         ca0132_refresh_widget_caps(codec);
8335
8336         switch (ca0132_quirk(spec)) {
8337         case QUIRK_R3DI:
8338         case QUIRK_R3D:
8339                 r3d_setup_defaults(codec);
8340                 break;
8341         case QUIRK_SBZ:
8342         case QUIRK_ZXR:
8343                 sbz_setup_defaults(codec);
8344                 break;
8345         case QUIRK_AE5:
8346                 ae5_setup_defaults(codec);
8347                 break;
8348         default:
8349                 ca0132_setup_defaults(codec);
8350                 ca0132_init_analog_mic2(codec);
8351                 ca0132_init_dmic(codec);
8352                 break;
8353         }
8354
8355         for (i = 0; i < spec->num_outputs; i++)
8356                 init_output(codec, spec->out_pins[i], spec->dacs[0]);
8357
8358         init_output(codec, cfg->dig_out_pins[0], spec->dig_out);
8359
8360         for (i = 0; i < spec->num_inputs; i++)
8361                 init_input(codec, spec->input_pins[i], spec->adcs[i]);
8362
8363         init_input(codec, cfg->dig_in_pin, spec->dig_in);
8364
8365         if (!ca0132_use_alt_functions(spec)) {
8366                 snd_hda_sequence_write(codec, spec->chip_init_verbs);
8367                 snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
8368                             VENDOR_CHIPIO_PARAM_EX_ID_SET, 0x0D);
8369                 snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
8370                             VENDOR_CHIPIO_PARAM_EX_VALUE_SET, 0x20);
8371         }
8372
8373         if (ca0132_quirk(spec) == QUIRK_SBZ)
8374                 ca0132_gpio_setup(codec);
8375
8376         snd_hda_sequence_write(codec, spec->spec_init_verbs);
8377         if (ca0132_use_alt_functions(spec)) {
8378                 ca0132_alt_select_out(codec);
8379                 ca0132_alt_select_in(codec);
8380         } else {
8381                 ca0132_select_out(codec);
8382                 ca0132_select_mic(codec);
8383         }
8384
8385         snd_hda_jack_report_sync(codec);
8386
8387         /*
8388          * Re set the PlayEnhancement switch on a resume event, because the
8389          * controls will not be reloaded.
8390          */
8391         if (spec->dsp_reload) {
8392                 spec->dsp_reload = false;
8393                 ca0132_pe_switch_set(codec);
8394         }
8395
8396         snd_hda_power_down_pm(codec);
8397
8398         return 0;
8399 }
8400
8401 static int dbpro_init(struct hda_codec *codec)
8402 {
8403         struct ca0132_spec *spec = codec->spec;
8404         struct auto_pin_cfg *cfg = &spec->autocfg;
8405         unsigned int i;
8406
8407         init_output(codec, cfg->dig_out_pins[0], spec->dig_out);
8408         init_input(codec, cfg->dig_in_pin, spec->dig_in);
8409
8410         for (i = 0; i < spec->num_inputs; i++)
8411                 init_input(codec, spec->input_pins[i], spec->adcs[i]);
8412
8413         return 0;
8414 }
8415
8416 static void ca0132_free(struct hda_codec *codec)
8417 {
8418         struct ca0132_spec *spec = codec->spec;
8419
8420         cancel_delayed_work_sync(&spec->unsol_hp_work);
8421         snd_hda_power_up(codec);
8422         switch (ca0132_quirk(spec)) {
8423         case QUIRK_SBZ:
8424                 sbz_exit_chip(codec);
8425                 break;
8426         case QUIRK_ZXR:
8427                 zxr_exit_chip(codec);
8428                 break;
8429         case QUIRK_R3D:
8430                 r3d_exit_chip(codec);
8431                 break;
8432         case QUIRK_AE5:
8433                 ae5_exit_chip(codec);
8434                 break;
8435         case QUIRK_R3DI:
8436                 r3di_gpio_shutdown(codec);
8437                 break;
8438         default:
8439                 break;
8440         }
8441
8442         snd_hda_sequence_write(codec, spec->base_exit_verbs);
8443         ca0132_exit_chip(codec);
8444
8445         snd_hda_power_down(codec);
8446 #ifdef CONFIG_PCI
8447         if (spec->mem_base)
8448                 pci_iounmap(codec->bus->pci, spec->mem_base);
8449 #endif
8450         kfree(spec->spec_init_verbs);
8451         kfree(codec->spec);
8452 }
8453
8454 static void dbpro_free(struct hda_codec *codec)
8455 {
8456         struct ca0132_spec *spec = codec->spec;
8457
8458         zxr_dbpro_power_state_shutdown(codec);
8459
8460         kfree(spec->spec_init_verbs);
8461         kfree(codec->spec);
8462 }
8463
8464 static void ca0132_reboot_notify(struct hda_codec *codec)
8465 {
8466         codec->patch_ops.free(codec);
8467 }
8468
8469 static const struct hda_codec_ops ca0132_patch_ops = {
8470         .build_controls = ca0132_build_controls,
8471         .build_pcms = ca0132_build_pcms,
8472         .init = ca0132_init,
8473         .free = ca0132_free,
8474         .unsol_event = snd_hda_jack_unsol_event,
8475         .reboot_notify = ca0132_reboot_notify,
8476 };
8477
8478 static const struct hda_codec_ops dbpro_patch_ops = {
8479         .build_controls = dbpro_build_controls,
8480         .build_pcms = dbpro_build_pcms,
8481         .init = dbpro_init,
8482         .free = dbpro_free,
8483 };
8484
8485 static void ca0132_config(struct hda_codec *codec)
8486 {
8487         struct ca0132_spec *spec = codec->spec;
8488
8489         spec->dacs[0] = 0x2;
8490         spec->dacs[1] = 0x3;
8491         spec->dacs[2] = 0x4;
8492
8493         spec->multiout.dac_nids = spec->dacs;
8494         spec->multiout.num_dacs = 3;
8495
8496         if (!ca0132_use_alt_functions(spec))
8497                 spec->multiout.max_channels = 2;
8498         else
8499                 spec->multiout.max_channels = 6;
8500
8501         switch (ca0132_quirk(spec)) {
8502         case QUIRK_ALIENWARE:
8503                 codec_dbg(codec, "%s: QUIRK_ALIENWARE applied.\n", __func__);
8504                 snd_hda_apply_pincfgs(codec, alienware_pincfgs);
8505                 break;
8506         case QUIRK_SBZ:
8507                 codec_dbg(codec, "%s: QUIRK_SBZ applied.\n", __func__);
8508                 snd_hda_apply_pincfgs(codec, sbz_pincfgs);
8509                 break;
8510         case QUIRK_ZXR:
8511                 codec_dbg(codec, "%s: QUIRK_ZXR applied.\n", __func__);
8512                 snd_hda_apply_pincfgs(codec, zxr_pincfgs);
8513                 break;
8514         case QUIRK_R3D:
8515                 codec_dbg(codec, "%s: QUIRK_R3D applied.\n", __func__);
8516                 snd_hda_apply_pincfgs(codec, r3d_pincfgs);
8517                 break;
8518         case QUIRK_R3DI:
8519                 codec_dbg(codec, "%s: QUIRK_R3DI applied.\n", __func__);
8520                 snd_hda_apply_pincfgs(codec, r3di_pincfgs);
8521                 break;
8522         case QUIRK_AE5:
8523                 codec_dbg(codec, "%s: QUIRK_AE5 applied.\n", __func__);
8524                 snd_hda_apply_pincfgs(codec, ae5_pincfgs);
8525                 break;
8526         default:
8527                 break;
8528         }
8529
8530         switch (ca0132_quirk(spec)) {
8531         case QUIRK_ALIENWARE:
8532                 spec->num_outputs = 2;
8533                 spec->out_pins[0] = 0x0b; /* speaker out */
8534                 spec->out_pins[1] = 0x0f;
8535                 spec->shared_out_nid = 0x2;
8536                 spec->unsol_tag_hp = 0x0f;
8537
8538                 spec->adcs[0] = 0x7; /* digital mic / analog mic1 */
8539                 spec->adcs[1] = 0x8; /* analog mic2 */
8540                 spec->adcs[2] = 0xa; /* what u hear */
8541
8542                 spec->num_inputs = 3;
8543                 spec->input_pins[0] = 0x12;
8544                 spec->input_pins[1] = 0x11;
8545                 spec->input_pins[2] = 0x13;
8546                 spec->shared_mic_nid = 0x7;
8547                 spec->unsol_tag_amic1 = 0x11;
8548                 break;
8549         case QUIRK_SBZ:
8550         case QUIRK_R3D:
8551                 spec->num_outputs = 2;
8552                 spec->out_pins[0] = 0x0B; /* Line out */
8553                 spec->out_pins[1] = 0x0F; /* Rear headphone out */
8554                 spec->out_pins[2] = 0x10; /* Front Headphone / Center/LFE*/
8555                 spec->out_pins[3] = 0x11; /* Rear surround */
8556                 spec->shared_out_nid = 0x2;
8557                 spec->unsol_tag_hp = spec->out_pins[1];
8558                 spec->unsol_tag_front_hp = spec->out_pins[2];
8559
8560                 spec->adcs[0] = 0x7; /* Rear Mic / Line-in */
8561                 spec->adcs[1] = 0x8; /* Front Mic, but only if no DSP */
8562                 spec->adcs[2] = 0xa; /* what u hear */
8563
8564                 spec->num_inputs = 2;
8565                 spec->input_pins[0] = 0x12; /* Rear Mic / Line-in */
8566                 spec->input_pins[1] = 0x13; /* What U Hear */
8567                 spec->shared_mic_nid = 0x7;
8568                 spec->unsol_tag_amic1 = spec->input_pins[0];
8569
8570                 /* SPDIF I/O */
8571                 spec->dig_out = 0x05;
8572                 spec->multiout.dig_out_nid = spec->dig_out;
8573                 spec->dig_in = 0x09;
8574                 break;
8575         case QUIRK_ZXR:
8576                 spec->num_outputs = 2;
8577                 spec->out_pins[0] = 0x0B; /* Line out */
8578                 spec->out_pins[1] = 0x0F; /* Rear headphone out */
8579                 spec->out_pins[2] = 0x10; /* Center/LFE */
8580                 spec->out_pins[3] = 0x11; /* Rear surround */
8581                 spec->shared_out_nid = 0x2;
8582                 spec->unsol_tag_hp = spec->out_pins[1];
8583                 spec->unsol_tag_front_hp = spec->out_pins[2];
8584
8585                 spec->adcs[0] = 0x7; /* Rear Mic / Line-in */
8586                 spec->adcs[1] = 0x8; /* Not connected, no front mic */
8587                 spec->adcs[2] = 0xa; /* what u hear */
8588
8589                 spec->num_inputs = 2;
8590                 spec->input_pins[0] = 0x12; /* Rear Mic / Line-in */
8591                 spec->input_pins[1] = 0x13; /* What U Hear */
8592                 spec->shared_mic_nid = 0x7;
8593                 spec->unsol_tag_amic1 = spec->input_pins[0];
8594                 break;
8595         case QUIRK_ZXR_DBPRO:
8596                 spec->adcs[0] = 0x8; /* ZxR DBPro Aux In */
8597
8598                 spec->num_inputs = 1;
8599                 spec->input_pins[0] = 0x11; /* RCA Line-in */
8600
8601                 spec->dig_out = 0x05;
8602                 spec->multiout.dig_out_nid = spec->dig_out;
8603
8604                 spec->dig_in = 0x09;
8605                 break;
8606         case QUIRK_AE5:
8607                 spec->num_outputs = 2;
8608                 spec->out_pins[0] = 0x0B; /* Line out */
8609                 spec->out_pins[1] = 0x11; /* Rear headphone out */
8610                 spec->out_pins[2] = 0x10; /* Front Headphone / Center/LFE*/
8611                 spec->out_pins[3] = 0x0F; /* Rear surround */
8612                 spec->shared_out_nid = 0x2;
8613                 spec->unsol_tag_hp = spec->out_pins[1];
8614                 spec->unsol_tag_front_hp = spec->out_pins[2];
8615
8616                 spec->adcs[0] = 0x7; /* Rear Mic / Line-in */
8617                 spec->adcs[1] = 0x8; /* Front Mic, but only if no DSP */
8618                 spec->adcs[2] = 0xa; /* what u hear */
8619
8620                 spec->num_inputs = 2;
8621                 spec->input_pins[0] = 0x12; /* Rear Mic / Line-in */
8622                 spec->input_pins[1] = 0x13; /* What U Hear */
8623                 spec->shared_mic_nid = 0x7;
8624                 spec->unsol_tag_amic1 = spec->input_pins[0];
8625
8626                 /* SPDIF I/O */
8627                 spec->dig_out = 0x05;
8628                 spec->multiout.dig_out_nid = spec->dig_out;
8629                 break;
8630         case QUIRK_R3DI:
8631                 spec->num_outputs = 2;
8632                 spec->out_pins[0] = 0x0B; /* Line out */
8633                 spec->out_pins[1] = 0x0F; /* Rear headphone out */
8634                 spec->out_pins[2] = 0x10; /* Front Headphone / Center/LFE*/
8635                 spec->out_pins[3] = 0x11; /* Rear surround */
8636                 spec->shared_out_nid = 0x2;
8637                 spec->unsol_tag_hp = spec->out_pins[1];
8638                 spec->unsol_tag_front_hp = spec->out_pins[2];
8639
8640                 spec->adcs[0] = 0x07; /* Rear Mic / Line-in */
8641                 spec->adcs[1] = 0x08; /* Front Mic, but only if no DSP */
8642                 spec->adcs[2] = 0x0a; /* what u hear */
8643
8644                 spec->num_inputs = 2;
8645                 spec->input_pins[0] = 0x12; /* Rear Mic / Line-in */
8646                 spec->input_pins[1] = 0x13; /* What U Hear */
8647                 spec->shared_mic_nid = 0x7;
8648                 spec->unsol_tag_amic1 = spec->input_pins[0];
8649
8650                 /* SPDIF I/O */
8651                 spec->dig_out = 0x05;
8652                 spec->multiout.dig_out_nid = spec->dig_out;
8653                 break;
8654         default:
8655                 spec->num_outputs = 2;
8656                 spec->out_pins[0] = 0x0b; /* speaker out */
8657                 spec->out_pins[1] = 0x10; /* headphone out */
8658                 spec->shared_out_nid = 0x2;
8659                 spec->unsol_tag_hp = spec->out_pins[1];
8660
8661                 spec->adcs[0] = 0x7; /* digital mic / analog mic1 */
8662                 spec->adcs[1] = 0x8; /* analog mic2 */
8663                 spec->adcs[2] = 0xa; /* what u hear */
8664
8665                 spec->num_inputs = 3;
8666                 spec->input_pins[0] = 0x12;
8667                 spec->input_pins[1] = 0x11;
8668                 spec->input_pins[2] = 0x13;
8669                 spec->shared_mic_nid = 0x7;
8670                 spec->unsol_tag_amic1 = spec->input_pins[0];
8671
8672                 /* SPDIF I/O */
8673                 spec->dig_out = 0x05;
8674                 spec->multiout.dig_out_nid = spec->dig_out;
8675                 spec->dig_in = 0x09;
8676                 break;
8677         }
8678 }
8679
8680 static int ca0132_prepare_verbs(struct hda_codec *codec)
8681 {
8682 /* Verbs + terminator (an empty element) */
8683 #define NUM_SPEC_VERBS 2
8684         struct ca0132_spec *spec = codec->spec;
8685
8686         spec->chip_init_verbs = ca0132_init_verbs0;
8687         /*
8688          * Since desktop cards use pci_mmio, this can be used to determine
8689          * whether or not to use these verbs instead of a separate bool.
8690          */
8691         if (ca0132_use_pci_mmio(spec))
8692                 spec->desktop_init_verbs = ca0132_init_verbs1;
8693         spec->spec_init_verbs = kcalloc(NUM_SPEC_VERBS,
8694                                         sizeof(struct hda_verb),
8695                                         GFP_KERNEL);
8696         if (!spec->spec_init_verbs)
8697                 return -ENOMEM;
8698
8699         /* config EAPD */
8700         spec->spec_init_verbs[0].nid = 0x0b;
8701         spec->spec_init_verbs[0].param = 0x78D;
8702         spec->spec_init_verbs[0].verb = 0x00;
8703
8704         /* Previously commented configuration */
8705         /*
8706         spec->spec_init_verbs[2].nid = 0x0b;
8707         spec->spec_init_verbs[2].param = AC_VERB_SET_EAPD_BTLENABLE;
8708         spec->spec_init_verbs[2].verb = 0x02;
8709
8710         spec->spec_init_verbs[3].nid = 0x10;
8711         spec->spec_init_verbs[3].param = 0x78D;
8712         spec->spec_init_verbs[3].verb = 0x02;
8713
8714         spec->spec_init_verbs[4].nid = 0x10;
8715         spec->spec_init_verbs[4].param = AC_VERB_SET_EAPD_BTLENABLE;
8716         spec->spec_init_verbs[4].verb = 0x02;
8717         */
8718
8719         /* Terminator: spec->spec_init_verbs[NUM_SPEC_VERBS-1] */
8720         return 0;
8721 }
8722
8723 /*
8724  * The Sound Blaster ZxR shares the same PCI subsystem ID as some regular
8725  * Sound Blaster Z cards. However, they have different HDA codec subsystem
8726  * ID's. So, we check for the ZxR's subsystem ID, as well as the DBPro
8727  * daughter boards ID.
8728  */
8729 static void sbz_detect_quirk(struct hda_codec *codec)
8730 {
8731         struct ca0132_spec *spec = codec->spec;
8732
8733         switch (codec->core.subsystem_id) {
8734         case 0x11020033:
8735                 spec->quirk = QUIRK_ZXR;
8736                 break;
8737         case 0x1102003f:
8738                 spec->quirk = QUIRK_ZXR_DBPRO;
8739                 break;
8740         default:
8741                 spec->quirk = QUIRK_SBZ;
8742                 break;
8743         }
8744 }
8745
8746 static int patch_ca0132(struct hda_codec *codec)
8747 {
8748         struct ca0132_spec *spec;
8749         int err;
8750         const struct snd_pci_quirk *quirk;
8751
8752         codec_dbg(codec, "patch_ca0132\n");
8753
8754         spec = kzalloc(sizeof(*spec), GFP_KERNEL);
8755         if (!spec)
8756                 return -ENOMEM;
8757         codec->spec = spec;
8758         spec->codec = codec;
8759
8760         /* Detect codec quirk */
8761         quirk = snd_pci_quirk_lookup(codec->bus->pci, ca0132_quirks);
8762         if (quirk)
8763                 spec->quirk = quirk->value;
8764         else
8765                 spec->quirk = QUIRK_NONE;
8766         if (ca0132_quirk(spec) == QUIRK_SBZ)
8767                 sbz_detect_quirk(codec);
8768
8769         if (ca0132_quirk(spec) == QUIRK_ZXR_DBPRO)
8770                 codec->patch_ops = dbpro_patch_ops;
8771         else
8772                 codec->patch_ops = ca0132_patch_ops;
8773
8774         codec->pcm_format_first = 1;
8775         codec->no_sticky_stream = 1;
8776
8777
8778         spec->dsp_state = DSP_DOWNLOAD_INIT;
8779         spec->num_mixers = 1;
8780
8781         /* Set which mixers each quirk uses. */
8782         switch (ca0132_quirk(spec)) {
8783         case QUIRK_SBZ:
8784                 spec->mixers[0] = desktop_mixer;
8785                 snd_hda_codec_set_name(codec, "Sound Blaster Z");
8786                 break;
8787         case QUIRK_ZXR:
8788                 spec->mixers[0] = desktop_mixer;
8789                 snd_hda_codec_set_name(codec, "Sound Blaster ZxR");
8790                 break;
8791         case QUIRK_ZXR_DBPRO:
8792                 break;
8793         case QUIRK_R3D:
8794                 spec->mixers[0] = desktop_mixer;
8795                 snd_hda_codec_set_name(codec, "Recon3D");
8796                 break;
8797         case QUIRK_R3DI:
8798                 spec->mixers[0] = r3di_mixer;
8799                 snd_hda_codec_set_name(codec, "Recon3Di");
8800                 break;
8801         case QUIRK_AE5:
8802                 spec->mixers[0] = desktop_mixer;
8803                 snd_hda_codec_set_name(codec, "Sound BlasterX AE-5");
8804                 break;
8805         default:
8806                 spec->mixers[0] = ca0132_mixer;
8807                 break;
8808         }
8809
8810         /* Setup whether or not to use alt functions/controls/pci_mmio */
8811         switch (ca0132_quirk(spec)) {
8812         case QUIRK_SBZ:
8813         case QUIRK_R3D:
8814         case QUIRK_AE5:
8815         case QUIRK_ZXR:
8816                 spec->use_alt_controls = true;
8817                 spec->use_alt_functions = true;
8818                 spec->use_pci_mmio = true;
8819                 break;
8820         case QUIRK_R3DI:
8821                 spec->use_alt_controls = true;
8822                 spec->use_alt_functions = true;
8823                 spec->use_pci_mmio = false;
8824                 break;
8825         default:
8826                 spec->use_alt_controls = false;
8827                 spec->use_alt_functions = false;
8828                 spec->use_pci_mmio = false;
8829                 break;
8830         }
8831
8832 #ifdef CONFIG_PCI
8833         if (spec->use_pci_mmio) {
8834                 spec->mem_base = pci_iomap(codec->bus->pci, 2, 0xC20);
8835                 if (spec->mem_base == NULL) {
8836                         codec_warn(codec, "pci_iomap failed! Setting quirk to QUIRK_NONE.");
8837                         spec->quirk = QUIRK_NONE;
8838                 }
8839         }
8840 #endif
8841
8842         spec->base_init_verbs = ca0132_base_init_verbs;
8843         spec->base_exit_verbs = ca0132_base_exit_verbs;
8844
8845         INIT_DELAYED_WORK(&spec->unsol_hp_work, ca0132_unsol_hp_delayed);
8846
8847         ca0132_init_chip(codec);
8848
8849         ca0132_config(codec);
8850
8851         err = ca0132_prepare_verbs(codec);
8852         if (err < 0)
8853                 goto error;
8854
8855         err = snd_hda_parse_pin_def_config(codec, &spec->autocfg, NULL);
8856         if (err < 0)
8857                 goto error;
8858
8859         return 0;
8860
8861  error:
8862         ca0132_free(codec);
8863         return err;
8864 }
8865
8866 /*
8867  * patch entries
8868  */
8869 static struct hda_device_id snd_hda_id_ca0132[] = {
8870         HDA_CODEC_ENTRY(0x11020011, "CA0132", patch_ca0132),
8871         {} /* terminator */
8872 };
8873 MODULE_DEVICE_TABLE(hdaudio, snd_hda_id_ca0132);
8874
8875 MODULE_LICENSE("GPL");
8876 MODULE_DESCRIPTION("Creative Sound Core3D codec");
8877
8878 static struct hda_codec_driver ca0132_driver = {
8879         .id = snd_hda_id_ca0132,
8880 };
8881
8882 module_hda_codec_driver(ca0132_driver);