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 <sound/core.h>
31 #include "hda_codec.h"
32 #include "hda_local.h"
33 #include "hda_auto_parser.h"
36 #include "ca0132_regs.h"
38 /* Enable this to see controls for tuning purpose. */
39 /*#define ENABLE_TUNING_CONTROLS*/
41 #define FLOAT_ZERO 0x00000000
42 #define FLOAT_ONE 0x3f800000
43 #define FLOAT_TWO 0x40000000
44 #define FLOAT_MINUS_5 0xc0a00000
46 #define UNSOL_TAG_HP 0x10
47 #define UNSOL_TAG_AMIC1 0x12
48 #define UNSOL_TAG_DSP 0x16
50 #define DSP_DMA_WRITE_BUFLEN_INIT (1UL<<18)
51 #define DSP_DMA_WRITE_BUFLEN_OVLY (1UL<<15)
53 #define DMA_TRANSFER_FRAME_SIZE_NWORDS 8
54 #define DMA_TRANSFER_MAX_FRAME_SIZE_NWORDS 32
55 #define DMA_OVERLAY_FRAME_SIZE_NWORDS 2
57 #define MASTERCONTROL 0x80
58 #define MASTERCONTROL_ALLOC_DMA_CHAN 10
59 #define MASTERCONTROL_QUERY_SPEAKER_EQ_ADDRESS 60
61 #define WIDGET_CHIP_CTRL 0x15
62 #define WIDGET_DSP_CTRL 0x16
64 #define MEM_CONNID_MICIN1 3
65 #define MEM_CONNID_MICIN2 5
66 #define MEM_CONNID_MICOUT1 12
67 #define MEM_CONNID_MICOUT2 14
68 #define MEM_CONNID_WUH 10
69 #define MEM_CONNID_DSP 16
70 #define MEM_CONNID_DMIC 100
75 #define EFX_FILE "ctefx.bin"
77 #ifdef CONFIG_SND_HDA_CODEC_CA0132_DSP
78 MODULE_FIRMWARE(EFX_FILE);
81 static char *dirstr[2] = { "Playback", "Capture" };
94 #define VNODE_START_NID 0x80
95 VNID_SPK = VNODE_START_NID, /* Speaker vnid */
102 #define VNODES_COUNT (VNODE_END_NID - VNODE_START_NID)
104 #define EFFECT_START_NID 0x90
105 #define OUT_EFFECT_START_NID EFFECT_START_NID
106 SURROUND = OUT_EFFECT_START_NID,
113 #define OUT_EFFECTS_COUNT (OUT_EFFECT_END_NID - OUT_EFFECT_START_NID)
115 #define IN_EFFECT_START_NID OUT_EFFECT_END_NID
116 ECHO_CANCELLATION = IN_EFFECT_START_NID,
121 #define IN_EFFECTS_COUNT (IN_EFFECT_END_NID - IN_EFFECT_START_NID)
123 VOICEFX = IN_EFFECT_END_NID,
127 #define EFFECTS_COUNT (EFFECT_END_NID - EFFECT_START_NID)
130 /* Effects values size*/
131 #define EFFECT_VALS_MAX_COUNT 12
133 /* Latency introduced by DSP blocks in milliseconds. */
134 #define DSP_CAPTURE_INIT_LATENCY 0
135 #define DSP_CRYSTAL_VOICE_LATENCY 124
136 #define DSP_PLAYBACK_INIT_LATENCY 13
137 #define DSP_PLAY_ENHANCEMENT_LATENCY 30
138 #define DSP_SPEAKER_OUT_LATENCY 7
141 char name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
143 int mid; /*effect module ID*/
144 int reqs[EFFECT_VALS_MAX_COUNT]; /*effect module request*/
145 int direct; /* 0:output; 1:input*/
146 int params; /* number of default non-on/off params */
147 /*effect default values, 1st is on/off. */
148 unsigned int def_vals[EFFECT_VALS_MAX_COUNT];
151 #define EFX_DIR_OUT 0
154 static struct ct_effect ca0132_effects[EFFECTS_COUNT] = {
155 { .name = "Surround",
159 .direct = EFX_DIR_OUT,
161 .def_vals = {0x3F800000, 0x3F2B851F}
163 { .name = "Crystalizer",
167 .direct = EFX_DIR_OUT,
169 .def_vals = {0x3F800000, 0x3F266666}
171 { .name = "Dialog Plus",
175 .direct = EFX_DIR_OUT,
177 .def_vals = {0x00000000, 0x3F000000}
179 { .name = "Smart Volume",
183 .direct = EFX_DIR_OUT,
185 .def_vals = {0x3F800000, 0x3F3D70A4, 0x00000000}
190 .reqs = {24, 23, 25},
191 .direct = EFX_DIR_OUT,
193 .def_vals = {0x3F800000, 0x42A00000, 0x3F000000}
195 { .name = "Equalizer",
198 .reqs = {9, 10, 11, 12, 13, 14,
199 15, 16, 17, 18, 19, 20},
200 .direct = EFX_DIR_OUT,
202 .def_vals = {0x00000000, 0x00000000, 0x00000000, 0x00000000,
203 0x00000000, 0x00000000, 0x00000000, 0x00000000,
204 0x00000000, 0x00000000, 0x00000000, 0x00000000}
206 { .name = "Echo Cancellation",
207 .nid = ECHO_CANCELLATION,
209 .reqs = {0, 1, 2, 3},
210 .direct = EFX_DIR_IN,
212 .def_vals = {0x00000000, 0x3F3A9692, 0x00000000, 0x00000000}
214 { .name = "Voice Focus",
217 .reqs = {6, 7, 8, 9},
218 .direct = EFX_DIR_IN,
220 .def_vals = {0x3F800000, 0x3D7DF3B6, 0x41F00000, 0x41F00000}
226 .direct = EFX_DIR_IN,
228 .def_vals = {0x00000000, 0x3F3D70A4}
230 { .name = "Noise Reduction",
231 .nid = NOISE_REDUCTION,
234 .direct = EFX_DIR_IN,
236 .def_vals = {0x3F800000, 0x3F000000}
241 .reqs = {10, 11, 12, 13, 14, 15, 16, 17, 18},
242 .direct = EFX_DIR_IN,
244 .def_vals = {0x00000000, 0x43C80000, 0x44AF0000, 0x44FA0000,
245 0x3F800000, 0x3F800000, 0x3F800000, 0x00000000,
250 /* Tuning controls */
251 #ifdef ENABLE_TUNING_CONTROLS
254 #define TUNING_CTL_START_NID 0xC0
255 WEDGE_ANGLE = TUNING_CTL_START_NID,
268 #define TUNING_CTLS_COUNT (TUNING_CTL_END_NID - TUNING_CTL_START_NID)
271 struct ct_tuning_ctl {
272 char name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
273 hda_nid_t parent_nid;
275 int mid; /*effect module ID*/
276 int req; /*effect module request*/
277 int direct; /* 0:output; 1:input*/
278 unsigned int def_val;/*effect default values*/
281 static struct ct_tuning_ctl ca0132_tuning_ctls[] = {
282 { .name = "Wedge Angle",
283 .parent_nid = VOICE_FOCUS,
287 .direct = EFX_DIR_IN,
288 .def_val = 0x41F00000
290 { .name = "SVM Level",
291 .parent_nid = MIC_SVM,
295 .direct = EFX_DIR_IN,
296 .def_val = 0x3F3D70A4
298 { .name = "EQ Band0",
299 .parent_nid = EQUALIZER,
300 .nid = EQUALIZER_BAND_0,
303 .direct = EFX_DIR_OUT,
304 .def_val = 0x00000000
306 { .name = "EQ Band1",
307 .parent_nid = EQUALIZER,
308 .nid = EQUALIZER_BAND_1,
311 .direct = EFX_DIR_OUT,
312 .def_val = 0x00000000
314 { .name = "EQ Band2",
315 .parent_nid = EQUALIZER,
316 .nid = EQUALIZER_BAND_2,
319 .direct = EFX_DIR_OUT,
320 .def_val = 0x00000000
322 { .name = "EQ Band3",
323 .parent_nid = EQUALIZER,
324 .nid = EQUALIZER_BAND_3,
327 .direct = EFX_DIR_OUT,
328 .def_val = 0x00000000
330 { .name = "EQ Band4",
331 .parent_nid = EQUALIZER,
332 .nid = EQUALIZER_BAND_4,
335 .direct = EFX_DIR_OUT,
336 .def_val = 0x00000000
338 { .name = "EQ Band5",
339 .parent_nid = EQUALIZER,
340 .nid = EQUALIZER_BAND_5,
343 .direct = EFX_DIR_OUT,
344 .def_val = 0x00000000
346 { .name = "EQ Band6",
347 .parent_nid = EQUALIZER,
348 .nid = EQUALIZER_BAND_6,
351 .direct = EFX_DIR_OUT,
352 .def_val = 0x00000000
354 { .name = "EQ Band7",
355 .parent_nid = EQUALIZER,
356 .nid = EQUALIZER_BAND_7,
359 .direct = EFX_DIR_OUT,
360 .def_val = 0x00000000
362 { .name = "EQ Band8",
363 .parent_nid = EQUALIZER,
364 .nid = EQUALIZER_BAND_8,
367 .direct = EFX_DIR_OUT,
368 .def_val = 0x00000000
370 { .name = "EQ Band9",
371 .parent_nid = EQUALIZER,
372 .nid = EQUALIZER_BAND_9,
375 .direct = EFX_DIR_OUT,
376 .def_val = 0x00000000
381 /* Voice FX Presets */
382 #define VOICEFX_MAX_PARAM_COUNT 9
388 int reqs[VOICEFX_MAX_PARAM_COUNT]; /*effect module request*/
391 struct ct_voicefx_preset {
392 char *name; /*preset name*/
393 unsigned int vals[VOICEFX_MAX_PARAM_COUNT];
396 static struct ct_voicefx ca0132_voicefx = {
397 .name = "VoiceFX Capture Switch",
400 .reqs = {10, 11, 12, 13, 14, 15, 16, 17, 18}
403 static struct ct_voicefx_preset ca0132_voicefx_presets[] = {
405 .vals = { 0x00000000, 0x43C80000, 0x44AF0000,
406 0x44FA0000, 0x3F800000, 0x3F800000,
407 0x3F800000, 0x00000000, 0x00000000 }
409 { .name = "Female2Male",
410 .vals = { 0x3F800000, 0x43C80000, 0x44AF0000,
411 0x44FA0000, 0x3F19999A, 0x3F866666,
412 0x3F800000, 0x00000000, 0x00000000 }
414 { .name = "Male2Female",
415 .vals = { 0x3F800000, 0x43C80000, 0x44AF0000,
416 0x450AC000, 0x4017AE14, 0x3F6B851F,
417 0x3F800000, 0x00000000, 0x00000000 }
419 { .name = "ScrappyKid",
420 .vals = { 0x3F800000, 0x43C80000, 0x44AF0000,
421 0x44FA0000, 0x40400000, 0x3F28F5C3,
422 0x3F800000, 0x00000000, 0x00000000 }
425 .vals = { 0x3F800000, 0x44324000, 0x44BB8000,
426 0x44E10000, 0x3FB33333, 0x3FB9999A,
427 0x3F800000, 0x3E3A2E43, 0x00000000 }
430 .vals = { 0x3F800000, 0x43EA0000, 0x44A52000,
431 0x45098000, 0x3F266666, 0x3FC00000,
432 0x3F800000, 0x00000000, 0x00000000 }
435 .vals = { 0x3F800000, 0x43C70000, 0x44AE6000,
436 0x45193000, 0x3F8E147B, 0x3F75C28F,
437 0x3F800000, 0x00000000, 0x00000000 }
440 .vals = { 0x3F800000, 0x43930000, 0x44BEE000,
441 0x45007000, 0x3F451EB8, 0x3F7851EC,
442 0x3F800000, 0x00000000, 0x00000000 }
444 { .name = "AlienBrute",
445 .vals = { 0x3F800000, 0x43BFC5AC, 0x44B28FDF,
446 0x451F6000, 0x3F266666, 0x3FA7D945,
447 0x3F800000, 0x3CF5C28F, 0x00000000 }
450 .vals = { 0x3F800000, 0x43C80000, 0x44AF0000,
451 0x44FA0000, 0x3FB2718B, 0x3F800000,
452 0xBC07010E, 0x00000000, 0x00000000 }
455 .vals = { 0x3F800000, 0x43C20000, 0x44906000,
456 0x44E70000, 0x3F4CCCCD, 0x3F8A3D71,
457 0x3F0A3D71, 0x00000000, 0x00000000 }
460 .vals = { 0x3F800000, 0x43C80000, 0x44AF0000,
461 0x44FA0000, 0x3F800000, 0x3F800000,
462 0x3E4CCCCD, 0x00000000, 0x00000000 }
464 { .name = "DeepVoice",
465 .vals = { 0x3F800000, 0x43A9C5AC, 0x44AA4FDF,
466 0x44FFC000, 0x3EDBB56F, 0x3F99C4CA,
467 0x3F800000, 0x00000000, 0x00000000 }
469 { .name = "Munchkin",
470 .vals = { 0x3F800000, 0x43C80000, 0x44AF0000,
471 0x44FA0000, 0x3F800000, 0x3F1A043C,
472 0x3F800000, 0x00000000, 0x00000000 }
476 enum hda_cmd_vendor_io {
478 VENDOR_DSPIO_SCP_WRITE_DATA_LOW = 0x000,
479 VENDOR_DSPIO_SCP_WRITE_DATA_HIGH = 0x100,
481 VENDOR_DSPIO_STATUS = 0xF01,
482 VENDOR_DSPIO_SCP_POST_READ_DATA = 0x702,
483 VENDOR_DSPIO_SCP_READ_DATA = 0xF02,
484 VENDOR_DSPIO_DSP_INIT = 0x703,
485 VENDOR_DSPIO_SCP_POST_COUNT_QUERY = 0x704,
486 VENDOR_DSPIO_SCP_READ_COUNT = 0xF04,
488 /* for ChipIO node */
489 VENDOR_CHIPIO_ADDRESS_LOW = 0x000,
490 VENDOR_CHIPIO_ADDRESS_HIGH = 0x100,
491 VENDOR_CHIPIO_STREAM_FORMAT = 0x200,
492 VENDOR_CHIPIO_DATA_LOW = 0x300,
493 VENDOR_CHIPIO_DATA_HIGH = 0x400,
495 VENDOR_CHIPIO_GET_PARAMETER = 0xF00,
496 VENDOR_CHIPIO_STATUS = 0xF01,
497 VENDOR_CHIPIO_HIC_POST_READ = 0x702,
498 VENDOR_CHIPIO_HIC_READ_DATA = 0xF03,
500 VENDOR_CHIPIO_8051_DATA_WRITE = 0x707,
501 VENDOR_CHIPIO_8051_DATA_READ = 0xF07,
503 VENDOR_CHIPIO_CT_EXTENSIONS_ENABLE = 0x70A,
504 VENDOR_CHIPIO_CT_EXTENSIONS_GET = 0xF0A,
506 VENDOR_CHIPIO_PLL_PMU_WRITE = 0x70C,
507 VENDOR_CHIPIO_PLL_PMU_READ = 0xF0C,
508 VENDOR_CHIPIO_8051_ADDRESS_LOW = 0x70D,
509 VENDOR_CHIPIO_8051_ADDRESS_HIGH = 0x70E,
510 VENDOR_CHIPIO_FLAG_SET = 0x70F,
511 VENDOR_CHIPIO_FLAGS_GET = 0xF0F,
512 VENDOR_CHIPIO_PARAM_SET = 0x710,
513 VENDOR_CHIPIO_PARAM_GET = 0xF10,
515 VENDOR_CHIPIO_PORT_ALLOC_CONFIG_SET = 0x711,
516 VENDOR_CHIPIO_PORT_ALLOC_SET = 0x712,
517 VENDOR_CHIPIO_PORT_ALLOC_GET = 0xF12,
518 VENDOR_CHIPIO_PORT_FREE_SET = 0x713,
520 VENDOR_CHIPIO_PARAM_EX_ID_GET = 0xF17,
521 VENDOR_CHIPIO_PARAM_EX_ID_SET = 0x717,
522 VENDOR_CHIPIO_PARAM_EX_VALUE_GET = 0xF18,
523 VENDOR_CHIPIO_PARAM_EX_VALUE_SET = 0x718,
525 VENDOR_CHIPIO_DMIC_CTL_SET = 0x788,
526 VENDOR_CHIPIO_DMIC_CTL_GET = 0xF88,
527 VENDOR_CHIPIO_DMIC_PIN_SET = 0x789,
528 VENDOR_CHIPIO_DMIC_PIN_GET = 0xF89,
529 VENDOR_CHIPIO_DMIC_MCLK_SET = 0x78A,
530 VENDOR_CHIPIO_DMIC_MCLK_GET = 0xF8A,
532 VENDOR_CHIPIO_EAPD_SEL_SET = 0x78D
538 enum control_flag_id {
539 /* Connection manager stream setup is bypassed/enabled */
540 CONTROL_FLAG_C_MGR = 0,
541 /* DSP DMA is bypassed/enabled */
542 CONTROL_FLAG_DMA = 1,
543 /* 8051 'idle' mode is disabled/enabled */
544 CONTROL_FLAG_IDLE_ENABLE = 2,
545 /* Tracker for the SPDIF-in path is bypassed/enabled */
546 CONTROL_FLAG_TRACKER = 3,
547 /* DigitalOut to Spdif2Out connection is disabled/enabled */
548 CONTROL_FLAG_SPDIF2OUT = 4,
549 /* Digital Microphone is disabled/enabled */
550 CONTROL_FLAG_DMIC = 5,
551 /* ADC_B rate is 48 kHz/96 kHz */
552 CONTROL_FLAG_ADC_B_96KHZ = 6,
553 /* ADC_C rate is 48 kHz/96 kHz */
554 CONTROL_FLAG_ADC_C_96KHZ = 7,
555 /* DAC rate is 48 kHz/96 kHz (affects all DACs) */
556 CONTROL_FLAG_DAC_96KHZ = 8,
557 /* DSP rate is 48 kHz/96 kHz */
558 CONTROL_FLAG_DSP_96KHZ = 9,
559 /* SRC clock is 98 MHz/196 MHz (196 MHz forces rate to 96 KHz) */
560 CONTROL_FLAG_SRC_CLOCK_196MHZ = 10,
561 /* SRC rate is 48 kHz/96 kHz (48 kHz disabled when clock is 196 MHz) */
562 CONTROL_FLAG_SRC_RATE_96KHZ = 11,
563 /* Decode Loop (DSP->SRC->DSP) is disabled/enabled */
564 CONTROL_FLAG_DECODE_LOOP = 12,
565 /* De-emphasis filter on DAC-1 disabled/enabled */
566 CONTROL_FLAG_DAC1_DEEMPHASIS = 13,
567 /* De-emphasis filter on DAC-2 disabled/enabled */
568 CONTROL_FLAG_DAC2_DEEMPHASIS = 14,
569 /* De-emphasis filter on DAC-3 disabled/enabled */
570 CONTROL_FLAG_DAC3_DEEMPHASIS = 15,
571 /* High-pass filter on ADC_B disabled/enabled */
572 CONTROL_FLAG_ADC_B_HIGH_PASS = 16,
573 /* High-pass filter on ADC_C disabled/enabled */
574 CONTROL_FLAG_ADC_C_HIGH_PASS = 17,
575 /* Common mode on Port_A disabled/enabled */
576 CONTROL_FLAG_PORT_A_COMMON_MODE = 18,
577 /* Common mode on Port_D disabled/enabled */
578 CONTROL_FLAG_PORT_D_COMMON_MODE = 19,
579 /* Impedance for ramp generator on Port_A 16 Ohm/10K Ohm */
580 CONTROL_FLAG_PORT_A_10KOHM_LOAD = 20,
581 /* Impedance for ramp generator on Port_D, 16 Ohm/10K Ohm */
582 CONTROL_FLAG_PORT_D_10KOHM_LOAD = 21,
583 /* ASI rate is 48kHz/96kHz */
584 CONTROL_FLAG_ASI_96KHZ = 22,
585 /* DAC power settings able to control attached ports no/yes */
586 CONTROL_FLAG_DACS_CONTROL_PORTS = 23,
587 /* Clock Stop OK reporting is disabled/enabled */
588 CONTROL_FLAG_CONTROL_STOP_OK_ENABLE = 24,
589 /* Number of control flags */
590 CONTROL_FLAGS_MAX = (CONTROL_FLAG_CONTROL_STOP_OK_ENABLE+1)
594 * Control parameter IDs
596 enum control_param_id {
597 /* 0: None, 1: Mic1In*/
598 CONTROL_PARAM_VIP_SOURCE = 1,
599 /* 0: force HDA, 1: allow DSP if HDA Spdif1Out stream is idle */
600 CONTROL_PARAM_SPDIF1_SOURCE = 2,
601 /* Port A output stage gain setting to use when 16 Ohm output
602 * impedance is selected*/
603 CONTROL_PARAM_PORTA_160OHM_GAIN = 8,
604 /* Port D output stage gain setting to use when 16 Ohm output
605 * impedance is selected*/
606 CONTROL_PARAM_PORTD_160OHM_GAIN = 10,
610 /* Select stream with the given ID */
611 CONTROL_PARAM_STREAM_ID = 24,
612 /* Source connection point for the selected stream */
613 CONTROL_PARAM_STREAM_SOURCE_CONN_POINT = 25,
614 /* Destination connection point for the selected stream */
615 CONTROL_PARAM_STREAM_DEST_CONN_POINT = 26,
616 /* Number of audio channels in the selected stream */
617 CONTROL_PARAM_STREAMS_CHANNELS = 27,
618 /*Enable control for the selected stream */
619 CONTROL_PARAM_STREAM_CONTROL = 28,
621 /* Connection Point Control */
623 /* Select connection point with the given ID */
624 CONTROL_PARAM_CONN_POINT_ID = 29,
625 /* Connection point sample rate */
626 CONTROL_PARAM_CONN_POINT_SAMPLE_RATE = 30,
630 /* Select HDA node with the given ID */
631 CONTROL_PARAM_NODE_ID = 31
635 * Dsp Io Status codes
637 enum hda_vendor_status_dspio {
639 VENDOR_STATUS_DSPIO_OK = 0x00,
640 /* Busy, unable to accept new command, the host must retry */
641 VENDOR_STATUS_DSPIO_BUSY = 0x01,
642 /* SCP command queue is full */
643 VENDOR_STATUS_DSPIO_SCP_COMMAND_QUEUE_FULL = 0x02,
644 /* SCP response queue is empty */
645 VENDOR_STATUS_DSPIO_SCP_RESPONSE_QUEUE_EMPTY = 0x03
649 * Chip Io Status codes
651 enum hda_vendor_status_chipio {
653 VENDOR_STATUS_CHIPIO_OK = 0x00,
654 /* Busy, unable to accept new command, the host must retry */
655 VENDOR_STATUS_CHIPIO_BUSY = 0x01
661 enum ca0132_sample_rate {
681 SR_RATE_UNKNOWN = 0x1F
684 enum dsp_download_state {
685 DSP_DOWNLOAD_FAILED = -1,
686 DSP_DOWNLOAD_INIT = 0,
691 /* retrieve parameters from hda format */
692 #define get_hdafmt_chs(fmt) (fmt & 0xf)
693 #define get_hdafmt_bits(fmt) ((fmt >> 4) & 0x7)
694 #define get_hdafmt_rate(fmt) ((fmt >> 8) & 0x7f)
695 #define get_hdafmt_type(fmt) ((fmt >> 15) & 0x1)
702 struct snd_kcontrol_new *mixers[5];
703 unsigned int num_mixers;
704 const struct hda_verb *base_init_verbs;
705 const struct hda_verb *base_exit_verbs;
706 const struct hda_verb *init_verbs[5];
707 unsigned int num_init_verbs; /* exclude base init verbs */
708 struct auto_pin_cfg autocfg;
710 /* Nodes configurations */
711 struct hda_multi_out multiout;
712 hda_nid_t out_pins[AUTO_CFG_MAX_OUTS];
713 hda_nid_t dacs[AUTO_CFG_MAX_OUTS];
714 unsigned int num_outputs;
715 hda_nid_t input_pins[AUTO_PIN_LAST];
716 hda_nid_t adcs[AUTO_PIN_LAST];
719 unsigned int num_inputs;
720 hda_nid_t shared_mic_nid;
721 hda_nid_t shared_out_nid;
724 struct mutex chipio_mutex; /* chip access mutex */
727 /* DSP download related */
728 enum dsp_download_state dsp_state;
729 unsigned int dsp_stream_id;
730 unsigned int wait_scp;
731 unsigned int wait_scp_header;
732 unsigned int wait_num_data;
733 unsigned int scp_resp_header;
734 unsigned int scp_resp_data[4];
735 unsigned int scp_resp_count;
737 /* mixer and effects related */
738 unsigned char dmic_ctl;
741 long vnode_lvol[VNODES_COUNT];
742 long vnode_rvol[VNODES_COUNT];
743 long vnode_lswitch[VNODES_COUNT];
744 long vnode_rswitch[VNODES_COUNT];
745 long effects_switch[EFFECTS_COUNT];
749 struct hda_codec *codec;
750 struct delayed_work unsol_hp_work;
752 #ifdef ENABLE_TUNING_CONTROLS
753 long cur_ctl_vals[TUNING_CTLS_COUNT];
758 * CA0132 codec access
760 static unsigned int codec_send_command(struct hda_codec *codec, hda_nid_t nid,
761 unsigned int verb, unsigned int parm, unsigned int *res)
763 unsigned int response;
764 response = snd_hda_codec_read(codec, nid, 0, verb, parm);
767 return ((response == -1) ? -1 : 0);
770 static int codec_set_converter_format(struct hda_codec *codec, hda_nid_t nid,
771 unsigned short converter_format, unsigned int *res)
773 return codec_send_command(codec, nid, VENDOR_CHIPIO_STREAM_FORMAT,
774 converter_format & 0xffff, res);
777 static int codec_set_converter_stream_channel(struct hda_codec *codec,
778 hda_nid_t nid, unsigned char stream,
779 unsigned char channel, unsigned int *res)
781 unsigned char converter_stream_channel = 0;
783 converter_stream_channel = (stream << 4) | (channel & 0x0f);
784 return codec_send_command(codec, nid, AC_VERB_SET_CHANNEL_STREAMID,
785 converter_stream_channel, res);
788 /* Chip access helper function */
789 static int chipio_send(struct hda_codec *codec,
794 unsigned long timeout = jiffies + msecs_to_jiffies(1000);
796 /* send bits of data specified by reg */
798 res = snd_hda_codec_read(codec, WIDGET_CHIP_CTRL, 0,
800 if (res == VENDOR_STATUS_CHIPIO_OK)
803 } while (time_before(jiffies, timeout));
809 * Write chip address through the vendor widget -- NOT protected by the Mutex!
811 static int chipio_write_address(struct hda_codec *codec,
812 unsigned int chip_addx)
814 struct ca0132_spec *spec = codec->spec;
817 if (spec->curr_chip_addx == chip_addx)
820 /* send low 16 bits of the address */
821 res = chipio_send(codec, VENDOR_CHIPIO_ADDRESS_LOW,
825 /* send high 16 bits of the address */
826 res = chipio_send(codec, VENDOR_CHIPIO_ADDRESS_HIGH,
830 spec->curr_chip_addx = (res < 0) ? ~0UL : chip_addx;
836 * Write data through the vendor widget -- NOT protected by the Mutex!
838 static int chipio_write_data(struct hda_codec *codec, unsigned int data)
840 struct ca0132_spec *spec = codec->spec;
843 /* send low 16 bits of the data */
844 res = chipio_send(codec, VENDOR_CHIPIO_DATA_LOW, data & 0xffff);
847 /* send high 16 bits of the data */
848 res = chipio_send(codec, VENDOR_CHIPIO_DATA_HIGH,
852 /*If no error encountered, automatically increment the address
853 as per chip behaviour*/
854 spec->curr_chip_addx = (res != -EIO) ?
855 (spec->curr_chip_addx + 4) : ~0UL;
860 * Write multiple data through the vendor widget -- NOT protected by the Mutex!
862 static int chipio_write_data_multiple(struct hda_codec *codec,
869 codec_dbg(codec, "chipio_write_data null ptr\n");
873 while ((count-- != 0) && (status == 0))
874 status = chipio_write_data(codec, *data++);
881 * Read data through the vendor widget -- NOT protected by the Mutex!
883 static int chipio_read_data(struct hda_codec *codec, unsigned int *data)
885 struct ca0132_spec *spec = codec->spec;
889 res = chipio_send(codec, VENDOR_CHIPIO_HIC_POST_READ, 0);
893 res = chipio_send(codec, VENDOR_CHIPIO_STATUS, 0);
898 *data = snd_hda_codec_read(codec, WIDGET_CHIP_CTRL, 0,
899 VENDOR_CHIPIO_HIC_READ_DATA,
903 /*If no error encountered, automatically increment the address
904 as per chip behaviour*/
905 spec->curr_chip_addx = (res != -EIO) ?
906 (spec->curr_chip_addx + 4) : ~0UL;
911 * Write given value to the given address through the chip I/O widget.
912 * protected by the Mutex
914 static int chipio_write(struct hda_codec *codec,
915 unsigned int chip_addx, const unsigned int data)
917 struct ca0132_spec *spec = codec->spec;
920 mutex_lock(&spec->chipio_mutex);
922 /* write the address, and if successful proceed to write data */
923 err = chipio_write_address(codec, chip_addx);
927 err = chipio_write_data(codec, data);
932 mutex_unlock(&spec->chipio_mutex);
937 * Write multiple values to the given address through the chip I/O widget.
938 * protected by the Mutex
940 static int chipio_write_multiple(struct hda_codec *codec,
945 struct ca0132_spec *spec = codec->spec;
948 mutex_lock(&spec->chipio_mutex);
949 status = chipio_write_address(codec, chip_addx);
953 status = chipio_write_data_multiple(codec, data, count);
955 mutex_unlock(&spec->chipio_mutex);
961 * Read the given address through the chip I/O widget
962 * protected by the Mutex
964 static int chipio_read(struct hda_codec *codec,
965 unsigned int chip_addx, unsigned int *data)
967 struct ca0132_spec *spec = codec->spec;
970 mutex_lock(&spec->chipio_mutex);
972 /* write the address, and if successful proceed to write data */
973 err = chipio_write_address(codec, chip_addx);
977 err = chipio_read_data(codec, data);
982 mutex_unlock(&spec->chipio_mutex);
987 * Set chip control flags through the chip I/O widget.
989 static void chipio_set_control_flag(struct hda_codec *codec,
990 enum control_flag_id flag_id,
994 unsigned int flag_bit;
996 flag_bit = (flag_state ? 1 : 0);
997 val = (flag_bit << 7) | (flag_id);
998 snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
999 VENDOR_CHIPIO_FLAG_SET, val);
1003 * Set chip parameters through the chip I/O widget.
1005 static void chipio_set_control_param(struct hda_codec *codec,
1006 enum control_param_id param_id, int param_val)
1008 struct ca0132_spec *spec = codec->spec;
1011 if ((param_id < 32) && (param_val < 8)) {
1012 val = (param_val << 5) | (param_id);
1013 snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
1014 VENDOR_CHIPIO_PARAM_SET, val);
1016 mutex_lock(&spec->chipio_mutex);
1017 if (chipio_send(codec, VENDOR_CHIPIO_STATUS, 0) == 0) {
1018 snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
1019 VENDOR_CHIPIO_PARAM_EX_ID_SET,
1021 snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
1022 VENDOR_CHIPIO_PARAM_EX_VALUE_SET,
1025 mutex_unlock(&spec->chipio_mutex);
1030 * Set sampling rate of the connection point.
1032 static void chipio_set_conn_rate(struct hda_codec *codec,
1033 int connid, enum ca0132_sample_rate rate)
1035 chipio_set_control_param(codec, CONTROL_PARAM_CONN_POINT_ID, connid);
1036 chipio_set_control_param(codec, CONTROL_PARAM_CONN_POINT_SAMPLE_RATE,
1043 static void chipio_enable_clocks(struct hda_codec *codec)
1045 struct ca0132_spec *spec = codec->spec;
1047 mutex_lock(&spec->chipio_mutex);
1048 snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
1049 VENDOR_CHIPIO_8051_ADDRESS_LOW, 0);
1050 snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
1051 VENDOR_CHIPIO_PLL_PMU_WRITE, 0xff);
1052 snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
1053 VENDOR_CHIPIO_8051_ADDRESS_LOW, 5);
1054 snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
1055 VENDOR_CHIPIO_PLL_PMU_WRITE, 0x0b);
1056 snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
1057 VENDOR_CHIPIO_8051_ADDRESS_LOW, 6);
1058 snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
1059 VENDOR_CHIPIO_PLL_PMU_WRITE, 0xff);
1060 mutex_unlock(&spec->chipio_mutex);
1064 * CA0132 DSP IO stuffs
1066 static int dspio_send(struct hda_codec *codec, unsigned int reg,
1070 unsigned long timeout = jiffies + msecs_to_jiffies(1000);
1072 /* send bits of data specified by reg to dsp */
1074 res = snd_hda_codec_read(codec, WIDGET_DSP_CTRL, 0, reg, data);
1075 if ((res >= 0) && (res != VENDOR_STATUS_DSPIO_BUSY))
1078 } while (time_before(jiffies, timeout));
1084 * Wait for DSP to be ready for commands
1086 static void dspio_write_wait(struct hda_codec *codec)
1089 unsigned long timeout = jiffies + msecs_to_jiffies(1000);
1092 status = snd_hda_codec_read(codec, WIDGET_DSP_CTRL, 0,
1093 VENDOR_DSPIO_STATUS, 0);
1094 if ((status == VENDOR_STATUS_DSPIO_OK) ||
1095 (status == VENDOR_STATUS_DSPIO_SCP_RESPONSE_QUEUE_EMPTY))
1098 } while (time_before(jiffies, timeout));
1102 * Write SCP data to DSP
1104 static int dspio_write(struct hda_codec *codec, unsigned int scp_data)
1106 struct ca0132_spec *spec = codec->spec;
1109 dspio_write_wait(codec);
1111 mutex_lock(&spec->chipio_mutex);
1112 status = dspio_send(codec, VENDOR_DSPIO_SCP_WRITE_DATA_LOW,
1117 status = dspio_send(codec, VENDOR_DSPIO_SCP_WRITE_DATA_HIGH,
1122 /* OK, now check if the write itself has executed*/
1123 status = snd_hda_codec_read(codec, WIDGET_DSP_CTRL, 0,
1124 VENDOR_DSPIO_STATUS, 0);
1126 mutex_unlock(&spec->chipio_mutex);
1128 return (status == VENDOR_STATUS_DSPIO_SCP_COMMAND_QUEUE_FULL) ?
1133 * Write multiple SCP data to DSP
1135 static int dspio_write_multiple(struct hda_codec *codec,
1136 unsigned int *buffer, unsigned int size)
1141 if ((buffer == NULL))
1145 while (count < size) {
1146 status = dspio_write(codec, *buffer++);
1155 static int dspio_read(struct hda_codec *codec, unsigned int *data)
1159 status = dspio_send(codec, VENDOR_DSPIO_SCP_POST_READ_DATA, 0);
1163 status = dspio_send(codec, VENDOR_DSPIO_STATUS, 0);
1164 if (status == -EIO ||
1165 status == VENDOR_STATUS_DSPIO_SCP_RESPONSE_QUEUE_EMPTY)
1168 *data = snd_hda_codec_read(codec, WIDGET_DSP_CTRL, 0,
1169 VENDOR_DSPIO_SCP_READ_DATA, 0);
1174 static int dspio_read_multiple(struct hda_codec *codec, unsigned int *buffer,
1175 unsigned int *buf_size, unsigned int size_count)
1178 unsigned int size = *buf_size;
1180 unsigned int skip_count;
1183 if ((buffer == NULL))
1187 while (count < size && count < size_count) {
1188 status = dspio_read(codec, buffer++);
1196 while (skip_count < size) {
1197 status = dspio_read(codec, &dummy);
1209 * Construct the SCP header using corresponding fields
1211 static inline unsigned int
1212 make_scp_header(unsigned int target_id, unsigned int source_id,
1213 unsigned int get_flag, unsigned int req,
1214 unsigned int device_flag, unsigned int resp_flag,
1215 unsigned int error_flag, unsigned int data_size)
1217 unsigned int header = 0;
1219 header = (data_size & 0x1f) << 27;
1220 header |= (error_flag & 0x01) << 26;
1221 header |= (resp_flag & 0x01) << 25;
1222 header |= (device_flag & 0x01) << 24;
1223 header |= (req & 0x7f) << 17;
1224 header |= (get_flag & 0x01) << 16;
1225 header |= (source_id & 0xff) << 8;
1226 header |= target_id & 0xff;
1232 * Extract corresponding fields from SCP header
1235 extract_scp_header(unsigned int header,
1236 unsigned int *target_id, unsigned int *source_id,
1237 unsigned int *get_flag, unsigned int *req,
1238 unsigned int *device_flag, unsigned int *resp_flag,
1239 unsigned int *error_flag, unsigned int *data_size)
1242 *data_size = (header >> 27) & 0x1f;
1244 *error_flag = (header >> 26) & 0x01;
1246 *resp_flag = (header >> 25) & 0x01;
1248 *device_flag = (header >> 24) & 0x01;
1250 *req = (header >> 17) & 0x7f;
1252 *get_flag = (header >> 16) & 0x01;
1254 *source_id = (header >> 8) & 0xff;
1256 *target_id = header & 0xff;
1259 #define SCP_MAX_DATA_WORDS (16)
1261 /* Structure to contain any SCP message */
1264 unsigned int data[SCP_MAX_DATA_WORDS];
1267 static void dspio_clear_response_queue(struct hda_codec *codec)
1269 unsigned int dummy = 0;
1272 /* clear all from the response queue */
1274 status = dspio_read(codec, &dummy);
1275 } while (status == 0);
1278 static int dspio_get_response_data(struct hda_codec *codec)
1280 struct ca0132_spec *spec = codec->spec;
1281 unsigned int data = 0;
1284 if (dspio_read(codec, &data) < 0)
1287 if ((data & 0x00ffffff) == spec->wait_scp_header) {
1288 spec->scp_resp_header = data;
1289 spec->scp_resp_count = data >> 27;
1290 count = spec->wait_num_data;
1291 dspio_read_multiple(codec, spec->scp_resp_data,
1292 &spec->scp_resp_count, count);
1300 * Send SCP message to DSP
1302 static int dspio_send_scp_message(struct hda_codec *codec,
1303 unsigned char *send_buf,
1304 unsigned int send_buf_size,
1305 unsigned char *return_buf,
1306 unsigned int return_buf_size,
1307 unsigned int *bytes_returned)
1309 struct ca0132_spec *spec = codec->spec;
1311 unsigned int scp_send_size = 0;
1312 unsigned int total_size;
1313 bool waiting_for_resp = false;
1314 unsigned int header;
1315 struct scp_msg *ret_msg;
1316 unsigned int resp_src_id, resp_target_id;
1317 unsigned int data_size, src_id, target_id, get_flag, device_flag;
1320 *bytes_returned = 0;
1322 /* get scp header from buffer */
1323 header = *((unsigned int *)send_buf);
1324 extract_scp_header(header, &target_id, &src_id, &get_flag, NULL,
1325 &device_flag, NULL, NULL, &data_size);
1326 scp_send_size = data_size + 1;
1327 total_size = (scp_send_size * 4);
1329 if (send_buf_size < total_size)
1332 if (get_flag || device_flag) {
1333 if (!return_buf || return_buf_size < 4 || !bytes_returned)
1336 spec->wait_scp_header = *((unsigned int *)send_buf);
1338 /* swap source id with target id */
1339 resp_target_id = src_id;
1340 resp_src_id = target_id;
1341 spec->wait_scp_header &= 0xffff0000;
1342 spec->wait_scp_header |= (resp_src_id << 8) | (resp_target_id);
1343 spec->wait_num_data = return_buf_size/sizeof(unsigned int) - 1;
1345 waiting_for_resp = true;
1348 status = dspio_write_multiple(codec, (unsigned int *)send_buf,
1355 if (waiting_for_resp) {
1356 unsigned long timeout = jiffies + msecs_to_jiffies(1000);
1357 memset(return_buf, 0, return_buf_size);
1360 } while (spec->wait_scp && time_before(jiffies, timeout));
1361 waiting_for_resp = false;
1362 if (!spec->wait_scp) {
1363 ret_msg = (struct scp_msg *)return_buf;
1364 memcpy(&ret_msg->hdr, &spec->scp_resp_header, 4);
1365 memcpy(&ret_msg->data, spec->scp_resp_data,
1366 spec->wait_num_data);
1367 *bytes_returned = (spec->scp_resp_count + 1) * 4;
1379 * Prepare and send the SCP message to DSP
1380 * @codec: the HDA codec
1381 * @mod_id: ID of the DSP module to send the command
1382 * @req: ID of request to send to the DSP module
1384 * @data: pointer to the data to send with the request, request specific
1385 * @len: length of the data, in bytes
1386 * @reply: point to the buffer to hold data returned for a reply
1387 * @reply_len: length of the reply buffer returned from GET
1389 * Returns zero or a negative error code.
1391 static int dspio_scp(struct hda_codec *codec,
1392 int mod_id, int req, int dir, void *data, unsigned int len,
1393 void *reply, unsigned int *reply_len)
1396 struct scp_msg scp_send, scp_reply;
1397 unsigned int ret_bytes, send_size, ret_size;
1398 unsigned int send_get_flag, reply_resp_flag, reply_error_flag;
1399 unsigned int reply_data_size;
1401 memset(&scp_send, 0, sizeof(scp_send));
1402 memset(&scp_reply, 0, sizeof(scp_reply));
1404 if ((len != 0 && data == NULL) || (len > SCP_MAX_DATA_WORDS))
1407 if (dir == SCP_GET && reply == NULL) {
1408 codec_dbg(codec, "dspio_scp get but has no buffer\n");
1412 if (reply != NULL && (reply_len == NULL || (*reply_len == 0))) {
1413 codec_dbg(codec, "dspio_scp bad resp buf len parms\n");
1417 scp_send.hdr = make_scp_header(mod_id, 0x20, (dir == SCP_GET), req,
1418 0, 0, 0, len/sizeof(unsigned int));
1419 if (data != NULL && len > 0) {
1420 len = min((unsigned int)(sizeof(scp_send.data)), len);
1421 memcpy(scp_send.data, data, len);
1425 send_size = sizeof(unsigned int) + len;
1426 status = dspio_send_scp_message(codec, (unsigned char *)&scp_send,
1427 send_size, (unsigned char *)&scp_reply,
1428 sizeof(scp_reply), &ret_bytes);
1431 codec_dbg(codec, "dspio_scp: send scp msg failed\n");
1435 /* extract send and reply headers members */
1436 extract_scp_header(scp_send.hdr, NULL, NULL, &send_get_flag,
1437 NULL, NULL, NULL, NULL, NULL);
1438 extract_scp_header(scp_reply.hdr, NULL, NULL, NULL, NULL, NULL,
1439 &reply_resp_flag, &reply_error_flag,
1445 if (reply_resp_flag && !reply_error_flag) {
1446 ret_size = (ret_bytes - sizeof(scp_reply.hdr))
1447 / sizeof(unsigned int);
1449 if (*reply_len < ret_size*sizeof(unsigned int)) {
1450 codec_dbg(codec, "reply too long for buf\n");
1452 } else if (ret_size != reply_data_size) {
1453 codec_dbg(codec, "RetLen and HdrLen .NE.\n");
1456 *reply_len = ret_size*sizeof(unsigned int);
1457 memcpy(reply, scp_reply.data, *reply_len);
1460 codec_dbg(codec, "reply ill-formed or errflag set\n");
1468 * Set DSP parameters
1470 static int dspio_set_param(struct hda_codec *codec, int mod_id,
1471 int req, void *data, unsigned int len)
1473 return dspio_scp(codec, mod_id, req, SCP_SET, data, len, NULL, NULL);
1476 static int dspio_set_uint_param(struct hda_codec *codec, int mod_id,
1477 int req, unsigned int data)
1479 return dspio_set_param(codec, mod_id, req, &data, sizeof(unsigned int));
1483 * Allocate a DSP DMA channel via an SCP message
1485 static int dspio_alloc_dma_chan(struct hda_codec *codec, unsigned int *dma_chan)
1488 unsigned int size = sizeof(dma_chan);
1490 codec_dbg(codec, " dspio_alloc_dma_chan() -- begin\n");
1491 status = dspio_scp(codec, MASTERCONTROL, MASTERCONTROL_ALLOC_DMA_CHAN,
1492 SCP_GET, NULL, 0, dma_chan, &size);
1495 codec_dbg(codec, "dspio_alloc_dma_chan: SCP Failed\n");
1499 if ((*dma_chan + 1) == 0) {
1500 codec_dbg(codec, "no free dma channels to allocate\n");
1504 codec_dbg(codec, "dspio_alloc_dma_chan: chan=%d\n", *dma_chan);
1505 codec_dbg(codec, " dspio_alloc_dma_chan() -- complete\n");
1511 * Free a DSP DMA via an SCP message
1513 static int dspio_free_dma_chan(struct hda_codec *codec, unsigned int dma_chan)
1516 unsigned int dummy = 0;
1518 codec_dbg(codec, " dspio_free_dma_chan() -- begin\n");
1519 codec_dbg(codec, "dspio_free_dma_chan: chan=%d\n", dma_chan);
1521 status = dspio_scp(codec, MASTERCONTROL, MASTERCONTROL_ALLOC_DMA_CHAN,
1522 SCP_SET, &dma_chan, sizeof(dma_chan), NULL, &dummy);
1525 codec_dbg(codec, "dspio_free_dma_chan: SCP Failed\n");
1529 codec_dbg(codec, " dspio_free_dma_chan() -- complete\n");
1537 static int dsp_set_run_state(struct hda_codec *codec)
1539 unsigned int dbg_ctrl_reg;
1540 unsigned int halt_state;
1543 err = chipio_read(codec, DSP_DBGCNTL_INST_OFFSET, &dbg_ctrl_reg);
1547 halt_state = (dbg_ctrl_reg & DSP_DBGCNTL_STATE_MASK) >>
1548 DSP_DBGCNTL_STATE_LOBIT;
1550 if (halt_state != 0) {
1551 dbg_ctrl_reg &= ~((halt_state << DSP_DBGCNTL_SS_LOBIT) &
1552 DSP_DBGCNTL_SS_MASK);
1553 err = chipio_write(codec, DSP_DBGCNTL_INST_OFFSET,
1558 dbg_ctrl_reg |= (halt_state << DSP_DBGCNTL_EXEC_LOBIT) &
1559 DSP_DBGCNTL_EXEC_MASK;
1560 err = chipio_write(codec, DSP_DBGCNTL_INST_OFFSET,
1572 static int dsp_reset(struct hda_codec *codec)
1577 codec_dbg(codec, "dsp_reset\n");
1579 res = dspio_send(codec, VENDOR_DSPIO_DSP_INIT, 0);
1581 } while (res == -EIO && retry);
1584 codec_dbg(codec, "dsp_reset timeout\n");
1592 * Convert chip address to DSP address
1594 static unsigned int dsp_chip_to_dsp_addx(unsigned int chip_addx,
1595 bool *code, bool *yram)
1597 *code = *yram = false;
1599 if (UC_RANGE(chip_addx, 1)) {
1601 return UC_OFF(chip_addx);
1602 } else if (X_RANGE_ALL(chip_addx, 1)) {
1603 return X_OFF(chip_addx);
1604 } else if (Y_RANGE_ALL(chip_addx, 1)) {
1606 return Y_OFF(chip_addx);
1609 return INVALID_CHIP_ADDRESS;
1613 * Check if the DSP DMA is active
1615 static bool dsp_is_dma_active(struct hda_codec *codec, unsigned int dma_chan)
1617 unsigned int dma_chnlstart_reg;
1619 chipio_read(codec, DSPDMAC_CHNLSTART_INST_OFFSET, &dma_chnlstart_reg);
1621 return ((dma_chnlstart_reg & (1 <<
1622 (DSPDMAC_CHNLSTART_EN_LOBIT + dma_chan))) != 0);
1625 static int dsp_dma_setup_common(struct hda_codec *codec,
1626 unsigned int chip_addx,
1627 unsigned int dma_chan,
1628 unsigned int port_map_mask,
1632 unsigned int chnl_prop;
1633 unsigned int dsp_addx;
1634 unsigned int active;
1637 codec_dbg(codec, "-- dsp_dma_setup_common() -- Begin ---------\n");
1639 if (dma_chan >= DSPDMAC_DMA_CFG_CHANNEL_COUNT) {
1640 codec_dbg(codec, "dma chan num invalid\n");
1644 if (dsp_is_dma_active(codec, dma_chan)) {
1645 codec_dbg(codec, "dma already active\n");
1649 dsp_addx = dsp_chip_to_dsp_addx(chip_addx, &code, &yram);
1651 if (dsp_addx == INVALID_CHIP_ADDRESS) {
1652 codec_dbg(codec, "invalid chip addr\n");
1656 chnl_prop = DSPDMAC_CHNLPROP_AC_MASK;
1659 codec_dbg(codec, " dsp_dma_setup_common() start reg pgm\n");
1662 status = chipio_read(codec, DSPDMAC_CHNLPROP_INST_OFFSET,
1666 codec_dbg(codec, "read CHNLPROP Reg fail\n");
1669 codec_dbg(codec, "dsp_dma_setup_common() Read CHNLPROP\n");
1673 chnl_prop &= ~(1 << (DSPDMAC_CHNLPROP_MSPCE_LOBIT + dma_chan));
1675 chnl_prop |= (1 << (DSPDMAC_CHNLPROP_MSPCE_LOBIT + dma_chan));
1677 chnl_prop &= ~(1 << (DSPDMAC_CHNLPROP_DCON_LOBIT + dma_chan));
1679 status = chipio_write(codec, DSPDMAC_CHNLPROP_INST_OFFSET, chnl_prop);
1681 codec_dbg(codec, "write CHNLPROP Reg fail\n");
1684 codec_dbg(codec, " dsp_dma_setup_common() Write CHNLPROP\n");
1687 status = chipio_read(codec, DSPDMAC_ACTIVE_INST_OFFSET,
1691 codec_dbg(codec, "read ACTIVE Reg fail\n");
1694 codec_dbg(codec, "dsp_dma_setup_common() Read ACTIVE\n");
1697 active &= (~(1 << (DSPDMAC_ACTIVE_AAR_LOBIT + dma_chan))) &
1698 DSPDMAC_ACTIVE_AAR_MASK;
1700 status = chipio_write(codec, DSPDMAC_ACTIVE_INST_OFFSET, active);
1702 codec_dbg(codec, "write ACTIVE Reg fail\n");
1706 codec_dbg(codec, " dsp_dma_setup_common() Write ACTIVE\n");
1708 status = chipio_write(codec, DSPDMAC_AUDCHSEL_INST_OFFSET(dma_chan),
1711 codec_dbg(codec, "write AUDCHSEL Reg fail\n");
1714 codec_dbg(codec, " dsp_dma_setup_common() Write AUDCHSEL\n");
1716 status = chipio_write(codec, DSPDMAC_IRQCNT_INST_OFFSET(dma_chan),
1717 DSPDMAC_IRQCNT_BICNT_MASK | DSPDMAC_IRQCNT_CICNT_MASK);
1719 codec_dbg(codec, "write IRQCNT Reg fail\n");
1722 codec_dbg(codec, " dsp_dma_setup_common() Write IRQCNT\n");
1725 "ChipA=0x%x,DspA=0x%x,dmaCh=%u, "
1726 "CHSEL=0x%x,CHPROP=0x%x,Active=0x%x\n",
1727 chip_addx, dsp_addx, dma_chan,
1728 port_map_mask, chnl_prop, active);
1730 codec_dbg(codec, "-- dsp_dma_setup_common() -- Complete ------\n");
1736 * Setup the DSP DMA per-transfer-specific registers
1738 static int dsp_dma_setup(struct hda_codec *codec,
1739 unsigned int chip_addx,
1741 unsigned int dma_chan)
1745 unsigned int dsp_addx;
1746 unsigned int addr_field;
1747 unsigned int incr_field;
1748 unsigned int base_cnt;
1749 unsigned int cur_cnt;
1750 unsigned int dma_cfg = 0;
1751 unsigned int adr_ofs = 0;
1752 unsigned int xfr_cnt = 0;
1753 const unsigned int max_dma_count = 1 << (DSPDMAC_XFRCNT_BCNT_HIBIT -
1754 DSPDMAC_XFRCNT_BCNT_LOBIT + 1);
1756 codec_dbg(codec, "-- dsp_dma_setup() -- Begin ---------\n");
1758 if (count > max_dma_count) {
1759 codec_dbg(codec, "count too big\n");
1763 dsp_addx = dsp_chip_to_dsp_addx(chip_addx, &code, &yram);
1764 if (dsp_addx == INVALID_CHIP_ADDRESS) {
1765 codec_dbg(codec, "invalid chip addr\n");
1769 codec_dbg(codec, " dsp_dma_setup() start reg pgm\n");
1771 addr_field = dsp_addx << DSPDMAC_DMACFG_DBADR_LOBIT;
1777 addr_field |= (1 << DSPDMAC_DMACFG_DBADR_LOBIT);
1779 incr_field = (1 << DSPDMAC_DMACFG_AINCR_LOBIT);
1782 dma_cfg = addr_field + incr_field;
1783 status = chipio_write(codec, DSPDMAC_DMACFG_INST_OFFSET(dma_chan),
1786 codec_dbg(codec, "write DMACFG Reg fail\n");
1789 codec_dbg(codec, " dsp_dma_setup() Write DMACFG\n");
1791 adr_ofs = (count - 1) << (DSPDMAC_DSPADROFS_BOFS_LOBIT +
1794 status = chipio_write(codec, DSPDMAC_DSPADROFS_INST_OFFSET(dma_chan),
1797 codec_dbg(codec, "write DSPADROFS Reg fail\n");
1800 codec_dbg(codec, " dsp_dma_setup() Write DSPADROFS\n");
1802 base_cnt = (count - 1) << DSPDMAC_XFRCNT_BCNT_LOBIT;
1804 cur_cnt = (count - 1) << DSPDMAC_XFRCNT_CCNT_LOBIT;
1806 xfr_cnt = base_cnt | cur_cnt;
1808 status = chipio_write(codec,
1809 DSPDMAC_XFRCNT_INST_OFFSET(dma_chan), xfr_cnt);
1811 codec_dbg(codec, "write XFRCNT Reg fail\n");
1814 codec_dbg(codec, " dsp_dma_setup() Write XFRCNT\n");
1817 "ChipA=0x%x, cnt=0x%x, DMACFG=0x%x, "
1818 "ADROFS=0x%x, XFRCNT=0x%x\n",
1819 chip_addx, count, dma_cfg, adr_ofs, xfr_cnt);
1821 codec_dbg(codec, "-- dsp_dma_setup() -- Complete ---------\n");
1829 static int dsp_dma_start(struct hda_codec *codec,
1830 unsigned int dma_chan, bool ovly)
1832 unsigned int reg = 0;
1835 codec_dbg(codec, "-- dsp_dma_start() -- Begin ---------\n");
1838 status = chipio_read(codec,
1839 DSPDMAC_CHNLSTART_INST_OFFSET, ®);
1842 codec_dbg(codec, "read CHNLSTART reg fail\n");
1845 codec_dbg(codec, "-- dsp_dma_start() Read CHNLSTART\n");
1847 reg &= ~(DSPDMAC_CHNLSTART_EN_MASK |
1848 DSPDMAC_CHNLSTART_DIS_MASK);
1851 status = chipio_write(codec, DSPDMAC_CHNLSTART_INST_OFFSET,
1852 reg | (1 << (dma_chan + DSPDMAC_CHNLSTART_EN_LOBIT)));
1854 codec_dbg(codec, "write CHNLSTART reg fail\n");
1857 codec_dbg(codec, "-- dsp_dma_start() -- Complete ---------\n");
1865 static int dsp_dma_stop(struct hda_codec *codec,
1866 unsigned int dma_chan, bool ovly)
1868 unsigned int reg = 0;
1871 codec_dbg(codec, "-- dsp_dma_stop() -- Begin ---------\n");
1874 status = chipio_read(codec,
1875 DSPDMAC_CHNLSTART_INST_OFFSET, ®);
1878 codec_dbg(codec, "read CHNLSTART reg fail\n");
1881 codec_dbg(codec, "-- dsp_dma_stop() Read CHNLSTART\n");
1882 reg &= ~(DSPDMAC_CHNLSTART_EN_MASK |
1883 DSPDMAC_CHNLSTART_DIS_MASK);
1886 status = chipio_write(codec, DSPDMAC_CHNLSTART_INST_OFFSET,
1887 reg | (1 << (dma_chan + DSPDMAC_CHNLSTART_DIS_LOBIT)));
1889 codec_dbg(codec, "write CHNLSTART reg fail\n");
1892 codec_dbg(codec, "-- dsp_dma_stop() -- Complete ---------\n");
1898 * Allocate router ports
1900 * @codec: the HDA codec
1901 * @num_chans: number of channels in the stream
1902 * @ports_per_channel: number of ports per channel
1903 * @start_device: start device
1904 * @port_map: pointer to the port list to hold the allocated ports
1906 * Returns zero or a negative error code.
1908 static int dsp_allocate_router_ports(struct hda_codec *codec,
1909 unsigned int num_chans,
1910 unsigned int ports_per_channel,
1911 unsigned int start_device,
1912 unsigned int *port_map)
1918 status = chipio_send(codec, VENDOR_CHIPIO_STATUS, 0);
1922 val = start_device << 6;
1923 val |= (ports_per_channel - 1) << 4;
1924 val |= num_chans - 1;
1926 snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
1927 VENDOR_CHIPIO_PORT_ALLOC_CONFIG_SET,
1930 snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
1931 VENDOR_CHIPIO_PORT_ALLOC_SET,
1934 status = chipio_send(codec, VENDOR_CHIPIO_STATUS, 0);
1938 res = snd_hda_codec_read(codec, WIDGET_CHIP_CTRL, 0,
1939 VENDOR_CHIPIO_PORT_ALLOC_GET, 0);
1943 return (res < 0) ? res : 0;
1949 static int dsp_free_router_ports(struct hda_codec *codec)
1953 status = chipio_send(codec, VENDOR_CHIPIO_STATUS, 0);
1957 snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
1958 VENDOR_CHIPIO_PORT_FREE_SET,
1961 status = chipio_send(codec, VENDOR_CHIPIO_STATUS, 0);
1967 * Allocate DSP ports for the download stream
1969 static int dsp_allocate_ports(struct hda_codec *codec,
1970 unsigned int num_chans,
1971 unsigned int rate_multi, unsigned int *port_map)
1975 codec_dbg(codec, " dsp_allocate_ports() -- begin\n");
1977 if ((rate_multi != 1) && (rate_multi != 2) && (rate_multi != 4)) {
1978 codec_dbg(codec, "bad rate multiple\n");
1982 status = dsp_allocate_router_ports(codec, num_chans,
1983 rate_multi, 0, port_map);
1985 codec_dbg(codec, " dsp_allocate_ports() -- complete\n");
1990 static int dsp_allocate_ports_format(struct hda_codec *codec,
1991 const unsigned short fmt,
1992 unsigned int *port_map)
1995 unsigned int num_chans;
1997 unsigned int sample_rate_div = ((get_hdafmt_rate(fmt) >> 0) & 3) + 1;
1998 unsigned int sample_rate_mul = ((get_hdafmt_rate(fmt) >> 3) & 3) + 1;
1999 unsigned int rate_multi = sample_rate_mul / sample_rate_div;
2001 if ((rate_multi != 1) && (rate_multi != 2) && (rate_multi != 4)) {
2002 codec_dbg(codec, "bad rate multiple\n");
2006 num_chans = get_hdafmt_chs(fmt) + 1;
2008 status = dsp_allocate_ports(codec, num_chans, rate_multi, port_map);
2016 static int dsp_free_ports(struct hda_codec *codec)
2020 codec_dbg(codec, " dsp_free_ports() -- begin\n");
2022 status = dsp_free_router_ports(codec);
2024 codec_dbg(codec, "free router ports fail\n");
2027 codec_dbg(codec, " dsp_free_ports() -- complete\n");
2033 * HDA DMA engine stuffs for DSP code download
2036 struct hda_codec *codec;
2037 unsigned short m_converter_format;
2038 struct snd_dma_buffer *dmab;
2039 unsigned int buf_size;
2048 static int dma_convert_to_hda_format(struct hda_codec *codec,
2049 unsigned int sample_rate,
2050 unsigned short channels,
2051 unsigned short *hda_format)
2053 unsigned int format_val;
2055 format_val = snd_hdac_calc_stream_format(sample_rate,
2056 channels, SNDRV_PCM_FORMAT_S32_LE, 32, 0);
2059 *hda_format = (unsigned short)format_val;
2065 * Reset DMA for DSP download
2067 static int dma_reset(struct dma_engine *dma)
2069 struct hda_codec *codec = dma->codec;
2070 struct ca0132_spec *spec = codec->spec;
2073 if (dma->dmab->area)
2074 snd_hda_codec_load_dsp_cleanup(codec, dma->dmab);
2076 status = snd_hda_codec_load_dsp_prepare(codec,
2077 dma->m_converter_format,
2082 spec->dsp_stream_id = status;
2086 static int dma_set_state(struct dma_engine *dma, enum dma_state state)
2091 case DMA_STATE_STOP:
2101 snd_hda_codec_load_dsp_trigger(dma->codec, cmd);
2105 static unsigned int dma_get_buffer_size(struct dma_engine *dma)
2107 return dma->dmab->bytes;
2110 static unsigned char *dma_get_buffer_addr(struct dma_engine *dma)
2112 return dma->dmab->area;
2115 static int dma_xfer(struct dma_engine *dma,
2116 const unsigned int *data,
2119 memcpy(dma->dmab->area, data, count);
2123 static void dma_get_converter_format(
2124 struct dma_engine *dma,
2125 unsigned short *format)
2128 *format = dma->m_converter_format;
2131 static unsigned int dma_get_stream_id(struct dma_engine *dma)
2133 struct ca0132_spec *spec = dma->codec->spec;
2135 return spec->dsp_stream_id;
2138 struct dsp_image_seg {
2145 static const u32 g_magic_value = 0x4c46584d;
2146 static const u32 g_chip_addr_magic_value = 0xFFFFFF01;
2148 static bool is_valid(const struct dsp_image_seg *p)
2150 return p->magic == g_magic_value;
2153 static bool is_hci_prog_list_seg(const struct dsp_image_seg *p)
2155 return g_chip_addr_magic_value == p->chip_addr;
2158 static bool is_last(const struct dsp_image_seg *p)
2160 return p->count == 0;
2163 static size_t dsp_sizeof(const struct dsp_image_seg *p)
2165 return sizeof(*p) + p->count*sizeof(u32);
2168 static const struct dsp_image_seg *get_next_seg_ptr(
2169 const struct dsp_image_seg *p)
2171 return (struct dsp_image_seg *)((unsigned char *)(p) + dsp_sizeof(p));
2175 * CA0132 chip DSP transfer stuffs. For DSP download.
2177 #define INVALID_DMA_CHANNEL (~0U)
2180 * Program a list of address/data pairs via the ChipIO widget.
2181 * The segment data is in the format of successive pairs of words.
2182 * These are repeated as indicated by the segment's count field.
2184 static int dspxfr_hci_write(struct hda_codec *codec,
2185 const struct dsp_image_seg *fls)
2191 if (fls == NULL || fls->chip_addr != g_chip_addr_magic_value) {
2192 codec_dbg(codec, "hci_write invalid params\n");
2197 data = (u32 *)(fls->data);
2198 while (count >= 2) {
2199 status = chipio_write(codec, data[0], data[1]);
2201 codec_dbg(codec, "hci_write chipio failed\n");
2211 * Write a block of data into DSP code or data RAM using pre-allocated
2214 * @codec: the HDA codec
2215 * @fls: pointer to a fast load image
2216 * @reloc: Relocation address for loading single-segment overlays, or 0 for
2218 * @dma_engine: pointer to DMA engine to be used for DSP download
2219 * @dma_chan: The number of DMA channels used for DSP download
2220 * @port_map_mask: port mapping
2221 * @ovly: TRUE if overlay format is required
2223 * Returns zero or a negative error code.
2225 static int dspxfr_one_seg(struct hda_codec *codec,
2226 const struct dsp_image_seg *fls,
2228 struct dma_engine *dma_engine,
2229 unsigned int dma_chan,
2230 unsigned int port_map_mask,
2234 bool comm_dma_setup_done = false;
2235 const unsigned int *data;
2236 unsigned int chip_addx;
2237 unsigned int words_to_write;
2238 unsigned int buffer_size_words;
2239 unsigned char *buffer_addx;
2240 unsigned short hda_format;
2241 unsigned int sample_rate_div;
2242 unsigned int sample_rate_mul;
2243 unsigned int num_chans;
2244 unsigned int hda_frame_size_words;
2245 unsigned int remainder_words;
2246 const u32 *data_remainder;
2247 u32 chip_addx_remainder;
2248 unsigned int run_size_words;
2249 const struct dsp_image_seg *hci_write = NULL;
2250 unsigned long timeout;
2255 if (is_hci_prog_list_seg(fls)) {
2257 fls = get_next_seg_ptr(fls);
2260 if (hci_write && (!fls || is_last(fls))) {
2261 codec_dbg(codec, "hci_write\n");
2262 return dspxfr_hci_write(codec, hci_write);
2265 if (fls == NULL || dma_engine == NULL || port_map_mask == 0) {
2266 codec_dbg(codec, "Invalid Params\n");
2271 chip_addx = fls->chip_addr,
2272 words_to_write = fls->count;
2274 if (!words_to_write)
2275 return hci_write ? dspxfr_hci_write(codec, hci_write) : 0;
2277 chip_addx = (chip_addx & (0xFFFF0000 << 2)) + (reloc << 2);
2279 if (!UC_RANGE(chip_addx, words_to_write) &&
2280 !X_RANGE_ALL(chip_addx, words_to_write) &&
2281 !Y_RANGE_ALL(chip_addx, words_to_write)) {
2282 codec_dbg(codec, "Invalid chip_addx Params\n");
2286 buffer_size_words = (unsigned int)dma_get_buffer_size(dma_engine) /
2289 buffer_addx = dma_get_buffer_addr(dma_engine);
2291 if (buffer_addx == NULL) {
2292 codec_dbg(codec, "dma_engine buffer NULL\n");
2296 dma_get_converter_format(dma_engine, &hda_format);
2297 sample_rate_div = ((get_hdafmt_rate(hda_format) >> 0) & 3) + 1;
2298 sample_rate_mul = ((get_hdafmt_rate(hda_format) >> 3) & 3) + 1;
2299 num_chans = get_hdafmt_chs(hda_format) + 1;
2301 hda_frame_size_words = ((sample_rate_div == 0) ? 0 :
2302 (num_chans * sample_rate_mul / sample_rate_div));
2304 if (hda_frame_size_words == 0) {
2305 codec_dbg(codec, "frmsz zero\n");
2309 buffer_size_words = min(buffer_size_words,
2310 (unsigned int)(UC_RANGE(chip_addx, 1) ?
2312 buffer_size_words -= buffer_size_words % hda_frame_size_words;
2314 "chpadr=0x%08x frmsz=%u nchan=%u "
2315 "rate_mul=%u div=%u bufsz=%u\n",
2316 chip_addx, hda_frame_size_words, num_chans,
2317 sample_rate_mul, sample_rate_div, buffer_size_words);
2319 if (buffer_size_words < hda_frame_size_words) {
2320 codec_dbg(codec, "dspxfr_one_seg:failed\n");
2324 remainder_words = words_to_write % hda_frame_size_words;
2325 data_remainder = data;
2326 chip_addx_remainder = chip_addx;
2328 data += remainder_words;
2329 chip_addx += remainder_words*sizeof(u32);
2330 words_to_write -= remainder_words;
2332 while (words_to_write != 0) {
2333 run_size_words = min(buffer_size_words, words_to_write);
2334 codec_dbg(codec, "dspxfr (seg loop)cnt=%u rs=%u remainder=%u\n",
2335 words_to_write, run_size_words, remainder_words);
2336 dma_xfer(dma_engine, data, run_size_words*sizeof(u32));
2337 if (!comm_dma_setup_done) {
2338 status = dsp_dma_stop(codec, dma_chan, ovly);
2341 status = dsp_dma_setup_common(codec, chip_addx,
2342 dma_chan, port_map_mask, ovly);
2345 comm_dma_setup_done = true;
2348 status = dsp_dma_setup(codec, chip_addx,
2349 run_size_words, dma_chan);
2352 status = dsp_dma_start(codec, dma_chan, ovly);
2355 if (!dsp_is_dma_active(codec, dma_chan)) {
2356 codec_dbg(codec, "dspxfr:DMA did not start\n");
2359 status = dma_set_state(dma_engine, DMA_STATE_RUN);
2362 if (remainder_words != 0) {
2363 status = chipio_write_multiple(codec,
2364 chip_addx_remainder,
2369 remainder_words = 0;
2372 status = dspxfr_hci_write(codec, hci_write);
2378 timeout = jiffies + msecs_to_jiffies(2000);
2380 dma_active = dsp_is_dma_active(codec, dma_chan);
2384 } while (time_before(jiffies, timeout));
2388 codec_dbg(codec, "+++++ DMA complete\n");
2389 dma_set_state(dma_engine, DMA_STATE_STOP);
2390 status = dma_reset(dma_engine);
2395 data += run_size_words;
2396 chip_addx += run_size_words*sizeof(u32);
2397 words_to_write -= run_size_words;
2400 if (remainder_words != 0) {
2401 status = chipio_write_multiple(codec, chip_addx_remainder,
2402 data_remainder, remainder_words);
2409 * Write the entire DSP image of a DSP code/data overlay to DSP memories
2411 * @codec: the HDA codec
2412 * @fls_data: pointer to a fast load image
2413 * @reloc: Relocation address for loading single-segment overlays, or 0 for
2415 * @sample_rate: sampling rate of the stream used for DSP download
2416 * @channels: channels of the stream used for DSP download
2417 * @ovly: TRUE if overlay format is required
2419 * Returns zero or a negative error code.
2421 static int dspxfr_image(struct hda_codec *codec,
2422 const struct dsp_image_seg *fls_data,
2424 unsigned int sample_rate,
2425 unsigned short channels,
2428 struct ca0132_spec *spec = codec->spec;
2430 unsigned short hda_format = 0;
2431 unsigned int response;
2432 unsigned char stream_id = 0;
2433 struct dma_engine *dma_engine;
2434 unsigned int dma_chan;
2435 unsigned int port_map_mask;
2437 if (fls_data == NULL)
2440 dma_engine = kzalloc(sizeof(*dma_engine), GFP_KERNEL);
2444 dma_engine->dmab = kzalloc(sizeof(*dma_engine->dmab), GFP_KERNEL);
2445 if (!dma_engine->dmab) {
2450 dma_engine->codec = codec;
2451 dma_convert_to_hda_format(codec, sample_rate, channels, &hda_format);
2452 dma_engine->m_converter_format = hda_format;
2453 dma_engine->buf_size = (ovly ? DSP_DMA_WRITE_BUFLEN_OVLY :
2454 DSP_DMA_WRITE_BUFLEN_INIT) * 2;
2456 dma_chan = ovly ? INVALID_DMA_CHANNEL : 0;
2458 status = codec_set_converter_format(codec, WIDGET_CHIP_CTRL,
2459 hda_format, &response);
2462 codec_dbg(codec, "set converter format fail\n");
2466 status = snd_hda_codec_load_dsp_prepare(codec,
2467 dma_engine->m_converter_format,
2468 dma_engine->buf_size,
2472 spec->dsp_stream_id = status;
2475 status = dspio_alloc_dma_chan(codec, &dma_chan);
2477 codec_dbg(codec, "alloc dmachan fail\n");
2478 dma_chan = INVALID_DMA_CHANNEL;
2484 status = dsp_allocate_ports_format(codec, hda_format,
2487 codec_dbg(codec, "alloc ports fail\n");
2491 stream_id = dma_get_stream_id(dma_engine);
2492 status = codec_set_converter_stream_channel(codec,
2493 WIDGET_CHIP_CTRL, stream_id, 0, &response);
2495 codec_dbg(codec, "set stream chan fail\n");
2499 while ((fls_data != NULL) && !is_last(fls_data)) {
2500 if (!is_valid(fls_data)) {
2501 codec_dbg(codec, "FLS check fail\n");
2505 status = dspxfr_one_seg(codec, fls_data, reloc,
2506 dma_engine, dma_chan,
2507 port_map_mask, ovly);
2511 if (is_hci_prog_list_seg(fls_data))
2512 fls_data = get_next_seg_ptr(fls_data);
2514 if ((fls_data != NULL) && !is_last(fls_data))
2515 fls_data = get_next_seg_ptr(fls_data);
2518 if (port_map_mask != 0)
2519 status = dsp_free_ports(codec);
2524 status = codec_set_converter_stream_channel(codec,
2525 WIDGET_CHIP_CTRL, 0, 0, &response);
2528 if (ovly && (dma_chan != INVALID_DMA_CHANNEL))
2529 dspio_free_dma_chan(codec, dma_chan);
2531 if (dma_engine->dmab->area)
2532 snd_hda_codec_load_dsp_cleanup(codec, dma_engine->dmab);
2533 kfree(dma_engine->dmab);
2540 * CA0132 DSP download stuffs.
2542 static void dspload_post_setup(struct hda_codec *codec)
2544 codec_dbg(codec, "---- dspload_post_setup ------\n");
2546 /*set DSP speaker to 2.0 configuration*/
2547 chipio_write(codec, XRAM_XRAM_INST_OFFSET(0x18), 0x08080080);
2548 chipio_write(codec, XRAM_XRAM_INST_OFFSET(0x19), 0x3f800000);
2550 /*update write pointer*/
2551 chipio_write(codec, XRAM_XRAM_INST_OFFSET(0x29), 0x00000002);
2555 * dspload_image - Download DSP from a DSP Image Fast Load structure.
2557 * @codec: the HDA codec
2558 * @fls: pointer to a fast load image
2559 * @ovly: TRUE if overlay format is required
2560 * @reloc: Relocation address for loading single-segment overlays, or 0 for
2562 * @autostart: TRUE if DSP starts after loading; ignored if ovly is TRUE
2563 * @router_chans: number of audio router channels to be allocated (0 means use
2564 * internal defaults; max is 32)
2566 * Download DSP from a DSP Image Fast Load structure. This structure is a
2567 * linear, non-constant sized element array of structures, each of which
2568 * contain the count of the data to be loaded, the data itself, and the
2569 * corresponding starting chip address of the starting data location.
2570 * Returns zero or a negative error code.
2572 static int dspload_image(struct hda_codec *codec,
2573 const struct dsp_image_seg *fls,
2580 unsigned int sample_rate;
2581 unsigned short channels;
2583 codec_dbg(codec, "---- dspload_image begin ------\n");
2584 if (router_chans == 0) {
2586 router_chans = DMA_TRANSFER_FRAME_SIZE_NWORDS;
2588 router_chans = DMA_OVERLAY_FRAME_SIZE_NWORDS;
2591 sample_rate = 48000;
2592 channels = (unsigned short)router_chans;
2594 while (channels > 16) {
2600 codec_dbg(codec, "Ready to program DMA\n");
2602 status = dsp_reset(codec);
2607 codec_dbg(codec, "dsp_reset() complete\n");
2608 status = dspxfr_image(codec, fls, reloc, sample_rate, channels,
2614 codec_dbg(codec, "dspxfr_image() complete\n");
2615 if (autostart && !ovly) {
2616 dspload_post_setup(codec);
2617 status = dsp_set_run_state(codec);
2620 codec_dbg(codec, "LOAD FINISHED\n");
2626 #ifdef CONFIG_SND_HDA_CODEC_CA0132_DSP
2627 static bool dspload_is_loaded(struct hda_codec *codec)
2629 unsigned int data = 0;
2632 status = chipio_read(codec, 0x40004, &data);
2633 if ((status < 0) || (data != 1))
2639 #define dspload_is_loaded(codec) false
2642 static bool dspload_wait_loaded(struct hda_codec *codec)
2644 unsigned long timeout = jiffies + msecs_to_jiffies(2000);
2647 if (dspload_is_loaded(codec)) {
2648 pr_info("ca0132 DOWNLOAD OK :-) DSP IS RUNNING.\n");
2652 } while (time_before(jiffies, timeout));
2654 pr_err("ca0132 DOWNLOAD FAILED!!! DSP IS NOT RUNNING.\n");
2661 static int ca0132_playback_pcm_prepare(struct hda_pcm_stream *hinfo,
2662 struct hda_codec *codec,
2663 unsigned int stream_tag,
2664 unsigned int format,
2665 struct snd_pcm_substream *substream)
2667 struct ca0132_spec *spec = codec->spec;
2669 snd_hda_codec_setup_stream(codec, spec->dacs[0], stream_tag, 0, format);
2674 static int ca0132_playback_pcm_cleanup(struct hda_pcm_stream *hinfo,
2675 struct hda_codec *codec,
2676 struct snd_pcm_substream *substream)
2678 struct ca0132_spec *spec = codec->spec;
2680 if (spec->dsp_state == DSP_DOWNLOADING)
2683 /*If Playback effects are on, allow stream some time to flush
2685 if (spec->effects_switch[PLAY_ENHANCEMENT - EFFECT_START_NID])
2688 snd_hda_codec_cleanup_stream(codec, spec->dacs[0]);
2693 static unsigned int ca0132_playback_pcm_delay(struct hda_pcm_stream *info,
2694 struct hda_codec *codec,
2695 struct snd_pcm_substream *substream)
2697 struct ca0132_spec *spec = codec->spec;
2698 unsigned int latency = DSP_PLAYBACK_INIT_LATENCY;
2699 struct snd_pcm_runtime *runtime = substream->runtime;
2701 if (spec->dsp_state != DSP_DOWNLOADED)
2704 /* Add latency if playback enhancement and either effect is enabled. */
2705 if (spec->effects_switch[PLAY_ENHANCEMENT - EFFECT_START_NID]) {
2706 if ((spec->effects_switch[SURROUND - EFFECT_START_NID]) ||
2707 (spec->effects_switch[DIALOG_PLUS - EFFECT_START_NID]))
2708 latency += DSP_PLAY_ENHANCEMENT_LATENCY;
2711 /* Applying Speaker EQ adds latency as well. */
2712 if (spec->cur_out_type == SPEAKER_OUT)
2713 latency += DSP_SPEAKER_OUT_LATENCY;
2715 return (latency * runtime->rate) / 1000;
2721 static int ca0132_dig_playback_pcm_open(struct hda_pcm_stream *hinfo,
2722 struct hda_codec *codec,
2723 struct snd_pcm_substream *substream)
2725 struct ca0132_spec *spec = codec->spec;
2726 return snd_hda_multi_out_dig_open(codec, &spec->multiout);
2729 static int ca0132_dig_playback_pcm_prepare(struct hda_pcm_stream *hinfo,
2730 struct hda_codec *codec,
2731 unsigned int stream_tag,
2732 unsigned int format,
2733 struct snd_pcm_substream *substream)
2735 struct ca0132_spec *spec = codec->spec;
2736 return snd_hda_multi_out_dig_prepare(codec, &spec->multiout,
2737 stream_tag, format, substream);
2740 static int ca0132_dig_playback_pcm_cleanup(struct hda_pcm_stream *hinfo,
2741 struct hda_codec *codec,
2742 struct snd_pcm_substream *substream)
2744 struct ca0132_spec *spec = codec->spec;
2745 return snd_hda_multi_out_dig_cleanup(codec, &spec->multiout);
2748 static int ca0132_dig_playback_pcm_close(struct hda_pcm_stream *hinfo,
2749 struct hda_codec *codec,
2750 struct snd_pcm_substream *substream)
2752 struct ca0132_spec *spec = codec->spec;
2753 return snd_hda_multi_out_dig_close(codec, &spec->multiout);
2759 static int ca0132_capture_pcm_prepare(struct hda_pcm_stream *hinfo,
2760 struct hda_codec *codec,
2761 unsigned int stream_tag,
2762 unsigned int format,
2763 struct snd_pcm_substream *substream)
2765 snd_hda_codec_setup_stream(codec, hinfo->nid,
2766 stream_tag, 0, format);
2771 static int ca0132_capture_pcm_cleanup(struct hda_pcm_stream *hinfo,
2772 struct hda_codec *codec,
2773 struct snd_pcm_substream *substream)
2775 struct ca0132_spec *spec = codec->spec;
2777 if (spec->dsp_state == DSP_DOWNLOADING)
2780 snd_hda_codec_cleanup_stream(codec, hinfo->nid);
2784 static unsigned int ca0132_capture_pcm_delay(struct hda_pcm_stream *info,
2785 struct hda_codec *codec,
2786 struct snd_pcm_substream *substream)
2788 struct ca0132_spec *spec = codec->spec;
2789 unsigned int latency = DSP_CAPTURE_INIT_LATENCY;
2790 struct snd_pcm_runtime *runtime = substream->runtime;
2792 if (spec->dsp_state != DSP_DOWNLOADED)
2795 if (spec->effects_switch[CRYSTAL_VOICE - EFFECT_START_NID])
2796 latency += DSP_CRYSTAL_VOICE_LATENCY;
2798 return (latency * runtime->rate) / 1000;
2806 * Mixer controls helpers.
2808 #define CA0132_CODEC_VOL_MONO(xname, nid, channel, dir) \
2809 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2811 .subdevice = HDA_SUBDEV_AMP_FLAG, \
2812 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE | \
2813 SNDRV_CTL_ELEM_ACCESS_TLV_READ | \
2814 SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK, \
2815 .info = ca0132_volume_info, \
2816 .get = ca0132_volume_get, \
2817 .put = ca0132_volume_put, \
2818 .tlv = { .c = ca0132_volume_tlv }, \
2819 .private_value = HDA_COMPOSE_AMP_VAL(nid, channel, 0, dir) }
2821 #define CA0132_CODEC_MUTE_MONO(xname, nid, channel, dir) \
2822 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2824 .subdevice = HDA_SUBDEV_AMP_FLAG, \
2825 .info = snd_hda_mixer_amp_switch_info, \
2826 .get = ca0132_switch_get, \
2827 .put = ca0132_switch_put, \
2828 .private_value = HDA_COMPOSE_AMP_VAL(nid, channel, 0, dir) }
2831 #define CA0132_CODEC_VOL(xname, nid, dir) \
2832 CA0132_CODEC_VOL_MONO(xname, nid, 3, dir)
2833 #define CA0132_CODEC_MUTE(xname, nid, dir) \
2834 CA0132_CODEC_MUTE_MONO(xname, nid, 3, dir)
2836 /* The followings are for tuning of products */
2837 #ifdef ENABLE_TUNING_CONTROLS
2839 static unsigned int voice_focus_vals_lookup[] = {
2840 0x41A00000, 0x41A80000, 0x41B00000, 0x41B80000, 0x41C00000, 0x41C80000,
2841 0x41D00000, 0x41D80000, 0x41E00000, 0x41E80000, 0x41F00000, 0x41F80000,
2842 0x42000000, 0x42040000, 0x42080000, 0x420C0000, 0x42100000, 0x42140000,
2843 0x42180000, 0x421C0000, 0x42200000, 0x42240000, 0x42280000, 0x422C0000,
2844 0x42300000, 0x42340000, 0x42380000, 0x423C0000, 0x42400000, 0x42440000,
2845 0x42480000, 0x424C0000, 0x42500000, 0x42540000, 0x42580000, 0x425C0000,
2846 0x42600000, 0x42640000, 0x42680000, 0x426C0000, 0x42700000, 0x42740000,
2847 0x42780000, 0x427C0000, 0x42800000, 0x42820000, 0x42840000, 0x42860000,
2848 0x42880000, 0x428A0000, 0x428C0000, 0x428E0000, 0x42900000, 0x42920000,
2849 0x42940000, 0x42960000, 0x42980000, 0x429A0000, 0x429C0000, 0x429E0000,
2850 0x42A00000, 0x42A20000, 0x42A40000, 0x42A60000, 0x42A80000, 0x42AA0000,
2851 0x42AC0000, 0x42AE0000, 0x42B00000, 0x42B20000, 0x42B40000, 0x42B60000,
2852 0x42B80000, 0x42BA0000, 0x42BC0000, 0x42BE0000, 0x42C00000, 0x42C20000,
2853 0x42C40000, 0x42C60000, 0x42C80000, 0x42CA0000, 0x42CC0000, 0x42CE0000,
2854 0x42D00000, 0x42D20000, 0x42D40000, 0x42D60000, 0x42D80000, 0x42DA0000,
2855 0x42DC0000, 0x42DE0000, 0x42E00000, 0x42E20000, 0x42E40000, 0x42E60000,
2856 0x42E80000, 0x42EA0000, 0x42EC0000, 0x42EE0000, 0x42F00000, 0x42F20000,
2857 0x42F40000, 0x42F60000, 0x42F80000, 0x42FA0000, 0x42FC0000, 0x42FE0000,
2858 0x43000000, 0x43010000, 0x43020000, 0x43030000, 0x43040000, 0x43050000,
2859 0x43060000, 0x43070000, 0x43080000, 0x43090000, 0x430A0000, 0x430B0000,
2860 0x430C0000, 0x430D0000, 0x430E0000, 0x430F0000, 0x43100000, 0x43110000,
2861 0x43120000, 0x43130000, 0x43140000, 0x43150000, 0x43160000, 0x43170000,
2862 0x43180000, 0x43190000, 0x431A0000, 0x431B0000, 0x431C0000, 0x431D0000,
2863 0x431E0000, 0x431F0000, 0x43200000, 0x43210000, 0x43220000, 0x43230000,
2864 0x43240000, 0x43250000, 0x43260000, 0x43270000, 0x43280000, 0x43290000,
2865 0x432A0000, 0x432B0000, 0x432C0000, 0x432D0000, 0x432E0000, 0x432F0000,
2866 0x43300000, 0x43310000, 0x43320000, 0x43330000, 0x43340000
2869 static unsigned int mic_svm_vals_lookup[] = {
2870 0x00000000, 0x3C23D70A, 0x3CA3D70A, 0x3CF5C28F, 0x3D23D70A, 0x3D4CCCCD,
2871 0x3D75C28F, 0x3D8F5C29, 0x3DA3D70A, 0x3DB851EC, 0x3DCCCCCD, 0x3DE147AE,
2872 0x3DF5C28F, 0x3E051EB8, 0x3E0F5C29, 0x3E19999A, 0x3E23D70A, 0x3E2E147B,
2873 0x3E3851EC, 0x3E428F5C, 0x3E4CCCCD, 0x3E570A3D, 0x3E6147AE, 0x3E6B851F,
2874 0x3E75C28F, 0x3E800000, 0x3E851EB8, 0x3E8A3D71, 0x3E8F5C29, 0x3E947AE1,
2875 0x3E99999A, 0x3E9EB852, 0x3EA3D70A, 0x3EA8F5C3, 0x3EAE147B, 0x3EB33333,
2876 0x3EB851EC, 0x3EBD70A4, 0x3EC28F5C, 0x3EC7AE14, 0x3ECCCCCD, 0x3ED1EB85,
2877 0x3ED70A3D, 0x3EDC28F6, 0x3EE147AE, 0x3EE66666, 0x3EEB851F, 0x3EF0A3D7,
2878 0x3EF5C28F, 0x3EFAE148, 0x3F000000, 0x3F028F5C, 0x3F051EB8, 0x3F07AE14,
2879 0x3F0A3D71, 0x3F0CCCCD, 0x3F0F5C29, 0x3F11EB85, 0x3F147AE1, 0x3F170A3D,
2880 0x3F19999A, 0x3F1C28F6, 0x3F1EB852, 0x3F2147AE, 0x3F23D70A, 0x3F266666,
2881 0x3F28F5C3, 0x3F2B851F, 0x3F2E147B, 0x3F30A3D7, 0x3F333333, 0x3F35C28F,
2882 0x3F3851EC, 0x3F3AE148, 0x3F3D70A4, 0x3F400000, 0x3F428F5C, 0x3F451EB8,
2883 0x3F47AE14, 0x3F4A3D71, 0x3F4CCCCD, 0x3F4F5C29, 0x3F51EB85, 0x3F547AE1,
2884 0x3F570A3D, 0x3F59999A, 0x3F5C28F6, 0x3F5EB852, 0x3F6147AE, 0x3F63D70A,
2885 0x3F666666, 0x3F68F5C3, 0x3F6B851F, 0x3F6E147B, 0x3F70A3D7, 0x3F733333,
2886 0x3F75C28F, 0x3F7851EC, 0x3F7AE148, 0x3F7D70A4, 0x3F800000
2889 static unsigned int equalizer_vals_lookup[] = {
2890 0xC1C00000, 0xC1B80000, 0xC1B00000, 0xC1A80000, 0xC1A00000, 0xC1980000,
2891 0xC1900000, 0xC1880000, 0xC1800000, 0xC1700000, 0xC1600000, 0xC1500000,
2892 0xC1400000, 0xC1300000, 0xC1200000, 0xC1100000, 0xC1000000, 0xC0E00000,
2893 0xC0C00000, 0xC0A00000, 0xC0800000, 0xC0400000, 0xC0000000, 0xBF800000,
2894 0x00000000, 0x3F800000, 0x40000000, 0x40400000, 0x40800000, 0x40A00000,
2895 0x40C00000, 0x40E00000, 0x41000000, 0x41100000, 0x41200000, 0x41300000,
2896 0x41400000, 0x41500000, 0x41600000, 0x41700000, 0x41800000, 0x41880000,
2897 0x41900000, 0x41980000, 0x41A00000, 0x41A80000, 0x41B00000, 0x41B80000,
2901 static int tuning_ctl_set(struct hda_codec *codec, hda_nid_t nid,
2902 unsigned int *lookup, int idx)
2906 for (i = 0; i < TUNING_CTLS_COUNT; i++)
2907 if (nid == ca0132_tuning_ctls[i].nid)
2910 snd_hda_power_up(codec);
2911 dspio_set_param(codec, ca0132_tuning_ctls[i].mid,
2912 ca0132_tuning_ctls[i].req,
2913 &(lookup[idx]), sizeof(unsigned int));
2914 snd_hda_power_down(codec);
2919 static int tuning_ctl_get(struct snd_kcontrol *kcontrol,
2920 struct snd_ctl_elem_value *ucontrol)
2922 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2923 struct ca0132_spec *spec = codec->spec;
2924 hda_nid_t nid = get_amp_nid(kcontrol);
2925 long *valp = ucontrol->value.integer.value;
2926 int idx = nid - TUNING_CTL_START_NID;
2928 *valp = spec->cur_ctl_vals[idx];
2932 static int voice_focus_ctl_info(struct snd_kcontrol *kcontrol,
2933 struct snd_ctl_elem_info *uinfo)
2935 int chs = get_amp_channels(kcontrol);
2936 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
2937 uinfo->count = chs == 3 ? 2 : 1;
2938 uinfo->value.integer.min = 20;
2939 uinfo->value.integer.max = 180;
2940 uinfo->value.integer.step = 1;
2945 static int voice_focus_ctl_put(struct snd_kcontrol *kcontrol,
2946 struct snd_ctl_elem_value *ucontrol)
2948 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2949 struct ca0132_spec *spec = codec->spec;
2950 hda_nid_t nid = get_amp_nid(kcontrol);
2951 long *valp = ucontrol->value.integer.value;
2954 idx = nid - TUNING_CTL_START_NID;
2956 if (spec->cur_ctl_vals[idx] == *valp)
2959 spec->cur_ctl_vals[idx] = *valp;
2962 tuning_ctl_set(codec, nid, voice_focus_vals_lookup, idx);
2967 static int mic_svm_ctl_info(struct snd_kcontrol *kcontrol,
2968 struct snd_ctl_elem_info *uinfo)
2970 int chs = get_amp_channels(kcontrol);
2971 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
2972 uinfo->count = chs == 3 ? 2 : 1;
2973 uinfo->value.integer.min = 0;
2974 uinfo->value.integer.max = 100;
2975 uinfo->value.integer.step = 1;
2980 static int mic_svm_ctl_put(struct snd_kcontrol *kcontrol,
2981 struct snd_ctl_elem_value *ucontrol)
2983 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2984 struct ca0132_spec *spec = codec->spec;
2985 hda_nid_t nid = get_amp_nid(kcontrol);
2986 long *valp = ucontrol->value.integer.value;
2989 idx = nid - TUNING_CTL_START_NID;
2991 if (spec->cur_ctl_vals[idx] == *valp)
2994 spec->cur_ctl_vals[idx] = *valp;
2997 tuning_ctl_set(codec, nid, mic_svm_vals_lookup, idx);
3002 static int equalizer_ctl_info(struct snd_kcontrol *kcontrol,
3003 struct snd_ctl_elem_info *uinfo)
3005 int chs = get_amp_channels(kcontrol);
3006 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
3007 uinfo->count = chs == 3 ? 2 : 1;
3008 uinfo->value.integer.min = 0;
3009 uinfo->value.integer.max = 48;
3010 uinfo->value.integer.step = 1;
3015 static int equalizer_ctl_put(struct snd_kcontrol *kcontrol,
3016 struct snd_ctl_elem_value *ucontrol)
3018 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
3019 struct ca0132_spec *spec = codec->spec;
3020 hda_nid_t nid = get_amp_nid(kcontrol);
3021 long *valp = ucontrol->value.integer.value;
3024 idx = nid - TUNING_CTL_START_NID;
3026 if (spec->cur_ctl_vals[idx] == *valp)
3029 spec->cur_ctl_vals[idx] = *valp;
3032 tuning_ctl_set(codec, nid, equalizer_vals_lookup, idx);
3037 static const DECLARE_TLV_DB_SCALE(voice_focus_db_scale, 2000, 100, 0);
3038 static const DECLARE_TLV_DB_SCALE(eq_db_scale, -2400, 100, 0);
3040 static int add_tuning_control(struct hda_codec *codec,
3041 hda_nid_t pnid, hda_nid_t nid,
3042 const char *name, int dir)
3044 char namestr[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
3045 int type = dir ? HDA_INPUT : HDA_OUTPUT;
3046 struct snd_kcontrol_new knew =
3047 HDA_CODEC_VOLUME_MONO(namestr, nid, 1, 0, type);
3049 knew.access = SNDRV_CTL_ELEM_ACCESS_READWRITE |
3050 SNDRV_CTL_ELEM_ACCESS_TLV_READ;
3055 knew.info = voice_focus_ctl_info;
3056 knew.get = tuning_ctl_get;
3057 knew.put = voice_focus_ctl_put;
3058 knew.tlv.p = voice_focus_db_scale;
3061 knew.info = mic_svm_ctl_info;
3062 knew.get = tuning_ctl_get;
3063 knew.put = mic_svm_ctl_put;
3066 knew.info = equalizer_ctl_info;
3067 knew.get = tuning_ctl_get;
3068 knew.put = equalizer_ctl_put;
3069 knew.tlv.p = eq_db_scale;
3074 knew.private_value =
3075 HDA_COMPOSE_AMP_VAL(nid, 1, 0, type);
3076 sprintf(namestr, "%s %s Volume", name, dirstr[dir]);
3077 return snd_hda_ctl_add(codec, nid, snd_ctl_new1(&knew, codec));
3080 static int add_tuning_ctls(struct hda_codec *codec)
3085 for (i = 0; i < TUNING_CTLS_COUNT; i++) {
3086 err = add_tuning_control(codec,
3087 ca0132_tuning_ctls[i].parent_nid,
3088 ca0132_tuning_ctls[i].nid,
3089 ca0132_tuning_ctls[i].name,
3090 ca0132_tuning_ctls[i].direct);
3098 static void ca0132_init_tuning_defaults(struct hda_codec *codec)
3100 struct ca0132_spec *spec = codec->spec;
3103 /* Wedge Angle defaults to 30. 10 below is 30 - 20. 20 is min. */
3104 spec->cur_ctl_vals[WEDGE_ANGLE - TUNING_CTL_START_NID] = 10;
3105 /* SVM level defaults to 0.74. */
3106 spec->cur_ctl_vals[SVM_LEVEL - TUNING_CTL_START_NID] = 74;
3108 /* EQ defaults to 0dB. */
3109 for (i = 2; i < TUNING_CTLS_COUNT; i++)
3110 spec->cur_ctl_vals[i] = 24;
3112 #endif /*ENABLE_TUNING_CONTROLS*/
3115 * Select the active output.
3116 * If autodetect is enabled, output will be selected based on jack detection.
3117 * If jack inserted, headphone will be selected, else built-in speakers
3118 * If autodetect is disabled, output will be selected based on selection.
3120 static int ca0132_select_out(struct hda_codec *codec)
3122 struct ca0132_spec *spec = codec->spec;
3123 unsigned int pin_ctl;
3129 codec_dbg(codec, "ca0132_select_out\n");
3131 snd_hda_power_up_pm(codec);
3133 auto_jack = spec->vnode_lswitch[VNID_HP_ASEL - VNODE_START_NID];
3136 jack_present = snd_hda_jack_detect(codec, spec->out_pins[1]);
3139 spec->vnode_lswitch[VNID_HP_SEL - VNODE_START_NID];
3142 spec->cur_out_type = HEADPHONE_OUT;
3144 spec->cur_out_type = SPEAKER_OUT;
3146 if (spec->cur_out_type == SPEAKER_OUT) {
3147 codec_dbg(codec, "ca0132_select_out speaker\n");
3148 /*speaker out config*/
3150 err = dspio_set_uint_param(codec, 0x80, 0x04, tmp);
3153 /*enable speaker EQ*/
3155 err = dspio_set_uint_param(codec, 0x8f, 0x00, tmp);
3160 snd_hda_codec_write(codec, spec->out_pins[1], 0,
3161 VENDOR_CHIPIO_EAPD_SEL_SET, 0x02);
3162 snd_hda_codec_write(codec, spec->out_pins[0], 0,
3163 AC_VERB_SET_EAPD_BTLENABLE, 0x00);
3164 snd_hda_codec_write(codec, spec->out_pins[0], 0,
3165 VENDOR_CHIPIO_EAPD_SEL_SET, 0x00);
3166 snd_hda_codec_write(codec, spec->out_pins[0], 0,
3167 AC_VERB_SET_EAPD_BTLENABLE, 0x02);
3169 /* disable headphone node */
3170 pin_ctl = snd_hda_codec_read(codec, spec->out_pins[1], 0,
3171 AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
3172 snd_hda_set_pin_ctl(codec, spec->out_pins[1],
3174 /* enable speaker node */
3175 pin_ctl = snd_hda_codec_read(codec, spec->out_pins[0], 0,
3176 AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
3177 snd_hda_set_pin_ctl(codec, spec->out_pins[0],
3180 codec_dbg(codec, "ca0132_select_out hp\n");
3181 /*headphone out config*/
3183 err = dspio_set_uint_param(codec, 0x80, 0x04, tmp);
3186 /*disable speaker EQ*/
3188 err = dspio_set_uint_param(codec, 0x8f, 0x00, tmp);
3193 snd_hda_codec_write(codec, spec->out_pins[0], 0,
3194 VENDOR_CHIPIO_EAPD_SEL_SET, 0x00);
3195 snd_hda_codec_write(codec, spec->out_pins[0], 0,
3196 AC_VERB_SET_EAPD_BTLENABLE, 0x00);
3197 snd_hda_codec_write(codec, spec->out_pins[1], 0,
3198 VENDOR_CHIPIO_EAPD_SEL_SET, 0x02);
3199 snd_hda_codec_write(codec, spec->out_pins[0], 0,
3200 AC_VERB_SET_EAPD_BTLENABLE, 0x02);
3202 /* disable speaker*/
3203 pin_ctl = snd_hda_codec_read(codec, spec->out_pins[0], 0,
3204 AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
3205 snd_hda_set_pin_ctl(codec, spec->out_pins[0],
3207 /* enable headphone*/
3208 pin_ctl = snd_hda_codec_read(codec, spec->out_pins[1], 0,
3209 AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
3210 snd_hda_set_pin_ctl(codec, spec->out_pins[1],
3215 snd_hda_power_down_pm(codec);
3217 return err < 0 ? err : 0;
3220 static void ca0132_unsol_hp_delayed(struct work_struct *work)
3222 struct ca0132_spec *spec = container_of(
3223 to_delayed_work(work), struct ca0132_spec, unsol_hp_work);
3224 struct hda_jack_tbl *jack;
3226 ca0132_select_out(spec->codec);
3227 jack = snd_hda_jack_tbl_get(spec->codec, UNSOL_TAG_HP);
3229 jack->block_report = 0;
3230 snd_hda_jack_report_sync(spec->codec);
3234 static void ca0132_set_dmic(struct hda_codec *codec, int enable);
3235 static int ca0132_mic_boost_set(struct hda_codec *codec, long val);
3236 static int ca0132_effects_set(struct hda_codec *codec, hda_nid_t nid, long val);
3239 * Select the active VIP source
3241 static int ca0132_set_vipsource(struct hda_codec *codec, int val)
3243 struct ca0132_spec *spec = codec->spec;
3246 if (spec->dsp_state != DSP_DOWNLOADED)
3249 /* if CrystalVoice if off, vipsource should be 0 */
3250 if (!spec->effects_switch[CRYSTAL_VOICE - EFFECT_START_NID] ||
3252 chipio_set_control_param(codec, CONTROL_PARAM_VIP_SOURCE, 0);
3253 chipio_set_conn_rate(codec, MEM_CONNID_MICIN1, SR_96_000);
3254 chipio_set_conn_rate(codec, MEM_CONNID_MICOUT1, SR_96_000);
3255 if (spec->cur_mic_type == DIGITAL_MIC)
3259 dspio_set_uint_param(codec, 0x80, 0x00, tmp);
3261 dspio_set_uint_param(codec, 0x80, 0x05, tmp);
3263 chipio_set_conn_rate(codec, MEM_CONNID_MICIN1, SR_16_000);
3264 chipio_set_conn_rate(codec, MEM_CONNID_MICOUT1, SR_16_000);
3265 if (spec->cur_mic_type == DIGITAL_MIC)
3269 dspio_set_uint_param(codec, 0x80, 0x00, tmp);
3271 dspio_set_uint_param(codec, 0x80, 0x05, tmp);
3273 chipio_set_control_param(codec, CONTROL_PARAM_VIP_SOURCE, val);
3280 * Select the active microphone.
3281 * If autodetect is enabled, mic will be selected based on jack detection.
3282 * If jack inserted, ext.mic will be selected, else built-in mic
3283 * If autodetect is disabled, mic will be selected based on selection.
3285 static int ca0132_select_mic(struct hda_codec *codec)
3287 struct ca0132_spec *spec = codec->spec;
3291 codec_dbg(codec, "ca0132_select_mic\n");
3293 snd_hda_power_up_pm(codec);
3295 auto_jack = spec->vnode_lswitch[VNID_AMIC1_ASEL - VNODE_START_NID];
3298 jack_present = snd_hda_jack_detect(codec, spec->input_pins[0]);
3301 spec->vnode_lswitch[VNID_AMIC1_SEL - VNODE_START_NID];
3304 spec->cur_mic_type = LINE_MIC_IN;
3306 spec->cur_mic_type = DIGITAL_MIC;
3308 if (spec->cur_mic_type == DIGITAL_MIC) {
3309 /* enable digital Mic */
3310 chipio_set_conn_rate(codec, MEM_CONNID_DMIC, SR_32_000);
3311 ca0132_set_dmic(codec, 1);
3312 ca0132_mic_boost_set(codec, 0);
3313 /* set voice focus */
3314 ca0132_effects_set(codec, VOICE_FOCUS,
3315 spec->effects_switch
3316 [VOICE_FOCUS - EFFECT_START_NID]);
3318 /* disable digital Mic */
3319 chipio_set_conn_rate(codec, MEM_CONNID_DMIC, SR_96_000);
3320 ca0132_set_dmic(codec, 0);
3321 ca0132_mic_boost_set(codec, spec->cur_mic_boost);
3322 /* disable voice focus */
3323 ca0132_effects_set(codec, VOICE_FOCUS, 0);
3326 snd_hda_power_down_pm(codec);
3332 * Check if VNODE settings take effect immediately.
3334 static bool ca0132_is_vnode_effective(struct hda_codec *codec,
3336 hda_nid_t *shared_nid)
3338 struct ca0132_spec *spec = codec->spec;
3343 nid = spec->shared_out_nid;
3346 nid = spec->shared_mic_nid;
3359 * The following functions are control change helpers.
3360 * They return 0 if no changed. Return 1 if changed.
3362 static int ca0132_voicefx_set(struct hda_codec *codec, int enable)
3364 struct ca0132_spec *spec = codec->spec;
3367 /* based on CrystalVoice state to enable VoiceFX. */
3369 tmp = spec->effects_switch[CRYSTAL_VOICE - EFFECT_START_NID] ?
3370 FLOAT_ONE : FLOAT_ZERO;
3375 dspio_set_uint_param(codec, ca0132_voicefx.mid,
3376 ca0132_voicefx.reqs[0], tmp);
3382 * Set the effects parameters
3384 static int ca0132_effects_set(struct hda_codec *codec, hda_nid_t nid, long val)
3386 struct ca0132_spec *spec = codec->spec;
3388 int num_fx = OUT_EFFECTS_COUNT + IN_EFFECTS_COUNT;
3390 int idx = nid - EFFECT_START_NID;
3392 if ((idx < 0) || (idx >= num_fx))
3393 return 0; /* no changed */
3395 /* for out effect, qualify with PE */
3396 if ((nid >= OUT_EFFECT_START_NID) && (nid < OUT_EFFECT_END_NID)) {
3397 /* if PE if off, turn off out effects. */
3398 if (!spec->effects_switch[PLAY_ENHANCEMENT - EFFECT_START_NID])
3402 /* for in effect, qualify with CrystalVoice */
3403 if ((nid >= IN_EFFECT_START_NID) && (nid < IN_EFFECT_END_NID)) {
3404 /* if CrystalVoice if off, turn off in effects. */
3405 if (!spec->effects_switch[CRYSTAL_VOICE - EFFECT_START_NID])
3408 /* Voice Focus applies to 2-ch Mic, Digital Mic */
3409 if ((nid == VOICE_FOCUS) && (spec->cur_mic_type != DIGITAL_MIC))
3413 codec_dbg(codec, "ca0132_effect_set: nid=0x%x, val=%ld\n",
3416 on = (val == 0) ? FLOAT_ZERO : FLOAT_ONE;
3417 err = dspio_set_uint_param(codec, ca0132_effects[idx].mid,
3418 ca0132_effects[idx].reqs[0], on);
3421 return 0; /* no changed */
3427 * Turn on/off Playback Enhancements
3429 static int ca0132_pe_switch_set(struct hda_codec *codec)
3431 struct ca0132_spec *spec = codec->spec;
3435 codec_dbg(codec, "ca0132_pe_switch_set: val=%ld\n",
3436 spec->effects_switch[PLAY_ENHANCEMENT - EFFECT_START_NID]);
3438 i = OUT_EFFECT_START_NID - EFFECT_START_NID;
3439 nid = OUT_EFFECT_START_NID;
3440 /* PE affects all out effects */
3441 for (; nid < OUT_EFFECT_END_NID; nid++, i++)
3442 ret |= ca0132_effects_set(codec, nid, spec->effects_switch[i]);
3447 /* Check if Mic1 is streaming, if so, stop streaming */
3448 static int stop_mic1(struct hda_codec *codec)
3450 struct ca0132_spec *spec = codec->spec;
3451 unsigned int oldval = snd_hda_codec_read(codec, spec->adcs[0], 0,
3452 AC_VERB_GET_CONV, 0);
3454 snd_hda_codec_write(codec, spec->adcs[0], 0,
3455 AC_VERB_SET_CHANNEL_STREAMID,
3460 /* Resume Mic1 streaming if it was stopped. */
3461 static void resume_mic1(struct hda_codec *codec, unsigned int oldval)
3463 struct ca0132_spec *spec = codec->spec;
3464 /* Restore the previous stream and channel */
3466 snd_hda_codec_write(codec, spec->adcs[0], 0,
3467 AC_VERB_SET_CHANNEL_STREAMID,
3472 * Turn on/off CrystalVoice
3474 static int ca0132_cvoice_switch_set(struct hda_codec *codec)
3476 struct ca0132_spec *spec = codec->spec;
3479 unsigned int oldval;
3481 codec_dbg(codec, "ca0132_cvoice_switch_set: val=%ld\n",
3482 spec->effects_switch[CRYSTAL_VOICE - EFFECT_START_NID]);
3484 i = IN_EFFECT_START_NID - EFFECT_START_NID;
3485 nid = IN_EFFECT_START_NID;
3486 /* CrystalVoice affects all in effects */
3487 for (; nid < IN_EFFECT_END_NID; nid++, i++)
3488 ret |= ca0132_effects_set(codec, nid, spec->effects_switch[i]);
3490 /* including VoiceFX */
3491 ret |= ca0132_voicefx_set(codec, (spec->voicefx_val ? 1 : 0));
3493 /* set correct vipsource */
3494 oldval = stop_mic1(codec);
3495 ret |= ca0132_set_vipsource(codec, 1);
3496 resume_mic1(codec, oldval);
3500 static int ca0132_mic_boost_set(struct hda_codec *codec, long val)
3502 struct ca0132_spec *spec = codec->spec;
3506 ret = snd_hda_codec_amp_update(codec, spec->input_pins[0], 0,
3507 HDA_INPUT, 0, HDA_AMP_VOLMASK, 3);
3509 ret = snd_hda_codec_amp_update(codec, spec->input_pins[0], 0,
3510 HDA_INPUT, 0, HDA_AMP_VOLMASK, 0);
3515 static int ca0132_vnode_switch_set(struct snd_kcontrol *kcontrol,
3516 struct snd_ctl_elem_value *ucontrol)
3518 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
3519 hda_nid_t nid = get_amp_nid(kcontrol);
3520 hda_nid_t shared_nid = 0;
3523 struct ca0132_spec *spec = codec->spec;
3526 if (nid == VNID_HP_SEL) {
3528 spec->vnode_lswitch[VNID_HP_ASEL - VNODE_START_NID];
3530 ca0132_select_out(codec);
3534 if (nid == VNID_AMIC1_SEL) {
3536 spec->vnode_lswitch[VNID_AMIC1_ASEL - VNODE_START_NID];
3538 ca0132_select_mic(codec);
3542 if (nid == VNID_HP_ASEL) {
3543 ca0132_select_out(codec);
3547 if (nid == VNID_AMIC1_ASEL) {
3548 ca0132_select_mic(codec);
3552 /* if effective conditions, then update hw immediately. */
3553 effective = ca0132_is_vnode_effective(codec, nid, &shared_nid);
3555 int dir = get_amp_direction(kcontrol);
3556 int ch = get_amp_channels(kcontrol);
3559 mutex_lock(&codec->control_mutex);
3560 pval = kcontrol->private_value;
3561 kcontrol->private_value = HDA_COMPOSE_AMP_VAL(shared_nid, ch,
3563 ret = snd_hda_mixer_amp_switch_put(kcontrol, ucontrol);
3564 kcontrol->private_value = pval;
3565 mutex_unlock(&codec->control_mutex);
3570 /* End of control change helpers. */
3572 static int ca0132_voicefx_info(struct snd_kcontrol *kcontrol,
3573 struct snd_ctl_elem_info *uinfo)
3575 unsigned int items = sizeof(ca0132_voicefx_presets)
3576 / sizeof(struct ct_voicefx_preset);
3578 uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
3580 uinfo->value.enumerated.items = items;
3581 if (uinfo->value.enumerated.item >= items)
3582 uinfo->value.enumerated.item = items - 1;
3583 strcpy(uinfo->value.enumerated.name,
3584 ca0132_voicefx_presets[uinfo->value.enumerated.item].name);
3588 static int ca0132_voicefx_get(struct snd_kcontrol *kcontrol,
3589 struct snd_ctl_elem_value *ucontrol)
3591 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
3592 struct ca0132_spec *spec = codec->spec;
3594 ucontrol->value.enumerated.item[0] = spec->voicefx_val;
3598 static int ca0132_voicefx_put(struct snd_kcontrol *kcontrol,
3599 struct snd_ctl_elem_value *ucontrol)
3601 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
3602 struct ca0132_spec *spec = codec->spec;
3604 int sel = ucontrol->value.enumerated.item[0];
3605 unsigned int items = sizeof(ca0132_voicefx_presets)
3606 / sizeof(struct ct_voicefx_preset);
3611 codec_dbg(codec, "ca0132_voicefx_put: sel=%d, preset=%s\n",
3612 sel, ca0132_voicefx_presets[sel].name);
3616 * Default needs to qualify with CrystalVoice state.
3618 for (i = 0; i < VOICEFX_MAX_PARAM_COUNT; i++) {
3619 err = dspio_set_uint_param(codec, ca0132_voicefx.mid,
3620 ca0132_voicefx.reqs[i],
3621 ca0132_voicefx_presets[sel].vals[i]);
3627 spec->voicefx_val = sel;
3628 /* enable voice fx */
3629 ca0132_voicefx_set(codec, (sel ? 1 : 0));
3635 static int ca0132_switch_get(struct snd_kcontrol *kcontrol,
3636 struct snd_ctl_elem_value *ucontrol)
3638 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
3639 struct ca0132_spec *spec = codec->spec;
3640 hda_nid_t nid = get_amp_nid(kcontrol);
3641 int ch = get_amp_channels(kcontrol);
3642 long *valp = ucontrol->value.integer.value;
3645 if ((nid >= VNODE_START_NID) && (nid < VNODE_END_NID)) {
3647 *valp = spec->vnode_lswitch[nid - VNODE_START_NID];
3651 *valp = spec->vnode_rswitch[nid - VNODE_START_NID];
3657 /* effects, include PE and CrystalVoice */
3658 if ((nid >= EFFECT_START_NID) && (nid < EFFECT_END_NID)) {
3659 *valp = spec->effects_switch[nid - EFFECT_START_NID];
3664 if (nid == spec->input_pins[0]) {
3665 *valp = spec->cur_mic_boost;
3672 static int ca0132_switch_put(struct snd_kcontrol *kcontrol,
3673 struct snd_ctl_elem_value *ucontrol)
3675 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
3676 struct ca0132_spec *spec = codec->spec;
3677 hda_nid_t nid = get_amp_nid(kcontrol);
3678 int ch = get_amp_channels(kcontrol);
3679 long *valp = ucontrol->value.integer.value;
3682 codec_dbg(codec, "ca0132_switch_put: nid=0x%x, val=%ld\n",
3685 snd_hda_power_up(codec);
3687 if ((nid >= VNODE_START_NID) && (nid < VNODE_END_NID)) {
3689 spec->vnode_lswitch[nid - VNODE_START_NID] = *valp;
3693 spec->vnode_rswitch[nid - VNODE_START_NID] = *valp;
3696 changed = ca0132_vnode_switch_set(kcontrol, ucontrol);
3701 if (nid == PLAY_ENHANCEMENT) {
3702 spec->effects_switch[nid - EFFECT_START_NID] = *valp;
3703 changed = ca0132_pe_switch_set(codec);
3708 if (nid == CRYSTAL_VOICE) {
3709 spec->effects_switch[nid - EFFECT_START_NID] = *valp;
3710 changed = ca0132_cvoice_switch_set(codec);
3714 /* out and in effects */
3715 if (((nid >= OUT_EFFECT_START_NID) && (nid < OUT_EFFECT_END_NID)) ||
3716 ((nid >= IN_EFFECT_START_NID) && (nid < IN_EFFECT_END_NID))) {
3717 spec->effects_switch[nid - EFFECT_START_NID] = *valp;
3718 changed = ca0132_effects_set(codec, nid, *valp);
3723 if (nid == spec->input_pins[0]) {
3724 spec->cur_mic_boost = *valp;
3726 /* Mic boost does not apply to Digital Mic */
3727 if (spec->cur_mic_type != DIGITAL_MIC)
3728 changed = ca0132_mic_boost_set(codec, *valp);
3733 snd_hda_power_down(codec);
3740 static int ca0132_volume_info(struct snd_kcontrol *kcontrol,
3741 struct snd_ctl_elem_info *uinfo)
3743 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
3744 struct ca0132_spec *spec = codec->spec;
3745 hda_nid_t nid = get_amp_nid(kcontrol);
3746 int ch = get_amp_channels(kcontrol);
3747 int dir = get_amp_direction(kcontrol);
3753 /* follow shared_out info */
3754 nid = spec->shared_out_nid;
3755 mutex_lock(&codec->control_mutex);
3756 pval = kcontrol->private_value;
3757 kcontrol->private_value = HDA_COMPOSE_AMP_VAL(nid, ch, 0, dir);
3758 err = snd_hda_mixer_amp_volume_info(kcontrol, uinfo);
3759 kcontrol->private_value = pval;
3760 mutex_unlock(&codec->control_mutex);
3763 /* follow shared_mic info */
3764 nid = spec->shared_mic_nid;
3765 mutex_lock(&codec->control_mutex);
3766 pval = kcontrol->private_value;
3767 kcontrol->private_value = HDA_COMPOSE_AMP_VAL(nid, ch, 0, dir);
3768 err = snd_hda_mixer_amp_volume_info(kcontrol, uinfo);
3769 kcontrol->private_value = pval;
3770 mutex_unlock(&codec->control_mutex);
3773 err = snd_hda_mixer_amp_volume_info(kcontrol, uinfo);
3778 static int ca0132_volume_get(struct snd_kcontrol *kcontrol,
3779 struct snd_ctl_elem_value *ucontrol)
3781 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
3782 struct ca0132_spec *spec = codec->spec;
3783 hda_nid_t nid = get_amp_nid(kcontrol);
3784 int ch = get_amp_channels(kcontrol);
3785 long *valp = ucontrol->value.integer.value;
3787 /* store the left and right volume */
3789 *valp = spec->vnode_lvol[nid - VNODE_START_NID];
3793 *valp = spec->vnode_rvol[nid - VNODE_START_NID];
3799 static int ca0132_volume_put(struct snd_kcontrol *kcontrol,
3800 struct snd_ctl_elem_value *ucontrol)
3802 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
3803 struct ca0132_spec *spec = codec->spec;
3804 hda_nid_t nid = get_amp_nid(kcontrol);
3805 int ch = get_amp_channels(kcontrol);
3806 long *valp = ucontrol->value.integer.value;
3807 hda_nid_t shared_nid = 0;
3811 /* store the left and right volume */
3813 spec->vnode_lvol[nid - VNODE_START_NID] = *valp;
3817 spec->vnode_rvol[nid - VNODE_START_NID] = *valp;
3821 /* if effective conditions, then update hw immediately. */
3822 effective = ca0132_is_vnode_effective(codec, nid, &shared_nid);
3824 int dir = get_amp_direction(kcontrol);
3827 snd_hda_power_up(codec);
3828 mutex_lock(&codec->control_mutex);
3829 pval = kcontrol->private_value;
3830 kcontrol->private_value = HDA_COMPOSE_AMP_VAL(shared_nid, ch,
3832 changed = snd_hda_mixer_amp_volume_put(kcontrol, ucontrol);
3833 kcontrol->private_value = pval;
3834 mutex_unlock(&codec->control_mutex);
3835 snd_hda_power_down(codec);
3841 static int ca0132_volume_tlv(struct snd_kcontrol *kcontrol, int op_flag,
3842 unsigned int size, unsigned int __user *tlv)
3844 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
3845 struct ca0132_spec *spec = codec->spec;
3846 hda_nid_t nid = get_amp_nid(kcontrol);
3847 int ch = get_amp_channels(kcontrol);
3848 int dir = get_amp_direction(kcontrol);
3854 /* follow shared_out tlv */
3855 nid = spec->shared_out_nid;
3856 mutex_lock(&codec->control_mutex);
3857 pval = kcontrol->private_value;
3858 kcontrol->private_value = HDA_COMPOSE_AMP_VAL(nid, ch, 0, dir);
3859 err = snd_hda_mixer_amp_tlv(kcontrol, op_flag, size, tlv);
3860 kcontrol->private_value = pval;
3861 mutex_unlock(&codec->control_mutex);
3864 /* follow shared_mic tlv */
3865 nid = spec->shared_mic_nid;
3866 mutex_lock(&codec->control_mutex);
3867 pval = kcontrol->private_value;
3868 kcontrol->private_value = HDA_COMPOSE_AMP_VAL(nid, ch, 0, dir);
3869 err = snd_hda_mixer_amp_tlv(kcontrol, op_flag, size, tlv);
3870 kcontrol->private_value = pval;
3871 mutex_unlock(&codec->control_mutex);
3874 err = snd_hda_mixer_amp_tlv(kcontrol, op_flag, size, tlv);
3879 static int add_fx_switch(struct hda_codec *codec, hda_nid_t nid,
3880 const char *pfx, int dir)
3882 char namestr[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
3883 int type = dir ? HDA_INPUT : HDA_OUTPUT;
3884 struct snd_kcontrol_new knew =
3885 CA0132_CODEC_MUTE_MONO(namestr, nid, 1, type);
3886 sprintf(namestr, "%s %s Switch", pfx, dirstr[dir]);
3887 return snd_hda_ctl_add(codec, nid, snd_ctl_new1(&knew, codec));
3890 static int add_voicefx(struct hda_codec *codec)
3892 struct snd_kcontrol_new knew =
3893 HDA_CODEC_MUTE_MONO(ca0132_voicefx.name,
3894 VOICEFX, 1, 0, HDA_INPUT);
3895 knew.info = ca0132_voicefx_info;
3896 knew.get = ca0132_voicefx_get;
3897 knew.put = ca0132_voicefx_put;
3898 return snd_hda_ctl_add(codec, VOICEFX, snd_ctl_new1(&knew, codec));
3902 * When changing Node IDs for Mixer Controls below, make sure to update
3903 * Node IDs in ca0132_config() as well.
3905 static struct snd_kcontrol_new ca0132_mixer[] = {
3906 CA0132_CODEC_VOL("Master Playback Volume", VNID_SPK, HDA_OUTPUT),
3907 CA0132_CODEC_MUTE("Master Playback Switch", VNID_SPK, HDA_OUTPUT),
3908 CA0132_CODEC_VOL("Capture Volume", VNID_MIC, HDA_INPUT),
3909 CA0132_CODEC_MUTE("Capture Switch", VNID_MIC, HDA_INPUT),
3910 HDA_CODEC_VOLUME("Analog-Mic2 Capture Volume", 0x08, 0, HDA_INPUT),
3911 HDA_CODEC_MUTE("Analog-Mic2 Capture Switch", 0x08, 0, HDA_INPUT),
3912 HDA_CODEC_VOLUME("What U Hear Capture Volume", 0x0a, 0, HDA_INPUT),
3913 HDA_CODEC_MUTE("What U Hear Capture Switch", 0x0a, 0, HDA_INPUT),
3914 CA0132_CODEC_MUTE_MONO("Mic1-Boost (30dB) Capture Switch",
3915 0x12, 1, HDA_INPUT),
3916 CA0132_CODEC_MUTE_MONO("HP/Speaker Playback Switch",
3917 VNID_HP_SEL, 1, HDA_OUTPUT),
3918 CA0132_CODEC_MUTE_MONO("AMic1/DMic Capture Switch",
3919 VNID_AMIC1_SEL, 1, HDA_INPUT),
3920 CA0132_CODEC_MUTE_MONO("HP/Speaker Auto Detect Playback Switch",
3921 VNID_HP_ASEL, 1, HDA_OUTPUT),
3922 CA0132_CODEC_MUTE_MONO("AMic1/DMic Auto Detect Capture Switch",
3923 VNID_AMIC1_ASEL, 1, HDA_INPUT),
3927 static int ca0132_build_controls(struct hda_codec *codec)
3929 struct ca0132_spec *spec = codec->spec;
3933 /* Add Mixer controls */
3934 for (i = 0; i < spec->num_mixers; i++) {
3935 err = snd_hda_add_new_ctls(codec, spec->mixers[i]);
3940 /* Add in and out effects controls.
3941 * VoiceFX, PE and CrystalVoice are added separately.
3943 num_fx = OUT_EFFECTS_COUNT + IN_EFFECTS_COUNT;
3944 for (i = 0; i < num_fx; i++) {
3945 err = add_fx_switch(codec, ca0132_effects[i].nid,
3946 ca0132_effects[i].name,
3947 ca0132_effects[i].direct);
3952 err = add_fx_switch(codec, PLAY_ENHANCEMENT, "PlayEnhancement", 0);
3956 err = add_fx_switch(codec, CRYSTAL_VOICE, "CrystalVoice", 1);
3962 #ifdef ENABLE_TUNING_CONTROLS
3963 add_tuning_ctls(codec);
3966 err = snd_hda_jack_add_kctls(codec, &spec->autocfg);
3970 if (spec->dig_out) {
3971 err = snd_hda_create_spdif_out_ctls(codec, spec->dig_out,
3975 err = snd_hda_create_spdif_share_sw(codec, &spec->multiout);
3978 /* spec->multiout.share_spdif = 1; */
3982 err = snd_hda_create_spdif_in_ctls(codec, spec->dig_in);
3992 static struct hda_pcm_stream ca0132_pcm_analog_playback = {
3997 .prepare = ca0132_playback_pcm_prepare,
3998 .cleanup = ca0132_playback_pcm_cleanup,
3999 .get_delay = ca0132_playback_pcm_delay,
4003 static struct hda_pcm_stream ca0132_pcm_analog_capture = {
4008 .prepare = ca0132_capture_pcm_prepare,
4009 .cleanup = ca0132_capture_pcm_cleanup,
4010 .get_delay = ca0132_capture_pcm_delay,
4014 static struct hda_pcm_stream ca0132_pcm_digital_playback = {
4019 .open = ca0132_dig_playback_pcm_open,
4020 .close = ca0132_dig_playback_pcm_close,
4021 .prepare = ca0132_dig_playback_pcm_prepare,
4022 .cleanup = ca0132_dig_playback_pcm_cleanup
4026 static struct hda_pcm_stream ca0132_pcm_digital_capture = {
4032 static int ca0132_build_pcms(struct hda_codec *codec)
4034 struct ca0132_spec *spec = codec->spec;
4035 struct hda_pcm *info;
4037 info = snd_hda_codec_pcm_new(codec, "CA0132 Analog");
4040 info->stream[SNDRV_PCM_STREAM_PLAYBACK] = ca0132_pcm_analog_playback;
4041 info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = spec->dacs[0];
4042 info->stream[SNDRV_PCM_STREAM_PLAYBACK].channels_max =
4043 spec->multiout.max_channels;
4044 info->stream[SNDRV_PCM_STREAM_CAPTURE] = ca0132_pcm_analog_capture;
4045 info->stream[SNDRV_PCM_STREAM_CAPTURE].substreams = 1;
4046 info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->adcs[0];
4048 info = snd_hda_codec_pcm_new(codec, "CA0132 Analog Mic-In2");
4051 info->stream[SNDRV_PCM_STREAM_CAPTURE] = ca0132_pcm_analog_capture;
4052 info->stream[SNDRV_PCM_STREAM_CAPTURE].substreams = 1;
4053 info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->adcs[1];
4055 info = snd_hda_codec_pcm_new(codec, "CA0132 What U Hear");
4058 info->stream[SNDRV_PCM_STREAM_CAPTURE] = ca0132_pcm_analog_capture;
4059 info->stream[SNDRV_PCM_STREAM_CAPTURE].substreams = 1;
4060 info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->adcs[2];
4062 if (!spec->dig_out && !spec->dig_in)
4065 info = snd_hda_codec_pcm_new(codec, "CA0132 Digital");
4068 info->pcm_type = HDA_PCM_TYPE_SPDIF;
4069 if (spec->dig_out) {
4070 info->stream[SNDRV_PCM_STREAM_PLAYBACK] =
4071 ca0132_pcm_digital_playback;
4072 info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = spec->dig_out;
4075 info->stream[SNDRV_PCM_STREAM_CAPTURE] =
4076 ca0132_pcm_digital_capture;
4077 info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->dig_in;
4083 static void init_output(struct hda_codec *codec, hda_nid_t pin, hda_nid_t dac)
4086 snd_hda_set_pin_ctl(codec, pin, PIN_HP);
4087 if (get_wcaps(codec, pin) & AC_WCAP_OUT_AMP)
4088 snd_hda_codec_write(codec, pin, 0,
4089 AC_VERB_SET_AMP_GAIN_MUTE,
4092 if (dac && (get_wcaps(codec, dac) & AC_WCAP_OUT_AMP))
4093 snd_hda_codec_write(codec, dac, 0,
4094 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO);
4097 static void init_input(struct hda_codec *codec, hda_nid_t pin, hda_nid_t adc)
4100 snd_hda_set_pin_ctl(codec, pin, PIN_VREF80);
4101 if (get_wcaps(codec, pin) & AC_WCAP_IN_AMP)
4102 snd_hda_codec_write(codec, pin, 0,
4103 AC_VERB_SET_AMP_GAIN_MUTE,
4106 if (adc && (get_wcaps(codec, adc) & AC_WCAP_IN_AMP)) {
4107 snd_hda_codec_write(codec, adc, 0, AC_VERB_SET_AMP_GAIN_MUTE,
4110 /* init to 0 dB and unmute. */
4111 snd_hda_codec_amp_stereo(codec, adc, HDA_INPUT, 0,
4112 HDA_AMP_VOLMASK, 0x5a);
4113 snd_hda_codec_amp_stereo(codec, adc, HDA_INPUT, 0,
4118 static void refresh_amp_caps(struct hda_codec *codec, hda_nid_t nid, int dir)
4122 caps = snd_hda_param_read(codec, nid, dir == HDA_OUTPUT ?
4123 AC_PAR_AMP_OUT_CAP : AC_PAR_AMP_IN_CAP);
4124 snd_hda_override_amp_caps(codec, nid, dir, caps);
4128 * Switch between Digital built-in mic and analog mic.
4130 static void ca0132_set_dmic(struct hda_codec *codec, int enable)
4132 struct ca0132_spec *spec = codec->spec;
4135 unsigned int oldval;
4137 codec_dbg(codec, "ca0132_set_dmic: enable=%d\n", enable);
4139 oldval = stop_mic1(codec);
4140 ca0132_set_vipsource(codec, 0);
4142 /* set DMic input as 2-ch */
4144 dspio_set_uint_param(codec, 0x80, 0x00, tmp);
4146 val = spec->dmic_ctl;
4148 snd_hda_codec_write(codec, spec->input_pins[0], 0,
4149 VENDOR_CHIPIO_DMIC_CTL_SET, val);
4151 if (!(spec->dmic_ctl & 0x20))
4152 chipio_set_control_flag(codec, CONTROL_FLAG_DMIC, 1);
4154 /* set AMic input as mono */
4156 dspio_set_uint_param(codec, 0x80, 0x00, tmp);
4158 val = spec->dmic_ctl;
4159 /* clear bit7 and bit5 to disable dmic */
4161 snd_hda_codec_write(codec, spec->input_pins[0], 0,
4162 VENDOR_CHIPIO_DMIC_CTL_SET, val);
4164 if (!(spec->dmic_ctl & 0x20))
4165 chipio_set_control_flag(codec, CONTROL_FLAG_DMIC, 0);
4167 ca0132_set_vipsource(codec, 1);
4168 resume_mic1(codec, oldval);
4172 * Initialization for Digital Mic.
4174 static void ca0132_init_dmic(struct hda_codec *codec)
4176 struct ca0132_spec *spec = codec->spec;
4179 /* Setup Digital Mic here, but don't enable.
4180 * Enable based on jack detect.
4183 /* MCLK uses MPIO1, set to enable.
4184 * Bit 2-0: MPIO select
4185 * Bit 3: set to disable
4189 snd_hda_codec_write(codec, spec->input_pins[0], 0,
4190 VENDOR_CHIPIO_DMIC_MCLK_SET, val);
4192 /* Data1 uses MPIO3. Data2 not use
4193 * Bit 2-0: Data1 MPIO select
4194 * Bit 3: set disable Data1
4195 * Bit 6-4: Data2 MPIO select
4196 * Bit 7: set disable Data2
4199 snd_hda_codec_write(codec, spec->input_pins[0], 0,
4200 VENDOR_CHIPIO_DMIC_PIN_SET, val);
4202 /* Use Ch-0 and Ch-1. Rate is 48K, mode 1. Disable DMic first.
4203 * Bit 3-0: Channel mask
4204 * Bit 4: set for 48KHz, clear for 32KHz
4206 * Bit 6: set to select Data2, clear for Data1
4207 * Bit 7: set to enable DMic, clear for AMic
4210 /* keep a copy of dmic ctl val for enable/disable dmic purpuse */
4211 spec->dmic_ctl = val;
4212 snd_hda_codec_write(codec, spec->input_pins[0], 0,
4213 VENDOR_CHIPIO_DMIC_CTL_SET, val);
4217 * Initialization for Analog Mic 2
4219 static void ca0132_init_analog_mic2(struct hda_codec *codec)
4221 struct ca0132_spec *spec = codec->spec;
4223 mutex_lock(&spec->chipio_mutex);
4224 snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
4225 VENDOR_CHIPIO_8051_ADDRESS_LOW, 0x20);
4226 snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
4227 VENDOR_CHIPIO_8051_ADDRESS_HIGH, 0x19);
4228 snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
4229 VENDOR_CHIPIO_8051_DATA_WRITE, 0x00);
4230 snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
4231 VENDOR_CHIPIO_8051_ADDRESS_LOW, 0x2D);
4232 snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
4233 VENDOR_CHIPIO_8051_ADDRESS_HIGH, 0x19);
4234 snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
4235 VENDOR_CHIPIO_8051_DATA_WRITE, 0x00);
4236 mutex_unlock(&spec->chipio_mutex);
4239 static void ca0132_refresh_widget_caps(struct hda_codec *codec)
4241 struct ca0132_spec *spec = codec->spec;
4244 codec_dbg(codec, "ca0132_refresh_widget_caps.\n");
4245 snd_hda_codec_update_widgets(codec);
4247 for (i = 0; i < spec->multiout.num_dacs; i++)
4248 refresh_amp_caps(codec, spec->dacs[i], HDA_OUTPUT);
4250 for (i = 0; i < spec->num_outputs; i++)
4251 refresh_amp_caps(codec, spec->out_pins[i], HDA_OUTPUT);
4253 for (i = 0; i < spec->num_inputs; i++) {
4254 refresh_amp_caps(codec, spec->adcs[i], HDA_INPUT);
4255 refresh_amp_caps(codec, spec->input_pins[i], HDA_INPUT);
4260 * Setup default parameters for DSP
4262 static void ca0132_setup_defaults(struct hda_codec *codec)
4264 struct ca0132_spec *spec = codec->spec;
4269 if (spec->dsp_state != DSP_DOWNLOADED)
4272 /* out, in effects + voicefx */
4273 num_fx = OUT_EFFECTS_COUNT + IN_EFFECTS_COUNT + 1;
4274 for (idx = 0; idx < num_fx; idx++) {
4275 for (i = 0; i <= ca0132_effects[idx].params; i++) {
4276 dspio_set_uint_param(codec, ca0132_effects[idx].mid,
4277 ca0132_effects[idx].reqs[i],
4278 ca0132_effects[idx].def_vals[i]);
4282 /*remove DSP headroom*/
4284 dspio_set_uint_param(codec, 0x96, 0x3C, tmp);
4286 /*set speaker EQ bypass attenuation*/
4287 dspio_set_uint_param(codec, 0x8f, 0x01, tmp);
4289 /* set AMic1 and AMic2 as mono mic */
4291 dspio_set_uint_param(codec, 0x80, 0x00, tmp);
4292 dspio_set_uint_param(codec, 0x80, 0x01, tmp);
4294 /* set AMic1 as CrystalVoice input */
4296 dspio_set_uint_param(codec, 0x80, 0x05, tmp);
4298 /* set WUH source */
4300 dspio_set_uint_param(codec, 0x31, 0x00, tmp);
4304 * Initialization of flags in chip
4306 static void ca0132_init_flags(struct hda_codec *codec)
4308 chipio_set_control_flag(codec, CONTROL_FLAG_IDLE_ENABLE, 0);
4309 chipio_set_control_flag(codec, CONTROL_FLAG_PORT_A_COMMON_MODE, 0);
4310 chipio_set_control_flag(codec, CONTROL_FLAG_PORT_D_COMMON_MODE, 0);
4311 chipio_set_control_flag(codec, CONTROL_FLAG_PORT_A_10KOHM_LOAD, 0);
4312 chipio_set_control_flag(codec, CONTROL_FLAG_PORT_D_10KOHM_LOAD, 0);
4313 chipio_set_control_flag(codec, CONTROL_FLAG_ADC_C_HIGH_PASS, 1);
4317 * Initialization of parameters in chip
4319 static void ca0132_init_params(struct hda_codec *codec)
4321 chipio_set_control_param(codec, CONTROL_PARAM_PORTA_160OHM_GAIN, 6);
4322 chipio_set_control_param(codec, CONTROL_PARAM_PORTD_160OHM_GAIN, 6);
4325 static void ca0132_set_dsp_msr(struct hda_codec *codec, bool is96k)
4327 chipio_set_control_flag(codec, CONTROL_FLAG_DSP_96KHZ, is96k);
4328 chipio_set_control_flag(codec, CONTROL_FLAG_DAC_96KHZ, is96k);
4329 chipio_set_control_flag(codec, CONTROL_FLAG_SRC_RATE_96KHZ, is96k);
4330 chipio_set_control_flag(codec, CONTROL_FLAG_SRC_CLOCK_196MHZ, is96k);
4331 chipio_set_control_flag(codec, CONTROL_FLAG_ADC_B_96KHZ, is96k);
4332 chipio_set_control_flag(codec, CONTROL_FLAG_ADC_C_96KHZ, is96k);
4334 chipio_set_conn_rate(codec, MEM_CONNID_MICIN1, SR_96_000);
4335 chipio_set_conn_rate(codec, MEM_CONNID_MICOUT1, SR_96_000);
4336 chipio_set_conn_rate(codec, MEM_CONNID_WUH, SR_48_000);
4339 static bool ca0132_download_dsp_images(struct hda_codec *codec)
4341 bool dsp_loaded = false;
4342 const struct dsp_image_seg *dsp_os_image;
4343 const struct firmware *fw_entry;
4345 if (request_firmware(&fw_entry, EFX_FILE, codec->card->dev) != 0)
4348 dsp_os_image = (struct dsp_image_seg *)(fw_entry->data);
4349 if (dspload_image(codec, dsp_os_image, 0, 0, true, 0)) {
4350 pr_err("ca0132 dspload_image failed.\n");
4354 dsp_loaded = dspload_wait_loaded(codec);
4357 release_firmware(fw_entry);
4362 static void ca0132_download_dsp(struct hda_codec *codec)
4364 struct ca0132_spec *spec = codec->spec;
4366 #ifndef CONFIG_SND_HDA_CODEC_CA0132_DSP
4370 if (spec->dsp_state == DSP_DOWNLOAD_FAILED)
4371 return; /* don't retry failures */
4373 chipio_enable_clocks(codec);
4374 spec->dsp_state = DSP_DOWNLOADING;
4375 if (!ca0132_download_dsp_images(codec))
4376 spec->dsp_state = DSP_DOWNLOAD_FAILED;
4378 spec->dsp_state = DSP_DOWNLOADED;
4380 if (spec->dsp_state == DSP_DOWNLOADED)
4381 ca0132_set_dsp_msr(codec, true);
4384 static void ca0132_process_dsp_response(struct hda_codec *codec,
4385 struct hda_jack_callback *callback)
4387 struct ca0132_spec *spec = codec->spec;
4389 codec_dbg(codec, "ca0132_process_dsp_response\n");
4390 if (spec->wait_scp) {
4391 if (dspio_get_response_data(codec) >= 0)
4395 dspio_clear_response_queue(codec);
4398 static void hp_callback(struct hda_codec *codec, struct hda_jack_callback *cb)
4400 struct ca0132_spec *spec = codec->spec;
4402 /* Delay enabling the HP amp, to let the mic-detection
4403 * state machine run.
4405 cancel_delayed_work_sync(&spec->unsol_hp_work);
4406 schedule_delayed_work(&spec->unsol_hp_work, msecs_to_jiffies(500));
4407 cb->tbl->block_report = 1;
4410 static void amic_callback(struct hda_codec *codec, struct hda_jack_callback *cb)
4412 ca0132_select_mic(codec);
4415 static void ca0132_init_unsol(struct hda_codec *codec)
4417 snd_hda_jack_detect_enable_callback(codec, UNSOL_TAG_HP, hp_callback);
4418 snd_hda_jack_detect_enable_callback(codec, UNSOL_TAG_AMIC1,
4420 snd_hda_jack_detect_enable_callback(codec, UNSOL_TAG_DSP,
4421 ca0132_process_dsp_response);
4428 /* Sends before DSP download. */
4429 static struct hda_verb ca0132_base_init_verbs[] = {
4430 /*enable ct extension*/
4431 {0x15, VENDOR_CHIPIO_CT_EXTENSIONS_ENABLE, 0x1},
4436 static struct hda_verb ca0132_base_exit_verbs[] = {
4438 {0x01, AC_VERB_SET_POWER_STATE, 0x03},
4439 /*disable ct extension*/
4440 {0x15, VENDOR_CHIPIO_CT_EXTENSIONS_ENABLE, 0},
4444 /* Other verbs tables. Sends after DSP download. */
4445 static struct hda_verb ca0132_init_verbs0[] = {
4446 /* chip init verbs */
4447 {0x15, 0x70D, 0xF0},
4448 {0x15, 0x70E, 0xFE},
4449 {0x15, 0x707, 0x75},
4450 {0x15, 0x707, 0xD3},
4451 {0x15, 0x707, 0x09},
4452 {0x15, 0x707, 0x53},
4453 {0x15, 0x707, 0xD4},
4454 {0x15, 0x707, 0xEF},
4455 {0x15, 0x707, 0x75},
4456 {0x15, 0x707, 0xD3},
4457 {0x15, 0x707, 0x09},
4458 {0x15, 0x707, 0x02},
4459 {0x15, 0x707, 0x37},
4460 {0x15, 0x707, 0x78},
4461 {0x15, 0x53C, 0xCE},
4462 {0x15, 0x575, 0xC9},
4463 {0x15, 0x53D, 0xCE},
4464 {0x15, 0x5B7, 0xC9},
4465 {0x15, 0x70D, 0xE8},
4466 {0x15, 0x70E, 0xFE},
4467 {0x15, 0x707, 0x02},
4468 {0x15, 0x707, 0x68},
4469 {0x15, 0x707, 0x62},
4470 {0x15, 0x53A, 0xCE},
4471 {0x15, 0x546, 0xC9},
4472 {0x15, 0x53B, 0xCE},
4473 {0x15, 0x5E8, 0xC9},
4474 {0x15, 0x717, 0x0D},
4475 {0x15, 0x718, 0x20},
4479 static struct hda_verb ca0132_init_verbs1[] = {
4480 {0x10, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | UNSOL_TAG_HP},
4481 {0x12, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | UNSOL_TAG_AMIC1},
4483 {0x0b, 0x78D, 0x00},
4484 /*{0x0b, AC_VERB_SET_EAPD_BTLENABLE, 0x02},*/
4485 /*{0x10, 0x78D, 0x02},*/
4486 /*{0x10, AC_VERB_SET_EAPD_BTLENABLE, 0x02},*/
4490 static void ca0132_init_chip(struct hda_codec *codec)
4492 struct ca0132_spec *spec = codec->spec;
4497 mutex_init(&spec->chipio_mutex);
4499 spec->cur_out_type = SPEAKER_OUT;
4500 spec->cur_mic_type = DIGITAL_MIC;
4501 spec->cur_mic_boost = 0;
4503 for (i = 0; i < VNODES_COUNT; i++) {
4504 spec->vnode_lvol[i] = 0x5a;
4505 spec->vnode_rvol[i] = 0x5a;
4506 spec->vnode_lswitch[i] = 0;
4507 spec->vnode_rswitch[i] = 0;
4511 * Default states for effects are in ca0132_effects[].
4513 num_fx = OUT_EFFECTS_COUNT + IN_EFFECTS_COUNT;
4514 for (i = 0; i < num_fx; i++) {
4515 on = (unsigned int)ca0132_effects[i].reqs[0];
4516 spec->effects_switch[i] = on ? 1 : 0;
4519 spec->voicefx_val = 0;
4520 spec->effects_switch[PLAY_ENHANCEMENT - EFFECT_START_NID] = 1;
4521 spec->effects_switch[CRYSTAL_VOICE - EFFECT_START_NID] = 0;
4523 #ifdef ENABLE_TUNING_CONTROLS
4524 ca0132_init_tuning_defaults(codec);
4528 static void ca0132_exit_chip(struct hda_codec *codec)
4530 /* put any chip cleanup stuffs here. */
4532 if (dspload_is_loaded(codec))
4536 static int ca0132_init(struct hda_codec *codec)
4538 struct ca0132_spec *spec = codec->spec;
4539 struct auto_pin_cfg *cfg = &spec->autocfg;
4542 if (spec->dsp_state != DSP_DOWNLOAD_FAILED)
4543 spec->dsp_state = DSP_DOWNLOAD_INIT;
4544 spec->curr_chip_addx = INVALID_CHIP_ADDRESS;
4546 snd_hda_power_up_pm(codec);
4548 ca0132_init_unsol(codec);
4550 ca0132_init_params(codec);
4551 ca0132_init_flags(codec);
4552 snd_hda_sequence_write(codec, spec->base_init_verbs);
4553 ca0132_download_dsp(codec);
4554 ca0132_refresh_widget_caps(codec);
4555 ca0132_setup_defaults(codec);
4556 ca0132_init_analog_mic2(codec);
4557 ca0132_init_dmic(codec);
4559 for (i = 0; i < spec->num_outputs; i++)
4560 init_output(codec, spec->out_pins[i], spec->dacs[0]);
4562 init_output(codec, cfg->dig_out_pins[0], spec->dig_out);
4564 for (i = 0; i < spec->num_inputs; i++)
4565 init_input(codec, spec->input_pins[i], spec->adcs[i]);
4567 init_input(codec, cfg->dig_in_pin, spec->dig_in);
4569 for (i = 0; i < spec->num_init_verbs; i++)
4570 snd_hda_sequence_write(codec, spec->init_verbs[i]);
4572 ca0132_select_out(codec);
4573 ca0132_select_mic(codec);
4575 snd_hda_jack_report_sync(codec);
4577 snd_hda_power_down_pm(codec);
4582 static void ca0132_free(struct hda_codec *codec)
4584 struct ca0132_spec *spec = codec->spec;
4586 cancel_delayed_work_sync(&spec->unsol_hp_work);
4587 snd_hda_power_up(codec);
4588 snd_hda_sequence_write(codec, spec->base_exit_verbs);
4589 ca0132_exit_chip(codec);
4590 snd_hda_power_down(codec);
4594 static struct hda_codec_ops ca0132_patch_ops = {
4595 .build_controls = ca0132_build_controls,
4596 .build_pcms = ca0132_build_pcms,
4597 .init = ca0132_init,
4598 .free = ca0132_free,
4599 .unsol_event = snd_hda_jack_unsol_event,
4602 static void ca0132_config(struct hda_codec *codec)
4604 struct ca0132_spec *spec = codec->spec;
4605 struct auto_pin_cfg *cfg = &spec->autocfg;
4607 spec->dacs[0] = 0x2;
4608 spec->dacs[1] = 0x3;
4609 spec->dacs[2] = 0x4;
4611 spec->multiout.dac_nids = spec->dacs;
4612 spec->multiout.num_dacs = 3;
4613 spec->multiout.max_channels = 2;
4615 spec->num_outputs = 2;
4616 spec->out_pins[0] = 0x0b; /* speaker out */
4617 spec->out_pins[1] = 0x10; /* headphone out */
4618 spec->shared_out_nid = 0x2;
4620 spec->num_inputs = 3;
4621 spec->adcs[0] = 0x7; /* digital mic / analog mic1 */
4622 spec->adcs[1] = 0x8; /* analog mic2 */
4623 spec->adcs[2] = 0xa; /* what u hear */
4624 spec->shared_mic_nid = 0x7;
4626 spec->input_pins[0] = 0x12;
4627 spec->input_pins[1] = 0x11;
4628 spec->input_pins[2] = 0x13;
4631 spec->dig_out = 0x05;
4632 spec->multiout.dig_out_nid = spec->dig_out;
4633 cfg->dig_out_pins[0] = 0x0c;
4635 cfg->dig_out_type[0] = HDA_PCM_TYPE_SPDIF;
4636 spec->dig_in = 0x09;
4637 cfg->dig_in_pin = 0x0e;
4638 cfg->dig_in_type = HDA_PCM_TYPE_SPDIF;
4641 static int patch_ca0132(struct hda_codec *codec)
4643 struct ca0132_spec *spec;
4646 codec_dbg(codec, "patch_ca0132\n");
4648 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
4652 spec->codec = codec;
4654 spec->dsp_state = DSP_DOWNLOAD_INIT;
4655 spec->num_mixers = 1;
4656 spec->mixers[0] = ca0132_mixer;
4658 spec->base_init_verbs = ca0132_base_init_verbs;
4659 spec->base_exit_verbs = ca0132_base_exit_verbs;
4660 spec->init_verbs[0] = ca0132_init_verbs0;
4661 spec->init_verbs[1] = ca0132_init_verbs1;
4662 spec->num_init_verbs = 2;
4664 INIT_DELAYED_WORK(&spec->unsol_hp_work, ca0132_unsol_hp_delayed);
4666 ca0132_init_chip(codec);
4668 ca0132_config(codec);
4670 err = snd_hda_parse_pin_def_config(codec, &spec->autocfg, NULL);
4674 codec->patch_ops = ca0132_patch_ops;
4675 codec->pcm_format_first = 1;
4676 codec->no_sticky_stream = 1;
4684 static struct hda_codec_preset snd_hda_preset_ca0132[] = {
4685 { .id = 0x11020011, .name = "CA0132", .patch = patch_ca0132 },
4689 MODULE_ALIAS("snd-hda-codec-id:11020011");
4691 MODULE_LICENSE("GPL");
4692 MODULE_DESCRIPTION("Creative Sound Core3D codec");
4694 static struct hda_codec_driver ca0132_driver = {
4695 .preset = snd_hda_preset_ca0132,
4698 module_hda_codec_driver(ca0132_driver);