blob: 9ceb2bc36e68026bd02dfca8bdca4f9ffab2e849 [file] [log] [blame]
Ian Minett95c6e9c2011-06-15 15:35:17 -07001/*
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>
Ian Minett95c6e9c2011-06-15 15:35:17 -070027#include <linux/mutex.h>
Paul Gortmakerda155d52011-07-15 12:38:28 -040028#include <linux/module.h>
Ian Minett4aa3bb02012-09-20 20:29:15 -070029#include <linux/firmware.h>
Ian Minett95c6e9c2011-06-15 15:35:17 -070030#include <sound/core.h>
31#include "hda_codec.h"
32#include "hda_local.h"
Takashi Iwai128bc4b2012-05-07 17:42:31 +020033#include "hda_auto_parser.h"
Ian Minett5aaca442012-12-20 18:53:34 -080034#include "hda_jack.h"
Ian Minett95c6e9c2011-06-15 15:35:17 -070035
Ian Minettbcd109c2012-09-20 20:29:14 -070036#include "ca0132_regs.h"
37
Ian Minettef6b2ea2012-12-20 18:53:33 -080038/* Enable this to see controls for tuning purpose. */
39/*#define ENABLE_TUNING_CONTROLS*/
40
41#define FLOAT_ZERO 0x00000000
42#define FLOAT_ONE 0x3f800000
43#define FLOAT_TWO 0x40000000
44#define FLOAT_MINUS_5 0xc0a00000
45
Ian Minettef6b2ea2012-12-20 18:53:33 -080046#define UNSOL_TAG_DSP 0x16
47
Ian Minett4aa3bb02012-09-20 20:29:15 -070048#define DSP_DMA_WRITE_BUFLEN_INIT (1UL<<18)
49#define DSP_DMA_WRITE_BUFLEN_OVLY (1UL<<15)
50
51#define DMA_TRANSFER_FRAME_SIZE_NWORDS 8
52#define DMA_TRANSFER_MAX_FRAME_SIZE_NWORDS 32
53#define DMA_OVERLAY_FRAME_SIZE_NWORDS 2
54
55#define MASTERCONTROL 0x80
Ian Minettef6b2ea2012-12-20 18:53:33 -080056#define MASTERCONTROL_ALLOC_DMA_CHAN 10
57#define MASTERCONTROL_QUERY_SPEAKER_EQ_ADDRESS 60
Ian Minett4aa3bb02012-09-20 20:29:15 -070058
Ian Minett95c6e9c2011-06-15 15:35:17 -070059#define WIDGET_CHIP_CTRL 0x15
60#define WIDGET_DSP_CTRL 0x16
61
Ian Minett4aa3bb02012-09-20 20:29:15 -070062#define MEM_CONNID_MICIN1 3
63#define MEM_CONNID_MICIN2 5
64#define MEM_CONNID_MICOUT1 12
65#define MEM_CONNID_MICOUT2 14
66#define MEM_CONNID_WUH 10
67#define MEM_CONNID_DSP 16
68#define MEM_CONNID_DMIC 100
69
70#define SCP_SET 0
71#define SCP_GET 1
72
Ian Minett01ef7db2012-09-20 20:29:16 -070073#define EFX_FILE "ctefx.bin"
74
Takashi Iwai24f3ced2013-02-04 18:25:51 +010075#ifdef CONFIG_SND_HDA_CODEC_CA0132_DSP
Ian Minett01ef7db2012-09-20 20:29:16 -070076MODULE_FIRMWARE(EFX_FILE);
Takashi Iwai7a527ed2013-01-15 17:44:20 +010077#endif
Ian Minett01ef7db2012-09-20 20:29:16 -070078
Ian Minettef6b2ea2012-12-20 18:53:33 -080079static char *dirstr[2] = { "Playback", "Capture" };
80
81enum {
82 SPEAKER_OUT,
83 HEADPHONE_OUT
84};
85
86enum {
87 DIGITAL_MIC,
88 LINE_MIC_IN
89};
90
91enum {
92#define VNODE_START_NID 0x80
93 VNID_SPK = VNODE_START_NID, /* Speaker vnid */
94 VNID_MIC,
95 VNID_HP_SEL,
96 VNID_AMIC1_SEL,
97 VNID_HP_ASEL,
98 VNID_AMIC1_ASEL,
99 VNODE_END_NID,
100#define VNODES_COUNT (VNODE_END_NID - VNODE_START_NID)
101
102#define EFFECT_START_NID 0x90
103#define OUT_EFFECT_START_NID EFFECT_START_NID
104 SURROUND = OUT_EFFECT_START_NID,
105 CRYSTALIZER,
106 DIALOG_PLUS,
107 SMART_VOLUME,
108 X_BASS,
109 EQUALIZER,
110 OUT_EFFECT_END_NID,
111#define OUT_EFFECTS_COUNT (OUT_EFFECT_END_NID - OUT_EFFECT_START_NID)
112
113#define IN_EFFECT_START_NID OUT_EFFECT_END_NID
114 ECHO_CANCELLATION = IN_EFFECT_START_NID,
115 VOICE_FOCUS,
116 MIC_SVM,
117 NOISE_REDUCTION,
118 IN_EFFECT_END_NID,
119#define IN_EFFECTS_COUNT (IN_EFFECT_END_NID - IN_EFFECT_START_NID)
120
121 VOICEFX = IN_EFFECT_END_NID,
122 PLAY_ENHANCEMENT,
123 CRYSTAL_VOICE,
124 EFFECT_END_NID
125#define EFFECTS_COUNT (EFFECT_END_NID - EFFECT_START_NID)
126};
127
128/* Effects values size*/
129#define EFFECT_VALS_MAX_COUNT 12
130
Dylan Reide8412ca2013-04-04 13:55:09 -0700131/* Latency introduced by DSP blocks in milliseconds. */
132#define DSP_CAPTURE_INIT_LATENCY 0
133#define DSP_CRYSTAL_VOICE_LATENCY 124
134#define DSP_PLAYBACK_INIT_LATENCY 13
135#define DSP_PLAY_ENHANCEMENT_LATENCY 30
136#define DSP_SPEAKER_OUT_LATENCY 7
137
Ian Minettef6b2ea2012-12-20 18:53:33 -0800138struct ct_effect {
Takashi Iwai975cc022013-06-28 11:56:49 +0200139 char name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
Ian Minettef6b2ea2012-12-20 18:53:33 -0800140 hda_nid_t nid;
141 int mid; /*effect module ID*/
142 int reqs[EFFECT_VALS_MAX_COUNT]; /*effect module request*/
143 int direct; /* 0:output; 1:input*/
144 int params; /* number of default non-on/off params */
145 /*effect default values, 1st is on/off. */
146 unsigned int def_vals[EFFECT_VALS_MAX_COUNT];
147};
148
149#define EFX_DIR_OUT 0
150#define EFX_DIR_IN 1
151
152static struct ct_effect ca0132_effects[EFFECTS_COUNT] = {
153 { .name = "Surround",
154 .nid = SURROUND,
155 .mid = 0x96,
156 .reqs = {0, 1},
157 .direct = EFX_DIR_OUT,
158 .params = 1,
159 .def_vals = {0x3F800000, 0x3F2B851F}
160 },
161 { .name = "Crystalizer",
162 .nid = CRYSTALIZER,
163 .mid = 0x96,
164 .reqs = {7, 8},
165 .direct = EFX_DIR_OUT,
166 .params = 1,
167 .def_vals = {0x3F800000, 0x3F266666}
168 },
169 { .name = "Dialog Plus",
170 .nid = DIALOG_PLUS,
171 .mid = 0x96,
172 .reqs = {2, 3},
173 .direct = EFX_DIR_OUT,
174 .params = 1,
175 .def_vals = {0x00000000, 0x3F000000}
176 },
177 { .name = "Smart Volume",
178 .nid = SMART_VOLUME,
179 .mid = 0x96,
180 .reqs = {4, 5, 6},
181 .direct = EFX_DIR_OUT,
182 .params = 2,
183 .def_vals = {0x3F800000, 0x3F3D70A4, 0x00000000}
184 },
185 { .name = "X-Bass",
186 .nid = X_BASS,
187 .mid = 0x96,
188 .reqs = {24, 23, 25},
189 .direct = EFX_DIR_OUT,
190 .params = 2,
191 .def_vals = {0x3F800000, 0x42A00000, 0x3F000000}
192 },
193 { .name = "Equalizer",
194 .nid = EQUALIZER,
195 .mid = 0x96,
196 .reqs = {9, 10, 11, 12, 13, 14,
197 15, 16, 17, 18, 19, 20},
198 .direct = EFX_DIR_OUT,
199 .params = 11,
200 .def_vals = {0x00000000, 0x00000000, 0x00000000, 0x00000000,
201 0x00000000, 0x00000000, 0x00000000, 0x00000000,
202 0x00000000, 0x00000000, 0x00000000, 0x00000000}
203 },
204 { .name = "Echo Cancellation",
205 .nid = ECHO_CANCELLATION,
206 .mid = 0x95,
207 .reqs = {0, 1, 2, 3},
208 .direct = EFX_DIR_IN,
209 .params = 3,
210 .def_vals = {0x00000000, 0x3F3A9692, 0x00000000, 0x00000000}
211 },
212 { .name = "Voice Focus",
213 .nid = VOICE_FOCUS,
214 .mid = 0x95,
215 .reqs = {6, 7, 8, 9},
216 .direct = EFX_DIR_IN,
217 .params = 3,
218 .def_vals = {0x3F800000, 0x3D7DF3B6, 0x41F00000, 0x41F00000}
219 },
220 { .name = "Mic SVM",
221 .nid = MIC_SVM,
222 .mid = 0x95,
223 .reqs = {44, 45},
224 .direct = EFX_DIR_IN,
225 .params = 1,
226 .def_vals = {0x00000000, 0x3F3D70A4}
227 },
228 { .name = "Noise Reduction",
229 .nid = NOISE_REDUCTION,
230 .mid = 0x95,
231 .reqs = {4, 5},
232 .direct = EFX_DIR_IN,
233 .params = 1,
234 .def_vals = {0x3F800000, 0x3F000000}
235 },
236 { .name = "VoiceFX",
237 .nid = VOICEFX,
238 .mid = 0x95,
239 .reqs = {10, 11, 12, 13, 14, 15, 16, 17, 18},
240 .direct = EFX_DIR_IN,
241 .params = 8,
242 .def_vals = {0x00000000, 0x43C80000, 0x44AF0000, 0x44FA0000,
243 0x3F800000, 0x3F800000, 0x3F800000, 0x00000000,
244 0x00000000}
245 }
246};
247
248/* Tuning controls */
249#ifdef ENABLE_TUNING_CONTROLS
250
251enum {
252#define TUNING_CTL_START_NID 0xC0
253 WEDGE_ANGLE = TUNING_CTL_START_NID,
254 SVM_LEVEL,
255 EQUALIZER_BAND_0,
256 EQUALIZER_BAND_1,
257 EQUALIZER_BAND_2,
258 EQUALIZER_BAND_3,
259 EQUALIZER_BAND_4,
260 EQUALIZER_BAND_5,
261 EQUALIZER_BAND_6,
262 EQUALIZER_BAND_7,
263 EQUALIZER_BAND_8,
264 EQUALIZER_BAND_9,
265 TUNING_CTL_END_NID
266#define TUNING_CTLS_COUNT (TUNING_CTL_END_NID - TUNING_CTL_START_NID)
267};
268
269struct ct_tuning_ctl {
Takashi Iwai975cc022013-06-28 11:56:49 +0200270 char name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
Ian Minettef6b2ea2012-12-20 18:53:33 -0800271 hda_nid_t parent_nid;
272 hda_nid_t nid;
273 int mid; /*effect module ID*/
274 int req; /*effect module request*/
275 int direct; /* 0:output; 1:input*/
276 unsigned int def_val;/*effect default values*/
277};
278
279static struct ct_tuning_ctl ca0132_tuning_ctls[] = {
280 { .name = "Wedge Angle",
281 .parent_nid = VOICE_FOCUS,
282 .nid = WEDGE_ANGLE,
283 .mid = 0x95,
284 .req = 8,
285 .direct = EFX_DIR_IN,
286 .def_val = 0x41F00000
287 },
288 { .name = "SVM Level",
289 .parent_nid = MIC_SVM,
290 .nid = SVM_LEVEL,
291 .mid = 0x95,
292 .req = 45,
293 .direct = EFX_DIR_IN,
294 .def_val = 0x3F3D70A4
295 },
296 { .name = "EQ Band0",
297 .parent_nid = EQUALIZER,
298 .nid = EQUALIZER_BAND_0,
299 .mid = 0x96,
300 .req = 11,
301 .direct = EFX_DIR_OUT,
302 .def_val = 0x00000000
303 },
304 { .name = "EQ Band1",
305 .parent_nid = EQUALIZER,
306 .nid = EQUALIZER_BAND_1,
307 .mid = 0x96,
308 .req = 12,
309 .direct = EFX_DIR_OUT,
310 .def_val = 0x00000000
311 },
312 { .name = "EQ Band2",
313 .parent_nid = EQUALIZER,
314 .nid = EQUALIZER_BAND_2,
315 .mid = 0x96,
316 .req = 13,
317 .direct = EFX_DIR_OUT,
318 .def_val = 0x00000000
319 },
320 { .name = "EQ Band3",
321 .parent_nid = EQUALIZER,
322 .nid = EQUALIZER_BAND_3,
323 .mid = 0x96,
324 .req = 14,
325 .direct = EFX_DIR_OUT,
326 .def_val = 0x00000000
327 },
328 { .name = "EQ Band4",
329 .parent_nid = EQUALIZER,
330 .nid = EQUALIZER_BAND_4,
331 .mid = 0x96,
332 .req = 15,
333 .direct = EFX_DIR_OUT,
334 .def_val = 0x00000000
335 },
336 { .name = "EQ Band5",
337 .parent_nid = EQUALIZER,
338 .nid = EQUALIZER_BAND_5,
339 .mid = 0x96,
340 .req = 16,
341 .direct = EFX_DIR_OUT,
342 .def_val = 0x00000000
343 },
344 { .name = "EQ Band6",
345 .parent_nid = EQUALIZER,
346 .nid = EQUALIZER_BAND_6,
347 .mid = 0x96,
348 .req = 17,
349 .direct = EFX_DIR_OUT,
350 .def_val = 0x00000000
351 },
352 { .name = "EQ Band7",
353 .parent_nid = EQUALIZER,
354 .nid = EQUALIZER_BAND_7,
355 .mid = 0x96,
356 .req = 18,
357 .direct = EFX_DIR_OUT,
358 .def_val = 0x00000000
359 },
360 { .name = "EQ Band8",
361 .parent_nid = EQUALIZER,
362 .nid = EQUALIZER_BAND_8,
363 .mid = 0x96,
364 .req = 19,
365 .direct = EFX_DIR_OUT,
366 .def_val = 0x00000000
367 },
368 { .name = "EQ Band9",
369 .parent_nid = EQUALIZER,
370 .nid = EQUALIZER_BAND_9,
371 .mid = 0x96,
372 .req = 20,
373 .direct = EFX_DIR_OUT,
374 .def_val = 0x00000000
375 }
376};
377#endif
378
379/* Voice FX Presets */
380#define VOICEFX_MAX_PARAM_COUNT 9
381
382struct ct_voicefx {
383 char *name;
384 hda_nid_t nid;
385 int mid;
386 int reqs[VOICEFX_MAX_PARAM_COUNT]; /*effect module request*/
387};
388
389struct ct_voicefx_preset {
390 char *name; /*preset name*/
391 unsigned int vals[VOICEFX_MAX_PARAM_COUNT];
392};
393
Takashi Iwaiccd7bd32013-01-16 09:32:54 +0800394static struct ct_voicefx ca0132_voicefx = {
Ian Minettef6b2ea2012-12-20 18:53:33 -0800395 .name = "VoiceFX Capture Switch",
396 .nid = VOICEFX,
397 .mid = 0x95,
398 .reqs = {10, 11, 12, 13, 14, 15, 16, 17, 18}
399};
400
Takashi Iwaiccd7bd32013-01-16 09:32:54 +0800401static struct ct_voicefx_preset ca0132_voicefx_presets[] = {
Ian Minettef6b2ea2012-12-20 18:53:33 -0800402 { .name = "Neutral",
403 .vals = { 0x00000000, 0x43C80000, 0x44AF0000,
404 0x44FA0000, 0x3F800000, 0x3F800000,
405 0x3F800000, 0x00000000, 0x00000000 }
406 },
407 { .name = "Female2Male",
408 .vals = { 0x3F800000, 0x43C80000, 0x44AF0000,
409 0x44FA0000, 0x3F19999A, 0x3F866666,
410 0x3F800000, 0x00000000, 0x00000000 }
411 },
412 { .name = "Male2Female",
413 .vals = { 0x3F800000, 0x43C80000, 0x44AF0000,
414 0x450AC000, 0x4017AE14, 0x3F6B851F,
415 0x3F800000, 0x00000000, 0x00000000 }
416 },
417 { .name = "ScrappyKid",
418 .vals = { 0x3F800000, 0x43C80000, 0x44AF0000,
419 0x44FA0000, 0x40400000, 0x3F28F5C3,
420 0x3F800000, 0x00000000, 0x00000000 }
421 },
422 { .name = "Elderly",
423 .vals = { 0x3F800000, 0x44324000, 0x44BB8000,
424 0x44E10000, 0x3FB33333, 0x3FB9999A,
425 0x3F800000, 0x3E3A2E43, 0x00000000 }
426 },
427 { .name = "Orc",
428 .vals = { 0x3F800000, 0x43EA0000, 0x44A52000,
429 0x45098000, 0x3F266666, 0x3FC00000,
430 0x3F800000, 0x00000000, 0x00000000 }
431 },
432 { .name = "Elf",
433 .vals = { 0x3F800000, 0x43C70000, 0x44AE6000,
434 0x45193000, 0x3F8E147B, 0x3F75C28F,
435 0x3F800000, 0x00000000, 0x00000000 }
436 },
437 { .name = "Dwarf",
438 .vals = { 0x3F800000, 0x43930000, 0x44BEE000,
439 0x45007000, 0x3F451EB8, 0x3F7851EC,
440 0x3F800000, 0x00000000, 0x00000000 }
441 },
442 { .name = "AlienBrute",
443 .vals = { 0x3F800000, 0x43BFC5AC, 0x44B28FDF,
444 0x451F6000, 0x3F266666, 0x3FA7D945,
445 0x3F800000, 0x3CF5C28F, 0x00000000 }
446 },
447 { .name = "Robot",
448 .vals = { 0x3F800000, 0x43C80000, 0x44AF0000,
449 0x44FA0000, 0x3FB2718B, 0x3F800000,
450 0xBC07010E, 0x00000000, 0x00000000 }
451 },
452 { .name = "Marine",
453 .vals = { 0x3F800000, 0x43C20000, 0x44906000,
454 0x44E70000, 0x3F4CCCCD, 0x3F8A3D71,
455 0x3F0A3D71, 0x00000000, 0x00000000 }
456 },
457 { .name = "Emo",
458 .vals = { 0x3F800000, 0x43C80000, 0x44AF0000,
459 0x44FA0000, 0x3F800000, 0x3F800000,
460 0x3E4CCCCD, 0x00000000, 0x00000000 }
461 },
462 { .name = "DeepVoice",
463 .vals = { 0x3F800000, 0x43A9C5AC, 0x44AA4FDF,
464 0x44FFC000, 0x3EDBB56F, 0x3F99C4CA,
465 0x3F800000, 0x00000000, 0x00000000 }
466 },
467 { .name = "Munchkin",
468 .vals = { 0x3F800000, 0x43C80000, 0x44AF0000,
469 0x44FA0000, 0x3F800000, 0x3F1A043C,
470 0x3F800000, 0x00000000, 0x00000000 }
471 }
472};
473
Ian Minett95c6e9c2011-06-15 15:35:17 -0700474enum hda_cmd_vendor_io {
475 /* for DspIO node */
476 VENDOR_DSPIO_SCP_WRITE_DATA_LOW = 0x000,
477 VENDOR_DSPIO_SCP_WRITE_DATA_HIGH = 0x100,
478
479 VENDOR_DSPIO_STATUS = 0xF01,
480 VENDOR_DSPIO_SCP_POST_READ_DATA = 0x702,
481 VENDOR_DSPIO_SCP_READ_DATA = 0xF02,
482 VENDOR_DSPIO_DSP_INIT = 0x703,
483 VENDOR_DSPIO_SCP_POST_COUNT_QUERY = 0x704,
484 VENDOR_DSPIO_SCP_READ_COUNT = 0xF04,
485
486 /* for ChipIO node */
487 VENDOR_CHIPIO_ADDRESS_LOW = 0x000,
488 VENDOR_CHIPIO_ADDRESS_HIGH = 0x100,
489 VENDOR_CHIPIO_STREAM_FORMAT = 0x200,
490 VENDOR_CHIPIO_DATA_LOW = 0x300,
491 VENDOR_CHIPIO_DATA_HIGH = 0x400,
492
493 VENDOR_CHIPIO_GET_PARAMETER = 0xF00,
494 VENDOR_CHIPIO_STATUS = 0xF01,
495 VENDOR_CHIPIO_HIC_POST_READ = 0x702,
496 VENDOR_CHIPIO_HIC_READ_DATA = 0xF03,
497
Ian Minett4aa3bb02012-09-20 20:29:15 -0700498 VENDOR_CHIPIO_8051_DATA_WRITE = 0x707,
499 VENDOR_CHIPIO_8051_DATA_READ = 0xF07,
500
Ian Minett95c6e9c2011-06-15 15:35:17 -0700501 VENDOR_CHIPIO_CT_EXTENSIONS_ENABLE = 0x70A,
Ian Minett4aa3bb02012-09-20 20:29:15 -0700502 VENDOR_CHIPIO_CT_EXTENSIONS_GET = 0xF0A,
Ian Minett95c6e9c2011-06-15 15:35:17 -0700503
504 VENDOR_CHIPIO_PLL_PMU_WRITE = 0x70C,
505 VENDOR_CHIPIO_PLL_PMU_READ = 0xF0C,
506 VENDOR_CHIPIO_8051_ADDRESS_LOW = 0x70D,
507 VENDOR_CHIPIO_8051_ADDRESS_HIGH = 0x70E,
508 VENDOR_CHIPIO_FLAG_SET = 0x70F,
509 VENDOR_CHIPIO_FLAGS_GET = 0xF0F,
Ian Minett4aa3bb02012-09-20 20:29:15 -0700510 VENDOR_CHIPIO_PARAM_SET = 0x710,
511 VENDOR_CHIPIO_PARAM_GET = 0xF10,
Ian Minett95c6e9c2011-06-15 15:35:17 -0700512
513 VENDOR_CHIPIO_PORT_ALLOC_CONFIG_SET = 0x711,
514 VENDOR_CHIPIO_PORT_ALLOC_SET = 0x712,
515 VENDOR_CHIPIO_PORT_ALLOC_GET = 0xF12,
516 VENDOR_CHIPIO_PORT_FREE_SET = 0x713,
517
Ian Minett4aa3bb02012-09-20 20:29:15 -0700518 VENDOR_CHIPIO_PARAM_EX_ID_GET = 0xF17,
519 VENDOR_CHIPIO_PARAM_EX_ID_SET = 0x717,
520 VENDOR_CHIPIO_PARAM_EX_VALUE_GET = 0xF18,
521 VENDOR_CHIPIO_PARAM_EX_VALUE_SET = 0x718,
522
523 VENDOR_CHIPIO_DMIC_CTL_SET = 0x788,
524 VENDOR_CHIPIO_DMIC_CTL_GET = 0xF88,
525 VENDOR_CHIPIO_DMIC_PIN_SET = 0x789,
526 VENDOR_CHIPIO_DMIC_PIN_GET = 0xF89,
527 VENDOR_CHIPIO_DMIC_MCLK_SET = 0x78A,
528 VENDOR_CHIPIO_DMIC_MCLK_GET = 0xF8A,
529
530 VENDOR_CHIPIO_EAPD_SEL_SET = 0x78D
Ian Minett95c6e9c2011-06-15 15:35:17 -0700531};
532
533/*
534 * Control flag IDs
535 */
536enum control_flag_id {
537 /* Connection manager stream setup is bypassed/enabled */
538 CONTROL_FLAG_C_MGR = 0,
539 /* DSP DMA is bypassed/enabled */
540 CONTROL_FLAG_DMA = 1,
541 /* 8051 'idle' mode is disabled/enabled */
542 CONTROL_FLAG_IDLE_ENABLE = 2,
543 /* Tracker for the SPDIF-in path is bypassed/enabled */
544 CONTROL_FLAG_TRACKER = 3,
545 /* DigitalOut to Spdif2Out connection is disabled/enabled */
546 CONTROL_FLAG_SPDIF2OUT = 4,
547 /* Digital Microphone is disabled/enabled */
548 CONTROL_FLAG_DMIC = 5,
549 /* ADC_B rate is 48 kHz/96 kHz */
550 CONTROL_FLAG_ADC_B_96KHZ = 6,
551 /* ADC_C rate is 48 kHz/96 kHz */
552 CONTROL_FLAG_ADC_C_96KHZ = 7,
553 /* DAC rate is 48 kHz/96 kHz (affects all DACs) */
554 CONTROL_FLAG_DAC_96KHZ = 8,
555 /* DSP rate is 48 kHz/96 kHz */
556 CONTROL_FLAG_DSP_96KHZ = 9,
557 /* SRC clock is 98 MHz/196 MHz (196 MHz forces rate to 96 KHz) */
558 CONTROL_FLAG_SRC_CLOCK_196MHZ = 10,
559 /* SRC rate is 48 kHz/96 kHz (48 kHz disabled when clock is 196 MHz) */
560 CONTROL_FLAG_SRC_RATE_96KHZ = 11,
561 /* Decode Loop (DSP->SRC->DSP) is disabled/enabled */
562 CONTROL_FLAG_DECODE_LOOP = 12,
563 /* De-emphasis filter on DAC-1 disabled/enabled */
564 CONTROL_FLAG_DAC1_DEEMPHASIS = 13,
565 /* De-emphasis filter on DAC-2 disabled/enabled */
566 CONTROL_FLAG_DAC2_DEEMPHASIS = 14,
567 /* De-emphasis filter on DAC-3 disabled/enabled */
568 CONTROL_FLAG_DAC3_DEEMPHASIS = 15,
569 /* High-pass filter on ADC_B disabled/enabled */
570 CONTROL_FLAG_ADC_B_HIGH_PASS = 16,
571 /* High-pass filter on ADC_C disabled/enabled */
572 CONTROL_FLAG_ADC_C_HIGH_PASS = 17,
573 /* Common mode on Port_A disabled/enabled */
574 CONTROL_FLAG_PORT_A_COMMON_MODE = 18,
575 /* Common mode on Port_D disabled/enabled */
576 CONTROL_FLAG_PORT_D_COMMON_MODE = 19,
577 /* Impedance for ramp generator on Port_A 16 Ohm/10K Ohm */
578 CONTROL_FLAG_PORT_A_10KOHM_LOAD = 20,
579 /* Impedance for ramp generator on Port_D, 16 Ohm/10K Ohm */
Ian Minett4aa3bb02012-09-20 20:29:15 -0700580 CONTROL_FLAG_PORT_D_10KOHM_LOAD = 21,
Ian Minett95c6e9c2011-06-15 15:35:17 -0700581 /* ASI rate is 48kHz/96kHz */
582 CONTROL_FLAG_ASI_96KHZ = 22,
583 /* DAC power settings able to control attached ports no/yes */
584 CONTROL_FLAG_DACS_CONTROL_PORTS = 23,
585 /* Clock Stop OK reporting is disabled/enabled */
586 CONTROL_FLAG_CONTROL_STOP_OK_ENABLE = 24,
587 /* Number of control flags */
588 CONTROL_FLAGS_MAX = (CONTROL_FLAG_CONTROL_STOP_OK_ENABLE+1)
589};
590
591/*
592 * Control parameter IDs
593 */
Ian Minett4aa3bb02012-09-20 20:29:15 -0700594enum control_param_id {
Ian Minettef6b2ea2012-12-20 18:53:33 -0800595 /* 0: None, 1: Mic1In*/
596 CONTROL_PARAM_VIP_SOURCE = 1,
Ian Minett95c6e9c2011-06-15 15:35:17 -0700597 /* 0: force HDA, 1: allow DSP if HDA Spdif1Out stream is idle */
598 CONTROL_PARAM_SPDIF1_SOURCE = 2,
Ian Minettef6b2ea2012-12-20 18:53:33 -0800599 /* Port A output stage gain setting to use when 16 Ohm output
600 * impedance is selected*/
601 CONTROL_PARAM_PORTA_160OHM_GAIN = 8,
602 /* Port D output stage gain setting to use when 16 Ohm output
603 * impedance is selected*/
604 CONTROL_PARAM_PORTD_160OHM_GAIN = 10,
Ian Minett95c6e9c2011-06-15 15:35:17 -0700605
606 /* Stream Control */
607
608 /* Select stream with the given ID */
609 CONTROL_PARAM_STREAM_ID = 24,
610 /* Source connection point for the selected stream */
611 CONTROL_PARAM_STREAM_SOURCE_CONN_POINT = 25,
612 /* Destination connection point for the selected stream */
613 CONTROL_PARAM_STREAM_DEST_CONN_POINT = 26,
614 /* Number of audio channels in the selected stream */
615 CONTROL_PARAM_STREAMS_CHANNELS = 27,
616 /*Enable control for the selected stream */
617 CONTROL_PARAM_STREAM_CONTROL = 28,
618
619 /* Connection Point Control */
620
621 /* Select connection point with the given ID */
622 CONTROL_PARAM_CONN_POINT_ID = 29,
623 /* Connection point sample rate */
624 CONTROL_PARAM_CONN_POINT_SAMPLE_RATE = 30,
625
626 /* Node Control */
627
628 /* Select HDA node with the given ID */
629 CONTROL_PARAM_NODE_ID = 31
630};
631
632/*
633 * Dsp Io Status codes
634 */
635enum hda_vendor_status_dspio {
636 /* Success */
637 VENDOR_STATUS_DSPIO_OK = 0x00,
638 /* Busy, unable to accept new command, the host must retry */
639 VENDOR_STATUS_DSPIO_BUSY = 0x01,
640 /* SCP command queue is full */
641 VENDOR_STATUS_DSPIO_SCP_COMMAND_QUEUE_FULL = 0x02,
642 /* SCP response queue is empty */
643 VENDOR_STATUS_DSPIO_SCP_RESPONSE_QUEUE_EMPTY = 0x03
644};
645
646/*
647 * Chip Io Status codes
648 */
649enum hda_vendor_status_chipio {
650 /* Success */
651 VENDOR_STATUS_CHIPIO_OK = 0x00,
652 /* Busy, unable to accept new command, the host must retry */
653 VENDOR_STATUS_CHIPIO_BUSY = 0x01
654};
655
656/*
657 * CA0132 sample rate
658 */
659enum ca0132_sample_rate {
660 SR_6_000 = 0x00,
661 SR_8_000 = 0x01,
662 SR_9_600 = 0x02,
663 SR_11_025 = 0x03,
664 SR_16_000 = 0x04,
665 SR_22_050 = 0x05,
666 SR_24_000 = 0x06,
667 SR_32_000 = 0x07,
668 SR_44_100 = 0x08,
669 SR_48_000 = 0x09,
670 SR_88_200 = 0x0A,
671 SR_96_000 = 0x0B,
672 SR_144_000 = 0x0C,
673 SR_176_400 = 0x0D,
674 SR_192_000 = 0x0E,
675 SR_384_000 = 0x0F,
676
677 SR_COUNT = 0x10,
678
679 SR_RATE_UNKNOWN = 0x1F
680};
681
Ian Minett01ef7db2012-09-20 20:29:16 -0700682enum dsp_download_state {
683 DSP_DOWNLOAD_FAILED = -1,
684 DSP_DOWNLOAD_INIT = 0,
685 DSP_DOWNLOADING = 1,
686 DSP_DOWNLOADED = 2
687};
688
Ian Minett01ef7db2012-09-20 20:29:16 -0700689/* retrieve parameters from hda format */
690#define get_hdafmt_chs(fmt) (fmt & 0xf)
691#define get_hdafmt_bits(fmt) ((fmt >> 4) & 0x7)
692#define get_hdafmt_rate(fmt) ((fmt >> 8) & 0x7f)
693#define get_hdafmt_type(fmt) ((fmt >> 15) & 0x1)
Ian Minett95c6e9c2011-06-15 15:35:17 -0700694
695/*
696 * CA0132 specific
697 */
698
699struct ca0132_spec {
Ian Minetta7e76272012-12-20 18:53:35 -0800700 struct snd_kcontrol_new *mixers[5];
701 unsigned int num_mixers;
Ian Minett5aaca442012-12-20 18:53:34 -0800702 const struct hda_verb *base_init_verbs;
703 const struct hda_verb *base_exit_verbs;
Gabriele Martinod5c016b2015-05-18 21:15:13 +0200704 const struct hda_verb *chip_init_verbs;
705 struct hda_verb *spec_init_verbs;
Ian Minett95c6e9c2011-06-15 15:35:17 -0700706 struct auto_pin_cfg autocfg;
Ian Minett5aaca442012-12-20 18:53:34 -0800707
708 /* Nodes configurations */
Ian Minett95c6e9c2011-06-15 15:35:17 -0700709 struct hda_multi_out multiout;
710 hda_nid_t out_pins[AUTO_CFG_MAX_OUTS];
711 hda_nid_t dacs[AUTO_CFG_MAX_OUTS];
Ian Minett5aaca442012-12-20 18:53:34 -0800712 unsigned int num_outputs;
Ian Minett95c6e9c2011-06-15 15:35:17 -0700713 hda_nid_t input_pins[AUTO_PIN_LAST];
714 hda_nid_t adcs[AUTO_PIN_LAST];
715 hda_nid_t dig_out;
716 hda_nid_t dig_in;
717 unsigned int num_inputs;
Ian Minetta7e76272012-12-20 18:53:35 -0800718 hda_nid_t shared_mic_nid;
719 hda_nid_t shared_out_nid;
Gabriele Martinod5c016b2015-05-18 21:15:13 +0200720 hda_nid_t unsol_tag_hp;
721 hda_nid_t unsol_tag_amic1;
Ian Minett01ef7db2012-09-20 20:29:16 -0700722
723 /* chip access */
724 struct mutex chipio_mutex; /* chip access mutex */
725 u32 curr_chip_addx;
726
727 /* DSP download related */
728 enum dsp_download_state dsp_state;
729 unsigned int dsp_stream_id;
730 unsigned int wait_scp;
731 unsigned int wait_scp_header;
732 unsigned int wait_num_data;
733 unsigned int scp_resp_header;
734 unsigned int scp_resp_data[4];
735 unsigned int scp_resp_count;
Ian Minett5aaca442012-12-20 18:53:34 -0800736
737 /* mixer and effects related */
738 unsigned char dmic_ctl;
739 int cur_out_type;
740 int cur_mic_type;
741 long vnode_lvol[VNODES_COUNT];
742 long vnode_rvol[VNODES_COUNT];
743 long vnode_lswitch[VNODES_COUNT];
744 long vnode_rswitch[VNODES_COUNT];
745 long effects_switch[EFFECTS_COUNT];
746 long voicefx_val;
747 long cur_mic_boost;
Ian Minett44f0c972012-12-20 18:53:38 -0800748
Chih-Chung Chang993884f2013-03-25 10:39:23 -0700749 struct hda_codec *codec;
750 struct delayed_work unsol_hp_work;
Gabriele Martinod5c016b2015-05-18 21:15:13 +0200751 int quirk;
Chih-Chung Chang993884f2013-03-25 10:39:23 -0700752
Ian Minett44f0c972012-12-20 18:53:38 -0800753#ifdef ENABLE_TUNING_CONTROLS
754 long cur_ctl_vals[TUNING_CTLS_COUNT];
755#endif
Ian Minett95c6e9c2011-06-15 15:35:17 -0700756};
757
Ian Minett01ef7db2012-09-20 20:29:16 -0700758/*
Gabriele Martinod5c016b2015-05-18 21:15:13 +0200759 * CA0132 quirks table
760 */
761enum {
762 QUIRK_NONE,
763 QUIRK_ALIENWARE,
764};
765
Takashi Iwaife14f392015-08-10 16:53:32 +0200766static const struct hda_pintbl alienware_pincfgs[] = {
767 { 0x0b, 0x90170110 }, /* Builtin Speaker */
768 { 0x0c, 0x411111f0 }, /* N/A */
769 { 0x0d, 0x411111f0 }, /* N/A */
770 { 0x0e, 0x411111f0 }, /* N/A */
771 { 0x0f, 0x0321101f }, /* HP */
772 { 0x10, 0x411111f0 }, /* Headset? disabled for now */
773 { 0x11, 0x03a11021 }, /* Mic */
774 { 0x12, 0xd5a30140 }, /* Builtin Mic */
775 { 0x13, 0x411111f0 }, /* N/A */
776 { 0x18, 0x411111f0 }, /* N/A */
777 {}
778};
779
Gabriele Martinod5c016b2015-05-18 21:15:13 +0200780static const struct snd_pci_quirk ca0132_quirks[] = {
Gabriele Martino5328e1e2015-12-09 17:05:58 +0100781 SND_PCI_QUIRK(0x1028, 0x0685, "Alienware 15 2015", QUIRK_ALIENWARE),
782 SND_PCI_QUIRK(0x1028, 0x0688, "Alienware 17 2015", QUIRK_ALIENWARE),
Gabriele Martinod5c016b2015-05-18 21:15:13 +0200783 {}
784};
785
786/*
Ian Minett01ef7db2012-09-20 20:29:16 -0700787 * CA0132 codec access
788 */
Sachin Kamat399ae722013-09-13 15:14:22 +0530789static unsigned int codec_send_command(struct hda_codec *codec, hda_nid_t nid,
Ian Minett01ef7db2012-09-20 20:29:16 -0700790 unsigned int verb, unsigned int parm, unsigned int *res)
791{
792 unsigned int response;
793 response = snd_hda_codec_read(codec, nid, 0, verb, parm);
794 *res = response;
795
796 return ((response == -1) ? -1 : 0);
797}
798
799static int codec_set_converter_format(struct hda_codec *codec, hda_nid_t nid,
800 unsigned short converter_format, unsigned int *res)
801{
802 return codec_send_command(codec, nid, VENDOR_CHIPIO_STREAM_FORMAT,
803 converter_format & 0xffff, res);
804}
805
806static int codec_set_converter_stream_channel(struct hda_codec *codec,
807 hda_nid_t nid, unsigned char stream,
808 unsigned char channel, unsigned int *res)
809{
810 unsigned char converter_stream_channel = 0;
811
812 converter_stream_channel = (stream << 4) | (channel & 0x0f);
813 return codec_send_command(codec, nid, AC_VERB_SET_CHANNEL_STREAMID,
814 converter_stream_channel, res);
815}
816
Ian Minett95c6e9c2011-06-15 15:35:17 -0700817/* Chip access helper function */
818static int chipio_send(struct hda_codec *codec,
819 unsigned int reg,
820 unsigned int data)
821{
822 unsigned int res;
Ian Minett6d675302013-02-08 18:31:43 -0800823 unsigned long timeout = jiffies + msecs_to_jiffies(1000);
Ian Minett95c6e9c2011-06-15 15:35:17 -0700824
825 /* send bits of data specified by reg */
826 do {
827 res = snd_hda_codec_read(codec, WIDGET_CHIP_CTRL, 0,
828 reg, data);
829 if (res == VENDOR_STATUS_CHIPIO_OK)
830 return 0;
Ian Minett6d675302013-02-08 18:31:43 -0800831 msleep(20);
832 } while (time_before(jiffies, timeout));
833
Ian Minett95c6e9c2011-06-15 15:35:17 -0700834 return -EIO;
835}
836
837/*
838 * Write chip address through the vendor widget -- NOT protected by the Mutex!
839 */
840static int chipio_write_address(struct hda_codec *codec,
841 unsigned int chip_addx)
842{
Ian Minett4861af82012-09-20 20:29:20 -0700843 struct ca0132_spec *spec = codec->spec;
Ian Minett95c6e9c2011-06-15 15:35:17 -0700844 int res;
845
Ian Minett4861af82012-09-20 20:29:20 -0700846 if (spec->curr_chip_addx == chip_addx)
847 return 0;
848
Ian Minett95c6e9c2011-06-15 15:35:17 -0700849 /* send low 16 bits of the address */
850 res = chipio_send(codec, VENDOR_CHIPIO_ADDRESS_LOW,
851 chip_addx & 0xffff);
852
853 if (res != -EIO) {
854 /* send high 16 bits of the address */
855 res = chipio_send(codec, VENDOR_CHIPIO_ADDRESS_HIGH,
856 chip_addx >> 16);
857 }
858
Ian Minett4861af82012-09-20 20:29:20 -0700859 spec->curr_chip_addx = (res < 0) ? ~0UL : chip_addx;
860
Ian Minett95c6e9c2011-06-15 15:35:17 -0700861 return res;
862}
863
864/*
865 * Write data through the vendor widget -- NOT protected by the Mutex!
866 */
Ian Minett95c6e9c2011-06-15 15:35:17 -0700867static int chipio_write_data(struct hda_codec *codec, unsigned int data)
868{
Ian Minett5aaca442012-12-20 18:53:34 -0800869 struct ca0132_spec *spec = codec->spec;
Ian Minett95c6e9c2011-06-15 15:35:17 -0700870 int res;
871
872 /* send low 16 bits of the data */
873 res = chipio_send(codec, VENDOR_CHIPIO_DATA_LOW, data & 0xffff);
874
875 if (res != -EIO) {
876 /* send high 16 bits of the data */
877 res = chipio_send(codec, VENDOR_CHIPIO_DATA_HIGH,
878 data >> 16);
879 }
880
Ian Minett5aaca442012-12-20 18:53:34 -0800881 /*If no error encountered, automatically increment the address
882 as per chip behaviour*/
883 spec->curr_chip_addx = (res != -EIO) ?
884 (spec->curr_chip_addx + 4) : ~0UL;
Ian Minett95c6e9c2011-06-15 15:35:17 -0700885 return res;
886}
887
Ian Minettd5c21b82012-09-20 20:29:18 -0700888/*
889 * Write multiple data through the vendor widget -- NOT protected by the Mutex!
890 */
Ian Minett01ef7db2012-09-20 20:29:16 -0700891static int chipio_write_data_multiple(struct hda_codec *codec,
892 const u32 *data,
893 unsigned int count)
894{
895 int status = 0;
896
897 if (data == NULL) {
Takashi Iwai4e76a882014-02-25 12:21:03 +0100898 codec_dbg(codec, "chipio_write_data null ptr\n");
Ian Minett01ef7db2012-09-20 20:29:16 -0700899 return -EINVAL;
900 }
901
902 while ((count-- != 0) && (status == 0))
903 status = chipio_write_data(codec, *data++);
904
905 return status;
906}
907
908
Ian Minett95c6e9c2011-06-15 15:35:17 -0700909/*
910 * Read data through the vendor widget -- NOT protected by the Mutex!
911 */
912static int chipio_read_data(struct hda_codec *codec, unsigned int *data)
913{
Ian Minett5aaca442012-12-20 18:53:34 -0800914 struct ca0132_spec *spec = codec->spec;
Ian Minett95c6e9c2011-06-15 15:35:17 -0700915 int res;
916
917 /* post read */
918 res = chipio_send(codec, VENDOR_CHIPIO_HIC_POST_READ, 0);
919
920 if (res != -EIO) {
921 /* read status */
922 res = chipio_send(codec, VENDOR_CHIPIO_STATUS, 0);
923 }
924
925 if (res != -EIO) {
926 /* read data */
927 *data = snd_hda_codec_read(codec, WIDGET_CHIP_CTRL, 0,
928 VENDOR_CHIPIO_HIC_READ_DATA,
929 0);
930 }
931
Ian Minett5aaca442012-12-20 18:53:34 -0800932 /*If no error encountered, automatically increment the address
933 as per chip behaviour*/
934 spec->curr_chip_addx = (res != -EIO) ?
935 (spec->curr_chip_addx + 4) : ~0UL;
Ian Minett95c6e9c2011-06-15 15:35:17 -0700936 return res;
937}
938
939/*
940 * Write given value to the given address through the chip I/O widget.
941 * protected by the Mutex
942 */
943static int chipio_write(struct hda_codec *codec,
944 unsigned int chip_addx, const unsigned int data)
945{
946 struct ca0132_spec *spec = codec->spec;
947 int err;
948
949 mutex_lock(&spec->chipio_mutex);
950
951 /* write the address, and if successful proceed to write data */
952 err = chipio_write_address(codec, chip_addx);
953 if (err < 0)
954 goto exit;
955
956 err = chipio_write_data(codec, data);
957 if (err < 0)
958 goto exit;
959
960exit:
961 mutex_unlock(&spec->chipio_mutex);
962 return err;
963}
964
Ian Minettd5c21b82012-09-20 20:29:18 -0700965/*
966 * Write multiple values to the given address through the chip I/O widget.
967 * protected by the Mutex
968 */
Ian Minett01ef7db2012-09-20 20:29:16 -0700969static int chipio_write_multiple(struct hda_codec *codec,
970 u32 chip_addx,
971 const u32 *data,
972 unsigned int count)
973{
974 struct ca0132_spec *spec = codec->spec;
975 int status;
976
977 mutex_lock(&spec->chipio_mutex);
Ian Minett4861af82012-09-20 20:29:20 -0700978 status = chipio_write_address(codec, chip_addx);
Ian Minett01ef7db2012-09-20 20:29:16 -0700979 if (status < 0)
980 goto error;
981
982 status = chipio_write_data_multiple(codec, data, count);
983error:
984 mutex_unlock(&spec->chipio_mutex);
985
986 return status;
987}
988
Ian Minett95c6e9c2011-06-15 15:35:17 -0700989/*
990 * Read the given address through the chip I/O widget
991 * protected by the Mutex
992 */
993static int chipio_read(struct hda_codec *codec,
994 unsigned int chip_addx, unsigned int *data)
995{
996 struct ca0132_spec *spec = codec->spec;
997 int err;
998
999 mutex_lock(&spec->chipio_mutex);
1000
1001 /* write the address, and if successful proceed to write data */
1002 err = chipio_write_address(codec, chip_addx);
1003 if (err < 0)
1004 goto exit;
1005
1006 err = chipio_read_data(codec, data);
1007 if (err < 0)
1008 goto exit;
1009
1010exit:
1011 mutex_unlock(&spec->chipio_mutex);
1012 return err;
1013}
1014
Ian Minettd5c21b82012-09-20 20:29:18 -07001015/*
1016 * Set chip control flags through the chip I/O widget.
1017 */
Ian Minett01ef7db2012-09-20 20:29:16 -07001018static void chipio_set_control_flag(struct hda_codec *codec,
1019 enum control_flag_id flag_id,
1020 bool flag_state)
1021{
1022 unsigned int val;
1023 unsigned int flag_bit;
1024
1025 flag_bit = (flag_state ? 1 : 0);
1026 val = (flag_bit << 7) | (flag_id);
1027 snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
1028 VENDOR_CHIPIO_FLAG_SET, val);
1029}
1030
Ian Minettd5c21b82012-09-20 20:29:18 -07001031/*
1032 * Set chip parameters through the chip I/O widget.
1033 */
Ian Minett01ef7db2012-09-20 20:29:16 -07001034static void chipio_set_control_param(struct hda_codec *codec,
1035 enum control_param_id param_id, int param_val)
1036{
1037 struct ca0132_spec *spec = codec->spec;
1038 int val;
1039
1040 if ((param_id < 32) && (param_val < 8)) {
1041 val = (param_val << 5) | (param_id);
1042 snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
1043 VENDOR_CHIPIO_PARAM_SET, val);
1044 } else {
1045 mutex_lock(&spec->chipio_mutex);
1046 if (chipio_send(codec, VENDOR_CHIPIO_STATUS, 0) == 0) {
1047 snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
1048 VENDOR_CHIPIO_PARAM_EX_ID_SET,
1049 param_id);
1050 snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
1051 VENDOR_CHIPIO_PARAM_EX_VALUE_SET,
1052 param_val);
1053 }
1054 mutex_unlock(&spec->chipio_mutex);
1055 }
1056}
1057
Ian Minettd5c21b82012-09-20 20:29:18 -07001058/*
1059 * Set sampling rate of the connection point.
1060 */
Ian Minett01ef7db2012-09-20 20:29:16 -07001061static void chipio_set_conn_rate(struct hda_codec *codec,
1062 int connid, enum ca0132_sample_rate rate)
1063{
1064 chipio_set_control_param(codec, CONTROL_PARAM_CONN_POINT_ID, connid);
1065 chipio_set_control_param(codec, CONTROL_PARAM_CONN_POINT_SAMPLE_RATE,
1066 rate);
1067}
1068
Ian Minettd5c21b82012-09-20 20:29:18 -07001069/*
1070 * Enable clocks.
1071 */
Ian Minett01ef7db2012-09-20 20:29:16 -07001072static void chipio_enable_clocks(struct hda_codec *codec)
1073{
1074 struct ca0132_spec *spec = codec->spec;
1075
1076 mutex_lock(&spec->chipio_mutex);
1077 snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
1078 VENDOR_CHIPIO_8051_ADDRESS_LOW, 0);
1079 snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
1080 VENDOR_CHIPIO_PLL_PMU_WRITE, 0xff);
1081 snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
1082 VENDOR_CHIPIO_8051_ADDRESS_LOW, 5);
1083 snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
1084 VENDOR_CHIPIO_PLL_PMU_WRITE, 0x0b);
1085 snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
1086 VENDOR_CHIPIO_8051_ADDRESS_LOW, 6);
1087 snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
1088 VENDOR_CHIPIO_PLL_PMU_WRITE, 0xff);
1089 mutex_unlock(&spec->chipio_mutex);
1090}
1091
1092/*
1093 * CA0132 DSP IO stuffs
1094 */
1095static int dspio_send(struct hda_codec *codec, unsigned int reg,
1096 unsigned int data)
1097{
Takashi Iwaib645d792013-01-15 17:39:29 +01001098 int res;
Ian Minett6d675302013-02-08 18:31:43 -08001099 unsigned long timeout = jiffies + msecs_to_jiffies(1000);
Ian Minett01ef7db2012-09-20 20:29:16 -07001100
1101 /* send bits of data specified by reg to dsp */
1102 do {
1103 res = snd_hda_codec_read(codec, WIDGET_DSP_CTRL, 0, reg, data);
1104 if ((res >= 0) && (res != VENDOR_STATUS_DSPIO_BUSY))
1105 return res;
Ian Minett6d675302013-02-08 18:31:43 -08001106 msleep(20);
1107 } while (time_before(jiffies, timeout));
Ian Minett01ef7db2012-09-20 20:29:16 -07001108
1109 return -EIO;
1110}
1111
Ian Minettd5c21b82012-09-20 20:29:18 -07001112/*
1113 * Wait for DSP to be ready for commands
1114 */
Ian Minett01ef7db2012-09-20 20:29:16 -07001115static void dspio_write_wait(struct hda_codec *codec)
1116{
Ian Minett4861af82012-09-20 20:29:20 -07001117 int status;
1118 unsigned long timeout = jiffies + msecs_to_jiffies(1000);
Ian Minett01ef7db2012-09-20 20:29:16 -07001119
Ian Minett01ef7db2012-09-20 20:29:16 -07001120 do {
Ian Minett4861af82012-09-20 20:29:20 -07001121 status = snd_hda_codec_read(codec, WIDGET_DSP_CTRL, 0,
1122 VENDOR_DSPIO_STATUS, 0);
1123 if ((status == VENDOR_STATUS_DSPIO_OK) ||
1124 (status == VENDOR_STATUS_DSPIO_SCP_RESPONSE_QUEUE_EMPTY))
1125 break;
1126 msleep(1);
1127 } while (time_before(jiffies, timeout));
Ian Minett01ef7db2012-09-20 20:29:16 -07001128}
1129
Ian Minettd5c21b82012-09-20 20:29:18 -07001130/*
1131 * Write SCP data to DSP
1132 */
Ian Minett01ef7db2012-09-20 20:29:16 -07001133static int dspio_write(struct hda_codec *codec, unsigned int scp_data)
1134{
1135 struct ca0132_spec *spec = codec->spec;
1136 int status;
1137
1138 dspio_write_wait(codec);
1139
1140 mutex_lock(&spec->chipio_mutex);
1141 status = dspio_send(codec, VENDOR_DSPIO_SCP_WRITE_DATA_LOW,
1142 scp_data & 0xffff);
1143 if (status < 0)
1144 goto error;
1145
1146 status = dspio_send(codec, VENDOR_DSPIO_SCP_WRITE_DATA_HIGH,
1147 scp_data >> 16);
1148 if (status < 0)
1149 goto error;
1150
1151 /* OK, now check if the write itself has executed*/
1152 status = snd_hda_codec_read(codec, WIDGET_DSP_CTRL, 0,
1153 VENDOR_DSPIO_STATUS, 0);
1154error:
1155 mutex_unlock(&spec->chipio_mutex);
1156
1157 return (status == VENDOR_STATUS_DSPIO_SCP_COMMAND_QUEUE_FULL) ?
1158 -EIO : 0;
1159}
1160
Ian Minettd5c21b82012-09-20 20:29:18 -07001161/*
1162 * Write multiple SCP data to DSP
1163 */
Ian Minett01ef7db2012-09-20 20:29:16 -07001164static int dspio_write_multiple(struct hda_codec *codec,
1165 unsigned int *buffer, unsigned int size)
1166{
1167 int status = 0;
1168 unsigned int count;
1169
1170 if ((buffer == NULL))
1171 return -EINVAL;
1172
1173 count = 0;
1174 while (count < size) {
1175 status = dspio_write(codec, *buffer++);
1176 if (status != 0)
1177 break;
1178 count++;
1179 }
1180
1181 return status;
1182}
1183
Ian Minetta73d5112012-12-20 18:53:37 -08001184static int dspio_read(struct hda_codec *codec, unsigned int *data)
1185{
1186 int status;
1187
1188 status = dspio_send(codec, VENDOR_DSPIO_SCP_POST_READ_DATA, 0);
1189 if (status == -EIO)
1190 return status;
1191
1192 status = dspio_send(codec, VENDOR_DSPIO_STATUS, 0);
1193 if (status == -EIO ||
1194 status == VENDOR_STATUS_DSPIO_SCP_RESPONSE_QUEUE_EMPTY)
1195 return -EIO;
1196
1197 *data = snd_hda_codec_read(codec, WIDGET_DSP_CTRL, 0,
1198 VENDOR_DSPIO_SCP_READ_DATA, 0);
1199
1200 return 0;
1201}
1202
1203static int dspio_read_multiple(struct hda_codec *codec, unsigned int *buffer,
1204 unsigned int *buf_size, unsigned int size_count)
1205{
1206 int status = 0;
1207 unsigned int size = *buf_size;
1208 unsigned int count;
1209 unsigned int skip_count;
1210 unsigned int dummy;
1211
1212 if ((buffer == NULL))
1213 return -1;
1214
1215 count = 0;
1216 while (count < size && count < size_count) {
1217 status = dspio_read(codec, buffer++);
1218 if (status != 0)
1219 break;
1220 count++;
1221 }
1222
1223 skip_count = count;
1224 if (status == 0) {
1225 while (skip_count < size) {
1226 status = dspio_read(codec, &dummy);
1227 if (status != 0)
1228 break;
1229 skip_count++;
1230 }
1231 }
1232 *buf_size = count;
1233
1234 return status;
1235}
1236
Ian Minettd5c21b82012-09-20 20:29:18 -07001237/*
1238 * Construct the SCP header using corresponding fields
1239 */
Ian Minett01ef7db2012-09-20 20:29:16 -07001240static inline unsigned int
1241make_scp_header(unsigned int target_id, unsigned int source_id,
1242 unsigned int get_flag, unsigned int req,
1243 unsigned int device_flag, unsigned int resp_flag,
1244 unsigned int error_flag, unsigned int data_size)
1245{
1246 unsigned int header = 0;
1247
1248 header = (data_size & 0x1f) << 27;
1249 header |= (error_flag & 0x01) << 26;
1250 header |= (resp_flag & 0x01) << 25;
1251 header |= (device_flag & 0x01) << 24;
1252 header |= (req & 0x7f) << 17;
1253 header |= (get_flag & 0x01) << 16;
1254 header |= (source_id & 0xff) << 8;
1255 header |= target_id & 0xff;
1256
1257 return header;
1258}
1259
Ian Minettd5c21b82012-09-20 20:29:18 -07001260/*
1261 * Extract corresponding fields from SCP header
1262 */
Ian Minett01ef7db2012-09-20 20:29:16 -07001263static inline void
1264extract_scp_header(unsigned int header,
1265 unsigned int *target_id, unsigned int *source_id,
1266 unsigned int *get_flag, unsigned int *req,
1267 unsigned int *device_flag, unsigned int *resp_flag,
1268 unsigned int *error_flag, unsigned int *data_size)
1269{
1270 if (data_size)
1271 *data_size = (header >> 27) & 0x1f;
1272 if (error_flag)
1273 *error_flag = (header >> 26) & 0x01;
1274 if (resp_flag)
1275 *resp_flag = (header >> 25) & 0x01;
1276 if (device_flag)
1277 *device_flag = (header >> 24) & 0x01;
1278 if (req)
1279 *req = (header >> 17) & 0x7f;
1280 if (get_flag)
1281 *get_flag = (header >> 16) & 0x01;
1282 if (source_id)
1283 *source_id = (header >> 8) & 0xff;
1284 if (target_id)
1285 *target_id = header & 0xff;
1286}
1287
1288#define SCP_MAX_DATA_WORDS (16)
1289
1290/* Structure to contain any SCP message */
1291struct scp_msg {
1292 unsigned int hdr;
1293 unsigned int data[SCP_MAX_DATA_WORDS];
1294};
1295
Ian Minetta73d5112012-12-20 18:53:37 -08001296static void dspio_clear_response_queue(struct hda_codec *codec)
1297{
1298 unsigned int dummy = 0;
1299 int status = -1;
1300
1301 /* clear all from the response queue */
1302 do {
1303 status = dspio_read(codec, &dummy);
1304 } while (status == 0);
1305}
1306
1307static int dspio_get_response_data(struct hda_codec *codec)
1308{
1309 struct ca0132_spec *spec = codec->spec;
1310 unsigned int data = 0;
1311 unsigned int count;
1312
1313 if (dspio_read(codec, &data) < 0)
1314 return -EIO;
1315
1316 if ((data & 0x00ffffff) == spec->wait_scp_header) {
1317 spec->scp_resp_header = data;
1318 spec->scp_resp_count = data >> 27;
1319 count = spec->wait_num_data;
1320 dspio_read_multiple(codec, spec->scp_resp_data,
1321 &spec->scp_resp_count, count);
1322 return 0;
1323 }
1324
1325 return -EIO;
1326}
1327
Ian Minettd5c21b82012-09-20 20:29:18 -07001328/*
1329 * Send SCP message to DSP
1330 */
Ian Minett01ef7db2012-09-20 20:29:16 -07001331static int dspio_send_scp_message(struct hda_codec *codec,
1332 unsigned char *send_buf,
1333 unsigned int send_buf_size,
1334 unsigned char *return_buf,
1335 unsigned int return_buf_size,
1336 unsigned int *bytes_returned)
1337{
1338 struct ca0132_spec *spec = codec->spec;
Ian Minett01ef7db2012-09-20 20:29:16 -07001339 int status = -1;
1340 unsigned int scp_send_size = 0;
1341 unsigned int total_size;
1342 bool waiting_for_resp = false;
1343 unsigned int header;
1344 struct scp_msg *ret_msg;
1345 unsigned int resp_src_id, resp_target_id;
1346 unsigned int data_size, src_id, target_id, get_flag, device_flag;
1347
1348 if (bytes_returned)
1349 *bytes_returned = 0;
1350
1351 /* get scp header from buffer */
1352 header = *((unsigned int *)send_buf);
1353 extract_scp_header(header, &target_id, &src_id, &get_flag, NULL,
1354 &device_flag, NULL, NULL, &data_size);
1355 scp_send_size = data_size + 1;
1356 total_size = (scp_send_size * 4);
1357
1358 if (send_buf_size < total_size)
1359 return -EINVAL;
1360
1361 if (get_flag || device_flag) {
1362 if (!return_buf || return_buf_size < 4 || !bytes_returned)
1363 return -EINVAL;
1364
1365 spec->wait_scp_header = *((unsigned int *)send_buf);
1366
1367 /* swap source id with target id */
1368 resp_target_id = src_id;
1369 resp_src_id = target_id;
1370 spec->wait_scp_header &= 0xffff0000;
1371 spec->wait_scp_header |= (resp_src_id << 8) | (resp_target_id);
1372 spec->wait_num_data = return_buf_size/sizeof(unsigned int) - 1;
1373 spec->wait_scp = 1;
1374 waiting_for_resp = true;
1375 }
1376
1377 status = dspio_write_multiple(codec, (unsigned int *)send_buf,
1378 scp_send_size);
1379 if (status < 0) {
1380 spec->wait_scp = 0;
1381 return status;
1382 }
1383
1384 if (waiting_for_resp) {
Ian Minett6d675302013-02-08 18:31:43 -08001385 unsigned long timeout = jiffies + msecs_to_jiffies(1000);
Ian Minett01ef7db2012-09-20 20:29:16 -07001386 memset(return_buf, 0, return_buf_size);
Ian Minett01ef7db2012-09-20 20:29:16 -07001387 do {
1388 msleep(20);
Ian Minett6d675302013-02-08 18:31:43 -08001389 } while (spec->wait_scp && time_before(jiffies, timeout));
Ian Minett01ef7db2012-09-20 20:29:16 -07001390 waiting_for_resp = false;
Ian Minett6d675302013-02-08 18:31:43 -08001391 if (!spec->wait_scp) {
Ian Minett01ef7db2012-09-20 20:29:16 -07001392 ret_msg = (struct scp_msg *)return_buf;
1393 memcpy(&ret_msg->hdr, &spec->scp_resp_header, 4);
1394 memcpy(&ret_msg->data, spec->scp_resp_data,
1395 spec->wait_num_data);
1396 *bytes_returned = (spec->scp_resp_count + 1) * 4;
1397 status = 0;
1398 } else {
1399 status = -EIO;
1400 }
1401 spec->wait_scp = 0;
1402 }
1403
1404 return status;
1405}
1406
Ian Minettd5c21b82012-09-20 20:29:18 -07001407/**
1408 * Prepare and send the SCP message to DSP
1409 * @codec: the HDA codec
1410 * @mod_id: ID of the DSP module to send the command
1411 * @req: ID of request to send to the DSP module
1412 * @dir: SET or GET
1413 * @data: pointer to the data to send with the request, request specific
1414 * @len: length of the data, in bytes
1415 * @reply: point to the buffer to hold data returned for a reply
1416 * @reply_len: length of the reply buffer returned from GET
1417 *
1418 * Returns zero or a negative error code.
1419 */
Ian Minett01ef7db2012-09-20 20:29:16 -07001420static int dspio_scp(struct hda_codec *codec,
1421 int mod_id, int req, int dir, void *data, unsigned int len,
1422 void *reply, unsigned int *reply_len)
1423{
1424 int status = 0;
1425 struct scp_msg scp_send, scp_reply;
1426 unsigned int ret_bytes, send_size, ret_size;
1427 unsigned int send_get_flag, reply_resp_flag, reply_error_flag;
1428 unsigned int reply_data_size;
1429
1430 memset(&scp_send, 0, sizeof(scp_send));
1431 memset(&scp_reply, 0, sizeof(scp_reply));
1432
1433 if ((len != 0 && data == NULL) || (len > SCP_MAX_DATA_WORDS))
1434 return -EINVAL;
1435
1436 if (dir == SCP_GET && reply == NULL) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01001437 codec_dbg(codec, "dspio_scp get but has no buffer\n");
Ian Minett01ef7db2012-09-20 20:29:16 -07001438 return -EINVAL;
1439 }
1440
1441 if (reply != NULL && (reply_len == NULL || (*reply_len == 0))) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01001442 codec_dbg(codec, "dspio_scp bad resp buf len parms\n");
Ian Minett01ef7db2012-09-20 20:29:16 -07001443 return -EINVAL;
1444 }
1445
1446 scp_send.hdr = make_scp_header(mod_id, 0x20, (dir == SCP_GET), req,
1447 0, 0, 0, len/sizeof(unsigned int));
1448 if (data != NULL && len > 0) {
1449 len = min((unsigned int)(sizeof(scp_send.data)), len);
1450 memcpy(scp_send.data, data, len);
1451 }
1452
1453 ret_bytes = 0;
1454 send_size = sizeof(unsigned int) + len;
1455 status = dspio_send_scp_message(codec, (unsigned char *)&scp_send,
1456 send_size, (unsigned char *)&scp_reply,
1457 sizeof(scp_reply), &ret_bytes);
1458
1459 if (status < 0) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01001460 codec_dbg(codec, "dspio_scp: send scp msg failed\n");
Ian Minett01ef7db2012-09-20 20:29:16 -07001461 return status;
1462 }
1463
1464 /* extract send and reply headers members */
1465 extract_scp_header(scp_send.hdr, NULL, NULL, &send_get_flag,
1466 NULL, NULL, NULL, NULL, NULL);
1467 extract_scp_header(scp_reply.hdr, NULL, NULL, NULL, NULL, NULL,
1468 &reply_resp_flag, &reply_error_flag,
1469 &reply_data_size);
1470
1471 if (!send_get_flag)
1472 return 0;
1473
1474 if (reply_resp_flag && !reply_error_flag) {
1475 ret_size = (ret_bytes - sizeof(scp_reply.hdr))
1476 / sizeof(unsigned int);
1477
1478 if (*reply_len < ret_size*sizeof(unsigned int)) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01001479 codec_dbg(codec, "reply too long for buf\n");
Ian Minett01ef7db2012-09-20 20:29:16 -07001480 return -EINVAL;
1481 } else if (ret_size != reply_data_size) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01001482 codec_dbg(codec, "RetLen and HdrLen .NE.\n");
Ian Minett01ef7db2012-09-20 20:29:16 -07001483 return -EINVAL;
1484 } else {
1485 *reply_len = ret_size*sizeof(unsigned int);
1486 memcpy(reply, scp_reply.data, *reply_len);
1487 }
1488 } else {
Takashi Iwai4e76a882014-02-25 12:21:03 +01001489 codec_dbg(codec, "reply ill-formed or errflag set\n");
Ian Minett01ef7db2012-09-20 20:29:16 -07001490 return -EIO;
1491 }
1492
1493 return status;
1494}
1495
Ian Minettd5c21b82012-09-20 20:29:18 -07001496/*
Ian Minett5aaca442012-12-20 18:53:34 -08001497 * Set DSP parameters
1498 */
1499static int dspio_set_param(struct hda_codec *codec, int mod_id,
1500 int req, void *data, unsigned int len)
1501{
1502 return dspio_scp(codec, mod_id, req, SCP_SET, data, len, NULL, NULL);
1503}
1504
1505static int dspio_set_uint_param(struct hda_codec *codec, int mod_id,
1506 int req, unsigned int data)
1507{
1508 return dspio_set_param(codec, mod_id, req, &data, sizeof(unsigned int));
1509}
1510
1511/*
Ian Minettd5c21b82012-09-20 20:29:18 -07001512 * Allocate a DSP DMA channel via an SCP message
1513 */
Ian Minett01ef7db2012-09-20 20:29:16 -07001514static int dspio_alloc_dma_chan(struct hda_codec *codec, unsigned int *dma_chan)
1515{
1516 int status = 0;
1517 unsigned int size = sizeof(dma_chan);
1518
Takashi Iwai4e76a882014-02-25 12:21:03 +01001519 codec_dbg(codec, " dspio_alloc_dma_chan() -- begin\n");
Ian Minett01ef7db2012-09-20 20:29:16 -07001520 status = dspio_scp(codec, MASTERCONTROL, MASTERCONTROL_ALLOC_DMA_CHAN,
1521 SCP_GET, NULL, 0, dma_chan, &size);
1522
1523 if (status < 0) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01001524 codec_dbg(codec, "dspio_alloc_dma_chan: SCP Failed\n");
Ian Minett01ef7db2012-09-20 20:29:16 -07001525 return status;
1526 }
1527
1528 if ((*dma_chan + 1) == 0) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01001529 codec_dbg(codec, "no free dma channels to allocate\n");
Ian Minett01ef7db2012-09-20 20:29:16 -07001530 return -EBUSY;
1531 }
1532
Takashi Iwai4e76a882014-02-25 12:21:03 +01001533 codec_dbg(codec, "dspio_alloc_dma_chan: chan=%d\n", *dma_chan);
1534 codec_dbg(codec, " dspio_alloc_dma_chan() -- complete\n");
Ian Minett01ef7db2012-09-20 20:29:16 -07001535
1536 return status;
1537}
1538
Ian Minettd5c21b82012-09-20 20:29:18 -07001539/*
1540 * Free a DSP DMA via an SCP message
1541 */
Ian Minett01ef7db2012-09-20 20:29:16 -07001542static int dspio_free_dma_chan(struct hda_codec *codec, unsigned int dma_chan)
1543{
1544 int status = 0;
1545 unsigned int dummy = 0;
1546
Takashi Iwai4e76a882014-02-25 12:21:03 +01001547 codec_dbg(codec, " dspio_free_dma_chan() -- begin\n");
1548 codec_dbg(codec, "dspio_free_dma_chan: chan=%d\n", dma_chan);
Ian Minett01ef7db2012-09-20 20:29:16 -07001549
1550 status = dspio_scp(codec, MASTERCONTROL, MASTERCONTROL_ALLOC_DMA_CHAN,
1551 SCP_SET, &dma_chan, sizeof(dma_chan), NULL, &dummy);
1552
1553 if (status < 0) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01001554 codec_dbg(codec, "dspio_free_dma_chan: SCP Failed\n");
Ian Minett01ef7db2012-09-20 20:29:16 -07001555 return status;
1556 }
1557
Takashi Iwai4e76a882014-02-25 12:21:03 +01001558 codec_dbg(codec, " dspio_free_dma_chan() -- complete\n");
Ian Minett01ef7db2012-09-20 20:29:16 -07001559
1560 return status;
1561}
1562
1563/*
Ian Minettd5c21b82012-09-20 20:29:18 -07001564 * (Re)start the DSP
Ian Minett01ef7db2012-09-20 20:29:16 -07001565 */
1566static int dsp_set_run_state(struct hda_codec *codec)
1567{
1568 unsigned int dbg_ctrl_reg;
1569 unsigned int halt_state;
1570 int err;
1571
1572 err = chipio_read(codec, DSP_DBGCNTL_INST_OFFSET, &dbg_ctrl_reg);
1573 if (err < 0)
1574 return err;
1575
1576 halt_state = (dbg_ctrl_reg & DSP_DBGCNTL_STATE_MASK) >>
1577 DSP_DBGCNTL_STATE_LOBIT;
1578
1579 if (halt_state != 0) {
1580 dbg_ctrl_reg &= ~((halt_state << DSP_DBGCNTL_SS_LOBIT) &
1581 DSP_DBGCNTL_SS_MASK);
1582 err = chipio_write(codec, DSP_DBGCNTL_INST_OFFSET,
1583 dbg_ctrl_reg);
1584 if (err < 0)
1585 return err;
1586
1587 dbg_ctrl_reg |= (halt_state << DSP_DBGCNTL_EXEC_LOBIT) &
1588 DSP_DBGCNTL_EXEC_MASK;
1589 err = chipio_write(codec, DSP_DBGCNTL_INST_OFFSET,
1590 dbg_ctrl_reg);
1591 if (err < 0)
1592 return err;
1593 }
1594
1595 return 0;
1596}
1597
Ian Minettd5c21b82012-09-20 20:29:18 -07001598/*
1599 * Reset the DSP
1600 */
Ian Minett01ef7db2012-09-20 20:29:16 -07001601static int dsp_reset(struct hda_codec *codec)
1602{
1603 unsigned int res;
1604 int retry = 20;
1605
Takashi Iwai4e76a882014-02-25 12:21:03 +01001606 codec_dbg(codec, "dsp_reset\n");
Ian Minett01ef7db2012-09-20 20:29:16 -07001607 do {
1608 res = dspio_send(codec, VENDOR_DSPIO_DSP_INIT, 0);
1609 retry--;
1610 } while (res == -EIO && retry);
1611
1612 if (!retry) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01001613 codec_dbg(codec, "dsp_reset timeout\n");
Ian Minett01ef7db2012-09-20 20:29:16 -07001614 return -EIO;
1615 }
1616
1617 return 0;
1618}
1619
Ian Minettd5c21b82012-09-20 20:29:18 -07001620/*
1621 * Convert chip address to DSP address
1622 */
Ian Minett01ef7db2012-09-20 20:29:16 -07001623static unsigned int dsp_chip_to_dsp_addx(unsigned int chip_addx,
1624 bool *code, bool *yram)
1625{
1626 *code = *yram = false;
1627
1628 if (UC_RANGE(chip_addx, 1)) {
1629 *code = true;
1630 return UC_OFF(chip_addx);
1631 } else if (X_RANGE_ALL(chip_addx, 1)) {
1632 return X_OFF(chip_addx);
1633 } else if (Y_RANGE_ALL(chip_addx, 1)) {
1634 *yram = true;
1635 return Y_OFF(chip_addx);
1636 }
1637
Takashi Iwai4a8b89f2013-02-12 10:15:15 +01001638 return INVALID_CHIP_ADDRESS;
Ian Minett01ef7db2012-09-20 20:29:16 -07001639}
1640
Ian Minettd5c21b82012-09-20 20:29:18 -07001641/*
1642 * Check if the DSP DMA is active
1643 */
Ian Minett01ef7db2012-09-20 20:29:16 -07001644static bool dsp_is_dma_active(struct hda_codec *codec, unsigned int dma_chan)
1645{
1646 unsigned int dma_chnlstart_reg;
1647
1648 chipio_read(codec, DSPDMAC_CHNLSTART_INST_OFFSET, &dma_chnlstart_reg);
1649
1650 return ((dma_chnlstart_reg & (1 <<
1651 (DSPDMAC_CHNLSTART_EN_LOBIT + dma_chan))) != 0);
1652}
1653
1654static int dsp_dma_setup_common(struct hda_codec *codec,
1655 unsigned int chip_addx,
1656 unsigned int dma_chan,
1657 unsigned int port_map_mask,
1658 bool ovly)
1659{
1660 int status = 0;
1661 unsigned int chnl_prop;
1662 unsigned int dsp_addx;
1663 unsigned int active;
1664 bool code, yram;
1665
Takashi Iwai4e76a882014-02-25 12:21:03 +01001666 codec_dbg(codec, "-- dsp_dma_setup_common() -- Begin ---------\n");
Ian Minett01ef7db2012-09-20 20:29:16 -07001667
1668 if (dma_chan >= DSPDMAC_DMA_CFG_CHANNEL_COUNT) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01001669 codec_dbg(codec, "dma chan num invalid\n");
Ian Minett01ef7db2012-09-20 20:29:16 -07001670 return -EINVAL;
1671 }
1672
1673 if (dsp_is_dma_active(codec, dma_chan)) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01001674 codec_dbg(codec, "dma already active\n");
Ian Minett01ef7db2012-09-20 20:29:16 -07001675 return -EBUSY;
1676 }
1677
1678 dsp_addx = dsp_chip_to_dsp_addx(chip_addx, &code, &yram);
1679
1680 if (dsp_addx == INVALID_CHIP_ADDRESS) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01001681 codec_dbg(codec, "invalid chip addr\n");
Ian Minett01ef7db2012-09-20 20:29:16 -07001682 return -ENXIO;
1683 }
1684
1685 chnl_prop = DSPDMAC_CHNLPROP_AC_MASK;
1686 active = 0;
1687
Takashi Iwai4e76a882014-02-25 12:21:03 +01001688 codec_dbg(codec, " dsp_dma_setup_common() start reg pgm\n");
Ian Minett01ef7db2012-09-20 20:29:16 -07001689
1690 if (ovly) {
1691 status = chipio_read(codec, DSPDMAC_CHNLPROP_INST_OFFSET,
1692 &chnl_prop);
1693
1694 if (status < 0) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01001695 codec_dbg(codec, "read CHNLPROP Reg fail\n");
Ian Minett01ef7db2012-09-20 20:29:16 -07001696 return status;
1697 }
Takashi Iwai4e76a882014-02-25 12:21:03 +01001698 codec_dbg(codec, "dsp_dma_setup_common() Read CHNLPROP\n");
Ian Minett01ef7db2012-09-20 20:29:16 -07001699 }
1700
1701 if (!code)
1702 chnl_prop &= ~(1 << (DSPDMAC_CHNLPROP_MSPCE_LOBIT + dma_chan));
1703 else
1704 chnl_prop |= (1 << (DSPDMAC_CHNLPROP_MSPCE_LOBIT + dma_chan));
1705
1706 chnl_prop &= ~(1 << (DSPDMAC_CHNLPROP_DCON_LOBIT + dma_chan));
1707
1708 status = chipio_write(codec, DSPDMAC_CHNLPROP_INST_OFFSET, chnl_prop);
1709 if (status < 0) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01001710 codec_dbg(codec, "write CHNLPROP Reg fail\n");
Ian Minett01ef7db2012-09-20 20:29:16 -07001711 return status;
1712 }
Takashi Iwai4e76a882014-02-25 12:21:03 +01001713 codec_dbg(codec, " dsp_dma_setup_common() Write CHNLPROP\n");
Ian Minett01ef7db2012-09-20 20:29:16 -07001714
1715 if (ovly) {
1716 status = chipio_read(codec, DSPDMAC_ACTIVE_INST_OFFSET,
1717 &active);
1718
1719 if (status < 0) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01001720 codec_dbg(codec, "read ACTIVE Reg fail\n");
Ian Minett01ef7db2012-09-20 20:29:16 -07001721 return status;
1722 }
Takashi Iwai4e76a882014-02-25 12:21:03 +01001723 codec_dbg(codec, "dsp_dma_setup_common() Read ACTIVE\n");
Ian Minett01ef7db2012-09-20 20:29:16 -07001724 }
1725
1726 active &= (~(1 << (DSPDMAC_ACTIVE_AAR_LOBIT + dma_chan))) &
1727 DSPDMAC_ACTIVE_AAR_MASK;
1728
1729 status = chipio_write(codec, DSPDMAC_ACTIVE_INST_OFFSET, active);
1730 if (status < 0) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01001731 codec_dbg(codec, "write ACTIVE Reg fail\n");
Ian Minett01ef7db2012-09-20 20:29:16 -07001732 return status;
1733 }
1734
Takashi Iwai4e76a882014-02-25 12:21:03 +01001735 codec_dbg(codec, " dsp_dma_setup_common() Write ACTIVE\n");
Ian Minett01ef7db2012-09-20 20:29:16 -07001736
1737 status = chipio_write(codec, DSPDMAC_AUDCHSEL_INST_OFFSET(dma_chan),
1738 port_map_mask);
1739 if (status < 0) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01001740 codec_dbg(codec, "write AUDCHSEL Reg fail\n");
Ian Minett01ef7db2012-09-20 20:29:16 -07001741 return status;
1742 }
Takashi Iwai4e76a882014-02-25 12:21:03 +01001743 codec_dbg(codec, " dsp_dma_setup_common() Write AUDCHSEL\n");
Ian Minett01ef7db2012-09-20 20:29:16 -07001744
1745 status = chipio_write(codec, DSPDMAC_IRQCNT_INST_OFFSET(dma_chan),
1746 DSPDMAC_IRQCNT_BICNT_MASK | DSPDMAC_IRQCNT_CICNT_MASK);
1747 if (status < 0) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01001748 codec_dbg(codec, "write IRQCNT Reg fail\n");
Ian Minett01ef7db2012-09-20 20:29:16 -07001749 return status;
1750 }
Takashi Iwai4e76a882014-02-25 12:21:03 +01001751 codec_dbg(codec, " dsp_dma_setup_common() Write IRQCNT\n");
Ian Minett01ef7db2012-09-20 20:29:16 -07001752
Takashi Iwai4e76a882014-02-25 12:21:03 +01001753 codec_dbg(codec,
Ian Minett01ef7db2012-09-20 20:29:16 -07001754 "ChipA=0x%x,DspA=0x%x,dmaCh=%u, "
1755 "CHSEL=0x%x,CHPROP=0x%x,Active=0x%x\n",
1756 chip_addx, dsp_addx, dma_chan,
1757 port_map_mask, chnl_prop, active);
1758
Takashi Iwai4e76a882014-02-25 12:21:03 +01001759 codec_dbg(codec, "-- dsp_dma_setup_common() -- Complete ------\n");
Ian Minett01ef7db2012-09-20 20:29:16 -07001760
1761 return 0;
1762}
1763
Ian Minettd5c21b82012-09-20 20:29:18 -07001764/*
1765 * Setup the DSP DMA per-transfer-specific registers
1766 */
Ian Minett01ef7db2012-09-20 20:29:16 -07001767static int dsp_dma_setup(struct hda_codec *codec,
1768 unsigned int chip_addx,
1769 unsigned int count,
1770 unsigned int dma_chan)
1771{
1772 int status = 0;
1773 bool code, yram;
1774 unsigned int dsp_addx;
1775 unsigned int addr_field;
1776 unsigned int incr_field;
1777 unsigned int base_cnt;
1778 unsigned int cur_cnt;
1779 unsigned int dma_cfg = 0;
1780 unsigned int adr_ofs = 0;
1781 unsigned int xfr_cnt = 0;
1782 const unsigned int max_dma_count = 1 << (DSPDMAC_XFRCNT_BCNT_HIBIT -
1783 DSPDMAC_XFRCNT_BCNT_LOBIT + 1);
1784
Takashi Iwai4e76a882014-02-25 12:21:03 +01001785 codec_dbg(codec, "-- dsp_dma_setup() -- Begin ---------\n");
Ian Minett01ef7db2012-09-20 20:29:16 -07001786
1787 if (count > max_dma_count) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01001788 codec_dbg(codec, "count too big\n");
Ian Minett01ef7db2012-09-20 20:29:16 -07001789 return -EINVAL;
1790 }
1791
1792 dsp_addx = dsp_chip_to_dsp_addx(chip_addx, &code, &yram);
1793 if (dsp_addx == INVALID_CHIP_ADDRESS) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01001794 codec_dbg(codec, "invalid chip addr\n");
Ian Minett01ef7db2012-09-20 20:29:16 -07001795 return -ENXIO;
1796 }
1797
Takashi Iwai4e76a882014-02-25 12:21:03 +01001798 codec_dbg(codec, " dsp_dma_setup() start reg pgm\n");
Ian Minett01ef7db2012-09-20 20:29:16 -07001799
1800 addr_field = dsp_addx << DSPDMAC_DMACFG_DBADR_LOBIT;
1801 incr_field = 0;
1802
1803 if (!code) {
1804 addr_field <<= 1;
1805 if (yram)
1806 addr_field |= (1 << DSPDMAC_DMACFG_DBADR_LOBIT);
1807
1808 incr_field = (1 << DSPDMAC_DMACFG_AINCR_LOBIT);
1809 }
1810
1811 dma_cfg = addr_field + incr_field;
1812 status = chipio_write(codec, DSPDMAC_DMACFG_INST_OFFSET(dma_chan),
1813 dma_cfg);
1814 if (status < 0) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01001815 codec_dbg(codec, "write DMACFG Reg fail\n");
Ian Minett01ef7db2012-09-20 20:29:16 -07001816 return status;
1817 }
Takashi Iwai4e76a882014-02-25 12:21:03 +01001818 codec_dbg(codec, " dsp_dma_setup() Write DMACFG\n");
Ian Minett01ef7db2012-09-20 20:29:16 -07001819
1820 adr_ofs = (count - 1) << (DSPDMAC_DSPADROFS_BOFS_LOBIT +
1821 (code ? 0 : 1));
1822
1823 status = chipio_write(codec, DSPDMAC_DSPADROFS_INST_OFFSET(dma_chan),
1824 adr_ofs);
1825 if (status < 0) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01001826 codec_dbg(codec, "write DSPADROFS Reg fail\n");
Ian Minett01ef7db2012-09-20 20:29:16 -07001827 return status;
1828 }
Takashi Iwai4e76a882014-02-25 12:21:03 +01001829 codec_dbg(codec, " dsp_dma_setup() Write DSPADROFS\n");
Ian Minett01ef7db2012-09-20 20:29:16 -07001830
1831 base_cnt = (count - 1) << DSPDMAC_XFRCNT_BCNT_LOBIT;
1832
1833 cur_cnt = (count - 1) << DSPDMAC_XFRCNT_CCNT_LOBIT;
1834
1835 xfr_cnt = base_cnt | cur_cnt;
1836
1837 status = chipio_write(codec,
1838 DSPDMAC_XFRCNT_INST_OFFSET(dma_chan), xfr_cnt);
1839 if (status < 0) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01001840 codec_dbg(codec, "write XFRCNT Reg fail\n");
Ian Minett01ef7db2012-09-20 20:29:16 -07001841 return status;
1842 }
Takashi Iwai4e76a882014-02-25 12:21:03 +01001843 codec_dbg(codec, " dsp_dma_setup() Write XFRCNT\n");
Ian Minett01ef7db2012-09-20 20:29:16 -07001844
Takashi Iwai4e76a882014-02-25 12:21:03 +01001845 codec_dbg(codec,
Ian Minett01ef7db2012-09-20 20:29:16 -07001846 "ChipA=0x%x, cnt=0x%x, DMACFG=0x%x, "
1847 "ADROFS=0x%x, XFRCNT=0x%x\n",
1848 chip_addx, count, dma_cfg, adr_ofs, xfr_cnt);
1849
Takashi Iwai4e76a882014-02-25 12:21:03 +01001850 codec_dbg(codec, "-- dsp_dma_setup() -- Complete ---------\n");
Ian Minett01ef7db2012-09-20 20:29:16 -07001851
1852 return 0;
1853}
1854
Ian Minettd5c21b82012-09-20 20:29:18 -07001855/*
1856 * Start the DSP DMA
1857 */
Ian Minett01ef7db2012-09-20 20:29:16 -07001858static int dsp_dma_start(struct hda_codec *codec,
1859 unsigned int dma_chan, bool ovly)
1860{
1861 unsigned int reg = 0;
1862 int status = 0;
1863
Takashi Iwai4e76a882014-02-25 12:21:03 +01001864 codec_dbg(codec, "-- dsp_dma_start() -- Begin ---------\n");
Ian Minett01ef7db2012-09-20 20:29:16 -07001865
1866 if (ovly) {
1867 status = chipio_read(codec,
1868 DSPDMAC_CHNLSTART_INST_OFFSET, &reg);
1869
1870 if (status < 0) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01001871 codec_dbg(codec, "read CHNLSTART reg fail\n");
Ian Minett01ef7db2012-09-20 20:29:16 -07001872 return status;
1873 }
Takashi Iwai4e76a882014-02-25 12:21:03 +01001874 codec_dbg(codec, "-- dsp_dma_start() Read CHNLSTART\n");
Ian Minett01ef7db2012-09-20 20:29:16 -07001875
1876 reg &= ~(DSPDMAC_CHNLSTART_EN_MASK |
1877 DSPDMAC_CHNLSTART_DIS_MASK);
1878 }
1879
1880 status = chipio_write(codec, DSPDMAC_CHNLSTART_INST_OFFSET,
1881 reg | (1 << (dma_chan + DSPDMAC_CHNLSTART_EN_LOBIT)));
1882 if (status < 0) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01001883 codec_dbg(codec, "write CHNLSTART reg fail\n");
Ian Minett01ef7db2012-09-20 20:29:16 -07001884 return status;
1885 }
Takashi Iwai4e76a882014-02-25 12:21:03 +01001886 codec_dbg(codec, "-- dsp_dma_start() -- Complete ---------\n");
Ian Minett01ef7db2012-09-20 20:29:16 -07001887
1888 return status;
1889}
1890
Ian Minettd5c21b82012-09-20 20:29:18 -07001891/*
1892 * Stop the DSP DMA
1893 */
Ian Minett01ef7db2012-09-20 20:29:16 -07001894static int dsp_dma_stop(struct hda_codec *codec,
1895 unsigned int dma_chan, bool ovly)
1896{
1897 unsigned int reg = 0;
1898 int status = 0;
1899
Takashi Iwai4e76a882014-02-25 12:21:03 +01001900 codec_dbg(codec, "-- dsp_dma_stop() -- Begin ---------\n");
Ian Minett01ef7db2012-09-20 20:29:16 -07001901
1902 if (ovly) {
1903 status = chipio_read(codec,
1904 DSPDMAC_CHNLSTART_INST_OFFSET, &reg);
1905
1906 if (status < 0) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01001907 codec_dbg(codec, "read CHNLSTART reg fail\n");
Ian Minett01ef7db2012-09-20 20:29:16 -07001908 return status;
1909 }
Takashi Iwai4e76a882014-02-25 12:21:03 +01001910 codec_dbg(codec, "-- dsp_dma_stop() Read CHNLSTART\n");
Ian Minett01ef7db2012-09-20 20:29:16 -07001911 reg &= ~(DSPDMAC_CHNLSTART_EN_MASK |
1912 DSPDMAC_CHNLSTART_DIS_MASK);
1913 }
1914
1915 status = chipio_write(codec, DSPDMAC_CHNLSTART_INST_OFFSET,
1916 reg | (1 << (dma_chan + DSPDMAC_CHNLSTART_DIS_LOBIT)));
1917 if (status < 0) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01001918 codec_dbg(codec, "write CHNLSTART reg fail\n");
Ian Minett01ef7db2012-09-20 20:29:16 -07001919 return status;
1920 }
Takashi Iwai4e76a882014-02-25 12:21:03 +01001921 codec_dbg(codec, "-- dsp_dma_stop() -- Complete ---------\n");
Ian Minett01ef7db2012-09-20 20:29:16 -07001922
1923 return status;
1924}
1925
Ian Minettd5c21b82012-09-20 20:29:18 -07001926/**
1927 * Allocate router ports
1928 *
1929 * @codec: the HDA codec
1930 * @num_chans: number of channels in the stream
1931 * @ports_per_channel: number of ports per channel
1932 * @start_device: start device
1933 * @port_map: pointer to the port list to hold the allocated ports
1934 *
1935 * Returns zero or a negative error code.
1936 */
Ian Minett01ef7db2012-09-20 20:29:16 -07001937static int dsp_allocate_router_ports(struct hda_codec *codec,
1938 unsigned int num_chans,
1939 unsigned int ports_per_channel,
1940 unsigned int start_device,
1941 unsigned int *port_map)
1942{
1943 int status = 0;
1944 int res;
1945 u8 val;
1946
1947 status = chipio_send(codec, VENDOR_CHIPIO_STATUS, 0);
1948 if (status < 0)
1949 return status;
1950
1951 val = start_device << 6;
1952 val |= (ports_per_channel - 1) << 4;
1953 val |= num_chans - 1;
1954
1955 snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
1956 VENDOR_CHIPIO_PORT_ALLOC_CONFIG_SET,
1957 val);
1958
1959 snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
1960 VENDOR_CHIPIO_PORT_ALLOC_SET,
1961 MEM_CONNID_DSP);
1962
1963 status = chipio_send(codec, VENDOR_CHIPIO_STATUS, 0);
1964 if (status < 0)
1965 return status;
1966
1967 res = snd_hda_codec_read(codec, WIDGET_CHIP_CTRL, 0,
1968 VENDOR_CHIPIO_PORT_ALLOC_GET, 0);
1969
1970 *port_map = res;
1971
1972 return (res < 0) ? res : 0;
1973}
1974
Ian Minettd5c21b82012-09-20 20:29:18 -07001975/*
1976 * Free router ports
1977 */
Ian Minett01ef7db2012-09-20 20:29:16 -07001978static int dsp_free_router_ports(struct hda_codec *codec)
1979{
1980 int status = 0;
1981
1982 status = chipio_send(codec, VENDOR_CHIPIO_STATUS, 0);
1983 if (status < 0)
1984 return status;
1985
1986 snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
1987 VENDOR_CHIPIO_PORT_FREE_SET,
1988 MEM_CONNID_DSP);
1989
1990 status = chipio_send(codec, VENDOR_CHIPIO_STATUS, 0);
1991
1992 return status;
1993}
1994
Ian Minettd5c21b82012-09-20 20:29:18 -07001995/*
1996 * Allocate DSP ports for the download stream
1997 */
Ian Minett01ef7db2012-09-20 20:29:16 -07001998static int dsp_allocate_ports(struct hda_codec *codec,
1999 unsigned int num_chans,
2000 unsigned int rate_multi, unsigned int *port_map)
2001{
2002 int status;
2003
Takashi Iwai4e76a882014-02-25 12:21:03 +01002004 codec_dbg(codec, " dsp_allocate_ports() -- begin\n");
Ian Minett01ef7db2012-09-20 20:29:16 -07002005
2006 if ((rate_multi != 1) && (rate_multi != 2) && (rate_multi != 4)) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01002007 codec_dbg(codec, "bad rate multiple\n");
Ian Minett01ef7db2012-09-20 20:29:16 -07002008 return -EINVAL;
2009 }
2010
2011 status = dsp_allocate_router_ports(codec, num_chans,
2012 rate_multi, 0, port_map);
2013
Takashi Iwai4e76a882014-02-25 12:21:03 +01002014 codec_dbg(codec, " dsp_allocate_ports() -- complete\n");
Ian Minett01ef7db2012-09-20 20:29:16 -07002015
2016 return status;
2017}
2018
Ian Minett01ef7db2012-09-20 20:29:16 -07002019static int dsp_allocate_ports_format(struct hda_codec *codec,
2020 const unsigned short fmt,
2021 unsigned int *port_map)
2022{
2023 int status;
2024 unsigned int num_chans;
2025
2026 unsigned int sample_rate_div = ((get_hdafmt_rate(fmt) >> 0) & 3) + 1;
2027 unsigned int sample_rate_mul = ((get_hdafmt_rate(fmt) >> 3) & 3) + 1;
2028 unsigned int rate_multi = sample_rate_mul / sample_rate_div;
2029
2030 if ((rate_multi != 1) && (rate_multi != 2) && (rate_multi != 4)) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01002031 codec_dbg(codec, "bad rate multiple\n");
Ian Minett01ef7db2012-09-20 20:29:16 -07002032 return -EINVAL;
2033 }
2034
2035 num_chans = get_hdafmt_chs(fmt) + 1;
2036
2037 status = dsp_allocate_ports(codec, num_chans, rate_multi, port_map);
2038
2039 return status;
2040}
2041
2042/*
Ian Minettd5c21b82012-09-20 20:29:18 -07002043 * free DSP ports
2044 */
2045static int dsp_free_ports(struct hda_codec *codec)
2046{
2047 int status;
2048
Takashi Iwai4e76a882014-02-25 12:21:03 +01002049 codec_dbg(codec, " dsp_free_ports() -- begin\n");
Ian Minettd5c21b82012-09-20 20:29:18 -07002050
2051 status = dsp_free_router_ports(codec);
2052 if (status < 0) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01002053 codec_dbg(codec, "free router ports fail\n");
Ian Minettd5c21b82012-09-20 20:29:18 -07002054 return status;
2055 }
Takashi Iwai4e76a882014-02-25 12:21:03 +01002056 codec_dbg(codec, " dsp_free_ports() -- complete\n");
Ian Minettd5c21b82012-09-20 20:29:18 -07002057
2058 return status;
2059}
2060
2061/*
Ian Minett01ef7db2012-09-20 20:29:16 -07002062 * HDA DMA engine stuffs for DSP code download
2063 */
2064struct dma_engine {
2065 struct hda_codec *codec;
2066 unsigned short m_converter_format;
2067 struct snd_dma_buffer *dmab;
2068 unsigned int buf_size;
2069};
2070
2071
2072enum dma_state {
2073 DMA_STATE_STOP = 0,
2074 DMA_STATE_RUN = 1
2075};
2076
Takashi Iwai6194b992014-06-06 18:12:16 +02002077static int dma_convert_to_hda_format(struct hda_codec *codec,
Ian Minette97249d2012-09-20 20:29:21 -07002078 unsigned int sample_rate,
2079 unsigned short channels,
Ian Minett01ef7db2012-09-20 20:29:16 -07002080 unsigned short *hda_format)
2081{
2082 unsigned int format_val;
2083
Takashi Iwaib7d023e2015-04-16 08:19:06 +02002084 format_val = snd_hdac_calc_stream_format(sample_rate,
2085 channels, SNDRV_PCM_FORMAT_S32_LE, 32, 0);
Ian Minett01ef7db2012-09-20 20:29:16 -07002086
2087 if (hda_format)
2088 *hda_format = (unsigned short)format_val;
2089
2090 return 0;
2091}
2092
Ian Minettd5c21b82012-09-20 20:29:18 -07002093/*
2094 * Reset DMA for DSP download
2095 */
Ian Minett01ef7db2012-09-20 20:29:16 -07002096static int dma_reset(struct dma_engine *dma)
2097{
2098 struct hda_codec *codec = dma->codec;
2099 struct ca0132_spec *spec = codec->spec;
2100 int status;
2101
Takashi Iwaib3667bd2013-02-10 11:58:40 +01002102 if (dma->dmab->area)
Ian Minett01ef7db2012-09-20 20:29:16 -07002103 snd_hda_codec_load_dsp_cleanup(codec, dma->dmab);
2104
2105 status = snd_hda_codec_load_dsp_prepare(codec,
2106 dma->m_converter_format,
2107 dma->buf_size,
2108 dma->dmab);
2109 if (status < 0)
2110 return status;
2111 spec->dsp_stream_id = status;
2112 return 0;
2113}
2114
2115static int dma_set_state(struct dma_engine *dma, enum dma_state state)
2116{
2117 bool cmd;
2118
Ian Minett01ef7db2012-09-20 20:29:16 -07002119 switch (state) {
2120 case DMA_STATE_STOP:
2121 cmd = false;
2122 break;
2123 case DMA_STATE_RUN:
2124 cmd = true;
2125 break;
2126 default:
2127 return 0;
2128 }
2129
2130 snd_hda_codec_load_dsp_trigger(dma->codec, cmd);
2131 return 0;
2132}
2133
2134static unsigned int dma_get_buffer_size(struct dma_engine *dma)
2135{
2136 return dma->dmab->bytes;
2137}
2138
2139static unsigned char *dma_get_buffer_addr(struct dma_engine *dma)
2140{
2141 return dma->dmab->area;
2142}
2143
2144static int dma_xfer(struct dma_engine *dma,
2145 const unsigned int *data,
2146 unsigned int count)
2147{
2148 memcpy(dma->dmab->area, data, count);
2149 return 0;
2150}
2151
2152static void dma_get_converter_format(
2153 struct dma_engine *dma,
2154 unsigned short *format)
2155{
2156 if (format)
2157 *format = dma->m_converter_format;
2158}
2159
2160static unsigned int dma_get_stream_id(struct dma_engine *dma)
2161{
2162 struct ca0132_spec *spec = dma->codec->spec;
2163
2164 return spec->dsp_stream_id;
2165}
2166
2167struct dsp_image_seg {
2168 u32 magic;
2169 u32 chip_addr;
2170 u32 count;
2171 u32 data[0];
2172};
2173
2174static const u32 g_magic_value = 0x4c46584d;
2175static const u32 g_chip_addr_magic_value = 0xFFFFFF01;
2176
2177static bool is_valid(const struct dsp_image_seg *p)
2178{
2179 return p->magic == g_magic_value;
2180}
2181
2182static bool is_hci_prog_list_seg(const struct dsp_image_seg *p)
2183{
2184 return g_chip_addr_magic_value == p->chip_addr;
2185}
2186
2187static bool is_last(const struct dsp_image_seg *p)
2188{
2189 return p->count == 0;
2190}
2191
2192static size_t dsp_sizeof(const struct dsp_image_seg *p)
2193{
2194 return sizeof(*p) + p->count*sizeof(u32);
2195}
2196
2197static const struct dsp_image_seg *get_next_seg_ptr(
2198 const struct dsp_image_seg *p)
2199{
2200 return (struct dsp_image_seg *)((unsigned char *)(p) + dsp_sizeof(p));
2201}
2202
2203/*
2204 * CA0132 chip DSP transfer stuffs. For DSP download.
2205 */
Takashi Iwai8ae3124b2013-01-15 17:43:09 +01002206#define INVALID_DMA_CHANNEL (~0U)
Ian Minett01ef7db2012-09-20 20:29:16 -07002207
Ian Minettd5c21b82012-09-20 20:29:18 -07002208/*
2209 * Program a list of address/data pairs via the ChipIO widget.
2210 * The segment data is in the format of successive pairs of words.
2211 * These are repeated as indicated by the segment's count field.
2212 */
Ian Minett01ef7db2012-09-20 20:29:16 -07002213static int dspxfr_hci_write(struct hda_codec *codec,
2214 const struct dsp_image_seg *fls)
2215{
2216 int status;
2217 const u32 *data;
2218 unsigned int count;
2219
2220 if (fls == NULL || fls->chip_addr != g_chip_addr_magic_value) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01002221 codec_dbg(codec, "hci_write invalid params\n");
Ian Minett01ef7db2012-09-20 20:29:16 -07002222 return -EINVAL;
2223 }
2224
2225 count = fls->count;
2226 data = (u32 *)(fls->data);
2227 while (count >= 2) {
2228 status = chipio_write(codec, data[0], data[1]);
2229 if (status < 0) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01002230 codec_dbg(codec, "hci_write chipio failed\n");
Ian Minett01ef7db2012-09-20 20:29:16 -07002231 return status;
2232 }
2233 count -= 2;
2234 data += 2;
2235 }
2236 return 0;
2237}
2238
Ian Minettd5c21b82012-09-20 20:29:18 -07002239/**
2240 * Write a block of data into DSP code or data RAM using pre-allocated
2241 * DMA engine.
2242 *
2243 * @codec: the HDA codec
2244 * @fls: pointer to a fast load image
2245 * @reloc: Relocation address for loading single-segment overlays, or 0 for
2246 * no relocation
2247 * @dma_engine: pointer to DMA engine to be used for DSP download
2248 * @dma_chan: The number of DMA channels used for DSP download
2249 * @port_map_mask: port mapping
2250 * @ovly: TRUE if overlay format is required
2251 *
2252 * Returns zero or a negative error code.
2253 */
Ian Minett01ef7db2012-09-20 20:29:16 -07002254static int dspxfr_one_seg(struct hda_codec *codec,
2255 const struct dsp_image_seg *fls,
2256 unsigned int reloc,
2257 struct dma_engine *dma_engine,
2258 unsigned int dma_chan,
2259 unsigned int port_map_mask,
2260 bool ovly)
2261{
Ian Minett406261c2012-12-20 18:53:41 -08002262 int status = 0;
Ian Minett01ef7db2012-09-20 20:29:16 -07002263 bool comm_dma_setup_done = false;
2264 const unsigned int *data;
2265 unsigned int chip_addx;
2266 unsigned int words_to_write;
2267 unsigned int buffer_size_words;
2268 unsigned char *buffer_addx;
2269 unsigned short hda_format;
2270 unsigned int sample_rate_div;
2271 unsigned int sample_rate_mul;
2272 unsigned int num_chans;
2273 unsigned int hda_frame_size_words;
2274 unsigned int remainder_words;
2275 const u32 *data_remainder;
2276 u32 chip_addx_remainder;
2277 unsigned int run_size_words;
2278 const struct dsp_image_seg *hci_write = NULL;
Ian Minett6d675302013-02-08 18:31:43 -08002279 unsigned long timeout;
2280 bool dma_active;
Ian Minett01ef7db2012-09-20 20:29:16 -07002281
2282 if (fls == NULL)
2283 return -EINVAL;
2284 if (is_hci_prog_list_seg(fls)) {
2285 hci_write = fls;
2286 fls = get_next_seg_ptr(fls);
2287 }
2288
2289 if (hci_write && (!fls || is_last(fls))) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01002290 codec_dbg(codec, "hci_write\n");
Ian Minett01ef7db2012-09-20 20:29:16 -07002291 return dspxfr_hci_write(codec, hci_write);
2292 }
2293
2294 if (fls == NULL || dma_engine == NULL || port_map_mask == 0) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01002295 codec_dbg(codec, "Invalid Params\n");
Ian Minett01ef7db2012-09-20 20:29:16 -07002296 return -EINVAL;
2297 }
2298
2299 data = fls->data;
2300 chip_addx = fls->chip_addr,
2301 words_to_write = fls->count;
2302
2303 if (!words_to_write)
2304 return hci_write ? dspxfr_hci_write(codec, hci_write) : 0;
2305 if (reloc)
2306 chip_addx = (chip_addx & (0xFFFF0000 << 2)) + (reloc << 2);
2307
2308 if (!UC_RANGE(chip_addx, words_to_write) &&
2309 !X_RANGE_ALL(chip_addx, words_to_write) &&
2310 !Y_RANGE_ALL(chip_addx, words_to_write)) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01002311 codec_dbg(codec, "Invalid chip_addx Params\n");
Ian Minett01ef7db2012-09-20 20:29:16 -07002312 return -EINVAL;
2313 }
2314
2315 buffer_size_words = (unsigned int)dma_get_buffer_size(dma_engine) /
2316 sizeof(u32);
2317
2318 buffer_addx = dma_get_buffer_addr(dma_engine);
2319
2320 if (buffer_addx == NULL) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01002321 codec_dbg(codec, "dma_engine buffer NULL\n");
Ian Minett01ef7db2012-09-20 20:29:16 -07002322 return -EINVAL;
2323 }
2324
2325 dma_get_converter_format(dma_engine, &hda_format);
2326 sample_rate_div = ((get_hdafmt_rate(hda_format) >> 0) & 3) + 1;
2327 sample_rate_mul = ((get_hdafmt_rate(hda_format) >> 3) & 3) + 1;
2328 num_chans = get_hdafmt_chs(hda_format) + 1;
2329
2330 hda_frame_size_words = ((sample_rate_div == 0) ? 0 :
2331 (num_chans * sample_rate_mul / sample_rate_div));
2332
Xi Wang3bc085a2013-03-07 00:13:51 -05002333 if (hda_frame_size_words == 0) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01002334 codec_dbg(codec, "frmsz zero\n");
Xi Wang3bc085a2013-03-07 00:13:51 -05002335 return -EINVAL;
2336 }
2337
Ian Minett01ef7db2012-09-20 20:29:16 -07002338 buffer_size_words = min(buffer_size_words,
2339 (unsigned int)(UC_RANGE(chip_addx, 1) ?
2340 65536 : 32768));
2341 buffer_size_words -= buffer_size_words % hda_frame_size_words;
Takashi Iwai4e76a882014-02-25 12:21:03 +01002342 codec_dbg(codec,
Ian Minett01ef7db2012-09-20 20:29:16 -07002343 "chpadr=0x%08x frmsz=%u nchan=%u "
2344 "rate_mul=%u div=%u bufsz=%u\n",
2345 chip_addx, hda_frame_size_words, num_chans,
2346 sample_rate_mul, sample_rate_div, buffer_size_words);
2347
Xi Wang3bc085a2013-03-07 00:13:51 -05002348 if (buffer_size_words < hda_frame_size_words) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01002349 codec_dbg(codec, "dspxfr_one_seg:failed\n");
Ian Minett01ef7db2012-09-20 20:29:16 -07002350 return -EINVAL;
2351 }
2352
2353 remainder_words = words_to_write % hda_frame_size_words;
2354 data_remainder = data;
2355 chip_addx_remainder = chip_addx;
2356
2357 data += remainder_words;
2358 chip_addx += remainder_words*sizeof(u32);
2359 words_to_write -= remainder_words;
2360
2361 while (words_to_write != 0) {
2362 run_size_words = min(buffer_size_words, words_to_write);
Takashi Iwai4e76a882014-02-25 12:21:03 +01002363 codec_dbg(codec, "dspxfr (seg loop)cnt=%u rs=%u remainder=%u\n",
Ian Minett01ef7db2012-09-20 20:29:16 -07002364 words_to_write, run_size_words, remainder_words);
2365 dma_xfer(dma_engine, data, run_size_words*sizeof(u32));
2366 if (!comm_dma_setup_done) {
2367 status = dsp_dma_stop(codec, dma_chan, ovly);
2368 if (status < 0)
Takashi Iwai425a7882013-01-15 17:41:21 +01002369 return status;
Ian Minett01ef7db2012-09-20 20:29:16 -07002370 status = dsp_dma_setup_common(codec, chip_addx,
2371 dma_chan, port_map_mask, ovly);
2372 if (status < 0)
2373 return status;
2374 comm_dma_setup_done = true;
2375 }
2376
2377 status = dsp_dma_setup(codec, chip_addx,
2378 run_size_words, dma_chan);
2379 if (status < 0)
2380 return status;
2381 status = dsp_dma_start(codec, dma_chan, ovly);
2382 if (status < 0)
2383 return status;
2384 if (!dsp_is_dma_active(codec, dma_chan)) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01002385 codec_dbg(codec, "dspxfr:DMA did not start\n");
Ian Minett01ef7db2012-09-20 20:29:16 -07002386 return -EIO;
2387 }
2388 status = dma_set_state(dma_engine, DMA_STATE_RUN);
2389 if (status < 0)
2390 return status;
2391 if (remainder_words != 0) {
2392 status = chipio_write_multiple(codec,
2393 chip_addx_remainder,
2394 data_remainder,
2395 remainder_words);
Takashi Iwaib3667bd2013-02-10 11:58:40 +01002396 if (status < 0)
2397 return status;
Ian Minett01ef7db2012-09-20 20:29:16 -07002398 remainder_words = 0;
2399 }
2400 if (hci_write) {
2401 status = dspxfr_hci_write(codec, hci_write);
Takashi Iwaib3667bd2013-02-10 11:58:40 +01002402 if (status < 0)
2403 return status;
Ian Minett01ef7db2012-09-20 20:29:16 -07002404 hci_write = NULL;
2405 }
Ian Minett6d675302013-02-08 18:31:43 -08002406
2407 timeout = jiffies + msecs_to_jiffies(2000);
2408 do {
2409 dma_active = dsp_is_dma_active(codec, dma_chan);
2410 if (!dma_active)
Ian Minett01ef7db2012-09-20 20:29:16 -07002411 break;
Ian Minett6d675302013-02-08 18:31:43 -08002412 msleep(20);
2413 } while (time_before(jiffies, timeout));
2414 if (dma_active)
2415 break;
2416
Takashi Iwai4e76a882014-02-25 12:21:03 +01002417 codec_dbg(codec, "+++++ DMA complete\n");
Ian Minett01ef7db2012-09-20 20:29:16 -07002418 dma_set_state(dma_engine, DMA_STATE_STOP);
Takashi Iwaib3667bd2013-02-10 11:58:40 +01002419 status = dma_reset(dma_engine);
Ian Minett01ef7db2012-09-20 20:29:16 -07002420
2421 if (status < 0)
2422 return status;
2423
2424 data += run_size_words;
2425 chip_addx += run_size_words*sizeof(u32);
2426 words_to_write -= run_size_words;
2427 }
2428
2429 if (remainder_words != 0) {
2430 status = chipio_write_multiple(codec, chip_addx_remainder,
2431 data_remainder, remainder_words);
2432 }
2433
2434 return status;
2435}
2436
Ian Minettd5c21b82012-09-20 20:29:18 -07002437/**
2438 * Write the entire DSP image of a DSP code/data overlay to DSP memories
2439 *
2440 * @codec: the HDA codec
2441 * @fls_data: pointer to a fast load image
2442 * @reloc: Relocation address for loading single-segment overlays, or 0 for
2443 * no relocation
Ian Minette97249d2012-09-20 20:29:21 -07002444 * @sample_rate: sampling rate of the stream used for DSP download
Takashi Iwaie60b2c72014-11-10 16:47:26 +01002445 * @channels: channels of the stream used for DSP download
Ian Minettd5c21b82012-09-20 20:29:18 -07002446 * @ovly: TRUE if overlay format is required
2447 *
2448 * Returns zero or a negative error code.
2449 */
Ian Minett01ef7db2012-09-20 20:29:16 -07002450static int dspxfr_image(struct hda_codec *codec,
2451 const struct dsp_image_seg *fls_data,
Ian Minette97249d2012-09-20 20:29:21 -07002452 unsigned int reloc,
2453 unsigned int sample_rate,
2454 unsigned short channels,
Ian Minett01ef7db2012-09-20 20:29:16 -07002455 bool ovly)
2456{
2457 struct ca0132_spec *spec = codec->spec;
2458 int status;
2459 unsigned short hda_format = 0;
2460 unsigned int response;
2461 unsigned char stream_id = 0;
2462 struct dma_engine *dma_engine;
2463 unsigned int dma_chan;
2464 unsigned int port_map_mask;
2465
2466 if (fls_data == NULL)
2467 return -EINVAL;
2468
2469 dma_engine = kzalloc(sizeof(*dma_engine), GFP_KERNEL);
Takashi Iwai549e8292013-01-15 17:42:15 +01002470 if (!dma_engine)
2471 return -ENOMEM;
Ian Minett01ef7db2012-09-20 20:29:16 -07002472
2473 dma_engine->dmab = kzalloc(sizeof(*dma_engine->dmab), GFP_KERNEL);
2474 if (!dma_engine->dmab) {
Takashi Iwai549e8292013-01-15 17:42:15 +01002475 kfree(dma_engine);
2476 return -ENOMEM;
Ian Minett01ef7db2012-09-20 20:29:16 -07002477 }
2478
2479 dma_engine->codec = codec;
Takashi Iwai6194b992014-06-06 18:12:16 +02002480 dma_convert_to_hda_format(codec, sample_rate, channels, &hda_format);
Ian Minett01ef7db2012-09-20 20:29:16 -07002481 dma_engine->m_converter_format = hda_format;
2482 dma_engine->buf_size = (ovly ? DSP_DMA_WRITE_BUFLEN_OVLY :
2483 DSP_DMA_WRITE_BUFLEN_INIT) * 2;
2484
Takashi Iwai8ae3124b2013-01-15 17:43:09 +01002485 dma_chan = ovly ? INVALID_DMA_CHANNEL : 0;
Ian Minett01ef7db2012-09-20 20:29:16 -07002486
2487 status = codec_set_converter_format(codec, WIDGET_CHIP_CTRL,
2488 hda_format, &response);
2489
2490 if (status < 0) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01002491 codec_dbg(codec, "set converter format fail\n");
Ian Minett01ef7db2012-09-20 20:29:16 -07002492 goto exit;
2493 }
2494
2495 status = snd_hda_codec_load_dsp_prepare(codec,
2496 dma_engine->m_converter_format,
2497 dma_engine->buf_size,
2498 dma_engine->dmab);
2499 if (status < 0)
2500 goto exit;
2501 spec->dsp_stream_id = status;
2502
2503 if (ovly) {
2504 status = dspio_alloc_dma_chan(codec, &dma_chan);
2505 if (status < 0) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01002506 codec_dbg(codec, "alloc dmachan fail\n");
Takashi Iwai8ae3124b2013-01-15 17:43:09 +01002507 dma_chan = INVALID_DMA_CHANNEL;
Ian Minett01ef7db2012-09-20 20:29:16 -07002508 goto exit;
2509 }
2510 }
2511
2512 port_map_mask = 0;
2513 status = dsp_allocate_ports_format(codec, hda_format,
2514 &port_map_mask);
2515 if (status < 0) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01002516 codec_dbg(codec, "alloc ports fail\n");
Ian Minett01ef7db2012-09-20 20:29:16 -07002517 goto exit;
2518 }
2519
2520 stream_id = dma_get_stream_id(dma_engine);
2521 status = codec_set_converter_stream_channel(codec,
2522 WIDGET_CHIP_CTRL, stream_id, 0, &response);
2523 if (status < 0) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01002524 codec_dbg(codec, "set stream chan fail\n");
Ian Minett01ef7db2012-09-20 20:29:16 -07002525 goto exit;
2526 }
2527
2528 while ((fls_data != NULL) && !is_last(fls_data)) {
2529 if (!is_valid(fls_data)) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01002530 codec_dbg(codec, "FLS check fail\n");
Ian Minett01ef7db2012-09-20 20:29:16 -07002531 status = -EINVAL;
2532 goto exit;
2533 }
2534 status = dspxfr_one_seg(codec, fls_data, reloc,
2535 dma_engine, dma_chan,
2536 port_map_mask, ovly);
2537 if (status < 0)
2538 break;
2539
2540 if (is_hci_prog_list_seg(fls_data))
2541 fls_data = get_next_seg_ptr(fls_data);
2542
2543 if ((fls_data != NULL) && !is_last(fls_data))
2544 fls_data = get_next_seg_ptr(fls_data);
2545 }
2546
2547 if (port_map_mask != 0)
2548 status = dsp_free_ports(codec);
2549
2550 if (status < 0)
2551 goto exit;
2552
2553 status = codec_set_converter_stream_channel(codec,
2554 WIDGET_CHIP_CTRL, 0, 0, &response);
2555
2556exit:
2557 if (ovly && (dma_chan != INVALID_DMA_CHANNEL))
2558 dspio_free_dma_chan(codec, dma_chan);
2559
Takashi Iwaib3667bd2013-02-10 11:58:40 +01002560 if (dma_engine->dmab->area)
Ian Minett01ef7db2012-09-20 20:29:16 -07002561 snd_hda_codec_load_dsp_cleanup(codec, dma_engine->dmab);
2562 kfree(dma_engine->dmab);
2563 kfree(dma_engine);
2564
2565 return status;
2566}
2567
2568/*
2569 * CA0132 DSP download stuffs.
2570 */
2571static void dspload_post_setup(struct hda_codec *codec)
2572{
Takashi Iwai4e76a882014-02-25 12:21:03 +01002573 codec_dbg(codec, "---- dspload_post_setup ------\n");
Ian Minett01ef7db2012-09-20 20:29:16 -07002574
2575 /*set DSP speaker to 2.0 configuration*/
2576 chipio_write(codec, XRAM_XRAM_INST_OFFSET(0x18), 0x08080080);
2577 chipio_write(codec, XRAM_XRAM_INST_OFFSET(0x19), 0x3f800000);
2578
2579 /*update write pointer*/
2580 chipio_write(codec, XRAM_XRAM_INST_OFFSET(0x29), 0x00000002);
2581}
2582
Ian Minettd5c21b82012-09-20 20:29:18 -07002583/**
Takashi Iwaie60b2c72014-11-10 16:47:26 +01002584 * dspload_image - Download DSP from a DSP Image Fast Load structure.
Ian Minettd5c21b82012-09-20 20:29:18 -07002585 *
2586 * @codec: the HDA codec
2587 * @fls: pointer to a fast load image
2588 * @ovly: TRUE if overlay format is required
2589 * @reloc: Relocation address for loading single-segment overlays, or 0 for
2590 * no relocation
2591 * @autostart: TRUE if DSP starts after loading; ignored if ovly is TRUE
2592 * @router_chans: number of audio router channels to be allocated (0 means use
2593 * internal defaults; max is 32)
2594 *
Takashi Iwaie60b2c72014-11-10 16:47:26 +01002595 * Download DSP from a DSP Image Fast Load structure. This structure is a
2596 * linear, non-constant sized element array of structures, each of which
2597 * contain the count of the data to be loaded, the data itself, and the
2598 * corresponding starting chip address of the starting data location.
Ian Minettd5c21b82012-09-20 20:29:18 -07002599 * Returns zero or a negative error code.
2600 */
Ian Minett01ef7db2012-09-20 20:29:16 -07002601static int dspload_image(struct hda_codec *codec,
2602 const struct dsp_image_seg *fls,
2603 bool ovly,
2604 unsigned int reloc,
2605 bool autostart,
2606 int router_chans)
2607{
2608 int status = 0;
Ian Minette97249d2012-09-20 20:29:21 -07002609 unsigned int sample_rate;
2610 unsigned short channels;
Ian Minett01ef7db2012-09-20 20:29:16 -07002611
Takashi Iwai4e76a882014-02-25 12:21:03 +01002612 codec_dbg(codec, "---- dspload_image begin ------\n");
Ian Minett01ef7db2012-09-20 20:29:16 -07002613 if (router_chans == 0) {
2614 if (!ovly)
2615 router_chans = DMA_TRANSFER_FRAME_SIZE_NWORDS;
2616 else
2617 router_chans = DMA_OVERLAY_FRAME_SIZE_NWORDS;
2618 }
2619
Ian Minette97249d2012-09-20 20:29:21 -07002620 sample_rate = 48000;
2621 channels = (unsigned short)router_chans;
Ian Minett01ef7db2012-09-20 20:29:16 -07002622
Ian Minette97249d2012-09-20 20:29:21 -07002623 while (channels > 16) {
2624 sample_rate *= 2;
2625 channels /= 2;
Ian Minett01ef7db2012-09-20 20:29:16 -07002626 }
2627
Ian Minett01ef7db2012-09-20 20:29:16 -07002628 do {
Takashi Iwai4e76a882014-02-25 12:21:03 +01002629 codec_dbg(codec, "Ready to program DMA\n");
Ian Minett01ef7db2012-09-20 20:29:16 -07002630 if (!ovly)
2631 status = dsp_reset(codec);
2632
2633 if (status < 0)
2634 break;
2635
Takashi Iwai4e76a882014-02-25 12:21:03 +01002636 codec_dbg(codec, "dsp_reset() complete\n");
Ian Minette97249d2012-09-20 20:29:21 -07002637 status = dspxfr_image(codec, fls, reloc, sample_rate, channels,
2638 ovly);
Ian Minett01ef7db2012-09-20 20:29:16 -07002639
2640 if (status < 0)
2641 break;
2642
Takashi Iwai4e76a882014-02-25 12:21:03 +01002643 codec_dbg(codec, "dspxfr_image() complete\n");
Ian Minett01ef7db2012-09-20 20:29:16 -07002644 if (autostart && !ovly) {
2645 dspload_post_setup(codec);
2646 status = dsp_set_run_state(codec);
2647 }
2648
Takashi Iwai4e76a882014-02-25 12:21:03 +01002649 codec_dbg(codec, "LOAD FINISHED\n");
Ian Minett01ef7db2012-09-20 20:29:16 -07002650 } while (0);
2651
2652 return status;
2653}
2654
Takashi Iwaif6644172013-02-11 14:18:29 +01002655#ifdef CONFIG_SND_HDA_CODEC_CA0132_DSP
Ian Minett01ef7db2012-09-20 20:29:16 -07002656static bool dspload_is_loaded(struct hda_codec *codec)
2657{
2658 unsigned int data = 0;
2659 int status = 0;
2660
2661 status = chipio_read(codec, 0x40004, &data);
2662 if ((status < 0) || (data != 1))
2663 return false;
2664
2665 return true;
2666}
Takashi Iwaif6644172013-02-11 14:18:29 +01002667#else
2668#define dspload_is_loaded(codec) false
2669#endif
Ian Minett01ef7db2012-09-20 20:29:16 -07002670
2671static bool dspload_wait_loaded(struct hda_codec *codec)
2672{
Ian Minett6d675302013-02-08 18:31:43 -08002673 unsigned long timeout = jiffies + msecs_to_jiffies(2000);
Ian Minett01ef7db2012-09-20 20:29:16 -07002674
2675 do {
Ian Minett01ef7db2012-09-20 20:29:16 -07002676 if (dspload_is_loaded(codec)) {
Takashi Iwaid9684bb2015-10-26 16:54:16 +01002677 codec_info(codec, "ca0132 DSP downloaded and running\n");
Ian Minett01ef7db2012-09-20 20:29:16 -07002678 return true;
2679 }
Ian Minett6d675302013-02-08 18:31:43 -08002680 msleep(20);
2681 } while (time_before(jiffies, timeout));
Ian Minett01ef7db2012-09-20 20:29:16 -07002682
Takashi Iwaid9684bb2015-10-26 16:54:16 +01002683 codec_err(codec, "ca0132 failed to download DSP\n");
Ian Minett01ef7db2012-09-20 20:29:16 -07002684 return false;
2685}
2686
Ian Minett5aaca442012-12-20 18:53:34 -08002687/*
Ian Minett825315b2012-12-20 18:53:36 -08002688 * PCM callbacks
2689 */
Ian Minett95c6e9c2011-06-15 15:35:17 -07002690static int ca0132_playback_pcm_prepare(struct hda_pcm_stream *hinfo,
2691 struct hda_codec *codec,
2692 unsigned int stream_tag,
2693 unsigned int format,
2694 struct snd_pcm_substream *substream)
2695{
2696 struct ca0132_spec *spec = codec->spec;
Ian Minett825315b2012-12-20 18:53:36 -08002697
Hsin-Yu Chao28fba952014-02-19 14:27:07 +08002698 snd_hda_codec_setup_stream(codec, spec->dacs[0], stream_tag, 0, format);
Ian Minett825315b2012-12-20 18:53:36 -08002699
2700 return 0;
Ian Minett95c6e9c2011-06-15 15:35:17 -07002701}
2702
2703static int ca0132_playback_pcm_cleanup(struct hda_pcm_stream *hinfo,
2704 struct hda_codec *codec,
2705 struct snd_pcm_substream *substream)
2706{
2707 struct ca0132_spec *spec = codec->spec;
Ian Minett825315b2012-12-20 18:53:36 -08002708
2709 if (spec->dsp_state == DSP_DOWNLOADING)
2710 return 0;
2711
2712 /*If Playback effects are on, allow stream some time to flush
2713 *effects tail*/
2714 if (spec->effects_switch[PLAY_ENHANCEMENT - EFFECT_START_NID])
2715 msleep(50);
2716
Hsin-Yu Chao28fba952014-02-19 14:27:07 +08002717 snd_hda_codec_cleanup_stream(codec, spec->dacs[0]);
Ian Minett825315b2012-12-20 18:53:36 -08002718
2719 return 0;
Ian Minett95c6e9c2011-06-15 15:35:17 -07002720}
2721
Dylan Reide8412ca2013-04-04 13:55:09 -07002722static unsigned int ca0132_playback_pcm_delay(struct hda_pcm_stream *info,
2723 struct hda_codec *codec,
2724 struct snd_pcm_substream *substream)
2725{
2726 struct ca0132_spec *spec = codec->spec;
2727 unsigned int latency = DSP_PLAYBACK_INIT_LATENCY;
2728 struct snd_pcm_runtime *runtime = substream->runtime;
2729
2730 if (spec->dsp_state != DSP_DOWNLOADED)
2731 return 0;
2732
2733 /* Add latency if playback enhancement and either effect is enabled. */
2734 if (spec->effects_switch[PLAY_ENHANCEMENT - EFFECT_START_NID]) {
2735 if ((spec->effects_switch[SURROUND - EFFECT_START_NID]) ||
2736 (spec->effects_switch[DIALOG_PLUS - EFFECT_START_NID]))
2737 latency += DSP_PLAY_ENHANCEMENT_LATENCY;
2738 }
2739
2740 /* Applying Speaker EQ adds latency as well. */
2741 if (spec->cur_out_type == SPEAKER_OUT)
2742 latency += DSP_SPEAKER_OUT_LATENCY;
2743
2744 return (latency * runtime->rate) / 1000;
2745}
2746
Ian Minett95c6e9c2011-06-15 15:35:17 -07002747/*
2748 * Digital out
2749 */
Takashi Iwai27ebeb02012-08-08 17:20:18 +02002750static int ca0132_dig_playback_pcm_open(struct hda_pcm_stream *hinfo,
2751 struct hda_codec *codec,
2752 struct snd_pcm_substream *substream)
2753{
2754 struct ca0132_spec *spec = codec->spec;
2755 return snd_hda_multi_out_dig_open(codec, &spec->multiout);
2756}
2757
Ian Minett95c6e9c2011-06-15 15:35:17 -07002758static int ca0132_dig_playback_pcm_prepare(struct hda_pcm_stream *hinfo,
2759 struct hda_codec *codec,
2760 unsigned int stream_tag,
2761 unsigned int format,
2762 struct snd_pcm_substream *substream)
2763{
2764 struct ca0132_spec *spec = codec->spec;
Takashi Iwai27ebeb02012-08-08 17:20:18 +02002765 return snd_hda_multi_out_dig_prepare(codec, &spec->multiout,
2766 stream_tag, format, substream);
Ian Minett95c6e9c2011-06-15 15:35:17 -07002767}
2768
2769static int ca0132_dig_playback_pcm_cleanup(struct hda_pcm_stream *hinfo,
2770 struct hda_codec *codec,
2771 struct snd_pcm_substream *substream)
2772{
2773 struct ca0132_spec *spec = codec->spec;
Takashi Iwai27ebeb02012-08-08 17:20:18 +02002774 return snd_hda_multi_out_dig_cleanup(codec, &spec->multiout);
Ian Minett95c6e9c2011-06-15 15:35:17 -07002775}
2776
Takashi Iwai27ebeb02012-08-08 17:20:18 +02002777static int ca0132_dig_playback_pcm_close(struct hda_pcm_stream *hinfo,
2778 struct hda_codec *codec,
2779 struct snd_pcm_substream *substream)
Ian Minett95c6e9c2011-06-15 15:35:17 -07002780{
2781 struct ca0132_spec *spec = codec->spec;
Takashi Iwai27ebeb02012-08-08 17:20:18 +02002782 return snd_hda_multi_out_dig_close(codec, &spec->multiout);
Ian Minett95c6e9c2011-06-15 15:35:17 -07002783}
2784
2785/*
Ian Minett825315b2012-12-20 18:53:36 -08002786 * Analog capture
2787 */
2788static int ca0132_capture_pcm_prepare(struct hda_pcm_stream *hinfo,
2789 struct hda_codec *codec,
2790 unsigned int stream_tag,
2791 unsigned int format,
2792 struct snd_pcm_substream *substream)
2793{
Hsin-Yu Chao13c12db2014-02-19 14:30:35 +08002794 snd_hda_codec_setup_stream(codec, hinfo->nid,
Hsin-Yu Chao28fba952014-02-19 14:27:07 +08002795 stream_tag, 0, format);
Ian Minett825315b2012-12-20 18:53:36 -08002796
2797 return 0;
2798}
2799
2800static int ca0132_capture_pcm_cleanup(struct hda_pcm_stream *hinfo,
2801 struct hda_codec *codec,
2802 struct snd_pcm_substream *substream)
2803{
2804 struct ca0132_spec *spec = codec->spec;
2805
2806 if (spec->dsp_state == DSP_DOWNLOADING)
2807 return 0;
2808
Hsin-Yu Chao28fba952014-02-19 14:27:07 +08002809 snd_hda_codec_cleanup_stream(codec, hinfo->nid);
Ian Minett825315b2012-12-20 18:53:36 -08002810 return 0;
2811}
2812
Dylan Reide8412ca2013-04-04 13:55:09 -07002813static unsigned int ca0132_capture_pcm_delay(struct hda_pcm_stream *info,
2814 struct hda_codec *codec,
2815 struct snd_pcm_substream *substream)
2816{
2817 struct ca0132_spec *spec = codec->spec;
2818 unsigned int latency = DSP_CAPTURE_INIT_LATENCY;
2819 struct snd_pcm_runtime *runtime = substream->runtime;
2820
2821 if (spec->dsp_state != DSP_DOWNLOADED)
2822 return 0;
2823
2824 if (spec->effects_switch[CRYSTAL_VOICE - EFFECT_START_NID])
2825 latency += DSP_CRYSTAL_VOICE_LATENCY;
2826
2827 return (latency * runtime->rate) / 1000;
2828}
2829
Ian Minette90f29e2012-12-20 18:53:39 -08002830/*
2831 * Controls stuffs.
2832 */
2833
2834/*
2835 * Mixer controls helpers.
2836 */
2837#define CA0132_CODEC_VOL_MONO(xname, nid, channel, dir) \
2838 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2839 .name = xname, \
2840 .subdevice = HDA_SUBDEV_AMP_FLAG, \
2841 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE | \
2842 SNDRV_CTL_ELEM_ACCESS_TLV_READ | \
2843 SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK, \
2844 .info = ca0132_volume_info, \
2845 .get = ca0132_volume_get, \
2846 .put = ca0132_volume_put, \
2847 .tlv = { .c = ca0132_volume_tlv }, \
2848 .private_value = HDA_COMPOSE_AMP_VAL(nid, channel, 0, dir) }
2849
2850#define CA0132_CODEC_MUTE_MONO(xname, nid, channel, dir) \
2851 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2852 .name = xname, \
2853 .subdevice = HDA_SUBDEV_AMP_FLAG, \
2854 .info = snd_hda_mixer_amp_switch_info, \
2855 .get = ca0132_switch_get, \
2856 .put = ca0132_switch_put, \
2857 .private_value = HDA_COMPOSE_AMP_VAL(nid, channel, 0, dir) }
2858
2859/* stereo */
2860#define CA0132_CODEC_VOL(xname, nid, dir) \
2861 CA0132_CODEC_VOL_MONO(xname, nid, 3, dir)
2862#define CA0132_CODEC_MUTE(xname, nid, dir) \
2863 CA0132_CODEC_MUTE_MONO(xname, nid, 3, dir)
2864
Ian Minett44f0c972012-12-20 18:53:38 -08002865/* The followings are for tuning of products */
2866#ifdef ENABLE_TUNING_CONTROLS
2867
2868static unsigned int voice_focus_vals_lookup[] = {
28690x41A00000, 0x41A80000, 0x41B00000, 0x41B80000, 0x41C00000, 0x41C80000,
28700x41D00000, 0x41D80000, 0x41E00000, 0x41E80000, 0x41F00000, 0x41F80000,
28710x42000000, 0x42040000, 0x42080000, 0x420C0000, 0x42100000, 0x42140000,
28720x42180000, 0x421C0000, 0x42200000, 0x42240000, 0x42280000, 0x422C0000,
28730x42300000, 0x42340000, 0x42380000, 0x423C0000, 0x42400000, 0x42440000,
28740x42480000, 0x424C0000, 0x42500000, 0x42540000, 0x42580000, 0x425C0000,
28750x42600000, 0x42640000, 0x42680000, 0x426C0000, 0x42700000, 0x42740000,
28760x42780000, 0x427C0000, 0x42800000, 0x42820000, 0x42840000, 0x42860000,
28770x42880000, 0x428A0000, 0x428C0000, 0x428E0000, 0x42900000, 0x42920000,
28780x42940000, 0x42960000, 0x42980000, 0x429A0000, 0x429C0000, 0x429E0000,
28790x42A00000, 0x42A20000, 0x42A40000, 0x42A60000, 0x42A80000, 0x42AA0000,
28800x42AC0000, 0x42AE0000, 0x42B00000, 0x42B20000, 0x42B40000, 0x42B60000,
28810x42B80000, 0x42BA0000, 0x42BC0000, 0x42BE0000, 0x42C00000, 0x42C20000,
28820x42C40000, 0x42C60000, 0x42C80000, 0x42CA0000, 0x42CC0000, 0x42CE0000,
28830x42D00000, 0x42D20000, 0x42D40000, 0x42D60000, 0x42D80000, 0x42DA0000,
28840x42DC0000, 0x42DE0000, 0x42E00000, 0x42E20000, 0x42E40000, 0x42E60000,
28850x42E80000, 0x42EA0000, 0x42EC0000, 0x42EE0000, 0x42F00000, 0x42F20000,
28860x42F40000, 0x42F60000, 0x42F80000, 0x42FA0000, 0x42FC0000, 0x42FE0000,
28870x43000000, 0x43010000, 0x43020000, 0x43030000, 0x43040000, 0x43050000,
28880x43060000, 0x43070000, 0x43080000, 0x43090000, 0x430A0000, 0x430B0000,
28890x430C0000, 0x430D0000, 0x430E0000, 0x430F0000, 0x43100000, 0x43110000,
28900x43120000, 0x43130000, 0x43140000, 0x43150000, 0x43160000, 0x43170000,
28910x43180000, 0x43190000, 0x431A0000, 0x431B0000, 0x431C0000, 0x431D0000,
28920x431E0000, 0x431F0000, 0x43200000, 0x43210000, 0x43220000, 0x43230000,
28930x43240000, 0x43250000, 0x43260000, 0x43270000, 0x43280000, 0x43290000,
28940x432A0000, 0x432B0000, 0x432C0000, 0x432D0000, 0x432E0000, 0x432F0000,
28950x43300000, 0x43310000, 0x43320000, 0x43330000, 0x43340000
2896};
2897
2898static unsigned int mic_svm_vals_lookup[] = {
28990x00000000, 0x3C23D70A, 0x3CA3D70A, 0x3CF5C28F, 0x3D23D70A, 0x3D4CCCCD,
29000x3D75C28F, 0x3D8F5C29, 0x3DA3D70A, 0x3DB851EC, 0x3DCCCCCD, 0x3DE147AE,
29010x3DF5C28F, 0x3E051EB8, 0x3E0F5C29, 0x3E19999A, 0x3E23D70A, 0x3E2E147B,
29020x3E3851EC, 0x3E428F5C, 0x3E4CCCCD, 0x3E570A3D, 0x3E6147AE, 0x3E6B851F,
29030x3E75C28F, 0x3E800000, 0x3E851EB8, 0x3E8A3D71, 0x3E8F5C29, 0x3E947AE1,
29040x3E99999A, 0x3E9EB852, 0x3EA3D70A, 0x3EA8F5C3, 0x3EAE147B, 0x3EB33333,
29050x3EB851EC, 0x3EBD70A4, 0x3EC28F5C, 0x3EC7AE14, 0x3ECCCCCD, 0x3ED1EB85,
29060x3ED70A3D, 0x3EDC28F6, 0x3EE147AE, 0x3EE66666, 0x3EEB851F, 0x3EF0A3D7,
29070x3EF5C28F, 0x3EFAE148, 0x3F000000, 0x3F028F5C, 0x3F051EB8, 0x3F07AE14,
29080x3F0A3D71, 0x3F0CCCCD, 0x3F0F5C29, 0x3F11EB85, 0x3F147AE1, 0x3F170A3D,
29090x3F19999A, 0x3F1C28F6, 0x3F1EB852, 0x3F2147AE, 0x3F23D70A, 0x3F266666,
29100x3F28F5C3, 0x3F2B851F, 0x3F2E147B, 0x3F30A3D7, 0x3F333333, 0x3F35C28F,
29110x3F3851EC, 0x3F3AE148, 0x3F3D70A4, 0x3F400000, 0x3F428F5C, 0x3F451EB8,
29120x3F47AE14, 0x3F4A3D71, 0x3F4CCCCD, 0x3F4F5C29, 0x3F51EB85, 0x3F547AE1,
29130x3F570A3D, 0x3F59999A, 0x3F5C28F6, 0x3F5EB852, 0x3F6147AE, 0x3F63D70A,
29140x3F666666, 0x3F68F5C3, 0x3F6B851F, 0x3F6E147B, 0x3F70A3D7, 0x3F733333,
29150x3F75C28F, 0x3F7851EC, 0x3F7AE148, 0x3F7D70A4, 0x3F800000
2916};
2917
2918static unsigned int equalizer_vals_lookup[] = {
29190xC1C00000, 0xC1B80000, 0xC1B00000, 0xC1A80000, 0xC1A00000, 0xC1980000,
29200xC1900000, 0xC1880000, 0xC1800000, 0xC1700000, 0xC1600000, 0xC1500000,
29210xC1400000, 0xC1300000, 0xC1200000, 0xC1100000, 0xC1000000, 0xC0E00000,
29220xC0C00000, 0xC0A00000, 0xC0800000, 0xC0400000, 0xC0000000, 0xBF800000,
29230x00000000, 0x3F800000, 0x40000000, 0x40400000, 0x40800000, 0x40A00000,
29240x40C00000, 0x40E00000, 0x41000000, 0x41100000, 0x41200000, 0x41300000,
29250x41400000, 0x41500000, 0x41600000, 0x41700000, 0x41800000, 0x41880000,
29260x41900000, 0x41980000, 0x41A00000, 0x41A80000, 0x41B00000, 0x41B80000,
29270x41C00000
2928};
2929
2930static int tuning_ctl_set(struct hda_codec *codec, hda_nid_t nid,
2931 unsigned int *lookup, int idx)
2932{
2933 int i = 0;
2934
2935 for (i = 0; i < TUNING_CTLS_COUNT; i++)
2936 if (nid == ca0132_tuning_ctls[i].nid)
2937 break;
2938
2939 snd_hda_power_up(codec);
2940 dspio_set_param(codec, ca0132_tuning_ctls[i].mid,
2941 ca0132_tuning_ctls[i].req,
2942 &(lookup[idx]), sizeof(unsigned int));
2943 snd_hda_power_down(codec);
2944
2945 return 1;
2946}
2947
2948static int tuning_ctl_get(struct snd_kcontrol *kcontrol,
2949 struct snd_ctl_elem_value *ucontrol)
2950{
2951 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2952 struct ca0132_spec *spec = codec->spec;
2953 hda_nid_t nid = get_amp_nid(kcontrol);
2954 long *valp = ucontrol->value.integer.value;
2955 int idx = nid - TUNING_CTL_START_NID;
2956
2957 *valp = spec->cur_ctl_vals[idx];
2958 return 0;
2959}
2960
2961static int voice_focus_ctl_info(struct snd_kcontrol *kcontrol,
2962 struct snd_ctl_elem_info *uinfo)
2963{
2964 int chs = get_amp_channels(kcontrol);
2965 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
2966 uinfo->count = chs == 3 ? 2 : 1;
2967 uinfo->value.integer.min = 20;
2968 uinfo->value.integer.max = 180;
2969 uinfo->value.integer.step = 1;
2970
2971 return 0;
2972}
2973
2974static int voice_focus_ctl_put(struct snd_kcontrol *kcontrol,
2975 struct snd_ctl_elem_value *ucontrol)
2976{
2977 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2978 struct ca0132_spec *spec = codec->spec;
2979 hda_nid_t nid = get_amp_nid(kcontrol);
2980 long *valp = ucontrol->value.integer.value;
2981 int idx;
2982
2983 idx = nid - TUNING_CTL_START_NID;
2984 /* any change? */
2985 if (spec->cur_ctl_vals[idx] == *valp)
2986 return 0;
2987
2988 spec->cur_ctl_vals[idx] = *valp;
2989
2990 idx = *valp - 20;
2991 tuning_ctl_set(codec, nid, voice_focus_vals_lookup, idx);
2992
2993 return 1;
2994}
2995
2996static int mic_svm_ctl_info(struct snd_kcontrol *kcontrol,
2997 struct snd_ctl_elem_info *uinfo)
2998{
2999 int chs = get_amp_channels(kcontrol);
3000 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
3001 uinfo->count = chs == 3 ? 2 : 1;
3002 uinfo->value.integer.min = 0;
3003 uinfo->value.integer.max = 100;
3004 uinfo->value.integer.step = 1;
3005
3006 return 0;
3007}
3008
3009static int mic_svm_ctl_put(struct snd_kcontrol *kcontrol,
3010 struct snd_ctl_elem_value *ucontrol)
3011{
3012 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
3013 struct ca0132_spec *spec = codec->spec;
3014 hda_nid_t nid = get_amp_nid(kcontrol);
3015 long *valp = ucontrol->value.integer.value;
3016 int idx;
3017
3018 idx = nid - TUNING_CTL_START_NID;
3019 /* any change? */
3020 if (spec->cur_ctl_vals[idx] == *valp)
3021 return 0;
3022
3023 spec->cur_ctl_vals[idx] = *valp;
3024
3025 idx = *valp;
3026 tuning_ctl_set(codec, nid, mic_svm_vals_lookup, idx);
3027
3028 return 0;
3029}
3030
3031static int equalizer_ctl_info(struct snd_kcontrol *kcontrol,
3032 struct snd_ctl_elem_info *uinfo)
3033{
3034 int chs = get_amp_channels(kcontrol);
3035 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
3036 uinfo->count = chs == 3 ? 2 : 1;
3037 uinfo->value.integer.min = 0;
3038 uinfo->value.integer.max = 48;
3039 uinfo->value.integer.step = 1;
3040
3041 return 0;
3042}
3043
3044static int equalizer_ctl_put(struct snd_kcontrol *kcontrol,
3045 struct snd_ctl_elem_value *ucontrol)
3046{
3047 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
3048 struct ca0132_spec *spec = codec->spec;
3049 hda_nid_t nid = get_amp_nid(kcontrol);
3050 long *valp = ucontrol->value.integer.value;
3051 int idx;
3052
3053 idx = nid - TUNING_CTL_START_NID;
3054 /* any change? */
3055 if (spec->cur_ctl_vals[idx] == *valp)
3056 return 0;
3057
3058 spec->cur_ctl_vals[idx] = *valp;
3059
3060 idx = *valp;
3061 tuning_ctl_set(codec, nid, equalizer_vals_lookup, idx);
3062
3063 return 1;
3064}
3065
3066static const DECLARE_TLV_DB_SCALE(voice_focus_db_scale, 2000, 100, 0);
3067static const DECLARE_TLV_DB_SCALE(eq_db_scale, -2400, 100, 0);
3068
3069static int add_tuning_control(struct hda_codec *codec,
3070 hda_nid_t pnid, hda_nid_t nid,
3071 const char *name, int dir)
3072{
Takashi Iwai975cc022013-06-28 11:56:49 +02003073 char namestr[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
Ian Minett44f0c972012-12-20 18:53:38 -08003074 int type = dir ? HDA_INPUT : HDA_OUTPUT;
3075 struct snd_kcontrol_new knew =
3076 HDA_CODEC_VOLUME_MONO(namestr, nid, 1, 0, type);
3077
3078 knew.access = SNDRV_CTL_ELEM_ACCESS_READWRITE |
3079 SNDRV_CTL_ELEM_ACCESS_TLV_READ;
3080 knew.tlv.c = 0;
3081 knew.tlv.p = 0;
3082 switch (pnid) {
3083 case VOICE_FOCUS:
3084 knew.info = voice_focus_ctl_info;
3085 knew.get = tuning_ctl_get;
3086 knew.put = voice_focus_ctl_put;
3087 knew.tlv.p = voice_focus_db_scale;
3088 break;
3089 case MIC_SVM:
3090 knew.info = mic_svm_ctl_info;
3091 knew.get = tuning_ctl_get;
3092 knew.put = mic_svm_ctl_put;
3093 break;
3094 case EQUALIZER:
3095 knew.info = equalizer_ctl_info;
3096 knew.get = tuning_ctl_get;
3097 knew.put = equalizer_ctl_put;
3098 knew.tlv.p = eq_db_scale;
3099 break;
3100 default:
3101 return 0;
3102 }
3103 knew.private_value =
3104 HDA_COMPOSE_AMP_VAL(nid, 1, 0, type);
3105 sprintf(namestr, "%s %s Volume", name, dirstr[dir]);
3106 return snd_hda_ctl_add(codec, nid, snd_ctl_new1(&knew, codec));
3107}
3108
3109static int add_tuning_ctls(struct hda_codec *codec)
3110{
3111 int i;
3112 int err;
3113
3114 for (i = 0; i < TUNING_CTLS_COUNT; i++) {
3115 err = add_tuning_control(codec,
3116 ca0132_tuning_ctls[i].parent_nid,
3117 ca0132_tuning_ctls[i].nid,
3118 ca0132_tuning_ctls[i].name,
3119 ca0132_tuning_ctls[i].direct);
3120 if (err < 0)
3121 return err;
3122 }
3123
3124 return 0;
3125}
3126
3127static void ca0132_init_tuning_defaults(struct hda_codec *codec)
3128{
3129 struct ca0132_spec *spec = codec->spec;
3130 int i;
3131
3132 /* Wedge Angle defaults to 30. 10 below is 30 - 20. 20 is min. */
3133 spec->cur_ctl_vals[WEDGE_ANGLE - TUNING_CTL_START_NID] = 10;
3134 /* SVM level defaults to 0.74. */
3135 spec->cur_ctl_vals[SVM_LEVEL - TUNING_CTL_START_NID] = 74;
3136
3137 /* EQ defaults to 0dB. */
3138 for (i = 2; i < TUNING_CTLS_COUNT; i++)
3139 spec->cur_ctl_vals[i] = 24;
3140}
3141#endif /*ENABLE_TUNING_CONTROLS*/
3142
Ian Minett825315b2012-12-20 18:53:36 -08003143/*
Ian Minett5aaca442012-12-20 18:53:34 -08003144 * Select the active output.
3145 * If autodetect is enabled, output will be selected based on jack detection.
3146 * If jack inserted, headphone will be selected, else built-in speakers
3147 * If autodetect is disabled, output will be selected based on selection.
3148 */
3149static int ca0132_select_out(struct hda_codec *codec)
3150{
3151 struct ca0132_spec *spec = codec->spec;
3152 unsigned int pin_ctl;
3153 int jack_present;
3154 int auto_jack;
3155 unsigned int tmp;
3156 int err;
3157
Takashi Iwai4e76a882014-02-25 12:21:03 +01003158 codec_dbg(codec, "ca0132_select_out\n");
Ian Minett5aaca442012-12-20 18:53:34 -08003159
Takashi Iwai664c7152015-04-08 11:43:14 +02003160 snd_hda_power_up_pm(codec);
Ian Minett5aaca442012-12-20 18:53:34 -08003161
3162 auto_jack = spec->vnode_lswitch[VNID_HP_ASEL - VNODE_START_NID];
3163
3164 if (auto_jack)
Takashi Iwaife14f392015-08-10 16:53:32 +02003165 jack_present = snd_hda_jack_detect(codec, spec->unsol_tag_hp);
Ian Minett5aaca442012-12-20 18:53:34 -08003166 else
3167 jack_present =
3168 spec->vnode_lswitch[VNID_HP_SEL - VNODE_START_NID];
3169
3170 if (jack_present)
3171 spec->cur_out_type = HEADPHONE_OUT;
3172 else
3173 spec->cur_out_type = SPEAKER_OUT;
3174
3175 if (spec->cur_out_type == SPEAKER_OUT) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01003176 codec_dbg(codec, "ca0132_select_out speaker\n");
Ian Minett5aaca442012-12-20 18:53:34 -08003177 /*speaker out config*/
3178 tmp = FLOAT_ONE;
3179 err = dspio_set_uint_param(codec, 0x80, 0x04, tmp);
3180 if (err < 0)
3181 goto exit;
3182 /*enable speaker EQ*/
3183 tmp = FLOAT_ONE;
3184 err = dspio_set_uint_param(codec, 0x8f, 0x00, tmp);
3185 if (err < 0)
3186 goto exit;
3187
3188 /* Setup EAPD */
3189 snd_hda_codec_write(codec, spec->out_pins[1], 0,
3190 VENDOR_CHIPIO_EAPD_SEL_SET, 0x02);
3191 snd_hda_codec_write(codec, spec->out_pins[0], 0,
3192 AC_VERB_SET_EAPD_BTLENABLE, 0x00);
3193 snd_hda_codec_write(codec, spec->out_pins[0], 0,
3194 VENDOR_CHIPIO_EAPD_SEL_SET, 0x00);
3195 snd_hda_codec_write(codec, spec->out_pins[0], 0,
3196 AC_VERB_SET_EAPD_BTLENABLE, 0x02);
3197
3198 /* disable headphone node */
3199 pin_ctl = snd_hda_codec_read(codec, spec->out_pins[1], 0,
3200 AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
Takashi Iwaia0c041c2013-01-15 17:13:31 +01003201 snd_hda_set_pin_ctl(codec, spec->out_pins[1],
3202 pin_ctl & ~PIN_HP);
Ian Minett5aaca442012-12-20 18:53:34 -08003203 /* enable speaker node */
3204 pin_ctl = snd_hda_codec_read(codec, spec->out_pins[0], 0,
3205 AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
Takashi Iwaia0c041c2013-01-15 17:13:31 +01003206 snd_hda_set_pin_ctl(codec, spec->out_pins[0],
3207 pin_ctl | PIN_OUT);
Ian Minett5aaca442012-12-20 18:53:34 -08003208 } else {
Takashi Iwai4e76a882014-02-25 12:21:03 +01003209 codec_dbg(codec, "ca0132_select_out hp\n");
Ian Minett5aaca442012-12-20 18:53:34 -08003210 /*headphone out config*/
3211 tmp = FLOAT_ZERO;
3212 err = dspio_set_uint_param(codec, 0x80, 0x04, tmp);
3213 if (err < 0)
3214 goto exit;
3215 /*disable speaker EQ*/
3216 tmp = FLOAT_ZERO;
3217 err = dspio_set_uint_param(codec, 0x8f, 0x00, tmp);
3218 if (err < 0)
3219 goto exit;
3220
3221 /* Setup EAPD */
3222 snd_hda_codec_write(codec, spec->out_pins[0], 0,
3223 VENDOR_CHIPIO_EAPD_SEL_SET, 0x00);
3224 snd_hda_codec_write(codec, spec->out_pins[0], 0,
3225 AC_VERB_SET_EAPD_BTLENABLE, 0x00);
3226 snd_hda_codec_write(codec, spec->out_pins[1], 0,
3227 VENDOR_CHIPIO_EAPD_SEL_SET, 0x02);
3228 snd_hda_codec_write(codec, spec->out_pins[0], 0,
3229 AC_VERB_SET_EAPD_BTLENABLE, 0x02);
3230
3231 /* disable speaker*/
3232 pin_ctl = snd_hda_codec_read(codec, spec->out_pins[0], 0,
3233 AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
Takashi Iwaia0c041c2013-01-15 17:13:31 +01003234 snd_hda_set_pin_ctl(codec, spec->out_pins[0],
3235 pin_ctl & ~PIN_HP);
Ian Minett5aaca442012-12-20 18:53:34 -08003236 /* enable headphone*/
3237 pin_ctl = snd_hda_codec_read(codec, spec->out_pins[1], 0,
3238 AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
Takashi Iwaia0c041c2013-01-15 17:13:31 +01003239 snd_hda_set_pin_ctl(codec, spec->out_pins[1],
3240 pin_ctl | PIN_HP);
Ian Minett5aaca442012-12-20 18:53:34 -08003241 }
3242
3243exit:
Takashi Iwai664c7152015-04-08 11:43:14 +02003244 snd_hda_power_down_pm(codec);
Ian Minett5aaca442012-12-20 18:53:34 -08003245
3246 return err < 0 ? err : 0;
3247}
3248
Chih-Chung Chang993884f2013-03-25 10:39:23 -07003249static void ca0132_unsol_hp_delayed(struct work_struct *work)
3250{
3251 struct ca0132_spec *spec = container_of(
3252 to_delayed_work(work), struct ca0132_spec, unsol_hp_work);
Takashi Iwaif8fb1172014-09-11 15:53:26 +02003253 struct hda_jack_tbl *jack;
3254
Chih-Chung Chang993884f2013-03-25 10:39:23 -07003255 ca0132_select_out(spec->codec);
Gabriele Martinod5c016b2015-05-18 21:15:13 +02003256 jack = snd_hda_jack_tbl_get(spec->codec, spec->unsol_tag_hp);
Takashi Iwaif8fb1172014-09-11 15:53:26 +02003257 if (jack) {
3258 jack->block_report = 0;
3259 snd_hda_jack_report_sync(spec->codec);
3260 }
Chih-Chung Chang993884f2013-03-25 10:39:23 -07003261}
3262
Ian Minett5aaca442012-12-20 18:53:34 -08003263static void ca0132_set_dmic(struct hda_codec *codec, int enable);
3264static int ca0132_mic_boost_set(struct hda_codec *codec, long val);
3265static int ca0132_effects_set(struct hda_codec *codec, hda_nid_t nid, long val);
3266
3267/*
3268 * Select the active VIP source
3269 */
3270static int ca0132_set_vipsource(struct hda_codec *codec, int val)
3271{
3272 struct ca0132_spec *spec = codec->spec;
3273 unsigned int tmp;
3274
Dylan Reide8f1bd52013-03-14 17:27:45 -07003275 if (spec->dsp_state != DSP_DOWNLOADED)
Ian Minett5aaca442012-12-20 18:53:34 -08003276 return 0;
3277
3278 /* if CrystalVoice if off, vipsource should be 0 */
3279 if (!spec->effects_switch[CRYSTAL_VOICE - EFFECT_START_NID] ||
3280 (val == 0)) {
3281 chipio_set_control_param(codec, CONTROL_PARAM_VIP_SOURCE, 0);
3282 chipio_set_conn_rate(codec, MEM_CONNID_MICIN1, SR_96_000);
3283 chipio_set_conn_rate(codec, MEM_CONNID_MICOUT1, SR_96_000);
3284 if (spec->cur_mic_type == DIGITAL_MIC)
3285 tmp = FLOAT_TWO;
3286 else
3287 tmp = FLOAT_ONE;
3288 dspio_set_uint_param(codec, 0x80, 0x00, tmp);
3289 tmp = FLOAT_ZERO;
3290 dspio_set_uint_param(codec, 0x80, 0x05, tmp);
3291 } else {
3292 chipio_set_conn_rate(codec, MEM_CONNID_MICIN1, SR_16_000);
3293 chipio_set_conn_rate(codec, MEM_CONNID_MICOUT1, SR_16_000);
3294 if (spec->cur_mic_type == DIGITAL_MIC)
3295 tmp = FLOAT_TWO;
3296 else
3297 tmp = FLOAT_ONE;
3298 dspio_set_uint_param(codec, 0x80, 0x00, tmp);
3299 tmp = FLOAT_ONE;
3300 dspio_set_uint_param(codec, 0x80, 0x05, tmp);
3301 msleep(20);
3302 chipio_set_control_param(codec, CONTROL_PARAM_VIP_SOURCE, val);
3303 }
3304
3305 return 1;
3306}
3307
3308/*
3309 * Select the active microphone.
3310 * If autodetect is enabled, mic will be selected based on jack detection.
3311 * If jack inserted, ext.mic will be selected, else built-in mic
3312 * If autodetect is disabled, mic will be selected based on selection.
3313 */
3314static int ca0132_select_mic(struct hda_codec *codec)
3315{
3316 struct ca0132_spec *spec = codec->spec;
3317 int jack_present;
3318 int auto_jack;
3319
Takashi Iwai4e76a882014-02-25 12:21:03 +01003320 codec_dbg(codec, "ca0132_select_mic\n");
Ian Minett5aaca442012-12-20 18:53:34 -08003321
Takashi Iwai664c7152015-04-08 11:43:14 +02003322 snd_hda_power_up_pm(codec);
Ian Minett5aaca442012-12-20 18:53:34 -08003323
3324 auto_jack = spec->vnode_lswitch[VNID_AMIC1_ASEL - VNODE_START_NID];
3325
3326 if (auto_jack)
Takashi Iwaife14f392015-08-10 16:53:32 +02003327 jack_present = snd_hda_jack_detect(codec, spec->unsol_tag_amic1);
Ian Minett5aaca442012-12-20 18:53:34 -08003328 else
3329 jack_present =
3330 spec->vnode_lswitch[VNID_AMIC1_SEL - VNODE_START_NID];
3331
3332 if (jack_present)
3333 spec->cur_mic_type = LINE_MIC_IN;
3334 else
3335 spec->cur_mic_type = DIGITAL_MIC;
3336
3337 if (spec->cur_mic_type == DIGITAL_MIC) {
3338 /* enable digital Mic */
3339 chipio_set_conn_rate(codec, MEM_CONNID_DMIC, SR_32_000);
3340 ca0132_set_dmic(codec, 1);
3341 ca0132_mic_boost_set(codec, 0);
3342 /* set voice focus */
3343 ca0132_effects_set(codec, VOICE_FOCUS,
3344 spec->effects_switch
3345 [VOICE_FOCUS - EFFECT_START_NID]);
3346 } else {
3347 /* disable digital Mic */
3348 chipio_set_conn_rate(codec, MEM_CONNID_DMIC, SR_96_000);
3349 ca0132_set_dmic(codec, 0);
3350 ca0132_mic_boost_set(codec, spec->cur_mic_boost);
3351 /* disable voice focus */
3352 ca0132_effects_set(codec, VOICE_FOCUS, 0);
3353 }
3354
Takashi Iwai664c7152015-04-08 11:43:14 +02003355 snd_hda_power_down_pm(codec);
Ian Minett5aaca442012-12-20 18:53:34 -08003356
3357 return 0;
3358}
3359
3360/*
Ian Minetta7e76272012-12-20 18:53:35 -08003361 * Check if VNODE settings take effect immediately.
3362 */
3363static bool ca0132_is_vnode_effective(struct hda_codec *codec,
3364 hda_nid_t vnid,
3365 hda_nid_t *shared_nid)
3366{
3367 struct ca0132_spec *spec = codec->spec;
3368 hda_nid_t nid;
Ian Minetta7e76272012-12-20 18:53:35 -08003369
3370 switch (vnid) {
3371 case VNID_SPK:
3372 nid = spec->shared_out_nid;
Ian Minetta7e76272012-12-20 18:53:35 -08003373 break;
3374 case VNID_MIC:
3375 nid = spec->shared_mic_nid;
Ian Minetta7e76272012-12-20 18:53:35 -08003376 break;
3377 default:
Takashi Iwai9a0869f2013-02-07 12:41:40 +01003378 return false;
Ian Minetta7e76272012-12-20 18:53:35 -08003379 }
3380
Takashi Iwai9a0869f2013-02-07 12:41:40 +01003381 if (shared_nid)
Ian Minetta7e76272012-12-20 18:53:35 -08003382 *shared_nid = nid;
3383
Takashi Iwai9a0869f2013-02-07 12:41:40 +01003384 return true;
Ian Minetta7e76272012-12-20 18:53:35 -08003385}
3386
3387/*
3388* The following functions are control change helpers.
3389* They return 0 if no changed. Return 1 if changed.
3390*/
3391static int ca0132_voicefx_set(struct hda_codec *codec, int enable)
3392{
3393 struct ca0132_spec *spec = codec->spec;
3394 unsigned int tmp;
3395
3396 /* based on CrystalVoice state to enable VoiceFX. */
3397 if (enable) {
3398 tmp = spec->effects_switch[CRYSTAL_VOICE - EFFECT_START_NID] ?
3399 FLOAT_ONE : FLOAT_ZERO;
3400 } else {
3401 tmp = FLOAT_ZERO;
3402 }
3403
3404 dspio_set_uint_param(codec, ca0132_voicefx.mid,
3405 ca0132_voicefx.reqs[0], tmp);
3406
3407 return 1;
3408}
3409
3410/*
Ian Minett5aaca442012-12-20 18:53:34 -08003411 * Set the effects parameters
3412 */
3413static int ca0132_effects_set(struct hda_codec *codec, hda_nid_t nid, long val)
3414{
3415 struct ca0132_spec *spec = codec->spec;
3416 unsigned int on;
3417 int num_fx = OUT_EFFECTS_COUNT + IN_EFFECTS_COUNT;
3418 int err = 0;
3419 int idx = nid - EFFECT_START_NID;
3420
3421 if ((idx < 0) || (idx >= num_fx))
3422 return 0; /* no changed */
3423
3424 /* for out effect, qualify with PE */
3425 if ((nid >= OUT_EFFECT_START_NID) && (nid < OUT_EFFECT_END_NID)) {
3426 /* if PE if off, turn off out effects. */
3427 if (!spec->effects_switch[PLAY_ENHANCEMENT - EFFECT_START_NID])
3428 val = 0;
3429 }
3430
3431 /* for in effect, qualify with CrystalVoice */
3432 if ((nid >= IN_EFFECT_START_NID) && (nid < IN_EFFECT_END_NID)) {
3433 /* if CrystalVoice if off, turn off in effects. */
3434 if (!spec->effects_switch[CRYSTAL_VOICE - EFFECT_START_NID])
3435 val = 0;
3436
3437 /* Voice Focus applies to 2-ch Mic, Digital Mic */
3438 if ((nid == VOICE_FOCUS) && (spec->cur_mic_type != DIGITAL_MIC))
3439 val = 0;
3440 }
3441
Takashi Iwai4e76a882014-02-25 12:21:03 +01003442 codec_dbg(codec, "ca0132_effect_set: nid=0x%x, val=%ld\n",
Ian Minett5aaca442012-12-20 18:53:34 -08003443 nid, val);
3444
3445 on = (val == 0) ? FLOAT_ZERO : FLOAT_ONE;
3446 err = dspio_set_uint_param(codec, ca0132_effects[idx].mid,
3447 ca0132_effects[idx].reqs[0], on);
3448
3449 if (err < 0)
3450 return 0; /* no changed */
3451
3452 return 1;
3453}
3454
Ian Minetta7e76272012-12-20 18:53:35 -08003455/*
3456 * Turn on/off Playback Enhancements
3457 */
3458static int ca0132_pe_switch_set(struct hda_codec *codec)
3459{
3460 struct ca0132_spec *spec = codec->spec;
3461 hda_nid_t nid;
3462 int i, ret = 0;
3463
Takashi Iwai4e76a882014-02-25 12:21:03 +01003464 codec_dbg(codec, "ca0132_pe_switch_set: val=%ld\n",
Ian Minetta7e76272012-12-20 18:53:35 -08003465 spec->effects_switch[PLAY_ENHANCEMENT - EFFECT_START_NID]);
3466
3467 i = OUT_EFFECT_START_NID - EFFECT_START_NID;
3468 nid = OUT_EFFECT_START_NID;
3469 /* PE affects all out effects */
3470 for (; nid < OUT_EFFECT_END_NID; nid++, i++)
3471 ret |= ca0132_effects_set(codec, nid, spec->effects_switch[i]);
3472
3473 return ret;
3474}
3475
Ian Minett5aaca442012-12-20 18:53:34 -08003476/* Check if Mic1 is streaming, if so, stop streaming */
3477static int stop_mic1(struct hda_codec *codec)
3478{
3479 struct ca0132_spec *spec = codec->spec;
3480 unsigned int oldval = snd_hda_codec_read(codec, spec->adcs[0], 0,
3481 AC_VERB_GET_CONV, 0);
3482 if (oldval != 0)
3483 snd_hda_codec_write(codec, spec->adcs[0], 0,
3484 AC_VERB_SET_CHANNEL_STREAMID,
3485 0);
3486 return oldval;
3487}
3488
3489/* Resume Mic1 streaming if it was stopped. */
3490static void resume_mic1(struct hda_codec *codec, unsigned int oldval)
3491{
3492 struct ca0132_spec *spec = codec->spec;
3493 /* Restore the previous stream and channel */
3494 if (oldval != 0)
3495 snd_hda_codec_write(codec, spec->adcs[0], 0,
3496 AC_VERB_SET_CHANNEL_STREAMID,
3497 oldval);
3498}
3499
3500/*
Ian Minetta7e76272012-12-20 18:53:35 -08003501 * Turn on/off CrystalVoice
Ian Minett5aaca442012-12-20 18:53:34 -08003502 */
Ian Minetta7e76272012-12-20 18:53:35 -08003503static int ca0132_cvoice_switch_set(struct hda_codec *codec)
3504{
3505 struct ca0132_spec *spec = codec->spec;
3506 hda_nid_t nid;
3507 int i, ret = 0;
3508 unsigned int oldval;
3509
Takashi Iwai4e76a882014-02-25 12:21:03 +01003510 codec_dbg(codec, "ca0132_cvoice_switch_set: val=%ld\n",
Ian Minetta7e76272012-12-20 18:53:35 -08003511 spec->effects_switch[CRYSTAL_VOICE - EFFECT_START_NID]);
3512
3513 i = IN_EFFECT_START_NID - EFFECT_START_NID;
3514 nid = IN_EFFECT_START_NID;
3515 /* CrystalVoice affects all in effects */
3516 for (; nid < IN_EFFECT_END_NID; nid++, i++)
3517 ret |= ca0132_effects_set(codec, nid, spec->effects_switch[i]);
3518
3519 /* including VoiceFX */
3520 ret |= ca0132_voicefx_set(codec, (spec->voicefx_val ? 1 : 0));
3521
3522 /* set correct vipsource */
3523 oldval = stop_mic1(codec);
3524 ret |= ca0132_set_vipsource(codec, 1);
3525 resume_mic1(codec, oldval);
3526 return ret;
3527}
3528
Ian Minett5aaca442012-12-20 18:53:34 -08003529static int ca0132_mic_boost_set(struct hda_codec *codec, long val)
3530{
3531 struct ca0132_spec *spec = codec->spec;
3532 int ret = 0;
3533
3534 if (val) /* on */
3535 ret = snd_hda_codec_amp_update(codec, spec->input_pins[0], 0,
3536 HDA_INPUT, 0, HDA_AMP_VOLMASK, 3);
3537 else /* off */
3538 ret = snd_hda_codec_amp_update(codec, spec->input_pins[0], 0,
3539 HDA_INPUT, 0, HDA_AMP_VOLMASK, 0);
3540
3541 return ret;
3542}
3543
Ian Minetta7e76272012-12-20 18:53:35 -08003544static int ca0132_vnode_switch_set(struct snd_kcontrol *kcontrol,
3545 struct snd_ctl_elem_value *ucontrol)
3546{
3547 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
3548 hda_nid_t nid = get_amp_nid(kcontrol);
3549 hda_nid_t shared_nid = 0;
3550 bool effective;
3551 int ret = 0;
3552 struct ca0132_spec *spec = codec->spec;
3553 int auto_jack;
3554
3555 if (nid == VNID_HP_SEL) {
3556 auto_jack =
3557 spec->vnode_lswitch[VNID_HP_ASEL - VNODE_START_NID];
3558 if (!auto_jack)
3559 ca0132_select_out(codec);
3560 return 1;
3561 }
3562
3563 if (nid == VNID_AMIC1_SEL) {
3564 auto_jack =
3565 spec->vnode_lswitch[VNID_AMIC1_ASEL - VNODE_START_NID];
3566 if (!auto_jack)
3567 ca0132_select_mic(codec);
3568 return 1;
3569 }
3570
3571 if (nid == VNID_HP_ASEL) {
3572 ca0132_select_out(codec);
3573 return 1;
3574 }
3575
3576 if (nid == VNID_AMIC1_ASEL) {
3577 ca0132_select_mic(codec);
3578 return 1;
3579 }
3580
3581 /* if effective conditions, then update hw immediately. */
3582 effective = ca0132_is_vnode_effective(codec, nid, &shared_nid);
3583 if (effective) {
3584 int dir = get_amp_direction(kcontrol);
3585 int ch = get_amp_channels(kcontrol);
3586 unsigned long pval;
3587
3588 mutex_lock(&codec->control_mutex);
3589 pval = kcontrol->private_value;
3590 kcontrol->private_value = HDA_COMPOSE_AMP_VAL(shared_nid, ch,
3591 0, dir);
3592 ret = snd_hda_mixer_amp_switch_put(kcontrol, ucontrol);
3593 kcontrol->private_value = pval;
3594 mutex_unlock(&codec->control_mutex);
3595 }
3596
3597 return ret;
3598}
3599/* End of control change helpers. */
3600
3601static int ca0132_voicefx_info(struct snd_kcontrol *kcontrol,
3602 struct snd_ctl_elem_info *uinfo)
3603{
3604 unsigned int items = sizeof(ca0132_voicefx_presets)
3605 / sizeof(struct ct_voicefx_preset);
3606
3607 uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
3608 uinfo->count = 1;
3609 uinfo->value.enumerated.items = items;
3610 if (uinfo->value.enumerated.item >= items)
3611 uinfo->value.enumerated.item = items - 1;
3612 strcpy(uinfo->value.enumerated.name,
3613 ca0132_voicefx_presets[uinfo->value.enumerated.item].name);
3614 return 0;
3615}
3616
3617static int ca0132_voicefx_get(struct snd_kcontrol *kcontrol,
3618 struct snd_ctl_elem_value *ucontrol)
3619{
3620 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
3621 struct ca0132_spec *spec = codec->spec;
3622
3623 ucontrol->value.enumerated.item[0] = spec->voicefx_val;
3624 return 0;
3625}
3626
3627static int ca0132_voicefx_put(struct snd_kcontrol *kcontrol,
3628 struct snd_ctl_elem_value *ucontrol)
3629{
3630 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
3631 struct ca0132_spec *spec = codec->spec;
3632 int i, err = 0;
3633 int sel = ucontrol->value.enumerated.item[0];
3634 unsigned int items = sizeof(ca0132_voicefx_presets)
3635 / sizeof(struct ct_voicefx_preset);
3636
3637 if (sel >= items)
3638 return 0;
3639
Takashi Iwai4e76a882014-02-25 12:21:03 +01003640 codec_dbg(codec, "ca0132_voicefx_put: sel=%d, preset=%s\n",
Ian Minetta7e76272012-12-20 18:53:35 -08003641 sel, ca0132_voicefx_presets[sel].name);
3642
3643 /*
3644 * Idx 0 is default.
3645 * Default needs to qualify with CrystalVoice state.
3646 */
3647 for (i = 0; i < VOICEFX_MAX_PARAM_COUNT; i++) {
3648 err = dspio_set_uint_param(codec, ca0132_voicefx.mid,
3649 ca0132_voicefx.reqs[i],
3650 ca0132_voicefx_presets[sel].vals[i]);
3651 if (err < 0)
3652 break;
3653 }
3654
3655 if (err >= 0) {
3656 spec->voicefx_val = sel;
3657 /* enable voice fx */
3658 ca0132_voicefx_set(codec, (sel ? 1 : 0));
3659 }
3660
3661 return 1;
3662}
3663
3664static int ca0132_switch_get(struct snd_kcontrol *kcontrol,
3665 struct snd_ctl_elem_value *ucontrol)
3666{
3667 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
3668 struct ca0132_spec *spec = codec->spec;
3669 hda_nid_t nid = get_amp_nid(kcontrol);
3670 int ch = get_amp_channels(kcontrol);
3671 long *valp = ucontrol->value.integer.value;
3672
3673 /* vnode */
3674 if ((nid >= VNODE_START_NID) && (nid < VNODE_END_NID)) {
3675 if (ch & 1) {
3676 *valp = spec->vnode_lswitch[nid - VNODE_START_NID];
3677 valp++;
3678 }
3679 if (ch & 2) {
3680 *valp = spec->vnode_rswitch[nid - VNODE_START_NID];
3681 valp++;
3682 }
3683 return 0;
3684 }
3685
3686 /* effects, include PE and CrystalVoice */
3687 if ((nid >= EFFECT_START_NID) && (nid < EFFECT_END_NID)) {
3688 *valp = spec->effects_switch[nid - EFFECT_START_NID];
3689 return 0;
3690 }
3691
3692 /* mic boost */
3693 if (nid == spec->input_pins[0]) {
3694 *valp = spec->cur_mic_boost;
3695 return 0;
3696 }
3697
3698 return 0;
3699}
3700
3701static int ca0132_switch_put(struct snd_kcontrol *kcontrol,
3702 struct snd_ctl_elem_value *ucontrol)
3703{
3704 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
3705 struct ca0132_spec *spec = codec->spec;
3706 hda_nid_t nid = get_amp_nid(kcontrol);
3707 int ch = get_amp_channels(kcontrol);
3708 long *valp = ucontrol->value.integer.value;
3709 int changed = 1;
3710
Takashi Iwai4e76a882014-02-25 12:21:03 +01003711 codec_dbg(codec, "ca0132_switch_put: nid=0x%x, val=%ld\n",
Ian Minetta7e76272012-12-20 18:53:35 -08003712 nid, *valp);
3713
3714 snd_hda_power_up(codec);
3715 /* vnode */
3716 if ((nid >= VNODE_START_NID) && (nid < VNODE_END_NID)) {
3717 if (ch & 1) {
3718 spec->vnode_lswitch[nid - VNODE_START_NID] = *valp;
3719 valp++;
3720 }
3721 if (ch & 2) {
3722 spec->vnode_rswitch[nid - VNODE_START_NID] = *valp;
3723 valp++;
3724 }
3725 changed = ca0132_vnode_switch_set(kcontrol, ucontrol);
3726 goto exit;
3727 }
3728
3729 /* PE */
3730 if (nid == PLAY_ENHANCEMENT) {
3731 spec->effects_switch[nid - EFFECT_START_NID] = *valp;
3732 changed = ca0132_pe_switch_set(codec);
3733 goto exit;
3734 }
3735
3736 /* CrystalVoice */
3737 if (nid == CRYSTAL_VOICE) {
3738 spec->effects_switch[nid - EFFECT_START_NID] = *valp;
3739 changed = ca0132_cvoice_switch_set(codec);
3740 goto exit;
3741 }
3742
3743 /* out and in effects */
3744 if (((nid >= OUT_EFFECT_START_NID) && (nid < OUT_EFFECT_END_NID)) ||
3745 ((nid >= IN_EFFECT_START_NID) && (nid < IN_EFFECT_END_NID))) {
3746 spec->effects_switch[nid - EFFECT_START_NID] = *valp;
3747 changed = ca0132_effects_set(codec, nid, *valp);
3748 goto exit;
3749 }
3750
3751 /* mic boost */
3752 if (nid == spec->input_pins[0]) {
3753 spec->cur_mic_boost = *valp;
3754
3755 /* Mic boost does not apply to Digital Mic */
3756 if (spec->cur_mic_type != DIGITAL_MIC)
3757 changed = ca0132_mic_boost_set(codec, *valp);
3758 goto exit;
3759 }
3760
3761exit:
3762 snd_hda_power_down(codec);
3763 return changed;
3764}
3765
3766/*
3767 * Volume related
3768 */
3769static int ca0132_volume_info(struct snd_kcontrol *kcontrol,
3770 struct snd_ctl_elem_info *uinfo)
3771{
3772 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
3773 struct ca0132_spec *spec = codec->spec;
3774 hda_nid_t nid = get_amp_nid(kcontrol);
3775 int ch = get_amp_channels(kcontrol);
3776 int dir = get_amp_direction(kcontrol);
3777 unsigned long pval;
3778 int err;
3779
3780 switch (nid) {
3781 case VNID_SPK:
3782 /* follow shared_out info */
3783 nid = spec->shared_out_nid;
3784 mutex_lock(&codec->control_mutex);
3785 pval = kcontrol->private_value;
3786 kcontrol->private_value = HDA_COMPOSE_AMP_VAL(nid, ch, 0, dir);
3787 err = snd_hda_mixer_amp_volume_info(kcontrol, uinfo);
3788 kcontrol->private_value = pval;
3789 mutex_unlock(&codec->control_mutex);
3790 break;
3791 case VNID_MIC:
3792 /* follow shared_mic info */
3793 nid = spec->shared_mic_nid;
3794 mutex_lock(&codec->control_mutex);
3795 pval = kcontrol->private_value;
3796 kcontrol->private_value = HDA_COMPOSE_AMP_VAL(nid, ch, 0, dir);
3797 err = snd_hda_mixer_amp_volume_info(kcontrol, uinfo);
3798 kcontrol->private_value = pval;
3799 mutex_unlock(&codec->control_mutex);
3800 break;
3801 default:
3802 err = snd_hda_mixer_amp_volume_info(kcontrol, uinfo);
3803 }
3804 return err;
3805}
3806
3807static int ca0132_volume_get(struct snd_kcontrol *kcontrol,
3808 struct snd_ctl_elem_value *ucontrol)
3809{
3810 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
3811 struct ca0132_spec *spec = codec->spec;
3812 hda_nid_t nid = get_amp_nid(kcontrol);
3813 int ch = get_amp_channels(kcontrol);
3814 long *valp = ucontrol->value.integer.value;
3815
3816 /* store the left and right volume */
3817 if (ch & 1) {
3818 *valp = spec->vnode_lvol[nid - VNODE_START_NID];
3819 valp++;
3820 }
3821 if (ch & 2) {
3822 *valp = spec->vnode_rvol[nid - VNODE_START_NID];
3823 valp++;
3824 }
3825 return 0;
3826}
3827
3828static int ca0132_volume_put(struct snd_kcontrol *kcontrol,
3829 struct snd_ctl_elem_value *ucontrol)
3830{
3831 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
3832 struct ca0132_spec *spec = codec->spec;
3833 hda_nid_t nid = get_amp_nid(kcontrol);
3834 int ch = get_amp_channels(kcontrol);
3835 long *valp = ucontrol->value.integer.value;
3836 hda_nid_t shared_nid = 0;
3837 bool effective;
3838 int changed = 1;
3839
3840 /* store the left and right volume */
3841 if (ch & 1) {
3842 spec->vnode_lvol[nid - VNODE_START_NID] = *valp;
3843 valp++;
3844 }
3845 if (ch & 2) {
3846 spec->vnode_rvol[nid - VNODE_START_NID] = *valp;
3847 valp++;
3848 }
3849
3850 /* if effective conditions, then update hw immediately. */
3851 effective = ca0132_is_vnode_effective(codec, nid, &shared_nid);
3852 if (effective) {
3853 int dir = get_amp_direction(kcontrol);
3854 unsigned long pval;
3855
3856 snd_hda_power_up(codec);
3857 mutex_lock(&codec->control_mutex);
3858 pval = kcontrol->private_value;
3859 kcontrol->private_value = HDA_COMPOSE_AMP_VAL(shared_nid, ch,
3860 0, dir);
3861 changed = snd_hda_mixer_amp_volume_put(kcontrol, ucontrol);
3862 kcontrol->private_value = pval;
3863 mutex_unlock(&codec->control_mutex);
3864 snd_hda_power_down(codec);
3865 }
3866
3867 return changed;
3868}
3869
3870static int ca0132_volume_tlv(struct snd_kcontrol *kcontrol, int op_flag,
3871 unsigned int size, unsigned int __user *tlv)
3872{
3873 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
3874 struct ca0132_spec *spec = codec->spec;
3875 hda_nid_t nid = get_amp_nid(kcontrol);
3876 int ch = get_amp_channels(kcontrol);
3877 int dir = get_amp_direction(kcontrol);
3878 unsigned long pval;
3879 int err;
3880
3881 switch (nid) {
3882 case VNID_SPK:
3883 /* follow shared_out tlv */
3884 nid = spec->shared_out_nid;
3885 mutex_lock(&codec->control_mutex);
3886 pval = kcontrol->private_value;
3887 kcontrol->private_value = HDA_COMPOSE_AMP_VAL(nid, ch, 0, dir);
3888 err = snd_hda_mixer_amp_tlv(kcontrol, op_flag, size, tlv);
3889 kcontrol->private_value = pval;
3890 mutex_unlock(&codec->control_mutex);
3891 break;
3892 case VNID_MIC:
3893 /* follow shared_mic tlv */
3894 nid = spec->shared_mic_nid;
3895 mutex_lock(&codec->control_mutex);
3896 pval = kcontrol->private_value;
3897 kcontrol->private_value = HDA_COMPOSE_AMP_VAL(nid, ch, 0, dir);
3898 err = snd_hda_mixer_amp_tlv(kcontrol, op_flag, size, tlv);
3899 kcontrol->private_value = pval;
3900 mutex_unlock(&codec->control_mutex);
3901 break;
3902 default:
3903 err = snd_hda_mixer_amp_tlv(kcontrol, op_flag, size, tlv);
3904 }
3905 return err;
3906}
3907
3908static int add_fx_switch(struct hda_codec *codec, hda_nid_t nid,
3909 const char *pfx, int dir)
3910{
Takashi Iwai975cc022013-06-28 11:56:49 +02003911 char namestr[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
Ian Minetta7e76272012-12-20 18:53:35 -08003912 int type = dir ? HDA_INPUT : HDA_OUTPUT;
3913 struct snd_kcontrol_new knew =
3914 CA0132_CODEC_MUTE_MONO(namestr, nid, 1, type);
3915 sprintf(namestr, "%s %s Switch", pfx, dirstr[dir]);
3916 return snd_hda_ctl_add(codec, nid, snd_ctl_new1(&knew, codec));
3917}
3918
3919static int add_voicefx(struct hda_codec *codec)
3920{
3921 struct snd_kcontrol_new knew =
3922 HDA_CODEC_MUTE_MONO(ca0132_voicefx.name,
3923 VOICEFX, 1, 0, HDA_INPUT);
3924 knew.info = ca0132_voicefx_info;
3925 knew.get = ca0132_voicefx_get;
3926 knew.put = ca0132_voicefx_put;
3927 return snd_hda_ctl_add(codec, VOICEFX, snd_ctl_new1(&knew, codec));
3928}
3929
3930/*
3931 * When changing Node IDs for Mixer Controls below, make sure to update
3932 * Node IDs in ca0132_config() as well.
3933 */
3934static struct snd_kcontrol_new ca0132_mixer[] = {
3935 CA0132_CODEC_VOL("Master Playback Volume", VNID_SPK, HDA_OUTPUT),
3936 CA0132_CODEC_MUTE("Master Playback Switch", VNID_SPK, HDA_OUTPUT),
3937 CA0132_CODEC_VOL("Capture Volume", VNID_MIC, HDA_INPUT),
3938 CA0132_CODEC_MUTE("Capture Switch", VNID_MIC, HDA_INPUT),
3939 HDA_CODEC_VOLUME("Analog-Mic2 Capture Volume", 0x08, 0, HDA_INPUT),
3940 HDA_CODEC_MUTE("Analog-Mic2 Capture Switch", 0x08, 0, HDA_INPUT),
3941 HDA_CODEC_VOLUME("What U Hear Capture Volume", 0x0a, 0, HDA_INPUT),
3942 HDA_CODEC_MUTE("What U Hear Capture Switch", 0x0a, 0, HDA_INPUT),
3943 CA0132_CODEC_MUTE_MONO("Mic1-Boost (30dB) Capture Switch",
3944 0x12, 1, HDA_INPUT),
3945 CA0132_CODEC_MUTE_MONO("HP/Speaker Playback Switch",
3946 VNID_HP_SEL, 1, HDA_OUTPUT),
3947 CA0132_CODEC_MUTE_MONO("AMic1/DMic Capture Switch",
3948 VNID_AMIC1_SEL, 1, HDA_INPUT),
3949 CA0132_CODEC_MUTE_MONO("HP/Speaker Auto Detect Playback Switch",
3950 VNID_HP_ASEL, 1, HDA_OUTPUT),
3951 CA0132_CODEC_MUTE_MONO("AMic1/DMic Auto Detect Capture Switch",
3952 VNID_AMIC1_ASEL, 1, HDA_INPUT),
3953 { } /* end */
3954};
3955
Ian Minette90f29e2012-12-20 18:53:39 -08003956static int ca0132_build_controls(struct hda_codec *codec)
3957{
3958 struct ca0132_spec *spec = codec->spec;
3959 int i, num_fx;
3960 int err = 0;
3961
3962 /* Add Mixer controls */
3963 for (i = 0; i < spec->num_mixers; i++) {
3964 err = snd_hda_add_new_ctls(codec, spec->mixers[i]);
3965 if (err < 0)
3966 return err;
3967 }
3968
3969 /* Add in and out effects controls.
3970 * VoiceFX, PE and CrystalVoice are added separately.
3971 */
3972 num_fx = OUT_EFFECTS_COUNT + IN_EFFECTS_COUNT;
3973 for (i = 0; i < num_fx; i++) {
3974 err = add_fx_switch(codec, ca0132_effects[i].nid,
3975 ca0132_effects[i].name,
3976 ca0132_effects[i].direct);
3977 if (err < 0)
3978 return err;
3979 }
3980
3981 err = add_fx_switch(codec, PLAY_ENHANCEMENT, "PlayEnhancement", 0);
3982 if (err < 0)
3983 return err;
3984
3985 err = add_fx_switch(codec, CRYSTAL_VOICE, "CrystalVoice", 1);
3986 if (err < 0)
3987 return err;
3988
3989 add_voicefx(codec);
3990
3991#ifdef ENABLE_TUNING_CONTROLS
3992 add_tuning_ctls(codec);
3993#endif
3994
3995 err = snd_hda_jack_add_kctls(codec, &spec->autocfg);
3996 if (err < 0)
3997 return err;
3998
3999 if (spec->dig_out) {
4000 err = snd_hda_create_spdif_out_ctls(codec, spec->dig_out,
4001 spec->dig_out);
4002 if (err < 0)
4003 return err;
4004 err = snd_hda_create_spdif_share_sw(codec, &spec->multiout);
4005 if (err < 0)
4006 return err;
4007 /* spec->multiout.share_spdif = 1; */
4008 }
4009
4010 if (spec->dig_in) {
4011 err = snd_hda_create_spdif_in_ctls(codec, spec->dig_in);
4012 if (err < 0)
4013 return err;
4014 }
4015 return 0;
4016}
4017
Ian Minett5aaca442012-12-20 18:53:34 -08004018/*
Ian Minette90f29e2012-12-20 18:53:39 -08004019 * PCM
Ian Minett95c6e9c2011-06-15 15:35:17 -07004020 */
4021static struct hda_pcm_stream ca0132_pcm_analog_playback = {
4022 .substreams = 1,
4023 .channels_min = 2,
Ian Minett825315b2012-12-20 18:53:36 -08004024 .channels_max = 6,
Ian Minett95c6e9c2011-06-15 15:35:17 -07004025 .ops = {
4026 .prepare = ca0132_playback_pcm_prepare,
Dylan Reide8412ca2013-04-04 13:55:09 -07004027 .cleanup = ca0132_playback_pcm_cleanup,
4028 .get_delay = ca0132_playback_pcm_delay,
Ian Minett95c6e9c2011-06-15 15:35:17 -07004029 },
4030};
4031
4032static struct hda_pcm_stream ca0132_pcm_analog_capture = {
4033 .substreams = 1,
4034 .channels_min = 2,
4035 .channels_max = 2,
Ian Minett825315b2012-12-20 18:53:36 -08004036 .ops = {
4037 .prepare = ca0132_capture_pcm_prepare,
Dylan Reide8412ca2013-04-04 13:55:09 -07004038 .cleanup = ca0132_capture_pcm_cleanup,
4039 .get_delay = ca0132_capture_pcm_delay,
Ian Minett825315b2012-12-20 18:53:36 -08004040 },
Ian Minett95c6e9c2011-06-15 15:35:17 -07004041};
4042
4043static struct hda_pcm_stream ca0132_pcm_digital_playback = {
4044 .substreams = 1,
4045 .channels_min = 2,
4046 .channels_max = 2,
4047 .ops = {
Takashi Iwai27ebeb02012-08-08 17:20:18 +02004048 .open = ca0132_dig_playback_pcm_open,
4049 .close = ca0132_dig_playback_pcm_close,
Ian Minett95c6e9c2011-06-15 15:35:17 -07004050 .prepare = ca0132_dig_playback_pcm_prepare,
4051 .cleanup = ca0132_dig_playback_pcm_cleanup
4052 },
4053};
4054
4055static struct hda_pcm_stream ca0132_pcm_digital_capture = {
4056 .substreams = 1,
4057 .channels_min = 2,
4058 .channels_max = 2,
Ian Minett95c6e9c2011-06-15 15:35:17 -07004059};
4060
4061static int ca0132_build_pcms(struct hda_codec *codec)
4062{
4063 struct ca0132_spec *spec = codec->spec;
Takashi Iwaibbbc7e82015-02-27 17:43:19 +01004064 struct hda_pcm *info;
Ian Minett95c6e9c2011-06-15 15:35:17 -07004065
Takashi Iwaibbbc7e82015-02-27 17:43:19 +01004066 info = snd_hda_codec_pcm_new(codec, "CA0132 Analog");
4067 if (!info)
4068 return -ENOMEM;
Ian Minett95c6e9c2011-06-15 15:35:17 -07004069 info->stream[SNDRV_PCM_STREAM_PLAYBACK] = ca0132_pcm_analog_playback;
4070 info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = spec->dacs[0];
4071 info->stream[SNDRV_PCM_STREAM_PLAYBACK].channels_max =
4072 spec->multiout.max_channels;
4073 info->stream[SNDRV_PCM_STREAM_CAPTURE] = ca0132_pcm_analog_capture;
Ian Minett825315b2012-12-20 18:53:36 -08004074 info->stream[SNDRV_PCM_STREAM_CAPTURE].substreams = 1;
Ian Minett95c6e9c2011-06-15 15:35:17 -07004075 info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->adcs[0];
Ian Minett95c6e9c2011-06-15 15:35:17 -07004076
Takashi Iwaibbbc7e82015-02-27 17:43:19 +01004077 info = snd_hda_codec_pcm_new(codec, "CA0132 Analog Mic-In2");
4078 if (!info)
4079 return -ENOMEM;
Ian Minett825315b2012-12-20 18:53:36 -08004080 info->stream[SNDRV_PCM_STREAM_CAPTURE] = ca0132_pcm_analog_capture;
4081 info->stream[SNDRV_PCM_STREAM_CAPTURE].substreams = 1;
4082 info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->adcs[1];
Ian Minett825315b2012-12-20 18:53:36 -08004083
Takashi Iwaibbbc7e82015-02-27 17:43:19 +01004084 info = snd_hda_codec_pcm_new(codec, "CA0132 What U Hear");
4085 if (!info)
4086 return -ENOMEM;
Ian Minett825315b2012-12-20 18:53:36 -08004087 info->stream[SNDRV_PCM_STREAM_CAPTURE] = ca0132_pcm_analog_capture;
4088 info->stream[SNDRV_PCM_STREAM_CAPTURE].substreams = 1;
4089 info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->adcs[2];
Ian Minett825315b2012-12-20 18:53:36 -08004090
Ian Minett95c6e9c2011-06-15 15:35:17 -07004091 if (!spec->dig_out && !spec->dig_in)
4092 return 0;
4093
Takashi Iwaibbbc7e82015-02-27 17:43:19 +01004094 info = snd_hda_codec_pcm_new(codec, "CA0132 Digital");
4095 if (!info)
4096 return -ENOMEM;
Ian Minett95c6e9c2011-06-15 15:35:17 -07004097 info->pcm_type = HDA_PCM_TYPE_SPDIF;
4098 if (spec->dig_out) {
4099 info->stream[SNDRV_PCM_STREAM_PLAYBACK] =
4100 ca0132_pcm_digital_playback;
4101 info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = spec->dig_out;
4102 }
4103 if (spec->dig_in) {
4104 info->stream[SNDRV_PCM_STREAM_CAPTURE] =
4105 ca0132_pcm_digital_capture;
4106 info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->dig_in;
4107 }
Ian Minett95c6e9c2011-06-15 15:35:17 -07004108
4109 return 0;
4110}
4111
Ian Minett441aa6a2012-12-20 18:53:40 -08004112static void init_output(struct hda_codec *codec, hda_nid_t pin, hda_nid_t dac)
4113{
4114 if (pin) {
Takashi Iwaia0c041c2013-01-15 17:13:31 +01004115 snd_hda_set_pin_ctl(codec, pin, PIN_HP);
Ian Minett441aa6a2012-12-20 18:53:40 -08004116 if (get_wcaps(codec, pin) & AC_WCAP_OUT_AMP)
4117 snd_hda_codec_write(codec, pin, 0,
4118 AC_VERB_SET_AMP_GAIN_MUTE,
4119 AMP_OUT_UNMUTE);
4120 }
4121 if (dac && (get_wcaps(codec, dac) & AC_WCAP_OUT_AMP))
4122 snd_hda_codec_write(codec, dac, 0,
4123 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO);
4124}
4125
4126static void init_input(struct hda_codec *codec, hda_nid_t pin, hda_nid_t adc)
4127{
4128 if (pin) {
Takashi Iwaia0c041c2013-01-15 17:13:31 +01004129 snd_hda_set_pin_ctl(codec, pin, PIN_VREF80);
Ian Minett441aa6a2012-12-20 18:53:40 -08004130 if (get_wcaps(codec, pin) & AC_WCAP_IN_AMP)
4131 snd_hda_codec_write(codec, pin, 0,
4132 AC_VERB_SET_AMP_GAIN_MUTE,
4133 AMP_IN_UNMUTE(0));
4134 }
4135 if (adc && (get_wcaps(codec, adc) & AC_WCAP_IN_AMP)) {
4136 snd_hda_codec_write(codec, adc, 0, AC_VERB_SET_AMP_GAIN_MUTE,
4137 AMP_IN_UNMUTE(0));
4138
4139 /* init to 0 dB and unmute. */
4140 snd_hda_codec_amp_stereo(codec, adc, HDA_INPUT, 0,
4141 HDA_AMP_VOLMASK, 0x5a);
4142 snd_hda_codec_amp_stereo(codec, adc, HDA_INPUT, 0,
4143 HDA_AMP_MUTE, 0);
4144 }
4145}
4146
Ian Minett5aaca442012-12-20 18:53:34 -08004147static void refresh_amp_caps(struct hda_codec *codec, hda_nid_t nid, int dir)
4148{
4149 unsigned int caps;
4150
4151 caps = snd_hda_param_read(codec, nid, dir == HDA_OUTPUT ?
4152 AC_PAR_AMP_OUT_CAP : AC_PAR_AMP_IN_CAP);
4153 snd_hda_override_amp_caps(codec, nid, dir, caps);
4154}
4155
4156/*
4157 * Switch between Digital built-in mic and analog mic.
4158 */
4159static void ca0132_set_dmic(struct hda_codec *codec, int enable)
4160{
4161 struct ca0132_spec *spec = codec->spec;
4162 unsigned int tmp;
4163 u8 val;
4164 unsigned int oldval;
4165
Takashi Iwai4e76a882014-02-25 12:21:03 +01004166 codec_dbg(codec, "ca0132_set_dmic: enable=%d\n", enable);
Ian Minett5aaca442012-12-20 18:53:34 -08004167
4168 oldval = stop_mic1(codec);
4169 ca0132_set_vipsource(codec, 0);
4170 if (enable) {
4171 /* set DMic input as 2-ch */
4172 tmp = FLOAT_TWO;
4173 dspio_set_uint_param(codec, 0x80, 0x00, tmp);
4174
4175 val = spec->dmic_ctl;
4176 val |= 0x80;
4177 snd_hda_codec_write(codec, spec->input_pins[0], 0,
4178 VENDOR_CHIPIO_DMIC_CTL_SET, val);
4179
4180 if (!(spec->dmic_ctl & 0x20))
4181 chipio_set_control_flag(codec, CONTROL_FLAG_DMIC, 1);
4182 } else {
4183 /* set AMic input as mono */
4184 tmp = FLOAT_ONE;
4185 dspio_set_uint_param(codec, 0x80, 0x00, tmp);
4186
4187 val = spec->dmic_ctl;
4188 /* clear bit7 and bit5 to disable dmic */
4189 val &= 0x5f;
4190 snd_hda_codec_write(codec, spec->input_pins[0], 0,
4191 VENDOR_CHIPIO_DMIC_CTL_SET, val);
4192
4193 if (!(spec->dmic_ctl & 0x20))
4194 chipio_set_control_flag(codec, CONTROL_FLAG_DMIC, 0);
4195 }
4196 ca0132_set_vipsource(codec, 1);
4197 resume_mic1(codec, oldval);
4198}
4199
4200/*
4201 * Initialization for Digital Mic.
4202 */
4203static void ca0132_init_dmic(struct hda_codec *codec)
4204{
4205 struct ca0132_spec *spec = codec->spec;
4206 u8 val;
4207
4208 /* Setup Digital Mic here, but don't enable.
4209 * Enable based on jack detect.
4210 */
4211
4212 /* MCLK uses MPIO1, set to enable.
4213 * Bit 2-0: MPIO select
4214 * Bit 3: set to disable
4215 * Bit 7-4: reserved
4216 */
4217 val = 0x01;
4218 snd_hda_codec_write(codec, spec->input_pins[0], 0,
4219 VENDOR_CHIPIO_DMIC_MCLK_SET, val);
4220
4221 /* Data1 uses MPIO3. Data2 not use
4222 * Bit 2-0: Data1 MPIO select
4223 * Bit 3: set disable Data1
4224 * Bit 6-4: Data2 MPIO select
4225 * Bit 7: set disable Data2
4226 */
4227 val = 0x83;
4228 snd_hda_codec_write(codec, spec->input_pins[0], 0,
4229 VENDOR_CHIPIO_DMIC_PIN_SET, val);
4230
4231 /* Use Ch-0 and Ch-1. Rate is 48K, mode 1. Disable DMic first.
4232 * Bit 3-0: Channel mask
4233 * Bit 4: set for 48KHz, clear for 32KHz
4234 * Bit 5: mode
4235 * Bit 6: set to select Data2, clear for Data1
4236 * Bit 7: set to enable DMic, clear for AMic
4237 */
4238 val = 0x23;
4239 /* keep a copy of dmic ctl val for enable/disable dmic purpuse */
4240 spec->dmic_ctl = val;
4241 snd_hda_codec_write(codec, spec->input_pins[0], 0,
4242 VENDOR_CHIPIO_DMIC_CTL_SET, val);
4243}
4244
4245/*
4246 * Initialization for Analog Mic 2
4247 */
4248static void ca0132_init_analog_mic2(struct hda_codec *codec)
4249{
4250 struct ca0132_spec *spec = codec->spec;
4251
4252 mutex_lock(&spec->chipio_mutex);
4253 snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
4254 VENDOR_CHIPIO_8051_ADDRESS_LOW, 0x20);
4255 snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
4256 VENDOR_CHIPIO_8051_ADDRESS_HIGH, 0x19);
4257 snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
4258 VENDOR_CHIPIO_8051_DATA_WRITE, 0x00);
4259 snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
4260 VENDOR_CHIPIO_8051_ADDRESS_LOW, 0x2D);
4261 snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
4262 VENDOR_CHIPIO_8051_ADDRESS_HIGH, 0x19);
4263 snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
4264 VENDOR_CHIPIO_8051_DATA_WRITE, 0x00);
4265 mutex_unlock(&spec->chipio_mutex);
4266}
4267
4268static void ca0132_refresh_widget_caps(struct hda_codec *codec)
4269{
4270 struct ca0132_spec *spec = codec->spec;
4271 int i;
Ian Minett5aaca442012-12-20 18:53:34 -08004272
Takashi Iwai4e76a882014-02-25 12:21:03 +01004273 codec_dbg(codec, "ca0132_refresh_widget_caps.\n");
Takashi Iwai7639a062015-03-03 10:07:24 +01004274 snd_hda_codec_update_widgets(codec);
Ian Minett5aaca442012-12-20 18:53:34 -08004275
4276 for (i = 0; i < spec->multiout.num_dacs; i++)
4277 refresh_amp_caps(codec, spec->dacs[i], HDA_OUTPUT);
4278
4279 for (i = 0; i < spec->num_outputs; i++)
4280 refresh_amp_caps(codec, spec->out_pins[i], HDA_OUTPUT);
4281
4282 for (i = 0; i < spec->num_inputs; i++) {
4283 refresh_amp_caps(codec, spec->adcs[i], HDA_INPUT);
4284 refresh_amp_caps(codec, spec->input_pins[i], HDA_INPUT);
4285 }
4286}
4287
4288/*
4289 * Setup default parameters for DSP
4290 */
4291static void ca0132_setup_defaults(struct hda_codec *codec)
4292{
Dylan Reide8f1bd52013-03-14 17:27:45 -07004293 struct ca0132_spec *spec = codec->spec;
Ian Minett5aaca442012-12-20 18:53:34 -08004294 unsigned int tmp;
4295 int num_fx;
4296 int idx, i;
4297
Dylan Reide8f1bd52013-03-14 17:27:45 -07004298 if (spec->dsp_state != DSP_DOWNLOADED)
Ian Minett5aaca442012-12-20 18:53:34 -08004299 return;
4300
4301 /* out, in effects + voicefx */
4302 num_fx = OUT_EFFECTS_COUNT + IN_EFFECTS_COUNT + 1;
4303 for (idx = 0; idx < num_fx; idx++) {
4304 for (i = 0; i <= ca0132_effects[idx].params; i++) {
4305 dspio_set_uint_param(codec, ca0132_effects[idx].mid,
4306 ca0132_effects[idx].reqs[i],
4307 ca0132_effects[idx].def_vals[i]);
4308 }
4309 }
4310
4311 /*remove DSP headroom*/
4312 tmp = FLOAT_ZERO;
4313 dspio_set_uint_param(codec, 0x96, 0x3C, tmp);
4314
4315 /*set speaker EQ bypass attenuation*/
4316 dspio_set_uint_param(codec, 0x8f, 0x01, tmp);
4317
4318 /* set AMic1 and AMic2 as mono mic */
4319 tmp = FLOAT_ONE;
4320 dspio_set_uint_param(codec, 0x80, 0x00, tmp);
4321 dspio_set_uint_param(codec, 0x80, 0x01, tmp);
4322
4323 /* set AMic1 as CrystalVoice input */
4324 tmp = FLOAT_ONE;
4325 dspio_set_uint_param(codec, 0x80, 0x05, tmp);
4326
4327 /* set WUH source */
4328 tmp = FLOAT_TWO;
4329 dspio_set_uint_param(codec, 0x31, 0x00, tmp);
4330}
4331
4332/*
4333 * Initialization of flags in chip
4334 */
4335static void ca0132_init_flags(struct hda_codec *codec)
4336{
4337 chipio_set_control_flag(codec, CONTROL_FLAG_IDLE_ENABLE, 0);
4338 chipio_set_control_flag(codec, CONTROL_FLAG_PORT_A_COMMON_MODE, 0);
4339 chipio_set_control_flag(codec, CONTROL_FLAG_PORT_D_COMMON_MODE, 0);
4340 chipio_set_control_flag(codec, CONTROL_FLAG_PORT_A_10KOHM_LOAD, 0);
4341 chipio_set_control_flag(codec, CONTROL_FLAG_PORT_D_10KOHM_LOAD, 0);
4342 chipio_set_control_flag(codec, CONTROL_FLAG_ADC_C_HIGH_PASS, 1);
4343}
4344
4345/*
4346 * Initialization of parameters in chip
4347 */
4348static void ca0132_init_params(struct hda_codec *codec)
4349{
4350 chipio_set_control_param(codec, CONTROL_PARAM_PORTA_160OHM_GAIN, 6);
4351 chipio_set_control_param(codec, CONTROL_PARAM_PORTD_160OHM_GAIN, 6);
4352}
Ian Minett95c6e9c2011-06-15 15:35:17 -07004353
Ian Minette90f29e2012-12-20 18:53:39 -08004354static void ca0132_set_dsp_msr(struct hda_codec *codec, bool is96k)
4355{
4356 chipio_set_control_flag(codec, CONTROL_FLAG_DSP_96KHZ, is96k);
4357 chipio_set_control_flag(codec, CONTROL_FLAG_DAC_96KHZ, is96k);
4358 chipio_set_control_flag(codec, CONTROL_FLAG_SRC_RATE_96KHZ, is96k);
4359 chipio_set_control_flag(codec, CONTROL_FLAG_SRC_CLOCK_196MHZ, is96k);
4360 chipio_set_control_flag(codec, CONTROL_FLAG_ADC_B_96KHZ, is96k);
4361 chipio_set_control_flag(codec, CONTROL_FLAG_ADC_C_96KHZ, is96k);
4362
Ian Minett406261c2012-12-20 18:53:41 -08004363 chipio_set_conn_rate(codec, MEM_CONNID_MICIN1, SR_96_000);
4364 chipio_set_conn_rate(codec, MEM_CONNID_MICOUT1, SR_96_000);
Ian Minette90f29e2012-12-20 18:53:39 -08004365 chipio_set_conn_rate(codec, MEM_CONNID_WUH, SR_48_000);
4366}
4367
4368static bool ca0132_download_dsp_images(struct hda_codec *codec)
4369{
4370 bool dsp_loaded = false;
4371 const struct dsp_image_seg *dsp_os_image;
Takashi Iwai15e4ba62013-01-15 17:08:38 +01004372 const struct firmware *fw_entry;
Ian Minette90f29e2012-12-20 18:53:39 -08004373
Takashi Iwai6efdd852015-02-27 16:09:22 +01004374 if (request_firmware(&fw_entry, EFX_FILE, codec->card->dev) != 0)
Ian Minette90f29e2012-12-20 18:53:39 -08004375 return false;
4376
Takashi Iwai15e4ba62013-01-15 17:08:38 +01004377 dsp_os_image = (struct dsp_image_seg *)(fw_entry->data);
Dylan Reidd1d28502013-03-14 17:27:44 -07004378 if (dspload_image(codec, dsp_os_image, 0, 0, true, 0)) {
Takashi Iwaid9684bb2015-10-26 16:54:16 +01004379 codec_err(codec, "ca0132 DSP load image failed\n");
Dylan Reidd1d28502013-03-14 17:27:44 -07004380 goto exit_download;
4381 }
4382
Ian Minette90f29e2012-12-20 18:53:39 -08004383 dsp_loaded = dspload_wait_loaded(codec);
4384
Dylan Reidd1d28502013-03-14 17:27:44 -07004385exit_download:
Takashi Iwai15e4ba62013-01-15 17:08:38 +01004386 release_firmware(fw_entry);
4387
Ian Minette90f29e2012-12-20 18:53:39 -08004388 return dsp_loaded;
4389}
4390
4391static void ca0132_download_dsp(struct hda_codec *codec)
4392{
4393 struct ca0132_spec *spec = codec->spec;
4394
Takashi Iwai9a0869f2013-02-07 12:41:40 +01004395#ifndef CONFIG_SND_HDA_CODEC_CA0132_DSP
4396 return; /* NOP */
4397#endif
Ian Minette90f29e2012-12-20 18:53:39 -08004398
Takashi Iwaie24aa0a2014-08-10 13:30:08 +02004399 if (spec->dsp_state == DSP_DOWNLOAD_FAILED)
4400 return; /* don't retry failures */
4401
Dylan Reidb714a712013-03-14 17:27:46 -07004402 chipio_enable_clocks(codec);
4403 spec->dsp_state = DSP_DOWNLOADING;
4404 if (!ca0132_download_dsp_images(codec))
4405 spec->dsp_state = DSP_DOWNLOAD_FAILED;
4406 else
4407 spec->dsp_state = DSP_DOWNLOADED;
Ian Minette90f29e2012-12-20 18:53:39 -08004408
4409 if (spec->dsp_state == DSP_DOWNLOADED)
4410 ca0132_set_dsp_msr(codec, true);
4411}
4412
Takashi Iwaif8fb1172014-09-11 15:53:26 +02004413static void ca0132_process_dsp_response(struct hda_codec *codec,
4414 struct hda_jack_callback *callback)
Ian Minette90f29e2012-12-20 18:53:39 -08004415{
4416 struct ca0132_spec *spec = codec->spec;
4417
Takashi Iwai4e76a882014-02-25 12:21:03 +01004418 codec_dbg(codec, "ca0132_process_dsp_response\n");
Ian Minette90f29e2012-12-20 18:53:39 -08004419 if (spec->wait_scp) {
4420 if (dspio_get_response_data(codec) >= 0)
4421 spec->wait_scp = 0;
4422 }
4423
4424 dspio_clear_response_queue(codec);
4425}
4426
Takashi Iwaif8fb1172014-09-11 15:53:26 +02004427static void hp_callback(struct hda_codec *codec, struct hda_jack_callback *cb)
Ian Minette90f29e2012-12-20 18:53:39 -08004428{
Chih-Chung Chang993884f2013-03-25 10:39:23 -07004429 struct ca0132_spec *spec = codec->spec;
Takashi Iwai2ebab402016-02-09 10:23:52 +01004430 struct hda_jack_tbl *tbl;
Ian Minette90f29e2012-12-20 18:53:39 -08004431
Takashi Iwaif8fb1172014-09-11 15:53:26 +02004432 /* Delay enabling the HP amp, to let the mic-detection
4433 * state machine run.
4434 */
4435 cancel_delayed_work_sync(&spec->unsol_hp_work);
Takashi Iwai2f35c632015-02-27 22:43:26 +01004436 schedule_delayed_work(&spec->unsol_hp_work, msecs_to_jiffies(500));
Takashi Iwai2ebab402016-02-09 10:23:52 +01004437 tbl = snd_hda_jack_tbl_get(codec, cb->nid);
4438 if (tbl)
4439 tbl->block_report = 1;
Takashi Iwaif8fb1172014-09-11 15:53:26 +02004440}
Ian Minette90f29e2012-12-20 18:53:39 -08004441
Takashi Iwaif8fb1172014-09-11 15:53:26 +02004442static void amic_callback(struct hda_codec *codec, struct hda_jack_callback *cb)
4443{
4444 ca0132_select_mic(codec);
4445}
4446
4447static void ca0132_init_unsol(struct hda_codec *codec)
4448{
Gabriele Martinod5c016b2015-05-18 21:15:13 +02004449 struct ca0132_spec *spec = codec->spec;
4450 snd_hda_jack_detect_enable_callback(codec, spec->unsol_tag_hp, hp_callback);
4451 snd_hda_jack_detect_enable_callback(codec, spec->unsol_tag_amic1,
Takashi Iwaif8fb1172014-09-11 15:53:26 +02004452 amic_callback);
4453 snd_hda_jack_detect_enable_callback(codec, UNSOL_TAG_DSP,
4454 ca0132_process_dsp_response);
Ian Minette90f29e2012-12-20 18:53:39 -08004455}
4456
Ian Minett5aaca442012-12-20 18:53:34 -08004457/*
4458 * Verbs tables.
4459 */
4460
4461/* Sends before DSP download. */
4462static struct hda_verb ca0132_base_init_verbs[] = {
4463 /*enable ct extension*/
4464 {0x15, VENDOR_CHIPIO_CT_EXTENSIONS_ENABLE, 0x1},
Ian Minett5aaca442012-12-20 18:53:34 -08004465 {}
4466};
4467
4468/* Send at exit. */
4469static struct hda_verb ca0132_base_exit_verbs[] = {
4470 /*set afg to D3*/
4471 {0x01, AC_VERB_SET_POWER_STATE, 0x03},
4472 /*disable ct extension*/
4473 {0x15, VENDOR_CHIPIO_CT_EXTENSIONS_ENABLE, 0},
4474 {}
4475};
4476
4477/* Other verbs tables. Sends after DSP download. */
4478static struct hda_verb ca0132_init_verbs0[] = {
4479 /* chip init verbs */
4480 {0x15, 0x70D, 0xF0},
4481 {0x15, 0x70E, 0xFE},
4482 {0x15, 0x707, 0x75},
4483 {0x15, 0x707, 0xD3},
4484 {0x15, 0x707, 0x09},
4485 {0x15, 0x707, 0x53},
4486 {0x15, 0x707, 0xD4},
4487 {0x15, 0x707, 0xEF},
4488 {0x15, 0x707, 0x75},
4489 {0x15, 0x707, 0xD3},
4490 {0x15, 0x707, 0x09},
4491 {0x15, 0x707, 0x02},
4492 {0x15, 0x707, 0x37},
4493 {0x15, 0x707, 0x78},
4494 {0x15, 0x53C, 0xCE},
4495 {0x15, 0x575, 0xC9},
4496 {0x15, 0x53D, 0xCE},
4497 {0x15, 0x5B7, 0xC9},
4498 {0x15, 0x70D, 0xE8},
4499 {0x15, 0x70E, 0xFE},
4500 {0x15, 0x707, 0x02},
4501 {0x15, 0x707, 0x68},
4502 {0x15, 0x707, 0x62},
4503 {0x15, 0x53A, 0xCE},
4504 {0x15, 0x546, 0xC9},
4505 {0x15, 0x53B, 0xCE},
4506 {0x15, 0x5E8, 0xC9},
4507 {0x15, 0x717, 0x0D},
4508 {0x15, 0x718, 0x20},
4509 {}
4510};
4511
Ian Minett95c6e9c2011-06-15 15:35:17 -07004512static void ca0132_init_chip(struct hda_codec *codec)
4513{
4514 struct ca0132_spec *spec = codec->spec;
Ian Minett5aaca442012-12-20 18:53:34 -08004515 int num_fx;
4516 int i;
4517 unsigned int on;
Ian Minett95c6e9c2011-06-15 15:35:17 -07004518
4519 mutex_init(&spec->chipio_mutex);
Ian Minett5aaca442012-12-20 18:53:34 -08004520
4521 spec->cur_out_type = SPEAKER_OUT;
4522 spec->cur_mic_type = DIGITAL_MIC;
4523 spec->cur_mic_boost = 0;
4524
4525 for (i = 0; i < VNODES_COUNT; i++) {
4526 spec->vnode_lvol[i] = 0x5a;
4527 spec->vnode_rvol[i] = 0x5a;
4528 spec->vnode_lswitch[i] = 0;
4529 spec->vnode_rswitch[i] = 0;
4530 }
4531
4532 /*
4533 * Default states for effects are in ca0132_effects[].
4534 */
4535 num_fx = OUT_EFFECTS_COUNT + IN_EFFECTS_COUNT;
4536 for (i = 0; i < num_fx; i++) {
4537 on = (unsigned int)ca0132_effects[i].reqs[0];
4538 spec->effects_switch[i] = on ? 1 : 0;
4539 }
4540
4541 spec->voicefx_val = 0;
4542 spec->effects_switch[PLAY_ENHANCEMENT - EFFECT_START_NID] = 1;
4543 spec->effects_switch[CRYSTAL_VOICE - EFFECT_START_NID] = 0;
4544
Ian Minett44f0c972012-12-20 18:53:38 -08004545#ifdef ENABLE_TUNING_CONTROLS
4546 ca0132_init_tuning_defaults(codec);
4547#endif
Ian Minett95c6e9c2011-06-15 15:35:17 -07004548}
4549
4550static void ca0132_exit_chip(struct hda_codec *codec)
4551{
4552 /* put any chip cleanup stuffs here. */
Ian Minett5aaca442012-12-20 18:53:34 -08004553
4554 if (dspload_is_loaded(codec))
4555 dsp_reset(codec);
Ian Minett95c6e9c2011-06-15 15:35:17 -07004556}
4557
4558static int ca0132_init(struct hda_codec *codec)
4559{
4560 struct ca0132_spec *spec = codec->spec;
4561 struct auto_pin_cfg *cfg = &spec->autocfg;
4562 int i;
4563
Takashi Iwaie24aa0a2014-08-10 13:30:08 +02004564 if (spec->dsp_state != DSP_DOWNLOAD_FAILED)
4565 spec->dsp_state = DSP_DOWNLOAD_INIT;
Takashi Iwai4a8b89f2013-02-12 10:15:15 +01004566 spec->curr_chip_addx = INVALID_CHIP_ADDRESS;
Ian Minett5aaca442012-12-20 18:53:34 -08004567
Takashi Iwai664c7152015-04-08 11:43:14 +02004568 snd_hda_power_up_pm(codec);
Ian Minett5aaca442012-12-20 18:53:34 -08004569
Takashi Iwaif8fb1172014-09-11 15:53:26 +02004570 ca0132_init_unsol(codec);
4571
Ian Minett5aaca442012-12-20 18:53:34 -08004572 ca0132_init_params(codec);
4573 ca0132_init_flags(codec);
4574 snd_hda_sequence_write(codec, spec->base_init_verbs);
Ian Minett01ef7db2012-09-20 20:29:16 -07004575 ca0132_download_dsp(codec);
Ian Minett5aaca442012-12-20 18:53:34 -08004576 ca0132_refresh_widget_caps(codec);
4577 ca0132_setup_defaults(codec);
4578 ca0132_init_analog_mic2(codec);
4579 ca0132_init_dmic(codec);
Ian Minett01ef7db2012-09-20 20:29:16 -07004580
Ian Minett5aaca442012-12-20 18:53:34 -08004581 for (i = 0; i < spec->num_outputs; i++)
4582 init_output(codec, spec->out_pins[i], spec->dacs[0]);
4583
Ian Minett95c6e9c2011-06-15 15:35:17 -07004584 init_output(codec, cfg->dig_out_pins[0], spec->dig_out);
4585
4586 for (i = 0; i < spec->num_inputs; i++)
4587 init_input(codec, spec->input_pins[i], spec->adcs[i]);
4588
4589 init_input(codec, cfg->dig_in_pin, spec->dig_in);
4590
Gabriele Martinod5c016b2015-05-18 21:15:13 +02004591 snd_hda_sequence_write(codec, spec->chip_init_verbs);
4592 snd_hda_sequence_write(codec, spec->spec_init_verbs);
Ian Minett5aaca442012-12-20 18:53:34 -08004593
4594 ca0132_select_out(codec);
4595 ca0132_select_mic(codec);
4596
Ian Minetta73d5112012-12-20 18:53:37 -08004597 snd_hda_jack_report_sync(codec);
4598
Takashi Iwai664c7152015-04-08 11:43:14 +02004599 snd_hda_power_down_pm(codec);
Ian Minett95c6e9c2011-06-15 15:35:17 -07004600
4601 return 0;
4602}
4603
Ian Minett95c6e9c2011-06-15 15:35:17 -07004604static void ca0132_free(struct hda_codec *codec)
4605{
Ian Minett5aaca442012-12-20 18:53:34 -08004606 struct ca0132_spec *spec = codec->spec;
4607
Chih-Chung Chang993884f2013-03-25 10:39:23 -07004608 cancel_delayed_work_sync(&spec->unsol_hp_work);
Ian Minett5aaca442012-12-20 18:53:34 -08004609 snd_hda_power_up(codec);
4610 snd_hda_sequence_write(codec, spec->base_exit_verbs);
Ian Minett95c6e9c2011-06-15 15:35:17 -07004611 ca0132_exit_chip(codec);
Ian Minett5aaca442012-12-20 18:53:34 -08004612 snd_hda_power_down(codec);
Gabriele Martinod5c016b2015-05-18 21:15:13 +02004613 kfree(spec->spec_init_verbs);
Ian Minett95c6e9c2011-06-15 15:35:17 -07004614 kfree(codec->spec);
4615}
4616
4617static struct hda_codec_ops ca0132_patch_ops = {
4618 .build_controls = ca0132_build_controls,
4619 .build_pcms = ca0132_build_pcms,
4620 .init = ca0132_init,
4621 .free = ca0132_free,
Takashi Iwaif8fb1172014-09-11 15:53:26 +02004622 .unsol_event = snd_hda_jack_unsol_event,
Ian Minett95c6e9c2011-06-15 15:35:17 -07004623};
4624
Ian Minett441aa6a2012-12-20 18:53:40 -08004625static void ca0132_config(struct hda_codec *codec)
4626{
4627 struct ca0132_spec *spec = codec->spec;
4628 struct auto_pin_cfg *cfg = &spec->autocfg;
4629
4630 spec->dacs[0] = 0x2;
4631 spec->dacs[1] = 0x3;
4632 spec->dacs[2] = 0x4;
4633
4634 spec->multiout.dac_nids = spec->dacs;
4635 spec->multiout.num_dacs = 3;
4636 spec->multiout.max_channels = 2;
4637
Gabriele Martinod5c016b2015-05-18 21:15:13 +02004638 if (spec->quirk == QUIRK_ALIENWARE) {
4639 codec_dbg(codec, "ca0132_config: QUIRK_ALIENWARE applied.\n");
Takashi Iwaife14f392015-08-10 16:53:32 +02004640 snd_hda_apply_pincfgs(codec, alienware_pincfgs);
4641
4642 spec->num_outputs = 2;
4643 spec->out_pins[0] = 0x0b; /* speaker out */
Gabriele Martinod5c016b2015-05-18 21:15:13 +02004644 spec->out_pins[1] = 0x0f;
Takashi Iwaife14f392015-08-10 16:53:32 +02004645 spec->shared_out_nid = 0x2;
4646 spec->unsol_tag_hp = 0x0f;
4647
4648 spec->adcs[0] = 0x7; /* digital mic / analog mic1 */
4649 spec->adcs[1] = 0x8; /* analog mic2 */
4650 spec->adcs[2] = 0xa; /* what u hear */
4651
4652 spec->num_inputs = 3;
4653 spec->input_pins[0] = 0x12;
4654 spec->input_pins[1] = 0x11;
4655 spec->input_pins[2] = 0x13;
4656 spec->shared_mic_nid = 0x7;
4657 spec->unsol_tag_amic1 = 0x11;
4658 } else {
4659 spec->num_outputs = 2;
4660 spec->out_pins[0] = 0x0b; /* speaker out */
Gabriele Martinod5c016b2015-05-18 21:15:13 +02004661 spec->out_pins[1] = 0x10; /* headphone out */
Takashi Iwaife14f392015-08-10 16:53:32 +02004662 spec->shared_out_nid = 0x2;
4663 spec->unsol_tag_hp = spec->out_pins[1];
4664
4665 spec->adcs[0] = 0x7; /* digital mic / analog mic1 */
4666 spec->adcs[1] = 0x8; /* analog mic2 */
4667 spec->adcs[2] = 0xa; /* what u hear */
4668
4669 spec->num_inputs = 3;
4670 spec->input_pins[0] = 0x12;
4671 spec->input_pins[1] = 0x11;
4672 spec->input_pins[2] = 0x13;
4673 spec->shared_mic_nid = 0x7;
4674 spec->unsol_tag_amic1 = spec->input_pins[0];
4675
4676 /* SPDIF I/O */
4677 spec->dig_out = 0x05;
4678 spec->multiout.dig_out_nid = spec->dig_out;
4679 cfg->dig_out_pins[0] = 0x0c;
4680 cfg->dig_outs = 1;
4681 cfg->dig_out_type[0] = HDA_PCM_TYPE_SPDIF;
4682 spec->dig_in = 0x09;
4683 cfg->dig_in_pin = 0x0e;
4684 cfg->dig_in_type = HDA_PCM_TYPE_SPDIF;
Gabriele Martinod5c016b2015-05-18 21:15:13 +02004685 }
Ian Minett441aa6a2012-12-20 18:53:40 -08004686}
4687
Gabriele Martinod5c016b2015-05-18 21:15:13 +02004688static int ca0132_prepare_verbs(struct hda_codec *codec)
4689{
4690/* Verbs + terminator (an empty element) */
4691#define NUM_SPEC_VERBS 4
4692 struct ca0132_spec *spec = codec->spec;
4693
4694 spec->chip_init_verbs = ca0132_init_verbs0;
4695 spec->spec_init_verbs = kzalloc(sizeof(struct hda_verb) * NUM_SPEC_VERBS, GFP_KERNEL);
4696 if (!spec->spec_init_verbs)
4697 return -ENOMEM;
4698
4699 /* HP jack autodetection */
4700 spec->spec_init_verbs[0].nid = spec->unsol_tag_hp;
4701 spec->spec_init_verbs[0].param = AC_VERB_SET_UNSOLICITED_ENABLE;
4702 spec->spec_init_verbs[0].verb = AC_USRSP_EN | spec->unsol_tag_hp;
4703
4704 /* MIC1 jack autodetection */
4705 spec->spec_init_verbs[1].nid = spec->unsol_tag_amic1;
4706 spec->spec_init_verbs[1].param = AC_VERB_SET_UNSOLICITED_ENABLE;
4707 spec->spec_init_verbs[1].verb = AC_USRSP_EN | spec->unsol_tag_amic1;
4708
4709 /* config EAPD */
4710 spec->spec_init_verbs[2].nid = 0x0b;
4711 spec->spec_init_verbs[2].param = 0x78D;
4712 spec->spec_init_verbs[2].verb = 0x00;
4713
4714 /* Previously commented configuration */
4715 /*
4716 spec->spec_init_verbs[3].nid = 0x0b;
4717 spec->spec_init_verbs[3].param = AC_VERB_SET_EAPD_BTLENABLE;
4718 spec->spec_init_verbs[3].verb = 0x02;
4719
4720 spec->spec_init_verbs[4].nid = 0x10;
4721 spec->spec_init_verbs[4].param = 0x78D;
4722 spec->spec_init_verbs[4].verb = 0x02;
4723
4724 spec->spec_init_verbs[5].nid = 0x10;
4725 spec->spec_init_verbs[5].param = AC_VERB_SET_EAPD_BTLENABLE;
4726 spec->spec_init_verbs[5].verb = 0x02;
4727 */
4728
4729 /* Terminator: spec->spec_init_verbs[NUM_SPEC_VERBS-1] */
4730 return 0;
4731}
4732
Ian Minett95c6e9c2011-06-15 15:35:17 -07004733static int patch_ca0132(struct hda_codec *codec)
4734{
4735 struct ca0132_spec *spec;
Ian Minetta73d5112012-12-20 18:53:37 -08004736 int err;
Gabriele Martinod5c016b2015-05-18 21:15:13 +02004737 const struct snd_pci_quirk *quirk;
Ian Minett95c6e9c2011-06-15 15:35:17 -07004738
Takashi Iwai4e76a882014-02-25 12:21:03 +01004739 codec_dbg(codec, "patch_ca0132\n");
Ian Minett95c6e9c2011-06-15 15:35:17 -07004740
4741 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
4742 if (!spec)
4743 return -ENOMEM;
4744 codec->spec = spec;
Chih-Chung Chang993884f2013-03-25 10:39:23 -07004745 spec->codec = codec;
Ian Minett95c6e9c2011-06-15 15:35:17 -07004746
Takashi Iwai225068a2015-05-29 10:42:14 +02004747 codec->patch_ops = ca0132_patch_ops;
4748 codec->pcm_format_first = 1;
4749 codec->no_sticky_stream = 1;
4750
Gabriele Martinod5c016b2015-05-18 21:15:13 +02004751 /* Detect codec quirk */
4752 quirk = snd_pci_quirk_lookup(codec->bus->pci, ca0132_quirks);
4753 if (quirk)
4754 spec->quirk = quirk->value;
4755 else
4756 spec->quirk = QUIRK_NONE;
4757
Takashi Iwaie24aa0a2014-08-10 13:30:08 +02004758 spec->dsp_state = DSP_DOWNLOAD_INIT;
Ian Minetta7e76272012-12-20 18:53:35 -08004759 spec->num_mixers = 1;
4760 spec->mixers[0] = ca0132_mixer;
4761
Ian Minett5aaca442012-12-20 18:53:34 -08004762 spec->base_init_verbs = ca0132_base_init_verbs;
4763 spec->base_exit_verbs = ca0132_base_exit_verbs;
Ian Minett5aaca442012-12-20 18:53:34 -08004764
Chih-Chung Chang993884f2013-03-25 10:39:23 -07004765 INIT_DELAYED_WORK(&spec->unsol_hp_work, ca0132_unsol_hp_delayed);
4766
Ian Minett95c6e9c2011-06-15 15:35:17 -07004767 ca0132_init_chip(codec);
4768
4769 ca0132_config(codec);
4770
Gabriele Martinod5c016b2015-05-18 21:15:13 +02004771 err = ca0132_prepare_verbs(codec);
4772 if (err < 0)
4773 return err;
4774
Ian Minetta73d5112012-12-20 18:53:37 -08004775 err = snd_hda_parse_pin_def_config(codec, &spec->autocfg, NULL);
4776 if (err < 0)
4777 return err;
4778
Ian Minett95c6e9c2011-06-15 15:35:17 -07004779 return 0;
4780}
4781
4782/*
4783 * patch entries
4784 */
Takashi Iwaib9a94a92015-10-01 16:20:04 +02004785static struct hda_device_id snd_hda_id_ca0132[] = {
4786 HDA_CODEC_ENTRY(0x11020011, "CA0132", patch_ca0132),
Ian Minett95c6e9c2011-06-15 15:35:17 -07004787 {} /* terminator */
4788};
Takashi Iwaib9a94a92015-10-01 16:20:04 +02004789MODULE_DEVICE_TABLE(hdaudio, snd_hda_id_ca0132);
Ian Minett95c6e9c2011-06-15 15:35:17 -07004790
4791MODULE_LICENSE("GPL");
Ian Minett406261c2012-12-20 18:53:41 -08004792MODULE_DESCRIPTION("Creative Sound Core3D codec");
Ian Minett95c6e9c2011-06-15 15:35:17 -07004793
Takashi Iwaid8a766a2015-02-17 15:25:37 +01004794static struct hda_codec_driver ca0132_driver = {
Takashi Iwaib9a94a92015-10-01 16:20:04 +02004795 .id = snd_hda_id_ca0132,
Ian Minett95c6e9c2011-06-15 15:35:17 -07004796};
4797
Takashi Iwaid8a766a2015-02-17 15:25:37 +01004798module_hda_codec_driver(ca0132_driver);