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