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