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