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