1 /* 2 * Universal Interface for Intel High Definition Audio Codec 3 * 4 * HD audio interface patch for VIA VT17xx/VT18xx/VT20xx codec 5 * 6 * (C) 2006-2009 VIA Technology, Inc. 7 * (C) 2006-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 /* * * * * * * * * * * * * * Release History * * * * * * * * * * * * * * * * */ 25 /* */ 26 /* 2006-03-03 Lydia Wang Create the basic patch to support VT1708 codec */ 27 /* 2006-03-14 Lydia Wang Modify hard code for some pin widget nid */ 28 /* 2006-08-02 Lydia Wang Add support to VT1709 codec */ 29 /* 2006-09-08 Lydia Wang Fix internal loopback recording source select bug */ 30 /* 2007-09-12 Lydia Wang Add EAPD enable during driver initialization */ 31 /* 2007-09-17 Lydia Wang Add VT1708B codec support */ 32 /* 2007-11-14 Lydia Wang Add VT1708A codec HP and CD pin connect config */ 33 /* 2008-02-03 Lydia Wang Fix Rear channels and Back channels inverse issue */ 34 /* 2008-03-06 Lydia Wang Add VT1702 codec and VT1708S codec support */ 35 /* 2008-04-09 Lydia Wang Add mute front speaker when HP plugin */ 36 /* 2008-04-09 Lydia Wang Add Independent HP feature */ 37 /* 2008-05-28 Lydia Wang Add second S/PDIF Out support for VT1702 */ 38 /* 2008-09-15 Logan Li Add VT1708S Mic Boost workaround/backdoor */ 39 /* 2009-02-16 Logan Li Add support for VT1718S */ 40 /* 2009-03-13 Logan Li Add support for VT1716S */ 41 /* 2009-04-14 Lydai Wang Add support for VT1828S and VT2020 */ 42 /* 2009-07-08 Lydia Wang Add support for VT2002P */ 43 /* 2009-07-21 Lydia Wang Add support for VT1812 */ 44 /* 2009-09-19 Lydia Wang Add support for VT1818S */ 45 /* */ 46 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ 47 48 49 #include <linux/init.h> 50 #include <linux/delay.h> 51 #include <linux/slab.h> 52 #include <linux/module.h> 53 #include <sound/core.h> 54 #include <sound/asoundef.h> 55 #include "hda_codec.h" 56 #include "hda_local.h" 57 #include "hda_jack.h" 58 59 /* Pin Widget NID */ 60 #define VT1708_HP_PIN_NID 0x20 61 #define VT1708_CD_PIN_NID 0x24 62 63 enum VIA_HDA_CODEC { 64 UNKNOWN = -1, 65 VT1708, 66 VT1709_10CH, 67 VT1709_6CH, 68 VT1708B_8CH, 69 VT1708B_4CH, 70 VT1708S, 71 VT1708BCE, 72 VT1702, 73 VT1718S, 74 VT1716S, 75 VT2002P, 76 VT1812, 77 VT1802, 78 CODEC_TYPES, 79 }; 80 81 #define VT2002P_COMPATIBLE(spec) \ 82 ((spec)->codec_type == VT2002P ||\ 83 (spec)->codec_type == VT1812 ||\ 84 (spec)->codec_type == VT1802) 85 86 #define MAX_NID_PATH_DEPTH 5 87 88 /* output-path: DAC -> ... -> pin 89 * idx[] contains the source index number of the next widget; 90 * e.g. idx[0] is the index of the DAC selected by path[1] widget 91 * multi[] indicates whether it's a selector widget with multi-connectors 92 * (i.e. the connection selection is mandatory) 93 * vol_ctl and mute_ctl contains the NIDs for the assigned mixers 94 */ 95 struct nid_path { 96 int depth; 97 hda_nid_t path[MAX_NID_PATH_DEPTH]; 98 unsigned char idx[MAX_NID_PATH_DEPTH]; 99 unsigned char multi[MAX_NID_PATH_DEPTH]; 100 unsigned int vol_ctl; 101 unsigned int mute_ctl; 102 }; 103 104 /* input-path */ 105 struct via_input { 106 hda_nid_t pin; /* input-pin or aa-mix */ 107 int adc_idx; /* ADC index to be used */ 108 int mux_idx; /* MUX index (if any) */ 109 const char *label; /* input-source label */ 110 }; 111 112 #define VIA_MAX_ADCS 3 113 114 enum { 115 STREAM_MULTI_OUT = (1 << 0), 116 STREAM_INDEP_HP = (1 << 1), 117 }; 118 119 struct via_spec { 120 /* codec parameterization */ 121 const struct snd_kcontrol_new *mixers[6]; 122 unsigned int num_mixers; 123 124 const struct hda_verb *init_verbs[5]; 125 unsigned int num_iverbs; 126 127 char stream_name_analog[32]; 128 char stream_name_hp[32]; 129 const struct hda_pcm_stream *stream_analog_playback; 130 const struct hda_pcm_stream *stream_analog_capture; 131 132 char stream_name_digital[32]; 133 const struct hda_pcm_stream *stream_digital_playback; 134 const struct hda_pcm_stream *stream_digital_capture; 135 136 /* playback */ 137 struct hda_multi_out multiout; 138 hda_nid_t slave_dig_outs[2]; 139 hda_nid_t hp_dac_nid; 140 hda_nid_t speaker_dac_nid; 141 int hp_indep_shared; /* indep HP-DAC is shared with side ch */ 142 int opened_streams; /* STREAM_* bits */ 143 int active_streams; /* STREAM_* bits */ 144 int aamix_mode; /* loopback is enabled for output-path? */ 145 146 /* Output-paths: 147 * There are different output-paths depending on the setup. 148 * out_path, hp_path and speaker_path are primary paths. If both 149 * direct DAC and aa-loopback routes are available, these contain 150 * the former paths. Meanwhile *_mix_path contain the paths with 151 * loopback mixer. (Since the loopback is only for front channel, 152 * no out_mix_path for surround channels.) 153 * The HP output has another path, hp_indep_path, which is used in 154 * the independent-HP mode. 155 */ 156 struct nid_path out_path[HDA_SIDE + 1]; 157 struct nid_path out_mix_path; 158 struct nid_path hp_path; 159 struct nid_path hp_mix_path; 160 struct nid_path hp_indep_path; 161 struct nid_path speaker_path; 162 struct nid_path speaker_mix_path; 163 164 /* capture */ 165 unsigned int num_adc_nids; 166 hda_nid_t adc_nids[VIA_MAX_ADCS]; 167 hda_nid_t mux_nids[VIA_MAX_ADCS]; 168 hda_nid_t aa_mix_nid; 169 hda_nid_t dig_in_nid; 170 171 /* capture source */ 172 bool dyn_adc_switch; 173 int num_inputs; 174 struct via_input inputs[AUTO_CFG_MAX_INS + 1]; 175 unsigned int cur_mux[VIA_MAX_ADCS]; 176 177 /* dynamic DAC switching */ 178 unsigned int cur_dac_stream_tag; 179 unsigned int cur_dac_format; 180 unsigned int cur_hp_stream_tag; 181 unsigned int cur_hp_format; 182 183 /* dynamic ADC switching */ 184 hda_nid_t cur_adc; 185 unsigned int cur_adc_stream_tag; 186 unsigned int cur_adc_format; 187 188 /* PCM information */ 189 struct hda_pcm pcm_rec[3]; 190 191 /* dynamic controls, init_verbs and input_mux */ 192 struct auto_pin_cfg autocfg; 193 struct snd_array kctls; 194 hda_nid_t private_dac_nids[AUTO_CFG_MAX_OUTS]; 195 196 /* HP mode source */ 197 unsigned int hp_independent_mode; 198 unsigned int dmic_enabled; 199 unsigned int no_pin_power_ctl; 200 enum VIA_HDA_CODEC codec_type; 201 202 /* analog low-power control */ 203 bool alc_mode; 204 205 /* smart51 setup */ 206 unsigned int smart51_nums; 207 hda_nid_t smart51_pins[2]; 208 int smart51_idxs[2]; 209 const char *smart51_labels[2]; 210 unsigned int smart51_enabled; 211 212 /* work to check hp jack state */ 213 struct hda_codec *codec; 214 struct delayed_work vt1708_hp_work; 215 int hp_work_active; 216 int vt1708_jack_detect; 217 int vt1708_hp_present; 218 219 void (*set_widgets_power_state)(struct hda_codec *codec); 220 221 struct hda_loopback_check loopback; 222 int num_loopbacks; 223 struct hda_amp_list loopback_list[8]; 224 225 /* bind capture-volume */ 226 struct hda_bind_ctls *bind_cap_vol; 227 struct hda_bind_ctls *bind_cap_sw; 228 229 struct mutex config_mutex; 230 }; 231 232 static enum VIA_HDA_CODEC get_codec_type(struct hda_codec *codec); 233 static struct via_spec * via_new_spec(struct hda_codec *codec) 234 { 235 struct via_spec *spec; 236 237 spec = kzalloc(sizeof(*spec), GFP_KERNEL); 238 if (spec == NULL) 239 return NULL; 240 241 mutex_init(&spec->config_mutex); 242 codec->spec = spec; 243 spec->codec = codec; 244 spec->codec_type = get_codec_type(codec); 245 /* VT1708BCE & VT1708S are almost same */ 246 if (spec->codec_type == VT1708BCE) 247 spec->codec_type = VT1708S; 248 return spec; 249 } 250 251 static enum VIA_HDA_CODEC get_codec_type(struct hda_codec *codec) 252 { 253 u32 vendor_id = codec->vendor_id; 254 u16 ven_id = vendor_id >> 16; 255 u16 dev_id = vendor_id & 0xffff; 256 enum VIA_HDA_CODEC codec_type; 257 258 /* get codec type */ 259 if (ven_id != 0x1106) 260 codec_type = UNKNOWN; 261 else if (dev_id >= 0x1708 && dev_id <= 0x170b) 262 codec_type = VT1708; 263 else if (dev_id >= 0xe710 && dev_id <= 0xe713) 264 codec_type = VT1709_10CH; 265 else if (dev_id >= 0xe714 && dev_id <= 0xe717) 266 codec_type = VT1709_6CH; 267 else if (dev_id >= 0xe720 && dev_id <= 0xe723) { 268 codec_type = VT1708B_8CH; 269 if (snd_hda_param_read(codec, 0x16, AC_PAR_CONNLIST_LEN) == 0x7) 270 codec_type = VT1708BCE; 271 } else if (dev_id >= 0xe724 && dev_id <= 0xe727) 272 codec_type = VT1708B_4CH; 273 else if ((dev_id & 0xfff) == 0x397 274 && (dev_id >> 12) < 8) 275 codec_type = VT1708S; 276 else if ((dev_id & 0xfff) == 0x398 277 && (dev_id >> 12) < 8) 278 codec_type = VT1702; 279 else if ((dev_id & 0xfff) == 0x428 280 && (dev_id >> 12) < 8) 281 codec_type = VT1718S; 282 else if (dev_id == 0x0433 || dev_id == 0xa721) 283 codec_type = VT1716S; 284 else if (dev_id == 0x0441 || dev_id == 0x4441) 285 codec_type = VT1718S; 286 else if (dev_id == 0x0438 || dev_id == 0x4438) 287 codec_type = VT2002P; 288 else if (dev_id == 0x0448) 289 codec_type = VT1812; 290 else if (dev_id == 0x0440) 291 codec_type = VT1708S; 292 else if ((dev_id & 0xfff) == 0x446) 293 codec_type = VT1802; 294 else 295 codec_type = UNKNOWN; 296 return codec_type; 297 }; 298 299 #define VIA_JACK_EVENT 0x20 300 #define VIA_HP_EVENT 0x01 301 #define VIA_GPIO_EVENT 0x02 302 #define VIA_LINE_EVENT 0x03 303 304 enum { 305 VIA_CTL_WIDGET_VOL, 306 VIA_CTL_WIDGET_MUTE, 307 VIA_CTL_WIDGET_ANALOG_MUTE, 308 }; 309 310 static void analog_low_current_mode(struct hda_codec *codec); 311 static bool is_aa_path_mute(struct hda_codec *codec); 312 313 #define hp_detect_with_aa(codec) \ 314 (snd_hda_get_bool_hint(codec, "analog_loopback_hp_detect") == 1 && \ 315 !is_aa_path_mute(codec)) 316 317 static void vt1708_stop_hp_work(struct via_spec *spec) 318 { 319 if (spec->codec_type != VT1708 || spec->autocfg.hp_pins[0] == 0) 320 return; 321 if (spec->hp_work_active) { 322 snd_hda_codec_write(spec->codec, 0x1, 0, 0xf81, 1); 323 cancel_delayed_work_sync(&spec->vt1708_hp_work); 324 spec->hp_work_active = 0; 325 } 326 } 327 328 static void vt1708_update_hp_work(struct via_spec *spec) 329 { 330 if (spec->codec_type != VT1708 || spec->autocfg.hp_pins[0] == 0) 331 return; 332 if (spec->vt1708_jack_detect && 333 (spec->active_streams || hp_detect_with_aa(spec->codec))) { 334 if (!spec->hp_work_active) { 335 snd_hda_codec_write(spec->codec, 0x1, 0, 0xf81, 0); 336 schedule_delayed_work(&spec->vt1708_hp_work, 337 msecs_to_jiffies(100)); 338 spec->hp_work_active = 1; 339 } 340 } else if (!hp_detect_with_aa(spec->codec)) 341 vt1708_stop_hp_work(spec); 342 } 343 344 static void set_widgets_power_state(struct hda_codec *codec) 345 { 346 struct via_spec *spec = codec->spec; 347 if (spec->set_widgets_power_state) 348 spec->set_widgets_power_state(codec); 349 } 350 351 static int analog_input_switch_put(struct snd_kcontrol *kcontrol, 352 struct snd_ctl_elem_value *ucontrol) 353 { 354 int change = snd_hda_mixer_amp_switch_put(kcontrol, ucontrol); 355 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 356 357 set_widgets_power_state(codec); 358 analog_low_current_mode(snd_kcontrol_chip(kcontrol)); 359 vt1708_update_hp_work(codec->spec); 360 return change; 361 } 362 363 /* modify .put = snd_hda_mixer_amp_switch_put */ 364 #define ANALOG_INPUT_MUTE \ 365 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \ 366 .name = NULL, \ 367 .index = 0, \ 368 .info = snd_hda_mixer_amp_switch_info, \ 369 .get = snd_hda_mixer_amp_switch_get, \ 370 .put = analog_input_switch_put, \ 371 .private_value = HDA_COMPOSE_AMP_VAL(0, 3, 0, 0) } 372 373 static const struct snd_kcontrol_new via_control_templates[] = { 374 HDA_CODEC_VOLUME(NULL, 0, 0, 0), 375 HDA_CODEC_MUTE(NULL, 0, 0, 0), 376 ANALOG_INPUT_MUTE, 377 }; 378 379 380 /* add dynamic controls */ 381 static struct snd_kcontrol_new *__via_clone_ctl(struct via_spec *spec, 382 const struct snd_kcontrol_new *tmpl, 383 const char *name) 384 { 385 struct snd_kcontrol_new *knew; 386 387 snd_array_init(&spec->kctls, sizeof(*knew), 32); 388 knew = snd_array_new(&spec->kctls); 389 if (!knew) 390 return NULL; 391 *knew = *tmpl; 392 if (!name) 393 name = tmpl->name; 394 if (name) { 395 knew->name = kstrdup(name, GFP_KERNEL); 396 if (!knew->name) 397 return NULL; 398 } 399 return knew; 400 } 401 402 static int __via_add_control(struct via_spec *spec, int type, const char *name, 403 int idx, unsigned long val) 404 { 405 struct snd_kcontrol_new *knew; 406 407 knew = __via_clone_ctl(spec, &via_control_templates[type], name); 408 if (!knew) 409 return -ENOMEM; 410 knew->index = idx; 411 if (get_amp_nid_(val)) 412 knew->subdevice = HDA_SUBDEV_AMP_FLAG; 413 knew->private_value = val; 414 return 0; 415 } 416 417 #define via_add_control(spec, type, name, val) \ 418 __via_add_control(spec, type, name, 0, val) 419 420 #define via_clone_control(spec, tmpl) __via_clone_ctl(spec, tmpl, NULL) 421 422 static void via_free_kctls(struct hda_codec *codec) 423 { 424 struct via_spec *spec = codec->spec; 425 426 if (spec->kctls.list) { 427 struct snd_kcontrol_new *kctl = spec->kctls.list; 428 int i; 429 for (i = 0; i < spec->kctls.used; i++) 430 kfree(kctl[i].name); 431 } 432 snd_array_free(&spec->kctls); 433 } 434 435 /* create input playback/capture controls for the given pin */ 436 static int via_new_analog_input(struct via_spec *spec, const char *ctlname, 437 int type_idx, int idx, int mix_nid) 438 { 439 char name[32]; 440 int err; 441 442 sprintf(name, "%s Playback Volume", ctlname); 443 err = __via_add_control(spec, VIA_CTL_WIDGET_VOL, name, type_idx, 444 HDA_COMPOSE_AMP_VAL(mix_nid, 3, idx, HDA_INPUT)); 445 if (err < 0) 446 return err; 447 sprintf(name, "%s Playback Switch", ctlname); 448 err = __via_add_control(spec, VIA_CTL_WIDGET_ANALOG_MUTE, name, type_idx, 449 HDA_COMPOSE_AMP_VAL(mix_nid, 3, idx, HDA_INPUT)); 450 if (err < 0) 451 return err; 452 return 0; 453 } 454 455 #define get_connection_index(codec, mux, nid) \ 456 snd_hda_get_conn_index(codec, mux, nid, 0) 457 458 static bool check_amp_caps(struct hda_codec *codec, hda_nid_t nid, int dir, 459 unsigned int mask) 460 { 461 unsigned int caps; 462 if (!nid) 463 return false; 464 caps = get_wcaps(codec, nid); 465 if (dir == HDA_INPUT) 466 caps &= AC_WCAP_IN_AMP; 467 else 468 caps &= AC_WCAP_OUT_AMP; 469 if (!caps) 470 return false; 471 if (query_amp_caps(codec, nid, dir) & mask) 472 return true; 473 return false; 474 } 475 476 #define have_mute(codec, nid, dir) \ 477 check_amp_caps(codec, nid, dir, AC_AMPCAP_MUTE) 478 479 /* enable/disable the output-route mixers */ 480 static void activate_output_mix(struct hda_codec *codec, struct nid_path *path, 481 hda_nid_t mix_nid, int idx, bool enable) 482 { 483 int i, num, val; 484 485 if (!path) 486 return; 487 num = snd_hda_get_conn_list(codec, mix_nid, NULL); 488 for (i = 0; i < num; i++) { 489 if (i == idx) 490 val = AMP_IN_UNMUTE(i); 491 else 492 val = AMP_IN_MUTE(i); 493 snd_hda_codec_write(codec, mix_nid, 0, 494 AC_VERB_SET_AMP_GAIN_MUTE, val); 495 } 496 } 497 498 /* enable/disable the output-route */ 499 static void activate_output_path(struct hda_codec *codec, struct nid_path *path, 500 bool enable, bool force) 501 { 502 struct via_spec *spec = codec->spec; 503 int i; 504 for (i = 0; i < path->depth; i++) { 505 hda_nid_t src, dst; 506 int idx = path->idx[i]; 507 src = path->path[i]; 508 if (i < path->depth - 1) 509 dst = path->path[i + 1]; 510 else 511 dst = 0; 512 if (enable && path->multi[i]) 513 snd_hda_codec_write(codec, dst, 0, 514 AC_VERB_SET_CONNECT_SEL, idx); 515 if (!force && (dst == spec->aa_mix_nid)) 516 continue; 517 if (have_mute(codec, dst, HDA_INPUT)) 518 activate_output_mix(codec, path, dst, idx, enable); 519 if (!force && (src == path->vol_ctl || src == path->mute_ctl)) 520 continue; 521 if (have_mute(codec, src, HDA_OUTPUT)) { 522 int val = enable ? AMP_OUT_UNMUTE : AMP_OUT_MUTE; 523 snd_hda_codec_write(codec, src, 0, 524 AC_VERB_SET_AMP_GAIN_MUTE, val); 525 } 526 } 527 } 528 529 /* set the given pin as output */ 530 static void init_output_pin(struct hda_codec *codec, hda_nid_t pin, 531 int pin_type) 532 { 533 if (!pin) 534 return; 535 snd_hda_codec_write(codec, pin, 0, AC_VERB_SET_PIN_WIDGET_CONTROL, 536 pin_type); 537 if (snd_hda_query_pin_caps(codec, pin) & AC_PINCAP_EAPD) 538 snd_hda_codec_write(codec, pin, 0, 539 AC_VERB_SET_EAPD_BTLENABLE, 0x02); 540 } 541 542 static void via_auto_init_output(struct hda_codec *codec, 543 struct nid_path *path, int pin_type) 544 { 545 unsigned int caps; 546 hda_nid_t pin; 547 548 if (!path->depth) 549 return; 550 pin = path->path[path->depth - 1]; 551 552 init_output_pin(codec, pin, pin_type); 553 caps = query_amp_caps(codec, pin, HDA_OUTPUT); 554 if (caps & AC_AMPCAP_MUTE) { 555 unsigned int val; 556 val = (caps & AC_AMPCAP_OFFSET) >> AC_AMPCAP_OFFSET_SHIFT; 557 snd_hda_codec_write(codec, pin, 0, AC_VERB_SET_AMP_GAIN_MUTE, 558 AMP_OUT_MUTE | val); 559 } 560 activate_output_path(codec, path, true, true); /* force on */ 561 } 562 563 static void via_auto_init_multi_out(struct hda_codec *codec) 564 { 565 struct via_spec *spec = codec->spec; 566 struct nid_path *path; 567 int i; 568 569 for (i = 0; i < spec->autocfg.line_outs + spec->smart51_nums; i++) { 570 path = &spec->out_path[i]; 571 if (!i && spec->aamix_mode && spec->out_mix_path.depth) 572 path = &spec->out_mix_path; 573 via_auto_init_output(codec, path, PIN_OUT); 574 } 575 } 576 577 /* deactivate the inactive headphone-paths */ 578 static void deactivate_hp_paths(struct hda_codec *codec) 579 { 580 struct via_spec *spec = codec->spec; 581 int shared = spec->hp_indep_shared; 582 583 if (spec->hp_independent_mode) { 584 activate_output_path(codec, &spec->hp_path, false, false); 585 activate_output_path(codec, &spec->hp_mix_path, false, false); 586 if (shared) 587 activate_output_path(codec, &spec->out_path[shared], 588 false, false); 589 } else if (spec->aamix_mode || !spec->hp_path.depth) { 590 activate_output_path(codec, &spec->hp_indep_path, false, false); 591 activate_output_path(codec, &spec->hp_path, false, false); 592 } else { 593 activate_output_path(codec, &spec->hp_indep_path, false, false); 594 activate_output_path(codec, &spec->hp_mix_path, false, false); 595 } 596 } 597 598 static void via_auto_init_hp_out(struct hda_codec *codec) 599 { 600 struct via_spec *spec = codec->spec; 601 602 if (!spec->hp_path.depth) { 603 via_auto_init_output(codec, &spec->hp_mix_path, PIN_HP); 604 return; 605 } 606 deactivate_hp_paths(codec); 607 if (spec->hp_independent_mode) 608 via_auto_init_output(codec, &spec->hp_indep_path, PIN_HP); 609 else if (spec->aamix_mode) 610 via_auto_init_output(codec, &spec->hp_mix_path, PIN_HP); 611 else 612 via_auto_init_output(codec, &spec->hp_path, PIN_HP); 613 } 614 615 static void via_auto_init_speaker_out(struct hda_codec *codec) 616 { 617 struct via_spec *spec = codec->spec; 618 619 if (!spec->autocfg.speaker_outs) 620 return; 621 if (!spec->speaker_path.depth) { 622 via_auto_init_output(codec, &spec->speaker_mix_path, PIN_OUT); 623 return; 624 } 625 if (!spec->aamix_mode) { 626 activate_output_path(codec, &spec->speaker_mix_path, 627 false, false); 628 via_auto_init_output(codec, &spec->speaker_path, PIN_OUT); 629 } else { 630 activate_output_path(codec, &spec->speaker_path, false, false); 631 via_auto_init_output(codec, &spec->speaker_mix_path, PIN_OUT); 632 } 633 } 634 635 static bool is_smart51_pins(struct hda_codec *codec, hda_nid_t pin); 636 static void via_hp_automute(struct hda_codec *codec); 637 638 static void via_auto_init_analog_input(struct hda_codec *codec) 639 { 640 struct via_spec *spec = codec->spec; 641 const struct auto_pin_cfg *cfg = &spec->autocfg; 642 hda_nid_t conn[HDA_MAX_CONNECTIONS]; 643 unsigned int ctl; 644 int i, num_conns; 645 646 /* init ADCs */ 647 for (i = 0; i < spec->num_adc_nids; i++) { 648 snd_hda_codec_write(codec, spec->adc_nids[i], 0, 649 AC_VERB_SET_AMP_GAIN_MUTE, 650 AMP_IN_UNMUTE(0)); 651 } 652 653 /* init pins */ 654 for (i = 0; i < cfg->num_inputs; i++) { 655 hda_nid_t nid = cfg->inputs[i].pin; 656 if (spec->smart51_enabled && is_smart51_pins(codec, nid)) 657 ctl = PIN_OUT; 658 else if (cfg->inputs[i].type == AUTO_PIN_MIC) 659 ctl = PIN_VREF50; 660 else 661 ctl = PIN_IN; 662 snd_hda_codec_write(codec, nid, 0, 663 AC_VERB_SET_PIN_WIDGET_CONTROL, ctl); 664 } 665 666 /* init input-src */ 667 for (i = 0; i < spec->num_adc_nids; i++) { 668 int adc_idx = spec->inputs[spec->cur_mux[i]].adc_idx; 669 /* secondary ADCs must have the unique MUX */ 670 if (i > 0 && !spec->mux_nids[i]) 671 break; 672 if (spec->mux_nids[adc_idx]) { 673 int mux_idx = spec->inputs[spec->cur_mux[i]].mux_idx; 674 snd_hda_codec_write(codec, spec->mux_nids[adc_idx], 0, 675 AC_VERB_SET_CONNECT_SEL, 676 mux_idx); 677 } 678 if (spec->dyn_adc_switch) 679 break; /* only one input-src */ 680 } 681 682 /* init aa-mixer */ 683 if (!spec->aa_mix_nid) 684 return; 685 num_conns = snd_hda_get_connections(codec, spec->aa_mix_nid, conn, 686 ARRAY_SIZE(conn)); 687 for (i = 0; i < num_conns; i++) { 688 unsigned int caps = get_wcaps(codec, conn[i]); 689 if (get_wcaps_type(caps) == AC_WID_PIN) 690 snd_hda_codec_write(codec, spec->aa_mix_nid, 0, 691 AC_VERB_SET_AMP_GAIN_MUTE, 692 AMP_IN_MUTE(i)); 693 } 694 } 695 696 static void update_power_state(struct hda_codec *codec, hda_nid_t nid, 697 unsigned int parm) 698 { 699 if (snd_hda_codec_read(codec, nid, 0, 700 AC_VERB_GET_POWER_STATE, 0) == parm) 701 return; 702 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_POWER_STATE, parm); 703 } 704 705 static void set_pin_power_state(struct hda_codec *codec, hda_nid_t nid, 706 unsigned int *affected_parm) 707 { 708 unsigned parm; 709 unsigned def_conf = snd_hda_codec_get_pincfg(codec, nid); 710 unsigned no_presence = (def_conf & AC_DEFCFG_MISC) 711 >> AC_DEFCFG_MISC_SHIFT 712 & AC_DEFCFG_MISC_NO_PRESENCE; /* do not support pin sense */ 713 struct via_spec *spec = codec->spec; 714 unsigned present = 0; 715 716 no_presence |= spec->no_pin_power_ctl; 717 if (!no_presence) 718 present = snd_hda_jack_detect(codec, nid); 719 if ((spec->smart51_enabled && is_smart51_pins(codec, nid)) 720 || ((no_presence || present) 721 && get_defcfg_connect(def_conf) != AC_JACK_PORT_NONE)) { 722 *affected_parm = AC_PWRST_D0; /* if it's connected */ 723 parm = AC_PWRST_D0; 724 } else 725 parm = AC_PWRST_D3; 726 727 update_power_state(codec, nid, parm); 728 } 729 730 static int via_pin_power_ctl_info(struct snd_kcontrol *kcontrol, 731 struct snd_ctl_elem_info *uinfo) 732 { 733 static const char * const texts[] = { 734 "Disabled", "Enabled" 735 }; 736 737 uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; 738 uinfo->count = 1; 739 uinfo->value.enumerated.items = 2; 740 if (uinfo->value.enumerated.item >= uinfo->value.enumerated.items) 741 uinfo->value.enumerated.item = uinfo->value.enumerated.items - 1; 742 strcpy(uinfo->value.enumerated.name, 743 texts[uinfo->value.enumerated.item]); 744 return 0; 745 } 746 747 static int via_pin_power_ctl_get(struct snd_kcontrol *kcontrol, 748 struct snd_ctl_elem_value *ucontrol) 749 { 750 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 751 struct via_spec *spec = codec->spec; 752 ucontrol->value.enumerated.item[0] = !spec->no_pin_power_ctl; 753 return 0; 754 } 755 756 static int via_pin_power_ctl_put(struct snd_kcontrol *kcontrol, 757 struct snd_ctl_elem_value *ucontrol) 758 { 759 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 760 struct via_spec *spec = codec->spec; 761 unsigned int val = !ucontrol->value.enumerated.item[0]; 762 763 if (val == spec->no_pin_power_ctl) 764 return 0; 765 spec->no_pin_power_ctl = val; 766 set_widgets_power_state(codec); 767 analog_low_current_mode(codec); 768 return 1; 769 } 770 771 static const struct snd_kcontrol_new via_pin_power_ctl_enum = { 772 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 773 .name = "Dynamic Power-Control", 774 .info = via_pin_power_ctl_info, 775 .get = via_pin_power_ctl_get, 776 .put = via_pin_power_ctl_put, 777 }; 778 779 780 static int via_independent_hp_info(struct snd_kcontrol *kcontrol, 781 struct snd_ctl_elem_info *uinfo) 782 { 783 static const char * const texts[] = { "OFF", "ON" }; 784 785 uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; 786 uinfo->count = 1; 787 uinfo->value.enumerated.items = 2; 788 if (uinfo->value.enumerated.item >= 2) 789 uinfo->value.enumerated.item = 1; 790 strcpy(uinfo->value.enumerated.name, 791 texts[uinfo->value.enumerated.item]); 792 return 0; 793 } 794 795 static int via_independent_hp_get(struct snd_kcontrol *kcontrol, 796 struct snd_ctl_elem_value *ucontrol) 797 { 798 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 799 struct via_spec *spec = codec->spec; 800 801 ucontrol->value.enumerated.item[0] = spec->hp_independent_mode; 802 return 0; 803 } 804 805 /* adjust spec->multiout setup according to the current flags */ 806 static void setup_playback_multi_pcm(struct via_spec *spec) 807 { 808 const struct auto_pin_cfg *cfg = &spec->autocfg; 809 spec->multiout.num_dacs = cfg->line_outs + spec->smart51_nums; 810 spec->multiout.hp_nid = 0; 811 if (!spec->hp_independent_mode) { 812 if (!spec->hp_indep_shared) 813 spec->multiout.hp_nid = spec->hp_dac_nid; 814 } else { 815 if (spec->hp_indep_shared) 816 spec->multiout.num_dacs = cfg->line_outs - 1; 817 } 818 } 819 820 /* update DAC setups according to indep-HP switch; 821 * this function is called only when indep-HP is modified 822 */ 823 static void switch_indep_hp_dacs(struct hda_codec *codec) 824 { 825 struct via_spec *spec = codec->spec; 826 int shared = spec->hp_indep_shared; 827 hda_nid_t shared_dac, hp_dac; 828 829 if (!spec->opened_streams) 830 return; 831 832 shared_dac = shared ? spec->multiout.dac_nids[shared] : 0; 833 hp_dac = spec->hp_dac_nid; 834 if (spec->hp_independent_mode) { 835 /* switch to indep-HP mode */ 836 if (spec->active_streams & STREAM_MULTI_OUT) { 837 __snd_hda_codec_cleanup_stream(codec, hp_dac, 1); 838 __snd_hda_codec_cleanup_stream(codec, shared_dac, 1); 839 } 840 if (spec->active_streams & STREAM_INDEP_HP) 841 snd_hda_codec_setup_stream(codec, hp_dac, 842 spec->cur_hp_stream_tag, 0, 843 spec->cur_hp_format); 844 } else { 845 /* back to HP or shared-DAC */ 846 if (spec->active_streams & STREAM_INDEP_HP) 847 __snd_hda_codec_cleanup_stream(codec, hp_dac, 1); 848 if (spec->active_streams & STREAM_MULTI_OUT) { 849 hda_nid_t dac; 850 int ch; 851 if (shared_dac) { /* reset mutli-ch DAC */ 852 dac = shared_dac; 853 ch = shared * 2; 854 } else { /* reset HP DAC */ 855 dac = hp_dac; 856 ch = 0; 857 } 858 snd_hda_codec_setup_stream(codec, dac, 859 spec->cur_dac_stream_tag, ch, 860 spec->cur_dac_format); 861 } 862 } 863 setup_playback_multi_pcm(spec); 864 } 865 866 static int via_independent_hp_put(struct snd_kcontrol *kcontrol, 867 struct snd_ctl_elem_value *ucontrol) 868 { 869 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 870 struct via_spec *spec = codec->spec; 871 int cur, shared; 872 873 mutex_lock(&spec->config_mutex); 874 cur = !!ucontrol->value.enumerated.item[0]; 875 if (spec->hp_independent_mode == cur) { 876 mutex_unlock(&spec->config_mutex); 877 return 0; 878 } 879 spec->hp_independent_mode = cur; 880 shared = spec->hp_indep_shared; 881 deactivate_hp_paths(codec); 882 if (cur) 883 activate_output_path(codec, &spec->hp_indep_path, true, false); 884 else { 885 if (shared) 886 activate_output_path(codec, &spec->out_path[shared], 887 true, false); 888 if (spec->aamix_mode || !spec->hp_path.depth) 889 activate_output_path(codec, &spec->hp_mix_path, 890 true, false); 891 else 892 activate_output_path(codec, &spec->hp_path, 893 true, false); 894 } 895 896 switch_indep_hp_dacs(codec); 897 mutex_unlock(&spec->config_mutex); 898 899 /* update jack power state */ 900 set_widgets_power_state(codec); 901 via_hp_automute(codec); 902 return 1; 903 } 904 905 static const struct snd_kcontrol_new via_hp_mixer = { 906 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 907 .name = "Independent HP", 908 .info = via_independent_hp_info, 909 .get = via_independent_hp_get, 910 .put = via_independent_hp_put, 911 }; 912 913 static int via_hp_build(struct hda_codec *codec) 914 { 915 struct via_spec *spec = codec->spec; 916 struct snd_kcontrol_new *knew; 917 hda_nid_t nid; 918 919 nid = spec->autocfg.hp_pins[0]; 920 knew = via_clone_control(spec, &via_hp_mixer); 921 if (knew == NULL) 922 return -ENOMEM; 923 924 knew->subdevice = HDA_SUBDEV_NID_FLAG | nid; 925 926 return 0; 927 } 928 929 static void notify_aa_path_ctls(struct hda_codec *codec) 930 { 931 struct via_spec *spec = codec->spec; 932 int i; 933 934 for (i = 0; i < spec->smart51_nums; i++) { 935 struct snd_kcontrol *ctl; 936 struct snd_ctl_elem_id id; 937 memset(&id, 0, sizeof(id)); 938 id.iface = SNDRV_CTL_ELEM_IFACE_MIXER; 939 sprintf(id.name, "%s Playback Volume", spec->smart51_labels[i]); 940 ctl = snd_hda_find_mixer_ctl(codec, id.name); 941 if (ctl) 942 snd_ctl_notify(codec->bus->card, 943 SNDRV_CTL_EVENT_MASK_VALUE, 944 &ctl->id); 945 } 946 } 947 948 static void mute_aa_path(struct hda_codec *codec, int mute) 949 { 950 struct via_spec *spec = codec->spec; 951 int val = mute ? HDA_AMP_MUTE : HDA_AMP_UNMUTE; 952 int i; 953 954 /* check AA path's mute status */ 955 for (i = 0; i < spec->smart51_nums; i++) { 956 if (spec->smart51_idxs[i] < 0) 957 continue; 958 snd_hda_codec_amp_stereo(codec, spec->aa_mix_nid, 959 HDA_INPUT, spec->smart51_idxs[i], 960 HDA_AMP_MUTE, val); 961 } 962 } 963 964 static bool is_smart51_pins(struct hda_codec *codec, hda_nid_t pin) 965 { 966 struct via_spec *spec = codec->spec; 967 int i; 968 969 for (i = 0; i < spec->smart51_nums; i++) 970 if (spec->smart51_pins[i] == pin) 971 return true; 972 return false; 973 } 974 975 static int via_smart51_get(struct snd_kcontrol *kcontrol, 976 struct snd_ctl_elem_value *ucontrol) 977 { 978 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 979 struct via_spec *spec = codec->spec; 980 981 *ucontrol->value.integer.value = spec->smart51_enabled; 982 return 0; 983 } 984 985 static int via_smart51_put(struct snd_kcontrol *kcontrol, 986 struct snd_ctl_elem_value *ucontrol) 987 { 988 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 989 struct via_spec *spec = codec->spec; 990 int out_in = *ucontrol->value.integer.value 991 ? AC_PINCTL_OUT_EN : AC_PINCTL_IN_EN; 992 int i; 993 994 for (i = 0; i < spec->smart51_nums; i++) { 995 hda_nid_t nid = spec->smart51_pins[i]; 996 unsigned int parm; 997 998 parm = snd_hda_codec_read(codec, nid, 0, 999 AC_VERB_GET_PIN_WIDGET_CONTROL, 0); 1000 parm &= ~(AC_PINCTL_IN_EN | AC_PINCTL_OUT_EN); 1001 parm |= out_in; 1002 snd_hda_codec_write(codec, nid, 0, 1003 AC_VERB_SET_PIN_WIDGET_CONTROL, 1004 parm); 1005 if (out_in == AC_PINCTL_OUT_EN) { 1006 mute_aa_path(codec, 1); 1007 notify_aa_path_ctls(codec); 1008 } 1009 } 1010 spec->smart51_enabled = *ucontrol->value.integer.value; 1011 set_widgets_power_state(codec); 1012 return 1; 1013 } 1014 1015 static const struct snd_kcontrol_new via_smart51_mixer = { 1016 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 1017 .name = "Smart 5.1", 1018 .count = 1, 1019 .info = snd_ctl_boolean_mono_info, 1020 .get = via_smart51_get, 1021 .put = via_smart51_put, 1022 }; 1023 1024 static int via_smart51_build(struct hda_codec *codec) 1025 { 1026 struct via_spec *spec = codec->spec; 1027 1028 if (!spec->smart51_nums) 1029 return 0; 1030 if (!via_clone_control(spec, &via_smart51_mixer)) 1031 return -ENOMEM; 1032 return 0; 1033 } 1034 1035 /* check AA path's mute status */ 1036 static bool is_aa_path_mute(struct hda_codec *codec) 1037 { 1038 struct via_spec *spec = codec->spec; 1039 const struct hda_amp_list *p; 1040 int i, ch, v; 1041 1042 for (i = 0; i < spec->num_loopbacks; i++) { 1043 p = &spec->loopback_list[i]; 1044 for (ch = 0; ch < 2; ch++) { 1045 v = snd_hda_codec_amp_read(codec, p->nid, ch, p->dir, 1046 p->idx); 1047 if (!(v & HDA_AMP_MUTE) && v > 0) 1048 return false; 1049 } 1050 } 1051 return true; 1052 } 1053 1054 /* enter/exit analog low-current mode */ 1055 static void __analog_low_current_mode(struct hda_codec *codec, bool force) 1056 { 1057 struct via_spec *spec = codec->spec; 1058 bool enable; 1059 unsigned int verb, parm; 1060 1061 if (spec->no_pin_power_ctl) 1062 enable = false; 1063 else 1064 enable = is_aa_path_mute(codec) && !spec->opened_streams; 1065 if (enable == spec->alc_mode && !force) 1066 return; 1067 spec->alc_mode = enable; 1068 1069 /* decide low current mode's verb & parameter */ 1070 switch (spec->codec_type) { 1071 case VT1708B_8CH: 1072 case VT1708B_4CH: 1073 verb = 0xf70; 1074 parm = enable ? 0x02 : 0x00; /* 0x02: 2/3x, 0x00: 1x */ 1075 break; 1076 case VT1708S: 1077 case VT1718S: 1078 case VT1716S: 1079 verb = 0xf73; 1080 parm = enable ? 0x51 : 0xe1; /* 0x51: 4/28x, 0xe1: 1x */ 1081 break; 1082 case VT1702: 1083 verb = 0xf73; 1084 parm = enable ? 0x01 : 0x1d; /* 0x01: 4/40x, 0x1d: 1x */ 1085 break; 1086 case VT2002P: 1087 case VT1812: 1088 case VT1802: 1089 verb = 0xf93; 1090 parm = enable ? 0x00 : 0xe0; /* 0x00: 4/40x, 0xe0: 1x */ 1091 break; 1092 default: 1093 return; /* other codecs are not supported */ 1094 } 1095 /* send verb */ 1096 snd_hda_codec_write(codec, codec->afg, 0, verb, parm); 1097 } 1098 1099 static void analog_low_current_mode(struct hda_codec *codec) 1100 { 1101 return __analog_low_current_mode(codec, false); 1102 } 1103 1104 /* 1105 * generic initialization of ADC, input mixers and output mixers 1106 */ 1107 static const struct hda_verb vt1708_init_verbs[] = { 1108 /* power down jack detect function */ 1109 {0x1, 0xf81, 0x1}, 1110 { } 1111 }; 1112 1113 static void set_stream_open(struct hda_codec *codec, int bit, bool active) 1114 { 1115 struct via_spec *spec = codec->spec; 1116 1117 if (active) 1118 spec->opened_streams |= bit; 1119 else 1120 spec->opened_streams &= ~bit; 1121 analog_low_current_mode(codec); 1122 } 1123 1124 static int via_playback_multi_pcm_open(struct hda_pcm_stream *hinfo, 1125 struct hda_codec *codec, 1126 struct snd_pcm_substream *substream) 1127 { 1128 struct via_spec *spec = codec->spec; 1129 const struct auto_pin_cfg *cfg = &spec->autocfg; 1130 int err; 1131 1132 spec->multiout.num_dacs = cfg->line_outs + spec->smart51_nums; 1133 spec->multiout.max_channels = spec->multiout.num_dacs * 2; 1134 set_stream_open(codec, STREAM_MULTI_OUT, true); 1135 err = snd_hda_multi_out_analog_open(codec, &spec->multiout, substream, 1136 hinfo); 1137 if (err < 0) { 1138 set_stream_open(codec, STREAM_MULTI_OUT, false); 1139 return err; 1140 } 1141 return 0; 1142 } 1143 1144 static int via_playback_multi_pcm_close(struct hda_pcm_stream *hinfo, 1145 struct hda_codec *codec, 1146 struct snd_pcm_substream *substream) 1147 { 1148 set_stream_open(codec, STREAM_MULTI_OUT, false); 1149 return 0; 1150 } 1151 1152 static int via_playback_hp_pcm_open(struct hda_pcm_stream *hinfo, 1153 struct hda_codec *codec, 1154 struct snd_pcm_substream *substream) 1155 { 1156 struct via_spec *spec = codec->spec; 1157 1158 if (snd_BUG_ON(!spec->hp_dac_nid)) 1159 return -EINVAL; 1160 set_stream_open(codec, STREAM_INDEP_HP, true); 1161 return 0; 1162 } 1163 1164 static int via_playback_hp_pcm_close(struct hda_pcm_stream *hinfo, 1165 struct hda_codec *codec, 1166 struct snd_pcm_substream *substream) 1167 { 1168 set_stream_open(codec, STREAM_INDEP_HP, false); 1169 return 0; 1170 } 1171 1172 static int via_playback_multi_pcm_prepare(struct hda_pcm_stream *hinfo, 1173 struct hda_codec *codec, 1174 unsigned int stream_tag, 1175 unsigned int format, 1176 struct snd_pcm_substream *substream) 1177 { 1178 struct via_spec *spec = codec->spec; 1179 1180 mutex_lock(&spec->config_mutex); 1181 setup_playback_multi_pcm(spec); 1182 snd_hda_multi_out_analog_prepare(codec, &spec->multiout, stream_tag, 1183 format, substream); 1184 /* remember for dynamic DAC switch with indep-HP */ 1185 spec->active_streams |= STREAM_MULTI_OUT; 1186 spec->cur_dac_stream_tag = stream_tag; 1187 spec->cur_dac_format = format; 1188 mutex_unlock(&spec->config_mutex); 1189 vt1708_update_hp_work(spec); 1190 return 0; 1191 } 1192 1193 static int via_playback_hp_pcm_prepare(struct hda_pcm_stream *hinfo, 1194 struct hda_codec *codec, 1195 unsigned int stream_tag, 1196 unsigned int format, 1197 struct snd_pcm_substream *substream) 1198 { 1199 struct via_spec *spec = codec->spec; 1200 1201 mutex_lock(&spec->config_mutex); 1202 if (spec->hp_independent_mode) 1203 snd_hda_codec_setup_stream(codec, spec->hp_dac_nid, 1204 stream_tag, 0, format); 1205 spec->active_streams |= STREAM_INDEP_HP; 1206 spec->cur_hp_stream_tag = stream_tag; 1207 spec->cur_hp_format = format; 1208 mutex_unlock(&spec->config_mutex); 1209 vt1708_update_hp_work(spec); 1210 return 0; 1211 } 1212 1213 static int via_playback_multi_pcm_cleanup(struct hda_pcm_stream *hinfo, 1214 struct hda_codec *codec, 1215 struct snd_pcm_substream *substream) 1216 { 1217 struct via_spec *spec = codec->spec; 1218 1219 mutex_lock(&spec->config_mutex); 1220 snd_hda_multi_out_analog_cleanup(codec, &spec->multiout); 1221 spec->active_streams &= ~STREAM_MULTI_OUT; 1222 mutex_unlock(&spec->config_mutex); 1223 vt1708_update_hp_work(spec); 1224 return 0; 1225 } 1226 1227 static int via_playback_hp_pcm_cleanup(struct hda_pcm_stream *hinfo, 1228 struct hda_codec *codec, 1229 struct snd_pcm_substream *substream) 1230 { 1231 struct via_spec *spec = codec->spec; 1232 1233 mutex_lock(&spec->config_mutex); 1234 if (spec->hp_independent_mode) 1235 snd_hda_codec_setup_stream(codec, spec->hp_dac_nid, 0, 0, 0); 1236 spec->active_streams &= ~STREAM_INDEP_HP; 1237 mutex_unlock(&spec->config_mutex); 1238 vt1708_update_hp_work(spec); 1239 return 0; 1240 } 1241 1242 /* 1243 * Digital out 1244 */ 1245 static int via_dig_playback_pcm_open(struct hda_pcm_stream *hinfo, 1246 struct hda_codec *codec, 1247 struct snd_pcm_substream *substream) 1248 { 1249 struct via_spec *spec = codec->spec; 1250 return snd_hda_multi_out_dig_open(codec, &spec->multiout); 1251 } 1252 1253 static int via_dig_playback_pcm_close(struct hda_pcm_stream *hinfo, 1254 struct hda_codec *codec, 1255 struct snd_pcm_substream *substream) 1256 { 1257 struct via_spec *spec = codec->spec; 1258 return snd_hda_multi_out_dig_close(codec, &spec->multiout); 1259 } 1260 1261 static int via_dig_playback_pcm_prepare(struct hda_pcm_stream *hinfo, 1262 struct hda_codec *codec, 1263 unsigned int stream_tag, 1264 unsigned int format, 1265 struct snd_pcm_substream *substream) 1266 { 1267 struct via_spec *spec = codec->spec; 1268 return snd_hda_multi_out_dig_prepare(codec, &spec->multiout, 1269 stream_tag, format, substream); 1270 } 1271 1272 static int via_dig_playback_pcm_cleanup(struct hda_pcm_stream *hinfo, 1273 struct hda_codec *codec, 1274 struct snd_pcm_substream *substream) 1275 { 1276 struct via_spec *spec = codec->spec; 1277 snd_hda_multi_out_dig_cleanup(codec, &spec->multiout); 1278 return 0; 1279 } 1280 1281 /* 1282 * Analog capture 1283 */ 1284 static int via_capture_pcm_prepare(struct hda_pcm_stream *hinfo, 1285 struct hda_codec *codec, 1286 unsigned int stream_tag, 1287 unsigned int format, 1288 struct snd_pcm_substream *substream) 1289 { 1290 struct via_spec *spec = codec->spec; 1291 1292 snd_hda_codec_setup_stream(codec, spec->adc_nids[substream->number], 1293 stream_tag, 0, format); 1294 return 0; 1295 } 1296 1297 static int via_capture_pcm_cleanup(struct hda_pcm_stream *hinfo, 1298 struct hda_codec *codec, 1299 struct snd_pcm_substream *substream) 1300 { 1301 struct via_spec *spec = codec->spec; 1302 snd_hda_codec_cleanup_stream(codec, spec->adc_nids[substream->number]); 1303 return 0; 1304 } 1305 1306 /* analog capture with dynamic ADC switching */ 1307 static int via_dyn_adc_capture_pcm_prepare(struct hda_pcm_stream *hinfo, 1308 struct hda_codec *codec, 1309 unsigned int stream_tag, 1310 unsigned int format, 1311 struct snd_pcm_substream *substream) 1312 { 1313 struct via_spec *spec = codec->spec; 1314 int adc_idx = spec->inputs[spec->cur_mux[0]].adc_idx; 1315 1316 mutex_lock(&spec->config_mutex); 1317 spec->cur_adc = spec->adc_nids[adc_idx]; 1318 spec->cur_adc_stream_tag = stream_tag; 1319 spec->cur_adc_format = format; 1320 snd_hda_codec_setup_stream(codec, spec->cur_adc, stream_tag, 0, format); 1321 mutex_unlock(&spec->config_mutex); 1322 return 0; 1323 } 1324 1325 static int via_dyn_adc_capture_pcm_cleanup(struct hda_pcm_stream *hinfo, 1326 struct hda_codec *codec, 1327 struct snd_pcm_substream *substream) 1328 { 1329 struct via_spec *spec = codec->spec; 1330 1331 mutex_lock(&spec->config_mutex); 1332 snd_hda_codec_cleanup_stream(codec, spec->cur_adc); 1333 spec->cur_adc = 0; 1334 mutex_unlock(&spec->config_mutex); 1335 return 0; 1336 } 1337 1338 /* re-setup the stream if running; called from input-src put */ 1339 static bool via_dyn_adc_pcm_resetup(struct hda_codec *codec, int cur) 1340 { 1341 struct via_spec *spec = codec->spec; 1342 int adc_idx = spec->inputs[cur].adc_idx; 1343 hda_nid_t adc = spec->adc_nids[adc_idx]; 1344 bool ret = false; 1345 1346 mutex_lock(&spec->config_mutex); 1347 if (spec->cur_adc && spec->cur_adc != adc) { 1348 /* stream is running, let's swap the current ADC */ 1349 __snd_hda_codec_cleanup_stream(codec, spec->cur_adc, 1); 1350 spec->cur_adc = adc; 1351 snd_hda_codec_setup_stream(codec, adc, 1352 spec->cur_adc_stream_tag, 0, 1353 spec->cur_adc_format); 1354 ret = true; 1355 } 1356 mutex_unlock(&spec->config_mutex); 1357 return ret; 1358 } 1359 1360 static const struct hda_pcm_stream via_pcm_analog_playback = { 1361 .substreams = 1, 1362 .channels_min = 2, 1363 .channels_max = 8, 1364 /* NID is set in via_build_pcms */ 1365 .ops = { 1366 .open = via_playback_multi_pcm_open, 1367 .close = via_playback_multi_pcm_close, 1368 .prepare = via_playback_multi_pcm_prepare, 1369 .cleanup = via_playback_multi_pcm_cleanup 1370 }, 1371 }; 1372 1373 static const struct hda_pcm_stream via_pcm_hp_playback = { 1374 .substreams = 1, 1375 .channels_min = 2, 1376 .channels_max = 2, 1377 /* NID is set in via_build_pcms */ 1378 .ops = { 1379 .open = via_playback_hp_pcm_open, 1380 .close = via_playback_hp_pcm_close, 1381 .prepare = via_playback_hp_pcm_prepare, 1382 .cleanup = via_playback_hp_pcm_cleanup 1383 }, 1384 }; 1385 1386 static const struct hda_pcm_stream vt1708_pcm_analog_s16_playback = { 1387 .substreams = 1, 1388 .channels_min = 2, 1389 .channels_max = 8, 1390 /* NID is set in via_build_pcms */ 1391 /* We got noisy outputs on the right channel on VT1708 when 1392 * 24bit samples are used. Until any workaround is found, 1393 * disable the 24bit format, so far. 1394 */ 1395 .formats = SNDRV_PCM_FMTBIT_S16_LE, 1396 .ops = { 1397 .open = via_playback_multi_pcm_open, 1398 .close = via_playback_multi_pcm_close, 1399 .prepare = via_playback_multi_pcm_prepare, 1400 .cleanup = via_playback_multi_pcm_cleanup 1401 }, 1402 }; 1403 1404 static const struct hda_pcm_stream via_pcm_analog_capture = { 1405 .substreams = 1, /* will be changed in via_build_pcms() */ 1406 .channels_min = 2, 1407 .channels_max = 2, 1408 /* NID is set in via_build_pcms */ 1409 .ops = { 1410 .prepare = via_capture_pcm_prepare, 1411 .cleanup = via_capture_pcm_cleanup 1412 }, 1413 }; 1414 1415 static const struct hda_pcm_stream via_pcm_dyn_adc_analog_capture = { 1416 .substreams = 1, 1417 .channels_min = 2, 1418 .channels_max = 2, 1419 /* NID is set in via_build_pcms */ 1420 .ops = { 1421 .prepare = via_dyn_adc_capture_pcm_prepare, 1422 .cleanup = via_dyn_adc_capture_pcm_cleanup, 1423 }, 1424 }; 1425 1426 static const struct hda_pcm_stream via_pcm_digital_playback = { 1427 .substreams = 1, 1428 .channels_min = 2, 1429 .channels_max = 2, 1430 /* NID is set in via_build_pcms */ 1431 .ops = { 1432 .open = via_dig_playback_pcm_open, 1433 .close = via_dig_playback_pcm_close, 1434 .prepare = via_dig_playback_pcm_prepare, 1435 .cleanup = via_dig_playback_pcm_cleanup 1436 }, 1437 }; 1438 1439 static const struct hda_pcm_stream via_pcm_digital_capture = { 1440 .substreams = 1, 1441 .channels_min = 2, 1442 .channels_max = 2, 1443 }; 1444 1445 /* 1446 * slave controls for virtual master 1447 */ 1448 static const char * const via_slave_vols[] = { 1449 "Front Playback Volume", 1450 "Surround Playback Volume", 1451 "Center Playback Volume", 1452 "LFE Playback Volume", 1453 "Side Playback Volume", 1454 "Headphone Playback Volume", 1455 "Speaker Playback Volume", 1456 NULL, 1457 }; 1458 1459 static const char * const via_slave_sws[] = { 1460 "Front Playback Switch", 1461 "Surround Playback Switch", 1462 "Center Playback Switch", 1463 "LFE Playback Switch", 1464 "Side Playback Switch", 1465 "Headphone Playback Switch", 1466 "Speaker Playback Switch", 1467 NULL, 1468 }; 1469 1470 static int via_build_controls(struct hda_codec *codec) 1471 { 1472 struct via_spec *spec = codec->spec; 1473 struct snd_kcontrol *kctl; 1474 int err, i; 1475 1476 spec->no_pin_power_ctl = 1; 1477 if (spec->set_widgets_power_state) 1478 if (!via_clone_control(spec, &via_pin_power_ctl_enum)) 1479 return -ENOMEM; 1480 1481 for (i = 0; i < spec->num_mixers; i++) { 1482 err = snd_hda_add_new_ctls(codec, spec->mixers[i]); 1483 if (err < 0) 1484 return err; 1485 } 1486 1487 if (spec->multiout.dig_out_nid) { 1488 err = snd_hda_create_spdif_out_ctls(codec, 1489 spec->multiout.dig_out_nid, 1490 spec->multiout.dig_out_nid); 1491 if (err < 0) 1492 return err; 1493 err = snd_hda_create_spdif_share_sw(codec, 1494 &spec->multiout); 1495 if (err < 0) 1496 return err; 1497 spec->multiout.share_spdif = 1; 1498 } 1499 if (spec->dig_in_nid) { 1500 err = snd_hda_create_spdif_in_ctls(codec, spec->dig_in_nid); 1501 if (err < 0) 1502 return err; 1503 } 1504 1505 /* if we have no master control, let's create it */ 1506 if (!snd_hda_find_mixer_ctl(codec, "Master Playback Volume")) { 1507 unsigned int vmaster_tlv[4]; 1508 snd_hda_set_vmaster_tlv(codec, spec->multiout.dac_nids[0], 1509 HDA_OUTPUT, vmaster_tlv); 1510 err = snd_hda_add_vmaster(codec, "Master Playback Volume", 1511 vmaster_tlv, via_slave_vols); 1512 if (err < 0) 1513 return err; 1514 } 1515 if (!snd_hda_find_mixer_ctl(codec, "Master Playback Switch")) { 1516 err = snd_hda_add_vmaster(codec, "Master Playback Switch", 1517 NULL, via_slave_sws); 1518 if (err < 0) 1519 return err; 1520 } 1521 1522 /* assign Capture Source enums to NID */ 1523 kctl = snd_hda_find_mixer_ctl(codec, "Input Source"); 1524 for (i = 0; kctl && i < kctl->count; i++) { 1525 err = snd_hda_add_nid(codec, kctl, i, spec->mux_nids[i]); 1526 if (err < 0) 1527 return err; 1528 } 1529 1530 via_free_kctls(codec); /* no longer needed */ 1531 1532 err = snd_hda_jack_add_kctls(codec, &spec->autocfg); 1533 if (err < 0) 1534 return err; 1535 1536 return 0; 1537 } 1538 1539 static int via_build_pcms(struct hda_codec *codec) 1540 { 1541 struct via_spec *spec = codec->spec; 1542 struct hda_pcm *info = spec->pcm_rec; 1543 1544 codec->num_pcms = 0; 1545 codec->pcm_info = info; 1546 1547 if (spec->multiout.num_dacs || spec->num_adc_nids) { 1548 snprintf(spec->stream_name_analog, 1549 sizeof(spec->stream_name_analog), 1550 "%s Analog", codec->chip_name); 1551 info->name = spec->stream_name_analog; 1552 1553 if (spec->multiout.num_dacs) { 1554 if (!spec->stream_analog_playback) 1555 spec->stream_analog_playback = 1556 &via_pcm_analog_playback; 1557 info->stream[SNDRV_PCM_STREAM_PLAYBACK] = 1558 *spec->stream_analog_playback; 1559 info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = 1560 spec->multiout.dac_nids[0]; 1561 info->stream[SNDRV_PCM_STREAM_PLAYBACK].channels_max = 1562 spec->multiout.max_channels; 1563 } 1564 1565 if (!spec->stream_analog_capture) { 1566 if (spec->dyn_adc_switch) 1567 spec->stream_analog_capture = 1568 &via_pcm_dyn_adc_analog_capture; 1569 else 1570 spec->stream_analog_capture = 1571 &via_pcm_analog_capture; 1572 } 1573 if (spec->num_adc_nids) { 1574 info->stream[SNDRV_PCM_STREAM_CAPTURE] = 1575 *spec->stream_analog_capture; 1576 info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = 1577 spec->adc_nids[0]; 1578 if (!spec->dyn_adc_switch) 1579 info->stream[SNDRV_PCM_STREAM_CAPTURE].substreams = 1580 spec->num_adc_nids; 1581 } 1582 codec->num_pcms++; 1583 info++; 1584 } 1585 1586 if (spec->multiout.dig_out_nid || spec->dig_in_nid) { 1587 snprintf(spec->stream_name_digital, 1588 sizeof(spec->stream_name_digital), 1589 "%s Digital", codec->chip_name); 1590 info->name = spec->stream_name_digital; 1591 info->pcm_type = HDA_PCM_TYPE_SPDIF; 1592 if (spec->multiout.dig_out_nid) { 1593 if (!spec->stream_digital_playback) 1594 spec->stream_digital_playback = 1595 &via_pcm_digital_playback; 1596 info->stream[SNDRV_PCM_STREAM_PLAYBACK] = 1597 *spec->stream_digital_playback; 1598 info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = 1599 spec->multiout.dig_out_nid; 1600 } 1601 if (spec->dig_in_nid) { 1602 if (!spec->stream_digital_capture) 1603 spec->stream_digital_capture = 1604 &via_pcm_digital_capture; 1605 info->stream[SNDRV_PCM_STREAM_CAPTURE] = 1606 *spec->stream_digital_capture; 1607 info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = 1608 spec->dig_in_nid; 1609 } 1610 codec->num_pcms++; 1611 info++; 1612 } 1613 1614 if (spec->hp_dac_nid) { 1615 snprintf(spec->stream_name_hp, sizeof(spec->stream_name_hp), 1616 "%s HP", codec->chip_name); 1617 info->name = spec->stream_name_hp; 1618 info->stream[SNDRV_PCM_STREAM_PLAYBACK] = via_pcm_hp_playback; 1619 info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = 1620 spec->hp_dac_nid; 1621 codec->num_pcms++; 1622 info++; 1623 } 1624 return 0; 1625 } 1626 1627 static void via_free(struct hda_codec *codec) 1628 { 1629 struct via_spec *spec = codec->spec; 1630 1631 if (!spec) 1632 return; 1633 1634 via_free_kctls(codec); 1635 vt1708_stop_hp_work(spec); 1636 kfree(spec->bind_cap_vol); 1637 kfree(spec->bind_cap_sw); 1638 kfree(spec); 1639 } 1640 1641 /* mute/unmute outputs */ 1642 static void toggle_output_mutes(struct hda_codec *codec, int num_pins, 1643 hda_nid_t *pins, bool mute) 1644 { 1645 int i; 1646 for (i = 0; i < num_pins; i++) { 1647 unsigned int parm = snd_hda_codec_read(codec, pins[i], 0, 1648 AC_VERB_GET_PIN_WIDGET_CONTROL, 0); 1649 if (parm & AC_PINCTL_IN_EN) 1650 continue; 1651 if (mute) 1652 parm &= ~AC_PINCTL_OUT_EN; 1653 else 1654 parm |= AC_PINCTL_OUT_EN; 1655 snd_hda_codec_write(codec, pins[i], 0, 1656 AC_VERB_SET_PIN_WIDGET_CONTROL, parm); 1657 } 1658 } 1659 1660 /* mute internal speaker if line-out is plugged */ 1661 static void via_line_automute(struct hda_codec *codec, int present) 1662 { 1663 struct via_spec *spec = codec->spec; 1664 1665 if (!spec->autocfg.speaker_outs) 1666 return; 1667 if (!present) 1668 present = snd_hda_jack_detect(codec, 1669 spec->autocfg.line_out_pins[0]); 1670 toggle_output_mutes(codec, spec->autocfg.speaker_outs, 1671 spec->autocfg.speaker_pins, 1672 present); 1673 } 1674 1675 /* mute internal speaker if HP is plugged */ 1676 static void via_hp_automute(struct hda_codec *codec) 1677 { 1678 int present = 0; 1679 int nums; 1680 struct via_spec *spec = codec->spec; 1681 1682 if (!spec->hp_independent_mode && spec->autocfg.hp_pins[0] && 1683 (spec->codec_type != VT1708 || spec->vt1708_jack_detect)) 1684 present = snd_hda_jack_detect(codec, spec->autocfg.hp_pins[0]); 1685 1686 if (spec->smart51_enabled) 1687 nums = spec->autocfg.line_outs + spec->smart51_nums; 1688 else 1689 nums = spec->autocfg.line_outs; 1690 toggle_output_mutes(codec, nums, spec->autocfg.line_out_pins, present); 1691 1692 via_line_automute(codec, present); 1693 } 1694 1695 static void via_gpio_control(struct hda_codec *codec) 1696 { 1697 unsigned int gpio_data; 1698 unsigned int vol_counter; 1699 unsigned int vol; 1700 unsigned int master_vol; 1701 1702 struct via_spec *spec = codec->spec; 1703 1704 gpio_data = snd_hda_codec_read(codec, codec->afg, 0, 1705 AC_VERB_GET_GPIO_DATA, 0) & 0x03; 1706 1707 vol_counter = (snd_hda_codec_read(codec, codec->afg, 0, 1708 0xF84, 0) & 0x3F0000) >> 16; 1709 1710 vol = vol_counter & 0x1F; 1711 master_vol = snd_hda_codec_read(codec, 0x1A, 0, 1712 AC_VERB_GET_AMP_GAIN_MUTE, 1713 AC_AMP_GET_INPUT); 1714 1715 if (gpio_data == 0x02) { 1716 /* unmute line out */ 1717 snd_hda_codec_write(codec, spec->autocfg.line_out_pins[0], 0, 1718 AC_VERB_SET_PIN_WIDGET_CONTROL, 1719 PIN_OUT); 1720 if (vol_counter & 0x20) { 1721 /* decrease volume */ 1722 if (vol > master_vol) 1723 vol = master_vol; 1724 snd_hda_codec_amp_stereo(codec, 0x1A, HDA_INPUT, 1725 0, HDA_AMP_VOLMASK, 1726 master_vol-vol); 1727 } else { 1728 /* increase volume */ 1729 snd_hda_codec_amp_stereo(codec, 0x1A, HDA_INPUT, 0, 1730 HDA_AMP_VOLMASK, 1731 ((master_vol+vol) > 0x2A) ? 0x2A : 1732 (master_vol+vol)); 1733 } 1734 } else if (!(gpio_data & 0x02)) { 1735 /* mute line out */ 1736 snd_hda_codec_write(codec, spec->autocfg.line_out_pins[0], 0, 1737 AC_VERB_SET_PIN_WIDGET_CONTROL, 1738 0); 1739 } 1740 } 1741 1742 /* unsolicited event for jack sensing */ 1743 static void via_unsol_event(struct hda_codec *codec, 1744 unsigned int res) 1745 { 1746 res >>= 26; 1747 res = snd_hda_jack_get_action(codec, res); 1748 1749 if (res & VIA_JACK_EVENT) 1750 set_widgets_power_state(codec); 1751 1752 res &= ~VIA_JACK_EVENT; 1753 1754 if (res == VIA_HP_EVENT || res == VIA_LINE_EVENT) 1755 via_hp_automute(codec); 1756 else if (res == VIA_GPIO_EVENT) 1757 via_gpio_control(codec); 1758 snd_hda_jack_report_sync(codec); 1759 } 1760 1761 #ifdef CONFIG_PM 1762 static int via_suspend(struct hda_codec *codec, pm_message_t state) 1763 { 1764 struct via_spec *spec = codec->spec; 1765 vt1708_stop_hp_work(spec); 1766 return 0; 1767 } 1768 #endif 1769 1770 #ifdef CONFIG_SND_HDA_POWER_SAVE 1771 static int via_check_power_status(struct hda_codec *codec, hda_nid_t nid) 1772 { 1773 struct via_spec *spec = codec->spec; 1774 return snd_hda_check_amp_list_power(codec, &spec->loopback, nid); 1775 } 1776 #endif 1777 1778 /* 1779 */ 1780 1781 static int via_init(struct hda_codec *codec); 1782 1783 static const struct hda_codec_ops via_patch_ops = { 1784 .build_controls = via_build_controls, 1785 .build_pcms = via_build_pcms, 1786 .init = via_init, 1787 .free = via_free, 1788 .unsol_event = via_unsol_event, 1789 #ifdef CONFIG_PM 1790 .suspend = via_suspend, 1791 #endif 1792 #ifdef CONFIG_SND_HDA_POWER_SAVE 1793 .check_power_status = via_check_power_status, 1794 #endif 1795 }; 1796 1797 static bool is_empty_dac(struct hda_codec *codec, hda_nid_t dac) 1798 { 1799 struct via_spec *spec = codec->spec; 1800 int i; 1801 1802 for (i = 0; i < spec->multiout.num_dacs; i++) { 1803 if (spec->multiout.dac_nids[i] == dac) 1804 return false; 1805 } 1806 if (spec->hp_dac_nid == dac) 1807 return false; 1808 return true; 1809 } 1810 1811 static bool __parse_output_path(struct hda_codec *codec, hda_nid_t nid, 1812 hda_nid_t target_dac, int with_aa_mix, 1813 struct nid_path *path, int depth) 1814 { 1815 struct via_spec *spec = codec->spec; 1816 hda_nid_t conn[8]; 1817 int i, nums; 1818 1819 if (nid == spec->aa_mix_nid) { 1820 if (!with_aa_mix) 1821 return false; 1822 with_aa_mix = 2; /* mark aa-mix is included */ 1823 } 1824 1825 nums = snd_hda_get_connections(codec, nid, conn, ARRAY_SIZE(conn)); 1826 for (i = 0; i < nums; i++) { 1827 if (get_wcaps_type(get_wcaps(codec, conn[i])) != AC_WID_AUD_OUT) 1828 continue; 1829 if (conn[i] == target_dac || is_empty_dac(codec, conn[i])) { 1830 /* aa-mix is requested but not included? */ 1831 if (!(spec->aa_mix_nid && with_aa_mix == 1)) 1832 goto found; 1833 } 1834 } 1835 if (depth >= MAX_NID_PATH_DEPTH) 1836 return false; 1837 for (i = 0; i < nums; i++) { 1838 unsigned int type; 1839 type = get_wcaps_type(get_wcaps(codec, conn[i])); 1840 if (type == AC_WID_AUD_OUT) 1841 continue; 1842 if (__parse_output_path(codec, conn[i], target_dac, 1843 with_aa_mix, path, depth + 1)) 1844 goto found; 1845 } 1846 return false; 1847 1848 found: 1849 path->path[path->depth] = conn[i]; 1850 path->idx[path->depth] = i; 1851 if (nums > 1 && get_wcaps_type(get_wcaps(codec, nid)) != AC_WID_AUD_MIX) 1852 path->multi[path->depth] = 1; 1853 path->depth++; 1854 return true; 1855 } 1856 1857 static bool parse_output_path(struct hda_codec *codec, hda_nid_t nid, 1858 hda_nid_t target_dac, int with_aa_mix, 1859 struct nid_path *path) 1860 { 1861 if (__parse_output_path(codec, nid, target_dac, with_aa_mix, path, 1)) { 1862 path->path[path->depth] = nid; 1863 path->depth++; 1864 snd_printdd("output-path: depth=%d, %02x/%02x/%02x/%02x/%02x\n", 1865 path->depth, path->path[0], path->path[1], 1866 path->path[2], path->path[3], path->path[4]); 1867 return true; 1868 } 1869 return false; 1870 } 1871 1872 static int via_auto_fill_dac_nids(struct hda_codec *codec) 1873 { 1874 struct via_spec *spec = codec->spec; 1875 const struct auto_pin_cfg *cfg = &spec->autocfg; 1876 int i, dac_num; 1877 hda_nid_t nid; 1878 1879 spec->multiout.dac_nids = spec->private_dac_nids; 1880 dac_num = 0; 1881 for (i = 0; i < cfg->line_outs; i++) { 1882 hda_nid_t dac = 0; 1883 nid = cfg->line_out_pins[i]; 1884 if (!nid) 1885 continue; 1886 if (parse_output_path(codec, nid, 0, 0, &spec->out_path[i])) 1887 dac = spec->out_path[i].path[0]; 1888 if (!i && parse_output_path(codec, nid, dac, 1, 1889 &spec->out_mix_path)) 1890 dac = spec->out_mix_path.path[0]; 1891 if (dac) { 1892 spec->private_dac_nids[i] = dac; 1893 dac_num++; 1894 } 1895 } 1896 if (!spec->out_path[0].depth && spec->out_mix_path.depth) { 1897 spec->out_path[0] = spec->out_mix_path; 1898 spec->out_mix_path.depth = 0; 1899 } 1900 spec->multiout.num_dacs = dac_num; 1901 return 0; 1902 } 1903 1904 static int create_ch_ctls(struct hda_codec *codec, const char *pfx, 1905 int chs, bool check_dac, struct nid_path *path) 1906 { 1907 struct via_spec *spec = codec->spec; 1908 char name[32]; 1909 hda_nid_t dac, pin, sel, nid; 1910 int err; 1911 1912 dac = check_dac ? path->path[0] : 0; 1913 pin = path->path[path->depth - 1]; 1914 sel = path->depth > 1 ? path->path[1] : 0; 1915 1916 if (dac && check_amp_caps(codec, dac, HDA_OUTPUT, AC_AMPCAP_NUM_STEPS)) 1917 nid = dac; 1918 else if (check_amp_caps(codec, pin, HDA_OUTPUT, AC_AMPCAP_NUM_STEPS)) 1919 nid = pin; 1920 else if (check_amp_caps(codec, sel, HDA_OUTPUT, AC_AMPCAP_NUM_STEPS)) 1921 nid = sel; 1922 else 1923 nid = 0; 1924 if (nid) { 1925 sprintf(name, "%s Playback Volume", pfx); 1926 err = via_add_control(spec, VIA_CTL_WIDGET_VOL, name, 1927 HDA_COMPOSE_AMP_VAL(nid, chs, 0, HDA_OUTPUT)); 1928 if (err < 0) 1929 return err; 1930 path->vol_ctl = nid; 1931 } 1932 1933 if (dac && check_amp_caps(codec, dac, HDA_OUTPUT, AC_AMPCAP_MUTE)) 1934 nid = dac; 1935 else if (check_amp_caps(codec, pin, HDA_OUTPUT, AC_AMPCAP_MUTE)) 1936 nid = pin; 1937 else if (check_amp_caps(codec, sel, HDA_OUTPUT, AC_AMPCAP_MUTE)) 1938 nid = sel; 1939 else 1940 nid = 0; 1941 if (nid) { 1942 sprintf(name, "%s Playback Switch", pfx); 1943 err = via_add_control(spec, VIA_CTL_WIDGET_MUTE, name, 1944 HDA_COMPOSE_AMP_VAL(nid, chs, 0, HDA_OUTPUT)); 1945 if (err < 0) 1946 return err; 1947 path->mute_ctl = nid; 1948 } 1949 return 0; 1950 } 1951 1952 static void mangle_smart51(struct hda_codec *codec) 1953 { 1954 struct via_spec *spec = codec->spec; 1955 struct auto_pin_cfg *cfg = &spec->autocfg; 1956 struct auto_pin_cfg_item *ins = cfg->inputs; 1957 int i, j, nums, attr; 1958 int pins[AUTO_CFG_MAX_INS]; 1959 1960 for (attr = INPUT_PIN_ATTR_REAR; attr >= INPUT_PIN_ATTR_NORMAL; attr--) { 1961 nums = 0; 1962 for (i = 0; i < cfg->num_inputs; i++) { 1963 unsigned int def; 1964 if (ins[i].type > AUTO_PIN_LINE_IN) 1965 continue; 1966 def = snd_hda_codec_get_pincfg(codec, ins[i].pin); 1967 if (snd_hda_get_input_pin_attr(def) != attr) 1968 continue; 1969 for (j = 0; j < nums; j++) 1970 if (ins[pins[j]].type < ins[i].type) { 1971 memmove(pins + j + 1, pins + j, 1972 (nums - j) * sizeof(int)); 1973 break; 1974 } 1975 pins[j] = i; 1976 nums++; 1977 } 1978 if (cfg->line_outs + nums < 3) 1979 continue; 1980 for (i = 0; i < nums; i++) { 1981 hda_nid_t pin = ins[pins[i]].pin; 1982 spec->smart51_pins[spec->smart51_nums++] = pin; 1983 cfg->line_out_pins[cfg->line_outs++] = pin; 1984 if (cfg->line_outs == 3) 1985 break; 1986 } 1987 return; 1988 } 1989 } 1990 1991 static void copy_path_mixer_ctls(struct nid_path *dst, struct nid_path *src) 1992 { 1993 dst->vol_ctl = src->vol_ctl; 1994 dst->mute_ctl = src->mute_ctl; 1995 } 1996 1997 /* add playback controls from the parsed DAC table */ 1998 static int via_auto_create_multi_out_ctls(struct hda_codec *codec) 1999 { 2000 struct via_spec *spec = codec->spec; 2001 struct auto_pin_cfg *cfg = &spec->autocfg; 2002 struct nid_path *path; 2003 static const char * const chname[4] = { 2004 "Front", "Surround", "C/LFE", "Side" 2005 }; 2006 int i, idx, err; 2007 int old_line_outs; 2008 2009 /* check smart51 */ 2010 old_line_outs = cfg->line_outs; 2011 if (cfg->line_outs == 1) 2012 mangle_smart51(codec); 2013 2014 err = via_auto_fill_dac_nids(codec); 2015 if (err < 0) 2016 return err; 2017 2018 if (spec->multiout.num_dacs < 3) { 2019 spec->smart51_nums = 0; 2020 cfg->line_outs = old_line_outs; 2021 } 2022 for (i = 0; i < cfg->line_outs; i++) { 2023 hda_nid_t pin, dac; 2024 pin = cfg->line_out_pins[i]; 2025 dac = spec->multiout.dac_nids[i]; 2026 if (!pin || !dac) 2027 continue; 2028 path = spec->out_path + i; 2029 if (i == HDA_CLFE) { 2030 err = create_ch_ctls(codec, "Center", 1, true, path); 2031 if (err < 0) 2032 return err; 2033 err = create_ch_ctls(codec, "LFE", 2, true, path); 2034 if (err < 0) 2035 return err; 2036 } else { 2037 const char *pfx = chname[i]; 2038 if (cfg->line_out_type == AUTO_PIN_SPEAKER_OUT && 2039 cfg->line_outs == 1) 2040 pfx = "Speaker"; 2041 err = create_ch_ctls(codec, pfx, 3, true, path); 2042 if (err < 0) 2043 return err; 2044 } 2045 if (path != spec->out_path + i) 2046 copy_path_mixer_ctls(&spec->out_path[i], path); 2047 if (path == spec->out_path && spec->out_mix_path.depth) 2048 copy_path_mixer_ctls(&spec->out_mix_path, path); 2049 } 2050 2051 idx = get_connection_index(codec, spec->aa_mix_nid, 2052 spec->multiout.dac_nids[0]); 2053 if (idx >= 0) { 2054 /* add control to mixer */ 2055 const char *name; 2056 name = spec->out_mix_path.depth ? 2057 "PCM Loopback Playback Volume" : "PCM Playback Volume"; 2058 err = via_add_control(spec, VIA_CTL_WIDGET_VOL, name, 2059 HDA_COMPOSE_AMP_VAL(spec->aa_mix_nid, 3, 2060 idx, HDA_INPUT)); 2061 if (err < 0) 2062 return err; 2063 name = spec->out_mix_path.depth ? 2064 "PCM Loopback Playback Switch" : "PCM Playback Switch"; 2065 err = via_add_control(spec, VIA_CTL_WIDGET_MUTE, name, 2066 HDA_COMPOSE_AMP_VAL(spec->aa_mix_nid, 3, 2067 idx, HDA_INPUT)); 2068 if (err < 0) 2069 return err; 2070 } 2071 2072 cfg->line_outs = old_line_outs; 2073 2074 return 0; 2075 } 2076 2077 static int via_auto_create_hp_ctls(struct hda_codec *codec, hda_nid_t pin) 2078 { 2079 struct via_spec *spec = codec->spec; 2080 struct nid_path *path; 2081 bool check_dac; 2082 int i, err; 2083 2084 if (!pin) 2085 return 0; 2086 2087 if (!parse_output_path(codec, pin, 0, 0, &spec->hp_indep_path)) { 2088 for (i = HDA_SIDE; i >= HDA_CLFE; i--) { 2089 if (i < spec->multiout.num_dacs && 2090 parse_output_path(codec, pin, 2091 spec->multiout.dac_nids[i], 0, 2092 &spec->hp_indep_path)) { 2093 spec->hp_indep_shared = i; 2094 break; 2095 } 2096 } 2097 } 2098 if (spec->hp_indep_path.depth) { 2099 spec->hp_dac_nid = spec->hp_indep_path.path[0]; 2100 if (!spec->hp_indep_shared) 2101 spec->hp_path = spec->hp_indep_path; 2102 } 2103 /* optionally check front-path w/o AA-mix */ 2104 if (!spec->hp_path.depth) 2105 parse_output_path(codec, pin, 2106 spec->multiout.dac_nids[HDA_FRONT], 0, 2107 &spec->hp_path); 2108 2109 if (!parse_output_path(codec, pin, spec->multiout.dac_nids[HDA_FRONT], 2110 1, &spec->hp_mix_path) && !spec->hp_path.depth) 2111 return 0; 2112 2113 if (spec->hp_path.depth) { 2114 path = &spec->hp_path; 2115 check_dac = true; 2116 } else { 2117 path = &spec->hp_mix_path; 2118 check_dac = false; 2119 } 2120 err = create_ch_ctls(codec, "Headphone", 3, check_dac, path); 2121 if (err < 0) 2122 return err; 2123 if (check_dac) 2124 copy_path_mixer_ctls(&spec->hp_mix_path, path); 2125 else 2126 copy_path_mixer_ctls(&spec->hp_path, path); 2127 if (spec->hp_indep_path.depth) 2128 copy_path_mixer_ctls(&spec->hp_indep_path, path); 2129 return 0; 2130 } 2131 2132 static int via_auto_create_speaker_ctls(struct hda_codec *codec) 2133 { 2134 struct via_spec *spec = codec->spec; 2135 struct nid_path *path; 2136 bool check_dac; 2137 hda_nid_t pin, dac = 0; 2138 int err; 2139 2140 pin = spec->autocfg.speaker_pins[0]; 2141 if (!spec->autocfg.speaker_outs || !pin) 2142 return 0; 2143 2144 if (parse_output_path(codec, pin, 0, 0, &spec->speaker_path)) 2145 dac = spec->speaker_path.path[0]; 2146 if (!dac) 2147 parse_output_path(codec, pin, 2148 spec->multiout.dac_nids[HDA_FRONT], 0, 2149 &spec->speaker_path); 2150 if (!parse_output_path(codec, pin, spec->multiout.dac_nids[HDA_FRONT], 2151 1, &spec->speaker_mix_path) && !dac) 2152 return 0; 2153 2154 /* no AA-path for front? */ 2155 if (!spec->out_mix_path.depth && spec->speaker_mix_path.depth) 2156 dac = 0; 2157 2158 spec->speaker_dac_nid = dac; 2159 spec->multiout.extra_out_nid[0] = dac; 2160 if (dac) { 2161 path = &spec->speaker_path; 2162 check_dac = true; 2163 } else { 2164 path = &spec->speaker_mix_path; 2165 check_dac = false; 2166 } 2167 err = create_ch_ctls(codec, "Speaker", 3, check_dac, path); 2168 if (err < 0) 2169 return err; 2170 if (check_dac) 2171 copy_path_mixer_ctls(&spec->speaker_mix_path, path); 2172 else 2173 copy_path_mixer_ctls(&spec->speaker_path, path); 2174 return 0; 2175 } 2176 2177 #define via_aamix_ctl_info via_pin_power_ctl_info 2178 2179 static int via_aamix_ctl_get(struct snd_kcontrol *kcontrol, 2180 struct snd_ctl_elem_value *ucontrol) 2181 { 2182 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 2183 struct via_spec *spec = codec->spec; 2184 ucontrol->value.enumerated.item[0] = spec->aamix_mode; 2185 return 0; 2186 } 2187 2188 static void update_aamix_paths(struct hda_codec *codec, int do_mix, 2189 struct nid_path *nomix, struct nid_path *mix) 2190 { 2191 if (do_mix) { 2192 activate_output_path(codec, nomix, false, false); 2193 activate_output_path(codec, mix, true, false); 2194 } else { 2195 activate_output_path(codec, mix, false, false); 2196 activate_output_path(codec, nomix, true, false); 2197 } 2198 } 2199 2200 static int via_aamix_ctl_put(struct snd_kcontrol *kcontrol, 2201 struct snd_ctl_elem_value *ucontrol) 2202 { 2203 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 2204 struct via_spec *spec = codec->spec; 2205 unsigned int val = ucontrol->value.enumerated.item[0]; 2206 2207 if (val == spec->aamix_mode) 2208 return 0; 2209 spec->aamix_mode = val; 2210 /* update front path */ 2211 update_aamix_paths(codec, val, &spec->out_path[0], &spec->out_mix_path); 2212 /* update HP path */ 2213 if (!spec->hp_independent_mode) { 2214 update_aamix_paths(codec, val, &spec->hp_path, 2215 &spec->hp_mix_path); 2216 } 2217 /* update speaker path */ 2218 update_aamix_paths(codec, val, &spec->speaker_path, 2219 &spec->speaker_mix_path); 2220 return 1; 2221 } 2222 2223 static const struct snd_kcontrol_new via_aamix_ctl_enum = { 2224 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 2225 .name = "Loopback Mixing", 2226 .info = via_aamix_ctl_info, 2227 .get = via_aamix_ctl_get, 2228 .put = via_aamix_ctl_put, 2229 }; 2230 2231 static int via_auto_create_loopback_switch(struct hda_codec *codec) 2232 { 2233 struct via_spec *spec = codec->spec; 2234 2235 if (!spec->aa_mix_nid) 2236 return 0; /* no loopback switching available */ 2237 if (!(spec->out_mix_path.depth || spec->hp_mix_path.depth || 2238 spec->speaker_path.depth)) 2239 return 0; /* no loopback switching available */ 2240 if (!via_clone_control(spec, &via_aamix_ctl_enum)) 2241 return -ENOMEM; 2242 return 0; 2243 } 2244 2245 /* look for ADCs */ 2246 static int via_fill_adcs(struct hda_codec *codec) 2247 { 2248 struct via_spec *spec = codec->spec; 2249 hda_nid_t nid = codec->start_nid; 2250 int i; 2251 2252 for (i = 0; i < codec->num_nodes; i++, nid++) { 2253 unsigned int wcaps = get_wcaps(codec, nid); 2254 if (get_wcaps_type(wcaps) != AC_WID_AUD_IN) 2255 continue; 2256 if (wcaps & AC_WCAP_DIGITAL) 2257 continue; 2258 if (!(wcaps & AC_WCAP_CONN_LIST)) 2259 continue; 2260 if (spec->num_adc_nids >= ARRAY_SIZE(spec->adc_nids)) 2261 return -ENOMEM; 2262 spec->adc_nids[spec->num_adc_nids++] = nid; 2263 } 2264 return 0; 2265 } 2266 2267 /* input-src control */ 2268 static int via_mux_enum_info(struct snd_kcontrol *kcontrol, 2269 struct snd_ctl_elem_info *uinfo) 2270 { 2271 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 2272 struct via_spec *spec = codec->spec; 2273 2274 uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; 2275 uinfo->count = 1; 2276 uinfo->value.enumerated.items = spec->num_inputs; 2277 if (uinfo->value.enumerated.item >= spec->num_inputs) 2278 uinfo->value.enumerated.item = spec->num_inputs - 1; 2279 strcpy(uinfo->value.enumerated.name, 2280 spec->inputs[uinfo->value.enumerated.item].label); 2281 return 0; 2282 } 2283 2284 static int via_mux_enum_get(struct snd_kcontrol *kcontrol, 2285 struct snd_ctl_elem_value *ucontrol) 2286 { 2287 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 2288 struct via_spec *spec = codec->spec; 2289 unsigned int idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id); 2290 2291 ucontrol->value.enumerated.item[0] = spec->cur_mux[idx]; 2292 return 0; 2293 } 2294 2295 static int via_mux_enum_put(struct snd_kcontrol *kcontrol, 2296 struct snd_ctl_elem_value *ucontrol) 2297 { 2298 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 2299 struct via_spec *spec = codec->spec; 2300 unsigned int idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id); 2301 hda_nid_t mux; 2302 int cur; 2303 2304 cur = ucontrol->value.enumerated.item[0]; 2305 if (cur < 0 || cur >= spec->num_inputs) 2306 return -EINVAL; 2307 if (spec->cur_mux[idx] == cur) 2308 return 0; 2309 spec->cur_mux[idx] = cur; 2310 if (spec->dyn_adc_switch) { 2311 int adc_idx = spec->inputs[cur].adc_idx; 2312 mux = spec->mux_nids[adc_idx]; 2313 via_dyn_adc_pcm_resetup(codec, cur); 2314 } else { 2315 mux = spec->mux_nids[idx]; 2316 if (snd_BUG_ON(!mux)) 2317 return -EINVAL; 2318 } 2319 2320 if (mux) { 2321 /* switch to D0 beofre change index */ 2322 update_power_state(codec, mux, AC_PWRST_D0); 2323 snd_hda_codec_write(codec, mux, 0, 2324 AC_VERB_SET_CONNECT_SEL, 2325 spec->inputs[cur].mux_idx); 2326 } 2327 2328 /* update jack power state */ 2329 set_widgets_power_state(codec); 2330 return 0; 2331 } 2332 2333 static const struct snd_kcontrol_new via_input_src_ctl = { 2334 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 2335 /* The multiple "Capture Source" controls confuse alsamixer 2336 * So call somewhat different.. 2337 */ 2338 /* .name = "Capture Source", */ 2339 .name = "Input Source", 2340 .info = via_mux_enum_info, 2341 .get = via_mux_enum_get, 2342 .put = via_mux_enum_put, 2343 }; 2344 2345 static int create_input_src_ctls(struct hda_codec *codec, int count) 2346 { 2347 struct via_spec *spec = codec->spec; 2348 struct snd_kcontrol_new *knew; 2349 2350 if (spec->num_inputs <= 1 || !count) 2351 return 0; /* no need for single src */ 2352 2353 knew = via_clone_control(spec, &via_input_src_ctl); 2354 if (!knew) 2355 return -ENOMEM; 2356 knew->count = count; 2357 return 0; 2358 } 2359 2360 /* add the powersave loopback-list entry */ 2361 static void add_loopback_list(struct via_spec *spec, hda_nid_t mix, int idx) 2362 { 2363 struct hda_amp_list *list; 2364 2365 if (spec->num_loopbacks >= ARRAY_SIZE(spec->loopback_list) - 1) 2366 return; 2367 list = spec->loopback_list + spec->num_loopbacks; 2368 list->nid = mix; 2369 list->dir = HDA_INPUT; 2370 list->idx = idx; 2371 spec->num_loopbacks++; 2372 spec->loopback.amplist = spec->loopback_list; 2373 } 2374 2375 static bool is_reachable_nid(struct hda_codec *codec, hda_nid_t src, 2376 hda_nid_t dst) 2377 { 2378 return snd_hda_get_conn_index(codec, src, dst, 1) >= 0; 2379 } 2380 2381 /* add the input-route to the given pin */ 2382 static bool add_input_route(struct hda_codec *codec, hda_nid_t pin) 2383 { 2384 struct via_spec *spec = codec->spec; 2385 int c, idx; 2386 2387 spec->inputs[spec->num_inputs].adc_idx = -1; 2388 spec->inputs[spec->num_inputs].pin = pin; 2389 for (c = 0; c < spec->num_adc_nids; c++) { 2390 if (spec->mux_nids[c]) { 2391 idx = get_connection_index(codec, spec->mux_nids[c], 2392 pin); 2393 if (idx < 0) 2394 continue; 2395 spec->inputs[spec->num_inputs].mux_idx = idx; 2396 } else { 2397 if (!is_reachable_nid(codec, spec->adc_nids[c], pin)) 2398 continue; 2399 } 2400 spec->inputs[spec->num_inputs].adc_idx = c; 2401 /* Can primary ADC satisfy all inputs? */ 2402 if (!spec->dyn_adc_switch && 2403 spec->num_inputs > 0 && spec->inputs[0].adc_idx != c) { 2404 snd_printd(KERN_INFO 2405 "via: dynamic ADC switching enabled\n"); 2406 spec->dyn_adc_switch = 1; 2407 } 2408 return true; 2409 } 2410 return false; 2411 } 2412 2413 static int get_mux_nids(struct hda_codec *codec); 2414 2415 /* parse input-routes; fill ADCs, MUXs and input-src entries */ 2416 static int parse_analog_inputs(struct hda_codec *codec) 2417 { 2418 struct via_spec *spec = codec->spec; 2419 const struct auto_pin_cfg *cfg = &spec->autocfg; 2420 int i, err; 2421 2422 err = via_fill_adcs(codec); 2423 if (err < 0) 2424 return err; 2425 err = get_mux_nids(codec); 2426 if (err < 0) 2427 return err; 2428 2429 /* fill all input-routes */ 2430 for (i = 0; i < cfg->num_inputs; i++) { 2431 if (add_input_route(codec, cfg->inputs[i].pin)) 2432 spec->inputs[spec->num_inputs++].label = 2433 hda_get_autocfg_input_label(codec, cfg, i); 2434 } 2435 2436 /* check for internal loopback recording */ 2437 if (spec->aa_mix_nid && 2438 add_input_route(codec, spec->aa_mix_nid)) 2439 spec->inputs[spec->num_inputs++].label = "Stereo Mixer"; 2440 2441 return 0; 2442 } 2443 2444 /* create analog-loopback volume/switch controls */ 2445 static int create_loopback_ctls(struct hda_codec *codec) 2446 { 2447 struct via_spec *spec = codec->spec; 2448 const struct auto_pin_cfg *cfg = &spec->autocfg; 2449 const char *prev_label = NULL; 2450 int type_idx = 0; 2451 int i, j, err, idx; 2452 2453 if (!spec->aa_mix_nid) 2454 return 0; 2455 2456 for (i = 0; i < cfg->num_inputs; i++) { 2457 hda_nid_t pin = cfg->inputs[i].pin; 2458 const char *label = hda_get_autocfg_input_label(codec, cfg, i); 2459 2460 if (prev_label && !strcmp(label, prev_label)) 2461 type_idx++; 2462 else 2463 type_idx = 0; 2464 prev_label = label; 2465 idx = get_connection_index(codec, spec->aa_mix_nid, pin); 2466 if (idx >= 0) { 2467 err = via_new_analog_input(spec, label, type_idx, 2468 idx, spec->aa_mix_nid); 2469 if (err < 0) 2470 return err; 2471 add_loopback_list(spec, spec->aa_mix_nid, idx); 2472 } 2473 2474 /* remember the label for smart51 control */ 2475 for (j = 0; j < spec->smart51_nums; j++) { 2476 if (spec->smart51_pins[j] == pin) { 2477 spec->smart51_idxs[j] = idx; 2478 spec->smart51_labels[j] = label; 2479 break; 2480 } 2481 } 2482 } 2483 return 0; 2484 } 2485 2486 /* create mic-boost controls (if present) */ 2487 static int create_mic_boost_ctls(struct hda_codec *codec) 2488 { 2489 struct via_spec *spec = codec->spec; 2490 const struct auto_pin_cfg *cfg = &spec->autocfg; 2491 int i, err; 2492 2493 for (i = 0; i < cfg->num_inputs; i++) { 2494 hda_nid_t pin = cfg->inputs[i].pin; 2495 unsigned int caps; 2496 const char *label; 2497 char name[32]; 2498 2499 if (cfg->inputs[i].type != AUTO_PIN_MIC) 2500 continue; 2501 caps = query_amp_caps(codec, pin, HDA_INPUT); 2502 if (caps == -1 || !(caps & AC_AMPCAP_NUM_STEPS)) 2503 continue; 2504 label = hda_get_autocfg_input_label(codec, cfg, i); 2505 snprintf(name, sizeof(name), "%s Boost Volume", label); 2506 err = via_add_control(spec, VIA_CTL_WIDGET_VOL, name, 2507 HDA_COMPOSE_AMP_VAL(pin, 3, 0, HDA_INPUT)); 2508 if (err < 0) 2509 return err; 2510 } 2511 return 0; 2512 } 2513 2514 /* create capture and input-src controls for multiple streams */ 2515 static int create_multi_adc_ctls(struct hda_codec *codec) 2516 { 2517 struct via_spec *spec = codec->spec; 2518 int i, err; 2519 2520 /* create capture mixer elements */ 2521 for (i = 0; i < spec->num_adc_nids; i++) { 2522 hda_nid_t adc = spec->adc_nids[i]; 2523 err = __via_add_control(spec, VIA_CTL_WIDGET_VOL, 2524 "Capture Volume", i, 2525 HDA_COMPOSE_AMP_VAL(adc, 3, 0, 2526 HDA_INPUT)); 2527 if (err < 0) 2528 return err; 2529 err = __via_add_control(spec, VIA_CTL_WIDGET_MUTE, 2530 "Capture Switch", i, 2531 HDA_COMPOSE_AMP_VAL(adc, 3, 0, 2532 HDA_INPUT)); 2533 if (err < 0) 2534 return err; 2535 } 2536 2537 /* input-source control */ 2538 for (i = 0; i < spec->num_adc_nids; i++) 2539 if (!spec->mux_nids[i]) 2540 break; 2541 err = create_input_src_ctls(codec, i); 2542 if (err < 0) 2543 return err; 2544 return 0; 2545 } 2546 2547 /* bind capture volume/switch */ 2548 static struct snd_kcontrol_new via_bind_cap_vol_ctl = 2549 HDA_BIND_VOL("Capture Volume", 0); 2550 static struct snd_kcontrol_new via_bind_cap_sw_ctl = 2551 HDA_BIND_SW("Capture Switch", 0); 2552 2553 static int init_bind_ctl(struct via_spec *spec, struct hda_bind_ctls **ctl_ret, 2554 struct hda_ctl_ops *ops) 2555 { 2556 struct hda_bind_ctls *ctl; 2557 int i; 2558 2559 ctl = kzalloc(sizeof(*ctl) + sizeof(long) * 4, GFP_KERNEL); 2560 if (!ctl) 2561 return -ENOMEM; 2562 ctl->ops = ops; 2563 for (i = 0; i < spec->num_adc_nids; i++) 2564 ctl->values[i] = 2565 HDA_COMPOSE_AMP_VAL(spec->adc_nids[i], 3, 0, HDA_INPUT); 2566 *ctl_ret = ctl; 2567 return 0; 2568 } 2569 2570 /* create capture and input-src controls for dynamic ADC-switch case */ 2571 static int create_dyn_adc_ctls(struct hda_codec *codec) 2572 { 2573 struct via_spec *spec = codec->spec; 2574 struct snd_kcontrol_new *knew; 2575 int err; 2576 2577 /* set up the bind capture ctls */ 2578 err = init_bind_ctl(spec, &spec->bind_cap_vol, &snd_hda_bind_vol); 2579 if (err < 0) 2580 return err; 2581 err = init_bind_ctl(spec, &spec->bind_cap_sw, &snd_hda_bind_sw); 2582 if (err < 0) 2583 return err; 2584 2585 /* create capture mixer elements */ 2586 knew = via_clone_control(spec, &via_bind_cap_vol_ctl); 2587 if (!knew) 2588 return -ENOMEM; 2589 knew->private_value = (long)spec->bind_cap_vol; 2590 2591 knew = via_clone_control(spec, &via_bind_cap_sw_ctl); 2592 if (!knew) 2593 return -ENOMEM; 2594 knew->private_value = (long)spec->bind_cap_sw; 2595 2596 /* input-source control */ 2597 err = create_input_src_ctls(codec, 1); 2598 if (err < 0) 2599 return err; 2600 return 0; 2601 } 2602 2603 /* parse and create capture-related stuff */ 2604 static int via_auto_create_analog_input_ctls(struct hda_codec *codec) 2605 { 2606 struct via_spec *spec = codec->spec; 2607 int err; 2608 2609 err = parse_analog_inputs(codec); 2610 if (err < 0) 2611 return err; 2612 if (spec->dyn_adc_switch) 2613 err = create_dyn_adc_ctls(codec); 2614 else 2615 err = create_multi_adc_ctls(codec); 2616 if (err < 0) 2617 return err; 2618 err = create_loopback_ctls(codec); 2619 if (err < 0) 2620 return err; 2621 err = create_mic_boost_ctls(codec); 2622 if (err < 0) 2623 return err; 2624 return 0; 2625 } 2626 2627 static void vt1708_set_pinconfig_connect(struct hda_codec *codec, hda_nid_t nid) 2628 { 2629 unsigned int def_conf; 2630 unsigned char seqassoc; 2631 2632 def_conf = snd_hda_codec_get_pincfg(codec, nid); 2633 seqassoc = (unsigned char) get_defcfg_association(def_conf); 2634 seqassoc = (seqassoc << 4) | get_defcfg_sequence(def_conf); 2635 if (get_defcfg_connect(def_conf) == AC_JACK_PORT_NONE 2636 && (seqassoc == 0xf0 || seqassoc == 0xff)) { 2637 def_conf = def_conf & (~(AC_JACK_PORT_BOTH << 30)); 2638 snd_hda_codec_set_pincfg(codec, nid, def_conf); 2639 } 2640 2641 return; 2642 } 2643 2644 static int vt1708_jack_detect_get(struct snd_kcontrol *kcontrol, 2645 struct snd_ctl_elem_value *ucontrol) 2646 { 2647 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 2648 struct via_spec *spec = codec->spec; 2649 2650 if (spec->codec_type != VT1708) 2651 return 0; 2652 ucontrol->value.integer.value[0] = spec->vt1708_jack_detect; 2653 return 0; 2654 } 2655 2656 static int vt1708_jack_detect_put(struct snd_kcontrol *kcontrol, 2657 struct snd_ctl_elem_value *ucontrol) 2658 { 2659 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 2660 struct via_spec *spec = codec->spec; 2661 int val; 2662 2663 if (spec->codec_type != VT1708) 2664 return 0; 2665 val = !!ucontrol->value.integer.value[0]; 2666 if (spec->vt1708_jack_detect == val) 2667 return 0; 2668 spec->vt1708_jack_detect = val; 2669 if (spec->vt1708_jack_detect && 2670 snd_hda_get_bool_hint(codec, "analog_loopback_hp_detect") != 1) { 2671 mute_aa_path(codec, 1); 2672 notify_aa_path_ctls(codec); 2673 } 2674 via_hp_automute(codec); 2675 vt1708_update_hp_work(spec); 2676 return 1; 2677 } 2678 2679 static const struct snd_kcontrol_new vt1708_jack_detect_ctl = { 2680 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 2681 .name = "Jack Detect", 2682 .count = 1, 2683 .info = snd_ctl_boolean_mono_info, 2684 .get = vt1708_jack_detect_get, 2685 .put = vt1708_jack_detect_put, 2686 }; 2687 2688 static void fill_dig_outs(struct hda_codec *codec); 2689 static void fill_dig_in(struct hda_codec *codec); 2690 2691 static int via_parse_auto_config(struct hda_codec *codec) 2692 { 2693 struct via_spec *spec = codec->spec; 2694 int err; 2695 2696 err = snd_hda_parse_pin_def_config(codec, &spec->autocfg, NULL); 2697 if (err < 0) 2698 return err; 2699 if (!spec->autocfg.line_outs && !spec->autocfg.hp_pins[0]) 2700 return -EINVAL; 2701 2702 err = via_auto_create_multi_out_ctls(codec); 2703 if (err < 0) 2704 return err; 2705 err = via_auto_create_hp_ctls(codec, spec->autocfg.hp_pins[0]); 2706 if (err < 0) 2707 return err; 2708 err = via_auto_create_speaker_ctls(codec); 2709 if (err < 0) 2710 return err; 2711 err = via_auto_create_loopback_switch(codec); 2712 if (err < 0) 2713 return err; 2714 err = via_auto_create_analog_input_ctls(codec); 2715 if (err < 0) 2716 return err; 2717 2718 spec->multiout.max_channels = spec->multiout.num_dacs * 2; 2719 2720 fill_dig_outs(codec); 2721 fill_dig_in(codec); 2722 2723 if (spec->kctls.list) 2724 spec->mixers[spec->num_mixers++] = spec->kctls.list; 2725 2726 2727 if (spec->hp_dac_nid && spec->hp_mix_path.depth) { 2728 err = via_hp_build(codec); 2729 if (err < 0) 2730 return err; 2731 } 2732 2733 err = via_smart51_build(codec); 2734 if (err < 0) 2735 return err; 2736 2737 /* assign slave outs */ 2738 if (spec->slave_dig_outs[0]) 2739 codec->slave_dig_outs = spec->slave_dig_outs; 2740 2741 return 1; 2742 } 2743 2744 static void via_auto_init_dig_outs(struct hda_codec *codec) 2745 { 2746 struct via_spec *spec = codec->spec; 2747 if (spec->multiout.dig_out_nid) 2748 init_output_pin(codec, spec->autocfg.dig_out_pins[0], PIN_OUT); 2749 if (spec->slave_dig_outs[0]) 2750 init_output_pin(codec, spec->autocfg.dig_out_pins[1], PIN_OUT); 2751 } 2752 2753 static void via_auto_init_dig_in(struct hda_codec *codec) 2754 { 2755 struct via_spec *spec = codec->spec; 2756 if (!spec->dig_in_nid) 2757 return; 2758 snd_hda_codec_write(codec, spec->autocfg.dig_in_pin, 0, 2759 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN); 2760 } 2761 2762 /* initialize the unsolicited events */ 2763 static void via_auto_init_unsol_event(struct hda_codec *codec) 2764 { 2765 struct via_spec *spec = codec->spec; 2766 struct auto_pin_cfg *cfg = &spec->autocfg; 2767 unsigned int ev; 2768 int i; 2769 2770 if (cfg->hp_pins[0] && is_jack_detectable(codec, cfg->hp_pins[0])) 2771 snd_hda_jack_detect_enable(codec, cfg->hp_pins[0], 2772 VIA_HP_EVENT | VIA_JACK_EVENT); 2773 2774 if (cfg->speaker_pins[0]) 2775 ev = VIA_LINE_EVENT; 2776 else 2777 ev = 0; 2778 for (i = 0; i < cfg->line_outs; i++) { 2779 if (cfg->line_out_pins[i] && 2780 is_jack_detectable(codec, cfg->line_out_pins[i])) 2781 snd_hda_jack_detect_enable(codec, cfg->line_out_pins[i], 2782 ev | VIA_JACK_EVENT); 2783 } 2784 2785 for (i = 0; i < cfg->num_inputs; i++) { 2786 if (is_jack_detectable(codec, cfg->inputs[i].pin)) 2787 snd_hda_jack_detect_enable(codec, cfg->inputs[i].pin, 2788 VIA_JACK_EVENT); 2789 } 2790 } 2791 2792 static int via_init(struct hda_codec *codec) 2793 { 2794 struct via_spec *spec = codec->spec; 2795 int i; 2796 2797 for (i = 0; i < spec->num_iverbs; i++) 2798 snd_hda_sequence_write(codec, spec->init_verbs[i]); 2799 2800 /* init power states */ 2801 set_widgets_power_state(codec); 2802 __analog_low_current_mode(codec, true); 2803 2804 via_auto_init_multi_out(codec); 2805 via_auto_init_hp_out(codec); 2806 via_auto_init_speaker_out(codec); 2807 via_auto_init_analog_input(codec); 2808 via_auto_init_dig_outs(codec); 2809 via_auto_init_dig_in(codec); 2810 2811 via_auto_init_unsol_event(codec); 2812 2813 via_hp_automute(codec); 2814 vt1708_update_hp_work(spec); 2815 snd_hda_jack_report_sync(codec); 2816 2817 return 0; 2818 } 2819 2820 static void vt1708_update_hp_jack_state(struct work_struct *work) 2821 { 2822 struct via_spec *spec = container_of(work, struct via_spec, 2823 vt1708_hp_work.work); 2824 if (spec->codec_type != VT1708) 2825 return; 2826 snd_hda_jack_set_dirty_all(spec->codec); 2827 /* if jack state toggled */ 2828 if (spec->vt1708_hp_present 2829 != snd_hda_jack_detect(spec->codec, spec->autocfg.hp_pins[0])) { 2830 spec->vt1708_hp_present ^= 1; 2831 via_hp_automute(spec->codec); 2832 } 2833 if (spec->vt1708_jack_detect) 2834 schedule_delayed_work(&spec->vt1708_hp_work, 2835 msecs_to_jiffies(100)); 2836 } 2837 2838 static int get_mux_nids(struct hda_codec *codec) 2839 { 2840 struct via_spec *spec = codec->spec; 2841 hda_nid_t nid, conn[8]; 2842 unsigned int type; 2843 int i, n; 2844 2845 for (i = 0; i < spec->num_adc_nids; i++) { 2846 nid = spec->adc_nids[i]; 2847 while (nid) { 2848 type = get_wcaps_type(get_wcaps(codec, nid)); 2849 if (type == AC_WID_PIN) 2850 break; 2851 n = snd_hda_get_connections(codec, nid, conn, 2852 ARRAY_SIZE(conn)); 2853 if (n <= 0) 2854 break; 2855 if (n > 1) { 2856 spec->mux_nids[i] = nid; 2857 break; 2858 } 2859 nid = conn[0]; 2860 } 2861 } 2862 return 0; 2863 } 2864 2865 static int patch_vt1708(struct hda_codec *codec) 2866 { 2867 struct via_spec *spec; 2868 int err; 2869 2870 /* create a codec specific record */ 2871 spec = via_new_spec(codec); 2872 if (spec == NULL) 2873 return -ENOMEM; 2874 2875 spec->aa_mix_nid = 0x17; 2876 2877 /* Add HP and CD pin config connect bit re-config action */ 2878 vt1708_set_pinconfig_connect(codec, VT1708_HP_PIN_NID); 2879 vt1708_set_pinconfig_connect(codec, VT1708_CD_PIN_NID); 2880 2881 /* automatic parse from the BIOS config */ 2882 err = via_parse_auto_config(codec); 2883 if (err < 0) { 2884 via_free(codec); 2885 return err; 2886 } 2887 2888 /* add jack detect on/off control */ 2889 if (!via_clone_control(spec, &vt1708_jack_detect_ctl)) 2890 return -ENOMEM; 2891 2892 /* disable 32bit format on VT1708 */ 2893 if (codec->vendor_id == 0x11061708) 2894 spec->stream_analog_playback = &vt1708_pcm_analog_s16_playback; 2895 2896 spec->init_verbs[spec->num_iverbs++] = vt1708_init_verbs; 2897 2898 codec->patch_ops = via_patch_ops; 2899 2900 INIT_DELAYED_WORK(&spec->vt1708_hp_work, vt1708_update_hp_jack_state); 2901 return 0; 2902 } 2903 2904 static int patch_vt1709(struct hda_codec *codec) 2905 { 2906 struct via_spec *spec; 2907 int err; 2908 2909 /* create a codec specific record */ 2910 spec = via_new_spec(codec); 2911 if (spec == NULL) 2912 return -ENOMEM; 2913 2914 spec->aa_mix_nid = 0x18; 2915 2916 err = via_parse_auto_config(codec); 2917 if (err < 0) { 2918 via_free(codec); 2919 return err; 2920 } 2921 2922 codec->patch_ops = via_patch_ops; 2923 2924 return 0; 2925 } 2926 2927 static void set_widgets_power_state_vt1708B(struct hda_codec *codec) 2928 { 2929 struct via_spec *spec = codec->spec; 2930 int imux_is_smixer; 2931 unsigned int parm; 2932 int is_8ch = 0; 2933 if ((spec->codec_type != VT1708B_4CH) && 2934 (codec->vendor_id != 0x11064397)) 2935 is_8ch = 1; 2936 2937 /* SW0 (17h) = stereo mixer */ 2938 imux_is_smixer = 2939 (snd_hda_codec_read(codec, 0x17, 0, AC_VERB_GET_CONNECT_SEL, 0x00) 2940 == ((spec->codec_type == VT1708S) ? 5 : 0)); 2941 /* inputs */ 2942 /* PW 1/2/5 (1ah/1bh/1eh) */ 2943 parm = AC_PWRST_D3; 2944 set_pin_power_state(codec, 0x1a, &parm); 2945 set_pin_power_state(codec, 0x1b, &parm); 2946 set_pin_power_state(codec, 0x1e, &parm); 2947 if (imux_is_smixer) 2948 parm = AC_PWRST_D0; 2949 /* SW0 (17h), AIW 0/1 (13h/14h) */ 2950 update_power_state(codec, 0x17, parm); 2951 update_power_state(codec, 0x13, parm); 2952 update_power_state(codec, 0x14, parm); 2953 2954 /* outputs */ 2955 /* PW0 (19h), SW1 (18h), AOW1 (11h) */ 2956 parm = AC_PWRST_D3; 2957 set_pin_power_state(codec, 0x19, &parm); 2958 if (spec->smart51_enabled) 2959 set_pin_power_state(codec, 0x1b, &parm); 2960 update_power_state(codec, 0x18, parm); 2961 update_power_state(codec, 0x11, parm); 2962 2963 /* PW6 (22h), SW2 (26h), AOW2 (24h) */ 2964 if (is_8ch) { 2965 parm = AC_PWRST_D3; 2966 set_pin_power_state(codec, 0x22, &parm); 2967 if (spec->smart51_enabled) 2968 set_pin_power_state(codec, 0x1a, &parm); 2969 update_power_state(codec, 0x26, parm); 2970 update_power_state(codec, 0x24, parm); 2971 } else if (codec->vendor_id == 0x11064397) { 2972 /* PW7(23h), SW2(27h), AOW2(25h) */ 2973 parm = AC_PWRST_D3; 2974 set_pin_power_state(codec, 0x23, &parm); 2975 if (spec->smart51_enabled) 2976 set_pin_power_state(codec, 0x1a, &parm); 2977 update_power_state(codec, 0x27, parm); 2978 update_power_state(codec, 0x25, parm); 2979 } 2980 2981 /* PW 3/4/7 (1ch/1dh/23h) */ 2982 parm = AC_PWRST_D3; 2983 /* force to D0 for internal Speaker */ 2984 set_pin_power_state(codec, 0x1c, &parm); 2985 set_pin_power_state(codec, 0x1d, &parm); 2986 if (is_8ch) 2987 set_pin_power_state(codec, 0x23, &parm); 2988 2989 /* MW0 (16h), Sw3 (27h), AOW 0/3 (10h/25h) */ 2990 update_power_state(codec, 0x16, imux_is_smixer ? AC_PWRST_D0 : parm); 2991 update_power_state(codec, 0x10, parm); 2992 if (is_8ch) { 2993 update_power_state(codec, 0x25, parm); 2994 update_power_state(codec, 0x27, parm); 2995 } else if (codec->vendor_id == 0x11064397 && spec->hp_independent_mode) 2996 update_power_state(codec, 0x25, parm); 2997 } 2998 2999 static int patch_vt1708S(struct hda_codec *codec); 3000 static int patch_vt1708B(struct hda_codec *codec) 3001 { 3002 struct via_spec *spec; 3003 int err; 3004 3005 if (get_codec_type(codec) == VT1708BCE) 3006 return patch_vt1708S(codec); 3007 3008 /* create a codec specific record */ 3009 spec = via_new_spec(codec); 3010 if (spec == NULL) 3011 return -ENOMEM; 3012 3013 spec->aa_mix_nid = 0x16; 3014 3015 /* automatic parse from the BIOS config */ 3016 err = via_parse_auto_config(codec); 3017 if (err < 0) { 3018 via_free(codec); 3019 return err; 3020 } 3021 3022 codec->patch_ops = via_patch_ops; 3023 3024 spec->set_widgets_power_state = set_widgets_power_state_vt1708B; 3025 3026 return 0; 3027 } 3028 3029 /* Patch for VT1708S */ 3030 static const struct hda_verb vt1708S_init_verbs[] = { 3031 /* Enable Mic Boost Volume backdoor */ 3032 {0x1, 0xf98, 0x1}, 3033 /* don't bybass mixer */ 3034 {0x1, 0xf88, 0xc0}, 3035 { } 3036 }; 3037 3038 /* fill out digital output widgets; one for master and one for slave outputs */ 3039 static void fill_dig_outs(struct hda_codec *codec) 3040 { 3041 struct via_spec *spec = codec->spec; 3042 int i; 3043 3044 for (i = 0; i < spec->autocfg.dig_outs; i++) { 3045 hda_nid_t nid; 3046 int conn; 3047 3048 nid = spec->autocfg.dig_out_pins[i]; 3049 if (!nid) 3050 continue; 3051 conn = snd_hda_get_connections(codec, nid, &nid, 1); 3052 if (conn < 1) 3053 continue; 3054 if (!spec->multiout.dig_out_nid) 3055 spec->multiout.dig_out_nid = nid; 3056 else { 3057 spec->slave_dig_outs[0] = nid; 3058 break; /* at most two dig outs */ 3059 } 3060 } 3061 } 3062 3063 static void fill_dig_in(struct hda_codec *codec) 3064 { 3065 struct via_spec *spec = codec->spec; 3066 hda_nid_t dig_nid; 3067 int i, err; 3068 3069 if (!spec->autocfg.dig_in_pin) 3070 return; 3071 3072 dig_nid = codec->start_nid; 3073 for (i = 0; i < codec->num_nodes; i++, dig_nid++) { 3074 unsigned int wcaps = get_wcaps(codec, dig_nid); 3075 if (get_wcaps_type(wcaps) != AC_WID_AUD_IN) 3076 continue; 3077 if (!(wcaps & AC_WCAP_DIGITAL)) 3078 continue; 3079 if (!(wcaps & AC_WCAP_CONN_LIST)) 3080 continue; 3081 err = get_connection_index(codec, dig_nid, 3082 spec->autocfg.dig_in_pin); 3083 if (err >= 0) { 3084 spec->dig_in_nid = dig_nid; 3085 break; 3086 } 3087 } 3088 } 3089 3090 static void override_mic_boost(struct hda_codec *codec, hda_nid_t pin, 3091 int offset, int num_steps, int step_size) 3092 { 3093 snd_hda_override_amp_caps(codec, pin, HDA_INPUT, 3094 (offset << AC_AMPCAP_OFFSET_SHIFT) | 3095 (num_steps << AC_AMPCAP_NUM_STEPS_SHIFT) | 3096 (step_size << AC_AMPCAP_STEP_SIZE_SHIFT) | 3097 (0 << AC_AMPCAP_MUTE_SHIFT)); 3098 } 3099 3100 static int patch_vt1708S(struct hda_codec *codec) 3101 { 3102 struct via_spec *spec; 3103 int err; 3104 3105 /* create a codec specific record */ 3106 spec = via_new_spec(codec); 3107 if (spec == NULL) 3108 return -ENOMEM; 3109 3110 spec->aa_mix_nid = 0x16; 3111 override_mic_boost(codec, 0x1a, 0, 3, 40); 3112 override_mic_boost(codec, 0x1e, 0, 3, 40); 3113 3114 /* automatic parse from the BIOS config */ 3115 err = via_parse_auto_config(codec); 3116 if (err < 0) { 3117 via_free(codec); 3118 return err; 3119 } 3120 3121 spec->init_verbs[spec->num_iverbs++] = vt1708S_init_verbs; 3122 3123 codec->patch_ops = via_patch_ops; 3124 3125 /* correct names for VT1708BCE */ 3126 if (get_codec_type(codec) == VT1708BCE) { 3127 kfree(codec->chip_name); 3128 codec->chip_name = kstrdup("VT1708BCE", GFP_KERNEL); 3129 snprintf(codec->bus->card->mixername, 3130 sizeof(codec->bus->card->mixername), 3131 "%s %s", codec->vendor_name, codec->chip_name); 3132 } 3133 /* correct names for VT1705 */ 3134 if (codec->vendor_id == 0x11064397) { 3135 kfree(codec->chip_name); 3136 codec->chip_name = kstrdup("VT1705", GFP_KERNEL); 3137 snprintf(codec->bus->card->mixername, 3138 sizeof(codec->bus->card->mixername), 3139 "%s %s", codec->vendor_name, codec->chip_name); 3140 } 3141 spec->set_widgets_power_state = set_widgets_power_state_vt1708B; 3142 return 0; 3143 } 3144 3145 /* Patch for VT1702 */ 3146 3147 static const struct hda_verb vt1702_init_verbs[] = { 3148 /* mixer enable */ 3149 {0x1, 0xF88, 0x3}, 3150 /* GPIO 0~2 */ 3151 {0x1, 0xF82, 0x3F}, 3152 { } 3153 }; 3154 3155 static void set_widgets_power_state_vt1702(struct hda_codec *codec) 3156 { 3157 int imux_is_smixer = 3158 snd_hda_codec_read(codec, 0x13, 0, AC_VERB_GET_CONNECT_SEL, 0x00) == 3; 3159 unsigned int parm; 3160 /* inputs */ 3161 /* PW 1/2/5 (14h/15h/18h) */ 3162 parm = AC_PWRST_D3; 3163 set_pin_power_state(codec, 0x14, &parm); 3164 set_pin_power_state(codec, 0x15, &parm); 3165 set_pin_power_state(codec, 0x18, &parm); 3166 if (imux_is_smixer) 3167 parm = AC_PWRST_D0; /* SW0 (13h) = stereo mixer (idx 3) */ 3168 /* SW0 (13h), AIW 0/1/2 (12h/1fh/20h) */ 3169 update_power_state(codec, 0x13, parm); 3170 update_power_state(codec, 0x12, parm); 3171 update_power_state(codec, 0x1f, parm); 3172 update_power_state(codec, 0x20, parm); 3173 3174 /* outputs */ 3175 /* PW 3/4 (16h/17h) */ 3176 parm = AC_PWRST_D3; 3177 set_pin_power_state(codec, 0x17, &parm); 3178 set_pin_power_state(codec, 0x16, &parm); 3179 /* MW0 (1ah), AOW 0/1 (10h/1dh) */ 3180 update_power_state(codec, 0x1a, imux_is_smixer ? AC_PWRST_D0 : parm); 3181 update_power_state(codec, 0x10, parm); 3182 update_power_state(codec, 0x1d, parm); 3183 } 3184 3185 static int patch_vt1702(struct hda_codec *codec) 3186 { 3187 struct via_spec *spec; 3188 int err; 3189 3190 /* create a codec specific record */ 3191 spec = via_new_spec(codec); 3192 if (spec == NULL) 3193 return -ENOMEM; 3194 3195 spec->aa_mix_nid = 0x1a; 3196 3197 /* limit AA path volume to 0 dB */ 3198 snd_hda_override_amp_caps(codec, 0x1A, HDA_INPUT, 3199 (0x17 << AC_AMPCAP_OFFSET_SHIFT) | 3200 (0x17 << AC_AMPCAP_NUM_STEPS_SHIFT) | 3201 (0x5 << AC_AMPCAP_STEP_SIZE_SHIFT) | 3202 (1 << AC_AMPCAP_MUTE_SHIFT)); 3203 3204 /* automatic parse from the BIOS config */ 3205 err = via_parse_auto_config(codec); 3206 if (err < 0) { 3207 via_free(codec); 3208 return err; 3209 } 3210 3211 spec->init_verbs[spec->num_iverbs++] = vt1702_init_verbs; 3212 3213 codec->patch_ops = via_patch_ops; 3214 3215 spec->set_widgets_power_state = set_widgets_power_state_vt1702; 3216 return 0; 3217 } 3218 3219 /* Patch for VT1718S */ 3220 3221 static const struct hda_verb vt1718S_init_verbs[] = { 3222 /* Enable MW0 adjust Gain 5 */ 3223 {0x1, 0xfb2, 0x10}, 3224 /* Enable Boost Volume backdoor */ 3225 {0x1, 0xf88, 0x8}, 3226 3227 { } 3228 }; 3229 3230 static void set_widgets_power_state_vt1718S(struct hda_codec *codec) 3231 { 3232 struct via_spec *spec = codec->spec; 3233 int imux_is_smixer; 3234 unsigned int parm; 3235 /* MUX6 (1eh) = stereo mixer */ 3236 imux_is_smixer = 3237 snd_hda_codec_read(codec, 0x1e, 0, AC_VERB_GET_CONNECT_SEL, 0x00) == 5; 3238 /* inputs */ 3239 /* PW 5/6/7 (29h/2ah/2bh) */ 3240 parm = AC_PWRST_D3; 3241 set_pin_power_state(codec, 0x29, &parm); 3242 set_pin_power_state(codec, 0x2a, &parm); 3243 set_pin_power_state(codec, 0x2b, &parm); 3244 if (imux_is_smixer) 3245 parm = AC_PWRST_D0; 3246 /* MUX6/7 (1eh/1fh), AIW 0/1 (10h/11h) */ 3247 update_power_state(codec, 0x1e, parm); 3248 update_power_state(codec, 0x1f, parm); 3249 update_power_state(codec, 0x10, parm); 3250 update_power_state(codec, 0x11, parm); 3251 3252 /* outputs */ 3253 /* PW3 (27h), MW2 (1ah), AOW3 (bh) */ 3254 parm = AC_PWRST_D3; 3255 set_pin_power_state(codec, 0x27, &parm); 3256 update_power_state(codec, 0x1a, parm); 3257 update_power_state(codec, 0xb, parm); 3258 3259 /* PW2 (26h), AOW2 (ah) */ 3260 parm = AC_PWRST_D3; 3261 set_pin_power_state(codec, 0x26, &parm); 3262 if (spec->smart51_enabled) 3263 set_pin_power_state(codec, 0x2b, &parm); 3264 update_power_state(codec, 0xa, parm); 3265 3266 /* PW0 (24h), AOW0 (8h) */ 3267 parm = AC_PWRST_D3; 3268 set_pin_power_state(codec, 0x24, &parm); 3269 if (!spec->hp_independent_mode) /* check for redirected HP */ 3270 set_pin_power_state(codec, 0x28, &parm); 3271 update_power_state(codec, 0x8, parm); 3272 /* MW9 (21h), Mw2 (1ah), AOW0 (8h) */ 3273 update_power_state(codec, 0x21, imux_is_smixer ? AC_PWRST_D0 : parm); 3274 3275 /* PW1 (25h), AOW1 (9h) */ 3276 parm = AC_PWRST_D3; 3277 set_pin_power_state(codec, 0x25, &parm); 3278 if (spec->smart51_enabled) 3279 set_pin_power_state(codec, 0x2a, &parm); 3280 update_power_state(codec, 0x9, parm); 3281 3282 if (spec->hp_independent_mode) { 3283 /* PW4 (28h), MW3 (1bh), MUX1(34h), AOW4 (ch) */ 3284 parm = AC_PWRST_D3; 3285 set_pin_power_state(codec, 0x28, &parm); 3286 update_power_state(codec, 0x1b, parm); 3287 update_power_state(codec, 0x34, parm); 3288 update_power_state(codec, 0xc, parm); 3289 } 3290 } 3291 3292 /* Add a connection to the primary DAC from AA-mixer for some codecs 3293 * This isn't listed from the raw info, but the chip has a secret connection. 3294 */ 3295 static int add_secret_dac_path(struct hda_codec *codec) 3296 { 3297 struct via_spec *spec = codec->spec; 3298 int i, nums; 3299 hda_nid_t conn[8]; 3300 hda_nid_t nid; 3301 3302 if (!spec->aa_mix_nid) 3303 return 0; 3304 nums = snd_hda_get_connections(codec, spec->aa_mix_nid, conn, 3305 ARRAY_SIZE(conn) - 1); 3306 for (i = 0; i < nums; i++) { 3307 if (get_wcaps_type(get_wcaps(codec, conn[i])) == AC_WID_AUD_OUT) 3308 return 0; 3309 } 3310 3311 /* find the primary DAC and add to the connection list */ 3312 nid = codec->start_nid; 3313 for (i = 0; i < codec->num_nodes; i++, nid++) { 3314 unsigned int caps = get_wcaps(codec, nid); 3315 if (get_wcaps_type(caps) == AC_WID_AUD_OUT && 3316 !(caps & AC_WCAP_DIGITAL)) { 3317 conn[nums++] = nid; 3318 return snd_hda_override_conn_list(codec, 3319 spec->aa_mix_nid, 3320 nums, conn); 3321 } 3322 } 3323 return 0; 3324 } 3325 3326 3327 static int patch_vt1718S(struct hda_codec *codec) 3328 { 3329 struct via_spec *spec; 3330 int err; 3331 3332 /* create a codec specific record */ 3333 spec = via_new_spec(codec); 3334 if (spec == NULL) 3335 return -ENOMEM; 3336 3337 spec->aa_mix_nid = 0x21; 3338 override_mic_boost(codec, 0x2b, 0, 3, 40); 3339 override_mic_boost(codec, 0x29, 0, 3, 40); 3340 add_secret_dac_path(codec); 3341 3342 /* automatic parse from the BIOS config */ 3343 err = via_parse_auto_config(codec); 3344 if (err < 0) { 3345 via_free(codec); 3346 return err; 3347 } 3348 3349 spec->init_verbs[spec->num_iverbs++] = vt1718S_init_verbs; 3350 3351 codec->patch_ops = via_patch_ops; 3352 3353 spec->set_widgets_power_state = set_widgets_power_state_vt1718S; 3354 3355 return 0; 3356 } 3357 3358 /* Patch for VT1716S */ 3359 3360 static int vt1716s_dmic_info(struct snd_kcontrol *kcontrol, 3361 struct snd_ctl_elem_info *uinfo) 3362 { 3363 uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN; 3364 uinfo->count = 1; 3365 uinfo->value.integer.min = 0; 3366 uinfo->value.integer.max = 1; 3367 return 0; 3368 } 3369 3370 static int vt1716s_dmic_get(struct snd_kcontrol *kcontrol, 3371 struct snd_ctl_elem_value *ucontrol) 3372 { 3373 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 3374 int index = 0; 3375 3376 index = snd_hda_codec_read(codec, 0x26, 0, 3377 AC_VERB_GET_CONNECT_SEL, 0); 3378 if (index != -1) 3379 *ucontrol->value.integer.value = index; 3380 3381 return 0; 3382 } 3383 3384 static int vt1716s_dmic_put(struct snd_kcontrol *kcontrol, 3385 struct snd_ctl_elem_value *ucontrol) 3386 { 3387 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 3388 struct via_spec *spec = codec->spec; 3389 int index = *ucontrol->value.integer.value; 3390 3391 snd_hda_codec_write(codec, 0x26, 0, 3392 AC_VERB_SET_CONNECT_SEL, index); 3393 spec->dmic_enabled = index; 3394 set_widgets_power_state(codec); 3395 return 1; 3396 } 3397 3398 static const struct snd_kcontrol_new vt1716s_dmic_mixer[] = { 3399 HDA_CODEC_VOLUME("Digital Mic Capture Volume", 0x22, 0x0, HDA_INPUT), 3400 { 3401 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 3402 .name = "Digital Mic Capture Switch", 3403 .subdevice = HDA_SUBDEV_NID_FLAG | 0x26, 3404 .count = 1, 3405 .info = vt1716s_dmic_info, 3406 .get = vt1716s_dmic_get, 3407 .put = vt1716s_dmic_put, 3408 }, 3409 {} /* end */ 3410 }; 3411 3412 3413 /* mono-out mixer elements */ 3414 static const struct snd_kcontrol_new vt1716S_mono_out_mixer[] = { 3415 HDA_CODEC_MUTE("Mono Playback Switch", 0x2a, 0x0, HDA_OUTPUT), 3416 { } /* end */ 3417 }; 3418 3419 static const struct hda_verb vt1716S_init_verbs[] = { 3420 /* Enable Boost Volume backdoor */ 3421 {0x1, 0xf8a, 0x80}, 3422 /* don't bybass mixer */ 3423 {0x1, 0xf88, 0xc0}, 3424 /* Enable mono output */ 3425 {0x1, 0xf90, 0x08}, 3426 { } 3427 }; 3428 3429 static void set_widgets_power_state_vt1716S(struct hda_codec *codec) 3430 { 3431 struct via_spec *spec = codec->spec; 3432 int imux_is_smixer; 3433 unsigned int parm; 3434 unsigned int mono_out, present; 3435 /* SW0 (17h) = stereo mixer */ 3436 imux_is_smixer = 3437 (snd_hda_codec_read(codec, 0x17, 0, 3438 AC_VERB_GET_CONNECT_SEL, 0x00) == 5); 3439 /* inputs */ 3440 /* PW 1/2/5 (1ah/1bh/1eh) */ 3441 parm = AC_PWRST_D3; 3442 set_pin_power_state(codec, 0x1a, &parm); 3443 set_pin_power_state(codec, 0x1b, &parm); 3444 set_pin_power_state(codec, 0x1e, &parm); 3445 if (imux_is_smixer) 3446 parm = AC_PWRST_D0; 3447 /* SW0 (17h), AIW0(13h) */ 3448 update_power_state(codec, 0x17, parm); 3449 update_power_state(codec, 0x13, parm); 3450 3451 parm = AC_PWRST_D3; 3452 set_pin_power_state(codec, 0x1e, &parm); 3453 /* PW11 (22h) */ 3454 if (spec->dmic_enabled) 3455 set_pin_power_state(codec, 0x22, &parm); 3456 else 3457 update_power_state(codec, 0x22, AC_PWRST_D3); 3458 3459 /* SW2(26h), AIW1(14h) */ 3460 update_power_state(codec, 0x26, parm); 3461 update_power_state(codec, 0x14, parm); 3462 3463 /* outputs */ 3464 /* PW0 (19h), SW1 (18h), AOW1 (11h) */ 3465 parm = AC_PWRST_D3; 3466 set_pin_power_state(codec, 0x19, &parm); 3467 /* Smart 5.1 PW2(1bh) */ 3468 if (spec->smart51_enabled) 3469 set_pin_power_state(codec, 0x1b, &parm); 3470 update_power_state(codec, 0x18, parm); 3471 update_power_state(codec, 0x11, parm); 3472 3473 /* PW7 (23h), SW3 (27h), AOW3 (25h) */ 3474 parm = AC_PWRST_D3; 3475 set_pin_power_state(codec, 0x23, &parm); 3476 /* Smart 5.1 PW1(1ah) */ 3477 if (spec->smart51_enabled) 3478 set_pin_power_state(codec, 0x1a, &parm); 3479 update_power_state(codec, 0x27, parm); 3480 3481 /* Smart 5.1 PW5(1eh) */ 3482 if (spec->smart51_enabled) 3483 set_pin_power_state(codec, 0x1e, &parm); 3484 update_power_state(codec, 0x25, parm); 3485 3486 /* Mono out */ 3487 /* SW4(28h)->MW1(29h)-> PW12 (2ah)*/ 3488 present = snd_hda_jack_detect(codec, 0x1c); 3489 3490 if (present) 3491 mono_out = 0; 3492 else { 3493 present = snd_hda_jack_detect(codec, 0x1d); 3494 if (!spec->hp_independent_mode && present) 3495 mono_out = 0; 3496 else 3497 mono_out = 1; 3498 } 3499 parm = mono_out ? AC_PWRST_D0 : AC_PWRST_D3; 3500 update_power_state(codec, 0x28, parm); 3501 update_power_state(codec, 0x29, parm); 3502 update_power_state(codec, 0x2a, parm); 3503 3504 /* PW 3/4 (1ch/1dh) */ 3505 parm = AC_PWRST_D3; 3506 set_pin_power_state(codec, 0x1c, &parm); 3507 set_pin_power_state(codec, 0x1d, &parm); 3508 /* HP Independent Mode, power on AOW3 */ 3509 if (spec->hp_independent_mode) 3510 update_power_state(codec, 0x25, parm); 3511 3512 /* force to D0 for internal Speaker */ 3513 /* MW0 (16h), AOW0 (10h) */ 3514 update_power_state(codec, 0x16, imux_is_smixer ? AC_PWRST_D0 : parm); 3515 update_power_state(codec, 0x10, mono_out ? AC_PWRST_D0 : parm); 3516 } 3517 3518 static int patch_vt1716S(struct hda_codec *codec) 3519 { 3520 struct via_spec *spec; 3521 int err; 3522 3523 /* create a codec specific record */ 3524 spec = via_new_spec(codec); 3525 if (spec == NULL) 3526 return -ENOMEM; 3527 3528 spec->aa_mix_nid = 0x16; 3529 override_mic_boost(codec, 0x1a, 0, 3, 40); 3530 override_mic_boost(codec, 0x1e, 0, 3, 40); 3531 3532 /* automatic parse from the BIOS config */ 3533 err = via_parse_auto_config(codec); 3534 if (err < 0) { 3535 via_free(codec); 3536 return err; 3537 } 3538 3539 spec->init_verbs[spec->num_iverbs++] = vt1716S_init_verbs; 3540 3541 spec->mixers[spec->num_mixers] = vt1716s_dmic_mixer; 3542 spec->num_mixers++; 3543 3544 spec->mixers[spec->num_mixers++] = vt1716S_mono_out_mixer; 3545 3546 codec->patch_ops = via_patch_ops; 3547 3548 spec->set_widgets_power_state = set_widgets_power_state_vt1716S; 3549 return 0; 3550 } 3551 3552 /* for vt2002P */ 3553 3554 static const struct hda_verb vt2002P_init_verbs[] = { 3555 /* Class-D speaker related verbs */ 3556 {0x1, 0xfe0, 0x4}, 3557 {0x1, 0xfe9, 0x80}, 3558 {0x1, 0xfe2, 0x22}, 3559 /* Enable Boost Volume backdoor */ 3560 {0x1, 0xfb9, 0x24}, 3561 /* Enable AOW0 to MW9 */ 3562 {0x1, 0xfb8, 0x88}, 3563 { } 3564 }; 3565 3566 static const struct hda_verb vt1802_init_verbs[] = { 3567 /* Enable Boost Volume backdoor */ 3568 {0x1, 0xfb9, 0x24}, 3569 /* Enable AOW0 to MW9 */ 3570 {0x1, 0xfb8, 0x88}, 3571 { } 3572 }; 3573 3574 static void set_widgets_power_state_vt2002P(struct hda_codec *codec) 3575 { 3576 struct via_spec *spec = codec->spec; 3577 int imux_is_smixer; 3578 unsigned int parm; 3579 unsigned int present; 3580 /* MUX9 (1eh) = stereo mixer */ 3581 imux_is_smixer = 3582 snd_hda_codec_read(codec, 0x1e, 0, AC_VERB_GET_CONNECT_SEL, 0x00) == 3; 3583 /* inputs */ 3584 /* PW 5/6/7 (29h/2ah/2bh) */ 3585 parm = AC_PWRST_D3; 3586 set_pin_power_state(codec, 0x29, &parm); 3587 set_pin_power_state(codec, 0x2a, &parm); 3588 set_pin_power_state(codec, 0x2b, &parm); 3589 parm = AC_PWRST_D0; 3590 /* MUX9/10 (1eh/1fh), AIW 0/1 (10h/11h) */ 3591 update_power_state(codec, 0x1e, parm); 3592 update_power_state(codec, 0x1f, parm); 3593 update_power_state(codec, 0x10, parm); 3594 update_power_state(codec, 0x11, parm); 3595 3596 /* outputs */ 3597 /* AOW0 (8h)*/ 3598 update_power_state(codec, 0x8, parm); 3599 3600 if (spec->codec_type == VT1802) { 3601 /* PW4 (28h), MW4 (18h), MUX4(38h) */ 3602 parm = AC_PWRST_D3; 3603 set_pin_power_state(codec, 0x28, &parm); 3604 update_power_state(codec, 0x18, parm); 3605 update_power_state(codec, 0x38, parm); 3606 } else { 3607 /* PW4 (26h), MW4 (1ch), MUX4(37h) */ 3608 parm = AC_PWRST_D3; 3609 set_pin_power_state(codec, 0x26, &parm); 3610 update_power_state(codec, 0x1c, parm); 3611 update_power_state(codec, 0x37, parm); 3612 } 3613 3614 if (spec->codec_type == VT1802) { 3615 /* PW1 (25h), MW1 (15h), MUX1(35h), AOW1 (9h) */ 3616 parm = AC_PWRST_D3; 3617 set_pin_power_state(codec, 0x25, &parm); 3618 update_power_state(codec, 0x15, parm); 3619 update_power_state(codec, 0x35, parm); 3620 } else { 3621 /* PW1 (25h), MW1 (19h), MUX1(35h), AOW1 (9h) */ 3622 parm = AC_PWRST_D3; 3623 set_pin_power_state(codec, 0x25, &parm); 3624 update_power_state(codec, 0x19, parm); 3625 update_power_state(codec, 0x35, parm); 3626 } 3627 3628 if (spec->hp_independent_mode) 3629 update_power_state(codec, 0x9, AC_PWRST_D0); 3630 3631 /* Class-D */ 3632 /* PW0 (24h), MW0(18h/14h), MUX0(34h) */ 3633 present = snd_hda_jack_detect(codec, 0x25); 3634 3635 parm = AC_PWRST_D3; 3636 set_pin_power_state(codec, 0x24, &parm); 3637 parm = present ? AC_PWRST_D3 : AC_PWRST_D0; 3638 if (spec->codec_type == VT1802) 3639 update_power_state(codec, 0x14, parm); 3640 else 3641 update_power_state(codec, 0x18, parm); 3642 update_power_state(codec, 0x34, parm); 3643 3644 /* Mono Out */ 3645 present = snd_hda_jack_detect(codec, 0x26); 3646 3647 parm = present ? AC_PWRST_D3 : AC_PWRST_D0; 3648 if (spec->codec_type == VT1802) { 3649 /* PW15 (33h), MW8(1ch), MUX8(3ch) */ 3650 update_power_state(codec, 0x33, parm); 3651 update_power_state(codec, 0x1c, parm); 3652 update_power_state(codec, 0x3c, parm); 3653 } else { 3654 /* PW15 (31h), MW8(17h), MUX8(3bh) */ 3655 update_power_state(codec, 0x31, parm); 3656 update_power_state(codec, 0x17, parm); 3657 update_power_state(codec, 0x3b, parm); 3658 } 3659 /* MW9 (21h) */ 3660 if (imux_is_smixer || !is_aa_path_mute(codec)) 3661 update_power_state(codec, 0x21, AC_PWRST_D0); 3662 else 3663 update_power_state(codec, 0x21, AC_PWRST_D3); 3664 } 3665 3666 /* patch for vt2002P */ 3667 static int patch_vt2002P(struct hda_codec *codec) 3668 { 3669 struct via_spec *spec; 3670 int err; 3671 3672 /* create a codec specific record */ 3673 spec = via_new_spec(codec); 3674 if (spec == NULL) 3675 return -ENOMEM; 3676 3677 spec->aa_mix_nid = 0x21; 3678 override_mic_boost(codec, 0x2b, 0, 3, 40); 3679 override_mic_boost(codec, 0x29, 0, 3, 40); 3680 add_secret_dac_path(codec); 3681 3682 /* automatic parse from the BIOS config */ 3683 err = via_parse_auto_config(codec); 3684 if (err < 0) { 3685 via_free(codec); 3686 return err; 3687 } 3688 3689 if (spec->codec_type == VT1802) 3690 spec->init_verbs[spec->num_iverbs++] = vt1802_init_verbs; 3691 else 3692 spec->init_verbs[spec->num_iverbs++] = vt2002P_init_verbs; 3693 3694 codec->patch_ops = via_patch_ops; 3695 3696 spec->set_widgets_power_state = set_widgets_power_state_vt2002P; 3697 return 0; 3698 } 3699 3700 /* for vt1812 */ 3701 3702 static const struct hda_verb vt1812_init_verbs[] = { 3703 /* Enable Boost Volume backdoor */ 3704 {0x1, 0xfb9, 0x24}, 3705 /* Enable AOW0 to MW9 */ 3706 {0x1, 0xfb8, 0xa8}, 3707 { } 3708 }; 3709 3710 static void set_widgets_power_state_vt1812(struct hda_codec *codec) 3711 { 3712 struct via_spec *spec = codec->spec; 3713 unsigned int parm; 3714 unsigned int present; 3715 /* inputs */ 3716 /* PW 5/6/7 (29h/2ah/2bh) */ 3717 parm = AC_PWRST_D3; 3718 set_pin_power_state(codec, 0x29, &parm); 3719 set_pin_power_state(codec, 0x2a, &parm); 3720 set_pin_power_state(codec, 0x2b, &parm); 3721 parm = AC_PWRST_D0; 3722 /* MUX10/11 (1eh/1fh), AIW 0/1 (10h/11h) */ 3723 update_power_state(codec, 0x1e, parm); 3724 update_power_state(codec, 0x1f, parm); 3725 update_power_state(codec, 0x10, parm); 3726 update_power_state(codec, 0x11, parm); 3727 3728 /* outputs */ 3729 /* AOW0 (8h)*/ 3730 update_power_state(codec, 0x8, AC_PWRST_D0); 3731 3732 /* PW4 (28h), MW4 (18h), MUX4(38h) */ 3733 parm = AC_PWRST_D3; 3734 set_pin_power_state(codec, 0x28, &parm); 3735 update_power_state(codec, 0x18, parm); 3736 update_power_state(codec, 0x38, parm); 3737 3738 /* PW1 (25h), MW1 (15h), MUX1(35h), AOW1 (9h) */ 3739 parm = AC_PWRST_D3; 3740 set_pin_power_state(codec, 0x25, &parm); 3741 update_power_state(codec, 0x15, parm); 3742 update_power_state(codec, 0x35, parm); 3743 if (spec->hp_independent_mode) 3744 update_power_state(codec, 0x9, AC_PWRST_D0); 3745 3746 /* Internal Speaker */ 3747 /* PW0 (24h), MW0(14h), MUX0(34h) */ 3748 present = snd_hda_jack_detect(codec, 0x25); 3749 3750 parm = AC_PWRST_D3; 3751 set_pin_power_state(codec, 0x24, &parm); 3752 if (present) { 3753 update_power_state(codec, 0x14, AC_PWRST_D3); 3754 update_power_state(codec, 0x34, AC_PWRST_D3); 3755 } else { 3756 update_power_state(codec, 0x14, AC_PWRST_D0); 3757 update_power_state(codec, 0x34, AC_PWRST_D0); 3758 } 3759 3760 3761 /* Mono Out */ 3762 /* PW13 (31h), MW13(1ch), MUX13(3ch), MW14(3eh) */ 3763 present = snd_hda_jack_detect(codec, 0x28); 3764 3765 parm = AC_PWRST_D3; 3766 set_pin_power_state(codec, 0x31, &parm); 3767 if (present) { 3768 update_power_state(codec, 0x1c, AC_PWRST_D3); 3769 update_power_state(codec, 0x3c, AC_PWRST_D3); 3770 update_power_state(codec, 0x3e, AC_PWRST_D3); 3771 } else { 3772 update_power_state(codec, 0x1c, AC_PWRST_D0); 3773 update_power_state(codec, 0x3c, AC_PWRST_D0); 3774 update_power_state(codec, 0x3e, AC_PWRST_D0); 3775 } 3776 3777 /* PW15 (33h), MW15 (1dh), MUX15(3dh) */ 3778 parm = AC_PWRST_D3; 3779 set_pin_power_state(codec, 0x33, &parm); 3780 update_power_state(codec, 0x1d, parm); 3781 update_power_state(codec, 0x3d, parm); 3782 3783 } 3784 3785 /* patch for vt1812 */ 3786 static int patch_vt1812(struct hda_codec *codec) 3787 { 3788 struct via_spec *spec; 3789 int err; 3790 3791 /* create a codec specific record */ 3792 spec = via_new_spec(codec); 3793 if (spec == NULL) 3794 return -ENOMEM; 3795 3796 spec->aa_mix_nid = 0x21; 3797 override_mic_boost(codec, 0x2b, 0, 3, 40); 3798 override_mic_boost(codec, 0x29, 0, 3, 40); 3799 add_secret_dac_path(codec); 3800 3801 /* automatic parse from the BIOS config */ 3802 err = via_parse_auto_config(codec); 3803 if (err < 0) { 3804 via_free(codec); 3805 return err; 3806 } 3807 3808 spec->init_verbs[spec->num_iverbs++] = vt1812_init_verbs; 3809 3810 codec->patch_ops = via_patch_ops; 3811 3812 spec->set_widgets_power_state = set_widgets_power_state_vt1812; 3813 return 0; 3814 } 3815 3816 /* 3817 * patch entries 3818 */ 3819 static const struct hda_codec_preset snd_hda_preset_via[] = { 3820 { .id = 0x11061708, .name = "VT1708", .patch = patch_vt1708}, 3821 { .id = 0x11061709, .name = "VT1708", .patch = patch_vt1708}, 3822 { .id = 0x1106170a, .name = "VT1708", .patch = patch_vt1708}, 3823 { .id = 0x1106170b, .name = "VT1708", .patch = patch_vt1708}, 3824 { .id = 0x1106e710, .name = "VT1709 10-Ch", 3825 .patch = patch_vt1709}, 3826 { .id = 0x1106e711, .name = "VT1709 10-Ch", 3827 .patch = patch_vt1709}, 3828 { .id = 0x1106e712, .name = "VT1709 10-Ch", 3829 .patch = patch_vt1709}, 3830 { .id = 0x1106e713, .name = "VT1709 10-Ch", 3831 .patch = patch_vt1709}, 3832 { .id = 0x1106e714, .name = "VT1709 6-Ch", 3833 .patch = patch_vt1709}, 3834 { .id = 0x1106e715, .name = "VT1709 6-Ch", 3835 .patch = patch_vt1709}, 3836 { .id = 0x1106e716, .name = "VT1709 6-Ch", 3837 .patch = patch_vt1709}, 3838 { .id = 0x1106e717, .name = "VT1709 6-Ch", 3839 .patch = patch_vt1709}, 3840 { .id = 0x1106e720, .name = "VT1708B 8-Ch", 3841 .patch = patch_vt1708B}, 3842 { .id = 0x1106e721, .name = "VT1708B 8-Ch", 3843 .patch = patch_vt1708B}, 3844 { .id = 0x1106e722, .name = "VT1708B 8-Ch", 3845 .patch = patch_vt1708B}, 3846 { .id = 0x1106e723, .name = "VT1708B 8-Ch", 3847 .patch = patch_vt1708B}, 3848 { .id = 0x1106e724, .name = "VT1708B 4-Ch", 3849 .patch = patch_vt1708B}, 3850 { .id = 0x1106e725, .name = "VT1708B 4-Ch", 3851 .patch = patch_vt1708B}, 3852 { .id = 0x1106e726, .name = "VT1708B 4-Ch", 3853 .patch = patch_vt1708B}, 3854 { .id = 0x1106e727, .name = "VT1708B 4-Ch", 3855 .patch = patch_vt1708B}, 3856 { .id = 0x11060397, .name = "VT1708S", 3857 .patch = patch_vt1708S}, 3858 { .id = 0x11061397, .name = "VT1708S", 3859 .patch = patch_vt1708S}, 3860 { .id = 0x11062397, .name = "VT1708S", 3861 .patch = patch_vt1708S}, 3862 { .id = 0x11063397, .name = "VT1708S", 3863 .patch = patch_vt1708S}, 3864 { .id = 0x11064397, .name = "VT1705", 3865 .patch = patch_vt1708S}, 3866 { .id = 0x11065397, .name = "VT1708S", 3867 .patch = patch_vt1708S}, 3868 { .id = 0x11066397, .name = "VT1708S", 3869 .patch = patch_vt1708S}, 3870 { .id = 0x11067397, .name = "VT1708S", 3871 .patch = patch_vt1708S}, 3872 { .id = 0x11060398, .name = "VT1702", 3873 .patch = patch_vt1702}, 3874 { .id = 0x11061398, .name = "VT1702", 3875 .patch = patch_vt1702}, 3876 { .id = 0x11062398, .name = "VT1702", 3877 .patch = patch_vt1702}, 3878 { .id = 0x11063398, .name = "VT1702", 3879 .patch = patch_vt1702}, 3880 { .id = 0x11064398, .name = "VT1702", 3881 .patch = patch_vt1702}, 3882 { .id = 0x11065398, .name = "VT1702", 3883 .patch = patch_vt1702}, 3884 { .id = 0x11066398, .name = "VT1702", 3885 .patch = patch_vt1702}, 3886 { .id = 0x11067398, .name = "VT1702", 3887 .patch = patch_vt1702}, 3888 { .id = 0x11060428, .name = "VT1718S", 3889 .patch = patch_vt1718S}, 3890 { .id = 0x11064428, .name = "VT1718S", 3891 .patch = patch_vt1718S}, 3892 { .id = 0x11060441, .name = "VT2020", 3893 .patch = patch_vt1718S}, 3894 { .id = 0x11064441, .name = "VT1828S", 3895 .patch = patch_vt1718S}, 3896 { .id = 0x11060433, .name = "VT1716S", 3897 .patch = patch_vt1716S}, 3898 { .id = 0x1106a721, .name = "VT1716S", 3899 .patch = patch_vt1716S}, 3900 { .id = 0x11060438, .name = "VT2002P", .patch = patch_vt2002P}, 3901 { .id = 0x11064438, .name = "VT2002P", .patch = patch_vt2002P}, 3902 { .id = 0x11060448, .name = "VT1812", .patch = patch_vt1812}, 3903 { .id = 0x11060440, .name = "VT1818S", 3904 .patch = patch_vt1708S}, 3905 { .id = 0x11060446, .name = "VT1802", 3906 .patch = patch_vt2002P}, 3907 { .id = 0x11068446, .name = "VT1802", 3908 .patch = patch_vt2002P}, 3909 {} /* terminator */ 3910 }; 3911 3912 MODULE_ALIAS("snd-hda-codec-id:1106*"); 3913 3914 static struct hda_codec_preset_list via_list = { 3915 .preset = snd_hda_preset_via, 3916 .owner = THIS_MODULE, 3917 }; 3918 3919 MODULE_LICENSE("GPL"); 3920 MODULE_DESCRIPTION("VIA HD-audio codec"); 3921 3922 static int __init patch_via_init(void) 3923 { 3924 return snd_hda_add_codec_preset(&via_list); 3925 } 3926 3927 static void __exit patch_via_exit(void) 3928 { 3929 snd_hda_delete_codec_preset(&via_list); 3930 } 3931 3932 module_init(patch_via_init) 3933 module_exit(patch_via_exit) 3934