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