2 * HD audio interface patch for Creative CA0132 chip
4 * Copyright (c) 2011, Creative Technology Ltd.
6 * Based on patch_ca0110.c
7 * Copyright (c) 2008 Takashi Iwai <tiwai@suse.de>
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.
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.
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
24 #include <linux/init.h>
25 #include <linux/delay.h>
26 #include <linux/slab.h>
27 #include <linux/mutex.h>
28 #include <linux/module.h>
29 #include <linux/firmware.h>
30 #include <linux/kernel.h>
31 #include <linux/types.h>
33 #include <linux/pci.h>
34 #include <sound/core.h>
35 #include "hda_codec.h"
36 #include "hda_local.h"
37 #include "hda_auto_parser.h"
40 #include "ca0132_regs.h"
42 /* Enable this to see controls for tuning purpose. */
43 /*#define ENABLE_TUNING_CONTROLS*/
45 #ifdef ENABLE_TUNING_CONTROLS
46 #include <sound/tlv.h>
49 #define FLOAT_ZERO 0x00000000
50 #define FLOAT_ONE 0x3f800000
51 #define FLOAT_TWO 0x40000000
52 #define FLOAT_THREE 0x40400000
53 #define FLOAT_EIGHT 0x41000000
54 #define FLOAT_MINUS_5 0xc0a00000
56 #define UNSOL_TAG_DSP 0x16
58 #define DSP_DMA_WRITE_BUFLEN_INIT (1UL<<18)
59 #define DSP_DMA_WRITE_BUFLEN_OVLY (1UL<<15)
61 #define DMA_TRANSFER_FRAME_SIZE_NWORDS 8
62 #define DMA_TRANSFER_MAX_FRAME_SIZE_NWORDS 32
63 #define DMA_OVERLAY_FRAME_SIZE_NWORDS 2
65 #define MASTERCONTROL 0x80
66 #define MASTERCONTROL_ALLOC_DMA_CHAN 10
67 #define MASTERCONTROL_QUERY_SPEAKER_EQ_ADDRESS 60
69 #define WIDGET_CHIP_CTRL 0x15
70 #define WIDGET_DSP_CTRL 0x16
72 #define MEM_CONNID_MICIN1 3
73 #define MEM_CONNID_MICIN2 5
74 #define MEM_CONNID_MICOUT1 12
75 #define MEM_CONNID_MICOUT2 14
76 #define MEM_CONNID_WUH 10
77 #define MEM_CONNID_DSP 16
78 #define MEM_CONNID_DMIC 100
83 #define EFX_FILE "ctefx.bin"
84 #define SBZ_EFX_FILE "ctefx-sbz.bin"
85 #define R3DI_EFX_FILE "ctefx-r3di.bin"
87 #ifdef CONFIG_SND_HDA_CODEC_CA0132_DSP
88 MODULE_FIRMWARE(EFX_FILE);
89 MODULE_FIRMWARE(SBZ_EFX_FILE);
90 MODULE_FIRMWARE(R3DI_EFX_FILE);
93 static const char *const dirstr[2] = { "Playback", "Capture" };
95 #define NUM_OF_OUTPUTS 3
107 /* Strings for Input Source Enum Control */
108 static const char *const in_src_str[3] = {"Rear Mic", "Line", "Front Mic" };
109 #define IN_SRC_NUM_OF_INPUTS 3
117 #define VNODE_START_NID 0x80
118 VNID_SPK = VNODE_START_NID, /* Speaker vnid */
125 #define VNODES_COUNT (VNODE_END_NID - VNODE_START_NID)
127 #define EFFECT_START_NID 0x90
128 #define OUT_EFFECT_START_NID EFFECT_START_NID
129 SURROUND = OUT_EFFECT_START_NID,
136 #define OUT_EFFECTS_COUNT (OUT_EFFECT_END_NID - OUT_EFFECT_START_NID)
138 #define IN_EFFECT_START_NID OUT_EFFECT_END_NID
139 ECHO_CANCELLATION = IN_EFFECT_START_NID,
144 #define IN_EFFECTS_COUNT (IN_EFFECT_END_NID - IN_EFFECT_START_NID)
146 VOICEFX = IN_EFFECT_END_NID,
156 #define EFFECTS_COUNT (EFFECT_END_NID - EFFECT_START_NID)
159 /* Effects values size*/
160 #define EFFECT_VALS_MAX_COUNT 12
163 * Default values for the effect slider controls, they are in order of their
164 * effect NID's. Surround, Crystalizer, Dialog Plus, Smart Volume, and then
167 static const unsigned int effect_slider_defaults[] = {67, 65, 50, 74, 50};
168 /* Amount of effect level sliders for ca0132_alt controls. */
169 #define EFFECT_LEVEL_SLIDERS 5
171 /* Latency introduced by DSP blocks in milliseconds. */
172 #define DSP_CAPTURE_INIT_LATENCY 0
173 #define DSP_CRYSTAL_VOICE_LATENCY 124
174 #define DSP_PLAYBACK_INIT_LATENCY 13
175 #define DSP_PLAY_ENHANCEMENT_LATENCY 30
176 #define DSP_SPEAKER_OUT_LATENCY 7
179 char name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
181 int mid; /*effect module ID*/
182 int reqs[EFFECT_VALS_MAX_COUNT]; /*effect module request*/
183 int direct; /* 0:output; 1:input*/
184 int params; /* number of default non-on/off params */
185 /*effect default values, 1st is on/off. */
186 unsigned int def_vals[EFFECT_VALS_MAX_COUNT];
189 #define EFX_DIR_OUT 0
192 static const struct ct_effect ca0132_effects[EFFECTS_COUNT] = {
193 { .name = "Surround",
197 .direct = EFX_DIR_OUT,
199 .def_vals = {0x3F800000, 0x3F2B851F}
201 { .name = "Crystalizer",
205 .direct = EFX_DIR_OUT,
207 .def_vals = {0x3F800000, 0x3F266666}
209 { .name = "Dialog Plus",
213 .direct = EFX_DIR_OUT,
215 .def_vals = {0x00000000, 0x3F000000}
217 { .name = "Smart Volume",
221 .direct = EFX_DIR_OUT,
223 .def_vals = {0x3F800000, 0x3F3D70A4, 0x00000000}
228 .reqs = {24, 23, 25},
229 .direct = EFX_DIR_OUT,
231 .def_vals = {0x3F800000, 0x42A00000, 0x3F000000}
233 { .name = "Equalizer",
236 .reqs = {9, 10, 11, 12, 13, 14,
237 15, 16, 17, 18, 19, 20},
238 .direct = EFX_DIR_OUT,
240 .def_vals = {0x00000000, 0x00000000, 0x00000000, 0x00000000,
241 0x00000000, 0x00000000, 0x00000000, 0x00000000,
242 0x00000000, 0x00000000, 0x00000000, 0x00000000}
244 { .name = "Echo Cancellation",
245 .nid = ECHO_CANCELLATION,
247 .reqs = {0, 1, 2, 3},
248 .direct = EFX_DIR_IN,
250 .def_vals = {0x00000000, 0x3F3A9692, 0x00000000, 0x00000000}
252 { .name = "Voice Focus",
255 .reqs = {6, 7, 8, 9},
256 .direct = EFX_DIR_IN,
258 .def_vals = {0x3F800000, 0x3D7DF3B6, 0x41F00000, 0x41F00000}
264 .direct = EFX_DIR_IN,
266 .def_vals = {0x00000000, 0x3F3D70A4}
268 { .name = "Noise Reduction",
269 .nid = NOISE_REDUCTION,
272 .direct = EFX_DIR_IN,
274 .def_vals = {0x3F800000, 0x3F000000}
279 .reqs = {10, 11, 12, 13, 14, 15, 16, 17, 18},
280 .direct = EFX_DIR_IN,
282 .def_vals = {0x00000000, 0x43C80000, 0x44AF0000, 0x44FA0000,
283 0x3F800000, 0x3F800000, 0x3F800000, 0x00000000,
288 /* Tuning controls */
289 #ifdef ENABLE_TUNING_CONTROLS
292 #define TUNING_CTL_START_NID 0xC0
293 WEDGE_ANGLE = TUNING_CTL_START_NID,
306 #define TUNING_CTLS_COUNT (TUNING_CTL_END_NID - TUNING_CTL_START_NID)
309 struct ct_tuning_ctl {
310 char name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
311 hda_nid_t parent_nid;
313 int mid; /*effect module ID*/
314 int req; /*effect module request*/
315 int direct; /* 0:output; 1:input*/
316 unsigned int def_val;/*effect default values*/
319 static const struct ct_tuning_ctl ca0132_tuning_ctls[] = {
320 { .name = "Wedge Angle",
321 .parent_nid = VOICE_FOCUS,
325 .direct = EFX_DIR_IN,
326 .def_val = 0x41F00000
328 { .name = "SVM Level",
329 .parent_nid = MIC_SVM,
333 .direct = EFX_DIR_IN,
334 .def_val = 0x3F3D70A4
336 { .name = "EQ Band0",
337 .parent_nid = EQUALIZER,
338 .nid = EQUALIZER_BAND_0,
341 .direct = EFX_DIR_OUT,
342 .def_val = 0x00000000
344 { .name = "EQ Band1",
345 .parent_nid = EQUALIZER,
346 .nid = EQUALIZER_BAND_1,
349 .direct = EFX_DIR_OUT,
350 .def_val = 0x00000000
352 { .name = "EQ Band2",
353 .parent_nid = EQUALIZER,
354 .nid = EQUALIZER_BAND_2,
357 .direct = EFX_DIR_OUT,
358 .def_val = 0x00000000
360 { .name = "EQ Band3",
361 .parent_nid = EQUALIZER,
362 .nid = EQUALIZER_BAND_3,
365 .direct = EFX_DIR_OUT,
366 .def_val = 0x00000000
368 { .name = "EQ Band4",
369 .parent_nid = EQUALIZER,
370 .nid = EQUALIZER_BAND_4,
373 .direct = EFX_DIR_OUT,
374 .def_val = 0x00000000
376 { .name = "EQ Band5",
377 .parent_nid = EQUALIZER,
378 .nid = EQUALIZER_BAND_5,
381 .direct = EFX_DIR_OUT,
382 .def_val = 0x00000000
384 { .name = "EQ Band6",
385 .parent_nid = EQUALIZER,
386 .nid = EQUALIZER_BAND_6,
389 .direct = EFX_DIR_OUT,
390 .def_val = 0x00000000
392 { .name = "EQ Band7",
393 .parent_nid = EQUALIZER,
394 .nid = EQUALIZER_BAND_7,
397 .direct = EFX_DIR_OUT,
398 .def_val = 0x00000000
400 { .name = "EQ Band8",
401 .parent_nid = EQUALIZER,
402 .nid = EQUALIZER_BAND_8,
405 .direct = EFX_DIR_OUT,
406 .def_val = 0x00000000
408 { .name = "EQ Band9",
409 .parent_nid = EQUALIZER,
410 .nid = EQUALIZER_BAND_9,
413 .direct = EFX_DIR_OUT,
414 .def_val = 0x00000000
419 /* Voice FX Presets */
420 #define VOICEFX_MAX_PARAM_COUNT 9
426 int reqs[VOICEFX_MAX_PARAM_COUNT]; /*effect module request*/
429 struct ct_voicefx_preset {
430 char *name; /*preset name*/
431 unsigned int vals[VOICEFX_MAX_PARAM_COUNT];
434 static const struct ct_voicefx ca0132_voicefx = {
435 .name = "VoiceFX Capture Switch",
438 .reqs = {10, 11, 12, 13, 14, 15, 16, 17, 18}
441 static const struct ct_voicefx_preset ca0132_voicefx_presets[] = {
443 .vals = { 0x00000000, 0x43C80000, 0x44AF0000,
444 0x44FA0000, 0x3F800000, 0x3F800000,
445 0x3F800000, 0x00000000, 0x00000000 }
447 { .name = "Female2Male",
448 .vals = { 0x3F800000, 0x43C80000, 0x44AF0000,
449 0x44FA0000, 0x3F19999A, 0x3F866666,
450 0x3F800000, 0x00000000, 0x00000000 }
452 { .name = "Male2Female",
453 .vals = { 0x3F800000, 0x43C80000, 0x44AF0000,
454 0x450AC000, 0x4017AE14, 0x3F6B851F,
455 0x3F800000, 0x00000000, 0x00000000 }
457 { .name = "ScrappyKid",
458 .vals = { 0x3F800000, 0x43C80000, 0x44AF0000,
459 0x44FA0000, 0x40400000, 0x3F28F5C3,
460 0x3F800000, 0x00000000, 0x00000000 }
463 .vals = { 0x3F800000, 0x44324000, 0x44BB8000,
464 0x44E10000, 0x3FB33333, 0x3FB9999A,
465 0x3F800000, 0x3E3A2E43, 0x00000000 }
468 .vals = { 0x3F800000, 0x43EA0000, 0x44A52000,
469 0x45098000, 0x3F266666, 0x3FC00000,
470 0x3F800000, 0x00000000, 0x00000000 }
473 .vals = { 0x3F800000, 0x43C70000, 0x44AE6000,
474 0x45193000, 0x3F8E147B, 0x3F75C28F,
475 0x3F800000, 0x00000000, 0x00000000 }
478 .vals = { 0x3F800000, 0x43930000, 0x44BEE000,
479 0x45007000, 0x3F451EB8, 0x3F7851EC,
480 0x3F800000, 0x00000000, 0x00000000 }
482 { .name = "AlienBrute",
483 .vals = { 0x3F800000, 0x43BFC5AC, 0x44B28FDF,
484 0x451F6000, 0x3F266666, 0x3FA7D945,
485 0x3F800000, 0x3CF5C28F, 0x00000000 }
488 .vals = { 0x3F800000, 0x43C80000, 0x44AF0000,
489 0x44FA0000, 0x3FB2718B, 0x3F800000,
490 0xBC07010E, 0x00000000, 0x00000000 }
493 .vals = { 0x3F800000, 0x43C20000, 0x44906000,
494 0x44E70000, 0x3F4CCCCD, 0x3F8A3D71,
495 0x3F0A3D71, 0x00000000, 0x00000000 }
498 .vals = { 0x3F800000, 0x43C80000, 0x44AF0000,
499 0x44FA0000, 0x3F800000, 0x3F800000,
500 0x3E4CCCCD, 0x00000000, 0x00000000 }
502 { .name = "DeepVoice",
503 .vals = { 0x3F800000, 0x43A9C5AC, 0x44AA4FDF,
504 0x44FFC000, 0x3EDBB56F, 0x3F99C4CA,
505 0x3F800000, 0x00000000, 0x00000000 }
507 { .name = "Munchkin",
508 .vals = { 0x3F800000, 0x43C80000, 0x44AF0000,
509 0x44FA0000, 0x3F800000, 0x3F1A043C,
510 0x3F800000, 0x00000000, 0x00000000 }
514 /* ca0132 EQ presets, taken from Windows Sound Blaster Z Driver */
516 #define EQ_PRESET_MAX_PARAM_COUNT 11
522 int reqs[EQ_PRESET_MAX_PARAM_COUNT]; /*effect module request*/
525 struct ct_eq_preset {
526 char *name; /*preset name*/
527 unsigned int vals[EQ_PRESET_MAX_PARAM_COUNT];
530 static const struct ct_eq ca0132_alt_eq_enum = {
531 .name = "FX: Equalizer Preset Switch",
532 .nid = EQ_PRESET_ENUM,
534 .reqs = {10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20}
538 static const struct ct_eq_preset ca0132_alt_eq_presets[] = {
540 .vals = { 0x00000000, 0x00000000, 0x00000000,
541 0x00000000, 0x00000000, 0x00000000,
542 0x00000000, 0x00000000, 0x00000000,
543 0x00000000, 0x00000000 }
545 { .name = "Acoustic",
546 .vals = { 0x00000000, 0x00000000, 0x3F8CCCCD,
547 0x40000000, 0x00000000, 0x00000000,
548 0x00000000, 0x00000000, 0x40000000,
549 0x40000000, 0x40000000 }
551 { .name = "Classical",
552 .vals = { 0x00000000, 0x00000000, 0x40C00000,
553 0x40C00000, 0x40466666, 0x00000000,
554 0x00000000, 0x00000000, 0x00000000,
555 0x40466666, 0x40466666 }
558 .vals = { 0x00000000, 0xBF99999A, 0x00000000,
559 0x3FA66666, 0x3FA66666, 0x3F8CCCCD,
560 0x00000000, 0x00000000, 0x40000000,
561 0x40466666, 0x40800000 }
564 .vals = { 0x00000000, 0xBF99999A, 0x40000000,
565 0x40466666, 0x40866666, 0xBF99999A,
566 0xBF99999A, 0x00000000, 0x00000000,
567 0x40800000, 0x40800000 }
570 .vals = { 0x00000000, 0x00000000, 0x00000000,
571 0x3F8CCCCD, 0x40800000, 0x40800000,
572 0x40800000, 0x00000000, 0x3F8CCCCD,
573 0x40466666, 0x40466666 }
576 .vals = { 0x00000000, 0x00000000, 0x40000000,
577 0x40000000, 0x00000000, 0x00000000,
578 0x00000000, 0x3F8CCCCD, 0x40000000,
579 0x40000000, 0x40000000 }
582 .vals = { 0x00000000, 0xBFCCCCCD, 0x00000000,
583 0x40000000, 0x40000000, 0x00000000,
584 0xBF99999A, 0xBF99999A, 0x00000000,
585 0x40466666, 0x40C00000 }
588 .vals = { 0x00000000, 0xBF99999A, 0xBF99999A,
589 0x3F8CCCCD, 0x40000000, 0xBF99999A,
590 0xBF99999A, 0x00000000, 0x00000000,
591 0x40800000, 0x40800000 }
594 .vals = { 0x00000000, 0xC0000000, 0xBF99999A,
595 0xBF99999A, 0x00000000, 0x40466666,
596 0x40800000, 0x40466666, 0x00000000,
597 0x00000000, 0x3F8CCCCD }
601 /* DSP command sequences for ca0132_alt_select_out */
602 #define ALT_OUT_SET_MAX_COMMANDS 9 /* Max number of commands in sequence */
603 struct ca0132_alt_out_set {
604 char *name; /*preset name*/
605 unsigned char commands;
606 unsigned int mids[ALT_OUT_SET_MAX_COMMANDS];
607 unsigned int reqs[ALT_OUT_SET_MAX_COMMANDS];
608 unsigned int vals[ALT_OUT_SET_MAX_COMMANDS];
611 static const struct ca0132_alt_out_set alt_out_presets[] = {
612 { .name = "Line Out",
614 .mids = { 0x96, 0x96, 0x96, 0x8F,
616 .reqs = { 0x19, 0x17, 0x18, 0x01,
618 .vals = { 0x3F000000, 0x42A00000, 0x00000000,
619 0x00000000, 0x00000000, 0x00000000,
622 { .name = "Headphone",
624 .mids = { 0x96, 0x96, 0x96, 0x8F,
626 .reqs = { 0x19, 0x17, 0x18, 0x01,
628 .vals = { 0x3F000000, 0x42A00000, 0x00000000,
629 0x00000000, 0x00000000, 0x00000000,
632 { .name = "Surround",
634 .mids = { 0x96, 0x8F, 0x96, 0x96,
635 0x96, 0x96, 0x96, 0x96 },
636 .reqs = { 0x18, 0x01, 0x1F, 0x15,
637 0x3A, 0x1A, 0x1B, 0x1C },
638 .vals = { 0x00000000, 0x00000000, 0x00000000,
639 0x00000000, 0x00000000, 0x00000000,
640 0x00000000, 0x00000000 }
645 * DSP volume setting structs. Req 1 is left volume, req 2 is right volume,
646 * and I don't know what the third req is, but it's always zero. I assume it's
647 * some sort of update or set command to tell the DSP there's new volume info.
649 #define DSP_VOL_OUT 0
652 struct ct_dsp_volume_ctl {
654 int mid; /* module ID*/
655 unsigned int reqs[3]; /* scp req ID */
658 static const struct ct_dsp_volume_ctl ca0132_alt_vol_ctls[] = {
669 enum hda_cmd_vendor_io {
671 VENDOR_DSPIO_SCP_WRITE_DATA_LOW = 0x000,
672 VENDOR_DSPIO_SCP_WRITE_DATA_HIGH = 0x100,
674 VENDOR_DSPIO_STATUS = 0xF01,
675 VENDOR_DSPIO_SCP_POST_READ_DATA = 0x702,
676 VENDOR_DSPIO_SCP_READ_DATA = 0xF02,
677 VENDOR_DSPIO_DSP_INIT = 0x703,
678 VENDOR_DSPIO_SCP_POST_COUNT_QUERY = 0x704,
679 VENDOR_DSPIO_SCP_READ_COUNT = 0xF04,
681 /* for ChipIO node */
682 VENDOR_CHIPIO_ADDRESS_LOW = 0x000,
683 VENDOR_CHIPIO_ADDRESS_HIGH = 0x100,
684 VENDOR_CHIPIO_STREAM_FORMAT = 0x200,
685 VENDOR_CHIPIO_DATA_LOW = 0x300,
686 VENDOR_CHIPIO_DATA_HIGH = 0x400,
688 VENDOR_CHIPIO_GET_PARAMETER = 0xF00,
689 VENDOR_CHIPIO_STATUS = 0xF01,
690 VENDOR_CHIPIO_HIC_POST_READ = 0x702,
691 VENDOR_CHIPIO_HIC_READ_DATA = 0xF03,
693 VENDOR_CHIPIO_8051_DATA_WRITE = 0x707,
694 VENDOR_CHIPIO_8051_DATA_READ = 0xF07,
696 VENDOR_CHIPIO_CT_EXTENSIONS_ENABLE = 0x70A,
697 VENDOR_CHIPIO_CT_EXTENSIONS_GET = 0xF0A,
699 VENDOR_CHIPIO_PLL_PMU_WRITE = 0x70C,
700 VENDOR_CHIPIO_PLL_PMU_READ = 0xF0C,
701 VENDOR_CHIPIO_8051_ADDRESS_LOW = 0x70D,
702 VENDOR_CHIPIO_8051_ADDRESS_HIGH = 0x70E,
703 VENDOR_CHIPIO_FLAG_SET = 0x70F,
704 VENDOR_CHIPIO_FLAGS_GET = 0xF0F,
705 VENDOR_CHIPIO_PARAM_SET = 0x710,
706 VENDOR_CHIPIO_PARAM_GET = 0xF10,
708 VENDOR_CHIPIO_PORT_ALLOC_CONFIG_SET = 0x711,
709 VENDOR_CHIPIO_PORT_ALLOC_SET = 0x712,
710 VENDOR_CHIPIO_PORT_ALLOC_GET = 0xF12,
711 VENDOR_CHIPIO_PORT_FREE_SET = 0x713,
713 VENDOR_CHIPIO_PARAM_EX_ID_GET = 0xF17,
714 VENDOR_CHIPIO_PARAM_EX_ID_SET = 0x717,
715 VENDOR_CHIPIO_PARAM_EX_VALUE_GET = 0xF18,
716 VENDOR_CHIPIO_PARAM_EX_VALUE_SET = 0x718,
718 VENDOR_CHIPIO_DMIC_CTL_SET = 0x788,
719 VENDOR_CHIPIO_DMIC_CTL_GET = 0xF88,
720 VENDOR_CHIPIO_DMIC_PIN_SET = 0x789,
721 VENDOR_CHIPIO_DMIC_PIN_GET = 0xF89,
722 VENDOR_CHIPIO_DMIC_MCLK_SET = 0x78A,
723 VENDOR_CHIPIO_DMIC_MCLK_GET = 0xF8A,
725 VENDOR_CHIPIO_EAPD_SEL_SET = 0x78D
731 enum control_flag_id {
732 /* Connection manager stream setup is bypassed/enabled */
733 CONTROL_FLAG_C_MGR = 0,
734 /* DSP DMA is bypassed/enabled */
735 CONTROL_FLAG_DMA = 1,
736 /* 8051 'idle' mode is disabled/enabled */
737 CONTROL_FLAG_IDLE_ENABLE = 2,
738 /* Tracker for the SPDIF-in path is bypassed/enabled */
739 CONTROL_FLAG_TRACKER = 3,
740 /* DigitalOut to Spdif2Out connection is disabled/enabled */
741 CONTROL_FLAG_SPDIF2OUT = 4,
742 /* Digital Microphone is disabled/enabled */
743 CONTROL_FLAG_DMIC = 5,
744 /* ADC_B rate is 48 kHz/96 kHz */
745 CONTROL_FLAG_ADC_B_96KHZ = 6,
746 /* ADC_C rate is 48 kHz/96 kHz */
747 CONTROL_FLAG_ADC_C_96KHZ = 7,
748 /* DAC rate is 48 kHz/96 kHz (affects all DACs) */
749 CONTROL_FLAG_DAC_96KHZ = 8,
750 /* DSP rate is 48 kHz/96 kHz */
751 CONTROL_FLAG_DSP_96KHZ = 9,
752 /* SRC clock is 98 MHz/196 MHz (196 MHz forces rate to 96 KHz) */
753 CONTROL_FLAG_SRC_CLOCK_196MHZ = 10,
754 /* SRC rate is 48 kHz/96 kHz (48 kHz disabled when clock is 196 MHz) */
755 CONTROL_FLAG_SRC_RATE_96KHZ = 11,
756 /* Decode Loop (DSP->SRC->DSP) is disabled/enabled */
757 CONTROL_FLAG_DECODE_LOOP = 12,
758 /* De-emphasis filter on DAC-1 disabled/enabled */
759 CONTROL_FLAG_DAC1_DEEMPHASIS = 13,
760 /* De-emphasis filter on DAC-2 disabled/enabled */
761 CONTROL_FLAG_DAC2_DEEMPHASIS = 14,
762 /* De-emphasis filter on DAC-3 disabled/enabled */
763 CONTROL_FLAG_DAC3_DEEMPHASIS = 15,
764 /* High-pass filter on ADC_B disabled/enabled */
765 CONTROL_FLAG_ADC_B_HIGH_PASS = 16,
766 /* High-pass filter on ADC_C disabled/enabled */
767 CONTROL_FLAG_ADC_C_HIGH_PASS = 17,
768 /* Common mode on Port_A disabled/enabled */
769 CONTROL_FLAG_PORT_A_COMMON_MODE = 18,
770 /* Common mode on Port_D disabled/enabled */
771 CONTROL_FLAG_PORT_D_COMMON_MODE = 19,
772 /* Impedance for ramp generator on Port_A 16 Ohm/10K Ohm */
773 CONTROL_FLAG_PORT_A_10KOHM_LOAD = 20,
774 /* Impedance for ramp generator on Port_D, 16 Ohm/10K Ohm */
775 CONTROL_FLAG_PORT_D_10KOHM_LOAD = 21,
776 /* ASI rate is 48kHz/96kHz */
777 CONTROL_FLAG_ASI_96KHZ = 22,
778 /* DAC power settings able to control attached ports no/yes */
779 CONTROL_FLAG_DACS_CONTROL_PORTS = 23,
780 /* Clock Stop OK reporting is disabled/enabled */
781 CONTROL_FLAG_CONTROL_STOP_OK_ENABLE = 24,
782 /* Number of control flags */
783 CONTROL_FLAGS_MAX = (CONTROL_FLAG_CONTROL_STOP_OK_ENABLE+1)
787 * Control parameter IDs
789 enum control_param_id {
790 /* 0: None, 1: Mic1In*/
791 CONTROL_PARAM_VIP_SOURCE = 1,
792 /* 0: force HDA, 1: allow DSP if HDA Spdif1Out stream is idle */
793 CONTROL_PARAM_SPDIF1_SOURCE = 2,
794 /* Port A output stage gain setting to use when 16 Ohm output
795 * impedance is selected*/
796 CONTROL_PARAM_PORTA_160OHM_GAIN = 8,
797 /* Port D output stage gain setting to use when 16 Ohm output
798 * impedance is selected*/
799 CONTROL_PARAM_PORTD_160OHM_GAIN = 10,
803 /* Select stream with the given ID */
804 CONTROL_PARAM_STREAM_ID = 24,
805 /* Source connection point for the selected stream */
806 CONTROL_PARAM_STREAM_SOURCE_CONN_POINT = 25,
807 /* Destination connection point for the selected stream */
808 CONTROL_PARAM_STREAM_DEST_CONN_POINT = 26,
809 /* Number of audio channels in the selected stream */
810 CONTROL_PARAM_STREAMS_CHANNELS = 27,
811 /*Enable control for the selected stream */
812 CONTROL_PARAM_STREAM_CONTROL = 28,
814 /* Connection Point Control */
816 /* Select connection point with the given ID */
817 CONTROL_PARAM_CONN_POINT_ID = 29,
818 /* Connection point sample rate */
819 CONTROL_PARAM_CONN_POINT_SAMPLE_RATE = 30,
823 /* Select HDA node with the given ID */
824 CONTROL_PARAM_NODE_ID = 31
828 * Dsp Io Status codes
830 enum hda_vendor_status_dspio {
832 VENDOR_STATUS_DSPIO_OK = 0x00,
833 /* Busy, unable to accept new command, the host must retry */
834 VENDOR_STATUS_DSPIO_BUSY = 0x01,
835 /* SCP command queue is full */
836 VENDOR_STATUS_DSPIO_SCP_COMMAND_QUEUE_FULL = 0x02,
837 /* SCP response queue is empty */
838 VENDOR_STATUS_DSPIO_SCP_RESPONSE_QUEUE_EMPTY = 0x03
842 * Chip Io Status codes
844 enum hda_vendor_status_chipio {
846 VENDOR_STATUS_CHIPIO_OK = 0x00,
847 /* Busy, unable to accept new command, the host must retry */
848 VENDOR_STATUS_CHIPIO_BUSY = 0x01
854 enum ca0132_sample_rate {
874 SR_RATE_UNKNOWN = 0x1F
877 enum dsp_download_state {
878 DSP_DOWNLOAD_FAILED = -1,
879 DSP_DOWNLOAD_INIT = 0,
884 /* retrieve parameters from hda format */
885 #define get_hdafmt_chs(fmt) (fmt & 0xf)
886 #define get_hdafmt_bits(fmt) ((fmt >> 4) & 0x7)
887 #define get_hdafmt_rate(fmt) ((fmt >> 8) & 0x7f)
888 #define get_hdafmt_type(fmt) ((fmt >> 15) & 0x1)
895 const struct snd_kcontrol_new *mixers[5];
896 unsigned int num_mixers;
897 const struct hda_verb *base_init_verbs;
898 const struct hda_verb *base_exit_verbs;
899 const struct hda_verb *chip_init_verbs;
900 const struct hda_verb *sbz_init_verbs;
901 struct hda_verb *spec_init_verbs;
902 struct auto_pin_cfg autocfg;
904 /* Nodes configurations */
905 struct hda_multi_out multiout;
906 hda_nid_t out_pins[AUTO_CFG_MAX_OUTS];
907 hda_nid_t dacs[AUTO_CFG_MAX_OUTS];
908 unsigned int num_outputs;
909 hda_nid_t input_pins[AUTO_PIN_LAST];
910 hda_nid_t adcs[AUTO_PIN_LAST];
913 unsigned int num_inputs;
914 hda_nid_t shared_mic_nid;
915 hda_nid_t shared_out_nid;
916 hda_nid_t unsol_tag_hp;
917 hda_nid_t unsol_tag_front_hp; /* for desktop ca0132 codecs */
918 hda_nid_t unsol_tag_amic1;
921 struct mutex chipio_mutex; /* chip access mutex */
924 /* DSP download related */
925 enum dsp_download_state dsp_state;
926 unsigned int dsp_stream_id;
927 unsigned int wait_scp;
928 unsigned int wait_scp_header;
929 unsigned int wait_num_data;
930 unsigned int scp_resp_header;
931 unsigned int scp_resp_data[4];
932 unsigned int scp_resp_count;
933 bool alt_firmware_present;
934 bool startup_check_entered;
937 /* mixer and effects related */
938 unsigned char dmic_ctl;
941 long vnode_lvol[VNODES_COUNT];
942 long vnode_rvol[VNODES_COUNT];
943 long vnode_lswitch[VNODES_COUNT];
944 long vnode_rswitch[VNODES_COUNT];
945 long effects_switch[EFFECTS_COUNT];
948 /* ca0132_alt control related values */
949 unsigned char in_enum_val;
950 unsigned char out_enum_val;
951 unsigned char mic_boost_enum_val;
952 unsigned char smart_volume_setting;
953 long fx_ctl_val[EFFECT_LEVEL_SLIDERS];
954 long xbass_xover_freq;
957 struct hda_vmaster_mute_hook vmaster_mute;
960 struct hda_codec *codec;
961 struct delayed_work unsol_hp_work;
964 #ifdef ENABLE_TUNING_CONTROLS
965 long cur_ctl_vals[TUNING_CTLS_COUNT];
968 * Sound Blaster Z PCI region 2 iomem, used for input and output
969 * switching, and other unknown commands.
971 void __iomem *mem_base;
974 * Whether or not to use the alt functions like alt_select_out,
975 * alt_select_in, etc. Only used on desktop codecs for now, because of
976 * surround sound support.
978 bool use_alt_functions;
981 * Whether or not to use alt controls: volume effect sliders, EQ
982 * presets, smart volume presets, and new control names with FX prefix.
983 * Renames PlayEnhancement and CrystalVoice too.
985 bool use_alt_controls;
989 * CA0132 quirks table
994 QUIRK_ALIENWARE_M17XR4,
999 static const struct hda_pintbl alienware_pincfgs[] = {
1000 { 0x0b, 0x90170110 }, /* Builtin Speaker */
1001 { 0x0c, 0x411111f0 }, /* N/A */
1002 { 0x0d, 0x411111f0 }, /* N/A */
1003 { 0x0e, 0x411111f0 }, /* N/A */
1004 { 0x0f, 0x0321101f }, /* HP */
1005 { 0x10, 0x411111f0 }, /* Headset? disabled for now */
1006 { 0x11, 0x03a11021 }, /* Mic */
1007 { 0x12, 0xd5a30140 }, /* Builtin Mic */
1008 { 0x13, 0x411111f0 }, /* N/A */
1009 { 0x18, 0x411111f0 }, /* N/A */
1013 /* Sound Blaster Z pin configs taken from Windows Driver */
1014 static const struct hda_pintbl sbz_pincfgs[] = {
1015 { 0x0b, 0x01017010 }, /* Port G -- Lineout FRONT L/R */
1016 { 0x0c, 0x014510f0 }, /* SPDIF Out 1 */
1017 { 0x0d, 0x014510f0 }, /* Digital Out */
1018 { 0x0e, 0x01c510f0 }, /* SPDIF In */
1019 { 0x0f, 0x0221701f }, /* Port A -- BackPanel HP */
1020 { 0x10, 0x01017012 }, /* Port D -- Center/LFE or FP Hp */
1021 { 0x11, 0x01017014 }, /* Port B -- LineMicIn2 / Rear L/R */
1022 { 0x12, 0x01a170f0 }, /* Port C -- LineIn1 */
1023 { 0x13, 0x908700f0 }, /* What U Hear In*/
1024 { 0x18, 0x50d000f0 }, /* N/A */
1028 /* Recon3D integrated pin configs taken from Windows Driver */
1029 static const struct hda_pintbl r3di_pincfgs[] = {
1030 { 0x0b, 0x01014110 }, /* Port G -- Lineout FRONT L/R */
1031 { 0x0c, 0x014510f0 }, /* SPDIF Out 1 */
1032 { 0x0d, 0x014510f0 }, /* Digital Out */
1033 { 0x0e, 0x41c520f0 }, /* SPDIF In */
1034 { 0x0f, 0x0221401f }, /* Port A -- BackPanel HP */
1035 { 0x10, 0x01016011 }, /* Port D -- Center/LFE or FP Hp */
1036 { 0x11, 0x01011014 }, /* Port B -- LineMicIn2 / Rear L/R */
1037 { 0x12, 0x02a090f0 }, /* Port C -- LineIn1 */
1038 { 0x13, 0x908700f0 }, /* What U Hear In*/
1039 { 0x18, 0x500000f0 }, /* N/A */
1043 static const struct snd_pci_quirk ca0132_quirks[] = {
1044 SND_PCI_QUIRK(0x1028, 0x057b, "Alienware M17x R4", QUIRK_ALIENWARE_M17XR4),
1045 SND_PCI_QUIRK(0x1028, 0x0685, "Alienware 15 2015", QUIRK_ALIENWARE),
1046 SND_PCI_QUIRK(0x1028, 0x0688, "Alienware 17 2015", QUIRK_ALIENWARE),
1047 SND_PCI_QUIRK(0x1028, 0x0708, "Alienware 15 R2 2016", QUIRK_ALIENWARE),
1048 SND_PCI_QUIRK(0x1102, 0x0010, "Sound Blaster Z", QUIRK_SBZ),
1049 SND_PCI_QUIRK(0x1102, 0x0023, "Sound Blaster Z", QUIRK_SBZ),
1050 SND_PCI_QUIRK(0x1458, 0xA016, "Recon3Di", QUIRK_R3DI),
1051 SND_PCI_QUIRK(0x1458, 0xA036, "Recon3Di", QUIRK_R3DI),
1056 * CA0132 codec access
1058 static unsigned int codec_send_command(struct hda_codec *codec, hda_nid_t nid,
1059 unsigned int verb, unsigned int parm, unsigned int *res)
1061 unsigned int response;
1062 response = snd_hda_codec_read(codec, nid, 0, verb, parm);
1065 return ((response == -1) ? -1 : 0);
1068 static int codec_set_converter_format(struct hda_codec *codec, hda_nid_t nid,
1069 unsigned short converter_format, unsigned int *res)
1071 return codec_send_command(codec, nid, VENDOR_CHIPIO_STREAM_FORMAT,
1072 converter_format & 0xffff, res);
1075 static int codec_set_converter_stream_channel(struct hda_codec *codec,
1076 hda_nid_t nid, unsigned char stream,
1077 unsigned char channel, unsigned int *res)
1079 unsigned char converter_stream_channel = 0;
1081 converter_stream_channel = (stream << 4) | (channel & 0x0f);
1082 return codec_send_command(codec, nid, AC_VERB_SET_CHANNEL_STREAMID,
1083 converter_stream_channel, res);
1086 /* Chip access helper function */
1087 static int chipio_send(struct hda_codec *codec,
1092 unsigned long timeout = jiffies + msecs_to_jiffies(1000);
1094 /* send bits of data specified by reg */
1096 res = snd_hda_codec_read(codec, WIDGET_CHIP_CTRL, 0,
1098 if (res == VENDOR_STATUS_CHIPIO_OK)
1101 } while (time_before(jiffies, timeout));
1107 * Write chip address through the vendor widget -- NOT protected by the Mutex!
1109 static int chipio_write_address(struct hda_codec *codec,
1110 unsigned int chip_addx)
1112 struct ca0132_spec *spec = codec->spec;
1115 if (spec->curr_chip_addx == chip_addx)
1118 /* send low 16 bits of the address */
1119 res = chipio_send(codec, VENDOR_CHIPIO_ADDRESS_LOW,
1120 chip_addx & 0xffff);
1123 /* send high 16 bits of the address */
1124 res = chipio_send(codec, VENDOR_CHIPIO_ADDRESS_HIGH,
1128 spec->curr_chip_addx = (res < 0) ? ~0U : chip_addx;
1134 * Write data through the vendor widget -- NOT protected by the Mutex!
1136 static int chipio_write_data(struct hda_codec *codec, unsigned int data)
1138 struct ca0132_spec *spec = codec->spec;
1141 /* send low 16 bits of the data */
1142 res = chipio_send(codec, VENDOR_CHIPIO_DATA_LOW, data & 0xffff);
1145 /* send high 16 bits of the data */
1146 res = chipio_send(codec, VENDOR_CHIPIO_DATA_HIGH,
1150 /*If no error encountered, automatically increment the address
1151 as per chip behaviour*/
1152 spec->curr_chip_addx = (res != -EIO) ?
1153 (spec->curr_chip_addx + 4) : ~0U;
1158 * Write multiple data through the vendor widget -- NOT protected by the Mutex!
1160 static int chipio_write_data_multiple(struct hda_codec *codec,
1167 codec_dbg(codec, "chipio_write_data null ptr\n");
1171 while ((count-- != 0) && (status == 0))
1172 status = chipio_write_data(codec, *data++);
1179 * Read data through the vendor widget -- NOT protected by the Mutex!
1181 static int chipio_read_data(struct hda_codec *codec, unsigned int *data)
1183 struct ca0132_spec *spec = codec->spec;
1187 res = chipio_send(codec, VENDOR_CHIPIO_HIC_POST_READ, 0);
1191 res = chipio_send(codec, VENDOR_CHIPIO_STATUS, 0);
1196 *data = snd_hda_codec_read(codec, WIDGET_CHIP_CTRL, 0,
1197 VENDOR_CHIPIO_HIC_READ_DATA,
1201 /*If no error encountered, automatically increment the address
1202 as per chip behaviour*/
1203 spec->curr_chip_addx = (res != -EIO) ?
1204 (spec->curr_chip_addx + 4) : ~0U;
1209 * Write given value to the given address through the chip I/O widget.
1210 * protected by the Mutex
1212 static int chipio_write(struct hda_codec *codec,
1213 unsigned int chip_addx, const unsigned int data)
1215 struct ca0132_spec *spec = codec->spec;
1218 mutex_lock(&spec->chipio_mutex);
1220 /* write the address, and if successful proceed to write data */
1221 err = chipio_write_address(codec, chip_addx);
1225 err = chipio_write_data(codec, data);
1230 mutex_unlock(&spec->chipio_mutex);
1235 * Write given value to the given address through the chip I/O widget.
1236 * not protected by the Mutex
1238 static int chipio_write_no_mutex(struct hda_codec *codec,
1239 unsigned int chip_addx, const unsigned int data)
1244 /* write the address, and if successful proceed to write data */
1245 err = chipio_write_address(codec, chip_addx);
1249 err = chipio_write_data(codec, data);
1258 * Write multiple values to the given address through the chip I/O widget.
1259 * protected by the Mutex
1261 static int chipio_write_multiple(struct hda_codec *codec,
1266 struct ca0132_spec *spec = codec->spec;
1269 mutex_lock(&spec->chipio_mutex);
1270 status = chipio_write_address(codec, chip_addx);
1274 status = chipio_write_data_multiple(codec, data, count);
1276 mutex_unlock(&spec->chipio_mutex);
1282 * Read the given address through the chip I/O widget
1283 * protected by the Mutex
1285 static int chipio_read(struct hda_codec *codec,
1286 unsigned int chip_addx, unsigned int *data)
1288 struct ca0132_spec *spec = codec->spec;
1291 mutex_lock(&spec->chipio_mutex);
1293 /* write the address, and if successful proceed to write data */
1294 err = chipio_write_address(codec, chip_addx);
1298 err = chipio_read_data(codec, data);
1303 mutex_unlock(&spec->chipio_mutex);
1308 * Set chip control flags through the chip I/O widget.
1310 static void chipio_set_control_flag(struct hda_codec *codec,
1311 enum control_flag_id flag_id,
1315 unsigned int flag_bit;
1317 flag_bit = (flag_state ? 1 : 0);
1318 val = (flag_bit << 7) | (flag_id);
1319 snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
1320 VENDOR_CHIPIO_FLAG_SET, val);
1324 * Set chip parameters through the chip I/O widget.
1326 static void chipio_set_control_param(struct hda_codec *codec,
1327 enum control_param_id param_id, int param_val)
1329 struct ca0132_spec *spec = codec->spec;
1332 if ((param_id < 32) && (param_val < 8)) {
1333 val = (param_val << 5) | (param_id);
1334 snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
1335 VENDOR_CHIPIO_PARAM_SET, val);
1337 mutex_lock(&spec->chipio_mutex);
1338 if (chipio_send(codec, VENDOR_CHIPIO_STATUS, 0) == 0) {
1339 snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
1340 VENDOR_CHIPIO_PARAM_EX_ID_SET,
1342 snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
1343 VENDOR_CHIPIO_PARAM_EX_VALUE_SET,
1346 mutex_unlock(&spec->chipio_mutex);
1351 * Set chip parameters through the chip I/O widget. NO MUTEX.
1353 static void chipio_set_control_param_no_mutex(struct hda_codec *codec,
1354 enum control_param_id param_id, int param_val)
1358 if ((param_id < 32) && (param_val < 8)) {
1359 val = (param_val << 5) | (param_id);
1360 snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
1361 VENDOR_CHIPIO_PARAM_SET, val);
1363 if (chipio_send(codec, VENDOR_CHIPIO_STATUS, 0) == 0) {
1364 snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
1365 VENDOR_CHIPIO_PARAM_EX_ID_SET,
1367 snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
1368 VENDOR_CHIPIO_PARAM_EX_VALUE_SET,
1374 * Connect stream to a source point, and then connect
1375 * that source point to a destination point.
1377 static void chipio_set_stream_source_dest(struct hda_codec *codec,
1378 int streamid, int source_point, int dest_point)
1380 chipio_set_control_param_no_mutex(codec,
1381 CONTROL_PARAM_STREAM_ID, streamid);
1382 chipio_set_control_param_no_mutex(codec,
1383 CONTROL_PARAM_STREAM_SOURCE_CONN_POINT, source_point);
1384 chipio_set_control_param_no_mutex(codec,
1385 CONTROL_PARAM_STREAM_DEST_CONN_POINT, dest_point);
1389 * Set number of channels in the selected stream.
1391 static void chipio_set_stream_channels(struct hda_codec *codec,
1392 int streamid, unsigned int channels)
1394 chipio_set_control_param_no_mutex(codec,
1395 CONTROL_PARAM_STREAM_ID, streamid);
1396 chipio_set_control_param_no_mutex(codec,
1397 CONTROL_PARAM_STREAMS_CHANNELS, channels);
1401 * Enable/Disable audio stream.
1403 static void chipio_set_stream_control(struct hda_codec *codec,
1404 int streamid, int enable)
1406 chipio_set_control_param_no_mutex(codec,
1407 CONTROL_PARAM_STREAM_ID, streamid);
1408 chipio_set_control_param_no_mutex(codec,
1409 CONTROL_PARAM_STREAM_CONTROL, enable);
1414 * Set sampling rate of the connection point. NO MUTEX.
1416 static void chipio_set_conn_rate_no_mutex(struct hda_codec *codec,
1417 int connid, enum ca0132_sample_rate rate)
1419 chipio_set_control_param_no_mutex(codec,
1420 CONTROL_PARAM_CONN_POINT_ID, connid);
1421 chipio_set_control_param_no_mutex(codec,
1422 CONTROL_PARAM_CONN_POINT_SAMPLE_RATE, rate);
1426 * Set sampling rate of the connection point.
1428 static void chipio_set_conn_rate(struct hda_codec *codec,
1429 int connid, enum ca0132_sample_rate rate)
1431 chipio_set_control_param(codec, CONTROL_PARAM_CONN_POINT_ID, connid);
1432 chipio_set_control_param(codec, CONTROL_PARAM_CONN_POINT_SAMPLE_RATE,
1439 static void chipio_enable_clocks(struct hda_codec *codec)
1441 struct ca0132_spec *spec = codec->spec;
1443 mutex_lock(&spec->chipio_mutex);
1444 snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
1445 VENDOR_CHIPIO_8051_ADDRESS_LOW, 0);
1446 snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
1447 VENDOR_CHIPIO_PLL_PMU_WRITE, 0xff);
1448 snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
1449 VENDOR_CHIPIO_8051_ADDRESS_LOW, 5);
1450 snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
1451 VENDOR_CHIPIO_PLL_PMU_WRITE, 0x0b);
1452 snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
1453 VENDOR_CHIPIO_8051_ADDRESS_LOW, 6);
1454 snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
1455 VENDOR_CHIPIO_PLL_PMU_WRITE, 0xff);
1456 mutex_unlock(&spec->chipio_mutex);
1460 * CA0132 DSP IO stuffs
1462 static int dspio_send(struct hda_codec *codec, unsigned int reg,
1466 unsigned long timeout = jiffies + msecs_to_jiffies(1000);
1468 /* send bits of data specified by reg to dsp */
1470 res = snd_hda_codec_read(codec, WIDGET_DSP_CTRL, 0, reg, data);
1471 if ((res >= 0) && (res != VENDOR_STATUS_DSPIO_BUSY))
1474 } while (time_before(jiffies, timeout));
1480 * Wait for DSP to be ready for commands
1482 static void dspio_write_wait(struct hda_codec *codec)
1485 unsigned long timeout = jiffies + msecs_to_jiffies(1000);
1488 status = snd_hda_codec_read(codec, WIDGET_DSP_CTRL, 0,
1489 VENDOR_DSPIO_STATUS, 0);
1490 if ((status == VENDOR_STATUS_DSPIO_OK) ||
1491 (status == VENDOR_STATUS_DSPIO_SCP_RESPONSE_QUEUE_EMPTY))
1494 } while (time_before(jiffies, timeout));
1498 * Write SCP data to DSP
1500 static int dspio_write(struct hda_codec *codec, unsigned int scp_data)
1502 struct ca0132_spec *spec = codec->spec;
1505 dspio_write_wait(codec);
1507 mutex_lock(&spec->chipio_mutex);
1508 status = dspio_send(codec, VENDOR_DSPIO_SCP_WRITE_DATA_LOW,
1513 status = dspio_send(codec, VENDOR_DSPIO_SCP_WRITE_DATA_HIGH,
1518 /* OK, now check if the write itself has executed*/
1519 status = snd_hda_codec_read(codec, WIDGET_DSP_CTRL, 0,
1520 VENDOR_DSPIO_STATUS, 0);
1522 mutex_unlock(&spec->chipio_mutex);
1524 return (status == VENDOR_STATUS_DSPIO_SCP_COMMAND_QUEUE_FULL) ?
1529 * Write multiple SCP data to DSP
1531 static int dspio_write_multiple(struct hda_codec *codec,
1532 unsigned int *buffer, unsigned int size)
1541 while (count < size) {
1542 status = dspio_write(codec, *buffer++);
1551 static int dspio_read(struct hda_codec *codec, unsigned int *data)
1555 status = dspio_send(codec, VENDOR_DSPIO_SCP_POST_READ_DATA, 0);
1559 status = dspio_send(codec, VENDOR_DSPIO_STATUS, 0);
1560 if (status == -EIO ||
1561 status == VENDOR_STATUS_DSPIO_SCP_RESPONSE_QUEUE_EMPTY)
1564 *data = snd_hda_codec_read(codec, WIDGET_DSP_CTRL, 0,
1565 VENDOR_DSPIO_SCP_READ_DATA, 0);
1570 static int dspio_read_multiple(struct hda_codec *codec, unsigned int *buffer,
1571 unsigned int *buf_size, unsigned int size_count)
1574 unsigned int size = *buf_size;
1576 unsigned int skip_count;
1583 while (count < size && count < size_count) {
1584 status = dspio_read(codec, buffer++);
1592 while (skip_count < size) {
1593 status = dspio_read(codec, &dummy);
1605 * Construct the SCP header using corresponding fields
1607 static inline unsigned int
1608 make_scp_header(unsigned int target_id, unsigned int source_id,
1609 unsigned int get_flag, unsigned int req,
1610 unsigned int device_flag, unsigned int resp_flag,
1611 unsigned int error_flag, unsigned int data_size)
1613 unsigned int header = 0;
1615 header = (data_size & 0x1f) << 27;
1616 header |= (error_flag & 0x01) << 26;
1617 header |= (resp_flag & 0x01) << 25;
1618 header |= (device_flag & 0x01) << 24;
1619 header |= (req & 0x7f) << 17;
1620 header |= (get_flag & 0x01) << 16;
1621 header |= (source_id & 0xff) << 8;
1622 header |= target_id & 0xff;
1628 * Extract corresponding fields from SCP header
1631 extract_scp_header(unsigned int header,
1632 unsigned int *target_id, unsigned int *source_id,
1633 unsigned int *get_flag, unsigned int *req,
1634 unsigned int *device_flag, unsigned int *resp_flag,
1635 unsigned int *error_flag, unsigned int *data_size)
1638 *data_size = (header >> 27) & 0x1f;
1640 *error_flag = (header >> 26) & 0x01;
1642 *resp_flag = (header >> 25) & 0x01;
1644 *device_flag = (header >> 24) & 0x01;
1646 *req = (header >> 17) & 0x7f;
1648 *get_flag = (header >> 16) & 0x01;
1650 *source_id = (header >> 8) & 0xff;
1652 *target_id = header & 0xff;
1655 #define SCP_MAX_DATA_WORDS (16)
1657 /* Structure to contain any SCP message */
1660 unsigned int data[SCP_MAX_DATA_WORDS];
1663 static void dspio_clear_response_queue(struct hda_codec *codec)
1665 unsigned int dummy = 0;
1668 /* clear all from the response queue */
1670 status = dspio_read(codec, &dummy);
1671 } while (status == 0);
1674 static int dspio_get_response_data(struct hda_codec *codec)
1676 struct ca0132_spec *spec = codec->spec;
1677 unsigned int data = 0;
1680 if (dspio_read(codec, &data) < 0)
1683 if ((data & 0x00ffffff) == spec->wait_scp_header) {
1684 spec->scp_resp_header = data;
1685 spec->scp_resp_count = data >> 27;
1686 count = spec->wait_num_data;
1687 dspio_read_multiple(codec, spec->scp_resp_data,
1688 &spec->scp_resp_count, count);
1696 * Send SCP message to DSP
1698 static int dspio_send_scp_message(struct hda_codec *codec,
1699 unsigned char *send_buf,
1700 unsigned int send_buf_size,
1701 unsigned char *return_buf,
1702 unsigned int return_buf_size,
1703 unsigned int *bytes_returned)
1705 struct ca0132_spec *spec = codec->spec;
1707 unsigned int scp_send_size = 0;
1708 unsigned int total_size;
1709 bool waiting_for_resp = false;
1710 unsigned int header;
1711 struct scp_msg *ret_msg;
1712 unsigned int resp_src_id, resp_target_id;
1713 unsigned int data_size, src_id, target_id, get_flag, device_flag;
1716 *bytes_returned = 0;
1718 /* get scp header from buffer */
1719 header = *((unsigned int *)send_buf);
1720 extract_scp_header(header, &target_id, &src_id, &get_flag, NULL,
1721 &device_flag, NULL, NULL, &data_size);
1722 scp_send_size = data_size + 1;
1723 total_size = (scp_send_size * 4);
1725 if (send_buf_size < total_size)
1728 if (get_flag || device_flag) {
1729 if (!return_buf || return_buf_size < 4 || !bytes_returned)
1732 spec->wait_scp_header = *((unsigned int *)send_buf);
1734 /* swap source id with target id */
1735 resp_target_id = src_id;
1736 resp_src_id = target_id;
1737 spec->wait_scp_header &= 0xffff0000;
1738 spec->wait_scp_header |= (resp_src_id << 8) | (resp_target_id);
1739 spec->wait_num_data = return_buf_size/sizeof(unsigned int) - 1;
1741 waiting_for_resp = true;
1744 status = dspio_write_multiple(codec, (unsigned int *)send_buf,
1751 if (waiting_for_resp) {
1752 unsigned long timeout = jiffies + msecs_to_jiffies(1000);
1753 memset(return_buf, 0, return_buf_size);
1756 } while (spec->wait_scp && time_before(jiffies, timeout));
1757 waiting_for_resp = false;
1758 if (!spec->wait_scp) {
1759 ret_msg = (struct scp_msg *)return_buf;
1760 memcpy(&ret_msg->hdr, &spec->scp_resp_header, 4);
1761 memcpy(&ret_msg->data, spec->scp_resp_data,
1762 spec->wait_num_data);
1763 *bytes_returned = (spec->scp_resp_count + 1) * 4;
1775 * Prepare and send the SCP message to DSP
1776 * @codec: the HDA codec
1777 * @mod_id: ID of the DSP module to send the command
1778 * @req: ID of request to send to the DSP module
1780 * @data: pointer to the data to send with the request, request specific
1781 * @len: length of the data, in bytes
1782 * @reply: point to the buffer to hold data returned for a reply
1783 * @reply_len: length of the reply buffer returned from GET
1785 * Returns zero or a negative error code.
1787 static int dspio_scp(struct hda_codec *codec,
1788 int mod_id, int src_id, int req, int dir, const void *data,
1789 unsigned int len, void *reply, unsigned int *reply_len)
1792 struct scp_msg scp_send, scp_reply;
1793 unsigned int ret_bytes, send_size, ret_size;
1794 unsigned int send_get_flag, reply_resp_flag, reply_error_flag;
1795 unsigned int reply_data_size;
1797 memset(&scp_send, 0, sizeof(scp_send));
1798 memset(&scp_reply, 0, sizeof(scp_reply));
1800 if ((len != 0 && data == NULL) || (len > SCP_MAX_DATA_WORDS))
1803 if (dir == SCP_GET && reply == NULL) {
1804 codec_dbg(codec, "dspio_scp get but has no buffer\n");
1808 if (reply != NULL && (reply_len == NULL || (*reply_len == 0))) {
1809 codec_dbg(codec, "dspio_scp bad resp buf len parms\n");
1813 scp_send.hdr = make_scp_header(mod_id, src_id, (dir == SCP_GET), req,
1814 0, 0, 0, len/sizeof(unsigned int));
1815 if (data != NULL && len > 0) {
1816 len = min((unsigned int)(sizeof(scp_send.data)), len);
1817 memcpy(scp_send.data, data, len);
1821 send_size = sizeof(unsigned int) + len;
1822 status = dspio_send_scp_message(codec, (unsigned char *)&scp_send,
1823 send_size, (unsigned char *)&scp_reply,
1824 sizeof(scp_reply), &ret_bytes);
1827 codec_dbg(codec, "dspio_scp: send scp msg failed\n");
1831 /* extract send and reply headers members */
1832 extract_scp_header(scp_send.hdr, NULL, NULL, &send_get_flag,
1833 NULL, NULL, NULL, NULL, NULL);
1834 extract_scp_header(scp_reply.hdr, NULL, NULL, NULL, NULL, NULL,
1835 &reply_resp_flag, &reply_error_flag,
1841 if (reply_resp_flag && !reply_error_flag) {
1842 ret_size = (ret_bytes - sizeof(scp_reply.hdr))
1843 / sizeof(unsigned int);
1845 if (*reply_len < ret_size*sizeof(unsigned int)) {
1846 codec_dbg(codec, "reply too long for buf\n");
1848 } else if (ret_size != reply_data_size) {
1849 codec_dbg(codec, "RetLen and HdrLen .NE.\n");
1851 } else if (!reply) {
1852 codec_dbg(codec, "NULL reply\n");
1855 *reply_len = ret_size*sizeof(unsigned int);
1856 memcpy(reply, scp_reply.data, *reply_len);
1859 codec_dbg(codec, "reply ill-formed or errflag set\n");
1867 * Set DSP parameters
1869 static int dspio_set_param(struct hda_codec *codec, int mod_id,
1870 int src_id, int req, const void *data, unsigned int len)
1872 return dspio_scp(codec, mod_id, src_id, req, SCP_SET, data, len, NULL,
1876 static int dspio_set_uint_param(struct hda_codec *codec, int mod_id,
1877 int req, const unsigned int data)
1879 return dspio_set_param(codec, mod_id, 0x20, req, &data,
1880 sizeof(unsigned int));
1883 static int dspio_set_uint_param_no_source(struct hda_codec *codec, int mod_id,
1884 int req, const unsigned int data)
1886 return dspio_set_param(codec, mod_id, 0x00, req, &data,
1887 sizeof(unsigned int));
1891 * Allocate a DSP DMA channel via an SCP message
1893 static int dspio_alloc_dma_chan(struct hda_codec *codec, unsigned int *dma_chan)
1896 unsigned int size = sizeof(dma_chan);
1898 codec_dbg(codec, " dspio_alloc_dma_chan() -- begin\n");
1899 status = dspio_scp(codec, MASTERCONTROL, 0x20,
1900 MASTERCONTROL_ALLOC_DMA_CHAN, SCP_GET, NULL, 0,
1904 codec_dbg(codec, "dspio_alloc_dma_chan: SCP Failed\n");
1908 if ((*dma_chan + 1) == 0) {
1909 codec_dbg(codec, "no free dma channels to allocate\n");
1913 codec_dbg(codec, "dspio_alloc_dma_chan: chan=%d\n", *dma_chan);
1914 codec_dbg(codec, " dspio_alloc_dma_chan() -- complete\n");
1920 * Free a DSP DMA via an SCP message
1922 static int dspio_free_dma_chan(struct hda_codec *codec, unsigned int dma_chan)
1925 unsigned int dummy = 0;
1927 codec_dbg(codec, " dspio_free_dma_chan() -- begin\n");
1928 codec_dbg(codec, "dspio_free_dma_chan: chan=%d\n", dma_chan);
1930 status = dspio_scp(codec, MASTERCONTROL, 0x20,
1931 MASTERCONTROL_ALLOC_DMA_CHAN, SCP_SET, &dma_chan,
1932 sizeof(dma_chan), NULL, &dummy);
1935 codec_dbg(codec, "dspio_free_dma_chan: SCP Failed\n");
1939 codec_dbg(codec, " dspio_free_dma_chan() -- complete\n");
1947 static int dsp_set_run_state(struct hda_codec *codec)
1949 unsigned int dbg_ctrl_reg;
1950 unsigned int halt_state;
1953 err = chipio_read(codec, DSP_DBGCNTL_INST_OFFSET, &dbg_ctrl_reg);
1957 halt_state = (dbg_ctrl_reg & DSP_DBGCNTL_STATE_MASK) >>
1958 DSP_DBGCNTL_STATE_LOBIT;
1960 if (halt_state != 0) {
1961 dbg_ctrl_reg &= ~((halt_state << DSP_DBGCNTL_SS_LOBIT) &
1962 DSP_DBGCNTL_SS_MASK);
1963 err = chipio_write(codec, DSP_DBGCNTL_INST_OFFSET,
1968 dbg_ctrl_reg |= (halt_state << DSP_DBGCNTL_EXEC_LOBIT) &
1969 DSP_DBGCNTL_EXEC_MASK;
1970 err = chipio_write(codec, DSP_DBGCNTL_INST_OFFSET,
1982 static int dsp_reset(struct hda_codec *codec)
1987 codec_dbg(codec, "dsp_reset\n");
1989 res = dspio_send(codec, VENDOR_DSPIO_DSP_INIT, 0);
1991 } while (res == -EIO && retry);
1994 codec_dbg(codec, "dsp_reset timeout\n");
2002 * Convert chip address to DSP address
2004 static unsigned int dsp_chip_to_dsp_addx(unsigned int chip_addx,
2005 bool *code, bool *yram)
2007 *code = *yram = false;
2009 if (UC_RANGE(chip_addx, 1)) {
2011 return UC_OFF(chip_addx);
2012 } else if (X_RANGE_ALL(chip_addx, 1)) {
2013 return X_OFF(chip_addx);
2014 } else if (Y_RANGE_ALL(chip_addx, 1)) {
2016 return Y_OFF(chip_addx);
2019 return INVALID_CHIP_ADDRESS;
2023 * Check if the DSP DMA is active
2025 static bool dsp_is_dma_active(struct hda_codec *codec, unsigned int dma_chan)
2027 unsigned int dma_chnlstart_reg;
2029 chipio_read(codec, DSPDMAC_CHNLSTART_INST_OFFSET, &dma_chnlstart_reg);
2031 return ((dma_chnlstart_reg & (1 <<
2032 (DSPDMAC_CHNLSTART_EN_LOBIT + dma_chan))) != 0);
2035 static int dsp_dma_setup_common(struct hda_codec *codec,
2036 unsigned int chip_addx,
2037 unsigned int dma_chan,
2038 unsigned int port_map_mask,
2042 unsigned int chnl_prop;
2043 unsigned int dsp_addx;
2044 unsigned int active;
2047 codec_dbg(codec, "-- dsp_dma_setup_common() -- Begin ---------\n");
2049 if (dma_chan >= DSPDMAC_DMA_CFG_CHANNEL_COUNT) {
2050 codec_dbg(codec, "dma chan num invalid\n");
2054 if (dsp_is_dma_active(codec, dma_chan)) {
2055 codec_dbg(codec, "dma already active\n");
2059 dsp_addx = dsp_chip_to_dsp_addx(chip_addx, &code, &yram);
2061 if (dsp_addx == INVALID_CHIP_ADDRESS) {
2062 codec_dbg(codec, "invalid chip addr\n");
2066 chnl_prop = DSPDMAC_CHNLPROP_AC_MASK;
2069 codec_dbg(codec, " dsp_dma_setup_common() start reg pgm\n");
2072 status = chipio_read(codec, DSPDMAC_CHNLPROP_INST_OFFSET,
2076 codec_dbg(codec, "read CHNLPROP Reg fail\n");
2079 codec_dbg(codec, "dsp_dma_setup_common() Read CHNLPROP\n");
2083 chnl_prop &= ~(1 << (DSPDMAC_CHNLPROP_MSPCE_LOBIT + dma_chan));
2085 chnl_prop |= (1 << (DSPDMAC_CHNLPROP_MSPCE_LOBIT + dma_chan));
2087 chnl_prop &= ~(1 << (DSPDMAC_CHNLPROP_DCON_LOBIT + dma_chan));
2089 status = chipio_write(codec, DSPDMAC_CHNLPROP_INST_OFFSET, chnl_prop);
2091 codec_dbg(codec, "write CHNLPROP Reg fail\n");
2094 codec_dbg(codec, " dsp_dma_setup_common() Write CHNLPROP\n");
2097 status = chipio_read(codec, DSPDMAC_ACTIVE_INST_OFFSET,
2101 codec_dbg(codec, "read ACTIVE Reg fail\n");
2104 codec_dbg(codec, "dsp_dma_setup_common() Read ACTIVE\n");
2107 active &= (~(1 << (DSPDMAC_ACTIVE_AAR_LOBIT + dma_chan))) &
2108 DSPDMAC_ACTIVE_AAR_MASK;
2110 status = chipio_write(codec, DSPDMAC_ACTIVE_INST_OFFSET, active);
2112 codec_dbg(codec, "write ACTIVE Reg fail\n");
2116 codec_dbg(codec, " dsp_dma_setup_common() Write ACTIVE\n");
2118 status = chipio_write(codec, DSPDMAC_AUDCHSEL_INST_OFFSET(dma_chan),
2121 codec_dbg(codec, "write AUDCHSEL Reg fail\n");
2124 codec_dbg(codec, " dsp_dma_setup_common() Write AUDCHSEL\n");
2126 status = chipio_write(codec, DSPDMAC_IRQCNT_INST_OFFSET(dma_chan),
2127 DSPDMAC_IRQCNT_BICNT_MASK | DSPDMAC_IRQCNT_CICNT_MASK);
2129 codec_dbg(codec, "write IRQCNT Reg fail\n");
2132 codec_dbg(codec, " dsp_dma_setup_common() Write IRQCNT\n");
2135 "ChipA=0x%x,DspA=0x%x,dmaCh=%u, "
2136 "CHSEL=0x%x,CHPROP=0x%x,Active=0x%x\n",
2137 chip_addx, dsp_addx, dma_chan,
2138 port_map_mask, chnl_prop, active);
2140 codec_dbg(codec, "-- dsp_dma_setup_common() -- Complete ------\n");
2146 * Setup the DSP DMA per-transfer-specific registers
2148 static int dsp_dma_setup(struct hda_codec *codec,
2149 unsigned int chip_addx,
2151 unsigned int dma_chan)
2155 unsigned int dsp_addx;
2156 unsigned int addr_field;
2157 unsigned int incr_field;
2158 unsigned int base_cnt;
2159 unsigned int cur_cnt;
2160 unsigned int dma_cfg = 0;
2161 unsigned int adr_ofs = 0;
2162 unsigned int xfr_cnt = 0;
2163 const unsigned int max_dma_count = 1 << (DSPDMAC_XFRCNT_BCNT_HIBIT -
2164 DSPDMAC_XFRCNT_BCNT_LOBIT + 1);
2166 codec_dbg(codec, "-- dsp_dma_setup() -- Begin ---------\n");
2168 if (count > max_dma_count) {
2169 codec_dbg(codec, "count too big\n");
2173 dsp_addx = dsp_chip_to_dsp_addx(chip_addx, &code, &yram);
2174 if (dsp_addx == INVALID_CHIP_ADDRESS) {
2175 codec_dbg(codec, "invalid chip addr\n");
2179 codec_dbg(codec, " dsp_dma_setup() start reg pgm\n");
2181 addr_field = dsp_addx << DSPDMAC_DMACFG_DBADR_LOBIT;
2187 addr_field |= (1 << DSPDMAC_DMACFG_DBADR_LOBIT);
2189 incr_field = (1 << DSPDMAC_DMACFG_AINCR_LOBIT);
2192 dma_cfg = addr_field + incr_field;
2193 status = chipio_write(codec, DSPDMAC_DMACFG_INST_OFFSET(dma_chan),
2196 codec_dbg(codec, "write DMACFG Reg fail\n");
2199 codec_dbg(codec, " dsp_dma_setup() Write DMACFG\n");
2201 adr_ofs = (count - 1) << (DSPDMAC_DSPADROFS_BOFS_LOBIT +
2204 status = chipio_write(codec, DSPDMAC_DSPADROFS_INST_OFFSET(dma_chan),
2207 codec_dbg(codec, "write DSPADROFS Reg fail\n");
2210 codec_dbg(codec, " dsp_dma_setup() Write DSPADROFS\n");
2212 base_cnt = (count - 1) << DSPDMAC_XFRCNT_BCNT_LOBIT;
2214 cur_cnt = (count - 1) << DSPDMAC_XFRCNT_CCNT_LOBIT;
2216 xfr_cnt = base_cnt | cur_cnt;
2218 status = chipio_write(codec,
2219 DSPDMAC_XFRCNT_INST_OFFSET(dma_chan), xfr_cnt);
2221 codec_dbg(codec, "write XFRCNT Reg fail\n");
2224 codec_dbg(codec, " dsp_dma_setup() Write XFRCNT\n");
2227 "ChipA=0x%x, cnt=0x%x, DMACFG=0x%x, "
2228 "ADROFS=0x%x, XFRCNT=0x%x\n",
2229 chip_addx, count, dma_cfg, adr_ofs, xfr_cnt);
2231 codec_dbg(codec, "-- dsp_dma_setup() -- Complete ---------\n");
2239 static int dsp_dma_start(struct hda_codec *codec,
2240 unsigned int dma_chan, bool ovly)
2242 unsigned int reg = 0;
2245 codec_dbg(codec, "-- dsp_dma_start() -- Begin ---------\n");
2248 status = chipio_read(codec,
2249 DSPDMAC_CHNLSTART_INST_OFFSET, ®);
2252 codec_dbg(codec, "read CHNLSTART reg fail\n");
2255 codec_dbg(codec, "-- dsp_dma_start() Read CHNLSTART\n");
2257 reg &= ~(DSPDMAC_CHNLSTART_EN_MASK |
2258 DSPDMAC_CHNLSTART_DIS_MASK);
2261 status = chipio_write(codec, DSPDMAC_CHNLSTART_INST_OFFSET,
2262 reg | (1 << (dma_chan + DSPDMAC_CHNLSTART_EN_LOBIT)));
2264 codec_dbg(codec, "write CHNLSTART reg fail\n");
2267 codec_dbg(codec, "-- dsp_dma_start() -- Complete ---------\n");
2275 static int dsp_dma_stop(struct hda_codec *codec,
2276 unsigned int dma_chan, bool ovly)
2278 unsigned int reg = 0;
2281 codec_dbg(codec, "-- dsp_dma_stop() -- Begin ---------\n");
2284 status = chipio_read(codec,
2285 DSPDMAC_CHNLSTART_INST_OFFSET, ®);
2288 codec_dbg(codec, "read CHNLSTART reg fail\n");
2291 codec_dbg(codec, "-- dsp_dma_stop() Read CHNLSTART\n");
2292 reg &= ~(DSPDMAC_CHNLSTART_EN_MASK |
2293 DSPDMAC_CHNLSTART_DIS_MASK);
2296 status = chipio_write(codec, DSPDMAC_CHNLSTART_INST_OFFSET,
2297 reg | (1 << (dma_chan + DSPDMAC_CHNLSTART_DIS_LOBIT)));
2299 codec_dbg(codec, "write CHNLSTART reg fail\n");
2302 codec_dbg(codec, "-- dsp_dma_stop() -- Complete ---------\n");
2308 * Allocate router ports
2310 * @codec: the HDA codec
2311 * @num_chans: number of channels in the stream
2312 * @ports_per_channel: number of ports per channel
2313 * @start_device: start device
2314 * @port_map: pointer to the port list to hold the allocated ports
2316 * Returns zero or a negative error code.
2318 static int dsp_allocate_router_ports(struct hda_codec *codec,
2319 unsigned int num_chans,
2320 unsigned int ports_per_channel,
2321 unsigned int start_device,
2322 unsigned int *port_map)
2328 status = chipio_send(codec, VENDOR_CHIPIO_STATUS, 0);
2332 val = start_device << 6;
2333 val |= (ports_per_channel - 1) << 4;
2334 val |= num_chans - 1;
2336 snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
2337 VENDOR_CHIPIO_PORT_ALLOC_CONFIG_SET,
2340 snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
2341 VENDOR_CHIPIO_PORT_ALLOC_SET,
2344 status = chipio_send(codec, VENDOR_CHIPIO_STATUS, 0);
2348 res = snd_hda_codec_read(codec, WIDGET_CHIP_CTRL, 0,
2349 VENDOR_CHIPIO_PORT_ALLOC_GET, 0);
2353 return (res < 0) ? res : 0;
2359 static int dsp_free_router_ports(struct hda_codec *codec)
2363 status = chipio_send(codec, VENDOR_CHIPIO_STATUS, 0);
2367 snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
2368 VENDOR_CHIPIO_PORT_FREE_SET,
2371 status = chipio_send(codec, VENDOR_CHIPIO_STATUS, 0);
2377 * Allocate DSP ports for the download stream
2379 static int dsp_allocate_ports(struct hda_codec *codec,
2380 unsigned int num_chans,
2381 unsigned int rate_multi, unsigned int *port_map)
2385 codec_dbg(codec, " dsp_allocate_ports() -- begin\n");
2387 if ((rate_multi != 1) && (rate_multi != 2) && (rate_multi != 4)) {
2388 codec_dbg(codec, "bad rate multiple\n");
2392 status = dsp_allocate_router_ports(codec, num_chans,
2393 rate_multi, 0, port_map);
2395 codec_dbg(codec, " dsp_allocate_ports() -- complete\n");
2400 static int dsp_allocate_ports_format(struct hda_codec *codec,
2401 const unsigned short fmt,
2402 unsigned int *port_map)
2405 unsigned int num_chans;
2407 unsigned int sample_rate_div = ((get_hdafmt_rate(fmt) >> 0) & 3) + 1;
2408 unsigned int sample_rate_mul = ((get_hdafmt_rate(fmt) >> 3) & 3) + 1;
2409 unsigned int rate_multi = sample_rate_mul / sample_rate_div;
2411 if ((rate_multi != 1) && (rate_multi != 2) && (rate_multi != 4)) {
2412 codec_dbg(codec, "bad rate multiple\n");
2416 num_chans = get_hdafmt_chs(fmt) + 1;
2418 status = dsp_allocate_ports(codec, num_chans, rate_multi, port_map);
2426 static int dsp_free_ports(struct hda_codec *codec)
2430 codec_dbg(codec, " dsp_free_ports() -- begin\n");
2432 status = dsp_free_router_ports(codec);
2434 codec_dbg(codec, "free router ports fail\n");
2437 codec_dbg(codec, " dsp_free_ports() -- complete\n");
2443 * HDA DMA engine stuffs for DSP code download
2446 struct hda_codec *codec;
2447 unsigned short m_converter_format;
2448 struct snd_dma_buffer *dmab;
2449 unsigned int buf_size;
2458 static int dma_convert_to_hda_format(struct hda_codec *codec,
2459 unsigned int sample_rate,
2460 unsigned short channels,
2461 unsigned short *hda_format)
2463 unsigned int format_val;
2465 format_val = snd_hdac_calc_stream_format(sample_rate,
2466 channels, SNDRV_PCM_FORMAT_S32_LE, 32, 0);
2469 *hda_format = (unsigned short)format_val;
2475 * Reset DMA for DSP download
2477 static int dma_reset(struct dma_engine *dma)
2479 struct hda_codec *codec = dma->codec;
2480 struct ca0132_spec *spec = codec->spec;
2483 if (dma->dmab->area)
2484 snd_hda_codec_load_dsp_cleanup(codec, dma->dmab);
2486 status = snd_hda_codec_load_dsp_prepare(codec,
2487 dma->m_converter_format,
2492 spec->dsp_stream_id = status;
2496 static int dma_set_state(struct dma_engine *dma, enum dma_state state)
2501 case DMA_STATE_STOP:
2511 snd_hda_codec_load_dsp_trigger(dma->codec, cmd);
2515 static unsigned int dma_get_buffer_size(struct dma_engine *dma)
2517 return dma->dmab->bytes;
2520 static unsigned char *dma_get_buffer_addr(struct dma_engine *dma)
2522 return dma->dmab->area;
2525 static int dma_xfer(struct dma_engine *dma,
2526 const unsigned int *data,
2529 memcpy(dma->dmab->area, data, count);
2533 static void dma_get_converter_format(
2534 struct dma_engine *dma,
2535 unsigned short *format)
2538 *format = dma->m_converter_format;
2541 static unsigned int dma_get_stream_id(struct dma_engine *dma)
2543 struct ca0132_spec *spec = dma->codec->spec;
2545 return spec->dsp_stream_id;
2548 struct dsp_image_seg {
2555 static const u32 g_magic_value = 0x4c46584d;
2556 static const u32 g_chip_addr_magic_value = 0xFFFFFF01;
2558 static bool is_valid(const struct dsp_image_seg *p)
2560 return p->magic == g_magic_value;
2563 static bool is_hci_prog_list_seg(const struct dsp_image_seg *p)
2565 return g_chip_addr_magic_value == p->chip_addr;
2568 static bool is_last(const struct dsp_image_seg *p)
2570 return p->count == 0;
2573 static size_t dsp_sizeof(const struct dsp_image_seg *p)
2575 return sizeof(*p) + p->count*sizeof(u32);
2578 static const struct dsp_image_seg *get_next_seg_ptr(
2579 const struct dsp_image_seg *p)
2581 return (struct dsp_image_seg *)((unsigned char *)(p) + dsp_sizeof(p));
2585 * CA0132 chip DSP transfer stuffs. For DSP download.
2587 #define INVALID_DMA_CHANNEL (~0U)
2590 * Program a list of address/data pairs via the ChipIO widget.
2591 * The segment data is in the format of successive pairs of words.
2592 * These are repeated as indicated by the segment's count field.
2594 static int dspxfr_hci_write(struct hda_codec *codec,
2595 const struct dsp_image_seg *fls)
2601 if (fls == NULL || fls->chip_addr != g_chip_addr_magic_value) {
2602 codec_dbg(codec, "hci_write invalid params\n");
2607 data = (u32 *)(fls->data);
2608 while (count >= 2) {
2609 status = chipio_write(codec, data[0], data[1]);
2611 codec_dbg(codec, "hci_write chipio failed\n");
2621 * Write a block of data into DSP code or data RAM using pre-allocated
2624 * @codec: the HDA codec
2625 * @fls: pointer to a fast load image
2626 * @reloc: Relocation address for loading single-segment overlays, or 0 for
2628 * @dma_engine: pointer to DMA engine to be used for DSP download
2629 * @dma_chan: The number of DMA channels used for DSP download
2630 * @port_map_mask: port mapping
2631 * @ovly: TRUE if overlay format is required
2633 * Returns zero or a negative error code.
2635 static int dspxfr_one_seg(struct hda_codec *codec,
2636 const struct dsp_image_seg *fls,
2638 struct dma_engine *dma_engine,
2639 unsigned int dma_chan,
2640 unsigned int port_map_mask,
2644 bool comm_dma_setup_done = false;
2645 const unsigned int *data;
2646 unsigned int chip_addx;
2647 unsigned int words_to_write;
2648 unsigned int buffer_size_words;
2649 unsigned char *buffer_addx;
2650 unsigned short hda_format;
2651 unsigned int sample_rate_div;
2652 unsigned int sample_rate_mul;
2653 unsigned int num_chans;
2654 unsigned int hda_frame_size_words;
2655 unsigned int remainder_words;
2656 const u32 *data_remainder;
2657 u32 chip_addx_remainder;
2658 unsigned int run_size_words;
2659 const struct dsp_image_seg *hci_write = NULL;
2660 unsigned long timeout;
2665 if (is_hci_prog_list_seg(fls)) {
2667 fls = get_next_seg_ptr(fls);
2670 if (hci_write && (!fls || is_last(fls))) {
2671 codec_dbg(codec, "hci_write\n");
2672 return dspxfr_hci_write(codec, hci_write);
2675 if (fls == NULL || dma_engine == NULL || port_map_mask == 0) {
2676 codec_dbg(codec, "Invalid Params\n");
2681 chip_addx = fls->chip_addr,
2682 words_to_write = fls->count;
2684 if (!words_to_write)
2685 return hci_write ? dspxfr_hci_write(codec, hci_write) : 0;
2687 chip_addx = (chip_addx & (0xFFFF0000 << 2)) + (reloc << 2);
2689 if (!UC_RANGE(chip_addx, words_to_write) &&
2690 !X_RANGE_ALL(chip_addx, words_to_write) &&
2691 !Y_RANGE_ALL(chip_addx, words_to_write)) {
2692 codec_dbg(codec, "Invalid chip_addx Params\n");
2696 buffer_size_words = (unsigned int)dma_get_buffer_size(dma_engine) /
2699 buffer_addx = dma_get_buffer_addr(dma_engine);
2701 if (buffer_addx == NULL) {
2702 codec_dbg(codec, "dma_engine buffer NULL\n");
2706 dma_get_converter_format(dma_engine, &hda_format);
2707 sample_rate_div = ((get_hdafmt_rate(hda_format) >> 0) & 3) + 1;
2708 sample_rate_mul = ((get_hdafmt_rate(hda_format) >> 3) & 3) + 1;
2709 num_chans = get_hdafmt_chs(hda_format) + 1;
2711 hda_frame_size_words = ((sample_rate_div == 0) ? 0 :
2712 (num_chans * sample_rate_mul / sample_rate_div));
2714 if (hda_frame_size_words == 0) {
2715 codec_dbg(codec, "frmsz zero\n");
2719 buffer_size_words = min(buffer_size_words,
2720 (unsigned int)(UC_RANGE(chip_addx, 1) ?
2722 buffer_size_words -= buffer_size_words % hda_frame_size_words;
2724 "chpadr=0x%08x frmsz=%u nchan=%u "
2725 "rate_mul=%u div=%u bufsz=%u\n",
2726 chip_addx, hda_frame_size_words, num_chans,
2727 sample_rate_mul, sample_rate_div, buffer_size_words);
2729 if (buffer_size_words < hda_frame_size_words) {
2730 codec_dbg(codec, "dspxfr_one_seg:failed\n");
2734 remainder_words = words_to_write % hda_frame_size_words;
2735 data_remainder = data;
2736 chip_addx_remainder = chip_addx;
2738 data += remainder_words;
2739 chip_addx += remainder_words*sizeof(u32);
2740 words_to_write -= remainder_words;
2742 while (words_to_write != 0) {
2743 run_size_words = min(buffer_size_words, words_to_write);
2744 codec_dbg(codec, "dspxfr (seg loop)cnt=%u rs=%u remainder=%u\n",
2745 words_to_write, run_size_words, remainder_words);
2746 dma_xfer(dma_engine, data, run_size_words*sizeof(u32));
2747 if (!comm_dma_setup_done) {
2748 status = dsp_dma_stop(codec, dma_chan, ovly);
2751 status = dsp_dma_setup_common(codec, chip_addx,
2752 dma_chan, port_map_mask, ovly);
2755 comm_dma_setup_done = true;
2758 status = dsp_dma_setup(codec, chip_addx,
2759 run_size_words, dma_chan);
2762 status = dsp_dma_start(codec, dma_chan, ovly);
2765 if (!dsp_is_dma_active(codec, dma_chan)) {
2766 codec_dbg(codec, "dspxfr:DMA did not start\n");
2769 status = dma_set_state(dma_engine, DMA_STATE_RUN);
2772 if (remainder_words != 0) {
2773 status = chipio_write_multiple(codec,
2774 chip_addx_remainder,
2779 remainder_words = 0;
2782 status = dspxfr_hci_write(codec, hci_write);
2788 timeout = jiffies + msecs_to_jiffies(2000);
2790 dma_active = dsp_is_dma_active(codec, dma_chan);
2794 } while (time_before(jiffies, timeout));
2798 codec_dbg(codec, "+++++ DMA complete\n");
2799 dma_set_state(dma_engine, DMA_STATE_STOP);
2800 status = dma_reset(dma_engine);
2805 data += run_size_words;
2806 chip_addx += run_size_words*sizeof(u32);
2807 words_to_write -= run_size_words;
2810 if (remainder_words != 0) {
2811 status = chipio_write_multiple(codec, chip_addx_remainder,
2812 data_remainder, remainder_words);
2819 * Write the entire DSP image of a DSP code/data overlay to DSP memories
2821 * @codec: the HDA codec
2822 * @fls_data: pointer to a fast load image
2823 * @reloc: Relocation address for loading single-segment overlays, or 0 for
2825 * @sample_rate: sampling rate of the stream used for DSP download
2826 * @channels: channels of the stream used for DSP download
2827 * @ovly: TRUE if overlay format is required
2829 * Returns zero or a negative error code.
2831 static int dspxfr_image(struct hda_codec *codec,
2832 const struct dsp_image_seg *fls_data,
2834 unsigned int sample_rate,
2835 unsigned short channels,
2838 struct ca0132_spec *spec = codec->spec;
2840 unsigned short hda_format = 0;
2841 unsigned int response;
2842 unsigned char stream_id = 0;
2843 struct dma_engine *dma_engine;
2844 unsigned int dma_chan;
2845 unsigned int port_map_mask;
2847 if (fls_data == NULL)
2850 dma_engine = kzalloc(sizeof(*dma_engine), GFP_KERNEL);
2854 dma_engine->dmab = kzalloc(sizeof(*dma_engine->dmab), GFP_KERNEL);
2855 if (!dma_engine->dmab) {
2860 dma_engine->codec = codec;
2861 dma_convert_to_hda_format(codec, sample_rate, channels, &hda_format);
2862 dma_engine->m_converter_format = hda_format;
2863 dma_engine->buf_size = (ovly ? DSP_DMA_WRITE_BUFLEN_OVLY :
2864 DSP_DMA_WRITE_BUFLEN_INIT) * 2;
2866 dma_chan = ovly ? INVALID_DMA_CHANNEL : 0;
2868 status = codec_set_converter_format(codec, WIDGET_CHIP_CTRL,
2869 hda_format, &response);
2872 codec_dbg(codec, "set converter format fail\n");
2876 status = snd_hda_codec_load_dsp_prepare(codec,
2877 dma_engine->m_converter_format,
2878 dma_engine->buf_size,
2882 spec->dsp_stream_id = status;
2885 status = dspio_alloc_dma_chan(codec, &dma_chan);
2887 codec_dbg(codec, "alloc dmachan fail\n");
2888 dma_chan = INVALID_DMA_CHANNEL;
2894 status = dsp_allocate_ports_format(codec, hda_format,
2897 codec_dbg(codec, "alloc ports fail\n");
2901 stream_id = dma_get_stream_id(dma_engine);
2902 status = codec_set_converter_stream_channel(codec,
2903 WIDGET_CHIP_CTRL, stream_id, 0, &response);
2905 codec_dbg(codec, "set stream chan fail\n");
2909 while ((fls_data != NULL) && !is_last(fls_data)) {
2910 if (!is_valid(fls_data)) {
2911 codec_dbg(codec, "FLS check fail\n");
2915 status = dspxfr_one_seg(codec, fls_data, reloc,
2916 dma_engine, dma_chan,
2917 port_map_mask, ovly);
2921 if (is_hci_prog_list_seg(fls_data))
2922 fls_data = get_next_seg_ptr(fls_data);
2924 if ((fls_data != NULL) && !is_last(fls_data))
2925 fls_data = get_next_seg_ptr(fls_data);
2928 if (port_map_mask != 0)
2929 status = dsp_free_ports(codec);
2934 status = codec_set_converter_stream_channel(codec,
2935 WIDGET_CHIP_CTRL, 0, 0, &response);
2938 if (ovly && (dma_chan != INVALID_DMA_CHANNEL))
2939 dspio_free_dma_chan(codec, dma_chan);
2941 if (dma_engine->dmab->area)
2942 snd_hda_codec_load_dsp_cleanup(codec, dma_engine->dmab);
2943 kfree(dma_engine->dmab);
2950 * CA0132 DSP download stuffs.
2952 static void dspload_post_setup(struct hda_codec *codec)
2954 struct ca0132_spec *spec = codec->spec;
2955 codec_dbg(codec, "---- dspload_post_setup ------\n");
2956 if (!spec->use_alt_functions) {
2957 /*set DSP speaker to 2.0 configuration*/
2958 chipio_write(codec, XRAM_XRAM_INST_OFFSET(0x18), 0x08080080);
2959 chipio_write(codec, XRAM_XRAM_INST_OFFSET(0x19), 0x3f800000);
2961 /*update write pointer*/
2962 chipio_write(codec, XRAM_XRAM_INST_OFFSET(0x29), 0x00000002);
2967 * dspload_image - Download DSP from a DSP Image Fast Load structure.
2969 * @codec: the HDA codec
2970 * @fls: pointer to a fast load image
2971 * @ovly: TRUE if overlay format is required
2972 * @reloc: Relocation address for loading single-segment overlays, or 0 for
2974 * @autostart: TRUE if DSP starts after loading; ignored if ovly is TRUE
2975 * @router_chans: number of audio router channels to be allocated (0 means use
2976 * internal defaults; max is 32)
2978 * Download DSP from a DSP Image Fast Load structure. This structure is a
2979 * linear, non-constant sized element array of structures, each of which
2980 * contain the count of the data to be loaded, the data itself, and the
2981 * corresponding starting chip address of the starting data location.
2982 * Returns zero or a negative error code.
2984 static int dspload_image(struct hda_codec *codec,
2985 const struct dsp_image_seg *fls,
2992 unsigned int sample_rate;
2993 unsigned short channels;
2995 codec_dbg(codec, "---- dspload_image begin ------\n");
2996 if (router_chans == 0) {
2998 router_chans = DMA_TRANSFER_FRAME_SIZE_NWORDS;
3000 router_chans = DMA_OVERLAY_FRAME_SIZE_NWORDS;
3003 sample_rate = 48000;
3004 channels = (unsigned short)router_chans;
3006 while (channels > 16) {
3012 codec_dbg(codec, "Ready to program DMA\n");
3014 status = dsp_reset(codec);
3019 codec_dbg(codec, "dsp_reset() complete\n");
3020 status = dspxfr_image(codec, fls, reloc, sample_rate, channels,
3026 codec_dbg(codec, "dspxfr_image() complete\n");
3027 if (autostart && !ovly) {
3028 dspload_post_setup(codec);
3029 status = dsp_set_run_state(codec);
3032 codec_dbg(codec, "LOAD FINISHED\n");
3038 #ifdef CONFIG_SND_HDA_CODEC_CA0132_DSP
3039 static bool dspload_is_loaded(struct hda_codec *codec)
3041 unsigned int data = 0;
3044 status = chipio_read(codec, 0x40004, &data);
3045 if ((status < 0) || (data != 1))
3051 #define dspload_is_loaded(codec) false
3054 static bool dspload_wait_loaded(struct hda_codec *codec)
3056 unsigned long timeout = jiffies + msecs_to_jiffies(2000);
3059 if (dspload_is_loaded(codec)) {
3060 codec_info(codec, "ca0132 DSP downloaded and running\n");
3064 } while (time_before(jiffies, timeout));
3066 codec_err(codec, "ca0132 failed to download DSP\n");
3071 * Setup GPIO for the other variants of Core3D.
3075 * Sets up the GPIO pins so that they are discoverable. If this isn't done,
3076 * the card shows as having no GPIO pins.
3078 static void ca0132_gpio_init(struct hda_codec *codec)
3080 struct ca0132_spec *spec = codec->spec;
3082 switch (spec->quirk) {
3084 snd_hda_codec_write(codec, 0x01, 0, 0x793, 0x00);
3085 snd_hda_codec_write(codec, 0x01, 0, 0x794, 0x53);
3086 snd_hda_codec_write(codec, 0x01, 0, 0x790, 0x23);
3089 snd_hda_codec_write(codec, 0x01, 0, 0x793, 0x00);
3090 snd_hda_codec_write(codec, 0x01, 0, 0x794, 0x5B);
3096 /* Sets the GPIO for audio output. */
3097 static void ca0132_gpio_setup(struct hda_codec *codec)
3099 struct ca0132_spec *spec = codec->spec;
3101 switch (spec->quirk) {
3103 snd_hda_codec_write(codec, 0x01, 0,
3104 AC_VERB_SET_GPIO_DIRECTION, 0x07);
3105 snd_hda_codec_write(codec, 0x01, 0,
3106 AC_VERB_SET_GPIO_MASK, 0x07);
3107 snd_hda_codec_write(codec, 0x01, 0,
3108 AC_VERB_SET_GPIO_DATA, 0x04);
3109 snd_hda_codec_write(codec, 0x01, 0,
3110 AC_VERB_SET_GPIO_DATA, 0x06);
3113 snd_hda_codec_write(codec, 0x01, 0,
3114 AC_VERB_SET_GPIO_DIRECTION, 0x1E);
3115 snd_hda_codec_write(codec, 0x01, 0,
3116 AC_VERB_SET_GPIO_MASK, 0x1F);
3117 snd_hda_codec_write(codec, 0x01, 0,
3118 AC_VERB_SET_GPIO_DATA, 0x0C);
3124 * GPIO control functions for the Recon3D integrated.
3127 enum r3di_gpio_bit {
3128 /* Bit 1 - Switch between front/rear mic. 0 = rear, 1 = front */
3129 R3DI_MIC_SELECT_BIT = 1,
3130 /* Bit 2 - Switch between headphone/line out. 0 = Headphone, 1 = Line */
3131 R3DI_OUT_SELECT_BIT = 2,
3133 * I dunno what this actually does, but it stays on until the dsp
3136 R3DI_GPIO_DSP_DOWNLOADING = 3,
3138 * Same as above, no clue what it does, but it comes on after the dsp
3141 R3DI_GPIO_DSP_DOWNLOADED = 4
3144 enum r3di_mic_select {
3145 /* Set GPIO bit 1 to 0 for rear mic */
3147 /* Set GPIO bit 1 to 1 for front microphone*/
3151 enum r3di_out_select {
3152 /* Set GPIO bit 2 to 0 for headphone */
3153 R3DI_HEADPHONE_OUT = 0,
3154 /* Set GPIO bit 2 to 1 for speaker */
3157 enum r3di_dsp_status {
3158 /* Set GPIO bit 3 to 1 until DSP is downloaded */
3159 R3DI_DSP_DOWNLOADING = 0,
3160 /* Set GPIO bit 4 to 1 once DSP is downloaded */
3161 R3DI_DSP_DOWNLOADED = 1
3165 static void r3di_gpio_mic_set(struct hda_codec *codec,
3166 enum r3di_mic_select cur_mic)
3168 unsigned int cur_gpio;
3170 /* Get the current GPIO Data setup */
3171 cur_gpio = snd_hda_codec_read(codec, 0x01, 0, AC_VERB_GET_GPIO_DATA, 0);
3175 cur_gpio &= ~(1 << R3DI_MIC_SELECT_BIT);
3177 case R3DI_FRONT_MIC:
3178 cur_gpio |= (1 << R3DI_MIC_SELECT_BIT);
3181 snd_hda_codec_write(codec, codec->core.afg, 0,
3182 AC_VERB_SET_GPIO_DATA, cur_gpio);
3185 static void r3di_gpio_out_set(struct hda_codec *codec,
3186 enum r3di_out_select cur_out)
3188 unsigned int cur_gpio;
3190 /* Get the current GPIO Data setup */
3191 cur_gpio = snd_hda_codec_read(codec, 0x01, 0, AC_VERB_GET_GPIO_DATA, 0);
3194 case R3DI_HEADPHONE_OUT:
3195 cur_gpio &= ~(1 << R3DI_OUT_SELECT_BIT);
3198 cur_gpio |= (1 << R3DI_OUT_SELECT_BIT);
3201 snd_hda_codec_write(codec, codec->core.afg, 0,
3202 AC_VERB_SET_GPIO_DATA, cur_gpio);
3205 static void r3di_gpio_dsp_status_set(struct hda_codec *codec,
3206 enum r3di_dsp_status dsp_status)
3208 unsigned int cur_gpio;
3210 /* Get the current GPIO Data setup */
3211 cur_gpio = snd_hda_codec_read(codec, 0x01, 0, AC_VERB_GET_GPIO_DATA, 0);
3213 switch (dsp_status) {
3214 case R3DI_DSP_DOWNLOADING:
3215 cur_gpio |= (1 << R3DI_GPIO_DSP_DOWNLOADING);
3216 snd_hda_codec_write(codec, codec->core.afg, 0,
3217 AC_VERB_SET_GPIO_DATA, cur_gpio);
3219 case R3DI_DSP_DOWNLOADED:
3220 /* Set DOWNLOADING bit to 0. */
3221 cur_gpio &= ~(1 << R3DI_GPIO_DSP_DOWNLOADING);
3223 snd_hda_codec_write(codec, codec->core.afg, 0,
3224 AC_VERB_SET_GPIO_DATA, cur_gpio);
3226 cur_gpio |= (1 << R3DI_GPIO_DSP_DOWNLOADED);
3230 snd_hda_codec_write(codec, codec->core.afg, 0,
3231 AC_VERB_SET_GPIO_DATA, cur_gpio);
3237 static int ca0132_playback_pcm_prepare(struct hda_pcm_stream *hinfo,
3238 struct hda_codec *codec,
3239 unsigned int stream_tag,
3240 unsigned int format,
3241 struct snd_pcm_substream *substream)
3243 struct ca0132_spec *spec = codec->spec;
3245 snd_hda_codec_setup_stream(codec, spec->dacs[0], stream_tag, 0, format);
3250 static int ca0132_playback_pcm_cleanup(struct hda_pcm_stream *hinfo,
3251 struct hda_codec *codec,
3252 struct snd_pcm_substream *substream)
3254 struct ca0132_spec *spec = codec->spec;
3256 if (spec->dsp_state == DSP_DOWNLOADING)
3259 /*If Playback effects are on, allow stream some time to flush
3261 if (spec->effects_switch[PLAY_ENHANCEMENT - EFFECT_START_NID])
3264 snd_hda_codec_cleanup_stream(codec, spec->dacs[0]);
3269 static unsigned int ca0132_playback_pcm_delay(struct hda_pcm_stream *info,
3270 struct hda_codec *codec,
3271 struct snd_pcm_substream *substream)
3273 struct ca0132_spec *spec = codec->spec;
3274 unsigned int latency = DSP_PLAYBACK_INIT_LATENCY;
3275 struct snd_pcm_runtime *runtime = substream->runtime;
3277 if (spec->dsp_state != DSP_DOWNLOADED)
3280 /* Add latency if playback enhancement and either effect is enabled. */
3281 if (spec->effects_switch[PLAY_ENHANCEMENT - EFFECT_START_NID]) {
3282 if ((spec->effects_switch[SURROUND - EFFECT_START_NID]) ||
3283 (spec->effects_switch[DIALOG_PLUS - EFFECT_START_NID]))
3284 latency += DSP_PLAY_ENHANCEMENT_LATENCY;
3287 /* Applying Speaker EQ adds latency as well. */
3288 if (spec->cur_out_type == SPEAKER_OUT)
3289 latency += DSP_SPEAKER_OUT_LATENCY;
3291 return (latency * runtime->rate) / 1000;
3297 static int ca0132_dig_playback_pcm_open(struct hda_pcm_stream *hinfo,
3298 struct hda_codec *codec,
3299 struct snd_pcm_substream *substream)
3301 struct ca0132_spec *spec = codec->spec;
3302 return snd_hda_multi_out_dig_open(codec, &spec->multiout);
3305 static int ca0132_dig_playback_pcm_prepare(struct hda_pcm_stream *hinfo,
3306 struct hda_codec *codec,
3307 unsigned int stream_tag,
3308 unsigned int format,
3309 struct snd_pcm_substream *substream)
3311 struct ca0132_spec *spec = codec->spec;
3312 return snd_hda_multi_out_dig_prepare(codec, &spec->multiout,
3313 stream_tag, format, substream);
3316 static int ca0132_dig_playback_pcm_cleanup(struct hda_pcm_stream *hinfo,
3317 struct hda_codec *codec,
3318 struct snd_pcm_substream *substream)
3320 struct ca0132_spec *spec = codec->spec;
3321 return snd_hda_multi_out_dig_cleanup(codec, &spec->multiout);
3324 static int ca0132_dig_playback_pcm_close(struct hda_pcm_stream *hinfo,
3325 struct hda_codec *codec,
3326 struct snd_pcm_substream *substream)
3328 struct ca0132_spec *spec = codec->spec;
3329 return snd_hda_multi_out_dig_close(codec, &spec->multiout);
3335 static int ca0132_capture_pcm_prepare(struct hda_pcm_stream *hinfo,
3336 struct hda_codec *codec,
3337 unsigned int stream_tag,
3338 unsigned int format,
3339 struct snd_pcm_substream *substream)
3341 snd_hda_codec_setup_stream(codec, hinfo->nid,
3342 stream_tag, 0, format);
3347 static int ca0132_capture_pcm_cleanup(struct hda_pcm_stream *hinfo,
3348 struct hda_codec *codec,
3349 struct snd_pcm_substream *substream)
3351 struct ca0132_spec *spec = codec->spec;
3353 if (spec->dsp_state == DSP_DOWNLOADING)
3356 snd_hda_codec_cleanup_stream(codec, hinfo->nid);
3360 static unsigned int ca0132_capture_pcm_delay(struct hda_pcm_stream *info,
3361 struct hda_codec *codec,
3362 struct snd_pcm_substream *substream)
3364 struct ca0132_spec *spec = codec->spec;
3365 unsigned int latency = DSP_CAPTURE_INIT_LATENCY;
3366 struct snd_pcm_runtime *runtime = substream->runtime;
3368 if (spec->dsp_state != DSP_DOWNLOADED)
3371 if (spec->effects_switch[CRYSTAL_VOICE - EFFECT_START_NID])
3372 latency += DSP_CRYSTAL_VOICE_LATENCY;
3374 return (latency * runtime->rate) / 1000;
3382 * Mixer controls helpers.
3384 #define CA0132_CODEC_VOL_MONO(xname, nid, channel, dir) \
3385 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
3387 .subdevice = HDA_SUBDEV_AMP_FLAG, \
3388 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE | \
3389 SNDRV_CTL_ELEM_ACCESS_TLV_READ | \
3390 SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK, \
3391 .info = ca0132_volume_info, \
3392 .get = ca0132_volume_get, \
3393 .put = ca0132_volume_put, \
3394 .tlv = { .c = ca0132_volume_tlv }, \
3395 .private_value = HDA_COMPOSE_AMP_VAL(nid, channel, 0, dir) }
3398 * Creates a mixer control that uses defaults of HDA_CODEC_VOL except for the
3399 * volume put, which is used for setting the DSP volume. This was done because
3400 * the ca0132 functions were taking too much time and causing lag.
3402 #define CA0132_ALT_CODEC_VOL_MONO(xname, nid, channel, dir) \
3403 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
3405 .subdevice = HDA_SUBDEV_AMP_FLAG, \
3406 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE | \
3407 SNDRV_CTL_ELEM_ACCESS_TLV_READ | \
3408 SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK, \
3409 .info = snd_hda_mixer_amp_volume_info, \
3410 .get = snd_hda_mixer_amp_volume_get, \
3411 .put = ca0132_alt_volume_put, \
3412 .tlv = { .c = snd_hda_mixer_amp_tlv }, \
3413 .private_value = HDA_COMPOSE_AMP_VAL(nid, channel, 0, dir) }
3415 #define CA0132_CODEC_MUTE_MONO(xname, nid, channel, dir) \
3416 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
3418 .subdevice = HDA_SUBDEV_AMP_FLAG, \
3419 .info = snd_hda_mixer_amp_switch_info, \
3420 .get = ca0132_switch_get, \
3421 .put = ca0132_switch_put, \
3422 .private_value = HDA_COMPOSE_AMP_VAL(nid, channel, 0, dir) }
3425 #define CA0132_CODEC_VOL(xname, nid, dir) \
3426 CA0132_CODEC_VOL_MONO(xname, nid, 3, dir)
3427 #define CA0132_ALT_CODEC_VOL(xname, nid, dir) \
3428 CA0132_ALT_CODEC_VOL_MONO(xname, nid, 3, dir)
3429 #define CA0132_CODEC_MUTE(xname, nid, dir) \
3430 CA0132_CODEC_MUTE_MONO(xname, nid, 3, dir)
3434 * Lookup table with decibel values for the DSP. When volume is changed in
3435 * Windows, the DSP is also sent the dB value in floating point. In Windows,
3436 * these values have decimal points, probably because the Windows driver
3437 * actually uses floating point. We can't here, so I made a lookup table of
3438 * values -90 to 9. -90 is the lowest decibel value for both the ADC's and the
3439 * DAC's, and 9 is the maximum.
3441 static const unsigned int float_vol_db_lookup[] = {
3442 0xC2B40000, 0xC2B20000, 0xC2B00000, 0xC2AE0000, 0xC2AC0000, 0xC2AA0000,
3443 0xC2A80000, 0xC2A60000, 0xC2A40000, 0xC2A20000, 0xC2A00000, 0xC29E0000,
3444 0xC29C0000, 0xC29A0000, 0xC2980000, 0xC2960000, 0xC2940000, 0xC2920000,
3445 0xC2900000, 0xC28E0000, 0xC28C0000, 0xC28A0000, 0xC2880000, 0xC2860000,
3446 0xC2840000, 0xC2820000, 0xC2800000, 0xC27C0000, 0xC2780000, 0xC2740000,
3447 0xC2700000, 0xC26C0000, 0xC2680000, 0xC2640000, 0xC2600000, 0xC25C0000,
3448 0xC2580000, 0xC2540000, 0xC2500000, 0xC24C0000, 0xC2480000, 0xC2440000,
3449 0xC2400000, 0xC23C0000, 0xC2380000, 0xC2340000, 0xC2300000, 0xC22C0000,
3450 0xC2280000, 0xC2240000, 0xC2200000, 0xC21C0000, 0xC2180000, 0xC2140000,
3451 0xC2100000, 0xC20C0000, 0xC2080000, 0xC2040000, 0xC2000000, 0xC1F80000,
3452 0xC1F00000, 0xC1E80000, 0xC1E00000, 0xC1D80000, 0xC1D00000, 0xC1C80000,
3453 0xC1C00000, 0xC1B80000, 0xC1B00000, 0xC1A80000, 0xC1A00000, 0xC1980000,
3454 0xC1900000, 0xC1880000, 0xC1800000, 0xC1700000, 0xC1600000, 0xC1500000,
3455 0xC1400000, 0xC1300000, 0xC1200000, 0xC1100000, 0xC1000000, 0xC0E00000,
3456 0xC0C00000, 0xC0A00000, 0xC0800000, 0xC0400000, 0xC0000000, 0xBF800000,
3457 0x00000000, 0x3F800000, 0x40000000, 0x40400000, 0x40800000, 0x40A00000,
3458 0x40C00000, 0x40E00000, 0x41000000, 0x41100000
3462 * This table counts from float 0 to 1 in increments of .01, which is
3463 * useful for a few different sliders.
3465 static const unsigned int float_zero_to_one_lookup[] = {
3466 0x00000000, 0x3C23D70A, 0x3CA3D70A, 0x3CF5C28F, 0x3D23D70A, 0x3D4CCCCD,
3467 0x3D75C28F, 0x3D8F5C29, 0x3DA3D70A, 0x3DB851EC, 0x3DCCCCCD, 0x3DE147AE,
3468 0x3DF5C28F, 0x3E051EB8, 0x3E0F5C29, 0x3E19999A, 0x3E23D70A, 0x3E2E147B,
3469 0x3E3851EC, 0x3E428F5C, 0x3E4CCCCD, 0x3E570A3D, 0x3E6147AE, 0x3E6B851F,
3470 0x3E75C28F, 0x3E800000, 0x3E851EB8, 0x3E8A3D71, 0x3E8F5C29, 0x3E947AE1,
3471 0x3E99999A, 0x3E9EB852, 0x3EA3D70A, 0x3EA8F5C3, 0x3EAE147B, 0x3EB33333,
3472 0x3EB851EC, 0x3EBD70A4, 0x3EC28F5C, 0x3EC7AE14, 0x3ECCCCCD, 0x3ED1EB85,
3473 0x3ED70A3D, 0x3EDC28F6, 0x3EE147AE, 0x3EE66666, 0x3EEB851F, 0x3EF0A3D7,
3474 0x3EF5C28F, 0x3EFAE148, 0x3F000000, 0x3F028F5C, 0x3F051EB8, 0x3F07AE14,
3475 0x3F0A3D71, 0x3F0CCCCD, 0x3F0F5C29, 0x3F11EB85, 0x3F147AE1, 0x3F170A3D,
3476 0x3F19999A, 0x3F1C28F6, 0x3F1EB852, 0x3F2147AE, 0x3F23D70A, 0x3F266666,
3477 0x3F28F5C3, 0x3F2B851F, 0x3F2E147B, 0x3F30A3D7, 0x3F333333, 0x3F35C28F,
3478 0x3F3851EC, 0x3F3AE148, 0x3F3D70A4, 0x3F400000, 0x3F428F5C, 0x3F451EB8,
3479 0x3F47AE14, 0x3F4A3D71, 0x3F4CCCCD, 0x3F4F5C29, 0x3F51EB85, 0x3F547AE1,
3480 0x3F570A3D, 0x3F59999A, 0x3F5C28F6, 0x3F5EB852, 0x3F6147AE, 0x3F63D70A,
3481 0x3F666666, 0x3F68F5C3, 0x3F6B851F, 0x3F6E147B, 0x3F70A3D7, 0x3F733333,
3482 0x3F75C28F, 0x3F7851EC, 0x3F7AE148, 0x3F7D70A4, 0x3F800000
3486 * This table counts from float 10 to 1000, which is the range of the x-bass
3487 * crossover slider in Windows.
3489 static const unsigned int float_xbass_xover_lookup[] = {
3490 0x41200000, 0x41A00000, 0x41F00000, 0x42200000, 0x42480000, 0x42700000,
3491 0x428C0000, 0x42A00000, 0x42B40000, 0x42C80000, 0x42DC0000, 0x42F00000,
3492 0x43020000, 0x430C0000, 0x43160000, 0x43200000, 0x432A0000, 0x43340000,
3493 0x433E0000, 0x43480000, 0x43520000, 0x435C0000, 0x43660000, 0x43700000,
3494 0x437A0000, 0x43820000, 0x43870000, 0x438C0000, 0x43910000, 0x43960000,
3495 0x439B0000, 0x43A00000, 0x43A50000, 0x43AA0000, 0x43AF0000, 0x43B40000,
3496 0x43B90000, 0x43BE0000, 0x43C30000, 0x43C80000, 0x43CD0000, 0x43D20000,
3497 0x43D70000, 0x43DC0000, 0x43E10000, 0x43E60000, 0x43EB0000, 0x43F00000,
3498 0x43F50000, 0x43FA0000, 0x43FF0000, 0x44020000, 0x44048000, 0x44070000,
3499 0x44098000, 0x440C0000, 0x440E8000, 0x44110000, 0x44138000, 0x44160000,
3500 0x44188000, 0x441B0000, 0x441D8000, 0x44200000, 0x44228000, 0x44250000,
3501 0x44278000, 0x442A0000, 0x442C8000, 0x442F0000, 0x44318000, 0x44340000,
3502 0x44368000, 0x44390000, 0x443B8000, 0x443E0000, 0x44408000, 0x44430000,
3503 0x44458000, 0x44480000, 0x444A8000, 0x444D0000, 0x444F8000, 0x44520000,
3504 0x44548000, 0x44570000, 0x44598000, 0x445C0000, 0x445E8000, 0x44610000,
3505 0x44638000, 0x44660000, 0x44688000, 0x446B0000, 0x446D8000, 0x44700000,
3506 0x44728000, 0x44750000, 0x44778000, 0x447A0000
3509 /* The following are for tuning of products */
3510 #ifdef ENABLE_TUNING_CONTROLS
3512 static unsigned int voice_focus_vals_lookup[] = {
3513 0x41A00000, 0x41A80000, 0x41B00000, 0x41B80000, 0x41C00000, 0x41C80000,
3514 0x41D00000, 0x41D80000, 0x41E00000, 0x41E80000, 0x41F00000, 0x41F80000,
3515 0x42000000, 0x42040000, 0x42080000, 0x420C0000, 0x42100000, 0x42140000,
3516 0x42180000, 0x421C0000, 0x42200000, 0x42240000, 0x42280000, 0x422C0000,
3517 0x42300000, 0x42340000, 0x42380000, 0x423C0000, 0x42400000, 0x42440000,
3518 0x42480000, 0x424C0000, 0x42500000, 0x42540000, 0x42580000, 0x425C0000,
3519 0x42600000, 0x42640000, 0x42680000, 0x426C0000, 0x42700000, 0x42740000,
3520 0x42780000, 0x427C0000, 0x42800000, 0x42820000, 0x42840000, 0x42860000,
3521 0x42880000, 0x428A0000, 0x428C0000, 0x428E0000, 0x42900000, 0x42920000,
3522 0x42940000, 0x42960000, 0x42980000, 0x429A0000, 0x429C0000, 0x429E0000,
3523 0x42A00000, 0x42A20000, 0x42A40000, 0x42A60000, 0x42A80000, 0x42AA0000,
3524 0x42AC0000, 0x42AE0000, 0x42B00000, 0x42B20000, 0x42B40000, 0x42B60000,
3525 0x42B80000, 0x42BA0000, 0x42BC0000, 0x42BE0000, 0x42C00000, 0x42C20000,
3526 0x42C40000, 0x42C60000, 0x42C80000, 0x42CA0000, 0x42CC0000, 0x42CE0000,
3527 0x42D00000, 0x42D20000, 0x42D40000, 0x42D60000, 0x42D80000, 0x42DA0000,
3528 0x42DC0000, 0x42DE0000, 0x42E00000, 0x42E20000, 0x42E40000, 0x42E60000,
3529 0x42E80000, 0x42EA0000, 0x42EC0000, 0x42EE0000, 0x42F00000, 0x42F20000,
3530 0x42F40000, 0x42F60000, 0x42F80000, 0x42FA0000, 0x42FC0000, 0x42FE0000,
3531 0x43000000, 0x43010000, 0x43020000, 0x43030000, 0x43040000, 0x43050000,
3532 0x43060000, 0x43070000, 0x43080000, 0x43090000, 0x430A0000, 0x430B0000,
3533 0x430C0000, 0x430D0000, 0x430E0000, 0x430F0000, 0x43100000, 0x43110000,
3534 0x43120000, 0x43130000, 0x43140000, 0x43150000, 0x43160000, 0x43170000,
3535 0x43180000, 0x43190000, 0x431A0000, 0x431B0000, 0x431C0000, 0x431D0000,
3536 0x431E0000, 0x431F0000, 0x43200000, 0x43210000, 0x43220000, 0x43230000,
3537 0x43240000, 0x43250000, 0x43260000, 0x43270000, 0x43280000, 0x43290000,
3538 0x432A0000, 0x432B0000, 0x432C0000, 0x432D0000, 0x432E0000, 0x432F0000,
3539 0x43300000, 0x43310000, 0x43320000, 0x43330000, 0x43340000
3542 static unsigned int mic_svm_vals_lookup[] = {
3543 0x00000000, 0x3C23D70A, 0x3CA3D70A, 0x3CF5C28F, 0x3D23D70A, 0x3D4CCCCD,
3544 0x3D75C28F, 0x3D8F5C29, 0x3DA3D70A, 0x3DB851EC, 0x3DCCCCCD, 0x3DE147AE,
3545 0x3DF5C28F, 0x3E051EB8, 0x3E0F5C29, 0x3E19999A, 0x3E23D70A, 0x3E2E147B,
3546 0x3E3851EC, 0x3E428F5C, 0x3E4CCCCD, 0x3E570A3D, 0x3E6147AE, 0x3E6B851F,
3547 0x3E75C28F, 0x3E800000, 0x3E851EB8, 0x3E8A3D71, 0x3E8F5C29, 0x3E947AE1,
3548 0x3E99999A, 0x3E9EB852, 0x3EA3D70A, 0x3EA8F5C3, 0x3EAE147B, 0x3EB33333,
3549 0x3EB851EC, 0x3EBD70A4, 0x3EC28F5C, 0x3EC7AE14, 0x3ECCCCCD, 0x3ED1EB85,
3550 0x3ED70A3D, 0x3EDC28F6, 0x3EE147AE, 0x3EE66666, 0x3EEB851F, 0x3EF0A3D7,
3551 0x3EF5C28F, 0x3EFAE148, 0x3F000000, 0x3F028F5C, 0x3F051EB8, 0x3F07AE14,
3552 0x3F0A3D71, 0x3F0CCCCD, 0x3F0F5C29, 0x3F11EB85, 0x3F147AE1, 0x3F170A3D,
3553 0x3F19999A, 0x3F1C28F6, 0x3F1EB852, 0x3F2147AE, 0x3F23D70A, 0x3F266666,
3554 0x3F28F5C3, 0x3F2B851F, 0x3F2E147B, 0x3F30A3D7, 0x3F333333, 0x3F35C28F,
3555 0x3F3851EC, 0x3F3AE148, 0x3F3D70A4, 0x3F400000, 0x3F428F5C, 0x3F451EB8,
3556 0x3F47AE14, 0x3F4A3D71, 0x3F4CCCCD, 0x3F4F5C29, 0x3F51EB85, 0x3F547AE1,
3557 0x3F570A3D, 0x3F59999A, 0x3F5C28F6, 0x3F5EB852, 0x3F6147AE, 0x3F63D70A,
3558 0x3F666666, 0x3F68F5C3, 0x3F6B851F, 0x3F6E147B, 0x3F70A3D7, 0x3F733333,
3559 0x3F75C28F, 0x3F7851EC, 0x3F7AE148, 0x3F7D70A4, 0x3F800000
3562 static unsigned int equalizer_vals_lookup[] = {
3563 0xC1C00000, 0xC1B80000, 0xC1B00000, 0xC1A80000, 0xC1A00000, 0xC1980000,
3564 0xC1900000, 0xC1880000, 0xC1800000, 0xC1700000, 0xC1600000, 0xC1500000,
3565 0xC1400000, 0xC1300000, 0xC1200000, 0xC1100000, 0xC1000000, 0xC0E00000,
3566 0xC0C00000, 0xC0A00000, 0xC0800000, 0xC0400000, 0xC0000000, 0xBF800000,
3567 0x00000000, 0x3F800000, 0x40000000, 0x40400000, 0x40800000, 0x40A00000,
3568 0x40C00000, 0x40E00000, 0x41000000, 0x41100000, 0x41200000, 0x41300000,
3569 0x41400000, 0x41500000, 0x41600000, 0x41700000, 0x41800000, 0x41880000,
3570 0x41900000, 0x41980000, 0x41A00000, 0x41A80000, 0x41B00000, 0x41B80000,
3574 static int tuning_ctl_set(struct hda_codec *codec, hda_nid_t nid,
3575 unsigned int *lookup, int idx)
3579 for (i = 0; i < TUNING_CTLS_COUNT; i++)
3580 if (nid == ca0132_tuning_ctls[i].nid)
3583 snd_hda_power_up(codec);
3584 dspio_set_param(codec, ca0132_tuning_ctls[i].mid, 0x20,
3585 ca0132_tuning_ctls[i].req,
3586 &(lookup[idx]), sizeof(unsigned int));
3587 snd_hda_power_down(codec);
3592 static int tuning_ctl_get(struct snd_kcontrol *kcontrol,
3593 struct snd_ctl_elem_value *ucontrol)
3595 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
3596 struct ca0132_spec *spec = codec->spec;
3597 hda_nid_t nid = get_amp_nid(kcontrol);
3598 long *valp = ucontrol->value.integer.value;
3599 int idx = nid - TUNING_CTL_START_NID;
3601 *valp = spec->cur_ctl_vals[idx];
3605 static int voice_focus_ctl_info(struct snd_kcontrol *kcontrol,
3606 struct snd_ctl_elem_info *uinfo)
3608 int chs = get_amp_channels(kcontrol);
3609 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
3610 uinfo->count = chs == 3 ? 2 : 1;
3611 uinfo->value.integer.min = 20;
3612 uinfo->value.integer.max = 180;
3613 uinfo->value.integer.step = 1;
3618 static int voice_focus_ctl_put(struct snd_kcontrol *kcontrol,
3619 struct snd_ctl_elem_value *ucontrol)
3621 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
3622 struct ca0132_spec *spec = codec->spec;
3623 hda_nid_t nid = get_amp_nid(kcontrol);
3624 long *valp = ucontrol->value.integer.value;
3627 idx = nid - TUNING_CTL_START_NID;
3629 if (spec->cur_ctl_vals[idx] == *valp)
3632 spec->cur_ctl_vals[idx] = *valp;
3635 tuning_ctl_set(codec, nid, voice_focus_vals_lookup, idx);
3640 static int mic_svm_ctl_info(struct snd_kcontrol *kcontrol,
3641 struct snd_ctl_elem_info *uinfo)
3643 int chs = get_amp_channels(kcontrol);
3644 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
3645 uinfo->count = chs == 3 ? 2 : 1;
3646 uinfo->value.integer.min = 0;
3647 uinfo->value.integer.max = 100;
3648 uinfo->value.integer.step = 1;
3653 static int mic_svm_ctl_put(struct snd_kcontrol *kcontrol,
3654 struct snd_ctl_elem_value *ucontrol)
3656 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
3657 struct ca0132_spec *spec = codec->spec;
3658 hda_nid_t nid = get_amp_nid(kcontrol);
3659 long *valp = ucontrol->value.integer.value;
3662 idx = nid - TUNING_CTL_START_NID;
3664 if (spec->cur_ctl_vals[idx] == *valp)
3667 spec->cur_ctl_vals[idx] = *valp;
3670 tuning_ctl_set(codec, nid, mic_svm_vals_lookup, idx);
3675 static int equalizer_ctl_info(struct snd_kcontrol *kcontrol,
3676 struct snd_ctl_elem_info *uinfo)
3678 int chs = get_amp_channels(kcontrol);
3679 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
3680 uinfo->count = chs == 3 ? 2 : 1;
3681 uinfo->value.integer.min = 0;
3682 uinfo->value.integer.max = 48;
3683 uinfo->value.integer.step = 1;
3688 static int equalizer_ctl_put(struct snd_kcontrol *kcontrol,
3689 struct snd_ctl_elem_value *ucontrol)
3691 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
3692 struct ca0132_spec *spec = codec->spec;
3693 hda_nid_t nid = get_amp_nid(kcontrol);
3694 long *valp = ucontrol->value.integer.value;
3697 idx = nid - TUNING_CTL_START_NID;
3699 if (spec->cur_ctl_vals[idx] == *valp)
3702 spec->cur_ctl_vals[idx] = *valp;
3705 tuning_ctl_set(codec, nid, equalizer_vals_lookup, idx);
3710 static const SNDRV_CTL_TLVD_DECLARE_DB_SCALE(voice_focus_db_scale, 2000, 100, 0);
3711 static const SNDRV_CTL_TLVD_DECLARE_DB_SCALE(eq_db_scale, -2400, 100, 0);
3713 static int add_tuning_control(struct hda_codec *codec,
3714 hda_nid_t pnid, hda_nid_t nid,
3715 const char *name, int dir)
3717 char namestr[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
3718 int type = dir ? HDA_INPUT : HDA_OUTPUT;
3719 struct snd_kcontrol_new knew =
3720 HDA_CODEC_VOLUME_MONO(namestr, nid, 1, 0, type);
3722 knew.access = SNDRV_CTL_ELEM_ACCESS_READWRITE |
3723 SNDRV_CTL_ELEM_ACCESS_TLV_READ;
3728 knew.info = voice_focus_ctl_info;
3729 knew.get = tuning_ctl_get;
3730 knew.put = voice_focus_ctl_put;
3731 knew.tlv.p = voice_focus_db_scale;
3734 knew.info = mic_svm_ctl_info;
3735 knew.get = tuning_ctl_get;
3736 knew.put = mic_svm_ctl_put;
3739 knew.info = equalizer_ctl_info;
3740 knew.get = tuning_ctl_get;
3741 knew.put = equalizer_ctl_put;
3742 knew.tlv.p = eq_db_scale;
3747 knew.private_value =
3748 HDA_COMPOSE_AMP_VAL(nid, 1, 0, type);
3749 sprintf(namestr, "%s %s Volume", name, dirstr[dir]);
3750 return snd_hda_ctl_add(codec, nid, snd_ctl_new1(&knew, codec));
3753 static int add_tuning_ctls(struct hda_codec *codec)
3758 for (i = 0; i < TUNING_CTLS_COUNT; i++) {
3759 err = add_tuning_control(codec,
3760 ca0132_tuning_ctls[i].parent_nid,
3761 ca0132_tuning_ctls[i].nid,
3762 ca0132_tuning_ctls[i].name,
3763 ca0132_tuning_ctls[i].direct);
3771 static void ca0132_init_tuning_defaults(struct hda_codec *codec)
3773 struct ca0132_spec *spec = codec->spec;
3776 /* Wedge Angle defaults to 30. 10 below is 30 - 20. 20 is min. */
3777 spec->cur_ctl_vals[WEDGE_ANGLE - TUNING_CTL_START_NID] = 10;
3778 /* SVM level defaults to 0.74. */
3779 spec->cur_ctl_vals[SVM_LEVEL - TUNING_CTL_START_NID] = 74;
3781 /* EQ defaults to 0dB. */
3782 for (i = 2; i < TUNING_CTLS_COUNT; i++)
3783 spec->cur_ctl_vals[i] = 24;
3785 #endif /*ENABLE_TUNING_CONTROLS*/
3788 * Select the active output.
3789 * If autodetect is enabled, output will be selected based on jack detection.
3790 * If jack inserted, headphone will be selected, else built-in speakers
3791 * If autodetect is disabled, output will be selected based on selection.
3793 static int ca0132_select_out(struct hda_codec *codec)
3795 struct ca0132_spec *spec = codec->spec;
3796 unsigned int pin_ctl;
3802 codec_dbg(codec, "ca0132_select_out\n");
3804 snd_hda_power_up_pm(codec);
3806 auto_jack = spec->vnode_lswitch[VNID_HP_ASEL - VNODE_START_NID];
3809 jack_present = snd_hda_jack_detect(codec, spec->unsol_tag_hp);
3812 spec->vnode_lswitch[VNID_HP_SEL - VNODE_START_NID];
3815 spec->cur_out_type = HEADPHONE_OUT;
3817 spec->cur_out_type = SPEAKER_OUT;
3819 if (spec->cur_out_type == SPEAKER_OUT) {
3820 codec_dbg(codec, "ca0132_select_out speaker\n");
3821 /*speaker out config*/
3823 err = dspio_set_uint_param(codec, 0x80, 0x04, tmp);
3826 /*enable speaker EQ*/
3828 err = dspio_set_uint_param(codec, 0x8f, 0x00, tmp);
3833 snd_hda_codec_write(codec, spec->out_pins[1], 0,
3834 VENDOR_CHIPIO_EAPD_SEL_SET, 0x02);
3835 snd_hda_codec_write(codec, spec->out_pins[0], 0,
3836 AC_VERB_SET_EAPD_BTLENABLE, 0x00);
3837 snd_hda_codec_write(codec, spec->out_pins[0], 0,
3838 VENDOR_CHIPIO_EAPD_SEL_SET, 0x00);
3839 snd_hda_codec_write(codec, spec->out_pins[0], 0,
3840 AC_VERB_SET_EAPD_BTLENABLE, 0x02);
3842 /* disable headphone node */
3843 pin_ctl = snd_hda_codec_read(codec, spec->out_pins[1], 0,
3844 AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
3845 snd_hda_set_pin_ctl(codec, spec->out_pins[1],
3847 /* enable speaker node */
3848 pin_ctl = snd_hda_codec_read(codec, spec->out_pins[0], 0,
3849 AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
3850 snd_hda_set_pin_ctl(codec, spec->out_pins[0],
3853 codec_dbg(codec, "ca0132_select_out hp\n");
3854 /*headphone out config*/
3856 err = dspio_set_uint_param(codec, 0x80, 0x04, tmp);
3859 /*disable speaker EQ*/
3861 err = dspio_set_uint_param(codec, 0x8f, 0x00, tmp);
3866 snd_hda_codec_write(codec, spec->out_pins[0], 0,
3867 VENDOR_CHIPIO_EAPD_SEL_SET, 0x00);
3868 snd_hda_codec_write(codec, spec->out_pins[0], 0,
3869 AC_VERB_SET_EAPD_BTLENABLE, 0x00);
3870 snd_hda_codec_write(codec, spec->out_pins[1], 0,
3871 VENDOR_CHIPIO_EAPD_SEL_SET, 0x02);
3872 snd_hda_codec_write(codec, spec->out_pins[0], 0,
3873 AC_VERB_SET_EAPD_BTLENABLE, 0x02);
3875 /* disable speaker*/
3876 pin_ctl = snd_hda_codec_read(codec, spec->out_pins[0], 0,
3877 AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
3878 snd_hda_set_pin_ctl(codec, spec->out_pins[0],
3880 /* enable headphone*/
3881 pin_ctl = snd_hda_codec_read(codec, spec->out_pins[1], 0,
3882 AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
3883 snd_hda_set_pin_ctl(codec, spec->out_pins[1],
3888 snd_hda_power_down_pm(codec);
3890 return err < 0 ? err : 0;
3894 * This function behaves similarly to the ca0132_select_out funciton above,
3895 * except with a few differences. It adds the ability to select the current
3896 * output with an enumerated control "output source" if the auto detect
3897 * mute switch is set to off. If the auto detect mute switch is enabled, it
3898 * will detect either headphone or lineout(SPEAKER_OUT) from jack detection.
3899 * It also adds the ability to auto-detect the front headphone port. The only
3900 * way to select surround is to disable auto detect, and set Surround with the
3901 * enumerated control.
3903 static int ca0132_alt_select_out(struct hda_codec *codec)
3905 struct ca0132_spec *spec = codec->spec;
3906 unsigned int pin_ctl;
3912 /* Default Headphone is rear headphone */
3913 hda_nid_t headphone_nid = spec->out_pins[1];
3915 codec_dbg(codec, "%s\n", __func__);
3917 snd_hda_power_up_pm(codec);
3919 auto_jack = spec->vnode_lswitch[VNID_HP_ASEL - VNODE_START_NID];
3922 * If headphone rear or front is plugged in, set to headphone.
3923 * If neither is plugged in, set to rear line out. Only if
3924 * hp/speaker auto detect is enabled.
3927 jack_present = snd_hda_jack_detect(codec, spec->unsol_tag_hp) ||
3928 snd_hda_jack_detect(codec, spec->unsol_tag_front_hp);
3931 spec->cur_out_type = HEADPHONE_OUT;
3933 spec->cur_out_type = SPEAKER_OUT;
3935 spec->cur_out_type = spec->out_enum_val;
3937 /* Begin DSP output switch */
3939 err = dspio_set_uint_param(codec, 0x96, 0x3A, tmp);
3943 switch (spec->cur_out_type) {
3945 codec_dbg(codec, "%s speaker\n", __func__);
3946 /*speaker out config*/
3947 switch (spec->quirk) {
3949 writew(0x0007, spec->mem_base + 0x320);
3950 writew(0x0104, spec->mem_base + 0x320);
3951 writew(0x0101, spec->mem_base + 0x320);
3952 chipio_set_control_param(codec, 0x0D, 0x18);
3955 chipio_set_control_param(codec, 0x0D, 0x24);
3956 r3di_gpio_out_set(codec, R3DI_LINE_OUT);
3960 /* disable headphone node */
3961 pin_ctl = snd_hda_codec_read(codec, spec->out_pins[1], 0,
3962 AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
3963 snd_hda_set_pin_ctl(codec, spec->out_pins[1],
3965 /* enable line-out node */
3966 pin_ctl = snd_hda_codec_read(codec, spec->out_pins[0], 0,
3967 AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
3968 snd_hda_set_pin_ctl(codec, spec->out_pins[0],
3971 snd_hda_codec_write(codec, spec->out_pins[0], 0,
3972 AC_VERB_SET_EAPD_BTLENABLE, 0x01);
3974 /* If PlayEnhancement is enabled, set different source */
3975 if (spec->effects_switch[PLAY_ENHANCEMENT - EFFECT_START_NID])
3976 dspio_set_uint_param(codec, 0x80, 0x04, FLOAT_ONE);
3978 dspio_set_uint_param(codec, 0x80, 0x04, FLOAT_EIGHT);
3981 codec_dbg(codec, "%s hp\n", __func__);
3982 /* Headphone out config*/
3983 switch (spec->quirk) {
3985 writew(0x0107, spec->mem_base + 0x320);
3986 writew(0x0104, spec->mem_base + 0x320);
3987 writew(0x0001, spec->mem_base + 0x320);
3988 chipio_set_control_param(codec, 0x0D, 0x12);
3991 chipio_set_control_param(codec, 0x0D, 0x21);
3992 r3di_gpio_out_set(codec, R3DI_HEADPHONE_OUT);
3996 snd_hda_codec_write(codec, spec->out_pins[0], 0,
3997 AC_VERB_SET_EAPD_BTLENABLE, 0x00);
3999 /* disable speaker*/
4000 pin_ctl = snd_hda_codec_read(codec, spec->out_pins[0], 0,
4001 AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
4002 snd_hda_set_pin_ctl(codec, spec->out_pins[0],
4005 /* enable headphone, either front or rear */
4007 if (snd_hda_jack_detect(codec, spec->unsol_tag_front_hp))
4008 headphone_nid = spec->out_pins[2];
4009 else if (snd_hda_jack_detect(codec, spec->unsol_tag_hp))
4010 headphone_nid = spec->out_pins[1];
4012 pin_ctl = snd_hda_codec_read(codec, headphone_nid, 0,
4013 AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
4014 snd_hda_set_pin_ctl(codec, headphone_nid,
4017 if (spec->effects_switch[PLAY_ENHANCEMENT - EFFECT_START_NID])
4018 dspio_set_uint_param(codec, 0x80, 0x04, FLOAT_ONE);
4020 dspio_set_uint_param(codec, 0x80, 0x04, FLOAT_ZERO);
4023 codec_dbg(codec, "%s surround\n", __func__);
4024 /* Surround out config*/
4025 switch (spec->quirk) {
4027 writew(0x0007, spec->mem_base + 0x320);
4028 writew(0x0104, spec->mem_base + 0x320);
4029 writew(0x0101, spec->mem_base + 0x320);
4030 chipio_set_control_param(codec, 0x0D, 0x18);
4033 chipio_set_control_param(codec, 0x0D, 0x24);
4034 r3di_gpio_out_set(codec, R3DI_LINE_OUT);
4037 /* enable line out node */
4038 pin_ctl = snd_hda_codec_read(codec, spec->out_pins[0], 0,
4039 AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
4040 snd_hda_set_pin_ctl(codec, spec->out_pins[0],
4042 /* Disable headphone out */
4043 pin_ctl = snd_hda_codec_read(codec, spec->out_pins[1], 0,
4044 AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
4045 snd_hda_set_pin_ctl(codec, spec->out_pins[1],
4047 /* Enable EAPD on line out */
4048 snd_hda_codec_write(codec, spec->out_pins[0], 0,
4049 AC_VERB_SET_EAPD_BTLENABLE, 0x01);
4050 /* enable center/lfe out node */
4051 pin_ctl = snd_hda_codec_read(codec, spec->out_pins[2], 0,
4052 AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
4053 snd_hda_set_pin_ctl(codec, spec->out_pins[2],
4055 /* Now set rear surround node as out. */
4056 pin_ctl = snd_hda_codec_read(codec, spec->out_pins[3], 0,
4057 AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
4058 snd_hda_set_pin_ctl(codec, spec->out_pins[3],
4061 if (spec->effects_switch[PLAY_ENHANCEMENT - EFFECT_START_NID])
4062 dspio_set_uint_param(codec, 0x80, 0x04, FLOAT_ONE);
4064 dspio_set_uint_param(codec, 0x80, 0x04, FLOAT_EIGHT);
4068 /* run through the output dsp commands for line-out */
4069 for (i = 0; i < alt_out_presets[spec->cur_out_type].commands; i++) {
4070 err = dspio_set_uint_param(codec,
4071 alt_out_presets[spec->cur_out_type].mids[i],
4072 alt_out_presets[spec->cur_out_type].reqs[i],
4073 alt_out_presets[spec->cur_out_type].vals[i]);
4080 snd_hda_power_down_pm(codec);
4082 return err < 0 ? err : 0;
4085 static void ca0132_unsol_hp_delayed(struct work_struct *work)
4087 struct ca0132_spec *spec = container_of(
4088 to_delayed_work(work), struct ca0132_spec, unsol_hp_work);
4089 struct hda_jack_tbl *jack;
4091 if (spec->use_alt_functions)
4092 ca0132_alt_select_out(spec->codec);
4094 ca0132_select_out(spec->codec);
4096 jack = snd_hda_jack_tbl_get(spec->codec, spec->unsol_tag_hp);
4098 jack->block_report = 0;
4099 snd_hda_jack_report_sync(spec->codec);
4103 static void ca0132_set_dmic(struct hda_codec *codec, int enable);
4104 static int ca0132_mic_boost_set(struct hda_codec *codec, long val);
4105 static int ca0132_effects_set(struct hda_codec *codec, hda_nid_t nid, long val);
4106 static void resume_mic1(struct hda_codec *codec, unsigned int oldval);
4107 static int stop_mic1(struct hda_codec *codec);
4108 static int ca0132_cvoice_switch_set(struct hda_codec *codec);
4109 static int ca0132_alt_mic_boost_set(struct hda_codec *codec, long val);
4112 * Select the active VIP source
4114 static int ca0132_set_vipsource(struct hda_codec *codec, int val)
4116 struct ca0132_spec *spec = codec->spec;
4119 if (spec->dsp_state != DSP_DOWNLOADED)
4122 /* if CrystalVoice if off, vipsource should be 0 */
4123 if (!spec->effects_switch[CRYSTAL_VOICE - EFFECT_START_NID] ||
4125 chipio_set_control_param(codec, CONTROL_PARAM_VIP_SOURCE, 0);
4126 chipio_set_conn_rate(codec, MEM_CONNID_MICIN1, SR_96_000);
4127 chipio_set_conn_rate(codec, MEM_CONNID_MICOUT1, SR_96_000);
4128 if (spec->cur_mic_type == DIGITAL_MIC)
4132 dspio_set_uint_param(codec, 0x80, 0x00, tmp);
4134 dspio_set_uint_param(codec, 0x80, 0x05, tmp);
4136 chipio_set_conn_rate(codec, MEM_CONNID_MICIN1, SR_16_000);
4137 chipio_set_conn_rate(codec, MEM_CONNID_MICOUT1, SR_16_000);
4138 if (spec->cur_mic_type == DIGITAL_MIC)
4142 dspio_set_uint_param(codec, 0x80, 0x00, tmp);
4144 dspio_set_uint_param(codec, 0x80, 0x05, tmp);
4146 chipio_set_control_param(codec, CONTROL_PARAM_VIP_SOURCE, val);
4152 static int ca0132_alt_set_vipsource(struct hda_codec *codec, int val)
4154 struct ca0132_spec *spec = codec->spec;
4157 if (spec->dsp_state != DSP_DOWNLOADED)
4160 codec_dbg(codec, "%s\n", __func__);
4162 chipio_set_stream_control(codec, 0x03, 0);
4163 chipio_set_stream_control(codec, 0x04, 0);
4165 /* if CrystalVoice is off, vipsource should be 0 */
4166 if (!spec->effects_switch[CRYSTAL_VOICE - EFFECT_START_NID] ||
4167 (val == 0) || spec->in_enum_val == REAR_LINE_IN) {
4168 codec_dbg(codec, "%s: off.", __func__);
4169 chipio_set_control_param(codec, CONTROL_PARAM_VIP_SOURCE, 0);
4172 dspio_set_uint_param(codec, 0x80, 0x05, tmp);
4174 chipio_set_conn_rate(codec, MEM_CONNID_MICIN1, SR_96_000);
4175 chipio_set_conn_rate(codec, MEM_CONNID_MICOUT1, SR_96_000);
4176 if (spec->quirk == QUIRK_R3DI)
4177 chipio_set_conn_rate(codec, 0x0F, SR_96_000);
4180 if (spec->in_enum_val == REAR_LINE_IN)
4183 if (spec->quirk == QUIRK_SBZ)
4189 dspio_set_uint_param(codec, 0x80, 0x00, tmp);
4192 codec_dbg(codec, "%s: on.", __func__);
4193 chipio_set_conn_rate(codec, MEM_CONNID_MICIN1, SR_16_000);
4194 chipio_set_conn_rate(codec, MEM_CONNID_MICOUT1, SR_16_000);
4195 if (spec->quirk == QUIRK_R3DI)
4196 chipio_set_conn_rate(codec, 0x0F, SR_16_000);
4198 if (spec->effects_switch[VOICE_FOCUS - EFFECT_START_NID])
4202 dspio_set_uint_param(codec, 0x80, 0x00, tmp);
4205 dspio_set_uint_param(codec, 0x80, 0x05, tmp);
4208 chipio_set_control_param(codec, CONTROL_PARAM_VIP_SOURCE, val);
4211 chipio_set_stream_control(codec, 0x03, 1);
4212 chipio_set_stream_control(codec, 0x04, 1);
4218 * Select the active microphone.
4219 * If autodetect is enabled, mic will be selected based on jack detection.
4220 * If jack inserted, ext.mic will be selected, else built-in mic
4221 * If autodetect is disabled, mic will be selected based on selection.
4223 static int ca0132_select_mic(struct hda_codec *codec)
4225 struct ca0132_spec *spec = codec->spec;
4229 codec_dbg(codec, "ca0132_select_mic\n");
4231 snd_hda_power_up_pm(codec);
4233 auto_jack = spec->vnode_lswitch[VNID_AMIC1_ASEL - VNODE_START_NID];
4236 jack_present = snd_hda_jack_detect(codec, spec->unsol_tag_amic1);
4239 spec->vnode_lswitch[VNID_AMIC1_SEL - VNODE_START_NID];
4242 spec->cur_mic_type = LINE_MIC_IN;
4244 spec->cur_mic_type = DIGITAL_MIC;
4246 if (spec->cur_mic_type == DIGITAL_MIC) {
4247 /* enable digital Mic */
4248 chipio_set_conn_rate(codec, MEM_CONNID_DMIC, SR_32_000);
4249 ca0132_set_dmic(codec, 1);
4250 ca0132_mic_boost_set(codec, 0);
4251 /* set voice focus */
4252 ca0132_effects_set(codec, VOICE_FOCUS,
4253 spec->effects_switch
4254 [VOICE_FOCUS - EFFECT_START_NID]);
4256 /* disable digital Mic */
4257 chipio_set_conn_rate(codec, MEM_CONNID_DMIC, SR_96_000);
4258 ca0132_set_dmic(codec, 0);
4259 ca0132_mic_boost_set(codec, spec->cur_mic_boost);
4260 /* disable voice focus */
4261 ca0132_effects_set(codec, VOICE_FOCUS, 0);
4264 snd_hda_power_down_pm(codec);
4270 * Select the active input.
4271 * Mic detection isn't used, because it's kind of pointless on the SBZ.
4272 * The front mic has no jack-detection, so the only way to switch to it
4273 * is to do it manually in alsamixer.
4275 static int ca0132_alt_select_in(struct hda_codec *codec)
4277 struct ca0132_spec *spec = codec->spec;
4280 codec_dbg(codec, "%s\n", __func__);
4282 snd_hda_power_up_pm(codec);
4284 chipio_set_stream_control(codec, 0x03, 0);
4285 chipio_set_stream_control(codec, 0x04, 0);
4287 spec->cur_mic_type = spec->in_enum_val;
4289 switch (spec->cur_mic_type) {
4291 switch (spec->quirk) {
4293 writew(0x0000, spec->mem_base + 0x320);
4297 r3di_gpio_mic_set(codec, R3DI_REAR_MIC);
4305 chipio_set_conn_rate(codec, MEM_CONNID_MICIN1, SR_96_000);
4306 chipio_set_conn_rate(codec, MEM_CONNID_MICOUT1, SR_96_000);
4307 if (spec->quirk == QUIRK_R3DI)
4308 chipio_set_conn_rate(codec, 0x0F, SR_96_000);
4310 dspio_set_uint_param(codec, 0x80, 0x00, tmp);
4312 chipio_set_stream_control(codec, 0x03, 1);
4313 chipio_set_stream_control(codec, 0x04, 1);
4315 if (spec->quirk == QUIRK_SBZ) {
4316 chipio_write(codec, 0x18B098, 0x0000000C);
4317 chipio_write(codec, 0x18B09C, 0x0000000C);
4319 ca0132_alt_mic_boost_set(codec, spec->mic_boost_enum_val);
4322 ca0132_mic_boost_set(codec, 0);
4323 switch (spec->quirk) {
4325 writew(0x0000, spec->mem_base + 0x320);
4328 r3di_gpio_mic_set(codec, R3DI_REAR_MIC);
4332 chipio_set_conn_rate(codec, MEM_CONNID_MICIN1, SR_96_000);
4333 chipio_set_conn_rate(codec, MEM_CONNID_MICOUT1, SR_96_000);
4334 if (spec->quirk == QUIRK_R3DI)
4335 chipio_set_conn_rate(codec, 0x0F, SR_96_000);
4338 dspio_set_uint_param(codec, 0x80, 0x00, tmp);
4340 if (spec->quirk == QUIRK_SBZ) {
4341 chipio_write(codec, 0x18B098, 0x00000000);
4342 chipio_write(codec, 0x18B09C, 0x00000000);
4345 chipio_set_stream_control(codec, 0x03, 1);
4346 chipio_set_stream_control(codec, 0x04, 1);
4349 switch (spec->quirk) {
4351 writew(0x0100, spec->mem_base + 0x320);
4352 writew(0x0005, spec->mem_base + 0x320);
4356 r3di_gpio_mic_set(codec, R3DI_FRONT_MIC);
4364 chipio_set_conn_rate(codec, MEM_CONNID_MICIN1, SR_96_000);
4365 chipio_set_conn_rate(codec, MEM_CONNID_MICOUT1, SR_96_000);
4366 if (spec->quirk == QUIRK_R3DI)
4367 chipio_set_conn_rate(codec, 0x0F, SR_96_000);
4369 dspio_set_uint_param(codec, 0x80, 0x00, tmp);
4371 chipio_set_stream_control(codec, 0x03, 1);
4372 chipio_set_stream_control(codec, 0x04, 1);
4374 if (spec->quirk == QUIRK_SBZ) {
4375 chipio_write(codec, 0x18B098, 0x0000000C);
4376 chipio_write(codec, 0x18B09C, 0x000000CC);
4378 ca0132_alt_mic_boost_set(codec, spec->mic_boost_enum_val);
4381 ca0132_cvoice_switch_set(codec);
4383 snd_hda_power_down_pm(codec);
4389 * Check if VNODE settings take effect immediately.
4391 static bool ca0132_is_vnode_effective(struct hda_codec *codec,
4393 hda_nid_t *shared_nid)
4395 struct ca0132_spec *spec = codec->spec;
4400 nid = spec->shared_out_nid;
4403 nid = spec->shared_mic_nid;
4416 * The following functions are control change helpers.
4417 * They return 0 if no changed. Return 1 if changed.
4419 static int ca0132_voicefx_set(struct hda_codec *codec, int enable)
4421 struct ca0132_spec *spec = codec->spec;
4424 /* based on CrystalVoice state to enable VoiceFX. */
4426 tmp = spec->effects_switch[CRYSTAL_VOICE - EFFECT_START_NID] ?
4427 FLOAT_ONE : FLOAT_ZERO;
4432 dspio_set_uint_param(codec, ca0132_voicefx.mid,
4433 ca0132_voicefx.reqs[0], tmp);
4439 * Set the effects parameters
4441 static int ca0132_effects_set(struct hda_codec *codec, hda_nid_t nid, long val)
4443 struct ca0132_spec *spec = codec->spec;
4444 unsigned int on, tmp;
4445 int num_fx = OUT_EFFECTS_COUNT + IN_EFFECTS_COUNT;
4447 int idx = nid - EFFECT_START_NID;
4449 if ((idx < 0) || (idx >= num_fx))
4450 return 0; /* no changed */
4452 /* for out effect, qualify with PE */
4453 if ((nid >= OUT_EFFECT_START_NID) && (nid < OUT_EFFECT_END_NID)) {
4454 /* if PE if off, turn off out effects. */
4455 if (!spec->effects_switch[PLAY_ENHANCEMENT - EFFECT_START_NID])
4459 /* for in effect, qualify with CrystalVoice */
4460 if ((nid >= IN_EFFECT_START_NID) && (nid < IN_EFFECT_END_NID)) {
4461 /* if CrystalVoice if off, turn off in effects. */
4462 if (!spec->effects_switch[CRYSTAL_VOICE - EFFECT_START_NID])
4465 /* Voice Focus applies to 2-ch Mic, Digital Mic */
4466 if ((nid == VOICE_FOCUS) && (spec->cur_mic_type != DIGITAL_MIC))
4469 /* If Voice Focus on SBZ, set to two channel. */
4470 if ((nid == VOICE_FOCUS) && (spec->quirk == QUIRK_SBZ)
4471 && (spec->cur_mic_type != REAR_LINE_IN)) {
4472 if (spec->effects_switch[CRYSTAL_VOICE -
4473 EFFECT_START_NID]) {
4475 if (spec->effects_switch[VOICE_FOCUS -
4476 EFFECT_START_NID]) {
4482 dspio_set_uint_param(codec, 0x80, 0x00, tmp);
4486 * For SBZ noise reduction, there's an extra command
4487 * to module ID 0x47. No clue why.
4489 if ((nid == NOISE_REDUCTION) && (spec->quirk == QUIRK_SBZ)
4490 && (spec->cur_mic_type != REAR_LINE_IN)) {
4491 if (spec->effects_switch[CRYSTAL_VOICE -
4492 EFFECT_START_NID]) {
4493 if (spec->effects_switch[NOISE_REDUCTION -
4501 dspio_set_uint_param(codec, 0x47, 0x00, tmp);
4504 /* If rear line in disable effects. */
4505 if (spec->use_alt_functions &&
4506 spec->in_enum_val == REAR_LINE_IN)
4510 codec_dbg(codec, "ca0132_effect_set: nid=0x%x, val=%ld\n",
4513 on = (val == 0) ? FLOAT_ZERO : FLOAT_ONE;
4514 err = dspio_set_uint_param(codec, ca0132_effects[idx].mid,
4515 ca0132_effects[idx].reqs[0], on);
4518 return 0; /* no changed */
4524 * Turn on/off Playback Enhancements
4526 static int ca0132_pe_switch_set(struct hda_codec *codec)
4528 struct ca0132_spec *spec = codec->spec;
4532 codec_dbg(codec, "ca0132_pe_switch_set: val=%ld\n",
4533 spec->effects_switch[PLAY_ENHANCEMENT - EFFECT_START_NID]);
4535 if (spec->use_alt_functions)
4536 ca0132_alt_select_out(codec);
4538 i = OUT_EFFECT_START_NID - EFFECT_START_NID;
4539 nid = OUT_EFFECT_START_NID;
4540 /* PE affects all out effects */
4541 for (; nid < OUT_EFFECT_END_NID; nid++, i++)
4542 ret |= ca0132_effects_set(codec, nid, spec->effects_switch[i]);
4547 /* Check if Mic1 is streaming, if so, stop streaming */
4548 static int stop_mic1(struct hda_codec *codec)
4550 struct ca0132_spec *spec = codec->spec;
4551 unsigned int oldval = snd_hda_codec_read(codec, spec->adcs[0], 0,
4552 AC_VERB_GET_CONV, 0);
4554 snd_hda_codec_write(codec, spec->adcs[0], 0,
4555 AC_VERB_SET_CHANNEL_STREAMID,
4560 /* Resume Mic1 streaming if it was stopped. */
4561 static void resume_mic1(struct hda_codec *codec, unsigned int oldval)
4563 struct ca0132_spec *spec = codec->spec;
4564 /* Restore the previous stream and channel */
4566 snd_hda_codec_write(codec, spec->adcs[0], 0,
4567 AC_VERB_SET_CHANNEL_STREAMID,
4572 * Turn on/off CrystalVoice
4574 static int ca0132_cvoice_switch_set(struct hda_codec *codec)
4576 struct ca0132_spec *spec = codec->spec;
4579 unsigned int oldval;
4581 codec_dbg(codec, "ca0132_cvoice_switch_set: val=%ld\n",
4582 spec->effects_switch[CRYSTAL_VOICE - EFFECT_START_NID]);
4584 i = IN_EFFECT_START_NID - EFFECT_START_NID;
4585 nid = IN_EFFECT_START_NID;
4586 /* CrystalVoice affects all in effects */
4587 for (; nid < IN_EFFECT_END_NID; nid++, i++)
4588 ret |= ca0132_effects_set(codec, nid, spec->effects_switch[i]);
4590 /* including VoiceFX */
4591 ret |= ca0132_voicefx_set(codec, (spec->voicefx_val ? 1 : 0));
4593 /* set correct vipsource */
4594 oldval = stop_mic1(codec);
4595 if (spec->use_alt_functions)
4596 ret |= ca0132_alt_set_vipsource(codec, 1);
4598 ret |= ca0132_set_vipsource(codec, 1);
4599 resume_mic1(codec, oldval);
4603 static int ca0132_mic_boost_set(struct hda_codec *codec, long val)
4605 struct ca0132_spec *spec = codec->spec;
4609 ret = snd_hda_codec_amp_update(codec, spec->input_pins[0], 0,
4610 HDA_INPUT, 0, HDA_AMP_VOLMASK, 3);
4612 ret = snd_hda_codec_amp_update(codec, spec->input_pins[0], 0,
4613 HDA_INPUT, 0, HDA_AMP_VOLMASK, 0);
4618 static int ca0132_alt_mic_boost_set(struct hda_codec *codec, long val)
4620 struct ca0132_spec *spec = codec->spec;
4623 ret = snd_hda_codec_amp_update(codec, spec->input_pins[0], 0,
4624 HDA_INPUT, 0, HDA_AMP_VOLMASK, val);
4628 static int ca0132_vnode_switch_set(struct snd_kcontrol *kcontrol,
4629 struct snd_ctl_elem_value *ucontrol)
4631 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
4632 hda_nid_t nid = get_amp_nid(kcontrol);
4633 hda_nid_t shared_nid = 0;
4636 struct ca0132_spec *spec = codec->spec;
4639 if (nid == VNID_HP_SEL) {
4641 spec->vnode_lswitch[VNID_HP_ASEL - VNODE_START_NID];
4643 if (spec->use_alt_functions)
4644 ca0132_alt_select_out(codec);
4646 ca0132_select_out(codec);
4651 if (nid == VNID_AMIC1_SEL) {
4653 spec->vnode_lswitch[VNID_AMIC1_ASEL - VNODE_START_NID];
4655 ca0132_select_mic(codec);
4659 if (nid == VNID_HP_ASEL) {
4660 if (spec->use_alt_functions)
4661 ca0132_alt_select_out(codec);
4663 ca0132_select_out(codec);
4667 if (nid == VNID_AMIC1_ASEL) {
4668 ca0132_select_mic(codec);
4672 /* if effective conditions, then update hw immediately. */
4673 effective = ca0132_is_vnode_effective(codec, nid, &shared_nid);
4675 int dir = get_amp_direction(kcontrol);
4676 int ch = get_amp_channels(kcontrol);
4679 mutex_lock(&codec->control_mutex);
4680 pval = kcontrol->private_value;
4681 kcontrol->private_value = HDA_COMPOSE_AMP_VAL(shared_nid, ch,
4683 ret = snd_hda_mixer_amp_switch_put(kcontrol, ucontrol);
4684 kcontrol->private_value = pval;
4685 mutex_unlock(&codec->control_mutex);
4690 /* End of control change helpers. */
4692 * Below I've added controls to mess with the effect levels, I've only enabled
4693 * them on the Sound Blaster Z, but they would probably also work on the
4694 * Chromebook. I figured they were probably tuned specifically for it, and left
4698 /* Sets DSP effect level from the sliders above the controls */
4699 static int ca0132_alt_slider_ctl_set(struct hda_codec *codec, hda_nid_t nid,
4700 const unsigned int *lookup, int idx)
4705 * For X_BASS, req 2 is actually crossover freq instead of
4713 snd_hda_power_up(codec);
4714 if (nid == XBASS_XOVER) {
4715 for (i = 0; i < OUT_EFFECTS_COUNT; i++)
4716 if (ca0132_effects[i].nid == X_BASS)
4719 dspio_set_param(codec, ca0132_effects[i].mid, 0x20,
4720 ca0132_effects[i].reqs[1],
4721 &(lookup[idx - 1]), sizeof(unsigned int));
4723 /* Find the actual effect structure */
4724 for (i = 0; i < OUT_EFFECTS_COUNT; i++)
4725 if (nid == ca0132_effects[i].nid)
4728 dspio_set_param(codec, ca0132_effects[i].mid, 0x20,
4729 ca0132_effects[i].reqs[y],
4730 &(lookup[idx]), sizeof(unsigned int));
4733 snd_hda_power_down(codec);
4738 static int ca0132_alt_xbass_xover_slider_ctl_get(struct snd_kcontrol *kcontrol,
4739 struct snd_ctl_elem_value *ucontrol)
4741 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
4742 struct ca0132_spec *spec = codec->spec;
4743 long *valp = ucontrol->value.integer.value;
4745 *valp = spec->xbass_xover_freq;
4749 static int ca0132_alt_slider_ctl_get(struct snd_kcontrol *kcontrol,
4750 struct snd_ctl_elem_value *ucontrol)
4752 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
4753 struct ca0132_spec *spec = codec->spec;
4754 hda_nid_t nid = get_amp_nid(kcontrol);
4755 long *valp = ucontrol->value.integer.value;
4756 int idx = nid - OUT_EFFECT_START_NID;
4758 *valp = spec->fx_ctl_val[idx];
4763 * The X-bass crossover starts at 10hz, so the min is 1. The
4764 * frequency is set in multiples of 10.
4766 static int ca0132_alt_xbass_xover_slider_info(struct snd_kcontrol *kcontrol,
4767 struct snd_ctl_elem_info *uinfo)
4769 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
4771 uinfo->value.integer.min = 1;
4772 uinfo->value.integer.max = 100;
4773 uinfo->value.integer.step = 1;
4778 static int ca0132_alt_effect_slider_info(struct snd_kcontrol *kcontrol,
4779 struct snd_ctl_elem_info *uinfo)
4781 int chs = get_amp_channels(kcontrol);
4783 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
4784 uinfo->count = chs == 3 ? 2 : 1;
4785 uinfo->value.integer.min = 0;
4786 uinfo->value.integer.max = 100;
4787 uinfo->value.integer.step = 1;
4792 static int ca0132_alt_xbass_xover_slider_put(struct snd_kcontrol *kcontrol,
4793 struct snd_ctl_elem_value *ucontrol)
4795 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
4796 struct ca0132_spec *spec = codec->spec;
4797 hda_nid_t nid = get_amp_nid(kcontrol);
4798 long *valp = ucontrol->value.integer.value;
4802 if (spec->xbass_xover_freq == *valp)
4805 spec->xbass_xover_freq = *valp;
4808 ca0132_alt_slider_ctl_set(codec, nid, float_xbass_xover_lookup, idx);
4813 static int ca0132_alt_effect_slider_put(struct snd_kcontrol *kcontrol,
4814 struct snd_ctl_elem_value *ucontrol)
4816 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
4817 struct ca0132_spec *spec = codec->spec;
4818 hda_nid_t nid = get_amp_nid(kcontrol);
4819 long *valp = ucontrol->value.integer.value;
4822 idx = nid - EFFECT_START_NID;
4824 if (spec->fx_ctl_val[idx] == *valp)
4827 spec->fx_ctl_val[idx] = *valp;
4830 ca0132_alt_slider_ctl_set(codec, nid, float_zero_to_one_lookup, idx);
4837 * Mic Boost Enum for alternative ca0132 codecs. I didn't like that the original
4838 * only has off or full 30 dB, and didn't like making a volume slider that has
4839 * traditional 0-100 in alsamixer that goes in big steps. I like enum better.
4841 #define MIC_BOOST_NUM_OF_STEPS 4
4842 #define MIC_BOOST_ENUM_MAX_STRLEN 10
4844 static int ca0132_alt_mic_boost_info(struct snd_kcontrol *kcontrol,
4845 struct snd_ctl_elem_info *uinfo)
4848 char namestr[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
4850 uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
4852 uinfo->value.enumerated.items = MIC_BOOST_NUM_OF_STEPS;
4853 if (uinfo->value.enumerated.item >= MIC_BOOST_NUM_OF_STEPS)
4854 uinfo->value.enumerated.item = MIC_BOOST_NUM_OF_STEPS - 1;
4855 sprintf(namestr, "%d %s", (uinfo->value.enumerated.item * 10), sfx);
4856 strcpy(uinfo->value.enumerated.name, namestr);
4860 static int ca0132_alt_mic_boost_get(struct snd_kcontrol *kcontrol,
4861 struct snd_ctl_elem_value *ucontrol)
4863 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
4864 struct ca0132_spec *spec = codec->spec;
4866 ucontrol->value.enumerated.item[0] = spec->mic_boost_enum_val;
4870 static int ca0132_alt_mic_boost_put(struct snd_kcontrol *kcontrol,
4871 struct snd_ctl_elem_value *ucontrol)
4873 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
4874 struct ca0132_spec *spec = codec->spec;
4875 int sel = ucontrol->value.enumerated.item[0];
4876 unsigned int items = MIC_BOOST_NUM_OF_STEPS;
4881 codec_dbg(codec, "ca0132_alt_mic_boost: boost=%d\n",
4884 spec->mic_boost_enum_val = sel;
4886 if (spec->in_enum_val != REAR_LINE_IN)
4887 ca0132_alt_mic_boost_set(codec, spec->mic_boost_enum_val);
4894 * Input Select Control for alternative ca0132 codecs. This exists because
4895 * front microphone has no auto-detect, and we need a way to set the rear
4898 static int ca0132_alt_input_source_info(struct snd_kcontrol *kcontrol,
4899 struct snd_ctl_elem_info *uinfo)
4901 uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
4903 uinfo->value.enumerated.items = IN_SRC_NUM_OF_INPUTS;
4904 if (uinfo->value.enumerated.item >= IN_SRC_NUM_OF_INPUTS)
4905 uinfo->value.enumerated.item = IN_SRC_NUM_OF_INPUTS - 1;
4906 strcpy(uinfo->value.enumerated.name,
4907 in_src_str[uinfo->value.enumerated.item]);
4911 static int ca0132_alt_input_source_get(struct snd_kcontrol *kcontrol,
4912 struct snd_ctl_elem_value *ucontrol)
4914 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
4915 struct ca0132_spec *spec = codec->spec;
4917 ucontrol->value.enumerated.item[0] = spec->in_enum_val;
4921 static int ca0132_alt_input_source_put(struct snd_kcontrol *kcontrol,
4922 struct snd_ctl_elem_value *ucontrol)
4924 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
4925 struct ca0132_spec *spec = codec->spec;
4926 int sel = ucontrol->value.enumerated.item[0];
4927 unsigned int items = IN_SRC_NUM_OF_INPUTS;
4932 codec_dbg(codec, "ca0132_alt_input_select: sel=%d, preset=%s\n",
4933 sel, in_src_str[sel]);
4935 spec->in_enum_val = sel;
4937 ca0132_alt_select_in(codec);
4942 /* Sound Blaster Z Output Select Control */
4943 static int ca0132_alt_output_select_get_info(struct snd_kcontrol *kcontrol,
4944 struct snd_ctl_elem_info *uinfo)
4946 uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
4948 uinfo->value.enumerated.items = NUM_OF_OUTPUTS;
4949 if (uinfo->value.enumerated.item >= NUM_OF_OUTPUTS)
4950 uinfo->value.enumerated.item = NUM_OF_OUTPUTS - 1;
4951 strcpy(uinfo->value.enumerated.name,
4952 alt_out_presets[uinfo->value.enumerated.item].name);
4956 static int ca0132_alt_output_select_get(struct snd_kcontrol *kcontrol,
4957 struct snd_ctl_elem_value *ucontrol)
4959 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
4960 struct ca0132_spec *spec = codec->spec;
4962 ucontrol->value.enumerated.item[0] = spec->out_enum_val;
4966 static int ca0132_alt_output_select_put(struct snd_kcontrol *kcontrol,
4967 struct snd_ctl_elem_value *ucontrol)
4969 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
4970 struct ca0132_spec *spec = codec->spec;
4971 int sel = ucontrol->value.enumerated.item[0];
4972 unsigned int items = NUM_OF_OUTPUTS;
4973 unsigned int auto_jack;
4978 codec_dbg(codec, "ca0132_alt_output_select: sel=%d, preset=%s\n",
4979 sel, alt_out_presets[sel].name);
4981 spec->out_enum_val = sel;
4983 auto_jack = spec->vnode_lswitch[VNID_HP_ASEL - VNODE_START_NID];
4986 ca0132_alt_select_out(codec);
4992 * Smart Volume output setting control. Three different settings, Normal,
4993 * which takes the value from the smart volume slider. The two others, loud
4994 * and night, disregard the slider value and have uneditable values.
4996 #define NUM_OF_SVM_SETTINGS 3
4997 static const char *const out_svm_set_enum_str[3] = {"Normal", "Loud", "Night" };
4999 static int ca0132_alt_svm_setting_info(struct snd_kcontrol *kcontrol,
5000 struct snd_ctl_elem_info *uinfo)
5002 uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
5004 uinfo->value.enumerated.items = NUM_OF_SVM_SETTINGS;
5005 if (uinfo->value.enumerated.item >= NUM_OF_SVM_SETTINGS)
5006 uinfo->value.enumerated.item = NUM_OF_SVM_SETTINGS - 1;
5007 strcpy(uinfo->value.enumerated.name,
5008 out_svm_set_enum_str[uinfo->value.enumerated.item]);
5012 static int ca0132_alt_svm_setting_get(struct snd_kcontrol *kcontrol,
5013 struct snd_ctl_elem_value *ucontrol)
5015 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
5016 struct ca0132_spec *spec = codec->spec;
5018 ucontrol->value.enumerated.item[0] = spec->smart_volume_setting;
5022 static int ca0132_alt_svm_setting_put(struct snd_kcontrol *kcontrol,
5023 struct snd_ctl_elem_value *ucontrol)
5025 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
5026 struct ca0132_spec *spec = codec->spec;
5027 int sel = ucontrol->value.enumerated.item[0];
5028 unsigned int items = NUM_OF_SVM_SETTINGS;
5029 unsigned int idx = SMART_VOLUME - EFFECT_START_NID;
5035 codec_dbg(codec, "ca0132_alt_svm_setting: sel=%d, preset=%s\n",
5036 sel, out_svm_set_enum_str[sel]);
5038 spec->smart_volume_setting = sel;
5054 /* Req 2 is the Smart Volume Setting req. */
5055 dspio_set_uint_param(codec, ca0132_effects[idx].mid,
5056 ca0132_effects[idx].reqs[2], tmp);
5060 /* Sound Blaster Z EQ preset controls */
5061 static int ca0132_alt_eq_preset_info(struct snd_kcontrol *kcontrol,
5062 struct snd_ctl_elem_info *uinfo)
5064 unsigned int items = ARRAY_SIZE(ca0132_alt_eq_presets);
5066 uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
5068 uinfo->value.enumerated.items = items;
5069 if (uinfo->value.enumerated.item >= items)
5070 uinfo->value.enumerated.item = items - 1;
5071 strcpy(uinfo->value.enumerated.name,
5072 ca0132_alt_eq_presets[uinfo->value.enumerated.item].name);
5076 static int ca0132_alt_eq_preset_get(struct snd_kcontrol *kcontrol,
5077 struct snd_ctl_elem_value *ucontrol)
5079 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
5080 struct ca0132_spec *spec = codec->spec;
5082 ucontrol->value.enumerated.item[0] = spec->eq_preset_val;
5086 static int ca0132_alt_eq_preset_put(struct snd_kcontrol *kcontrol,
5087 struct snd_ctl_elem_value *ucontrol)
5089 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
5090 struct ca0132_spec *spec = codec->spec;
5092 int sel = ucontrol->value.enumerated.item[0];
5093 unsigned int items = ARRAY_SIZE(ca0132_alt_eq_presets);
5098 codec_dbg(codec, "%s: sel=%d, preset=%s\n", __func__, sel,
5099 ca0132_alt_eq_presets[sel].name);
5102 * Default needs to qualify with CrystalVoice state.
5104 for (i = 0; i < EQ_PRESET_MAX_PARAM_COUNT; i++) {
5105 err = dspio_set_uint_param(codec, ca0132_alt_eq_enum.mid,
5106 ca0132_alt_eq_enum.reqs[i],
5107 ca0132_alt_eq_presets[sel].vals[i]);
5113 spec->eq_preset_val = sel;
5118 static int ca0132_voicefx_info(struct snd_kcontrol *kcontrol,
5119 struct snd_ctl_elem_info *uinfo)
5121 unsigned int items = ARRAY_SIZE(ca0132_voicefx_presets);
5123 uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
5125 uinfo->value.enumerated.items = items;
5126 if (uinfo->value.enumerated.item >= items)
5127 uinfo->value.enumerated.item = items - 1;
5128 strcpy(uinfo->value.enumerated.name,
5129 ca0132_voicefx_presets[uinfo->value.enumerated.item].name);
5133 static int ca0132_voicefx_get(struct snd_kcontrol *kcontrol,
5134 struct snd_ctl_elem_value *ucontrol)
5136 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
5137 struct ca0132_spec *spec = codec->spec;
5139 ucontrol->value.enumerated.item[0] = spec->voicefx_val;
5143 static int ca0132_voicefx_put(struct snd_kcontrol *kcontrol,
5144 struct snd_ctl_elem_value *ucontrol)
5146 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
5147 struct ca0132_spec *spec = codec->spec;
5149 int sel = ucontrol->value.enumerated.item[0];
5151 if (sel >= ARRAY_SIZE(ca0132_voicefx_presets))
5154 codec_dbg(codec, "ca0132_voicefx_put: sel=%d, preset=%s\n",
5155 sel, ca0132_voicefx_presets[sel].name);
5159 * Default needs to qualify with CrystalVoice state.
5161 for (i = 0; i < VOICEFX_MAX_PARAM_COUNT; i++) {
5162 err = dspio_set_uint_param(codec, ca0132_voicefx.mid,
5163 ca0132_voicefx.reqs[i],
5164 ca0132_voicefx_presets[sel].vals[i]);
5170 spec->voicefx_val = sel;
5171 /* enable voice fx */
5172 ca0132_voicefx_set(codec, (sel ? 1 : 0));
5178 static int ca0132_switch_get(struct snd_kcontrol *kcontrol,
5179 struct snd_ctl_elem_value *ucontrol)
5181 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
5182 struct ca0132_spec *spec = codec->spec;
5183 hda_nid_t nid = get_amp_nid(kcontrol);
5184 int ch = get_amp_channels(kcontrol);
5185 long *valp = ucontrol->value.integer.value;
5188 if ((nid >= VNODE_START_NID) && (nid < VNODE_END_NID)) {
5190 *valp = spec->vnode_lswitch[nid - VNODE_START_NID];
5194 *valp = spec->vnode_rswitch[nid - VNODE_START_NID];
5200 /* effects, include PE and CrystalVoice */
5201 if ((nid >= EFFECT_START_NID) && (nid < EFFECT_END_NID)) {
5202 *valp = spec->effects_switch[nid - EFFECT_START_NID];
5207 if (nid == spec->input_pins[0]) {
5208 *valp = spec->cur_mic_boost;
5215 static int ca0132_switch_put(struct snd_kcontrol *kcontrol,
5216 struct snd_ctl_elem_value *ucontrol)
5218 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
5219 struct ca0132_spec *spec = codec->spec;
5220 hda_nid_t nid = get_amp_nid(kcontrol);
5221 int ch = get_amp_channels(kcontrol);
5222 long *valp = ucontrol->value.integer.value;
5225 codec_dbg(codec, "ca0132_switch_put: nid=0x%x, val=%ld\n",
5228 snd_hda_power_up(codec);
5230 if ((nid >= VNODE_START_NID) && (nid < VNODE_END_NID)) {
5232 spec->vnode_lswitch[nid - VNODE_START_NID] = *valp;
5236 spec->vnode_rswitch[nid - VNODE_START_NID] = *valp;
5239 changed = ca0132_vnode_switch_set(kcontrol, ucontrol);
5244 if (nid == PLAY_ENHANCEMENT) {
5245 spec->effects_switch[nid - EFFECT_START_NID] = *valp;
5246 changed = ca0132_pe_switch_set(codec);
5251 if (nid == CRYSTAL_VOICE) {
5252 spec->effects_switch[nid - EFFECT_START_NID] = *valp;
5253 changed = ca0132_cvoice_switch_set(codec);
5257 /* out and in effects */
5258 if (((nid >= OUT_EFFECT_START_NID) && (nid < OUT_EFFECT_END_NID)) ||
5259 ((nid >= IN_EFFECT_START_NID) && (nid < IN_EFFECT_END_NID))) {
5260 spec->effects_switch[nid - EFFECT_START_NID] = *valp;
5261 changed = ca0132_effects_set(codec, nid, *valp);
5266 if (nid == spec->input_pins[0]) {
5267 spec->cur_mic_boost = *valp;
5268 if (spec->use_alt_functions) {
5269 if (spec->in_enum_val != REAR_LINE_IN)
5270 changed = ca0132_mic_boost_set(codec, *valp);
5272 /* Mic boost does not apply to Digital Mic */
5273 if (spec->cur_mic_type != DIGITAL_MIC)
5274 changed = ca0132_mic_boost_set(codec, *valp);
5281 snd_hda_power_down(codec);
5289 * Sets the internal DSP decibel level to match the DAC for output, and the
5290 * ADC for input. Currently only the SBZ sets dsp capture volume level, and
5291 * all alternative codecs set DSP playback volume.
5293 static void ca0132_alt_dsp_volume_put(struct hda_codec *codec, hda_nid_t nid)
5295 struct ca0132_spec *spec = codec->spec;
5296 unsigned int dsp_dir;
5297 unsigned int lookup_val;
5299 if (nid == VNID_SPK)
5300 dsp_dir = DSP_VOL_OUT;
5302 dsp_dir = DSP_VOL_IN;
5304 lookup_val = spec->vnode_lvol[nid - VNODE_START_NID];
5306 dspio_set_uint_param(codec,
5307 ca0132_alt_vol_ctls[dsp_dir].mid,
5308 ca0132_alt_vol_ctls[dsp_dir].reqs[0],
5309 float_vol_db_lookup[lookup_val]);
5311 lookup_val = spec->vnode_rvol[nid - VNODE_START_NID];
5313 dspio_set_uint_param(codec,
5314 ca0132_alt_vol_ctls[dsp_dir].mid,
5315 ca0132_alt_vol_ctls[dsp_dir].reqs[1],
5316 float_vol_db_lookup[lookup_val]);
5318 dspio_set_uint_param(codec,
5319 ca0132_alt_vol_ctls[dsp_dir].mid,
5320 ca0132_alt_vol_ctls[dsp_dir].reqs[2], FLOAT_ZERO);
5323 static int ca0132_volume_info(struct snd_kcontrol *kcontrol,
5324 struct snd_ctl_elem_info *uinfo)
5326 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
5327 struct ca0132_spec *spec = codec->spec;
5328 hda_nid_t nid = get_amp_nid(kcontrol);
5329 int ch = get_amp_channels(kcontrol);
5330 int dir = get_amp_direction(kcontrol);
5336 /* follow shared_out info */
5337 nid = spec->shared_out_nid;
5338 mutex_lock(&codec->control_mutex);
5339 pval = kcontrol->private_value;
5340 kcontrol->private_value = HDA_COMPOSE_AMP_VAL(nid, ch, 0, dir);
5341 err = snd_hda_mixer_amp_volume_info(kcontrol, uinfo);
5342 kcontrol->private_value = pval;
5343 mutex_unlock(&codec->control_mutex);
5346 /* follow shared_mic info */
5347 nid = spec->shared_mic_nid;
5348 mutex_lock(&codec->control_mutex);
5349 pval = kcontrol->private_value;
5350 kcontrol->private_value = HDA_COMPOSE_AMP_VAL(nid, ch, 0, dir);
5351 err = snd_hda_mixer_amp_volume_info(kcontrol, uinfo);
5352 kcontrol->private_value = pval;
5353 mutex_unlock(&codec->control_mutex);
5356 err = snd_hda_mixer_amp_volume_info(kcontrol, uinfo);
5361 static int ca0132_volume_get(struct snd_kcontrol *kcontrol,
5362 struct snd_ctl_elem_value *ucontrol)
5364 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
5365 struct ca0132_spec *spec = codec->spec;
5366 hda_nid_t nid = get_amp_nid(kcontrol);
5367 int ch = get_amp_channels(kcontrol);
5368 long *valp = ucontrol->value.integer.value;
5370 /* store the left and right volume */
5372 *valp = spec->vnode_lvol[nid - VNODE_START_NID];
5376 *valp = spec->vnode_rvol[nid - VNODE_START_NID];
5382 static int ca0132_volume_put(struct snd_kcontrol *kcontrol,
5383 struct snd_ctl_elem_value *ucontrol)
5385 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
5386 struct ca0132_spec *spec = codec->spec;
5387 hda_nid_t nid = get_amp_nid(kcontrol);
5388 int ch = get_amp_channels(kcontrol);
5389 long *valp = ucontrol->value.integer.value;
5390 hda_nid_t shared_nid = 0;
5394 /* store the left and right volume */
5396 spec->vnode_lvol[nid - VNODE_START_NID] = *valp;
5400 spec->vnode_rvol[nid - VNODE_START_NID] = *valp;
5404 /* if effective conditions, then update hw immediately. */
5405 effective = ca0132_is_vnode_effective(codec, nid, &shared_nid);
5407 int dir = get_amp_direction(kcontrol);
5410 snd_hda_power_up(codec);
5411 mutex_lock(&codec->control_mutex);
5412 pval = kcontrol->private_value;
5413 kcontrol->private_value = HDA_COMPOSE_AMP_VAL(shared_nid, ch,
5415 changed = snd_hda_mixer_amp_volume_put(kcontrol, ucontrol);
5416 kcontrol->private_value = pval;
5417 mutex_unlock(&codec->control_mutex);
5418 snd_hda_power_down(codec);
5425 * This function is the same as the one above, because using an if statement
5426 * inside of the above volume control for the DSP volume would cause too much
5427 * lag. This is a lot more smooth.
5429 static int ca0132_alt_volume_put(struct snd_kcontrol *kcontrol,
5430 struct snd_ctl_elem_value *ucontrol)
5432 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
5433 struct ca0132_spec *spec = codec->spec;
5434 hda_nid_t nid = get_amp_nid(kcontrol);
5435 int ch = get_amp_channels(kcontrol);
5436 long *valp = ucontrol->value.integer.value;
5449 /* store the left and right volume */
5451 spec->vnode_lvol[vnid - VNODE_START_NID] = *valp;
5455 spec->vnode_rvol[vnid - VNODE_START_NID] = *valp;
5459 snd_hda_power_up(codec);
5460 ca0132_alt_dsp_volume_put(codec, vnid);
5461 mutex_lock(&codec->control_mutex);
5462 changed = snd_hda_mixer_amp_volume_put(kcontrol, ucontrol);
5463 mutex_unlock(&codec->control_mutex);
5464 snd_hda_power_down(codec);
5469 static int ca0132_volume_tlv(struct snd_kcontrol *kcontrol, int op_flag,
5470 unsigned int size, unsigned int __user *tlv)
5472 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
5473 struct ca0132_spec *spec = codec->spec;
5474 hda_nid_t nid = get_amp_nid(kcontrol);
5475 int ch = get_amp_channels(kcontrol);
5476 int dir = get_amp_direction(kcontrol);
5482 /* follow shared_out tlv */
5483 nid = spec->shared_out_nid;
5484 mutex_lock(&codec->control_mutex);
5485 pval = kcontrol->private_value;
5486 kcontrol->private_value = HDA_COMPOSE_AMP_VAL(nid, ch, 0, dir);
5487 err = snd_hda_mixer_amp_tlv(kcontrol, op_flag, size, tlv);
5488 kcontrol->private_value = pval;
5489 mutex_unlock(&codec->control_mutex);
5492 /* follow shared_mic tlv */
5493 nid = spec->shared_mic_nid;
5494 mutex_lock(&codec->control_mutex);
5495 pval = kcontrol->private_value;
5496 kcontrol->private_value = HDA_COMPOSE_AMP_VAL(nid, ch, 0, dir);
5497 err = snd_hda_mixer_amp_tlv(kcontrol, op_flag, size, tlv);
5498 kcontrol->private_value = pval;
5499 mutex_unlock(&codec->control_mutex);
5502 err = snd_hda_mixer_amp_tlv(kcontrol, op_flag, size, tlv);
5507 /* Add volume slider control for effect level */
5508 static int ca0132_alt_add_effect_slider(struct hda_codec *codec, hda_nid_t nid,
5509 const char *pfx, int dir)
5511 char namestr[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
5512 int type = dir ? HDA_INPUT : HDA_OUTPUT;
5513 struct snd_kcontrol_new knew =
5514 HDA_CODEC_VOLUME_MONO(namestr, nid, 1, 0, type);
5516 sprintf(namestr, "FX: %s %s Volume", pfx, dirstr[dir]);
5523 knew.info = ca0132_alt_xbass_xover_slider_info;
5524 knew.get = ca0132_alt_xbass_xover_slider_ctl_get;
5525 knew.put = ca0132_alt_xbass_xover_slider_put;
5528 knew.info = ca0132_alt_effect_slider_info;
5529 knew.get = ca0132_alt_slider_ctl_get;
5530 knew.put = ca0132_alt_effect_slider_put;
5531 knew.private_value =
5532 HDA_COMPOSE_AMP_VAL(nid, 1, 0, type);
5536 return snd_hda_ctl_add(codec, nid, snd_ctl_new1(&knew, codec));
5540 * Added FX: prefix for the alternative codecs, because otherwise the surround
5541 * effect would conflict with the Surround sound volume control. Also seems more
5542 * clear as to what the switches do. Left alone for others.
5544 static int add_fx_switch(struct hda_codec *codec, hda_nid_t nid,
5545 const char *pfx, int dir)
5547 struct ca0132_spec *spec = codec->spec;
5548 char namestr[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
5549 int type = dir ? HDA_INPUT : HDA_OUTPUT;
5550 struct snd_kcontrol_new knew =
5551 CA0132_CODEC_MUTE_MONO(namestr, nid, 1, type);
5552 /* If using alt_controls, add FX: prefix. But, don't add FX:
5553 * prefix to OutFX or InFX enable controls.
5555 if ((spec->use_alt_controls) && (nid <= IN_EFFECT_END_NID))
5556 sprintf(namestr, "FX: %s %s Switch", pfx, dirstr[dir]);
5558 sprintf(namestr, "%s %s Switch", pfx, dirstr[dir]);
5560 return snd_hda_ctl_add(codec, nid, snd_ctl_new1(&knew, codec));
5563 static int add_voicefx(struct hda_codec *codec)
5565 struct snd_kcontrol_new knew =
5566 HDA_CODEC_MUTE_MONO(ca0132_voicefx.name,
5567 VOICEFX, 1, 0, HDA_INPUT);
5568 knew.info = ca0132_voicefx_info;
5569 knew.get = ca0132_voicefx_get;
5570 knew.put = ca0132_voicefx_put;
5571 return snd_hda_ctl_add(codec, VOICEFX, snd_ctl_new1(&knew, codec));
5574 /* Create the EQ Preset control */
5575 static int add_ca0132_alt_eq_presets(struct hda_codec *codec)
5577 struct snd_kcontrol_new knew =
5578 HDA_CODEC_MUTE_MONO(ca0132_alt_eq_enum.name,
5579 EQ_PRESET_ENUM, 1, 0, HDA_OUTPUT);
5580 knew.info = ca0132_alt_eq_preset_info;
5581 knew.get = ca0132_alt_eq_preset_get;
5582 knew.put = ca0132_alt_eq_preset_put;
5583 return snd_hda_ctl_add(codec, EQ_PRESET_ENUM,
5584 snd_ctl_new1(&knew, codec));
5588 * Add enumerated control for the three different settings of the smart volume
5589 * output effect. Normal just uses the slider value, and loud and night are
5590 * their own things that ignore that value.
5592 static int ca0132_alt_add_svm_enum(struct hda_codec *codec)
5594 struct snd_kcontrol_new knew =
5595 HDA_CODEC_MUTE_MONO("FX: Smart Volume Setting",
5596 SMART_VOLUME_ENUM, 1, 0, HDA_OUTPUT);
5597 knew.info = ca0132_alt_svm_setting_info;
5598 knew.get = ca0132_alt_svm_setting_get;
5599 knew.put = ca0132_alt_svm_setting_put;
5600 return snd_hda_ctl_add(codec, SMART_VOLUME_ENUM,
5601 snd_ctl_new1(&knew, codec));
5606 * Create an Output Select enumerated control for codecs with surround
5609 static int ca0132_alt_add_output_enum(struct hda_codec *codec)
5611 struct snd_kcontrol_new knew =
5612 HDA_CODEC_MUTE_MONO("Output Select",
5613 OUTPUT_SOURCE_ENUM, 1, 0, HDA_OUTPUT);
5614 knew.info = ca0132_alt_output_select_get_info;
5615 knew.get = ca0132_alt_output_select_get;
5616 knew.put = ca0132_alt_output_select_put;
5617 return snd_hda_ctl_add(codec, OUTPUT_SOURCE_ENUM,
5618 snd_ctl_new1(&knew, codec));
5622 * Create an Input Source enumerated control for the alternate ca0132 codecs
5623 * because the front microphone has no auto-detect, and Line-in has to be set
5626 static int ca0132_alt_add_input_enum(struct hda_codec *codec)
5628 struct snd_kcontrol_new knew =
5629 HDA_CODEC_MUTE_MONO("Input Source",
5630 INPUT_SOURCE_ENUM, 1, 0, HDA_INPUT);
5631 knew.info = ca0132_alt_input_source_info;
5632 knew.get = ca0132_alt_input_source_get;
5633 knew.put = ca0132_alt_input_source_put;
5634 return snd_hda_ctl_add(codec, INPUT_SOURCE_ENUM,
5635 snd_ctl_new1(&knew, codec));
5639 * Add mic boost enumerated control. Switches through 0dB to 30dB. This adds
5640 * more control than the original mic boost, which is either full 30dB or off.
5642 static int ca0132_alt_add_mic_boost_enum(struct hda_codec *codec)
5644 struct snd_kcontrol_new knew =
5645 HDA_CODEC_MUTE_MONO("Mic Boost Capture Switch",
5646 MIC_BOOST_ENUM, 1, 0, HDA_INPUT);
5647 knew.info = ca0132_alt_mic_boost_info;
5648 knew.get = ca0132_alt_mic_boost_get;
5649 knew.put = ca0132_alt_mic_boost_put;
5650 return snd_hda_ctl_add(codec, MIC_BOOST_ENUM,
5651 snd_ctl_new1(&knew, codec));
5656 * Need to create slave controls for the alternate codecs that have surround
5659 static const char * const ca0132_alt_slave_pfxs[] = {
5660 "Front", "Surround", "Center", "LFE", NULL,
5664 * Also need special channel map, because the default one is incorrect.
5665 * I think this has to do with the pin for rear surround being 0x11,
5666 * and the center/lfe being 0x10. Usually the pin order is the opposite.
5668 static const struct snd_pcm_chmap_elem ca0132_alt_chmaps[] = {
5670 .map = { SNDRV_CHMAP_FL, SNDRV_CHMAP_FR } },
5672 .map = { SNDRV_CHMAP_FL, SNDRV_CHMAP_FR,
5673 SNDRV_CHMAP_RL, SNDRV_CHMAP_RR } },
5675 .map = { SNDRV_CHMAP_FL, SNDRV_CHMAP_FR,
5676 SNDRV_CHMAP_FC, SNDRV_CHMAP_LFE,
5677 SNDRV_CHMAP_RL, SNDRV_CHMAP_RR } },
5681 /* Add the correct chmap for streams with 6 channels. */
5682 static void ca0132_alt_add_chmap_ctls(struct hda_codec *codec)
5685 struct hda_pcm *pcm;
5687 list_for_each_entry(pcm, &codec->pcm_list_head, list) {
5688 struct hda_pcm_stream *hinfo =
5689 &pcm->stream[SNDRV_PCM_STREAM_PLAYBACK];
5690 struct snd_pcm_chmap *chmap;
5691 const struct snd_pcm_chmap_elem *elem;
5693 elem = ca0132_alt_chmaps;
5694 if (hinfo->channels_max == 6) {
5695 err = snd_pcm_add_chmap_ctls(pcm->pcm,
5696 SNDRV_PCM_STREAM_PLAYBACK,
5697 elem, hinfo->channels_max, 0, &chmap);
5699 codec_dbg(codec, "snd_pcm_add_chmap_ctls failed!");
5705 * When changing Node IDs for Mixer Controls below, make sure to update
5706 * Node IDs in ca0132_config() as well.
5708 static const struct snd_kcontrol_new ca0132_mixer[] = {
5709 CA0132_CODEC_VOL("Master Playback Volume", VNID_SPK, HDA_OUTPUT),
5710 CA0132_CODEC_MUTE("Master Playback Switch", VNID_SPK, HDA_OUTPUT),
5711 CA0132_CODEC_VOL("Capture Volume", VNID_MIC, HDA_INPUT),
5712 CA0132_CODEC_MUTE("Capture Switch", VNID_MIC, HDA_INPUT),
5713 HDA_CODEC_VOLUME("Analog-Mic2 Capture Volume", 0x08, 0, HDA_INPUT),
5714 HDA_CODEC_MUTE("Analog-Mic2 Capture Switch", 0x08, 0, HDA_INPUT),
5715 HDA_CODEC_VOLUME("What U Hear Capture Volume", 0x0a, 0, HDA_INPUT),
5716 HDA_CODEC_MUTE("What U Hear Capture Switch", 0x0a, 0, HDA_INPUT),
5717 CA0132_CODEC_MUTE_MONO("Mic1-Boost (30dB) Capture Switch",
5718 0x12, 1, HDA_INPUT),
5719 CA0132_CODEC_MUTE_MONO("HP/Speaker Playback Switch",
5720 VNID_HP_SEL, 1, HDA_OUTPUT),
5721 CA0132_CODEC_MUTE_MONO("AMic1/DMic Capture Switch",
5722 VNID_AMIC1_SEL, 1, HDA_INPUT),
5723 CA0132_CODEC_MUTE_MONO("HP/Speaker Auto Detect Playback Switch",
5724 VNID_HP_ASEL, 1, HDA_OUTPUT),
5725 CA0132_CODEC_MUTE_MONO("AMic1/DMic Auto Detect Capture Switch",
5726 VNID_AMIC1_ASEL, 1, HDA_INPUT),
5731 * SBZ specific control mixer. Removes auto-detect for mic, and adds surround
5732 * controls. Also sets both the Front Playback and Capture Volume controls to
5733 * alt so they set the DSP's decibel level.
5735 static const struct snd_kcontrol_new sbz_mixer[] = {
5736 CA0132_ALT_CODEC_VOL("Front Playback Volume", 0x02, HDA_OUTPUT),
5737 CA0132_CODEC_MUTE("Front Playback Switch", VNID_SPK, HDA_OUTPUT),
5738 HDA_CODEC_VOLUME("Surround Playback Volume", 0x04, 0, HDA_OUTPUT),
5739 HDA_CODEC_MUTE("Surround Playback Switch", 0x04, 0, HDA_OUTPUT),
5740 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x03, 1, 0, HDA_OUTPUT),
5741 HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x03, 1, 0, HDA_OUTPUT),
5742 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x03, 2, 0, HDA_OUTPUT),
5743 HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x03, 2, 0, HDA_OUTPUT),
5744 CA0132_ALT_CODEC_VOL("Capture Volume", 0x07, HDA_INPUT),
5745 CA0132_CODEC_MUTE("Capture Switch", VNID_MIC, HDA_INPUT),
5746 HDA_CODEC_VOLUME("What U Hear Capture Volume", 0x0a, 0, HDA_INPUT),
5747 HDA_CODEC_MUTE("What U Hear Capture Switch", 0x0a, 0, HDA_INPUT),
5748 CA0132_CODEC_MUTE_MONO("HP/Speaker Auto Detect Playback Switch",
5749 VNID_HP_ASEL, 1, HDA_OUTPUT),
5754 * Same as the Sound Blaster Z, except doesn't use the alt volume for capture
5755 * because it doesn't set decibel levels for the DSP for capture.
5757 static const struct snd_kcontrol_new r3di_mixer[] = {
5758 CA0132_ALT_CODEC_VOL("Front Playback Volume", 0x02, HDA_OUTPUT),
5759 CA0132_CODEC_MUTE("Front Playback Switch", VNID_SPK, HDA_OUTPUT),
5760 HDA_CODEC_VOLUME("Surround Playback Volume", 0x04, 0, HDA_OUTPUT),
5761 HDA_CODEC_MUTE("Surround Playback Switch", 0x04, 0, HDA_OUTPUT),
5762 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x03, 1, 0, HDA_OUTPUT),
5763 HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x03, 1, 0, HDA_OUTPUT),
5764 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x03, 2, 0, HDA_OUTPUT),
5765 HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x03, 2, 0, HDA_OUTPUT),
5766 CA0132_CODEC_VOL("Capture Volume", VNID_MIC, HDA_INPUT),
5767 CA0132_CODEC_MUTE("Capture Switch", VNID_MIC, HDA_INPUT),
5768 HDA_CODEC_VOLUME("What U Hear Capture Volume", 0x0a, 0, HDA_INPUT),
5769 HDA_CODEC_MUTE("What U Hear Capture Switch", 0x0a, 0, HDA_INPUT),
5770 CA0132_CODEC_MUTE_MONO("HP/Speaker Auto Detect Playback Switch",
5771 VNID_HP_ASEL, 1, HDA_OUTPUT),
5775 static int ca0132_build_controls(struct hda_codec *codec)
5777 struct ca0132_spec *spec = codec->spec;
5778 int i, num_fx, num_sliders;
5781 /* Add Mixer controls */
5782 for (i = 0; i < spec->num_mixers; i++) {
5783 err = snd_hda_add_new_ctls(codec, spec->mixers[i]);
5787 /* Setup vmaster with surround slaves for desktop ca0132 devices */
5788 if (spec->use_alt_functions) {
5789 snd_hda_set_vmaster_tlv(codec, spec->dacs[0], HDA_OUTPUT,
5791 snd_hda_add_vmaster(codec, "Master Playback Volume",
5792 spec->tlv, ca0132_alt_slave_pfxs,
5794 err = __snd_hda_add_vmaster(codec, "Master Playback Switch",
5795 NULL, ca0132_alt_slave_pfxs,
5797 true, &spec->vmaster_mute.sw_kctl);
5801 /* Add in and out effects controls.
5802 * VoiceFX, PE and CrystalVoice are added separately.
5804 num_fx = OUT_EFFECTS_COUNT + IN_EFFECTS_COUNT;
5805 for (i = 0; i < num_fx; i++) {
5806 /* SBZ breaks if Echo Cancellation is used */
5807 if (spec->quirk == QUIRK_SBZ) {
5808 if (i == (ECHO_CANCELLATION - IN_EFFECT_START_NID +
5813 err = add_fx_switch(codec, ca0132_effects[i].nid,
5814 ca0132_effects[i].name,
5815 ca0132_effects[i].direct);
5820 * If codec has use_alt_controls set to true, add effect level sliders,
5821 * EQ presets, and Smart Volume presets. Also, change names to add FX
5822 * prefix, and change PlayEnhancement and CrystalVoice to match.
5824 if (spec->use_alt_controls) {
5825 ca0132_alt_add_svm_enum(codec);
5826 add_ca0132_alt_eq_presets(codec);
5827 err = add_fx_switch(codec, PLAY_ENHANCEMENT,
5832 err = add_fx_switch(codec, CRYSTAL_VOICE,
5837 num_sliders = OUT_EFFECTS_COUNT - 1;
5838 for (i = 0; i < num_sliders; i++) {
5839 err = ca0132_alt_add_effect_slider(codec,
5840 ca0132_effects[i].nid,
5841 ca0132_effects[i].name,
5842 ca0132_effects[i].direct);
5847 err = ca0132_alt_add_effect_slider(codec, XBASS_XOVER,
5848 "X-Bass Crossover", EFX_DIR_OUT);
5853 err = add_fx_switch(codec, PLAY_ENHANCEMENT,
5854 "PlayEnhancement", 0);
5858 err = add_fx_switch(codec, CRYSTAL_VOICE,
5866 * If the codec uses alt_functions, you need the enumerated controls
5867 * to select the new outputs and inputs, plus add the new mic boost
5870 if (spec->use_alt_functions) {
5871 ca0132_alt_add_output_enum(codec);
5872 ca0132_alt_add_input_enum(codec);
5873 ca0132_alt_add_mic_boost_enum(codec);
5875 #ifdef ENABLE_TUNING_CONTROLS
5876 add_tuning_ctls(codec);
5879 err = snd_hda_jack_add_kctls(codec, &spec->autocfg);
5883 if (spec->dig_out) {
5884 err = snd_hda_create_spdif_out_ctls(codec, spec->dig_out,
5888 err = snd_hda_create_spdif_share_sw(codec, &spec->multiout);
5891 /* spec->multiout.share_spdif = 1; */
5895 err = snd_hda_create_spdif_in_ctls(codec, spec->dig_in);
5900 if (spec->use_alt_functions)
5901 ca0132_alt_add_chmap_ctls(codec);
5909 static const struct hda_pcm_stream ca0132_pcm_analog_playback = {
5914 .prepare = ca0132_playback_pcm_prepare,
5915 .cleanup = ca0132_playback_pcm_cleanup,
5916 .get_delay = ca0132_playback_pcm_delay,
5920 static const struct hda_pcm_stream ca0132_pcm_analog_capture = {
5925 .prepare = ca0132_capture_pcm_prepare,
5926 .cleanup = ca0132_capture_pcm_cleanup,
5927 .get_delay = ca0132_capture_pcm_delay,
5931 static const struct hda_pcm_stream ca0132_pcm_digital_playback = {
5936 .open = ca0132_dig_playback_pcm_open,
5937 .close = ca0132_dig_playback_pcm_close,
5938 .prepare = ca0132_dig_playback_pcm_prepare,
5939 .cleanup = ca0132_dig_playback_pcm_cleanup
5943 static const struct hda_pcm_stream ca0132_pcm_digital_capture = {
5949 static int ca0132_build_pcms(struct hda_codec *codec)
5951 struct ca0132_spec *spec = codec->spec;
5952 struct hda_pcm *info;
5954 info = snd_hda_codec_pcm_new(codec, "CA0132 Analog");
5957 if (spec->use_alt_functions) {
5958 info->own_chmap = true;
5959 info->stream[SNDRV_PCM_STREAM_PLAYBACK].chmap
5960 = ca0132_alt_chmaps;
5962 info->stream[SNDRV_PCM_STREAM_PLAYBACK] = ca0132_pcm_analog_playback;
5963 info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = spec->dacs[0];
5964 info->stream[SNDRV_PCM_STREAM_PLAYBACK].channels_max =
5965 spec->multiout.max_channels;
5966 info->stream[SNDRV_PCM_STREAM_CAPTURE] = ca0132_pcm_analog_capture;
5967 info->stream[SNDRV_PCM_STREAM_CAPTURE].substreams = 1;
5968 info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->adcs[0];
5970 /* With the DSP enabled, desktops don't use this ADC. */
5971 if (!spec->use_alt_functions) {
5972 info = snd_hda_codec_pcm_new(codec, "CA0132 Analog Mic-In2");
5975 info->stream[SNDRV_PCM_STREAM_CAPTURE] =
5976 ca0132_pcm_analog_capture;
5977 info->stream[SNDRV_PCM_STREAM_CAPTURE].substreams = 1;
5978 info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->adcs[1];
5981 info = snd_hda_codec_pcm_new(codec, "CA0132 What U Hear");
5984 info->stream[SNDRV_PCM_STREAM_CAPTURE] = ca0132_pcm_analog_capture;
5985 info->stream[SNDRV_PCM_STREAM_CAPTURE].substreams = 1;
5986 info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->adcs[2];
5988 if (!spec->dig_out && !spec->dig_in)
5991 info = snd_hda_codec_pcm_new(codec, "CA0132 Digital");
5994 info->pcm_type = HDA_PCM_TYPE_SPDIF;
5995 if (spec->dig_out) {
5996 info->stream[SNDRV_PCM_STREAM_PLAYBACK] =
5997 ca0132_pcm_digital_playback;
5998 info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = spec->dig_out;
6001 info->stream[SNDRV_PCM_STREAM_CAPTURE] =
6002 ca0132_pcm_digital_capture;
6003 info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->dig_in;
6009 static void init_output(struct hda_codec *codec, hda_nid_t pin, hda_nid_t dac)
6012 snd_hda_set_pin_ctl(codec, pin, PIN_HP);
6013 if (get_wcaps(codec, pin) & AC_WCAP_OUT_AMP)
6014 snd_hda_codec_write(codec, pin, 0,
6015 AC_VERB_SET_AMP_GAIN_MUTE,
6018 if (dac && (get_wcaps(codec, dac) & AC_WCAP_OUT_AMP))
6019 snd_hda_codec_write(codec, dac, 0,
6020 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO);
6023 static void init_input(struct hda_codec *codec, hda_nid_t pin, hda_nid_t adc)
6026 snd_hda_set_pin_ctl(codec, pin, PIN_VREF80);
6027 if (get_wcaps(codec, pin) & AC_WCAP_IN_AMP)
6028 snd_hda_codec_write(codec, pin, 0,
6029 AC_VERB_SET_AMP_GAIN_MUTE,
6032 if (adc && (get_wcaps(codec, adc) & AC_WCAP_IN_AMP)) {
6033 snd_hda_codec_write(codec, adc, 0, AC_VERB_SET_AMP_GAIN_MUTE,
6036 /* init to 0 dB and unmute. */
6037 snd_hda_codec_amp_stereo(codec, adc, HDA_INPUT, 0,
6038 HDA_AMP_VOLMASK, 0x5a);
6039 snd_hda_codec_amp_stereo(codec, adc, HDA_INPUT, 0,
6044 static void refresh_amp_caps(struct hda_codec *codec, hda_nid_t nid, int dir)
6048 caps = snd_hda_param_read(codec, nid, dir == HDA_OUTPUT ?
6049 AC_PAR_AMP_OUT_CAP : AC_PAR_AMP_IN_CAP);
6050 snd_hda_override_amp_caps(codec, nid, dir, caps);
6054 * Switch between Digital built-in mic and analog mic.
6056 static void ca0132_set_dmic(struct hda_codec *codec, int enable)
6058 struct ca0132_spec *spec = codec->spec;
6061 unsigned int oldval;
6063 codec_dbg(codec, "ca0132_set_dmic: enable=%d\n", enable);
6065 oldval = stop_mic1(codec);
6066 ca0132_set_vipsource(codec, 0);
6068 /* set DMic input as 2-ch */
6070 dspio_set_uint_param(codec, 0x80, 0x00, tmp);
6072 val = spec->dmic_ctl;
6074 snd_hda_codec_write(codec, spec->input_pins[0], 0,
6075 VENDOR_CHIPIO_DMIC_CTL_SET, val);
6077 if (!(spec->dmic_ctl & 0x20))
6078 chipio_set_control_flag(codec, CONTROL_FLAG_DMIC, 1);
6080 /* set AMic input as mono */
6082 dspio_set_uint_param(codec, 0x80, 0x00, tmp);
6084 val = spec->dmic_ctl;
6085 /* clear bit7 and bit5 to disable dmic */
6087 snd_hda_codec_write(codec, spec->input_pins[0], 0,
6088 VENDOR_CHIPIO_DMIC_CTL_SET, val);
6090 if (!(spec->dmic_ctl & 0x20))
6091 chipio_set_control_flag(codec, CONTROL_FLAG_DMIC, 0);
6093 ca0132_set_vipsource(codec, 1);
6094 resume_mic1(codec, oldval);
6098 * Initialization for Digital Mic.
6100 static void ca0132_init_dmic(struct hda_codec *codec)
6102 struct ca0132_spec *spec = codec->spec;
6105 /* Setup Digital Mic here, but don't enable.
6106 * Enable based on jack detect.
6109 /* MCLK uses MPIO1, set to enable.
6110 * Bit 2-0: MPIO select
6111 * Bit 3: set to disable
6115 snd_hda_codec_write(codec, spec->input_pins[0], 0,
6116 VENDOR_CHIPIO_DMIC_MCLK_SET, val);
6118 /* Data1 uses MPIO3. Data2 not use
6119 * Bit 2-0: Data1 MPIO select
6120 * Bit 3: set disable Data1
6121 * Bit 6-4: Data2 MPIO select
6122 * Bit 7: set disable Data2
6125 snd_hda_codec_write(codec, spec->input_pins[0], 0,
6126 VENDOR_CHIPIO_DMIC_PIN_SET, val);
6128 /* Use Ch-0 and Ch-1. Rate is 48K, mode 1. Disable DMic first.
6129 * Bit 3-0: Channel mask
6130 * Bit 4: set for 48KHz, clear for 32KHz
6132 * Bit 6: set to select Data2, clear for Data1
6133 * Bit 7: set to enable DMic, clear for AMic
6135 if (spec->quirk == QUIRK_ALIENWARE_M17XR4)
6139 /* keep a copy of dmic ctl val for enable/disable dmic purpuse */
6140 spec->dmic_ctl = val;
6141 snd_hda_codec_write(codec, spec->input_pins[0], 0,
6142 VENDOR_CHIPIO_DMIC_CTL_SET, val);
6146 * Initialization for Analog Mic 2
6148 static void ca0132_init_analog_mic2(struct hda_codec *codec)
6150 struct ca0132_spec *spec = codec->spec;
6152 mutex_lock(&spec->chipio_mutex);
6153 snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
6154 VENDOR_CHIPIO_8051_ADDRESS_LOW, 0x20);
6155 snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
6156 VENDOR_CHIPIO_8051_ADDRESS_HIGH, 0x19);
6157 snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
6158 VENDOR_CHIPIO_8051_DATA_WRITE, 0x00);
6159 snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
6160 VENDOR_CHIPIO_8051_ADDRESS_LOW, 0x2D);
6161 snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
6162 VENDOR_CHIPIO_8051_ADDRESS_HIGH, 0x19);
6163 snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
6164 VENDOR_CHIPIO_8051_DATA_WRITE, 0x00);
6165 mutex_unlock(&spec->chipio_mutex);
6168 static void ca0132_refresh_widget_caps(struct hda_codec *codec)
6170 struct ca0132_spec *spec = codec->spec;
6173 codec_dbg(codec, "ca0132_refresh_widget_caps.\n");
6174 snd_hda_codec_update_widgets(codec);
6176 for (i = 0; i < spec->multiout.num_dacs; i++)
6177 refresh_amp_caps(codec, spec->dacs[i], HDA_OUTPUT);
6179 for (i = 0; i < spec->num_outputs; i++)
6180 refresh_amp_caps(codec, spec->out_pins[i], HDA_OUTPUT);
6182 for (i = 0; i < spec->num_inputs; i++) {
6183 refresh_amp_caps(codec, spec->adcs[i], HDA_INPUT);
6184 refresh_amp_caps(codec, spec->input_pins[i], HDA_INPUT);
6189 * Recon3Di r3di_setup_defaults sub functions.
6192 static void r3di_dsp_scp_startup(struct hda_codec *codec)
6197 dspio_set_uint_param_no_source(codec, 0x80, 0x0A, tmp);
6200 dspio_set_uint_param_no_source(codec, 0x80, 0x0B, tmp);
6203 dspio_set_uint_param_no_source(codec, 0x80, 0x0C, tmp);
6206 dspio_set_uint_param_no_source(codec, 0x80, 0x0C, tmp);
6209 dspio_set_uint_param_no_source(codec, 0x80, 0x0C, tmp);
6213 static void r3di_dsp_initial_mic_setup(struct hda_codec *codec)
6218 chipio_set_conn_rate(codec, MEM_CONNID_MICIN1, SR_96_000);
6219 chipio_set_conn_rate(codec, MEM_CONNID_MICOUT1, SR_96_000);
6220 /* This ConnPointID is unique to Recon3Di. Haven't seen it elsewhere */
6221 chipio_set_conn_rate(codec, 0x0F, SR_96_000);
6223 dspio_set_uint_param(codec, 0x80, 0x00, tmp);
6225 /* Mic 2 Setup, even though it isn't connected on SBZ */
6226 chipio_set_conn_rate(codec, MEM_CONNID_MICIN2, SR_96_000);
6227 chipio_set_conn_rate(codec, MEM_CONNID_MICOUT2, SR_96_000);
6228 chipio_set_conn_rate(codec, 0x0F, SR_96_000);
6230 dspio_set_uint_param(codec, 0x80, 0x01, tmp);
6234 * Initialize Sound Blaster Z analog microphones.
6236 static void sbz_init_analog_mics(struct hda_codec *codec)
6241 chipio_set_conn_rate(codec, MEM_CONNID_MICIN1, SR_96_000);
6242 chipio_set_conn_rate(codec, MEM_CONNID_MICOUT1, SR_96_000);
6244 dspio_set_uint_param(codec, 0x80, 0x00, tmp);
6246 /* Mic 2 Setup, even though it isn't connected on SBZ */
6247 chipio_set_conn_rate(codec, MEM_CONNID_MICIN2, SR_96_000);
6248 chipio_set_conn_rate(codec, MEM_CONNID_MICOUT2, SR_96_000);
6250 dspio_set_uint_param(codec, 0x80, 0x01, tmp);
6255 * Sets the source of stream 0x14 to connpointID 0x48, and the destination
6256 * connpointID to 0x91. If this isn't done, the destination is 0x71, and
6257 * you get no sound. I'm guessing this has to do with the Sound Blaster Z
6258 * having an updated DAC, which changes the destination to that DAC.
6260 static void sbz_connect_streams(struct hda_codec *codec)
6262 struct ca0132_spec *spec = codec->spec;
6264 mutex_lock(&spec->chipio_mutex);
6266 codec_dbg(codec, "Connect Streams entered, mutex locked and loaded.\n");
6268 chipio_set_stream_channels(codec, 0x0C, 6);
6269 chipio_set_stream_control(codec, 0x0C, 1);
6271 /* This value is 0x43 for 96khz, and 0x83 for 192khz. */
6272 chipio_write_no_mutex(codec, 0x18a020, 0x00000043);
6274 /* Setup stream 0x14 with it's source and destination points */
6275 chipio_set_stream_source_dest(codec, 0x14, 0x48, 0x91);
6276 chipio_set_conn_rate_no_mutex(codec, 0x48, SR_96_000);
6277 chipio_set_conn_rate_no_mutex(codec, 0x91, SR_96_000);
6278 chipio_set_stream_channels(codec, 0x14, 2);
6279 chipio_set_stream_control(codec, 0x14, 1);
6281 codec_dbg(codec, "Connect Streams exited, mutex released.\n");
6283 mutex_unlock(&spec->chipio_mutex);
6288 * Write data through ChipIO to setup proper stream destinations.
6289 * Not sure how it exactly works, but it seems to direct data
6290 * to different destinations. Example is f8 to c0, e0 to c0.
6291 * All I know is, if you don't set these, you get no sound.
6293 static void sbz_chipio_startup_data(struct hda_codec *codec)
6295 struct ca0132_spec *spec = codec->spec;
6297 mutex_lock(&spec->chipio_mutex);
6298 codec_dbg(codec, "Startup Data entered, mutex locked and loaded.\n");
6300 /* These control audio output */
6301 chipio_write_no_mutex(codec, 0x190060, 0x0001f8c0);
6302 chipio_write_no_mutex(codec, 0x190064, 0x0001f9c1);
6303 chipio_write_no_mutex(codec, 0x190068, 0x0001fac6);
6304 chipio_write_no_mutex(codec, 0x19006c, 0x0001fbc7);
6305 /* Signal to update I think */
6306 chipio_write_no_mutex(codec, 0x19042c, 0x00000001);
6308 chipio_set_stream_channels(codec, 0x0C, 6);
6309 chipio_set_stream_control(codec, 0x0C, 1);
6310 /* No clue what these control */
6311 chipio_write_no_mutex(codec, 0x190030, 0x0001e0c0);
6312 chipio_write_no_mutex(codec, 0x190034, 0x0001e1c1);
6313 chipio_write_no_mutex(codec, 0x190038, 0x0001e4c2);
6314 chipio_write_no_mutex(codec, 0x19003c, 0x0001e5c3);
6315 chipio_write_no_mutex(codec, 0x190040, 0x0001e2c4);
6316 chipio_write_no_mutex(codec, 0x190044, 0x0001e3c5);
6317 chipio_write_no_mutex(codec, 0x190048, 0x0001e8c6);
6318 chipio_write_no_mutex(codec, 0x19004c, 0x0001e9c7);
6319 chipio_write_no_mutex(codec, 0x190050, 0x0001ecc8);
6320 chipio_write_no_mutex(codec, 0x190054, 0x0001edc9);
6321 chipio_write_no_mutex(codec, 0x190058, 0x0001eaca);
6322 chipio_write_no_mutex(codec, 0x19005c, 0x0001ebcb);
6324 chipio_write_no_mutex(codec, 0x19042c, 0x00000001);
6326 codec_dbg(codec, "Startup Data exited, mutex released.\n");
6327 mutex_unlock(&spec->chipio_mutex);
6331 * Sound Blaster Z uses these after DSP is loaded. Weird SCP commands
6332 * without a 0x20 source like normal.
6334 static void sbz_dsp_scp_startup(struct hda_codec *codec)
6339 dspio_set_uint_param_no_source(codec, 0x80, 0x0C, tmp);
6342 dspio_set_uint_param_no_source(codec, 0x80, 0x0A, tmp);
6345 dspio_set_uint_param_no_source(codec, 0x80, 0x0B, tmp);
6348 dspio_set_uint_param_no_source(codec, 0x80, 0x0C, tmp);
6351 dspio_set_uint_param_no_source(codec, 0x80, 0x0C, tmp);
6354 dspio_set_uint_param_no_source(codec, 0x80, 0x0C, tmp);
6358 static void sbz_dsp_initial_mic_setup(struct hda_codec *codec)
6362 chipio_set_stream_control(codec, 0x03, 0);
6363 chipio_set_stream_control(codec, 0x04, 0);
6365 chipio_set_conn_rate(codec, MEM_CONNID_MICIN1, SR_96_000);
6366 chipio_set_conn_rate(codec, MEM_CONNID_MICOUT1, SR_96_000);
6369 dspio_set_uint_param(codec, 0x80, 0x00, tmp);
6371 chipio_set_stream_control(codec, 0x03, 1);
6372 chipio_set_stream_control(codec, 0x04, 1);
6374 chipio_write(codec, 0x18b098, 0x0000000c);
6375 chipio_write(codec, 0x18b09C, 0x0000000c);
6379 * Setup default parameters for DSP
6381 static void ca0132_setup_defaults(struct hda_codec *codec)
6383 struct ca0132_spec *spec = codec->spec;
6388 if (spec->dsp_state != DSP_DOWNLOADED)
6391 /* out, in effects + voicefx */
6392 num_fx = OUT_EFFECTS_COUNT + IN_EFFECTS_COUNT + 1;
6393 for (idx = 0; idx < num_fx; idx++) {
6394 for (i = 0; i <= ca0132_effects[idx].params; i++) {
6395 dspio_set_uint_param(codec, ca0132_effects[idx].mid,
6396 ca0132_effects[idx].reqs[i],
6397 ca0132_effects[idx].def_vals[i]);
6401 /*remove DSP headroom*/
6403 dspio_set_uint_param(codec, 0x96, 0x3C, tmp);
6405 /*set speaker EQ bypass attenuation*/
6406 dspio_set_uint_param(codec, 0x8f, 0x01, tmp);
6408 /* set AMic1 and AMic2 as mono mic */
6410 dspio_set_uint_param(codec, 0x80, 0x00, tmp);
6411 dspio_set_uint_param(codec, 0x80, 0x01, tmp);
6413 /* set AMic1 as CrystalVoice input */
6415 dspio_set_uint_param(codec, 0x80, 0x05, tmp);
6417 /* set WUH source */
6419 dspio_set_uint_param(codec, 0x31, 0x00, tmp);
6423 * Setup default parameters for Recon3Di DSP.
6426 static void r3di_setup_defaults(struct hda_codec *codec)
6428 struct ca0132_spec *spec = codec->spec;
6433 if (spec->dsp_state != DSP_DOWNLOADED)
6436 r3di_dsp_scp_startup(codec);
6438 r3di_dsp_initial_mic_setup(codec);
6440 /*remove DSP headroom*/
6442 dspio_set_uint_param(codec, 0x96, 0x3C, tmp);
6444 /* set WUH source */
6446 dspio_set_uint_param(codec, 0x31, 0x00, tmp);
6447 chipio_set_conn_rate(codec, MEM_CONNID_WUH, SR_48_000);
6449 /* Set speaker source? */
6450 dspio_set_uint_param(codec, 0x32, 0x00, tmp);
6452 r3di_gpio_dsp_status_set(codec, R3DI_DSP_DOWNLOADED);
6454 /* Setup effect defaults */
6455 num_fx = OUT_EFFECTS_COUNT + IN_EFFECTS_COUNT + 1;
6456 for (idx = 0; idx < num_fx; idx++) {
6457 for (i = 0; i <= ca0132_effects[idx].params; i++) {
6458 dspio_set_uint_param(codec,
6459 ca0132_effects[idx].mid,
6460 ca0132_effects[idx].reqs[i],
6461 ca0132_effects[idx].def_vals[i]);
6468 * Setup default parameters for the Sound Blaster Z DSP. A lot more going on
6469 * than the Chromebook setup.
6471 static void sbz_setup_defaults(struct hda_codec *codec)
6473 struct ca0132_spec *spec = codec->spec;
6474 unsigned int tmp, stream_format;
6478 if (spec->dsp_state != DSP_DOWNLOADED)
6481 sbz_dsp_scp_startup(codec);
6483 sbz_init_analog_mics(codec);
6485 sbz_connect_streams(codec);
6487 sbz_chipio_startup_data(codec);
6489 chipio_set_stream_control(codec, 0x03, 1);
6490 chipio_set_stream_control(codec, 0x04, 1);
6493 * Sets internal input loopback to off, used to have a switch to
6494 * enable input loopback, but turned out to be way too buggy.
6497 dspio_set_uint_param(codec, 0x37, 0x08, tmp);
6498 dspio_set_uint_param(codec, 0x37, 0x10, tmp);
6500 /*remove DSP headroom*/
6502 dspio_set_uint_param(codec, 0x96, 0x3C, tmp);
6504 /* set WUH source */
6506 dspio_set_uint_param(codec, 0x31, 0x00, tmp);
6507 chipio_set_conn_rate(codec, MEM_CONNID_WUH, SR_48_000);
6509 /* Set speaker source? */
6510 dspio_set_uint_param(codec, 0x32, 0x00, tmp);
6512 sbz_dsp_initial_mic_setup(codec);
6515 /* out, in effects + voicefx */
6516 num_fx = OUT_EFFECTS_COUNT + IN_EFFECTS_COUNT + 1;
6517 for (idx = 0; idx < num_fx; idx++) {
6518 for (i = 0; i <= ca0132_effects[idx].params; i++) {
6519 dspio_set_uint_param(codec,
6520 ca0132_effects[idx].mid,
6521 ca0132_effects[idx].reqs[i],
6522 ca0132_effects[idx].def_vals[i]);
6527 * Have to make a stream to bind the sound output to, otherwise
6528 * you'll get dead audio. Before I did this, it would bind to an
6529 * audio input, and would never work
6531 stream_format = snd_hdac_calc_stream_format(48000, 2,
6532 SNDRV_PCM_FORMAT_S32_LE, 32, 0);
6534 snd_hda_codec_setup_stream(codec, spec->dacs[0], spec->dsp_stream_id,
6537 snd_hda_codec_cleanup_stream(codec, spec->dacs[0]);
6539 snd_hda_codec_setup_stream(codec, spec->dacs[0], spec->dsp_stream_id,
6542 snd_hda_codec_cleanup_stream(codec, spec->dacs[0]);
6546 * Initialization of flags in chip
6548 static void ca0132_init_flags(struct hda_codec *codec)
6550 struct ca0132_spec *spec = codec->spec;
6552 if (spec->use_alt_functions) {
6553 chipio_set_control_flag(codec, CONTROL_FLAG_DSP_96KHZ, 1);
6554 chipio_set_control_flag(codec, CONTROL_FLAG_DAC_96KHZ, 1);
6555 chipio_set_control_flag(codec, CONTROL_FLAG_ADC_B_96KHZ, 1);
6556 chipio_set_control_flag(codec, CONTROL_FLAG_ADC_C_96KHZ, 1);
6557 chipio_set_control_flag(codec, CONTROL_FLAG_SRC_RATE_96KHZ, 1);
6558 chipio_set_control_flag(codec, CONTROL_FLAG_IDLE_ENABLE, 0);
6559 chipio_set_control_flag(codec, CONTROL_FLAG_SPDIF2OUT, 0);
6560 chipio_set_control_flag(codec,
6561 CONTROL_FLAG_PORT_D_10KOHM_LOAD, 0);
6562 chipio_set_control_flag(codec,
6563 CONTROL_FLAG_PORT_A_10KOHM_LOAD, 1);
6565 chipio_set_control_flag(codec, CONTROL_FLAG_IDLE_ENABLE, 0);
6566 chipio_set_control_flag(codec,
6567 CONTROL_FLAG_PORT_A_COMMON_MODE, 0);
6568 chipio_set_control_flag(codec,
6569 CONTROL_FLAG_PORT_D_COMMON_MODE, 0);
6570 chipio_set_control_flag(codec,
6571 CONTROL_FLAG_PORT_A_10KOHM_LOAD, 0);
6572 chipio_set_control_flag(codec,
6573 CONTROL_FLAG_PORT_D_10KOHM_LOAD, 0);
6574 chipio_set_control_flag(codec, CONTROL_FLAG_ADC_C_HIGH_PASS, 1);
6579 * Initialization of parameters in chip
6581 static void ca0132_init_params(struct hda_codec *codec)
6583 struct ca0132_spec *spec = codec->spec;
6585 if (spec->use_alt_functions) {
6586 chipio_set_conn_rate(codec, MEM_CONNID_WUH, SR_48_000);
6587 chipio_set_conn_rate(codec, 0x0B, SR_48_000);
6588 chipio_set_control_param(codec, CONTROL_PARAM_SPDIF1_SOURCE, 0);
6589 chipio_set_control_param(codec, 0, 0);
6590 chipio_set_control_param(codec, CONTROL_PARAM_VIP_SOURCE, 0);
6593 chipio_set_control_param(codec, CONTROL_PARAM_PORTA_160OHM_GAIN, 6);
6594 chipio_set_control_param(codec, CONTROL_PARAM_PORTD_160OHM_GAIN, 6);
6597 static void ca0132_set_dsp_msr(struct hda_codec *codec, bool is96k)
6599 chipio_set_control_flag(codec, CONTROL_FLAG_DSP_96KHZ, is96k);
6600 chipio_set_control_flag(codec, CONTROL_FLAG_DAC_96KHZ, is96k);
6601 chipio_set_control_flag(codec, CONTROL_FLAG_SRC_RATE_96KHZ, is96k);
6602 chipio_set_control_flag(codec, CONTROL_FLAG_SRC_CLOCK_196MHZ, is96k);
6603 chipio_set_control_flag(codec, CONTROL_FLAG_ADC_B_96KHZ, is96k);
6604 chipio_set_control_flag(codec, CONTROL_FLAG_ADC_C_96KHZ, is96k);
6606 chipio_set_conn_rate(codec, MEM_CONNID_MICIN1, SR_96_000);
6607 chipio_set_conn_rate(codec, MEM_CONNID_MICOUT1, SR_96_000);
6608 chipio_set_conn_rate(codec, MEM_CONNID_WUH, SR_48_000);
6611 static bool ca0132_download_dsp_images(struct hda_codec *codec)
6613 bool dsp_loaded = false;
6614 struct ca0132_spec *spec = codec->spec;
6615 const struct dsp_image_seg *dsp_os_image;
6616 const struct firmware *fw_entry;
6618 * Alternate firmwares for different variants. The Recon3Di apparently
6619 * can use the default firmware, but I'll leave the option in case
6620 * it needs it again.
6622 switch (spec->quirk) {
6624 if (request_firmware(&fw_entry, SBZ_EFX_FILE,
6625 codec->card->dev) != 0) {
6626 codec_dbg(codec, "SBZ alt firmware not detected. ");
6627 spec->alt_firmware_present = false;
6629 codec_dbg(codec, "Sound Blaster Z firmware selected.");
6630 spec->alt_firmware_present = true;
6634 if (request_firmware(&fw_entry, R3DI_EFX_FILE,
6635 codec->card->dev) != 0) {
6636 codec_dbg(codec, "Recon3Di alt firmware not detected.");
6637 spec->alt_firmware_present = false;
6639 codec_dbg(codec, "Recon3Di firmware selected.");
6640 spec->alt_firmware_present = true;
6644 spec->alt_firmware_present = false;
6648 * Use default ctefx.bin if no alt firmware is detected, or if none
6649 * exists for your particular codec.
6651 if (!spec->alt_firmware_present) {
6652 codec_dbg(codec, "Default firmware selected.");
6653 if (request_firmware(&fw_entry, EFX_FILE,
6654 codec->card->dev) != 0)
6658 dsp_os_image = (struct dsp_image_seg *)(fw_entry->data);
6659 if (dspload_image(codec, dsp_os_image, 0, 0, true, 0)) {
6660 codec_err(codec, "ca0132 DSP load image failed\n");
6664 dsp_loaded = dspload_wait_loaded(codec);
6667 release_firmware(fw_entry);
6672 static void ca0132_download_dsp(struct hda_codec *codec)
6674 struct ca0132_spec *spec = codec->spec;
6676 #ifndef CONFIG_SND_HDA_CODEC_CA0132_DSP
6680 if (spec->dsp_state == DSP_DOWNLOAD_FAILED)
6681 return; /* don't retry failures */
6683 chipio_enable_clocks(codec);
6684 if (spec->dsp_state != DSP_DOWNLOADED) {
6685 spec->dsp_state = DSP_DOWNLOADING;
6687 if (!ca0132_download_dsp_images(codec))
6688 spec->dsp_state = DSP_DOWNLOAD_FAILED;
6690 spec->dsp_state = DSP_DOWNLOADED;
6693 /* For codecs using alt functions, this is already done earlier */
6694 if (spec->dsp_state == DSP_DOWNLOADED && (!spec->use_alt_functions))
6695 ca0132_set_dsp_msr(codec, true);
6698 static void ca0132_process_dsp_response(struct hda_codec *codec,
6699 struct hda_jack_callback *callback)
6701 struct ca0132_spec *spec = codec->spec;
6703 codec_dbg(codec, "ca0132_process_dsp_response\n");
6704 if (spec->wait_scp) {
6705 if (dspio_get_response_data(codec) >= 0)
6709 dspio_clear_response_queue(codec);
6712 static void hp_callback(struct hda_codec *codec, struct hda_jack_callback *cb)
6714 struct ca0132_spec *spec = codec->spec;
6715 struct hda_jack_tbl *tbl;
6717 /* Delay enabling the HP amp, to let the mic-detection
6718 * state machine run.
6720 cancel_delayed_work_sync(&spec->unsol_hp_work);
6721 schedule_delayed_work(&spec->unsol_hp_work, msecs_to_jiffies(500));
6722 tbl = snd_hda_jack_tbl_get(codec, cb->nid);
6724 tbl->block_report = 1;
6727 static void amic_callback(struct hda_codec *codec, struct hda_jack_callback *cb)
6729 ca0132_select_mic(codec);
6732 static void ca0132_init_unsol(struct hda_codec *codec)
6734 struct ca0132_spec *spec = codec->spec;
6735 snd_hda_jack_detect_enable_callback(codec, spec->unsol_tag_hp, hp_callback);
6736 snd_hda_jack_detect_enable_callback(codec, spec->unsol_tag_amic1,
6738 snd_hda_jack_detect_enable_callback(codec, UNSOL_TAG_DSP,
6739 ca0132_process_dsp_response);
6740 /* Front headphone jack detection */
6741 if (spec->use_alt_functions)
6742 snd_hda_jack_detect_enable_callback(codec,
6743 spec->unsol_tag_front_hp, hp_callback);
6750 /* Sends before DSP download. */
6751 static struct hda_verb ca0132_base_init_verbs[] = {
6752 /*enable ct extension*/
6753 {0x15, VENDOR_CHIPIO_CT_EXTENSIONS_ENABLE, 0x1},
6758 static struct hda_verb ca0132_base_exit_verbs[] = {
6760 {0x01, AC_VERB_SET_POWER_STATE, 0x03},
6761 /*disable ct extension*/
6762 {0x15, VENDOR_CHIPIO_CT_EXTENSIONS_ENABLE, 0},
6766 /* Other verbs tables. Sends after DSP download. */
6768 static struct hda_verb ca0132_init_verbs0[] = {
6769 /* chip init verbs */
6770 {0x15, 0x70D, 0xF0},
6771 {0x15, 0x70E, 0xFE},
6772 {0x15, 0x707, 0x75},
6773 {0x15, 0x707, 0xD3},
6774 {0x15, 0x707, 0x09},
6775 {0x15, 0x707, 0x53},
6776 {0x15, 0x707, 0xD4},
6777 {0x15, 0x707, 0xEF},
6778 {0x15, 0x707, 0x75},
6779 {0x15, 0x707, 0xD3},
6780 {0x15, 0x707, 0x09},
6781 {0x15, 0x707, 0x02},
6782 {0x15, 0x707, 0x37},
6783 {0x15, 0x707, 0x78},
6784 {0x15, 0x53C, 0xCE},
6785 {0x15, 0x575, 0xC9},
6786 {0x15, 0x53D, 0xCE},
6787 {0x15, 0x5B7, 0xC9},
6788 {0x15, 0x70D, 0xE8},
6789 {0x15, 0x70E, 0xFE},
6790 {0x15, 0x707, 0x02},
6791 {0x15, 0x707, 0x68},
6792 {0x15, 0x707, 0x62},
6793 {0x15, 0x53A, 0xCE},
6794 {0x15, 0x546, 0xC9},
6795 {0x15, 0x53B, 0xCE},
6796 {0x15, 0x5E8, 0xC9},
6800 /* Extra init verbs for SBZ */
6801 static struct hda_verb sbz_init_verbs[] = {
6802 {0x15, 0x70D, 0x20},
6803 {0x15, 0x70E, 0x19},
6804 {0x15, 0x707, 0x00},
6805 {0x15, 0x539, 0xCE},
6806 {0x15, 0x546, 0xC9},
6807 {0x15, 0x70D, 0xB7},
6808 {0x15, 0x70E, 0x09},
6809 {0x15, 0x707, 0x10},
6810 {0x15, 0x70D, 0xAF},
6811 {0x15, 0x70E, 0x09},
6812 {0x15, 0x707, 0x01},
6813 {0x15, 0x707, 0x05},
6814 {0x15, 0x70D, 0x73},
6815 {0x15, 0x70E, 0x09},
6816 {0x15, 0x707, 0x14},
6817 {0x15, 0x6FF, 0xC4},
6821 static void ca0132_init_chip(struct hda_codec *codec)
6823 struct ca0132_spec *spec = codec->spec;
6828 mutex_init(&spec->chipio_mutex);
6830 spec->cur_out_type = SPEAKER_OUT;
6831 if (!spec->use_alt_functions)
6832 spec->cur_mic_type = DIGITAL_MIC;
6834 spec->cur_mic_type = REAR_MIC;
6836 spec->cur_mic_boost = 0;
6838 for (i = 0; i < VNODES_COUNT; i++) {
6839 spec->vnode_lvol[i] = 0x5a;
6840 spec->vnode_rvol[i] = 0x5a;
6841 spec->vnode_lswitch[i] = 0;
6842 spec->vnode_rswitch[i] = 0;
6846 * Default states for effects are in ca0132_effects[].
6848 num_fx = OUT_EFFECTS_COUNT + IN_EFFECTS_COUNT;
6849 for (i = 0; i < num_fx; i++) {
6850 on = (unsigned int)ca0132_effects[i].reqs[0];
6851 spec->effects_switch[i] = on ? 1 : 0;
6854 * Sets defaults for the effect slider controls, only for alternative
6855 * ca0132 codecs. Also sets x-bass crossover frequency to 80hz.
6857 if (spec->use_alt_controls) {
6858 spec->xbass_xover_freq = 8;
6859 for (i = 0; i < EFFECT_LEVEL_SLIDERS; i++)
6860 spec->fx_ctl_val[i] = effect_slider_defaults[i];
6863 spec->voicefx_val = 0;
6864 spec->effects_switch[PLAY_ENHANCEMENT - EFFECT_START_NID] = 1;
6865 spec->effects_switch[CRYSTAL_VOICE - EFFECT_START_NID] = 0;
6867 #ifdef ENABLE_TUNING_CONTROLS
6868 ca0132_init_tuning_defaults(codec);
6873 * Recon3Di exit specific commands.
6875 /* prevents popping noise on shutdown */
6876 static void r3di_gpio_shutdown(struct hda_codec *codec)
6878 snd_hda_codec_write(codec, 0x01, 0, AC_VERB_SET_GPIO_DATA, 0x00);
6882 * Sound Blaster Z exit specific commands.
6884 static void sbz_region2_exit(struct hda_codec *codec)
6886 struct ca0132_spec *spec = codec->spec;
6889 for (i = 0; i < 4; i++)
6890 writeb(0x0, spec->mem_base + 0x100);
6891 for (i = 0; i < 8; i++)
6892 writeb(0xb3, spec->mem_base + 0x304);
6894 * I believe these are GPIO, with the right most hex digit being the
6895 * gpio pin, and the second digit being on or off. We see this more in
6896 * the input/output select functions.
6898 writew(0x0000, spec->mem_base + 0x320);
6899 writew(0x0001, spec->mem_base + 0x320);
6900 writew(0x0104, spec->mem_base + 0x320);
6901 writew(0x0005, spec->mem_base + 0x320);
6902 writew(0x0007, spec->mem_base + 0x320);
6905 static void sbz_set_pin_ctl_default(struct hda_codec *codec)
6907 hda_nid_t pins[5] = {0x0B, 0x0C, 0x0E, 0x12, 0x13};
6910 snd_hda_codec_write(codec, 0x11, 0,
6911 AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40);
6913 for (i = 0; i < 5; i++)
6914 snd_hda_codec_write(codec, pins[i], 0,
6915 AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00);
6918 static void sbz_clear_unsolicited(struct hda_codec *codec)
6920 hda_nid_t pins[7] = {0x0B, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13};
6923 for (i = 0; i < 7; i++) {
6924 snd_hda_codec_write(codec, pins[i], 0,
6925 AC_VERB_SET_UNSOLICITED_ENABLE, 0x00);
6929 /* On shutdown, sends commands in sets of three */
6930 static void sbz_gpio_shutdown_commands(struct hda_codec *codec, int dir,
6934 snd_hda_codec_write(codec, 0x01, 0,
6935 AC_VERB_SET_GPIO_DIRECTION, dir);
6937 snd_hda_codec_write(codec, 0x01, 0,
6938 AC_VERB_SET_GPIO_MASK, mask);
6941 snd_hda_codec_write(codec, 0x01, 0,
6942 AC_VERB_SET_GPIO_DATA, data);
6945 static void sbz_exit_chip(struct hda_codec *codec)
6947 chipio_set_stream_control(codec, 0x03, 0);
6948 chipio_set_stream_control(codec, 0x04, 0);
6950 /* Mess with GPIO */
6951 sbz_gpio_shutdown_commands(codec, 0x07, 0x07, -1);
6952 sbz_gpio_shutdown_commands(codec, 0x07, 0x07, 0x05);
6953 sbz_gpio_shutdown_commands(codec, 0x07, 0x07, 0x01);
6955 chipio_set_stream_control(codec, 0x14, 0);
6956 chipio_set_stream_control(codec, 0x0C, 0);
6958 chipio_set_conn_rate(codec, 0x41, SR_192_000);
6959 chipio_set_conn_rate(codec, 0x91, SR_192_000);
6961 chipio_write(codec, 0x18a020, 0x00000083);
6963 sbz_gpio_shutdown_commands(codec, 0x07, 0x07, 0x03);
6964 sbz_gpio_shutdown_commands(codec, 0x07, 0x07, 0x07);
6965 sbz_gpio_shutdown_commands(codec, 0x07, 0x07, 0x06);
6967 chipio_set_stream_control(codec, 0x0C, 0);
6969 chipio_set_control_param(codec, 0x0D, 0x24);
6971 sbz_clear_unsolicited(codec);
6972 sbz_set_pin_ctl_default(codec);
6974 snd_hda_codec_write(codec, 0x0B, 0,
6975 AC_VERB_SET_EAPD_BTLENABLE, 0x00);
6977 if (dspload_is_loaded(codec))
6980 snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
6981 VENDOR_CHIPIO_CT_EXTENSIONS_ENABLE, 0x00);
6983 sbz_region2_exit(codec);
6986 static void ca0132_exit_chip(struct hda_codec *codec)
6988 /* put any chip cleanup stuffs here. */
6990 if (dspload_is_loaded(codec))
6995 * This fixes a problem that was hard to reproduce. Very rarely, I would
6996 * boot up, and there would be no sound, but the DSP indicated it had loaded
6997 * properly. I did a few memory dumps to see if anything was different, and
6998 * there were a few areas of memory uninitialized with a1a2a3a4. This function
6999 * checks if those areas are uninitialized, and if they are, it'll attempt to
7000 * reload the card 3 times. Usually it fixes by the second.
7002 static void sbz_dsp_startup_check(struct hda_codec *codec)
7004 struct ca0132_spec *spec = codec->spec;
7005 unsigned int dsp_data_check[4];
7006 unsigned int cur_address = 0x390;
7008 unsigned int failure = 0;
7009 unsigned int reload = 3;
7011 if (spec->startup_check_entered)
7014 spec->startup_check_entered = true;
7016 for (i = 0; i < 4; i++) {
7017 chipio_read(codec, cur_address, &dsp_data_check[i]);
7020 for (i = 0; i < 4; i++) {
7021 if (dsp_data_check[i] == 0xa1a2a3a4)
7025 codec_dbg(codec, "Startup Check: %d ", failure);
7027 codec_info(codec, "DSP not initialized properly. Attempting to fix.");
7029 * While the failure condition is true, and we haven't reached our
7030 * three reload limit, continue trying to reload the driver and
7033 while (failure && (reload != 0)) {
7034 codec_info(codec, "Reloading... Tries left: %d", reload);
7035 sbz_exit_chip(codec);
7036 spec->dsp_state = DSP_DOWNLOAD_INIT;
7037 codec->patch_ops.init(codec);
7039 for (i = 0; i < 4; i++) {
7040 chipio_read(codec, cur_address, &dsp_data_check[i]);
7043 for (i = 0; i < 4; i++) {
7044 if (dsp_data_check[i] == 0xa1a2a3a4)
7050 if (!failure && reload < 3)
7051 codec_info(codec, "DSP fixed.");
7056 codec_info(codec, "DSP failed to initialize properly. Either try a full shutdown or a suspend to clear the internal memory.");
7060 * This is for the extra volume verbs 0x797 (left) and 0x798 (right). These add
7061 * extra precision for decibel values. If you had the dB value in floating point
7062 * you would take the value after the decimal point, multiply by 64, and divide
7063 * by 2. So for 8.59, it's (59 * 64) / 100. Useful if someone wanted to
7064 * implement fixed point or floating point dB volumes. For now, I'll set them
7065 * to 0 just incase a value has lingered from a boot into Windows.
7067 static void ca0132_alt_vol_setup(struct hda_codec *codec)
7069 snd_hda_codec_write(codec, 0x02, 0, 0x797, 0x00);
7070 snd_hda_codec_write(codec, 0x02, 0, 0x798, 0x00);
7071 snd_hda_codec_write(codec, 0x03, 0, 0x797, 0x00);
7072 snd_hda_codec_write(codec, 0x03, 0, 0x798, 0x00);
7073 snd_hda_codec_write(codec, 0x04, 0, 0x797, 0x00);
7074 snd_hda_codec_write(codec, 0x04, 0, 0x798, 0x00);
7075 snd_hda_codec_write(codec, 0x07, 0, 0x797, 0x00);
7076 snd_hda_codec_write(codec, 0x07, 0, 0x798, 0x00);
7080 * Extra commands that don't really fit anywhere else.
7082 static void sbz_pre_dsp_setup(struct hda_codec *codec)
7084 struct ca0132_spec *spec = codec->spec;
7086 writel(0x00820680, spec->mem_base + 0x01C);
7087 writel(0x00820680, spec->mem_base + 0x01C);
7089 snd_hda_codec_write(codec, 0x15, 0, 0xd00, 0xfc);
7090 snd_hda_codec_write(codec, 0x15, 0, 0xd00, 0xfd);
7091 snd_hda_codec_write(codec, 0x15, 0, 0xd00, 0xfe);
7092 snd_hda_codec_write(codec, 0x15, 0, 0xd00, 0xff);
7094 chipio_write(codec, 0x18b0a4, 0x000000c2);
7096 snd_hda_codec_write(codec, 0x11, 0,
7097 AC_VERB_SET_PIN_WIDGET_CONTROL, 0x44);
7101 * Extra commands that don't really fit anywhere else.
7103 static void r3di_pre_dsp_setup(struct hda_codec *codec)
7105 chipio_write(codec, 0x18b0a4, 0x000000c2);
7107 snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
7108 VENDOR_CHIPIO_8051_ADDRESS_LOW, 0x1E);
7109 snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
7110 VENDOR_CHIPIO_8051_ADDRESS_HIGH, 0x1C);
7111 snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
7112 VENDOR_CHIPIO_8051_DATA_WRITE, 0x5B);
7114 snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
7115 VENDOR_CHIPIO_8051_ADDRESS_LOW, 0x20);
7116 snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
7117 VENDOR_CHIPIO_8051_ADDRESS_HIGH, 0x19);
7118 snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
7119 VENDOR_CHIPIO_8051_DATA_WRITE, 0x00);
7120 snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
7121 VENDOR_CHIPIO_8051_DATA_WRITE, 0x40);
7123 snd_hda_codec_write(codec, 0x11, 0,
7124 AC_VERB_SET_PIN_WIDGET_CONTROL, 0x04);
7129 * These are sent before the DSP is downloaded. Not sure
7130 * what they do, or if they're necessary. Could possibly
7131 * be removed. Figure they're better to leave in.
7133 static void sbz_region2_startup(struct hda_codec *codec)
7135 struct ca0132_spec *spec = codec->spec;
7137 writel(0x00000000, spec->mem_base + 0x400);
7138 writel(0x00000000, spec->mem_base + 0x408);
7139 writel(0x00000000, spec->mem_base + 0x40C);
7140 writel(0x00880680, spec->mem_base + 0x01C);
7141 writel(0x00000083, spec->mem_base + 0xC0C);
7142 writel(0x00000030, spec->mem_base + 0xC00);
7143 writel(0x00000000, spec->mem_base + 0xC04);
7144 writel(0x00000003, spec->mem_base + 0xC0C);
7145 writel(0x00000003, spec->mem_base + 0xC0C);
7146 writel(0x00000003, spec->mem_base + 0xC0C);
7147 writel(0x00000003, spec->mem_base + 0xC0C);
7148 writel(0x000000C1, spec->mem_base + 0xC08);
7149 writel(0x000000F1, spec->mem_base + 0xC08);
7150 writel(0x00000001, spec->mem_base + 0xC08);
7151 writel(0x000000C7, spec->mem_base + 0xC08);
7152 writel(0x000000C1, spec->mem_base + 0xC08);
7153 writel(0x00000080, spec->mem_base + 0xC04);
7157 * Extra init functions for alternative ca0132 codecs. Done
7158 * here so they don't clutter up the main ca0132_init function
7159 * anymore than they have to.
7161 static void ca0132_alt_init(struct hda_codec *codec)
7163 struct ca0132_spec *spec = codec->spec;
7165 ca0132_alt_vol_setup(codec);
7167 switch (spec->quirk) {
7169 codec_dbg(codec, "SBZ alt_init");
7170 ca0132_gpio_init(codec);
7171 sbz_pre_dsp_setup(codec);
7172 snd_hda_sequence_write(codec, spec->chip_init_verbs);
7173 snd_hda_sequence_write(codec, spec->sbz_init_verbs);
7176 codec_dbg(codec, "R3DI alt_init");
7177 ca0132_gpio_init(codec);
7178 ca0132_gpio_setup(codec);
7179 r3di_gpio_dsp_status_set(codec, R3DI_DSP_DOWNLOADING);
7180 r3di_pre_dsp_setup(codec);
7181 snd_hda_sequence_write(codec, spec->chip_init_verbs);
7182 snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0, 0x6FF, 0xC4);
7187 static int ca0132_init(struct hda_codec *codec)
7189 struct ca0132_spec *spec = codec->spec;
7190 struct auto_pin_cfg *cfg = &spec->autocfg;
7195 * If the DSP is already downloaded, and init has been entered again,
7196 * there's only two reasons for it. One, the codec has awaken from a
7197 * suspended state, and in that case dspload_is_loaded will return
7198 * false, and the init will be ran again. The other reason it gets
7199 * re entered is on startup for some reason it triggers a suspend and
7200 * resume state. In this case, it will check if the DSP is downloaded,
7201 * and not run the init function again. For codecs using alt_functions,
7202 * it will check if the DSP is loaded properly.
7204 if (spec->dsp_state == DSP_DOWNLOADED) {
7205 dsp_loaded = dspload_is_loaded(codec);
7207 spec->dsp_reload = true;
7208 spec->dsp_state = DSP_DOWNLOAD_INIT;
7210 if (spec->quirk == QUIRK_SBZ)
7211 sbz_dsp_startup_check(codec);
7216 if (spec->dsp_state != DSP_DOWNLOAD_FAILED)
7217 spec->dsp_state = DSP_DOWNLOAD_INIT;
7218 spec->curr_chip_addx = INVALID_CHIP_ADDRESS;
7220 if (spec->quirk == QUIRK_SBZ)
7221 sbz_region2_startup(codec);
7223 snd_hda_power_up_pm(codec);
7225 ca0132_init_unsol(codec);
7226 ca0132_init_params(codec);
7227 ca0132_init_flags(codec);
7229 snd_hda_sequence_write(codec, spec->base_init_verbs);
7231 if (spec->use_alt_functions)
7232 ca0132_alt_init(codec);
7234 ca0132_download_dsp(codec);
7236 ca0132_refresh_widget_caps(codec);
7238 if (spec->quirk == QUIRK_SBZ)
7239 writew(0x0107, spec->mem_base + 0x320);
7241 switch (spec->quirk) {
7243 r3di_setup_defaults(codec);
7248 ca0132_setup_defaults(codec);
7249 ca0132_init_analog_mic2(codec);
7250 ca0132_init_dmic(codec);
7254 for (i = 0; i < spec->num_outputs; i++)
7255 init_output(codec, spec->out_pins[i], spec->dacs[0]);
7257 init_output(codec, cfg->dig_out_pins[0], spec->dig_out);
7259 for (i = 0; i < spec->num_inputs; i++)
7260 init_input(codec, spec->input_pins[i], spec->adcs[i]);
7262 init_input(codec, cfg->dig_in_pin, spec->dig_in);
7264 if (!spec->use_alt_functions) {
7265 snd_hda_sequence_write(codec, spec->chip_init_verbs);
7266 snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
7267 VENDOR_CHIPIO_PARAM_EX_ID_SET, 0x0D);
7268 snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
7269 VENDOR_CHIPIO_PARAM_EX_VALUE_SET, 0x20);
7272 if (spec->quirk == QUIRK_SBZ)
7273 ca0132_gpio_setup(codec);
7275 snd_hda_sequence_write(codec, spec->spec_init_verbs);
7276 switch (spec->quirk) {
7278 sbz_setup_defaults(codec);
7279 ca0132_alt_select_out(codec);
7280 ca0132_alt_select_in(codec);
7283 ca0132_alt_select_out(codec);
7284 ca0132_alt_select_in(codec);
7287 ca0132_select_out(codec);
7288 ca0132_select_mic(codec);
7292 snd_hda_jack_report_sync(codec);
7295 * Re set the PlayEnhancement switch on a resume event, because the
7296 * controls will not be reloaded.
7298 if (spec->dsp_reload) {
7299 spec->dsp_reload = false;
7300 ca0132_pe_switch_set(codec);
7303 snd_hda_power_down_pm(codec);
7308 static void ca0132_free(struct hda_codec *codec)
7310 struct ca0132_spec *spec = codec->spec;
7312 cancel_delayed_work_sync(&spec->unsol_hp_work);
7313 snd_hda_power_up(codec);
7314 switch (spec->quirk) {
7316 sbz_exit_chip(codec);
7319 r3di_gpio_shutdown(codec);
7320 snd_hda_sequence_write(codec, spec->base_exit_verbs);
7321 ca0132_exit_chip(codec);
7324 snd_hda_sequence_write(codec, spec->base_exit_verbs);
7325 ca0132_exit_chip(codec);
7328 snd_hda_power_down(codec);
7330 iounmap(spec->mem_base);
7331 kfree(spec->spec_init_verbs);
7335 static void ca0132_reboot_notify(struct hda_codec *codec)
7337 codec->patch_ops.free(codec);
7340 static const struct hda_codec_ops ca0132_patch_ops = {
7341 .build_controls = ca0132_build_controls,
7342 .build_pcms = ca0132_build_pcms,
7343 .init = ca0132_init,
7344 .free = ca0132_free,
7345 .unsol_event = snd_hda_jack_unsol_event,
7346 .reboot_notify = ca0132_reboot_notify,
7349 static void ca0132_config(struct hda_codec *codec)
7351 struct ca0132_spec *spec = codec->spec;
7353 spec->dacs[0] = 0x2;
7354 spec->dacs[1] = 0x3;
7355 spec->dacs[2] = 0x4;
7357 spec->multiout.dac_nids = spec->dacs;
7358 spec->multiout.num_dacs = 3;
7360 if (!spec->use_alt_functions)
7361 spec->multiout.max_channels = 2;
7363 spec->multiout.max_channels = 6;
7365 switch (spec->quirk) {
7366 case QUIRK_ALIENWARE:
7367 codec_dbg(codec, "ca0132_config: QUIRK_ALIENWARE applied.\n");
7368 snd_hda_apply_pincfgs(codec, alienware_pincfgs);
7370 spec->num_outputs = 2;
7371 spec->out_pins[0] = 0x0b; /* speaker out */
7372 spec->out_pins[1] = 0x0f;
7373 spec->shared_out_nid = 0x2;
7374 spec->unsol_tag_hp = 0x0f;
7376 spec->adcs[0] = 0x7; /* digital mic / analog mic1 */
7377 spec->adcs[1] = 0x8; /* analog mic2 */
7378 spec->adcs[2] = 0xa; /* what u hear */
7380 spec->num_inputs = 3;
7381 spec->input_pins[0] = 0x12;
7382 spec->input_pins[1] = 0x11;
7383 spec->input_pins[2] = 0x13;
7384 spec->shared_mic_nid = 0x7;
7385 spec->unsol_tag_amic1 = 0x11;
7388 codec_dbg(codec, "%s: QUIRK_SBZ applied.\n", __func__);
7389 snd_hda_apply_pincfgs(codec, sbz_pincfgs);
7391 spec->num_outputs = 2;
7392 spec->out_pins[0] = 0x0B; /* Line out */
7393 spec->out_pins[1] = 0x0F; /* Rear headphone out */
7394 spec->out_pins[2] = 0x10; /* Front Headphone / Center/LFE*/
7395 spec->out_pins[3] = 0x11; /* Rear surround */
7396 spec->shared_out_nid = 0x2;
7397 spec->unsol_tag_hp = spec->out_pins[1];
7398 spec->unsol_tag_front_hp = spec->out_pins[2];
7400 spec->adcs[0] = 0x7; /* Rear Mic / Line-in */
7401 spec->adcs[1] = 0x8; /* Front Mic, but only if no DSP */
7402 spec->adcs[2] = 0xa; /* what u hear */
7404 spec->num_inputs = 2;
7405 spec->input_pins[0] = 0x12; /* Rear Mic / Line-in */
7406 spec->input_pins[1] = 0x13; /* What U Hear */
7407 spec->shared_mic_nid = 0x7;
7408 spec->unsol_tag_amic1 = spec->input_pins[0];
7411 spec->dig_out = 0x05;
7412 spec->multiout.dig_out_nid = spec->dig_out;
7413 spec->dig_in = 0x09;
7416 codec_dbg(codec, "%s: QUIRK_R3DI applied.\n", __func__);
7417 snd_hda_apply_pincfgs(codec, r3di_pincfgs);
7419 spec->num_outputs = 2;
7420 spec->out_pins[0] = 0x0B; /* Line out */
7421 spec->out_pins[1] = 0x0F; /* Rear headphone out */
7422 spec->out_pins[2] = 0x10; /* Front Headphone / Center/LFE*/
7423 spec->out_pins[3] = 0x11; /* Rear surround */
7424 spec->shared_out_nid = 0x2;
7425 spec->unsol_tag_hp = spec->out_pins[1];
7426 spec->unsol_tag_front_hp = spec->out_pins[2];
7428 spec->adcs[0] = 0x07; /* Rear Mic / Line-in */
7429 spec->adcs[1] = 0x08; /* Front Mic, but only if no DSP */
7430 spec->adcs[2] = 0x0a; /* what u hear */
7432 spec->num_inputs = 2;
7433 spec->input_pins[0] = 0x12; /* Rear Mic / Line-in */
7434 spec->input_pins[1] = 0x13; /* What U Hear */
7435 spec->shared_mic_nid = 0x7;
7436 spec->unsol_tag_amic1 = spec->input_pins[0];
7439 spec->dig_out = 0x05;
7440 spec->multiout.dig_out_nid = spec->dig_out;
7443 spec->num_outputs = 2;
7444 spec->out_pins[0] = 0x0b; /* speaker out */
7445 spec->out_pins[1] = 0x10; /* headphone out */
7446 spec->shared_out_nid = 0x2;
7447 spec->unsol_tag_hp = spec->out_pins[1];
7449 spec->adcs[0] = 0x7; /* digital mic / analog mic1 */
7450 spec->adcs[1] = 0x8; /* analog mic2 */
7451 spec->adcs[2] = 0xa; /* what u hear */
7453 spec->num_inputs = 3;
7454 spec->input_pins[0] = 0x12;
7455 spec->input_pins[1] = 0x11;
7456 spec->input_pins[2] = 0x13;
7457 spec->shared_mic_nid = 0x7;
7458 spec->unsol_tag_amic1 = spec->input_pins[0];
7461 spec->dig_out = 0x05;
7462 spec->multiout.dig_out_nid = spec->dig_out;
7463 spec->dig_in = 0x09;
7468 static int ca0132_prepare_verbs(struct hda_codec *codec)
7470 /* Verbs + terminator (an empty element) */
7471 #define NUM_SPEC_VERBS 2
7472 struct ca0132_spec *spec = codec->spec;
7474 spec->chip_init_verbs = ca0132_init_verbs0;
7475 if (spec->quirk == QUIRK_SBZ)
7476 spec->sbz_init_verbs = sbz_init_verbs;
7477 spec->spec_init_verbs = kcalloc(NUM_SPEC_VERBS,
7478 sizeof(struct hda_verb),
7480 if (!spec->spec_init_verbs)
7484 spec->spec_init_verbs[0].nid = 0x0b;
7485 spec->spec_init_verbs[0].param = 0x78D;
7486 spec->spec_init_verbs[0].verb = 0x00;
7488 /* Previously commented configuration */
7490 spec->spec_init_verbs[2].nid = 0x0b;
7491 spec->spec_init_verbs[2].param = AC_VERB_SET_EAPD_BTLENABLE;
7492 spec->spec_init_verbs[2].verb = 0x02;
7494 spec->spec_init_verbs[3].nid = 0x10;
7495 spec->spec_init_verbs[3].param = 0x78D;
7496 spec->spec_init_verbs[3].verb = 0x02;
7498 spec->spec_init_verbs[4].nid = 0x10;
7499 spec->spec_init_verbs[4].param = AC_VERB_SET_EAPD_BTLENABLE;
7500 spec->spec_init_verbs[4].verb = 0x02;
7503 /* Terminator: spec->spec_init_verbs[NUM_SPEC_VERBS-1] */
7507 static int patch_ca0132(struct hda_codec *codec)
7509 struct ca0132_spec *spec;
7511 const struct snd_pci_quirk *quirk;
7513 codec_dbg(codec, "patch_ca0132\n");
7515 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
7519 spec->codec = codec;
7521 codec->patch_ops = ca0132_patch_ops;
7522 codec->pcm_format_first = 1;
7523 codec->no_sticky_stream = 1;
7525 /* Detect codec quirk */
7526 quirk = snd_pci_quirk_lookup(codec->bus->pci, ca0132_quirks);
7528 spec->quirk = quirk->value;
7530 spec->quirk = QUIRK_NONE;
7532 /* Setup BAR Region 2 for Sound Blaster Z */
7533 if (spec->quirk == QUIRK_SBZ) {
7534 spec->mem_base = pci_iomap(codec->bus->pci, 2, 0xC20);
7535 if (spec->mem_base == NULL) {
7536 codec_warn(codec, "pci_iomap failed!");
7537 codec_info(codec, "perhaps this is not an SBZ?");
7538 spec->quirk = QUIRK_NONE;
7542 spec->dsp_state = DSP_DOWNLOAD_INIT;
7543 spec->num_mixers = 1;
7545 /* Set which mixers each quirk uses. */
7546 switch (spec->quirk) {
7548 spec->mixers[0] = sbz_mixer;
7549 snd_hda_codec_set_name(codec, "Sound Blaster Z");
7552 spec->mixers[0] = r3di_mixer;
7553 snd_hda_codec_set_name(codec, "Recon3Di");
7556 spec->mixers[0] = ca0132_mixer;
7560 /* Setup whether or not to use alt functions/controls */
7561 switch (spec->quirk) {
7564 spec->use_alt_controls = true;
7565 spec->use_alt_functions = true;
7568 spec->use_alt_controls = false;
7569 spec->use_alt_functions = false;
7573 spec->base_init_verbs = ca0132_base_init_verbs;
7574 spec->base_exit_verbs = ca0132_base_exit_verbs;
7576 INIT_DELAYED_WORK(&spec->unsol_hp_work, ca0132_unsol_hp_delayed);
7578 ca0132_init_chip(codec);
7580 ca0132_config(codec);
7582 err = ca0132_prepare_verbs(codec);
7586 err = snd_hda_parse_pin_def_config(codec, &spec->autocfg, NULL);
7600 static struct hda_device_id snd_hda_id_ca0132[] = {
7601 HDA_CODEC_ENTRY(0x11020011, "CA0132", patch_ca0132),
7604 MODULE_DEVICE_TABLE(hdaudio, snd_hda_id_ca0132);
7606 MODULE_LICENSE("GPL");
7607 MODULE_DESCRIPTION("Creative Sound Core3D codec");
7609 static struct hda_codec_driver ca0132_driver = {
7610 .id = snd_hda_id_ca0132,
7613 module_hda_codec_driver(ca0132_driver);