1 /* 2 * Universal Interface for Intel High Definition Audio Codec 3 * 4 * HD audio interface patch for ALC 260/880/882 codecs 5 * 6 * Copyright (c) 2004 Kailang Yang <kailang@realtek.com.tw> 7 * PeiSen Hou <pshou@realtek.com.tw> 8 * Takashi Iwai <tiwai@suse.de> 9 * Jonathan Woithe <jwoithe@physics.adelaide.edu.au> 10 * 11 * This driver is free software; you can redistribute it and/or modify 12 * it under the terms of the GNU General Public License as published by 13 * the Free Software Foundation; either version 2 of the License, or 14 * (at your option) any later version. 15 * 16 * This driver is distributed in the hope that it will be useful, 17 * but WITHOUT ANY WARRANTY; without even the implied warranty of 18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 19 * GNU General Public License for more details. 20 * 21 * You should have received a copy of the GNU General Public License 22 * along with this program; if not, write to the Free Software 23 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 24 */ 25 26 #include <linux/init.h> 27 #include <linux/delay.h> 28 #include <linux/slab.h> 29 #include <linux/pci.h> 30 #include <sound/core.h> 31 #include "hda_codec.h" 32 #include "hda_local.h" 33 #include "hda_beep.h" 34 35 #define ALC880_FRONT_EVENT 0x01 36 #define ALC880_DCVOL_EVENT 0x02 37 #define ALC880_HP_EVENT 0x04 38 #define ALC880_MIC_EVENT 0x08 39 40 /* ALC880 board config type */ 41 enum { 42 ALC880_3ST, 43 ALC880_3ST_DIG, 44 ALC880_5ST, 45 ALC880_5ST_DIG, 46 ALC880_W810, 47 ALC880_Z71V, 48 ALC880_6ST, 49 ALC880_6ST_DIG, 50 ALC880_F1734, 51 ALC880_ASUS, 52 ALC880_ASUS_DIG, 53 ALC880_ASUS_W1V, 54 ALC880_ASUS_DIG2, 55 ALC880_FUJITSU, 56 ALC880_UNIWILL_DIG, 57 ALC880_UNIWILL, 58 ALC880_UNIWILL_P53, 59 ALC880_CLEVO, 60 ALC880_TCL_S700, 61 ALC880_LG, 62 ALC880_LG_LW, 63 ALC880_MEDION_RIM, 64 #ifdef CONFIG_SND_DEBUG 65 ALC880_TEST, 66 #endif 67 ALC880_AUTO, 68 ALC880_MODEL_LAST /* last tag */ 69 }; 70 71 /* ALC260 models */ 72 enum { 73 ALC260_BASIC, 74 ALC260_HP, 75 ALC260_HP_DC7600, 76 ALC260_HP_3013, 77 ALC260_FUJITSU_S702X, 78 ALC260_ACER, 79 ALC260_WILL, 80 ALC260_REPLACER_672V, 81 ALC260_FAVORIT100, 82 #ifdef CONFIG_SND_DEBUG 83 ALC260_TEST, 84 #endif 85 ALC260_AUTO, 86 ALC260_MODEL_LAST /* last tag */ 87 }; 88 89 /* ALC262 models */ 90 enum { 91 ALC262_BASIC, 92 ALC262_HIPPO, 93 ALC262_HIPPO_1, 94 ALC262_FUJITSU, 95 ALC262_HP_BPC, 96 ALC262_HP_BPC_D7000_WL, 97 ALC262_HP_BPC_D7000_WF, 98 ALC262_HP_TC_T5735, 99 ALC262_HP_RP5700, 100 ALC262_BENQ_ED8, 101 ALC262_SONY_ASSAMD, 102 ALC262_BENQ_T31, 103 ALC262_ULTRA, 104 ALC262_LENOVO_3000, 105 ALC262_NEC, 106 ALC262_TOSHIBA_S06, 107 ALC262_TOSHIBA_RX1, 108 ALC262_TYAN, 109 ALC262_AUTO, 110 ALC262_MODEL_LAST /* last tag */ 111 }; 112 113 /* ALC268 models */ 114 enum { 115 ALC267_QUANTA_IL1, 116 ALC268_3ST, 117 ALC268_TOSHIBA, 118 ALC268_ACER, 119 ALC268_ACER_DMIC, 120 ALC268_ACER_ASPIRE_ONE, 121 ALC268_DELL, 122 ALC268_ZEPTO, 123 #ifdef CONFIG_SND_DEBUG 124 ALC268_TEST, 125 #endif 126 ALC268_AUTO, 127 ALC268_MODEL_LAST /* last tag */ 128 }; 129 130 /* ALC269 models */ 131 enum { 132 ALC269_BASIC, 133 ALC269_QUANTA_FL1, 134 ALC269_ASUS_AMIC, 135 ALC269_ASUS_DMIC, 136 ALC269_FUJITSU, 137 ALC269_LIFEBOOK, 138 ALC269_AUTO, 139 ALC269_MODEL_LAST /* last tag */ 140 }; 141 142 /* ALC861 models */ 143 enum { 144 ALC861_3ST, 145 ALC660_3ST, 146 ALC861_3ST_DIG, 147 ALC861_6ST_DIG, 148 ALC861_UNIWILL_M31, 149 ALC861_TOSHIBA, 150 ALC861_ASUS, 151 ALC861_ASUS_LAPTOP, 152 ALC861_AUTO, 153 ALC861_MODEL_LAST, 154 }; 155 156 /* ALC861-VD models */ 157 enum { 158 ALC660VD_3ST, 159 ALC660VD_3ST_DIG, 160 ALC660VD_ASUS_V1S, 161 ALC861VD_3ST, 162 ALC861VD_3ST_DIG, 163 ALC861VD_6ST_DIG, 164 ALC861VD_LENOVO, 165 ALC861VD_DALLAS, 166 ALC861VD_HP, 167 ALC861VD_AUTO, 168 ALC861VD_MODEL_LAST, 169 }; 170 171 /* ALC662 models */ 172 enum { 173 ALC662_3ST_2ch_DIG, 174 ALC662_3ST_6ch_DIG, 175 ALC662_3ST_6ch, 176 ALC662_5ST_DIG, 177 ALC662_LENOVO_101E, 178 ALC662_ASUS_EEEPC_P701, 179 ALC662_ASUS_EEEPC_EP20, 180 ALC663_ASUS_M51VA, 181 ALC663_ASUS_G71V, 182 ALC663_ASUS_H13, 183 ALC663_ASUS_G50V, 184 ALC662_ECS, 185 ALC663_ASUS_MODE1, 186 ALC662_ASUS_MODE2, 187 ALC663_ASUS_MODE3, 188 ALC663_ASUS_MODE4, 189 ALC663_ASUS_MODE5, 190 ALC663_ASUS_MODE6, 191 ALC663_ASUS_MODE7, 192 ALC663_ASUS_MODE8, 193 ALC272_DELL, 194 ALC272_DELL_ZM1, 195 ALC272_SAMSUNG_NC10, 196 ALC662_AUTO, 197 ALC662_MODEL_LAST, 198 }; 199 200 /* ALC882 models */ 201 enum { 202 ALC882_3ST_DIG, 203 ALC882_6ST_DIG, 204 ALC882_ARIMA, 205 ALC882_W2JC, 206 ALC882_TARGA, 207 ALC882_ASUS_A7J, 208 ALC882_ASUS_A7M, 209 ALC885_MACPRO, 210 ALC885_MBP3, 211 ALC885_MB5, 212 ALC885_IMAC24, 213 ALC885_IMAC91, 214 ALC883_3ST_2ch_DIG, 215 ALC883_3ST_6ch_DIG, 216 ALC883_3ST_6ch, 217 ALC883_6ST_DIG, 218 ALC883_TARGA_DIG, 219 ALC883_TARGA_2ch_DIG, 220 ALC883_TARGA_8ch_DIG, 221 ALC883_ACER, 222 ALC883_ACER_ASPIRE, 223 ALC888_ACER_ASPIRE_4930G, 224 ALC888_ACER_ASPIRE_6530G, 225 ALC888_ACER_ASPIRE_8930G, 226 ALC888_ACER_ASPIRE_7730G, 227 ALC883_MEDION, 228 ALC883_MEDION_MD2, 229 ALC883_LAPTOP_EAPD, 230 ALC883_LENOVO_101E_2ch, 231 ALC883_LENOVO_NB0763, 232 ALC888_LENOVO_MS7195_DIG, 233 ALC888_LENOVO_SKY, 234 ALC883_HAIER_W66, 235 ALC888_3ST_HP, 236 ALC888_6ST_DELL, 237 ALC883_MITAC, 238 ALC883_CLEVO_M540R, 239 ALC883_CLEVO_M720, 240 ALC883_FUJITSU_PI2515, 241 ALC888_FUJITSU_XA3530, 242 ALC883_3ST_6ch_INTEL, 243 ALC889A_INTEL, 244 ALC889_INTEL, 245 ALC888_ASUS_M90V, 246 ALC888_ASUS_EEE1601, 247 ALC889A_MB31, 248 ALC1200_ASUS_P5Q, 249 ALC883_SONY_VAIO_TT, 250 ALC882_AUTO, 251 ALC882_MODEL_LAST, 252 }; 253 254 /* for GPIO Poll */ 255 #define GPIO_MASK 0x03 256 257 /* extra amp-initialization sequence types */ 258 enum { 259 ALC_INIT_NONE, 260 ALC_INIT_DEFAULT, 261 ALC_INIT_GPIO1, 262 ALC_INIT_GPIO2, 263 ALC_INIT_GPIO3, 264 }; 265 266 struct alc_mic_route { 267 hda_nid_t pin; 268 unsigned char mux_idx; 269 unsigned char amix_idx; 270 }; 271 272 #define MUX_IDX_UNDEF ((unsigned char)-1) 273 274 struct alc_spec { 275 /* codec parameterization */ 276 struct snd_kcontrol_new *mixers[5]; /* mixer arrays */ 277 unsigned int num_mixers; 278 struct snd_kcontrol_new *cap_mixer; /* capture mixer */ 279 unsigned int beep_amp; /* beep amp value, set via set_beep_amp() */ 280 281 const struct hda_verb *init_verbs[10]; /* initialization verbs 282 * don't forget NULL 283 * termination! 284 */ 285 unsigned int num_init_verbs; 286 287 char stream_name_analog[32]; /* analog PCM stream */ 288 struct hda_pcm_stream *stream_analog_playback; 289 struct hda_pcm_stream *stream_analog_capture; 290 struct hda_pcm_stream *stream_analog_alt_playback; 291 struct hda_pcm_stream *stream_analog_alt_capture; 292 293 char stream_name_digital[32]; /* digital PCM stream */ 294 struct hda_pcm_stream *stream_digital_playback; 295 struct hda_pcm_stream *stream_digital_capture; 296 297 /* playback */ 298 struct hda_multi_out multiout; /* playback set-up 299 * max_channels, dacs must be set 300 * dig_out_nid and hp_nid are optional 301 */ 302 hda_nid_t alt_dac_nid; 303 hda_nid_t slave_dig_outs[3]; /* optional - for auto-parsing */ 304 int dig_out_type; 305 306 /* capture */ 307 unsigned int num_adc_nids; 308 hda_nid_t *adc_nids; 309 hda_nid_t *capsrc_nids; 310 hda_nid_t dig_in_nid; /* digital-in NID; optional */ 311 312 /* capture source */ 313 unsigned int num_mux_defs; 314 const struct hda_input_mux *input_mux; 315 unsigned int cur_mux[3]; 316 struct alc_mic_route ext_mic; 317 struct alc_mic_route int_mic; 318 319 /* channel model */ 320 const struct hda_channel_mode *channel_mode; 321 int num_channel_mode; 322 int need_dac_fix; 323 int const_channel_count; 324 int ext_channel_count; 325 326 /* PCM information */ 327 struct hda_pcm pcm_rec[3]; /* used in alc_build_pcms() */ 328 329 /* dynamic controls, init_verbs and input_mux */ 330 struct auto_pin_cfg autocfg; 331 struct snd_array kctls; 332 struct hda_input_mux private_imux[3]; 333 hda_nid_t private_dac_nids[AUTO_CFG_MAX_OUTS]; 334 hda_nid_t private_adc_nids[AUTO_CFG_MAX_OUTS]; 335 hda_nid_t private_capsrc_nids[AUTO_CFG_MAX_OUTS]; 336 337 /* hooks */ 338 void (*init_hook)(struct hda_codec *codec); 339 void (*unsol_event)(struct hda_codec *codec, unsigned int res); 340 #ifdef CONFIG_SND_HDA_POWER_SAVE 341 void (*power_hook)(struct hda_codec *codec, int power); 342 #endif 343 344 /* for pin sensing */ 345 unsigned int sense_updated: 1; 346 unsigned int jack_present: 1; 347 unsigned int master_sw: 1; 348 unsigned int auto_mic:1; 349 350 /* other flags */ 351 unsigned int no_analog :1; /* digital I/O only */ 352 int init_amp; 353 354 /* for virtual master */ 355 hda_nid_t vmaster_nid; 356 #ifdef CONFIG_SND_HDA_POWER_SAVE 357 struct hda_loopback_check loopback; 358 #endif 359 360 /* for PLL fix */ 361 hda_nid_t pll_nid; 362 unsigned int pll_coef_idx, pll_coef_bit; 363 }; 364 365 /* 366 * configuration template - to be copied to the spec instance 367 */ 368 struct alc_config_preset { 369 struct snd_kcontrol_new *mixers[5]; /* should be identical size 370 * with spec 371 */ 372 struct snd_kcontrol_new *cap_mixer; /* capture mixer */ 373 const struct hda_verb *init_verbs[5]; 374 unsigned int num_dacs; 375 hda_nid_t *dac_nids; 376 hda_nid_t dig_out_nid; /* optional */ 377 hda_nid_t hp_nid; /* optional */ 378 hda_nid_t *slave_dig_outs; 379 unsigned int num_adc_nids; 380 hda_nid_t *adc_nids; 381 hda_nid_t *capsrc_nids; 382 hda_nid_t dig_in_nid; 383 unsigned int num_channel_mode; 384 const struct hda_channel_mode *channel_mode; 385 int need_dac_fix; 386 int const_channel_count; 387 unsigned int num_mux_defs; 388 const struct hda_input_mux *input_mux; 389 void (*unsol_event)(struct hda_codec *, unsigned int); 390 void (*setup)(struct hda_codec *); 391 void (*init_hook)(struct hda_codec *); 392 #ifdef CONFIG_SND_HDA_POWER_SAVE 393 struct hda_amp_list *loopbacks; 394 void (*power_hook)(struct hda_codec *codec, int power); 395 #endif 396 }; 397 398 399 /* 400 * input MUX handling 401 */ 402 static int alc_mux_enum_info(struct snd_kcontrol *kcontrol, 403 struct snd_ctl_elem_info *uinfo) 404 { 405 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 406 struct alc_spec *spec = codec->spec; 407 unsigned int mux_idx = snd_ctl_get_ioffidx(kcontrol, &uinfo->id); 408 if (mux_idx >= spec->num_mux_defs) 409 mux_idx = 0; 410 return snd_hda_input_mux_info(&spec->input_mux[mux_idx], uinfo); 411 } 412 413 static int alc_mux_enum_get(struct snd_kcontrol *kcontrol, 414 struct snd_ctl_elem_value *ucontrol) 415 { 416 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 417 struct alc_spec *spec = codec->spec; 418 unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id); 419 420 ucontrol->value.enumerated.item[0] = spec->cur_mux[adc_idx]; 421 return 0; 422 } 423 424 static int alc_mux_enum_put(struct snd_kcontrol *kcontrol, 425 struct snd_ctl_elem_value *ucontrol) 426 { 427 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 428 struct alc_spec *spec = codec->spec; 429 const struct hda_input_mux *imux; 430 unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id); 431 unsigned int mux_idx; 432 hda_nid_t nid = spec->capsrc_nids ? 433 spec->capsrc_nids[adc_idx] : spec->adc_nids[adc_idx]; 434 unsigned int type; 435 436 mux_idx = adc_idx >= spec->num_mux_defs ? 0 : adc_idx; 437 imux = &spec->input_mux[mux_idx]; 438 439 type = get_wcaps_type(get_wcaps(codec, nid)); 440 if (type == AC_WID_AUD_MIX) { 441 /* Matrix-mixer style (e.g. ALC882) */ 442 unsigned int *cur_val = &spec->cur_mux[adc_idx]; 443 unsigned int i, idx; 444 445 idx = ucontrol->value.enumerated.item[0]; 446 if (idx >= imux->num_items) 447 idx = imux->num_items - 1; 448 if (*cur_val == idx) 449 return 0; 450 for (i = 0; i < imux->num_items; i++) { 451 unsigned int v = (i == idx) ? 0 : HDA_AMP_MUTE; 452 snd_hda_codec_amp_stereo(codec, nid, HDA_INPUT, 453 imux->items[i].index, 454 HDA_AMP_MUTE, v); 455 } 456 *cur_val = idx; 457 return 1; 458 } else { 459 /* MUX style (e.g. ALC880) */ 460 return snd_hda_input_mux_put(codec, imux, ucontrol, nid, 461 &spec->cur_mux[adc_idx]); 462 } 463 } 464 465 /* 466 * channel mode setting 467 */ 468 static int alc_ch_mode_info(struct snd_kcontrol *kcontrol, 469 struct snd_ctl_elem_info *uinfo) 470 { 471 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 472 struct alc_spec *spec = codec->spec; 473 return snd_hda_ch_mode_info(codec, uinfo, spec->channel_mode, 474 spec->num_channel_mode); 475 } 476 477 static int alc_ch_mode_get(struct snd_kcontrol *kcontrol, 478 struct snd_ctl_elem_value *ucontrol) 479 { 480 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 481 struct alc_spec *spec = codec->spec; 482 return snd_hda_ch_mode_get(codec, ucontrol, spec->channel_mode, 483 spec->num_channel_mode, 484 spec->ext_channel_count); 485 } 486 487 static int alc_ch_mode_put(struct snd_kcontrol *kcontrol, 488 struct snd_ctl_elem_value *ucontrol) 489 { 490 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 491 struct alc_spec *spec = codec->spec; 492 int err = snd_hda_ch_mode_put(codec, ucontrol, spec->channel_mode, 493 spec->num_channel_mode, 494 &spec->ext_channel_count); 495 if (err >= 0 && !spec->const_channel_count) { 496 spec->multiout.max_channels = spec->ext_channel_count; 497 if (spec->need_dac_fix) 498 spec->multiout.num_dacs = spec->multiout.max_channels / 2; 499 } 500 return err; 501 } 502 503 /* 504 * Control the mode of pin widget settings via the mixer. "pc" is used 505 * instead of "%" to avoid consequences of accidently treating the % as 506 * being part of a format specifier. Maximum allowed length of a value is 507 * 63 characters plus NULL terminator. 508 * 509 * Note: some retasking pin complexes seem to ignore requests for input 510 * states other than HiZ (eg: PIN_VREFxx) and revert to HiZ if any of these 511 * are requested. Therefore order this list so that this behaviour will not 512 * cause problems when mixer clients move through the enum sequentially. 513 * NIDs 0x0f and 0x10 have been observed to have this behaviour as of 514 * March 2006. 515 */ 516 static char *alc_pin_mode_names[] = { 517 "Mic 50pc bias", "Mic 80pc bias", 518 "Line in", "Line out", "Headphone out", 519 }; 520 static unsigned char alc_pin_mode_values[] = { 521 PIN_VREF50, PIN_VREF80, PIN_IN, PIN_OUT, PIN_HP, 522 }; 523 /* The control can present all 5 options, or it can limit the options based 524 * in the pin being assumed to be exclusively an input or an output pin. In 525 * addition, "input" pins may or may not process the mic bias option 526 * depending on actual widget capability (NIDs 0x0f and 0x10 don't seem to 527 * accept requests for bias as of chip versions up to March 2006) and/or 528 * wiring in the computer. 529 */ 530 #define ALC_PIN_DIR_IN 0x00 531 #define ALC_PIN_DIR_OUT 0x01 532 #define ALC_PIN_DIR_INOUT 0x02 533 #define ALC_PIN_DIR_IN_NOMICBIAS 0x03 534 #define ALC_PIN_DIR_INOUT_NOMICBIAS 0x04 535 536 /* Info about the pin modes supported by the different pin direction modes. 537 * For each direction the minimum and maximum values are given. 538 */ 539 static signed char alc_pin_mode_dir_info[5][2] = { 540 { 0, 2 }, /* ALC_PIN_DIR_IN */ 541 { 3, 4 }, /* ALC_PIN_DIR_OUT */ 542 { 0, 4 }, /* ALC_PIN_DIR_INOUT */ 543 { 2, 2 }, /* ALC_PIN_DIR_IN_NOMICBIAS */ 544 { 2, 4 }, /* ALC_PIN_DIR_INOUT_NOMICBIAS */ 545 }; 546 #define alc_pin_mode_min(_dir) (alc_pin_mode_dir_info[_dir][0]) 547 #define alc_pin_mode_max(_dir) (alc_pin_mode_dir_info[_dir][1]) 548 #define alc_pin_mode_n_items(_dir) \ 549 (alc_pin_mode_max(_dir)-alc_pin_mode_min(_dir)+1) 550 551 static int alc_pin_mode_info(struct snd_kcontrol *kcontrol, 552 struct snd_ctl_elem_info *uinfo) 553 { 554 unsigned int item_num = uinfo->value.enumerated.item; 555 unsigned char dir = (kcontrol->private_value >> 16) & 0xff; 556 557 uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; 558 uinfo->count = 1; 559 uinfo->value.enumerated.items = alc_pin_mode_n_items(dir); 560 561 if (item_num<alc_pin_mode_min(dir) || item_num>alc_pin_mode_max(dir)) 562 item_num = alc_pin_mode_min(dir); 563 strcpy(uinfo->value.enumerated.name, alc_pin_mode_names[item_num]); 564 return 0; 565 } 566 567 static int alc_pin_mode_get(struct snd_kcontrol *kcontrol, 568 struct snd_ctl_elem_value *ucontrol) 569 { 570 unsigned int i; 571 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 572 hda_nid_t nid = kcontrol->private_value & 0xffff; 573 unsigned char dir = (kcontrol->private_value >> 16) & 0xff; 574 long *valp = ucontrol->value.integer.value; 575 unsigned int pinctl = snd_hda_codec_read(codec, nid, 0, 576 AC_VERB_GET_PIN_WIDGET_CONTROL, 577 0x00); 578 579 /* Find enumerated value for current pinctl setting */ 580 i = alc_pin_mode_min(dir); 581 while (i <= alc_pin_mode_max(dir) && alc_pin_mode_values[i] != pinctl) 582 i++; 583 *valp = i <= alc_pin_mode_max(dir) ? i: alc_pin_mode_min(dir); 584 return 0; 585 } 586 587 static int alc_pin_mode_put(struct snd_kcontrol *kcontrol, 588 struct snd_ctl_elem_value *ucontrol) 589 { 590 signed int change; 591 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 592 hda_nid_t nid = kcontrol->private_value & 0xffff; 593 unsigned char dir = (kcontrol->private_value >> 16) & 0xff; 594 long val = *ucontrol->value.integer.value; 595 unsigned int pinctl = snd_hda_codec_read(codec, nid, 0, 596 AC_VERB_GET_PIN_WIDGET_CONTROL, 597 0x00); 598 599 if (val < alc_pin_mode_min(dir) || val > alc_pin_mode_max(dir)) 600 val = alc_pin_mode_min(dir); 601 602 change = pinctl != alc_pin_mode_values[val]; 603 if (change) { 604 /* Set pin mode to that requested */ 605 snd_hda_codec_write_cache(codec, nid, 0, 606 AC_VERB_SET_PIN_WIDGET_CONTROL, 607 alc_pin_mode_values[val]); 608 609 /* Also enable the retasking pin's input/output as required 610 * for the requested pin mode. Enum values of 2 or less are 611 * input modes. 612 * 613 * Dynamically switching the input/output buffers probably 614 * reduces noise slightly (particularly on input) so we'll 615 * do it. However, having both input and output buffers 616 * enabled simultaneously doesn't seem to be problematic if 617 * this turns out to be necessary in the future. 618 */ 619 if (val <= 2) { 620 snd_hda_codec_amp_stereo(codec, nid, HDA_OUTPUT, 0, 621 HDA_AMP_MUTE, HDA_AMP_MUTE); 622 snd_hda_codec_amp_stereo(codec, nid, HDA_INPUT, 0, 623 HDA_AMP_MUTE, 0); 624 } else { 625 snd_hda_codec_amp_stereo(codec, nid, HDA_INPUT, 0, 626 HDA_AMP_MUTE, HDA_AMP_MUTE); 627 snd_hda_codec_amp_stereo(codec, nid, HDA_OUTPUT, 0, 628 HDA_AMP_MUTE, 0); 629 } 630 } 631 return change; 632 } 633 634 #define ALC_PIN_MODE(xname, nid, dir) \ 635 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = 0, \ 636 .info = alc_pin_mode_info, \ 637 .get = alc_pin_mode_get, \ 638 .put = alc_pin_mode_put, \ 639 .private_value = nid | (dir<<16) } 640 641 /* A switch control for ALC260 GPIO pins. Multiple GPIOs can be ganged 642 * together using a mask with more than one bit set. This control is 643 * currently used only by the ALC260 test model. At this stage they are not 644 * needed for any "production" models. 645 */ 646 #ifdef CONFIG_SND_DEBUG 647 #define alc_gpio_data_info snd_ctl_boolean_mono_info 648 649 static int alc_gpio_data_get(struct snd_kcontrol *kcontrol, 650 struct snd_ctl_elem_value *ucontrol) 651 { 652 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 653 hda_nid_t nid = kcontrol->private_value & 0xffff; 654 unsigned char mask = (kcontrol->private_value >> 16) & 0xff; 655 long *valp = ucontrol->value.integer.value; 656 unsigned int val = snd_hda_codec_read(codec, nid, 0, 657 AC_VERB_GET_GPIO_DATA, 0x00); 658 659 *valp = (val & mask) != 0; 660 return 0; 661 } 662 static int alc_gpio_data_put(struct snd_kcontrol *kcontrol, 663 struct snd_ctl_elem_value *ucontrol) 664 { 665 signed int change; 666 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 667 hda_nid_t nid = kcontrol->private_value & 0xffff; 668 unsigned char mask = (kcontrol->private_value >> 16) & 0xff; 669 long val = *ucontrol->value.integer.value; 670 unsigned int gpio_data = snd_hda_codec_read(codec, nid, 0, 671 AC_VERB_GET_GPIO_DATA, 672 0x00); 673 674 /* Set/unset the masked GPIO bit(s) as needed */ 675 change = (val == 0 ? 0 : mask) != (gpio_data & mask); 676 if (val == 0) 677 gpio_data &= ~mask; 678 else 679 gpio_data |= mask; 680 snd_hda_codec_write_cache(codec, nid, 0, 681 AC_VERB_SET_GPIO_DATA, gpio_data); 682 683 return change; 684 } 685 #define ALC_GPIO_DATA_SWITCH(xname, nid, mask) \ 686 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = 0, \ 687 .info = alc_gpio_data_info, \ 688 .get = alc_gpio_data_get, \ 689 .put = alc_gpio_data_put, \ 690 .private_value = nid | (mask<<16) } 691 #endif /* CONFIG_SND_DEBUG */ 692 693 /* A switch control to allow the enabling of the digital IO pins on the 694 * ALC260. This is incredibly simplistic; the intention of this control is 695 * to provide something in the test model allowing digital outputs to be 696 * identified if present. If models are found which can utilise these 697 * outputs a more complete mixer control can be devised for those models if 698 * necessary. 699 */ 700 #ifdef CONFIG_SND_DEBUG 701 #define alc_spdif_ctrl_info snd_ctl_boolean_mono_info 702 703 static int alc_spdif_ctrl_get(struct snd_kcontrol *kcontrol, 704 struct snd_ctl_elem_value *ucontrol) 705 { 706 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 707 hda_nid_t nid = kcontrol->private_value & 0xffff; 708 unsigned char mask = (kcontrol->private_value >> 16) & 0xff; 709 long *valp = ucontrol->value.integer.value; 710 unsigned int val = snd_hda_codec_read(codec, nid, 0, 711 AC_VERB_GET_DIGI_CONVERT_1, 0x00); 712 713 *valp = (val & mask) != 0; 714 return 0; 715 } 716 static int alc_spdif_ctrl_put(struct snd_kcontrol *kcontrol, 717 struct snd_ctl_elem_value *ucontrol) 718 { 719 signed int change; 720 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 721 hda_nid_t nid = kcontrol->private_value & 0xffff; 722 unsigned char mask = (kcontrol->private_value >> 16) & 0xff; 723 long val = *ucontrol->value.integer.value; 724 unsigned int ctrl_data = snd_hda_codec_read(codec, nid, 0, 725 AC_VERB_GET_DIGI_CONVERT_1, 726 0x00); 727 728 /* Set/unset the masked control bit(s) as needed */ 729 change = (val == 0 ? 0 : mask) != (ctrl_data & mask); 730 if (val==0) 731 ctrl_data &= ~mask; 732 else 733 ctrl_data |= mask; 734 snd_hda_codec_write_cache(codec, nid, 0, AC_VERB_SET_DIGI_CONVERT_1, 735 ctrl_data); 736 737 return change; 738 } 739 #define ALC_SPDIF_CTRL_SWITCH(xname, nid, mask) \ 740 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = 0, \ 741 .info = alc_spdif_ctrl_info, \ 742 .get = alc_spdif_ctrl_get, \ 743 .put = alc_spdif_ctrl_put, \ 744 .private_value = nid | (mask<<16) } 745 #endif /* CONFIG_SND_DEBUG */ 746 747 /* A switch control to allow the enabling EAPD digital outputs on the ALC26x. 748 * Again, this is only used in the ALC26x test models to help identify when 749 * the EAPD line must be asserted for features to work. 750 */ 751 #ifdef CONFIG_SND_DEBUG 752 #define alc_eapd_ctrl_info snd_ctl_boolean_mono_info 753 754 static int alc_eapd_ctrl_get(struct snd_kcontrol *kcontrol, 755 struct snd_ctl_elem_value *ucontrol) 756 { 757 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 758 hda_nid_t nid = kcontrol->private_value & 0xffff; 759 unsigned char mask = (kcontrol->private_value >> 16) & 0xff; 760 long *valp = ucontrol->value.integer.value; 761 unsigned int val = snd_hda_codec_read(codec, nid, 0, 762 AC_VERB_GET_EAPD_BTLENABLE, 0x00); 763 764 *valp = (val & mask) != 0; 765 return 0; 766 } 767 768 static int alc_eapd_ctrl_put(struct snd_kcontrol *kcontrol, 769 struct snd_ctl_elem_value *ucontrol) 770 { 771 int change; 772 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 773 hda_nid_t nid = kcontrol->private_value & 0xffff; 774 unsigned char mask = (kcontrol->private_value >> 16) & 0xff; 775 long val = *ucontrol->value.integer.value; 776 unsigned int ctrl_data = snd_hda_codec_read(codec, nid, 0, 777 AC_VERB_GET_EAPD_BTLENABLE, 778 0x00); 779 780 /* Set/unset the masked control bit(s) as needed */ 781 change = (!val ? 0 : mask) != (ctrl_data & mask); 782 if (!val) 783 ctrl_data &= ~mask; 784 else 785 ctrl_data |= mask; 786 snd_hda_codec_write_cache(codec, nid, 0, AC_VERB_SET_EAPD_BTLENABLE, 787 ctrl_data); 788 789 return change; 790 } 791 792 #define ALC_EAPD_CTRL_SWITCH(xname, nid, mask) \ 793 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = 0, \ 794 .info = alc_eapd_ctrl_info, \ 795 .get = alc_eapd_ctrl_get, \ 796 .put = alc_eapd_ctrl_put, \ 797 .private_value = nid | (mask<<16) } 798 #endif /* CONFIG_SND_DEBUG */ 799 800 /* 801 * set up the input pin config (depending on the given auto-pin type) 802 */ 803 static void alc_set_input_pin(struct hda_codec *codec, hda_nid_t nid, 804 int auto_pin_type) 805 { 806 unsigned int val = PIN_IN; 807 808 if (auto_pin_type <= AUTO_PIN_FRONT_MIC) { 809 unsigned int pincap; 810 pincap = snd_hda_query_pin_caps(codec, nid); 811 pincap = (pincap & AC_PINCAP_VREF) >> AC_PINCAP_VREF_SHIFT; 812 if (pincap & AC_PINCAP_VREF_80) 813 val = PIN_VREF80; 814 else if (pincap & AC_PINCAP_VREF_50) 815 val = PIN_VREF50; 816 else if (pincap & AC_PINCAP_VREF_100) 817 val = PIN_VREF100; 818 else if (pincap & AC_PINCAP_VREF_GRD) 819 val = PIN_VREFGRD; 820 } 821 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_PIN_WIDGET_CONTROL, val); 822 } 823 824 /* 825 */ 826 static void add_mixer(struct alc_spec *spec, struct snd_kcontrol_new *mix) 827 { 828 if (snd_BUG_ON(spec->num_mixers >= ARRAY_SIZE(spec->mixers))) 829 return; 830 spec->mixers[spec->num_mixers++] = mix; 831 } 832 833 static void add_verb(struct alc_spec *spec, const struct hda_verb *verb) 834 { 835 if (snd_BUG_ON(spec->num_init_verbs >= ARRAY_SIZE(spec->init_verbs))) 836 return; 837 spec->init_verbs[spec->num_init_verbs++] = verb; 838 } 839 840 #ifdef CONFIG_PROC_FS 841 /* 842 * hook for proc 843 */ 844 static void print_realtek_coef(struct snd_info_buffer *buffer, 845 struct hda_codec *codec, hda_nid_t nid) 846 { 847 int coeff; 848 849 if (nid != 0x20) 850 return; 851 coeff = snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_PROC_COEF, 0); 852 snd_iprintf(buffer, " Processing Coefficient: 0x%02x\n", coeff); 853 coeff = snd_hda_codec_read(codec, nid, 0, 854 AC_VERB_GET_COEF_INDEX, 0); 855 snd_iprintf(buffer, " Coefficient Index: 0x%02x\n", coeff); 856 } 857 #else 858 #define print_realtek_coef NULL 859 #endif 860 861 /* 862 * set up from the preset table 863 */ 864 static void setup_preset(struct hda_codec *codec, 865 const struct alc_config_preset *preset) 866 { 867 struct alc_spec *spec = codec->spec; 868 int i; 869 870 for (i = 0; i < ARRAY_SIZE(preset->mixers) && preset->mixers[i]; i++) 871 add_mixer(spec, preset->mixers[i]); 872 spec->cap_mixer = preset->cap_mixer; 873 for (i = 0; i < ARRAY_SIZE(preset->init_verbs) && preset->init_verbs[i]; 874 i++) 875 add_verb(spec, preset->init_verbs[i]); 876 877 spec->channel_mode = preset->channel_mode; 878 spec->num_channel_mode = preset->num_channel_mode; 879 spec->need_dac_fix = preset->need_dac_fix; 880 spec->const_channel_count = preset->const_channel_count; 881 882 if (preset->const_channel_count) 883 spec->multiout.max_channels = preset->const_channel_count; 884 else 885 spec->multiout.max_channels = spec->channel_mode[0].channels; 886 spec->ext_channel_count = spec->channel_mode[0].channels; 887 888 spec->multiout.num_dacs = preset->num_dacs; 889 spec->multiout.dac_nids = preset->dac_nids; 890 spec->multiout.dig_out_nid = preset->dig_out_nid; 891 spec->multiout.slave_dig_outs = preset->slave_dig_outs; 892 spec->multiout.hp_nid = preset->hp_nid; 893 894 spec->num_mux_defs = preset->num_mux_defs; 895 if (!spec->num_mux_defs) 896 spec->num_mux_defs = 1; 897 spec->input_mux = preset->input_mux; 898 899 spec->num_adc_nids = preset->num_adc_nids; 900 spec->adc_nids = preset->adc_nids; 901 spec->capsrc_nids = preset->capsrc_nids; 902 spec->dig_in_nid = preset->dig_in_nid; 903 904 spec->unsol_event = preset->unsol_event; 905 spec->init_hook = preset->init_hook; 906 #ifdef CONFIG_SND_HDA_POWER_SAVE 907 spec->power_hook = preset->power_hook; 908 spec->loopback.amplist = preset->loopbacks; 909 #endif 910 911 if (preset->setup) 912 preset->setup(codec); 913 } 914 915 /* Enable GPIO mask and set output */ 916 static struct hda_verb alc_gpio1_init_verbs[] = { 917 {0x01, AC_VERB_SET_GPIO_MASK, 0x01}, 918 {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01}, 919 {0x01, AC_VERB_SET_GPIO_DATA, 0x01}, 920 { } 921 }; 922 923 static struct hda_verb alc_gpio2_init_verbs[] = { 924 {0x01, AC_VERB_SET_GPIO_MASK, 0x02}, 925 {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x02}, 926 {0x01, AC_VERB_SET_GPIO_DATA, 0x02}, 927 { } 928 }; 929 930 static struct hda_verb alc_gpio3_init_verbs[] = { 931 {0x01, AC_VERB_SET_GPIO_MASK, 0x03}, 932 {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x03}, 933 {0x01, AC_VERB_SET_GPIO_DATA, 0x03}, 934 { } 935 }; 936 937 /* 938 * Fix hardware PLL issue 939 * On some codecs, the analog PLL gating control must be off while 940 * the default value is 1. 941 */ 942 static void alc_fix_pll(struct hda_codec *codec) 943 { 944 struct alc_spec *spec = codec->spec; 945 unsigned int val; 946 947 if (!spec->pll_nid) 948 return; 949 snd_hda_codec_write(codec, spec->pll_nid, 0, AC_VERB_SET_COEF_INDEX, 950 spec->pll_coef_idx); 951 val = snd_hda_codec_read(codec, spec->pll_nid, 0, 952 AC_VERB_GET_PROC_COEF, 0); 953 snd_hda_codec_write(codec, spec->pll_nid, 0, AC_VERB_SET_COEF_INDEX, 954 spec->pll_coef_idx); 955 snd_hda_codec_write(codec, spec->pll_nid, 0, AC_VERB_SET_PROC_COEF, 956 val & ~(1 << spec->pll_coef_bit)); 957 } 958 959 static void alc_fix_pll_init(struct hda_codec *codec, hda_nid_t nid, 960 unsigned int coef_idx, unsigned int coef_bit) 961 { 962 struct alc_spec *spec = codec->spec; 963 spec->pll_nid = nid; 964 spec->pll_coef_idx = coef_idx; 965 spec->pll_coef_bit = coef_bit; 966 alc_fix_pll(codec); 967 } 968 969 static void alc_automute_pin(struct hda_codec *codec) 970 { 971 struct alc_spec *spec = codec->spec; 972 unsigned int nid = spec->autocfg.hp_pins[0]; 973 int i; 974 975 if (!nid) 976 return; 977 spec->jack_present = snd_hda_jack_detect(codec, nid); 978 for (i = 0; i < ARRAY_SIZE(spec->autocfg.speaker_pins); i++) { 979 nid = spec->autocfg.speaker_pins[i]; 980 if (!nid) 981 break; 982 snd_hda_codec_write(codec, nid, 0, 983 AC_VERB_SET_PIN_WIDGET_CONTROL, 984 spec->jack_present ? 0 : PIN_OUT); 985 } 986 } 987 988 static int get_connection_index(struct hda_codec *codec, hda_nid_t mux, 989 hda_nid_t nid) 990 { 991 hda_nid_t conn[HDA_MAX_NUM_INPUTS]; 992 int i, nums; 993 994 nums = snd_hda_get_connections(codec, mux, conn, ARRAY_SIZE(conn)); 995 for (i = 0; i < nums; i++) 996 if (conn[i] == nid) 997 return i; 998 return -1; 999 } 1000 1001 static void alc_mic_automute(struct hda_codec *codec) 1002 { 1003 struct alc_spec *spec = codec->spec; 1004 struct alc_mic_route *dead, *alive; 1005 unsigned int present, type; 1006 hda_nid_t cap_nid; 1007 1008 if (!spec->auto_mic) 1009 return; 1010 if (!spec->int_mic.pin || !spec->ext_mic.pin) 1011 return; 1012 if (snd_BUG_ON(!spec->adc_nids)) 1013 return; 1014 1015 cap_nid = spec->capsrc_nids ? spec->capsrc_nids[0] : spec->adc_nids[0]; 1016 1017 present = snd_hda_jack_detect(codec, spec->ext_mic.pin); 1018 if (present) { 1019 alive = &spec->ext_mic; 1020 dead = &spec->int_mic; 1021 } else { 1022 alive = &spec->int_mic; 1023 dead = &spec->ext_mic; 1024 } 1025 1026 type = get_wcaps_type(get_wcaps(codec, cap_nid)); 1027 if (type == AC_WID_AUD_MIX) { 1028 /* Matrix-mixer style (e.g. ALC882) */ 1029 snd_hda_codec_amp_stereo(codec, cap_nid, HDA_INPUT, 1030 alive->mux_idx, 1031 HDA_AMP_MUTE, 0); 1032 snd_hda_codec_amp_stereo(codec, cap_nid, HDA_INPUT, 1033 dead->mux_idx, 1034 HDA_AMP_MUTE, HDA_AMP_MUTE); 1035 } else { 1036 /* MUX style (e.g. ALC880) */ 1037 snd_hda_codec_write_cache(codec, cap_nid, 0, 1038 AC_VERB_SET_CONNECT_SEL, 1039 alive->mux_idx); 1040 } 1041 1042 /* FIXME: analog mixer */ 1043 } 1044 1045 /* unsolicited event for HP jack sensing */ 1046 static void alc_sku_unsol_event(struct hda_codec *codec, unsigned int res) 1047 { 1048 if (codec->vendor_id == 0x10ec0880) 1049 res >>= 28; 1050 else 1051 res >>= 26; 1052 switch (res) { 1053 case ALC880_HP_EVENT: 1054 alc_automute_pin(codec); 1055 break; 1056 case ALC880_MIC_EVENT: 1057 alc_mic_automute(codec); 1058 break; 1059 } 1060 } 1061 1062 static void alc_inithook(struct hda_codec *codec) 1063 { 1064 alc_automute_pin(codec); 1065 alc_mic_automute(codec); 1066 } 1067 1068 /* additional initialization for ALC888 variants */ 1069 static void alc888_coef_init(struct hda_codec *codec) 1070 { 1071 unsigned int tmp; 1072 1073 snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 0); 1074 tmp = snd_hda_codec_read(codec, 0x20, 0, AC_VERB_GET_PROC_COEF, 0); 1075 snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 7); 1076 if ((tmp & 0xf0) == 0x20) 1077 /* alc888S-VC */ 1078 snd_hda_codec_read(codec, 0x20, 0, 1079 AC_VERB_SET_PROC_COEF, 0x830); 1080 else 1081 /* alc888-VB */ 1082 snd_hda_codec_read(codec, 0x20, 0, 1083 AC_VERB_SET_PROC_COEF, 0x3030); 1084 } 1085 1086 static void alc889_coef_init(struct hda_codec *codec) 1087 { 1088 unsigned int tmp; 1089 1090 snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 7); 1091 tmp = snd_hda_codec_read(codec, 0x20, 0, AC_VERB_GET_PROC_COEF, 0); 1092 snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 7); 1093 snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_PROC_COEF, tmp|0x2010); 1094 } 1095 1096 static void alc_auto_init_amp(struct hda_codec *codec, int type) 1097 { 1098 unsigned int tmp; 1099 1100 switch (type) { 1101 case ALC_INIT_GPIO1: 1102 snd_hda_sequence_write(codec, alc_gpio1_init_verbs); 1103 break; 1104 case ALC_INIT_GPIO2: 1105 snd_hda_sequence_write(codec, alc_gpio2_init_verbs); 1106 break; 1107 case ALC_INIT_GPIO3: 1108 snd_hda_sequence_write(codec, alc_gpio3_init_verbs); 1109 break; 1110 case ALC_INIT_DEFAULT: 1111 switch (codec->vendor_id) { 1112 case 0x10ec0260: 1113 snd_hda_codec_write(codec, 0x0f, 0, 1114 AC_VERB_SET_EAPD_BTLENABLE, 2); 1115 snd_hda_codec_write(codec, 0x10, 0, 1116 AC_VERB_SET_EAPD_BTLENABLE, 2); 1117 break; 1118 case 0x10ec0262: 1119 case 0x10ec0267: 1120 case 0x10ec0268: 1121 case 0x10ec0269: 1122 case 0x10ec0272: 1123 case 0x10ec0660: 1124 case 0x10ec0662: 1125 case 0x10ec0663: 1126 case 0x10ec0862: 1127 case 0x10ec0889: 1128 snd_hda_codec_write(codec, 0x14, 0, 1129 AC_VERB_SET_EAPD_BTLENABLE, 2); 1130 snd_hda_codec_write(codec, 0x15, 0, 1131 AC_VERB_SET_EAPD_BTLENABLE, 2); 1132 break; 1133 } 1134 switch (codec->vendor_id) { 1135 case 0x10ec0260: 1136 snd_hda_codec_write(codec, 0x1a, 0, 1137 AC_VERB_SET_COEF_INDEX, 7); 1138 tmp = snd_hda_codec_read(codec, 0x1a, 0, 1139 AC_VERB_GET_PROC_COEF, 0); 1140 snd_hda_codec_write(codec, 0x1a, 0, 1141 AC_VERB_SET_COEF_INDEX, 7); 1142 snd_hda_codec_write(codec, 0x1a, 0, 1143 AC_VERB_SET_PROC_COEF, 1144 tmp | 0x2010); 1145 break; 1146 case 0x10ec0262: 1147 case 0x10ec0880: 1148 case 0x10ec0882: 1149 case 0x10ec0883: 1150 case 0x10ec0885: 1151 case 0x10ec0887: 1152 case 0x10ec0889: 1153 alc889_coef_init(codec); 1154 break; 1155 case 0x10ec0888: 1156 alc888_coef_init(codec); 1157 break; 1158 case 0x10ec0267: 1159 case 0x10ec0268: 1160 snd_hda_codec_write(codec, 0x20, 0, 1161 AC_VERB_SET_COEF_INDEX, 7); 1162 tmp = snd_hda_codec_read(codec, 0x20, 0, 1163 AC_VERB_GET_PROC_COEF, 0); 1164 snd_hda_codec_write(codec, 0x20, 0, 1165 AC_VERB_SET_COEF_INDEX, 7); 1166 snd_hda_codec_write(codec, 0x20, 0, 1167 AC_VERB_SET_PROC_COEF, 1168 tmp | 0x3000); 1169 break; 1170 } 1171 break; 1172 } 1173 } 1174 1175 static void alc_init_auto_hp(struct hda_codec *codec) 1176 { 1177 struct alc_spec *spec = codec->spec; 1178 1179 if (!spec->autocfg.hp_pins[0]) 1180 return; 1181 1182 if (!spec->autocfg.speaker_pins[0]) { 1183 if (spec->autocfg.line_out_pins[0] && 1184 spec->autocfg.line_out_type == AUTO_PIN_SPEAKER_OUT) 1185 spec->autocfg.speaker_pins[0] = 1186 spec->autocfg.line_out_pins[0]; 1187 else 1188 return; 1189 } 1190 1191 snd_printdd("realtek: Enable HP auto-muting on NID 0x%x\n", 1192 spec->autocfg.hp_pins[0]); 1193 snd_hda_codec_write_cache(codec, spec->autocfg.hp_pins[0], 0, 1194 AC_VERB_SET_UNSOLICITED_ENABLE, 1195 AC_USRSP_EN | ALC880_HP_EVENT); 1196 spec->unsol_event = alc_sku_unsol_event; 1197 } 1198 1199 static void alc_init_auto_mic(struct hda_codec *codec) 1200 { 1201 struct alc_spec *spec = codec->spec; 1202 struct auto_pin_cfg *cfg = &spec->autocfg; 1203 hda_nid_t fixed, ext; 1204 int i; 1205 1206 /* there must be only two mic inputs exclusively */ 1207 for (i = AUTO_PIN_LINE; i < AUTO_PIN_LAST; i++) 1208 if (cfg->input_pins[i]) 1209 return; 1210 1211 fixed = ext = 0; 1212 for (i = AUTO_PIN_MIC; i <= AUTO_PIN_FRONT_MIC; i++) { 1213 hda_nid_t nid = cfg->input_pins[i]; 1214 unsigned int defcfg; 1215 if (!nid) 1216 return; 1217 defcfg = snd_hda_codec_get_pincfg(codec, nid); 1218 switch (get_defcfg_connect(defcfg)) { 1219 case AC_JACK_PORT_FIXED: 1220 if (fixed) 1221 return; /* already occupied */ 1222 fixed = nid; 1223 break; 1224 case AC_JACK_PORT_COMPLEX: 1225 if (ext) 1226 return; /* already occupied */ 1227 ext = nid; 1228 break; 1229 default: 1230 return; /* invalid entry */ 1231 } 1232 } 1233 if (!(get_wcaps(codec, ext) & AC_WCAP_UNSOL_CAP)) 1234 return; /* no unsol support */ 1235 snd_printdd("realtek: Enable auto-mic switch on NID 0x%x/0x%x\n", 1236 ext, fixed); 1237 spec->ext_mic.pin = ext; 1238 spec->int_mic.pin = fixed; 1239 spec->ext_mic.mux_idx = MUX_IDX_UNDEF; /* set later */ 1240 spec->int_mic.mux_idx = MUX_IDX_UNDEF; /* set later */ 1241 spec->auto_mic = 1; 1242 snd_hda_codec_write_cache(codec, spec->ext_mic.pin, 0, 1243 AC_VERB_SET_UNSOLICITED_ENABLE, 1244 AC_USRSP_EN | ALC880_MIC_EVENT); 1245 spec->unsol_event = alc_sku_unsol_event; 1246 } 1247 1248 /* check subsystem ID and set up device-specific initialization; 1249 * return 1 if initialized, 0 if invalid SSID 1250 */ 1251 /* 32-bit subsystem ID for BIOS loading in HD Audio codec. 1252 * 31 ~ 16 : Manufacture ID 1253 * 15 ~ 8 : SKU ID 1254 * 7 ~ 0 : Assembly ID 1255 * port-A --> pin 39/41, port-E --> pin 14/15, port-D --> pin 35/36 1256 */ 1257 static int alc_subsystem_id(struct hda_codec *codec, 1258 hda_nid_t porta, hda_nid_t porte, 1259 hda_nid_t portd) 1260 { 1261 unsigned int ass, tmp, i; 1262 unsigned nid; 1263 struct alc_spec *spec = codec->spec; 1264 1265 ass = codec->subsystem_id & 0xffff; 1266 if ((ass != codec->bus->pci->subsystem_device) && (ass & 1)) 1267 goto do_sku; 1268 1269 /* invalid SSID, check the special NID pin defcfg instead */ 1270 /* 1271 * 31~30 : port connectivity 1272 * 29~21 : reserve 1273 * 20 : PCBEEP input 1274 * 19~16 : Check sum (15:1) 1275 * 15~1 : Custom 1276 * 0 : override 1277 */ 1278 nid = 0x1d; 1279 if (codec->vendor_id == 0x10ec0260) 1280 nid = 0x17; 1281 ass = snd_hda_codec_get_pincfg(codec, nid); 1282 snd_printd("realtek: No valid SSID, " 1283 "checking pincfg 0x%08x for NID 0x%x\n", 1284 ass, nid); 1285 if (!(ass & 1) && !(ass & 0x100000)) 1286 return 0; 1287 if ((ass >> 30) != 1) /* no physical connection */ 1288 return 0; 1289 1290 /* check sum */ 1291 tmp = 0; 1292 for (i = 1; i < 16; i++) { 1293 if ((ass >> i) & 1) 1294 tmp++; 1295 } 1296 if (((ass >> 16) & 0xf) != tmp) 1297 return 0; 1298 do_sku: 1299 snd_printd("realtek: Enabling init ASM_ID=0x%04x CODEC_ID=%08x\n", 1300 ass & 0xffff, codec->vendor_id); 1301 /* 1302 * 0 : override 1303 * 1 : Swap Jack 1304 * 2 : 0 --> Desktop, 1 --> Laptop 1305 * 3~5 : External Amplifier control 1306 * 7~6 : Reserved 1307 */ 1308 tmp = (ass & 0x38) >> 3; /* external Amp control */ 1309 switch (tmp) { 1310 case 1: 1311 spec->init_amp = ALC_INIT_GPIO1; 1312 break; 1313 case 3: 1314 spec->init_amp = ALC_INIT_GPIO2; 1315 break; 1316 case 7: 1317 spec->init_amp = ALC_INIT_GPIO3; 1318 break; 1319 case 5: 1320 spec->init_amp = ALC_INIT_DEFAULT; 1321 break; 1322 } 1323 1324 /* is laptop or Desktop and enable the function "Mute internal speaker 1325 * when the external headphone out jack is plugged" 1326 */ 1327 if (!(ass & 0x8000)) 1328 return 1; 1329 /* 1330 * 10~8 : Jack location 1331 * 12~11: Headphone out -> 00: PortA, 01: PortE, 02: PortD, 03: Resvered 1332 * 14~13: Resvered 1333 * 15 : 1 --> enable the function "Mute internal speaker 1334 * when the external headphone out jack is plugged" 1335 */ 1336 if (!spec->autocfg.hp_pins[0]) { 1337 hda_nid_t nid; 1338 tmp = (ass >> 11) & 0x3; /* HP to chassis */ 1339 if (tmp == 0) 1340 nid = porta; 1341 else if (tmp == 1) 1342 nid = porte; 1343 else if (tmp == 2) 1344 nid = portd; 1345 else 1346 return 1; 1347 for (i = 0; i < spec->autocfg.line_outs; i++) 1348 if (spec->autocfg.line_out_pins[i] == nid) 1349 return 1; 1350 spec->autocfg.hp_pins[0] = nid; 1351 } 1352 1353 alc_init_auto_hp(codec); 1354 alc_init_auto_mic(codec); 1355 return 1; 1356 } 1357 1358 static void alc_ssid_check(struct hda_codec *codec, 1359 hda_nid_t porta, hda_nid_t porte, hda_nid_t portd) 1360 { 1361 if (!alc_subsystem_id(codec, porta, porte, portd)) { 1362 struct alc_spec *spec = codec->spec; 1363 snd_printd("realtek: " 1364 "Enable default setup for auto mode as fallback\n"); 1365 spec->init_amp = ALC_INIT_DEFAULT; 1366 alc_init_auto_hp(codec); 1367 alc_init_auto_mic(codec); 1368 } 1369 } 1370 1371 /* 1372 * Fix-up pin default configurations and add default verbs 1373 */ 1374 1375 struct alc_pincfg { 1376 hda_nid_t nid; 1377 u32 val; 1378 }; 1379 1380 struct alc_fixup { 1381 const struct alc_pincfg *pins; 1382 const struct hda_verb *verbs; 1383 }; 1384 1385 static void alc_pick_fixup(struct hda_codec *codec, 1386 const struct snd_pci_quirk *quirk, 1387 const struct alc_fixup *fix) 1388 { 1389 const struct alc_pincfg *cfg; 1390 1391 quirk = snd_pci_quirk_lookup(codec->bus->pci, quirk); 1392 if (!quirk) 1393 return; 1394 1395 fix += quirk->value; 1396 cfg = fix->pins; 1397 if (cfg) { 1398 for (; cfg->nid; cfg++) 1399 snd_hda_codec_set_pincfg(codec, cfg->nid, cfg->val); 1400 } 1401 if (fix->verbs) 1402 add_verb(codec->spec, fix->verbs); 1403 } 1404 1405 static int alc_read_coef_idx(struct hda_codec *codec, 1406 unsigned int coef_idx) 1407 { 1408 unsigned int val; 1409 snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 1410 coef_idx); 1411 val = snd_hda_codec_read(codec, 0x20, 0, 1412 AC_VERB_GET_PROC_COEF, 0); 1413 return val; 1414 } 1415 1416 /* 1417 * ALC888 1418 */ 1419 1420 /* 1421 * 2ch mode 1422 */ 1423 static struct hda_verb alc888_4ST_ch2_intel_init[] = { 1424 /* Mic-in jack as mic in */ 1425 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, 1426 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE }, 1427 /* Line-in jack as Line in */ 1428 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN }, 1429 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE }, 1430 /* Line-Out as Front */ 1431 { 0x17, AC_VERB_SET_CONNECT_SEL, 0x00}, 1432 { } /* end */ 1433 }; 1434 1435 /* 1436 * 4ch mode 1437 */ 1438 static struct hda_verb alc888_4ST_ch4_intel_init[] = { 1439 /* Mic-in jack as mic in */ 1440 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, 1441 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE }, 1442 /* Line-in jack as Surround */ 1443 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 1444 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 1445 /* Line-Out as Front */ 1446 { 0x17, AC_VERB_SET_CONNECT_SEL, 0x00}, 1447 { } /* end */ 1448 }; 1449 1450 /* 1451 * 6ch mode 1452 */ 1453 static struct hda_verb alc888_4ST_ch6_intel_init[] = { 1454 /* Mic-in jack as CLFE */ 1455 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 1456 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 1457 /* Line-in jack as Surround */ 1458 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 1459 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 1460 /* Line-Out as CLFE (workaround because Mic-in is not loud enough) */ 1461 { 0x17, AC_VERB_SET_CONNECT_SEL, 0x03}, 1462 { } /* end */ 1463 }; 1464 1465 /* 1466 * 8ch mode 1467 */ 1468 static struct hda_verb alc888_4ST_ch8_intel_init[] = { 1469 /* Mic-in jack as CLFE */ 1470 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 1471 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 1472 /* Line-in jack as Surround */ 1473 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 1474 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 1475 /* Line-Out as Side */ 1476 { 0x17, AC_VERB_SET_CONNECT_SEL, 0x03}, 1477 { } /* end */ 1478 }; 1479 1480 static struct hda_channel_mode alc888_4ST_8ch_intel_modes[4] = { 1481 { 2, alc888_4ST_ch2_intel_init }, 1482 { 4, alc888_4ST_ch4_intel_init }, 1483 { 6, alc888_4ST_ch6_intel_init }, 1484 { 8, alc888_4ST_ch8_intel_init }, 1485 }; 1486 1487 /* 1488 * ALC888 Fujitsu Siemens Amillo xa3530 1489 */ 1490 1491 static struct hda_verb alc888_fujitsu_xa3530_verbs[] = { 1492 /* Front Mic: set to PIN_IN (empty by default) */ 1493 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 1494 /* Connect Internal HP to Front */ 1495 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 1496 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 1497 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, 1498 /* Connect Bass HP to Front */ 1499 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 1500 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 1501 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, 1502 /* Connect Line-Out side jack (SPDIF) to Side */ 1503 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 1504 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 1505 {0x17, AC_VERB_SET_CONNECT_SEL, 0x03}, 1506 /* Connect Mic jack to CLFE */ 1507 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 1508 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 1509 {0x18, AC_VERB_SET_CONNECT_SEL, 0x02}, 1510 /* Connect Line-in jack to Surround */ 1511 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 1512 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 1513 {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01}, 1514 /* Connect HP out jack to Front */ 1515 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 1516 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 1517 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, 1518 /* Enable unsolicited event for HP jack and Line-out jack */ 1519 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, 1520 {0x17, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, 1521 {} 1522 }; 1523 1524 static void alc_automute_amp(struct hda_codec *codec) 1525 { 1526 struct alc_spec *spec = codec->spec; 1527 unsigned int mute; 1528 hda_nid_t nid; 1529 int i; 1530 1531 spec->jack_present = 0; 1532 for (i = 0; i < ARRAY_SIZE(spec->autocfg.hp_pins); i++) { 1533 nid = spec->autocfg.hp_pins[i]; 1534 if (!nid) 1535 break; 1536 if (snd_hda_jack_detect(codec, nid)) { 1537 spec->jack_present = 1; 1538 break; 1539 } 1540 } 1541 1542 mute = spec->jack_present ? HDA_AMP_MUTE : 0; 1543 /* Toggle internal speakers muting */ 1544 for (i = 0; i < ARRAY_SIZE(spec->autocfg.speaker_pins); i++) { 1545 nid = spec->autocfg.speaker_pins[i]; 1546 if (!nid) 1547 break; 1548 snd_hda_codec_amp_stereo(codec, nid, HDA_OUTPUT, 0, 1549 HDA_AMP_MUTE, mute); 1550 } 1551 } 1552 1553 static void alc_automute_amp_unsol_event(struct hda_codec *codec, 1554 unsigned int res) 1555 { 1556 if (codec->vendor_id == 0x10ec0880) 1557 res >>= 28; 1558 else 1559 res >>= 26; 1560 if (res == ALC880_HP_EVENT) 1561 alc_automute_amp(codec); 1562 } 1563 1564 static void alc889_automute_setup(struct hda_codec *codec) 1565 { 1566 struct alc_spec *spec = codec->spec; 1567 1568 spec->autocfg.hp_pins[0] = 0x15; 1569 spec->autocfg.speaker_pins[0] = 0x14; 1570 spec->autocfg.speaker_pins[1] = 0x16; 1571 spec->autocfg.speaker_pins[2] = 0x17; 1572 spec->autocfg.speaker_pins[3] = 0x19; 1573 spec->autocfg.speaker_pins[4] = 0x1a; 1574 } 1575 1576 static void alc889_intel_init_hook(struct hda_codec *codec) 1577 { 1578 alc889_coef_init(codec); 1579 alc_automute_amp(codec); 1580 } 1581 1582 static void alc888_fujitsu_xa3530_setup(struct hda_codec *codec) 1583 { 1584 struct alc_spec *spec = codec->spec; 1585 1586 spec->autocfg.hp_pins[0] = 0x17; /* line-out */ 1587 spec->autocfg.hp_pins[1] = 0x1b; /* hp */ 1588 spec->autocfg.speaker_pins[0] = 0x14; /* speaker */ 1589 spec->autocfg.speaker_pins[1] = 0x15; /* bass */ 1590 } 1591 1592 /* 1593 * ALC888 Acer Aspire 4930G model 1594 */ 1595 1596 static struct hda_verb alc888_acer_aspire_4930g_verbs[] = { 1597 /* Front Mic: set to PIN_IN (empty by default) */ 1598 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 1599 /* Unselect Front Mic by default in input mixer 3 */ 1600 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0xb)}, 1601 /* Enable unsolicited event for HP jack */ 1602 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, 1603 /* Connect Internal HP to front */ 1604 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 1605 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 1606 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, 1607 /* Connect HP out to front */ 1608 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 1609 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 1610 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, 1611 { } 1612 }; 1613 1614 /* 1615 * ALC888 Acer Aspire 6530G model 1616 */ 1617 1618 static struct hda_verb alc888_acer_aspire_6530g_verbs[] = { 1619 /* Bias voltage on for external mic port */ 1620 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN | PIN_VREF80}, 1621 /* Front Mic: set to PIN_IN (empty by default) */ 1622 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 1623 /* Unselect Front Mic by default in input mixer 3 */ 1624 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0xb)}, 1625 /* Enable unsolicited event for HP jack */ 1626 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, 1627 /* Enable speaker output */ 1628 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 1629 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 1630 /* Enable headphone output */ 1631 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | PIN_HP}, 1632 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 1633 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, 1634 { } 1635 }; 1636 1637 /* 1638 * ALC889 Acer Aspire 8930G model 1639 */ 1640 1641 static struct hda_verb alc889_acer_aspire_8930g_verbs[] = { 1642 /* Front Mic: set to PIN_IN (empty by default) */ 1643 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 1644 /* Unselect Front Mic by default in input mixer 3 */ 1645 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0xb)}, 1646 /* Enable unsolicited event for HP jack */ 1647 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, 1648 /* Connect Internal Front to Front */ 1649 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 1650 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 1651 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, 1652 /* Connect Internal Rear to Rear */ 1653 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 1654 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 1655 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x01}, 1656 /* Connect Internal CLFE to CLFE */ 1657 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 1658 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 1659 {0x16, AC_VERB_SET_CONNECT_SEL, 0x02}, 1660 /* Connect HP out to Front */ 1661 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | PIN_HP}, 1662 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 1663 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, 1664 /* Enable all DACs */ 1665 /* DAC DISABLE/MUTE 1? */ 1666 /* setting bits 1-5 disables DAC nids 0x02-0x06 apparently. Init=0x38 */ 1667 {0x20, AC_VERB_SET_COEF_INDEX, 0x03}, 1668 {0x20, AC_VERB_SET_PROC_COEF, 0x0000}, 1669 /* DAC DISABLE/MUTE 2? */ 1670 /* some bit here disables the other DACs. Init=0x4900 */ 1671 {0x20, AC_VERB_SET_COEF_INDEX, 0x08}, 1672 {0x20, AC_VERB_SET_PROC_COEF, 0x0000}, 1673 /* DMIC fix 1674 * This laptop has a stereo digital microphone. The mics are only 1cm apart 1675 * which makes the stereo useless. However, either the mic or the ALC889 1676 * makes the signal become a difference/sum signal instead of standard 1677 * stereo, which is annoying. So instead we flip this bit which makes the 1678 * codec replicate the sum signal to both channels, turning it into a 1679 * normal mono mic. 1680 */ 1681 /* DMIC_CONTROL? Init value = 0x0001 */ 1682 {0x20, AC_VERB_SET_COEF_INDEX, 0x0b}, 1683 {0x20, AC_VERB_SET_PROC_COEF, 0x0003}, 1684 { } 1685 }; 1686 1687 static struct hda_input_mux alc888_2_capture_sources[2] = { 1688 /* Front mic only available on one ADC */ 1689 { 1690 .num_items = 4, 1691 .items = { 1692 { "Mic", 0x0 }, 1693 { "Line", 0x2 }, 1694 { "CD", 0x4 }, 1695 { "Front Mic", 0xb }, 1696 }, 1697 }, 1698 { 1699 .num_items = 3, 1700 .items = { 1701 { "Mic", 0x0 }, 1702 { "Line", 0x2 }, 1703 { "CD", 0x4 }, 1704 }, 1705 } 1706 }; 1707 1708 static struct hda_input_mux alc888_acer_aspire_6530_sources[2] = { 1709 /* Interal mic only available on one ADC */ 1710 { 1711 .num_items = 5, 1712 .items = { 1713 { "Ext Mic", 0x0 }, 1714 { "Line In", 0x2 }, 1715 { "CD", 0x4 }, 1716 { "Input Mix", 0xa }, 1717 { "Int Mic", 0xb }, 1718 }, 1719 }, 1720 { 1721 .num_items = 4, 1722 .items = { 1723 { "Ext Mic", 0x0 }, 1724 { "Line In", 0x2 }, 1725 { "CD", 0x4 }, 1726 { "Input Mix", 0xa }, 1727 }, 1728 } 1729 }; 1730 1731 static struct hda_input_mux alc889_capture_sources[3] = { 1732 /* Digital mic only available on first "ADC" */ 1733 { 1734 .num_items = 5, 1735 .items = { 1736 { "Mic", 0x0 }, 1737 { "Line", 0x2 }, 1738 { "CD", 0x4 }, 1739 { "Front Mic", 0xb }, 1740 { "Input Mix", 0xa }, 1741 }, 1742 }, 1743 { 1744 .num_items = 4, 1745 .items = { 1746 { "Mic", 0x0 }, 1747 { "Line", 0x2 }, 1748 { "CD", 0x4 }, 1749 { "Input Mix", 0xa }, 1750 }, 1751 }, 1752 { 1753 .num_items = 4, 1754 .items = { 1755 { "Mic", 0x0 }, 1756 { "Line", 0x2 }, 1757 { "CD", 0x4 }, 1758 { "Input Mix", 0xa }, 1759 }, 1760 } 1761 }; 1762 1763 static struct snd_kcontrol_new alc888_base_mixer[] = { 1764 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 1765 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 1766 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT), 1767 HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT), 1768 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, 1769 HDA_OUTPUT), 1770 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT), 1771 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT), 1772 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT), 1773 HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT), 1774 HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT), 1775 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), 1776 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), 1777 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), 1778 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), 1779 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 1780 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), 1781 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 1782 { } /* end */ 1783 }; 1784 1785 static struct snd_kcontrol_new alc889_acer_aspire_8930g_mixer[] = { 1786 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 1787 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 1788 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT), 1789 HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT), 1790 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, 1791 HDA_OUTPUT), 1792 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT), 1793 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT), 1794 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT), 1795 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), 1796 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), 1797 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 1798 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), 1799 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 1800 { } /* end */ 1801 }; 1802 1803 1804 static void alc888_acer_aspire_4930g_setup(struct hda_codec *codec) 1805 { 1806 struct alc_spec *spec = codec->spec; 1807 1808 spec->autocfg.hp_pins[0] = 0x15; 1809 spec->autocfg.speaker_pins[0] = 0x14; 1810 spec->autocfg.speaker_pins[1] = 0x16; 1811 spec->autocfg.speaker_pins[2] = 0x17; 1812 } 1813 1814 static void alc888_acer_aspire_6530g_setup(struct hda_codec *codec) 1815 { 1816 struct alc_spec *spec = codec->spec; 1817 1818 spec->autocfg.hp_pins[0] = 0x15; 1819 spec->autocfg.speaker_pins[0] = 0x14; 1820 spec->autocfg.speaker_pins[1] = 0x16; 1821 spec->autocfg.speaker_pins[2] = 0x17; 1822 } 1823 1824 static void alc889_acer_aspire_8930g_setup(struct hda_codec *codec) 1825 { 1826 struct alc_spec *spec = codec->spec; 1827 1828 spec->autocfg.hp_pins[0] = 0x15; 1829 spec->autocfg.speaker_pins[0] = 0x14; 1830 spec->autocfg.speaker_pins[1] = 0x16; 1831 spec->autocfg.speaker_pins[2] = 0x1b; 1832 } 1833 1834 #ifdef CONFIG_SND_HDA_POWER_SAVE 1835 static void alc889_power_eapd(struct hda_codec *codec, int power) 1836 { 1837 snd_hda_codec_write(codec, 0x14, 0, 1838 AC_VERB_SET_EAPD_BTLENABLE, power ? 2 : 0); 1839 snd_hda_codec_write(codec, 0x15, 0, 1840 AC_VERB_SET_EAPD_BTLENABLE, power ? 2 : 0); 1841 } 1842 #endif 1843 1844 /* 1845 * ALC880 3-stack model 1846 * 1847 * DAC: Front = 0x02 (0x0c), Surr = 0x05 (0x0f), CLFE = 0x04 (0x0e) 1848 * Pin assignment: Front = 0x14, Line-In/Surr = 0x1a, Mic/CLFE = 0x18, 1849 * F-Mic = 0x1b, HP = 0x19 1850 */ 1851 1852 static hda_nid_t alc880_dac_nids[4] = { 1853 /* front, rear, clfe, rear_surr */ 1854 0x02, 0x05, 0x04, 0x03 1855 }; 1856 1857 static hda_nid_t alc880_adc_nids[3] = { 1858 /* ADC0-2 */ 1859 0x07, 0x08, 0x09, 1860 }; 1861 1862 /* The datasheet says the node 0x07 is connected from inputs, 1863 * but it shows zero connection in the real implementation on some devices. 1864 * Note: this is a 915GAV bug, fixed on 915GLV 1865 */ 1866 static hda_nid_t alc880_adc_nids_alt[2] = { 1867 /* ADC1-2 */ 1868 0x08, 0x09, 1869 }; 1870 1871 #define ALC880_DIGOUT_NID 0x06 1872 #define ALC880_DIGIN_NID 0x0a 1873 1874 static struct hda_input_mux alc880_capture_source = { 1875 .num_items = 4, 1876 .items = { 1877 { "Mic", 0x0 }, 1878 { "Front Mic", 0x3 }, 1879 { "Line", 0x2 }, 1880 { "CD", 0x4 }, 1881 }, 1882 }; 1883 1884 /* channel source setting (2/6 channel selection for 3-stack) */ 1885 /* 2ch mode */ 1886 static struct hda_verb alc880_threestack_ch2_init[] = { 1887 /* set line-in to input, mute it */ 1888 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN }, 1889 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE }, 1890 /* set mic-in to input vref 80%, mute it */ 1891 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, 1892 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE }, 1893 { } /* end */ 1894 }; 1895 1896 /* 6ch mode */ 1897 static struct hda_verb alc880_threestack_ch6_init[] = { 1898 /* set line-in to output, unmute it */ 1899 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 1900 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 1901 /* set mic-in to output, unmute it */ 1902 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 1903 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 1904 { } /* end */ 1905 }; 1906 1907 static struct hda_channel_mode alc880_threestack_modes[2] = { 1908 { 2, alc880_threestack_ch2_init }, 1909 { 6, alc880_threestack_ch6_init }, 1910 }; 1911 1912 static struct snd_kcontrol_new alc880_three_stack_mixer[] = { 1913 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 1914 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 1915 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0f, 0x0, HDA_OUTPUT), 1916 HDA_BIND_MUTE("Surround Playback Switch", 0x0f, 2, HDA_INPUT), 1917 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT), 1918 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT), 1919 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT), 1920 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT), 1921 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), 1922 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), 1923 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), 1924 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), 1925 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 1926 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 1927 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x3, HDA_INPUT), 1928 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x3, HDA_INPUT), 1929 HDA_CODEC_MUTE("Headphone Playback Switch", 0x19, 0x0, HDA_OUTPUT), 1930 { 1931 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 1932 .name = "Channel Mode", 1933 .info = alc_ch_mode_info, 1934 .get = alc_ch_mode_get, 1935 .put = alc_ch_mode_put, 1936 }, 1937 { } /* end */ 1938 }; 1939 1940 /* capture mixer elements */ 1941 static int alc_cap_vol_info(struct snd_kcontrol *kcontrol, 1942 struct snd_ctl_elem_info *uinfo) 1943 { 1944 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 1945 struct alc_spec *spec = codec->spec; 1946 int err; 1947 1948 mutex_lock(&codec->control_mutex); 1949 kcontrol->private_value = HDA_COMPOSE_AMP_VAL(spec->adc_nids[0], 3, 0, 1950 HDA_INPUT); 1951 err = snd_hda_mixer_amp_volume_info(kcontrol, uinfo); 1952 mutex_unlock(&codec->control_mutex); 1953 return err; 1954 } 1955 1956 static int alc_cap_vol_tlv(struct snd_kcontrol *kcontrol, int op_flag, 1957 unsigned int size, unsigned int __user *tlv) 1958 { 1959 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 1960 struct alc_spec *spec = codec->spec; 1961 int err; 1962 1963 mutex_lock(&codec->control_mutex); 1964 kcontrol->private_value = HDA_COMPOSE_AMP_VAL(spec->adc_nids[0], 3, 0, 1965 HDA_INPUT); 1966 err = snd_hda_mixer_amp_tlv(kcontrol, op_flag, size, tlv); 1967 mutex_unlock(&codec->control_mutex); 1968 return err; 1969 } 1970 1971 typedef int (*getput_call_t)(struct snd_kcontrol *kcontrol, 1972 struct snd_ctl_elem_value *ucontrol); 1973 1974 static int alc_cap_getput_caller(struct snd_kcontrol *kcontrol, 1975 struct snd_ctl_elem_value *ucontrol, 1976 getput_call_t func) 1977 { 1978 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 1979 struct alc_spec *spec = codec->spec; 1980 unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id); 1981 int err; 1982 1983 mutex_lock(&codec->control_mutex); 1984 kcontrol->private_value = HDA_COMPOSE_AMP_VAL(spec->adc_nids[adc_idx], 1985 3, 0, HDA_INPUT); 1986 err = func(kcontrol, ucontrol); 1987 mutex_unlock(&codec->control_mutex); 1988 return err; 1989 } 1990 1991 static int alc_cap_vol_get(struct snd_kcontrol *kcontrol, 1992 struct snd_ctl_elem_value *ucontrol) 1993 { 1994 return alc_cap_getput_caller(kcontrol, ucontrol, 1995 snd_hda_mixer_amp_volume_get); 1996 } 1997 1998 static int alc_cap_vol_put(struct snd_kcontrol *kcontrol, 1999 struct snd_ctl_elem_value *ucontrol) 2000 { 2001 return alc_cap_getput_caller(kcontrol, ucontrol, 2002 snd_hda_mixer_amp_volume_put); 2003 } 2004 2005 /* capture mixer elements */ 2006 #define alc_cap_sw_info snd_ctl_boolean_stereo_info 2007 2008 static int alc_cap_sw_get(struct snd_kcontrol *kcontrol, 2009 struct snd_ctl_elem_value *ucontrol) 2010 { 2011 return alc_cap_getput_caller(kcontrol, ucontrol, 2012 snd_hda_mixer_amp_switch_get); 2013 } 2014 2015 static int alc_cap_sw_put(struct snd_kcontrol *kcontrol, 2016 struct snd_ctl_elem_value *ucontrol) 2017 { 2018 return alc_cap_getput_caller(kcontrol, ucontrol, 2019 snd_hda_mixer_amp_switch_put); 2020 } 2021 2022 #define _DEFINE_CAPMIX(num) \ 2023 { \ 2024 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \ 2025 .name = "Capture Switch", \ 2026 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, \ 2027 .count = num, \ 2028 .info = alc_cap_sw_info, \ 2029 .get = alc_cap_sw_get, \ 2030 .put = alc_cap_sw_put, \ 2031 }, \ 2032 { \ 2033 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \ 2034 .name = "Capture Volume", \ 2035 .access = (SNDRV_CTL_ELEM_ACCESS_READWRITE | \ 2036 SNDRV_CTL_ELEM_ACCESS_TLV_READ | \ 2037 SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK), \ 2038 .count = num, \ 2039 .info = alc_cap_vol_info, \ 2040 .get = alc_cap_vol_get, \ 2041 .put = alc_cap_vol_put, \ 2042 .tlv = { .c = alc_cap_vol_tlv }, \ 2043 } 2044 2045 #define _DEFINE_CAPSRC(num) \ 2046 { \ 2047 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \ 2048 /* .name = "Capture Source", */ \ 2049 .name = "Input Source", \ 2050 .count = num, \ 2051 .info = alc_mux_enum_info, \ 2052 .get = alc_mux_enum_get, \ 2053 .put = alc_mux_enum_put, \ 2054 } 2055 2056 #define DEFINE_CAPMIX(num) \ 2057 static struct snd_kcontrol_new alc_capture_mixer ## num[] = { \ 2058 _DEFINE_CAPMIX(num), \ 2059 _DEFINE_CAPSRC(num), \ 2060 { } /* end */ \ 2061 } 2062 2063 #define DEFINE_CAPMIX_NOSRC(num) \ 2064 static struct snd_kcontrol_new alc_capture_mixer_nosrc ## num[] = { \ 2065 _DEFINE_CAPMIX(num), \ 2066 { } /* end */ \ 2067 } 2068 2069 /* up to three ADCs */ 2070 DEFINE_CAPMIX(1); 2071 DEFINE_CAPMIX(2); 2072 DEFINE_CAPMIX(3); 2073 DEFINE_CAPMIX_NOSRC(1); 2074 DEFINE_CAPMIX_NOSRC(2); 2075 DEFINE_CAPMIX_NOSRC(3); 2076 2077 /* 2078 * ALC880 5-stack model 2079 * 2080 * DAC: Front = 0x02 (0x0c), Surr = 0x05 (0x0f), CLFE = 0x04 (0x0d), 2081 * Side = 0x02 (0xd) 2082 * Pin assignment: Front = 0x14, Surr = 0x17, CLFE = 0x16 2083 * Line-In/Side = 0x1a, Mic = 0x18, F-Mic = 0x1b, HP = 0x19 2084 */ 2085 2086 /* additional mixers to alc880_three_stack_mixer */ 2087 static struct snd_kcontrol_new alc880_five_stack_mixer[] = { 2088 HDA_CODEC_VOLUME("Side Playback Volume", 0x0d, 0x0, HDA_OUTPUT), 2089 HDA_BIND_MUTE("Side Playback Switch", 0x0d, 2, HDA_INPUT), 2090 { } /* end */ 2091 }; 2092 2093 /* channel source setting (6/8 channel selection for 5-stack) */ 2094 /* 6ch mode */ 2095 static struct hda_verb alc880_fivestack_ch6_init[] = { 2096 /* set line-in to input, mute it */ 2097 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN }, 2098 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE }, 2099 { } /* end */ 2100 }; 2101 2102 /* 8ch mode */ 2103 static struct hda_verb alc880_fivestack_ch8_init[] = { 2104 /* set line-in to output, unmute it */ 2105 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 2106 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 2107 { } /* end */ 2108 }; 2109 2110 static struct hda_channel_mode alc880_fivestack_modes[2] = { 2111 { 6, alc880_fivestack_ch6_init }, 2112 { 8, alc880_fivestack_ch8_init }, 2113 }; 2114 2115 2116 /* 2117 * ALC880 6-stack model 2118 * 2119 * DAC: Front = 0x02 (0x0c), Surr = 0x03 (0x0d), CLFE = 0x04 (0x0e), 2120 * Side = 0x05 (0x0f) 2121 * Pin assignment: Front = 0x14, Surr = 0x15, CLFE = 0x16, Side = 0x17, 2122 * Mic = 0x18, F-Mic = 0x19, Line = 0x1a, HP = 0x1b 2123 */ 2124 2125 static hda_nid_t alc880_6st_dac_nids[4] = { 2126 /* front, rear, clfe, rear_surr */ 2127 0x02, 0x03, 0x04, 0x05 2128 }; 2129 2130 static struct hda_input_mux alc880_6stack_capture_source = { 2131 .num_items = 4, 2132 .items = { 2133 { "Mic", 0x0 }, 2134 { "Front Mic", 0x1 }, 2135 { "Line", 0x2 }, 2136 { "CD", 0x4 }, 2137 }, 2138 }; 2139 2140 /* fixed 8-channels */ 2141 static struct hda_channel_mode alc880_sixstack_modes[1] = { 2142 { 8, NULL }, 2143 }; 2144 2145 static struct snd_kcontrol_new alc880_six_stack_mixer[] = { 2146 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 2147 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 2148 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT), 2149 HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT), 2150 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT), 2151 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT), 2152 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT), 2153 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT), 2154 HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT), 2155 HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT), 2156 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), 2157 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), 2158 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), 2159 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), 2160 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 2161 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 2162 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), 2163 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), 2164 { 2165 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 2166 .name = "Channel Mode", 2167 .info = alc_ch_mode_info, 2168 .get = alc_ch_mode_get, 2169 .put = alc_ch_mode_put, 2170 }, 2171 { } /* end */ 2172 }; 2173 2174 2175 /* 2176 * ALC880 W810 model 2177 * 2178 * W810 has rear IO for: 2179 * Front (DAC 02) 2180 * Surround (DAC 03) 2181 * Center/LFE (DAC 04) 2182 * Digital out (06) 2183 * 2184 * The system also has a pair of internal speakers, and a headphone jack. 2185 * These are both connected to Line2 on the codec, hence to DAC 02. 2186 * 2187 * There is a variable resistor to control the speaker or headphone 2188 * volume. This is a hardware-only device without a software API. 2189 * 2190 * Plugging headphones in will disable the internal speakers. This is 2191 * implemented in hardware, not via the driver using jack sense. In 2192 * a similar fashion, plugging into the rear socket marked "front" will 2193 * disable both the speakers and headphones. 2194 * 2195 * For input, there's a microphone jack, and an "audio in" jack. 2196 * These may not do anything useful with this driver yet, because I 2197 * haven't setup any initialization verbs for these yet... 2198 */ 2199 2200 static hda_nid_t alc880_w810_dac_nids[3] = { 2201 /* front, rear/surround, clfe */ 2202 0x02, 0x03, 0x04 2203 }; 2204 2205 /* fixed 6 channels */ 2206 static struct hda_channel_mode alc880_w810_modes[1] = { 2207 { 6, NULL } 2208 }; 2209 2210 /* Pin assignment: Front = 0x14, Surr = 0x15, CLFE = 0x16, HP = 0x1b */ 2211 static struct snd_kcontrol_new alc880_w810_base_mixer[] = { 2212 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 2213 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 2214 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT), 2215 HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT), 2216 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT), 2217 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT), 2218 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT), 2219 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT), 2220 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT), 2221 { } /* end */ 2222 }; 2223 2224 2225 /* 2226 * Z710V model 2227 * 2228 * DAC: Front = 0x02 (0x0c), HP = 0x03 (0x0d) 2229 * Pin assignment: Front = 0x14, HP = 0x15, Mic = 0x18, Mic2 = 0x19(?), 2230 * Line = 0x1a 2231 */ 2232 2233 static hda_nid_t alc880_z71v_dac_nids[1] = { 2234 0x02 2235 }; 2236 #define ALC880_Z71V_HP_DAC 0x03 2237 2238 /* fixed 2 channels */ 2239 static struct hda_channel_mode alc880_2_jack_modes[1] = { 2240 { 2, NULL } 2241 }; 2242 2243 static struct snd_kcontrol_new alc880_z71v_mixer[] = { 2244 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 2245 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 2246 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT), 2247 HDA_BIND_MUTE("Headphone Playback Switch", 0x0d, 2, HDA_INPUT), 2248 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), 2249 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), 2250 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 2251 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 2252 { } /* end */ 2253 }; 2254 2255 2256 /* 2257 * ALC880 F1734 model 2258 * 2259 * DAC: HP = 0x02 (0x0c), Front = 0x03 (0x0d) 2260 * Pin assignment: HP = 0x14, Front = 0x15, Mic = 0x18 2261 */ 2262 2263 static hda_nid_t alc880_f1734_dac_nids[1] = { 2264 0x03 2265 }; 2266 #define ALC880_F1734_HP_DAC 0x02 2267 2268 static struct snd_kcontrol_new alc880_f1734_mixer[] = { 2269 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 2270 HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT), 2271 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT), 2272 HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT), 2273 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), 2274 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), 2275 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), 2276 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), 2277 { } /* end */ 2278 }; 2279 2280 static struct hda_input_mux alc880_f1734_capture_source = { 2281 .num_items = 2, 2282 .items = { 2283 { "Mic", 0x1 }, 2284 { "CD", 0x4 }, 2285 }, 2286 }; 2287 2288 2289 /* 2290 * ALC880 ASUS model 2291 * 2292 * DAC: HP/Front = 0x02 (0x0c), Surr = 0x03 (0x0d), CLFE = 0x04 (0x0e) 2293 * Pin assignment: HP/Front = 0x14, Surr = 0x15, CLFE = 0x16, 2294 * Mic = 0x18, Line = 0x1a 2295 */ 2296 2297 #define alc880_asus_dac_nids alc880_w810_dac_nids /* identical with w810 */ 2298 #define alc880_asus_modes alc880_threestack_modes /* 2/6 channel mode */ 2299 2300 static struct snd_kcontrol_new alc880_asus_mixer[] = { 2301 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 2302 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 2303 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT), 2304 HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT), 2305 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT), 2306 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT), 2307 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT), 2308 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT), 2309 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), 2310 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), 2311 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), 2312 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), 2313 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 2314 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 2315 { 2316 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 2317 .name = "Channel Mode", 2318 .info = alc_ch_mode_info, 2319 .get = alc_ch_mode_get, 2320 .put = alc_ch_mode_put, 2321 }, 2322 { } /* end */ 2323 }; 2324 2325 /* 2326 * ALC880 ASUS W1V model 2327 * 2328 * DAC: HP/Front = 0x02 (0x0c), Surr = 0x03 (0x0d), CLFE = 0x04 (0x0e) 2329 * Pin assignment: HP/Front = 0x14, Surr = 0x15, CLFE = 0x16, 2330 * Mic = 0x18, Line = 0x1a, Line2 = 0x1b 2331 */ 2332 2333 /* additional mixers to alc880_asus_mixer */ 2334 static struct snd_kcontrol_new alc880_asus_w1v_mixer[] = { 2335 HDA_CODEC_VOLUME("Line2 Playback Volume", 0x0b, 0x03, HDA_INPUT), 2336 HDA_CODEC_MUTE("Line2 Playback Switch", 0x0b, 0x03, HDA_INPUT), 2337 { } /* end */ 2338 }; 2339 2340 /* TCL S700 */ 2341 static struct snd_kcontrol_new alc880_tcl_s700_mixer[] = { 2342 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 2343 HDA_CODEC_MUTE("Front Playback Switch", 0x1b, 0x0, HDA_OUTPUT), 2344 HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT), 2345 HDA_CODEC_VOLUME("CD Playback Volume", 0x0B, 0x04, HDA_INPUT), 2346 HDA_CODEC_MUTE("CD Playback Switch", 0x0B, 0x04, HDA_INPUT), 2347 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0B, 0x0, HDA_INPUT), 2348 HDA_CODEC_MUTE("Mic Playback Switch", 0x0B, 0x0, HDA_INPUT), 2349 HDA_CODEC_VOLUME("Capture Volume", 0x08, 0x0, HDA_INPUT), 2350 HDA_CODEC_MUTE("Capture Switch", 0x08, 0x0, HDA_INPUT), 2351 { } /* end */ 2352 }; 2353 2354 /* Uniwill */ 2355 static struct snd_kcontrol_new alc880_uniwill_mixer[] = { 2356 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 2357 HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT), 2358 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT), 2359 HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT), 2360 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT), 2361 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT), 2362 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT), 2363 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT), 2364 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), 2365 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), 2366 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), 2367 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), 2368 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 2369 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 2370 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), 2371 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), 2372 { 2373 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 2374 .name = "Channel Mode", 2375 .info = alc_ch_mode_info, 2376 .get = alc_ch_mode_get, 2377 .put = alc_ch_mode_put, 2378 }, 2379 { } /* end */ 2380 }; 2381 2382 static struct snd_kcontrol_new alc880_fujitsu_mixer[] = { 2383 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 2384 HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT), 2385 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT), 2386 HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT), 2387 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), 2388 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), 2389 HDA_CODEC_VOLUME("Ext Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 2390 HDA_CODEC_MUTE("Ext Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 2391 HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), 2392 HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), 2393 { } /* end */ 2394 }; 2395 2396 static struct snd_kcontrol_new alc880_uniwill_p53_mixer[] = { 2397 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 2398 HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT), 2399 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT), 2400 HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT), 2401 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 2402 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 2403 { } /* end */ 2404 }; 2405 2406 /* 2407 * virtual master controls 2408 */ 2409 2410 /* 2411 * slave controls for virtual master 2412 */ 2413 static const char *alc_slave_vols[] = { 2414 "Front Playback Volume", 2415 "Surround Playback Volume", 2416 "Center Playback Volume", 2417 "LFE Playback Volume", 2418 "Side Playback Volume", 2419 "Headphone Playback Volume", 2420 "Speaker Playback Volume", 2421 "Mono Playback Volume", 2422 "Line-Out Playback Volume", 2423 "PCM Playback Volume", 2424 NULL, 2425 }; 2426 2427 static const char *alc_slave_sws[] = { 2428 "Front Playback Switch", 2429 "Surround Playback Switch", 2430 "Center Playback Switch", 2431 "LFE Playback Switch", 2432 "Side Playback Switch", 2433 "Headphone Playback Switch", 2434 "Speaker Playback Switch", 2435 "Mono Playback Switch", 2436 "IEC958 Playback Switch", 2437 "Line-Out Playback Switch", 2438 "PCM Playback Switch", 2439 NULL, 2440 }; 2441 2442 /* 2443 * build control elements 2444 */ 2445 2446 static void alc_free_kctls(struct hda_codec *codec); 2447 2448 #ifdef CONFIG_SND_HDA_INPUT_BEEP 2449 /* additional beep mixers; the actual parameters are overwritten at build */ 2450 static struct snd_kcontrol_new alc_beep_mixer[] = { 2451 HDA_CODEC_VOLUME("Beep Playback Volume", 0, 0, HDA_INPUT), 2452 HDA_CODEC_MUTE_BEEP("Beep Playback Switch", 0, 0, HDA_INPUT), 2453 { } /* end */ 2454 }; 2455 #endif 2456 2457 static int alc_build_controls(struct hda_codec *codec) 2458 { 2459 struct alc_spec *spec = codec->spec; 2460 int err; 2461 int i; 2462 2463 for (i = 0; i < spec->num_mixers; i++) { 2464 err = snd_hda_add_new_ctls(codec, spec->mixers[i]); 2465 if (err < 0) 2466 return err; 2467 } 2468 if (spec->cap_mixer) { 2469 err = snd_hda_add_new_ctls(codec, spec->cap_mixer); 2470 if (err < 0) 2471 return err; 2472 } 2473 if (spec->multiout.dig_out_nid) { 2474 err = snd_hda_create_spdif_out_ctls(codec, 2475 spec->multiout.dig_out_nid); 2476 if (err < 0) 2477 return err; 2478 if (!spec->no_analog) { 2479 err = snd_hda_create_spdif_share_sw(codec, 2480 &spec->multiout); 2481 if (err < 0) 2482 return err; 2483 spec->multiout.share_spdif = 1; 2484 } 2485 } 2486 if (spec->dig_in_nid) { 2487 err = snd_hda_create_spdif_in_ctls(codec, spec->dig_in_nid); 2488 if (err < 0) 2489 return err; 2490 } 2491 2492 #ifdef CONFIG_SND_HDA_INPUT_BEEP 2493 /* create beep controls if needed */ 2494 if (spec->beep_amp) { 2495 struct snd_kcontrol_new *knew; 2496 for (knew = alc_beep_mixer; knew->name; knew++) { 2497 struct snd_kcontrol *kctl; 2498 kctl = snd_ctl_new1(knew, codec); 2499 if (!kctl) 2500 return -ENOMEM; 2501 kctl->private_value = spec->beep_amp; 2502 err = snd_hda_ctl_add(codec, 2503 get_amp_nid_(spec->beep_amp), kctl); 2504 if (err < 0) 2505 return err; 2506 } 2507 } 2508 #endif 2509 2510 /* if we have no master control, let's create it */ 2511 if (!spec->no_analog && 2512 !snd_hda_find_mixer_ctl(codec, "Master Playback Volume")) { 2513 unsigned int vmaster_tlv[4]; 2514 snd_hda_set_vmaster_tlv(codec, spec->vmaster_nid, 2515 HDA_OUTPUT, vmaster_tlv); 2516 err = snd_hda_add_vmaster(codec, "Master Playback Volume", 2517 vmaster_tlv, alc_slave_vols); 2518 if (err < 0) 2519 return err; 2520 } 2521 if (!spec->no_analog && 2522 !snd_hda_find_mixer_ctl(codec, "Master Playback Switch")) { 2523 err = snd_hda_add_vmaster(codec, "Master Playback Switch", 2524 NULL, alc_slave_sws); 2525 if (err < 0) 2526 return err; 2527 } 2528 2529 alc_free_kctls(codec); /* no longer needed */ 2530 return 0; 2531 } 2532 2533 2534 /* 2535 * initialize the codec volumes, etc 2536 */ 2537 2538 /* 2539 * generic initialization of ADC, input mixers and output mixers 2540 */ 2541 static struct hda_verb alc880_volume_init_verbs[] = { 2542 /* 2543 * Unmute ADC0-2 and set the default input to mic-in 2544 */ 2545 {0x07, AC_VERB_SET_CONNECT_SEL, 0x00}, 2546 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 2547 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00}, 2548 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 2549 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00}, 2550 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 2551 2552 /* Unmute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback 2553 * mixer widget 2554 * Note: PASD motherboards uses the Line In 2 as the input for front 2555 * panel mic (mic 2) 2556 */ 2557 /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */ 2558 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 2559 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 2560 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, 2561 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, 2562 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, 2563 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)}, 2564 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)}, 2565 2566 /* 2567 * Set up output mixers (0x0c - 0x0f) 2568 */ 2569 /* set vol=0 to output mixers */ 2570 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 2571 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 2572 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 2573 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 2574 /* set up input amps for analog loopback */ 2575 /* Amp Indices: DAC = 0, mixer = 1 */ 2576 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 2577 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 2578 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 2579 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 2580 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 2581 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 2582 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 2583 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 2584 2585 { } 2586 }; 2587 2588 /* 2589 * 3-stack pin configuration: 2590 * front = 0x14, mic/clfe = 0x18, HP = 0x19, line/surr = 0x1a, f-mic = 0x1b 2591 */ 2592 static struct hda_verb alc880_pin_3stack_init_verbs[] = { 2593 /* 2594 * preset connection lists of input pins 2595 * 0 = front, 1 = rear_surr, 2 = CLFE, 3 = surround 2596 */ 2597 {0x10, AC_VERB_SET_CONNECT_SEL, 0x02}, /* mic/clfe */ 2598 {0x11, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */ 2599 {0x12, AC_VERB_SET_CONNECT_SEL, 0x03}, /* line/surround */ 2600 2601 /* 2602 * Set pin mode and muting 2603 */ 2604 /* set front pin widgets 0x14 for output */ 2605 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 2606 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 2607 /* Mic1 (rear panel) pin widget for input and vref at 80% */ 2608 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, 2609 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 2610 /* Mic2 (as headphone out) for HP output */ 2611 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 2612 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 2613 /* Line In pin widget for input */ 2614 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 2615 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 2616 /* Line2 (as front mic) pin widget for input and vref at 80% */ 2617 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, 2618 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 2619 /* CD pin widget for input */ 2620 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 2621 2622 { } 2623 }; 2624 2625 /* 2626 * 5-stack pin configuration: 2627 * front = 0x14, surround = 0x17, clfe = 0x16, mic = 0x18, HP = 0x19, 2628 * line-in/side = 0x1a, f-mic = 0x1b 2629 */ 2630 static struct hda_verb alc880_pin_5stack_init_verbs[] = { 2631 /* 2632 * preset connection lists of input pins 2633 * 0 = front, 1 = rear_surr, 2 = CLFE, 3 = surround 2634 */ 2635 {0x11, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */ 2636 {0x12, AC_VERB_SET_CONNECT_SEL, 0x01}, /* line/side */ 2637 2638 /* 2639 * Set pin mode and muting 2640 */ 2641 /* set pin widgets 0x14-0x17 for output */ 2642 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 2643 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 2644 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 2645 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 2646 /* unmute pins for output (no gain on this amp) */ 2647 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 2648 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 2649 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 2650 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 2651 2652 /* Mic1 (rear panel) pin widget for input and vref at 80% */ 2653 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, 2654 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 2655 /* Mic2 (as headphone out) for HP output */ 2656 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 2657 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 2658 /* Line In pin widget for input */ 2659 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 2660 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 2661 /* Line2 (as front mic) pin widget for input and vref at 80% */ 2662 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, 2663 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 2664 /* CD pin widget for input */ 2665 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 2666 2667 { } 2668 }; 2669 2670 /* 2671 * W810 pin configuration: 2672 * front = 0x14, surround = 0x15, clfe = 0x16, HP = 0x1b 2673 */ 2674 static struct hda_verb alc880_pin_w810_init_verbs[] = { 2675 /* hphone/speaker input selector: front DAC */ 2676 {0x13, AC_VERB_SET_CONNECT_SEL, 0x0}, 2677 2678 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 2679 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 2680 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 2681 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 2682 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 2683 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 2684 2685 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 2686 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 2687 2688 { } 2689 }; 2690 2691 /* 2692 * Z71V pin configuration: 2693 * Speaker-out = 0x14, HP = 0x15, Mic = 0x18, Line-in = 0x1a, Mic2 = 0x1b (?) 2694 */ 2695 static struct hda_verb alc880_pin_z71v_init_verbs[] = { 2696 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 2697 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 2698 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 2699 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 2700 2701 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, 2702 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 2703 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, 2704 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 2705 2706 { } 2707 }; 2708 2709 /* 2710 * 6-stack pin configuration: 2711 * front = 0x14, surr = 0x15, clfe = 0x16, side = 0x17, mic = 0x18, 2712 * f-mic = 0x19, line = 0x1a, HP = 0x1b 2713 */ 2714 static struct hda_verb alc880_pin_6stack_init_verbs[] = { 2715 {0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */ 2716 2717 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 2718 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 2719 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 2720 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 2721 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 2722 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 2723 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 2724 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 2725 2726 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, 2727 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 2728 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, 2729 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 2730 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 2731 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 2732 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 2733 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 2734 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 2735 2736 { } 2737 }; 2738 2739 /* 2740 * Uniwill pin configuration: 2741 * HP = 0x14, InternalSpeaker = 0x15, mic = 0x18, internal mic = 0x19, 2742 * line = 0x1a 2743 */ 2744 static struct hda_verb alc880_uniwill_init_verbs[] = { 2745 {0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */ 2746 2747 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 2748 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 2749 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 2750 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 2751 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 2752 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 2753 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 2754 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 2755 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))}, 2756 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))}, 2757 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))}, 2758 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))}, 2759 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))}, 2760 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))}, 2761 2762 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, 2763 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 2764 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, 2765 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 2766 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 2767 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 2768 /* {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, */ 2769 /* {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, */ 2770 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 2771 2772 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT}, 2773 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT}, 2774 2775 { } 2776 }; 2777 2778 /* 2779 * Uniwill P53 2780 * HP = 0x14, InternalSpeaker = 0x15, mic = 0x19, 2781 */ 2782 static struct hda_verb alc880_uniwill_p53_init_verbs[] = { 2783 {0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */ 2784 2785 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 2786 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 2787 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 2788 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 2789 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 2790 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 2791 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))}, 2792 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))}, 2793 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))}, 2794 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))}, 2795 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))}, 2796 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))}, 2797 2798 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, 2799 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 2800 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, 2801 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 2802 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 2803 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 2804 2805 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT}, 2806 {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_DCVOL_EVENT}, 2807 2808 { } 2809 }; 2810 2811 static struct hda_verb alc880_beep_init_verbs[] = { 2812 { 0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(5) }, 2813 { } 2814 }; 2815 2816 /* auto-toggle front mic */ 2817 static void alc880_uniwill_mic_automute(struct hda_codec *codec) 2818 { 2819 unsigned int present; 2820 unsigned char bits; 2821 2822 present = snd_hda_jack_detect(codec, 0x18); 2823 bits = present ? HDA_AMP_MUTE : 0; 2824 snd_hda_codec_amp_stereo(codec, 0x0b, HDA_INPUT, 1, HDA_AMP_MUTE, bits); 2825 } 2826 2827 static void alc880_uniwill_setup(struct hda_codec *codec) 2828 { 2829 struct alc_spec *spec = codec->spec; 2830 2831 spec->autocfg.hp_pins[0] = 0x14; 2832 spec->autocfg.speaker_pins[0] = 0x15; 2833 spec->autocfg.speaker_pins[0] = 0x16; 2834 } 2835 2836 static void alc880_uniwill_init_hook(struct hda_codec *codec) 2837 { 2838 alc_automute_amp(codec); 2839 alc880_uniwill_mic_automute(codec); 2840 } 2841 2842 static void alc880_uniwill_unsol_event(struct hda_codec *codec, 2843 unsigned int res) 2844 { 2845 /* Looks like the unsol event is incompatible with the standard 2846 * definition. 4bit tag is placed at 28 bit! 2847 */ 2848 switch (res >> 28) { 2849 case ALC880_MIC_EVENT: 2850 alc880_uniwill_mic_automute(codec); 2851 break; 2852 default: 2853 alc_automute_amp_unsol_event(codec, res); 2854 break; 2855 } 2856 } 2857 2858 static void alc880_uniwill_p53_setup(struct hda_codec *codec) 2859 { 2860 struct alc_spec *spec = codec->spec; 2861 2862 spec->autocfg.hp_pins[0] = 0x14; 2863 spec->autocfg.speaker_pins[0] = 0x15; 2864 } 2865 2866 static void alc880_uniwill_p53_dcvol_automute(struct hda_codec *codec) 2867 { 2868 unsigned int present; 2869 2870 present = snd_hda_codec_read(codec, 0x21, 0, 2871 AC_VERB_GET_VOLUME_KNOB_CONTROL, 0); 2872 present &= HDA_AMP_VOLMASK; 2873 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_OUTPUT, 0, 2874 HDA_AMP_VOLMASK, present); 2875 snd_hda_codec_amp_stereo(codec, 0x0d, HDA_OUTPUT, 0, 2876 HDA_AMP_VOLMASK, present); 2877 } 2878 2879 static void alc880_uniwill_p53_unsol_event(struct hda_codec *codec, 2880 unsigned int res) 2881 { 2882 /* Looks like the unsol event is incompatible with the standard 2883 * definition. 4bit tag is placed at 28 bit! 2884 */ 2885 if ((res >> 28) == ALC880_DCVOL_EVENT) 2886 alc880_uniwill_p53_dcvol_automute(codec); 2887 else 2888 alc_automute_amp_unsol_event(codec, res); 2889 } 2890 2891 /* 2892 * F1734 pin configuration: 2893 * HP = 0x14, speaker-out = 0x15, mic = 0x18 2894 */ 2895 static struct hda_verb alc880_pin_f1734_init_verbs[] = { 2896 {0x07, AC_VERB_SET_CONNECT_SEL, 0x01}, 2897 {0x10, AC_VERB_SET_CONNECT_SEL, 0x02}, 2898 {0x11, AC_VERB_SET_CONNECT_SEL, 0x00}, 2899 {0x12, AC_VERB_SET_CONNECT_SEL, 0x01}, 2900 {0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, 2901 2902 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 2903 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 2904 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 2905 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 2906 2907 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, 2908 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 2909 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50}, 2910 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 2911 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 2912 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 2913 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 2914 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 2915 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 2916 2917 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_HP_EVENT}, 2918 {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_DCVOL_EVENT}, 2919 2920 { } 2921 }; 2922 2923 /* 2924 * ASUS pin configuration: 2925 * HP/front = 0x14, surr = 0x15, clfe = 0x16, mic = 0x18, line = 0x1a 2926 */ 2927 static struct hda_verb alc880_pin_asus_init_verbs[] = { 2928 {0x10, AC_VERB_SET_CONNECT_SEL, 0x02}, 2929 {0x11, AC_VERB_SET_CONNECT_SEL, 0x00}, 2930 {0x12, AC_VERB_SET_CONNECT_SEL, 0x01}, 2931 {0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, 2932 2933 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 2934 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 2935 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 2936 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 2937 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 2938 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 2939 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 2940 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 2941 2942 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, 2943 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 2944 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, 2945 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 2946 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 2947 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 2948 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 2949 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 2950 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 2951 2952 { } 2953 }; 2954 2955 /* Enable GPIO mask and set output */ 2956 #define alc880_gpio1_init_verbs alc_gpio1_init_verbs 2957 #define alc880_gpio2_init_verbs alc_gpio2_init_verbs 2958 #define alc880_gpio3_init_verbs alc_gpio3_init_verbs 2959 2960 /* Clevo m520g init */ 2961 static struct hda_verb alc880_pin_clevo_init_verbs[] = { 2962 /* headphone output */ 2963 {0x11, AC_VERB_SET_CONNECT_SEL, 0x01}, 2964 /* line-out */ 2965 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 2966 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 2967 /* Line-in */ 2968 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 2969 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 2970 /* CD */ 2971 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 2972 {0x1c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 2973 /* Mic1 (rear panel) */ 2974 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, 2975 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 2976 /* Mic2 (front panel) */ 2977 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, 2978 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 2979 /* headphone */ 2980 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 2981 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 2982 /* change to EAPD mode */ 2983 {0x20, AC_VERB_SET_COEF_INDEX, 0x07}, 2984 {0x20, AC_VERB_SET_PROC_COEF, 0x3060}, 2985 2986 { } 2987 }; 2988 2989 static struct hda_verb alc880_pin_tcl_S700_init_verbs[] = { 2990 /* change to EAPD mode */ 2991 {0x20, AC_VERB_SET_COEF_INDEX, 0x07}, 2992 {0x20, AC_VERB_SET_PROC_COEF, 0x3060}, 2993 2994 /* Headphone output */ 2995 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 2996 /* Front output*/ 2997 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 2998 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, 2999 3000 /* Line In pin widget for input */ 3001 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 3002 /* CD pin widget for input */ 3003 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 3004 /* Mic1 (rear panel) pin widget for input and vref at 80% */ 3005 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, 3006 3007 /* change to EAPD mode */ 3008 {0x20, AC_VERB_SET_COEF_INDEX, 0x07}, 3009 {0x20, AC_VERB_SET_PROC_COEF, 0x3070}, 3010 3011 { } 3012 }; 3013 3014 /* 3015 * LG m1 express dual 3016 * 3017 * Pin assignment: 3018 * Rear Line-In/Out (blue): 0x14 3019 * Build-in Mic-In: 0x15 3020 * Speaker-out: 0x17 3021 * HP-Out (green): 0x1b 3022 * Mic-In/Out (red): 0x19 3023 * SPDIF-Out: 0x1e 3024 */ 3025 3026 /* To make 5.1 output working (green=Front, blue=Surr, red=CLFE) */ 3027 static hda_nid_t alc880_lg_dac_nids[3] = { 3028 0x05, 0x02, 0x03 3029 }; 3030 3031 /* seems analog CD is not working */ 3032 static struct hda_input_mux alc880_lg_capture_source = { 3033 .num_items = 3, 3034 .items = { 3035 { "Mic", 0x1 }, 3036 { "Line", 0x5 }, 3037 { "Internal Mic", 0x6 }, 3038 }, 3039 }; 3040 3041 /* 2,4,6 channel modes */ 3042 static struct hda_verb alc880_lg_ch2_init[] = { 3043 /* set line-in and mic-in to input */ 3044 { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN }, 3045 { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, 3046 { } 3047 }; 3048 3049 static struct hda_verb alc880_lg_ch4_init[] = { 3050 /* set line-in to out and mic-in to input */ 3051 { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP }, 3052 { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, 3053 { } 3054 }; 3055 3056 static struct hda_verb alc880_lg_ch6_init[] = { 3057 /* set line-in and mic-in to output */ 3058 { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP }, 3059 { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP }, 3060 { } 3061 }; 3062 3063 static struct hda_channel_mode alc880_lg_ch_modes[3] = { 3064 { 2, alc880_lg_ch2_init }, 3065 { 4, alc880_lg_ch4_init }, 3066 { 6, alc880_lg_ch6_init }, 3067 }; 3068 3069 static struct snd_kcontrol_new alc880_lg_mixer[] = { 3070 HDA_CODEC_VOLUME("Front Playback Volume", 0x0f, 0x0, HDA_OUTPUT), 3071 HDA_BIND_MUTE("Front Playback Switch", 0x0f, 2, HDA_INPUT), 3072 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 3073 HDA_BIND_MUTE("Surround Playback Switch", 0x0c, 2, HDA_INPUT), 3074 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0d, 1, 0x0, HDA_OUTPUT), 3075 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0d, 2, 0x0, HDA_OUTPUT), 3076 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0d, 1, 2, HDA_INPUT), 3077 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0d, 2, 2, HDA_INPUT), 3078 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), 3079 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), 3080 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x06, HDA_INPUT), 3081 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x06, HDA_INPUT), 3082 HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x07, HDA_INPUT), 3083 HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x07, HDA_INPUT), 3084 { 3085 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 3086 .name = "Channel Mode", 3087 .info = alc_ch_mode_info, 3088 .get = alc_ch_mode_get, 3089 .put = alc_ch_mode_put, 3090 }, 3091 { } /* end */ 3092 }; 3093 3094 static struct hda_verb alc880_lg_init_verbs[] = { 3095 /* set capture source to mic-in */ 3096 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 3097 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 3098 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 3099 /* mute all amp mixer inputs */ 3100 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(5)}, 3101 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)}, 3102 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)}, 3103 /* line-in to input */ 3104 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 3105 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 3106 /* built-in mic */ 3107 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, 3108 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 3109 /* speaker-out */ 3110 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 3111 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 3112 /* mic-in to input */ 3113 {0x11, AC_VERB_SET_CONNECT_SEL, 0x01}, 3114 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, 3115 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 3116 /* HP-out */ 3117 {0x13, AC_VERB_SET_CONNECT_SEL, 0x03}, 3118 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 3119 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 3120 /* jack sense */ 3121 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT}, 3122 { } 3123 }; 3124 3125 /* toggle speaker-output according to the hp-jack state */ 3126 static void alc880_lg_setup(struct hda_codec *codec) 3127 { 3128 struct alc_spec *spec = codec->spec; 3129 3130 spec->autocfg.hp_pins[0] = 0x1b; 3131 spec->autocfg.speaker_pins[0] = 0x17; 3132 } 3133 3134 /* 3135 * LG LW20 3136 * 3137 * Pin assignment: 3138 * Speaker-out: 0x14 3139 * Mic-In: 0x18 3140 * Built-in Mic-In: 0x19 3141 * Line-In: 0x1b 3142 * HP-Out: 0x1a 3143 * SPDIF-Out: 0x1e 3144 */ 3145 3146 static struct hda_input_mux alc880_lg_lw_capture_source = { 3147 .num_items = 3, 3148 .items = { 3149 { "Mic", 0x0 }, 3150 { "Internal Mic", 0x1 }, 3151 { "Line In", 0x2 }, 3152 }, 3153 }; 3154 3155 #define alc880_lg_lw_modes alc880_threestack_modes 3156 3157 static struct snd_kcontrol_new alc880_lg_lw_mixer[] = { 3158 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 3159 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 3160 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0f, 0x0, HDA_OUTPUT), 3161 HDA_BIND_MUTE("Surround Playback Switch", 0x0f, 2, HDA_INPUT), 3162 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT), 3163 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT), 3164 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT), 3165 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT), 3166 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), 3167 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), 3168 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 3169 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 3170 HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x01, HDA_INPUT), 3171 HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x01, HDA_INPUT), 3172 { 3173 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 3174 .name = "Channel Mode", 3175 .info = alc_ch_mode_info, 3176 .get = alc_ch_mode_get, 3177 .put = alc_ch_mode_put, 3178 }, 3179 { } /* end */ 3180 }; 3181 3182 static struct hda_verb alc880_lg_lw_init_verbs[] = { 3183 {0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */ 3184 {0x10, AC_VERB_SET_CONNECT_SEL, 0x02}, /* mic/clfe */ 3185 {0x12, AC_VERB_SET_CONNECT_SEL, 0x03}, /* line/surround */ 3186 3187 /* set capture source to mic-in */ 3188 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 3189 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 3190 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 3191 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)}, 3192 /* speaker-out */ 3193 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 3194 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 3195 /* HP-out */ 3196 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 3197 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 3198 /* mic-in to input */ 3199 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, 3200 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 3201 /* built-in mic */ 3202 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, 3203 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 3204 /* jack sense */ 3205 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT}, 3206 { } 3207 }; 3208 3209 /* toggle speaker-output according to the hp-jack state */ 3210 static void alc880_lg_lw_setup(struct hda_codec *codec) 3211 { 3212 struct alc_spec *spec = codec->spec; 3213 3214 spec->autocfg.hp_pins[0] = 0x1b; 3215 spec->autocfg.speaker_pins[0] = 0x14; 3216 } 3217 3218 static struct snd_kcontrol_new alc880_medion_rim_mixer[] = { 3219 HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 3220 HDA_BIND_MUTE("Master Playback Switch", 0x0c, 2, HDA_INPUT), 3221 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 3222 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 3223 HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), 3224 HDA_CODEC_MUTE("Internal Playback Switch", 0x0b, 0x1, HDA_INPUT), 3225 { } /* end */ 3226 }; 3227 3228 static struct hda_input_mux alc880_medion_rim_capture_source = { 3229 .num_items = 2, 3230 .items = { 3231 { "Mic", 0x0 }, 3232 { "Internal Mic", 0x1 }, 3233 }, 3234 }; 3235 3236 static struct hda_verb alc880_medion_rim_init_verbs[] = { 3237 {0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */ 3238 3239 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 3240 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 3241 3242 /* Mic1 (rear panel) pin widget for input and vref at 80% */ 3243 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, 3244 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 3245 /* Mic2 (as headphone out) for HP output */ 3246 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 3247 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 3248 /* Internal Speaker */ 3249 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 3250 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 3251 3252 {0x20, AC_VERB_SET_COEF_INDEX, 0x07}, 3253 {0x20, AC_VERB_SET_PROC_COEF, 0x3060}, 3254 3255 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT}, 3256 { } 3257 }; 3258 3259 /* toggle speaker-output according to the hp-jack state */ 3260 static void alc880_medion_rim_automute(struct hda_codec *codec) 3261 { 3262 struct alc_spec *spec = codec->spec; 3263 alc_automute_amp(codec); 3264 /* toggle EAPD */ 3265 if (spec->jack_present) 3266 snd_hda_codec_write(codec, 0x01, 0, AC_VERB_SET_GPIO_DATA, 0); 3267 else 3268 snd_hda_codec_write(codec, 0x01, 0, AC_VERB_SET_GPIO_DATA, 2); 3269 } 3270 3271 static void alc880_medion_rim_unsol_event(struct hda_codec *codec, 3272 unsigned int res) 3273 { 3274 /* Looks like the unsol event is incompatible with the standard 3275 * definition. 4bit tag is placed at 28 bit! 3276 */ 3277 if ((res >> 28) == ALC880_HP_EVENT) 3278 alc880_medion_rim_automute(codec); 3279 } 3280 3281 static void alc880_medion_rim_setup(struct hda_codec *codec) 3282 { 3283 struct alc_spec *spec = codec->spec; 3284 3285 spec->autocfg.hp_pins[0] = 0x14; 3286 spec->autocfg.speaker_pins[0] = 0x1b; 3287 } 3288 3289 #ifdef CONFIG_SND_HDA_POWER_SAVE 3290 static struct hda_amp_list alc880_loopbacks[] = { 3291 { 0x0b, HDA_INPUT, 0 }, 3292 { 0x0b, HDA_INPUT, 1 }, 3293 { 0x0b, HDA_INPUT, 2 }, 3294 { 0x0b, HDA_INPUT, 3 }, 3295 { 0x0b, HDA_INPUT, 4 }, 3296 { } /* end */ 3297 }; 3298 3299 static struct hda_amp_list alc880_lg_loopbacks[] = { 3300 { 0x0b, HDA_INPUT, 1 }, 3301 { 0x0b, HDA_INPUT, 6 }, 3302 { 0x0b, HDA_INPUT, 7 }, 3303 { } /* end */ 3304 }; 3305 #endif 3306 3307 /* 3308 * Common callbacks 3309 */ 3310 3311 static int alc_init(struct hda_codec *codec) 3312 { 3313 struct alc_spec *spec = codec->spec; 3314 unsigned int i; 3315 3316 alc_fix_pll(codec); 3317 alc_auto_init_amp(codec, spec->init_amp); 3318 3319 for (i = 0; i < spec->num_init_verbs; i++) 3320 snd_hda_sequence_write(codec, spec->init_verbs[i]); 3321 3322 if (spec->init_hook) 3323 spec->init_hook(codec); 3324 3325 return 0; 3326 } 3327 3328 static void alc_unsol_event(struct hda_codec *codec, unsigned int res) 3329 { 3330 struct alc_spec *spec = codec->spec; 3331 3332 if (spec->unsol_event) 3333 spec->unsol_event(codec, res); 3334 } 3335 3336 #ifdef CONFIG_SND_HDA_POWER_SAVE 3337 static int alc_check_power_status(struct hda_codec *codec, hda_nid_t nid) 3338 { 3339 struct alc_spec *spec = codec->spec; 3340 return snd_hda_check_amp_list_power(codec, &spec->loopback, nid); 3341 } 3342 #endif 3343 3344 /* 3345 * Analog playback callbacks 3346 */ 3347 static int alc880_playback_pcm_open(struct hda_pcm_stream *hinfo, 3348 struct hda_codec *codec, 3349 struct snd_pcm_substream *substream) 3350 { 3351 struct alc_spec *spec = codec->spec; 3352 return snd_hda_multi_out_analog_open(codec, &spec->multiout, substream, 3353 hinfo); 3354 } 3355 3356 static int alc880_playback_pcm_prepare(struct hda_pcm_stream *hinfo, 3357 struct hda_codec *codec, 3358 unsigned int stream_tag, 3359 unsigned int format, 3360 struct snd_pcm_substream *substream) 3361 { 3362 struct alc_spec *spec = codec->spec; 3363 return snd_hda_multi_out_analog_prepare(codec, &spec->multiout, 3364 stream_tag, format, substream); 3365 } 3366 3367 static int alc880_playback_pcm_cleanup(struct hda_pcm_stream *hinfo, 3368 struct hda_codec *codec, 3369 struct snd_pcm_substream *substream) 3370 { 3371 struct alc_spec *spec = codec->spec; 3372 return snd_hda_multi_out_analog_cleanup(codec, &spec->multiout); 3373 } 3374 3375 /* 3376 * Digital out 3377 */ 3378 static int alc880_dig_playback_pcm_open(struct hda_pcm_stream *hinfo, 3379 struct hda_codec *codec, 3380 struct snd_pcm_substream *substream) 3381 { 3382 struct alc_spec *spec = codec->spec; 3383 return snd_hda_multi_out_dig_open(codec, &spec->multiout); 3384 } 3385 3386 static int alc880_dig_playback_pcm_prepare(struct hda_pcm_stream *hinfo, 3387 struct hda_codec *codec, 3388 unsigned int stream_tag, 3389 unsigned int format, 3390 struct snd_pcm_substream *substream) 3391 { 3392 struct alc_spec *spec = codec->spec; 3393 return snd_hda_multi_out_dig_prepare(codec, &spec->multiout, 3394 stream_tag, format, substream); 3395 } 3396 3397 static int alc880_dig_playback_pcm_cleanup(struct hda_pcm_stream *hinfo, 3398 struct hda_codec *codec, 3399 struct snd_pcm_substream *substream) 3400 { 3401 struct alc_spec *spec = codec->spec; 3402 return snd_hda_multi_out_dig_cleanup(codec, &spec->multiout); 3403 } 3404 3405 static int alc880_dig_playback_pcm_close(struct hda_pcm_stream *hinfo, 3406 struct hda_codec *codec, 3407 struct snd_pcm_substream *substream) 3408 { 3409 struct alc_spec *spec = codec->spec; 3410 return snd_hda_multi_out_dig_close(codec, &spec->multiout); 3411 } 3412 3413 /* 3414 * Analog capture 3415 */ 3416 static int alc880_alt_capture_pcm_prepare(struct hda_pcm_stream *hinfo, 3417 struct hda_codec *codec, 3418 unsigned int stream_tag, 3419 unsigned int format, 3420 struct snd_pcm_substream *substream) 3421 { 3422 struct alc_spec *spec = codec->spec; 3423 3424 snd_hda_codec_setup_stream(codec, spec->adc_nids[substream->number + 1], 3425 stream_tag, 0, format); 3426 return 0; 3427 } 3428 3429 static int alc880_alt_capture_pcm_cleanup(struct hda_pcm_stream *hinfo, 3430 struct hda_codec *codec, 3431 struct snd_pcm_substream *substream) 3432 { 3433 struct alc_spec *spec = codec->spec; 3434 3435 snd_hda_codec_cleanup_stream(codec, 3436 spec->adc_nids[substream->number + 1]); 3437 return 0; 3438 } 3439 3440 3441 /* 3442 */ 3443 static struct hda_pcm_stream alc880_pcm_analog_playback = { 3444 .substreams = 1, 3445 .channels_min = 2, 3446 .channels_max = 8, 3447 /* NID is set in alc_build_pcms */ 3448 .ops = { 3449 .open = alc880_playback_pcm_open, 3450 .prepare = alc880_playback_pcm_prepare, 3451 .cleanup = alc880_playback_pcm_cleanup 3452 }, 3453 }; 3454 3455 static struct hda_pcm_stream alc880_pcm_analog_capture = { 3456 .substreams = 1, 3457 .channels_min = 2, 3458 .channels_max = 2, 3459 /* NID is set in alc_build_pcms */ 3460 }; 3461 3462 static struct hda_pcm_stream alc880_pcm_analog_alt_playback = { 3463 .substreams = 1, 3464 .channels_min = 2, 3465 .channels_max = 2, 3466 /* NID is set in alc_build_pcms */ 3467 }; 3468 3469 static struct hda_pcm_stream alc880_pcm_analog_alt_capture = { 3470 .substreams = 2, /* can be overridden */ 3471 .channels_min = 2, 3472 .channels_max = 2, 3473 /* NID is set in alc_build_pcms */ 3474 .ops = { 3475 .prepare = alc880_alt_capture_pcm_prepare, 3476 .cleanup = alc880_alt_capture_pcm_cleanup 3477 }, 3478 }; 3479 3480 static struct hda_pcm_stream alc880_pcm_digital_playback = { 3481 .substreams = 1, 3482 .channels_min = 2, 3483 .channels_max = 2, 3484 /* NID is set in alc_build_pcms */ 3485 .ops = { 3486 .open = alc880_dig_playback_pcm_open, 3487 .close = alc880_dig_playback_pcm_close, 3488 .prepare = alc880_dig_playback_pcm_prepare, 3489 .cleanup = alc880_dig_playback_pcm_cleanup 3490 }, 3491 }; 3492 3493 static struct hda_pcm_stream alc880_pcm_digital_capture = { 3494 .substreams = 1, 3495 .channels_min = 2, 3496 .channels_max = 2, 3497 /* NID is set in alc_build_pcms */ 3498 }; 3499 3500 /* Used by alc_build_pcms to flag that a PCM has no playback stream */ 3501 static struct hda_pcm_stream alc_pcm_null_stream = { 3502 .substreams = 0, 3503 .channels_min = 0, 3504 .channels_max = 0, 3505 }; 3506 3507 static int alc_build_pcms(struct hda_codec *codec) 3508 { 3509 struct alc_spec *spec = codec->spec; 3510 struct hda_pcm *info = spec->pcm_rec; 3511 int i; 3512 3513 codec->num_pcms = 1; 3514 codec->pcm_info = info; 3515 3516 if (spec->no_analog) 3517 goto skip_analog; 3518 3519 snprintf(spec->stream_name_analog, sizeof(spec->stream_name_analog), 3520 "%s Analog", codec->chip_name); 3521 info->name = spec->stream_name_analog; 3522 3523 if (spec->stream_analog_playback) { 3524 if (snd_BUG_ON(!spec->multiout.dac_nids)) 3525 return -EINVAL; 3526 info->stream[SNDRV_PCM_STREAM_PLAYBACK] = *(spec->stream_analog_playback); 3527 info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = spec->multiout.dac_nids[0]; 3528 } 3529 if (spec->stream_analog_capture) { 3530 if (snd_BUG_ON(!spec->adc_nids)) 3531 return -EINVAL; 3532 info->stream[SNDRV_PCM_STREAM_CAPTURE] = *(spec->stream_analog_capture); 3533 info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->adc_nids[0]; 3534 } 3535 3536 if (spec->channel_mode) { 3537 info->stream[SNDRV_PCM_STREAM_PLAYBACK].channels_max = 0; 3538 for (i = 0; i < spec->num_channel_mode; i++) { 3539 if (spec->channel_mode[i].channels > info->stream[SNDRV_PCM_STREAM_PLAYBACK].channels_max) { 3540 info->stream[SNDRV_PCM_STREAM_PLAYBACK].channels_max = spec->channel_mode[i].channels; 3541 } 3542 } 3543 } 3544 3545 skip_analog: 3546 /* SPDIF for stream index #1 */ 3547 if (spec->multiout.dig_out_nid || spec->dig_in_nid) { 3548 snprintf(spec->stream_name_digital, 3549 sizeof(spec->stream_name_digital), 3550 "%s Digital", codec->chip_name); 3551 codec->num_pcms = 2; 3552 codec->slave_dig_outs = spec->multiout.slave_dig_outs; 3553 info = spec->pcm_rec + 1; 3554 info->name = spec->stream_name_digital; 3555 if (spec->dig_out_type) 3556 info->pcm_type = spec->dig_out_type; 3557 else 3558 info->pcm_type = HDA_PCM_TYPE_SPDIF; 3559 if (spec->multiout.dig_out_nid && 3560 spec->stream_digital_playback) { 3561 info->stream[SNDRV_PCM_STREAM_PLAYBACK] = *(spec->stream_digital_playback); 3562 info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = spec->multiout.dig_out_nid; 3563 } 3564 if (spec->dig_in_nid && 3565 spec->stream_digital_capture) { 3566 info->stream[SNDRV_PCM_STREAM_CAPTURE] = *(spec->stream_digital_capture); 3567 info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->dig_in_nid; 3568 } 3569 /* FIXME: do we need this for all Realtek codec models? */ 3570 codec->spdif_status_reset = 1; 3571 } 3572 3573 if (spec->no_analog) 3574 return 0; 3575 3576 /* If the use of more than one ADC is requested for the current 3577 * model, configure a second analog capture-only PCM. 3578 */ 3579 /* Additional Analaog capture for index #2 */ 3580 if ((spec->alt_dac_nid && spec->stream_analog_alt_playback) || 3581 (spec->num_adc_nids > 1 && spec->stream_analog_alt_capture)) { 3582 codec->num_pcms = 3; 3583 info = spec->pcm_rec + 2; 3584 info->name = spec->stream_name_analog; 3585 if (spec->alt_dac_nid) { 3586 info->stream[SNDRV_PCM_STREAM_PLAYBACK] = 3587 *spec->stream_analog_alt_playback; 3588 info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = 3589 spec->alt_dac_nid; 3590 } else { 3591 info->stream[SNDRV_PCM_STREAM_PLAYBACK] = 3592 alc_pcm_null_stream; 3593 info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = 0; 3594 } 3595 if (spec->num_adc_nids > 1) { 3596 info->stream[SNDRV_PCM_STREAM_CAPTURE] = 3597 *spec->stream_analog_alt_capture; 3598 info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = 3599 spec->adc_nids[1]; 3600 info->stream[SNDRV_PCM_STREAM_CAPTURE].substreams = 3601 spec->num_adc_nids - 1; 3602 } else { 3603 info->stream[SNDRV_PCM_STREAM_CAPTURE] = 3604 alc_pcm_null_stream; 3605 info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = 0; 3606 } 3607 } 3608 3609 return 0; 3610 } 3611 3612 static void alc_free_kctls(struct hda_codec *codec) 3613 { 3614 struct alc_spec *spec = codec->spec; 3615 3616 if (spec->kctls.list) { 3617 struct snd_kcontrol_new *kctl = spec->kctls.list; 3618 int i; 3619 for (i = 0; i < spec->kctls.used; i++) 3620 kfree(kctl[i].name); 3621 } 3622 snd_array_free(&spec->kctls); 3623 } 3624 3625 static void alc_free(struct hda_codec *codec) 3626 { 3627 struct alc_spec *spec = codec->spec; 3628 3629 if (!spec) 3630 return; 3631 3632 alc_free_kctls(codec); 3633 kfree(spec); 3634 snd_hda_detach_beep_device(codec); 3635 } 3636 3637 #ifdef CONFIG_SND_HDA_POWER_SAVE 3638 static int alc_suspend(struct hda_codec *codec, pm_message_t state) 3639 { 3640 struct alc_spec *spec = codec->spec; 3641 if (spec && spec->power_hook) 3642 spec->power_hook(codec, 0); 3643 return 0; 3644 } 3645 #endif 3646 3647 #ifdef SND_HDA_NEEDS_RESUME 3648 static int alc_resume(struct hda_codec *codec) 3649 { 3650 #ifdef CONFIG_SND_HDA_POWER_SAVE 3651 struct alc_spec *spec = codec->spec; 3652 #endif 3653 codec->patch_ops.init(codec); 3654 snd_hda_codec_resume_amp(codec); 3655 snd_hda_codec_resume_cache(codec); 3656 #ifdef CONFIG_SND_HDA_POWER_SAVE 3657 if (spec && spec->power_hook) 3658 spec->power_hook(codec, 1); 3659 #endif 3660 return 0; 3661 } 3662 #endif 3663 3664 /* 3665 */ 3666 static struct hda_codec_ops alc_patch_ops = { 3667 .build_controls = alc_build_controls, 3668 .build_pcms = alc_build_pcms, 3669 .init = alc_init, 3670 .free = alc_free, 3671 .unsol_event = alc_unsol_event, 3672 #ifdef SND_HDA_NEEDS_RESUME 3673 .resume = alc_resume, 3674 #endif 3675 #ifdef CONFIG_SND_HDA_POWER_SAVE 3676 .suspend = alc_suspend, 3677 .check_power_status = alc_check_power_status, 3678 #endif 3679 }; 3680 3681 3682 /* 3683 * Test configuration for debugging 3684 * 3685 * Almost all inputs/outputs are enabled. I/O pins can be configured via 3686 * enum controls. 3687 */ 3688 #ifdef CONFIG_SND_DEBUG 3689 static hda_nid_t alc880_test_dac_nids[4] = { 3690 0x02, 0x03, 0x04, 0x05 3691 }; 3692 3693 static struct hda_input_mux alc880_test_capture_source = { 3694 .num_items = 7, 3695 .items = { 3696 { "In-1", 0x0 }, 3697 { "In-2", 0x1 }, 3698 { "In-3", 0x2 }, 3699 { "In-4", 0x3 }, 3700 { "CD", 0x4 }, 3701 { "Front", 0x5 }, 3702 { "Surround", 0x6 }, 3703 }, 3704 }; 3705 3706 static struct hda_channel_mode alc880_test_modes[4] = { 3707 { 2, NULL }, 3708 { 4, NULL }, 3709 { 6, NULL }, 3710 { 8, NULL }, 3711 }; 3712 3713 static int alc_test_pin_ctl_info(struct snd_kcontrol *kcontrol, 3714 struct snd_ctl_elem_info *uinfo) 3715 { 3716 static char *texts[] = { 3717 "N/A", "Line Out", "HP Out", 3718 "In Hi-Z", "In 50%", "In Grd", "In 80%", "In 100%" 3719 }; 3720 uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; 3721 uinfo->count = 1; 3722 uinfo->value.enumerated.items = 8; 3723 if (uinfo->value.enumerated.item >= 8) 3724 uinfo->value.enumerated.item = 7; 3725 strcpy(uinfo->value.enumerated.name, texts[uinfo->value.enumerated.item]); 3726 return 0; 3727 } 3728 3729 static int alc_test_pin_ctl_get(struct snd_kcontrol *kcontrol, 3730 struct snd_ctl_elem_value *ucontrol) 3731 { 3732 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 3733 hda_nid_t nid = (hda_nid_t)kcontrol->private_value; 3734 unsigned int pin_ctl, item = 0; 3735 3736 pin_ctl = snd_hda_codec_read(codec, nid, 0, 3737 AC_VERB_GET_PIN_WIDGET_CONTROL, 0); 3738 if (pin_ctl & AC_PINCTL_OUT_EN) { 3739 if (pin_ctl & AC_PINCTL_HP_EN) 3740 item = 2; 3741 else 3742 item = 1; 3743 } else if (pin_ctl & AC_PINCTL_IN_EN) { 3744 switch (pin_ctl & AC_PINCTL_VREFEN) { 3745 case AC_PINCTL_VREF_HIZ: item = 3; break; 3746 case AC_PINCTL_VREF_50: item = 4; break; 3747 case AC_PINCTL_VREF_GRD: item = 5; break; 3748 case AC_PINCTL_VREF_80: item = 6; break; 3749 case AC_PINCTL_VREF_100: item = 7; break; 3750 } 3751 } 3752 ucontrol->value.enumerated.item[0] = item; 3753 return 0; 3754 } 3755 3756 static int alc_test_pin_ctl_put(struct snd_kcontrol *kcontrol, 3757 struct snd_ctl_elem_value *ucontrol) 3758 { 3759 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 3760 hda_nid_t nid = (hda_nid_t)kcontrol->private_value; 3761 static unsigned int ctls[] = { 3762 0, AC_PINCTL_OUT_EN, AC_PINCTL_OUT_EN | AC_PINCTL_HP_EN, 3763 AC_PINCTL_IN_EN | AC_PINCTL_VREF_HIZ, 3764 AC_PINCTL_IN_EN | AC_PINCTL_VREF_50, 3765 AC_PINCTL_IN_EN | AC_PINCTL_VREF_GRD, 3766 AC_PINCTL_IN_EN | AC_PINCTL_VREF_80, 3767 AC_PINCTL_IN_EN | AC_PINCTL_VREF_100, 3768 }; 3769 unsigned int old_ctl, new_ctl; 3770 3771 old_ctl = snd_hda_codec_read(codec, nid, 0, 3772 AC_VERB_GET_PIN_WIDGET_CONTROL, 0); 3773 new_ctl = ctls[ucontrol->value.enumerated.item[0]]; 3774 if (old_ctl != new_ctl) { 3775 int val; 3776 snd_hda_codec_write_cache(codec, nid, 0, 3777 AC_VERB_SET_PIN_WIDGET_CONTROL, 3778 new_ctl); 3779 val = ucontrol->value.enumerated.item[0] >= 3 ? 3780 HDA_AMP_MUTE : 0; 3781 snd_hda_codec_amp_stereo(codec, nid, HDA_OUTPUT, 0, 3782 HDA_AMP_MUTE, val); 3783 return 1; 3784 } 3785 return 0; 3786 } 3787 3788 static int alc_test_pin_src_info(struct snd_kcontrol *kcontrol, 3789 struct snd_ctl_elem_info *uinfo) 3790 { 3791 static char *texts[] = { 3792 "Front", "Surround", "CLFE", "Side" 3793 }; 3794 uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; 3795 uinfo->count = 1; 3796 uinfo->value.enumerated.items = 4; 3797 if (uinfo->value.enumerated.item >= 4) 3798 uinfo->value.enumerated.item = 3; 3799 strcpy(uinfo->value.enumerated.name, texts[uinfo->value.enumerated.item]); 3800 return 0; 3801 } 3802 3803 static int alc_test_pin_src_get(struct snd_kcontrol *kcontrol, 3804 struct snd_ctl_elem_value *ucontrol) 3805 { 3806 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 3807 hda_nid_t nid = (hda_nid_t)kcontrol->private_value; 3808 unsigned int sel; 3809 3810 sel = snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_CONNECT_SEL, 0); 3811 ucontrol->value.enumerated.item[0] = sel & 3; 3812 return 0; 3813 } 3814 3815 static int alc_test_pin_src_put(struct snd_kcontrol *kcontrol, 3816 struct snd_ctl_elem_value *ucontrol) 3817 { 3818 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 3819 hda_nid_t nid = (hda_nid_t)kcontrol->private_value; 3820 unsigned int sel; 3821 3822 sel = snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_CONNECT_SEL, 0) & 3; 3823 if (ucontrol->value.enumerated.item[0] != sel) { 3824 sel = ucontrol->value.enumerated.item[0] & 3; 3825 snd_hda_codec_write_cache(codec, nid, 0, 3826 AC_VERB_SET_CONNECT_SEL, sel); 3827 return 1; 3828 } 3829 return 0; 3830 } 3831 3832 #define PIN_CTL_TEST(xname,nid) { \ 3833 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \ 3834 .name = xname, \ 3835 .info = alc_test_pin_ctl_info, \ 3836 .get = alc_test_pin_ctl_get, \ 3837 .put = alc_test_pin_ctl_put, \ 3838 .private_value = nid \ 3839 } 3840 3841 #define PIN_SRC_TEST(xname,nid) { \ 3842 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \ 3843 .name = xname, \ 3844 .info = alc_test_pin_src_info, \ 3845 .get = alc_test_pin_src_get, \ 3846 .put = alc_test_pin_src_put, \ 3847 .private_value = nid \ 3848 } 3849 3850 static struct snd_kcontrol_new alc880_test_mixer[] = { 3851 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 3852 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT), 3853 HDA_CODEC_VOLUME("CLFE Playback Volume", 0x0e, 0x0, HDA_OUTPUT), 3854 HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT), 3855 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 3856 HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT), 3857 HDA_BIND_MUTE("CLFE Playback Switch", 0x0e, 2, HDA_INPUT), 3858 HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT), 3859 PIN_CTL_TEST("Front Pin Mode", 0x14), 3860 PIN_CTL_TEST("Surround Pin Mode", 0x15), 3861 PIN_CTL_TEST("CLFE Pin Mode", 0x16), 3862 PIN_CTL_TEST("Side Pin Mode", 0x17), 3863 PIN_CTL_TEST("In-1 Pin Mode", 0x18), 3864 PIN_CTL_TEST("In-2 Pin Mode", 0x19), 3865 PIN_CTL_TEST("In-3 Pin Mode", 0x1a), 3866 PIN_CTL_TEST("In-4 Pin Mode", 0x1b), 3867 PIN_SRC_TEST("In-1 Pin Source", 0x18), 3868 PIN_SRC_TEST("In-2 Pin Source", 0x19), 3869 PIN_SRC_TEST("In-3 Pin Source", 0x1a), 3870 PIN_SRC_TEST("In-4 Pin Source", 0x1b), 3871 HDA_CODEC_VOLUME("In-1 Playback Volume", 0x0b, 0x0, HDA_INPUT), 3872 HDA_CODEC_MUTE("In-1 Playback Switch", 0x0b, 0x0, HDA_INPUT), 3873 HDA_CODEC_VOLUME("In-2 Playback Volume", 0x0b, 0x1, HDA_INPUT), 3874 HDA_CODEC_MUTE("In-2 Playback Switch", 0x0b, 0x1, HDA_INPUT), 3875 HDA_CODEC_VOLUME("In-3 Playback Volume", 0x0b, 0x2, HDA_INPUT), 3876 HDA_CODEC_MUTE("In-3 Playback Switch", 0x0b, 0x2, HDA_INPUT), 3877 HDA_CODEC_VOLUME("In-4 Playback Volume", 0x0b, 0x3, HDA_INPUT), 3878 HDA_CODEC_MUTE("In-4 Playback Switch", 0x0b, 0x3, HDA_INPUT), 3879 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x4, HDA_INPUT), 3880 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x4, HDA_INPUT), 3881 { 3882 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 3883 .name = "Channel Mode", 3884 .info = alc_ch_mode_info, 3885 .get = alc_ch_mode_get, 3886 .put = alc_ch_mode_put, 3887 }, 3888 { } /* end */ 3889 }; 3890 3891 static struct hda_verb alc880_test_init_verbs[] = { 3892 /* Unmute inputs of 0x0c - 0x0f */ 3893 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 3894 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 3895 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 3896 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 3897 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 3898 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 3899 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 3900 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 3901 /* Vol output for 0x0c-0x0f */ 3902 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 3903 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 3904 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 3905 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 3906 /* Set output pins 0x14-0x17 */ 3907 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 3908 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 3909 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 3910 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 3911 /* Unmute output pins 0x14-0x17 */ 3912 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 3913 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 3914 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 3915 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 3916 /* Set input pins 0x18-0x1c */ 3917 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, 3918 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, 3919 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 3920 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 3921 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 3922 /* Mute input pins 0x18-0x1b */ 3923 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 3924 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 3925 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 3926 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 3927 /* ADC set up */ 3928 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 3929 {0x07, AC_VERB_SET_CONNECT_SEL, 0x00}, 3930 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 3931 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00}, 3932 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 3933 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00}, 3934 /* Analog input/passthru */ 3935 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 3936 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 3937 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, 3938 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, 3939 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, 3940 { } 3941 }; 3942 #endif 3943 3944 /* 3945 */ 3946 3947 static const char *alc880_models[ALC880_MODEL_LAST] = { 3948 [ALC880_3ST] = "3stack", 3949 [ALC880_TCL_S700] = "tcl", 3950 [ALC880_3ST_DIG] = "3stack-digout", 3951 [ALC880_CLEVO] = "clevo", 3952 [ALC880_5ST] = "5stack", 3953 [ALC880_5ST_DIG] = "5stack-digout", 3954 [ALC880_W810] = "w810", 3955 [ALC880_Z71V] = "z71v", 3956 [ALC880_6ST] = "6stack", 3957 [ALC880_6ST_DIG] = "6stack-digout", 3958 [ALC880_ASUS] = "asus", 3959 [ALC880_ASUS_W1V] = "asus-w1v", 3960 [ALC880_ASUS_DIG] = "asus-dig", 3961 [ALC880_ASUS_DIG2] = "asus-dig2", 3962 [ALC880_UNIWILL_DIG] = "uniwill", 3963 [ALC880_UNIWILL_P53] = "uniwill-p53", 3964 [ALC880_FUJITSU] = "fujitsu", 3965 [ALC880_F1734] = "F1734", 3966 [ALC880_LG] = "lg", 3967 [ALC880_LG_LW] = "lg-lw", 3968 [ALC880_MEDION_RIM] = "medion", 3969 #ifdef CONFIG_SND_DEBUG 3970 [ALC880_TEST] = "test", 3971 #endif 3972 [ALC880_AUTO] = "auto", 3973 }; 3974 3975 static struct snd_pci_quirk alc880_cfg_tbl[] = { 3976 SND_PCI_QUIRK(0x1019, 0x0f69, "Coeus G610P", ALC880_W810), 3977 SND_PCI_QUIRK(0x1019, 0xa880, "ECS", ALC880_5ST_DIG), 3978 SND_PCI_QUIRK(0x1019, 0xa884, "Acer APFV", ALC880_6ST), 3979 SND_PCI_QUIRK(0x1025, 0x0070, "ULI", ALC880_3ST_DIG), 3980 SND_PCI_QUIRK(0x1025, 0x0077, "ULI", ALC880_6ST_DIG), 3981 SND_PCI_QUIRK(0x1025, 0x0078, "ULI", ALC880_6ST_DIG), 3982 SND_PCI_QUIRK(0x1025, 0x0087, "ULI", ALC880_6ST_DIG), 3983 SND_PCI_QUIRK(0x1025, 0xe309, "ULI", ALC880_3ST_DIG), 3984 SND_PCI_QUIRK(0x1025, 0xe310, "ULI", ALC880_3ST), 3985 SND_PCI_QUIRK(0x1039, 0x1234, NULL, ALC880_6ST_DIG), 3986 SND_PCI_QUIRK(0x103c, 0x2a09, "HP", ALC880_5ST), 3987 SND_PCI_QUIRK(0x1043, 0x10b3, "ASUS W1V", ALC880_ASUS_W1V), 3988 SND_PCI_QUIRK(0x1043, 0x10c2, "ASUS W6A", ALC880_ASUS_DIG), 3989 SND_PCI_QUIRK(0x1043, 0x10c3, "ASUS Wxx", ALC880_ASUS_DIG), 3990 SND_PCI_QUIRK(0x1043, 0x1113, "ASUS", ALC880_ASUS_DIG), 3991 SND_PCI_QUIRK(0x1043, 0x1123, "ASUS", ALC880_ASUS_DIG), 3992 SND_PCI_QUIRK(0x1043, 0x1173, "ASUS", ALC880_ASUS_DIG), 3993 SND_PCI_QUIRK(0x1043, 0x1964, "ASUS Z71V", ALC880_Z71V), 3994 /* SND_PCI_QUIRK(0x1043, 0x1964, "ASUS", ALC880_ASUS_DIG), */ 3995 SND_PCI_QUIRK(0x1043, 0x1973, "ASUS", ALC880_ASUS_DIG), 3996 SND_PCI_QUIRK(0x1043, 0x19b3, "ASUS", ALC880_ASUS_DIG), 3997 SND_PCI_QUIRK(0x1043, 0x814e, "ASUS P5GD1 w/SPDIF", ALC880_6ST_DIG), 3998 SND_PCI_QUIRK(0x1043, 0x8181, "ASUS P4GPL", ALC880_ASUS_DIG), 3999 SND_PCI_QUIRK(0x1043, 0x8196, "ASUS P5GD1", ALC880_6ST), 4000 SND_PCI_QUIRK(0x1043, 0x81b4, "ASUS", ALC880_6ST), 4001 SND_PCI_QUIRK_VENDOR(0x1043, "ASUS", ALC880_ASUS), /* default ASUS */ 4002 SND_PCI_QUIRK(0x104d, 0x81a0, "Sony", ALC880_3ST), 4003 SND_PCI_QUIRK(0x104d, 0x81d6, "Sony", ALC880_3ST), 4004 SND_PCI_QUIRK(0x107b, 0x3032, "Gateway", ALC880_5ST), 4005 SND_PCI_QUIRK(0x107b, 0x3033, "Gateway", ALC880_5ST), 4006 SND_PCI_QUIRK(0x107b, 0x4039, "Gateway", ALC880_5ST), 4007 SND_PCI_QUIRK(0x1297, 0xc790, "Shuttle ST20G5", ALC880_6ST_DIG), 4008 SND_PCI_QUIRK(0x1458, 0xa102, "Gigabyte K8", ALC880_6ST_DIG), 4009 SND_PCI_QUIRK(0x1462, 0x1150, "MSI", ALC880_6ST_DIG), 4010 SND_PCI_QUIRK(0x1509, 0x925d, "FIC P4M", ALC880_6ST_DIG), 4011 SND_PCI_QUIRK(0x1558, 0x0520, "Clevo m520G", ALC880_CLEVO), 4012 SND_PCI_QUIRK(0x1558, 0x0660, "Clevo m655n", ALC880_CLEVO), 4013 SND_PCI_QUIRK(0x1558, 0x5401, "ASUS", ALC880_ASUS_DIG2), 4014 SND_PCI_QUIRK(0x1565, 0x8202, "Biostar", ALC880_5ST_DIG), 4015 SND_PCI_QUIRK(0x1584, 0x9050, "Uniwill", ALC880_UNIWILL_DIG), 4016 SND_PCI_QUIRK(0x1584, 0x9054, "Uniwlll", ALC880_F1734), 4017 SND_PCI_QUIRK(0x1584, 0x9070, "Uniwill", ALC880_UNIWILL), 4018 SND_PCI_QUIRK(0x1584, 0x9077, "Uniwill P53", ALC880_UNIWILL_P53), 4019 SND_PCI_QUIRK(0x161f, 0x203d, "W810", ALC880_W810), 4020 SND_PCI_QUIRK(0x161f, 0x205d, "Medion Rim 2150", ALC880_MEDION_RIM), 4021 SND_PCI_QUIRK(0x1695, 0x400d, "EPoX", ALC880_5ST_DIG), 4022 SND_PCI_QUIRK(0x1695, 0x4012, "EPox EP-5LDA", ALC880_5ST_DIG), 4023 SND_PCI_QUIRK(0x1734, 0x107c, "FSC F1734", ALC880_F1734), 4024 SND_PCI_QUIRK(0x1734, 0x1094, "FSC Amilo M1451G", ALC880_FUJITSU), 4025 SND_PCI_QUIRK(0x1734, 0x10ac, "FSC", ALC880_UNIWILL), 4026 SND_PCI_QUIRK(0x1734, 0x10b0, "Fujitsu", ALC880_FUJITSU), 4027 SND_PCI_QUIRK(0x1854, 0x0018, "LG LW20", ALC880_LG_LW), 4028 SND_PCI_QUIRK(0x1854, 0x003b, "LG", ALC880_LG), 4029 SND_PCI_QUIRK(0x1854, 0x0068, "LG w1", ALC880_LG), 4030 SND_PCI_QUIRK(0x1854, 0x0077, "LG LW25", ALC880_LG_LW), 4031 SND_PCI_QUIRK(0x19db, 0x4188, "TCL S700", ALC880_TCL_S700), 4032 SND_PCI_QUIRK(0x2668, 0x8086, NULL, ALC880_6ST_DIG), /* broken BIOS */ 4033 SND_PCI_QUIRK(0x8086, 0x2668, NULL, ALC880_6ST_DIG), 4034 SND_PCI_QUIRK(0x8086, 0xa100, "Intel mobo", ALC880_5ST_DIG), 4035 SND_PCI_QUIRK(0x8086, 0xd400, "Intel mobo", ALC880_5ST_DIG), 4036 SND_PCI_QUIRK(0x8086, 0xd401, "Intel mobo", ALC880_5ST_DIG), 4037 SND_PCI_QUIRK(0x8086, 0xd402, "Intel mobo", ALC880_3ST_DIG), 4038 SND_PCI_QUIRK(0x8086, 0xe224, "Intel mobo", ALC880_5ST_DIG), 4039 SND_PCI_QUIRK(0x8086, 0xe305, "Intel mobo", ALC880_3ST_DIG), 4040 SND_PCI_QUIRK(0x8086, 0xe308, "Intel mobo", ALC880_3ST_DIG), 4041 SND_PCI_QUIRK(0x8086, 0xe400, "Intel mobo", ALC880_5ST_DIG), 4042 SND_PCI_QUIRK(0x8086, 0xe401, "Intel mobo", ALC880_5ST_DIG), 4043 SND_PCI_QUIRK(0x8086, 0xe402, "Intel mobo", ALC880_5ST_DIG), 4044 /* default Intel */ 4045 SND_PCI_QUIRK_VENDOR(0x8086, "Intel mobo", ALC880_3ST), 4046 SND_PCI_QUIRK(0xa0a0, 0x0560, "AOpen i915GMm-HFS", ALC880_5ST_DIG), 4047 SND_PCI_QUIRK(0xe803, 0x1019, NULL, ALC880_6ST_DIG), 4048 {} 4049 }; 4050 4051 /* 4052 * ALC880 codec presets 4053 */ 4054 static struct alc_config_preset alc880_presets[] = { 4055 [ALC880_3ST] = { 4056 .mixers = { alc880_three_stack_mixer }, 4057 .init_verbs = { alc880_volume_init_verbs, 4058 alc880_pin_3stack_init_verbs }, 4059 .num_dacs = ARRAY_SIZE(alc880_dac_nids), 4060 .dac_nids = alc880_dac_nids, 4061 .num_channel_mode = ARRAY_SIZE(alc880_threestack_modes), 4062 .channel_mode = alc880_threestack_modes, 4063 .need_dac_fix = 1, 4064 .input_mux = &alc880_capture_source, 4065 }, 4066 [ALC880_3ST_DIG] = { 4067 .mixers = { alc880_three_stack_mixer }, 4068 .init_verbs = { alc880_volume_init_verbs, 4069 alc880_pin_3stack_init_verbs }, 4070 .num_dacs = ARRAY_SIZE(alc880_dac_nids), 4071 .dac_nids = alc880_dac_nids, 4072 .dig_out_nid = ALC880_DIGOUT_NID, 4073 .num_channel_mode = ARRAY_SIZE(alc880_threestack_modes), 4074 .channel_mode = alc880_threestack_modes, 4075 .need_dac_fix = 1, 4076 .input_mux = &alc880_capture_source, 4077 }, 4078 [ALC880_TCL_S700] = { 4079 .mixers = { alc880_tcl_s700_mixer }, 4080 .init_verbs = { alc880_volume_init_verbs, 4081 alc880_pin_tcl_S700_init_verbs, 4082 alc880_gpio2_init_verbs }, 4083 .num_dacs = ARRAY_SIZE(alc880_dac_nids), 4084 .dac_nids = alc880_dac_nids, 4085 .adc_nids = alc880_adc_nids_alt, /* FIXME: correct? */ 4086 .num_adc_nids = 1, /* single ADC */ 4087 .hp_nid = 0x03, 4088 .num_channel_mode = ARRAY_SIZE(alc880_2_jack_modes), 4089 .channel_mode = alc880_2_jack_modes, 4090 .input_mux = &alc880_capture_source, 4091 }, 4092 [ALC880_5ST] = { 4093 .mixers = { alc880_three_stack_mixer, 4094 alc880_five_stack_mixer}, 4095 .init_verbs = { alc880_volume_init_verbs, 4096 alc880_pin_5stack_init_verbs }, 4097 .num_dacs = ARRAY_SIZE(alc880_dac_nids), 4098 .dac_nids = alc880_dac_nids, 4099 .num_channel_mode = ARRAY_SIZE(alc880_fivestack_modes), 4100 .channel_mode = alc880_fivestack_modes, 4101 .input_mux = &alc880_capture_source, 4102 }, 4103 [ALC880_5ST_DIG] = { 4104 .mixers = { alc880_three_stack_mixer, 4105 alc880_five_stack_mixer }, 4106 .init_verbs = { alc880_volume_init_verbs, 4107 alc880_pin_5stack_init_verbs }, 4108 .num_dacs = ARRAY_SIZE(alc880_dac_nids), 4109 .dac_nids = alc880_dac_nids, 4110 .dig_out_nid = ALC880_DIGOUT_NID, 4111 .num_channel_mode = ARRAY_SIZE(alc880_fivestack_modes), 4112 .channel_mode = alc880_fivestack_modes, 4113 .input_mux = &alc880_capture_source, 4114 }, 4115 [ALC880_6ST] = { 4116 .mixers = { alc880_six_stack_mixer }, 4117 .init_verbs = { alc880_volume_init_verbs, 4118 alc880_pin_6stack_init_verbs }, 4119 .num_dacs = ARRAY_SIZE(alc880_6st_dac_nids), 4120 .dac_nids = alc880_6st_dac_nids, 4121 .num_channel_mode = ARRAY_SIZE(alc880_sixstack_modes), 4122 .channel_mode = alc880_sixstack_modes, 4123 .input_mux = &alc880_6stack_capture_source, 4124 }, 4125 [ALC880_6ST_DIG] = { 4126 .mixers = { alc880_six_stack_mixer }, 4127 .init_verbs = { alc880_volume_init_verbs, 4128 alc880_pin_6stack_init_verbs }, 4129 .num_dacs = ARRAY_SIZE(alc880_6st_dac_nids), 4130 .dac_nids = alc880_6st_dac_nids, 4131 .dig_out_nid = ALC880_DIGOUT_NID, 4132 .num_channel_mode = ARRAY_SIZE(alc880_sixstack_modes), 4133 .channel_mode = alc880_sixstack_modes, 4134 .input_mux = &alc880_6stack_capture_source, 4135 }, 4136 [ALC880_W810] = { 4137 .mixers = { alc880_w810_base_mixer }, 4138 .init_verbs = { alc880_volume_init_verbs, 4139 alc880_pin_w810_init_verbs, 4140 alc880_gpio2_init_verbs }, 4141 .num_dacs = ARRAY_SIZE(alc880_w810_dac_nids), 4142 .dac_nids = alc880_w810_dac_nids, 4143 .dig_out_nid = ALC880_DIGOUT_NID, 4144 .num_channel_mode = ARRAY_SIZE(alc880_w810_modes), 4145 .channel_mode = alc880_w810_modes, 4146 .input_mux = &alc880_capture_source, 4147 }, 4148 [ALC880_Z71V] = { 4149 .mixers = { alc880_z71v_mixer }, 4150 .init_verbs = { alc880_volume_init_verbs, 4151 alc880_pin_z71v_init_verbs }, 4152 .num_dacs = ARRAY_SIZE(alc880_z71v_dac_nids), 4153 .dac_nids = alc880_z71v_dac_nids, 4154 .dig_out_nid = ALC880_DIGOUT_NID, 4155 .hp_nid = 0x03, 4156 .num_channel_mode = ARRAY_SIZE(alc880_2_jack_modes), 4157 .channel_mode = alc880_2_jack_modes, 4158 .input_mux = &alc880_capture_source, 4159 }, 4160 [ALC880_F1734] = { 4161 .mixers = { alc880_f1734_mixer }, 4162 .init_verbs = { alc880_volume_init_verbs, 4163 alc880_pin_f1734_init_verbs }, 4164 .num_dacs = ARRAY_SIZE(alc880_f1734_dac_nids), 4165 .dac_nids = alc880_f1734_dac_nids, 4166 .hp_nid = 0x02, 4167 .num_channel_mode = ARRAY_SIZE(alc880_2_jack_modes), 4168 .channel_mode = alc880_2_jack_modes, 4169 .input_mux = &alc880_f1734_capture_source, 4170 .unsol_event = alc880_uniwill_p53_unsol_event, 4171 .setup = alc880_uniwill_p53_setup, 4172 .init_hook = alc_automute_amp, 4173 }, 4174 [ALC880_ASUS] = { 4175 .mixers = { alc880_asus_mixer }, 4176 .init_verbs = { alc880_volume_init_verbs, 4177 alc880_pin_asus_init_verbs, 4178 alc880_gpio1_init_verbs }, 4179 .num_dacs = ARRAY_SIZE(alc880_asus_dac_nids), 4180 .dac_nids = alc880_asus_dac_nids, 4181 .num_channel_mode = ARRAY_SIZE(alc880_asus_modes), 4182 .channel_mode = alc880_asus_modes, 4183 .need_dac_fix = 1, 4184 .input_mux = &alc880_capture_source, 4185 }, 4186 [ALC880_ASUS_DIG] = { 4187 .mixers = { alc880_asus_mixer }, 4188 .init_verbs = { alc880_volume_init_verbs, 4189 alc880_pin_asus_init_verbs, 4190 alc880_gpio1_init_verbs }, 4191 .num_dacs = ARRAY_SIZE(alc880_asus_dac_nids), 4192 .dac_nids = alc880_asus_dac_nids, 4193 .dig_out_nid = ALC880_DIGOUT_NID, 4194 .num_channel_mode = ARRAY_SIZE(alc880_asus_modes), 4195 .channel_mode = alc880_asus_modes, 4196 .need_dac_fix = 1, 4197 .input_mux = &alc880_capture_source, 4198 }, 4199 [ALC880_ASUS_DIG2] = { 4200 .mixers = { alc880_asus_mixer }, 4201 .init_verbs = { alc880_volume_init_verbs, 4202 alc880_pin_asus_init_verbs, 4203 alc880_gpio2_init_verbs }, /* use GPIO2 */ 4204 .num_dacs = ARRAY_SIZE(alc880_asus_dac_nids), 4205 .dac_nids = alc880_asus_dac_nids, 4206 .dig_out_nid = ALC880_DIGOUT_NID, 4207 .num_channel_mode = ARRAY_SIZE(alc880_asus_modes), 4208 .channel_mode = alc880_asus_modes, 4209 .need_dac_fix = 1, 4210 .input_mux = &alc880_capture_source, 4211 }, 4212 [ALC880_ASUS_W1V] = { 4213 .mixers = { alc880_asus_mixer, alc880_asus_w1v_mixer }, 4214 .init_verbs = { alc880_volume_init_verbs, 4215 alc880_pin_asus_init_verbs, 4216 alc880_gpio1_init_verbs }, 4217 .num_dacs = ARRAY_SIZE(alc880_asus_dac_nids), 4218 .dac_nids = alc880_asus_dac_nids, 4219 .dig_out_nid = ALC880_DIGOUT_NID, 4220 .num_channel_mode = ARRAY_SIZE(alc880_asus_modes), 4221 .channel_mode = alc880_asus_modes, 4222 .need_dac_fix = 1, 4223 .input_mux = &alc880_capture_source, 4224 }, 4225 [ALC880_UNIWILL_DIG] = { 4226 .mixers = { alc880_asus_mixer }, 4227 .init_verbs = { alc880_volume_init_verbs, 4228 alc880_pin_asus_init_verbs }, 4229 .num_dacs = ARRAY_SIZE(alc880_asus_dac_nids), 4230 .dac_nids = alc880_asus_dac_nids, 4231 .dig_out_nid = ALC880_DIGOUT_NID, 4232 .num_channel_mode = ARRAY_SIZE(alc880_asus_modes), 4233 .channel_mode = alc880_asus_modes, 4234 .need_dac_fix = 1, 4235 .input_mux = &alc880_capture_source, 4236 }, 4237 [ALC880_UNIWILL] = { 4238 .mixers = { alc880_uniwill_mixer }, 4239 .init_verbs = { alc880_volume_init_verbs, 4240 alc880_uniwill_init_verbs }, 4241 .num_dacs = ARRAY_SIZE(alc880_asus_dac_nids), 4242 .dac_nids = alc880_asus_dac_nids, 4243 .dig_out_nid = ALC880_DIGOUT_NID, 4244 .num_channel_mode = ARRAY_SIZE(alc880_threestack_modes), 4245 .channel_mode = alc880_threestack_modes, 4246 .need_dac_fix = 1, 4247 .input_mux = &alc880_capture_source, 4248 .unsol_event = alc880_uniwill_unsol_event, 4249 .setup = alc880_uniwill_setup, 4250 .init_hook = alc880_uniwill_init_hook, 4251 }, 4252 [ALC880_UNIWILL_P53] = { 4253 .mixers = { alc880_uniwill_p53_mixer }, 4254 .init_verbs = { alc880_volume_init_verbs, 4255 alc880_uniwill_p53_init_verbs }, 4256 .num_dacs = ARRAY_SIZE(alc880_asus_dac_nids), 4257 .dac_nids = alc880_asus_dac_nids, 4258 .num_channel_mode = ARRAY_SIZE(alc880_w810_modes), 4259 .channel_mode = alc880_threestack_modes, 4260 .input_mux = &alc880_capture_source, 4261 .unsol_event = alc880_uniwill_p53_unsol_event, 4262 .setup = alc880_uniwill_p53_setup, 4263 .init_hook = alc_automute_amp, 4264 }, 4265 [ALC880_FUJITSU] = { 4266 .mixers = { alc880_fujitsu_mixer }, 4267 .init_verbs = { alc880_volume_init_verbs, 4268 alc880_uniwill_p53_init_verbs, 4269 alc880_beep_init_verbs }, 4270 .num_dacs = ARRAY_SIZE(alc880_dac_nids), 4271 .dac_nids = alc880_dac_nids, 4272 .dig_out_nid = ALC880_DIGOUT_NID, 4273 .num_channel_mode = ARRAY_SIZE(alc880_2_jack_modes), 4274 .channel_mode = alc880_2_jack_modes, 4275 .input_mux = &alc880_capture_source, 4276 .unsol_event = alc880_uniwill_p53_unsol_event, 4277 .setup = alc880_uniwill_p53_setup, 4278 .init_hook = alc_automute_amp, 4279 }, 4280 [ALC880_CLEVO] = { 4281 .mixers = { alc880_three_stack_mixer }, 4282 .init_verbs = { alc880_volume_init_verbs, 4283 alc880_pin_clevo_init_verbs }, 4284 .num_dacs = ARRAY_SIZE(alc880_dac_nids), 4285 .dac_nids = alc880_dac_nids, 4286 .hp_nid = 0x03, 4287 .num_channel_mode = ARRAY_SIZE(alc880_threestack_modes), 4288 .channel_mode = alc880_threestack_modes, 4289 .need_dac_fix = 1, 4290 .input_mux = &alc880_capture_source, 4291 }, 4292 [ALC880_LG] = { 4293 .mixers = { alc880_lg_mixer }, 4294 .init_verbs = { alc880_volume_init_verbs, 4295 alc880_lg_init_verbs }, 4296 .num_dacs = ARRAY_SIZE(alc880_lg_dac_nids), 4297 .dac_nids = alc880_lg_dac_nids, 4298 .dig_out_nid = ALC880_DIGOUT_NID, 4299 .num_channel_mode = ARRAY_SIZE(alc880_lg_ch_modes), 4300 .channel_mode = alc880_lg_ch_modes, 4301 .need_dac_fix = 1, 4302 .input_mux = &alc880_lg_capture_source, 4303 .unsol_event = alc_automute_amp_unsol_event, 4304 .setup = alc880_lg_setup, 4305 .init_hook = alc_automute_amp, 4306 #ifdef CONFIG_SND_HDA_POWER_SAVE 4307 .loopbacks = alc880_lg_loopbacks, 4308 #endif 4309 }, 4310 [ALC880_LG_LW] = { 4311 .mixers = { alc880_lg_lw_mixer }, 4312 .init_verbs = { alc880_volume_init_verbs, 4313 alc880_lg_lw_init_verbs }, 4314 .num_dacs = ARRAY_SIZE(alc880_dac_nids), 4315 .dac_nids = alc880_dac_nids, 4316 .dig_out_nid = ALC880_DIGOUT_NID, 4317 .num_channel_mode = ARRAY_SIZE(alc880_lg_lw_modes), 4318 .channel_mode = alc880_lg_lw_modes, 4319 .input_mux = &alc880_lg_lw_capture_source, 4320 .unsol_event = alc_automute_amp_unsol_event, 4321 .setup = alc880_lg_lw_setup, 4322 .init_hook = alc_automute_amp, 4323 }, 4324 [ALC880_MEDION_RIM] = { 4325 .mixers = { alc880_medion_rim_mixer }, 4326 .init_verbs = { alc880_volume_init_verbs, 4327 alc880_medion_rim_init_verbs, 4328 alc_gpio2_init_verbs }, 4329 .num_dacs = ARRAY_SIZE(alc880_dac_nids), 4330 .dac_nids = alc880_dac_nids, 4331 .dig_out_nid = ALC880_DIGOUT_NID, 4332 .num_channel_mode = ARRAY_SIZE(alc880_2_jack_modes), 4333 .channel_mode = alc880_2_jack_modes, 4334 .input_mux = &alc880_medion_rim_capture_source, 4335 .unsol_event = alc880_medion_rim_unsol_event, 4336 .setup = alc880_medion_rim_setup, 4337 .init_hook = alc880_medion_rim_automute, 4338 }, 4339 #ifdef CONFIG_SND_DEBUG 4340 [ALC880_TEST] = { 4341 .mixers = { alc880_test_mixer }, 4342 .init_verbs = { alc880_test_init_verbs }, 4343 .num_dacs = ARRAY_SIZE(alc880_test_dac_nids), 4344 .dac_nids = alc880_test_dac_nids, 4345 .dig_out_nid = ALC880_DIGOUT_NID, 4346 .num_channel_mode = ARRAY_SIZE(alc880_test_modes), 4347 .channel_mode = alc880_test_modes, 4348 .input_mux = &alc880_test_capture_source, 4349 }, 4350 #endif 4351 }; 4352 4353 /* 4354 * Automatic parse of I/O pins from the BIOS configuration 4355 */ 4356 4357 enum { 4358 ALC_CTL_WIDGET_VOL, 4359 ALC_CTL_WIDGET_MUTE, 4360 ALC_CTL_BIND_MUTE, 4361 }; 4362 static struct snd_kcontrol_new alc880_control_templates[] = { 4363 HDA_CODEC_VOLUME(NULL, 0, 0, 0), 4364 HDA_CODEC_MUTE(NULL, 0, 0, 0), 4365 HDA_BIND_MUTE(NULL, 0, 0, 0), 4366 }; 4367 4368 /* add dynamic controls */ 4369 static int add_control(struct alc_spec *spec, int type, const char *name, 4370 unsigned long val) 4371 { 4372 struct snd_kcontrol_new *knew; 4373 4374 snd_array_init(&spec->kctls, sizeof(*knew), 32); 4375 knew = snd_array_new(&spec->kctls); 4376 if (!knew) 4377 return -ENOMEM; 4378 *knew = alc880_control_templates[type]; 4379 knew->name = kstrdup(name, GFP_KERNEL); 4380 if (!knew->name) 4381 return -ENOMEM; 4382 if (get_amp_nid_(val)) 4383 knew->subdevice = HDA_SUBDEV_NID_FLAG | get_amp_nid_(val); 4384 knew->private_value = val; 4385 return 0; 4386 } 4387 4388 static int add_control_with_pfx(struct alc_spec *spec, int type, 4389 const char *pfx, const char *dir, 4390 const char *sfx, unsigned long val) 4391 { 4392 char name[32]; 4393 snprintf(name, sizeof(name), "%s %s %s", pfx, dir, sfx); 4394 return add_control(spec, type, name, val); 4395 } 4396 4397 #define add_pb_vol_ctrl(spec, type, pfx, val) \ 4398 add_control_with_pfx(spec, type, pfx, "Playback", "Volume", val) 4399 #define add_pb_sw_ctrl(spec, type, pfx, val) \ 4400 add_control_with_pfx(spec, type, pfx, "Playback", "Switch", val) 4401 4402 #define alc880_is_fixed_pin(nid) ((nid) >= 0x14 && (nid) <= 0x17) 4403 #define alc880_fixed_pin_idx(nid) ((nid) - 0x14) 4404 #define alc880_is_multi_pin(nid) ((nid) >= 0x18) 4405 #define alc880_multi_pin_idx(nid) ((nid) - 0x18) 4406 #define alc880_idx_to_dac(nid) ((nid) + 0x02) 4407 #define alc880_dac_to_idx(nid) ((nid) - 0x02) 4408 #define alc880_idx_to_mixer(nid) ((nid) + 0x0c) 4409 #define alc880_idx_to_selector(nid) ((nid) + 0x10) 4410 #define ALC880_PIN_CD_NID 0x1c 4411 4412 /* fill in the dac_nids table from the parsed pin configuration */ 4413 static int alc880_auto_fill_dac_nids(struct alc_spec *spec, 4414 const struct auto_pin_cfg *cfg) 4415 { 4416 hda_nid_t nid; 4417 int assigned[4]; 4418 int i, j; 4419 4420 memset(assigned, 0, sizeof(assigned)); 4421 spec->multiout.dac_nids = spec->private_dac_nids; 4422 4423 /* check the pins hardwired to audio widget */ 4424 for (i = 0; i < cfg->line_outs; i++) { 4425 nid = cfg->line_out_pins[i]; 4426 if (alc880_is_fixed_pin(nid)) { 4427 int idx = alc880_fixed_pin_idx(nid); 4428 spec->multiout.dac_nids[i] = alc880_idx_to_dac(idx); 4429 assigned[idx] = 1; 4430 } 4431 } 4432 /* left pins can be connect to any audio widget */ 4433 for (i = 0; i < cfg->line_outs; i++) { 4434 nid = cfg->line_out_pins[i]; 4435 if (alc880_is_fixed_pin(nid)) 4436 continue; 4437 /* search for an empty channel */ 4438 for (j = 0; j < cfg->line_outs; j++) { 4439 if (!assigned[j]) { 4440 spec->multiout.dac_nids[i] = 4441 alc880_idx_to_dac(j); 4442 assigned[j] = 1; 4443 break; 4444 } 4445 } 4446 } 4447 spec->multiout.num_dacs = cfg->line_outs; 4448 return 0; 4449 } 4450 4451 /* add playback controls from the parsed DAC table */ 4452 static int alc880_auto_create_multi_out_ctls(struct alc_spec *spec, 4453 const struct auto_pin_cfg *cfg) 4454 { 4455 static const char *chname[4] = { 4456 "Front", "Surround", NULL /*CLFE*/, "Side" 4457 }; 4458 hda_nid_t nid; 4459 int i, err; 4460 4461 for (i = 0; i < cfg->line_outs; i++) { 4462 if (!spec->multiout.dac_nids[i]) 4463 continue; 4464 nid = alc880_idx_to_mixer(alc880_dac_to_idx(spec->multiout.dac_nids[i])); 4465 if (i == 2) { 4466 /* Center/LFE */ 4467 err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, 4468 "Center", 4469 HDA_COMPOSE_AMP_VAL(nid, 1, 0, 4470 HDA_OUTPUT)); 4471 if (err < 0) 4472 return err; 4473 err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, 4474 "LFE", 4475 HDA_COMPOSE_AMP_VAL(nid, 2, 0, 4476 HDA_OUTPUT)); 4477 if (err < 0) 4478 return err; 4479 err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE, 4480 "Center", 4481 HDA_COMPOSE_AMP_VAL(nid, 1, 2, 4482 HDA_INPUT)); 4483 if (err < 0) 4484 return err; 4485 err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE, 4486 "LFE", 4487 HDA_COMPOSE_AMP_VAL(nid, 2, 2, 4488 HDA_INPUT)); 4489 if (err < 0) 4490 return err; 4491 } else { 4492 const char *pfx; 4493 if (cfg->line_outs == 1 && 4494 cfg->line_out_type == AUTO_PIN_SPEAKER_OUT) 4495 pfx = "Speaker"; 4496 else 4497 pfx = chname[i]; 4498 err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx, 4499 HDA_COMPOSE_AMP_VAL(nid, 3, 0, 4500 HDA_OUTPUT)); 4501 if (err < 0) 4502 return err; 4503 err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE, pfx, 4504 HDA_COMPOSE_AMP_VAL(nid, 3, 2, 4505 HDA_INPUT)); 4506 if (err < 0) 4507 return err; 4508 } 4509 } 4510 return 0; 4511 } 4512 4513 /* add playback controls for speaker and HP outputs */ 4514 static int alc880_auto_create_extra_out(struct alc_spec *spec, hda_nid_t pin, 4515 const char *pfx) 4516 { 4517 hda_nid_t nid; 4518 int err; 4519 4520 if (!pin) 4521 return 0; 4522 4523 if (alc880_is_fixed_pin(pin)) { 4524 nid = alc880_idx_to_dac(alc880_fixed_pin_idx(pin)); 4525 /* specify the DAC as the extra output */ 4526 if (!spec->multiout.hp_nid) 4527 spec->multiout.hp_nid = nid; 4528 else 4529 spec->multiout.extra_out_nid[0] = nid; 4530 /* control HP volume/switch on the output mixer amp */ 4531 nid = alc880_idx_to_mixer(alc880_fixed_pin_idx(pin)); 4532 err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx, 4533 HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT)); 4534 if (err < 0) 4535 return err; 4536 err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE, pfx, 4537 HDA_COMPOSE_AMP_VAL(nid, 3, 2, HDA_INPUT)); 4538 if (err < 0) 4539 return err; 4540 } else if (alc880_is_multi_pin(pin)) { 4541 /* set manual connection */ 4542 /* we have only a switch on HP-out PIN */ 4543 err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, pfx, 4544 HDA_COMPOSE_AMP_VAL(pin, 3, 0, HDA_OUTPUT)); 4545 if (err < 0) 4546 return err; 4547 } 4548 return 0; 4549 } 4550 4551 /* create input playback/capture controls for the given pin */ 4552 static int new_analog_input(struct alc_spec *spec, hda_nid_t pin, 4553 const char *ctlname, 4554 int idx, hda_nid_t mix_nid) 4555 { 4556 int err; 4557 4558 err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, ctlname, 4559 HDA_COMPOSE_AMP_VAL(mix_nid, 3, idx, HDA_INPUT)); 4560 if (err < 0) 4561 return err; 4562 err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, ctlname, 4563 HDA_COMPOSE_AMP_VAL(mix_nid, 3, idx, HDA_INPUT)); 4564 if (err < 0) 4565 return err; 4566 return 0; 4567 } 4568 4569 static int alc_is_input_pin(struct hda_codec *codec, hda_nid_t nid) 4570 { 4571 unsigned int pincap = snd_hda_query_pin_caps(codec, nid); 4572 return (pincap & AC_PINCAP_IN) != 0; 4573 } 4574 4575 /* create playback/capture controls for input pins */ 4576 static int alc_auto_create_input_ctls(struct hda_codec *codec, 4577 const struct auto_pin_cfg *cfg, 4578 hda_nid_t mixer, 4579 hda_nid_t cap1, hda_nid_t cap2) 4580 { 4581 struct alc_spec *spec = codec->spec; 4582 struct hda_input_mux *imux = &spec->private_imux[0]; 4583 int i, err, idx; 4584 4585 for (i = 0; i < AUTO_PIN_LAST; i++) { 4586 hda_nid_t pin; 4587 4588 pin = cfg->input_pins[i]; 4589 if (!alc_is_input_pin(codec, pin)) 4590 continue; 4591 4592 if (mixer) { 4593 idx = get_connection_index(codec, mixer, pin); 4594 if (idx >= 0) { 4595 err = new_analog_input(spec, pin, 4596 auto_pin_cfg_labels[i], 4597 idx, mixer); 4598 if (err < 0) 4599 return err; 4600 } 4601 } 4602 4603 if (!cap1) 4604 continue; 4605 idx = get_connection_index(codec, cap1, pin); 4606 if (idx < 0 && cap2) 4607 idx = get_connection_index(codec, cap2, pin); 4608 if (idx >= 0) { 4609 imux->items[imux->num_items].label = 4610 auto_pin_cfg_labels[i]; 4611 imux->items[imux->num_items].index = idx; 4612 imux->num_items++; 4613 } 4614 } 4615 return 0; 4616 } 4617 4618 static int alc880_auto_create_input_ctls(struct hda_codec *codec, 4619 const struct auto_pin_cfg *cfg) 4620 { 4621 return alc_auto_create_input_ctls(codec, cfg, 0x0b, 0x08, 0x09); 4622 } 4623 4624 static void alc_set_pin_output(struct hda_codec *codec, hda_nid_t nid, 4625 unsigned int pin_type) 4626 { 4627 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_PIN_WIDGET_CONTROL, 4628 pin_type); 4629 /* unmute pin */ 4630 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_AMP_GAIN_MUTE, 4631 AMP_OUT_UNMUTE); 4632 } 4633 4634 static void alc880_auto_set_output_and_unmute(struct hda_codec *codec, 4635 hda_nid_t nid, int pin_type, 4636 int dac_idx) 4637 { 4638 alc_set_pin_output(codec, nid, pin_type); 4639 /* need the manual connection? */ 4640 if (alc880_is_multi_pin(nid)) { 4641 struct alc_spec *spec = codec->spec; 4642 int idx = alc880_multi_pin_idx(nid); 4643 snd_hda_codec_write(codec, alc880_idx_to_selector(idx), 0, 4644 AC_VERB_SET_CONNECT_SEL, 4645 alc880_dac_to_idx(spec->multiout.dac_nids[dac_idx])); 4646 } 4647 } 4648 4649 static int get_pin_type(int line_out_type) 4650 { 4651 if (line_out_type == AUTO_PIN_HP_OUT) 4652 return PIN_HP; 4653 else 4654 return PIN_OUT; 4655 } 4656 4657 static void alc880_auto_init_multi_out(struct hda_codec *codec) 4658 { 4659 struct alc_spec *spec = codec->spec; 4660 int i; 4661 4662 for (i = 0; i < spec->autocfg.line_outs; i++) { 4663 hda_nid_t nid = spec->autocfg.line_out_pins[i]; 4664 int pin_type = get_pin_type(spec->autocfg.line_out_type); 4665 alc880_auto_set_output_and_unmute(codec, nid, pin_type, i); 4666 } 4667 } 4668 4669 static void alc880_auto_init_extra_out(struct hda_codec *codec) 4670 { 4671 struct alc_spec *spec = codec->spec; 4672 hda_nid_t pin; 4673 4674 pin = spec->autocfg.speaker_pins[0]; 4675 if (pin) /* connect to front */ 4676 alc880_auto_set_output_and_unmute(codec, pin, PIN_OUT, 0); 4677 pin = spec->autocfg.hp_pins[0]; 4678 if (pin) /* connect to front */ 4679 alc880_auto_set_output_and_unmute(codec, pin, PIN_HP, 0); 4680 } 4681 4682 static void alc880_auto_init_analog_input(struct hda_codec *codec) 4683 { 4684 struct alc_spec *spec = codec->spec; 4685 int i; 4686 4687 for (i = 0; i < AUTO_PIN_LAST; i++) { 4688 hda_nid_t nid = spec->autocfg.input_pins[i]; 4689 if (alc_is_input_pin(codec, nid)) { 4690 alc_set_input_pin(codec, nid, i); 4691 if (nid != ALC880_PIN_CD_NID && 4692 (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP)) 4693 snd_hda_codec_write(codec, nid, 0, 4694 AC_VERB_SET_AMP_GAIN_MUTE, 4695 AMP_OUT_MUTE); 4696 } 4697 } 4698 } 4699 4700 /* parse the BIOS configuration and set up the alc_spec */ 4701 /* return 1 if successful, 0 if the proper config is not found, 4702 * or a negative error code 4703 */ 4704 static int alc880_parse_auto_config(struct hda_codec *codec) 4705 { 4706 struct alc_spec *spec = codec->spec; 4707 int i, err; 4708 static hda_nid_t alc880_ignore[] = { 0x1d, 0 }; 4709 4710 err = snd_hda_parse_pin_def_config(codec, &spec->autocfg, 4711 alc880_ignore); 4712 if (err < 0) 4713 return err; 4714 if (!spec->autocfg.line_outs) 4715 return 0; /* can't find valid BIOS pin config */ 4716 4717 err = alc880_auto_fill_dac_nids(spec, &spec->autocfg); 4718 if (err < 0) 4719 return err; 4720 err = alc880_auto_create_multi_out_ctls(spec, &spec->autocfg); 4721 if (err < 0) 4722 return err; 4723 err = alc880_auto_create_extra_out(spec, 4724 spec->autocfg.speaker_pins[0], 4725 "Speaker"); 4726 if (err < 0) 4727 return err; 4728 err = alc880_auto_create_extra_out(spec, spec->autocfg.hp_pins[0], 4729 "Headphone"); 4730 if (err < 0) 4731 return err; 4732 err = alc880_auto_create_input_ctls(codec, &spec->autocfg); 4733 if (err < 0) 4734 return err; 4735 4736 spec->multiout.max_channels = spec->multiout.num_dacs * 2; 4737 4738 /* check multiple SPDIF-out (for recent codecs) */ 4739 for (i = 0; i < spec->autocfg.dig_outs; i++) { 4740 hda_nid_t dig_nid; 4741 err = snd_hda_get_connections(codec, 4742 spec->autocfg.dig_out_pins[i], 4743 &dig_nid, 1); 4744 if (err < 0) 4745 continue; 4746 if (!i) 4747 spec->multiout.dig_out_nid = dig_nid; 4748 else { 4749 spec->multiout.slave_dig_outs = spec->slave_dig_outs; 4750 if (i >= ARRAY_SIZE(spec->slave_dig_outs) - 1) 4751 break; 4752 spec->slave_dig_outs[i - 1] = dig_nid; 4753 } 4754 } 4755 if (spec->autocfg.dig_in_pin) 4756 spec->dig_in_nid = ALC880_DIGIN_NID; 4757 4758 if (spec->kctls.list) 4759 add_mixer(spec, spec->kctls.list); 4760 4761 add_verb(spec, alc880_volume_init_verbs); 4762 4763 spec->num_mux_defs = 1; 4764 spec->input_mux = &spec->private_imux[0]; 4765 4766 alc_ssid_check(codec, 0x15, 0x1b, 0x14); 4767 4768 return 1; 4769 } 4770 4771 /* additional initialization for auto-configuration model */ 4772 static void alc880_auto_init(struct hda_codec *codec) 4773 { 4774 struct alc_spec *spec = codec->spec; 4775 alc880_auto_init_multi_out(codec); 4776 alc880_auto_init_extra_out(codec); 4777 alc880_auto_init_analog_input(codec); 4778 if (spec->unsol_event) 4779 alc_inithook(codec); 4780 } 4781 4782 /* check the ADC/MUX contains all input pins; some ADC/MUX contains only 4783 * one of two digital mic pins, e.g. on ALC272 4784 */ 4785 static void fixup_automic_adc(struct hda_codec *codec) 4786 { 4787 struct alc_spec *spec = codec->spec; 4788 int i; 4789 4790 for (i = 0; i < spec->num_adc_nids; i++) { 4791 hda_nid_t cap = spec->capsrc_nids ? 4792 spec->capsrc_nids[i] : spec->adc_nids[i]; 4793 int iidx, eidx; 4794 4795 iidx = get_connection_index(codec, cap, spec->int_mic.pin); 4796 if (iidx < 0) 4797 continue; 4798 eidx = get_connection_index(codec, cap, spec->ext_mic.pin); 4799 if (eidx < 0) 4800 continue; 4801 spec->int_mic.mux_idx = iidx; 4802 spec->ext_mic.mux_idx = eidx; 4803 if (spec->capsrc_nids) 4804 spec->capsrc_nids += i; 4805 spec->adc_nids += i; 4806 spec->num_adc_nids = 1; 4807 return; 4808 } 4809 snd_printd(KERN_INFO "hda_codec: %s: " 4810 "No ADC/MUX containing both 0x%x and 0x%x pins\n", 4811 codec->chip_name, spec->int_mic.pin, spec->ext_mic.pin); 4812 spec->auto_mic = 0; /* disable auto-mic to be sure */ 4813 } 4814 4815 static void set_capture_mixer(struct hda_codec *codec) 4816 { 4817 struct alc_spec *spec = codec->spec; 4818 static struct snd_kcontrol_new *caps[2][3] = { 4819 { alc_capture_mixer_nosrc1, 4820 alc_capture_mixer_nosrc2, 4821 alc_capture_mixer_nosrc3 }, 4822 { alc_capture_mixer1, 4823 alc_capture_mixer2, 4824 alc_capture_mixer3 }, 4825 }; 4826 if (spec->num_adc_nids > 0 && spec->num_adc_nids <= 3) { 4827 int mux; 4828 if (spec->auto_mic) { 4829 mux = 0; 4830 fixup_automic_adc(codec); 4831 } else if (spec->input_mux && spec->input_mux->num_items > 1) 4832 mux = 1; 4833 else 4834 mux = 0; 4835 spec->cap_mixer = caps[mux][spec->num_adc_nids - 1]; 4836 } 4837 } 4838 4839 #ifdef CONFIG_SND_HDA_INPUT_BEEP 4840 #define set_beep_amp(spec, nid, idx, dir) \ 4841 ((spec)->beep_amp = HDA_COMPOSE_AMP_VAL(nid, 3, idx, dir)) 4842 #else 4843 #define set_beep_amp(spec, nid, idx, dir) /* NOP */ 4844 #endif 4845 4846 /* 4847 * OK, here we have finally the patch for ALC880 4848 */ 4849 4850 static int patch_alc880(struct hda_codec *codec) 4851 { 4852 struct alc_spec *spec; 4853 int board_config; 4854 int err; 4855 4856 spec = kzalloc(sizeof(*spec), GFP_KERNEL); 4857 if (spec == NULL) 4858 return -ENOMEM; 4859 4860 codec->spec = spec; 4861 4862 board_config = snd_hda_check_board_config(codec, ALC880_MODEL_LAST, 4863 alc880_models, 4864 alc880_cfg_tbl); 4865 if (board_config < 0) { 4866 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n", 4867 codec->chip_name); 4868 board_config = ALC880_AUTO; 4869 } 4870 4871 if (board_config == ALC880_AUTO) { 4872 /* automatic parse from the BIOS config */ 4873 err = alc880_parse_auto_config(codec); 4874 if (err < 0) { 4875 alc_free(codec); 4876 return err; 4877 } else if (!err) { 4878 printk(KERN_INFO 4879 "hda_codec: Cannot set up configuration " 4880 "from BIOS. Using 3-stack mode...\n"); 4881 board_config = ALC880_3ST; 4882 } 4883 } 4884 4885 err = snd_hda_attach_beep_device(codec, 0x1); 4886 if (err < 0) { 4887 alc_free(codec); 4888 return err; 4889 } 4890 4891 if (board_config != ALC880_AUTO) 4892 setup_preset(codec, &alc880_presets[board_config]); 4893 4894 spec->stream_analog_playback = &alc880_pcm_analog_playback; 4895 spec->stream_analog_capture = &alc880_pcm_analog_capture; 4896 spec->stream_analog_alt_capture = &alc880_pcm_analog_alt_capture; 4897 4898 spec->stream_digital_playback = &alc880_pcm_digital_playback; 4899 spec->stream_digital_capture = &alc880_pcm_digital_capture; 4900 4901 if (!spec->adc_nids && spec->input_mux) { 4902 /* check whether NID 0x07 is valid */ 4903 unsigned int wcap = get_wcaps(codec, alc880_adc_nids[0]); 4904 /* get type */ 4905 wcap = get_wcaps_type(wcap); 4906 if (wcap != AC_WID_AUD_IN) { 4907 spec->adc_nids = alc880_adc_nids_alt; 4908 spec->num_adc_nids = ARRAY_SIZE(alc880_adc_nids_alt); 4909 } else { 4910 spec->adc_nids = alc880_adc_nids; 4911 spec->num_adc_nids = ARRAY_SIZE(alc880_adc_nids); 4912 } 4913 } 4914 set_capture_mixer(codec); 4915 set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT); 4916 4917 spec->vmaster_nid = 0x0c; 4918 4919 codec->patch_ops = alc_patch_ops; 4920 if (board_config == ALC880_AUTO) 4921 spec->init_hook = alc880_auto_init; 4922 #ifdef CONFIG_SND_HDA_POWER_SAVE 4923 if (!spec->loopback.amplist) 4924 spec->loopback.amplist = alc880_loopbacks; 4925 #endif 4926 codec->proc_widget_hook = print_realtek_coef; 4927 4928 return 0; 4929 } 4930 4931 4932 /* 4933 * ALC260 support 4934 */ 4935 4936 static hda_nid_t alc260_dac_nids[1] = { 4937 /* front */ 4938 0x02, 4939 }; 4940 4941 static hda_nid_t alc260_adc_nids[1] = { 4942 /* ADC0 */ 4943 0x04, 4944 }; 4945 4946 static hda_nid_t alc260_adc_nids_alt[1] = { 4947 /* ADC1 */ 4948 0x05, 4949 }; 4950 4951 /* NIDs used when simultaneous access to both ADCs makes sense. Note that 4952 * alc260_capture_mixer assumes ADC0 (nid 0x04) is the first ADC. 4953 */ 4954 static hda_nid_t alc260_dual_adc_nids[2] = { 4955 /* ADC0, ADC1 */ 4956 0x04, 0x05 4957 }; 4958 4959 #define ALC260_DIGOUT_NID 0x03 4960 #define ALC260_DIGIN_NID 0x06 4961 4962 static struct hda_input_mux alc260_capture_source = { 4963 .num_items = 4, 4964 .items = { 4965 { "Mic", 0x0 }, 4966 { "Front Mic", 0x1 }, 4967 { "Line", 0x2 }, 4968 { "CD", 0x4 }, 4969 }, 4970 }; 4971 4972 /* On Fujitsu S702x laptops capture only makes sense from Mic/LineIn jack, 4973 * headphone jack and the internal CD lines since these are the only pins at 4974 * which audio can appear. For flexibility, also allow the option of 4975 * recording the mixer output on the second ADC (ADC0 doesn't have a 4976 * connection to the mixer output). 4977 */ 4978 static struct hda_input_mux alc260_fujitsu_capture_sources[2] = { 4979 { 4980 .num_items = 3, 4981 .items = { 4982 { "Mic/Line", 0x0 }, 4983 { "CD", 0x4 }, 4984 { "Headphone", 0x2 }, 4985 }, 4986 }, 4987 { 4988 .num_items = 4, 4989 .items = { 4990 { "Mic/Line", 0x0 }, 4991 { "CD", 0x4 }, 4992 { "Headphone", 0x2 }, 4993 { "Mixer", 0x5 }, 4994 }, 4995 }, 4996 4997 }; 4998 4999 /* Acer TravelMate(/Extensa/Aspire) notebooks have similar configuration to 5000 * the Fujitsu S702x, but jacks are marked differently. 5001 */ 5002 static struct hda_input_mux alc260_acer_capture_sources[2] = { 5003 { 5004 .num_items = 4, 5005 .items = { 5006 { "Mic", 0x0 }, 5007 { "Line", 0x2 }, 5008 { "CD", 0x4 }, 5009 { "Headphone", 0x5 }, 5010 }, 5011 }, 5012 { 5013 .num_items = 5, 5014 .items = { 5015 { "Mic", 0x0 }, 5016 { "Line", 0x2 }, 5017 { "CD", 0x4 }, 5018 { "Headphone", 0x6 }, 5019 { "Mixer", 0x5 }, 5020 }, 5021 }, 5022 }; 5023 5024 /* Maxdata Favorit 100XS */ 5025 static struct hda_input_mux alc260_favorit100_capture_sources[2] = { 5026 { 5027 .num_items = 2, 5028 .items = { 5029 { "Line/Mic", 0x0 }, 5030 { "CD", 0x4 }, 5031 }, 5032 }, 5033 { 5034 .num_items = 3, 5035 .items = { 5036 { "Line/Mic", 0x0 }, 5037 { "CD", 0x4 }, 5038 { "Mixer", 0x5 }, 5039 }, 5040 }, 5041 }; 5042 5043 /* 5044 * This is just place-holder, so there's something for alc_build_pcms to look 5045 * at when it calculates the maximum number of channels. ALC260 has no mixer 5046 * element which allows changing the channel mode, so the verb list is 5047 * never used. 5048 */ 5049 static struct hda_channel_mode alc260_modes[1] = { 5050 { 2, NULL }, 5051 }; 5052 5053 5054 /* Mixer combinations 5055 * 5056 * basic: base_output + input + pc_beep + capture 5057 * HP: base_output + input + capture_alt 5058 * HP_3013: hp_3013 + input + capture 5059 * fujitsu: fujitsu + capture 5060 * acer: acer + capture 5061 */ 5062 5063 static struct snd_kcontrol_new alc260_base_output_mixer[] = { 5064 HDA_CODEC_VOLUME("Front Playback Volume", 0x08, 0x0, HDA_OUTPUT), 5065 HDA_BIND_MUTE("Front Playback Switch", 0x08, 2, HDA_INPUT), 5066 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x09, 0x0, HDA_OUTPUT), 5067 HDA_BIND_MUTE("Headphone Playback Switch", 0x09, 2, HDA_INPUT), 5068 HDA_CODEC_VOLUME_MONO("Mono Playback Volume", 0x0a, 1, 0x0, HDA_OUTPUT), 5069 HDA_BIND_MUTE_MONO("Mono Playback Switch", 0x0a, 1, 2, HDA_INPUT), 5070 { } /* end */ 5071 }; 5072 5073 static struct snd_kcontrol_new alc260_input_mixer[] = { 5074 HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT), 5075 HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT), 5076 HDA_CODEC_VOLUME("Line Playback Volume", 0x07, 0x02, HDA_INPUT), 5077 HDA_CODEC_MUTE("Line Playback Switch", 0x07, 0x02, HDA_INPUT), 5078 HDA_CODEC_VOLUME("Mic Playback Volume", 0x07, 0x0, HDA_INPUT), 5079 HDA_CODEC_MUTE("Mic Playback Switch", 0x07, 0x0, HDA_INPUT), 5080 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x07, 0x01, HDA_INPUT), 5081 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x07, 0x01, HDA_INPUT), 5082 { } /* end */ 5083 }; 5084 5085 /* update HP, line and mono out pins according to the master switch */ 5086 static void alc260_hp_master_update(struct hda_codec *codec, 5087 hda_nid_t hp, hda_nid_t line, 5088 hda_nid_t mono) 5089 { 5090 struct alc_spec *spec = codec->spec; 5091 unsigned int val = spec->master_sw ? PIN_HP : 0; 5092 /* change HP and line-out pins */ 5093 snd_hda_codec_write(codec, hp, 0, AC_VERB_SET_PIN_WIDGET_CONTROL, 5094 val); 5095 snd_hda_codec_write(codec, line, 0, AC_VERB_SET_PIN_WIDGET_CONTROL, 5096 val); 5097 /* mono (speaker) depending on the HP jack sense */ 5098 val = (val && !spec->jack_present) ? PIN_OUT : 0; 5099 snd_hda_codec_write(codec, mono, 0, AC_VERB_SET_PIN_WIDGET_CONTROL, 5100 val); 5101 } 5102 5103 static int alc260_hp_master_sw_get(struct snd_kcontrol *kcontrol, 5104 struct snd_ctl_elem_value *ucontrol) 5105 { 5106 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 5107 struct alc_spec *spec = codec->spec; 5108 *ucontrol->value.integer.value = spec->master_sw; 5109 return 0; 5110 } 5111 5112 static int alc260_hp_master_sw_put(struct snd_kcontrol *kcontrol, 5113 struct snd_ctl_elem_value *ucontrol) 5114 { 5115 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 5116 struct alc_spec *spec = codec->spec; 5117 int val = !!*ucontrol->value.integer.value; 5118 hda_nid_t hp, line, mono; 5119 5120 if (val == spec->master_sw) 5121 return 0; 5122 spec->master_sw = val; 5123 hp = (kcontrol->private_value >> 16) & 0xff; 5124 line = (kcontrol->private_value >> 8) & 0xff; 5125 mono = kcontrol->private_value & 0xff; 5126 alc260_hp_master_update(codec, hp, line, mono); 5127 return 1; 5128 } 5129 5130 static struct snd_kcontrol_new alc260_hp_output_mixer[] = { 5131 { 5132 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 5133 .name = "Master Playback Switch", 5134 .info = snd_ctl_boolean_mono_info, 5135 .get = alc260_hp_master_sw_get, 5136 .put = alc260_hp_master_sw_put, 5137 .private_value = (0x0f << 16) | (0x10 << 8) | 0x11 5138 }, 5139 HDA_CODEC_VOLUME("Front Playback Volume", 0x08, 0x0, HDA_OUTPUT), 5140 HDA_BIND_MUTE("Front Playback Switch", 0x08, 2, HDA_INPUT), 5141 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x09, 0x0, HDA_OUTPUT), 5142 HDA_BIND_MUTE("Headphone Playback Switch", 0x09, 2, HDA_INPUT), 5143 HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0a, 1, 0x0, 5144 HDA_OUTPUT), 5145 HDA_BIND_MUTE_MONO("Speaker Playback Switch", 0x0a, 1, 2, HDA_INPUT), 5146 { } /* end */ 5147 }; 5148 5149 static struct hda_verb alc260_hp_unsol_verbs[] = { 5150 {0x10, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT}, 5151 {}, 5152 }; 5153 5154 static void alc260_hp_automute(struct hda_codec *codec) 5155 { 5156 struct alc_spec *spec = codec->spec; 5157 5158 spec->jack_present = snd_hda_jack_detect(codec, 0x10); 5159 alc260_hp_master_update(codec, 0x0f, 0x10, 0x11); 5160 } 5161 5162 static void alc260_hp_unsol_event(struct hda_codec *codec, unsigned int res) 5163 { 5164 if ((res >> 26) == ALC880_HP_EVENT) 5165 alc260_hp_automute(codec); 5166 } 5167 5168 static struct snd_kcontrol_new alc260_hp_3013_mixer[] = { 5169 { 5170 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 5171 .name = "Master Playback Switch", 5172 .info = snd_ctl_boolean_mono_info, 5173 .get = alc260_hp_master_sw_get, 5174 .put = alc260_hp_master_sw_put, 5175 .private_value = (0x15 << 16) | (0x10 << 8) | 0x11 5176 }, 5177 HDA_CODEC_VOLUME("Front Playback Volume", 0x09, 0x0, HDA_OUTPUT), 5178 HDA_CODEC_MUTE("Front Playback Switch", 0x10, 0x0, HDA_OUTPUT), 5179 HDA_CODEC_VOLUME("Aux-In Playback Volume", 0x07, 0x06, HDA_INPUT), 5180 HDA_CODEC_MUTE("Aux-In Playback Switch", 0x07, 0x06, HDA_INPUT), 5181 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x08, 0x0, HDA_OUTPUT), 5182 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT), 5183 HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0a, 1, 0x0, HDA_OUTPUT), 5184 HDA_CODEC_MUTE_MONO("Speaker Playback Switch", 0x11, 1, 0x0, HDA_OUTPUT), 5185 { } /* end */ 5186 }; 5187 5188 static struct hda_bind_ctls alc260_dc7600_bind_master_vol = { 5189 .ops = &snd_hda_bind_vol, 5190 .values = { 5191 HDA_COMPOSE_AMP_VAL(0x08, 3, 0, HDA_OUTPUT), 5192 HDA_COMPOSE_AMP_VAL(0x09, 3, 0, HDA_OUTPUT), 5193 HDA_COMPOSE_AMP_VAL(0x0a, 3, 0, HDA_OUTPUT), 5194 0 5195 }, 5196 }; 5197 5198 static struct hda_bind_ctls alc260_dc7600_bind_switch = { 5199 .ops = &snd_hda_bind_sw, 5200 .values = { 5201 HDA_COMPOSE_AMP_VAL(0x11, 3, 0, HDA_OUTPUT), 5202 HDA_COMPOSE_AMP_VAL(0x15, 3, 0, HDA_OUTPUT), 5203 0 5204 }, 5205 }; 5206 5207 static struct snd_kcontrol_new alc260_hp_dc7600_mixer[] = { 5208 HDA_BIND_VOL("Master Playback Volume", &alc260_dc7600_bind_master_vol), 5209 HDA_BIND_SW("LineOut Playback Switch", &alc260_dc7600_bind_switch), 5210 HDA_CODEC_MUTE("Speaker Playback Switch", 0x0f, 0x0, HDA_OUTPUT), 5211 HDA_CODEC_MUTE("Headphone Playback Switch", 0x10, 0x0, HDA_OUTPUT), 5212 { } /* end */ 5213 }; 5214 5215 static struct hda_verb alc260_hp_3013_unsol_verbs[] = { 5216 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT}, 5217 {}, 5218 }; 5219 5220 static void alc260_hp_3013_automute(struct hda_codec *codec) 5221 { 5222 struct alc_spec *spec = codec->spec; 5223 5224 spec->jack_present = snd_hda_jack_detect(codec, 0x15); 5225 alc260_hp_master_update(codec, 0x15, 0x10, 0x11); 5226 } 5227 5228 static void alc260_hp_3013_unsol_event(struct hda_codec *codec, 5229 unsigned int res) 5230 { 5231 if ((res >> 26) == ALC880_HP_EVENT) 5232 alc260_hp_3013_automute(codec); 5233 } 5234 5235 static void alc260_hp_3012_automute(struct hda_codec *codec) 5236 { 5237 unsigned int bits = snd_hda_jack_detect(codec, 0x10) ? 0 : PIN_OUT; 5238 5239 snd_hda_codec_write(codec, 0x0f, 0, AC_VERB_SET_PIN_WIDGET_CONTROL, 5240 bits); 5241 snd_hda_codec_write(codec, 0x11, 0, AC_VERB_SET_PIN_WIDGET_CONTROL, 5242 bits); 5243 snd_hda_codec_write(codec, 0x15, 0, AC_VERB_SET_PIN_WIDGET_CONTROL, 5244 bits); 5245 } 5246 5247 static void alc260_hp_3012_unsol_event(struct hda_codec *codec, 5248 unsigned int res) 5249 { 5250 if ((res >> 26) == ALC880_HP_EVENT) 5251 alc260_hp_3012_automute(codec); 5252 } 5253 5254 /* Fujitsu S702x series laptops. ALC260 pin usage: Mic/Line jack = 0x12, 5255 * HP jack = 0x14, CD audio = 0x16, internal speaker = 0x10. 5256 */ 5257 static struct snd_kcontrol_new alc260_fujitsu_mixer[] = { 5258 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x08, 0x0, HDA_OUTPUT), 5259 HDA_BIND_MUTE("Headphone Playback Switch", 0x08, 2, HDA_INPUT), 5260 ALC_PIN_MODE("Headphone Jack Mode", 0x14, ALC_PIN_DIR_INOUT), 5261 HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT), 5262 HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT), 5263 HDA_CODEC_VOLUME("Mic/Line Playback Volume", 0x07, 0x0, HDA_INPUT), 5264 HDA_CODEC_MUTE("Mic/Line Playback Switch", 0x07, 0x0, HDA_INPUT), 5265 ALC_PIN_MODE("Mic/Line Jack Mode", 0x12, ALC_PIN_DIR_IN), 5266 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x09, 0x0, HDA_OUTPUT), 5267 HDA_BIND_MUTE("Speaker Playback Switch", 0x09, 2, HDA_INPUT), 5268 { } /* end */ 5269 }; 5270 5271 /* Mixer for Acer TravelMate(/Extensa/Aspire) notebooks. Note that current 5272 * versions of the ALC260 don't act on requests to enable mic bias from NID 5273 * 0x0f (used to drive the headphone jack in these laptops). The ALC260 5274 * datasheet doesn't mention this restriction. At this stage it's not clear 5275 * whether this behaviour is intentional or is a hardware bug in chip 5276 * revisions available in early 2006. Therefore for now allow the 5277 * "Headphone Jack Mode" control to span all choices, but if it turns out 5278 * that the lack of mic bias for this NID is intentional we could change the 5279 * mode from ALC_PIN_DIR_INOUT to ALC_PIN_DIR_INOUT_NOMICBIAS. 5280 * 5281 * In addition, Acer TravelMate(/Extensa/Aspire) notebooks in early 2006 5282 * don't appear to make the mic bias available from the "line" jack, even 5283 * though the NID used for this jack (0x14) can supply it. The theory is 5284 * that perhaps Acer have included blocking capacitors between the ALC260 5285 * and the output jack. If this turns out to be the case for all such 5286 * models the "Line Jack Mode" mode could be changed from ALC_PIN_DIR_INOUT 5287 * to ALC_PIN_DIR_INOUT_NOMICBIAS. 5288 * 5289 * The C20x Tablet series have a mono internal speaker which is controlled 5290 * via the chip's Mono sum widget and pin complex, so include the necessary 5291 * controls for such models. On models without a "mono speaker" the control 5292 * won't do anything. 5293 */ 5294 static struct snd_kcontrol_new alc260_acer_mixer[] = { 5295 HDA_CODEC_VOLUME("Master Playback Volume", 0x08, 0x0, HDA_OUTPUT), 5296 HDA_BIND_MUTE("Master Playback Switch", 0x08, 2, HDA_INPUT), 5297 ALC_PIN_MODE("Headphone Jack Mode", 0x0f, ALC_PIN_DIR_INOUT), 5298 HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0a, 1, 0x0, 5299 HDA_OUTPUT), 5300 HDA_BIND_MUTE_MONO("Speaker Playback Switch", 0x0a, 1, 2, 5301 HDA_INPUT), 5302 HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT), 5303 HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT), 5304 HDA_CODEC_VOLUME("Mic Playback Volume", 0x07, 0x0, HDA_INPUT), 5305 HDA_CODEC_MUTE("Mic Playback Switch", 0x07, 0x0, HDA_INPUT), 5306 ALC_PIN_MODE("Mic Jack Mode", 0x12, ALC_PIN_DIR_IN), 5307 HDA_CODEC_VOLUME("Line Playback Volume", 0x07, 0x02, HDA_INPUT), 5308 HDA_CODEC_MUTE("Line Playback Switch", 0x07, 0x02, HDA_INPUT), 5309 ALC_PIN_MODE("Line Jack Mode", 0x14, ALC_PIN_DIR_INOUT), 5310 { } /* end */ 5311 }; 5312 5313 /* Maxdata Favorit 100XS: one output and one input (0x12) jack 5314 */ 5315 static struct snd_kcontrol_new alc260_favorit100_mixer[] = { 5316 HDA_CODEC_VOLUME("Master Playback Volume", 0x08, 0x0, HDA_OUTPUT), 5317 HDA_BIND_MUTE("Master Playback Switch", 0x08, 2, HDA_INPUT), 5318 ALC_PIN_MODE("Output Jack Mode", 0x0f, ALC_PIN_DIR_INOUT), 5319 HDA_CODEC_VOLUME("Line/Mic Playback Volume", 0x07, 0x0, HDA_INPUT), 5320 HDA_CODEC_MUTE("Line/Mic Playback Switch", 0x07, 0x0, HDA_INPUT), 5321 ALC_PIN_MODE("Line/Mic Jack Mode", 0x12, ALC_PIN_DIR_IN), 5322 { } /* end */ 5323 }; 5324 5325 /* Packard bell V7900 ALC260 pin usage: HP = 0x0f, Mic jack = 0x12, 5326 * Line In jack = 0x14, CD audio = 0x16, pc beep = 0x17. 5327 */ 5328 static struct snd_kcontrol_new alc260_will_mixer[] = { 5329 HDA_CODEC_VOLUME("Master Playback Volume", 0x08, 0x0, HDA_OUTPUT), 5330 HDA_BIND_MUTE("Master Playback Switch", 0x08, 0x2, HDA_INPUT), 5331 HDA_CODEC_VOLUME("Mic Playback Volume", 0x07, 0x0, HDA_INPUT), 5332 HDA_CODEC_MUTE("Mic Playback Switch", 0x07, 0x0, HDA_INPUT), 5333 ALC_PIN_MODE("Mic Jack Mode", 0x12, ALC_PIN_DIR_IN), 5334 HDA_CODEC_VOLUME("Line Playback Volume", 0x07, 0x02, HDA_INPUT), 5335 HDA_CODEC_MUTE("Line Playback Switch", 0x07, 0x02, HDA_INPUT), 5336 ALC_PIN_MODE("Line Jack Mode", 0x14, ALC_PIN_DIR_INOUT), 5337 HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT), 5338 HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT), 5339 { } /* end */ 5340 }; 5341 5342 /* Replacer 672V ALC260 pin usage: Mic jack = 0x12, 5343 * Line In jack = 0x14, ATAPI Mic = 0x13, speaker = 0x0f. 5344 */ 5345 static struct snd_kcontrol_new alc260_replacer_672v_mixer[] = { 5346 HDA_CODEC_VOLUME("Master Playback Volume", 0x08, 0x0, HDA_OUTPUT), 5347 HDA_BIND_MUTE("Master Playback Switch", 0x08, 0x2, HDA_INPUT), 5348 HDA_CODEC_VOLUME("Mic Playback Volume", 0x07, 0x0, HDA_INPUT), 5349 HDA_CODEC_MUTE("Mic Playback Switch", 0x07, 0x0, HDA_INPUT), 5350 ALC_PIN_MODE("Mic Jack Mode", 0x12, ALC_PIN_DIR_IN), 5351 HDA_CODEC_VOLUME("ATAPI Mic Playback Volume", 0x07, 0x1, HDA_INPUT), 5352 HDA_CODEC_MUTE("ATATI Mic Playback Switch", 0x07, 0x1, HDA_INPUT), 5353 HDA_CODEC_VOLUME("Line Playback Volume", 0x07, 0x02, HDA_INPUT), 5354 HDA_CODEC_MUTE("Line Playback Switch", 0x07, 0x02, HDA_INPUT), 5355 ALC_PIN_MODE("Line Jack Mode", 0x14, ALC_PIN_DIR_INOUT), 5356 { } /* end */ 5357 }; 5358 5359 /* 5360 * initialization verbs 5361 */ 5362 static struct hda_verb alc260_init_verbs[] = { 5363 /* Line In pin widget for input */ 5364 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 5365 /* CD pin widget for input */ 5366 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 5367 /* Mic1 (rear panel) pin widget for input and vref at 80% */ 5368 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, 5369 /* Mic2 (front panel) pin widget for input and vref at 80% */ 5370 {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, 5371 /* LINE-2 is used for line-out in rear */ 5372 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 5373 /* select line-out */ 5374 {0x0e, AC_VERB_SET_CONNECT_SEL, 0x00}, 5375 /* LINE-OUT pin */ 5376 {0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 5377 /* enable HP */ 5378 {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 5379 /* enable Mono */ 5380 {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 5381 /* mute capture amp left and right */ 5382 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 5383 /* set connection select to line in (default select for this ADC) */ 5384 {0x04, AC_VERB_SET_CONNECT_SEL, 0x02}, 5385 /* mute capture amp left and right */ 5386 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 5387 /* set connection select to line in (default select for this ADC) */ 5388 {0x05, AC_VERB_SET_CONNECT_SEL, 0x02}, 5389 /* set vol=0 Line-Out mixer amp left and right */ 5390 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 5391 /* unmute pin widget amp left and right (no gain on this amp) */ 5392 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 5393 /* set vol=0 HP mixer amp left and right */ 5394 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 5395 /* unmute pin widget amp left and right (no gain on this amp) */ 5396 {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 5397 /* set vol=0 Mono mixer amp left and right */ 5398 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 5399 /* unmute pin widget amp left and right (no gain on this amp) */ 5400 {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 5401 /* unmute LINE-2 out pin */ 5402 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 5403 /* Amp Indexes: CD = 0x04, Line In 1 = 0x02, Mic 1 = 0x00 & 5404 * Line In 2 = 0x03 5405 */ 5406 /* mute analog inputs */ 5407 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 5408 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 5409 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, 5410 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, 5411 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, 5412 /* Amp Indexes: DAC = 0x01 & mixer = 0x00 */ 5413 /* mute Front out path */ 5414 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 5415 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 5416 /* mute Headphone out path */ 5417 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 5418 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 5419 /* mute Mono out path */ 5420 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 5421 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 5422 { } 5423 }; 5424 5425 #if 0 /* should be identical with alc260_init_verbs? */ 5426 static struct hda_verb alc260_hp_init_verbs[] = { 5427 /* Headphone and output */ 5428 {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0}, 5429 /* mono output */ 5430 {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40}, 5431 /* Mic1 (rear panel) pin widget for input and vref at 80% */ 5432 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24}, 5433 /* Mic2 (front panel) pin widget for input and vref at 80% */ 5434 {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24}, 5435 /* Line In pin widget for input */ 5436 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20}, 5437 /* Line-2 pin widget for output */ 5438 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40}, 5439 /* CD pin widget for input */ 5440 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20}, 5441 /* unmute amp left and right */ 5442 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000}, 5443 /* set connection select to line in (default select for this ADC) */ 5444 {0x04, AC_VERB_SET_CONNECT_SEL, 0x02}, 5445 /* unmute Line-Out mixer amp left and right (volume = 0) */ 5446 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000}, 5447 /* mute pin widget amp left and right (no gain on this amp) */ 5448 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000}, 5449 /* unmute HP mixer amp left and right (volume = 0) */ 5450 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000}, 5451 /* mute pin widget amp left and right (no gain on this amp) */ 5452 {0x10, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000}, 5453 /* Amp Indexes: CD = 0x04, Line In 1 = 0x02, Mic 1 = 0x00 & 5454 * Line In 2 = 0x03 5455 */ 5456 /* mute analog inputs */ 5457 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 5458 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 5459 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, 5460 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, 5461 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, 5462 /* Amp Indexes: DAC = 0x01 & mixer = 0x00 */ 5463 /* Unmute Front out path */ 5464 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))}, 5465 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))}, 5466 /* Unmute Headphone out path */ 5467 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))}, 5468 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))}, 5469 /* Unmute Mono out path */ 5470 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))}, 5471 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))}, 5472 { } 5473 }; 5474 #endif 5475 5476 static struct hda_verb alc260_hp_3013_init_verbs[] = { 5477 /* Line out and output */ 5478 {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40}, 5479 /* mono output */ 5480 {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40}, 5481 /* Mic1 (rear panel) pin widget for input and vref at 80% */ 5482 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24}, 5483 /* Mic2 (front panel) pin widget for input and vref at 80% */ 5484 {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24}, 5485 /* Line In pin widget for input */ 5486 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20}, 5487 /* Headphone pin widget for output */ 5488 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0}, 5489 /* CD pin widget for input */ 5490 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20}, 5491 /* unmute amp left and right */ 5492 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000}, 5493 /* set connection select to line in (default select for this ADC) */ 5494 {0x04, AC_VERB_SET_CONNECT_SEL, 0x02}, 5495 /* unmute Line-Out mixer amp left and right (volume = 0) */ 5496 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000}, 5497 /* mute pin widget amp left and right (no gain on this amp) */ 5498 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000}, 5499 /* unmute HP mixer amp left and right (volume = 0) */ 5500 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000}, 5501 /* mute pin widget amp left and right (no gain on this amp) */ 5502 {0x10, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000}, 5503 /* Amp Indexes: CD = 0x04, Line In 1 = 0x02, Mic 1 = 0x00 & 5504 * Line In 2 = 0x03 5505 */ 5506 /* mute analog inputs */ 5507 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 5508 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 5509 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, 5510 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, 5511 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, 5512 /* Amp Indexes: DAC = 0x01 & mixer = 0x00 */ 5513 /* Unmute Front out path */ 5514 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))}, 5515 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))}, 5516 /* Unmute Headphone out path */ 5517 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))}, 5518 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))}, 5519 /* Unmute Mono out path */ 5520 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))}, 5521 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))}, 5522 { } 5523 }; 5524 5525 /* Initialisation sequence for ALC260 as configured in Fujitsu S702x 5526 * laptops. ALC260 pin usage: Mic/Line jack = 0x12, HP jack = 0x14, CD 5527 * audio = 0x16, internal speaker = 0x10. 5528 */ 5529 static struct hda_verb alc260_fujitsu_init_verbs[] = { 5530 /* Disable all GPIOs */ 5531 {0x01, AC_VERB_SET_GPIO_MASK, 0}, 5532 /* Internal speaker is connected to headphone pin */ 5533 {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 5534 /* Headphone/Line-out jack connects to Line1 pin; make it an output */ 5535 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 5536 /* Mic/Line-in jack is connected to mic1 pin, so make it an input */ 5537 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 5538 /* Ensure all other unused pins are disabled and muted. */ 5539 {0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0}, 5540 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 5541 {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0}, 5542 {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 5543 {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, 0}, 5544 {0x13, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 5545 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0}, 5546 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 5547 5548 /* Disable digital (SPDIF) pins */ 5549 {0x03, AC_VERB_SET_DIGI_CONVERT_1, 0}, 5550 {0x06, AC_VERB_SET_DIGI_CONVERT_1, 0}, 5551 5552 /* Ensure Line1 pin widget takes its input from the OUT1 sum bus 5553 * when acting as an output. 5554 */ 5555 {0x0d, AC_VERB_SET_CONNECT_SEL, 0}, 5556 5557 /* Start with output sum widgets muted and their output gains at min */ 5558 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 5559 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 5560 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 5561 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 5562 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 5563 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 5564 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 5565 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 5566 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 5567 5568 /* Unmute HP pin widget amp left and right (no equiv mixer ctrl) */ 5569 {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 5570 /* Unmute Line1 pin widget output buffer since it starts as an output. 5571 * If the pin mode is changed by the user the pin mode control will 5572 * take care of enabling the pin's input/output buffers as needed. 5573 * Therefore there's no need to enable the input buffer at this 5574 * stage. 5575 */ 5576 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 5577 /* Unmute input buffer of pin widget used for Line-in (no equiv 5578 * mixer ctrl) 5579 */ 5580 {0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 5581 5582 /* Mute capture amp left and right */ 5583 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 5584 /* Set ADC connection select to match default mixer setting - line 5585 * in (on mic1 pin) 5586 */ 5587 {0x04, AC_VERB_SET_CONNECT_SEL, 0x00}, 5588 5589 /* Do the same for the second ADC: mute capture input amp and 5590 * set ADC connection to line in (on mic1 pin) 5591 */ 5592 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 5593 {0x05, AC_VERB_SET_CONNECT_SEL, 0x00}, 5594 5595 /* Mute all inputs to mixer widget (even unconnected ones) */ 5596 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, /* mic1 pin */ 5597 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, /* mic2 pin */ 5598 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, /* line1 pin */ 5599 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, /* line2 pin */ 5600 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, /* CD pin */ 5601 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)}, /* Beep-gen pin */ 5602 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)}, /* Line-out pin */ 5603 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)}, /* HP-pin pin */ 5604 5605 { } 5606 }; 5607 5608 /* Initialisation sequence for ALC260 as configured in Acer TravelMate and 5609 * similar laptops (adapted from Fujitsu init verbs). 5610 */ 5611 static struct hda_verb alc260_acer_init_verbs[] = { 5612 /* On TravelMate laptops, GPIO 0 enables the internal speaker and 5613 * the headphone jack. Turn this on and rely on the standard mute 5614 * methods whenever the user wants to turn these outputs off. 5615 */ 5616 {0x01, AC_VERB_SET_GPIO_MASK, 0x01}, 5617 {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01}, 5618 {0x01, AC_VERB_SET_GPIO_DATA, 0x01}, 5619 /* Internal speaker/Headphone jack is connected to Line-out pin */ 5620 {0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 5621 /* Internal microphone/Mic jack is connected to Mic1 pin */ 5622 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50}, 5623 /* Line In jack is connected to Line1 pin */ 5624 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 5625 /* Some Acers (eg: C20x Tablets) use Mono pin for internal speaker */ 5626 {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 5627 /* Ensure all other unused pins are disabled and muted. */ 5628 {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0}, 5629 {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 5630 {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, 0}, 5631 {0x13, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 5632 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0}, 5633 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 5634 /* Disable digital (SPDIF) pins */ 5635 {0x03, AC_VERB_SET_DIGI_CONVERT_1, 0}, 5636 {0x06, AC_VERB_SET_DIGI_CONVERT_1, 0}, 5637 5638 /* Ensure Mic1 and Line1 pin widgets take input from the OUT1 sum 5639 * bus when acting as outputs. 5640 */ 5641 {0x0b, AC_VERB_SET_CONNECT_SEL, 0}, 5642 {0x0d, AC_VERB_SET_CONNECT_SEL, 0}, 5643 5644 /* Start with output sum widgets muted and their output gains at min */ 5645 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 5646 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 5647 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 5648 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 5649 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 5650 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 5651 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 5652 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 5653 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 5654 5655 /* Unmute Line-out pin widget amp left and right 5656 * (no equiv mixer ctrl) 5657 */ 5658 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 5659 /* Unmute mono pin widget amp output (no equiv mixer ctrl) */ 5660 {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 5661 /* Unmute Mic1 and Line1 pin widget input buffers since they start as 5662 * inputs. If the pin mode is changed by the user the pin mode control 5663 * will take care of enabling the pin's input/output buffers as needed. 5664 * Therefore there's no need to enable the input buffer at this 5665 * stage. 5666 */ 5667 {0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 5668 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 5669 5670 /* Mute capture amp left and right */ 5671 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 5672 /* Set ADC connection select to match default mixer setting - mic 5673 * (on mic1 pin) 5674 */ 5675 {0x04, AC_VERB_SET_CONNECT_SEL, 0x00}, 5676 5677 /* Do similar with the second ADC: mute capture input amp and 5678 * set ADC connection to mic to match ALSA's default state. 5679 */ 5680 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 5681 {0x05, AC_VERB_SET_CONNECT_SEL, 0x00}, 5682 5683 /* Mute all inputs to mixer widget (even unconnected ones) */ 5684 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, /* mic1 pin */ 5685 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, /* mic2 pin */ 5686 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, /* line1 pin */ 5687 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, /* line2 pin */ 5688 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, /* CD pin */ 5689 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)}, /* Beep-gen pin */ 5690 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)}, /* Line-out pin */ 5691 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)}, /* HP-pin pin */ 5692 5693 { } 5694 }; 5695 5696 /* Initialisation sequence for Maxdata Favorit 100XS 5697 * (adapted from Acer init verbs). 5698 */ 5699 static struct hda_verb alc260_favorit100_init_verbs[] = { 5700 /* GPIO 0 enables the output jack. 5701 * Turn this on and rely on the standard mute 5702 * methods whenever the user wants to turn these outputs off. 5703 */ 5704 {0x01, AC_VERB_SET_GPIO_MASK, 0x01}, 5705 {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01}, 5706 {0x01, AC_VERB_SET_GPIO_DATA, 0x01}, 5707 /* Line/Mic input jack is connected to Mic1 pin */ 5708 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50}, 5709 /* Ensure all other unused pins are disabled and muted. */ 5710 {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0}, 5711 {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 5712 {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0}, 5713 {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 5714 {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, 0}, 5715 {0x13, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 5716 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0}, 5717 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 5718 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0}, 5719 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 5720 /* Disable digital (SPDIF) pins */ 5721 {0x03, AC_VERB_SET_DIGI_CONVERT_1, 0}, 5722 {0x06, AC_VERB_SET_DIGI_CONVERT_1, 0}, 5723 5724 /* Ensure Mic1 and Line1 pin widgets take input from the OUT1 sum 5725 * bus when acting as outputs. 5726 */ 5727 {0x0b, AC_VERB_SET_CONNECT_SEL, 0}, 5728 {0x0d, AC_VERB_SET_CONNECT_SEL, 0}, 5729 5730 /* Start with output sum widgets muted and their output gains at min */ 5731 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 5732 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 5733 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 5734 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 5735 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 5736 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 5737 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 5738 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 5739 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 5740 5741 /* Unmute Line-out pin widget amp left and right 5742 * (no equiv mixer ctrl) 5743 */ 5744 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 5745 /* Unmute Mic1 and Line1 pin widget input buffers since they start as 5746 * inputs. If the pin mode is changed by the user the pin mode control 5747 * will take care of enabling the pin's input/output buffers as needed. 5748 * Therefore there's no need to enable the input buffer at this 5749 * stage. 5750 */ 5751 {0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 5752 5753 /* Mute capture amp left and right */ 5754 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 5755 /* Set ADC connection select to match default mixer setting - mic 5756 * (on mic1 pin) 5757 */ 5758 {0x04, AC_VERB_SET_CONNECT_SEL, 0x00}, 5759 5760 /* Do similar with the second ADC: mute capture input amp and 5761 * set ADC connection to mic to match ALSA's default state. 5762 */ 5763 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 5764 {0x05, AC_VERB_SET_CONNECT_SEL, 0x00}, 5765 5766 /* Mute all inputs to mixer widget (even unconnected ones) */ 5767 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, /* mic1 pin */ 5768 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, /* mic2 pin */ 5769 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, /* line1 pin */ 5770 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, /* line2 pin */ 5771 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, /* CD pin */ 5772 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)}, /* Beep-gen pin */ 5773 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)}, /* Line-out pin */ 5774 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)}, /* HP-pin pin */ 5775 5776 { } 5777 }; 5778 5779 static struct hda_verb alc260_will_verbs[] = { 5780 {0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 5781 {0x0b, AC_VERB_SET_CONNECT_SEL, 0x00}, 5782 {0x0d, AC_VERB_SET_CONNECT_SEL, 0x00}, 5783 {0x0f, AC_VERB_SET_EAPD_BTLENABLE, 0x02}, 5784 {0x1a, AC_VERB_SET_COEF_INDEX, 0x07}, 5785 {0x1a, AC_VERB_SET_PROC_COEF, 0x3040}, 5786 {} 5787 }; 5788 5789 static struct hda_verb alc260_replacer_672v_verbs[] = { 5790 {0x0f, AC_VERB_SET_EAPD_BTLENABLE, 0x02}, 5791 {0x1a, AC_VERB_SET_COEF_INDEX, 0x07}, 5792 {0x1a, AC_VERB_SET_PROC_COEF, 0x3050}, 5793 5794 {0x01, AC_VERB_SET_GPIO_MASK, 0x01}, 5795 {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01}, 5796 {0x01, AC_VERB_SET_GPIO_DATA, 0x00}, 5797 5798 {0x0f, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT}, 5799 {} 5800 }; 5801 5802 /* toggle speaker-output according to the hp-jack state */ 5803 static void alc260_replacer_672v_automute(struct hda_codec *codec) 5804 { 5805 unsigned int present; 5806 5807 /* speaker --> GPIO Data 0, hp or spdif --> GPIO data 1 */ 5808 present = snd_hda_jack_detect(codec, 0x0f); 5809 if (present) { 5810 snd_hda_codec_write_cache(codec, 0x01, 0, 5811 AC_VERB_SET_GPIO_DATA, 1); 5812 snd_hda_codec_write_cache(codec, 0x0f, 0, 5813 AC_VERB_SET_PIN_WIDGET_CONTROL, 5814 PIN_HP); 5815 } else { 5816 snd_hda_codec_write_cache(codec, 0x01, 0, 5817 AC_VERB_SET_GPIO_DATA, 0); 5818 snd_hda_codec_write_cache(codec, 0x0f, 0, 5819 AC_VERB_SET_PIN_WIDGET_CONTROL, 5820 PIN_OUT); 5821 } 5822 } 5823 5824 static void alc260_replacer_672v_unsol_event(struct hda_codec *codec, 5825 unsigned int res) 5826 { 5827 if ((res >> 26) == ALC880_HP_EVENT) 5828 alc260_replacer_672v_automute(codec); 5829 } 5830 5831 static struct hda_verb alc260_hp_dc7600_verbs[] = { 5832 {0x05, AC_VERB_SET_CONNECT_SEL, 0x01}, 5833 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, 5834 {0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 5835 {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 5836 {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 5837 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 5838 {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, 5839 {0x10, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT}, 5840 {0x11, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT}, 5841 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT}, 5842 {} 5843 }; 5844 5845 /* Test configuration for debugging, modelled after the ALC880 test 5846 * configuration. 5847 */ 5848 #ifdef CONFIG_SND_DEBUG 5849 static hda_nid_t alc260_test_dac_nids[1] = { 5850 0x02, 5851 }; 5852 static hda_nid_t alc260_test_adc_nids[2] = { 5853 0x04, 0x05, 5854 }; 5855 /* For testing the ALC260, each input MUX needs its own definition since 5856 * the signal assignments are different. This assumes that the first ADC 5857 * is NID 0x04. 5858 */ 5859 static struct hda_input_mux alc260_test_capture_sources[2] = { 5860 { 5861 .num_items = 7, 5862 .items = { 5863 { "MIC1 pin", 0x0 }, 5864 { "MIC2 pin", 0x1 }, 5865 { "LINE1 pin", 0x2 }, 5866 { "LINE2 pin", 0x3 }, 5867 { "CD pin", 0x4 }, 5868 { "LINE-OUT pin", 0x5 }, 5869 { "HP-OUT pin", 0x6 }, 5870 }, 5871 }, 5872 { 5873 .num_items = 8, 5874 .items = { 5875 { "MIC1 pin", 0x0 }, 5876 { "MIC2 pin", 0x1 }, 5877 { "LINE1 pin", 0x2 }, 5878 { "LINE2 pin", 0x3 }, 5879 { "CD pin", 0x4 }, 5880 { "Mixer", 0x5 }, 5881 { "LINE-OUT pin", 0x6 }, 5882 { "HP-OUT pin", 0x7 }, 5883 }, 5884 }, 5885 }; 5886 static struct snd_kcontrol_new alc260_test_mixer[] = { 5887 /* Output driver widgets */ 5888 HDA_CODEC_VOLUME_MONO("Mono Playback Volume", 0x0a, 1, 0x0, HDA_OUTPUT), 5889 HDA_BIND_MUTE_MONO("Mono Playback Switch", 0x0a, 1, 2, HDA_INPUT), 5890 HDA_CODEC_VOLUME("LOUT2 Playback Volume", 0x09, 0x0, HDA_OUTPUT), 5891 HDA_BIND_MUTE("LOUT2 Playback Switch", 0x09, 2, HDA_INPUT), 5892 HDA_CODEC_VOLUME("LOUT1 Playback Volume", 0x08, 0x0, HDA_OUTPUT), 5893 HDA_BIND_MUTE("LOUT1 Playback Switch", 0x08, 2, HDA_INPUT), 5894 5895 /* Modes for retasking pin widgets 5896 * Note: the ALC260 doesn't seem to act on requests to enable mic 5897 * bias from NIDs 0x0f and 0x10. The ALC260 datasheet doesn't 5898 * mention this restriction. At this stage it's not clear whether 5899 * this behaviour is intentional or is a hardware bug in chip 5900 * revisions available at least up until early 2006. Therefore for 5901 * now allow the "HP-OUT" and "LINE-OUT" Mode controls to span all 5902 * choices, but if it turns out that the lack of mic bias for these 5903 * NIDs is intentional we could change their modes from 5904 * ALC_PIN_DIR_INOUT to ALC_PIN_DIR_INOUT_NOMICBIAS. 5905 */ 5906 ALC_PIN_MODE("HP-OUT pin mode", 0x10, ALC_PIN_DIR_INOUT), 5907 ALC_PIN_MODE("LINE-OUT pin mode", 0x0f, ALC_PIN_DIR_INOUT), 5908 ALC_PIN_MODE("LINE2 pin mode", 0x15, ALC_PIN_DIR_INOUT), 5909 ALC_PIN_MODE("LINE1 pin mode", 0x14, ALC_PIN_DIR_INOUT), 5910 ALC_PIN_MODE("MIC2 pin mode", 0x13, ALC_PIN_DIR_INOUT), 5911 ALC_PIN_MODE("MIC1 pin mode", 0x12, ALC_PIN_DIR_INOUT), 5912 5913 /* Loopback mixer controls */ 5914 HDA_CODEC_VOLUME("MIC1 Playback Volume", 0x07, 0x00, HDA_INPUT), 5915 HDA_CODEC_MUTE("MIC1 Playback Switch", 0x07, 0x00, HDA_INPUT), 5916 HDA_CODEC_VOLUME("MIC2 Playback Volume", 0x07, 0x01, HDA_INPUT), 5917 HDA_CODEC_MUTE("MIC2 Playback Switch", 0x07, 0x01, HDA_INPUT), 5918 HDA_CODEC_VOLUME("LINE1 Playback Volume", 0x07, 0x02, HDA_INPUT), 5919 HDA_CODEC_MUTE("LINE1 Playback Switch", 0x07, 0x02, HDA_INPUT), 5920 HDA_CODEC_VOLUME("LINE2 Playback Volume", 0x07, 0x03, HDA_INPUT), 5921 HDA_CODEC_MUTE("LINE2 Playback Switch", 0x07, 0x03, HDA_INPUT), 5922 HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT), 5923 HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT), 5924 HDA_CODEC_VOLUME("LINE-OUT loopback Playback Volume", 0x07, 0x06, HDA_INPUT), 5925 HDA_CODEC_MUTE("LINE-OUT loopback Playback Switch", 0x07, 0x06, HDA_INPUT), 5926 HDA_CODEC_VOLUME("HP-OUT loopback Playback Volume", 0x07, 0x7, HDA_INPUT), 5927 HDA_CODEC_MUTE("HP-OUT loopback Playback Switch", 0x07, 0x7, HDA_INPUT), 5928 5929 /* Controls for GPIO pins, assuming they are configured as outputs */ 5930 ALC_GPIO_DATA_SWITCH("GPIO pin 0", 0x01, 0x01), 5931 ALC_GPIO_DATA_SWITCH("GPIO pin 1", 0x01, 0x02), 5932 ALC_GPIO_DATA_SWITCH("GPIO pin 2", 0x01, 0x04), 5933 ALC_GPIO_DATA_SWITCH("GPIO pin 3", 0x01, 0x08), 5934 5935 /* Switches to allow the digital IO pins to be enabled. The datasheet 5936 * is ambigious as to which NID is which; testing on laptops which 5937 * make this output available should provide clarification. 5938 */ 5939 ALC_SPDIF_CTRL_SWITCH("SPDIF Playback Switch", 0x03, 0x01), 5940 ALC_SPDIF_CTRL_SWITCH("SPDIF Capture Switch", 0x06, 0x01), 5941 5942 /* A switch allowing EAPD to be enabled. Some laptops seem to use 5943 * this output to turn on an external amplifier. 5944 */ 5945 ALC_EAPD_CTRL_SWITCH("LINE-OUT EAPD Enable Switch", 0x0f, 0x02), 5946 ALC_EAPD_CTRL_SWITCH("HP-OUT EAPD Enable Switch", 0x10, 0x02), 5947 5948 { } /* end */ 5949 }; 5950 static struct hda_verb alc260_test_init_verbs[] = { 5951 /* Enable all GPIOs as outputs with an initial value of 0 */ 5952 {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x0f}, 5953 {0x01, AC_VERB_SET_GPIO_DATA, 0x00}, 5954 {0x01, AC_VERB_SET_GPIO_MASK, 0x0f}, 5955 5956 /* Enable retasking pins as output, initially without power amp */ 5957 {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 5958 {0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 5959 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 5960 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 5961 {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 5962 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 5963 5964 /* Disable digital (SPDIF) pins initially, but users can enable 5965 * them via a mixer switch. In the case of SPDIF-out, this initverb 5966 * payload also sets the generation to 0, output to be in "consumer" 5967 * PCM format, copyright asserted, no pre-emphasis and no validity 5968 * control. 5969 */ 5970 {0x03, AC_VERB_SET_DIGI_CONVERT_1, 0}, 5971 {0x06, AC_VERB_SET_DIGI_CONVERT_1, 0}, 5972 5973 /* Ensure mic1, mic2, line1 and line2 pin widgets take input from the 5974 * OUT1 sum bus when acting as an output. 5975 */ 5976 {0x0b, AC_VERB_SET_CONNECT_SEL, 0}, 5977 {0x0c, AC_VERB_SET_CONNECT_SEL, 0}, 5978 {0x0d, AC_VERB_SET_CONNECT_SEL, 0}, 5979 {0x0e, AC_VERB_SET_CONNECT_SEL, 0}, 5980 5981 /* Start with output sum widgets muted and their output gains at min */ 5982 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 5983 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 5984 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 5985 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 5986 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 5987 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 5988 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 5989 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 5990 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 5991 5992 /* Unmute retasking pin widget output buffers since the default 5993 * state appears to be output. As the pin mode is changed by the 5994 * user the pin mode control will take care of enabling the pin's 5995 * input/output buffers as needed. 5996 */ 5997 {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 5998 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 5999 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 6000 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 6001 {0x13, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 6002 {0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 6003 /* Also unmute the mono-out pin widget */ 6004 {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 6005 6006 /* Mute capture amp left and right */ 6007 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 6008 /* Set ADC connection select to match default mixer setting (mic1 6009 * pin) 6010 */ 6011 {0x04, AC_VERB_SET_CONNECT_SEL, 0x00}, 6012 6013 /* Do the same for the second ADC: mute capture input amp and 6014 * set ADC connection to mic1 pin 6015 */ 6016 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 6017 {0x05, AC_VERB_SET_CONNECT_SEL, 0x00}, 6018 6019 /* Mute all inputs to mixer widget (even unconnected ones) */ 6020 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, /* mic1 pin */ 6021 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, /* mic2 pin */ 6022 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, /* line1 pin */ 6023 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, /* line2 pin */ 6024 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, /* CD pin */ 6025 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)}, /* Beep-gen pin */ 6026 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)}, /* Line-out pin */ 6027 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)}, /* HP-pin pin */ 6028 6029 { } 6030 }; 6031 #endif 6032 6033 #define alc260_pcm_analog_playback alc880_pcm_analog_alt_playback 6034 #define alc260_pcm_analog_capture alc880_pcm_analog_capture 6035 6036 #define alc260_pcm_digital_playback alc880_pcm_digital_playback 6037 #define alc260_pcm_digital_capture alc880_pcm_digital_capture 6038 6039 /* 6040 * for BIOS auto-configuration 6041 */ 6042 6043 static int alc260_add_playback_controls(struct alc_spec *spec, hda_nid_t nid, 6044 const char *pfx, int *vol_bits) 6045 { 6046 hda_nid_t nid_vol; 6047 unsigned long vol_val, sw_val; 6048 int err; 6049 6050 if (nid >= 0x0f && nid < 0x11) { 6051 nid_vol = nid - 0x7; 6052 vol_val = HDA_COMPOSE_AMP_VAL(nid_vol, 3, 0, HDA_OUTPUT); 6053 sw_val = HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT); 6054 } else if (nid == 0x11) { 6055 nid_vol = nid - 0x7; 6056 vol_val = HDA_COMPOSE_AMP_VAL(nid_vol, 2, 0, HDA_OUTPUT); 6057 sw_val = HDA_COMPOSE_AMP_VAL(nid, 2, 0, HDA_OUTPUT); 6058 } else if (nid >= 0x12 && nid <= 0x15) { 6059 nid_vol = 0x08; 6060 vol_val = HDA_COMPOSE_AMP_VAL(nid_vol, 3, 0, HDA_OUTPUT); 6061 sw_val = HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT); 6062 } else 6063 return 0; /* N/A */ 6064 6065 if (!(*vol_bits & (1 << nid_vol))) { 6066 /* first control for the volume widget */ 6067 err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx, vol_val); 6068 if (err < 0) 6069 return err; 6070 *vol_bits |= (1 << nid_vol); 6071 } 6072 err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, pfx, sw_val); 6073 if (err < 0) 6074 return err; 6075 return 1; 6076 } 6077 6078 /* add playback controls from the parsed DAC table */ 6079 static int alc260_auto_create_multi_out_ctls(struct alc_spec *spec, 6080 const struct auto_pin_cfg *cfg) 6081 { 6082 hda_nid_t nid; 6083 int err; 6084 int vols = 0; 6085 6086 spec->multiout.num_dacs = 1; 6087 spec->multiout.dac_nids = spec->private_dac_nids; 6088 spec->multiout.dac_nids[0] = 0x02; 6089 6090 nid = cfg->line_out_pins[0]; 6091 if (nid) { 6092 const char *pfx; 6093 if (!cfg->speaker_pins[0] && !cfg->hp_pins[0]) 6094 pfx = "Master"; 6095 else if (cfg->line_out_type == AUTO_PIN_SPEAKER_OUT) 6096 pfx = "Speaker"; 6097 else 6098 pfx = "Front"; 6099 err = alc260_add_playback_controls(spec, nid, pfx, &vols); 6100 if (err < 0) 6101 return err; 6102 } 6103 6104 nid = cfg->speaker_pins[0]; 6105 if (nid) { 6106 err = alc260_add_playback_controls(spec, nid, "Speaker", &vols); 6107 if (err < 0) 6108 return err; 6109 } 6110 6111 nid = cfg->hp_pins[0]; 6112 if (nid) { 6113 err = alc260_add_playback_controls(spec, nid, "Headphone", 6114 &vols); 6115 if (err < 0) 6116 return err; 6117 } 6118 return 0; 6119 } 6120 6121 /* create playback/capture controls for input pins */ 6122 static int alc260_auto_create_input_ctls(struct hda_codec *codec, 6123 const struct auto_pin_cfg *cfg) 6124 { 6125 return alc_auto_create_input_ctls(codec, cfg, 0x07, 0x04, 0x05); 6126 } 6127 6128 static void alc260_auto_set_output_and_unmute(struct hda_codec *codec, 6129 hda_nid_t nid, int pin_type, 6130 int sel_idx) 6131 { 6132 alc_set_pin_output(codec, nid, pin_type); 6133 /* need the manual connection? */ 6134 if (nid >= 0x12) { 6135 int idx = nid - 0x12; 6136 snd_hda_codec_write(codec, idx + 0x0b, 0, 6137 AC_VERB_SET_CONNECT_SEL, sel_idx); 6138 } 6139 } 6140 6141 static void alc260_auto_init_multi_out(struct hda_codec *codec) 6142 { 6143 struct alc_spec *spec = codec->spec; 6144 hda_nid_t nid; 6145 6146 nid = spec->autocfg.line_out_pins[0]; 6147 if (nid) { 6148 int pin_type = get_pin_type(spec->autocfg.line_out_type); 6149 alc260_auto_set_output_and_unmute(codec, nid, pin_type, 0); 6150 } 6151 6152 nid = spec->autocfg.speaker_pins[0]; 6153 if (nid) 6154 alc260_auto_set_output_and_unmute(codec, nid, PIN_OUT, 0); 6155 6156 nid = spec->autocfg.hp_pins[0]; 6157 if (nid) 6158 alc260_auto_set_output_and_unmute(codec, nid, PIN_HP, 0); 6159 } 6160 6161 #define ALC260_PIN_CD_NID 0x16 6162 static void alc260_auto_init_analog_input(struct hda_codec *codec) 6163 { 6164 struct alc_spec *spec = codec->spec; 6165 int i; 6166 6167 for (i = 0; i < AUTO_PIN_LAST; i++) { 6168 hda_nid_t nid = spec->autocfg.input_pins[i]; 6169 if (nid >= 0x12) { 6170 alc_set_input_pin(codec, nid, i); 6171 if (nid != ALC260_PIN_CD_NID && 6172 (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP)) 6173 snd_hda_codec_write(codec, nid, 0, 6174 AC_VERB_SET_AMP_GAIN_MUTE, 6175 AMP_OUT_MUTE); 6176 } 6177 } 6178 } 6179 6180 /* 6181 * generic initialization of ADC, input mixers and output mixers 6182 */ 6183 static struct hda_verb alc260_volume_init_verbs[] = { 6184 /* 6185 * Unmute ADC0-1 and set the default input to mic-in 6186 */ 6187 {0x04, AC_VERB_SET_CONNECT_SEL, 0x00}, 6188 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 6189 {0x05, AC_VERB_SET_CONNECT_SEL, 0x00}, 6190 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 6191 6192 /* Unmute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback 6193 * mixer widget 6194 * Note: PASD motherboards uses the Line In 2 as the input for 6195 * front panel mic (mic 2) 6196 */ 6197 /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */ 6198 /* mute analog inputs */ 6199 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 6200 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 6201 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, 6202 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, 6203 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, 6204 6205 /* 6206 * Set up output mixers (0x08 - 0x0a) 6207 */ 6208 /* set vol=0 to output mixers */ 6209 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 6210 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 6211 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 6212 /* set up input amps for analog loopback */ 6213 /* Amp Indices: DAC = 0, mixer = 1 */ 6214 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 6215 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 6216 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 6217 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 6218 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 6219 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 6220 6221 { } 6222 }; 6223 6224 static int alc260_parse_auto_config(struct hda_codec *codec) 6225 { 6226 struct alc_spec *spec = codec->spec; 6227 int err; 6228 static hda_nid_t alc260_ignore[] = { 0x17, 0 }; 6229 6230 err = snd_hda_parse_pin_def_config(codec, &spec->autocfg, 6231 alc260_ignore); 6232 if (err < 0) 6233 return err; 6234 err = alc260_auto_create_multi_out_ctls(spec, &spec->autocfg); 6235 if (err < 0) 6236 return err; 6237 if (!spec->kctls.list) 6238 return 0; /* can't find valid BIOS pin config */ 6239 err = alc260_auto_create_input_ctls(codec, &spec->autocfg); 6240 if (err < 0) 6241 return err; 6242 6243 spec->multiout.max_channels = 2; 6244 6245 if (spec->autocfg.dig_outs) 6246 spec->multiout.dig_out_nid = ALC260_DIGOUT_NID; 6247 if (spec->kctls.list) 6248 add_mixer(spec, spec->kctls.list); 6249 6250 add_verb(spec, alc260_volume_init_verbs); 6251 6252 spec->num_mux_defs = 1; 6253 spec->input_mux = &spec->private_imux[0]; 6254 6255 alc_ssid_check(codec, 0x10, 0x15, 0x0f); 6256 6257 return 1; 6258 } 6259 6260 /* additional initialization for auto-configuration model */ 6261 static void alc260_auto_init(struct hda_codec *codec) 6262 { 6263 struct alc_spec *spec = codec->spec; 6264 alc260_auto_init_multi_out(codec); 6265 alc260_auto_init_analog_input(codec); 6266 if (spec->unsol_event) 6267 alc_inithook(codec); 6268 } 6269 6270 #ifdef CONFIG_SND_HDA_POWER_SAVE 6271 static struct hda_amp_list alc260_loopbacks[] = { 6272 { 0x07, HDA_INPUT, 0 }, 6273 { 0x07, HDA_INPUT, 1 }, 6274 { 0x07, HDA_INPUT, 2 }, 6275 { 0x07, HDA_INPUT, 3 }, 6276 { 0x07, HDA_INPUT, 4 }, 6277 { } /* end */ 6278 }; 6279 #endif 6280 6281 /* 6282 * ALC260 configurations 6283 */ 6284 static const char *alc260_models[ALC260_MODEL_LAST] = { 6285 [ALC260_BASIC] = "basic", 6286 [ALC260_HP] = "hp", 6287 [ALC260_HP_3013] = "hp-3013", 6288 [ALC260_HP_DC7600] = "hp-dc7600", 6289 [ALC260_FUJITSU_S702X] = "fujitsu", 6290 [ALC260_ACER] = "acer", 6291 [ALC260_WILL] = "will", 6292 [ALC260_REPLACER_672V] = "replacer", 6293 [ALC260_FAVORIT100] = "favorit100", 6294 #ifdef CONFIG_SND_DEBUG 6295 [ALC260_TEST] = "test", 6296 #endif 6297 [ALC260_AUTO] = "auto", 6298 }; 6299 6300 static struct snd_pci_quirk alc260_cfg_tbl[] = { 6301 SND_PCI_QUIRK(0x1025, 0x007b, "Acer C20x", ALC260_ACER), 6302 SND_PCI_QUIRK(0x1025, 0x007f, "Acer", ALC260_WILL), 6303 SND_PCI_QUIRK(0x1025, 0x008f, "Acer", ALC260_ACER), 6304 SND_PCI_QUIRK(0x1509, 0x4540, "Favorit 100XS", ALC260_FAVORIT100), 6305 SND_PCI_QUIRK(0x103c, 0x2808, "HP d5700", ALC260_HP_3013), 6306 SND_PCI_QUIRK(0x103c, 0x280a, "HP d5750", ALC260_AUTO), /* no quirk */ 6307 SND_PCI_QUIRK(0x103c, 0x3010, "HP", ALC260_HP_3013), 6308 SND_PCI_QUIRK(0x103c, 0x3011, "HP", ALC260_HP_3013), 6309 SND_PCI_QUIRK(0x103c, 0x3012, "HP", ALC260_HP_DC7600), 6310 SND_PCI_QUIRK(0x103c, 0x3013, "HP", ALC260_HP_3013), 6311 SND_PCI_QUIRK(0x103c, 0x3014, "HP", ALC260_HP), 6312 SND_PCI_QUIRK(0x103c, 0x3015, "HP", ALC260_HP), 6313 SND_PCI_QUIRK(0x103c, 0x3016, "HP", ALC260_HP), 6314 SND_PCI_QUIRK(0x104d, 0x81bb, "Sony VAIO", ALC260_BASIC), 6315 SND_PCI_QUIRK(0x104d, 0x81cc, "Sony VAIO", ALC260_BASIC), 6316 SND_PCI_QUIRK(0x104d, 0x81cd, "Sony VAIO", ALC260_BASIC), 6317 SND_PCI_QUIRK(0x10cf, 0x1326, "Fujitsu S702X", ALC260_FUJITSU_S702X), 6318 SND_PCI_QUIRK(0x152d, 0x0729, "CTL U553W", ALC260_BASIC), 6319 SND_PCI_QUIRK(0x161f, 0x2057, "Replacer 672V", ALC260_REPLACER_672V), 6320 SND_PCI_QUIRK(0x1631, 0xc017, "PB V7900", ALC260_WILL), 6321 {} 6322 }; 6323 6324 static struct alc_config_preset alc260_presets[] = { 6325 [ALC260_BASIC] = { 6326 .mixers = { alc260_base_output_mixer, 6327 alc260_input_mixer }, 6328 .init_verbs = { alc260_init_verbs }, 6329 .num_dacs = ARRAY_SIZE(alc260_dac_nids), 6330 .dac_nids = alc260_dac_nids, 6331 .num_adc_nids = ARRAY_SIZE(alc260_dual_adc_nids), 6332 .adc_nids = alc260_adc_nids, 6333 .num_channel_mode = ARRAY_SIZE(alc260_modes), 6334 .channel_mode = alc260_modes, 6335 .input_mux = &alc260_capture_source, 6336 }, 6337 [ALC260_HP] = { 6338 .mixers = { alc260_hp_output_mixer, 6339 alc260_input_mixer }, 6340 .init_verbs = { alc260_init_verbs, 6341 alc260_hp_unsol_verbs }, 6342 .num_dacs = ARRAY_SIZE(alc260_dac_nids), 6343 .dac_nids = alc260_dac_nids, 6344 .num_adc_nids = ARRAY_SIZE(alc260_adc_nids_alt), 6345 .adc_nids = alc260_adc_nids_alt, 6346 .num_channel_mode = ARRAY_SIZE(alc260_modes), 6347 .channel_mode = alc260_modes, 6348 .input_mux = &alc260_capture_source, 6349 .unsol_event = alc260_hp_unsol_event, 6350 .init_hook = alc260_hp_automute, 6351 }, 6352 [ALC260_HP_DC7600] = { 6353 .mixers = { alc260_hp_dc7600_mixer, 6354 alc260_input_mixer }, 6355 .init_verbs = { alc260_init_verbs, 6356 alc260_hp_dc7600_verbs }, 6357 .num_dacs = ARRAY_SIZE(alc260_dac_nids), 6358 .dac_nids = alc260_dac_nids, 6359 .num_adc_nids = ARRAY_SIZE(alc260_adc_nids_alt), 6360 .adc_nids = alc260_adc_nids_alt, 6361 .num_channel_mode = ARRAY_SIZE(alc260_modes), 6362 .channel_mode = alc260_modes, 6363 .input_mux = &alc260_capture_source, 6364 .unsol_event = alc260_hp_3012_unsol_event, 6365 .init_hook = alc260_hp_3012_automute, 6366 }, 6367 [ALC260_HP_3013] = { 6368 .mixers = { alc260_hp_3013_mixer, 6369 alc260_input_mixer }, 6370 .init_verbs = { alc260_hp_3013_init_verbs, 6371 alc260_hp_3013_unsol_verbs }, 6372 .num_dacs = ARRAY_SIZE(alc260_dac_nids), 6373 .dac_nids = alc260_dac_nids, 6374 .num_adc_nids = ARRAY_SIZE(alc260_adc_nids_alt), 6375 .adc_nids = alc260_adc_nids_alt, 6376 .num_channel_mode = ARRAY_SIZE(alc260_modes), 6377 .channel_mode = alc260_modes, 6378 .input_mux = &alc260_capture_source, 6379 .unsol_event = alc260_hp_3013_unsol_event, 6380 .init_hook = alc260_hp_3013_automute, 6381 }, 6382 [ALC260_FUJITSU_S702X] = { 6383 .mixers = { alc260_fujitsu_mixer }, 6384 .init_verbs = { alc260_fujitsu_init_verbs }, 6385 .num_dacs = ARRAY_SIZE(alc260_dac_nids), 6386 .dac_nids = alc260_dac_nids, 6387 .num_adc_nids = ARRAY_SIZE(alc260_dual_adc_nids), 6388 .adc_nids = alc260_dual_adc_nids, 6389 .num_channel_mode = ARRAY_SIZE(alc260_modes), 6390 .channel_mode = alc260_modes, 6391 .num_mux_defs = ARRAY_SIZE(alc260_fujitsu_capture_sources), 6392 .input_mux = alc260_fujitsu_capture_sources, 6393 }, 6394 [ALC260_ACER] = { 6395 .mixers = { alc260_acer_mixer }, 6396 .init_verbs = { alc260_acer_init_verbs }, 6397 .num_dacs = ARRAY_SIZE(alc260_dac_nids), 6398 .dac_nids = alc260_dac_nids, 6399 .num_adc_nids = ARRAY_SIZE(alc260_dual_adc_nids), 6400 .adc_nids = alc260_dual_adc_nids, 6401 .num_channel_mode = ARRAY_SIZE(alc260_modes), 6402 .channel_mode = alc260_modes, 6403 .num_mux_defs = ARRAY_SIZE(alc260_acer_capture_sources), 6404 .input_mux = alc260_acer_capture_sources, 6405 }, 6406 [ALC260_FAVORIT100] = { 6407 .mixers = { alc260_favorit100_mixer }, 6408 .init_verbs = { alc260_favorit100_init_verbs }, 6409 .num_dacs = ARRAY_SIZE(alc260_dac_nids), 6410 .dac_nids = alc260_dac_nids, 6411 .num_adc_nids = ARRAY_SIZE(alc260_dual_adc_nids), 6412 .adc_nids = alc260_dual_adc_nids, 6413 .num_channel_mode = ARRAY_SIZE(alc260_modes), 6414 .channel_mode = alc260_modes, 6415 .num_mux_defs = ARRAY_SIZE(alc260_favorit100_capture_sources), 6416 .input_mux = alc260_favorit100_capture_sources, 6417 }, 6418 [ALC260_WILL] = { 6419 .mixers = { alc260_will_mixer }, 6420 .init_verbs = { alc260_init_verbs, alc260_will_verbs }, 6421 .num_dacs = ARRAY_SIZE(alc260_dac_nids), 6422 .dac_nids = alc260_dac_nids, 6423 .num_adc_nids = ARRAY_SIZE(alc260_adc_nids), 6424 .adc_nids = alc260_adc_nids, 6425 .dig_out_nid = ALC260_DIGOUT_NID, 6426 .num_channel_mode = ARRAY_SIZE(alc260_modes), 6427 .channel_mode = alc260_modes, 6428 .input_mux = &alc260_capture_source, 6429 }, 6430 [ALC260_REPLACER_672V] = { 6431 .mixers = { alc260_replacer_672v_mixer }, 6432 .init_verbs = { alc260_init_verbs, alc260_replacer_672v_verbs }, 6433 .num_dacs = ARRAY_SIZE(alc260_dac_nids), 6434 .dac_nids = alc260_dac_nids, 6435 .num_adc_nids = ARRAY_SIZE(alc260_adc_nids), 6436 .adc_nids = alc260_adc_nids, 6437 .dig_out_nid = ALC260_DIGOUT_NID, 6438 .num_channel_mode = ARRAY_SIZE(alc260_modes), 6439 .channel_mode = alc260_modes, 6440 .input_mux = &alc260_capture_source, 6441 .unsol_event = alc260_replacer_672v_unsol_event, 6442 .init_hook = alc260_replacer_672v_automute, 6443 }, 6444 #ifdef CONFIG_SND_DEBUG 6445 [ALC260_TEST] = { 6446 .mixers = { alc260_test_mixer }, 6447 .init_verbs = { alc260_test_init_verbs }, 6448 .num_dacs = ARRAY_SIZE(alc260_test_dac_nids), 6449 .dac_nids = alc260_test_dac_nids, 6450 .num_adc_nids = ARRAY_SIZE(alc260_test_adc_nids), 6451 .adc_nids = alc260_test_adc_nids, 6452 .num_channel_mode = ARRAY_SIZE(alc260_modes), 6453 .channel_mode = alc260_modes, 6454 .num_mux_defs = ARRAY_SIZE(alc260_test_capture_sources), 6455 .input_mux = alc260_test_capture_sources, 6456 }, 6457 #endif 6458 }; 6459 6460 static int patch_alc260(struct hda_codec *codec) 6461 { 6462 struct alc_spec *spec; 6463 int err, board_config; 6464 6465 spec = kzalloc(sizeof(*spec), GFP_KERNEL); 6466 if (spec == NULL) 6467 return -ENOMEM; 6468 6469 codec->spec = spec; 6470 6471 board_config = snd_hda_check_board_config(codec, ALC260_MODEL_LAST, 6472 alc260_models, 6473 alc260_cfg_tbl); 6474 if (board_config < 0) { 6475 snd_printd(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n", 6476 codec->chip_name); 6477 board_config = ALC260_AUTO; 6478 } 6479 6480 if (board_config == ALC260_AUTO) { 6481 /* automatic parse from the BIOS config */ 6482 err = alc260_parse_auto_config(codec); 6483 if (err < 0) { 6484 alc_free(codec); 6485 return err; 6486 } else if (!err) { 6487 printk(KERN_INFO 6488 "hda_codec: Cannot set up configuration " 6489 "from BIOS. Using base mode...\n"); 6490 board_config = ALC260_BASIC; 6491 } 6492 } 6493 6494 err = snd_hda_attach_beep_device(codec, 0x1); 6495 if (err < 0) { 6496 alc_free(codec); 6497 return err; 6498 } 6499 6500 if (board_config != ALC260_AUTO) 6501 setup_preset(codec, &alc260_presets[board_config]); 6502 6503 spec->stream_analog_playback = &alc260_pcm_analog_playback; 6504 spec->stream_analog_capture = &alc260_pcm_analog_capture; 6505 6506 spec->stream_digital_playback = &alc260_pcm_digital_playback; 6507 spec->stream_digital_capture = &alc260_pcm_digital_capture; 6508 6509 if (!spec->adc_nids && spec->input_mux) { 6510 /* check whether NID 0x04 is valid */ 6511 unsigned int wcap = get_wcaps(codec, 0x04); 6512 wcap = get_wcaps_type(wcap); 6513 /* get type */ 6514 if (wcap != AC_WID_AUD_IN || spec->input_mux->num_items == 1) { 6515 spec->adc_nids = alc260_adc_nids_alt; 6516 spec->num_adc_nids = ARRAY_SIZE(alc260_adc_nids_alt); 6517 } else { 6518 spec->adc_nids = alc260_adc_nids; 6519 spec->num_adc_nids = ARRAY_SIZE(alc260_adc_nids); 6520 } 6521 } 6522 set_capture_mixer(codec); 6523 set_beep_amp(spec, 0x07, 0x05, HDA_INPUT); 6524 6525 spec->vmaster_nid = 0x08; 6526 6527 codec->patch_ops = alc_patch_ops; 6528 if (board_config == ALC260_AUTO) 6529 spec->init_hook = alc260_auto_init; 6530 #ifdef CONFIG_SND_HDA_POWER_SAVE 6531 if (!spec->loopback.amplist) 6532 spec->loopback.amplist = alc260_loopbacks; 6533 #endif 6534 codec->proc_widget_hook = print_realtek_coef; 6535 6536 return 0; 6537 } 6538 6539 6540 /* 6541 * ALC882/883/885/888/889 support 6542 * 6543 * ALC882 is almost identical with ALC880 but has cleaner and more flexible 6544 * configuration. Each pin widget can choose any input DACs and a mixer. 6545 * Each ADC is connected from a mixer of all inputs. This makes possible 6546 * 6-channel independent captures. 6547 * 6548 * In addition, an independent DAC for the multi-playback (not used in this 6549 * driver yet). 6550 */ 6551 #define ALC882_DIGOUT_NID 0x06 6552 #define ALC882_DIGIN_NID 0x0a 6553 #define ALC883_DIGOUT_NID ALC882_DIGOUT_NID 6554 #define ALC883_DIGIN_NID ALC882_DIGIN_NID 6555 #define ALC1200_DIGOUT_NID 0x10 6556 6557 6558 static struct hda_channel_mode alc882_ch_modes[1] = { 6559 { 8, NULL } 6560 }; 6561 6562 /* DACs */ 6563 static hda_nid_t alc882_dac_nids[4] = { 6564 /* front, rear, clfe, rear_surr */ 6565 0x02, 0x03, 0x04, 0x05 6566 }; 6567 #define alc883_dac_nids alc882_dac_nids 6568 6569 /* ADCs */ 6570 #define alc882_adc_nids alc880_adc_nids 6571 #define alc882_adc_nids_alt alc880_adc_nids_alt 6572 #define alc883_adc_nids alc882_adc_nids_alt 6573 static hda_nid_t alc883_adc_nids_alt[1] = { 0x08 }; 6574 static hda_nid_t alc883_adc_nids_rev[2] = { 0x09, 0x08 }; 6575 #define alc889_adc_nids alc880_adc_nids 6576 6577 static hda_nid_t alc882_capsrc_nids[3] = { 0x24, 0x23, 0x22 }; 6578 static hda_nid_t alc882_capsrc_nids_alt[2] = { 0x23, 0x22 }; 6579 #define alc883_capsrc_nids alc882_capsrc_nids_alt 6580 static hda_nid_t alc883_capsrc_nids_rev[2] = { 0x22, 0x23 }; 6581 #define alc889_capsrc_nids alc882_capsrc_nids 6582 6583 /* input MUX */ 6584 /* FIXME: should be a matrix-type input source selection */ 6585 6586 static struct hda_input_mux alc882_capture_source = { 6587 .num_items = 4, 6588 .items = { 6589 { "Mic", 0x0 }, 6590 { "Front Mic", 0x1 }, 6591 { "Line", 0x2 }, 6592 { "CD", 0x4 }, 6593 }, 6594 }; 6595 6596 #define alc883_capture_source alc882_capture_source 6597 6598 static struct hda_input_mux alc889_capture_source = { 6599 .num_items = 3, 6600 .items = { 6601 { "Front Mic", 0x0 }, 6602 { "Mic", 0x3 }, 6603 { "Line", 0x2 }, 6604 }, 6605 }; 6606 6607 static struct hda_input_mux mb5_capture_source = { 6608 .num_items = 3, 6609 .items = { 6610 { "Mic", 0x1 }, 6611 { "Line", 0x2 }, 6612 { "CD", 0x4 }, 6613 }, 6614 }; 6615 6616 static struct hda_input_mux alc883_3stack_6ch_intel = { 6617 .num_items = 4, 6618 .items = { 6619 { "Mic", 0x1 }, 6620 { "Front Mic", 0x0 }, 6621 { "Line", 0x2 }, 6622 { "CD", 0x4 }, 6623 }, 6624 }; 6625 6626 static struct hda_input_mux alc883_lenovo_101e_capture_source = { 6627 .num_items = 2, 6628 .items = { 6629 { "Mic", 0x1 }, 6630 { "Line", 0x2 }, 6631 }, 6632 }; 6633 6634 static struct hda_input_mux alc883_lenovo_nb0763_capture_source = { 6635 .num_items = 4, 6636 .items = { 6637 { "Mic", 0x0 }, 6638 { "iMic", 0x1 }, 6639 { "Line", 0x2 }, 6640 { "CD", 0x4 }, 6641 }, 6642 }; 6643 6644 static struct hda_input_mux alc883_fujitsu_pi2515_capture_source = { 6645 .num_items = 2, 6646 .items = { 6647 { "Mic", 0x0 }, 6648 { "Int Mic", 0x1 }, 6649 }, 6650 }; 6651 6652 static struct hda_input_mux alc883_lenovo_sky_capture_source = { 6653 .num_items = 3, 6654 .items = { 6655 { "Mic", 0x0 }, 6656 { "Front Mic", 0x1 }, 6657 { "Line", 0x4 }, 6658 }, 6659 }; 6660 6661 static struct hda_input_mux alc883_asus_eee1601_capture_source = { 6662 .num_items = 2, 6663 .items = { 6664 { "Mic", 0x0 }, 6665 { "Line", 0x2 }, 6666 }, 6667 }; 6668 6669 static struct hda_input_mux alc889A_mb31_capture_source = { 6670 .num_items = 2, 6671 .items = { 6672 { "Mic", 0x0 }, 6673 /* Front Mic (0x01) unused */ 6674 { "Line", 0x2 }, 6675 /* Line 2 (0x03) unused */ 6676 /* CD (0x04) unused? */ 6677 }, 6678 }; 6679 6680 /* 6681 * 2ch mode 6682 */ 6683 static struct hda_channel_mode alc883_3ST_2ch_modes[1] = { 6684 { 2, NULL } 6685 }; 6686 6687 /* 6688 * 2ch mode 6689 */ 6690 static struct hda_verb alc882_3ST_ch2_init[] = { 6691 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, 6692 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE }, 6693 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN }, 6694 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE }, 6695 { } /* end */ 6696 }; 6697 6698 /* 6699 * 4ch mode 6700 */ 6701 static struct hda_verb alc882_3ST_ch4_init[] = { 6702 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, 6703 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE }, 6704 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 6705 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 6706 { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 }, 6707 { } /* end */ 6708 }; 6709 6710 /* 6711 * 6ch mode 6712 */ 6713 static struct hda_verb alc882_3ST_ch6_init[] = { 6714 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 6715 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 6716 { 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 }, 6717 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 6718 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 6719 { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 }, 6720 { } /* end */ 6721 }; 6722 6723 static struct hda_channel_mode alc882_3ST_6ch_modes[3] = { 6724 { 2, alc882_3ST_ch2_init }, 6725 { 4, alc882_3ST_ch4_init }, 6726 { 6, alc882_3ST_ch6_init }, 6727 }; 6728 6729 #define alc883_3ST_6ch_modes alc882_3ST_6ch_modes 6730 6731 /* 6732 * 2ch mode 6733 */ 6734 static struct hda_verb alc883_3ST_ch2_clevo_init[] = { 6735 { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP }, 6736 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, 6737 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE }, 6738 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN }, 6739 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE }, 6740 { } /* end */ 6741 }; 6742 6743 /* 6744 * 4ch mode 6745 */ 6746 static struct hda_verb alc883_3ST_ch4_clevo_init[] = { 6747 { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 6748 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, 6749 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE }, 6750 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 6751 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 6752 { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 }, 6753 { } /* end */ 6754 }; 6755 6756 /* 6757 * 6ch mode 6758 */ 6759 static struct hda_verb alc883_3ST_ch6_clevo_init[] = { 6760 { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 6761 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 6762 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 6763 { 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 }, 6764 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 6765 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 6766 { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 }, 6767 { } /* end */ 6768 }; 6769 6770 static struct hda_channel_mode alc883_3ST_6ch_clevo_modes[3] = { 6771 { 2, alc883_3ST_ch2_clevo_init }, 6772 { 4, alc883_3ST_ch4_clevo_init }, 6773 { 6, alc883_3ST_ch6_clevo_init }, 6774 }; 6775 6776 6777 /* 6778 * 6ch mode 6779 */ 6780 static struct hda_verb alc882_sixstack_ch6_init[] = { 6781 { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 }, 6782 { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 6783 { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 6784 { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 6785 { } /* end */ 6786 }; 6787 6788 /* 6789 * 8ch mode 6790 */ 6791 static struct hda_verb alc882_sixstack_ch8_init[] = { 6792 { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 6793 { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 6794 { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 6795 { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 6796 { } /* end */ 6797 }; 6798 6799 static struct hda_channel_mode alc882_sixstack_modes[2] = { 6800 { 6, alc882_sixstack_ch6_init }, 6801 { 8, alc882_sixstack_ch8_init }, 6802 }; 6803 6804 /* 6805 * macbook pro ALC885 can switch LineIn to LineOut without losing Mic 6806 */ 6807 6808 /* 6809 * 2ch mode 6810 */ 6811 static struct hda_verb alc885_mbp_ch2_init[] = { 6812 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN }, 6813 { 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 6814 { 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 6815 { } /* end */ 6816 }; 6817 6818 /* 6819 * 4ch mode 6820 */ 6821 static struct hda_verb alc885_mbp_ch4_init[] = { 6822 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 6823 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 6824 { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 }, 6825 { 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 6826 { 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 6827 { } /* end */ 6828 }; 6829 6830 static struct hda_channel_mode alc885_mbp_4ch_modes[2] = { 6831 { 2, alc885_mbp_ch2_init }, 6832 { 4, alc885_mbp_ch4_init }, 6833 }; 6834 6835 /* 6836 * 2ch 6837 * Speakers/Woofer/HP = Front 6838 * LineIn = Input 6839 */ 6840 static struct hda_verb alc885_mb5_ch2_init[] = { 6841 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 6842 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 6843 { } /* end */ 6844 }; 6845 6846 /* 6847 * 6ch mode 6848 * Speakers/HP = Front 6849 * Woofer = LFE 6850 * LineIn = Surround 6851 */ 6852 static struct hda_verb alc885_mb5_ch6_init[] = { 6853 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 6854 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 6855 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, 6856 { } /* end */ 6857 }; 6858 6859 static struct hda_channel_mode alc885_mb5_6ch_modes[2] = { 6860 { 2, alc885_mb5_ch2_init }, 6861 { 6, alc885_mb5_ch6_init }, 6862 }; 6863 6864 6865 /* 6866 * 2ch mode 6867 */ 6868 static struct hda_verb alc883_4ST_ch2_init[] = { 6869 { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 6870 { 0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 6871 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, 6872 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE }, 6873 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN }, 6874 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE }, 6875 { } /* end */ 6876 }; 6877 6878 /* 6879 * 4ch mode 6880 */ 6881 static struct hda_verb alc883_4ST_ch4_init[] = { 6882 { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 6883 { 0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 6884 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, 6885 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE }, 6886 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 6887 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 6888 { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 }, 6889 { } /* end */ 6890 }; 6891 6892 /* 6893 * 6ch mode 6894 */ 6895 static struct hda_verb alc883_4ST_ch6_init[] = { 6896 { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 6897 { 0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 6898 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 6899 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 6900 { 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 }, 6901 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 6902 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 6903 { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 }, 6904 { } /* end */ 6905 }; 6906 6907 /* 6908 * 8ch mode 6909 */ 6910 static struct hda_verb alc883_4ST_ch8_init[] = { 6911 { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 6912 { 0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 6913 { 0x17, AC_VERB_SET_CONNECT_SEL, 0x03 }, 6914 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 6915 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 6916 { 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 }, 6917 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 6918 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 6919 { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 }, 6920 { } /* end */ 6921 }; 6922 6923 static struct hda_channel_mode alc883_4ST_8ch_modes[4] = { 6924 { 2, alc883_4ST_ch2_init }, 6925 { 4, alc883_4ST_ch4_init }, 6926 { 6, alc883_4ST_ch6_init }, 6927 { 8, alc883_4ST_ch8_init }, 6928 }; 6929 6930 6931 /* 6932 * 2ch mode 6933 */ 6934 static struct hda_verb alc883_3ST_ch2_intel_init[] = { 6935 { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, 6936 { 0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE }, 6937 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN }, 6938 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE }, 6939 { } /* end */ 6940 }; 6941 6942 /* 6943 * 4ch mode 6944 */ 6945 static struct hda_verb alc883_3ST_ch4_intel_init[] = { 6946 { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, 6947 { 0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE }, 6948 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 6949 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 6950 { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 }, 6951 { } /* end */ 6952 }; 6953 6954 /* 6955 * 6ch mode 6956 */ 6957 static struct hda_verb alc883_3ST_ch6_intel_init[] = { 6958 { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 6959 { 0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 6960 { 0x19, AC_VERB_SET_CONNECT_SEL, 0x02 }, 6961 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 6962 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 6963 { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 }, 6964 { } /* end */ 6965 }; 6966 6967 static struct hda_channel_mode alc883_3ST_6ch_intel_modes[3] = { 6968 { 2, alc883_3ST_ch2_intel_init }, 6969 { 4, alc883_3ST_ch4_intel_init }, 6970 { 6, alc883_3ST_ch6_intel_init }, 6971 }; 6972 6973 /* 6974 * 2ch mode 6975 */ 6976 static struct hda_verb alc889_ch2_intel_init[] = { 6977 { 0x14, AC_VERB_SET_CONNECT_SEL, 0x00 }, 6978 { 0x19, AC_VERB_SET_CONNECT_SEL, 0x00 }, 6979 { 0x16, AC_VERB_SET_CONNECT_SEL, 0x00 }, 6980 { 0x17, AC_VERB_SET_CONNECT_SEL, 0x00 }, 6981 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN }, 6982 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE }, 6983 { } /* end */ 6984 }; 6985 6986 /* 6987 * 6ch mode 6988 */ 6989 static struct hda_verb alc889_ch6_intel_init[] = { 6990 { 0x14, AC_VERB_SET_CONNECT_SEL, 0x00 }, 6991 { 0x19, AC_VERB_SET_CONNECT_SEL, 0x01 }, 6992 { 0x16, AC_VERB_SET_CONNECT_SEL, 0x02 }, 6993 { 0x17, AC_VERB_SET_CONNECT_SEL, 0x03 }, 6994 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN }, 6995 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE }, 6996 { } /* end */ 6997 }; 6998 6999 /* 7000 * 8ch mode 7001 */ 7002 static struct hda_verb alc889_ch8_intel_init[] = { 7003 { 0x14, AC_VERB_SET_CONNECT_SEL, 0x00 }, 7004 { 0x19, AC_VERB_SET_CONNECT_SEL, 0x01 }, 7005 { 0x16, AC_VERB_SET_CONNECT_SEL, 0x02 }, 7006 { 0x17, AC_VERB_SET_CONNECT_SEL, 0x03 }, 7007 { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x03 }, 7008 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 7009 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 7010 { } /* end */ 7011 }; 7012 7013 static struct hda_channel_mode alc889_8ch_intel_modes[3] = { 7014 { 2, alc889_ch2_intel_init }, 7015 { 6, alc889_ch6_intel_init }, 7016 { 8, alc889_ch8_intel_init }, 7017 }; 7018 7019 /* 7020 * 6ch mode 7021 */ 7022 static struct hda_verb alc883_sixstack_ch6_init[] = { 7023 { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 }, 7024 { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 7025 { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 7026 { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 7027 { } /* end */ 7028 }; 7029 7030 /* 7031 * 8ch mode 7032 */ 7033 static struct hda_verb alc883_sixstack_ch8_init[] = { 7034 { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 7035 { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 7036 { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 7037 { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 7038 { } /* end */ 7039 }; 7040 7041 static struct hda_channel_mode alc883_sixstack_modes[2] = { 7042 { 6, alc883_sixstack_ch6_init }, 7043 { 8, alc883_sixstack_ch8_init }, 7044 }; 7045 7046 7047 /* Pin assignment: Front=0x14, Rear=0x15, CLFE=0x16, Side=0x17 7048 * Mic=0x18, Front Mic=0x19, Line-In=0x1a, HP=0x1b 7049 */ 7050 static struct snd_kcontrol_new alc882_base_mixer[] = { 7051 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 7052 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 7053 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT), 7054 HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT), 7055 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT), 7056 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT), 7057 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT), 7058 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT), 7059 HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT), 7060 HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT), 7061 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT), 7062 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), 7063 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), 7064 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), 7065 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), 7066 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 7067 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), 7068 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 7069 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), 7070 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT), 7071 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), 7072 { } /* end */ 7073 }; 7074 7075 static struct snd_kcontrol_new alc885_mbp3_mixer[] = { 7076 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x00, HDA_OUTPUT), 7077 HDA_BIND_MUTE ("Speaker Playback Switch", 0x0c, 0x02, HDA_INPUT), 7078 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0e, 0x00, HDA_OUTPUT), 7079 HDA_BIND_MUTE ("Headphone Playback Switch", 0x0e, 0x02, HDA_INPUT), 7080 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x00, HDA_OUTPUT), 7081 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), 7082 HDA_CODEC_MUTE ("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), 7083 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x00, HDA_INPUT), 7084 HDA_CODEC_MUTE ("Mic Playback Switch", 0x0b, 0x00, HDA_INPUT), 7085 HDA_CODEC_VOLUME("Line Boost", 0x1a, 0x00, HDA_INPUT), 7086 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0x00, HDA_INPUT), 7087 { } /* end */ 7088 }; 7089 7090 static struct snd_kcontrol_new alc885_mb5_mixer[] = { 7091 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x00, HDA_OUTPUT), 7092 HDA_BIND_MUTE ("Front Playback Switch", 0x0c, 0x02, HDA_INPUT), 7093 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x00, HDA_OUTPUT), 7094 HDA_BIND_MUTE ("Surround Playback Switch", 0x0d, 0x02, HDA_INPUT), 7095 HDA_CODEC_VOLUME("LFE Playback Volume", 0x0e, 0x00, HDA_OUTPUT), 7096 HDA_BIND_MUTE ("LFE Playback Switch", 0x0e, 0x02, HDA_INPUT), 7097 HDA_CODEC_VOLUME("HP Playback Volume", 0x0f, 0x00, HDA_OUTPUT), 7098 HDA_BIND_MUTE ("HP Playback Switch", 0x0f, 0x02, HDA_INPUT), 7099 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), 7100 HDA_CODEC_MUTE ("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), 7101 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x01, HDA_INPUT), 7102 HDA_CODEC_MUTE ("Mic Playback Switch", 0x0b, 0x01, HDA_INPUT), 7103 HDA_CODEC_VOLUME("Line Boost", 0x15, 0x00, HDA_INPUT), 7104 HDA_CODEC_VOLUME("Mic Boost", 0x19, 0x00, HDA_INPUT), 7105 { } /* end */ 7106 }; 7107 7108 static struct snd_kcontrol_new alc885_imac91_mixer[] = { 7109 HDA_CODEC_VOLUME("Line-Out Playback Volume", 0x0c, 0x00, HDA_OUTPUT), 7110 HDA_BIND_MUTE ("Line-Out Playback Switch", 0x0c, 0x02, HDA_INPUT), 7111 HDA_CODEC_MUTE ("Speaker Playback Switch", 0x14, 0x00, HDA_OUTPUT), 7112 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x00, HDA_OUTPUT), 7113 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), 7114 HDA_CODEC_MUTE ("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), 7115 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x00, HDA_INPUT), 7116 HDA_CODEC_MUTE ("Mic Playback Switch", 0x0b, 0x00, HDA_INPUT), 7117 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0x00, HDA_INPUT), 7118 { } /* end */ 7119 }; 7120 7121 7122 static struct snd_kcontrol_new alc882_w2jc_mixer[] = { 7123 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 7124 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 7125 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), 7126 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), 7127 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), 7128 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), 7129 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 7130 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), 7131 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 7132 { } /* end */ 7133 }; 7134 7135 static struct snd_kcontrol_new alc882_targa_mixer[] = { 7136 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 7137 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 7138 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT), 7139 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), 7140 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), 7141 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), 7142 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), 7143 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 7144 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 7145 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), 7146 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), 7147 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), 7148 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT), 7149 { } /* end */ 7150 }; 7151 7152 /* Pin assignment: Front=0x14, HP = 0x15, Front = 0x16, ??? 7153 * Front Mic=0x18, Line In = 0x1a, Line In = 0x1b, CD = 0x1c 7154 */ 7155 static struct snd_kcontrol_new alc882_asus_a7j_mixer[] = { 7156 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 7157 HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT), 7158 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT), 7159 HDA_CODEC_MUTE("Mobile Front Playback Switch", 0x16, 0x0, HDA_OUTPUT), 7160 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), 7161 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), 7162 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), 7163 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), 7164 HDA_CODEC_VOLUME("Mobile Line Playback Volume", 0x0b, 0x03, HDA_INPUT), 7165 HDA_CODEC_MUTE("Mobile Line Playback Switch", 0x0b, 0x03, HDA_INPUT), 7166 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 7167 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 7168 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), 7169 { } /* end */ 7170 }; 7171 7172 static struct snd_kcontrol_new alc882_asus_a7m_mixer[] = { 7173 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 7174 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 7175 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT), 7176 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), 7177 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), 7178 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), 7179 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), 7180 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 7181 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), 7182 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 7183 { } /* end */ 7184 }; 7185 7186 static struct snd_kcontrol_new alc882_chmode_mixer[] = { 7187 { 7188 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 7189 .name = "Channel Mode", 7190 .info = alc_ch_mode_info, 7191 .get = alc_ch_mode_get, 7192 .put = alc_ch_mode_put, 7193 }, 7194 { } /* end */ 7195 }; 7196 7197 static struct hda_verb alc882_base_init_verbs[] = { 7198 /* Front mixer: unmute input/output amp left and right (volume = 0) */ 7199 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 7200 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 7201 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 7202 /* Rear mixer */ 7203 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 7204 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 7205 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 7206 /* CLFE mixer */ 7207 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 7208 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 7209 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 7210 /* Side mixer */ 7211 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 7212 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 7213 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 7214 7215 /* mute analog input loopbacks */ 7216 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 7217 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 7218 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, 7219 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, 7220 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, 7221 7222 /* Front Pin: output 0 (0x0c) */ 7223 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 7224 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 7225 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, 7226 /* Rear Pin: output 1 (0x0d) */ 7227 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 7228 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 7229 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, 7230 /* CLFE Pin: output 2 (0x0e) */ 7231 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 7232 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 7233 {0x16, AC_VERB_SET_CONNECT_SEL, 0x02}, 7234 /* Side Pin: output 3 (0x0f) */ 7235 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 7236 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 7237 {0x17, AC_VERB_SET_CONNECT_SEL, 0x03}, 7238 /* Mic (rear) pin: input vref at 80% */ 7239 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, 7240 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 7241 /* Front Mic pin: input vref at 80% */ 7242 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, 7243 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 7244 /* Line In pin: input */ 7245 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 7246 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 7247 /* Line-2 In: Headphone output (output 0 - 0x0c) */ 7248 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 7249 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 7250 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, 7251 /* CD pin widget for input */ 7252 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 7253 7254 /* FIXME: use matrix-type input source selection */ 7255 /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */ 7256 /* Input mixer2 */ 7257 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 7258 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, 7259 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, 7260 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, 7261 /* Input mixer3 */ 7262 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 7263 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, 7264 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, 7265 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, 7266 /* ADC2: mute amp left and right */ 7267 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 7268 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00}, 7269 /* ADC3: mute amp left and right */ 7270 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 7271 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00}, 7272 7273 { } 7274 }; 7275 7276 static struct hda_verb alc882_adc1_init_verbs[] = { 7277 /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */ 7278 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 7279 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, 7280 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, 7281 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, 7282 /* ADC1: mute amp left and right */ 7283 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 7284 {0x07, AC_VERB_SET_CONNECT_SEL, 0x00}, 7285 { } 7286 }; 7287 7288 static struct hda_verb alc882_eapd_verbs[] = { 7289 /* change to EAPD mode */ 7290 {0x20, AC_VERB_SET_COEF_INDEX, 0x07}, 7291 {0x20, AC_VERB_SET_PROC_COEF, 0x3060}, 7292 { } 7293 }; 7294 7295 static struct hda_verb alc889_eapd_verbs[] = { 7296 {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2}, 7297 {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2}, 7298 { } 7299 }; 7300 7301 static struct hda_verb alc_hp15_unsol_verbs[] = { 7302 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT}, 7303 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 7304 {} 7305 }; 7306 7307 static struct hda_verb alc885_init_verbs[] = { 7308 /* Front mixer: unmute input/output amp left and right (volume = 0) */ 7309 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 7310 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 7311 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 7312 /* Rear mixer */ 7313 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 7314 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 7315 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 7316 /* CLFE mixer */ 7317 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 7318 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 7319 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 7320 /* Side mixer */ 7321 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 7322 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 7323 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 7324 7325 /* mute analog input loopbacks */ 7326 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 7327 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, 7328 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, 7329 7330 /* Front HP Pin: output 0 (0x0c) */ 7331 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 7332 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 7333 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, 7334 /* Front Pin: output 0 (0x0c) */ 7335 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 7336 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 7337 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, 7338 /* Rear Pin: output 1 (0x0d) */ 7339 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 7340 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 7341 {0x19, AC_VERB_SET_CONNECT_SEL, 0x01}, 7342 /* CLFE Pin: output 2 (0x0e) */ 7343 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 7344 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 7345 {0x16, AC_VERB_SET_CONNECT_SEL, 0x02}, 7346 /* Side Pin: output 3 (0x0f) */ 7347 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 7348 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 7349 {0x17, AC_VERB_SET_CONNECT_SEL, 0x03}, 7350 /* Mic (rear) pin: input vref at 80% */ 7351 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, 7352 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 7353 /* Front Mic pin: input vref at 80% */ 7354 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, 7355 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 7356 /* Line In pin: input */ 7357 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 7358 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 7359 7360 /* Mixer elements: 0x18, , 0x1a, 0x1b */ 7361 /* Input mixer1 */ 7362 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)}, 7363 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 7364 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, 7365 /* Input mixer2 */ 7366 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 7367 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, 7368 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, 7369 /* Input mixer3 */ 7370 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)}, 7371 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 7372 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, 7373 /* ADC2: mute amp left and right */ 7374 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 7375 /* ADC3: mute amp left and right */ 7376 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 7377 7378 { } 7379 }; 7380 7381 static struct hda_verb alc885_init_input_verbs[] = { 7382 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 7383 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)}, 7384 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)}, 7385 { } 7386 }; 7387 7388 7389 /* Unmute Selector 24h and set the default input to front mic */ 7390 static struct hda_verb alc889_init_input_verbs[] = { 7391 {0x24, AC_VERB_SET_CONNECT_SEL, 0x00}, 7392 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 7393 { } 7394 }; 7395 7396 7397 #define alc883_init_verbs alc882_base_init_verbs 7398 7399 /* Mac Pro test */ 7400 static struct snd_kcontrol_new alc882_macpro_mixer[] = { 7401 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 7402 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 7403 HDA_CODEC_MUTE("Headphone Playback Switch", 0x18, 0x0, HDA_OUTPUT), 7404 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x01, HDA_INPUT), 7405 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x01, HDA_INPUT), 7406 /* FIXME: this looks suspicious... 7407 HDA_CODEC_VOLUME("Beep Playback Volume", 0x0b, 0x02, HDA_INPUT), 7408 HDA_CODEC_MUTE("Beep Playback Switch", 0x0b, 0x02, HDA_INPUT), 7409 */ 7410 { } /* end */ 7411 }; 7412 7413 static struct hda_verb alc882_macpro_init_verbs[] = { 7414 /* Front mixer: unmute input/output amp left and right (volume = 0) */ 7415 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 7416 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 7417 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 7418 /* Front Pin: output 0 (0x0c) */ 7419 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 7420 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 7421 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, 7422 /* Front Mic pin: input vref at 80% */ 7423 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, 7424 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 7425 /* Speaker: output */ 7426 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 7427 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 7428 {0x1a, AC_VERB_SET_CONNECT_SEL, 0x04}, 7429 /* Headphone output (output 0 - 0x0c) */ 7430 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 7431 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 7432 {0x18, AC_VERB_SET_CONNECT_SEL, 0x00}, 7433 7434 /* FIXME: use matrix-type input source selection */ 7435 /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */ 7436 /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */ 7437 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 7438 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, 7439 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, 7440 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, 7441 /* Input mixer2 */ 7442 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 7443 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, 7444 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, 7445 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, 7446 /* Input mixer3 */ 7447 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 7448 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, 7449 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, 7450 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, 7451 /* ADC1: mute amp left and right */ 7452 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 7453 {0x07, AC_VERB_SET_CONNECT_SEL, 0x00}, 7454 /* ADC2: mute amp left and right */ 7455 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 7456 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00}, 7457 /* ADC3: mute amp left and right */ 7458 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 7459 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00}, 7460 7461 { } 7462 }; 7463 7464 /* Macbook 5,1 */ 7465 static struct hda_verb alc885_mb5_init_verbs[] = { 7466 /* DACs */ 7467 {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 7468 {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 7469 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 7470 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 7471 /* Front mixer */ 7472 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 7473 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 7474 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 7475 /* Surround mixer */ 7476 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 7477 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 7478 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 7479 /* LFE mixer */ 7480 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 7481 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 7482 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 7483 /* HP mixer */ 7484 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 7485 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 7486 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 7487 /* Front Pin (0x0c) */ 7488 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | 0x01}, 7489 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 7490 {0x18, AC_VERB_SET_CONNECT_SEL, 0x00}, 7491 /* LFE Pin (0x0e) */ 7492 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | 0x01}, 7493 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 7494 {0x1a, AC_VERB_SET_CONNECT_SEL, 0x02}, 7495 /* HP Pin (0x0f) */ 7496 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 7497 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 7498 {0x14, AC_VERB_SET_CONNECT_SEL, 0x03}, 7499 /* Front Mic pin: input vref at 80% */ 7500 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, 7501 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 7502 /* Line In pin */ 7503 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 7504 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 7505 7506 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 7507 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, 7508 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, 7509 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, 7510 { } 7511 }; 7512 7513 /* Macbook Pro rev3 */ 7514 static struct hda_verb alc885_mbp3_init_verbs[] = { 7515 /* Front mixer: unmute input/output amp left and right (volume = 0) */ 7516 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 7517 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 7518 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 7519 /* Rear mixer */ 7520 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 7521 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 7522 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 7523 /* HP mixer */ 7524 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 7525 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 7526 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 7527 /* Front Pin: output 0 (0x0c) */ 7528 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 7529 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 7530 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, 7531 /* HP Pin: output 0 (0x0e) */ 7532 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc4}, 7533 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 7534 {0x15, AC_VERB_SET_CONNECT_SEL, 0x02}, 7535 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, 7536 /* Mic (rear) pin: input vref at 80% */ 7537 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, 7538 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 7539 /* Front Mic pin: input vref at 80% */ 7540 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, 7541 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 7542 /* Line In pin: use output 1 when in LineOut mode */ 7543 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 7544 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 7545 {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01}, 7546 7547 /* FIXME: use matrix-type input source selection */ 7548 /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */ 7549 /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */ 7550 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 7551 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, 7552 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, 7553 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, 7554 /* Input mixer2 */ 7555 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 7556 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, 7557 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, 7558 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, 7559 /* Input mixer3 */ 7560 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 7561 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, 7562 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, 7563 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, 7564 /* ADC1: mute amp left and right */ 7565 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 7566 {0x07, AC_VERB_SET_CONNECT_SEL, 0x00}, 7567 /* ADC2: mute amp left and right */ 7568 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 7569 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00}, 7570 /* ADC3: mute amp left and right */ 7571 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 7572 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00}, 7573 7574 { } 7575 }; 7576 7577 /* iMac 9,1 */ 7578 static struct hda_verb alc885_imac91_init_verbs[] = { 7579 /* Line-Out mixer: unmute input/output amp left and right (volume = 0) */ 7580 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 7581 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 7582 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 7583 /* Rear mixer */ 7584 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 7585 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 7586 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 7587 /* HP Pin: output 0 (0x0c) */ 7588 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 7589 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 7590 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, 7591 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, 7592 /* Internal Speakers: output 0 (0x0d) */ 7593 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 7594 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 7595 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, 7596 /* Mic (rear) pin: input vref at 80% */ 7597 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, 7598 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 7599 /* Front Mic pin: input vref at 80% */ 7600 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, 7601 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 7602 /* Line In pin: use output 1 when in LineOut mode */ 7603 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 7604 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 7605 {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01}, 7606 7607 /* FIXME: use matrix-type input source selection */ 7608 /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */ 7609 /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */ 7610 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 7611 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, 7612 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, 7613 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, 7614 /* Input mixer2 */ 7615 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 7616 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, 7617 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, 7618 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, 7619 /* Input mixer3 */ 7620 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 7621 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, 7622 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, 7623 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, 7624 /* ADC1: mute amp left and right */ 7625 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 7626 {0x07, AC_VERB_SET_CONNECT_SEL, 0x00}, 7627 /* ADC2: mute amp left and right */ 7628 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 7629 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00}, 7630 /* ADC3: mute amp left and right */ 7631 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 7632 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00}, 7633 7634 { } 7635 }; 7636 7637 /* iMac 24 mixer. */ 7638 static struct snd_kcontrol_new alc885_imac24_mixer[] = { 7639 HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x00, HDA_OUTPUT), 7640 HDA_CODEC_MUTE("Master Playback Switch", 0x0c, 0x00, HDA_INPUT), 7641 { } /* end */ 7642 }; 7643 7644 /* iMac 24 init verbs. */ 7645 static struct hda_verb alc885_imac24_init_verbs[] = { 7646 /* Internal speakers: output 0 (0x0c) */ 7647 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 7648 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 7649 {0x18, AC_VERB_SET_CONNECT_SEL, 0x00}, 7650 /* Internal speakers: output 0 (0x0c) */ 7651 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 7652 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 7653 {0x1a, AC_VERB_SET_CONNECT_SEL, 0x00}, 7654 /* Headphone: output 0 (0x0c) */ 7655 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 7656 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 7657 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, 7658 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, 7659 /* Front Mic: input vref at 80% */ 7660 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, 7661 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 7662 { } 7663 }; 7664 7665 /* Toggle speaker-output according to the hp-jack state */ 7666 static void alc885_imac24_setup(struct hda_codec *codec) 7667 { 7668 struct alc_spec *spec = codec->spec; 7669 7670 spec->autocfg.hp_pins[0] = 0x14; 7671 spec->autocfg.speaker_pins[0] = 0x18; 7672 spec->autocfg.speaker_pins[1] = 0x1a; 7673 } 7674 7675 static void alc885_mbp3_setup(struct hda_codec *codec) 7676 { 7677 struct alc_spec *spec = codec->spec; 7678 7679 spec->autocfg.hp_pins[0] = 0x15; 7680 spec->autocfg.speaker_pins[0] = 0x14; 7681 } 7682 7683 static void alc885_imac91_automute(struct hda_codec *codec) 7684 { 7685 unsigned int present; 7686 7687 present = snd_hda_codec_read(codec, 0x14, 0, 7688 AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; 7689 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0, 7690 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0); 7691 snd_hda_codec_amp_stereo(codec, 0x1a, HDA_OUTPUT, 0, 7692 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0); 7693 7694 } 7695 7696 static void alc885_imac91_unsol_event(struct hda_codec *codec, 7697 unsigned int res) 7698 { 7699 /* Headphone insertion or removal. */ 7700 if ((res >> 26) == ALC880_HP_EVENT) 7701 alc885_imac91_automute(codec); 7702 } 7703 7704 static struct hda_verb alc882_targa_verbs[] = { 7705 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 7706 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 7707 7708 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 7709 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 7710 7711 {0x18, AC_VERB_SET_CONNECT_SEL, 0x02}, /* mic/clfe */ 7712 {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01}, /* line/surround */ 7713 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */ 7714 7715 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, 7716 { } /* end */ 7717 }; 7718 7719 /* toggle speaker-output according to the hp-jack state */ 7720 static void alc882_targa_automute(struct hda_codec *codec) 7721 { 7722 struct alc_spec *spec = codec->spec; 7723 alc_automute_amp(codec); 7724 snd_hda_codec_write_cache(codec, 1, 0, AC_VERB_SET_GPIO_DATA, 7725 spec->jack_present ? 1 : 3); 7726 } 7727 7728 static void alc882_targa_setup(struct hda_codec *codec) 7729 { 7730 struct alc_spec *spec = codec->spec; 7731 7732 spec->autocfg.hp_pins[0] = 0x14; 7733 spec->autocfg.speaker_pins[0] = 0x1b; 7734 } 7735 7736 static void alc882_targa_unsol_event(struct hda_codec *codec, unsigned int res) 7737 { 7738 if ((res >> 26) == ALC880_HP_EVENT) 7739 alc882_targa_automute(codec); 7740 } 7741 7742 static struct hda_verb alc882_asus_a7j_verbs[] = { 7743 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 7744 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 7745 7746 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 7747 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 7748 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 7749 7750 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Front */ 7751 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */ 7752 {0x16, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Front */ 7753 7754 {0x18, AC_VERB_SET_CONNECT_SEL, 0x02}, /* mic/clfe */ 7755 {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01}, /* line/surround */ 7756 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */ 7757 { } /* end */ 7758 }; 7759 7760 static struct hda_verb alc882_asus_a7m_verbs[] = { 7761 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 7762 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 7763 7764 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 7765 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 7766 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 7767 7768 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Front */ 7769 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */ 7770 {0x16, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Front */ 7771 7772 {0x18, AC_VERB_SET_CONNECT_SEL, 0x02}, /* mic/clfe */ 7773 {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01}, /* line/surround */ 7774 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */ 7775 { } /* end */ 7776 }; 7777 7778 static void alc882_gpio_mute(struct hda_codec *codec, int pin, int muted) 7779 { 7780 unsigned int gpiostate, gpiomask, gpiodir; 7781 7782 gpiostate = snd_hda_codec_read(codec, codec->afg, 0, 7783 AC_VERB_GET_GPIO_DATA, 0); 7784 7785 if (!muted) 7786 gpiostate |= (1 << pin); 7787 else 7788 gpiostate &= ~(1 << pin); 7789 7790 gpiomask = snd_hda_codec_read(codec, codec->afg, 0, 7791 AC_VERB_GET_GPIO_MASK, 0); 7792 gpiomask |= (1 << pin); 7793 7794 gpiodir = snd_hda_codec_read(codec, codec->afg, 0, 7795 AC_VERB_GET_GPIO_DIRECTION, 0); 7796 gpiodir |= (1 << pin); 7797 7798 7799 snd_hda_codec_write(codec, codec->afg, 0, 7800 AC_VERB_SET_GPIO_MASK, gpiomask); 7801 snd_hda_codec_write(codec, codec->afg, 0, 7802 AC_VERB_SET_GPIO_DIRECTION, gpiodir); 7803 7804 msleep(1); 7805 7806 snd_hda_codec_write(codec, codec->afg, 0, 7807 AC_VERB_SET_GPIO_DATA, gpiostate); 7808 } 7809 7810 /* set up GPIO at initialization */ 7811 static void alc885_macpro_init_hook(struct hda_codec *codec) 7812 { 7813 alc882_gpio_mute(codec, 0, 0); 7814 alc882_gpio_mute(codec, 1, 0); 7815 } 7816 7817 /* set up GPIO and update auto-muting at initialization */ 7818 static void alc885_imac24_init_hook(struct hda_codec *codec) 7819 { 7820 alc885_macpro_init_hook(codec); 7821 alc_automute_amp(codec); 7822 } 7823 7824 /* 7825 * generic initialization of ADC, input mixers and output mixers 7826 */ 7827 static struct hda_verb alc883_auto_init_verbs[] = { 7828 /* 7829 * Unmute ADC0-2 and set the default input to mic-in 7830 */ 7831 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00}, 7832 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 7833 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00}, 7834 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 7835 7836 /* Mute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback 7837 * mixer widget 7838 * Note: PASD motherboards uses the Line In 2 as the input for 7839 * front panel mic (mic 2) 7840 */ 7841 /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */ 7842 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 7843 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 7844 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, 7845 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, 7846 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, 7847 7848 /* 7849 * Set up output mixers (0x0c - 0x0f) 7850 */ 7851 /* set vol=0 to output mixers */ 7852 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 7853 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 7854 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 7855 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 7856 /* set up input amps for analog loopback */ 7857 /* Amp Indices: DAC = 0, mixer = 1 */ 7858 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 7859 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 7860 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 7861 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 7862 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 7863 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 7864 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 7865 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 7866 {0x26, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 7867 {0x26, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 7868 7869 /* FIXME: use matrix-type input source selection */ 7870 /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */ 7871 /* Input mixer2 */ 7872 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))}, 7873 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))}, 7874 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))}, 7875 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))}, 7876 /* Input mixer3 */ 7877 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))}, 7878 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))}, 7879 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))}, 7880 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))}, 7881 7882 { } 7883 }; 7884 7885 /* 2ch mode (Speaker:front, Subwoofer:CLFE, Line:input, Headphones:front) */ 7886 static struct hda_verb alc889A_mb31_ch2_init[] = { 7887 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP as front */ 7888 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Subwoofer on */ 7889 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, /* Line as input */ 7890 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, /* Line off */ 7891 { } /* end */ 7892 }; 7893 7894 /* 4ch mode (Speaker:front, Subwoofer:CLFE, Line:CLFE, Headphones:front) */ 7895 static struct hda_verb alc889A_mb31_ch4_init[] = { 7896 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP as front */ 7897 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Subwoofer on */ 7898 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, /* Line as output */ 7899 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Line on */ 7900 { } /* end */ 7901 }; 7902 7903 /* 5ch mode (Speaker:front, Subwoofer:CLFE, Line:input, Headphones:rear) */ 7904 static struct hda_verb alc889A_mb31_ch5_init[] = { 7905 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, /* HP as rear */ 7906 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Subwoofer on */ 7907 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, /* Line as input */ 7908 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, /* Line off */ 7909 { } /* end */ 7910 }; 7911 7912 /* 6ch mode (Speaker:front, Subwoofer:off, Line:CLFE, Headphones:Rear) */ 7913 static struct hda_verb alc889A_mb31_ch6_init[] = { 7914 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, /* HP as front */ 7915 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, /* Subwoofer off */ 7916 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, /* Line as output */ 7917 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Line on */ 7918 { } /* end */ 7919 }; 7920 7921 static struct hda_channel_mode alc889A_mb31_6ch_modes[4] = { 7922 { 2, alc889A_mb31_ch2_init }, 7923 { 4, alc889A_mb31_ch4_init }, 7924 { 5, alc889A_mb31_ch5_init }, 7925 { 6, alc889A_mb31_ch6_init }, 7926 }; 7927 7928 static struct hda_verb alc883_medion_eapd_verbs[] = { 7929 /* eanable EAPD on medion laptop */ 7930 {0x20, AC_VERB_SET_COEF_INDEX, 0x07}, 7931 {0x20, AC_VERB_SET_PROC_COEF, 0x3070}, 7932 { } 7933 }; 7934 7935 #define alc883_base_mixer alc882_base_mixer 7936 7937 static struct snd_kcontrol_new alc883_mitac_mixer[] = { 7938 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 7939 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 7940 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT), 7941 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT), 7942 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT), 7943 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT), 7944 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT), 7945 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 7946 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), 7947 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 7948 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), 7949 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT), 7950 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), 7951 { } /* end */ 7952 }; 7953 7954 static struct snd_kcontrol_new alc883_clevo_m720_mixer[] = { 7955 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 7956 HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT), 7957 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT), 7958 HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT), 7959 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 7960 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), 7961 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 7962 HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), 7963 HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT), 7964 HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), 7965 { } /* end */ 7966 }; 7967 7968 static struct snd_kcontrol_new alc883_2ch_fujitsu_pi2515_mixer[] = { 7969 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 7970 HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT), 7971 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT), 7972 HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT), 7973 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 7974 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), 7975 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 7976 HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), 7977 HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT), 7978 HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), 7979 { } /* end */ 7980 }; 7981 7982 static struct snd_kcontrol_new alc883_3ST_2ch_mixer[] = { 7983 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 7984 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 7985 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT), 7986 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), 7987 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), 7988 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), 7989 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), 7990 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 7991 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), 7992 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 7993 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), 7994 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT), 7995 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), 7996 { } /* end */ 7997 }; 7998 7999 static struct snd_kcontrol_new alc883_3ST_6ch_mixer[] = { 8000 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 8001 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 8002 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT), 8003 HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT), 8004 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT), 8005 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT), 8006 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT), 8007 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT), 8008 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT), 8009 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), 8010 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), 8011 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), 8012 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), 8013 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 8014 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), 8015 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 8016 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), 8017 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT), 8018 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), 8019 { } /* end */ 8020 }; 8021 8022 static struct snd_kcontrol_new alc883_3ST_6ch_intel_mixer[] = { 8023 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 8024 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 8025 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT), 8026 HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT), 8027 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, 8028 HDA_OUTPUT), 8029 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT), 8030 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT), 8031 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT), 8032 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT), 8033 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), 8034 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), 8035 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), 8036 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), 8037 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), 8038 HDA_CODEC_VOLUME("Mic Boost", 0x19, 0, HDA_INPUT), 8039 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), 8040 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 8041 HDA_CODEC_VOLUME("Front Mic Boost", 0x18, 0, HDA_INPUT), 8042 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 8043 { } /* end */ 8044 }; 8045 8046 static struct snd_kcontrol_new alc885_8ch_intel_mixer[] = { 8047 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 8048 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 8049 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT), 8050 HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT), 8051 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, 8052 HDA_OUTPUT), 8053 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT), 8054 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT), 8055 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT), 8056 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0f, 0x0, HDA_OUTPUT), 8057 HDA_BIND_MUTE("Speaker Playback Switch", 0x0f, 2, HDA_INPUT), 8058 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT), 8059 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), 8060 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), 8061 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x3, HDA_INPUT), 8062 HDA_CODEC_VOLUME("Mic Boost", 0x1b, 0, HDA_INPUT), 8063 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x3, HDA_INPUT), 8064 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 8065 HDA_CODEC_VOLUME("Front Mic Boost", 0x18, 0, HDA_INPUT), 8066 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 8067 { } /* end */ 8068 }; 8069 8070 static struct snd_kcontrol_new alc883_fivestack_mixer[] = { 8071 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 8072 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 8073 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT), 8074 HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT), 8075 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT), 8076 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT), 8077 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT), 8078 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT), 8079 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT), 8080 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), 8081 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), 8082 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), 8083 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), 8084 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 8085 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), 8086 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 8087 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), 8088 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT), 8089 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), 8090 { } /* end */ 8091 }; 8092 8093 static struct snd_kcontrol_new alc883_targa_mixer[] = { 8094 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 8095 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 8096 HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT), 8097 HDA_CODEC_MUTE("Speaker Playback Switch", 0x1b, 0x0, HDA_OUTPUT), 8098 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT), 8099 HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT), 8100 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT), 8101 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT), 8102 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT), 8103 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT), 8104 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), 8105 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), 8106 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), 8107 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), 8108 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 8109 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), 8110 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 8111 { } /* end */ 8112 }; 8113 8114 static struct snd_kcontrol_new alc883_targa_2ch_mixer[] = { 8115 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 8116 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 8117 HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT), 8118 HDA_CODEC_MUTE("Speaker Playback Switch", 0x1b, 0x0, HDA_OUTPUT), 8119 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), 8120 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), 8121 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 8122 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), 8123 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 8124 HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), 8125 HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT), 8126 HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), 8127 { } /* end */ 8128 }; 8129 8130 static struct snd_kcontrol_new alc883_targa_8ch_mixer[] = { 8131 HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT), 8132 HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT), 8133 HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), 8134 HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT), 8135 HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), 8136 { } /* end */ 8137 }; 8138 8139 static struct snd_kcontrol_new alc883_lenovo_101e_2ch_mixer[] = { 8140 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 8141 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 8142 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT), 8143 HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT), 8144 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT), 8145 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), 8146 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), 8147 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), 8148 { } /* end */ 8149 }; 8150 8151 static struct snd_kcontrol_new alc883_lenovo_nb0763_mixer[] = { 8152 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 8153 HDA_BIND_MUTE("Speaker Playback Switch", 0x0c, 2, HDA_INPUT), 8154 HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT), 8155 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), 8156 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), 8157 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 8158 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 8159 HDA_CODEC_VOLUME("iMic Playback Volume", 0x0b, 0x1, HDA_INPUT), 8160 HDA_CODEC_MUTE("iMic Playback Switch", 0x0b, 0x1, HDA_INPUT), 8161 { } /* end */ 8162 }; 8163 8164 static struct snd_kcontrol_new alc883_medion_md2_mixer[] = { 8165 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 8166 HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT), 8167 HDA_CODEC_MUTE("Front Playback Switch", 0x15, 0x0, HDA_OUTPUT), 8168 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), 8169 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), 8170 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 8171 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 8172 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), 8173 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), 8174 { } /* end */ 8175 }; 8176 8177 static struct snd_kcontrol_new alc883_acer_aspire_mixer[] = { 8178 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 8179 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 8180 HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT), 8181 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), 8182 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), 8183 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 8184 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), 8185 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 8186 { } /* end */ 8187 }; 8188 8189 static struct snd_kcontrol_new alc888_acer_aspire_6530_mixer[] = { 8190 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 8191 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 8192 HDA_CODEC_VOLUME("LFE Playback Volume", 0x0f, 0x0, HDA_OUTPUT), 8193 HDA_BIND_MUTE("LFE Playback Switch", 0x0f, 2, HDA_INPUT), 8194 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), 8195 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), 8196 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), 8197 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), 8198 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 8199 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), 8200 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 8201 { } /* end */ 8202 }; 8203 8204 static struct snd_kcontrol_new alc888_lenovo_sky_mixer[] = { 8205 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 8206 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 8207 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0e, 0x0, HDA_OUTPUT), 8208 HDA_BIND_MUTE("Surround Playback Switch", 0x0e, 2, HDA_INPUT), 8209 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 8210 0x0d, 1, 0x0, HDA_OUTPUT), 8211 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0d, 2, 0x0, HDA_OUTPUT), 8212 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0d, 1, 2, HDA_INPUT), 8213 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0d, 2, 2, HDA_INPUT), 8214 HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT), 8215 HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT), 8216 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), 8217 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), 8218 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), 8219 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), 8220 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 8221 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), 8222 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 8223 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), 8224 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT), 8225 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), 8226 { } /* end */ 8227 }; 8228 8229 static struct snd_kcontrol_new alc889A_mb31_mixer[] = { 8230 /* Output mixers */ 8231 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x00, HDA_OUTPUT), 8232 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 0x02, HDA_INPUT), 8233 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x00, HDA_OUTPUT), 8234 HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 0x02, HDA_INPUT), 8235 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x00, 8236 HDA_OUTPUT), 8237 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 0x02, HDA_INPUT), 8238 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x00, HDA_OUTPUT), 8239 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 0x02, HDA_INPUT), 8240 /* Output switches */ 8241 HDA_CODEC_MUTE("Enable Speaker", 0x14, 0x00, HDA_OUTPUT), 8242 HDA_CODEC_MUTE("Enable Headphones", 0x15, 0x00, HDA_OUTPUT), 8243 HDA_CODEC_MUTE_MONO("Enable LFE", 0x16, 2, 0x00, HDA_OUTPUT), 8244 /* Boost mixers */ 8245 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0x00, HDA_INPUT), 8246 HDA_CODEC_VOLUME("Line Boost", 0x1a, 0x00, HDA_INPUT), 8247 /* Input mixers */ 8248 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x00, HDA_INPUT), 8249 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x00, HDA_INPUT), 8250 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), 8251 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), 8252 { } /* end */ 8253 }; 8254 8255 static struct snd_kcontrol_new alc883_vaiott_mixer[] = { 8256 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 8257 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 8258 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT), 8259 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), 8260 HDA_CODEC_VOLUME("Mic Boost", 0x19, 0, HDA_INPUT), 8261 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), 8262 { } /* end */ 8263 }; 8264 8265 static struct hda_bind_ctls alc883_bind_cap_vol = { 8266 .ops = &snd_hda_bind_vol, 8267 .values = { 8268 HDA_COMPOSE_AMP_VAL(0x08, 3, 0, HDA_INPUT), 8269 HDA_COMPOSE_AMP_VAL(0x09, 3, 0, HDA_INPUT), 8270 0 8271 }, 8272 }; 8273 8274 static struct hda_bind_ctls alc883_bind_cap_switch = { 8275 .ops = &snd_hda_bind_sw, 8276 .values = { 8277 HDA_COMPOSE_AMP_VAL(0x08, 3, 0, HDA_INPUT), 8278 HDA_COMPOSE_AMP_VAL(0x09, 3, 0, HDA_INPUT), 8279 0 8280 }, 8281 }; 8282 8283 static struct snd_kcontrol_new alc883_asus_eee1601_mixer[] = { 8284 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 8285 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 8286 HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT), 8287 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), 8288 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), 8289 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 8290 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), 8291 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 8292 { } /* end */ 8293 }; 8294 8295 static struct snd_kcontrol_new alc883_asus_eee1601_cap_mixer[] = { 8296 HDA_BIND_VOL("Capture Volume", &alc883_bind_cap_vol), 8297 HDA_BIND_SW("Capture Switch", &alc883_bind_cap_switch), 8298 { 8299 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 8300 /* .name = "Capture Source", */ 8301 .name = "Input Source", 8302 .count = 1, 8303 .info = alc_mux_enum_info, 8304 .get = alc_mux_enum_get, 8305 .put = alc_mux_enum_put, 8306 }, 8307 { } /* end */ 8308 }; 8309 8310 static struct snd_kcontrol_new alc883_chmode_mixer[] = { 8311 { 8312 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 8313 .name = "Channel Mode", 8314 .info = alc_ch_mode_info, 8315 .get = alc_ch_mode_get, 8316 .put = alc_ch_mode_put, 8317 }, 8318 { } /* end */ 8319 }; 8320 8321 /* toggle speaker-output according to the hp-jack state */ 8322 static void alc883_mitac_setup(struct hda_codec *codec) 8323 { 8324 struct alc_spec *spec = codec->spec; 8325 8326 spec->autocfg.hp_pins[0] = 0x15; 8327 spec->autocfg.speaker_pins[0] = 0x14; 8328 spec->autocfg.speaker_pins[1] = 0x17; 8329 } 8330 8331 /* auto-toggle front mic */ 8332 /* 8333 static void alc883_mitac_mic_automute(struct hda_codec *codec) 8334 { 8335 unsigned char bits = snd_hda_jack_detect(codec, 0x18) ? HDA_AMP_MUTE : 0; 8336 8337 snd_hda_codec_amp_stereo(codec, 0x0b, HDA_INPUT, 1, HDA_AMP_MUTE, bits); 8338 } 8339 */ 8340 8341 static struct hda_verb alc883_mitac_verbs[] = { 8342 /* HP */ 8343 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, 8344 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 8345 /* Subwoofer */ 8346 {0x17, AC_VERB_SET_CONNECT_SEL, 0x02}, 8347 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 8348 8349 /* enable unsolicited event */ 8350 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, 8351 /* {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN}, */ 8352 8353 { } /* end */ 8354 }; 8355 8356 static struct hda_verb alc883_clevo_m540r_verbs[] = { 8357 /* HP */ 8358 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, 8359 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 8360 /* Int speaker */ 8361 /*{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},*/ 8362 8363 /* enable unsolicited event */ 8364 /* 8365 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, 8366 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN}, 8367 */ 8368 8369 { } /* end */ 8370 }; 8371 8372 static struct hda_verb alc883_clevo_m720_verbs[] = { 8373 /* HP */ 8374 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, 8375 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 8376 /* Int speaker */ 8377 {0x14, AC_VERB_SET_CONNECT_SEL, 0x01}, 8378 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 8379 8380 /* enable unsolicited event */ 8381 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, 8382 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN}, 8383 8384 { } /* end */ 8385 }; 8386 8387 static struct hda_verb alc883_2ch_fujitsu_pi2515_verbs[] = { 8388 /* HP */ 8389 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, 8390 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 8391 /* Subwoofer */ 8392 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, 8393 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 8394 8395 /* enable unsolicited event */ 8396 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, 8397 8398 { } /* end */ 8399 }; 8400 8401 static struct hda_verb alc883_targa_verbs[] = { 8402 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 8403 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 8404 8405 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 8406 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 8407 8408 /* Connect Line-Out side jack (SPDIF) to Side */ 8409 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 8410 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 8411 {0x17, AC_VERB_SET_CONNECT_SEL, 0x03}, 8412 /* Connect Mic jack to CLFE */ 8413 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 8414 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 8415 {0x18, AC_VERB_SET_CONNECT_SEL, 0x02}, 8416 /* Connect Line-in jack to Surround */ 8417 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 8418 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 8419 {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01}, 8420 /* Connect HP out jack to Front */ 8421 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 8422 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 8423 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, 8424 8425 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, 8426 8427 { } /* end */ 8428 }; 8429 8430 static struct hda_verb alc883_lenovo_101e_verbs[] = { 8431 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, 8432 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_FRONT_EVENT|AC_USRSP_EN}, 8433 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT|AC_USRSP_EN}, 8434 { } /* end */ 8435 }; 8436 8437 static struct hda_verb alc883_lenovo_nb0763_verbs[] = { 8438 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, 8439 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 8440 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, 8441 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 8442 { } /* end */ 8443 }; 8444 8445 static struct hda_verb alc888_lenovo_ms7195_verbs[] = { 8446 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 8447 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 8448 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, 8449 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_FRONT_EVENT | AC_USRSP_EN}, 8450 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, 8451 { } /* end */ 8452 }; 8453 8454 static struct hda_verb alc883_haier_w66_verbs[] = { 8455 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 8456 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 8457 8458 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 8459 8460 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, 8461 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 8462 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, 8463 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 8464 { } /* end */ 8465 }; 8466 8467 static struct hda_verb alc888_lenovo_sky_verbs[] = { 8468 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 8469 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 8470 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 8471 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 8472 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 8473 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 8474 {0x1a, AC_VERB_SET_CONNECT_SEL, 0x00}, 8475 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, 8476 { } /* end */ 8477 }; 8478 8479 static struct hda_verb alc888_6st_dell_verbs[] = { 8480 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, 8481 { } 8482 }; 8483 8484 static struct hda_verb alc883_vaiott_verbs[] = { 8485 /* HP */ 8486 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, 8487 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 8488 8489 /* enable unsolicited event */ 8490 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, 8491 8492 { } /* end */ 8493 }; 8494 8495 static void alc888_3st_hp_setup(struct hda_codec *codec) 8496 { 8497 struct alc_spec *spec = codec->spec; 8498 8499 spec->autocfg.hp_pins[0] = 0x1b; 8500 spec->autocfg.speaker_pins[0] = 0x14; 8501 spec->autocfg.speaker_pins[1] = 0x16; 8502 spec->autocfg.speaker_pins[2] = 0x18; 8503 } 8504 8505 static struct hda_verb alc888_3st_hp_verbs[] = { 8506 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Front: output 0 (0x0c) */ 8507 {0x16, AC_VERB_SET_CONNECT_SEL, 0x01}, /* Rear : output 1 (0x0d) */ 8508 {0x18, AC_VERB_SET_CONNECT_SEL, 0x02}, /* CLFE : output 2 (0x0e) */ 8509 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, 8510 { } /* end */ 8511 }; 8512 8513 /* 8514 * 2ch mode 8515 */ 8516 static struct hda_verb alc888_3st_hp_2ch_init[] = { 8517 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, 8518 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE }, 8519 { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN }, 8520 { 0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE }, 8521 { } /* end */ 8522 }; 8523 8524 /* 8525 * 4ch mode 8526 */ 8527 static struct hda_verb alc888_3st_hp_4ch_init[] = { 8528 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, 8529 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE }, 8530 { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 8531 { 0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 8532 { 0x16, AC_VERB_SET_CONNECT_SEL, 0x01 }, 8533 { } /* end */ 8534 }; 8535 8536 /* 8537 * 6ch mode 8538 */ 8539 static struct hda_verb alc888_3st_hp_6ch_init[] = { 8540 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 8541 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 8542 { 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 }, 8543 { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 8544 { 0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 8545 { 0x16, AC_VERB_SET_CONNECT_SEL, 0x01 }, 8546 { } /* end */ 8547 }; 8548 8549 static struct hda_channel_mode alc888_3st_hp_modes[3] = { 8550 { 2, alc888_3st_hp_2ch_init }, 8551 { 4, alc888_3st_hp_4ch_init }, 8552 { 6, alc888_3st_hp_6ch_init }, 8553 }; 8554 8555 /* toggle front-jack and RCA according to the hp-jack state */ 8556 static void alc888_lenovo_ms7195_front_automute(struct hda_codec *codec) 8557 { 8558 unsigned int present = snd_hda_jack_detect(codec, 0x1b); 8559 8560 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0, 8561 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0); 8562 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0, 8563 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0); 8564 } 8565 8566 /* toggle RCA according to the front-jack state */ 8567 static void alc888_lenovo_ms7195_rca_automute(struct hda_codec *codec) 8568 { 8569 unsigned int present = snd_hda_jack_detect(codec, 0x14); 8570 8571 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0, 8572 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0); 8573 } 8574 8575 static void alc883_lenovo_ms7195_unsol_event(struct hda_codec *codec, 8576 unsigned int res) 8577 { 8578 if ((res >> 26) == ALC880_HP_EVENT) 8579 alc888_lenovo_ms7195_front_automute(codec); 8580 if ((res >> 26) == ALC880_FRONT_EVENT) 8581 alc888_lenovo_ms7195_rca_automute(codec); 8582 } 8583 8584 static struct hda_verb alc883_medion_md2_verbs[] = { 8585 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 8586 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 8587 8588 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 8589 8590 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, 8591 { } /* end */ 8592 }; 8593 8594 /* toggle speaker-output according to the hp-jack state */ 8595 static void alc883_medion_md2_setup(struct hda_codec *codec) 8596 { 8597 struct alc_spec *spec = codec->spec; 8598 8599 spec->autocfg.hp_pins[0] = 0x14; 8600 spec->autocfg.speaker_pins[0] = 0x15; 8601 } 8602 8603 /* toggle speaker-output according to the hp-jack state */ 8604 #define alc883_targa_init_hook alc882_targa_init_hook 8605 #define alc883_targa_unsol_event alc882_targa_unsol_event 8606 8607 static void alc883_clevo_m720_mic_automute(struct hda_codec *codec) 8608 { 8609 unsigned int present; 8610 8611 present = snd_hda_jack_detect(codec, 0x18); 8612 snd_hda_codec_amp_stereo(codec, 0x0b, HDA_INPUT, 1, 8613 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0); 8614 } 8615 8616 static void alc883_clevo_m720_setup(struct hda_codec *codec) 8617 { 8618 struct alc_spec *spec = codec->spec; 8619 8620 spec->autocfg.hp_pins[0] = 0x15; 8621 spec->autocfg.speaker_pins[0] = 0x14; 8622 } 8623 8624 static void alc883_clevo_m720_init_hook(struct hda_codec *codec) 8625 { 8626 alc_automute_amp(codec); 8627 alc883_clevo_m720_mic_automute(codec); 8628 } 8629 8630 static void alc883_clevo_m720_unsol_event(struct hda_codec *codec, 8631 unsigned int res) 8632 { 8633 switch (res >> 26) { 8634 case ALC880_MIC_EVENT: 8635 alc883_clevo_m720_mic_automute(codec); 8636 break; 8637 default: 8638 alc_automute_amp_unsol_event(codec, res); 8639 break; 8640 } 8641 } 8642 8643 /* toggle speaker-output according to the hp-jack state */ 8644 static void alc883_2ch_fujitsu_pi2515_setup(struct hda_codec *codec) 8645 { 8646 struct alc_spec *spec = codec->spec; 8647 8648 spec->autocfg.hp_pins[0] = 0x14; 8649 spec->autocfg.speaker_pins[0] = 0x15; 8650 } 8651 8652 static void alc883_haier_w66_setup(struct hda_codec *codec) 8653 { 8654 struct alc_spec *spec = codec->spec; 8655 8656 spec->autocfg.hp_pins[0] = 0x1b; 8657 spec->autocfg.speaker_pins[0] = 0x14; 8658 } 8659 8660 static void alc883_lenovo_101e_ispeaker_automute(struct hda_codec *codec) 8661 { 8662 int bits = snd_hda_jack_detect(codec, 0x14) ? HDA_AMP_MUTE : 0; 8663 8664 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0, 8665 HDA_AMP_MUTE, bits); 8666 } 8667 8668 static void alc883_lenovo_101e_all_automute(struct hda_codec *codec) 8669 { 8670 int bits = snd_hda_jack_detect(codec, 0x1b) ? HDA_AMP_MUTE : 0; 8671 8672 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0, 8673 HDA_AMP_MUTE, bits); 8674 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0, 8675 HDA_AMP_MUTE, bits); 8676 } 8677 8678 static void alc883_lenovo_101e_unsol_event(struct hda_codec *codec, 8679 unsigned int res) 8680 { 8681 if ((res >> 26) == ALC880_HP_EVENT) 8682 alc883_lenovo_101e_all_automute(codec); 8683 if ((res >> 26) == ALC880_FRONT_EVENT) 8684 alc883_lenovo_101e_ispeaker_automute(codec); 8685 } 8686 8687 /* toggle speaker-output according to the hp-jack state */ 8688 static void alc883_acer_aspire_setup(struct hda_codec *codec) 8689 { 8690 struct alc_spec *spec = codec->spec; 8691 8692 spec->autocfg.hp_pins[0] = 0x14; 8693 spec->autocfg.speaker_pins[0] = 0x15; 8694 spec->autocfg.speaker_pins[1] = 0x16; 8695 } 8696 8697 static struct hda_verb alc883_acer_eapd_verbs[] = { 8698 /* HP Pin: output 0 (0x0c) */ 8699 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 8700 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 8701 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, 8702 /* Front Pin: output 0 (0x0c) */ 8703 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 8704 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, 8705 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 8706 {0x16, AC_VERB_SET_CONNECT_SEL, 0x00}, 8707 /* eanable EAPD on medion laptop */ 8708 {0x20, AC_VERB_SET_COEF_INDEX, 0x07}, 8709 {0x20, AC_VERB_SET_PROC_COEF, 0x3050}, 8710 /* enable unsolicited event */ 8711 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, 8712 { } 8713 }; 8714 8715 static struct hda_verb alc888_acer_aspire_7730G_verbs[] = { 8716 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, 8717 {0x17, AC_VERB_SET_CONNECT_SEL, 0x02}, 8718 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, 8719 { } /* end */ 8720 }; 8721 8722 static void alc888_6st_dell_setup(struct hda_codec *codec) 8723 { 8724 struct alc_spec *spec = codec->spec; 8725 8726 spec->autocfg.hp_pins[0] = 0x1b; 8727 spec->autocfg.speaker_pins[0] = 0x14; 8728 spec->autocfg.speaker_pins[1] = 0x15; 8729 spec->autocfg.speaker_pins[2] = 0x16; 8730 spec->autocfg.speaker_pins[3] = 0x17; 8731 } 8732 8733 static void alc888_lenovo_sky_setup(struct hda_codec *codec) 8734 { 8735 struct alc_spec *spec = codec->spec; 8736 8737 spec->autocfg.hp_pins[0] = 0x1b; 8738 spec->autocfg.speaker_pins[0] = 0x14; 8739 spec->autocfg.speaker_pins[1] = 0x15; 8740 spec->autocfg.speaker_pins[2] = 0x16; 8741 spec->autocfg.speaker_pins[3] = 0x17; 8742 spec->autocfg.speaker_pins[4] = 0x1a; 8743 } 8744 8745 static void alc883_vaiott_setup(struct hda_codec *codec) 8746 { 8747 struct alc_spec *spec = codec->spec; 8748 8749 spec->autocfg.hp_pins[0] = 0x15; 8750 spec->autocfg.speaker_pins[0] = 0x14; 8751 spec->autocfg.speaker_pins[1] = 0x17; 8752 } 8753 8754 static struct hda_verb alc888_asus_m90v_verbs[] = { 8755 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 8756 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 8757 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 8758 /* enable unsolicited event */ 8759 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, 8760 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN}, 8761 { } /* end */ 8762 }; 8763 8764 static void alc883_mode2_setup(struct hda_codec *codec) 8765 { 8766 struct alc_spec *spec = codec->spec; 8767 8768 spec->autocfg.hp_pins[0] = 0x1b; 8769 spec->autocfg.speaker_pins[0] = 0x14; 8770 spec->autocfg.speaker_pins[1] = 0x15; 8771 spec->autocfg.speaker_pins[2] = 0x16; 8772 spec->ext_mic.pin = 0x18; 8773 spec->int_mic.pin = 0x19; 8774 spec->ext_mic.mux_idx = 0; 8775 spec->int_mic.mux_idx = 1; 8776 spec->auto_mic = 1; 8777 } 8778 8779 static struct hda_verb alc888_asus_eee1601_verbs[] = { 8780 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 8781 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 8782 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 8783 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 8784 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 8785 {0x20, AC_VERB_SET_COEF_INDEX, 0x0b}, 8786 {0x20, AC_VERB_SET_PROC_COEF, 0x0838}, 8787 /* enable unsolicited event */ 8788 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, 8789 { } /* end */ 8790 }; 8791 8792 static void alc883_eee1601_inithook(struct hda_codec *codec) 8793 { 8794 struct alc_spec *spec = codec->spec; 8795 8796 spec->autocfg.hp_pins[0] = 0x14; 8797 spec->autocfg.speaker_pins[0] = 0x1b; 8798 alc_automute_pin(codec); 8799 } 8800 8801 static struct hda_verb alc889A_mb31_verbs[] = { 8802 /* Init rear pin (used as headphone output) */ 8803 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc4}, /* Apple Headphones */ 8804 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Connect to front */ 8805 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, 8806 /* Init line pin (used as output in 4ch and 6ch mode) */ 8807 {0x1a, AC_VERB_SET_CONNECT_SEL, 0x02}, /* Connect to CLFE */ 8808 /* Init line 2 pin (used as headphone out by default) */ 8809 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, /* Use as input */ 8810 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, /* Mute output */ 8811 { } /* end */ 8812 }; 8813 8814 /* Mute speakers according to the headphone jack state */ 8815 static void alc889A_mb31_automute(struct hda_codec *codec) 8816 { 8817 unsigned int present; 8818 8819 /* Mute only in 2ch or 4ch mode */ 8820 if (snd_hda_codec_read(codec, 0x15, 0, AC_VERB_GET_CONNECT_SEL, 0) 8821 == 0x00) { 8822 present = snd_hda_jack_detect(codec, 0x15); 8823 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0, 8824 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0); 8825 snd_hda_codec_amp_stereo(codec, 0x16, HDA_OUTPUT, 0, 8826 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0); 8827 } 8828 } 8829 8830 static void alc889A_mb31_unsol_event(struct hda_codec *codec, unsigned int res) 8831 { 8832 if ((res >> 26) == ALC880_HP_EVENT) 8833 alc889A_mb31_automute(codec); 8834 } 8835 8836 8837 #ifdef CONFIG_SND_HDA_POWER_SAVE 8838 #define alc882_loopbacks alc880_loopbacks 8839 #endif 8840 8841 /* pcm configuration: identical with ALC880 */ 8842 #define alc882_pcm_analog_playback alc880_pcm_analog_playback 8843 #define alc882_pcm_analog_capture alc880_pcm_analog_capture 8844 #define alc882_pcm_digital_playback alc880_pcm_digital_playback 8845 #define alc882_pcm_digital_capture alc880_pcm_digital_capture 8846 8847 static hda_nid_t alc883_slave_dig_outs[] = { 8848 ALC1200_DIGOUT_NID, 0, 8849 }; 8850 8851 static hda_nid_t alc1200_slave_dig_outs[] = { 8852 ALC883_DIGOUT_NID, 0, 8853 }; 8854 8855 /* 8856 * configuration and preset 8857 */ 8858 static const char *alc882_models[ALC882_MODEL_LAST] = { 8859 [ALC882_3ST_DIG] = "3stack-dig", 8860 [ALC882_6ST_DIG] = "6stack-dig", 8861 [ALC882_ARIMA] = "arima", 8862 [ALC882_W2JC] = "w2jc", 8863 [ALC882_TARGA] = "targa", 8864 [ALC882_ASUS_A7J] = "asus-a7j", 8865 [ALC882_ASUS_A7M] = "asus-a7m", 8866 [ALC885_MACPRO] = "macpro", 8867 [ALC885_MB5] = "mb5", 8868 [ALC885_MBP3] = "mbp3", 8869 [ALC885_IMAC24] = "imac24", 8870 [ALC885_IMAC91] = "imac91", 8871 [ALC883_3ST_2ch_DIG] = "3stack-2ch-dig", 8872 [ALC883_3ST_6ch_DIG] = "3stack-6ch-dig", 8873 [ALC883_3ST_6ch] = "3stack-6ch", 8874 [ALC883_6ST_DIG] = "alc883-6stack-dig", 8875 [ALC883_TARGA_DIG] = "targa-dig", 8876 [ALC883_TARGA_2ch_DIG] = "targa-2ch-dig", 8877 [ALC883_TARGA_8ch_DIG] = "targa-8ch-dig", 8878 [ALC883_ACER] = "acer", 8879 [ALC883_ACER_ASPIRE] = "acer-aspire", 8880 [ALC888_ACER_ASPIRE_4930G] = "acer-aspire-4930g", 8881 [ALC888_ACER_ASPIRE_6530G] = "acer-aspire-6530g", 8882 [ALC888_ACER_ASPIRE_8930G] = "acer-aspire-8930g", 8883 [ALC888_ACER_ASPIRE_7730G] = "acer-aspire-7730g", 8884 [ALC883_MEDION] = "medion", 8885 [ALC883_MEDION_MD2] = "medion-md2", 8886 [ALC883_LAPTOP_EAPD] = "laptop-eapd", 8887 [ALC883_LENOVO_101E_2ch] = "lenovo-101e", 8888 [ALC883_LENOVO_NB0763] = "lenovo-nb0763", 8889 [ALC888_LENOVO_MS7195_DIG] = "lenovo-ms7195-dig", 8890 [ALC888_LENOVO_SKY] = "lenovo-sky", 8891 [ALC883_HAIER_W66] = "haier-w66", 8892 [ALC888_3ST_HP] = "3stack-hp", 8893 [ALC888_6ST_DELL] = "6stack-dell", 8894 [ALC883_MITAC] = "mitac", 8895 [ALC883_CLEVO_M540R] = "clevo-m540r", 8896 [ALC883_CLEVO_M720] = "clevo-m720", 8897 [ALC883_FUJITSU_PI2515] = "fujitsu-pi2515", 8898 [ALC888_FUJITSU_XA3530] = "fujitsu-xa3530", 8899 [ALC883_3ST_6ch_INTEL] = "3stack-6ch-intel", 8900 [ALC889A_INTEL] = "intel-alc889a", 8901 [ALC889_INTEL] = "intel-x58", 8902 [ALC1200_ASUS_P5Q] = "asus-p5q", 8903 [ALC889A_MB31] = "mb31", 8904 [ALC883_SONY_VAIO_TT] = "sony-vaio-tt", 8905 [ALC882_AUTO] = "auto", 8906 }; 8907 8908 static struct snd_pci_quirk alc882_cfg_tbl[] = { 8909 SND_PCI_QUIRK(0x1019, 0x6668, "ECS", ALC882_6ST_DIG), 8910 8911 SND_PCI_QUIRK(0x1025, 0x006c, "Acer Aspire 9810", ALC883_ACER_ASPIRE), 8912 SND_PCI_QUIRK(0x1025, 0x0090, "Acer Aspire", ALC883_ACER_ASPIRE), 8913 SND_PCI_QUIRK(0x1025, 0x010a, "Acer Ferrari 5000", ALC883_ACER_ASPIRE), 8914 SND_PCI_QUIRK(0x1025, 0x0110, "Acer Aspire", ALC883_ACER_ASPIRE), 8915 SND_PCI_QUIRK(0x1025, 0x0112, "Acer Aspire 9303", ALC883_ACER_ASPIRE), 8916 SND_PCI_QUIRK(0x1025, 0x0121, "Acer Aspire 5920G", ALC883_ACER_ASPIRE), 8917 SND_PCI_QUIRK(0x1025, 0x013e, "Acer Aspire 4930G", 8918 ALC888_ACER_ASPIRE_4930G), 8919 SND_PCI_QUIRK(0x1025, 0x013f, "Acer Aspire 5930G", 8920 ALC888_ACER_ASPIRE_4930G), 8921 SND_PCI_QUIRK(0x1025, 0x0145, "Acer Aspire 8930G", 8922 ALC888_ACER_ASPIRE_8930G), 8923 SND_PCI_QUIRK(0x1025, 0x0146, "Acer Aspire 6935G", 8924 ALC888_ACER_ASPIRE_8930G), 8925 SND_PCI_QUIRK(0x1025, 0x0157, "Acer X3200", ALC882_AUTO), 8926 SND_PCI_QUIRK(0x1025, 0x0158, "Acer AX1700-U3700A", ALC882_AUTO), 8927 SND_PCI_QUIRK(0x1025, 0x015e, "Acer Aspire 6930G", 8928 ALC888_ACER_ASPIRE_6530G), 8929 SND_PCI_QUIRK(0x1025, 0x0166, "Acer Aspire 6530G", 8930 ALC888_ACER_ASPIRE_6530G), 8931 SND_PCI_QUIRK(0x1025, 0x0142, "Acer Aspire 7730G", 8932 ALC888_ACER_ASPIRE_7730G), 8933 /* default Acer -- disabled as it causes more problems. 8934 * model=auto should work fine now 8935 */ 8936 /* SND_PCI_QUIRK_VENDOR(0x1025, "Acer laptop", ALC883_ACER), */ 8937 8938 SND_PCI_QUIRK(0x1028, 0x020d, "Dell Inspiron 530", ALC888_6ST_DELL), 8939 8940 SND_PCI_QUIRK(0x103c, 0x2a3d, "HP Pavillion", ALC883_6ST_DIG), 8941 SND_PCI_QUIRK(0x103c, 0x2a4f, "HP Samba", ALC888_3ST_HP), 8942 SND_PCI_QUIRK(0x103c, 0x2a60, "HP Lucknow", ALC888_3ST_HP), 8943 SND_PCI_QUIRK(0x103c, 0x2a61, "HP Nettle", ALC883_6ST_DIG), 8944 SND_PCI_QUIRK(0x103c, 0x2a66, "HP Acacia", ALC888_3ST_HP), 8945 SND_PCI_QUIRK(0x103c, 0x2a72, "HP Educ.ar", ALC888_3ST_HP), 8946 8947 SND_PCI_QUIRK(0x1043, 0x060d, "Asus A7J", ALC882_ASUS_A7J), 8948 SND_PCI_QUIRK(0x1043, 0x1243, "Asus A7J", ALC882_ASUS_A7J), 8949 SND_PCI_QUIRK(0x1043, 0x13c2, "Asus A7M", ALC882_ASUS_A7M), 8950 SND_PCI_QUIRK(0x1043, 0x1873, "Asus M90V", ALC888_ASUS_M90V), 8951 SND_PCI_QUIRK(0x1043, 0x1971, "Asus W2JC", ALC882_W2JC), 8952 SND_PCI_QUIRK(0x1043, 0x817f, "Asus P5LD2", ALC882_6ST_DIG), 8953 SND_PCI_QUIRK(0x1043, 0x81d8, "Asus P5WD", ALC882_6ST_DIG), 8954 SND_PCI_QUIRK(0x1043, 0x8249, "Asus M2A-VM HDMI", ALC883_3ST_6ch_DIG), 8955 SND_PCI_QUIRK(0x1043, 0x8284, "Asus Z37E", ALC883_6ST_DIG), 8956 SND_PCI_QUIRK(0x1043, 0x82fe, "Asus P5Q-EM HDMI", ALC1200_ASUS_P5Q), 8957 SND_PCI_QUIRK(0x1043, 0x835f, "Asus Eee 1601", ALC888_ASUS_EEE1601), 8958 8959 SND_PCI_QUIRK(0x104d, 0x9047, "Sony Vaio TT", ALC883_SONY_VAIO_TT), 8960 SND_PCI_QUIRK(0x105b, 0x0ce8, "Foxconn P35AX-S", ALC883_6ST_DIG), 8961 SND_PCI_QUIRK(0x105b, 0x6668, "Foxconn", ALC882_6ST_DIG), 8962 SND_PCI_QUIRK(0x1071, 0x8227, "Mitac 82801H", ALC883_MITAC), 8963 SND_PCI_QUIRK(0x1071, 0x8253, "Mitac 8252d", ALC883_MITAC), 8964 SND_PCI_QUIRK(0x1071, 0x8258, "Evesham Voyaeger", ALC883_LAPTOP_EAPD), 8965 SND_PCI_QUIRK(0x10f1, 0x2350, "TYAN-S2350", ALC888_6ST_DELL), 8966 SND_PCI_QUIRK(0x108e, 0x534d, NULL, ALC883_3ST_6ch), 8967 SND_PCI_QUIRK(0x1458, 0xa002, "Gigabyte P35 DS3R", ALC882_6ST_DIG), 8968 8969 SND_PCI_QUIRK(0x1462, 0x0349, "MSI", ALC883_TARGA_2ch_DIG), 8970 SND_PCI_QUIRK(0x1462, 0x040d, "MSI", ALC883_TARGA_2ch_DIG), 8971 SND_PCI_QUIRK(0x1462, 0x0579, "MSI", ALC883_TARGA_2ch_DIG), 8972 SND_PCI_QUIRK(0x1462, 0x28fb, "Targa T8", ALC882_TARGA), /* MSI-1049 T8 */ 8973 SND_PCI_QUIRK(0x1462, 0x2fb3, "MSI", ALC882_AUTO), 8974 SND_PCI_QUIRK(0x1462, 0x6668, "MSI", ALC882_6ST_DIG), 8975 SND_PCI_QUIRK(0x1462, 0x3729, "MSI S420", ALC883_TARGA_DIG), 8976 SND_PCI_QUIRK(0x1462, 0x3783, "NEC S970", ALC883_TARGA_DIG), 8977 SND_PCI_QUIRK(0x1462, 0x3b7f, "MSI", ALC883_TARGA_2ch_DIG), 8978 SND_PCI_QUIRK(0x1462, 0x3ef9, "MSI", ALC883_TARGA_DIG), 8979 SND_PCI_QUIRK(0x1462, 0x3fc1, "MSI", ALC883_TARGA_DIG), 8980 SND_PCI_QUIRK(0x1462, 0x3fc3, "MSI", ALC883_TARGA_DIG), 8981 SND_PCI_QUIRK(0x1462, 0x3fcc, "MSI", ALC883_TARGA_DIG), 8982 SND_PCI_QUIRK(0x1462, 0x3fdf, "MSI", ALC883_TARGA_DIG), 8983 SND_PCI_QUIRK(0x1462, 0x42cd, "MSI", ALC883_TARGA_DIG), 8984 SND_PCI_QUIRK(0x1462, 0x4314, "MSI", ALC883_TARGA_DIG), 8985 SND_PCI_QUIRK(0x1462, 0x4319, "MSI", ALC883_TARGA_DIG), 8986 SND_PCI_QUIRK(0x1462, 0x4324, "MSI", ALC883_TARGA_DIG), 8987 SND_PCI_QUIRK(0x1462, 0x6510, "MSI GX620", ALC883_TARGA_8ch_DIG), 8988 SND_PCI_QUIRK(0x1462, 0x6668, "MSI", ALC883_6ST_DIG), 8989 SND_PCI_QUIRK(0x1462, 0x7187, "MSI", ALC883_6ST_DIG), 8990 SND_PCI_QUIRK(0x1462, 0x7250, "MSI", ALC883_6ST_DIG), 8991 SND_PCI_QUIRK(0x1462, 0x7260, "MSI 7260", ALC883_TARGA_DIG), 8992 SND_PCI_QUIRK(0x1462, 0x7267, "MSI", ALC883_3ST_6ch_DIG), 8993 SND_PCI_QUIRK(0x1462, 0x7280, "MSI", ALC883_6ST_DIG), 8994 SND_PCI_QUIRK(0x1462, 0x7327, "MSI", ALC883_6ST_DIG), 8995 SND_PCI_QUIRK(0x1462, 0x7350, "MSI", ALC883_6ST_DIG), 8996 SND_PCI_QUIRK(0x1462, 0xa422, "MSI", ALC883_TARGA_2ch_DIG), 8997 SND_PCI_QUIRK(0x1462, 0xaa08, "MSI", ALC883_TARGA_2ch_DIG), 8998 8999 SND_PCI_QUIRK(0x147b, 0x1083, "Abit IP35-PRO", ALC883_6ST_DIG), 9000 SND_PCI_QUIRK(0x1558, 0x0721, "Clevo laptop M720R", ALC883_CLEVO_M720), 9001 SND_PCI_QUIRK(0x1558, 0x0722, "Clevo laptop M720SR", ALC883_CLEVO_M720), 9002 SND_PCI_QUIRK(0x1558, 0x5409, "Clevo laptop M540R", ALC883_CLEVO_M540R), 9003 SND_PCI_QUIRK_VENDOR(0x1558, "Clevo laptop", ALC883_LAPTOP_EAPD), 9004 SND_PCI_QUIRK(0x15d9, 0x8780, "Supermicro PDSBA", ALC883_3ST_6ch), 9005 /* SND_PCI_QUIRK(0x161f, 0x2054, "Arima W820", ALC882_ARIMA), */ 9006 SND_PCI_QUIRK(0x161f, 0x2054, "Medion laptop", ALC883_MEDION), 9007 SND_PCI_QUIRK_MASK(0x1734, 0xfff0, 0x1100, "FSC AMILO Xi/Pi25xx", 9008 ALC883_FUJITSU_PI2515), 9009 SND_PCI_QUIRK_MASK(0x1734, 0xfff0, 0x1130, "Fujitsu AMILO Xa35xx", 9010 ALC888_FUJITSU_XA3530), 9011 SND_PCI_QUIRK(0x17aa, 0x101e, "Lenovo 101e", ALC883_LENOVO_101E_2ch), 9012 SND_PCI_QUIRK(0x17aa, 0x2085, "Lenovo NB0763", ALC883_LENOVO_NB0763), 9013 SND_PCI_QUIRK(0x17aa, 0x3bfc, "Lenovo NB0763", ALC883_LENOVO_NB0763), 9014 SND_PCI_QUIRK(0x17aa, 0x3bfd, "Lenovo NB0763", ALC883_LENOVO_NB0763), 9015 SND_PCI_QUIRK(0x17aa, 0x101d, "Lenovo Sky", ALC888_LENOVO_SKY), 9016 SND_PCI_QUIRK(0x17c0, 0x4071, "MEDION MD2", ALC883_MEDION_MD2), 9017 SND_PCI_QUIRK(0x17c0, 0x4085, "MEDION MD96630", ALC888_LENOVO_MS7195_DIG), 9018 SND_PCI_QUIRK(0x17f2, 0x5000, "Albatron KI690-AM2", ALC883_6ST_DIG), 9019 SND_PCI_QUIRK(0x1991, 0x5625, "Haier W66", ALC883_HAIER_W66), 9020 9021 SND_PCI_QUIRK(0x8086, 0x0001, "DG33BUC", ALC883_3ST_6ch_INTEL), 9022 SND_PCI_QUIRK(0x8086, 0x0002, "DG33FBC", ALC883_3ST_6ch_INTEL), 9023 SND_PCI_QUIRK(0x8086, 0x2503, "82801H", ALC883_MITAC), 9024 SND_PCI_QUIRK(0x8086, 0x0022, "DX58SO", ALC889_INTEL), 9025 SND_PCI_QUIRK(0x8086, 0x0021, "Intel IbexPeak", ALC889A_INTEL), 9026 SND_PCI_QUIRK(0x8086, 0x3b56, "Intel IbexPeak", ALC889A_INTEL), 9027 SND_PCI_QUIRK(0x8086, 0xd601, "D102GGC", ALC883_3ST_6ch), 9028 9029 {} 9030 }; 9031 9032 /* codec SSID table for Intel Mac */ 9033 static struct snd_pci_quirk alc882_ssid_cfg_tbl[] = { 9034 SND_PCI_QUIRK(0x106b, 0x00a0, "MacBookPro 3,1", ALC885_MBP3), 9035 SND_PCI_QUIRK(0x106b, 0x00a1, "Macbook", ALC885_MBP3), 9036 SND_PCI_QUIRK(0x106b, 0x00a4, "MacbookPro 4,1", ALC885_MBP3), 9037 SND_PCI_QUIRK(0x106b, 0x0c00, "Mac Pro", ALC885_MACPRO), 9038 SND_PCI_QUIRK(0x106b, 0x1000, "iMac 24", ALC885_IMAC24), 9039 SND_PCI_QUIRK(0x106b, 0x2800, "AppleTV", ALC885_IMAC24), 9040 SND_PCI_QUIRK(0x106b, 0x2c00, "MacbookPro rev3", ALC885_MBP3), 9041 SND_PCI_QUIRK(0x106b, 0x3600, "Macbook 3,1", ALC889A_MB31), 9042 SND_PCI_QUIRK(0x106b, 0x3800, "MacbookPro 4,1", ALC885_MBP3), 9043 SND_PCI_QUIRK(0x106b, 0x3e00, "iMac 24 Aluminum", ALC885_IMAC24), 9044 SND_PCI_QUIRK(0x106b, 0x4900, "iMac 9,1 Aluminum", ALC885_IMAC91), 9045 SND_PCI_QUIRK(0x106b, 0x3f00, "Macbook 5,1", ALC885_MB5), 9046 /* FIXME: HP jack sense seems not working for MBP 5,1 or 5,2, 9047 * so apparently no perfect solution yet 9048 */ 9049 SND_PCI_QUIRK(0x106b, 0x4000, "MacbookPro 5,1", ALC885_MB5), 9050 SND_PCI_QUIRK(0x106b, 0x4600, "MacbookPro 5,2", ALC885_MB5), 9051 {} /* terminator */ 9052 }; 9053 9054 static struct alc_config_preset alc882_presets[] = { 9055 [ALC882_3ST_DIG] = { 9056 .mixers = { alc882_base_mixer }, 9057 .init_verbs = { alc882_base_init_verbs, 9058 alc882_adc1_init_verbs }, 9059 .num_dacs = ARRAY_SIZE(alc882_dac_nids), 9060 .dac_nids = alc882_dac_nids, 9061 .dig_out_nid = ALC882_DIGOUT_NID, 9062 .dig_in_nid = ALC882_DIGIN_NID, 9063 .num_channel_mode = ARRAY_SIZE(alc882_ch_modes), 9064 .channel_mode = alc882_ch_modes, 9065 .need_dac_fix = 1, 9066 .input_mux = &alc882_capture_source, 9067 }, 9068 [ALC882_6ST_DIG] = { 9069 .mixers = { alc882_base_mixer, alc882_chmode_mixer }, 9070 .init_verbs = { alc882_base_init_verbs, 9071 alc882_adc1_init_verbs }, 9072 .num_dacs = ARRAY_SIZE(alc882_dac_nids), 9073 .dac_nids = alc882_dac_nids, 9074 .dig_out_nid = ALC882_DIGOUT_NID, 9075 .dig_in_nid = ALC882_DIGIN_NID, 9076 .num_channel_mode = ARRAY_SIZE(alc882_sixstack_modes), 9077 .channel_mode = alc882_sixstack_modes, 9078 .input_mux = &alc882_capture_source, 9079 }, 9080 [ALC882_ARIMA] = { 9081 .mixers = { alc882_base_mixer, alc882_chmode_mixer }, 9082 .init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs, 9083 alc882_eapd_verbs }, 9084 .num_dacs = ARRAY_SIZE(alc882_dac_nids), 9085 .dac_nids = alc882_dac_nids, 9086 .num_channel_mode = ARRAY_SIZE(alc882_sixstack_modes), 9087 .channel_mode = alc882_sixstack_modes, 9088 .input_mux = &alc882_capture_source, 9089 }, 9090 [ALC882_W2JC] = { 9091 .mixers = { alc882_w2jc_mixer, alc882_chmode_mixer }, 9092 .init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs, 9093 alc882_eapd_verbs, alc880_gpio1_init_verbs }, 9094 .num_dacs = ARRAY_SIZE(alc882_dac_nids), 9095 .dac_nids = alc882_dac_nids, 9096 .num_channel_mode = ARRAY_SIZE(alc880_threestack_modes), 9097 .channel_mode = alc880_threestack_modes, 9098 .need_dac_fix = 1, 9099 .input_mux = &alc882_capture_source, 9100 .dig_out_nid = ALC882_DIGOUT_NID, 9101 }, 9102 [ALC885_MBP3] = { 9103 .mixers = { alc885_mbp3_mixer, alc882_chmode_mixer }, 9104 .init_verbs = { alc885_mbp3_init_verbs, 9105 alc880_gpio1_init_verbs }, 9106 .num_dacs = 2, 9107 .dac_nids = alc882_dac_nids, 9108 .hp_nid = 0x04, 9109 .channel_mode = alc885_mbp_4ch_modes, 9110 .num_channel_mode = ARRAY_SIZE(alc885_mbp_4ch_modes), 9111 .input_mux = &alc882_capture_source, 9112 .dig_out_nid = ALC882_DIGOUT_NID, 9113 .dig_in_nid = ALC882_DIGIN_NID, 9114 .unsol_event = alc_automute_amp_unsol_event, 9115 .setup = alc885_mbp3_setup, 9116 .init_hook = alc_automute_amp, 9117 }, 9118 [ALC885_MB5] = { 9119 .mixers = { alc885_mb5_mixer, alc882_chmode_mixer }, 9120 .init_verbs = { alc885_mb5_init_verbs, 9121 alc880_gpio1_init_verbs }, 9122 .num_dacs = ARRAY_SIZE(alc882_dac_nids), 9123 .dac_nids = alc882_dac_nids, 9124 .channel_mode = alc885_mb5_6ch_modes, 9125 .num_channel_mode = ARRAY_SIZE(alc885_mb5_6ch_modes), 9126 .input_mux = &mb5_capture_source, 9127 .dig_out_nid = ALC882_DIGOUT_NID, 9128 .dig_in_nid = ALC882_DIGIN_NID, 9129 }, 9130 [ALC885_MACPRO] = { 9131 .mixers = { alc882_macpro_mixer }, 9132 .init_verbs = { alc882_macpro_init_verbs }, 9133 .num_dacs = ARRAY_SIZE(alc882_dac_nids), 9134 .dac_nids = alc882_dac_nids, 9135 .dig_out_nid = ALC882_DIGOUT_NID, 9136 .dig_in_nid = ALC882_DIGIN_NID, 9137 .num_channel_mode = ARRAY_SIZE(alc882_ch_modes), 9138 .channel_mode = alc882_ch_modes, 9139 .input_mux = &alc882_capture_source, 9140 .init_hook = alc885_macpro_init_hook, 9141 }, 9142 [ALC885_IMAC24] = { 9143 .mixers = { alc885_imac24_mixer }, 9144 .init_verbs = { alc885_imac24_init_verbs }, 9145 .num_dacs = ARRAY_SIZE(alc882_dac_nids), 9146 .dac_nids = alc882_dac_nids, 9147 .dig_out_nid = ALC882_DIGOUT_NID, 9148 .dig_in_nid = ALC882_DIGIN_NID, 9149 .num_channel_mode = ARRAY_SIZE(alc882_ch_modes), 9150 .channel_mode = alc882_ch_modes, 9151 .input_mux = &alc882_capture_source, 9152 .unsol_event = alc_automute_amp_unsol_event, 9153 .setup = alc885_imac24_setup, 9154 .init_hook = alc885_imac24_init_hook, 9155 }, 9156 [ALC885_IMAC91] = { 9157 .mixers = { alc885_imac91_mixer, alc882_chmode_mixer }, 9158 .init_verbs = { alc885_imac91_init_verbs, 9159 alc880_gpio1_init_verbs }, 9160 .num_dacs = ARRAY_SIZE(alc882_dac_nids), 9161 .dac_nids = alc882_dac_nids, 9162 .channel_mode = alc885_mbp_4ch_modes, 9163 .num_channel_mode = ARRAY_SIZE(alc885_mbp_4ch_modes), 9164 .input_mux = &alc882_capture_source, 9165 .dig_out_nid = ALC882_DIGOUT_NID, 9166 .dig_in_nid = ALC882_DIGIN_NID, 9167 .unsol_event = alc885_imac91_unsol_event, 9168 .init_hook = alc885_imac91_automute, 9169 }, 9170 [ALC882_TARGA] = { 9171 .mixers = { alc882_targa_mixer, alc882_chmode_mixer }, 9172 .init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs, 9173 alc880_gpio3_init_verbs, alc882_targa_verbs}, 9174 .num_dacs = ARRAY_SIZE(alc882_dac_nids), 9175 .dac_nids = alc882_dac_nids, 9176 .dig_out_nid = ALC882_DIGOUT_NID, 9177 .num_adc_nids = ARRAY_SIZE(alc882_adc_nids), 9178 .adc_nids = alc882_adc_nids, 9179 .capsrc_nids = alc882_capsrc_nids, 9180 .num_channel_mode = ARRAY_SIZE(alc882_3ST_6ch_modes), 9181 .channel_mode = alc882_3ST_6ch_modes, 9182 .need_dac_fix = 1, 9183 .input_mux = &alc882_capture_source, 9184 .unsol_event = alc882_targa_unsol_event, 9185 .setup = alc882_targa_setup, 9186 .init_hook = alc882_targa_automute, 9187 }, 9188 [ALC882_ASUS_A7J] = { 9189 .mixers = { alc882_asus_a7j_mixer, alc882_chmode_mixer }, 9190 .init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs, 9191 alc882_asus_a7j_verbs}, 9192 .num_dacs = ARRAY_SIZE(alc882_dac_nids), 9193 .dac_nids = alc882_dac_nids, 9194 .dig_out_nid = ALC882_DIGOUT_NID, 9195 .num_adc_nids = ARRAY_SIZE(alc882_adc_nids), 9196 .adc_nids = alc882_adc_nids, 9197 .capsrc_nids = alc882_capsrc_nids, 9198 .num_channel_mode = ARRAY_SIZE(alc882_3ST_6ch_modes), 9199 .channel_mode = alc882_3ST_6ch_modes, 9200 .need_dac_fix = 1, 9201 .input_mux = &alc882_capture_source, 9202 }, 9203 [ALC882_ASUS_A7M] = { 9204 .mixers = { alc882_asus_a7m_mixer, alc882_chmode_mixer }, 9205 .init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs, 9206 alc882_eapd_verbs, alc880_gpio1_init_verbs, 9207 alc882_asus_a7m_verbs }, 9208 .num_dacs = ARRAY_SIZE(alc882_dac_nids), 9209 .dac_nids = alc882_dac_nids, 9210 .dig_out_nid = ALC882_DIGOUT_NID, 9211 .num_channel_mode = ARRAY_SIZE(alc880_threestack_modes), 9212 .channel_mode = alc880_threestack_modes, 9213 .need_dac_fix = 1, 9214 .input_mux = &alc882_capture_source, 9215 }, 9216 [ALC883_3ST_2ch_DIG] = { 9217 .mixers = { alc883_3ST_2ch_mixer }, 9218 .init_verbs = { alc883_init_verbs }, 9219 .num_dacs = ARRAY_SIZE(alc883_dac_nids), 9220 .dac_nids = alc883_dac_nids, 9221 .dig_out_nid = ALC883_DIGOUT_NID, 9222 .dig_in_nid = ALC883_DIGIN_NID, 9223 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes), 9224 .channel_mode = alc883_3ST_2ch_modes, 9225 .input_mux = &alc883_capture_source, 9226 }, 9227 [ALC883_3ST_6ch_DIG] = { 9228 .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer }, 9229 .init_verbs = { alc883_init_verbs }, 9230 .num_dacs = ARRAY_SIZE(alc883_dac_nids), 9231 .dac_nids = alc883_dac_nids, 9232 .dig_out_nid = ALC883_DIGOUT_NID, 9233 .dig_in_nid = ALC883_DIGIN_NID, 9234 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes), 9235 .channel_mode = alc883_3ST_6ch_modes, 9236 .need_dac_fix = 1, 9237 .input_mux = &alc883_capture_source, 9238 }, 9239 [ALC883_3ST_6ch] = { 9240 .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer }, 9241 .init_verbs = { alc883_init_verbs }, 9242 .num_dacs = ARRAY_SIZE(alc883_dac_nids), 9243 .dac_nids = alc883_dac_nids, 9244 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes), 9245 .channel_mode = alc883_3ST_6ch_modes, 9246 .need_dac_fix = 1, 9247 .input_mux = &alc883_capture_source, 9248 }, 9249 [ALC883_3ST_6ch_INTEL] = { 9250 .mixers = { alc883_3ST_6ch_intel_mixer, alc883_chmode_mixer }, 9251 .init_verbs = { alc883_init_verbs }, 9252 .num_dacs = ARRAY_SIZE(alc883_dac_nids), 9253 .dac_nids = alc883_dac_nids, 9254 .dig_out_nid = ALC883_DIGOUT_NID, 9255 .dig_in_nid = ALC883_DIGIN_NID, 9256 .slave_dig_outs = alc883_slave_dig_outs, 9257 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_intel_modes), 9258 .channel_mode = alc883_3ST_6ch_intel_modes, 9259 .need_dac_fix = 1, 9260 .input_mux = &alc883_3stack_6ch_intel, 9261 }, 9262 [ALC889A_INTEL] = { 9263 .mixers = { alc885_8ch_intel_mixer, alc883_chmode_mixer }, 9264 .init_verbs = { alc885_init_verbs, alc885_init_input_verbs, 9265 alc_hp15_unsol_verbs }, 9266 .num_dacs = ARRAY_SIZE(alc883_dac_nids), 9267 .dac_nids = alc883_dac_nids, 9268 .num_adc_nids = ARRAY_SIZE(alc889_adc_nids), 9269 .adc_nids = alc889_adc_nids, 9270 .dig_out_nid = ALC883_DIGOUT_NID, 9271 .dig_in_nid = ALC883_DIGIN_NID, 9272 .slave_dig_outs = alc883_slave_dig_outs, 9273 .num_channel_mode = ARRAY_SIZE(alc889_8ch_intel_modes), 9274 .channel_mode = alc889_8ch_intel_modes, 9275 .capsrc_nids = alc889_capsrc_nids, 9276 .input_mux = &alc889_capture_source, 9277 .setup = alc889_automute_setup, 9278 .init_hook = alc_automute_amp, 9279 .unsol_event = alc_automute_amp_unsol_event, 9280 .need_dac_fix = 1, 9281 }, 9282 [ALC889_INTEL] = { 9283 .mixers = { alc885_8ch_intel_mixer, alc883_chmode_mixer }, 9284 .init_verbs = { alc885_init_verbs, alc889_init_input_verbs, 9285 alc889_eapd_verbs, alc_hp15_unsol_verbs}, 9286 .num_dacs = ARRAY_SIZE(alc883_dac_nids), 9287 .dac_nids = alc883_dac_nids, 9288 .num_adc_nids = ARRAY_SIZE(alc889_adc_nids), 9289 .adc_nids = alc889_adc_nids, 9290 .dig_out_nid = ALC883_DIGOUT_NID, 9291 .dig_in_nid = ALC883_DIGIN_NID, 9292 .slave_dig_outs = alc883_slave_dig_outs, 9293 .num_channel_mode = ARRAY_SIZE(alc889_8ch_intel_modes), 9294 .channel_mode = alc889_8ch_intel_modes, 9295 .capsrc_nids = alc889_capsrc_nids, 9296 .input_mux = &alc889_capture_source, 9297 .setup = alc889_automute_setup, 9298 .init_hook = alc889_intel_init_hook, 9299 .unsol_event = alc_automute_amp_unsol_event, 9300 .need_dac_fix = 1, 9301 }, 9302 [ALC883_6ST_DIG] = { 9303 .mixers = { alc883_base_mixer, alc883_chmode_mixer }, 9304 .init_verbs = { alc883_init_verbs }, 9305 .num_dacs = ARRAY_SIZE(alc883_dac_nids), 9306 .dac_nids = alc883_dac_nids, 9307 .dig_out_nid = ALC883_DIGOUT_NID, 9308 .dig_in_nid = ALC883_DIGIN_NID, 9309 .num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes), 9310 .channel_mode = alc883_sixstack_modes, 9311 .input_mux = &alc883_capture_source, 9312 }, 9313 [ALC883_TARGA_DIG] = { 9314 .mixers = { alc883_targa_mixer, alc883_chmode_mixer }, 9315 .init_verbs = { alc883_init_verbs, alc880_gpio3_init_verbs, 9316 alc883_targa_verbs}, 9317 .num_dacs = ARRAY_SIZE(alc883_dac_nids), 9318 .dac_nids = alc883_dac_nids, 9319 .dig_out_nid = ALC883_DIGOUT_NID, 9320 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes), 9321 .channel_mode = alc883_3ST_6ch_modes, 9322 .need_dac_fix = 1, 9323 .input_mux = &alc883_capture_source, 9324 .unsol_event = alc883_targa_unsol_event, 9325 .setup = alc882_targa_setup, 9326 .init_hook = alc882_targa_automute, 9327 }, 9328 [ALC883_TARGA_2ch_DIG] = { 9329 .mixers = { alc883_targa_2ch_mixer}, 9330 .init_verbs = { alc883_init_verbs, alc880_gpio3_init_verbs, 9331 alc883_targa_verbs}, 9332 .num_dacs = ARRAY_SIZE(alc883_dac_nids), 9333 .dac_nids = alc883_dac_nids, 9334 .adc_nids = alc883_adc_nids_alt, 9335 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_alt), 9336 .capsrc_nids = alc883_capsrc_nids, 9337 .dig_out_nid = ALC883_DIGOUT_NID, 9338 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes), 9339 .channel_mode = alc883_3ST_2ch_modes, 9340 .input_mux = &alc883_capture_source, 9341 .unsol_event = alc883_targa_unsol_event, 9342 .setup = alc882_targa_setup, 9343 .init_hook = alc882_targa_automute, 9344 }, 9345 [ALC883_TARGA_8ch_DIG] = { 9346 .mixers = { alc883_targa_mixer, alc883_targa_8ch_mixer, 9347 alc883_chmode_mixer }, 9348 .init_verbs = { alc883_init_verbs, alc880_gpio3_init_verbs, 9349 alc883_targa_verbs }, 9350 .num_dacs = ARRAY_SIZE(alc883_dac_nids), 9351 .dac_nids = alc883_dac_nids, 9352 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev), 9353 .adc_nids = alc883_adc_nids_rev, 9354 .capsrc_nids = alc883_capsrc_nids_rev, 9355 .dig_out_nid = ALC883_DIGOUT_NID, 9356 .dig_in_nid = ALC883_DIGIN_NID, 9357 .num_channel_mode = ARRAY_SIZE(alc883_4ST_8ch_modes), 9358 .channel_mode = alc883_4ST_8ch_modes, 9359 .need_dac_fix = 1, 9360 .input_mux = &alc883_capture_source, 9361 .unsol_event = alc883_targa_unsol_event, 9362 .setup = alc882_targa_setup, 9363 .init_hook = alc882_targa_automute, 9364 }, 9365 [ALC883_ACER] = { 9366 .mixers = { alc883_base_mixer }, 9367 /* On TravelMate laptops, GPIO 0 enables the internal speaker 9368 * and the headphone jack. Turn this on and rely on the 9369 * standard mute methods whenever the user wants to turn 9370 * these outputs off. 9371 */ 9372 .init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs }, 9373 .num_dacs = ARRAY_SIZE(alc883_dac_nids), 9374 .dac_nids = alc883_dac_nids, 9375 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes), 9376 .channel_mode = alc883_3ST_2ch_modes, 9377 .input_mux = &alc883_capture_source, 9378 }, 9379 [ALC883_ACER_ASPIRE] = { 9380 .mixers = { alc883_acer_aspire_mixer }, 9381 .init_verbs = { alc883_init_verbs, alc883_acer_eapd_verbs }, 9382 .num_dacs = ARRAY_SIZE(alc883_dac_nids), 9383 .dac_nids = alc883_dac_nids, 9384 .dig_out_nid = ALC883_DIGOUT_NID, 9385 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes), 9386 .channel_mode = alc883_3ST_2ch_modes, 9387 .input_mux = &alc883_capture_source, 9388 .unsol_event = alc_automute_amp_unsol_event, 9389 .setup = alc883_acer_aspire_setup, 9390 .init_hook = alc_automute_amp, 9391 }, 9392 [ALC888_ACER_ASPIRE_4930G] = { 9393 .mixers = { alc888_base_mixer, 9394 alc883_chmode_mixer }, 9395 .init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs, 9396 alc888_acer_aspire_4930g_verbs }, 9397 .num_dacs = ARRAY_SIZE(alc883_dac_nids), 9398 .dac_nids = alc883_dac_nids, 9399 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev), 9400 .adc_nids = alc883_adc_nids_rev, 9401 .capsrc_nids = alc883_capsrc_nids_rev, 9402 .dig_out_nid = ALC883_DIGOUT_NID, 9403 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes), 9404 .channel_mode = alc883_3ST_6ch_modes, 9405 .need_dac_fix = 1, 9406 .num_mux_defs = 9407 ARRAY_SIZE(alc888_2_capture_sources), 9408 .input_mux = alc888_2_capture_sources, 9409 .unsol_event = alc_automute_amp_unsol_event, 9410 .setup = alc888_acer_aspire_4930g_setup, 9411 .init_hook = alc_automute_amp, 9412 }, 9413 [ALC888_ACER_ASPIRE_6530G] = { 9414 .mixers = { alc888_acer_aspire_6530_mixer }, 9415 .init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs, 9416 alc888_acer_aspire_6530g_verbs }, 9417 .num_dacs = ARRAY_SIZE(alc883_dac_nids), 9418 .dac_nids = alc883_dac_nids, 9419 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev), 9420 .adc_nids = alc883_adc_nids_rev, 9421 .capsrc_nids = alc883_capsrc_nids_rev, 9422 .dig_out_nid = ALC883_DIGOUT_NID, 9423 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes), 9424 .channel_mode = alc883_3ST_2ch_modes, 9425 .num_mux_defs = 9426 ARRAY_SIZE(alc888_2_capture_sources), 9427 .input_mux = alc888_acer_aspire_6530_sources, 9428 .unsol_event = alc_automute_amp_unsol_event, 9429 .setup = alc888_acer_aspire_6530g_setup, 9430 .init_hook = alc_automute_amp, 9431 }, 9432 [ALC888_ACER_ASPIRE_8930G] = { 9433 .mixers = { alc889_acer_aspire_8930g_mixer, 9434 alc883_chmode_mixer }, 9435 .init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs, 9436 alc889_acer_aspire_8930g_verbs, 9437 alc889_eapd_verbs}, 9438 .num_dacs = ARRAY_SIZE(alc883_dac_nids), 9439 .dac_nids = alc883_dac_nids, 9440 .num_adc_nids = ARRAY_SIZE(alc889_adc_nids), 9441 .adc_nids = alc889_adc_nids, 9442 .capsrc_nids = alc889_capsrc_nids, 9443 .dig_out_nid = ALC883_DIGOUT_NID, 9444 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes), 9445 .channel_mode = alc883_3ST_6ch_modes, 9446 .need_dac_fix = 1, 9447 .const_channel_count = 6, 9448 .num_mux_defs = 9449 ARRAY_SIZE(alc889_capture_sources), 9450 .input_mux = alc889_capture_sources, 9451 .unsol_event = alc_automute_amp_unsol_event, 9452 .setup = alc889_acer_aspire_8930g_setup, 9453 .init_hook = alc_automute_amp, 9454 #ifdef CONFIG_SND_HDA_POWER_SAVE 9455 .power_hook = alc889_power_eapd, 9456 #endif 9457 }, 9458 [ALC888_ACER_ASPIRE_7730G] = { 9459 .mixers = { alc883_3ST_6ch_mixer, 9460 alc883_chmode_mixer }, 9461 .init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs, 9462 alc888_acer_aspire_7730G_verbs }, 9463 .num_dacs = ARRAY_SIZE(alc883_dac_nids), 9464 .dac_nids = alc883_dac_nids, 9465 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev), 9466 .adc_nids = alc883_adc_nids_rev, 9467 .capsrc_nids = alc883_capsrc_nids_rev, 9468 .dig_out_nid = ALC883_DIGOUT_NID, 9469 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes), 9470 .channel_mode = alc883_3ST_6ch_modes, 9471 .need_dac_fix = 1, 9472 .const_channel_count = 6, 9473 .input_mux = &alc883_capture_source, 9474 .unsol_event = alc_automute_amp_unsol_event, 9475 .setup = alc888_acer_aspire_6530g_setup, 9476 .init_hook = alc_automute_amp, 9477 }, 9478 [ALC883_MEDION] = { 9479 .mixers = { alc883_fivestack_mixer, 9480 alc883_chmode_mixer }, 9481 .init_verbs = { alc883_init_verbs, 9482 alc883_medion_eapd_verbs }, 9483 .num_dacs = ARRAY_SIZE(alc883_dac_nids), 9484 .dac_nids = alc883_dac_nids, 9485 .adc_nids = alc883_adc_nids_alt, 9486 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_alt), 9487 .capsrc_nids = alc883_capsrc_nids, 9488 .num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes), 9489 .channel_mode = alc883_sixstack_modes, 9490 .input_mux = &alc883_capture_source, 9491 }, 9492 [ALC883_MEDION_MD2] = { 9493 .mixers = { alc883_medion_md2_mixer}, 9494 .init_verbs = { alc883_init_verbs, alc883_medion_md2_verbs}, 9495 .num_dacs = ARRAY_SIZE(alc883_dac_nids), 9496 .dac_nids = alc883_dac_nids, 9497 .dig_out_nid = ALC883_DIGOUT_NID, 9498 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes), 9499 .channel_mode = alc883_3ST_2ch_modes, 9500 .input_mux = &alc883_capture_source, 9501 .unsol_event = alc_automute_amp_unsol_event, 9502 .setup = alc883_medion_md2_setup, 9503 .init_hook = alc_automute_amp, 9504 }, 9505 [ALC883_LAPTOP_EAPD] = { 9506 .mixers = { alc883_base_mixer }, 9507 .init_verbs = { alc883_init_verbs, alc882_eapd_verbs }, 9508 .num_dacs = ARRAY_SIZE(alc883_dac_nids), 9509 .dac_nids = alc883_dac_nids, 9510 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes), 9511 .channel_mode = alc883_3ST_2ch_modes, 9512 .input_mux = &alc883_capture_source, 9513 }, 9514 [ALC883_CLEVO_M540R] = { 9515 .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer }, 9516 .init_verbs = { alc883_init_verbs, alc883_clevo_m540r_verbs }, 9517 .num_dacs = ARRAY_SIZE(alc883_dac_nids), 9518 .dac_nids = alc883_dac_nids, 9519 .dig_out_nid = ALC883_DIGOUT_NID, 9520 .dig_in_nid = ALC883_DIGIN_NID, 9521 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_clevo_modes), 9522 .channel_mode = alc883_3ST_6ch_clevo_modes, 9523 .need_dac_fix = 1, 9524 .input_mux = &alc883_capture_source, 9525 /* This machine has the hardware HP auto-muting, thus 9526 * we need no software mute via unsol event 9527 */ 9528 }, 9529 [ALC883_CLEVO_M720] = { 9530 .mixers = { alc883_clevo_m720_mixer }, 9531 .init_verbs = { alc883_init_verbs, alc883_clevo_m720_verbs }, 9532 .num_dacs = ARRAY_SIZE(alc883_dac_nids), 9533 .dac_nids = alc883_dac_nids, 9534 .dig_out_nid = ALC883_DIGOUT_NID, 9535 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes), 9536 .channel_mode = alc883_3ST_2ch_modes, 9537 .input_mux = &alc883_capture_source, 9538 .unsol_event = alc883_clevo_m720_unsol_event, 9539 .setup = alc883_clevo_m720_setup, 9540 .init_hook = alc883_clevo_m720_init_hook, 9541 }, 9542 [ALC883_LENOVO_101E_2ch] = { 9543 .mixers = { alc883_lenovo_101e_2ch_mixer}, 9544 .init_verbs = { alc883_init_verbs, alc883_lenovo_101e_verbs}, 9545 .num_dacs = ARRAY_SIZE(alc883_dac_nids), 9546 .dac_nids = alc883_dac_nids, 9547 .adc_nids = alc883_adc_nids_alt, 9548 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_alt), 9549 .capsrc_nids = alc883_capsrc_nids, 9550 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes), 9551 .channel_mode = alc883_3ST_2ch_modes, 9552 .input_mux = &alc883_lenovo_101e_capture_source, 9553 .unsol_event = alc883_lenovo_101e_unsol_event, 9554 .init_hook = alc883_lenovo_101e_all_automute, 9555 }, 9556 [ALC883_LENOVO_NB0763] = { 9557 .mixers = { alc883_lenovo_nb0763_mixer }, 9558 .init_verbs = { alc883_init_verbs, alc883_lenovo_nb0763_verbs}, 9559 .num_dacs = ARRAY_SIZE(alc883_dac_nids), 9560 .dac_nids = alc883_dac_nids, 9561 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes), 9562 .channel_mode = alc883_3ST_2ch_modes, 9563 .need_dac_fix = 1, 9564 .input_mux = &alc883_lenovo_nb0763_capture_source, 9565 .unsol_event = alc_automute_amp_unsol_event, 9566 .setup = alc883_medion_md2_setup, 9567 .init_hook = alc_automute_amp, 9568 }, 9569 [ALC888_LENOVO_MS7195_DIG] = { 9570 .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer }, 9571 .init_verbs = { alc883_init_verbs, alc888_lenovo_ms7195_verbs}, 9572 .num_dacs = ARRAY_SIZE(alc883_dac_nids), 9573 .dac_nids = alc883_dac_nids, 9574 .dig_out_nid = ALC883_DIGOUT_NID, 9575 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes), 9576 .channel_mode = alc883_3ST_6ch_modes, 9577 .need_dac_fix = 1, 9578 .input_mux = &alc883_capture_source, 9579 .unsol_event = alc883_lenovo_ms7195_unsol_event, 9580 .init_hook = alc888_lenovo_ms7195_front_automute, 9581 }, 9582 [ALC883_HAIER_W66] = { 9583 .mixers = { alc883_targa_2ch_mixer}, 9584 .init_verbs = { alc883_init_verbs, alc883_haier_w66_verbs}, 9585 .num_dacs = ARRAY_SIZE(alc883_dac_nids), 9586 .dac_nids = alc883_dac_nids, 9587 .dig_out_nid = ALC883_DIGOUT_NID, 9588 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes), 9589 .channel_mode = alc883_3ST_2ch_modes, 9590 .input_mux = &alc883_capture_source, 9591 .unsol_event = alc_automute_amp_unsol_event, 9592 .setup = alc883_haier_w66_setup, 9593 .init_hook = alc_automute_amp, 9594 }, 9595 [ALC888_3ST_HP] = { 9596 .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer }, 9597 .init_verbs = { alc883_init_verbs, alc888_3st_hp_verbs }, 9598 .num_dacs = ARRAY_SIZE(alc883_dac_nids), 9599 .dac_nids = alc883_dac_nids, 9600 .num_channel_mode = ARRAY_SIZE(alc888_3st_hp_modes), 9601 .channel_mode = alc888_3st_hp_modes, 9602 .need_dac_fix = 1, 9603 .input_mux = &alc883_capture_source, 9604 .unsol_event = alc_automute_amp_unsol_event, 9605 .setup = alc888_3st_hp_setup, 9606 .init_hook = alc_automute_amp, 9607 }, 9608 [ALC888_6ST_DELL] = { 9609 .mixers = { alc883_base_mixer, alc883_chmode_mixer }, 9610 .init_verbs = { alc883_init_verbs, alc888_6st_dell_verbs }, 9611 .num_dacs = ARRAY_SIZE(alc883_dac_nids), 9612 .dac_nids = alc883_dac_nids, 9613 .dig_out_nid = ALC883_DIGOUT_NID, 9614 .dig_in_nid = ALC883_DIGIN_NID, 9615 .num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes), 9616 .channel_mode = alc883_sixstack_modes, 9617 .input_mux = &alc883_capture_source, 9618 .unsol_event = alc_automute_amp_unsol_event, 9619 .setup = alc888_6st_dell_setup, 9620 .init_hook = alc_automute_amp, 9621 }, 9622 [ALC883_MITAC] = { 9623 .mixers = { alc883_mitac_mixer }, 9624 .init_verbs = { alc883_init_verbs, alc883_mitac_verbs }, 9625 .num_dacs = ARRAY_SIZE(alc883_dac_nids), 9626 .dac_nids = alc883_dac_nids, 9627 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes), 9628 .channel_mode = alc883_3ST_2ch_modes, 9629 .input_mux = &alc883_capture_source, 9630 .unsol_event = alc_automute_amp_unsol_event, 9631 .setup = alc883_mitac_setup, 9632 .init_hook = alc_automute_amp, 9633 }, 9634 [ALC883_FUJITSU_PI2515] = { 9635 .mixers = { alc883_2ch_fujitsu_pi2515_mixer }, 9636 .init_verbs = { alc883_init_verbs, 9637 alc883_2ch_fujitsu_pi2515_verbs}, 9638 .num_dacs = ARRAY_SIZE(alc883_dac_nids), 9639 .dac_nids = alc883_dac_nids, 9640 .dig_out_nid = ALC883_DIGOUT_NID, 9641 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes), 9642 .channel_mode = alc883_3ST_2ch_modes, 9643 .input_mux = &alc883_fujitsu_pi2515_capture_source, 9644 .unsol_event = alc_automute_amp_unsol_event, 9645 .setup = alc883_2ch_fujitsu_pi2515_setup, 9646 .init_hook = alc_automute_amp, 9647 }, 9648 [ALC888_FUJITSU_XA3530] = { 9649 .mixers = { alc888_base_mixer, alc883_chmode_mixer }, 9650 .init_verbs = { alc883_init_verbs, 9651 alc888_fujitsu_xa3530_verbs }, 9652 .num_dacs = ARRAY_SIZE(alc883_dac_nids), 9653 .dac_nids = alc883_dac_nids, 9654 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev), 9655 .adc_nids = alc883_adc_nids_rev, 9656 .capsrc_nids = alc883_capsrc_nids_rev, 9657 .dig_out_nid = ALC883_DIGOUT_NID, 9658 .num_channel_mode = ARRAY_SIZE(alc888_4ST_8ch_intel_modes), 9659 .channel_mode = alc888_4ST_8ch_intel_modes, 9660 .num_mux_defs = 9661 ARRAY_SIZE(alc888_2_capture_sources), 9662 .input_mux = alc888_2_capture_sources, 9663 .unsol_event = alc_automute_amp_unsol_event, 9664 .setup = alc888_fujitsu_xa3530_setup, 9665 .init_hook = alc_automute_amp, 9666 }, 9667 [ALC888_LENOVO_SKY] = { 9668 .mixers = { alc888_lenovo_sky_mixer, alc883_chmode_mixer }, 9669 .init_verbs = { alc883_init_verbs, alc888_lenovo_sky_verbs}, 9670 .num_dacs = ARRAY_SIZE(alc883_dac_nids), 9671 .dac_nids = alc883_dac_nids, 9672 .dig_out_nid = ALC883_DIGOUT_NID, 9673 .num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes), 9674 .channel_mode = alc883_sixstack_modes, 9675 .need_dac_fix = 1, 9676 .input_mux = &alc883_lenovo_sky_capture_source, 9677 .unsol_event = alc_automute_amp_unsol_event, 9678 .setup = alc888_lenovo_sky_setup, 9679 .init_hook = alc_automute_amp, 9680 }, 9681 [ALC888_ASUS_M90V] = { 9682 .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer }, 9683 .init_verbs = { alc883_init_verbs, alc888_asus_m90v_verbs }, 9684 .num_dacs = ARRAY_SIZE(alc883_dac_nids), 9685 .dac_nids = alc883_dac_nids, 9686 .dig_out_nid = ALC883_DIGOUT_NID, 9687 .dig_in_nid = ALC883_DIGIN_NID, 9688 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes), 9689 .channel_mode = alc883_3ST_6ch_modes, 9690 .need_dac_fix = 1, 9691 .input_mux = &alc883_fujitsu_pi2515_capture_source, 9692 .unsol_event = alc_sku_unsol_event, 9693 .setup = alc883_mode2_setup, 9694 .init_hook = alc_inithook, 9695 }, 9696 [ALC888_ASUS_EEE1601] = { 9697 .mixers = { alc883_asus_eee1601_mixer }, 9698 .cap_mixer = alc883_asus_eee1601_cap_mixer, 9699 .init_verbs = { alc883_init_verbs, alc888_asus_eee1601_verbs }, 9700 .num_dacs = ARRAY_SIZE(alc883_dac_nids), 9701 .dac_nids = alc883_dac_nids, 9702 .dig_out_nid = ALC883_DIGOUT_NID, 9703 .dig_in_nid = ALC883_DIGIN_NID, 9704 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes), 9705 .channel_mode = alc883_3ST_2ch_modes, 9706 .need_dac_fix = 1, 9707 .input_mux = &alc883_asus_eee1601_capture_source, 9708 .unsol_event = alc_sku_unsol_event, 9709 .init_hook = alc883_eee1601_inithook, 9710 }, 9711 [ALC1200_ASUS_P5Q] = { 9712 .mixers = { alc883_base_mixer, alc883_chmode_mixer }, 9713 .init_verbs = { alc883_init_verbs }, 9714 .num_dacs = ARRAY_SIZE(alc883_dac_nids), 9715 .dac_nids = alc883_dac_nids, 9716 .dig_out_nid = ALC1200_DIGOUT_NID, 9717 .dig_in_nid = ALC883_DIGIN_NID, 9718 .slave_dig_outs = alc1200_slave_dig_outs, 9719 .num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes), 9720 .channel_mode = alc883_sixstack_modes, 9721 .input_mux = &alc883_capture_source, 9722 }, 9723 [ALC889A_MB31] = { 9724 .mixers = { alc889A_mb31_mixer, alc883_chmode_mixer}, 9725 .init_verbs = { alc883_init_verbs, alc889A_mb31_verbs, 9726 alc880_gpio1_init_verbs }, 9727 .adc_nids = alc883_adc_nids, 9728 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids), 9729 .capsrc_nids = alc883_capsrc_nids, 9730 .dac_nids = alc883_dac_nids, 9731 .num_dacs = ARRAY_SIZE(alc883_dac_nids), 9732 .channel_mode = alc889A_mb31_6ch_modes, 9733 .num_channel_mode = ARRAY_SIZE(alc889A_mb31_6ch_modes), 9734 .input_mux = &alc889A_mb31_capture_source, 9735 .dig_out_nid = ALC883_DIGOUT_NID, 9736 .unsol_event = alc889A_mb31_unsol_event, 9737 .init_hook = alc889A_mb31_automute, 9738 }, 9739 [ALC883_SONY_VAIO_TT] = { 9740 .mixers = { alc883_vaiott_mixer }, 9741 .init_verbs = { alc883_init_verbs, alc883_vaiott_verbs }, 9742 .num_dacs = ARRAY_SIZE(alc883_dac_nids), 9743 .dac_nids = alc883_dac_nids, 9744 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes), 9745 .channel_mode = alc883_3ST_2ch_modes, 9746 .input_mux = &alc883_capture_source, 9747 .unsol_event = alc_automute_amp_unsol_event, 9748 .setup = alc883_vaiott_setup, 9749 .init_hook = alc_automute_amp, 9750 }, 9751 }; 9752 9753 9754 /* 9755 * Pin config fixes 9756 */ 9757 enum { 9758 PINFIX_ABIT_AW9D_MAX 9759 }; 9760 9761 static struct alc_pincfg alc882_abit_aw9d_pinfix[] = { 9762 { 0x15, 0x01080104 }, /* side */ 9763 { 0x16, 0x01011012 }, /* rear */ 9764 { 0x17, 0x01016011 }, /* clfe */ 9765 { } 9766 }; 9767 9768 static const struct alc_fixup alc882_fixups[] = { 9769 [PINFIX_ABIT_AW9D_MAX] = { 9770 .pins = alc882_abit_aw9d_pinfix 9771 }, 9772 }; 9773 9774 static struct snd_pci_quirk alc882_fixup_tbl[] = { 9775 SND_PCI_QUIRK(0x147b, 0x107a, "Abit AW9D-MAX", PINFIX_ABIT_AW9D_MAX), 9776 {} 9777 }; 9778 9779 /* 9780 * BIOS auto configuration 9781 */ 9782 static int alc882_auto_create_input_ctls(struct hda_codec *codec, 9783 const struct auto_pin_cfg *cfg) 9784 { 9785 return alc_auto_create_input_ctls(codec, cfg, 0x0b, 0x23, 0x22); 9786 } 9787 9788 static void alc882_auto_set_output_and_unmute(struct hda_codec *codec, 9789 hda_nid_t nid, int pin_type, 9790 int dac_idx) 9791 { 9792 /* set as output */ 9793 struct alc_spec *spec = codec->spec; 9794 int idx; 9795 9796 alc_set_pin_output(codec, nid, pin_type); 9797 if (spec->multiout.dac_nids[dac_idx] == 0x25) 9798 idx = 4; 9799 else 9800 idx = spec->multiout.dac_nids[dac_idx] - 2; 9801 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_CONNECT_SEL, idx); 9802 9803 } 9804 9805 static void alc882_auto_init_multi_out(struct hda_codec *codec) 9806 { 9807 struct alc_spec *spec = codec->spec; 9808 int i; 9809 9810 for (i = 0; i <= HDA_SIDE; i++) { 9811 hda_nid_t nid = spec->autocfg.line_out_pins[i]; 9812 int pin_type = get_pin_type(spec->autocfg.line_out_type); 9813 if (nid) 9814 alc882_auto_set_output_and_unmute(codec, nid, pin_type, 9815 i); 9816 } 9817 } 9818 9819 static void alc882_auto_init_hp_out(struct hda_codec *codec) 9820 { 9821 struct alc_spec *spec = codec->spec; 9822 hda_nid_t pin; 9823 9824 pin = spec->autocfg.hp_pins[0]; 9825 if (pin) /* connect to front */ 9826 /* use dac 0 */ 9827 alc882_auto_set_output_and_unmute(codec, pin, PIN_HP, 0); 9828 pin = spec->autocfg.speaker_pins[0]; 9829 if (pin) 9830 alc882_auto_set_output_and_unmute(codec, pin, PIN_OUT, 0); 9831 } 9832 9833 static void alc882_auto_init_analog_input(struct hda_codec *codec) 9834 { 9835 struct alc_spec *spec = codec->spec; 9836 int i; 9837 9838 for (i = 0; i < AUTO_PIN_LAST; i++) { 9839 hda_nid_t nid = spec->autocfg.input_pins[i]; 9840 if (!nid) 9841 continue; 9842 alc_set_input_pin(codec, nid, i); 9843 if (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP) 9844 snd_hda_codec_write(codec, nid, 0, 9845 AC_VERB_SET_AMP_GAIN_MUTE, 9846 AMP_OUT_MUTE); 9847 } 9848 } 9849 9850 static void alc882_auto_init_input_src(struct hda_codec *codec) 9851 { 9852 struct alc_spec *spec = codec->spec; 9853 int c; 9854 9855 for (c = 0; c < spec->num_adc_nids; c++) { 9856 hda_nid_t conn_list[HDA_MAX_NUM_INPUTS]; 9857 hda_nid_t nid = spec->capsrc_nids[c]; 9858 unsigned int mux_idx; 9859 const struct hda_input_mux *imux; 9860 int conns, mute, idx, item; 9861 9862 conns = snd_hda_get_connections(codec, nid, conn_list, 9863 ARRAY_SIZE(conn_list)); 9864 if (conns < 0) 9865 continue; 9866 mux_idx = c >= spec->num_mux_defs ? 0 : c; 9867 imux = &spec->input_mux[mux_idx]; 9868 for (idx = 0; idx < conns; idx++) { 9869 /* if the current connection is the selected one, 9870 * unmute it as default - otherwise mute it 9871 */ 9872 mute = AMP_IN_MUTE(idx); 9873 for (item = 0; item < imux->num_items; item++) { 9874 if (imux->items[item].index == idx) { 9875 if (spec->cur_mux[c] == item) 9876 mute = AMP_IN_UNMUTE(idx); 9877 break; 9878 } 9879 } 9880 /* check if we have a selector or mixer 9881 * we could check for the widget type instead, but 9882 * just check for Amp-In presence (in case of mixer 9883 * without amp-in there is something wrong, this 9884 * function shouldn't be used or capsrc nid is wrong) 9885 */ 9886 if (get_wcaps(codec, nid) & AC_WCAP_IN_AMP) 9887 snd_hda_codec_write(codec, nid, 0, 9888 AC_VERB_SET_AMP_GAIN_MUTE, 9889 mute); 9890 else if (mute != AMP_IN_MUTE(idx)) 9891 snd_hda_codec_write(codec, nid, 0, 9892 AC_VERB_SET_CONNECT_SEL, 9893 idx); 9894 } 9895 } 9896 } 9897 9898 /* add mic boosts if needed */ 9899 static int alc_auto_add_mic_boost(struct hda_codec *codec) 9900 { 9901 struct alc_spec *spec = codec->spec; 9902 int err; 9903 hda_nid_t nid; 9904 9905 nid = spec->autocfg.input_pins[AUTO_PIN_MIC]; 9906 if (nid && (get_wcaps(codec, nid) & AC_WCAP_IN_AMP)) { 9907 err = add_control(spec, ALC_CTL_WIDGET_VOL, 9908 "Mic Boost", 9909 HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_INPUT)); 9910 if (err < 0) 9911 return err; 9912 } 9913 nid = spec->autocfg.input_pins[AUTO_PIN_FRONT_MIC]; 9914 if (nid && (get_wcaps(codec, nid) & AC_WCAP_IN_AMP)) { 9915 err = add_control(spec, ALC_CTL_WIDGET_VOL, 9916 "Front Mic Boost", 9917 HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_INPUT)); 9918 if (err < 0) 9919 return err; 9920 } 9921 return 0; 9922 } 9923 9924 /* almost identical with ALC880 parser... */ 9925 static int alc882_parse_auto_config(struct hda_codec *codec) 9926 { 9927 struct alc_spec *spec = codec->spec; 9928 static hda_nid_t alc882_ignore[] = { 0x1d, 0 }; 9929 int i, err; 9930 9931 err = snd_hda_parse_pin_def_config(codec, &spec->autocfg, 9932 alc882_ignore); 9933 if (err < 0) 9934 return err; 9935 if (!spec->autocfg.line_outs) 9936 return 0; /* can't find valid BIOS pin config */ 9937 9938 err = alc880_auto_fill_dac_nids(spec, &spec->autocfg); 9939 if (err < 0) 9940 return err; 9941 err = alc880_auto_create_multi_out_ctls(spec, &spec->autocfg); 9942 if (err < 0) 9943 return err; 9944 err = alc880_auto_create_extra_out(spec, 9945 spec->autocfg.speaker_pins[0], 9946 "Speaker"); 9947 if (err < 0) 9948 return err; 9949 err = alc880_auto_create_extra_out(spec, spec->autocfg.hp_pins[0], 9950 "Headphone"); 9951 if (err < 0) 9952 return err; 9953 err = alc882_auto_create_input_ctls(codec, &spec->autocfg); 9954 if (err < 0) 9955 return err; 9956 9957 spec->multiout.max_channels = spec->multiout.num_dacs * 2; 9958 9959 /* check multiple SPDIF-out (for recent codecs) */ 9960 for (i = 0; i < spec->autocfg.dig_outs; i++) { 9961 hda_nid_t dig_nid; 9962 err = snd_hda_get_connections(codec, 9963 spec->autocfg.dig_out_pins[i], 9964 &dig_nid, 1); 9965 if (err < 0) 9966 continue; 9967 if (!i) 9968 spec->multiout.dig_out_nid = dig_nid; 9969 else { 9970 spec->multiout.slave_dig_outs = spec->slave_dig_outs; 9971 if (i >= ARRAY_SIZE(spec->slave_dig_outs) - 1) 9972 break; 9973 spec->slave_dig_outs[i - 1] = dig_nid; 9974 } 9975 } 9976 if (spec->autocfg.dig_in_pin) 9977 spec->dig_in_nid = ALC880_DIGIN_NID; 9978 9979 if (spec->kctls.list) 9980 add_mixer(spec, spec->kctls.list); 9981 9982 add_verb(spec, alc883_auto_init_verbs); 9983 /* if ADC 0x07 is available, initialize it, too */ 9984 if (get_wcaps_type(get_wcaps(codec, 0x07)) == AC_WID_AUD_IN) 9985 add_verb(spec, alc882_adc1_init_verbs); 9986 9987 spec->num_mux_defs = 1; 9988 spec->input_mux = &spec->private_imux[0]; 9989 9990 alc_ssid_check(codec, 0x15, 0x1b, 0x14); 9991 9992 err = alc_auto_add_mic_boost(codec); 9993 if (err < 0) 9994 return err; 9995 9996 return 1; /* config found */ 9997 } 9998 9999 /* additional initialization for auto-configuration model */ 10000 static void alc882_auto_init(struct hda_codec *codec) 10001 { 10002 struct alc_spec *spec = codec->spec; 10003 alc882_auto_init_multi_out(codec); 10004 alc882_auto_init_hp_out(codec); 10005 alc882_auto_init_analog_input(codec); 10006 alc882_auto_init_input_src(codec); 10007 if (spec->unsol_event) 10008 alc_inithook(codec); 10009 } 10010 10011 static int patch_alc882(struct hda_codec *codec) 10012 { 10013 struct alc_spec *spec; 10014 int err, board_config; 10015 10016 spec = kzalloc(sizeof(*spec), GFP_KERNEL); 10017 if (spec == NULL) 10018 return -ENOMEM; 10019 10020 codec->spec = spec; 10021 10022 switch (codec->vendor_id) { 10023 case 0x10ec0882: 10024 case 0x10ec0885: 10025 break; 10026 default: 10027 /* ALC883 and variants */ 10028 alc_fix_pll_init(codec, 0x20, 0x0a, 10); 10029 break; 10030 } 10031 10032 board_config = snd_hda_check_board_config(codec, ALC882_MODEL_LAST, 10033 alc882_models, 10034 alc882_cfg_tbl); 10035 10036 if (board_config < 0 || board_config >= ALC882_MODEL_LAST) 10037 board_config = snd_hda_check_board_codec_sid_config(codec, 10038 ALC882_MODEL_LAST, alc882_models, alc882_ssid_cfg_tbl); 10039 10040 if (board_config < 0 || board_config >= ALC882_MODEL_LAST) { 10041 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n", 10042 codec->chip_name); 10043 board_config = ALC882_AUTO; 10044 } 10045 10046 alc_pick_fixup(codec, alc882_fixup_tbl, alc882_fixups); 10047 10048 if (board_config == ALC882_AUTO) { 10049 /* automatic parse from the BIOS config */ 10050 err = alc882_parse_auto_config(codec); 10051 if (err < 0) { 10052 alc_free(codec); 10053 return err; 10054 } else if (!err) { 10055 printk(KERN_INFO 10056 "hda_codec: Cannot set up configuration " 10057 "from BIOS. Using base mode...\n"); 10058 board_config = ALC882_3ST_DIG; 10059 } 10060 } 10061 10062 err = snd_hda_attach_beep_device(codec, 0x1); 10063 if (err < 0) { 10064 alc_free(codec); 10065 return err; 10066 } 10067 10068 if (board_config != ALC882_AUTO) 10069 setup_preset(codec, &alc882_presets[board_config]); 10070 10071 spec->stream_analog_playback = &alc882_pcm_analog_playback; 10072 spec->stream_analog_capture = &alc882_pcm_analog_capture; 10073 /* FIXME: setup DAC5 */ 10074 /*spec->stream_analog_alt_playback = &alc880_pcm_analog_alt_playback;*/ 10075 spec->stream_analog_alt_capture = &alc880_pcm_analog_alt_capture; 10076 10077 spec->stream_digital_playback = &alc882_pcm_digital_playback; 10078 spec->stream_digital_capture = &alc882_pcm_digital_capture; 10079 10080 if (codec->vendor_id == 0x10ec0888) 10081 spec->init_amp = ALC_INIT_DEFAULT; /* always initialize */ 10082 10083 if (!spec->adc_nids && spec->input_mux) { 10084 int i, j; 10085 spec->num_adc_nids = 0; 10086 for (i = 0; i < ARRAY_SIZE(alc882_adc_nids); i++) { 10087 const struct hda_input_mux *imux = spec->input_mux; 10088 hda_nid_t cap; 10089 hda_nid_t items[16]; 10090 hda_nid_t nid = alc882_adc_nids[i]; 10091 unsigned int wcap = get_wcaps(codec, nid); 10092 /* get type */ 10093 wcap = get_wcaps_type(wcap); 10094 if (wcap != AC_WID_AUD_IN) 10095 continue; 10096 spec->private_adc_nids[spec->num_adc_nids] = nid; 10097 err = snd_hda_get_connections(codec, nid, &cap, 1); 10098 if (err < 0) 10099 continue; 10100 err = snd_hda_get_connections(codec, cap, items, 10101 ARRAY_SIZE(items)); 10102 if (err < 0) 10103 continue; 10104 for (j = 0; j < imux->num_items; j++) 10105 if (imux->items[j].index >= err) 10106 break; 10107 if (j < imux->num_items) 10108 continue; 10109 spec->private_capsrc_nids[spec->num_adc_nids] = cap; 10110 spec->num_adc_nids++; 10111 } 10112 spec->adc_nids = spec->private_adc_nids; 10113 spec->capsrc_nids = spec->private_capsrc_nids; 10114 } 10115 10116 set_capture_mixer(codec); 10117 set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT); 10118 10119 spec->vmaster_nid = 0x0c; 10120 10121 codec->patch_ops = alc_patch_ops; 10122 if (board_config == ALC882_AUTO) 10123 spec->init_hook = alc882_auto_init; 10124 #ifdef CONFIG_SND_HDA_POWER_SAVE 10125 if (!spec->loopback.amplist) 10126 spec->loopback.amplist = alc882_loopbacks; 10127 #endif 10128 codec->proc_widget_hook = print_realtek_coef; 10129 10130 return 0; 10131 } 10132 10133 10134 /* 10135 * ALC262 support 10136 */ 10137 10138 #define ALC262_DIGOUT_NID ALC880_DIGOUT_NID 10139 #define ALC262_DIGIN_NID ALC880_DIGIN_NID 10140 10141 #define alc262_dac_nids alc260_dac_nids 10142 #define alc262_adc_nids alc882_adc_nids 10143 #define alc262_adc_nids_alt alc882_adc_nids_alt 10144 #define alc262_capsrc_nids alc882_capsrc_nids 10145 #define alc262_capsrc_nids_alt alc882_capsrc_nids_alt 10146 10147 #define alc262_modes alc260_modes 10148 #define alc262_capture_source alc882_capture_source 10149 10150 static hda_nid_t alc262_dmic_adc_nids[1] = { 10151 /* ADC0 */ 10152 0x09 10153 }; 10154 10155 static hda_nid_t alc262_dmic_capsrc_nids[1] = { 0x22 }; 10156 10157 static struct snd_kcontrol_new alc262_base_mixer[] = { 10158 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 10159 HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT), 10160 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), 10161 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), 10162 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), 10163 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), 10164 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 10165 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 10166 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), 10167 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT), 10168 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT), 10169 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT), 10170 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0D, 0x0, HDA_OUTPUT), 10171 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT), 10172 HDA_CODEC_VOLUME_MONO("Mono Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT), 10173 HDA_CODEC_MUTE_MONO("Mono Playback Switch", 0x16, 2, 0x0, HDA_OUTPUT), 10174 { } /* end */ 10175 }; 10176 10177 /* update HP, line and mono-out pins according to the master switch */ 10178 static void alc262_hp_master_update(struct hda_codec *codec) 10179 { 10180 struct alc_spec *spec = codec->spec; 10181 int val = spec->master_sw; 10182 10183 /* HP & line-out */ 10184 snd_hda_codec_write_cache(codec, 0x1b, 0, 10185 AC_VERB_SET_PIN_WIDGET_CONTROL, 10186 val ? PIN_HP : 0); 10187 snd_hda_codec_write_cache(codec, 0x15, 0, 10188 AC_VERB_SET_PIN_WIDGET_CONTROL, 10189 val ? PIN_HP : 0); 10190 /* mono (speaker) depending on the HP jack sense */ 10191 val = val && !spec->jack_present; 10192 snd_hda_codec_write_cache(codec, 0x16, 0, 10193 AC_VERB_SET_PIN_WIDGET_CONTROL, 10194 val ? PIN_OUT : 0); 10195 } 10196 10197 static void alc262_hp_bpc_automute(struct hda_codec *codec) 10198 { 10199 struct alc_spec *spec = codec->spec; 10200 10201 spec->jack_present = snd_hda_jack_detect(codec, 0x1b); 10202 alc262_hp_master_update(codec); 10203 } 10204 10205 static void alc262_hp_bpc_unsol_event(struct hda_codec *codec, unsigned int res) 10206 { 10207 if ((res >> 26) != ALC880_HP_EVENT) 10208 return; 10209 alc262_hp_bpc_automute(codec); 10210 } 10211 10212 static void alc262_hp_wildwest_automute(struct hda_codec *codec) 10213 { 10214 struct alc_spec *spec = codec->spec; 10215 10216 spec->jack_present = snd_hda_jack_detect(codec, 0x15); 10217 alc262_hp_master_update(codec); 10218 } 10219 10220 static void alc262_hp_wildwest_unsol_event(struct hda_codec *codec, 10221 unsigned int res) 10222 { 10223 if ((res >> 26) != ALC880_HP_EVENT) 10224 return; 10225 alc262_hp_wildwest_automute(codec); 10226 } 10227 10228 #define alc262_hp_master_sw_get alc260_hp_master_sw_get 10229 10230 static int alc262_hp_master_sw_put(struct snd_kcontrol *kcontrol, 10231 struct snd_ctl_elem_value *ucontrol) 10232 { 10233 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 10234 struct alc_spec *spec = codec->spec; 10235 int val = !!*ucontrol->value.integer.value; 10236 10237 if (val == spec->master_sw) 10238 return 0; 10239 spec->master_sw = val; 10240 alc262_hp_master_update(codec); 10241 return 1; 10242 } 10243 10244 #define ALC262_HP_MASTER_SWITCH \ 10245 { \ 10246 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \ 10247 .name = "Master Playback Switch", \ 10248 .info = snd_ctl_boolean_mono_info, \ 10249 .get = alc262_hp_master_sw_get, \ 10250 .put = alc262_hp_master_sw_put, \ 10251 } 10252 10253 static struct snd_kcontrol_new alc262_HP_BPC_mixer[] = { 10254 ALC262_HP_MASTER_SWITCH, 10255 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 10256 HDA_CODEC_MUTE("Front Playback Switch", 0x15, 0x0, HDA_OUTPUT), 10257 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT), 10258 HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0e, 2, 0x0, 10259 HDA_OUTPUT), 10260 HDA_CODEC_MUTE_MONO("Speaker Playback Switch", 0x16, 2, 0x0, 10261 HDA_OUTPUT), 10262 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 10263 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 10264 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), 10265 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT), 10266 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT), 10267 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT), 10268 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), 10269 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), 10270 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), 10271 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), 10272 HDA_CODEC_VOLUME("AUX IN Playback Volume", 0x0b, 0x06, HDA_INPUT), 10273 HDA_CODEC_MUTE("AUX IN Playback Switch", 0x0b, 0x06, HDA_INPUT), 10274 { } /* end */ 10275 }; 10276 10277 static struct snd_kcontrol_new alc262_HP_BPC_WildWest_mixer[] = { 10278 ALC262_HP_MASTER_SWITCH, 10279 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 10280 HDA_CODEC_MUTE("Front Playback Switch", 0x1b, 0x0, HDA_OUTPUT), 10281 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT), 10282 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT), 10283 HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0e, 2, 0x0, 10284 HDA_OUTPUT), 10285 HDA_CODEC_MUTE_MONO("Speaker Playback Switch", 0x16, 2, 0x0, 10286 HDA_OUTPUT), 10287 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x02, HDA_INPUT), 10288 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x02, HDA_INPUT), 10289 HDA_CODEC_VOLUME("Front Mic Boost", 0x1a, 0, HDA_INPUT), 10290 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x01, HDA_INPUT), 10291 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x01, HDA_INPUT), 10292 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), 10293 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), 10294 { } /* end */ 10295 }; 10296 10297 static struct snd_kcontrol_new alc262_HP_BPC_WildWest_option_mixer[] = { 10298 HDA_CODEC_VOLUME("Rear Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 10299 HDA_CODEC_MUTE("Rear Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 10300 HDA_CODEC_VOLUME("Rear Mic Boost", 0x18, 0, HDA_INPUT), 10301 { } /* end */ 10302 }; 10303 10304 /* mute/unmute internal speaker according to the hp jack and mute state */ 10305 static void alc262_hp_t5735_setup(struct hda_codec *codec) 10306 { 10307 struct alc_spec *spec = codec->spec; 10308 10309 spec->autocfg.hp_pins[0] = 0x15; 10310 spec->autocfg.speaker_pins[0] = 0x0c; /* HACK: not actually a pin */ 10311 } 10312 10313 static struct snd_kcontrol_new alc262_hp_t5735_mixer[] = { 10314 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 10315 HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT), 10316 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT), 10317 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT), 10318 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 10319 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 10320 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), 10321 { } /* end */ 10322 }; 10323 10324 static struct hda_verb alc262_hp_t5735_verbs[] = { 10325 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 10326 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 10327 10328 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, 10329 { } 10330 }; 10331 10332 static struct snd_kcontrol_new alc262_hp_rp5700_mixer[] = { 10333 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 10334 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT), 10335 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0e, 0x0, HDA_OUTPUT), 10336 HDA_CODEC_MUTE("Speaker Playback Switch", 0x16, 0x0, HDA_OUTPUT), 10337 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x01, HDA_INPUT), 10338 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x01, HDA_INPUT), 10339 { } /* end */ 10340 }; 10341 10342 static struct hda_verb alc262_hp_rp5700_verbs[] = { 10343 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 10344 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 10345 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 10346 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 10347 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 10348 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, 10349 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))}, 10350 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))}, 10351 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x00 << 8))}, 10352 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x00 << 8))}, 10353 {} 10354 }; 10355 10356 static struct hda_input_mux alc262_hp_rp5700_capture_source = { 10357 .num_items = 1, 10358 .items = { 10359 { "Line", 0x1 }, 10360 }, 10361 }; 10362 10363 /* bind hp and internal speaker mute (with plug check) as master switch */ 10364 static void alc262_hippo_master_update(struct hda_codec *codec) 10365 { 10366 struct alc_spec *spec = codec->spec; 10367 hda_nid_t hp_nid = spec->autocfg.hp_pins[0]; 10368 hda_nid_t line_nid = spec->autocfg.line_out_pins[0]; 10369 hda_nid_t speaker_nid = spec->autocfg.speaker_pins[0]; 10370 unsigned int mute; 10371 10372 /* HP */ 10373 mute = spec->master_sw ? 0 : HDA_AMP_MUTE; 10374 snd_hda_codec_amp_stereo(codec, hp_nid, HDA_OUTPUT, 0, 10375 HDA_AMP_MUTE, mute); 10376 /* mute internal speaker per jack sense */ 10377 if (spec->jack_present) 10378 mute = HDA_AMP_MUTE; 10379 if (line_nid) 10380 snd_hda_codec_amp_stereo(codec, line_nid, HDA_OUTPUT, 0, 10381 HDA_AMP_MUTE, mute); 10382 if (speaker_nid && speaker_nid != line_nid) 10383 snd_hda_codec_amp_stereo(codec, speaker_nid, HDA_OUTPUT, 0, 10384 HDA_AMP_MUTE, mute); 10385 } 10386 10387 #define alc262_hippo_master_sw_get alc262_hp_master_sw_get 10388 10389 static int alc262_hippo_master_sw_put(struct snd_kcontrol *kcontrol, 10390 struct snd_ctl_elem_value *ucontrol) 10391 { 10392 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 10393 struct alc_spec *spec = codec->spec; 10394 int val = !!*ucontrol->value.integer.value; 10395 10396 if (val == spec->master_sw) 10397 return 0; 10398 spec->master_sw = val; 10399 alc262_hippo_master_update(codec); 10400 return 1; 10401 } 10402 10403 #define ALC262_HIPPO_MASTER_SWITCH \ 10404 { \ 10405 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \ 10406 .name = "Master Playback Switch", \ 10407 .info = snd_ctl_boolean_mono_info, \ 10408 .get = alc262_hippo_master_sw_get, \ 10409 .put = alc262_hippo_master_sw_put, \ 10410 } 10411 10412 static struct snd_kcontrol_new alc262_hippo_mixer[] = { 10413 ALC262_HIPPO_MASTER_SWITCH, 10414 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 10415 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), 10416 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), 10417 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), 10418 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), 10419 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 10420 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 10421 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), 10422 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT), 10423 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT), 10424 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT), 10425 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT), 10426 { } /* end */ 10427 }; 10428 10429 static struct snd_kcontrol_new alc262_hippo1_mixer[] = { 10430 HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 10431 ALC262_HIPPO_MASTER_SWITCH, 10432 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), 10433 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), 10434 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), 10435 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), 10436 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 10437 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 10438 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), 10439 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT), 10440 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT), 10441 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT), 10442 { } /* end */ 10443 }; 10444 10445 /* mute/unmute internal speaker according to the hp jack and mute state */ 10446 static void alc262_hippo_automute(struct hda_codec *codec) 10447 { 10448 struct alc_spec *spec = codec->spec; 10449 hda_nid_t hp_nid = spec->autocfg.hp_pins[0]; 10450 10451 spec->jack_present = snd_hda_jack_detect(codec, hp_nid); 10452 alc262_hippo_master_update(codec); 10453 } 10454 10455 static void alc262_hippo_unsol_event(struct hda_codec *codec, unsigned int res) 10456 { 10457 if ((res >> 26) != ALC880_HP_EVENT) 10458 return; 10459 alc262_hippo_automute(codec); 10460 } 10461 10462 static void alc262_hippo_setup(struct hda_codec *codec) 10463 { 10464 struct alc_spec *spec = codec->spec; 10465 10466 spec->autocfg.hp_pins[0] = 0x15; 10467 spec->autocfg.speaker_pins[0] = 0x14; 10468 } 10469 10470 static void alc262_hippo1_setup(struct hda_codec *codec) 10471 { 10472 struct alc_spec *spec = codec->spec; 10473 10474 spec->autocfg.hp_pins[0] = 0x1b; 10475 spec->autocfg.speaker_pins[0] = 0x14; 10476 } 10477 10478 10479 static struct snd_kcontrol_new alc262_sony_mixer[] = { 10480 HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 10481 ALC262_HIPPO_MASTER_SWITCH, 10482 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 10483 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 10484 HDA_CODEC_VOLUME("ATAPI Mic Playback Volume", 0x0b, 0x01, HDA_INPUT), 10485 HDA_CODEC_MUTE("ATAPI Mic Playback Switch", 0x0b, 0x01, HDA_INPUT), 10486 { } /* end */ 10487 }; 10488 10489 static struct snd_kcontrol_new alc262_benq_t31_mixer[] = { 10490 HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 10491 ALC262_HIPPO_MASTER_SWITCH, 10492 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT), 10493 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 10494 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 10495 HDA_CODEC_VOLUME("ATAPI Mic Playback Volume", 0x0b, 0x01, HDA_INPUT), 10496 HDA_CODEC_MUTE("ATAPI Mic Playback Switch", 0x0b, 0x01, HDA_INPUT), 10497 { } /* end */ 10498 }; 10499 10500 static struct snd_kcontrol_new alc262_tyan_mixer[] = { 10501 HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 10502 HDA_BIND_MUTE("Master Playback Switch", 0x0c, 2, HDA_INPUT), 10503 HDA_CODEC_VOLUME("Aux Playback Volume", 0x0b, 0x06, HDA_INPUT), 10504 HDA_CODEC_MUTE("Aux Playback Switch", 0x0b, 0x06, HDA_INPUT), 10505 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), 10506 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), 10507 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 10508 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 10509 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), 10510 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT), 10511 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT), 10512 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT), 10513 { } /* end */ 10514 }; 10515 10516 static struct hda_verb alc262_tyan_verbs[] = { 10517 /* Headphone automute */ 10518 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT}, 10519 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 10520 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, 10521 10522 /* P11 AUX_IN, white 4-pin connector */ 10523 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 10524 {0x14, AC_VERB_SET_CONFIG_DEFAULT_BYTES_1, 0xe1}, 10525 {0x14, AC_VERB_SET_CONFIG_DEFAULT_BYTES_2, 0x93}, 10526 {0x14, AC_VERB_SET_CONFIG_DEFAULT_BYTES_3, 0x19}, 10527 10528 {} 10529 }; 10530 10531 /* unsolicited event for HP jack sensing */ 10532 static void alc262_tyan_setup(struct hda_codec *codec) 10533 { 10534 struct alc_spec *spec = codec->spec; 10535 10536 spec->autocfg.hp_pins[0] = 0x1b; 10537 spec->autocfg.speaker_pins[0] = 0x15; 10538 } 10539 10540 10541 #define alc262_capture_mixer alc882_capture_mixer 10542 #define alc262_capture_alt_mixer alc882_capture_alt_mixer 10543 10544 /* 10545 * generic initialization of ADC, input mixers and output mixers 10546 */ 10547 static struct hda_verb alc262_init_verbs[] = { 10548 /* 10549 * Unmute ADC0-2 and set the default input to mic-in 10550 */ 10551 {0x07, AC_VERB_SET_CONNECT_SEL, 0x00}, 10552 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 10553 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00}, 10554 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 10555 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00}, 10556 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 10557 10558 /* Mute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback 10559 * mixer widget 10560 * Note: PASD motherboards uses the Line In 2 as the input for 10561 * front panel mic (mic 2) 10562 */ 10563 /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */ 10564 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 10565 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 10566 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, 10567 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, 10568 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, 10569 10570 /* 10571 * Set up output mixers (0x0c - 0x0e) 10572 */ 10573 /* set vol=0 to output mixers */ 10574 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 10575 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 10576 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 10577 /* set up input amps for analog loopback */ 10578 /* Amp Indices: DAC = 0, mixer = 1 */ 10579 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 10580 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 10581 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 10582 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 10583 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 10584 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 10585 10586 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40}, 10587 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0}, 10588 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40}, 10589 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24}, 10590 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20}, 10591 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20}, 10592 10593 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000}, 10594 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000}, 10595 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000}, 10596 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000}, 10597 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000}, 10598 10599 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, 10600 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, 10601 10602 /* FIXME: use matrix-type input source selection */ 10603 /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */ 10604 /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */ 10605 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))}, 10606 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))}, 10607 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))}, 10608 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))}, 10609 /* Input mixer2 */ 10610 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))}, 10611 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))}, 10612 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))}, 10613 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))}, 10614 /* Input mixer3 */ 10615 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))}, 10616 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))}, 10617 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))}, 10618 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))}, 10619 10620 { } 10621 }; 10622 10623 static struct hda_verb alc262_eapd_verbs[] = { 10624 {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2}, 10625 {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2}, 10626 { } 10627 }; 10628 10629 static struct hda_verb alc262_hippo1_unsol_verbs[] = { 10630 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0}, 10631 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, 10632 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000}, 10633 10634 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT}, 10635 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 10636 {} 10637 }; 10638 10639 static struct hda_verb alc262_sony_unsol_verbs[] = { 10640 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0}, 10641 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, 10642 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24}, // Front Mic 10643 10644 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT}, 10645 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 10646 {} 10647 }; 10648 10649 static struct snd_kcontrol_new alc262_toshiba_s06_mixer[] = { 10650 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 10651 HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT), 10652 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT), 10653 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 10654 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 10655 { } /* end */ 10656 }; 10657 10658 static struct hda_verb alc262_toshiba_s06_verbs[] = { 10659 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 10660 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 10661 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 10662 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, 10663 {0x22, AC_VERB_SET_CONNECT_SEL, 0x09}, 10664 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24}, 10665 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT}, 10666 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT}, 10667 {} 10668 }; 10669 10670 static void alc262_toshiba_s06_setup(struct hda_codec *codec) 10671 { 10672 struct alc_spec *spec = codec->spec; 10673 10674 spec->autocfg.hp_pins[0] = 0x15; 10675 spec->autocfg.speaker_pins[0] = 0x14; 10676 spec->ext_mic.pin = 0x18; 10677 spec->ext_mic.mux_idx = 0; 10678 spec->int_mic.pin = 0x12; 10679 spec->int_mic.mux_idx = 9; 10680 spec->auto_mic = 1; 10681 } 10682 10683 /* 10684 * nec model 10685 * 0x15 = headphone 10686 * 0x16 = internal speaker 10687 * 0x18 = external mic 10688 */ 10689 10690 static struct snd_kcontrol_new alc262_nec_mixer[] = { 10691 HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT), 10692 HDA_CODEC_MUTE_MONO("Speaker Playback Switch", 0x16, 0, 0x0, HDA_OUTPUT), 10693 10694 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 10695 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 10696 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), 10697 10698 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT), 10699 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT), 10700 { } /* end */ 10701 }; 10702 10703 static struct hda_verb alc262_nec_verbs[] = { 10704 /* Unmute Speaker */ 10705 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 10706 10707 /* Headphone */ 10708 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT}, 10709 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 10710 10711 /* External mic to headphone */ 10712 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 10713 /* External mic to speaker */ 10714 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 10715 {} 10716 }; 10717 10718 /* 10719 * fujitsu model 10720 * 0x14 = headphone/spdif-out, 0x15 = internal speaker, 10721 * 0x1b = port replicator headphone out 10722 */ 10723 10724 #define ALC_HP_EVENT 0x37 10725 10726 static struct hda_verb alc262_fujitsu_unsol_verbs[] = { 10727 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT}, 10728 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 10729 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT}, 10730 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 10731 {} 10732 }; 10733 10734 static struct hda_verb alc262_lenovo_3000_unsol_verbs[] = { 10735 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT}, 10736 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 10737 {} 10738 }; 10739 10740 static struct hda_verb alc262_lenovo_3000_init_verbs[] = { 10741 /* Front Mic pin: input vref at 50% */ 10742 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50}, 10743 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 10744 {} 10745 }; 10746 10747 static struct hda_input_mux alc262_fujitsu_capture_source = { 10748 .num_items = 3, 10749 .items = { 10750 { "Mic", 0x0 }, 10751 { "Int Mic", 0x1 }, 10752 { "CD", 0x4 }, 10753 }, 10754 }; 10755 10756 static struct hda_input_mux alc262_HP_capture_source = { 10757 .num_items = 5, 10758 .items = { 10759 { "Mic", 0x0 }, 10760 { "Front Mic", 0x1 }, 10761 { "Line", 0x2 }, 10762 { "CD", 0x4 }, 10763 { "AUX IN", 0x6 }, 10764 }, 10765 }; 10766 10767 static struct hda_input_mux alc262_HP_D7000_capture_source = { 10768 .num_items = 4, 10769 .items = { 10770 { "Mic", 0x0 }, 10771 { "Front Mic", 0x2 }, 10772 { "Line", 0x1 }, 10773 { "CD", 0x4 }, 10774 }, 10775 }; 10776 10777 /* mute/unmute internal speaker according to the hp jacks and mute state */ 10778 static void alc262_fujitsu_automute(struct hda_codec *codec, int force) 10779 { 10780 struct alc_spec *spec = codec->spec; 10781 unsigned int mute; 10782 10783 if (force || !spec->sense_updated) { 10784 spec->jack_present = snd_hda_jack_detect(codec, 0x14) || 10785 snd_hda_jack_detect(codec, 0x1b); 10786 spec->sense_updated = 1; 10787 } 10788 /* unmute internal speaker only if both HPs are unplugged and 10789 * master switch is on 10790 */ 10791 if (spec->jack_present) 10792 mute = HDA_AMP_MUTE; 10793 else 10794 mute = snd_hda_codec_amp_read(codec, 0x14, 0, HDA_OUTPUT, 0); 10795 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0, 10796 HDA_AMP_MUTE, mute); 10797 } 10798 10799 /* unsolicited event for HP jack sensing */ 10800 static void alc262_fujitsu_unsol_event(struct hda_codec *codec, 10801 unsigned int res) 10802 { 10803 if ((res >> 26) != ALC_HP_EVENT) 10804 return; 10805 alc262_fujitsu_automute(codec, 1); 10806 } 10807 10808 static void alc262_fujitsu_init_hook(struct hda_codec *codec) 10809 { 10810 alc262_fujitsu_automute(codec, 1); 10811 } 10812 10813 /* bind volumes of both NID 0x0c and 0x0d */ 10814 static struct hda_bind_ctls alc262_fujitsu_bind_master_vol = { 10815 .ops = &snd_hda_bind_vol, 10816 .values = { 10817 HDA_COMPOSE_AMP_VAL(0x0c, 3, 0, HDA_OUTPUT), 10818 HDA_COMPOSE_AMP_VAL(0x0d, 3, 0, HDA_OUTPUT), 10819 0 10820 }, 10821 }; 10822 10823 /* mute/unmute internal speaker according to the hp jack and mute state */ 10824 static void alc262_lenovo_3000_automute(struct hda_codec *codec, int force) 10825 { 10826 struct alc_spec *spec = codec->spec; 10827 unsigned int mute; 10828 10829 if (force || !spec->sense_updated) { 10830 spec->jack_present = snd_hda_jack_detect(codec, 0x1b); 10831 spec->sense_updated = 1; 10832 } 10833 if (spec->jack_present) { 10834 /* mute internal speaker */ 10835 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0, 10836 HDA_AMP_MUTE, HDA_AMP_MUTE); 10837 snd_hda_codec_amp_stereo(codec, 0x16, HDA_OUTPUT, 0, 10838 HDA_AMP_MUTE, HDA_AMP_MUTE); 10839 } else { 10840 /* unmute internal speaker if necessary */ 10841 mute = snd_hda_codec_amp_read(codec, 0x1b, 0, HDA_OUTPUT, 0); 10842 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0, 10843 HDA_AMP_MUTE, mute); 10844 snd_hda_codec_amp_stereo(codec, 0x16, HDA_OUTPUT, 0, 10845 HDA_AMP_MUTE, mute); 10846 } 10847 } 10848 10849 /* unsolicited event for HP jack sensing */ 10850 static void alc262_lenovo_3000_unsol_event(struct hda_codec *codec, 10851 unsigned int res) 10852 { 10853 if ((res >> 26) != ALC_HP_EVENT) 10854 return; 10855 alc262_lenovo_3000_automute(codec, 1); 10856 } 10857 10858 static int amp_stereo_mute_update(struct hda_codec *codec, hda_nid_t nid, 10859 int dir, int idx, long *valp) 10860 { 10861 int i, change = 0; 10862 10863 for (i = 0; i < 2; i++, valp++) 10864 change |= snd_hda_codec_amp_update(codec, nid, i, dir, idx, 10865 HDA_AMP_MUTE, 10866 *valp ? 0 : HDA_AMP_MUTE); 10867 return change; 10868 } 10869 10870 /* bind hp and internal speaker mute (with plug check) */ 10871 static int alc262_fujitsu_master_sw_put(struct snd_kcontrol *kcontrol, 10872 struct snd_ctl_elem_value *ucontrol) 10873 { 10874 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 10875 long *valp = ucontrol->value.integer.value; 10876 int change; 10877 10878 change = amp_stereo_mute_update(codec, 0x14, HDA_OUTPUT, 0, valp); 10879 change |= amp_stereo_mute_update(codec, 0x1b, HDA_OUTPUT, 0, valp); 10880 if (change) 10881 alc262_fujitsu_automute(codec, 0); 10882 return change; 10883 } 10884 10885 static struct snd_kcontrol_new alc262_fujitsu_mixer[] = { 10886 HDA_BIND_VOL("Master Playback Volume", &alc262_fujitsu_bind_master_vol), 10887 { 10888 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 10889 .name = "Master Playback Switch", 10890 .info = snd_hda_mixer_amp_switch_info, 10891 .get = snd_hda_mixer_amp_switch_get, 10892 .put = alc262_fujitsu_master_sw_put, 10893 .private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT), 10894 }, 10895 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), 10896 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), 10897 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), 10898 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 10899 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 10900 HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT), 10901 HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), 10902 HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), 10903 { } /* end */ 10904 }; 10905 10906 /* bind hp and internal speaker mute (with plug check) */ 10907 static int alc262_lenovo_3000_master_sw_put(struct snd_kcontrol *kcontrol, 10908 struct snd_ctl_elem_value *ucontrol) 10909 { 10910 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 10911 long *valp = ucontrol->value.integer.value; 10912 int change; 10913 10914 change = amp_stereo_mute_update(codec, 0x1b, HDA_OUTPUT, 0, valp); 10915 if (change) 10916 alc262_lenovo_3000_automute(codec, 0); 10917 return change; 10918 } 10919 10920 static struct snd_kcontrol_new alc262_lenovo_3000_mixer[] = { 10921 HDA_BIND_VOL("Master Playback Volume", &alc262_fujitsu_bind_master_vol), 10922 { 10923 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 10924 .name = "Master Playback Switch", 10925 .info = snd_hda_mixer_amp_switch_info, 10926 .get = snd_hda_mixer_amp_switch_get, 10927 .put = alc262_lenovo_3000_master_sw_put, 10928 .private_value = HDA_COMPOSE_AMP_VAL(0x1b, 3, 0, HDA_OUTPUT), 10929 }, 10930 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), 10931 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), 10932 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), 10933 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 10934 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 10935 HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT), 10936 HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), 10937 HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), 10938 { } /* end */ 10939 }; 10940 10941 static struct snd_kcontrol_new alc262_toshiba_rx1_mixer[] = { 10942 HDA_BIND_VOL("Master Playback Volume", &alc262_fujitsu_bind_master_vol), 10943 ALC262_HIPPO_MASTER_SWITCH, 10944 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 10945 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 10946 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), 10947 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT), 10948 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT), 10949 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT), 10950 { } /* end */ 10951 }; 10952 10953 /* additional init verbs for Benq laptops */ 10954 static struct hda_verb alc262_EAPD_verbs[] = { 10955 {0x20, AC_VERB_SET_COEF_INDEX, 0x07}, 10956 {0x20, AC_VERB_SET_PROC_COEF, 0x3070}, 10957 {} 10958 }; 10959 10960 static struct hda_verb alc262_benq_t31_EAPD_verbs[] = { 10961 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, 10962 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24}, 10963 10964 {0x20, AC_VERB_SET_COEF_INDEX, 0x07}, 10965 {0x20, AC_VERB_SET_PROC_COEF, 0x3050}, 10966 {} 10967 }; 10968 10969 /* Samsung Q1 Ultra Vista model setup */ 10970 static struct snd_kcontrol_new alc262_ultra_mixer[] = { 10971 HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 10972 HDA_BIND_MUTE("Master Playback Switch", 0x0c, 2, HDA_INPUT), 10973 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x01, HDA_INPUT), 10974 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x01, HDA_INPUT), 10975 HDA_CODEC_VOLUME("Mic Boost", 0x19, 0, HDA_INPUT), 10976 HDA_CODEC_VOLUME("Headphone Mic Boost", 0x15, 0, HDA_INPUT), 10977 { } /* end */ 10978 }; 10979 10980 static struct hda_verb alc262_ultra_verbs[] = { 10981 /* output mixer */ 10982 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 10983 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 10984 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 10985 /* speaker */ 10986 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 10987 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 10988 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 10989 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, 10990 /* HP */ 10991 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 10992 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 10993 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 10994 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, 10995 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT}, 10996 /* internal mic */ 10997 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, 10998 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 10999 /* ADC, choose mic */ 11000 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 11001 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 11002 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 11003 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, 11004 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, 11005 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, 11006 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)}, 11007 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)}, 11008 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)}, 11009 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(8)}, 11010 {} 11011 }; 11012 11013 /* mute/unmute internal speaker according to the hp jack and mute state */ 11014 static void alc262_ultra_automute(struct hda_codec *codec) 11015 { 11016 struct alc_spec *spec = codec->spec; 11017 unsigned int mute; 11018 11019 mute = 0; 11020 /* auto-mute only when HP is used as HP */ 11021 if (!spec->cur_mux[0]) { 11022 spec->jack_present = snd_hda_jack_detect(codec, 0x15); 11023 if (spec->jack_present) 11024 mute = HDA_AMP_MUTE; 11025 } 11026 /* mute/unmute internal speaker */ 11027 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0, 11028 HDA_AMP_MUTE, mute); 11029 /* mute/unmute HP */ 11030 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0, 11031 HDA_AMP_MUTE, mute ? 0 : HDA_AMP_MUTE); 11032 } 11033 11034 /* unsolicited event for HP jack sensing */ 11035 static void alc262_ultra_unsol_event(struct hda_codec *codec, 11036 unsigned int res) 11037 { 11038 if ((res >> 26) != ALC880_HP_EVENT) 11039 return; 11040 alc262_ultra_automute(codec); 11041 } 11042 11043 static struct hda_input_mux alc262_ultra_capture_source = { 11044 .num_items = 2, 11045 .items = { 11046 { "Mic", 0x1 }, 11047 { "Headphone", 0x7 }, 11048 }, 11049 }; 11050 11051 static int alc262_ultra_mux_enum_put(struct snd_kcontrol *kcontrol, 11052 struct snd_ctl_elem_value *ucontrol) 11053 { 11054 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 11055 struct alc_spec *spec = codec->spec; 11056 int ret; 11057 11058 ret = alc_mux_enum_put(kcontrol, ucontrol); 11059 if (!ret) 11060 return 0; 11061 /* reprogram the HP pin as mic or HP according to the input source */ 11062 snd_hda_codec_write_cache(codec, 0x15, 0, 11063 AC_VERB_SET_PIN_WIDGET_CONTROL, 11064 spec->cur_mux[0] ? PIN_VREF80 : PIN_HP); 11065 alc262_ultra_automute(codec); /* mute/unmute HP */ 11066 return ret; 11067 } 11068 11069 static struct snd_kcontrol_new alc262_ultra_capture_mixer[] = { 11070 HDA_CODEC_VOLUME("Capture Volume", 0x07, 0x0, HDA_INPUT), 11071 HDA_CODEC_MUTE("Capture Switch", 0x07, 0x0, HDA_INPUT), 11072 { 11073 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 11074 .name = "Capture Source", 11075 .info = alc_mux_enum_info, 11076 .get = alc_mux_enum_get, 11077 .put = alc262_ultra_mux_enum_put, 11078 }, 11079 { } /* end */ 11080 }; 11081 11082 /* We use two mixers depending on the output pin; 0x16 is a mono output 11083 * and thus it's bound with a different mixer. 11084 * This function returns which mixer amp should be used. 11085 */ 11086 static int alc262_check_volbit(hda_nid_t nid) 11087 { 11088 if (!nid) 11089 return 0; 11090 else if (nid == 0x16) 11091 return 2; 11092 else 11093 return 1; 11094 } 11095 11096 static int alc262_add_out_vol_ctl(struct alc_spec *spec, hda_nid_t nid, 11097 const char *pfx, int *vbits) 11098 { 11099 unsigned long val; 11100 int vbit; 11101 11102 vbit = alc262_check_volbit(nid); 11103 if (!vbit) 11104 return 0; 11105 if (*vbits & vbit) /* a volume control for this mixer already there */ 11106 return 0; 11107 *vbits |= vbit; 11108 if (vbit == 2) 11109 val = HDA_COMPOSE_AMP_VAL(0x0e, 2, 0, HDA_OUTPUT); 11110 else 11111 val = HDA_COMPOSE_AMP_VAL(0x0c, 3, 0, HDA_OUTPUT); 11112 return add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx, val); 11113 } 11114 11115 static int alc262_add_out_sw_ctl(struct alc_spec *spec, hda_nid_t nid, 11116 const char *pfx) 11117 { 11118 unsigned long val; 11119 11120 if (!nid) 11121 return 0; 11122 if (nid == 0x16) 11123 val = HDA_COMPOSE_AMP_VAL(nid, 2, 0, HDA_OUTPUT); 11124 else 11125 val = HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT); 11126 return add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, pfx, val); 11127 } 11128 11129 /* add playback controls from the parsed DAC table */ 11130 static int alc262_auto_create_multi_out_ctls(struct alc_spec *spec, 11131 const struct auto_pin_cfg *cfg) 11132 { 11133 const char *pfx; 11134 int vbits; 11135 int err; 11136 11137 spec->multiout.num_dacs = 1; /* only use one dac */ 11138 spec->multiout.dac_nids = spec->private_dac_nids; 11139 spec->multiout.dac_nids[0] = 2; 11140 11141 if (!cfg->speaker_pins[0] && !cfg->hp_pins[0]) 11142 pfx = "Master"; 11143 else if (cfg->line_out_type == AUTO_PIN_SPEAKER_OUT) 11144 pfx = "Speaker"; 11145 else 11146 pfx = "Front"; 11147 err = alc262_add_out_sw_ctl(spec, cfg->line_out_pins[0], pfx); 11148 if (err < 0) 11149 return err; 11150 err = alc262_add_out_sw_ctl(spec, cfg->speaker_pins[0], "Speaker"); 11151 if (err < 0) 11152 return err; 11153 err = alc262_add_out_sw_ctl(spec, cfg->hp_pins[0], "Headphone"); 11154 if (err < 0) 11155 return err; 11156 11157 vbits = alc262_check_volbit(cfg->line_out_pins[0]) | 11158 alc262_check_volbit(cfg->speaker_pins[0]) | 11159 alc262_check_volbit(cfg->hp_pins[0]); 11160 if (vbits == 1 || vbits == 2) 11161 pfx = "Master"; /* only one mixer is used */ 11162 else if (cfg->line_out_type == AUTO_PIN_SPEAKER_OUT) 11163 pfx = "Speaker"; 11164 else 11165 pfx = "Front"; 11166 vbits = 0; 11167 err = alc262_add_out_vol_ctl(spec, cfg->line_out_pins[0], pfx, &vbits); 11168 if (err < 0) 11169 return err; 11170 err = alc262_add_out_vol_ctl(spec, cfg->speaker_pins[0], "Speaker", 11171 &vbits); 11172 if (err < 0) 11173 return err; 11174 err = alc262_add_out_vol_ctl(spec, cfg->hp_pins[0], "Headphone", 11175 &vbits); 11176 if (err < 0) 11177 return err; 11178 return 0; 11179 } 11180 11181 #define alc262_auto_create_input_ctls \ 11182 alc880_auto_create_input_ctls 11183 11184 /* 11185 * generic initialization of ADC, input mixers and output mixers 11186 */ 11187 static struct hda_verb alc262_volume_init_verbs[] = { 11188 /* 11189 * Unmute ADC0-2 and set the default input to mic-in 11190 */ 11191 {0x07, AC_VERB_SET_CONNECT_SEL, 0x00}, 11192 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 11193 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00}, 11194 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 11195 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00}, 11196 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 11197 11198 /* Mute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback 11199 * mixer widget 11200 * Note: PASD motherboards uses the Line In 2 as the input for 11201 * front panel mic (mic 2) 11202 */ 11203 /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */ 11204 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 11205 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 11206 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, 11207 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, 11208 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, 11209 11210 /* 11211 * Set up output mixers (0x0c - 0x0f) 11212 */ 11213 /* set vol=0 to output mixers */ 11214 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 11215 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 11216 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 11217 11218 /* set up input amps for analog loopback */ 11219 /* Amp Indices: DAC = 0, mixer = 1 */ 11220 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 11221 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 11222 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 11223 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 11224 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 11225 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 11226 11227 /* FIXME: use matrix-type input source selection */ 11228 /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */ 11229 /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */ 11230 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))}, 11231 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))}, 11232 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))}, 11233 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))}, 11234 /* Input mixer2 */ 11235 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))}, 11236 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))}, 11237 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))}, 11238 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))}, 11239 /* Input mixer3 */ 11240 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))}, 11241 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))}, 11242 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))}, 11243 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))}, 11244 11245 { } 11246 }; 11247 11248 static struct hda_verb alc262_HP_BPC_init_verbs[] = { 11249 /* 11250 * Unmute ADC0-2 and set the default input to mic-in 11251 */ 11252 {0x07, AC_VERB_SET_CONNECT_SEL, 0x00}, 11253 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 11254 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00}, 11255 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 11256 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00}, 11257 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 11258 11259 /* Mute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback 11260 * mixer widget 11261 * Note: PASD motherboards uses the Line In 2 as the input for 11262 * front panel mic (mic 2) 11263 */ 11264 /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */ 11265 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 11266 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 11267 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, 11268 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, 11269 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, 11270 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)}, 11271 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)}, 11272 11273 /* 11274 * Set up output mixers (0x0c - 0x0e) 11275 */ 11276 /* set vol=0 to output mixers */ 11277 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 11278 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 11279 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 11280 11281 /* set up input amps for analog loopback */ 11282 /* Amp Indices: DAC = 0, mixer = 1 */ 11283 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 11284 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 11285 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 11286 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 11287 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 11288 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 11289 11290 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 11291 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 11292 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 11293 11294 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 11295 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 11296 11297 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, 11298 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, 11299 11300 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20}, 11301 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24}, 11302 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24}, 11303 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20}, 11304 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20}, 11305 11306 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 }, 11307 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 }, 11308 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 }, 11309 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 }, 11310 {0x1c, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 }, 11311 {0x1d, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 }, 11312 11313 11314 /* FIXME: use matrix-type input source selection */ 11315 /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 0b, 12 */ 11316 /* Input mixer1: only unmute Mic */ 11317 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))}, 11318 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8))}, 11319 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))}, 11320 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))}, 11321 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))}, 11322 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x05 << 8))}, 11323 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x06 << 8))}, 11324 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x07 << 8))}, 11325 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x08 << 8))}, 11326 /* Input mixer2 */ 11327 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))}, 11328 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8))}, 11329 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))}, 11330 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))}, 11331 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))}, 11332 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x05 << 8))}, 11333 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x06 << 8))}, 11334 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x07 << 8))}, 11335 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x08 << 8))}, 11336 /* Input mixer3 */ 11337 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))}, 11338 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8))}, 11339 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))}, 11340 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))}, 11341 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))}, 11342 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x05 << 8))}, 11343 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x06 << 8))}, 11344 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x07 << 8))}, 11345 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x08 << 8))}, 11346 11347 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, 11348 11349 { } 11350 }; 11351 11352 static struct hda_verb alc262_HP_BPC_WildWest_init_verbs[] = { 11353 /* 11354 * Unmute ADC0-2 and set the default input to mic-in 11355 */ 11356 {0x07, AC_VERB_SET_CONNECT_SEL, 0x00}, 11357 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 11358 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00}, 11359 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 11360 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00}, 11361 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 11362 11363 /* Mute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback 11364 * mixer widget 11365 * Note: PASD motherboards uses the Line In 2 as the input for front 11366 * panel mic (mic 2) 11367 */ 11368 /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */ 11369 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 11370 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 11371 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, 11372 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, 11373 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, 11374 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)}, 11375 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)}, 11376 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)}, 11377 /* 11378 * Set up output mixers (0x0c - 0x0e) 11379 */ 11380 /* set vol=0 to output mixers */ 11381 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 11382 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 11383 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 11384 11385 /* set up input amps for analog loopback */ 11386 /* Amp Indices: DAC = 0, mixer = 1 */ 11387 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 11388 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 11389 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 11390 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 11391 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 11392 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 11393 11394 11395 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP }, /* HP */ 11396 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, /* Mono */ 11397 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, /* rear MIC */ 11398 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN }, /* Line in */ 11399 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, /* Front MIC */ 11400 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, /* Line out */ 11401 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN }, /* CD in */ 11402 11403 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 11404 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 11405 11406 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, 11407 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, 11408 11409 /* {0x14, AC_VERB_SET_AMP_GAIN_MUTE, 0x7023 }, */ 11410 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 }, 11411 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 }, 11412 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, 0x7023 }, 11413 {0x1c, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 }, 11414 {0x1d, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 }, 11415 11416 /* FIXME: use matrix-type input source selection */ 11417 /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */ 11418 /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */ 11419 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))}, /*rear MIC*/ 11420 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))}, /*Line in*/ 11421 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8))}, /*F MIC*/ 11422 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x03 << 8))}, /*Front*/ 11423 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x04 << 8))}, /*CD*/ 11424 /* {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x06 << 8))}, */ 11425 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x07 << 8))}, /*HP*/ 11426 /* Input mixer2 */ 11427 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))}, 11428 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))}, 11429 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8))}, 11430 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x03 << 8))}, 11431 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x04 << 8))}, 11432 /* {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x06 << 8))}, */ 11433 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x07 << 8))}, 11434 /* Input mixer3 */ 11435 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))}, 11436 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))}, 11437 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8))}, 11438 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x03 << 8))}, 11439 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x04 << 8))}, 11440 /* {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x06 << 8))}, */ 11441 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x07 << 8))}, 11442 11443 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, 11444 11445 { } 11446 }; 11447 11448 static struct hda_verb alc262_toshiba_rx1_unsol_verbs[] = { 11449 11450 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, /* Front Speaker */ 11451 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 11452 {0x14, AC_VERB_SET_CONNECT_SEL, 0x01}, 11453 11454 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, /* MIC jack */ 11455 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, /* Front MIC */ 11456 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0) }, 11457 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0) }, 11458 11459 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP }, /* HP jack */ 11460 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, 11461 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT}, 11462 {} 11463 }; 11464 11465 11466 #ifdef CONFIG_SND_HDA_POWER_SAVE 11467 #define alc262_loopbacks alc880_loopbacks 11468 #endif 11469 11470 /* pcm configuration: identical with ALC880 */ 11471 #define alc262_pcm_analog_playback alc880_pcm_analog_playback 11472 #define alc262_pcm_analog_capture alc880_pcm_analog_capture 11473 #define alc262_pcm_digital_playback alc880_pcm_digital_playback 11474 #define alc262_pcm_digital_capture alc880_pcm_digital_capture 11475 11476 /* 11477 * BIOS auto configuration 11478 */ 11479 static int alc262_parse_auto_config(struct hda_codec *codec) 11480 { 11481 struct alc_spec *spec = codec->spec; 11482 int err; 11483 static hda_nid_t alc262_ignore[] = { 0x1d, 0 }; 11484 11485 err = snd_hda_parse_pin_def_config(codec, &spec->autocfg, 11486 alc262_ignore); 11487 if (err < 0) 11488 return err; 11489 if (!spec->autocfg.line_outs) { 11490 if (spec->autocfg.dig_outs || spec->autocfg.dig_in_pin) { 11491 spec->multiout.max_channels = 2; 11492 spec->no_analog = 1; 11493 goto dig_only; 11494 } 11495 return 0; /* can't find valid BIOS pin config */ 11496 } 11497 err = alc262_auto_create_multi_out_ctls(spec, &spec->autocfg); 11498 if (err < 0) 11499 return err; 11500 err = alc262_auto_create_input_ctls(codec, &spec->autocfg); 11501 if (err < 0) 11502 return err; 11503 11504 spec->multiout.max_channels = spec->multiout.num_dacs * 2; 11505 11506 dig_only: 11507 if (spec->autocfg.dig_outs) { 11508 spec->multiout.dig_out_nid = ALC262_DIGOUT_NID; 11509 spec->dig_out_type = spec->autocfg.dig_out_type[0]; 11510 } 11511 if (spec->autocfg.dig_in_pin) 11512 spec->dig_in_nid = ALC262_DIGIN_NID; 11513 11514 if (spec->kctls.list) 11515 add_mixer(spec, spec->kctls.list); 11516 11517 add_verb(spec, alc262_volume_init_verbs); 11518 spec->num_mux_defs = 1; 11519 spec->input_mux = &spec->private_imux[0]; 11520 11521 err = alc_auto_add_mic_boost(codec); 11522 if (err < 0) 11523 return err; 11524 11525 alc_ssid_check(codec, 0x15, 0x14, 0x1b); 11526 11527 return 1; 11528 } 11529 11530 #define alc262_auto_init_multi_out alc882_auto_init_multi_out 11531 #define alc262_auto_init_hp_out alc882_auto_init_hp_out 11532 #define alc262_auto_init_analog_input alc882_auto_init_analog_input 11533 #define alc262_auto_init_input_src alc882_auto_init_input_src 11534 11535 11536 /* init callback for auto-configuration model -- overriding the default init */ 11537 static void alc262_auto_init(struct hda_codec *codec) 11538 { 11539 struct alc_spec *spec = codec->spec; 11540 alc262_auto_init_multi_out(codec); 11541 alc262_auto_init_hp_out(codec); 11542 alc262_auto_init_analog_input(codec); 11543 alc262_auto_init_input_src(codec); 11544 if (spec->unsol_event) 11545 alc_inithook(codec); 11546 } 11547 11548 /* 11549 * configuration and preset 11550 */ 11551 static const char *alc262_models[ALC262_MODEL_LAST] = { 11552 [ALC262_BASIC] = "basic", 11553 [ALC262_HIPPO] = "hippo", 11554 [ALC262_HIPPO_1] = "hippo_1", 11555 [ALC262_FUJITSU] = "fujitsu", 11556 [ALC262_HP_BPC] = "hp-bpc", 11557 [ALC262_HP_BPC_D7000_WL]= "hp-bpc-d7000", 11558 [ALC262_HP_TC_T5735] = "hp-tc-t5735", 11559 [ALC262_HP_RP5700] = "hp-rp5700", 11560 [ALC262_BENQ_ED8] = "benq", 11561 [ALC262_BENQ_T31] = "benq-t31", 11562 [ALC262_SONY_ASSAMD] = "sony-assamd", 11563 [ALC262_TOSHIBA_S06] = "toshiba-s06", 11564 [ALC262_TOSHIBA_RX1] = "toshiba-rx1", 11565 [ALC262_ULTRA] = "ultra", 11566 [ALC262_LENOVO_3000] = "lenovo-3000", 11567 [ALC262_NEC] = "nec", 11568 [ALC262_TYAN] = "tyan", 11569 [ALC262_AUTO] = "auto", 11570 }; 11571 11572 static struct snd_pci_quirk alc262_cfg_tbl[] = { 11573 SND_PCI_QUIRK(0x1002, 0x437b, "Hippo", ALC262_HIPPO), 11574 SND_PCI_QUIRK(0x1033, 0x8895, "NEC Versa S9100", ALC262_NEC), 11575 SND_PCI_QUIRK_MASK(0x103c, 0xff00, 0x1200, "HP xw series", 11576 ALC262_HP_BPC), 11577 SND_PCI_QUIRK_MASK(0x103c, 0xff00, 0x1300, "HP xw series", 11578 ALC262_HP_BPC), 11579 SND_PCI_QUIRK_MASK(0x103c, 0xff00, 0x1700, "HP xw series", 11580 ALC262_HP_BPC), 11581 SND_PCI_QUIRK(0x103c, 0x2800, "HP D7000", ALC262_HP_BPC_D7000_WL), 11582 SND_PCI_QUIRK(0x103c, 0x2801, "HP D7000", ALC262_HP_BPC_D7000_WF), 11583 SND_PCI_QUIRK(0x103c, 0x2802, "HP D7000", ALC262_HP_BPC_D7000_WL), 11584 SND_PCI_QUIRK(0x103c, 0x2803, "HP D7000", ALC262_HP_BPC_D7000_WF), 11585 SND_PCI_QUIRK(0x103c, 0x2804, "HP D7000", ALC262_HP_BPC_D7000_WL), 11586 SND_PCI_QUIRK(0x103c, 0x2805, "HP D7000", ALC262_HP_BPC_D7000_WF), 11587 SND_PCI_QUIRK(0x103c, 0x2806, "HP D7000", ALC262_HP_BPC_D7000_WL), 11588 SND_PCI_QUIRK(0x103c, 0x2807, "HP D7000", ALC262_HP_BPC_D7000_WF), 11589 SND_PCI_QUIRK(0x103c, 0x280c, "HP xw4400", ALC262_HP_BPC), 11590 SND_PCI_QUIRK(0x103c, 0x3014, "HP xw6400", ALC262_HP_BPC), 11591 SND_PCI_QUIRK(0x103c, 0x3015, "HP xw8400", ALC262_HP_BPC), 11592 SND_PCI_QUIRK(0x103c, 0x302f, "HP Thin Client T5735", 11593 ALC262_HP_TC_T5735), 11594 SND_PCI_QUIRK(0x103c, 0x2817, "HP RP5700", ALC262_HP_RP5700), 11595 SND_PCI_QUIRK(0x104d, 0x1f00, "Sony ASSAMD", ALC262_SONY_ASSAMD), 11596 SND_PCI_QUIRK(0x104d, 0x8203, "Sony UX-90", ALC262_HIPPO), 11597 SND_PCI_QUIRK(0x104d, 0x820f, "Sony ASSAMD", ALC262_SONY_ASSAMD), 11598 SND_PCI_QUIRK(0x104d, 0x9016, "Sony VAIO", ALC262_AUTO), /* dig-only */ 11599 SND_PCI_QUIRK(0x104d, 0x9025, "Sony VAIO Z21MN", ALC262_TOSHIBA_S06), 11600 SND_PCI_QUIRK(0x104d, 0x9035, "Sony VAIO VGN-FW170J", ALC262_AUTO), 11601 SND_PCI_QUIRK(0x104d, 0x9047, "Sony VAIO Type G", ALC262_AUTO), 11602 #if 0 /* disable the quirk since model=auto works better in recent versions */ 11603 SND_PCI_QUIRK_MASK(0x104d, 0xff00, 0x9000, "Sony VAIO", 11604 ALC262_SONY_ASSAMD), 11605 #endif 11606 SND_PCI_QUIRK(0x1179, 0x0001, "Toshiba dynabook SS RX1", 11607 ALC262_TOSHIBA_RX1), 11608 SND_PCI_QUIRK(0x1179, 0xff7b, "Toshiba S06", ALC262_TOSHIBA_S06), 11609 SND_PCI_QUIRK(0x10cf, 0x1397, "Fujitsu", ALC262_FUJITSU), 11610 SND_PCI_QUIRK(0x10cf, 0x142d, "Fujitsu Lifebook E8410", ALC262_FUJITSU), 11611 SND_PCI_QUIRK(0x10f1, 0x2915, "Tyan Thunder n6650W", ALC262_TYAN), 11612 SND_PCI_QUIRK_MASK(0x144d, 0xff00, 0xc032, "Samsung Q1", 11613 ALC262_ULTRA), 11614 SND_PCI_QUIRK(0x144d, 0xc510, "Samsung Q45", ALC262_HIPPO), 11615 SND_PCI_QUIRK(0x17aa, 0x384e, "Lenovo 3000 y410", ALC262_LENOVO_3000), 11616 SND_PCI_QUIRK(0x17ff, 0x0560, "Benq ED8", ALC262_BENQ_ED8), 11617 SND_PCI_QUIRK(0x17ff, 0x058d, "Benq T31-16", ALC262_BENQ_T31), 11618 SND_PCI_QUIRK(0x17ff, 0x058f, "Benq Hippo", ALC262_HIPPO_1), 11619 {} 11620 }; 11621 11622 static struct alc_config_preset alc262_presets[] = { 11623 [ALC262_BASIC] = { 11624 .mixers = { alc262_base_mixer }, 11625 .init_verbs = { alc262_init_verbs }, 11626 .num_dacs = ARRAY_SIZE(alc262_dac_nids), 11627 .dac_nids = alc262_dac_nids, 11628 .hp_nid = 0x03, 11629 .num_channel_mode = ARRAY_SIZE(alc262_modes), 11630 .channel_mode = alc262_modes, 11631 .input_mux = &alc262_capture_source, 11632 }, 11633 [ALC262_HIPPO] = { 11634 .mixers = { alc262_hippo_mixer }, 11635 .init_verbs = { alc262_init_verbs, alc_hp15_unsol_verbs}, 11636 .num_dacs = ARRAY_SIZE(alc262_dac_nids), 11637 .dac_nids = alc262_dac_nids, 11638 .hp_nid = 0x03, 11639 .dig_out_nid = ALC262_DIGOUT_NID, 11640 .num_channel_mode = ARRAY_SIZE(alc262_modes), 11641 .channel_mode = alc262_modes, 11642 .input_mux = &alc262_capture_source, 11643 .unsol_event = alc262_hippo_unsol_event, 11644 .setup = alc262_hippo_setup, 11645 .init_hook = alc262_hippo_automute, 11646 }, 11647 [ALC262_HIPPO_1] = { 11648 .mixers = { alc262_hippo1_mixer }, 11649 .init_verbs = { alc262_init_verbs, alc262_hippo1_unsol_verbs}, 11650 .num_dacs = ARRAY_SIZE(alc262_dac_nids), 11651 .dac_nids = alc262_dac_nids, 11652 .hp_nid = 0x02, 11653 .dig_out_nid = ALC262_DIGOUT_NID, 11654 .num_channel_mode = ARRAY_SIZE(alc262_modes), 11655 .channel_mode = alc262_modes, 11656 .input_mux = &alc262_capture_source, 11657 .unsol_event = alc262_hippo_unsol_event, 11658 .setup = alc262_hippo1_setup, 11659 .init_hook = alc262_hippo_automute, 11660 }, 11661 [ALC262_FUJITSU] = { 11662 .mixers = { alc262_fujitsu_mixer }, 11663 .init_verbs = { alc262_init_verbs, alc262_EAPD_verbs, 11664 alc262_fujitsu_unsol_verbs }, 11665 .num_dacs = ARRAY_SIZE(alc262_dac_nids), 11666 .dac_nids = alc262_dac_nids, 11667 .hp_nid = 0x03, 11668 .dig_out_nid = ALC262_DIGOUT_NID, 11669 .num_channel_mode = ARRAY_SIZE(alc262_modes), 11670 .channel_mode = alc262_modes, 11671 .input_mux = &alc262_fujitsu_capture_source, 11672 .unsol_event = alc262_fujitsu_unsol_event, 11673 .init_hook = alc262_fujitsu_init_hook, 11674 }, 11675 [ALC262_HP_BPC] = { 11676 .mixers = { alc262_HP_BPC_mixer }, 11677 .init_verbs = { alc262_HP_BPC_init_verbs }, 11678 .num_dacs = ARRAY_SIZE(alc262_dac_nids), 11679 .dac_nids = alc262_dac_nids, 11680 .hp_nid = 0x03, 11681 .num_channel_mode = ARRAY_SIZE(alc262_modes), 11682 .channel_mode = alc262_modes, 11683 .input_mux = &alc262_HP_capture_source, 11684 .unsol_event = alc262_hp_bpc_unsol_event, 11685 .init_hook = alc262_hp_bpc_automute, 11686 }, 11687 [ALC262_HP_BPC_D7000_WF] = { 11688 .mixers = { alc262_HP_BPC_WildWest_mixer }, 11689 .init_verbs = { alc262_HP_BPC_WildWest_init_verbs }, 11690 .num_dacs = ARRAY_SIZE(alc262_dac_nids), 11691 .dac_nids = alc262_dac_nids, 11692 .hp_nid = 0x03, 11693 .num_channel_mode = ARRAY_SIZE(alc262_modes), 11694 .channel_mode = alc262_modes, 11695 .input_mux = &alc262_HP_D7000_capture_source, 11696 .unsol_event = alc262_hp_wildwest_unsol_event, 11697 .init_hook = alc262_hp_wildwest_automute, 11698 }, 11699 [ALC262_HP_BPC_D7000_WL] = { 11700 .mixers = { alc262_HP_BPC_WildWest_mixer, 11701 alc262_HP_BPC_WildWest_option_mixer }, 11702 .init_verbs = { alc262_HP_BPC_WildWest_init_verbs }, 11703 .num_dacs = ARRAY_SIZE(alc262_dac_nids), 11704 .dac_nids = alc262_dac_nids, 11705 .hp_nid = 0x03, 11706 .num_channel_mode = ARRAY_SIZE(alc262_modes), 11707 .channel_mode = alc262_modes, 11708 .input_mux = &alc262_HP_D7000_capture_source, 11709 .unsol_event = alc262_hp_wildwest_unsol_event, 11710 .init_hook = alc262_hp_wildwest_automute, 11711 }, 11712 [ALC262_HP_TC_T5735] = { 11713 .mixers = { alc262_hp_t5735_mixer }, 11714 .init_verbs = { alc262_init_verbs, alc262_hp_t5735_verbs }, 11715 .num_dacs = ARRAY_SIZE(alc262_dac_nids), 11716 .dac_nids = alc262_dac_nids, 11717 .hp_nid = 0x03, 11718 .num_channel_mode = ARRAY_SIZE(alc262_modes), 11719 .channel_mode = alc262_modes, 11720 .input_mux = &alc262_capture_source, 11721 .unsol_event = alc_automute_amp_unsol_event, 11722 .setup = alc262_hp_t5735_setup, 11723 .init_hook = alc_automute_amp, 11724 }, 11725 [ALC262_HP_RP5700] = { 11726 .mixers = { alc262_hp_rp5700_mixer }, 11727 .init_verbs = { alc262_init_verbs, alc262_hp_rp5700_verbs }, 11728 .num_dacs = ARRAY_SIZE(alc262_dac_nids), 11729 .dac_nids = alc262_dac_nids, 11730 .num_channel_mode = ARRAY_SIZE(alc262_modes), 11731 .channel_mode = alc262_modes, 11732 .input_mux = &alc262_hp_rp5700_capture_source, 11733 }, 11734 [ALC262_BENQ_ED8] = { 11735 .mixers = { alc262_base_mixer }, 11736 .init_verbs = { alc262_init_verbs, alc262_EAPD_verbs }, 11737 .num_dacs = ARRAY_SIZE(alc262_dac_nids), 11738 .dac_nids = alc262_dac_nids, 11739 .hp_nid = 0x03, 11740 .num_channel_mode = ARRAY_SIZE(alc262_modes), 11741 .channel_mode = alc262_modes, 11742 .input_mux = &alc262_capture_source, 11743 }, 11744 [ALC262_SONY_ASSAMD] = { 11745 .mixers = { alc262_sony_mixer }, 11746 .init_verbs = { alc262_init_verbs, alc262_sony_unsol_verbs}, 11747 .num_dacs = ARRAY_SIZE(alc262_dac_nids), 11748 .dac_nids = alc262_dac_nids, 11749 .hp_nid = 0x02, 11750 .num_channel_mode = ARRAY_SIZE(alc262_modes), 11751 .channel_mode = alc262_modes, 11752 .input_mux = &alc262_capture_source, 11753 .unsol_event = alc262_hippo_unsol_event, 11754 .setup = alc262_hippo_setup, 11755 .init_hook = alc262_hippo_automute, 11756 }, 11757 [ALC262_BENQ_T31] = { 11758 .mixers = { alc262_benq_t31_mixer }, 11759 .init_verbs = { alc262_init_verbs, alc262_benq_t31_EAPD_verbs, 11760 alc_hp15_unsol_verbs }, 11761 .num_dacs = ARRAY_SIZE(alc262_dac_nids), 11762 .dac_nids = alc262_dac_nids, 11763 .hp_nid = 0x03, 11764 .num_channel_mode = ARRAY_SIZE(alc262_modes), 11765 .channel_mode = alc262_modes, 11766 .input_mux = &alc262_capture_source, 11767 .unsol_event = alc262_hippo_unsol_event, 11768 .setup = alc262_hippo_setup, 11769 .init_hook = alc262_hippo_automute, 11770 }, 11771 [ALC262_ULTRA] = { 11772 .mixers = { alc262_ultra_mixer }, 11773 .cap_mixer = alc262_ultra_capture_mixer, 11774 .init_verbs = { alc262_ultra_verbs }, 11775 .num_dacs = ARRAY_SIZE(alc262_dac_nids), 11776 .dac_nids = alc262_dac_nids, 11777 .num_channel_mode = ARRAY_SIZE(alc262_modes), 11778 .channel_mode = alc262_modes, 11779 .input_mux = &alc262_ultra_capture_source, 11780 .adc_nids = alc262_adc_nids, /* ADC0 */ 11781 .capsrc_nids = alc262_capsrc_nids, 11782 .num_adc_nids = 1, /* single ADC */ 11783 .unsol_event = alc262_ultra_unsol_event, 11784 .init_hook = alc262_ultra_automute, 11785 }, 11786 [ALC262_LENOVO_3000] = { 11787 .mixers = { alc262_lenovo_3000_mixer }, 11788 .init_verbs = { alc262_init_verbs, alc262_EAPD_verbs, 11789 alc262_lenovo_3000_unsol_verbs, 11790 alc262_lenovo_3000_init_verbs }, 11791 .num_dacs = ARRAY_SIZE(alc262_dac_nids), 11792 .dac_nids = alc262_dac_nids, 11793 .hp_nid = 0x03, 11794 .dig_out_nid = ALC262_DIGOUT_NID, 11795 .num_channel_mode = ARRAY_SIZE(alc262_modes), 11796 .channel_mode = alc262_modes, 11797 .input_mux = &alc262_fujitsu_capture_source, 11798 .unsol_event = alc262_lenovo_3000_unsol_event, 11799 }, 11800 [ALC262_NEC] = { 11801 .mixers = { alc262_nec_mixer }, 11802 .init_verbs = { alc262_nec_verbs }, 11803 .num_dacs = ARRAY_SIZE(alc262_dac_nids), 11804 .dac_nids = alc262_dac_nids, 11805 .hp_nid = 0x03, 11806 .num_channel_mode = ARRAY_SIZE(alc262_modes), 11807 .channel_mode = alc262_modes, 11808 .input_mux = &alc262_capture_source, 11809 }, 11810 [ALC262_TOSHIBA_S06] = { 11811 .mixers = { alc262_toshiba_s06_mixer }, 11812 .init_verbs = { alc262_init_verbs, alc262_toshiba_s06_verbs, 11813 alc262_eapd_verbs }, 11814 .num_dacs = ARRAY_SIZE(alc262_dac_nids), 11815 .capsrc_nids = alc262_dmic_capsrc_nids, 11816 .dac_nids = alc262_dac_nids, 11817 .adc_nids = alc262_dmic_adc_nids, /* ADC0 */ 11818 .num_adc_nids = 1, /* single ADC */ 11819 .dig_out_nid = ALC262_DIGOUT_NID, 11820 .num_channel_mode = ARRAY_SIZE(alc262_modes), 11821 .channel_mode = alc262_modes, 11822 .unsol_event = alc_sku_unsol_event, 11823 .setup = alc262_toshiba_s06_setup, 11824 .init_hook = alc_inithook, 11825 }, 11826 [ALC262_TOSHIBA_RX1] = { 11827 .mixers = { alc262_toshiba_rx1_mixer }, 11828 .init_verbs = { alc262_init_verbs, alc262_toshiba_rx1_unsol_verbs }, 11829 .num_dacs = ARRAY_SIZE(alc262_dac_nids), 11830 .dac_nids = alc262_dac_nids, 11831 .hp_nid = 0x03, 11832 .num_channel_mode = ARRAY_SIZE(alc262_modes), 11833 .channel_mode = alc262_modes, 11834 .input_mux = &alc262_capture_source, 11835 .unsol_event = alc262_hippo_unsol_event, 11836 .setup = alc262_hippo_setup, 11837 .init_hook = alc262_hippo_automute, 11838 }, 11839 [ALC262_TYAN] = { 11840 .mixers = { alc262_tyan_mixer }, 11841 .init_verbs = { alc262_init_verbs, alc262_tyan_verbs}, 11842 .num_dacs = ARRAY_SIZE(alc262_dac_nids), 11843 .dac_nids = alc262_dac_nids, 11844 .hp_nid = 0x02, 11845 .dig_out_nid = ALC262_DIGOUT_NID, 11846 .num_channel_mode = ARRAY_SIZE(alc262_modes), 11847 .channel_mode = alc262_modes, 11848 .input_mux = &alc262_capture_source, 11849 .unsol_event = alc_automute_amp_unsol_event, 11850 .setup = alc262_tyan_setup, 11851 .init_hook = alc_automute_amp, 11852 }, 11853 }; 11854 11855 static int patch_alc262(struct hda_codec *codec) 11856 { 11857 struct alc_spec *spec; 11858 int board_config; 11859 int err; 11860 11861 spec = kzalloc(sizeof(*spec), GFP_KERNEL); 11862 if (spec == NULL) 11863 return -ENOMEM; 11864 11865 codec->spec = spec; 11866 #if 0 11867 /* pshou 07/11/05 set a zero PCM sample to DAC when FIFO is 11868 * under-run 11869 */ 11870 { 11871 int tmp; 11872 snd_hda_codec_write(codec, 0x1a, 0, AC_VERB_SET_COEF_INDEX, 7); 11873 tmp = snd_hda_codec_read(codec, 0x20, 0, AC_VERB_GET_PROC_COEF, 0); 11874 snd_hda_codec_write(codec, 0x1a, 0, AC_VERB_SET_COEF_INDEX, 7); 11875 snd_hda_codec_write(codec, 0x1a, 0, AC_VERB_SET_PROC_COEF, tmp | 0x80); 11876 } 11877 #endif 11878 11879 alc_fix_pll_init(codec, 0x20, 0x0a, 10); 11880 11881 board_config = snd_hda_check_board_config(codec, ALC262_MODEL_LAST, 11882 alc262_models, 11883 alc262_cfg_tbl); 11884 11885 if (board_config < 0) { 11886 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n", 11887 codec->chip_name); 11888 board_config = ALC262_AUTO; 11889 } 11890 11891 if (board_config == ALC262_AUTO) { 11892 /* automatic parse from the BIOS config */ 11893 err = alc262_parse_auto_config(codec); 11894 if (err < 0) { 11895 alc_free(codec); 11896 return err; 11897 } else if (!err) { 11898 printk(KERN_INFO 11899 "hda_codec: Cannot set up configuration " 11900 "from BIOS. Using base mode...\n"); 11901 board_config = ALC262_BASIC; 11902 } 11903 } 11904 11905 if (!spec->no_analog) { 11906 err = snd_hda_attach_beep_device(codec, 0x1); 11907 if (err < 0) { 11908 alc_free(codec); 11909 return err; 11910 } 11911 } 11912 11913 if (board_config != ALC262_AUTO) 11914 setup_preset(codec, &alc262_presets[board_config]); 11915 11916 spec->stream_analog_playback = &alc262_pcm_analog_playback; 11917 spec->stream_analog_capture = &alc262_pcm_analog_capture; 11918 11919 spec->stream_digital_playback = &alc262_pcm_digital_playback; 11920 spec->stream_digital_capture = &alc262_pcm_digital_capture; 11921 11922 if (!spec->adc_nids && spec->input_mux) { 11923 int i; 11924 /* check whether the digital-mic has to be supported */ 11925 for (i = 0; i < spec->input_mux->num_items; i++) { 11926 if (spec->input_mux->items[i].index >= 9) 11927 break; 11928 } 11929 if (i < spec->input_mux->num_items) { 11930 /* use only ADC0 */ 11931 spec->adc_nids = alc262_dmic_adc_nids; 11932 spec->num_adc_nids = 1; 11933 spec->capsrc_nids = alc262_dmic_capsrc_nids; 11934 } else { 11935 /* all analog inputs */ 11936 /* check whether NID 0x07 is valid */ 11937 unsigned int wcap = get_wcaps(codec, 0x07); 11938 11939 /* get type */ 11940 wcap = get_wcaps_type(wcap); 11941 if (wcap != AC_WID_AUD_IN) { 11942 spec->adc_nids = alc262_adc_nids_alt; 11943 spec->num_adc_nids = 11944 ARRAY_SIZE(alc262_adc_nids_alt); 11945 spec->capsrc_nids = alc262_capsrc_nids_alt; 11946 } else { 11947 spec->adc_nids = alc262_adc_nids; 11948 spec->num_adc_nids = 11949 ARRAY_SIZE(alc262_adc_nids); 11950 spec->capsrc_nids = alc262_capsrc_nids; 11951 } 11952 } 11953 } 11954 if (!spec->cap_mixer && !spec->no_analog) 11955 set_capture_mixer(codec); 11956 if (!spec->no_analog) 11957 set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT); 11958 11959 spec->vmaster_nid = 0x0c; 11960 11961 codec->patch_ops = alc_patch_ops; 11962 if (board_config == ALC262_AUTO) 11963 spec->init_hook = alc262_auto_init; 11964 #ifdef CONFIG_SND_HDA_POWER_SAVE 11965 if (!spec->loopback.amplist) 11966 spec->loopback.amplist = alc262_loopbacks; 11967 #endif 11968 codec->proc_widget_hook = print_realtek_coef; 11969 11970 return 0; 11971 } 11972 11973 /* 11974 * ALC268 channel source setting (2 channel) 11975 */ 11976 #define ALC268_DIGOUT_NID ALC880_DIGOUT_NID 11977 #define alc268_modes alc260_modes 11978 11979 static hda_nid_t alc268_dac_nids[2] = { 11980 /* front, hp */ 11981 0x02, 0x03 11982 }; 11983 11984 static hda_nid_t alc268_adc_nids[2] = { 11985 /* ADC0-1 */ 11986 0x08, 0x07 11987 }; 11988 11989 static hda_nid_t alc268_adc_nids_alt[1] = { 11990 /* ADC0 */ 11991 0x08 11992 }; 11993 11994 static hda_nid_t alc268_capsrc_nids[2] = { 0x23, 0x24 }; 11995 11996 static struct snd_kcontrol_new alc268_base_mixer[] = { 11997 /* output mixer control */ 11998 HDA_CODEC_VOLUME("Front Playback Volume", 0x2, 0x0, HDA_OUTPUT), 11999 HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT), 12000 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x3, 0x0, HDA_OUTPUT), 12001 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT), 12002 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), 12003 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT), 12004 HDA_CODEC_VOLUME("Line In Boost", 0x1a, 0, HDA_INPUT), 12005 { } 12006 }; 12007 12008 static struct snd_kcontrol_new alc268_toshiba_mixer[] = { 12009 /* output mixer control */ 12010 HDA_CODEC_VOLUME("Front Playback Volume", 0x2, 0x0, HDA_OUTPUT), 12011 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x3, 0x0, HDA_OUTPUT), 12012 ALC262_HIPPO_MASTER_SWITCH, 12013 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), 12014 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT), 12015 HDA_CODEC_VOLUME("Line In Boost", 0x1a, 0, HDA_INPUT), 12016 { } 12017 }; 12018 12019 /* bind Beep switches of both NID 0x0f and 0x10 */ 12020 static struct hda_bind_ctls alc268_bind_beep_sw = { 12021 .ops = &snd_hda_bind_sw, 12022 .values = { 12023 HDA_COMPOSE_AMP_VAL(0x0f, 3, 1, HDA_INPUT), 12024 HDA_COMPOSE_AMP_VAL(0x10, 3, 1, HDA_INPUT), 12025 0 12026 }, 12027 }; 12028 12029 static struct snd_kcontrol_new alc268_beep_mixer[] = { 12030 HDA_CODEC_VOLUME("Beep Playback Volume", 0x1d, 0x0, HDA_INPUT), 12031 HDA_BIND_SW("Beep Playback Switch", &alc268_bind_beep_sw), 12032 { } 12033 }; 12034 12035 static struct hda_verb alc268_eapd_verbs[] = { 12036 {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2}, 12037 {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2}, 12038 { } 12039 }; 12040 12041 /* Toshiba specific */ 12042 static struct hda_verb alc268_toshiba_verbs[] = { 12043 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, 12044 { } /* end */ 12045 }; 12046 12047 /* Acer specific */ 12048 /* bind volumes of both NID 0x02 and 0x03 */ 12049 static struct hda_bind_ctls alc268_acer_bind_master_vol = { 12050 .ops = &snd_hda_bind_vol, 12051 .values = { 12052 HDA_COMPOSE_AMP_VAL(0x02, 3, 0, HDA_OUTPUT), 12053 HDA_COMPOSE_AMP_VAL(0x03, 3, 0, HDA_OUTPUT), 12054 0 12055 }, 12056 }; 12057 12058 /* mute/unmute internal speaker according to the hp jack and mute state */ 12059 static void alc268_acer_automute(struct hda_codec *codec, int force) 12060 { 12061 struct alc_spec *spec = codec->spec; 12062 unsigned int mute; 12063 12064 if (force || !spec->sense_updated) { 12065 spec->jack_present = snd_hda_jack_detect(codec, 0x14); 12066 spec->sense_updated = 1; 12067 } 12068 if (spec->jack_present) 12069 mute = HDA_AMP_MUTE; /* mute internal speaker */ 12070 else /* unmute internal speaker if necessary */ 12071 mute = snd_hda_codec_amp_read(codec, 0x14, 0, HDA_OUTPUT, 0); 12072 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0, 12073 HDA_AMP_MUTE, mute); 12074 } 12075 12076 12077 /* bind hp and internal speaker mute (with plug check) */ 12078 static int alc268_acer_master_sw_put(struct snd_kcontrol *kcontrol, 12079 struct snd_ctl_elem_value *ucontrol) 12080 { 12081 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 12082 long *valp = ucontrol->value.integer.value; 12083 int change; 12084 12085 change = amp_stereo_mute_update(codec, 0x14, HDA_OUTPUT, 0, valp); 12086 if (change) 12087 alc268_acer_automute(codec, 0); 12088 return change; 12089 } 12090 12091 static struct snd_kcontrol_new alc268_acer_aspire_one_mixer[] = { 12092 /* output mixer control */ 12093 HDA_BIND_VOL("Master Playback Volume", &alc268_acer_bind_master_vol), 12094 { 12095 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 12096 .name = "Master Playback Switch", 12097 .info = snd_hda_mixer_amp_switch_info, 12098 .get = snd_hda_mixer_amp_switch_get, 12099 .put = alc268_acer_master_sw_put, 12100 .private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT), 12101 }, 12102 HDA_CODEC_VOLUME("Mic Boost Capture Volume", 0x18, 0, HDA_INPUT), 12103 { } 12104 }; 12105 12106 static struct snd_kcontrol_new alc268_acer_mixer[] = { 12107 /* output mixer control */ 12108 HDA_BIND_VOL("Master Playback Volume", &alc268_acer_bind_master_vol), 12109 { 12110 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 12111 .name = "Master Playback Switch", 12112 .info = snd_hda_mixer_amp_switch_info, 12113 .get = snd_hda_mixer_amp_switch_get, 12114 .put = alc268_acer_master_sw_put, 12115 .private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT), 12116 }, 12117 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), 12118 HDA_CODEC_VOLUME("Internal Mic Boost", 0x19, 0, HDA_INPUT), 12119 HDA_CODEC_VOLUME("Line In Boost", 0x1a, 0, HDA_INPUT), 12120 { } 12121 }; 12122 12123 static struct snd_kcontrol_new alc268_acer_dmic_mixer[] = { 12124 /* output mixer control */ 12125 HDA_BIND_VOL("Master Playback Volume", &alc268_acer_bind_master_vol), 12126 { 12127 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 12128 .name = "Master Playback Switch", 12129 .info = snd_hda_mixer_amp_switch_info, 12130 .get = snd_hda_mixer_amp_switch_get, 12131 .put = alc268_acer_master_sw_put, 12132 .private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT), 12133 }, 12134 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), 12135 HDA_CODEC_VOLUME("Line In Boost", 0x1a, 0, HDA_INPUT), 12136 { } 12137 }; 12138 12139 static struct hda_verb alc268_acer_aspire_one_verbs[] = { 12140 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 12141 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 12142 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, 12143 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT}, 12144 {0x23, AC_VERB_SET_CONNECT_SEL, 0x06}, 12145 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, 0xa017}, 12146 { } 12147 }; 12148 12149 static struct hda_verb alc268_acer_verbs[] = { 12150 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, /* internal dmic? */ 12151 {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 12152 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 12153 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 12154 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, 12155 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, 12156 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, 12157 { } 12158 }; 12159 12160 /* unsolicited event for HP jack sensing */ 12161 #define alc268_toshiba_unsol_event alc262_hippo_unsol_event 12162 #define alc268_toshiba_setup alc262_hippo_setup 12163 #define alc268_toshiba_automute alc262_hippo_automute 12164 12165 static void alc268_acer_unsol_event(struct hda_codec *codec, 12166 unsigned int res) 12167 { 12168 if ((res >> 26) != ALC880_HP_EVENT) 12169 return; 12170 alc268_acer_automute(codec, 1); 12171 } 12172 12173 static void alc268_acer_init_hook(struct hda_codec *codec) 12174 { 12175 alc268_acer_automute(codec, 1); 12176 } 12177 12178 /* toggle speaker-output according to the hp-jack state */ 12179 static void alc268_aspire_one_speaker_automute(struct hda_codec *codec) 12180 { 12181 unsigned int present; 12182 unsigned char bits; 12183 12184 present = snd_hda_jack_detect(codec, 0x15); 12185 bits = present ? AMP_IN_MUTE(0) : 0; 12186 snd_hda_codec_amp_stereo(codec, 0x0f, HDA_INPUT, 0, 12187 AMP_IN_MUTE(0), bits); 12188 snd_hda_codec_amp_stereo(codec, 0x0f, HDA_INPUT, 1, 12189 AMP_IN_MUTE(0), bits); 12190 } 12191 12192 static void alc268_acer_lc_unsol_event(struct hda_codec *codec, 12193 unsigned int res) 12194 { 12195 switch (res >> 26) { 12196 case ALC880_HP_EVENT: 12197 alc268_aspire_one_speaker_automute(codec); 12198 break; 12199 case ALC880_MIC_EVENT: 12200 alc_mic_automute(codec); 12201 break; 12202 } 12203 } 12204 12205 static void alc268_acer_lc_setup(struct hda_codec *codec) 12206 { 12207 struct alc_spec *spec = codec->spec; 12208 spec->ext_mic.pin = 0x18; 12209 spec->ext_mic.mux_idx = 0; 12210 spec->int_mic.pin = 0x12; 12211 spec->int_mic.mux_idx = 6; 12212 spec->auto_mic = 1; 12213 } 12214 12215 static void alc268_acer_lc_init_hook(struct hda_codec *codec) 12216 { 12217 alc268_aspire_one_speaker_automute(codec); 12218 alc_mic_automute(codec); 12219 } 12220 12221 static struct snd_kcontrol_new alc268_dell_mixer[] = { 12222 /* output mixer control */ 12223 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT), 12224 HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT), 12225 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT), 12226 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT), 12227 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), 12228 HDA_CODEC_VOLUME("Internal Mic Boost", 0x19, 0, HDA_INPUT), 12229 { } 12230 }; 12231 12232 static struct hda_verb alc268_dell_verbs[] = { 12233 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 12234 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 12235 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, 12236 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN}, 12237 { } 12238 }; 12239 12240 /* mute/unmute internal speaker according to the hp jack and mute state */ 12241 static void alc268_dell_setup(struct hda_codec *codec) 12242 { 12243 struct alc_spec *spec = codec->spec; 12244 12245 spec->autocfg.hp_pins[0] = 0x15; 12246 spec->autocfg.speaker_pins[0] = 0x14; 12247 spec->ext_mic.pin = 0x18; 12248 spec->ext_mic.mux_idx = 0; 12249 spec->int_mic.pin = 0x19; 12250 spec->int_mic.mux_idx = 1; 12251 spec->auto_mic = 1; 12252 } 12253 12254 static struct snd_kcontrol_new alc267_quanta_il1_mixer[] = { 12255 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x2, 0x0, HDA_OUTPUT), 12256 HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT), 12257 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x3, 0x0, HDA_OUTPUT), 12258 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT), 12259 HDA_CODEC_VOLUME("Mic Capture Volume", 0x23, 0x0, HDA_OUTPUT), 12260 HDA_BIND_MUTE("Mic Capture Switch", 0x23, 2, HDA_OUTPUT), 12261 HDA_CODEC_VOLUME("Ext Mic Boost", 0x18, 0, HDA_INPUT), 12262 HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT), 12263 { } 12264 }; 12265 12266 static struct hda_verb alc267_quanta_il1_verbs[] = { 12267 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, 12268 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN}, 12269 { } 12270 }; 12271 12272 static void alc267_quanta_il1_setup(struct hda_codec *codec) 12273 { 12274 struct alc_spec *spec = codec->spec; 12275 spec->autocfg.hp_pins[0] = 0x15; 12276 spec->autocfg.speaker_pins[0] = 0x14; 12277 spec->ext_mic.pin = 0x18; 12278 spec->ext_mic.mux_idx = 0; 12279 spec->int_mic.pin = 0x19; 12280 spec->int_mic.mux_idx = 1; 12281 spec->auto_mic = 1; 12282 } 12283 12284 /* 12285 * generic initialization of ADC, input mixers and output mixers 12286 */ 12287 static struct hda_verb alc268_base_init_verbs[] = { 12288 /* Unmute DAC0-1 and set vol = 0 */ 12289 {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 12290 {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 12291 12292 /* 12293 * Set up output mixers (0x0c - 0x0e) 12294 */ 12295 /* set vol=0 to output mixers */ 12296 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 12297 {0x0e, AC_VERB_SET_CONNECT_SEL, 0x00}, 12298 12299 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 12300 {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 12301 12302 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40}, 12303 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0}, 12304 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40}, 12305 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24}, 12306 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24}, 12307 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20}, 12308 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20}, 12309 {0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20}, 12310 12311 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 12312 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 12313 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 12314 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 12315 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 12316 12317 /* set PCBEEP vol = 0, mute connections */ 12318 {0x1d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 12319 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 12320 {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 12321 12322 /* Unmute Selector 23h,24h and set the default input to mic-in */ 12323 12324 {0x23, AC_VERB_SET_CONNECT_SEL, 0x00}, 12325 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 12326 {0x24, AC_VERB_SET_CONNECT_SEL, 0x00}, 12327 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 12328 12329 { } 12330 }; 12331 12332 /* 12333 * generic initialization of ADC, input mixers and output mixers 12334 */ 12335 static struct hda_verb alc268_volume_init_verbs[] = { 12336 /* set output DAC */ 12337 {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 12338 {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 12339 12340 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24}, 12341 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24}, 12342 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20}, 12343 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20}, 12344 {0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20}, 12345 12346 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 12347 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 12348 {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 12349 12350 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 12351 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 12352 12353 /* set PCBEEP vol = 0, mute connections */ 12354 {0x1d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 12355 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 12356 {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 12357 12358 { } 12359 }; 12360 12361 static struct snd_kcontrol_new alc268_capture_nosrc_mixer[] = { 12362 HDA_CODEC_VOLUME("Capture Volume", 0x23, 0x0, HDA_OUTPUT), 12363 HDA_CODEC_MUTE("Capture Switch", 0x23, 0x0, HDA_OUTPUT), 12364 { } /* end */ 12365 }; 12366 12367 static struct snd_kcontrol_new alc268_capture_alt_mixer[] = { 12368 HDA_CODEC_VOLUME("Capture Volume", 0x23, 0x0, HDA_OUTPUT), 12369 HDA_CODEC_MUTE("Capture Switch", 0x23, 0x0, HDA_OUTPUT), 12370 _DEFINE_CAPSRC(1), 12371 { } /* end */ 12372 }; 12373 12374 static struct snd_kcontrol_new alc268_capture_mixer[] = { 12375 HDA_CODEC_VOLUME("Capture Volume", 0x23, 0x0, HDA_OUTPUT), 12376 HDA_CODEC_MUTE("Capture Switch", 0x23, 0x0, HDA_OUTPUT), 12377 HDA_CODEC_VOLUME_IDX("Capture Volume", 1, 0x24, 0x0, HDA_OUTPUT), 12378 HDA_CODEC_MUTE_IDX("Capture Switch", 1, 0x24, 0x0, HDA_OUTPUT), 12379 _DEFINE_CAPSRC(2), 12380 { } /* end */ 12381 }; 12382 12383 static struct hda_input_mux alc268_capture_source = { 12384 .num_items = 4, 12385 .items = { 12386 { "Mic", 0x0 }, 12387 { "Front Mic", 0x1 }, 12388 { "Line", 0x2 }, 12389 { "CD", 0x3 }, 12390 }, 12391 }; 12392 12393 static struct hda_input_mux alc268_acer_capture_source = { 12394 .num_items = 3, 12395 .items = { 12396 { "Mic", 0x0 }, 12397 { "Internal Mic", 0x1 }, 12398 { "Line", 0x2 }, 12399 }, 12400 }; 12401 12402 static struct hda_input_mux alc268_acer_dmic_capture_source = { 12403 .num_items = 3, 12404 .items = { 12405 { "Mic", 0x0 }, 12406 { "Internal Mic", 0x6 }, 12407 { "Line", 0x2 }, 12408 }, 12409 }; 12410 12411 #ifdef CONFIG_SND_DEBUG 12412 static struct snd_kcontrol_new alc268_test_mixer[] = { 12413 /* Volume widgets */ 12414 HDA_CODEC_VOLUME("LOUT1 Playback Volume", 0x02, 0x0, HDA_OUTPUT), 12415 HDA_CODEC_VOLUME("LOUT2 Playback Volume", 0x03, 0x0, HDA_OUTPUT), 12416 HDA_BIND_MUTE_MONO("Mono sum Playback Switch", 0x0e, 1, 2, HDA_INPUT), 12417 HDA_BIND_MUTE("LINE-OUT sum Playback Switch", 0x0f, 2, HDA_INPUT), 12418 HDA_BIND_MUTE("HP-OUT sum Playback Switch", 0x10, 2, HDA_INPUT), 12419 HDA_BIND_MUTE("LINE-OUT Playback Switch", 0x14, 2, HDA_OUTPUT), 12420 HDA_BIND_MUTE("HP-OUT Playback Switch", 0x15, 2, HDA_OUTPUT), 12421 HDA_BIND_MUTE("Mono Playback Switch", 0x16, 2, HDA_OUTPUT), 12422 HDA_CODEC_VOLUME("MIC1 Capture Volume", 0x18, 0x0, HDA_INPUT), 12423 HDA_BIND_MUTE("MIC1 Capture Switch", 0x18, 2, HDA_OUTPUT), 12424 HDA_CODEC_VOLUME("MIC2 Capture Volume", 0x19, 0x0, HDA_INPUT), 12425 HDA_CODEC_VOLUME("LINE1 Capture Volume", 0x1a, 0x0, HDA_INPUT), 12426 HDA_BIND_MUTE("LINE1 Capture Switch", 0x1a, 2, HDA_OUTPUT), 12427 /* The below appears problematic on some hardwares */ 12428 /*HDA_CODEC_VOLUME("PCBEEP Playback Volume", 0x1d, 0x0, HDA_INPUT),*/ 12429 HDA_CODEC_VOLUME("PCM-IN1 Capture Volume", 0x23, 0x0, HDA_OUTPUT), 12430 HDA_BIND_MUTE("PCM-IN1 Capture Switch", 0x23, 2, HDA_OUTPUT), 12431 HDA_CODEC_VOLUME("PCM-IN2 Capture Volume", 0x24, 0x0, HDA_OUTPUT), 12432 HDA_BIND_MUTE("PCM-IN2 Capture Switch", 0x24, 2, HDA_OUTPUT), 12433 12434 /* Modes for retasking pin widgets */ 12435 ALC_PIN_MODE("LINE-OUT pin mode", 0x14, ALC_PIN_DIR_INOUT), 12436 ALC_PIN_MODE("HP-OUT pin mode", 0x15, ALC_PIN_DIR_INOUT), 12437 ALC_PIN_MODE("MIC1 pin mode", 0x18, ALC_PIN_DIR_INOUT), 12438 ALC_PIN_MODE("LINE1 pin mode", 0x1a, ALC_PIN_DIR_INOUT), 12439 12440 /* Controls for GPIO pins, assuming they are configured as outputs */ 12441 ALC_GPIO_DATA_SWITCH("GPIO pin 0", 0x01, 0x01), 12442 ALC_GPIO_DATA_SWITCH("GPIO pin 1", 0x01, 0x02), 12443 ALC_GPIO_DATA_SWITCH("GPIO pin 2", 0x01, 0x04), 12444 ALC_GPIO_DATA_SWITCH("GPIO pin 3", 0x01, 0x08), 12445 12446 /* Switches to allow the digital SPDIF output pin to be enabled. 12447 * The ALC268 does not have an SPDIF input. 12448 */ 12449 ALC_SPDIF_CTRL_SWITCH("SPDIF Playback Switch", 0x06, 0x01), 12450 12451 /* A switch allowing EAPD to be enabled. Some laptops seem to use 12452 * this output to turn on an external amplifier. 12453 */ 12454 ALC_EAPD_CTRL_SWITCH("LINE-OUT EAPD Enable Switch", 0x0f, 0x02), 12455 ALC_EAPD_CTRL_SWITCH("HP-OUT EAPD Enable Switch", 0x10, 0x02), 12456 12457 { } /* end */ 12458 }; 12459 #endif 12460 12461 /* create input playback/capture controls for the given pin */ 12462 static int alc268_new_analog_output(struct alc_spec *spec, hda_nid_t nid, 12463 const char *ctlname, int idx) 12464 { 12465 hda_nid_t dac; 12466 int err; 12467 12468 switch (nid) { 12469 case 0x14: 12470 case 0x16: 12471 dac = 0x02; 12472 break; 12473 case 0x15: 12474 dac = 0x03; 12475 break; 12476 default: 12477 return 0; 12478 } 12479 if (spec->multiout.dac_nids[0] != dac && 12480 spec->multiout.dac_nids[1] != dac) { 12481 err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, ctlname, 12482 HDA_COMPOSE_AMP_VAL(dac, 3, idx, 12483 HDA_OUTPUT)); 12484 if (err < 0) 12485 return err; 12486 spec->multiout.dac_nids[spec->multiout.num_dacs++] = dac; 12487 } 12488 12489 if (nid != 0x16) 12490 err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, ctlname, 12491 HDA_COMPOSE_AMP_VAL(nid, 3, idx, HDA_OUTPUT)); 12492 else /* mono */ 12493 err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, ctlname, 12494 HDA_COMPOSE_AMP_VAL(nid, 2, idx, HDA_OUTPUT)); 12495 if (err < 0) 12496 return err; 12497 return 0; 12498 } 12499 12500 /* add playback controls from the parsed DAC table */ 12501 static int alc268_auto_create_multi_out_ctls(struct alc_spec *spec, 12502 const struct auto_pin_cfg *cfg) 12503 { 12504 hda_nid_t nid; 12505 int err; 12506 12507 spec->multiout.dac_nids = spec->private_dac_nids; 12508 12509 nid = cfg->line_out_pins[0]; 12510 if (nid) { 12511 const char *name; 12512 if (cfg->line_out_type == AUTO_PIN_SPEAKER_OUT) 12513 name = "Speaker"; 12514 else 12515 name = "Front"; 12516 err = alc268_new_analog_output(spec, nid, name, 0); 12517 if (err < 0) 12518 return err; 12519 } 12520 12521 nid = cfg->speaker_pins[0]; 12522 if (nid == 0x1d) { 12523 err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, "Speaker", 12524 HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_INPUT)); 12525 if (err < 0) 12526 return err; 12527 } else { 12528 err = alc268_new_analog_output(spec, nid, "Speaker", 0); 12529 if (err < 0) 12530 return err; 12531 } 12532 nid = cfg->hp_pins[0]; 12533 if (nid) { 12534 err = alc268_new_analog_output(spec, nid, "Headphone", 0); 12535 if (err < 0) 12536 return err; 12537 } 12538 12539 nid = cfg->line_out_pins[1] | cfg->line_out_pins[2]; 12540 if (nid == 0x16) { 12541 err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, "Mono", 12542 HDA_COMPOSE_AMP_VAL(nid, 2, 0, HDA_OUTPUT)); 12543 if (err < 0) 12544 return err; 12545 } 12546 return 0; 12547 } 12548 12549 /* create playback/capture controls for input pins */ 12550 static int alc268_auto_create_input_ctls(struct hda_codec *codec, 12551 const struct auto_pin_cfg *cfg) 12552 { 12553 return alc_auto_create_input_ctls(codec, cfg, 0, 0x23, 0x24); 12554 } 12555 12556 static void alc268_auto_set_output_and_unmute(struct hda_codec *codec, 12557 hda_nid_t nid, int pin_type) 12558 { 12559 int idx; 12560 12561 alc_set_pin_output(codec, nid, pin_type); 12562 if (nid == 0x14 || nid == 0x16) 12563 idx = 0; 12564 else 12565 idx = 1; 12566 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_CONNECT_SEL, idx); 12567 } 12568 12569 static void alc268_auto_init_multi_out(struct hda_codec *codec) 12570 { 12571 struct alc_spec *spec = codec->spec; 12572 hda_nid_t nid = spec->autocfg.line_out_pins[0]; 12573 if (nid) { 12574 int pin_type = get_pin_type(spec->autocfg.line_out_type); 12575 alc268_auto_set_output_and_unmute(codec, nid, pin_type); 12576 } 12577 } 12578 12579 static void alc268_auto_init_hp_out(struct hda_codec *codec) 12580 { 12581 struct alc_spec *spec = codec->spec; 12582 hda_nid_t pin; 12583 12584 pin = spec->autocfg.hp_pins[0]; 12585 if (pin) 12586 alc268_auto_set_output_and_unmute(codec, pin, PIN_HP); 12587 pin = spec->autocfg.speaker_pins[0]; 12588 if (pin) 12589 alc268_auto_set_output_and_unmute(codec, pin, PIN_OUT); 12590 } 12591 12592 static void alc268_auto_init_mono_speaker_out(struct hda_codec *codec) 12593 { 12594 struct alc_spec *spec = codec->spec; 12595 hda_nid_t speaker_nid = spec->autocfg.speaker_pins[0]; 12596 hda_nid_t hp_nid = spec->autocfg.hp_pins[0]; 12597 hda_nid_t line_nid = spec->autocfg.line_out_pins[0]; 12598 unsigned int dac_vol1, dac_vol2; 12599 12600 if (line_nid == 0x1d || speaker_nid == 0x1d) { 12601 snd_hda_codec_write(codec, speaker_nid, 0, 12602 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT); 12603 /* mute mixer inputs from 0x1d */ 12604 snd_hda_codec_write(codec, 0x0f, 0, 12605 AC_VERB_SET_AMP_GAIN_MUTE, 12606 AMP_IN_UNMUTE(1)); 12607 snd_hda_codec_write(codec, 0x10, 0, 12608 AC_VERB_SET_AMP_GAIN_MUTE, 12609 AMP_IN_UNMUTE(1)); 12610 } else { 12611 /* unmute mixer inputs from 0x1d */ 12612 snd_hda_codec_write(codec, 0x0f, 0, 12613 AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)); 12614 snd_hda_codec_write(codec, 0x10, 0, 12615 AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)); 12616 } 12617 12618 dac_vol1 = dac_vol2 = 0xb000 | 0x40; /* set max volume */ 12619 if (line_nid == 0x14) 12620 dac_vol2 = AMP_OUT_ZERO; 12621 else if (line_nid == 0x15) 12622 dac_vol1 = AMP_OUT_ZERO; 12623 if (hp_nid == 0x14) 12624 dac_vol2 = AMP_OUT_ZERO; 12625 else if (hp_nid == 0x15) 12626 dac_vol1 = AMP_OUT_ZERO; 12627 if (line_nid != 0x16 || hp_nid != 0x16 || 12628 spec->autocfg.line_out_pins[1] != 0x16 || 12629 spec->autocfg.line_out_pins[2] != 0x16) 12630 dac_vol1 = dac_vol2 = AMP_OUT_ZERO; 12631 12632 snd_hda_codec_write(codec, 0x02, 0, 12633 AC_VERB_SET_AMP_GAIN_MUTE, dac_vol1); 12634 snd_hda_codec_write(codec, 0x03, 0, 12635 AC_VERB_SET_AMP_GAIN_MUTE, dac_vol2); 12636 } 12637 12638 /* pcm configuration: identical with ALC880 */ 12639 #define alc268_pcm_analog_playback alc880_pcm_analog_playback 12640 #define alc268_pcm_analog_capture alc880_pcm_analog_capture 12641 #define alc268_pcm_analog_alt_capture alc880_pcm_analog_alt_capture 12642 #define alc268_pcm_digital_playback alc880_pcm_digital_playback 12643 12644 /* 12645 * BIOS auto configuration 12646 */ 12647 static int alc268_parse_auto_config(struct hda_codec *codec) 12648 { 12649 struct alc_spec *spec = codec->spec; 12650 int err; 12651 static hda_nid_t alc268_ignore[] = { 0 }; 12652 12653 err = snd_hda_parse_pin_def_config(codec, &spec->autocfg, 12654 alc268_ignore); 12655 if (err < 0) 12656 return err; 12657 if (!spec->autocfg.line_outs) { 12658 if (spec->autocfg.dig_outs || spec->autocfg.dig_in_pin) { 12659 spec->multiout.max_channels = 2; 12660 spec->no_analog = 1; 12661 goto dig_only; 12662 } 12663 return 0; /* can't find valid BIOS pin config */ 12664 } 12665 err = alc268_auto_create_multi_out_ctls(spec, &spec->autocfg); 12666 if (err < 0) 12667 return err; 12668 err = alc268_auto_create_input_ctls(codec, &spec->autocfg); 12669 if (err < 0) 12670 return err; 12671 12672 spec->multiout.max_channels = 2; 12673 12674 dig_only: 12675 /* digital only support output */ 12676 if (spec->autocfg.dig_outs) { 12677 spec->multiout.dig_out_nid = ALC268_DIGOUT_NID; 12678 spec->dig_out_type = spec->autocfg.dig_out_type[0]; 12679 } 12680 if (spec->kctls.list) 12681 add_mixer(spec, spec->kctls.list); 12682 12683 if (!spec->no_analog && spec->autocfg.speaker_pins[0] != 0x1d) 12684 add_mixer(spec, alc268_beep_mixer); 12685 12686 add_verb(spec, alc268_volume_init_verbs); 12687 spec->num_mux_defs = 2; 12688 spec->input_mux = &spec->private_imux[0]; 12689 12690 err = alc_auto_add_mic_boost(codec); 12691 if (err < 0) 12692 return err; 12693 12694 alc_ssid_check(codec, 0x15, 0x1b, 0x14); 12695 12696 return 1; 12697 } 12698 12699 #define alc268_auto_init_analog_input alc882_auto_init_analog_input 12700 12701 /* init callback for auto-configuration model -- overriding the default init */ 12702 static void alc268_auto_init(struct hda_codec *codec) 12703 { 12704 struct alc_spec *spec = codec->spec; 12705 alc268_auto_init_multi_out(codec); 12706 alc268_auto_init_hp_out(codec); 12707 alc268_auto_init_mono_speaker_out(codec); 12708 alc268_auto_init_analog_input(codec); 12709 if (spec->unsol_event) 12710 alc_inithook(codec); 12711 } 12712 12713 /* 12714 * configuration and preset 12715 */ 12716 static const char *alc268_models[ALC268_MODEL_LAST] = { 12717 [ALC267_QUANTA_IL1] = "quanta-il1", 12718 [ALC268_3ST] = "3stack", 12719 [ALC268_TOSHIBA] = "toshiba", 12720 [ALC268_ACER] = "acer", 12721 [ALC268_ACER_DMIC] = "acer-dmic", 12722 [ALC268_ACER_ASPIRE_ONE] = "acer-aspire", 12723 [ALC268_DELL] = "dell", 12724 [ALC268_ZEPTO] = "zepto", 12725 #ifdef CONFIG_SND_DEBUG 12726 [ALC268_TEST] = "test", 12727 #endif 12728 [ALC268_AUTO] = "auto", 12729 }; 12730 12731 static struct snd_pci_quirk alc268_cfg_tbl[] = { 12732 SND_PCI_QUIRK(0x1025, 0x011e, "Acer Aspire 5720z", ALC268_ACER), 12733 SND_PCI_QUIRK(0x1025, 0x0126, "Acer", ALC268_ACER), 12734 SND_PCI_QUIRK(0x1025, 0x012e, "Acer Aspire 5310", ALC268_ACER), 12735 SND_PCI_QUIRK(0x1025, 0x0130, "Acer Extensa 5210", ALC268_ACER), 12736 SND_PCI_QUIRK(0x1025, 0x0136, "Acer Aspire 5315", ALC268_ACER), 12737 SND_PCI_QUIRK(0x1025, 0x015b, "Acer Aspire One", 12738 ALC268_ACER_ASPIRE_ONE), 12739 SND_PCI_QUIRK(0x1028, 0x0253, "Dell OEM", ALC268_DELL), 12740 SND_PCI_QUIRK_MASK(0x1028, 0xfff0, 0x02b0, 12741 "Dell Inspiron Mini9/Vostro A90", ALC268_DELL), 12742 /* almost compatible with toshiba but with optional digital outs; 12743 * auto-probing seems working fine 12744 */ 12745 SND_PCI_QUIRK_MASK(0x103c, 0xff00, 0x3000, "HP TX25xx series", 12746 ALC268_AUTO), 12747 SND_PCI_QUIRK(0x1043, 0x1205, "ASUS W7J", ALC268_3ST), 12748 SND_PCI_QUIRK(0x1170, 0x0040, "ZEPTO", ALC268_ZEPTO), 12749 SND_PCI_QUIRK(0x14c0, 0x0025, "COMPAL IFL90/JFL-92", ALC268_TOSHIBA), 12750 SND_PCI_QUIRK(0x152d, 0x0763, "Diverse (CPR2000)", ALC268_ACER), 12751 SND_PCI_QUIRK(0x152d, 0x0771, "Quanta IL1", ALC267_QUANTA_IL1), 12752 SND_PCI_QUIRK(0x1854, 0x1775, "LG R510", ALC268_DELL), 12753 {} 12754 }; 12755 12756 /* Toshiba laptops have no unique PCI SSID but only codec SSID */ 12757 static struct snd_pci_quirk alc268_ssid_cfg_tbl[] = { 12758 SND_PCI_QUIRK(0x1179, 0xff0a, "TOSHIBA X-200", ALC268_AUTO), 12759 SND_PCI_QUIRK(0x1179, 0xff0e, "TOSHIBA X-200 HDMI", ALC268_AUTO), 12760 SND_PCI_QUIRK_MASK(0x1179, 0xff00, 0xff00, "TOSHIBA A/Lx05", 12761 ALC268_TOSHIBA), 12762 {} 12763 }; 12764 12765 static struct alc_config_preset alc268_presets[] = { 12766 [ALC267_QUANTA_IL1] = { 12767 .mixers = { alc267_quanta_il1_mixer, alc268_beep_mixer, 12768 alc268_capture_nosrc_mixer }, 12769 .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs, 12770 alc267_quanta_il1_verbs }, 12771 .num_dacs = ARRAY_SIZE(alc268_dac_nids), 12772 .dac_nids = alc268_dac_nids, 12773 .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt), 12774 .adc_nids = alc268_adc_nids_alt, 12775 .hp_nid = 0x03, 12776 .num_channel_mode = ARRAY_SIZE(alc268_modes), 12777 .channel_mode = alc268_modes, 12778 .unsol_event = alc_sku_unsol_event, 12779 .setup = alc267_quanta_il1_setup, 12780 .init_hook = alc_inithook, 12781 }, 12782 [ALC268_3ST] = { 12783 .mixers = { alc268_base_mixer, alc268_capture_alt_mixer, 12784 alc268_beep_mixer }, 12785 .init_verbs = { alc268_base_init_verbs }, 12786 .num_dacs = ARRAY_SIZE(alc268_dac_nids), 12787 .dac_nids = alc268_dac_nids, 12788 .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt), 12789 .adc_nids = alc268_adc_nids_alt, 12790 .capsrc_nids = alc268_capsrc_nids, 12791 .hp_nid = 0x03, 12792 .dig_out_nid = ALC268_DIGOUT_NID, 12793 .num_channel_mode = ARRAY_SIZE(alc268_modes), 12794 .channel_mode = alc268_modes, 12795 .input_mux = &alc268_capture_source, 12796 }, 12797 [ALC268_TOSHIBA] = { 12798 .mixers = { alc268_toshiba_mixer, alc268_capture_alt_mixer, 12799 alc268_beep_mixer }, 12800 .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs, 12801 alc268_toshiba_verbs }, 12802 .num_dacs = ARRAY_SIZE(alc268_dac_nids), 12803 .dac_nids = alc268_dac_nids, 12804 .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt), 12805 .adc_nids = alc268_adc_nids_alt, 12806 .capsrc_nids = alc268_capsrc_nids, 12807 .hp_nid = 0x03, 12808 .num_channel_mode = ARRAY_SIZE(alc268_modes), 12809 .channel_mode = alc268_modes, 12810 .input_mux = &alc268_capture_source, 12811 .unsol_event = alc268_toshiba_unsol_event, 12812 .setup = alc268_toshiba_setup, 12813 .init_hook = alc268_toshiba_automute, 12814 }, 12815 [ALC268_ACER] = { 12816 .mixers = { alc268_acer_mixer, alc268_capture_alt_mixer, 12817 alc268_beep_mixer }, 12818 .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs, 12819 alc268_acer_verbs }, 12820 .num_dacs = ARRAY_SIZE(alc268_dac_nids), 12821 .dac_nids = alc268_dac_nids, 12822 .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt), 12823 .adc_nids = alc268_adc_nids_alt, 12824 .capsrc_nids = alc268_capsrc_nids, 12825 .hp_nid = 0x02, 12826 .num_channel_mode = ARRAY_SIZE(alc268_modes), 12827 .channel_mode = alc268_modes, 12828 .input_mux = &alc268_acer_capture_source, 12829 .unsol_event = alc268_acer_unsol_event, 12830 .init_hook = alc268_acer_init_hook, 12831 }, 12832 [ALC268_ACER_DMIC] = { 12833 .mixers = { alc268_acer_dmic_mixer, alc268_capture_alt_mixer, 12834 alc268_beep_mixer }, 12835 .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs, 12836 alc268_acer_verbs }, 12837 .num_dacs = ARRAY_SIZE(alc268_dac_nids), 12838 .dac_nids = alc268_dac_nids, 12839 .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt), 12840 .adc_nids = alc268_adc_nids_alt, 12841 .capsrc_nids = alc268_capsrc_nids, 12842 .hp_nid = 0x02, 12843 .num_channel_mode = ARRAY_SIZE(alc268_modes), 12844 .channel_mode = alc268_modes, 12845 .input_mux = &alc268_acer_dmic_capture_source, 12846 .unsol_event = alc268_acer_unsol_event, 12847 .init_hook = alc268_acer_init_hook, 12848 }, 12849 [ALC268_ACER_ASPIRE_ONE] = { 12850 .mixers = { alc268_acer_aspire_one_mixer, 12851 alc268_beep_mixer, 12852 alc268_capture_nosrc_mixer }, 12853 .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs, 12854 alc268_acer_aspire_one_verbs }, 12855 .num_dacs = ARRAY_SIZE(alc268_dac_nids), 12856 .dac_nids = alc268_dac_nids, 12857 .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt), 12858 .adc_nids = alc268_adc_nids_alt, 12859 .capsrc_nids = alc268_capsrc_nids, 12860 .hp_nid = 0x03, 12861 .num_channel_mode = ARRAY_SIZE(alc268_modes), 12862 .channel_mode = alc268_modes, 12863 .unsol_event = alc268_acer_lc_unsol_event, 12864 .setup = alc268_acer_lc_setup, 12865 .init_hook = alc268_acer_lc_init_hook, 12866 }, 12867 [ALC268_DELL] = { 12868 .mixers = { alc268_dell_mixer, alc268_beep_mixer, 12869 alc268_capture_nosrc_mixer }, 12870 .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs, 12871 alc268_dell_verbs }, 12872 .num_dacs = ARRAY_SIZE(alc268_dac_nids), 12873 .dac_nids = alc268_dac_nids, 12874 .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt), 12875 .adc_nids = alc268_adc_nids_alt, 12876 .capsrc_nids = alc268_capsrc_nids, 12877 .hp_nid = 0x02, 12878 .num_channel_mode = ARRAY_SIZE(alc268_modes), 12879 .channel_mode = alc268_modes, 12880 .unsol_event = alc_sku_unsol_event, 12881 .setup = alc268_dell_setup, 12882 .init_hook = alc_inithook, 12883 }, 12884 [ALC268_ZEPTO] = { 12885 .mixers = { alc268_base_mixer, alc268_capture_alt_mixer, 12886 alc268_beep_mixer }, 12887 .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs, 12888 alc268_toshiba_verbs }, 12889 .num_dacs = ARRAY_SIZE(alc268_dac_nids), 12890 .dac_nids = alc268_dac_nids, 12891 .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt), 12892 .adc_nids = alc268_adc_nids_alt, 12893 .capsrc_nids = alc268_capsrc_nids, 12894 .hp_nid = 0x03, 12895 .dig_out_nid = ALC268_DIGOUT_NID, 12896 .num_channel_mode = ARRAY_SIZE(alc268_modes), 12897 .channel_mode = alc268_modes, 12898 .input_mux = &alc268_capture_source, 12899 .setup = alc268_toshiba_setup, 12900 .init_hook = alc268_toshiba_automute, 12901 }, 12902 #ifdef CONFIG_SND_DEBUG 12903 [ALC268_TEST] = { 12904 .mixers = { alc268_test_mixer, alc268_capture_mixer }, 12905 .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs, 12906 alc268_volume_init_verbs }, 12907 .num_dacs = ARRAY_SIZE(alc268_dac_nids), 12908 .dac_nids = alc268_dac_nids, 12909 .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt), 12910 .adc_nids = alc268_adc_nids_alt, 12911 .capsrc_nids = alc268_capsrc_nids, 12912 .hp_nid = 0x03, 12913 .dig_out_nid = ALC268_DIGOUT_NID, 12914 .num_channel_mode = ARRAY_SIZE(alc268_modes), 12915 .channel_mode = alc268_modes, 12916 .input_mux = &alc268_capture_source, 12917 }, 12918 #endif 12919 }; 12920 12921 static int patch_alc268(struct hda_codec *codec) 12922 { 12923 struct alc_spec *spec; 12924 int board_config; 12925 int i, has_beep, err; 12926 12927 spec = kzalloc(sizeof(*spec), GFP_KERNEL); 12928 if (spec == NULL) 12929 return -ENOMEM; 12930 12931 codec->spec = spec; 12932 12933 board_config = snd_hda_check_board_config(codec, ALC268_MODEL_LAST, 12934 alc268_models, 12935 alc268_cfg_tbl); 12936 12937 if (board_config < 0 || board_config >= ALC268_MODEL_LAST) 12938 board_config = snd_hda_check_board_codec_sid_config(codec, 12939 ALC882_MODEL_LAST, alc268_models, alc268_ssid_cfg_tbl); 12940 12941 if (board_config < 0 || board_config >= ALC268_MODEL_LAST) { 12942 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n", 12943 codec->chip_name); 12944 board_config = ALC268_AUTO; 12945 } 12946 12947 if (board_config == ALC268_AUTO) { 12948 /* automatic parse from the BIOS config */ 12949 err = alc268_parse_auto_config(codec); 12950 if (err < 0) { 12951 alc_free(codec); 12952 return err; 12953 } else if (!err) { 12954 printk(KERN_INFO 12955 "hda_codec: Cannot set up configuration " 12956 "from BIOS. Using base mode...\n"); 12957 board_config = ALC268_3ST; 12958 } 12959 } 12960 12961 if (board_config != ALC268_AUTO) 12962 setup_preset(codec, &alc268_presets[board_config]); 12963 12964 spec->stream_analog_playback = &alc268_pcm_analog_playback; 12965 spec->stream_analog_capture = &alc268_pcm_analog_capture; 12966 spec->stream_analog_alt_capture = &alc268_pcm_analog_alt_capture; 12967 12968 spec->stream_digital_playback = &alc268_pcm_digital_playback; 12969 12970 has_beep = 0; 12971 for (i = 0; i < spec->num_mixers; i++) { 12972 if (spec->mixers[i] == alc268_beep_mixer) { 12973 has_beep = 1; 12974 break; 12975 } 12976 } 12977 12978 if (has_beep) { 12979 err = snd_hda_attach_beep_device(codec, 0x1); 12980 if (err < 0) { 12981 alc_free(codec); 12982 return err; 12983 } 12984 if (!query_amp_caps(codec, 0x1d, HDA_INPUT)) 12985 /* override the amp caps for beep generator */ 12986 snd_hda_override_amp_caps(codec, 0x1d, HDA_INPUT, 12987 (0x0c << AC_AMPCAP_OFFSET_SHIFT) | 12988 (0x0c << AC_AMPCAP_NUM_STEPS_SHIFT) | 12989 (0x07 << AC_AMPCAP_STEP_SIZE_SHIFT) | 12990 (0 << AC_AMPCAP_MUTE_SHIFT)); 12991 } 12992 12993 if (!spec->no_analog && !spec->adc_nids && spec->input_mux) { 12994 /* check whether NID 0x07 is valid */ 12995 unsigned int wcap = get_wcaps(codec, 0x07); 12996 int i; 12997 12998 spec->capsrc_nids = alc268_capsrc_nids; 12999 /* get type */ 13000 wcap = get_wcaps_type(wcap); 13001 if (spec->auto_mic || 13002 wcap != AC_WID_AUD_IN || spec->input_mux->num_items == 1) { 13003 spec->adc_nids = alc268_adc_nids_alt; 13004 spec->num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt); 13005 if (spec->auto_mic) 13006 fixup_automic_adc(codec); 13007 if (spec->auto_mic || spec->input_mux->num_items == 1) 13008 add_mixer(spec, alc268_capture_nosrc_mixer); 13009 else 13010 add_mixer(spec, alc268_capture_alt_mixer); 13011 } else { 13012 spec->adc_nids = alc268_adc_nids; 13013 spec->num_adc_nids = ARRAY_SIZE(alc268_adc_nids); 13014 add_mixer(spec, alc268_capture_mixer); 13015 } 13016 /* set default input source */ 13017 for (i = 0; i < spec->num_adc_nids; i++) 13018 snd_hda_codec_write_cache(codec, alc268_capsrc_nids[i], 13019 0, AC_VERB_SET_CONNECT_SEL, 13020 i < spec->num_mux_defs ? 13021 spec->input_mux[i].items[0].index : 13022 spec->input_mux->items[0].index); 13023 } 13024 13025 spec->vmaster_nid = 0x02; 13026 13027 codec->patch_ops = alc_patch_ops; 13028 if (board_config == ALC268_AUTO) 13029 spec->init_hook = alc268_auto_init; 13030 13031 codec->proc_widget_hook = print_realtek_coef; 13032 13033 return 0; 13034 } 13035 13036 /* 13037 * ALC269 channel source setting (2 channel) 13038 */ 13039 #define ALC269_DIGOUT_NID ALC880_DIGOUT_NID 13040 13041 #define alc269_dac_nids alc260_dac_nids 13042 13043 static hda_nid_t alc269_adc_nids[1] = { 13044 /* ADC1 */ 13045 0x08, 13046 }; 13047 13048 static hda_nid_t alc269_capsrc_nids[1] = { 13049 0x23, 13050 }; 13051 13052 /* NOTE: ADC2 (0x07) is connected from a recording *MIXER* (0x24), 13053 * not a mux! 13054 */ 13055 13056 #define alc269_modes alc260_modes 13057 #define alc269_capture_source alc880_lg_lw_capture_source 13058 13059 static struct snd_kcontrol_new alc269_base_mixer[] = { 13060 HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT), 13061 HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT), 13062 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), 13063 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), 13064 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 13065 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 13066 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), 13067 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT), 13068 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT), 13069 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT), 13070 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT), 13071 HDA_CODEC_MUTE_MONO("Mono Playback Switch", 0x16, 2, 0x0, HDA_OUTPUT), 13072 { } /* end */ 13073 }; 13074 13075 static struct snd_kcontrol_new alc269_quanta_fl1_mixer[] = { 13076 /* output mixer control */ 13077 HDA_BIND_VOL("Master Playback Volume", &alc268_acer_bind_master_vol), 13078 { 13079 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 13080 .name = "Master Playback Switch", 13081 .info = snd_hda_mixer_amp_switch_info, 13082 .get = snd_hda_mixer_amp_switch_get, 13083 .put = alc268_acer_master_sw_put, 13084 .private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT), 13085 }, 13086 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 13087 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 13088 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), 13089 HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x01, HDA_INPUT), 13090 HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x01, HDA_INPUT), 13091 HDA_CODEC_VOLUME("Internal Mic Boost", 0x19, 0, HDA_INPUT), 13092 { } 13093 }; 13094 13095 static struct snd_kcontrol_new alc269_lifebook_mixer[] = { 13096 /* output mixer control */ 13097 HDA_BIND_VOL("Master Playback Volume", &alc268_acer_bind_master_vol), 13098 { 13099 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 13100 .name = "Master Playback Switch", 13101 .info = snd_hda_mixer_amp_switch_info, 13102 .get = snd_hda_mixer_amp_switch_get, 13103 .put = alc268_acer_master_sw_put, 13104 .private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT), 13105 }, 13106 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 13107 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 13108 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), 13109 HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x01, HDA_INPUT), 13110 HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x01, HDA_INPUT), 13111 HDA_CODEC_VOLUME("Internal Mic Boost", 0x19, 0, HDA_INPUT), 13112 HDA_CODEC_VOLUME("Dock Mic Playback Volume", 0x0b, 0x03, HDA_INPUT), 13113 HDA_CODEC_MUTE("Dock Mic Playback Switch", 0x0b, 0x03, HDA_INPUT), 13114 HDA_CODEC_VOLUME("Dock Mic Boost", 0x1b, 0, HDA_INPUT), 13115 { } 13116 }; 13117 13118 static struct snd_kcontrol_new alc269_eeepc_mixer[] = { 13119 HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT), 13120 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT), 13121 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT), 13122 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT), 13123 { } /* end */ 13124 }; 13125 13126 /* capture mixer elements */ 13127 static struct snd_kcontrol_new alc269_epc_capture_mixer[] = { 13128 HDA_CODEC_VOLUME("Capture Volume", 0x08, 0x0, HDA_INPUT), 13129 HDA_CODEC_MUTE("Capture Switch", 0x08, 0x0, HDA_INPUT), 13130 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), 13131 { } /* end */ 13132 }; 13133 13134 /* FSC amilo */ 13135 #define alc269_fujitsu_mixer alc269_eeepc_mixer 13136 13137 static struct hda_verb alc269_quanta_fl1_verbs[] = { 13138 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, 13139 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 13140 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 13141 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, 13142 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT}, 13143 {0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 13144 { } 13145 }; 13146 13147 static struct hda_verb alc269_lifebook_verbs[] = { 13148 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, 13149 {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01}, 13150 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 13151 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 13152 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, 13153 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 13154 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 13155 {0x1a, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, 13156 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT}, 13157 {0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 13158 { } 13159 }; 13160 13161 /* toggle speaker-output according to the hp-jack state */ 13162 static void alc269_quanta_fl1_speaker_automute(struct hda_codec *codec) 13163 { 13164 unsigned int present; 13165 unsigned char bits; 13166 13167 present = snd_hda_jack_detect(codec, 0x15); 13168 bits = present ? AMP_IN_MUTE(0) : 0; 13169 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0, 13170 AMP_IN_MUTE(0), bits); 13171 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1, 13172 AMP_IN_MUTE(0), bits); 13173 13174 snd_hda_codec_write(codec, 0x20, 0, 13175 AC_VERB_SET_COEF_INDEX, 0x0c); 13176 snd_hda_codec_write(codec, 0x20, 0, 13177 AC_VERB_SET_PROC_COEF, 0x680); 13178 13179 snd_hda_codec_write(codec, 0x20, 0, 13180 AC_VERB_SET_COEF_INDEX, 0x0c); 13181 snd_hda_codec_write(codec, 0x20, 0, 13182 AC_VERB_SET_PROC_COEF, 0x480); 13183 } 13184 13185 /* toggle speaker-output according to the hp-jacks state */ 13186 static void alc269_lifebook_speaker_automute(struct hda_codec *codec) 13187 { 13188 unsigned int present; 13189 unsigned char bits; 13190 13191 /* Check laptop headphone socket */ 13192 present = snd_hda_jack_detect(codec, 0x15); 13193 13194 /* Check port replicator headphone socket */ 13195 present |= snd_hda_jack_detect(codec, 0x1a); 13196 13197 bits = present ? AMP_IN_MUTE(0) : 0; 13198 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0, 13199 AMP_IN_MUTE(0), bits); 13200 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1, 13201 AMP_IN_MUTE(0), bits); 13202 13203 snd_hda_codec_write(codec, 0x20, 0, 13204 AC_VERB_SET_COEF_INDEX, 0x0c); 13205 snd_hda_codec_write(codec, 0x20, 0, 13206 AC_VERB_SET_PROC_COEF, 0x680); 13207 13208 snd_hda_codec_write(codec, 0x20, 0, 13209 AC_VERB_SET_COEF_INDEX, 0x0c); 13210 snd_hda_codec_write(codec, 0x20, 0, 13211 AC_VERB_SET_PROC_COEF, 0x480); 13212 } 13213 13214 static void alc269_lifebook_mic_autoswitch(struct hda_codec *codec) 13215 { 13216 unsigned int present_laptop; 13217 unsigned int present_dock; 13218 13219 present_laptop = snd_hda_jack_detect(codec, 0x18); 13220 present_dock = snd_hda_jack_detect(codec, 0x1b); 13221 13222 /* Laptop mic port overrides dock mic port, design decision */ 13223 if (present_dock) 13224 snd_hda_codec_write(codec, 0x23, 0, 13225 AC_VERB_SET_CONNECT_SEL, 0x3); 13226 if (present_laptop) 13227 snd_hda_codec_write(codec, 0x23, 0, 13228 AC_VERB_SET_CONNECT_SEL, 0x0); 13229 if (!present_dock && !present_laptop) 13230 snd_hda_codec_write(codec, 0x23, 0, 13231 AC_VERB_SET_CONNECT_SEL, 0x1); 13232 } 13233 13234 static void alc269_quanta_fl1_unsol_event(struct hda_codec *codec, 13235 unsigned int res) 13236 { 13237 switch (res >> 26) { 13238 case ALC880_HP_EVENT: 13239 alc269_quanta_fl1_speaker_automute(codec); 13240 break; 13241 case ALC880_MIC_EVENT: 13242 alc_mic_automute(codec); 13243 break; 13244 } 13245 } 13246 13247 static void alc269_lifebook_unsol_event(struct hda_codec *codec, 13248 unsigned int res) 13249 { 13250 if ((res >> 26) == ALC880_HP_EVENT) 13251 alc269_lifebook_speaker_automute(codec); 13252 if ((res >> 26) == ALC880_MIC_EVENT) 13253 alc269_lifebook_mic_autoswitch(codec); 13254 } 13255 13256 static void alc269_quanta_fl1_setup(struct hda_codec *codec) 13257 { 13258 struct alc_spec *spec = codec->spec; 13259 spec->ext_mic.pin = 0x18; 13260 spec->ext_mic.mux_idx = 0; 13261 spec->int_mic.pin = 0x19; 13262 spec->int_mic.mux_idx = 1; 13263 spec->auto_mic = 1; 13264 } 13265 13266 static void alc269_quanta_fl1_init_hook(struct hda_codec *codec) 13267 { 13268 alc269_quanta_fl1_speaker_automute(codec); 13269 alc_mic_automute(codec); 13270 } 13271 13272 static void alc269_lifebook_init_hook(struct hda_codec *codec) 13273 { 13274 alc269_lifebook_speaker_automute(codec); 13275 alc269_lifebook_mic_autoswitch(codec); 13276 } 13277 13278 static struct hda_verb alc269_eeepc_dmic_init_verbs[] = { 13279 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, 13280 {0x23, AC_VERB_SET_CONNECT_SEL, 0x05}, 13281 {0x02, AC_VERB_SET_AMP_GAIN_MUTE, 0xb026 }, 13282 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x7019 | (0x00 << 8))}, 13283 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 13284 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT}, 13285 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT}, 13286 {} 13287 }; 13288 13289 static struct hda_verb alc269_eeepc_amic_init_verbs[] = { 13290 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, 13291 {0x23, AC_VERB_SET_CONNECT_SEL, 0x01}, 13292 {0x02, AC_VERB_SET_AMP_GAIN_MUTE, 0xb026 }, 13293 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x701b | (0x00 << 8))}, 13294 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT}, 13295 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT}, 13296 {} 13297 }; 13298 13299 /* toggle speaker-output according to the hp-jack state */ 13300 static void alc269_speaker_automute(struct hda_codec *codec) 13301 { 13302 struct alc_spec *spec = codec->spec; 13303 unsigned int nid = spec->autocfg.hp_pins[0]; 13304 unsigned int present; 13305 unsigned char bits; 13306 13307 present = snd_hda_jack_detect(codec, nid); 13308 bits = present ? AMP_IN_MUTE(0) : 0; 13309 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0, 13310 AMP_IN_MUTE(0), bits); 13311 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1, 13312 AMP_IN_MUTE(0), bits); 13313 } 13314 13315 /* unsolicited event for HP jack sensing */ 13316 static void alc269_eeepc_unsol_event(struct hda_codec *codec, 13317 unsigned int res) 13318 { 13319 switch (res >> 26) { 13320 case ALC880_HP_EVENT: 13321 alc269_speaker_automute(codec); 13322 break; 13323 case ALC880_MIC_EVENT: 13324 alc_mic_automute(codec); 13325 break; 13326 } 13327 } 13328 13329 static void alc269_eeepc_dmic_setup(struct hda_codec *codec) 13330 { 13331 struct alc_spec *spec = codec->spec; 13332 spec->ext_mic.pin = 0x18; 13333 spec->ext_mic.mux_idx = 0; 13334 spec->int_mic.pin = 0x12; 13335 spec->int_mic.mux_idx = 5; 13336 spec->auto_mic = 1; 13337 } 13338 13339 static void alc269_eeepc_amic_setup(struct hda_codec *codec) 13340 { 13341 struct alc_spec *spec = codec->spec; 13342 spec->ext_mic.pin = 0x18; 13343 spec->ext_mic.mux_idx = 0; 13344 spec->int_mic.pin = 0x19; 13345 spec->int_mic.mux_idx = 1; 13346 spec->auto_mic = 1; 13347 } 13348 13349 static void alc269_eeepc_inithook(struct hda_codec *codec) 13350 { 13351 alc269_speaker_automute(codec); 13352 alc_mic_automute(codec); 13353 } 13354 13355 /* 13356 * generic initialization of ADC, input mixers and output mixers 13357 */ 13358 static struct hda_verb alc269_init_verbs[] = { 13359 /* 13360 * Unmute ADC0 and set the default input to mic-in 13361 */ 13362 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 13363 13364 /* Mute input amps (PCBeep, Line In, Mic 1 & Mic 2) of the 13365 * analog-loopback mixer widget 13366 * Note: PASD motherboards uses the Line In 2 as the input for 13367 * front panel mic (mic 2) 13368 */ 13369 /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */ 13370 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 13371 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 13372 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, 13373 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, 13374 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, 13375 13376 /* 13377 * Set up output mixers (0x0c - 0x0e) 13378 */ 13379 /* set vol=0 to output mixers */ 13380 {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 13381 {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 13382 13383 /* set up input amps for analog loopback */ 13384 /* Amp Indices: DAC = 0, mixer = 1 */ 13385 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 13386 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 13387 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 13388 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 13389 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 13390 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 13391 13392 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 13393 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 13394 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 13395 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, 13396 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, 13397 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 13398 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 13399 13400 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 13401 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 13402 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 13403 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 13404 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 13405 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 13406 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 13407 13408 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, 13409 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, 13410 13411 /* FIXME: use matrix-type input source selection */ 13412 /* Mixer elements: 0x18, 19, 1a, 1b, 1d, 0b */ 13413 /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */ 13414 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 13415 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 13416 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, 13417 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, 13418 13419 /* set EAPD */ 13420 {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2}, 13421 {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2}, 13422 { } 13423 }; 13424 13425 #define alc269_auto_create_multi_out_ctls \ 13426 alc268_auto_create_multi_out_ctls 13427 #define alc269_auto_create_input_ctls \ 13428 alc268_auto_create_input_ctls 13429 13430 #ifdef CONFIG_SND_HDA_POWER_SAVE 13431 #define alc269_loopbacks alc880_loopbacks 13432 #endif 13433 13434 /* pcm configuration: identical with ALC880 */ 13435 #define alc269_pcm_analog_playback alc880_pcm_analog_playback 13436 #define alc269_pcm_analog_capture alc880_pcm_analog_capture 13437 #define alc269_pcm_digital_playback alc880_pcm_digital_playback 13438 #define alc269_pcm_digital_capture alc880_pcm_digital_capture 13439 13440 static struct hda_pcm_stream alc269_44k_pcm_analog_playback = { 13441 .substreams = 1, 13442 .channels_min = 2, 13443 .channels_max = 8, 13444 .rates = SNDRV_PCM_RATE_44100, /* fixed rate */ 13445 /* NID is set in alc_build_pcms */ 13446 .ops = { 13447 .open = alc880_playback_pcm_open, 13448 .prepare = alc880_playback_pcm_prepare, 13449 .cleanup = alc880_playback_pcm_cleanup 13450 }, 13451 }; 13452 13453 static struct hda_pcm_stream alc269_44k_pcm_analog_capture = { 13454 .substreams = 1, 13455 .channels_min = 2, 13456 .channels_max = 2, 13457 .rates = SNDRV_PCM_RATE_44100, /* fixed rate */ 13458 /* NID is set in alc_build_pcms */ 13459 }; 13460 13461 /* 13462 * BIOS auto configuration 13463 */ 13464 static int alc269_parse_auto_config(struct hda_codec *codec) 13465 { 13466 struct alc_spec *spec = codec->spec; 13467 int err; 13468 static hda_nid_t alc269_ignore[] = { 0x1d, 0 }; 13469 13470 err = snd_hda_parse_pin_def_config(codec, &spec->autocfg, 13471 alc269_ignore); 13472 if (err < 0) 13473 return err; 13474 13475 err = alc269_auto_create_multi_out_ctls(spec, &spec->autocfg); 13476 if (err < 0) 13477 return err; 13478 err = alc269_auto_create_input_ctls(codec, &spec->autocfg); 13479 if (err < 0) 13480 return err; 13481 13482 spec->multiout.max_channels = spec->multiout.num_dacs * 2; 13483 13484 if (spec->autocfg.dig_outs) 13485 spec->multiout.dig_out_nid = ALC269_DIGOUT_NID; 13486 13487 if (spec->kctls.list) 13488 add_mixer(spec, spec->kctls.list); 13489 13490 add_verb(spec, alc269_init_verbs); 13491 spec->num_mux_defs = 1; 13492 spec->input_mux = &spec->private_imux[0]; 13493 /* set default input source */ 13494 snd_hda_codec_write_cache(codec, alc269_capsrc_nids[0], 13495 0, AC_VERB_SET_CONNECT_SEL, 13496 spec->input_mux->items[0].index); 13497 13498 err = alc_auto_add_mic_boost(codec); 13499 if (err < 0) 13500 return err; 13501 13502 if (!spec->cap_mixer && !spec->no_analog) 13503 set_capture_mixer(codec); 13504 13505 alc_ssid_check(codec, 0x15, 0x1b, 0x14); 13506 13507 return 1; 13508 } 13509 13510 #define alc269_auto_init_multi_out alc268_auto_init_multi_out 13511 #define alc269_auto_init_hp_out alc268_auto_init_hp_out 13512 #define alc269_auto_init_analog_input alc882_auto_init_analog_input 13513 13514 13515 /* init callback for auto-configuration model -- overriding the default init */ 13516 static void alc269_auto_init(struct hda_codec *codec) 13517 { 13518 struct alc_spec *spec = codec->spec; 13519 alc269_auto_init_multi_out(codec); 13520 alc269_auto_init_hp_out(codec); 13521 alc269_auto_init_analog_input(codec); 13522 if (spec->unsol_event) 13523 alc_inithook(codec); 13524 } 13525 13526 /* 13527 * configuration and preset 13528 */ 13529 static const char *alc269_models[ALC269_MODEL_LAST] = { 13530 [ALC269_BASIC] = "basic", 13531 [ALC269_QUANTA_FL1] = "quanta", 13532 [ALC269_ASUS_AMIC] = "asus-amic", 13533 [ALC269_ASUS_DMIC] = "asus-dmic", 13534 [ALC269_FUJITSU] = "fujitsu", 13535 [ALC269_LIFEBOOK] = "lifebook", 13536 [ALC269_AUTO] = "auto", 13537 }; 13538 13539 static struct snd_pci_quirk alc269_cfg_tbl[] = { 13540 SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_QUANTA_FL1), 13541 SND_PCI_QUIRK(0x1043, 0x8330, "ASUS Eeepc P703 P900A", 13542 ALC269_ASUS_AMIC), 13543 SND_PCI_QUIRK(0x1043, 0x1133, "ASUS UJ20ft", ALC269_ASUS_AMIC), 13544 SND_PCI_QUIRK(0x1043, 0x1273, "ASUS UL80JT", ALC269_ASUS_AMIC), 13545 SND_PCI_QUIRK(0x1043, 0x1283, "ASUS U53Jc", ALC269_ASUS_AMIC), 13546 SND_PCI_QUIRK(0x1043, 0x12b3, "ASUS N82Jv", ALC269_ASUS_AMIC), 13547 SND_PCI_QUIRK(0x1043, 0x13a3, "ASUS UL30Vt", ALC269_ASUS_AMIC), 13548 SND_PCI_QUIRK(0x1043, 0x1373, "ASUS G73JX", ALC269_ASUS_AMIC), 13549 SND_PCI_QUIRK(0x1043, 0x1383, "ASUS UJ30Jc", ALC269_ASUS_AMIC), 13550 SND_PCI_QUIRK(0x1043, 0x13d3, "ASUS N61JA", ALC269_ASUS_AMIC), 13551 SND_PCI_QUIRK(0x1043, 0x1413, "ASUS UL50", ALC269_ASUS_AMIC), 13552 SND_PCI_QUIRK(0x1043, 0x1443, "ASUS UL30", ALC269_ASUS_AMIC), 13553 SND_PCI_QUIRK(0x1043, 0x1453, "ASUS M60Jv", ALC269_ASUS_AMIC), 13554 SND_PCI_QUIRK(0x1043, 0x1483, "ASUS UL80", ALC269_ASUS_AMIC), 13555 SND_PCI_QUIRK(0x1043, 0x14f3, "ASUS F83Vf", ALC269_ASUS_AMIC), 13556 SND_PCI_QUIRK(0x1043, 0x14e3, "ASUS UL20", ALC269_ASUS_AMIC), 13557 SND_PCI_QUIRK(0x1043, 0x1513, "ASUS UX30", ALC269_ASUS_AMIC), 13558 SND_PCI_QUIRK(0x1043, 0x15a3, "ASUS N60Jv", ALC269_ASUS_AMIC), 13559 SND_PCI_QUIRK(0x1043, 0x15b3, "ASUS N60Dp", ALC269_ASUS_AMIC), 13560 SND_PCI_QUIRK(0x1043, 0x15c3, "ASUS N70De", ALC269_ASUS_AMIC), 13561 SND_PCI_QUIRK(0x1043, 0x15e3, "ASUS F83T", ALC269_ASUS_AMIC), 13562 SND_PCI_QUIRK(0x1043, 0x1643, "ASUS M60J", ALC269_ASUS_AMIC), 13563 SND_PCI_QUIRK(0x1043, 0x1653, "ASUS U50", ALC269_ASUS_AMIC), 13564 SND_PCI_QUIRK(0x1043, 0x1693, "ASUS F50N", ALC269_ASUS_AMIC), 13565 SND_PCI_QUIRK(0x1043, 0x16a3, "ASUS F5Q", ALC269_ASUS_AMIC), 13566 SND_PCI_QUIRK(0x1043, 0x16e3, "ASUS UX50", ALC269_ASUS_DMIC), 13567 SND_PCI_QUIRK(0x1043, 0x1723, "ASUS P80", ALC269_ASUS_AMIC), 13568 SND_PCI_QUIRK(0x1043, 0x1743, "ASUS U80", ALC269_ASUS_AMIC), 13569 SND_PCI_QUIRK(0x1043, 0x1773, "ASUS U20A", ALC269_ASUS_AMIC), 13570 SND_PCI_QUIRK(0x1043, 0x1883, "ASUS F81Se", ALC269_ASUS_AMIC), 13571 SND_PCI_QUIRK(0x1043, 0x831a, "ASUS Eeepc P901", 13572 ALC269_ASUS_DMIC), 13573 SND_PCI_QUIRK(0x1043, 0x834a, "ASUS Eeepc S101", 13574 ALC269_ASUS_DMIC), 13575 SND_PCI_QUIRK(0x1043, 0x8398, "ASUS P1005HA", ALC269_ASUS_DMIC), 13576 SND_PCI_QUIRK(0x1043, 0x83ce, "ASUS P1005HA", ALC269_ASUS_DMIC), 13577 SND_PCI_QUIRK(0x1734, 0x115d, "FSC Amilo", ALC269_FUJITSU), 13578 SND_PCI_QUIRK(0x10cf, 0x1475, "Lifebook ICH9M-based", ALC269_LIFEBOOK), 13579 {} 13580 }; 13581 13582 static struct alc_config_preset alc269_presets[] = { 13583 [ALC269_BASIC] = { 13584 .mixers = { alc269_base_mixer }, 13585 .init_verbs = { alc269_init_verbs }, 13586 .num_dacs = ARRAY_SIZE(alc269_dac_nids), 13587 .dac_nids = alc269_dac_nids, 13588 .hp_nid = 0x03, 13589 .num_channel_mode = ARRAY_SIZE(alc269_modes), 13590 .channel_mode = alc269_modes, 13591 .input_mux = &alc269_capture_source, 13592 }, 13593 [ALC269_QUANTA_FL1] = { 13594 .mixers = { alc269_quanta_fl1_mixer }, 13595 .init_verbs = { alc269_init_verbs, alc269_quanta_fl1_verbs }, 13596 .num_dacs = ARRAY_SIZE(alc269_dac_nids), 13597 .dac_nids = alc269_dac_nids, 13598 .hp_nid = 0x03, 13599 .num_channel_mode = ARRAY_SIZE(alc269_modes), 13600 .channel_mode = alc269_modes, 13601 .input_mux = &alc269_capture_source, 13602 .unsol_event = alc269_quanta_fl1_unsol_event, 13603 .setup = alc269_quanta_fl1_setup, 13604 .init_hook = alc269_quanta_fl1_init_hook, 13605 }, 13606 [ALC269_ASUS_AMIC] = { 13607 .mixers = { alc269_eeepc_mixer }, 13608 .cap_mixer = alc269_epc_capture_mixer, 13609 .init_verbs = { alc269_init_verbs, 13610 alc269_eeepc_amic_init_verbs }, 13611 .num_dacs = ARRAY_SIZE(alc269_dac_nids), 13612 .dac_nids = alc269_dac_nids, 13613 .hp_nid = 0x03, 13614 .num_channel_mode = ARRAY_SIZE(alc269_modes), 13615 .channel_mode = alc269_modes, 13616 .unsol_event = alc269_eeepc_unsol_event, 13617 .setup = alc269_eeepc_amic_setup, 13618 .init_hook = alc269_eeepc_inithook, 13619 }, 13620 [ALC269_ASUS_DMIC] = { 13621 .mixers = { alc269_eeepc_mixer }, 13622 .cap_mixer = alc269_epc_capture_mixer, 13623 .init_verbs = { alc269_init_verbs, 13624 alc269_eeepc_dmic_init_verbs }, 13625 .num_dacs = ARRAY_SIZE(alc269_dac_nids), 13626 .dac_nids = alc269_dac_nids, 13627 .hp_nid = 0x03, 13628 .num_channel_mode = ARRAY_SIZE(alc269_modes), 13629 .channel_mode = alc269_modes, 13630 .unsol_event = alc269_eeepc_unsol_event, 13631 .setup = alc269_eeepc_dmic_setup, 13632 .init_hook = alc269_eeepc_inithook, 13633 }, 13634 [ALC269_FUJITSU] = { 13635 .mixers = { alc269_fujitsu_mixer }, 13636 .cap_mixer = alc269_epc_capture_mixer, 13637 .init_verbs = { alc269_init_verbs, 13638 alc269_eeepc_dmic_init_verbs }, 13639 .num_dacs = ARRAY_SIZE(alc269_dac_nids), 13640 .dac_nids = alc269_dac_nids, 13641 .hp_nid = 0x03, 13642 .num_channel_mode = ARRAY_SIZE(alc269_modes), 13643 .channel_mode = alc269_modes, 13644 .unsol_event = alc269_eeepc_unsol_event, 13645 .setup = alc269_eeepc_dmic_setup, 13646 .init_hook = alc269_eeepc_inithook, 13647 }, 13648 [ALC269_LIFEBOOK] = { 13649 .mixers = { alc269_lifebook_mixer }, 13650 .init_verbs = { alc269_init_verbs, alc269_lifebook_verbs }, 13651 .num_dacs = ARRAY_SIZE(alc269_dac_nids), 13652 .dac_nids = alc269_dac_nids, 13653 .hp_nid = 0x03, 13654 .num_channel_mode = ARRAY_SIZE(alc269_modes), 13655 .channel_mode = alc269_modes, 13656 .input_mux = &alc269_capture_source, 13657 .unsol_event = alc269_lifebook_unsol_event, 13658 .init_hook = alc269_lifebook_init_hook, 13659 }, 13660 }; 13661 13662 static int patch_alc269(struct hda_codec *codec) 13663 { 13664 struct alc_spec *spec; 13665 int board_config; 13666 int err; 13667 13668 spec = kzalloc(sizeof(*spec), GFP_KERNEL); 13669 if (spec == NULL) 13670 return -ENOMEM; 13671 13672 codec->spec = spec; 13673 13674 alc_fix_pll_init(codec, 0x20, 0x04, 15); 13675 13676 if ((alc_read_coef_idx(codec, 0) & 0x00f0) == 0x0010){ 13677 kfree(codec->chip_name); 13678 codec->chip_name = kstrdup("ALC259", GFP_KERNEL); 13679 if (!codec->chip_name) { 13680 alc_free(codec); 13681 return -ENOMEM; 13682 } 13683 } 13684 13685 board_config = snd_hda_check_board_config(codec, ALC269_MODEL_LAST, 13686 alc269_models, 13687 alc269_cfg_tbl); 13688 13689 if (board_config < 0) { 13690 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n", 13691 codec->chip_name); 13692 board_config = ALC269_AUTO; 13693 } 13694 13695 if (board_config == ALC269_AUTO) { 13696 /* automatic parse from the BIOS config */ 13697 err = alc269_parse_auto_config(codec); 13698 if (err < 0) { 13699 alc_free(codec); 13700 return err; 13701 } else if (!err) { 13702 printk(KERN_INFO 13703 "hda_codec: Cannot set up configuration " 13704 "from BIOS. Using base mode...\n"); 13705 board_config = ALC269_BASIC; 13706 } 13707 } 13708 13709 err = snd_hda_attach_beep_device(codec, 0x1); 13710 if (err < 0) { 13711 alc_free(codec); 13712 return err; 13713 } 13714 13715 if (board_config != ALC269_AUTO) 13716 setup_preset(codec, &alc269_presets[board_config]); 13717 13718 if (codec->subsystem_id == 0x17aa3bf8) { 13719 /* Due to a hardware problem on Lenovo Ideadpad, we need to 13720 * fix the sample rate of analog I/O to 44.1kHz 13721 */ 13722 spec->stream_analog_playback = &alc269_44k_pcm_analog_playback; 13723 spec->stream_analog_capture = &alc269_44k_pcm_analog_capture; 13724 } else { 13725 spec->stream_analog_playback = &alc269_pcm_analog_playback; 13726 spec->stream_analog_capture = &alc269_pcm_analog_capture; 13727 } 13728 spec->stream_digital_playback = &alc269_pcm_digital_playback; 13729 spec->stream_digital_capture = &alc269_pcm_digital_capture; 13730 13731 spec->adc_nids = alc269_adc_nids; 13732 spec->num_adc_nids = ARRAY_SIZE(alc269_adc_nids); 13733 spec->capsrc_nids = alc269_capsrc_nids; 13734 if (!spec->cap_mixer) 13735 set_capture_mixer(codec); 13736 set_beep_amp(spec, 0x0b, 0x04, HDA_INPUT); 13737 13738 spec->vmaster_nid = 0x02; 13739 13740 codec->patch_ops = alc_patch_ops; 13741 if (board_config == ALC269_AUTO) 13742 spec->init_hook = alc269_auto_init; 13743 #ifdef CONFIG_SND_HDA_POWER_SAVE 13744 if (!spec->loopback.amplist) 13745 spec->loopback.amplist = alc269_loopbacks; 13746 #endif 13747 codec->proc_widget_hook = print_realtek_coef; 13748 13749 return 0; 13750 } 13751 13752 /* 13753 * ALC861 channel source setting (2/6 channel selection for 3-stack) 13754 */ 13755 13756 /* 13757 * set the path ways for 2 channel output 13758 * need to set the codec line out and mic 1 pin widgets to inputs 13759 */ 13760 static struct hda_verb alc861_threestack_ch2_init[] = { 13761 /* set pin widget 1Ah (line in) for input */ 13762 { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 }, 13763 /* set pin widget 18h (mic1/2) for input, for mic also enable 13764 * the vref 13765 */ 13766 { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 }, 13767 13768 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c }, 13769 #if 0 13770 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8)) }, /*mic*/ 13771 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8)) }, /*line-in*/ 13772 #endif 13773 { } /* end */ 13774 }; 13775 /* 13776 * 6ch mode 13777 * need to set the codec line out and mic 1 pin widgets to outputs 13778 */ 13779 static struct hda_verb alc861_threestack_ch6_init[] = { 13780 /* set pin widget 1Ah (line in) for output (Back Surround)*/ 13781 { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 }, 13782 /* set pin widget 18h (mic1) for output (CLFE)*/ 13783 { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 }, 13784 13785 { 0x0c, AC_VERB_SET_CONNECT_SEL, 0x00 }, 13786 { 0x0d, AC_VERB_SET_CONNECT_SEL, 0x00 }, 13787 13788 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080 }, 13789 #if 0 13790 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8)) }, /*mic*/ 13791 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8)) }, /*line in*/ 13792 #endif 13793 { } /* end */ 13794 }; 13795 13796 static struct hda_channel_mode alc861_threestack_modes[2] = { 13797 { 2, alc861_threestack_ch2_init }, 13798 { 6, alc861_threestack_ch6_init }, 13799 }; 13800 /* Set mic1 as input and unmute the mixer */ 13801 static struct hda_verb alc861_uniwill_m31_ch2_init[] = { 13802 { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 }, 13803 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8)) }, /*mic*/ 13804 { } /* end */ 13805 }; 13806 /* Set mic1 as output and mute mixer */ 13807 static struct hda_verb alc861_uniwill_m31_ch4_init[] = { 13808 { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 }, 13809 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8)) }, /*mic*/ 13810 { } /* end */ 13811 }; 13812 13813 static struct hda_channel_mode alc861_uniwill_m31_modes[2] = { 13814 { 2, alc861_uniwill_m31_ch2_init }, 13815 { 4, alc861_uniwill_m31_ch4_init }, 13816 }; 13817 13818 /* Set mic1 and line-in as input and unmute the mixer */ 13819 static struct hda_verb alc861_asus_ch2_init[] = { 13820 /* set pin widget 1Ah (line in) for input */ 13821 { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 }, 13822 /* set pin widget 18h (mic1/2) for input, for mic also enable 13823 * the vref 13824 */ 13825 { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 }, 13826 13827 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c }, 13828 #if 0 13829 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8)) }, /*mic*/ 13830 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8)) }, /*line-in*/ 13831 #endif 13832 { } /* end */ 13833 }; 13834 /* Set mic1 nad line-in as output and mute mixer */ 13835 static struct hda_verb alc861_asus_ch6_init[] = { 13836 /* set pin widget 1Ah (line in) for output (Back Surround)*/ 13837 { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 }, 13838 /* { 0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, */ 13839 /* set pin widget 18h (mic1) for output (CLFE)*/ 13840 { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 }, 13841 /* { 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, */ 13842 { 0x0c, AC_VERB_SET_CONNECT_SEL, 0x00 }, 13843 { 0x0d, AC_VERB_SET_CONNECT_SEL, 0x00 }, 13844 13845 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080 }, 13846 #if 0 13847 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8)) }, /*mic*/ 13848 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8)) }, /*line in*/ 13849 #endif 13850 { } /* end */ 13851 }; 13852 13853 static struct hda_channel_mode alc861_asus_modes[2] = { 13854 { 2, alc861_asus_ch2_init }, 13855 { 6, alc861_asus_ch6_init }, 13856 }; 13857 13858 /* patch-ALC861 */ 13859 13860 static struct snd_kcontrol_new alc861_base_mixer[] = { 13861 /* output mixer control */ 13862 HDA_CODEC_MUTE("Front Playback Switch", 0x03, 0x0, HDA_OUTPUT), 13863 HDA_CODEC_MUTE("Surround Playback Switch", 0x06, 0x0, HDA_OUTPUT), 13864 HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x05, 1, 0x0, HDA_OUTPUT), 13865 HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x05, 2, 0x0, HDA_OUTPUT), 13866 HDA_CODEC_MUTE("Side Playback Switch", 0x04, 0x0, HDA_OUTPUT), 13867 13868 /*Input mixer control */ 13869 /* HDA_CODEC_VOLUME("Input Playback Volume", 0x15, 0x0, HDA_OUTPUT), 13870 HDA_CODEC_MUTE("Input Playback Switch", 0x15, 0x0, HDA_OUTPUT), */ 13871 HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_INPUT), 13872 HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_INPUT), 13873 HDA_CODEC_VOLUME("Line Playback Volume", 0x15, 0x02, HDA_INPUT), 13874 HDA_CODEC_MUTE("Line Playback Switch", 0x15, 0x02, HDA_INPUT), 13875 HDA_CODEC_VOLUME("Mic Playback Volume", 0x15, 0x01, HDA_INPUT), 13876 HDA_CODEC_MUTE("Mic Playback Switch", 0x15, 0x01, HDA_INPUT), 13877 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x10, 0x01, HDA_OUTPUT), 13878 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1a, 0x03, HDA_INPUT), 13879 13880 { } /* end */ 13881 }; 13882 13883 static struct snd_kcontrol_new alc861_3ST_mixer[] = { 13884 /* output mixer control */ 13885 HDA_CODEC_MUTE("Front Playback Switch", 0x03, 0x0, HDA_OUTPUT), 13886 HDA_CODEC_MUTE("Surround Playback Switch", 0x06, 0x0, HDA_OUTPUT), 13887 HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x05, 1, 0x0, HDA_OUTPUT), 13888 HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x05, 2, 0x0, HDA_OUTPUT), 13889 /*HDA_CODEC_MUTE("Side Playback Switch", 0x04, 0x0, HDA_OUTPUT), */ 13890 13891 /* Input mixer control */ 13892 /* HDA_CODEC_VOLUME("Input Playback Volume", 0x15, 0x0, HDA_OUTPUT), 13893 HDA_CODEC_MUTE("Input Playback Switch", 0x15, 0x0, HDA_OUTPUT), */ 13894 HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_INPUT), 13895 HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_INPUT), 13896 HDA_CODEC_VOLUME("Line Playback Volume", 0x15, 0x02, HDA_INPUT), 13897 HDA_CODEC_MUTE("Line Playback Switch", 0x15, 0x02, HDA_INPUT), 13898 HDA_CODEC_VOLUME("Mic Playback Volume", 0x15, 0x01, HDA_INPUT), 13899 HDA_CODEC_MUTE("Mic Playback Switch", 0x15, 0x01, HDA_INPUT), 13900 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x10, 0x01, HDA_OUTPUT), 13901 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1a, 0x03, HDA_INPUT), 13902 13903 { 13904 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 13905 .name = "Channel Mode", 13906 .info = alc_ch_mode_info, 13907 .get = alc_ch_mode_get, 13908 .put = alc_ch_mode_put, 13909 .private_value = ARRAY_SIZE(alc861_threestack_modes), 13910 }, 13911 { } /* end */ 13912 }; 13913 13914 static struct snd_kcontrol_new alc861_toshiba_mixer[] = { 13915 /* output mixer control */ 13916 HDA_CODEC_MUTE("Master Playback Switch", 0x03, 0x0, HDA_OUTPUT), 13917 HDA_CODEC_VOLUME("Mic Playback Volume", 0x15, 0x01, HDA_INPUT), 13918 HDA_CODEC_MUTE("Mic Playback Switch", 0x15, 0x01, HDA_INPUT), 13919 13920 { } /* end */ 13921 }; 13922 13923 static struct snd_kcontrol_new alc861_uniwill_m31_mixer[] = { 13924 /* output mixer control */ 13925 HDA_CODEC_MUTE("Front Playback Switch", 0x03, 0x0, HDA_OUTPUT), 13926 HDA_CODEC_MUTE("Surround Playback Switch", 0x06, 0x0, HDA_OUTPUT), 13927 HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x05, 1, 0x0, HDA_OUTPUT), 13928 HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x05, 2, 0x0, HDA_OUTPUT), 13929 /*HDA_CODEC_MUTE("Side Playback Switch", 0x04, 0x0, HDA_OUTPUT), */ 13930 13931 /* Input mixer control */ 13932 /* HDA_CODEC_VOLUME("Input Playback Volume", 0x15, 0x0, HDA_OUTPUT), 13933 HDA_CODEC_MUTE("Input Playback Switch", 0x15, 0x0, HDA_OUTPUT), */ 13934 HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_INPUT), 13935 HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_INPUT), 13936 HDA_CODEC_VOLUME("Line Playback Volume", 0x15, 0x02, HDA_INPUT), 13937 HDA_CODEC_MUTE("Line Playback Switch", 0x15, 0x02, HDA_INPUT), 13938 HDA_CODEC_VOLUME("Mic Playback Volume", 0x15, 0x01, HDA_INPUT), 13939 HDA_CODEC_MUTE("Mic Playback Switch", 0x15, 0x01, HDA_INPUT), 13940 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x10, 0x01, HDA_OUTPUT), 13941 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1a, 0x03, HDA_INPUT), 13942 13943 { 13944 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 13945 .name = "Channel Mode", 13946 .info = alc_ch_mode_info, 13947 .get = alc_ch_mode_get, 13948 .put = alc_ch_mode_put, 13949 .private_value = ARRAY_SIZE(alc861_uniwill_m31_modes), 13950 }, 13951 { } /* end */ 13952 }; 13953 13954 static struct snd_kcontrol_new alc861_asus_mixer[] = { 13955 /* output mixer control */ 13956 HDA_CODEC_MUTE("Front Playback Switch", 0x03, 0x0, HDA_OUTPUT), 13957 HDA_CODEC_MUTE("Surround Playback Switch", 0x06, 0x0, HDA_OUTPUT), 13958 HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x05, 1, 0x0, HDA_OUTPUT), 13959 HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x05, 2, 0x0, HDA_OUTPUT), 13960 HDA_CODEC_MUTE("Side Playback Switch", 0x04, 0x0, HDA_OUTPUT), 13961 13962 /* Input mixer control */ 13963 HDA_CODEC_VOLUME("Input Playback Volume", 0x15, 0x0, HDA_OUTPUT), 13964 HDA_CODEC_MUTE("Input Playback Switch", 0x15, 0x0, HDA_OUTPUT), 13965 HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_INPUT), 13966 HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_INPUT), 13967 HDA_CODEC_VOLUME("Line Playback Volume", 0x15, 0x02, HDA_INPUT), 13968 HDA_CODEC_MUTE("Line Playback Switch", 0x15, 0x02, HDA_INPUT), 13969 HDA_CODEC_VOLUME("Mic Playback Volume", 0x15, 0x01, HDA_INPUT), 13970 HDA_CODEC_MUTE("Mic Playback Switch", 0x15, 0x01, HDA_INPUT), 13971 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x10, 0x01, HDA_OUTPUT), 13972 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1a, 0x03, HDA_OUTPUT), 13973 13974 { 13975 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 13976 .name = "Channel Mode", 13977 .info = alc_ch_mode_info, 13978 .get = alc_ch_mode_get, 13979 .put = alc_ch_mode_put, 13980 .private_value = ARRAY_SIZE(alc861_asus_modes), 13981 }, 13982 { } 13983 }; 13984 13985 /* additional mixer */ 13986 static struct snd_kcontrol_new alc861_asus_laptop_mixer[] = { 13987 HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_INPUT), 13988 HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_INPUT), 13989 { } 13990 }; 13991 13992 /* 13993 * generic initialization of ADC, input mixers and output mixers 13994 */ 13995 static struct hda_verb alc861_base_init_verbs[] = { 13996 /* 13997 * Unmute ADC0 and set the default input to mic-in 13998 */ 13999 /* port-A for surround (rear panel) */ 14000 { 0x0e, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 }, 14001 { 0x0e, AC_VERB_SET_CONNECT_SEL, 0x00 }, 14002 /* port-B for mic-in (rear panel) with vref */ 14003 { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 }, 14004 /* port-C for line-in (rear panel) */ 14005 { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 }, 14006 /* port-D for Front */ 14007 { 0x0b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 }, 14008 { 0x0b, AC_VERB_SET_CONNECT_SEL, 0x00 }, 14009 /* port-E for HP out (front panel) */ 14010 { 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0 }, 14011 /* route front PCM to HP */ 14012 { 0x0f, AC_VERB_SET_CONNECT_SEL, 0x00 }, 14013 /* port-F for mic-in (front panel) with vref */ 14014 { 0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 }, 14015 /* port-G for CLFE (rear panel) */ 14016 { 0x1f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 }, 14017 { 0x1f, AC_VERB_SET_CONNECT_SEL, 0x00 }, 14018 /* port-H for side (rear panel) */ 14019 { 0x20, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 }, 14020 { 0x20, AC_VERB_SET_CONNECT_SEL, 0x00 }, 14021 /* CD-in */ 14022 { 0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 }, 14023 /* route front mic to ADC1*/ 14024 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00}, 14025 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 14026 14027 /* Unmute DAC0~3 & spdif out*/ 14028 {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 14029 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 14030 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 14031 {0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 14032 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 14033 14034 /* Unmute Mixer 14 (mic) 1c (Line in)*/ 14035 {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 14036 {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 14037 {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 14038 {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 14039 14040 /* Unmute Stereo Mixer 15 */ 14041 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 14042 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 14043 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)}, 14044 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c}, /* Output 0~12 step */ 14045 14046 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 14047 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 14048 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 14049 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 14050 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 14051 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 14052 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 14053 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 14054 /* hp used DAC 3 (Front) */ 14055 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)}, 14056 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)}, 14057 14058 { } 14059 }; 14060 14061 static struct hda_verb alc861_threestack_init_verbs[] = { 14062 /* 14063 * Unmute ADC0 and set the default input to mic-in 14064 */ 14065 /* port-A for surround (rear panel) */ 14066 { 0x0e, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 }, 14067 /* port-B for mic-in (rear panel) with vref */ 14068 { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 }, 14069 /* port-C for line-in (rear panel) */ 14070 { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 }, 14071 /* port-D for Front */ 14072 { 0x0b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 }, 14073 { 0x0b, AC_VERB_SET_CONNECT_SEL, 0x00 }, 14074 /* port-E for HP out (front panel) */ 14075 { 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0 }, 14076 /* route front PCM to HP */ 14077 { 0x0f, AC_VERB_SET_CONNECT_SEL, 0x00 }, 14078 /* port-F for mic-in (front panel) with vref */ 14079 { 0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 }, 14080 /* port-G for CLFE (rear panel) */ 14081 { 0x1f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 }, 14082 /* port-H for side (rear panel) */ 14083 { 0x20, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 }, 14084 /* CD-in */ 14085 { 0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 }, 14086 /* route front mic to ADC1*/ 14087 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00}, 14088 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 14089 /* Unmute DAC0~3 & spdif out*/ 14090 {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 14091 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 14092 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 14093 {0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 14094 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 14095 14096 /* Unmute Mixer 14 (mic) 1c (Line in)*/ 14097 {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 14098 {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 14099 {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 14100 {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 14101 14102 /* Unmute Stereo Mixer 15 */ 14103 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 14104 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 14105 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)}, 14106 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c}, /* Output 0~12 step */ 14107 14108 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 14109 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 14110 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 14111 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 14112 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 14113 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 14114 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 14115 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 14116 /* hp used DAC 3 (Front) */ 14117 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)}, 14118 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)}, 14119 { } 14120 }; 14121 14122 static struct hda_verb alc861_uniwill_m31_init_verbs[] = { 14123 /* 14124 * Unmute ADC0 and set the default input to mic-in 14125 */ 14126 /* port-A for surround (rear panel) */ 14127 { 0x0e, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 }, 14128 /* port-B for mic-in (rear panel) with vref */ 14129 { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 }, 14130 /* port-C for line-in (rear panel) */ 14131 { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 }, 14132 /* port-D for Front */ 14133 { 0x0b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 }, 14134 { 0x0b, AC_VERB_SET_CONNECT_SEL, 0x00 }, 14135 /* port-E for HP out (front panel) */ 14136 /* this has to be set to VREF80 */ 14137 { 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 }, 14138 /* route front PCM to HP */ 14139 { 0x0f, AC_VERB_SET_CONNECT_SEL, 0x00 }, 14140 /* port-F for mic-in (front panel) with vref */ 14141 { 0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 }, 14142 /* port-G for CLFE (rear panel) */ 14143 { 0x1f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 }, 14144 /* port-H for side (rear panel) */ 14145 { 0x20, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 }, 14146 /* CD-in */ 14147 { 0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 }, 14148 /* route front mic to ADC1*/ 14149 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00}, 14150 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 14151 /* Unmute DAC0~3 & spdif out*/ 14152 {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 14153 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 14154 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 14155 {0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 14156 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 14157 14158 /* Unmute Mixer 14 (mic) 1c (Line in)*/ 14159 {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 14160 {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 14161 {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 14162 {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 14163 14164 /* Unmute Stereo Mixer 15 */ 14165 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 14166 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 14167 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)}, 14168 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c}, /* Output 0~12 step */ 14169 14170 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 14171 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 14172 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 14173 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 14174 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 14175 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 14176 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 14177 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 14178 /* hp used DAC 3 (Front) */ 14179 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)}, 14180 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)}, 14181 { } 14182 }; 14183 14184 static struct hda_verb alc861_asus_init_verbs[] = { 14185 /* 14186 * Unmute ADC0 and set the default input to mic-in 14187 */ 14188 /* port-A for surround (rear panel) 14189 * according to codec#0 this is the HP jack 14190 */ 14191 { 0x0e, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0 }, /* was 0x00 */ 14192 /* route front PCM to HP */ 14193 { 0x0e, AC_VERB_SET_CONNECT_SEL, 0x01 }, 14194 /* port-B for mic-in (rear panel) with vref */ 14195 { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 }, 14196 /* port-C for line-in (rear panel) */ 14197 { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 }, 14198 /* port-D for Front */ 14199 { 0x0b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 }, 14200 { 0x0b, AC_VERB_SET_CONNECT_SEL, 0x00 }, 14201 /* port-E for HP out (front panel) */ 14202 /* this has to be set to VREF80 */ 14203 { 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 }, 14204 /* route front PCM to HP */ 14205 { 0x0f, AC_VERB_SET_CONNECT_SEL, 0x00 }, 14206 /* port-F for mic-in (front panel) with vref */ 14207 { 0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 }, 14208 /* port-G for CLFE (rear panel) */ 14209 { 0x1f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 }, 14210 /* port-H for side (rear panel) */ 14211 { 0x20, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 }, 14212 /* CD-in */ 14213 { 0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 }, 14214 /* route front mic to ADC1*/ 14215 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00}, 14216 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 14217 /* Unmute DAC0~3 & spdif out*/ 14218 {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 14219 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 14220 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 14221 {0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 14222 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 14223 /* Unmute Mixer 14 (mic) 1c (Line in)*/ 14224 {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 14225 {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 14226 {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 14227 {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 14228 14229 /* Unmute Stereo Mixer 15 */ 14230 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 14231 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 14232 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)}, 14233 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c}, /* Output 0~12 step */ 14234 14235 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 14236 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 14237 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 14238 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 14239 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 14240 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 14241 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 14242 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 14243 /* hp used DAC 3 (Front) */ 14244 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)}, 14245 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)}, 14246 { } 14247 }; 14248 14249 /* additional init verbs for ASUS laptops */ 14250 static struct hda_verb alc861_asus_laptop_init_verbs[] = { 14251 { 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x45 }, /* HP-out */ 14252 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2) }, /* mute line-in */ 14253 { } 14254 }; 14255 14256 /* 14257 * generic initialization of ADC, input mixers and output mixers 14258 */ 14259 static struct hda_verb alc861_auto_init_verbs[] = { 14260 /* 14261 * Unmute ADC0 and set the default input to mic-in 14262 */ 14263 /* {0x08, AC_VERB_SET_CONNECT_SEL, 0x00}, */ 14264 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 14265 14266 /* Unmute DAC0~3 & spdif out*/ 14267 {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 14268 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 14269 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 14270 {0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 14271 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 14272 14273 /* Unmute Mixer 14 (mic) 1c (Line in)*/ 14274 {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 14275 {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 14276 {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 14277 {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 14278 14279 /* Unmute Stereo Mixer 15 */ 14280 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 14281 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 14282 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)}, 14283 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c}, 14284 14285 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 14286 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 14287 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 14288 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 14289 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 14290 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 14291 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 14292 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 14293 14294 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 14295 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 14296 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, 14297 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, 14298 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 14299 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 14300 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, 14301 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, 14302 14303 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00}, /* set Mic 1 */ 14304 14305 { } 14306 }; 14307 14308 static struct hda_verb alc861_toshiba_init_verbs[] = { 14309 {0x0f, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT}, 14310 14311 { } 14312 }; 14313 14314 /* toggle speaker-output according to the hp-jack state */ 14315 static void alc861_toshiba_automute(struct hda_codec *codec) 14316 { 14317 unsigned int present = snd_hda_jack_detect(codec, 0x0f); 14318 14319 snd_hda_codec_amp_stereo(codec, 0x16, HDA_INPUT, 0, 14320 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0); 14321 snd_hda_codec_amp_stereo(codec, 0x1a, HDA_INPUT, 3, 14322 HDA_AMP_MUTE, present ? 0 : HDA_AMP_MUTE); 14323 } 14324 14325 static void alc861_toshiba_unsol_event(struct hda_codec *codec, 14326 unsigned int res) 14327 { 14328 if ((res >> 26) == ALC880_HP_EVENT) 14329 alc861_toshiba_automute(codec); 14330 } 14331 14332 /* pcm configuration: identical with ALC880 */ 14333 #define alc861_pcm_analog_playback alc880_pcm_analog_playback 14334 #define alc861_pcm_analog_capture alc880_pcm_analog_capture 14335 #define alc861_pcm_digital_playback alc880_pcm_digital_playback 14336 #define alc861_pcm_digital_capture alc880_pcm_digital_capture 14337 14338 14339 #define ALC861_DIGOUT_NID 0x07 14340 14341 static struct hda_channel_mode alc861_8ch_modes[1] = { 14342 { 8, NULL } 14343 }; 14344 14345 static hda_nid_t alc861_dac_nids[4] = { 14346 /* front, surround, clfe, side */ 14347 0x03, 0x06, 0x05, 0x04 14348 }; 14349 14350 static hda_nid_t alc660_dac_nids[3] = { 14351 /* front, clfe, surround */ 14352 0x03, 0x05, 0x06 14353 }; 14354 14355 static hda_nid_t alc861_adc_nids[1] = { 14356 /* ADC0-2 */ 14357 0x08, 14358 }; 14359 14360 static struct hda_input_mux alc861_capture_source = { 14361 .num_items = 5, 14362 .items = { 14363 { "Mic", 0x0 }, 14364 { "Front Mic", 0x3 }, 14365 { "Line", 0x1 }, 14366 { "CD", 0x4 }, 14367 { "Mixer", 0x5 }, 14368 }, 14369 }; 14370 14371 static hda_nid_t alc861_look_for_dac(struct hda_codec *codec, hda_nid_t pin) 14372 { 14373 struct alc_spec *spec = codec->spec; 14374 hda_nid_t mix, srcs[5]; 14375 int i, j, num; 14376 14377 if (snd_hda_get_connections(codec, pin, &mix, 1) != 1) 14378 return 0; 14379 num = snd_hda_get_connections(codec, mix, srcs, ARRAY_SIZE(srcs)); 14380 if (num < 0) 14381 return 0; 14382 for (i = 0; i < num; i++) { 14383 unsigned int type; 14384 type = get_wcaps_type(get_wcaps(codec, srcs[i])); 14385 if (type != AC_WID_AUD_OUT) 14386 continue; 14387 for (j = 0; j < spec->multiout.num_dacs; j++) 14388 if (spec->multiout.dac_nids[j] == srcs[i]) 14389 break; 14390 if (j >= spec->multiout.num_dacs) 14391 return srcs[i]; 14392 } 14393 return 0; 14394 } 14395 14396 /* fill in the dac_nids table from the parsed pin configuration */ 14397 static int alc861_auto_fill_dac_nids(struct hda_codec *codec, 14398 const struct auto_pin_cfg *cfg) 14399 { 14400 struct alc_spec *spec = codec->spec; 14401 int i; 14402 hda_nid_t nid, dac; 14403 14404 spec->multiout.dac_nids = spec->private_dac_nids; 14405 for (i = 0; i < cfg->line_outs; i++) { 14406 nid = cfg->line_out_pins[i]; 14407 dac = alc861_look_for_dac(codec, nid); 14408 if (!dac) 14409 continue; 14410 spec->multiout.dac_nids[spec->multiout.num_dacs++] = dac; 14411 } 14412 return 0; 14413 } 14414 14415 static int alc861_create_out_sw(struct hda_codec *codec, const char *pfx, 14416 hda_nid_t nid, unsigned int chs) 14417 { 14418 return add_pb_sw_ctrl(codec->spec, ALC_CTL_WIDGET_MUTE, pfx, 14419 HDA_COMPOSE_AMP_VAL(nid, chs, 0, HDA_OUTPUT)); 14420 } 14421 14422 /* add playback controls from the parsed DAC table */ 14423 static int alc861_auto_create_multi_out_ctls(struct hda_codec *codec, 14424 const struct auto_pin_cfg *cfg) 14425 { 14426 struct alc_spec *spec = codec->spec; 14427 static const char *chname[4] = { 14428 "Front", "Surround", NULL /*CLFE*/, "Side" 14429 }; 14430 hda_nid_t nid; 14431 int i, err; 14432 14433 if (cfg->line_outs == 1) { 14434 const char *pfx = NULL; 14435 if (!cfg->hp_outs) 14436 pfx = "Master"; 14437 else if (cfg->line_out_type == AUTO_PIN_SPEAKER_OUT) 14438 pfx = "Speaker"; 14439 if (pfx) { 14440 nid = spec->multiout.dac_nids[0]; 14441 return alc861_create_out_sw(codec, pfx, nid, 3); 14442 } 14443 } 14444 14445 for (i = 0; i < cfg->line_outs; i++) { 14446 nid = spec->multiout.dac_nids[i]; 14447 if (!nid) 14448 continue; 14449 if (i == 2) { 14450 /* Center/LFE */ 14451 err = alc861_create_out_sw(codec, "Center", nid, 1); 14452 if (err < 0) 14453 return err; 14454 err = alc861_create_out_sw(codec, "LFE", nid, 2); 14455 if (err < 0) 14456 return err; 14457 } else { 14458 err = alc861_create_out_sw(codec, chname[i], nid, 3); 14459 if (err < 0) 14460 return err; 14461 } 14462 } 14463 return 0; 14464 } 14465 14466 static int alc861_auto_create_hp_ctls(struct hda_codec *codec, hda_nid_t pin) 14467 { 14468 struct alc_spec *spec = codec->spec; 14469 int err; 14470 hda_nid_t nid; 14471 14472 if (!pin) 14473 return 0; 14474 14475 if ((pin >= 0x0b && pin <= 0x10) || pin == 0x1f || pin == 0x20) { 14476 nid = alc861_look_for_dac(codec, pin); 14477 if (nid) { 14478 err = alc861_create_out_sw(codec, "Headphone", nid, 3); 14479 if (err < 0) 14480 return err; 14481 spec->multiout.hp_nid = nid; 14482 } 14483 } 14484 return 0; 14485 } 14486 14487 /* create playback/capture controls for input pins */ 14488 static int alc861_auto_create_input_ctls(struct hda_codec *codec, 14489 const struct auto_pin_cfg *cfg) 14490 { 14491 return alc_auto_create_input_ctls(codec, cfg, 0x15, 0x08, 0); 14492 } 14493 14494 static void alc861_auto_set_output_and_unmute(struct hda_codec *codec, 14495 hda_nid_t nid, 14496 int pin_type, hda_nid_t dac) 14497 { 14498 hda_nid_t mix, srcs[5]; 14499 int i, num; 14500 14501 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_PIN_WIDGET_CONTROL, 14502 pin_type); 14503 snd_hda_codec_write(codec, dac, 0, AC_VERB_SET_AMP_GAIN_MUTE, 14504 AMP_OUT_UNMUTE); 14505 if (snd_hda_get_connections(codec, nid, &mix, 1) != 1) 14506 return; 14507 num = snd_hda_get_connections(codec, mix, srcs, ARRAY_SIZE(srcs)); 14508 if (num < 0) 14509 return; 14510 for (i = 0; i < num; i++) { 14511 unsigned int mute; 14512 if (srcs[i] == dac || srcs[i] == 0x15) 14513 mute = AMP_IN_UNMUTE(i); 14514 else 14515 mute = AMP_IN_MUTE(i); 14516 snd_hda_codec_write(codec, mix, 0, AC_VERB_SET_AMP_GAIN_MUTE, 14517 mute); 14518 } 14519 } 14520 14521 static void alc861_auto_init_multi_out(struct hda_codec *codec) 14522 { 14523 struct alc_spec *spec = codec->spec; 14524 int i; 14525 14526 for (i = 0; i < spec->autocfg.line_outs; i++) { 14527 hda_nid_t nid = spec->autocfg.line_out_pins[i]; 14528 int pin_type = get_pin_type(spec->autocfg.line_out_type); 14529 if (nid) 14530 alc861_auto_set_output_and_unmute(codec, nid, pin_type, 14531 spec->multiout.dac_nids[i]); 14532 } 14533 } 14534 14535 static void alc861_auto_init_hp_out(struct hda_codec *codec) 14536 { 14537 struct alc_spec *spec = codec->spec; 14538 14539 if (spec->autocfg.hp_outs) 14540 alc861_auto_set_output_and_unmute(codec, 14541 spec->autocfg.hp_pins[0], 14542 PIN_HP, 14543 spec->multiout.hp_nid); 14544 if (spec->autocfg.speaker_outs) 14545 alc861_auto_set_output_and_unmute(codec, 14546 spec->autocfg.speaker_pins[0], 14547 PIN_OUT, 14548 spec->multiout.dac_nids[0]); 14549 } 14550 14551 static void alc861_auto_init_analog_input(struct hda_codec *codec) 14552 { 14553 struct alc_spec *spec = codec->spec; 14554 int i; 14555 14556 for (i = 0; i < AUTO_PIN_LAST; i++) { 14557 hda_nid_t nid = spec->autocfg.input_pins[i]; 14558 if (nid >= 0x0c && nid <= 0x11) 14559 alc_set_input_pin(codec, nid, i); 14560 } 14561 } 14562 14563 /* parse the BIOS configuration and set up the alc_spec */ 14564 /* return 1 if successful, 0 if the proper config is not found, 14565 * or a negative error code 14566 */ 14567 static int alc861_parse_auto_config(struct hda_codec *codec) 14568 { 14569 struct alc_spec *spec = codec->spec; 14570 int err; 14571 static hda_nid_t alc861_ignore[] = { 0x1d, 0 }; 14572 14573 err = snd_hda_parse_pin_def_config(codec, &spec->autocfg, 14574 alc861_ignore); 14575 if (err < 0) 14576 return err; 14577 if (!spec->autocfg.line_outs) 14578 return 0; /* can't find valid BIOS pin config */ 14579 14580 err = alc861_auto_fill_dac_nids(codec, &spec->autocfg); 14581 if (err < 0) 14582 return err; 14583 err = alc861_auto_create_multi_out_ctls(codec, &spec->autocfg); 14584 if (err < 0) 14585 return err; 14586 err = alc861_auto_create_hp_ctls(codec, spec->autocfg.hp_pins[0]); 14587 if (err < 0) 14588 return err; 14589 err = alc861_auto_create_input_ctls(codec, &spec->autocfg); 14590 if (err < 0) 14591 return err; 14592 14593 spec->multiout.max_channels = spec->multiout.num_dacs * 2; 14594 14595 if (spec->autocfg.dig_outs) 14596 spec->multiout.dig_out_nid = ALC861_DIGOUT_NID; 14597 14598 if (spec->kctls.list) 14599 add_mixer(spec, spec->kctls.list); 14600 14601 add_verb(spec, alc861_auto_init_verbs); 14602 14603 spec->num_mux_defs = 1; 14604 spec->input_mux = &spec->private_imux[0]; 14605 14606 spec->adc_nids = alc861_adc_nids; 14607 spec->num_adc_nids = ARRAY_SIZE(alc861_adc_nids); 14608 set_capture_mixer(codec); 14609 14610 alc_ssid_check(codec, 0x0e, 0x0f, 0x0b); 14611 14612 return 1; 14613 } 14614 14615 /* additional initialization for auto-configuration model */ 14616 static void alc861_auto_init(struct hda_codec *codec) 14617 { 14618 struct alc_spec *spec = codec->spec; 14619 alc861_auto_init_multi_out(codec); 14620 alc861_auto_init_hp_out(codec); 14621 alc861_auto_init_analog_input(codec); 14622 if (spec->unsol_event) 14623 alc_inithook(codec); 14624 } 14625 14626 #ifdef CONFIG_SND_HDA_POWER_SAVE 14627 static struct hda_amp_list alc861_loopbacks[] = { 14628 { 0x15, HDA_INPUT, 0 }, 14629 { 0x15, HDA_INPUT, 1 }, 14630 { 0x15, HDA_INPUT, 2 }, 14631 { 0x15, HDA_INPUT, 3 }, 14632 { } /* end */ 14633 }; 14634 #endif 14635 14636 14637 /* 14638 * configuration and preset 14639 */ 14640 static const char *alc861_models[ALC861_MODEL_LAST] = { 14641 [ALC861_3ST] = "3stack", 14642 [ALC660_3ST] = "3stack-660", 14643 [ALC861_3ST_DIG] = "3stack-dig", 14644 [ALC861_6ST_DIG] = "6stack-dig", 14645 [ALC861_UNIWILL_M31] = "uniwill-m31", 14646 [ALC861_TOSHIBA] = "toshiba", 14647 [ALC861_ASUS] = "asus", 14648 [ALC861_ASUS_LAPTOP] = "asus-laptop", 14649 [ALC861_AUTO] = "auto", 14650 }; 14651 14652 static struct snd_pci_quirk alc861_cfg_tbl[] = { 14653 SND_PCI_QUIRK(0x1043, 0x1205, "ASUS W7J", ALC861_3ST), 14654 SND_PCI_QUIRK(0x1043, 0x1335, "ASUS F2/3", ALC861_ASUS_LAPTOP), 14655 SND_PCI_QUIRK(0x1043, 0x1338, "ASUS F2/3", ALC861_ASUS_LAPTOP), 14656 SND_PCI_QUIRK(0x1043, 0x1393, "ASUS", ALC861_ASUS), 14657 SND_PCI_QUIRK(0x1043, 0x13d7, "ASUS A9rp", ALC861_ASUS_LAPTOP), 14658 SND_PCI_QUIRK(0x1043, 0x81cb, "ASUS P1-AH2", ALC861_3ST_DIG), 14659 SND_PCI_QUIRK(0x1179, 0xff00, "Toshiba", ALC861_TOSHIBA), 14660 /* FIXME: the entry below breaks Toshiba A100 (model=auto works!) 14661 * Any other models that need this preset? 14662 */ 14663 /* SND_PCI_QUIRK(0x1179, 0xff10, "Toshiba", ALC861_TOSHIBA), */ 14664 SND_PCI_QUIRK(0x1462, 0x7254, "HP dx2200 (MSI MS-7254)", ALC861_3ST), 14665 SND_PCI_QUIRK(0x1462, 0x7297, "HP dx2250 (MSI MS-7297)", ALC861_3ST), 14666 SND_PCI_QUIRK(0x1584, 0x2b01, "Uniwill X40AIx", ALC861_UNIWILL_M31), 14667 SND_PCI_QUIRK(0x1584, 0x9072, "Uniwill m31", ALC861_UNIWILL_M31), 14668 SND_PCI_QUIRK(0x1584, 0x9075, "Airis Praxis N1212", ALC861_ASUS_LAPTOP), 14669 /* FIXME: the below seems conflict */ 14670 /* SND_PCI_QUIRK(0x1584, 0x9075, "Uniwill", ALC861_UNIWILL_M31), */ 14671 SND_PCI_QUIRK(0x1849, 0x0660, "Asrock 939SLI32", ALC660_3ST), 14672 SND_PCI_QUIRK(0x8086, 0xd600, "Intel", ALC861_3ST), 14673 {} 14674 }; 14675 14676 static struct alc_config_preset alc861_presets[] = { 14677 [ALC861_3ST] = { 14678 .mixers = { alc861_3ST_mixer }, 14679 .init_verbs = { alc861_threestack_init_verbs }, 14680 .num_dacs = ARRAY_SIZE(alc861_dac_nids), 14681 .dac_nids = alc861_dac_nids, 14682 .num_channel_mode = ARRAY_SIZE(alc861_threestack_modes), 14683 .channel_mode = alc861_threestack_modes, 14684 .need_dac_fix = 1, 14685 .num_adc_nids = ARRAY_SIZE(alc861_adc_nids), 14686 .adc_nids = alc861_adc_nids, 14687 .input_mux = &alc861_capture_source, 14688 }, 14689 [ALC861_3ST_DIG] = { 14690 .mixers = { alc861_base_mixer }, 14691 .init_verbs = { alc861_threestack_init_verbs }, 14692 .num_dacs = ARRAY_SIZE(alc861_dac_nids), 14693 .dac_nids = alc861_dac_nids, 14694 .dig_out_nid = ALC861_DIGOUT_NID, 14695 .num_channel_mode = ARRAY_SIZE(alc861_threestack_modes), 14696 .channel_mode = alc861_threestack_modes, 14697 .need_dac_fix = 1, 14698 .num_adc_nids = ARRAY_SIZE(alc861_adc_nids), 14699 .adc_nids = alc861_adc_nids, 14700 .input_mux = &alc861_capture_source, 14701 }, 14702 [ALC861_6ST_DIG] = { 14703 .mixers = { alc861_base_mixer }, 14704 .init_verbs = { alc861_base_init_verbs }, 14705 .num_dacs = ARRAY_SIZE(alc861_dac_nids), 14706 .dac_nids = alc861_dac_nids, 14707 .dig_out_nid = ALC861_DIGOUT_NID, 14708 .num_channel_mode = ARRAY_SIZE(alc861_8ch_modes), 14709 .channel_mode = alc861_8ch_modes, 14710 .num_adc_nids = ARRAY_SIZE(alc861_adc_nids), 14711 .adc_nids = alc861_adc_nids, 14712 .input_mux = &alc861_capture_source, 14713 }, 14714 [ALC660_3ST] = { 14715 .mixers = { alc861_3ST_mixer }, 14716 .init_verbs = { alc861_threestack_init_verbs }, 14717 .num_dacs = ARRAY_SIZE(alc660_dac_nids), 14718 .dac_nids = alc660_dac_nids, 14719 .num_channel_mode = ARRAY_SIZE(alc861_threestack_modes), 14720 .channel_mode = alc861_threestack_modes, 14721 .need_dac_fix = 1, 14722 .num_adc_nids = ARRAY_SIZE(alc861_adc_nids), 14723 .adc_nids = alc861_adc_nids, 14724 .input_mux = &alc861_capture_source, 14725 }, 14726 [ALC861_UNIWILL_M31] = { 14727 .mixers = { alc861_uniwill_m31_mixer }, 14728 .init_verbs = { alc861_uniwill_m31_init_verbs }, 14729 .num_dacs = ARRAY_SIZE(alc861_dac_nids), 14730 .dac_nids = alc861_dac_nids, 14731 .dig_out_nid = ALC861_DIGOUT_NID, 14732 .num_channel_mode = ARRAY_SIZE(alc861_uniwill_m31_modes), 14733 .channel_mode = alc861_uniwill_m31_modes, 14734 .need_dac_fix = 1, 14735 .num_adc_nids = ARRAY_SIZE(alc861_adc_nids), 14736 .adc_nids = alc861_adc_nids, 14737 .input_mux = &alc861_capture_source, 14738 }, 14739 [ALC861_TOSHIBA] = { 14740 .mixers = { alc861_toshiba_mixer }, 14741 .init_verbs = { alc861_base_init_verbs, 14742 alc861_toshiba_init_verbs }, 14743 .num_dacs = ARRAY_SIZE(alc861_dac_nids), 14744 .dac_nids = alc861_dac_nids, 14745 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes), 14746 .channel_mode = alc883_3ST_2ch_modes, 14747 .num_adc_nids = ARRAY_SIZE(alc861_adc_nids), 14748 .adc_nids = alc861_adc_nids, 14749 .input_mux = &alc861_capture_source, 14750 .unsol_event = alc861_toshiba_unsol_event, 14751 .init_hook = alc861_toshiba_automute, 14752 }, 14753 [ALC861_ASUS] = { 14754 .mixers = { alc861_asus_mixer }, 14755 .init_verbs = { alc861_asus_init_verbs }, 14756 .num_dacs = ARRAY_SIZE(alc861_dac_nids), 14757 .dac_nids = alc861_dac_nids, 14758 .dig_out_nid = ALC861_DIGOUT_NID, 14759 .num_channel_mode = ARRAY_SIZE(alc861_asus_modes), 14760 .channel_mode = alc861_asus_modes, 14761 .need_dac_fix = 1, 14762 .hp_nid = 0x06, 14763 .num_adc_nids = ARRAY_SIZE(alc861_adc_nids), 14764 .adc_nids = alc861_adc_nids, 14765 .input_mux = &alc861_capture_source, 14766 }, 14767 [ALC861_ASUS_LAPTOP] = { 14768 .mixers = { alc861_toshiba_mixer, alc861_asus_laptop_mixer }, 14769 .init_verbs = { alc861_asus_init_verbs, 14770 alc861_asus_laptop_init_verbs }, 14771 .num_dacs = ARRAY_SIZE(alc861_dac_nids), 14772 .dac_nids = alc861_dac_nids, 14773 .dig_out_nid = ALC861_DIGOUT_NID, 14774 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes), 14775 .channel_mode = alc883_3ST_2ch_modes, 14776 .need_dac_fix = 1, 14777 .num_adc_nids = ARRAY_SIZE(alc861_adc_nids), 14778 .adc_nids = alc861_adc_nids, 14779 .input_mux = &alc861_capture_source, 14780 }, 14781 }; 14782 14783 /* Pin config fixes */ 14784 enum { 14785 PINFIX_FSC_AMILO_PI1505, 14786 }; 14787 14788 static struct alc_pincfg alc861_fsc_amilo_pi1505_pinfix[] = { 14789 { 0x0b, 0x0221101f }, /* HP */ 14790 { 0x0f, 0x90170310 }, /* speaker */ 14791 { } 14792 }; 14793 14794 static const struct alc_fixup alc861_fixups[] = { 14795 [PINFIX_FSC_AMILO_PI1505] = { 14796 .pins = alc861_fsc_amilo_pi1505_pinfix 14797 }, 14798 }; 14799 14800 static struct snd_pci_quirk alc861_fixup_tbl[] = { 14801 SND_PCI_QUIRK(0x1734, 0x10c7, "FSC Amilo Pi1505", PINFIX_FSC_AMILO_PI1505), 14802 {} 14803 }; 14804 14805 static int patch_alc861(struct hda_codec *codec) 14806 { 14807 struct alc_spec *spec; 14808 int board_config; 14809 int err; 14810 14811 spec = kzalloc(sizeof(*spec), GFP_KERNEL); 14812 if (spec == NULL) 14813 return -ENOMEM; 14814 14815 codec->spec = spec; 14816 14817 board_config = snd_hda_check_board_config(codec, ALC861_MODEL_LAST, 14818 alc861_models, 14819 alc861_cfg_tbl); 14820 14821 if (board_config < 0) { 14822 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n", 14823 codec->chip_name); 14824 board_config = ALC861_AUTO; 14825 } 14826 14827 alc_pick_fixup(codec, alc861_fixup_tbl, alc861_fixups); 14828 14829 if (board_config == ALC861_AUTO) { 14830 /* automatic parse from the BIOS config */ 14831 err = alc861_parse_auto_config(codec); 14832 if (err < 0) { 14833 alc_free(codec); 14834 return err; 14835 } else if (!err) { 14836 printk(KERN_INFO 14837 "hda_codec: Cannot set up configuration " 14838 "from BIOS. Using base mode...\n"); 14839 board_config = ALC861_3ST_DIG; 14840 } 14841 } 14842 14843 err = snd_hda_attach_beep_device(codec, 0x23); 14844 if (err < 0) { 14845 alc_free(codec); 14846 return err; 14847 } 14848 14849 if (board_config != ALC861_AUTO) 14850 setup_preset(codec, &alc861_presets[board_config]); 14851 14852 spec->stream_analog_playback = &alc861_pcm_analog_playback; 14853 spec->stream_analog_capture = &alc861_pcm_analog_capture; 14854 14855 spec->stream_digital_playback = &alc861_pcm_digital_playback; 14856 spec->stream_digital_capture = &alc861_pcm_digital_capture; 14857 14858 set_beep_amp(spec, 0x23, 0, HDA_OUTPUT); 14859 14860 spec->vmaster_nid = 0x03; 14861 14862 codec->patch_ops = alc_patch_ops; 14863 if (board_config == ALC861_AUTO) 14864 spec->init_hook = alc861_auto_init; 14865 #ifdef CONFIG_SND_HDA_POWER_SAVE 14866 if (!spec->loopback.amplist) 14867 spec->loopback.amplist = alc861_loopbacks; 14868 #endif 14869 codec->proc_widget_hook = print_realtek_coef; 14870 14871 return 0; 14872 } 14873 14874 /* 14875 * ALC861-VD support 14876 * 14877 * Based on ALC882 14878 * 14879 * In addition, an independent DAC 14880 */ 14881 #define ALC861VD_DIGOUT_NID 0x06 14882 14883 static hda_nid_t alc861vd_dac_nids[4] = { 14884 /* front, surr, clfe, side surr */ 14885 0x02, 0x03, 0x04, 0x05 14886 }; 14887 14888 /* dac_nids for ALC660vd are in a different order - according to 14889 * Realtek's driver. 14890 * This should probably result in a different mixer for 6stack models 14891 * of ALC660vd codecs, but for now there is only 3stack mixer 14892 * - and it is the same as in 861vd. 14893 * adc_nids in ALC660vd are (is) the same as in 861vd 14894 */ 14895 static hda_nid_t alc660vd_dac_nids[3] = { 14896 /* front, rear, clfe, rear_surr */ 14897 0x02, 0x04, 0x03 14898 }; 14899 14900 static hda_nid_t alc861vd_adc_nids[1] = { 14901 /* ADC0 */ 14902 0x09, 14903 }; 14904 14905 static hda_nid_t alc861vd_capsrc_nids[1] = { 0x22 }; 14906 14907 /* input MUX */ 14908 /* FIXME: should be a matrix-type input source selection */ 14909 static struct hda_input_mux alc861vd_capture_source = { 14910 .num_items = 4, 14911 .items = { 14912 { "Mic", 0x0 }, 14913 { "Front Mic", 0x1 }, 14914 { "Line", 0x2 }, 14915 { "CD", 0x4 }, 14916 }, 14917 }; 14918 14919 static struct hda_input_mux alc861vd_dallas_capture_source = { 14920 .num_items = 2, 14921 .items = { 14922 { "Ext Mic", 0x0 }, 14923 { "Int Mic", 0x1 }, 14924 }, 14925 }; 14926 14927 static struct hda_input_mux alc861vd_hp_capture_source = { 14928 .num_items = 2, 14929 .items = { 14930 { "Front Mic", 0x0 }, 14931 { "ATAPI Mic", 0x1 }, 14932 }, 14933 }; 14934 14935 /* 14936 * 2ch mode 14937 */ 14938 static struct hda_channel_mode alc861vd_3stack_2ch_modes[1] = { 14939 { 2, NULL } 14940 }; 14941 14942 /* 14943 * 6ch mode 14944 */ 14945 static struct hda_verb alc861vd_6stack_ch6_init[] = { 14946 { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 }, 14947 { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 14948 { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 14949 { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 14950 { } /* end */ 14951 }; 14952 14953 /* 14954 * 8ch mode 14955 */ 14956 static struct hda_verb alc861vd_6stack_ch8_init[] = { 14957 { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 14958 { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 14959 { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 14960 { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 14961 { } /* end */ 14962 }; 14963 14964 static struct hda_channel_mode alc861vd_6stack_modes[2] = { 14965 { 6, alc861vd_6stack_ch6_init }, 14966 { 8, alc861vd_6stack_ch8_init }, 14967 }; 14968 14969 static struct snd_kcontrol_new alc861vd_chmode_mixer[] = { 14970 { 14971 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 14972 .name = "Channel Mode", 14973 .info = alc_ch_mode_info, 14974 .get = alc_ch_mode_get, 14975 .put = alc_ch_mode_put, 14976 }, 14977 { } /* end */ 14978 }; 14979 14980 /* Pin assignment: Front=0x14, Rear=0x15, CLFE=0x16, Side=0x17 14981 * Mic=0x18, Front Mic=0x19, Line-In=0x1a, HP=0x1b 14982 */ 14983 static struct snd_kcontrol_new alc861vd_6st_mixer[] = { 14984 HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT), 14985 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 14986 14987 HDA_CODEC_VOLUME("Surround Playback Volume", 0x03, 0x0, HDA_OUTPUT), 14988 HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT), 14989 14990 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x04, 1, 0x0, 14991 HDA_OUTPUT), 14992 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x04, 2, 0x0, 14993 HDA_OUTPUT), 14994 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT), 14995 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT), 14996 14997 HDA_CODEC_VOLUME("Side Playback Volume", 0x05, 0x0, HDA_OUTPUT), 14998 HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT), 14999 15000 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT), 15001 15002 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), 15003 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 15004 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 15005 15006 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT), 15007 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), 15008 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), 15009 15010 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), 15011 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), 15012 15013 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), 15014 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), 15015 15016 { } /* end */ 15017 }; 15018 15019 static struct snd_kcontrol_new alc861vd_3st_mixer[] = { 15020 HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT), 15021 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 15022 15023 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT), 15024 15025 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), 15026 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 15027 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 15028 15029 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT), 15030 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), 15031 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), 15032 15033 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), 15034 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), 15035 15036 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), 15037 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), 15038 15039 { } /* end */ 15040 }; 15041 15042 static struct snd_kcontrol_new alc861vd_lenovo_mixer[] = { 15043 HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT), 15044 /*HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),*/ 15045 HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT), 15046 15047 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT), 15048 15049 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), 15050 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 15051 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 15052 15053 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT), 15054 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), 15055 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), 15056 15057 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), 15058 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), 15059 15060 { } /* end */ 15061 }; 15062 15063 /* Pin assignment: Speaker=0x14, HP = 0x15, 15064 * Ext Mic=0x18, Int Mic = 0x19, CD = 0x1c, PC Beep = 0x1d 15065 */ 15066 static struct snd_kcontrol_new alc861vd_dallas_mixer[] = { 15067 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT), 15068 HDA_BIND_MUTE("Speaker Playback Switch", 0x0c, 2, HDA_INPUT), 15069 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT), 15070 HDA_BIND_MUTE("Headphone Playback Switch", 0x0d, 2, HDA_INPUT), 15071 HDA_CODEC_VOLUME("Ext Mic Boost", 0x18, 0, HDA_INPUT), 15072 HDA_CODEC_VOLUME("Ext Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 15073 HDA_CODEC_MUTE("Ext Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 15074 HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT), 15075 HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), 15076 HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), 15077 { } /* end */ 15078 }; 15079 15080 /* Pin assignment: Speaker=0x14, Line-out = 0x15, 15081 * Front Mic=0x18, ATAPI Mic = 0x19, 15082 */ 15083 static struct snd_kcontrol_new alc861vd_hp_mixer[] = { 15084 HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT), 15085 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 15086 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT), 15087 HDA_BIND_MUTE("Headphone Playback Switch", 0x0d, 2, HDA_INPUT), 15088 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 15089 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 15090 HDA_CODEC_VOLUME("ATAPI Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), 15091 HDA_CODEC_MUTE("ATAPI Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), 15092 15093 { } /* end */ 15094 }; 15095 15096 /* 15097 * generic initialization of ADC, input mixers and output mixers 15098 */ 15099 static struct hda_verb alc861vd_volume_init_verbs[] = { 15100 /* 15101 * Unmute ADC0 and set the default input to mic-in 15102 */ 15103 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00}, 15104 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 15105 15106 /* Unmute input amps (CD, Line In, Mic 1 & Mic 2) of 15107 * the analog-loopback mixer widget 15108 */ 15109 /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */ 15110 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 15111 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 15112 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, 15113 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, 15114 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, 15115 15116 /* Capture mixer: unmute Mic, F-Mic, Line, CD inputs */ 15117 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 15118 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 15119 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)}, 15120 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(4)}, 15121 15122 /* 15123 * Set up output mixers (0x02 - 0x05) 15124 */ 15125 /* set vol=0 to output mixers */ 15126 {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 15127 {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 15128 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 15129 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 15130 15131 /* set up input amps for analog loopback */ 15132 /* Amp Indices: DAC = 0, mixer = 1 */ 15133 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 15134 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 15135 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 15136 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 15137 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 15138 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 15139 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 15140 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 15141 15142 { } 15143 }; 15144 15145 /* 15146 * 3-stack pin configuration: 15147 * front = 0x14, mic/clfe = 0x18, HP = 0x19, line/surr = 0x1a, f-mic = 0x1b 15148 */ 15149 static struct hda_verb alc861vd_3stack_init_verbs[] = { 15150 /* 15151 * Set pin mode and muting 15152 */ 15153 /* set front pin widgets 0x14 for output */ 15154 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 15155 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 15156 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, 15157 15158 /* Mic (rear) pin: input vref at 80% */ 15159 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, 15160 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 15161 /* Front Mic pin: input vref at 80% */ 15162 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, 15163 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 15164 /* Line In pin: input */ 15165 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 15166 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 15167 /* Line-2 In: Headphone output (output 0 - 0x0c) */ 15168 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 15169 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 15170 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, 15171 /* CD pin widget for input */ 15172 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 15173 15174 { } 15175 }; 15176 15177 /* 15178 * 6-stack pin configuration: 15179 */ 15180 static struct hda_verb alc861vd_6stack_init_verbs[] = { 15181 /* 15182 * Set pin mode and muting 15183 */ 15184 /* set front pin widgets 0x14 for output */ 15185 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 15186 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 15187 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, 15188 15189 /* Rear Pin: output 1 (0x0d) */ 15190 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 15191 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 15192 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, 15193 /* CLFE Pin: output 2 (0x0e) */ 15194 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 15195 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 15196 {0x16, AC_VERB_SET_CONNECT_SEL, 0x02}, 15197 /* Side Pin: output 3 (0x0f) */ 15198 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 15199 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 15200 {0x17, AC_VERB_SET_CONNECT_SEL, 0x03}, 15201 15202 /* Mic (rear) pin: input vref at 80% */ 15203 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, 15204 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 15205 /* Front Mic pin: input vref at 80% */ 15206 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, 15207 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 15208 /* Line In pin: input */ 15209 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 15210 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 15211 /* Line-2 In: Headphone output (output 0 - 0x0c) */ 15212 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 15213 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 15214 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, 15215 /* CD pin widget for input */ 15216 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 15217 15218 { } 15219 }; 15220 15221 static struct hda_verb alc861vd_eapd_verbs[] = { 15222 {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2}, 15223 { } 15224 }; 15225 15226 static struct hda_verb alc660vd_eapd_verbs[] = { 15227 {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2}, 15228 {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2}, 15229 { } 15230 }; 15231 15232 static struct hda_verb alc861vd_lenovo_unsol_verbs[] = { 15233 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 15234 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 15235 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)}, 15236 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT}, 15237 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT}, 15238 {} 15239 }; 15240 15241 static void alc861vd_lenovo_mic_automute(struct hda_codec *codec) 15242 { 15243 unsigned int present; 15244 unsigned char bits; 15245 15246 present = snd_hda_jack_detect(codec, 0x18); 15247 bits = present ? HDA_AMP_MUTE : 0; 15248 15249 snd_hda_codec_amp_stereo(codec, 0x0b, HDA_INPUT, 1, 15250 HDA_AMP_MUTE, bits); 15251 } 15252 15253 static void alc861vd_lenovo_setup(struct hda_codec *codec) 15254 { 15255 struct alc_spec *spec = codec->spec; 15256 spec->autocfg.hp_pins[0] = 0x1b; 15257 spec->autocfg.speaker_pins[0] = 0x14; 15258 } 15259 15260 static void alc861vd_lenovo_init_hook(struct hda_codec *codec) 15261 { 15262 alc_automute_amp(codec); 15263 alc861vd_lenovo_mic_automute(codec); 15264 } 15265 15266 static void alc861vd_lenovo_unsol_event(struct hda_codec *codec, 15267 unsigned int res) 15268 { 15269 switch (res >> 26) { 15270 case ALC880_MIC_EVENT: 15271 alc861vd_lenovo_mic_automute(codec); 15272 break; 15273 default: 15274 alc_automute_amp_unsol_event(codec, res); 15275 break; 15276 } 15277 } 15278 15279 static struct hda_verb alc861vd_dallas_verbs[] = { 15280 {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 15281 {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 15282 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 15283 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 15284 15285 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 15286 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 15287 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 15288 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 15289 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 15290 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 15291 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 15292 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 15293 15294 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 15295 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 15296 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 15297 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 15298 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 15299 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 15300 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 15301 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 15302 15303 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50}, 15304 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 15305 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50}, 15306 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 15307 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 15308 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 15309 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 15310 {0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 15311 15312 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 15313 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, 15314 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, 15315 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, 15316 15317 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 15318 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00}, 15319 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT}, 15320 15321 { } /* end */ 15322 }; 15323 15324 /* toggle speaker-output according to the hp-jack state */ 15325 static void alc861vd_dallas_setup(struct hda_codec *codec) 15326 { 15327 struct alc_spec *spec = codec->spec; 15328 15329 spec->autocfg.hp_pins[0] = 0x15; 15330 spec->autocfg.speaker_pins[0] = 0x14; 15331 } 15332 15333 #ifdef CONFIG_SND_HDA_POWER_SAVE 15334 #define alc861vd_loopbacks alc880_loopbacks 15335 #endif 15336 15337 /* pcm configuration: identical with ALC880 */ 15338 #define alc861vd_pcm_analog_playback alc880_pcm_analog_playback 15339 #define alc861vd_pcm_analog_capture alc880_pcm_analog_capture 15340 #define alc861vd_pcm_digital_playback alc880_pcm_digital_playback 15341 #define alc861vd_pcm_digital_capture alc880_pcm_digital_capture 15342 15343 /* 15344 * configuration and preset 15345 */ 15346 static const char *alc861vd_models[ALC861VD_MODEL_LAST] = { 15347 [ALC660VD_3ST] = "3stack-660", 15348 [ALC660VD_3ST_DIG] = "3stack-660-digout", 15349 [ALC660VD_ASUS_V1S] = "asus-v1s", 15350 [ALC861VD_3ST] = "3stack", 15351 [ALC861VD_3ST_DIG] = "3stack-digout", 15352 [ALC861VD_6ST_DIG] = "6stack-digout", 15353 [ALC861VD_LENOVO] = "lenovo", 15354 [ALC861VD_DALLAS] = "dallas", 15355 [ALC861VD_HP] = "hp", 15356 [ALC861VD_AUTO] = "auto", 15357 }; 15358 15359 static struct snd_pci_quirk alc861vd_cfg_tbl[] = { 15360 SND_PCI_QUIRK(0x1019, 0xa88d, "Realtek ALC660 demo", ALC660VD_3ST), 15361 SND_PCI_QUIRK(0x103c, 0x30bf, "HP TX1000", ALC861VD_HP), 15362 SND_PCI_QUIRK(0x1043, 0x12e2, "Asus z35m", ALC660VD_3ST), 15363 /*SND_PCI_QUIRK(0x1043, 0x1339, "Asus G1", ALC660VD_3ST),*/ /* auto */ 15364 SND_PCI_QUIRK(0x1043, 0x1633, "Asus V1Sn", ALC660VD_ASUS_V1S), 15365 SND_PCI_QUIRK(0x1043, 0x81e7, "ASUS", ALC660VD_3ST_DIG), 15366 SND_PCI_QUIRK(0x10de, 0x03f0, "Realtek ALC660 demo", ALC660VD_3ST), 15367 SND_PCI_QUIRK(0x1179, 0xff00, "Toshiba A135", ALC861VD_LENOVO), 15368 /*SND_PCI_QUIRK(0x1179, 0xff00, "DALLAS", ALC861VD_DALLAS),*/ /*lenovo*/ 15369 SND_PCI_QUIRK(0x1179, 0xff01, "Toshiba A135", ALC861VD_LENOVO), 15370 SND_PCI_QUIRK(0x1179, 0xff03, "Toshiba P205", ALC861VD_LENOVO), 15371 SND_PCI_QUIRK(0x1179, 0xff31, "Toshiba L30-149", ALC861VD_DALLAS), 15372 SND_PCI_QUIRK(0x1565, 0x820d, "Biostar NF61S SE", ALC861VD_6ST_DIG), 15373 SND_PCI_QUIRK_VENDOR(0x17aa, "Lenovo", ALC861VD_LENOVO), 15374 SND_PCI_QUIRK(0x1849, 0x0862, "ASRock K8NF6G-VSTA", ALC861VD_6ST_DIG), 15375 {} 15376 }; 15377 15378 static struct alc_config_preset alc861vd_presets[] = { 15379 [ALC660VD_3ST] = { 15380 .mixers = { alc861vd_3st_mixer }, 15381 .init_verbs = { alc861vd_volume_init_verbs, 15382 alc861vd_3stack_init_verbs }, 15383 .num_dacs = ARRAY_SIZE(alc660vd_dac_nids), 15384 .dac_nids = alc660vd_dac_nids, 15385 .num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes), 15386 .channel_mode = alc861vd_3stack_2ch_modes, 15387 .input_mux = &alc861vd_capture_source, 15388 }, 15389 [ALC660VD_3ST_DIG] = { 15390 .mixers = { alc861vd_3st_mixer }, 15391 .init_verbs = { alc861vd_volume_init_verbs, 15392 alc861vd_3stack_init_verbs }, 15393 .num_dacs = ARRAY_SIZE(alc660vd_dac_nids), 15394 .dac_nids = alc660vd_dac_nids, 15395 .dig_out_nid = ALC861VD_DIGOUT_NID, 15396 .num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes), 15397 .channel_mode = alc861vd_3stack_2ch_modes, 15398 .input_mux = &alc861vd_capture_source, 15399 }, 15400 [ALC861VD_3ST] = { 15401 .mixers = { alc861vd_3st_mixer }, 15402 .init_verbs = { alc861vd_volume_init_verbs, 15403 alc861vd_3stack_init_verbs }, 15404 .num_dacs = ARRAY_SIZE(alc861vd_dac_nids), 15405 .dac_nids = alc861vd_dac_nids, 15406 .num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes), 15407 .channel_mode = alc861vd_3stack_2ch_modes, 15408 .input_mux = &alc861vd_capture_source, 15409 }, 15410 [ALC861VD_3ST_DIG] = { 15411 .mixers = { alc861vd_3st_mixer }, 15412 .init_verbs = { alc861vd_volume_init_verbs, 15413 alc861vd_3stack_init_verbs }, 15414 .num_dacs = ARRAY_SIZE(alc861vd_dac_nids), 15415 .dac_nids = alc861vd_dac_nids, 15416 .dig_out_nid = ALC861VD_DIGOUT_NID, 15417 .num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes), 15418 .channel_mode = alc861vd_3stack_2ch_modes, 15419 .input_mux = &alc861vd_capture_source, 15420 }, 15421 [ALC861VD_6ST_DIG] = { 15422 .mixers = { alc861vd_6st_mixer, alc861vd_chmode_mixer }, 15423 .init_verbs = { alc861vd_volume_init_verbs, 15424 alc861vd_6stack_init_verbs }, 15425 .num_dacs = ARRAY_SIZE(alc861vd_dac_nids), 15426 .dac_nids = alc861vd_dac_nids, 15427 .dig_out_nid = ALC861VD_DIGOUT_NID, 15428 .num_channel_mode = ARRAY_SIZE(alc861vd_6stack_modes), 15429 .channel_mode = alc861vd_6stack_modes, 15430 .input_mux = &alc861vd_capture_source, 15431 }, 15432 [ALC861VD_LENOVO] = { 15433 .mixers = { alc861vd_lenovo_mixer }, 15434 .init_verbs = { alc861vd_volume_init_verbs, 15435 alc861vd_3stack_init_verbs, 15436 alc861vd_eapd_verbs, 15437 alc861vd_lenovo_unsol_verbs }, 15438 .num_dacs = ARRAY_SIZE(alc660vd_dac_nids), 15439 .dac_nids = alc660vd_dac_nids, 15440 .num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes), 15441 .channel_mode = alc861vd_3stack_2ch_modes, 15442 .input_mux = &alc861vd_capture_source, 15443 .unsol_event = alc861vd_lenovo_unsol_event, 15444 .setup = alc861vd_lenovo_setup, 15445 .init_hook = alc861vd_lenovo_init_hook, 15446 }, 15447 [ALC861VD_DALLAS] = { 15448 .mixers = { alc861vd_dallas_mixer }, 15449 .init_verbs = { alc861vd_dallas_verbs }, 15450 .num_dacs = ARRAY_SIZE(alc861vd_dac_nids), 15451 .dac_nids = alc861vd_dac_nids, 15452 .num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes), 15453 .channel_mode = alc861vd_3stack_2ch_modes, 15454 .input_mux = &alc861vd_dallas_capture_source, 15455 .unsol_event = alc_automute_amp_unsol_event, 15456 .setup = alc861vd_dallas_setup, 15457 .init_hook = alc_automute_amp, 15458 }, 15459 [ALC861VD_HP] = { 15460 .mixers = { alc861vd_hp_mixer }, 15461 .init_verbs = { alc861vd_dallas_verbs, alc861vd_eapd_verbs }, 15462 .num_dacs = ARRAY_SIZE(alc861vd_dac_nids), 15463 .dac_nids = alc861vd_dac_nids, 15464 .dig_out_nid = ALC861VD_DIGOUT_NID, 15465 .num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes), 15466 .channel_mode = alc861vd_3stack_2ch_modes, 15467 .input_mux = &alc861vd_hp_capture_source, 15468 .unsol_event = alc_automute_amp_unsol_event, 15469 .setup = alc861vd_dallas_setup, 15470 .init_hook = alc_automute_amp, 15471 }, 15472 [ALC660VD_ASUS_V1S] = { 15473 .mixers = { alc861vd_lenovo_mixer }, 15474 .init_verbs = { alc861vd_volume_init_verbs, 15475 alc861vd_3stack_init_verbs, 15476 alc861vd_eapd_verbs, 15477 alc861vd_lenovo_unsol_verbs }, 15478 .num_dacs = ARRAY_SIZE(alc660vd_dac_nids), 15479 .dac_nids = alc660vd_dac_nids, 15480 .dig_out_nid = ALC861VD_DIGOUT_NID, 15481 .num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes), 15482 .channel_mode = alc861vd_3stack_2ch_modes, 15483 .input_mux = &alc861vd_capture_source, 15484 .unsol_event = alc861vd_lenovo_unsol_event, 15485 .setup = alc861vd_lenovo_setup, 15486 .init_hook = alc861vd_lenovo_init_hook, 15487 }, 15488 }; 15489 15490 /* 15491 * BIOS auto configuration 15492 */ 15493 static int alc861vd_auto_create_input_ctls(struct hda_codec *codec, 15494 const struct auto_pin_cfg *cfg) 15495 { 15496 return alc_auto_create_input_ctls(codec, cfg, 0x15, 0x09, 0); 15497 } 15498 15499 15500 static void alc861vd_auto_set_output_and_unmute(struct hda_codec *codec, 15501 hda_nid_t nid, int pin_type, int dac_idx) 15502 { 15503 alc_set_pin_output(codec, nid, pin_type); 15504 } 15505 15506 static void alc861vd_auto_init_multi_out(struct hda_codec *codec) 15507 { 15508 struct alc_spec *spec = codec->spec; 15509 int i; 15510 15511 for (i = 0; i <= HDA_SIDE; i++) { 15512 hda_nid_t nid = spec->autocfg.line_out_pins[i]; 15513 int pin_type = get_pin_type(spec->autocfg.line_out_type); 15514 if (nid) 15515 alc861vd_auto_set_output_and_unmute(codec, nid, 15516 pin_type, i); 15517 } 15518 } 15519 15520 15521 static void alc861vd_auto_init_hp_out(struct hda_codec *codec) 15522 { 15523 struct alc_spec *spec = codec->spec; 15524 hda_nid_t pin; 15525 15526 pin = spec->autocfg.hp_pins[0]; 15527 if (pin) /* connect to front and use dac 0 */ 15528 alc861vd_auto_set_output_and_unmute(codec, pin, PIN_HP, 0); 15529 pin = spec->autocfg.speaker_pins[0]; 15530 if (pin) 15531 alc861vd_auto_set_output_and_unmute(codec, pin, PIN_OUT, 0); 15532 } 15533 15534 #define ALC861VD_PIN_CD_NID ALC880_PIN_CD_NID 15535 15536 static void alc861vd_auto_init_analog_input(struct hda_codec *codec) 15537 { 15538 struct alc_spec *spec = codec->spec; 15539 int i; 15540 15541 for (i = 0; i < AUTO_PIN_LAST; i++) { 15542 hda_nid_t nid = spec->autocfg.input_pins[i]; 15543 if (alc_is_input_pin(codec, nid)) { 15544 alc_set_input_pin(codec, nid, i); 15545 if (nid != ALC861VD_PIN_CD_NID && 15546 (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP)) 15547 snd_hda_codec_write(codec, nid, 0, 15548 AC_VERB_SET_AMP_GAIN_MUTE, 15549 AMP_OUT_MUTE); 15550 } 15551 } 15552 } 15553 15554 #define alc861vd_auto_init_input_src alc882_auto_init_input_src 15555 15556 #define alc861vd_idx_to_mixer_vol(nid) ((nid) + 0x02) 15557 #define alc861vd_idx_to_mixer_switch(nid) ((nid) + 0x0c) 15558 15559 /* add playback controls from the parsed DAC table */ 15560 /* Based on ALC880 version. But ALC861VD has separate, 15561 * different NIDs for mute/unmute switch and volume control */ 15562 static int alc861vd_auto_create_multi_out_ctls(struct alc_spec *spec, 15563 const struct auto_pin_cfg *cfg) 15564 { 15565 static const char *chname[4] = {"Front", "Surround", "CLFE", "Side"}; 15566 hda_nid_t nid_v, nid_s; 15567 int i, err; 15568 15569 for (i = 0; i < cfg->line_outs; i++) { 15570 if (!spec->multiout.dac_nids[i]) 15571 continue; 15572 nid_v = alc861vd_idx_to_mixer_vol( 15573 alc880_dac_to_idx( 15574 spec->multiout.dac_nids[i])); 15575 nid_s = alc861vd_idx_to_mixer_switch( 15576 alc880_dac_to_idx( 15577 spec->multiout.dac_nids[i])); 15578 15579 if (i == 2) { 15580 /* Center/LFE */ 15581 err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, 15582 "Center", 15583 HDA_COMPOSE_AMP_VAL(nid_v, 1, 0, 15584 HDA_OUTPUT)); 15585 if (err < 0) 15586 return err; 15587 err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, 15588 "LFE", 15589 HDA_COMPOSE_AMP_VAL(nid_v, 2, 0, 15590 HDA_OUTPUT)); 15591 if (err < 0) 15592 return err; 15593 err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE, 15594 "Center", 15595 HDA_COMPOSE_AMP_VAL(nid_s, 1, 2, 15596 HDA_INPUT)); 15597 if (err < 0) 15598 return err; 15599 err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE, 15600 "LFE", 15601 HDA_COMPOSE_AMP_VAL(nid_s, 2, 2, 15602 HDA_INPUT)); 15603 if (err < 0) 15604 return err; 15605 } else { 15606 const char *pfx; 15607 if (cfg->line_outs == 1 && 15608 cfg->line_out_type == AUTO_PIN_SPEAKER_OUT) { 15609 if (!cfg->hp_pins) 15610 pfx = "Speaker"; 15611 else 15612 pfx = "PCM"; 15613 } else 15614 pfx = chname[i]; 15615 err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx, 15616 HDA_COMPOSE_AMP_VAL(nid_v, 3, 0, 15617 HDA_OUTPUT)); 15618 if (err < 0) 15619 return err; 15620 if (cfg->line_outs == 1 && 15621 cfg->line_out_type == AUTO_PIN_SPEAKER_OUT) 15622 pfx = "Speaker"; 15623 err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE, pfx, 15624 HDA_COMPOSE_AMP_VAL(nid_s, 3, 2, 15625 HDA_INPUT)); 15626 if (err < 0) 15627 return err; 15628 } 15629 } 15630 return 0; 15631 } 15632 15633 /* add playback controls for speaker and HP outputs */ 15634 /* Based on ALC880 version. But ALC861VD has separate, 15635 * different NIDs for mute/unmute switch and volume control */ 15636 static int alc861vd_auto_create_extra_out(struct alc_spec *spec, 15637 hda_nid_t pin, const char *pfx) 15638 { 15639 hda_nid_t nid_v, nid_s; 15640 int err; 15641 15642 if (!pin) 15643 return 0; 15644 15645 if (alc880_is_fixed_pin(pin)) { 15646 nid_v = alc880_idx_to_dac(alc880_fixed_pin_idx(pin)); 15647 /* specify the DAC as the extra output */ 15648 if (!spec->multiout.hp_nid) 15649 spec->multiout.hp_nid = nid_v; 15650 else 15651 spec->multiout.extra_out_nid[0] = nid_v; 15652 /* control HP volume/switch on the output mixer amp */ 15653 nid_v = alc861vd_idx_to_mixer_vol( 15654 alc880_fixed_pin_idx(pin)); 15655 nid_s = alc861vd_idx_to_mixer_switch( 15656 alc880_fixed_pin_idx(pin)); 15657 15658 err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx, 15659 HDA_COMPOSE_AMP_VAL(nid_v, 3, 0, HDA_OUTPUT)); 15660 if (err < 0) 15661 return err; 15662 err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE, pfx, 15663 HDA_COMPOSE_AMP_VAL(nid_s, 3, 2, HDA_INPUT)); 15664 if (err < 0) 15665 return err; 15666 } else if (alc880_is_multi_pin(pin)) { 15667 /* set manual connection */ 15668 /* we have only a switch on HP-out PIN */ 15669 err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, pfx, 15670 HDA_COMPOSE_AMP_VAL(pin, 3, 0, HDA_OUTPUT)); 15671 if (err < 0) 15672 return err; 15673 } 15674 return 0; 15675 } 15676 15677 /* parse the BIOS configuration and set up the alc_spec 15678 * return 1 if successful, 0 if the proper config is not found, 15679 * or a negative error code 15680 * Based on ALC880 version - had to change it to override 15681 * alc880_auto_create_extra_out and alc880_auto_create_multi_out_ctls */ 15682 static int alc861vd_parse_auto_config(struct hda_codec *codec) 15683 { 15684 struct alc_spec *spec = codec->spec; 15685 int err; 15686 static hda_nid_t alc861vd_ignore[] = { 0x1d, 0 }; 15687 15688 err = snd_hda_parse_pin_def_config(codec, &spec->autocfg, 15689 alc861vd_ignore); 15690 if (err < 0) 15691 return err; 15692 if (!spec->autocfg.line_outs) 15693 return 0; /* can't find valid BIOS pin config */ 15694 15695 err = alc880_auto_fill_dac_nids(spec, &spec->autocfg); 15696 if (err < 0) 15697 return err; 15698 err = alc861vd_auto_create_multi_out_ctls(spec, &spec->autocfg); 15699 if (err < 0) 15700 return err; 15701 err = alc861vd_auto_create_extra_out(spec, 15702 spec->autocfg.speaker_pins[0], 15703 "Speaker"); 15704 if (err < 0) 15705 return err; 15706 err = alc861vd_auto_create_extra_out(spec, 15707 spec->autocfg.hp_pins[0], 15708 "Headphone"); 15709 if (err < 0) 15710 return err; 15711 err = alc861vd_auto_create_input_ctls(codec, &spec->autocfg); 15712 if (err < 0) 15713 return err; 15714 15715 spec->multiout.max_channels = spec->multiout.num_dacs * 2; 15716 15717 if (spec->autocfg.dig_outs) 15718 spec->multiout.dig_out_nid = ALC861VD_DIGOUT_NID; 15719 15720 if (spec->kctls.list) 15721 add_mixer(spec, spec->kctls.list); 15722 15723 add_verb(spec, alc861vd_volume_init_verbs); 15724 15725 spec->num_mux_defs = 1; 15726 spec->input_mux = &spec->private_imux[0]; 15727 15728 err = alc_auto_add_mic_boost(codec); 15729 if (err < 0) 15730 return err; 15731 15732 alc_ssid_check(codec, 0x15, 0x1b, 0x14); 15733 15734 return 1; 15735 } 15736 15737 /* additional initialization for auto-configuration model */ 15738 static void alc861vd_auto_init(struct hda_codec *codec) 15739 { 15740 struct alc_spec *spec = codec->spec; 15741 alc861vd_auto_init_multi_out(codec); 15742 alc861vd_auto_init_hp_out(codec); 15743 alc861vd_auto_init_analog_input(codec); 15744 alc861vd_auto_init_input_src(codec); 15745 if (spec->unsol_event) 15746 alc_inithook(codec); 15747 } 15748 15749 enum { 15750 ALC660VD_FIX_ASUS_GPIO1 15751 }; 15752 15753 /* reset GPIO1 */ 15754 static const struct hda_verb alc660vd_fix_asus_gpio1_verbs[] = { 15755 {0x01, AC_VERB_SET_GPIO_MASK, 0x03}, 15756 {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01}, 15757 {0x01, AC_VERB_SET_GPIO_DATA, 0x01}, 15758 { } 15759 }; 15760 15761 static const struct alc_fixup alc861vd_fixups[] = { 15762 [ALC660VD_FIX_ASUS_GPIO1] = { 15763 .verbs = alc660vd_fix_asus_gpio1_verbs, 15764 }, 15765 }; 15766 15767 static struct snd_pci_quirk alc861vd_fixup_tbl[] = { 15768 SND_PCI_QUIRK(0x1043, 0x1339, "ASUS A7-K", ALC660VD_FIX_ASUS_GPIO1), 15769 {} 15770 }; 15771 15772 static int patch_alc861vd(struct hda_codec *codec) 15773 { 15774 struct alc_spec *spec; 15775 int err, board_config; 15776 15777 spec = kzalloc(sizeof(*spec), GFP_KERNEL); 15778 if (spec == NULL) 15779 return -ENOMEM; 15780 15781 codec->spec = spec; 15782 15783 board_config = snd_hda_check_board_config(codec, ALC861VD_MODEL_LAST, 15784 alc861vd_models, 15785 alc861vd_cfg_tbl); 15786 15787 if (board_config < 0 || board_config >= ALC861VD_MODEL_LAST) { 15788 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n", 15789 codec->chip_name); 15790 board_config = ALC861VD_AUTO; 15791 } 15792 15793 alc_pick_fixup(codec, alc861vd_fixup_tbl, alc861vd_fixups); 15794 15795 if (board_config == ALC861VD_AUTO) { 15796 /* automatic parse from the BIOS config */ 15797 err = alc861vd_parse_auto_config(codec); 15798 if (err < 0) { 15799 alc_free(codec); 15800 return err; 15801 } else if (!err) { 15802 printk(KERN_INFO 15803 "hda_codec: Cannot set up configuration " 15804 "from BIOS. Using base mode...\n"); 15805 board_config = ALC861VD_3ST; 15806 } 15807 } 15808 15809 err = snd_hda_attach_beep_device(codec, 0x23); 15810 if (err < 0) { 15811 alc_free(codec); 15812 return err; 15813 } 15814 15815 if (board_config != ALC861VD_AUTO) 15816 setup_preset(codec, &alc861vd_presets[board_config]); 15817 15818 if (codec->vendor_id == 0x10ec0660) { 15819 /* always turn on EAPD */ 15820 add_verb(spec, alc660vd_eapd_verbs); 15821 } 15822 15823 spec->stream_analog_playback = &alc861vd_pcm_analog_playback; 15824 spec->stream_analog_capture = &alc861vd_pcm_analog_capture; 15825 15826 spec->stream_digital_playback = &alc861vd_pcm_digital_playback; 15827 spec->stream_digital_capture = &alc861vd_pcm_digital_capture; 15828 15829 if (!spec->adc_nids) { 15830 spec->adc_nids = alc861vd_adc_nids; 15831 spec->num_adc_nids = ARRAY_SIZE(alc861vd_adc_nids); 15832 } 15833 if (!spec->capsrc_nids) 15834 spec->capsrc_nids = alc861vd_capsrc_nids; 15835 15836 set_capture_mixer(codec); 15837 set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT); 15838 15839 spec->vmaster_nid = 0x02; 15840 15841 codec->patch_ops = alc_patch_ops; 15842 15843 if (board_config == ALC861VD_AUTO) 15844 spec->init_hook = alc861vd_auto_init; 15845 #ifdef CONFIG_SND_HDA_POWER_SAVE 15846 if (!spec->loopback.amplist) 15847 spec->loopback.amplist = alc861vd_loopbacks; 15848 #endif 15849 codec->proc_widget_hook = print_realtek_coef; 15850 15851 return 0; 15852 } 15853 15854 /* 15855 * ALC662 support 15856 * 15857 * ALC662 is almost identical with ALC880 but has cleaner and more flexible 15858 * configuration. Each pin widget can choose any input DACs and a mixer. 15859 * Each ADC is connected from a mixer of all inputs. This makes possible 15860 * 6-channel independent captures. 15861 * 15862 * In addition, an independent DAC for the multi-playback (not used in this 15863 * driver yet). 15864 */ 15865 #define ALC662_DIGOUT_NID 0x06 15866 #define ALC662_DIGIN_NID 0x0a 15867 15868 static hda_nid_t alc662_dac_nids[4] = { 15869 /* front, rear, clfe, rear_surr */ 15870 0x02, 0x03, 0x04 15871 }; 15872 15873 static hda_nid_t alc272_dac_nids[2] = { 15874 0x02, 0x03 15875 }; 15876 15877 static hda_nid_t alc662_adc_nids[2] = { 15878 /* ADC1-2 */ 15879 0x09, 0x08 15880 }; 15881 15882 static hda_nid_t alc272_adc_nids[1] = { 15883 /* ADC1-2 */ 15884 0x08, 15885 }; 15886 15887 static hda_nid_t alc662_capsrc_nids[2] = { 0x22, 0x23 }; 15888 static hda_nid_t alc272_capsrc_nids[1] = { 0x23 }; 15889 15890 15891 /* input MUX */ 15892 /* FIXME: should be a matrix-type input source selection */ 15893 static struct hda_input_mux alc662_capture_source = { 15894 .num_items = 4, 15895 .items = { 15896 { "Mic", 0x0 }, 15897 { "Front Mic", 0x1 }, 15898 { "Line", 0x2 }, 15899 { "CD", 0x4 }, 15900 }, 15901 }; 15902 15903 static struct hda_input_mux alc662_lenovo_101e_capture_source = { 15904 .num_items = 2, 15905 .items = { 15906 { "Mic", 0x1 }, 15907 { "Line", 0x2 }, 15908 }, 15909 }; 15910 15911 static struct hda_input_mux alc663_capture_source = { 15912 .num_items = 3, 15913 .items = { 15914 { "Mic", 0x0 }, 15915 { "Front Mic", 0x1 }, 15916 { "Line", 0x2 }, 15917 }, 15918 }; 15919 15920 #if 0 /* set to 1 for testing other input sources below */ 15921 static struct hda_input_mux alc272_nc10_capture_source = { 15922 .num_items = 16, 15923 .items = { 15924 { "Autoselect Mic", 0x0 }, 15925 { "Internal Mic", 0x1 }, 15926 { "In-0x02", 0x2 }, 15927 { "In-0x03", 0x3 }, 15928 { "In-0x04", 0x4 }, 15929 { "In-0x05", 0x5 }, 15930 { "In-0x06", 0x6 }, 15931 { "In-0x07", 0x7 }, 15932 { "In-0x08", 0x8 }, 15933 { "In-0x09", 0x9 }, 15934 { "In-0x0a", 0x0a }, 15935 { "In-0x0b", 0x0b }, 15936 { "In-0x0c", 0x0c }, 15937 { "In-0x0d", 0x0d }, 15938 { "In-0x0e", 0x0e }, 15939 { "In-0x0f", 0x0f }, 15940 }, 15941 }; 15942 #endif 15943 15944 /* 15945 * 2ch mode 15946 */ 15947 static struct hda_channel_mode alc662_3ST_2ch_modes[1] = { 15948 { 2, NULL } 15949 }; 15950 15951 /* 15952 * 2ch mode 15953 */ 15954 static struct hda_verb alc662_3ST_ch2_init[] = { 15955 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, 15956 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE }, 15957 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN }, 15958 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE }, 15959 { } /* end */ 15960 }; 15961 15962 /* 15963 * 6ch mode 15964 */ 15965 static struct hda_verb alc662_3ST_ch6_init[] = { 15966 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 15967 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 15968 { 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 }, 15969 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 15970 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 15971 { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 }, 15972 { } /* end */ 15973 }; 15974 15975 static struct hda_channel_mode alc662_3ST_6ch_modes[2] = { 15976 { 2, alc662_3ST_ch2_init }, 15977 { 6, alc662_3ST_ch6_init }, 15978 }; 15979 15980 /* 15981 * 2ch mode 15982 */ 15983 static struct hda_verb alc662_sixstack_ch6_init[] = { 15984 { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 }, 15985 { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 }, 15986 { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 15987 { } /* end */ 15988 }; 15989 15990 /* 15991 * 6ch mode 15992 */ 15993 static struct hda_verb alc662_sixstack_ch8_init[] = { 15994 { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 15995 { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 15996 { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 15997 { } /* end */ 15998 }; 15999 16000 static struct hda_channel_mode alc662_5stack_modes[2] = { 16001 { 2, alc662_sixstack_ch6_init }, 16002 { 6, alc662_sixstack_ch8_init }, 16003 }; 16004 16005 /* Pin assignment: Front=0x14, Rear=0x15, CLFE=0x16, Side=0x17 16006 * Mic=0x18, Front Mic=0x19, Line-In=0x1a, HP=0x1b 16007 */ 16008 16009 static struct snd_kcontrol_new alc662_base_mixer[] = { 16010 /* output mixer control */ 16011 HDA_CODEC_VOLUME("Front Playback Volume", 0x2, 0x0, HDA_OUTPUT), 16012 HDA_CODEC_MUTE("Front Playback Switch", 0x0c, 0x0, HDA_INPUT), 16013 HDA_CODEC_VOLUME("Surround Playback Volume", 0x3, 0x0, HDA_OUTPUT), 16014 HDA_CODEC_MUTE("Surround Playback Switch", 0x0d, 0x0, HDA_INPUT), 16015 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x04, 1, 0x0, HDA_OUTPUT), 16016 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x04, 2, 0x0, HDA_OUTPUT), 16017 HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x0e, 1, 0x0, HDA_INPUT), 16018 HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 0x0, HDA_INPUT), 16019 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT), 16020 16021 /*Input mixer control */ 16022 HDA_CODEC_VOLUME("CD Playback Volume", 0xb, 0x4, HDA_INPUT), 16023 HDA_CODEC_MUTE("CD Playback Switch", 0xb, 0x4, HDA_INPUT), 16024 HDA_CODEC_VOLUME("Line Playback Volume", 0xb, 0x02, HDA_INPUT), 16025 HDA_CODEC_MUTE("Line Playback Switch", 0xb, 0x02, HDA_INPUT), 16026 HDA_CODEC_VOLUME("Mic Playback Volume", 0xb, 0x0, HDA_INPUT), 16027 HDA_CODEC_MUTE("Mic Playback Switch", 0xb, 0x0, HDA_INPUT), 16028 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0xb, 0x01, HDA_INPUT), 16029 HDA_CODEC_MUTE("Front Mic Playback Switch", 0xb, 0x01, HDA_INPUT), 16030 { } /* end */ 16031 }; 16032 16033 static struct snd_kcontrol_new alc662_3ST_2ch_mixer[] = { 16034 HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT), 16035 HDA_CODEC_MUTE("Front Playback Switch", 0x0c, 0x0, HDA_INPUT), 16036 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT), 16037 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), 16038 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), 16039 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), 16040 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), 16041 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 16042 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 16043 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), 16044 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), 16045 { } /* end */ 16046 }; 16047 16048 static struct snd_kcontrol_new alc662_3ST_6ch_mixer[] = { 16049 HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT), 16050 HDA_CODEC_MUTE("Front Playback Switch", 0x0c, 0x0, HDA_INPUT), 16051 HDA_CODEC_VOLUME("Surround Playback Volume", 0x03, 0x0, HDA_OUTPUT), 16052 HDA_CODEC_MUTE("Surround Playback Switch", 0x0d, 0x0, HDA_INPUT), 16053 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x04, 1, 0x0, HDA_OUTPUT), 16054 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x04, 2, 0x0, HDA_OUTPUT), 16055 HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x0e, 1, 0x0, HDA_INPUT), 16056 HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 0x0, HDA_INPUT), 16057 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT), 16058 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), 16059 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), 16060 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), 16061 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), 16062 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 16063 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 16064 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), 16065 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), 16066 { } /* end */ 16067 }; 16068 16069 static struct snd_kcontrol_new alc662_lenovo_101e_mixer[] = { 16070 HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT), 16071 HDA_BIND_MUTE("Front Playback Switch", 0x02, 2, HDA_INPUT), 16072 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x03, 0x0, HDA_OUTPUT), 16073 HDA_BIND_MUTE("Speaker Playback Switch", 0x03, 2, HDA_INPUT), 16074 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT), 16075 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), 16076 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), 16077 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), 16078 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), 16079 { } /* end */ 16080 }; 16081 16082 static struct snd_kcontrol_new alc662_eeepc_p701_mixer[] = { 16083 HDA_CODEC_VOLUME("Master Playback Volume", 0x02, 0x0, HDA_OUTPUT), 16084 ALC262_HIPPO_MASTER_SWITCH, 16085 16086 HDA_CODEC_VOLUME("e-Mic Boost", 0x18, 0, HDA_INPUT), 16087 HDA_CODEC_VOLUME("e-Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 16088 HDA_CODEC_MUTE("e-Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 16089 16090 HDA_CODEC_VOLUME("i-Mic Boost", 0x19, 0, HDA_INPUT), 16091 HDA_CODEC_VOLUME("i-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), 16092 HDA_CODEC_MUTE("i-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), 16093 { } /* end */ 16094 }; 16095 16096 static struct snd_kcontrol_new alc662_eeepc_ep20_mixer[] = { 16097 ALC262_HIPPO_MASTER_SWITCH, 16098 HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT), 16099 HDA_CODEC_VOLUME("Surround Playback Volume", 0x03, 0x0, HDA_OUTPUT), 16100 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x04, 1, 0x0, HDA_OUTPUT), 16101 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x04, 2, 0x0, HDA_OUTPUT), 16102 HDA_BIND_MUTE("MuteCtrl Playback Switch", 0x0c, 2, HDA_INPUT), 16103 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), 16104 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), 16105 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 16106 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 16107 { } /* end */ 16108 }; 16109 16110 static struct hda_bind_ctls alc663_asus_bind_master_vol = { 16111 .ops = &snd_hda_bind_vol, 16112 .values = { 16113 HDA_COMPOSE_AMP_VAL(0x02, 3, 0, HDA_OUTPUT), 16114 HDA_COMPOSE_AMP_VAL(0x03, 3, 0, HDA_OUTPUT), 16115 0 16116 }, 16117 }; 16118 16119 static struct hda_bind_ctls alc663_asus_one_bind_switch = { 16120 .ops = &snd_hda_bind_sw, 16121 .values = { 16122 HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT), 16123 HDA_COMPOSE_AMP_VAL(0x21, 3, 0, HDA_OUTPUT), 16124 0 16125 }, 16126 }; 16127 16128 static struct snd_kcontrol_new alc663_m51va_mixer[] = { 16129 HDA_BIND_VOL("Master Playback Volume", &alc663_asus_bind_master_vol), 16130 HDA_BIND_SW("Master Playback Switch", &alc663_asus_one_bind_switch), 16131 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 16132 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 16133 { } /* end */ 16134 }; 16135 16136 static struct hda_bind_ctls alc663_asus_tree_bind_switch = { 16137 .ops = &snd_hda_bind_sw, 16138 .values = { 16139 HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT), 16140 HDA_COMPOSE_AMP_VAL(0x15, 3, 0, HDA_OUTPUT), 16141 HDA_COMPOSE_AMP_VAL(0x21, 3, 0, HDA_OUTPUT), 16142 0 16143 }, 16144 }; 16145 16146 static struct snd_kcontrol_new alc663_two_hp_m1_mixer[] = { 16147 HDA_BIND_VOL("Master Playback Volume", &alc663_asus_bind_master_vol), 16148 HDA_BIND_SW("Master Playback Switch", &alc663_asus_tree_bind_switch), 16149 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 16150 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 16151 HDA_CODEC_VOLUME("F-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), 16152 HDA_CODEC_MUTE("F-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), 16153 16154 { } /* end */ 16155 }; 16156 16157 static struct hda_bind_ctls alc663_asus_four_bind_switch = { 16158 .ops = &snd_hda_bind_sw, 16159 .values = { 16160 HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT), 16161 HDA_COMPOSE_AMP_VAL(0x15, 3, 0, HDA_OUTPUT), 16162 HDA_COMPOSE_AMP_VAL(0x1b, 3, 0, HDA_OUTPUT), 16163 0 16164 }, 16165 }; 16166 16167 static struct snd_kcontrol_new alc663_two_hp_m2_mixer[] = { 16168 HDA_BIND_VOL("Master Playback Volume", &alc663_asus_bind_master_vol), 16169 HDA_BIND_SW("Master Playback Switch", &alc663_asus_four_bind_switch), 16170 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 16171 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 16172 HDA_CODEC_VOLUME("F-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), 16173 HDA_CODEC_MUTE("F-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), 16174 { } /* end */ 16175 }; 16176 16177 static struct snd_kcontrol_new alc662_1bjd_mixer[] = { 16178 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT), 16179 HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT), 16180 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT), 16181 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 16182 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 16183 HDA_CODEC_VOLUME("F-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), 16184 HDA_CODEC_MUTE("F-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), 16185 { } /* end */ 16186 }; 16187 16188 static struct hda_bind_ctls alc663_asus_two_bind_master_vol = { 16189 .ops = &snd_hda_bind_vol, 16190 .values = { 16191 HDA_COMPOSE_AMP_VAL(0x02, 3, 0, HDA_OUTPUT), 16192 HDA_COMPOSE_AMP_VAL(0x04, 3, 0, HDA_OUTPUT), 16193 0 16194 }, 16195 }; 16196 16197 static struct hda_bind_ctls alc663_asus_two_bind_switch = { 16198 .ops = &snd_hda_bind_sw, 16199 .values = { 16200 HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT), 16201 HDA_COMPOSE_AMP_VAL(0x16, 3, 0, HDA_OUTPUT), 16202 0 16203 }, 16204 }; 16205 16206 static struct snd_kcontrol_new alc663_asus_21jd_clfe_mixer[] = { 16207 HDA_BIND_VOL("Master Playback Volume", 16208 &alc663_asus_two_bind_master_vol), 16209 HDA_BIND_SW("Master Playback Switch", &alc663_asus_two_bind_switch), 16210 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT), 16211 HDA_CODEC_MUTE("Headphone Playback Switch", 0x21, 0x0, HDA_OUTPUT), 16212 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 16213 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 16214 { } /* end */ 16215 }; 16216 16217 static struct snd_kcontrol_new alc663_asus_15jd_clfe_mixer[] = { 16218 HDA_BIND_VOL("Master Playback Volume", &alc663_asus_bind_master_vol), 16219 HDA_BIND_SW("Master Playback Switch", &alc663_asus_two_bind_switch), 16220 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT), 16221 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT), 16222 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 16223 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 16224 { } /* end */ 16225 }; 16226 16227 static struct snd_kcontrol_new alc663_g71v_mixer[] = { 16228 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT), 16229 HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT), 16230 HDA_CODEC_VOLUME("Front Playback Volume", 0x03, 0x0, HDA_OUTPUT), 16231 HDA_CODEC_MUTE("Front Playback Switch", 0x15, 0x0, HDA_OUTPUT), 16232 HDA_CODEC_MUTE("Headphone Playback Switch", 0x21, 0x0, HDA_OUTPUT), 16233 16234 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 16235 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 16236 HDA_CODEC_VOLUME("i-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), 16237 HDA_CODEC_MUTE("i-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), 16238 { } /* end */ 16239 }; 16240 16241 static struct snd_kcontrol_new alc663_g50v_mixer[] = { 16242 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT), 16243 HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT), 16244 HDA_CODEC_MUTE("Headphone Playback Switch", 0x21, 0x0, HDA_OUTPUT), 16245 16246 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 16247 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 16248 HDA_CODEC_VOLUME("i-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), 16249 HDA_CODEC_MUTE("i-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), 16250 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), 16251 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), 16252 { } /* end */ 16253 }; 16254 16255 static struct hda_bind_ctls alc663_asus_mode7_8_all_bind_switch = { 16256 .ops = &snd_hda_bind_sw, 16257 .values = { 16258 HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT), 16259 HDA_COMPOSE_AMP_VAL(0x15, 3, 0, HDA_OUTPUT), 16260 HDA_COMPOSE_AMP_VAL(0x17, 3, 0, HDA_OUTPUT), 16261 HDA_COMPOSE_AMP_VAL(0x1b, 3, 0, HDA_OUTPUT), 16262 HDA_COMPOSE_AMP_VAL(0x21, 3, 0, HDA_OUTPUT), 16263 0 16264 }, 16265 }; 16266 16267 static struct hda_bind_ctls alc663_asus_mode7_8_sp_bind_switch = { 16268 .ops = &snd_hda_bind_sw, 16269 .values = { 16270 HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT), 16271 HDA_COMPOSE_AMP_VAL(0x17, 3, 0, HDA_OUTPUT), 16272 0 16273 }, 16274 }; 16275 16276 static struct snd_kcontrol_new alc663_mode7_mixer[] = { 16277 HDA_BIND_SW("Master Playback Switch", &alc663_asus_mode7_8_all_bind_switch), 16278 HDA_BIND_VOL("Speaker Playback Volume", &alc663_asus_bind_master_vol), 16279 HDA_BIND_SW("Speaker Playback Switch", &alc663_asus_mode7_8_sp_bind_switch), 16280 HDA_CODEC_MUTE("Headphone1 Playback Switch", 0x1b, 0x0, HDA_OUTPUT), 16281 HDA_CODEC_MUTE("Headphone2 Playback Switch", 0x21, 0x0, HDA_OUTPUT), 16282 HDA_CODEC_VOLUME("IntMic Playback Volume", 0x0b, 0x0, HDA_INPUT), 16283 HDA_CODEC_MUTE("IntMic Playback Switch", 0x0b, 0x0, HDA_INPUT), 16284 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), 16285 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), 16286 { } /* end */ 16287 }; 16288 16289 static struct snd_kcontrol_new alc663_mode8_mixer[] = { 16290 HDA_BIND_SW("Master Playback Switch", &alc663_asus_mode7_8_all_bind_switch), 16291 HDA_BIND_VOL("Speaker Playback Volume", &alc663_asus_bind_master_vol), 16292 HDA_BIND_SW("Speaker Playback Switch", &alc663_asus_mode7_8_sp_bind_switch), 16293 HDA_CODEC_MUTE("Headphone1 Playback Switch", 0x15, 0x0, HDA_OUTPUT), 16294 HDA_CODEC_MUTE("Headphone2 Playback Switch", 0x21, 0x0, HDA_OUTPUT), 16295 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 16296 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 16297 { } /* end */ 16298 }; 16299 16300 16301 static struct snd_kcontrol_new alc662_chmode_mixer[] = { 16302 { 16303 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 16304 .name = "Channel Mode", 16305 .info = alc_ch_mode_info, 16306 .get = alc_ch_mode_get, 16307 .put = alc_ch_mode_put, 16308 }, 16309 { } /* end */ 16310 }; 16311 16312 static struct hda_verb alc662_init_verbs[] = { 16313 /* ADC: mute amp left and right */ 16314 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 16315 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00}, 16316 /* Front mixer: unmute input/output amp left and right (volume = 0) */ 16317 16318 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 16319 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 16320 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, 16321 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, 16322 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, 16323 16324 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 16325 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 16326 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 16327 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 16328 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 16329 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 16330 16331 /* Front Pin: output 0 (0x0c) */ 16332 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 16333 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 16334 16335 /* Rear Pin: output 1 (0x0d) */ 16336 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 16337 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 16338 16339 /* CLFE Pin: output 2 (0x0e) */ 16340 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 16341 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 16342 16343 /* Mic (rear) pin: input vref at 80% */ 16344 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, 16345 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 16346 /* Front Mic pin: input vref at 80% */ 16347 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, 16348 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 16349 /* Line In pin: input */ 16350 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 16351 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 16352 /* Line-2 In: Headphone output (output 0 - 0x0c) */ 16353 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 16354 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 16355 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, 16356 /* CD pin widget for input */ 16357 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 16358 16359 /* FIXME: use matrix-type input source selection */ 16360 /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */ 16361 /* Input mixer */ 16362 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 16363 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 16364 16365 /* always trun on EAPD */ 16366 {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2}, 16367 {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2}, 16368 16369 { } 16370 }; 16371 16372 static struct hda_verb alc662_sue_init_verbs[] = { 16373 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_FRONT_EVENT}, 16374 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_HP_EVENT}, 16375 {} 16376 }; 16377 16378 static struct hda_verb alc662_eeepc_sue_init_verbs[] = { 16379 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT}, 16380 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT}, 16381 {} 16382 }; 16383 16384 /* Set Unsolicited Event*/ 16385 static struct hda_verb alc662_eeepc_ep20_sue_init_verbs[] = { 16386 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 16387 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT}, 16388 {} 16389 }; 16390 16391 /* 16392 * generic initialization of ADC, input mixers and output mixers 16393 */ 16394 static struct hda_verb alc662_auto_init_verbs[] = { 16395 /* 16396 * Unmute ADC and set the default input to mic-in 16397 */ 16398 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00}, 16399 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 16400 16401 /* Unmute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback 16402 * mixer widget 16403 * Note: PASD motherboards uses the Line In 2 as the input for front 16404 * panel mic (mic 2) 16405 */ 16406 /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */ 16407 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 16408 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 16409 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, 16410 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, 16411 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, 16412 16413 /* 16414 * Set up output mixers (0x0c - 0x0f) 16415 */ 16416 /* set vol=0 to output mixers */ 16417 {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 16418 {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 16419 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 16420 16421 /* set up input amps for analog loopback */ 16422 /* Amp Indices: DAC = 0, mixer = 1 */ 16423 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 16424 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 16425 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 16426 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 16427 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 16428 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 16429 16430 16431 /* FIXME: use matrix-type input source selection */ 16432 /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */ 16433 /* Input mixer */ 16434 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 16435 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 16436 { } 16437 }; 16438 16439 /* additional verbs for ALC663 */ 16440 static struct hda_verb alc663_auto_init_verbs[] = { 16441 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 16442 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 16443 { } 16444 }; 16445 16446 static struct hda_verb alc663_m51va_init_verbs[] = { 16447 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 16448 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 16449 {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 16450 {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 16451 {0x21, AC_VERB_SET_CONNECT_SEL, 0x01}, /* Headphone */ 16452 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 16453 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(9)}, 16454 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT}, 16455 {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT}, 16456 {} 16457 }; 16458 16459 static struct hda_verb alc663_21jd_amic_init_verbs[] = { 16460 {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 16461 {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 16462 {0x21, AC_VERB_SET_CONNECT_SEL, 0x01}, /* Headphone */ 16463 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 16464 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 16465 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT}, 16466 {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT}, 16467 {} 16468 }; 16469 16470 static struct hda_verb alc662_1bjd_amic_init_verbs[] = { 16471 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 16472 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 16473 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 16474 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Headphone */ 16475 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 16476 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 16477 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT}, 16478 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT}, 16479 {} 16480 }; 16481 16482 static struct hda_verb alc663_15jd_amic_init_verbs[] = { 16483 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 16484 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 16485 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, /* Headphone */ 16486 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 16487 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 16488 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT}, 16489 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT}, 16490 {} 16491 }; 16492 16493 static struct hda_verb alc663_two_hp_amic_m1_init_verbs[] = { 16494 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 16495 {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 16496 {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 16497 {0x21, AC_VERB_SET_CONNECT_SEL, 0x0}, /* Headphone */ 16498 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 16499 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 16500 {0x15, AC_VERB_SET_CONNECT_SEL, 0x0}, /* Headphone */ 16501 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 16502 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 16503 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT}, 16504 {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT}, 16505 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT}, 16506 {} 16507 }; 16508 16509 static struct hda_verb alc663_two_hp_amic_m2_init_verbs[] = { 16510 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 16511 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 16512 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 16513 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x01}, /* Headphone */ 16514 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 16515 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 16516 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, /* Headphone */ 16517 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 16518 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 16519 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT}, 16520 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT}, 16521 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT}, 16522 {} 16523 }; 16524 16525 static struct hda_verb alc663_g71v_init_verbs[] = { 16526 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 16527 /* {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, */ 16528 /* {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, */ /* Headphone */ 16529 16530 {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 16531 {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 16532 {0x21, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Headphone */ 16533 16534 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_FRONT_EVENT}, 16535 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_MIC_EVENT}, 16536 {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_HP_EVENT}, 16537 {} 16538 }; 16539 16540 static struct hda_verb alc663_g50v_init_verbs[] = { 16541 {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 16542 {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 16543 {0x21, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Headphone */ 16544 16545 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT}, 16546 {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT}, 16547 {} 16548 }; 16549 16550 static struct hda_verb alc662_ecs_init_verbs[] = { 16551 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, 0x701f}, 16552 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 16553 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT}, 16554 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT}, 16555 {} 16556 }; 16557 16558 static struct hda_verb alc272_dell_zm1_init_verbs[] = { 16559 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 16560 {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 16561 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 16562 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 16563 {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 16564 {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 16565 {0x21, AC_VERB_SET_CONNECT_SEL, 0x01}, /* Headphone */ 16566 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 16567 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(9)}, 16568 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT}, 16569 {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT}, 16570 {} 16571 }; 16572 16573 static struct hda_verb alc272_dell_init_verbs[] = { 16574 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 16575 {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 16576 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 16577 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 16578 {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 16579 {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 16580 {0x21, AC_VERB_SET_CONNECT_SEL, 0x01}, /* Headphone */ 16581 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 16582 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(9)}, 16583 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT}, 16584 {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT}, 16585 {} 16586 }; 16587 16588 static struct hda_verb alc663_mode7_init_verbs[] = { 16589 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 16590 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 16591 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 16592 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 16593 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 16594 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 16595 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x01}, 16596 {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 16597 {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 16598 {0x21, AC_VERB_SET_CONNECT_SEL, 0x01}, /* Headphone */ 16599 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 16600 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(9)}, 16601 {0x19, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT}, 16602 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT}, 16603 {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT}, 16604 {} 16605 }; 16606 16607 static struct hda_verb alc663_mode8_init_verbs[] = { 16608 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 16609 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 16610 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 16611 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, 16612 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 16613 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 16614 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 16615 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 16616 {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 16617 {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 16618 {0x21, AC_VERB_SET_CONNECT_SEL, 0x01}, /* Headphone */ 16619 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 16620 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(9)}, 16621 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT}, 16622 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT}, 16623 {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT}, 16624 {} 16625 }; 16626 16627 static struct snd_kcontrol_new alc662_auto_capture_mixer[] = { 16628 HDA_CODEC_VOLUME("Capture Volume", 0x09, 0x0, HDA_INPUT), 16629 HDA_CODEC_MUTE("Capture Switch", 0x09, 0x0, HDA_INPUT), 16630 { } /* end */ 16631 }; 16632 16633 static struct snd_kcontrol_new alc272_auto_capture_mixer[] = { 16634 HDA_CODEC_VOLUME("Capture Volume", 0x08, 0x0, HDA_INPUT), 16635 HDA_CODEC_MUTE("Capture Switch", 0x08, 0x0, HDA_INPUT), 16636 { } /* end */ 16637 }; 16638 16639 static void alc662_lenovo_101e_ispeaker_automute(struct hda_codec *codec) 16640 { 16641 unsigned int present; 16642 unsigned char bits; 16643 16644 present = snd_hda_jack_detect(codec, 0x14); 16645 bits = present ? HDA_AMP_MUTE : 0; 16646 16647 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0, 16648 HDA_AMP_MUTE, bits); 16649 } 16650 16651 static void alc662_lenovo_101e_all_automute(struct hda_codec *codec) 16652 { 16653 unsigned int present; 16654 unsigned char bits; 16655 16656 present = snd_hda_jack_detect(codec, 0x1b); 16657 bits = present ? HDA_AMP_MUTE : 0; 16658 16659 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0, 16660 HDA_AMP_MUTE, bits); 16661 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0, 16662 HDA_AMP_MUTE, bits); 16663 } 16664 16665 static void alc662_lenovo_101e_unsol_event(struct hda_codec *codec, 16666 unsigned int res) 16667 { 16668 if ((res >> 26) == ALC880_HP_EVENT) 16669 alc662_lenovo_101e_all_automute(codec); 16670 if ((res >> 26) == ALC880_FRONT_EVENT) 16671 alc662_lenovo_101e_ispeaker_automute(codec); 16672 } 16673 16674 /* unsolicited event for HP jack sensing */ 16675 static void alc662_eeepc_unsol_event(struct hda_codec *codec, 16676 unsigned int res) 16677 { 16678 if ((res >> 26) == ALC880_MIC_EVENT) 16679 alc_mic_automute(codec); 16680 else 16681 alc262_hippo_unsol_event(codec, res); 16682 } 16683 16684 static void alc662_eeepc_setup(struct hda_codec *codec) 16685 { 16686 struct alc_spec *spec = codec->spec; 16687 16688 alc262_hippo1_setup(codec); 16689 spec->ext_mic.pin = 0x18; 16690 spec->ext_mic.mux_idx = 0; 16691 spec->int_mic.pin = 0x19; 16692 spec->int_mic.mux_idx = 1; 16693 spec->auto_mic = 1; 16694 } 16695 16696 static void alc662_eeepc_inithook(struct hda_codec *codec) 16697 { 16698 alc262_hippo_automute(codec); 16699 alc_mic_automute(codec); 16700 } 16701 16702 static void alc662_eeepc_ep20_setup(struct hda_codec *codec) 16703 { 16704 struct alc_spec *spec = codec->spec; 16705 16706 spec->autocfg.hp_pins[0] = 0x14; 16707 spec->autocfg.speaker_pins[0] = 0x1b; 16708 } 16709 16710 #define alc662_eeepc_ep20_inithook alc262_hippo_master_update 16711 16712 static void alc663_m51va_speaker_automute(struct hda_codec *codec) 16713 { 16714 unsigned int present; 16715 unsigned char bits; 16716 16717 present = snd_hda_jack_detect(codec, 0x21); 16718 bits = present ? HDA_AMP_MUTE : 0; 16719 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0, 16720 AMP_IN_MUTE(0), bits); 16721 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1, 16722 AMP_IN_MUTE(0), bits); 16723 } 16724 16725 static void alc663_21jd_two_speaker_automute(struct hda_codec *codec) 16726 { 16727 unsigned int present; 16728 unsigned char bits; 16729 16730 present = snd_hda_jack_detect(codec, 0x21); 16731 bits = present ? HDA_AMP_MUTE : 0; 16732 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0, 16733 AMP_IN_MUTE(0), bits); 16734 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1, 16735 AMP_IN_MUTE(0), bits); 16736 snd_hda_codec_amp_stereo(codec, 0x0e, HDA_INPUT, 0, 16737 AMP_IN_MUTE(0), bits); 16738 snd_hda_codec_amp_stereo(codec, 0x0e, HDA_INPUT, 1, 16739 AMP_IN_MUTE(0), bits); 16740 } 16741 16742 static void alc663_15jd_two_speaker_automute(struct hda_codec *codec) 16743 { 16744 unsigned int present; 16745 unsigned char bits; 16746 16747 present = snd_hda_jack_detect(codec, 0x15); 16748 bits = present ? HDA_AMP_MUTE : 0; 16749 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0, 16750 AMP_IN_MUTE(0), bits); 16751 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1, 16752 AMP_IN_MUTE(0), bits); 16753 snd_hda_codec_amp_stereo(codec, 0x0e, HDA_INPUT, 0, 16754 AMP_IN_MUTE(0), bits); 16755 snd_hda_codec_amp_stereo(codec, 0x0e, HDA_INPUT, 1, 16756 AMP_IN_MUTE(0), bits); 16757 } 16758 16759 static void alc662_f5z_speaker_automute(struct hda_codec *codec) 16760 { 16761 unsigned int present; 16762 unsigned char bits; 16763 16764 present = snd_hda_jack_detect(codec, 0x1b); 16765 bits = present ? 0 : PIN_OUT; 16766 snd_hda_codec_write(codec, 0x14, 0, 16767 AC_VERB_SET_PIN_WIDGET_CONTROL, bits); 16768 } 16769 16770 static void alc663_two_hp_m1_speaker_automute(struct hda_codec *codec) 16771 { 16772 unsigned int present1, present2; 16773 16774 present1 = snd_hda_jack_detect(codec, 0x21); 16775 present2 = snd_hda_jack_detect(codec, 0x15); 16776 16777 if (present1 || present2) { 16778 snd_hda_codec_write_cache(codec, 0x14, 0, 16779 AC_VERB_SET_PIN_WIDGET_CONTROL, 0); 16780 } else { 16781 snd_hda_codec_write_cache(codec, 0x14, 0, 16782 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT); 16783 } 16784 } 16785 16786 static void alc663_two_hp_m2_speaker_automute(struct hda_codec *codec) 16787 { 16788 unsigned int present1, present2; 16789 16790 present1 = snd_hda_jack_detect(codec, 0x1b); 16791 present2 = snd_hda_jack_detect(codec, 0x15); 16792 16793 if (present1 || present2) { 16794 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0, 16795 AMP_IN_MUTE(0), AMP_IN_MUTE(0)); 16796 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1, 16797 AMP_IN_MUTE(0), AMP_IN_MUTE(0)); 16798 } else { 16799 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0, 16800 AMP_IN_MUTE(0), 0); 16801 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1, 16802 AMP_IN_MUTE(0), 0); 16803 } 16804 } 16805 16806 static void alc663_two_hp_m7_speaker_automute(struct hda_codec *codec) 16807 { 16808 unsigned int present1, present2; 16809 16810 present1 = snd_hda_codec_read(codec, 0x1b, 0, 16811 AC_VERB_GET_PIN_SENSE, 0) 16812 & AC_PINSENSE_PRESENCE; 16813 present2 = snd_hda_codec_read(codec, 0x21, 0, 16814 AC_VERB_GET_PIN_SENSE, 0) 16815 & AC_PINSENSE_PRESENCE; 16816 16817 if (present1 || present2) { 16818 snd_hda_codec_write_cache(codec, 0x14, 0, 16819 AC_VERB_SET_PIN_WIDGET_CONTROL, 0); 16820 snd_hda_codec_write_cache(codec, 0x17, 0, 16821 AC_VERB_SET_PIN_WIDGET_CONTROL, 0); 16822 } else { 16823 snd_hda_codec_write_cache(codec, 0x14, 0, 16824 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT); 16825 snd_hda_codec_write_cache(codec, 0x17, 0, 16826 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT); 16827 } 16828 } 16829 16830 static void alc663_two_hp_m8_speaker_automute(struct hda_codec *codec) 16831 { 16832 unsigned int present1, present2; 16833 16834 present1 = snd_hda_codec_read(codec, 0x21, 0, 16835 AC_VERB_GET_PIN_SENSE, 0) 16836 & AC_PINSENSE_PRESENCE; 16837 present2 = snd_hda_codec_read(codec, 0x15, 0, 16838 AC_VERB_GET_PIN_SENSE, 0) 16839 & AC_PINSENSE_PRESENCE; 16840 16841 if (present1 || present2) { 16842 snd_hda_codec_write_cache(codec, 0x14, 0, 16843 AC_VERB_SET_PIN_WIDGET_CONTROL, 0); 16844 snd_hda_codec_write_cache(codec, 0x17, 0, 16845 AC_VERB_SET_PIN_WIDGET_CONTROL, 0); 16846 } else { 16847 snd_hda_codec_write_cache(codec, 0x14, 0, 16848 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT); 16849 snd_hda_codec_write_cache(codec, 0x17, 0, 16850 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT); 16851 } 16852 } 16853 16854 static void alc663_m51va_unsol_event(struct hda_codec *codec, 16855 unsigned int res) 16856 { 16857 switch (res >> 26) { 16858 case ALC880_HP_EVENT: 16859 alc663_m51va_speaker_automute(codec); 16860 break; 16861 case ALC880_MIC_EVENT: 16862 alc_mic_automute(codec); 16863 break; 16864 } 16865 } 16866 16867 static void alc663_m51va_setup(struct hda_codec *codec) 16868 { 16869 struct alc_spec *spec = codec->spec; 16870 spec->ext_mic.pin = 0x18; 16871 spec->ext_mic.mux_idx = 0; 16872 spec->int_mic.pin = 0x12; 16873 spec->int_mic.mux_idx = 9; 16874 spec->auto_mic = 1; 16875 } 16876 16877 static void alc663_m51va_inithook(struct hda_codec *codec) 16878 { 16879 alc663_m51va_speaker_automute(codec); 16880 alc_mic_automute(codec); 16881 } 16882 16883 /* ***************** Mode1 ******************************/ 16884 #define alc663_mode1_unsol_event alc663_m51va_unsol_event 16885 16886 static void alc663_mode1_setup(struct hda_codec *codec) 16887 { 16888 struct alc_spec *spec = codec->spec; 16889 spec->ext_mic.pin = 0x18; 16890 spec->ext_mic.mux_idx = 0; 16891 spec->int_mic.pin = 0x19; 16892 spec->int_mic.mux_idx = 1; 16893 spec->auto_mic = 1; 16894 } 16895 16896 #define alc663_mode1_inithook alc663_m51va_inithook 16897 16898 /* ***************** Mode2 ******************************/ 16899 static void alc662_mode2_unsol_event(struct hda_codec *codec, 16900 unsigned int res) 16901 { 16902 switch (res >> 26) { 16903 case ALC880_HP_EVENT: 16904 alc662_f5z_speaker_automute(codec); 16905 break; 16906 case ALC880_MIC_EVENT: 16907 alc_mic_automute(codec); 16908 break; 16909 } 16910 } 16911 16912 #define alc662_mode2_setup alc663_mode1_setup 16913 16914 static void alc662_mode2_inithook(struct hda_codec *codec) 16915 { 16916 alc662_f5z_speaker_automute(codec); 16917 alc_mic_automute(codec); 16918 } 16919 /* ***************** Mode3 ******************************/ 16920 static void alc663_mode3_unsol_event(struct hda_codec *codec, 16921 unsigned int res) 16922 { 16923 switch (res >> 26) { 16924 case ALC880_HP_EVENT: 16925 alc663_two_hp_m1_speaker_automute(codec); 16926 break; 16927 case ALC880_MIC_EVENT: 16928 alc_mic_automute(codec); 16929 break; 16930 } 16931 } 16932 16933 #define alc663_mode3_setup alc663_mode1_setup 16934 16935 static void alc663_mode3_inithook(struct hda_codec *codec) 16936 { 16937 alc663_two_hp_m1_speaker_automute(codec); 16938 alc_mic_automute(codec); 16939 } 16940 /* ***************** Mode4 ******************************/ 16941 static void alc663_mode4_unsol_event(struct hda_codec *codec, 16942 unsigned int res) 16943 { 16944 switch (res >> 26) { 16945 case ALC880_HP_EVENT: 16946 alc663_21jd_two_speaker_automute(codec); 16947 break; 16948 case ALC880_MIC_EVENT: 16949 alc_mic_automute(codec); 16950 break; 16951 } 16952 } 16953 16954 #define alc663_mode4_setup alc663_mode1_setup 16955 16956 static void alc663_mode4_inithook(struct hda_codec *codec) 16957 { 16958 alc663_21jd_two_speaker_automute(codec); 16959 alc_mic_automute(codec); 16960 } 16961 /* ***************** Mode5 ******************************/ 16962 static void alc663_mode5_unsol_event(struct hda_codec *codec, 16963 unsigned int res) 16964 { 16965 switch (res >> 26) { 16966 case ALC880_HP_EVENT: 16967 alc663_15jd_two_speaker_automute(codec); 16968 break; 16969 case ALC880_MIC_EVENT: 16970 alc_mic_automute(codec); 16971 break; 16972 } 16973 } 16974 16975 #define alc663_mode5_setup alc663_mode1_setup 16976 16977 static void alc663_mode5_inithook(struct hda_codec *codec) 16978 { 16979 alc663_15jd_two_speaker_automute(codec); 16980 alc_mic_automute(codec); 16981 } 16982 /* ***************** Mode6 ******************************/ 16983 static void alc663_mode6_unsol_event(struct hda_codec *codec, 16984 unsigned int res) 16985 { 16986 switch (res >> 26) { 16987 case ALC880_HP_EVENT: 16988 alc663_two_hp_m2_speaker_automute(codec); 16989 break; 16990 case ALC880_MIC_EVENT: 16991 alc_mic_automute(codec); 16992 break; 16993 } 16994 } 16995 16996 #define alc663_mode6_setup alc663_mode1_setup 16997 16998 static void alc663_mode6_inithook(struct hda_codec *codec) 16999 { 17000 alc663_two_hp_m2_speaker_automute(codec); 17001 alc_mic_automute(codec); 17002 } 17003 17004 /* ***************** Mode7 ******************************/ 17005 static void alc663_mode7_unsol_event(struct hda_codec *codec, 17006 unsigned int res) 17007 { 17008 switch (res >> 26) { 17009 case ALC880_HP_EVENT: 17010 alc663_two_hp_m7_speaker_automute(codec); 17011 break; 17012 case ALC880_MIC_EVENT: 17013 alc_mic_automute(codec); 17014 break; 17015 } 17016 } 17017 17018 #define alc663_mode7_setup alc663_mode1_setup 17019 17020 static void alc663_mode7_inithook(struct hda_codec *codec) 17021 { 17022 alc663_two_hp_m7_speaker_automute(codec); 17023 alc_mic_automute(codec); 17024 } 17025 17026 /* ***************** Mode8 ******************************/ 17027 static void alc663_mode8_unsol_event(struct hda_codec *codec, 17028 unsigned int res) 17029 { 17030 switch (res >> 26) { 17031 case ALC880_HP_EVENT: 17032 alc663_two_hp_m8_speaker_automute(codec); 17033 break; 17034 case ALC880_MIC_EVENT: 17035 alc_mic_automute(codec); 17036 break; 17037 } 17038 } 17039 17040 #define alc663_mode8_setup alc663_m51va_setup 17041 17042 static void alc663_mode8_inithook(struct hda_codec *codec) 17043 { 17044 alc663_two_hp_m8_speaker_automute(codec); 17045 alc_mic_automute(codec); 17046 } 17047 17048 static void alc663_g71v_hp_automute(struct hda_codec *codec) 17049 { 17050 unsigned int present; 17051 unsigned char bits; 17052 17053 present = snd_hda_jack_detect(codec, 0x21); 17054 bits = present ? HDA_AMP_MUTE : 0; 17055 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0, 17056 HDA_AMP_MUTE, bits); 17057 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0, 17058 HDA_AMP_MUTE, bits); 17059 } 17060 17061 static void alc663_g71v_front_automute(struct hda_codec *codec) 17062 { 17063 unsigned int present; 17064 unsigned char bits; 17065 17066 present = snd_hda_jack_detect(codec, 0x15); 17067 bits = present ? HDA_AMP_MUTE : 0; 17068 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0, 17069 HDA_AMP_MUTE, bits); 17070 } 17071 17072 static void alc663_g71v_unsol_event(struct hda_codec *codec, 17073 unsigned int res) 17074 { 17075 switch (res >> 26) { 17076 case ALC880_HP_EVENT: 17077 alc663_g71v_hp_automute(codec); 17078 break; 17079 case ALC880_FRONT_EVENT: 17080 alc663_g71v_front_automute(codec); 17081 break; 17082 case ALC880_MIC_EVENT: 17083 alc_mic_automute(codec); 17084 break; 17085 } 17086 } 17087 17088 #define alc663_g71v_setup alc663_m51va_setup 17089 17090 static void alc663_g71v_inithook(struct hda_codec *codec) 17091 { 17092 alc663_g71v_front_automute(codec); 17093 alc663_g71v_hp_automute(codec); 17094 alc_mic_automute(codec); 17095 } 17096 17097 static void alc663_g50v_unsol_event(struct hda_codec *codec, 17098 unsigned int res) 17099 { 17100 switch (res >> 26) { 17101 case ALC880_HP_EVENT: 17102 alc663_m51va_speaker_automute(codec); 17103 break; 17104 case ALC880_MIC_EVENT: 17105 alc_mic_automute(codec); 17106 break; 17107 } 17108 } 17109 17110 #define alc663_g50v_setup alc663_m51va_setup 17111 17112 static void alc663_g50v_inithook(struct hda_codec *codec) 17113 { 17114 alc663_m51va_speaker_automute(codec); 17115 alc_mic_automute(codec); 17116 } 17117 17118 static struct snd_kcontrol_new alc662_ecs_mixer[] = { 17119 HDA_CODEC_VOLUME("Master Playback Volume", 0x02, 0x0, HDA_OUTPUT), 17120 ALC262_HIPPO_MASTER_SWITCH, 17121 17122 HDA_CODEC_VOLUME("e-Mic/LineIn Boost", 0x18, 0, HDA_INPUT), 17123 HDA_CODEC_VOLUME("e-Mic/LineIn Playback Volume", 0x0b, 0x0, HDA_INPUT), 17124 HDA_CODEC_MUTE("e-Mic/LineIn Playback Switch", 0x0b, 0x0, HDA_INPUT), 17125 17126 HDA_CODEC_VOLUME("i-Mic Boost", 0x19, 0, HDA_INPUT), 17127 HDA_CODEC_VOLUME("i-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), 17128 HDA_CODEC_MUTE("i-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), 17129 { } /* end */ 17130 }; 17131 17132 static struct snd_kcontrol_new alc272_nc10_mixer[] = { 17133 /* Master Playback automatically created from Speaker and Headphone */ 17134 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT), 17135 HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT), 17136 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT), 17137 HDA_CODEC_MUTE("Headphone Playback Switch", 0x21, 0x0, HDA_OUTPUT), 17138 17139 HDA_CODEC_VOLUME("Ext Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 17140 HDA_CODEC_MUTE("Ext Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 17141 HDA_CODEC_VOLUME("Ext Mic Boost", 0x18, 0, HDA_INPUT), 17142 17143 HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), 17144 HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), 17145 HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT), 17146 { } /* end */ 17147 }; 17148 17149 #ifdef CONFIG_SND_HDA_POWER_SAVE 17150 #define alc662_loopbacks alc880_loopbacks 17151 #endif 17152 17153 17154 /* pcm configuration: identical with ALC880 */ 17155 #define alc662_pcm_analog_playback alc880_pcm_analog_playback 17156 #define alc662_pcm_analog_capture alc880_pcm_analog_capture 17157 #define alc662_pcm_digital_playback alc880_pcm_digital_playback 17158 #define alc662_pcm_digital_capture alc880_pcm_digital_capture 17159 17160 /* 17161 * configuration and preset 17162 */ 17163 static const char *alc662_models[ALC662_MODEL_LAST] = { 17164 [ALC662_3ST_2ch_DIG] = "3stack-dig", 17165 [ALC662_3ST_6ch_DIG] = "3stack-6ch-dig", 17166 [ALC662_3ST_6ch] = "3stack-6ch", 17167 [ALC662_5ST_DIG] = "6stack-dig", 17168 [ALC662_LENOVO_101E] = "lenovo-101e", 17169 [ALC662_ASUS_EEEPC_P701] = "eeepc-p701", 17170 [ALC662_ASUS_EEEPC_EP20] = "eeepc-ep20", 17171 [ALC662_ECS] = "ecs", 17172 [ALC663_ASUS_M51VA] = "m51va", 17173 [ALC663_ASUS_G71V] = "g71v", 17174 [ALC663_ASUS_H13] = "h13", 17175 [ALC663_ASUS_G50V] = "g50v", 17176 [ALC663_ASUS_MODE1] = "asus-mode1", 17177 [ALC662_ASUS_MODE2] = "asus-mode2", 17178 [ALC663_ASUS_MODE3] = "asus-mode3", 17179 [ALC663_ASUS_MODE4] = "asus-mode4", 17180 [ALC663_ASUS_MODE5] = "asus-mode5", 17181 [ALC663_ASUS_MODE6] = "asus-mode6", 17182 [ALC663_ASUS_MODE7] = "asus-mode7", 17183 [ALC663_ASUS_MODE8] = "asus-mode8", 17184 [ALC272_DELL] = "dell", 17185 [ALC272_DELL_ZM1] = "dell-zm1", 17186 [ALC272_SAMSUNG_NC10] = "samsung-nc10", 17187 [ALC662_AUTO] = "auto", 17188 }; 17189 17190 static struct snd_pci_quirk alc662_cfg_tbl[] = { 17191 SND_PCI_QUIRK(0x1019, 0x9087, "ECS", ALC662_ECS), 17192 SND_PCI_QUIRK(0x1028, 0x02d6, "DELL", ALC272_DELL), 17193 SND_PCI_QUIRK(0x1028, 0x02f4, "DELL ZM1", ALC272_DELL_ZM1), 17194 SND_PCI_QUIRK(0x1043, 0x1000, "ASUS N50Vm", ALC663_ASUS_MODE1), 17195 SND_PCI_QUIRK(0x1043, 0x1092, "ASUS NB", ALC663_ASUS_MODE3), 17196 SND_PCI_QUIRK(0x1043, 0x11c3, "ASUS M70V", ALC663_ASUS_MODE3), 17197 SND_PCI_QUIRK(0x1043, 0x11d3, "ASUS NB", ALC663_ASUS_MODE1), 17198 SND_PCI_QUIRK(0x1043, 0x11f3, "ASUS NB", ALC662_ASUS_MODE2), 17199 SND_PCI_QUIRK(0x1043, 0x1203, "ASUS NB", ALC663_ASUS_MODE1), 17200 SND_PCI_QUIRK(0x1043, 0x1303, "ASUS G60J", ALC663_ASUS_MODE1), 17201 SND_PCI_QUIRK(0x1043, 0x1333, "ASUS G60Jx", ALC663_ASUS_MODE1), 17202 SND_PCI_QUIRK(0x1043, 0x1339, "ASUS NB", ALC662_ASUS_MODE2), 17203 SND_PCI_QUIRK(0x1043, 0x13e3, "ASUS N71JA", ALC663_ASUS_MODE7), 17204 SND_PCI_QUIRK(0x1043, 0x1463, "ASUS N71", ALC663_ASUS_MODE7), 17205 SND_PCI_QUIRK(0x1043, 0x14d3, "ASUS G72", ALC663_ASUS_MODE8), 17206 SND_PCI_QUIRK(0x1043, 0x1563, "ASUS N90", ALC663_ASUS_MODE3), 17207 SND_PCI_QUIRK(0x1043, 0x15d3, "ASUS N50SF F50SF", ALC663_ASUS_MODE1), 17208 SND_PCI_QUIRK(0x1043, 0x16c3, "ASUS NB", ALC662_ASUS_MODE2), 17209 SND_PCI_QUIRK(0x1043, 0x16f3, "ASUS K40C K50C", ALC662_ASUS_MODE2), 17210 SND_PCI_QUIRK(0x1043, 0x1733, "ASUS N81De", ALC663_ASUS_MODE1), 17211 SND_PCI_QUIRK(0x1043, 0x1753, "ASUS NB", ALC662_ASUS_MODE2), 17212 SND_PCI_QUIRK(0x1043, 0x1763, "ASUS NB", ALC663_ASUS_MODE6), 17213 SND_PCI_QUIRK(0x1043, 0x1765, "ASUS NB", ALC663_ASUS_MODE6), 17214 SND_PCI_QUIRK(0x1043, 0x1783, "ASUS NB", ALC662_ASUS_MODE2), 17215 SND_PCI_QUIRK(0x1043, 0x1793, "ASUS F50GX", ALC663_ASUS_MODE1), 17216 SND_PCI_QUIRK(0x1043, 0x17b3, "ASUS F70SL", ALC663_ASUS_MODE3), 17217 SND_PCI_QUIRK(0x1043, 0x17c3, "ASUS UX20", ALC663_ASUS_M51VA), 17218 SND_PCI_QUIRK(0x1043, 0x17f3, "ASUS X58LE", ALC662_ASUS_MODE2), 17219 SND_PCI_QUIRK(0x1043, 0x1813, "ASUS NB", ALC662_ASUS_MODE2), 17220 SND_PCI_QUIRK(0x1043, 0x1823, "ASUS NB", ALC663_ASUS_MODE5), 17221 SND_PCI_QUIRK(0x1043, 0x1833, "ASUS NB", ALC663_ASUS_MODE6), 17222 SND_PCI_QUIRK(0x1043, 0x1843, "ASUS NB", ALC662_ASUS_MODE2), 17223 SND_PCI_QUIRK(0x1043, 0x1853, "ASUS F50Z", ALC663_ASUS_MODE1), 17224 SND_PCI_QUIRK(0x1043, 0x1864, "ASUS NB", ALC662_ASUS_MODE2), 17225 SND_PCI_QUIRK(0x1043, 0x1876, "ASUS NB", ALC662_ASUS_MODE2), 17226 SND_PCI_QUIRK(0x1043, 0x1878, "ASUS M51VA", ALC663_ASUS_M51VA), 17227 /*SND_PCI_QUIRK(0x1043, 0x1878, "ASUS M50Vr", ALC663_ASUS_MODE1),*/ 17228 SND_PCI_QUIRK(0x1043, 0x1893, "ASUS M50Vm", ALC663_ASUS_MODE3), 17229 SND_PCI_QUIRK(0x1043, 0x1894, "ASUS X55", ALC663_ASUS_MODE3), 17230 SND_PCI_QUIRK(0x1043, 0x18b3, "ASUS N80Vc", ALC663_ASUS_MODE1), 17231 SND_PCI_QUIRK(0x1043, 0x18d3, "ASUS N81Te", ALC663_ASUS_MODE1), 17232 SND_PCI_QUIRK(0x1043, 0x18f3, "ASUS N505Tp", ALC663_ASUS_MODE1), 17233 SND_PCI_QUIRK(0x1043, 0x1903, "ASUS F5GL", ALC663_ASUS_MODE1), 17234 SND_PCI_QUIRK(0x1043, 0x1913, "ASUS NB", ALC662_ASUS_MODE2), 17235 SND_PCI_QUIRK(0x1043, 0x1933, "ASUS F80Q", ALC662_ASUS_MODE2), 17236 SND_PCI_QUIRK(0x1043, 0x1943, "ASUS Vx3V", ALC663_ASUS_MODE1), 17237 SND_PCI_QUIRK(0x1043, 0x1953, "ASUS NB", ALC663_ASUS_MODE1), 17238 SND_PCI_QUIRK(0x1043, 0x1963, "ASUS X71C", ALC663_ASUS_MODE3), 17239 SND_PCI_QUIRK(0x1043, 0x1983, "ASUS N5051A", ALC663_ASUS_MODE1), 17240 SND_PCI_QUIRK(0x1043, 0x1993, "ASUS N20", ALC663_ASUS_MODE1), 17241 SND_PCI_QUIRK(0x1043, 0x19a3, "ASUS G50V", ALC663_ASUS_G50V), 17242 /*SND_PCI_QUIRK(0x1043, 0x19a3, "ASUS NB", ALC663_ASUS_MODE1),*/ 17243 SND_PCI_QUIRK(0x1043, 0x19b3, "ASUS F7Z", ALC663_ASUS_MODE1), 17244 SND_PCI_QUIRK(0x1043, 0x19c3, "ASUS F5Z/F6x", ALC662_ASUS_MODE2), 17245 SND_PCI_QUIRK(0x1043, 0x19d3, "ASUS NB", ALC663_ASUS_M51VA), 17246 SND_PCI_QUIRK(0x1043, 0x19e3, "ASUS NB", ALC663_ASUS_MODE1), 17247 SND_PCI_QUIRK(0x1043, 0x19f3, "ASUS NB", ALC663_ASUS_MODE4), 17248 SND_PCI_QUIRK(0x1043, 0x8290, "ASUS P5GC-MX", ALC662_3ST_6ch_DIG), 17249 SND_PCI_QUIRK(0x1043, 0x82a1, "ASUS Eeepc", ALC662_ASUS_EEEPC_P701), 17250 SND_PCI_QUIRK(0x1043, 0x82d1, "ASUS Eeepc EP20", ALC662_ASUS_EEEPC_EP20), 17251 SND_PCI_QUIRK(0x105b, 0x0cd6, "Foxconn", ALC662_ECS), 17252 SND_PCI_QUIRK(0x105b, 0x0d47, "Foxconn 45CMX/45GMX/45CMX-K", 17253 ALC662_3ST_6ch_DIG), 17254 SND_PCI_QUIRK(0x1179, 0xff6e, "Toshiba NB200", ALC663_ASUS_MODE4), 17255 SND_PCI_QUIRK(0x144d, 0xca00, "Samsung NC10", ALC272_SAMSUNG_NC10), 17256 SND_PCI_QUIRK(0x1458, 0xa002, "Gigabyte 945GCM-S2L", 17257 ALC662_3ST_6ch_DIG), 17258 SND_PCI_QUIRK(0x1565, 0x820f, "Biostar TA780G M2+", ALC662_3ST_6ch_DIG), 17259 SND_PCI_QUIRK(0x1631, 0xc10c, "PB RS65", ALC663_ASUS_M51VA), 17260 SND_PCI_QUIRK(0x17aa, 0x101e, "Lenovo", ALC662_LENOVO_101E), 17261 SND_PCI_QUIRK(0x1849, 0x3662, "ASROCK K10N78FullHD-hSLI R3.0", 17262 ALC662_3ST_6ch_DIG), 17263 SND_PCI_QUIRK_MASK(0x1854, 0xf000, 0x2000, "ASUS H13-200x", 17264 ALC663_ASUS_H13), 17265 SND_PCI_QUIRK(0x8086, 0xd604, "Intel mobo", ALC662_3ST_2ch_DIG), 17266 {} 17267 }; 17268 17269 static struct alc_config_preset alc662_presets[] = { 17270 [ALC662_3ST_2ch_DIG] = { 17271 .mixers = { alc662_3ST_2ch_mixer }, 17272 .init_verbs = { alc662_init_verbs }, 17273 .num_dacs = ARRAY_SIZE(alc662_dac_nids), 17274 .dac_nids = alc662_dac_nids, 17275 .dig_out_nid = ALC662_DIGOUT_NID, 17276 .dig_in_nid = ALC662_DIGIN_NID, 17277 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes), 17278 .channel_mode = alc662_3ST_2ch_modes, 17279 .input_mux = &alc662_capture_source, 17280 }, 17281 [ALC662_3ST_6ch_DIG] = { 17282 .mixers = { alc662_3ST_6ch_mixer, alc662_chmode_mixer }, 17283 .init_verbs = { alc662_init_verbs }, 17284 .num_dacs = ARRAY_SIZE(alc662_dac_nids), 17285 .dac_nids = alc662_dac_nids, 17286 .dig_out_nid = ALC662_DIGOUT_NID, 17287 .dig_in_nid = ALC662_DIGIN_NID, 17288 .num_channel_mode = ARRAY_SIZE(alc662_3ST_6ch_modes), 17289 .channel_mode = alc662_3ST_6ch_modes, 17290 .need_dac_fix = 1, 17291 .input_mux = &alc662_capture_source, 17292 }, 17293 [ALC662_3ST_6ch] = { 17294 .mixers = { alc662_3ST_6ch_mixer, alc662_chmode_mixer }, 17295 .init_verbs = { alc662_init_verbs }, 17296 .num_dacs = ARRAY_SIZE(alc662_dac_nids), 17297 .dac_nids = alc662_dac_nids, 17298 .num_channel_mode = ARRAY_SIZE(alc662_3ST_6ch_modes), 17299 .channel_mode = alc662_3ST_6ch_modes, 17300 .need_dac_fix = 1, 17301 .input_mux = &alc662_capture_source, 17302 }, 17303 [ALC662_5ST_DIG] = { 17304 .mixers = { alc662_base_mixer, alc662_chmode_mixer }, 17305 .init_verbs = { alc662_init_verbs }, 17306 .num_dacs = ARRAY_SIZE(alc662_dac_nids), 17307 .dac_nids = alc662_dac_nids, 17308 .dig_out_nid = ALC662_DIGOUT_NID, 17309 .dig_in_nid = ALC662_DIGIN_NID, 17310 .num_channel_mode = ARRAY_SIZE(alc662_5stack_modes), 17311 .channel_mode = alc662_5stack_modes, 17312 .input_mux = &alc662_capture_source, 17313 }, 17314 [ALC662_LENOVO_101E] = { 17315 .mixers = { alc662_lenovo_101e_mixer }, 17316 .init_verbs = { alc662_init_verbs, alc662_sue_init_verbs }, 17317 .num_dacs = ARRAY_SIZE(alc662_dac_nids), 17318 .dac_nids = alc662_dac_nids, 17319 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes), 17320 .channel_mode = alc662_3ST_2ch_modes, 17321 .input_mux = &alc662_lenovo_101e_capture_source, 17322 .unsol_event = alc662_lenovo_101e_unsol_event, 17323 .init_hook = alc662_lenovo_101e_all_automute, 17324 }, 17325 [ALC662_ASUS_EEEPC_P701] = { 17326 .mixers = { alc662_eeepc_p701_mixer }, 17327 .init_verbs = { alc662_init_verbs, 17328 alc662_eeepc_sue_init_verbs }, 17329 .num_dacs = ARRAY_SIZE(alc662_dac_nids), 17330 .dac_nids = alc662_dac_nids, 17331 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes), 17332 .channel_mode = alc662_3ST_2ch_modes, 17333 .unsol_event = alc662_eeepc_unsol_event, 17334 .setup = alc662_eeepc_setup, 17335 .init_hook = alc662_eeepc_inithook, 17336 }, 17337 [ALC662_ASUS_EEEPC_EP20] = { 17338 .mixers = { alc662_eeepc_ep20_mixer, 17339 alc662_chmode_mixer }, 17340 .init_verbs = { alc662_init_verbs, 17341 alc662_eeepc_ep20_sue_init_verbs }, 17342 .num_dacs = ARRAY_SIZE(alc662_dac_nids), 17343 .dac_nids = alc662_dac_nids, 17344 .num_channel_mode = ARRAY_SIZE(alc662_3ST_6ch_modes), 17345 .channel_mode = alc662_3ST_6ch_modes, 17346 .input_mux = &alc662_lenovo_101e_capture_source, 17347 .unsol_event = alc662_eeepc_unsol_event, 17348 .setup = alc662_eeepc_ep20_setup, 17349 .init_hook = alc662_eeepc_ep20_inithook, 17350 }, 17351 [ALC662_ECS] = { 17352 .mixers = { alc662_ecs_mixer }, 17353 .init_verbs = { alc662_init_verbs, 17354 alc662_ecs_init_verbs }, 17355 .num_dacs = ARRAY_SIZE(alc662_dac_nids), 17356 .dac_nids = alc662_dac_nids, 17357 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes), 17358 .channel_mode = alc662_3ST_2ch_modes, 17359 .unsol_event = alc662_eeepc_unsol_event, 17360 .setup = alc662_eeepc_setup, 17361 .init_hook = alc662_eeepc_inithook, 17362 }, 17363 [ALC663_ASUS_M51VA] = { 17364 .mixers = { alc663_m51va_mixer }, 17365 .init_verbs = { alc662_init_verbs, alc663_m51va_init_verbs }, 17366 .num_dacs = ARRAY_SIZE(alc662_dac_nids), 17367 .dac_nids = alc662_dac_nids, 17368 .dig_out_nid = ALC662_DIGOUT_NID, 17369 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes), 17370 .channel_mode = alc662_3ST_2ch_modes, 17371 .unsol_event = alc663_m51va_unsol_event, 17372 .setup = alc663_m51va_setup, 17373 .init_hook = alc663_m51va_inithook, 17374 }, 17375 [ALC663_ASUS_G71V] = { 17376 .mixers = { alc663_g71v_mixer }, 17377 .init_verbs = { alc662_init_verbs, alc663_g71v_init_verbs }, 17378 .num_dacs = ARRAY_SIZE(alc662_dac_nids), 17379 .dac_nids = alc662_dac_nids, 17380 .dig_out_nid = ALC662_DIGOUT_NID, 17381 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes), 17382 .channel_mode = alc662_3ST_2ch_modes, 17383 .unsol_event = alc663_g71v_unsol_event, 17384 .setup = alc663_g71v_setup, 17385 .init_hook = alc663_g71v_inithook, 17386 }, 17387 [ALC663_ASUS_H13] = { 17388 .mixers = { alc663_m51va_mixer }, 17389 .init_verbs = { alc662_init_verbs, alc663_m51va_init_verbs }, 17390 .num_dacs = ARRAY_SIZE(alc662_dac_nids), 17391 .dac_nids = alc662_dac_nids, 17392 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes), 17393 .channel_mode = alc662_3ST_2ch_modes, 17394 .unsol_event = alc663_m51va_unsol_event, 17395 .init_hook = alc663_m51va_inithook, 17396 }, 17397 [ALC663_ASUS_G50V] = { 17398 .mixers = { alc663_g50v_mixer }, 17399 .init_verbs = { alc662_init_verbs, alc663_g50v_init_verbs }, 17400 .num_dacs = ARRAY_SIZE(alc662_dac_nids), 17401 .dac_nids = alc662_dac_nids, 17402 .dig_out_nid = ALC662_DIGOUT_NID, 17403 .num_channel_mode = ARRAY_SIZE(alc662_3ST_6ch_modes), 17404 .channel_mode = alc662_3ST_6ch_modes, 17405 .input_mux = &alc663_capture_source, 17406 .unsol_event = alc663_g50v_unsol_event, 17407 .setup = alc663_g50v_setup, 17408 .init_hook = alc663_g50v_inithook, 17409 }, 17410 [ALC663_ASUS_MODE1] = { 17411 .mixers = { alc663_m51va_mixer }, 17412 .cap_mixer = alc662_auto_capture_mixer, 17413 .init_verbs = { alc662_init_verbs, 17414 alc663_21jd_amic_init_verbs }, 17415 .num_dacs = ARRAY_SIZE(alc662_dac_nids), 17416 .hp_nid = 0x03, 17417 .dac_nids = alc662_dac_nids, 17418 .dig_out_nid = ALC662_DIGOUT_NID, 17419 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes), 17420 .channel_mode = alc662_3ST_2ch_modes, 17421 .unsol_event = alc663_mode1_unsol_event, 17422 .setup = alc663_mode1_setup, 17423 .init_hook = alc663_mode1_inithook, 17424 }, 17425 [ALC662_ASUS_MODE2] = { 17426 .mixers = { alc662_1bjd_mixer }, 17427 .cap_mixer = alc662_auto_capture_mixer, 17428 .init_verbs = { alc662_init_verbs, 17429 alc662_1bjd_amic_init_verbs }, 17430 .num_dacs = ARRAY_SIZE(alc662_dac_nids), 17431 .dac_nids = alc662_dac_nids, 17432 .dig_out_nid = ALC662_DIGOUT_NID, 17433 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes), 17434 .channel_mode = alc662_3ST_2ch_modes, 17435 .unsol_event = alc662_mode2_unsol_event, 17436 .setup = alc662_mode2_setup, 17437 .init_hook = alc662_mode2_inithook, 17438 }, 17439 [ALC663_ASUS_MODE3] = { 17440 .mixers = { alc663_two_hp_m1_mixer }, 17441 .cap_mixer = alc662_auto_capture_mixer, 17442 .init_verbs = { alc662_init_verbs, 17443 alc663_two_hp_amic_m1_init_verbs }, 17444 .num_dacs = ARRAY_SIZE(alc662_dac_nids), 17445 .hp_nid = 0x03, 17446 .dac_nids = alc662_dac_nids, 17447 .dig_out_nid = ALC662_DIGOUT_NID, 17448 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes), 17449 .channel_mode = alc662_3ST_2ch_modes, 17450 .unsol_event = alc663_mode3_unsol_event, 17451 .setup = alc663_mode3_setup, 17452 .init_hook = alc663_mode3_inithook, 17453 }, 17454 [ALC663_ASUS_MODE4] = { 17455 .mixers = { alc663_asus_21jd_clfe_mixer }, 17456 .cap_mixer = alc662_auto_capture_mixer, 17457 .init_verbs = { alc662_init_verbs, 17458 alc663_21jd_amic_init_verbs}, 17459 .num_dacs = ARRAY_SIZE(alc662_dac_nids), 17460 .hp_nid = 0x03, 17461 .dac_nids = alc662_dac_nids, 17462 .dig_out_nid = ALC662_DIGOUT_NID, 17463 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes), 17464 .channel_mode = alc662_3ST_2ch_modes, 17465 .unsol_event = alc663_mode4_unsol_event, 17466 .setup = alc663_mode4_setup, 17467 .init_hook = alc663_mode4_inithook, 17468 }, 17469 [ALC663_ASUS_MODE5] = { 17470 .mixers = { alc663_asus_15jd_clfe_mixer }, 17471 .cap_mixer = alc662_auto_capture_mixer, 17472 .init_verbs = { alc662_init_verbs, 17473 alc663_15jd_amic_init_verbs }, 17474 .num_dacs = ARRAY_SIZE(alc662_dac_nids), 17475 .hp_nid = 0x03, 17476 .dac_nids = alc662_dac_nids, 17477 .dig_out_nid = ALC662_DIGOUT_NID, 17478 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes), 17479 .channel_mode = alc662_3ST_2ch_modes, 17480 .unsol_event = alc663_mode5_unsol_event, 17481 .setup = alc663_mode5_setup, 17482 .init_hook = alc663_mode5_inithook, 17483 }, 17484 [ALC663_ASUS_MODE6] = { 17485 .mixers = { alc663_two_hp_m2_mixer }, 17486 .cap_mixer = alc662_auto_capture_mixer, 17487 .init_verbs = { alc662_init_verbs, 17488 alc663_two_hp_amic_m2_init_verbs }, 17489 .num_dacs = ARRAY_SIZE(alc662_dac_nids), 17490 .hp_nid = 0x03, 17491 .dac_nids = alc662_dac_nids, 17492 .dig_out_nid = ALC662_DIGOUT_NID, 17493 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes), 17494 .channel_mode = alc662_3ST_2ch_modes, 17495 .unsol_event = alc663_mode6_unsol_event, 17496 .setup = alc663_mode6_setup, 17497 .init_hook = alc663_mode6_inithook, 17498 }, 17499 [ALC663_ASUS_MODE7] = { 17500 .mixers = { alc663_mode7_mixer }, 17501 .cap_mixer = alc662_auto_capture_mixer, 17502 .init_verbs = { alc662_init_verbs, 17503 alc663_mode7_init_verbs }, 17504 .num_dacs = ARRAY_SIZE(alc662_dac_nids), 17505 .hp_nid = 0x03, 17506 .dac_nids = alc662_dac_nids, 17507 .dig_out_nid = ALC662_DIGOUT_NID, 17508 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes), 17509 .channel_mode = alc662_3ST_2ch_modes, 17510 .unsol_event = alc663_mode7_unsol_event, 17511 .setup = alc663_mode7_setup, 17512 .init_hook = alc663_mode7_inithook, 17513 }, 17514 [ALC663_ASUS_MODE8] = { 17515 .mixers = { alc663_mode8_mixer }, 17516 .cap_mixer = alc662_auto_capture_mixer, 17517 .init_verbs = { alc662_init_verbs, 17518 alc663_mode8_init_verbs }, 17519 .num_dacs = ARRAY_SIZE(alc662_dac_nids), 17520 .hp_nid = 0x03, 17521 .dac_nids = alc662_dac_nids, 17522 .dig_out_nid = ALC662_DIGOUT_NID, 17523 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes), 17524 .channel_mode = alc662_3ST_2ch_modes, 17525 .unsol_event = alc663_mode8_unsol_event, 17526 .setup = alc663_mode8_setup, 17527 .init_hook = alc663_mode8_inithook, 17528 }, 17529 [ALC272_DELL] = { 17530 .mixers = { alc663_m51va_mixer }, 17531 .cap_mixer = alc272_auto_capture_mixer, 17532 .init_verbs = { alc662_init_verbs, alc272_dell_init_verbs }, 17533 .num_dacs = ARRAY_SIZE(alc272_dac_nids), 17534 .dac_nids = alc662_dac_nids, 17535 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes), 17536 .adc_nids = alc272_adc_nids, 17537 .num_adc_nids = ARRAY_SIZE(alc272_adc_nids), 17538 .capsrc_nids = alc272_capsrc_nids, 17539 .channel_mode = alc662_3ST_2ch_modes, 17540 .unsol_event = alc663_m51va_unsol_event, 17541 .setup = alc663_m51va_setup, 17542 .init_hook = alc663_m51va_inithook, 17543 }, 17544 [ALC272_DELL_ZM1] = { 17545 .mixers = { alc663_m51va_mixer }, 17546 .cap_mixer = alc662_auto_capture_mixer, 17547 .init_verbs = { alc662_init_verbs, alc272_dell_zm1_init_verbs }, 17548 .num_dacs = ARRAY_SIZE(alc272_dac_nids), 17549 .dac_nids = alc662_dac_nids, 17550 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes), 17551 .adc_nids = alc662_adc_nids, 17552 .num_adc_nids = 1, 17553 .capsrc_nids = alc662_capsrc_nids, 17554 .channel_mode = alc662_3ST_2ch_modes, 17555 .unsol_event = alc663_m51va_unsol_event, 17556 .setup = alc663_m51va_setup, 17557 .init_hook = alc663_m51va_inithook, 17558 }, 17559 [ALC272_SAMSUNG_NC10] = { 17560 .mixers = { alc272_nc10_mixer }, 17561 .init_verbs = { alc662_init_verbs, 17562 alc663_21jd_amic_init_verbs }, 17563 .num_dacs = ARRAY_SIZE(alc272_dac_nids), 17564 .dac_nids = alc272_dac_nids, 17565 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes), 17566 .channel_mode = alc662_3ST_2ch_modes, 17567 /*.input_mux = &alc272_nc10_capture_source,*/ 17568 .unsol_event = alc663_mode4_unsol_event, 17569 .setup = alc663_mode4_setup, 17570 .init_hook = alc663_mode4_inithook, 17571 }, 17572 }; 17573 17574 17575 /* 17576 * BIOS auto configuration 17577 */ 17578 17579 /* convert from MIX nid to DAC */ 17580 static inline hda_nid_t alc662_mix_to_dac(hda_nid_t nid) 17581 { 17582 if (nid == 0x0f) 17583 return 0x02; 17584 else if (nid >= 0x0c && nid <= 0x0e) 17585 return nid - 0x0c + 0x02; 17586 else 17587 return 0; 17588 } 17589 17590 /* get MIX nid connected to the given pin targeted to DAC */ 17591 static hda_nid_t alc662_dac_to_mix(struct hda_codec *codec, hda_nid_t pin, 17592 hda_nid_t dac) 17593 { 17594 hda_nid_t mix[4]; 17595 int i, num; 17596 17597 num = snd_hda_get_connections(codec, pin, mix, ARRAY_SIZE(mix)); 17598 for (i = 0; i < num; i++) { 17599 if (alc662_mix_to_dac(mix[i]) == dac) 17600 return mix[i]; 17601 } 17602 return 0; 17603 } 17604 17605 /* look for an empty DAC slot */ 17606 static hda_nid_t alc662_look_for_dac(struct hda_codec *codec, hda_nid_t pin) 17607 { 17608 struct alc_spec *spec = codec->spec; 17609 hda_nid_t srcs[5]; 17610 int i, j, num; 17611 17612 num = snd_hda_get_connections(codec, pin, srcs, ARRAY_SIZE(srcs)); 17613 if (num < 0) 17614 return 0; 17615 for (i = 0; i < num; i++) { 17616 hda_nid_t nid = alc662_mix_to_dac(srcs[i]); 17617 if (!nid) 17618 continue; 17619 for (j = 0; j < spec->multiout.num_dacs; j++) 17620 if (spec->multiout.dac_nids[j] == nid) 17621 break; 17622 if (j >= spec->multiout.num_dacs) 17623 return nid; 17624 } 17625 return 0; 17626 } 17627 17628 /* fill in the dac_nids table from the parsed pin configuration */ 17629 static int alc662_auto_fill_dac_nids(struct hda_codec *codec, 17630 const struct auto_pin_cfg *cfg) 17631 { 17632 struct alc_spec *spec = codec->spec; 17633 int i; 17634 hda_nid_t dac; 17635 17636 spec->multiout.dac_nids = spec->private_dac_nids; 17637 for (i = 0; i < cfg->line_outs; i++) { 17638 dac = alc662_look_for_dac(codec, cfg->line_out_pins[i]); 17639 if (!dac) 17640 continue; 17641 spec->multiout.dac_nids[spec->multiout.num_dacs++] = dac; 17642 } 17643 return 0; 17644 } 17645 17646 static inline int alc662_add_vol_ctl(struct alc_spec *spec, const char *pfx, 17647 hda_nid_t nid, unsigned int chs) 17648 { 17649 return add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx, 17650 HDA_COMPOSE_AMP_VAL(nid, chs, 0, HDA_OUTPUT)); 17651 } 17652 17653 static inline int alc662_add_sw_ctl(struct alc_spec *spec, const char *pfx, 17654 hda_nid_t nid, unsigned int chs) 17655 { 17656 return add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, pfx, 17657 HDA_COMPOSE_AMP_VAL(nid, chs, 0, HDA_INPUT)); 17658 } 17659 17660 #define alc662_add_stereo_vol(spec, pfx, nid) \ 17661 alc662_add_vol_ctl(spec, pfx, nid, 3) 17662 #define alc662_add_stereo_sw(spec, pfx, nid) \ 17663 alc662_add_sw_ctl(spec, pfx, nid, 3) 17664 17665 /* add playback controls from the parsed DAC table */ 17666 static int alc662_auto_create_multi_out_ctls(struct hda_codec *codec, 17667 const struct auto_pin_cfg *cfg) 17668 { 17669 struct alc_spec *spec = codec->spec; 17670 static const char *chname[4] = { 17671 "Front", "Surround", NULL /*CLFE*/, "Side" 17672 }; 17673 hda_nid_t nid, mix; 17674 int i, err; 17675 17676 for (i = 0; i < cfg->line_outs; i++) { 17677 nid = spec->multiout.dac_nids[i]; 17678 if (!nid) 17679 continue; 17680 mix = alc662_dac_to_mix(codec, cfg->line_out_pins[i], nid); 17681 if (!mix) 17682 continue; 17683 if (i == 2) { 17684 /* Center/LFE */ 17685 err = alc662_add_vol_ctl(spec, "Center", nid, 1); 17686 if (err < 0) 17687 return err; 17688 err = alc662_add_vol_ctl(spec, "LFE", nid, 2); 17689 if (err < 0) 17690 return err; 17691 err = alc662_add_sw_ctl(spec, "Center", mix, 1); 17692 if (err < 0) 17693 return err; 17694 err = alc662_add_sw_ctl(spec, "LFE", mix, 2); 17695 if (err < 0) 17696 return err; 17697 } else { 17698 const char *pfx; 17699 if (cfg->line_outs == 1 && 17700 cfg->line_out_type == AUTO_PIN_SPEAKER_OUT) { 17701 if (cfg->hp_outs) 17702 pfx = "Speaker"; 17703 else 17704 pfx = "PCM"; 17705 } else 17706 pfx = chname[i]; 17707 err = alc662_add_vol_ctl(spec, pfx, nid, 3); 17708 if (err < 0) 17709 return err; 17710 if (cfg->line_outs == 1 && 17711 cfg->line_out_type == AUTO_PIN_SPEAKER_OUT) 17712 pfx = "Speaker"; 17713 err = alc662_add_sw_ctl(spec, pfx, mix, 3); 17714 if (err < 0) 17715 return err; 17716 } 17717 } 17718 return 0; 17719 } 17720 17721 /* add playback controls for speaker and HP outputs */ 17722 /* return DAC nid if any new DAC is assigned */ 17723 static int alc662_auto_create_extra_out(struct hda_codec *codec, hda_nid_t pin, 17724 const char *pfx) 17725 { 17726 struct alc_spec *spec = codec->spec; 17727 hda_nid_t nid, mix; 17728 int err; 17729 17730 if (!pin) 17731 return 0; 17732 nid = alc662_look_for_dac(codec, pin); 17733 if (!nid) { 17734 /* the corresponding DAC is already occupied */ 17735 if (!(get_wcaps(codec, pin) & AC_WCAP_OUT_AMP)) 17736 return 0; /* no way */ 17737 /* create a switch only */ 17738 return add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, pfx, 17739 HDA_COMPOSE_AMP_VAL(pin, 3, 0, HDA_OUTPUT)); 17740 } 17741 17742 mix = alc662_dac_to_mix(codec, pin, nid); 17743 if (!mix) 17744 return 0; 17745 err = alc662_add_vol_ctl(spec, pfx, nid, 3); 17746 if (err < 0) 17747 return err; 17748 err = alc662_add_sw_ctl(spec, pfx, mix, 3); 17749 if (err < 0) 17750 return err; 17751 return nid; 17752 } 17753 17754 /* create playback/capture controls for input pins */ 17755 #define alc662_auto_create_input_ctls \ 17756 alc882_auto_create_input_ctls 17757 17758 static void alc662_auto_set_output_and_unmute(struct hda_codec *codec, 17759 hda_nid_t nid, int pin_type, 17760 hda_nid_t dac) 17761 { 17762 int i, num; 17763 hda_nid_t srcs[4]; 17764 17765 alc_set_pin_output(codec, nid, pin_type); 17766 /* need the manual connection? */ 17767 num = snd_hda_get_connections(codec, nid, srcs, ARRAY_SIZE(srcs)); 17768 if (num <= 1) 17769 return; 17770 for (i = 0; i < num; i++) { 17771 if (alc662_mix_to_dac(srcs[i]) != dac) 17772 continue; 17773 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_CONNECT_SEL, i); 17774 return; 17775 } 17776 } 17777 17778 static void alc662_auto_init_multi_out(struct hda_codec *codec) 17779 { 17780 struct alc_spec *spec = codec->spec; 17781 int pin_type = get_pin_type(spec->autocfg.line_out_type); 17782 int i; 17783 17784 for (i = 0; i <= HDA_SIDE; i++) { 17785 hda_nid_t nid = spec->autocfg.line_out_pins[i]; 17786 if (nid) 17787 alc662_auto_set_output_and_unmute(codec, nid, pin_type, 17788 spec->multiout.dac_nids[i]); 17789 } 17790 } 17791 17792 static void alc662_auto_init_hp_out(struct hda_codec *codec) 17793 { 17794 struct alc_spec *spec = codec->spec; 17795 hda_nid_t pin; 17796 17797 pin = spec->autocfg.hp_pins[0]; 17798 if (pin) 17799 alc662_auto_set_output_and_unmute(codec, pin, PIN_HP, 17800 spec->multiout.hp_nid); 17801 pin = spec->autocfg.speaker_pins[0]; 17802 if (pin) 17803 alc662_auto_set_output_and_unmute(codec, pin, PIN_OUT, 17804 spec->multiout.extra_out_nid[0]); 17805 } 17806 17807 #define ALC662_PIN_CD_NID ALC880_PIN_CD_NID 17808 17809 static void alc662_auto_init_analog_input(struct hda_codec *codec) 17810 { 17811 struct alc_spec *spec = codec->spec; 17812 int i; 17813 17814 for (i = 0; i < AUTO_PIN_LAST; i++) { 17815 hda_nid_t nid = spec->autocfg.input_pins[i]; 17816 if (alc_is_input_pin(codec, nid)) { 17817 alc_set_input_pin(codec, nid, i); 17818 if (nid != ALC662_PIN_CD_NID && 17819 (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP)) 17820 snd_hda_codec_write(codec, nid, 0, 17821 AC_VERB_SET_AMP_GAIN_MUTE, 17822 AMP_OUT_MUTE); 17823 } 17824 } 17825 } 17826 17827 #define alc662_auto_init_input_src alc882_auto_init_input_src 17828 17829 static int alc662_parse_auto_config(struct hda_codec *codec) 17830 { 17831 struct alc_spec *spec = codec->spec; 17832 int err; 17833 static hda_nid_t alc662_ignore[] = { 0x1d, 0 }; 17834 17835 err = snd_hda_parse_pin_def_config(codec, &spec->autocfg, 17836 alc662_ignore); 17837 if (err < 0) 17838 return err; 17839 if (!spec->autocfg.line_outs) 17840 return 0; /* can't find valid BIOS pin config */ 17841 17842 err = alc662_auto_fill_dac_nids(codec, &spec->autocfg); 17843 if (err < 0) 17844 return err; 17845 err = alc662_auto_create_multi_out_ctls(codec, &spec->autocfg); 17846 if (err < 0) 17847 return err; 17848 err = alc662_auto_create_extra_out(codec, 17849 spec->autocfg.speaker_pins[0], 17850 "Speaker"); 17851 if (err < 0) 17852 return err; 17853 if (err) 17854 spec->multiout.extra_out_nid[0] = err; 17855 err = alc662_auto_create_extra_out(codec, spec->autocfg.hp_pins[0], 17856 "Headphone"); 17857 if (err < 0) 17858 return err; 17859 if (err) 17860 spec->multiout.hp_nid = err; 17861 err = alc662_auto_create_input_ctls(codec, &spec->autocfg); 17862 if (err < 0) 17863 return err; 17864 17865 spec->multiout.max_channels = spec->multiout.num_dacs * 2; 17866 17867 if (spec->autocfg.dig_outs) 17868 spec->multiout.dig_out_nid = ALC880_DIGOUT_NID; 17869 17870 if (spec->kctls.list) 17871 add_mixer(spec, spec->kctls.list); 17872 17873 spec->num_mux_defs = 1; 17874 spec->input_mux = &spec->private_imux[0]; 17875 17876 add_verb(spec, alc662_auto_init_verbs); 17877 if (codec->vendor_id == 0x10ec0663) 17878 add_verb(spec, alc663_auto_init_verbs); 17879 17880 err = alc_auto_add_mic_boost(codec); 17881 if (err < 0) 17882 return err; 17883 17884 alc_ssid_check(codec, 0x15, 0x1b, 0x14); 17885 17886 return 1; 17887 } 17888 17889 /* additional initialization for auto-configuration model */ 17890 static void alc662_auto_init(struct hda_codec *codec) 17891 { 17892 struct alc_spec *spec = codec->spec; 17893 alc662_auto_init_multi_out(codec); 17894 alc662_auto_init_hp_out(codec); 17895 alc662_auto_init_analog_input(codec); 17896 alc662_auto_init_input_src(codec); 17897 if (spec->unsol_event) 17898 alc_inithook(codec); 17899 } 17900 17901 static int patch_alc662(struct hda_codec *codec) 17902 { 17903 struct alc_spec *spec; 17904 int err, board_config; 17905 17906 spec = kzalloc(sizeof(*spec), GFP_KERNEL); 17907 if (!spec) 17908 return -ENOMEM; 17909 17910 codec->spec = spec; 17911 17912 alc_fix_pll_init(codec, 0x20, 0x04, 15); 17913 17914 if (alc_read_coef_idx(codec, 0)==0x8020){ 17915 kfree(codec->chip_name); 17916 codec->chip_name = kstrdup("ALC661", GFP_KERNEL); 17917 if (!codec->chip_name) { 17918 alc_free(codec); 17919 return -ENOMEM; 17920 } 17921 } 17922 17923 board_config = snd_hda_check_board_config(codec, ALC662_MODEL_LAST, 17924 alc662_models, 17925 alc662_cfg_tbl); 17926 if (board_config < 0) { 17927 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n", 17928 codec->chip_name); 17929 board_config = ALC662_AUTO; 17930 } 17931 17932 if (board_config == ALC662_AUTO) { 17933 /* automatic parse from the BIOS config */ 17934 err = alc662_parse_auto_config(codec); 17935 if (err < 0) { 17936 alc_free(codec); 17937 return err; 17938 } else if (!err) { 17939 printk(KERN_INFO 17940 "hda_codec: Cannot set up configuration " 17941 "from BIOS. Using base mode...\n"); 17942 board_config = ALC662_3ST_2ch_DIG; 17943 } 17944 } 17945 17946 err = snd_hda_attach_beep_device(codec, 0x1); 17947 if (err < 0) { 17948 alc_free(codec); 17949 return err; 17950 } 17951 17952 if (board_config != ALC662_AUTO) 17953 setup_preset(codec, &alc662_presets[board_config]); 17954 17955 spec->stream_analog_playback = &alc662_pcm_analog_playback; 17956 spec->stream_analog_capture = &alc662_pcm_analog_capture; 17957 17958 spec->stream_digital_playback = &alc662_pcm_digital_playback; 17959 spec->stream_digital_capture = &alc662_pcm_digital_capture; 17960 17961 if (!spec->adc_nids) { 17962 spec->adc_nids = alc662_adc_nids; 17963 spec->num_adc_nids = ARRAY_SIZE(alc662_adc_nids); 17964 } 17965 if (!spec->capsrc_nids) 17966 spec->capsrc_nids = alc662_capsrc_nids; 17967 17968 if (!spec->cap_mixer) 17969 set_capture_mixer(codec); 17970 if (codec->vendor_id == 0x10ec0662) 17971 set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT); 17972 else 17973 set_beep_amp(spec, 0x0b, 0x04, HDA_INPUT); 17974 17975 spec->vmaster_nid = 0x02; 17976 17977 codec->patch_ops = alc_patch_ops; 17978 if (board_config == ALC662_AUTO) 17979 spec->init_hook = alc662_auto_init; 17980 #ifdef CONFIG_SND_HDA_POWER_SAVE 17981 if (!spec->loopback.amplist) 17982 spec->loopback.amplist = alc662_loopbacks; 17983 #endif 17984 codec->proc_widget_hook = print_realtek_coef; 17985 17986 return 0; 17987 } 17988 17989 static int patch_alc888(struct hda_codec *codec) 17990 { 17991 if ((alc_read_coef_idx(codec, 0) & 0x00f0)==0x0030){ 17992 kfree(codec->chip_name); 17993 codec->chip_name = kstrdup("ALC888-VD", GFP_KERNEL); 17994 if (!codec->chip_name) { 17995 alc_free(codec); 17996 return -ENOMEM; 17997 } 17998 return patch_alc662(codec); 17999 } 18000 return patch_alc882(codec); 18001 } 18002 18003 /* 18004 * patch entries 18005 */ 18006 static struct hda_codec_preset snd_hda_preset_realtek[] = { 18007 { .id = 0x10ec0260, .name = "ALC260", .patch = patch_alc260 }, 18008 { .id = 0x10ec0262, .name = "ALC262", .patch = patch_alc262 }, 18009 { .id = 0x10ec0267, .name = "ALC267", .patch = patch_alc268 }, 18010 { .id = 0x10ec0268, .name = "ALC268", .patch = patch_alc268 }, 18011 { .id = 0x10ec0269, .name = "ALC269", .patch = patch_alc269 }, 18012 { .id = 0x10ec0270, .name = "ALC270", .patch = patch_alc269 }, 18013 { .id = 0x10ec0272, .name = "ALC272", .patch = patch_alc662 }, 18014 { .id = 0x10ec0275, .name = "ALC275", .patch = patch_alc269 }, 18015 { .id = 0x10ec0861, .rev = 0x100340, .name = "ALC660", 18016 .patch = patch_alc861 }, 18017 { .id = 0x10ec0660, .name = "ALC660-VD", .patch = patch_alc861vd }, 18018 { .id = 0x10ec0861, .name = "ALC861", .patch = patch_alc861 }, 18019 { .id = 0x10ec0862, .name = "ALC861-VD", .patch = patch_alc861vd }, 18020 { .id = 0x10ec0662, .rev = 0x100002, .name = "ALC662 rev2", 18021 .patch = patch_alc882 }, 18022 { .id = 0x10ec0662, .rev = 0x100101, .name = "ALC662 rev1", 18023 .patch = patch_alc662 }, 18024 { .id = 0x10ec0663, .name = "ALC663", .patch = patch_alc662 }, 18025 { .id = 0x10ec0880, .name = "ALC880", .patch = patch_alc880 }, 18026 { .id = 0x10ec0882, .name = "ALC882", .patch = patch_alc882 }, 18027 { .id = 0x10ec0883, .name = "ALC883", .patch = patch_alc882 }, 18028 { .id = 0x10ec0885, .rev = 0x100101, .name = "ALC889A", 18029 .patch = patch_alc882 }, 18030 { .id = 0x10ec0885, .rev = 0x100103, .name = "ALC889A", 18031 .patch = patch_alc882 }, 18032 { .id = 0x10ec0885, .name = "ALC885", .patch = patch_alc882 }, 18033 { .id = 0x10ec0887, .name = "ALC887", .patch = patch_alc882 }, 18034 { .id = 0x10ec0888, .rev = 0x100101, .name = "ALC1200", 18035 .patch = patch_alc882 }, 18036 { .id = 0x10ec0888, .name = "ALC888", .patch = patch_alc888 }, 18037 { .id = 0x10ec0889, .name = "ALC889", .patch = patch_alc882 }, 18038 { .id = 0x10ec0892, .name = "ALC892", .patch = patch_alc662 }, 18039 {} /* terminator */ 18040 }; 18041 18042 MODULE_ALIAS("snd-hda-codec-id:10ec*"); 18043 18044 MODULE_LICENSE("GPL"); 18045 MODULE_DESCRIPTION("Realtek HD-audio codec"); 18046 18047 static struct hda_codec_preset_list realtek_list = { 18048 .preset = snd_hda_preset_realtek, 18049 .owner = THIS_MODULE, 18050 }; 18051 18052 static int __init patch_realtek_init(void) 18053 { 18054 return snd_hda_add_codec_preset(&realtek_list); 18055 } 18056 18057 static void __exit patch_realtek_exit(void) 18058 { 18059 snd_hda_delete_codec_preset(&realtek_list); 18060 } 18061 18062 module_init(patch_realtek_init) 18063 module_exit(patch_realtek_exit) 18064