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_EEEPC_P703, 135 ALC269_ASUS_EEEPC_P901, 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 ALC272_DELL, 192 ALC272_DELL_ZM1, 193 ALC662_AUTO, 194 ALC662_MODEL_LAST, 195 }; 196 197 /* ALC882 models */ 198 enum { 199 ALC882_3ST_DIG, 200 ALC882_6ST_DIG, 201 ALC882_ARIMA, 202 ALC882_W2JC, 203 ALC882_TARGA, 204 ALC882_ASUS_A7J, 205 ALC882_ASUS_A7M, 206 ALC885_MACPRO, 207 ALC885_MBP3, 208 ALC885_IMAC24, 209 ALC882_AUTO, 210 ALC882_MODEL_LAST, 211 }; 212 213 /* ALC883 models */ 214 enum { 215 ALC883_3ST_2ch_DIG, 216 ALC883_3ST_6ch_DIG, 217 ALC883_3ST_6ch, 218 ALC883_6ST_DIG, 219 ALC883_TARGA_DIG, 220 ALC883_TARGA_2ch_DIG, 221 ALC883_ACER, 222 ALC883_ACER_ASPIRE, 223 ALC888_ACER_ASPIRE_4930G, 224 ALC883_MEDION, 225 ALC883_MEDION_MD2, 226 ALC883_LAPTOP_EAPD, 227 ALC883_LENOVO_101E_2ch, 228 ALC883_LENOVO_NB0763, 229 ALC888_LENOVO_MS7195_DIG, 230 ALC888_LENOVO_SKY, 231 ALC883_HAIER_W66, 232 ALC888_3ST_HP, 233 ALC888_6ST_DELL, 234 ALC883_MITAC, 235 ALC883_CLEVO_M720, 236 ALC883_FUJITSU_PI2515, 237 ALC888_FUJITSU_XA3530, 238 ALC883_3ST_6ch_INTEL, 239 ALC888_ASUS_M90V, 240 ALC888_ASUS_EEE1601, 241 ALC1200_ASUS_P5Q, 242 ALC883_AUTO, 243 ALC883_MODEL_LAST, 244 }; 245 246 /* styles of capture selection */ 247 enum { 248 CAPT_MUX = 0, /* only mux based */ 249 CAPT_MIX, /* only mixer based */ 250 CAPT_1MUX_MIX, /* first mux and other mixers */ 251 }; 252 253 /* for GPIO Poll */ 254 #define GPIO_MASK 0x03 255 256 struct alc_spec { 257 /* codec parameterization */ 258 struct snd_kcontrol_new *mixers[5]; /* mixer arrays */ 259 unsigned int num_mixers; 260 struct snd_kcontrol_new *cap_mixer; /* capture mixer */ 261 unsigned int beep_amp; /* beep amp value, set via set_beep_amp() */ 262 263 const struct hda_verb *init_verbs[5]; /* initialization verbs 264 * don't forget NULL 265 * termination! 266 */ 267 unsigned int num_init_verbs; 268 269 char *stream_name_analog; /* analog PCM stream */ 270 struct hda_pcm_stream *stream_analog_playback; 271 struct hda_pcm_stream *stream_analog_capture; 272 struct hda_pcm_stream *stream_analog_alt_playback; 273 struct hda_pcm_stream *stream_analog_alt_capture; 274 275 char *stream_name_digital; /* digital PCM stream */ 276 struct hda_pcm_stream *stream_digital_playback; 277 struct hda_pcm_stream *stream_digital_capture; 278 279 /* playback */ 280 struct hda_multi_out multiout; /* playback set-up 281 * max_channels, dacs must be set 282 * dig_out_nid and hp_nid are optional 283 */ 284 hda_nid_t alt_dac_nid; 285 hda_nid_t slave_dig_outs[3]; /* optional - for auto-parsing */ 286 int dig_out_type; 287 288 /* capture */ 289 unsigned int num_adc_nids; 290 hda_nid_t *adc_nids; 291 hda_nid_t *capsrc_nids; 292 hda_nid_t dig_in_nid; /* digital-in NID; optional */ 293 int capture_style; /* capture style (CAPT_*) */ 294 295 /* capture source */ 296 unsigned int num_mux_defs; 297 const struct hda_input_mux *input_mux; 298 unsigned int cur_mux[3]; 299 300 /* channel model */ 301 const struct hda_channel_mode *channel_mode; 302 int num_channel_mode; 303 int need_dac_fix; 304 305 /* PCM information */ 306 struct hda_pcm pcm_rec[3]; /* used in alc_build_pcms() */ 307 308 /* dynamic controls, init_verbs and input_mux */ 309 struct auto_pin_cfg autocfg; 310 struct snd_array kctls; 311 struct hda_input_mux private_imux[3]; 312 hda_nid_t private_dac_nids[AUTO_CFG_MAX_OUTS]; 313 314 /* hooks */ 315 void (*init_hook)(struct hda_codec *codec); 316 void (*unsol_event)(struct hda_codec *codec, unsigned int res); 317 318 /* for pin sensing */ 319 unsigned int sense_updated: 1; 320 unsigned int jack_present: 1; 321 unsigned int master_sw: 1; 322 323 /* other flags */ 324 unsigned int no_analog :1; /* digital I/O only */ 325 326 /* for virtual master */ 327 hda_nid_t vmaster_nid; 328 #ifdef CONFIG_SND_HDA_POWER_SAVE 329 struct hda_loopback_check loopback; 330 #endif 331 332 /* for PLL fix */ 333 hda_nid_t pll_nid; 334 unsigned int pll_coef_idx, pll_coef_bit; 335 }; 336 337 /* 338 * configuration template - to be copied to the spec instance 339 */ 340 struct alc_config_preset { 341 struct snd_kcontrol_new *mixers[5]; /* should be identical size 342 * with spec 343 */ 344 struct snd_kcontrol_new *cap_mixer; /* capture mixer */ 345 const struct hda_verb *init_verbs[5]; 346 unsigned int num_dacs; 347 hda_nid_t *dac_nids; 348 hda_nid_t dig_out_nid; /* optional */ 349 hda_nid_t hp_nid; /* optional */ 350 hda_nid_t *slave_dig_outs; 351 unsigned int num_adc_nids; 352 hda_nid_t *adc_nids; 353 hda_nid_t *capsrc_nids; 354 hda_nid_t dig_in_nid; 355 unsigned int num_channel_mode; 356 const struct hda_channel_mode *channel_mode; 357 int need_dac_fix; 358 unsigned int num_mux_defs; 359 const struct hda_input_mux *input_mux; 360 void (*unsol_event)(struct hda_codec *, unsigned int); 361 void (*init_hook)(struct hda_codec *); 362 #ifdef CONFIG_SND_HDA_POWER_SAVE 363 struct hda_amp_list *loopbacks; 364 #endif 365 }; 366 367 368 /* 369 * input MUX handling 370 */ 371 static int alc_mux_enum_info(struct snd_kcontrol *kcontrol, 372 struct snd_ctl_elem_info *uinfo) 373 { 374 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 375 struct alc_spec *spec = codec->spec; 376 unsigned int mux_idx = snd_ctl_get_ioffidx(kcontrol, &uinfo->id); 377 if (mux_idx >= spec->num_mux_defs) 378 mux_idx = 0; 379 return snd_hda_input_mux_info(&spec->input_mux[mux_idx], uinfo); 380 } 381 382 static int alc_mux_enum_get(struct snd_kcontrol *kcontrol, 383 struct snd_ctl_elem_value *ucontrol) 384 { 385 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 386 struct alc_spec *spec = codec->spec; 387 unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id); 388 389 ucontrol->value.enumerated.item[0] = spec->cur_mux[adc_idx]; 390 return 0; 391 } 392 393 static int alc_mux_enum_put(struct snd_kcontrol *kcontrol, 394 struct snd_ctl_elem_value *ucontrol) 395 { 396 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 397 struct alc_spec *spec = codec->spec; 398 const struct hda_input_mux *imux; 399 unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id); 400 unsigned int mux_idx; 401 hda_nid_t nid = spec->capsrc_nids ? 402 spec->capsrc_nids[adc_idx] : spec->adc_nids[adc_idx]; 403 404 mux_idx = adc_idx >= spec->num_mux_defs ? 0 : adc_idx; 405 imux = &spec->input_mux[mux_idx]; 406 407 if (spec->capture_style && 408 !(spec->capture_style == CAPT_1MUX_MIX && !adc_idx)) { 409 /* Matrix-mixer style (e.g. ALC882) */ 410 unsigned int *cur_val = &spec->cur_mux[adc_idx]; 411 unsigned int i, idx; 412 413 idx = ucontrol->value.enumerated.item[0]; 414 if (idx >= imux->num_items) 415 idx = imux->num_items - 1; 416 if (*cur_val == idx) 417 return 0; 418 for (i = 0; i < imux->num_items; i++) { 419 unsigned int v = (i == idx) ? 0 : HDA_AMP_MUTE; 420 snd_hda_codec_amp_stereo(codec, nid, HDA_INPUT, 421 imux->items[i].index, 422 HDA_AMP_MUTE, v); 423 } 424 *cur_val = idx; 425 return 1; 426 } else { 427 /* MUX style (e.g. ALC880) */ 428 return snd_hda_input_mux_put(codec, imux, ucontrol, nid, 429 &spec->cur_mux[adc_idx]); 430 } 431 } 432 433 /* 434 * channel mode setting 435 */ 436 static int alc_ch_mode_info(struct snd_kcontrol *kcontrol, 437 struct snd_ctl_elem_info *uinfo) 438 { 439 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 440 struct alc_spec *spec = codec->spec; 441 return snd_hda_ch_mode_info(codec, uinfo, spec->channel_mode, 442 spec->num_channel_mode); 443 } 444 445 static int alc_ch_mode_get(struct snd_kcontrol *kcontrol, 446 struct snd_ctl_elem_value *ucontrol) 447 { 448 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 449 struct alc_spec *spec = codec->spec; 450 return snd_hda_ch_mode_get(codec, ucontrol, spec->channel_mode, 451 spec->num_channel_mode, 452 spec->multiout.max_channels); 453 } 454 455 static int alc_ch_mode_put(struct snd_kcontrol *kcontrol, 456 struct snd_ctl_elem_value *ucontrol) 457 { 458 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 459 struct alc_spec *spec = codec->spec; 460 int err = snd_hda_ch_mode_put(codec, ucontrol, spec->channel_mode, 461 spec->num_channel_mode, 462 &spec->multiout.max_channels); 463 if (err >= 0 && spec->need_dac_fix) 464 spec->multiout.num_dacs = spec->multiout.max_channels / 2; 465 return err; 466 } 467 468 /* 469 * Control the mode of pin widget settings via the mixer. "pc" is used 470 * instead of "%" to avoid consequences of accidently treating the % as 471 * being part of a format specifier. Maximum allowed length of a value is 472 * 63 characters plus NULL terminator. 473 * 474 * Note: some retasking pin complexes seem to ignore requests for input 475 * states other than HiZ (eg: PIN_VREFxx) and revert to HiZ if any of these 476 * are requested. Therefore order this list so that this behaviour will not 477 * cause problems when mixer clients move through the enum sequentially. 478 * NIDs 0x0f and 0x10 have been observed to have this behaviour as of 479 * March 2006. 480 */ 481 static char *alc_pin_mode_names[] = { 482 "Mic 50pc bias", "Mic 80pc bias", 483 "Line in", "Line out", "Headphone out", 484 }; 485 static unsigned char alc_pin_mode_values[] = { 486 PIN_VREF50, PIN_VREF80, PIN_IN, PIN_OUT, PIN_HP, 487 }; 488 /* The control can present all 5 options, or it can limit the options based 489 * in the pin being assumed to be exclusively an input or an output pin. In 490 * addition, "input" pins may or may not process the mic bias option 491 * depending on actual widget capability (NIDs 0x0f and 0x10 don't seem to 492 * accept requests for bias as of chip versions up to March 2006) and/or 493 * wiring in the computer. 494 */ 495 #define ALC_PIN_DIR_IN 0x00 496 #define ALC_PIN_DIR_OUT 0x01 497 #define ALC_PIN_DIR_INOUT 0x02 498 #define ALC_PIN_DIR_IN_NOMICBIAS 0x03 499 #define ALC_PIN_DIR_INOUT_NOMICBIAS 0x04 500 501 /* Info about the pin modes supported by the different pin direction modes. 502 * For each direction the minimum and maximum values are given. 503 */ 504 static signed char alc_pin_mode_dir_info[5][2] = { 505 { 0, 2 }, /* ALC_PIN_DIR_IN */ 506 { 3, 4 }, /* ALC_PIN_DIR_OUT */ 507 { 0, 4 }, /* ALC_PIN_DIR_INOUT */ 508 { 2, 2 }, /* ALC_PIN_DIR_IN_NOMICBIAS */ 509 { 2, 4 }, /* ALC_PIN_DIR_INOUT_NOMICBIAS */ 510 }; 511 #define alc_pin_mode_min(_dir) (alc_pin_mode_dir_info[_dir][0]) 512 #define alc_pin_mode_max(_dir) (alc_pin_mode_dir_info[_dir][1]) 513 #define alc_pin_mode_n_items(_dir) \ 514 (alc_pin_mode_max(_dir)-alc_pin_mode_min(_dir)+1) 515 516 static int alc_pin_mode_info(struct snd_kcontrol *kcontrol, 517 struct snd_ctl_elem_info *uinfo) 518 { 519 unsigned int item_num = uinfo->value.enumerated.item; 520 unsigned char dir = (kcontrol->private_value >> 16) & 0xff; 521 522 uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; 523 uinfo->count = 1; 524 uinfo->value.enumerated.items = alc_pin_mode_n_items(dir); 525 526 if (item_num<alc_pin_mode_min(dir) || item_num>alc_pin_mode_max(dir)) 527 item_num = alc_pin_mode_min(dir); 528 strcpy(uinfo->value.enumerated.name, alc_pin_mode_names[item_num]); 529 return 0; 530 } 531 532 static int alc_pin_mode_get(struct snd_kcontrol *kcontrol, 533 struct snd_ctl_elem_value *ucontrol) 534 { 535 unsigned int i; 536 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 537 hda_nid_t nid = kcontrol->private_value & 0xffff; 538 unsigned char dir = (kcontrol->private_value >> 16) & 0xff; 539 long *valp = ucontrol->value.integer.value; 540 unsigned int pinctl = snd_hda_codec_read(codec, nid, 0, 541 AC_VERB_GET_PIN_WIDGET_CONTROL, 542 0x00); 543 544 /* Find enumerated value for current pinctl setting */ 545 i = alc_pin_mode_min(dir); 546 while (alc_pin_mode_values[i] != pinctl && i <= alc_pin_mode_max(dir)) 547 i++; 548 *valp = i <= alc_pin_mode_max(dir) ? i: alc_pin_mode_min(dir); 549 return 0; 550 } 551 552 static int alc_pin_mode_put(struct snd_kcontrol *kcontrol, 553 struct snd_ctl_elem_value *ucontrol) 554 { 555 signed int change; 556 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 557 hda_nid_t nid = kcontrol->private_value & 0xffff; 558 unsigned char dir = (kcontrol->private_value >> 16) & 0xff; 559 long val = *ucontrol->value.integer.value; 560 unsigned int pinctl = snd_hda_codec_read(codec, nid, 0, 561 AC_VERB_GET_PIN_WIDGET_CONTROL, 562 0x00); 563 564 if (val < alc_pin_mode_min(dir) || val > alc_pin_mode_max(dir)) 565 val = alc_pin_mode_min(dir); 566 567 change = pinctl != alc_pin_mode_values[val]; 568 if (change) { 569 /* Set pin mode to that requested */ 570 snd_hda_codec_write_cache(codec, nid, 0, 571 AC_VERB_SET_PIN_WIDGET_CONTROL, 572 alc_pin_mode_values[val]); 573 574 /* Also enable the retasking pin's input/output as required 575 * for the requested pin mode. Enum values of 2 or less are 576 * input modes. 577 * 578 * Dynamically switching the input/output buffers probably 579 * reduces noise slightly (particularly on input) so we'll 580 * do it. However, having both input and output buffers 581 * enabled simultaneously doesn't seem to be problematic if 582 * this turns out to be necessary in the future. 583 */ 584 if (val <= 2) { 585 snd_hda_codec_amp_stereo(codec, nid, HDA_OUTPUT, 0, 586 HDA_AMP_MUTE, HDA_AMP_MUTE); 587 snd_hda_codec_amp_stereo(codec, nid, HDA_INPUT, 0, 588 HDA_AMP_MUTE, 0); 589 } else { 590 snd_hda_codec_amp_stereo(codec, nid, HDA_INPUT, 0, 591 HDA_AMP_MUTE, HDA_AMP_MUTE); 592 snd_hda_codec_amp_stereo(codec, nid, HDA_OUTPUT, 0, 593 HDA_AMP_MUTE, 0); 594 } 595 } 596 return change; 597 } 598 599 #define ALC_PIN_MODE(xname, nid, dir) \ 600 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = 0, \ 601 .info = alc_pin_mode_info, \ 602 .get = alc_pin_mode_get, \ 603 .put = alc_pin_mode_put, \ 604 .private_value = nid | (dir<<16) } 605 606 /* A switch control for ALC260 GPIO pins. Multiple GPIOs can be ganged 607 * together using a mask with more than one bit set. This control is 608 * currently used only by the ALC260 test model. At this stage they are not 609 * needed for any "production" models. 610 */ 611 #ifdef CONFIG_SND_DEBUG 612 #define alc_gpio_data_info snd_ctl_boolean_mono_info 613 614 static int alc_gpio_data_get(struct snd_kcontrol *kcontrol, 615 struct snd_ctl_elem_value *ucontrol) 616 { 617 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 618 hda_nid_t nid = kcontrol->private_value & 0xffff; 619 unsigned char mask = (kcontrol->private_value >> 16) & 0xff; 620 long *valp = ucontrol->value.integer.value; 621 unsigned int val = snd_hda_codec_read(codec, nid, 0, 622 AC_VERB_GET_GPIO_DATA, 0x00); 623 624 *valp = (val & mask) != 0; 625 return 0; 626 } 627 static int alc_gpio_data_put(struct snd_kcontrol *kcontrol, 628 struct snd_ctl_elem_value *ucontrol) 629 { 630 signed int change; 631 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 632 hda_nid_t nid = kcontrol->private_value & 0xffff; 633 unsigned char mask = (kcontrol->private_value >> 16) & 0xff; 634 long val = *ucontrol->value.integer.value; 635 unsigned int gpio_data = snd_hda_codec_read(codec, nid, 0, 636 AC_VERB_GET_GPIO_DATA, 637 0x00); 638 639 /* Set/unset the masked GPIO bit(s) as needed */ 640 change = (val == 0 ? 0 : mask) != (gpio_data & mask); 641 if (val == 0) 642 gpio_data &= ~mask; 643 else 644 gpio_data |= mask; 645 snd_hda_codec_write_cache(codec, nid, 0, 646 AC_VERB_SET_GPIO_DATA, gpio_data); 647 648 return change; 649 } 650 #define ALC_GPIO_DATA_SWITCH(xname, nid, mask) \ 651 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = 0, \ 652 .info = alc_gpio_data_info, \ 653 .get = alc_gpio_data_get, \ 654 .put = alc_gpio_data_put, \ 655 .private_value = nid | (mask<<16) } 656 #endif /* CONFIG_SND_DEBUG */ 657 658 /* A switch control to allow the enabling of the digital IO pins on the 659 * ALC260. This is incredibly simplistic; the intention of this control is 660 * to provide something in the test model allowing digital outputs to be 661 * identified if present. If models are found which can utilise these 662 * outputs a more complete mixer control can be devised for those models if 663 * necessary. 664 */ 665 #ifdef CONFIG_SND_DEBUG 666 #define alc_spdif_ctrl_info snd_ctl_boolean_mono_info 667 668 static int alc_spdif_ctrl_get(struct snd_kcontrol *kcontrol, 669 struct snd_ctl_elem_value *ucontrol) 670 { 671 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 672 hda_nid_t nid = kcontrol->private_value & 0xffff; 673 unsigned char mask = (kcontrol->private_value >> 16) & 0xff; 674 long *valp = ucontrol->value.integer.value; 675 unsigned int val = snd_hda_codec_read(codec, nid, 0, 676 AC_VERB_GET_DIGI_CONVERT_1, 0x00); 677 678 *valp = (val & mask) != 0; 679 return 0; 680 } 681 static int alc_spdif_ctrl_put(struct snd_kcontrol *kcontrol, 682 struct snd_ctl_elem_value *ucontrol) 683 { 684 signed int change; 685 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 686 hda_nid_t nid = kcontrol->private_value & 0xffff; 687 unsigned char mask = (kcontrol->private_value >> 16) & 0xff; 688 long val = *ucontrol->value.integer.value; 689 unsigned int ctrl_data = snd_hda_codec_read(codec, nid, 0, 690 AC_VERB_GET_DIGI_CONVERT_1, 691 0x00); 692 693 /* Set/unset the masked control bit(s) as needed */ 694 change = (val == 0 ? 0 : mask) != (ctrl_data & mask); 695 if (val==0) 696 ctrl_data &= ~mask; 697 else 698 ctrl_data |= mask; 699 snd_hda_codec_write_cache(codec, nid, 0, AC_VERB_SET_DIGI_CONVERT_1, 700 ctrl_data); 701 702 return change; 703 } 704 #define ALC_SPDIF_CTRL_SWITCH(xname, nid, mask) \ 705 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = 0, \ 706 .info = alc_spdif_ctrl_info, \ 707 .get = alc_spdif_ctrl_get, \ 708 .put = alc_spdif_ctrl_put, \ 709 .private_value = nid | (mask<<16) } 710 #endif /* CONFIG_SND_DEBUG */ 711 712 /* A switch control to allow the enabling EAPD digital outputs on the ALC26x. 713 * Again, this is only used in the ALC26x test models to help identify when 714 * the EAPD line must be asserted for features to work. 715 */ 716 #ifdef CONFIG_SND_DEBUG 717 #define alc_eapd_ctrl_info snd_ctl_boolean_mono_info 718 719 static int alc_eapd_ctrl_get(struct snd_kcontrol *kcontrol, 720 struct snd_ctl_elem_value *ucontrol) 721 { 722 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 723 hda_nid_t nid = kcontrol->private_value & 0xffff; 724 unsigned char mask = (kcontrol->private_value >> 16) & 0xff; 725 long *valp = ucontrol->value.integer.value; 726 unsigned int val = snd_hda_codec_read(codec, nid, 0, 727 AC_VERB_GET_EAPD_BTLENABLE, 0x00); 728 729 *valp = (val & mask) != 0; 730 return 0; 731 } 732 733 static int alc_eapd_ctrl_put(struct snd_kcontrol *kcontrol, 734 struct snd_ctl_elem_value *ucontrol) 735 { 736 int change; 737 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 738 hda_nid_t nid = kcontrol->private_value & 0xffff; 739 unsigned char mask = (kcontrol->private_value >> 16) & 0xff; 740 long val = *ucontrol->value.integer.value; 741 unsigned int ctrl_data = snd_hda_codec_read(codec, nid, 0, 742 AC_VERB_GET_EAPD_BTLENABLE, 743 0x00); 744 745 /* Set/unset the masked control bit(s) as needed */ 746 change = (!val ? 0 : mask) != (ctrl_data & mask); 747 if (!val) 748 ctrl_data &= ~mask; 749 else 750 ctrl_data |= mask; 751 snd_hda_codec_write_cache(codec, nid, 0, AC_VERB_SET_EAPD_BTLENABLE, 752 ctrl_data); 753 754 return change; 755 } 756 757 #define ALC_EAPD_CTRL_SWITCH(xname, nid, mask) \ 758 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = 0, \ 759 .info = alc_eapd_ctrl_info, \ 760 .get = alc_eapd_ctrl_get, \ 761 .put = alc_eapd_ctrl_put, \ 762 .private_value = nid | (mask<<16) } 763 #endif /* CONFIG_SND_DEBUG */ 764 765 /* 766 * set up the input pin config (depending on the given auto-pin type) 767 */ 768 static void alc_set_input_pin(struct hda_codec *codec, hda_nid_t nid, 769 int auto_pin_type) 770 { 771 unsigned int val = PIN_IN; 772 773 if (auto_pin_type <= AUTO_PIN_FRONT_MIC) { 774 unsigned int pincap; 775 pincap = snd_hda_query_pin_caps(codec, nid); 776 pincap = (pincap & AC_PINCAP_VREF) >> AC_PINCAP_VREF_SHIFT; 777 if (pincap & AC_PINCAP_VREF_80) 778 val = PIN_VREF80; 779 } 780 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_PIN_WIDGET_CONTROL, val); 781 } 782 783 /* 784 */ 785 static void add_mixer(struct alc_spec *spec, struct snd_kcontrol_new *mix) 786 { 787 if (snd_BUG_ON(spec->num_mixers >= ARRAY_SIZE(spec->mixers))) 788 return; 789 spec->mixers[spec->num_mixers++] = mix; 790 } 791 792 static void add_verb(struct alc_spec *spec, const struct hda_verb *verb) 793 { 794 if (snd_BUG_ON(spec->num_init_verbs >= ARRAY_SIZE(spec->init_verbs))) 795 return; 796 spec->init_verbs[spec->num_init_verbs++] = verb; 797 } 798 799 #ifdef CONFIG_PROC_FS 800 /* 801 * hook for proc 802 */ 803 static void print_realtek_coef(struct snd_info_buffer *buffer, 804 struct hda_codec *codec, hda_nid_t nid) 805 { 806 int coeff; 807 808 if (nid != 0x20) 809 return; 810 coeff = snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_PROC_COEF, 0); 811 snd_iprintf(buffer, " Processing Coefficient: 0x%02x\n", coeff); 812 coeff = snd_hda_codec_read(codec, nid, 0, 813 AC_VERB_GET_COEF_INDEX, 0); 814 snd_iprintf(buffer, " Coefficient Index: 0x%02x\n", coeff); 815 } 816 #else 817 #define print_realtek_coef NULL 818 #endif 819 820 /* 821 * set up from the preset table 822 */ 823 static void setup_preset(struct alc_spec *spec, 824 const struct alc_config_preset *preset) 825 { 826 int i; 827 828 for (i = 0; i < ARRAY_SIZE(preset->mixers) && preset->mixers[i]; i++) 829 add_mixer(spec, preset->mixers[i]); 830 spec->cap_mixer = preset->cap_mixer; 831 for (i = 0; i < ARRAY_SIZE(preset->init_verbs) && preset->init_verbs[i]; 832 i++) 833 add_verb(spec, preset->init_verbs[i]); 834 835 spec->channel_mode = preset->channel_mode; 836 spec->num_channel_mode = preset->num_channel_mode; 837 spec->need_dac_fix = preset->need_dac_fix; 838 839 spec->multiout.max_channels = spec->channel_mode[0].channels; 840 841 spec->multiout.num_dacs = preset->num_dacs; 842 spec->multiout.dac_nids = preset->dac_nids; 843 spec->multiout.dig_out_nid = preset->dig_out_nid; 844 spec->multiout.slave_dig_outs = preset->slave_dig_outs; 845 spec->multiout.hp_nid = preset->hp_nid; 846 847 spec->num_mux_defs = preset->num_mux_defs; 848 if (!spec->num_mux_defs) 849 spec->num_mux_defs = 1; 850 spec->input_mux = preset->input_mux; 851 852 spec->num_adc_nids = preset->num_adc_nids; 853 spec->adc_nids = preset->adc_nids; 854 spec->capsrc_nids = preset->capsrc_nids; 855 spec->dig_in_nid = preset->dig_in_nid; 856 857 spec->unsol_event = preset->unsol_event; 858 spec->init_hook = preset->init_hook; 859 #ifdef CONFIG_SND_HDA_POWER_SAVE 860 spec->loopback.amplist = preset->loopbacks; 861 #endif 862 } 863 864 /* Enable GPIO mask and set output */ 865 static struct hda_verb alc_gpio1_init_verbs[] = { 866 {0x01, AC_VERB_SET_GPIO_MASK, 0x01}, 867 {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01}, 868 {0x01, AC_VERB_SET_GPIO_DATA, 0x01}, 869 { } 870 }; 871 872 static struct hda_verb alc_gpio2_init_verbs[] = { 873 {0x01, AC_VERB_SET_GPIO_MASK, 0x02}, 874 {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x02}, 875 {0x01, AC_VERB_SET_GPIO_DATA, 0x02}, 876 { } 877 }; 878 879 static struct hda_verb alc_gpio3_init_verbs[] = { 880 {0x01, AC_VERB_SET_GPIO_MASK, 0x03}, 881 {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x03}, 882 {0x01, AC_VERB_SET_GPIO_DATA, 0x03}, 883 { } 884 }; 885 886 /* 887 * Fix hardware PLL issue 888 * On some codecs, the analog PLL gating control must be off while 889 * the default value is 1. 890 */ 891 static void alc_fix_pll(struct hda_codec *codec) 892 { 893 struct alc_spec *spec = codec->spec; 894 unsigned int val; 895 896 if (!spec->pll_nid) 897 return; 898 snd_hda_codec_write(codec, spec->pll_nid, 0, AC_VERB_SET_COEF_INDEX, 899 spec->pll_coef_idx); 900 val = snd_hda_codec_read(codec, spec->pll_nid, 0, 901 AC_VERB_GET_PROC_COEF, 0); 902 snd_hda_codec_write(codec, spec->pll_nid, 0, AC_VERB_SET_COEF_INDEX, 903 spec->pll_coef_idx); 904 snd_hda_codec_write(codec, spec->pll_nid, 0, AC_VERB_SET_PROC_COEF, 905 val & ~(1 << spec->pll_coef_bit)); 906 } 907 908 static void alc_fix_pll_init(struct hda_codec *codec, hda_nid_t nid, 909 unsigned int coef_idx, unsigned int coef_bit) 910 { 911 struct alc_spec *spec = codec->spec; 912 spec->pll_nid = nid; 913 spec->pll_coef_idx = coef_idx; 914 spec->pll_coef_bit = coef_bit; 915 alc_fix_pll(codec); 916 } 917 918 static void alc_sku_automute(struct hda_codec *codec) 919 { 920 struct alc_spec *spec = codec->spec; 921 unsigned int present; 922 unsigned int hp_nid = spec->autocfg.hp_pins[0]; 923 unsigned int sp_nid = spec->autocfg.speaker_pins[0]; 924 925 /* need to execute and sync at first */ 926 snd_hda_codec_read(codec, hp_nid, 0, AC_VERB_SET_PIN_SENSE, 0); 927 present = snd_hda_codec_read(codec, hp_nid, 0, 928 AC_VERB_GET_PIN_SENSE, 0); 929 spec->jack_present = (present & 0x80000000) != 0; 930 snd_hda_codec_write(codec, sp_nid, 0, AC_VERB_SET_PIN_WIDGET_CONTROL, 931 spec->jack_present ? 0 : PIN_OUT); 932 } 933 934 #if 0 /* it's broken in some acses -- temporarily disabled */ 935 static void alc_mic_automute(struct hda_codec *codec) 936 { 937 struct alc_spec *spec = codec->spec; 938 unsigned int present; 939 unsigned int mic_nid = spec->autocfg.input_pins[AUTO_PIN_MIC]; 940 unsigned int fmic_nid = spec->autocfg.input_pins[AUTO_PIN_FRONT_MIC]; 941 unsigned int mix_nid = spec->capsrc_nids[0]; 942 unsigned int capsrc_idx_mic, capsrc_idx_fmic; 943 944 capsrc_idx_mic = mic_nid - 0x18; 945 capsrc_idx_fmic = fmic_nid - 0x18; 946 present = snd_hda_codec_read(codec, mic_nid, 0, 947 AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; 948 snd_hda_codec_write(codec, mix_nid, 0, AC_VERB_SET_AMP_GAIN_MUTE, 949 0x7000 | (capsrc_idx_mic << 8) | (present ? 0 : 0x80)); 950 snd_hda_codec_write(codec, mix_nid, 0, AC_VERB_SET_AMP_GAIN_MUTE, 951 0x7000 | (capsrc_idx_fmic << 8) | (present ? 0x80 : 0)); 952 snd_hda_codec_amp_stereo(codec, 0x0b, HDA_INPUT, capsrc_idx_fmic, 953 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0); 954 } 955 #else 956 #define alc_mic_automute(codec) do {} while(0) /* NOP */ 957 #endif /* disabled */ 958 959 /* unsolicited event for HP jack sensing */ 960 static void alc_sku_unsol_event(struct hda_codec *codec, unsigned int res) 961 { 962 if (codec->vendor_id == 0x10ec0880) 963 res >>= 28; 964 else 965 res >>= 26; 966 if (res == ALC880_HP_EVENT) 967 alc_sku_automute(codec); 968 969 if (res == ALC880_MIC_EVENT) 970 alc_mic_automute(codec); 971 } 972 973 static void alc_inithook(struct hda_codec *codec) 974 { 975 alc_sku_automute(codec); 976 alc_mic_automute(codec); 977 } 978 979 /* additional initialization for ALC888 variants */ 980 static void alc888_coef_init(struct hda_codec *codec) 981 { 982 unsigned int tmp; 983 984 snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 0); 985 tmp = snd_hda_codec_read(codec, 0x20, 0, AC_VERB_GET_PROC_COEF, 0); 986 snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 7); 987 if ((tmp & 0xf0) == 0x20) 988 /* alc888S-VC */ 989 snd_hda_codec_read(codec, 0x20, 0, 990 AC_VERB_SET_PROC_COEF, 0x830); 991 else 992 /* alc888-VB */ 993 snd_hda_codec_read(codec, 0x20, 0, 994 AC_VERB_SET_PROC_COEF, 0x3030); 995 } 996 997 /* 32-bit subsystem ID for BIOS loading in HD Audio codec. 998 * 31 ~ 16 : Manufacture ID 999 * 15 ~ 8 : SKU ID 1000 * 7 ~ 0 : Assembly ID 1001 * port-A --> pin 39/41, port-E --> pin 14/15, port-D --> pin 35/36 1002 */ 1003 static void alc_subsystem_id(struct hda_codec *codec, 1004 unsigned int porta, unsigned int porte, 1005 unsigned int portd) 1006 { 1007 unsigned int ass, tmp, i; 1008 unsigned nid; 1009 struct alc_spec *spec = codec->spec; 1010 1011 ass = codec->subsystem_id & 0xffff; 1012 if ((ass != codec->bus->pci->subsystem_device) && (ass & 1)) 1013 goto do_sku; 1014 1015 /* 1016 * 31~30 : port conetcivity 1017 * 29~21 : reserve 1018 * 20 : PCBEEP input 1019 * 19~16 : Check sum (15:1) 1020 * 15~1 : Custom 1021 * 0 : override 1022 */ 1023 nid = 0x1d; 1024 if (codec->vendor_id == 0x10ec0260) 1025 nid = 0x17; 1026 ass = snd_hda_codec_get_pincfg(codec, nid); 1027 if (!(ass & 1) && !(ass & 0x100000)) 1028 return; 1029 if ((ass >> 30) != 1) /* no physical connection */ 1030 return; 1031 1032 /* check sum */ 1033 tmp = 0; 1034 for (i = 1; i < 16; i++) { 1035 if ((ass >> i) & 1) 1036 tmp++; 1037 } 1038 if (((ass >> 16) & 0xf) != tmp) 1039 return; 1040 do_sku: 1041 /* 1042 * 0 : override 1043 * 1 : Swap Jack 1044 * 2 : 0 --> Desktop, 1 --> Laptop 1045 * 3~5 : External Amplifier control 1046 * 7~6 : Reserved 1047 */ 1048 tmp = (ass & 0x38) >> 3; /* external Amp control */ 1049 switch (tmp) { 1050 case 1: 1051 snd_hda_sequence_write(codec, alc_gpio1_init_verbs); 1052 break; 1053 case 3: 1054 snd_hda_sequence_write(codec, alc_gpio2_init_verbs); 1055 break; 1056 case 7: 1057 snd_hda_sequence_write(codec, alc_gpio3_init_verbs); 1058 break; 1059 case 5: /* set EAPD output high */ 1060 switch (codec->vendor_id) { 1061 case 0x10ec0260: 1062 snd_hda_codec_write(codec, 0x0f, 0, 1063 AC_VERB_SET_EAPD_BTLENABLE, 2); 1064 snd_hda_codec_write(codec, 0x10, 0, 1065 AC_VERB_SET_EAPD_BTLENABLE, 2); 1066 break; 1067 case 0x10ec0262: 1068 case 0x10ec0267: 1069 case 0x10ec0268: 1070 case 0x10ec0269: 1071 case 0x10ec0272: 1072 case 0x10ec0660: 1073 case 0x10ec0662: 1074 case 0x10ec0663: 1075 case 0x10ec0862: 1076 case 0x10ec0889: 1077 snd_hda_codec_write(codec, 0x14, 0, 1078 AC_VERB_SET_EAPD_BTLENABLE, 2); 1079 snd_hda_codec_write(codec, 0x15, 0, 1080 AC_VERB_SET_EAPD_BTLENABLE, 2); 1081 break; 1082 } 1083 switch (codec->vendor_id) { 1084 case 0x10ec0260: 1085 snd_hda_codec_write(codec, 0x1a, 0, 1086 AC_VERB_SET_COEF_INDEX, 7); 1087 tmp = snd_hda_codec_read(codec, 0x1a, 0, 1088 AC_VERB_GET_PROC_COEF, 0); 1089 snd_hda_codec_write(codec, 0x1a, 0, 1090 AC_VERB_SET_COEF_INDEX, 7); 1091 snd_hda_codec_write(codec, 0x1a, 0, 1092 AC_VERB_SET_PROC_COEF, 1093 tmp | 0x2010); 1094 break; 1095 case 0x10ec0262: 1096 case 0x10ec0880: 1097 case 0x10ec0882: 1098 case 0x10ec0883: 1099 case 0x10ec0885: 1100 case 0x10ec0887: 1101 case 0x10ec0889: 1102 snd_hda_codec_write(codec, 0x20, 0, 1103 AC_VERB_SET_COEF_INDEX, 7); 1104 tmp = snd_hda_codec_read(codec, 0x20, 0, 1105 AC_VERB_GET_PROC_COEF, 0); 1106 snd_hda_codec_write(codec, 0x20, 0, 1107 AC_VERB_SET_COEF_INDEX, 7); 1108 snd_hda_codec_write(codec, 0x20, 0, 1109 AC_VERB_SET_PROC_COEF, 1110 tmp | 0x2010); 1111 break; 1112 case 0x10ec0888: 1113 /*alc888_coef_init(codec);*/ /* called in alc_init() */ 1114 break; 1115 case 0x10ec0267: 1116 case 0x10ec0268: 1117 snd_hda_codec_write(codec, 0x20, 0, 1118 AC_VERB_SET_COEF_INDEX, 7); 1119 tmp = snd_hda_codec_read(codec, 0x20, 0, 1120 AC_VERB_GET_PROC_COEF, 0); 1121 snd_hda_codec_write(codec, 0x20, 0, 1122 AC_VERB_SET_COEF_INDEX, 7); 1123 snd_hda_codec_write(codec, 0x20, 0, 1124 AC_VERB_SET_PROC_COEF, 1125 tmp | 0x3000); 1126 break; 1127 } 1128 default: 1129 break; 1130 } 1131 1132 /* is laptop or Desktop and enable the function "Mute internal speaker 1133 * when the external headphone out jack is plugged" 1134 */ 1135 if (!(ass & 0x8000)) 1136 return; 1137 /* 1138 * 10~8 : Jack location 1139 * 12~11: Headphone out -> 00: PortA, 01: PortE, 02: PortD, 03: Resvered 1140 * 14~13: Resvered 1141 * 15 : 1 --> enable the function "Mute internal speaker 1142 * when the external headphone out jack is plugged" 1143 */ 1144 if (!spec->autocfg.speaker_pins[0]) { 1145 if (spec->autocfg.line_out_pins[0]) 1146 spec->autocfg.speaker_pins[0] = 1147 spec->autocfg.line_out_pins[0]; 1148 else 1149 return; 1150 } 1151 1152 if (!spec->autocfg.hp_pins[0]) { 1153 tmp = (ass >> 11) & 0x3; /* HP to chassis */ 1154 if (tmp == 0) 1155 spec->autocfg.hp_pins[0] = porta; 1156 else if (tmp == 1) 1157 spec->autocfg.hp_pins[0] = porte; 1158 else if (tmp == 2) 1159 spec->autocfg.hp_pins[0] = portd; 1160 else 1161 return; 1162 } 1163 if (spec->autocfg.hp_pins[0]) 1164 snd_hda_codec_write(codec, spec->autocfg.hp_pins[0], 0, 1165 AC_VERB_SET_UNSOLICITED_ENABLE, 1166 AC_USRSP_EN | ALC880_HP_EVENT); 1167 1168 #if 0 /* it's broken in some acses -- temporarily disabled */ 1169 if (spec->autocfg.input_pins[AUTO_PIN_MIC] && 1170 spec->autocfg.input_pins[AUTO_PIN_FRONT_MIC]) 1171 snd_hda_codec_write(codec, 1172 spec->autocfg.input_pins[AUTO_PIN_MIC], 0, 1173 AC_VERB_SET_UNSOLICITED_ENABLE, 1174 AC_USRSP_EN | ALC880_MIC_EVENT); 1175 #endif /* disabled */ 1176 1177 spec->unsol_event = alc_sku_unsol_event; 1178 } 1179 1180 /* 1181 * Fix-up pin default configurations 1182 */ 1183 1184 struct alc_pincfg { 1185 hda_nid_t nid; 1186 u32 val; 1187 }; 1188 1189 static void alc_fix_pincfg(struct hda_codec *codec, 1190 const struct snd_pci_quirk *quirk, 1191 const struct alc_pincfg **pinfix) 1192 { 1193 const struct alc_pincfg *cfg; 1194 1195 quirk = snd_pci_quirk_lookup(codec->bus->pci, quirk); 1196 if (!quirk) 1197 return; 1198 1199 cfg = pinfix[quirk->value]; 1200 for (; cfg->nid; cfg++) 1201 snd_hda_codec_set_pincfg(codec, cfg->nid, cfg->val); 1202 } 1203 1204 /* 1205 * ALC888 1206 */ 1207 1208 /* 1209 * 2ch mode 1210 */ 1211 static struct hda_verb alc888_4ST_ch2_intel_init[] = { 1212 /* Mic-in jack as mic in */ 1213 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, 1214 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE }, 1215 /* Line-in jack as Line in */ 1216 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN }, 1217 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE }, 1218 /* Line-Out as Front */ 1219 { 0x17, AC_VERB_SET_CONNECT_SEL, 0x00}, 1220 { } /* end */ 1221 }; 1222 1223 /* 1224 * 4ch mode 1225 */ 1226 static struct hda_verb alc888_4ST_ch4_intel_init[] = { 1227 /* Mic-in jack as mic in */ 1228 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, 1229 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE }, 1230 /* Line-in jack as Surround */ 1231 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 1232 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 1233 /* Line-Out as Front */ 1234 { 0x17, AC_VERB_SET_CONNECT_SEL, 0x00}, 1235 { } /* end */ 1236 }; 1237 1238 /* 1239 * 6ch mode 1240 */ 1241 static struct hda_verb alc888_4ST_ch6_intel_init[] = { 1242 /* Mic-in jack as CLFE */ 1243 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 1244 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 1245 /* Line-in jack as Surround */ 1246 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 1247 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 1248 /* Line-Out as CLFE (workaround because Mic-in is not loud enough) */ 1249 { 0x17, AC_VERB_SET_CONNECT_SEL, 0x03}, 1250 { } /* end */ 1251 }; 1252 1253 /* 1254 * 8ch mode 1255 */ 1256 static struct hda_verb alc888_4ST_ch8_intel_init[] = { 1257 /* Mic-in jack as CLFE */ 1258 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 1259 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 1260 /* Line-in jack as Surround */ 1261 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 1262 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 1263 /* Line-Out as Side */ 1264 { 0x17, AC_VERB_SET_CONNECT_SEL, 0x03}, 1265 { } /* end */ 1266 }; 1267 1268 static struct hda_channel_mode alc888_4ST_8ch_intel_modes[4] = { 1269 { 2, alc888_4ST_ch2_intel_init }, 1270 { 4, alc888_4ST_ch4_intel_init }, 1271 { 6, alc888_4ST_ch6_intel_init }, 1272 { 8, alc888_4ST_ch8_intel_init }, 1273 }; 1274 1275 /* 1276 * ALC888 Fujitsu Siemens Amillo xa3530 1277 */ 1278 1279 static struct hda_verb alc888_fujitsu_xa3530_verbs[] = { 1280 /* Front Mic: set to PIN_IN (empty by default) */ 1281 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 1282 /* Connect Internal HP to Front */ 1283 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 1284 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 1285 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, 1286 /* Connect Bass HP to Front */ 1287 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 1288 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 1289 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, 1290 /* Connect Line-Out side jack (SPDIF) to Side */ 1291 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 1292 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 1293 {0x17, AC_VERB_SET_CONNECT_SEL, 0x03}, 1294 /* Connect Mic jack to CLFE */ 1295 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 1296 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 1297 {0x18, AC_VERB_SET_CONNECT_SEL, 0x02}, 1298 /* Connect Line-in jack to Surround */ 1299 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 1300 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 1301 {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01}, 1302 /* Connect HP out jack to Front */ 1303 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 1304 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 1305 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, 1306 /* Enable unsolicited event for HP jack and Line-out jack */ 1307 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, 1308 {0x17, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, 1309 {} 1310 }; 1311 1312 static void alc888_fujitsu_xa3530_automute(struct hda_codec *codec) 1313 { 1314 unsigned int present; 1315 unsigned int bits; 1316 /* Line out presence */ 1317 present = snd_hda_codec_read(codec, 0x17, 0, 1318 AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; 1319 /* HP out presence */ 1320 present = present || snd_hda_codec_read(codec, 0x1b, 0, 1321 AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; 1322 bits = present ? HDA_AMP_MUTE : 0; 1323 /* Toggle internal speakers muting */ 1324 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0, 1325 HDA_AMP_MUTE, bits); 1326 /* Toggle internal bass muting */ 1327 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0, 1328 HDA_AMP_MUTE, bits); 1329 } 1330 1331 static void alc888_fujitsu_xa3530_unsol_event(struct hda_codec *codec, 1332 unsigned int res) 1333 { 1334 if (res >> 26 == ALC880_HP_EVENT) 1335 alc888_fujitsu_xa3530_automute(codec); 1336 } 1337 1338 1339 /* 1340 * ALC888 Acer Aspire 4930G model 1341 */ 1342 1343 static struct hda_verb alc888_acer_aspire_4930g_verbs[] = { 1344 /* Front Mic: set to PIN_IN (empty by default) */ 1345 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 1346 /* Unselect Front Mic by default in input mixer 3 */ 1347 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0xb)}, 1348 /* Enable unsolicited event for HP jack */ 1349 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, 1350 /* Connect Internal HP to front */ 1351 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 1352 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 1353 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, 1354 /* Connect HP out to front */ 1355 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 1356 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 1357 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, 1358 { } 1359 }; 1360 1361 static struct hda_input_mux alc888_2_capture_sources[2] = { 1362 /* Front mic only available on one ADC */ 1363 { 1364 .num_items = 4, 1365 .items = { 1366 { "Mic", 0x0 }, 1367 { "Line", 0x2 }, 1368 { "CD", 0x4 }, 1369 { "Front Mic", 0xb }, 1370 }, 1371 }, 1372 { 1373 .num_items = 3, 1374 .items = { 1375 { "Mic", 0x0 }, 1376 { "Line", 0x2 }, 1377 { "CD", 0x4 }, 1378 }, 1379 } 1380 }; 1381 1382 static struct snd_kcontrol_new alc888_base_mixer[] = { 1383 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 1384 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 1385 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT), 1386 HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT), 1387 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, 1388 HDA_OUTPUT), 1389 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT), 1390 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT), 1391 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT), 1392 HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT), 1393 HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT), 1394 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), 1395 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), 1396 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), 1397 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), 1398 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 1399 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), 1400 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 1401 { } /* end */ 1402 }; 1403 1404 static void alc888_acer_aspire_4930g_automute(struct hda_codec *codec) 1405 { 1406 unsigned int present; 1407 unsigned int bits; 1408 present = snd_hda_codec_read(codec, 0x15, 0, 1409 AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; 1410 bits = present ? HDA_AMP_MUTE : 0; 1411 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0, 1412 HDA_AMP_MUTE, bits); 1413 } 1414 1415 static void alc888_acer_aspire_4930g_unsol_event(struct hda_codec *codec, 1416 unsigned int res) 1417 { 1418 if (res >> 26 == ALC880_HP_EVENT) 1419 alc888_acer_aspire_4930g_automute(codec); 1420 } 1421 1422 /* 1423 * ALC880 3-stack model 1424 * 1425 * DAC: Front = 0x02 (0x0c), Surr = 0x05 (0x0f), CLFE = 0x04 (0x0e) 1426 * Pin assignment: Front = 0x14, Line-In/Surr = 0x1a, Mic/CLFE = 0x18, 1427 * F-Mic = 0x1b, HP = 0x19 1428 */ 1429 1430 static hda_nid_t alc880_dac_nids[4] = { 1431 /* front, rear, clfe, rear_surr */ 1432 0x02, 0x05, 0x04, 0x03 1433 }; 1434 1435 static hda_nid_t alc880_adc_nids[3] = { 1436 /* ADC0-2 */ 1437 0x07, 0x08, 0x09, 1438 }; 1439 1440 /* The datasheet says the node 0x07 is connected from inputs, 1441 * but it shows zero connection in the real implementation on some devices. 1442 * Note: this is a 915GAV bug, fixed on 915GLV 1443 */ 1444 static hda_nid_t alc880_adc_nids_alt[2] = { 1445 /* ADC1-2 */ 1446 0x08, 0x09, 1447 }; 1448 1449 #define ALC880_DIGOUT_NID 0x06 1450 #define ALC880_DIGIN_NID 0x0a 1451 1452 static struct hda_input_mux alc880_capture_source = { 1453 .num_items = 4, 1454 .items = { 1455 { "Mic", 0x0 }, 1456 { "Front Mic", 0x3 }, 1457 { "Line", 0x2 }, 1458 { "CD", 0x4 }, 1459 }, 1460 }; 1461 1462 /* channel source setting (2/6 channel selection for 3-stack) */ 1463 /* 2ch mode */ 1464 static struct hda_verb alc880_threestack_ch2_init[] = { 1465 /* set line-in to input, mute it */ 1466 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN }, 1467 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE }, 1468 /* set mic-in to input vref 80%, mute it */ 1469 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, 1470 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE }, 1471 { } /* end */ 1472 }; 1473 1474 /* 6ch mode */ 1475 static struct hda_verb alc880_threestack_ch6_init[] = { 1476 /* set line-in to output, unmute it */ 1477 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 1478 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 1479 /* set mic-in to output, unmute it */ 1480 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 1481 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 1482 { } /* end */ 1483 }; 1484 1485 static struct hda_channel_mode alc880_threestack_modes[2] = { 1486 { 2, alc880_threestack_ch2_init }, 1487 { 6, alc880_threestack_ch6_init }, 1488 }; 1489 1490 static struct snd_kcontrol_new alc880_three_stack_mixer[] = { 1491 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 1492 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 1493 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0f, 0x0, HDA_OUTPUT), 1494 HDA_BIND_MUTE("Surround Playback Switch", 0x0f, 2, HDA_INPUT), 1495 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT), 1496 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT), 1497 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT), 1498 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT), 1499 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), 1500 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), 1501 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), 1502 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), 1503 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 1504 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 1505 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x3, HDA_INPUT), 1506 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x3, HDA_INPUT), 1507 HDA_CODEC_MUTE("Headphone Playback Switch", 0x19, 0x0, HDA_OUTPUT), 1508 { 1509 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 1510 .name = "Channel Mode", 1511 .info = alc_ch_mode_info, 1512 .get = alc_ch_mode_get, 1513 .put = alc_ch_mode_put, 1514 }, 1515 { } /* end */ 1516 }; 1517 1518 /* capture mixer elements */ 1519 static int alc_cap_vol_info(struct snd_kcontrol *kcontrol, 1520 struct snd_ctl_elem_info *uinfo) 1521 { 1522 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 1523 struct alc_spec *spec = codec->spec; 1524 int err; 1525 1526 mutex_lock(&codec->control_mutex); 1527 kcontrol->private_value = HDA_COMPOSE_AMP_VAL(spec->adc_nids[0], 3, 0, 1528 HDA_INPUT); 1529 err = snd_hda_mixer_amp_volume_info(kcontrol, uinfo); 1530 mutex_unlock(&codec->control_mutex); 1531 return err; 1532 } 1533 1534 static int alc_cap_vol_tlv(struct snd_kcontrol *kcontrol, int op_flag, 1535 unsigned int size, unsigned int __user *tlv) 1536 { 1537 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 1538 struct alc_spec *spec = codec->spec; 1539 int err; 1540 1541 mutex_lock(&codec->control_mutex); 1542 kcontrol->private_value = HDA_COMPOSE_AMP_VAL(spec->adc_nids[0], 3, 0, 1543 HDA_INPUT); 1544 err = snd_hda_mixer_amp_tlv(kcontrol, op_flag, size, tlv); 1545 mutex_unlock(&codec->control_mutex); 1546 return err; 1547 } 1548 1549 typedef int (*getput_call_t)(struct snd_kcontrol *kcontrol, 1550 struct snd_ctl_elem_value *ucontrol); 1551 1552 static int alc_cap_getput_caller(struct snd_kcontrol *kcontrol, 1553 struct snd_ctl_elem_value *ucontrol, 1554 getput_call_t func) 1555 { 1556 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 1557 struct alc_spec *spec = codec->spec; 1558 unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id); 1559 int err; 1560 1561 mutex_lock(&codec->control_mutex); 1562 kcontrol->private_value = HDA_COMPOSE_AMP_VAL(spec->adc_nids[adc_idx], 1563 3, 0, HDA_INPUT); 1564 err = func(kcontrol, ucontrol); 1565 mutex_unlock(&codec->control_mutex); 1566 return err; 1567 } 1568 1569 static int alc_cap_vol_get(struct snd_kcontrol *kcontrol, 1570 struct snd_ctl_elem_value *ucontrol) 1571 { 1572 return alc_cap_getput_caller(kcontrol, ucontrol, 1573 snd_hda_mixer_amp_volume_get); 1574 } 1575 1576 static int alc_cap_vol_put(struct snd_kcontrol *kcontrol, 1577 struct snd_ctl_elem_value *ucontrol) 1578 { 1579 return alc_cap_getput_caller(kcontrol, ucontrol, 1580 snd_hda_mixer_amp_volume_put); 1581 } 1582 1583 /* capture mixer elements */ 1584 #define alc_cap_sw_info snd_ctl_boolean_stereo_info 1585 1586 static int alc_cap_sw_get(struct snd_kcontrol *kcontrol, 1587 struct snd_ctl_elem_value *ucontrol) 1588 { 1589 return alc_cap_getput_caller(kcontrol, ucontrol, 1590 snd_hda_mixer_amp_switch_get); 1591 } 1592 1593 static int alc_cap_sw_put(struct snd_kcontrol *kcontrol, 1594 struct snd_ctl_elem_value *ucontrol) 1595 { 1596 return alc_cap_getput_caller(kcontrol, ucontrol, 1597 snd_hda_mixer_amp_switch_put); 1598 } 1599 1600 #define _DEFINE_CAPMIX(num) \ 1601 { \ 1602 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \ 1603 .name = "Capture Switch", \ 1604 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, \ 1605 .count = num, \ 1606 .info = alc_cap_sw_info, \ 1607 .get = alc_cap_sw_get, \ 1608 .put = alc_cap_sw_put, \ 1609 }, \ 1610 { \ 1611 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \ 1612 .name = "Capture Volume", \ 1613 .access = (SNDRV_CTL_ELEM_ACCESS_READWRITE | \ 1614 SNDRV_CTL_ELEM_ACCESS_TLV_READ | \ 1615 SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK), \ 1616 .count = num, \ 1617 .info = alc_cap_vol_info, \ 1618 .get = alc_cap_vol_get, \ 1619 .put = alc_cap_vol_put, \ 1620 .tlv = { .c = alc_cap_vol_tlv }, \ 1621 } 1622 1623 #define _DEFINE_CAPSRC(num) \ 1624 { \ 1625 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \ 1626 /* .name = "Capture Source", */ \ 1627 .name = "Input Source", \ 1628 .count = num, \ 1629 .info = alc_mux_enum_info, \ 1630 .get = alc_mux_enum_get, \ 1631 .put = alc_mux_enum_put, \ 1632 } 1633 1634 #define DEFINE_CAPMIX(num) \ 1635 static struct snd_kcontrol_new alc_capture_mixer ## num[] = { \ 1636 _DEFINE_CAPMIX(num), \ 1637 _DEFINE_CAPSRC(num), \ 1638 { } /* end */ \ 1639 } 1640 1641 #define DEFINE_CAPMIX_NOSRC(num) \ 1642 static struct snd_kcontrol_new alc_capture_mixer_nosrc ## num[] = { \ 1643 _DEFINE_CAPMIX(num), \ 1644 { } /* end */ \ 1645 } 1646 1647 /* up to three ADCs */ 1648 DEFINE_CAPMIX(1); 1649 DEFINE_CAPMIX(2); 1650 DEFINE_CAPMIX(3); 1651 DEFINE_CAPMIX_NOSRC(1); 1652 DEFINE_CAPMIX_NOSRC(2); 1653 DEFINE_CAPMIX_NOSRC(3); 1654 1655 /* 1656 * ALC880 5-stack model 1657 * 1658 * DAC: Front = 0x02 (0x0c), Surr = 0x05 (0x0f), CLFE = 0x04 (0x0d), 1659 * Side = 0x02 (0xd) 1660 * Pin assignment: Front = 0x14, Surr = 0x17, CLFE = 0x16 1661 * Line-In/Side = 0x1a, Mic = 0x18, F-Mic = 0x1b, HP = 0x19 1662 */ 1663 1664 /* additional mixers to alc880_three_stack_mixer */ 1665 static struct snd_kcontrol_new alc880_five_stack_mixer[] = { 1666 HDA_CODEC_VOLUME("Side Playback Volume", 0x0d, 0x0, HDA_OUTPUT), 1667 HDA_BIND_MUTE("Side Playback Switch", 0x0d, 2, HDA_INPUT), 1668 { } /* end */ 1669 }; 1670 1671 /* channel source setting (6/8 channel selection for 5-stack) */ 1672 /* 6ch mode */ 1673 static struct hda_verb alc880_fivestack_ch6_init[] = { 1674 /* set line-in to input, mute it */ 1675 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN }, 1676 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE }, 1677 { } /* end */ 1678 }; 1679 1680 /* 8ch mode */ 1681 static struct hda_verb alc880_fivestack_ch8_init[] = { 1682 /* set line-in to output, unmute it */ 1683 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 1684 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 1685 { } /* end */ 1686 }; 1687 1688 static struct hda_channel_mode alc880_fivestack_modes[2] = { 1689 { 6, alc880_fivestack_ch6_init }, 1690 { 8, alc880_fivestack_ch8_init }, 1691 }; 1692 1693 1694 /* 1695 * ALC880 6-stack model 1696 * 1697 * DAC: Front = 0x02 (0x0c), Surr = 0x03 (0x0d), CLFE = 0x04 (0x0e), 1698 * Side = 0x05 (0x0f) 1699 * Pin assignment: Front = 0x14, Surr = 0x15, CLFE = 0x16, Side = 0x17, 1700 * Mic = 0x18, F-Mic = 0x19, Line = 0x1a, HP = 0x1b 1701 */ 1702 1703 static hda_nid_t alc880_6st_dac_nids[4] = { 1704 /* front, rear, clfe, rear_surr */ 1705 0x02, 0x03, 0x04, 0x05 1706 }; 1707 1708 static struct hda_input_mux alc880_6stack_capture_source = { 1709 .num_items = 4, 1710 .items = { 1711 { "Mic", 0x0 }, 1712 { "Front Mic", 0x1 }, 1713 { "Line", 0x2 }, 1714 { "CD", 0x4 }, 1715 }, 1716 }; 1717 1718 /* fixed 8-channels */ 1719 static struct hda_channel_mode alc880_sixstack_modes[1] = { 1720 { 8, NULL }, 1721 }; 1722 1723 static struct snd_kcontrol_new alc880_six_stack_mixer[] = { 1724 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 1725 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 1726 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT), 1727 HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT), 1728 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT), 1729 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT), 1730 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT), 1731 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT), 1732 HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT), 1733 HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT), 1734 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), 1735 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), 1736 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), 1737 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), 1738 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 1739 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 1740 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), 1741 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), 1742 { 1743 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 1744 .name = "Channel Mode", 1745 .info = alc_ch_mode_info, 1746 .get = alc_ch_mode_get, 1747 .put = alc_ch_mode_put, 1748 }, 1749 { } /* end */ 1750 }; 1751 1752 1753 /* 1754 * ALC880 W810 model 1755 * 1756 * W810 has rear IO for: 1757 * Front (DAC 02) 1758 * Surround (DAC 03) 1759 * Center/LFE (DAC 04) 1760 * Digital out (06) 1761 * 1762 * The system also has a pair of internal speakers, and a headphone jack. 1763 * These are both connected to Line2 on the codec, hence to DAC 02. 1764 * 1765 * There is a variable resistor to control the speaker or headphone 1766 * volume. This is a hardware-only device without a software API. 1767 * 1768 * Plugging headphones in will disable the internal speakers. This is 1769 * implemented in hardware, not via the driver using jack sense. In 1770 * a similar fashion, plugging into the rear socket marked "front" will 1771 * disable both the speakers and headphones. 1772 * 1773 * For input, there's a microphone jack, and an "audio in" jack. 1774 * These may not do anything useful with this driver yet, because I 1775 * haven't setup any initialization verbs for these yet... 1776 */ 1777 1778 static hda_nid_t alc880_w810_dac_nids[3] = { 1779 /* front, rear/surround, clfe */ 1780 0x02, 0x03, 0x04 1781 }; 1782 1783 /* fixed 6 channels */ 1784 static struct hda_channel_mode alc880_w810_modes[1] = { 1785 { 6, NULL } 1786 }; 1787 1788 /* Pin assignment: Front = 0x14, Surr = 0x15, CLFE = 0x16, HP = 0x1b */ 1789 static struct snd_kcontrol_new alc880_w810_base_mixer[] = { 1790 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 1791 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 1792 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT), 1793 HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT), 1794 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT), 1795 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT), 1796 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT), 1797 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT), 1798 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT), 1799 { } /* end */ 1800 }; 1801 1802 1803 /* 1804 * Z710V model 1805 * 1806 * DAC: Front = 0x02 (0x0c), HP = 0x03 (0x0d) 1807 * Pin assignment: Front = 0x14, HP = 0x15, Mic = 0x18, Mic2 = 0x19(?), 1808 * Line = 0x1a 1809 */ 1810 1811 static hda_nid_t alc880_z71v_dac_nids[1] = { 1812 0x02 1813 }; 1814 #define ALC880_Z71V_HP_DAC 0x03 1815 1816 /* fixed 2 channels */ 1817 static struct hda_channel_mode alc880_2_jack_modes[1] = { 1818 { 2, NULL } 1819 }; 1820 1821 static struct snd_kcontrol_new alc880_z71v_mixer[] = { 1822 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 1823 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 1824 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT), 1825 HDA_BIND_MUTE("Headphone Playback Switch", 0x0d, 2, HDA_INPUT), 1826 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), 1827 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), 1828 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 1829 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 1830 { } /* end */ 1831 }; 1832 1833 1834 /* 1835 * ALC880 F1734 model 1836 * 1837 * DAC: HP = 0x02 (0x0c), Front = 0x03 (0x0d) 1838 * Pin assignment: HP = 0x14, Front = 0x15, Mic = 0x18 1839 */ 1840 1841 static hda_nid_t alc880_f1734_dac_nids[1] = { 1842 0x03 1843 }; 1844 #define ALC880_F1734_HP_DAC 0x02 1845 1846 static struct snd_kcontrol_new alc880_f1734_mixer[] = { 1847 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 1848 HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT), 1849 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT), 1850 HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT), 1851 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), 1852 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), 1853 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), 1854 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), 1855 { } /* end */ 1856 }; 1857 1858 static struct hda_input_mux alc880_f1734_capture_source = { 1859 .num_items = 2, 1860 .items = { 1861 { "Mic", 0x1 }, 1862 { "CD", 0x4 }, 1863 }, 1864 }; 1865 1866 1867 /* 1868 * ALC880 ASUS model 1869 * 1870 * DAC: HP/Front = 0x02 (0x0c), Surr = 0x03 (0x0d), CLFE = 0x04 (0x0e) 1871 * Pin assignment: HP/Front = 0x14, Surr = 0x15, CLFE = 0x16, 1872 * Mic = 0x18, Line = 0x1a 1873 */ 1874 1875 #define alc880_asus_dac_nids alc880_w810_dac_nids /* identical with w810 */ 1876 #define alc880_asus_modes alc880_threestack_modes /* 2/6 channel mode */ 1877 1878 static struct snd_kcontrol_new alc880_asus_mixer[] = { 1879 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 1880 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 1881 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT), 1882 HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT), 1883 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT), 1884 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT), 1885 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT), 1886 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT), 1887 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), 1888 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), 1889 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), 1890 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), 1891 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 1892 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 1893 { 1894 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 1895 .name = "Channel Mode", 1896 .info = alc_ch_mode_info, 1897 .get = alc_ch_mode_get, 1898 .put = alc_ch_mode_put, 1899 }, 1900 { } /* end */ 1901 }; 1902 1903 /* 1904 * ALC880 ASUS W1V model 1905 * 1906 * DAC: HP/Front = 0x02 (0x0c), Surr = 0x03 (0x0d), CLFE = 0x04 (0x0e) 1907 * Pin assignment: HP/Front = 0x14, Surr = 0x15, CLFE = 0x16, 1908 * Mic = 0x18, Line = 0x1a, Line2 = 0x1b 1909 */ 1910 1911 /* additional mixers to alc880_asus_mixer */ 1912 static struct snd_kcontrol_new alc880_asus_w1v_mixer[] = { 1913 HDA_CODEC_VOLUME("Line2 Playback Volume", 0x0b, 0x03, HDA_INPUT), 1914 HDA_CODEC_MUTE("Line2 Playback Switch", 0x0b, 0x03, HDA_INPUT), 1915 { } /* end */ 1916 }; 1917 1918 /* TCL S700 */ 1919 static struct snd_kcontrol_new alc880_tcl_s700_mixer[] = { 1920 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 1921 HDA_CODEC_MUTE("Front Playback Switch", 0x1b, 0x0, HDA_OUTPUT), 1922 HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT), 1923 HDA_CODEC_VOLUME("CD Playback Volume", 0x0B, 0x04, HDA_INPUT), 1924 HDA_CODEC_MUTE("CD Playback Switch", 0x0B, 0x04, 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("Capture Volume", 0x08, 0x0, HDA_INPUT), 1928 HDA_CODEC_MUTE("Capture Switch", 0x08, 0x0, HDA_INPUT), 1929 { } /* end */ 1930 }; 1931 1932 /* Uniwill */ 1933 static struct snd_kcontrol_new alc880_uniwill_mixer[] = { 1934 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 1935 HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT), 1936 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT), 1937 HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT), 1938 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT), 1939 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT), 1940 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT), 1941 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT), 1942 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), 1943 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), 1944 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), 1945 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), 1946 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 1947 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 1948 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), 1949 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), 1950 { 1951 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 1952 .name = "Channel Mode", 1953 .info = alc_ch_mode_info, 1954 .get = alc_ch_mode_get, 1955 .put = alc_ch_mode_put, 1956 }, 1957 { } /* end */ 1958 }; 1959 1960 static struct snd_kcontrol_new alc880_fujitsu_mixer[] = { 1961 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 1962 HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT), 1963 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT), 1964 HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT), 1965 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), 1966 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), 1967 HDA_CODEC_VOLUME("Ext Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 1968 HDA_CODEC_MUTE("Ext Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 1969 HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), 1970 HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), 1971 { } /* end */ 1972 }; 1973 1974 static struct snd_kcontrol_new alc880_uniwill_p53_mixer[] = { 1975 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 1976 HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT), 1977 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT), 1978 HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT), 1979 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 1980 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 1981 { } /* end */ 1982 }; 1983 1984 /* 1985 * virtual master controls 1986 */ 1987 1988 /* 1989 * slave controls for virtual master 1990 */ 1991 static const char *alc_slave_vols[] = { 1992 "Front Playback Volume", 1993 "Surround Playback Volume", 1994 "Center Playback Volume", 1995 "LFE Playback Volume", 1996 "Side Playback Volume", 1997 "Headphone Playback Volume", 1998 "Speaker Playback Volume", 1999 "Mono Playback Volume", 2000 "Line-Out Playback Volume", 2001 "PCM Playback Volume", 2002 NULL, 2003 }; 2004 2005 static const char *alc_slave_sws[] = { 2006 "Front Playback Switch", 2007 "Surround Playback Switch", 2008 "Center Playback Switch", 2009 "LFE Playback Switch", 2010 "Side Playback Switch", 2011 "Headphone Playback Switch", 2012 "Speaker Playback Switch", 2013 "Mono Playback Switch", 2014 "IEC958 Playback Switch", 2015 NULL, 2016 }; 2017 2018 /* 2019 * build control elements 2020 */ 2021 2022 static void alc_free_kctls(struct hda_codec *codec); 2023 2024 /* additional beep mixers; the actual parameters are overwritten at build */ 2025 static struct snd_kcontrol_new alc_beep_mixer[] = { 2026 HDA_CODEC_VOLUME("Beep Playback Volume", 0, 0, HDA_INPUT), 2027 HDA_CODEC_MUTE("Beep Playback Switch", 0, 0, HDA_INPUT), 2028 { } /* end */ 2029 }; 2030 2031 static int alc_build_controls(struct hda_codec *codec) 2032 { 2033 struct alc_spec *spec = codec->spec; 2034 int err; 2035 int i; 2036 2037 for (i = 0; i < spec->num_mixers; i++) { 2038 err = snd_hda_add_new_ctls(codec, spec->mixers[i]); 2039 if (err < 0) 2040 return err; 2041 } 2042 if (spec->cap_mixer) { 2043 err = snd_hda_add_new_ctls(codec, spec->cap_mixer); 2044 if (err < 0) 2045 return err; 2046 } 2047 if (spec->multiout.dig_out_nid) { 2048 err = snd_hda_create_spdif_out_ctls(codec, 2049 spec->multiout.dig_out_nid); 2050 if (err < 0) 2051 return err; 2052 if (!spec->no_analog) { 2053 err = snd_hda_create_spdif_share_sw(codec, 2054 &spec->multiout); 2055 if (err < 0) 2056 return err; 2057 spec->multiout.share_spdif = 1; 2058 } 2059 } 2060 if (spec->dig_in_nid) { 2061 err = snd_hda_create_spdif_in_ctls(codec, spec->dig_in_nid); 2062 if (err < 0) 2063 return err; 2064 } 2065 2066 /* create beep controls if needed */ 2067 if (spec->beep_amp) { 2068 struct snd_kcontrol_new *knew; 2069 for (knew = alc_beep_mixer; knew->name; knew++) { 2070 struct snd_kcontrol *kctl; 2071 kctl = snd_ctl_new1(knew, codec); 2072 if (!kctl) 2073 return -ENOMEM; 2074 kctl->private_value = spec->beep_amp; 2075 err = snd_hda_ctl_add(codec, kctl); 2076 if (err < 0) 2077 return err; 2078 } 2079 } 2080 2081 /* if we have no master control, let's create it */ 2082 if (!spec->no_analog && 2083 !snd_hda_find_mixer_ctl(codec, "Master Playback Volume")) { 2084 unsigned int vmaster_tlv[4]; 2085 snd_hda_set_vmaster_tlv(codec, spec->vmaster_nid, 2086 HDA_OUTPUT, vmaster_tlv); 2087 err = snd_hda_add_vmaster(codec, "Master Playback Volume", 2088 vmaster_tlv, alc_slave_vols); 2089 if (err < 0) 2090 return err; 2091 } 2092 if (!spec->no_analog && 2093 !snd_hda_find_mixer_ctl(codec, "Master Playback Switch")) { 2094 err = snd_hda_add_vmaster(codec, "Master Playback Switch", 2095 NULL, alc_slave_sws); 2096 if (err < 0) 2097 return err; 2098 } 2099 2100 alc_free_kctls(codec); /* no longer needed */ 2101 return 0; 2102 } 2103 2104 2105 /* 2106 * initialize the codec volumes, etc 2107 */ 2108 2109 /* 2110 * generic initialization of ADC, input mixers and output mixers 2111 */ 2112 static struct hda_verb alc880_volume_init_verbs[] = { 2113 /* 2114 * Unmute ADC0-2 and set the default input to mic-in 2115 */ 2116 {0x07, AC_VERB_SET_CONNECT_SEL, 0x00}, 2117 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 2118 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00}, 2119 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 2120 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00}, 2121 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 2122 2123 /* Unmute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback 2124 * mixer widget 2125 * Note: PASD motherboards uses the Line In 2 as the input for front 2126 * panel mic (mic 2) 2127 */ 2128 /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */ 2129 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 2130 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 2131 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, 2132 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, 2133 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, 2134 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)}, 2135 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)}, 2136 2137 /* 2138 * Set up output mixers (0x0c - 0x0f) 2139 */ 2140 /* set vol=0 to output mixers */ 2141 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 2142 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 2143 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 2144 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 2145 /* set up input amps for analog loopback */ 2146 /* Amp Indices: DAC = 0, mixer = 1 */ 2147 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 2148 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 2149 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 2150 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 2151 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 2152 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 2153 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 2154 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 2155 2156 { } 2157 }; 2158 2159 /* 2160 * 3-stack pin configuration: 2161 * front = 0x14, mic/clfe = 0x18, HP = 0x19, line/surr = 0x1a, f-mic = 0x1b 2162 */ 2163 static struct hda_verb alc880_pin_3stack_init_verbs[] = { 2164 /* 2165 * preset connection lists of input pins 2166 * 0 = front, 1 = rear_surr, 2 = CLFE, 3 = surround 2167 */ 2168 {0x10, AC_VERB_SET_CONNECT_SEL, 0x02}, /* mic/clfe */ 2169 {0x11, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */ 2170 {0x12, AC_VERB_SET_CONNECT_SEL, 0x03}, /* line/surround */ 2171 2172 /* 2173 * Set pin mode and muting 2174 */ 2175 /* set front pin widgets 0x14 for output */ 2176 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 2177 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 2178 /* Mic1 (rear panel) pin widget for input and vref at 80% */ 2179 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, 2180 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 2181 /* Mic2 (as headphone out) for HP output */ 2182 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 2183 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 2184 /* Line In pin widget for input */ 2185 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 2186 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 2187 /* Line2 (as front mic) pin widget for input and vref at 80% */ 2188 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, 2189 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 2190 /* CD pin widget for input */ 2191 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 2192 2193 { } 2194 }; 2195 2196 /* 2197 * 5-stack pin configuration: 2198 * front = 0x14, surround = 0x17, clfe = 0x16, mic = 0x18, HP = 0x19, 2199 * line-in/side = 0x1a, f-mic = 0x1b 2200 */ 2201 static struct hda_verb alc880_pin_5stack_init_verbs[] = { 2202 /* 2203 * preset connection lists of input pins 2204 * 0 = front, 1 = rear_surr, 2 = CLFE, 3 = surround 2205 */ 2206 {0x11, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */ 2207 {0x12, AC_VERB_SET_CONNECT_SEL, 0x01}, /* line/side */ 2208 2209 /* 2210 * Set pin mode and muting 2211 */ 2212 /* set pin widgets 0x14-0x17 for output */ 2213 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 2214 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 2215 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 2216 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 2217 /* unmute pins for output (no gain on this amp) */ 2218 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 2219 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 2220 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 2221 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 2222 2223 /* Mic1 (rear panel) pin widget for input and vref at 80% */ 2224 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, 2225 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 2226 /* Mic2 (as headphone out) for HP output */ 2227 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 2228 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 2229 /* Line In pin widget for input */ 2230 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 2231 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 2232 /* Line2 (as front mic) pin widget for input and vref at 80% */ 2233 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, 2234 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 2235 /* CD pin widget for input */ 2236 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 2237 2238 { } 2239 }; 2240 2241 /* 2242 * W810 pin configuration: 2243 * front = 0x14, surround = 0x15, clfe = 0x16, HP = 0x1b 2244 */ 2245 static struct hda_verb alc880_pin_w810_init_verbs[] = { 2246 /* hphone/speaker input selector: front DAC */ 2247 {0x13, AC_VERB_SET_CONNECT_SEL, 0x0}, 2248 2249 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 2250 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 2251 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 2252 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 2253 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 2254 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 2255 2256 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 2257 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 2258 2259 { } 2260 }; 2261 2262 /* 2263 * Z71V pin configuration: 2264 * Speaker-out = 0x14, HP = 0x15, Mic = 0x18, Line-in = 0x1a, Mic2 = 0x1b (?) 2265 */ 2266 static struct hda_verb alc880_pin_z71v_init_verbs[] = { 2267 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 2268 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 2269 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 2270 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 2271 2272 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, 2273 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 2274 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, 2275 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 2276 2277 { } 2278 }; 2279 2280 /* 2281 * 6-stack pin configuration: 2282 * front = 0x14, surr = 0x15, clfe = 0x16, side = 0x17, mic = 0x18, 2283 * f-mic = 0x19, line = 0x1a, HP = 0x1b 2284 */ 2285 static struct hda_verb alc880_pin_6stack_init_verbs[] = { 2286 {0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */ 2287 2288 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 2289 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 2290 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 2291 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 2292 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 2293 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 2294 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 2295 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 2296 2297 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, 2298 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 2299 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, 2300 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 2301 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 2302 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 2303 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 2304 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 2305 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 2306 2307 { } 2308 }; 2309 2310 /* 2311 * Uniwill pin configuration: 2312 * HP = 0x14, InternalSpeaker = 0x15, mic = 0x18, internal mic = 0x19, 2313 * line = 0x1a 2314 */ 2315 static struct hda_verb alc880_uniwill_init_verbs[] = { 2316 {0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */ 2317 2318 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 2319 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 2320 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 2321 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 2322 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 2323 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 2324 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 2325 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 2326 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))}, 2327 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))}, 2328 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))}, 2329 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))}, 2330 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))}, 2331 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))}, 2332 2333 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, 2334 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 2335 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, 2336 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 2337 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 2338 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 2339 /* {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, */ 2340 /* {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, */ 2341 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 2342 2343 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT}, 2344 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT}, 2345 2346 { } 2347 }; 2348 2349 /* 2350 * Uniwill P53 2351 * HP = 0x14, InternalSpeaker = 0x15, mic = 0x19, 2352 */ 2353 static struct hda_verb alc880_uniwill_p53_init_verbs[] = { 2354 {0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */ 2355 2356 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 2357 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 2358 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 2359 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 2360 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 2361 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 2362 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))}, 2363 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))}, 2364 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))}, 2365 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))}, 2366 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))}, 2367 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))}, 2368 2369 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, 2370 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 2371 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, 2372 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 2373 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 2374 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 2375 2376 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT}, 2377 {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_DCVOL_EVENT}, 2378 2379 { } 2380 }; 2381 2382 static struct hda_verb alc880_beep_init_verbs[] = { 2383 { 0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(5) }, 2384 { } 2385 }; 2386 2387 /* toggle speaker-output according to the hp-jack state */ 2388 static void alc880_uniwill_hp_automute(struct hda_codec *codec) 2389 { 2390 unsigned int present; 2391 unsigned char bits; 2392 2393 present = snd_hda_codec_read(codec, 0x14, 0, 2394 AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; 2395 bits = present ? HDA_AMP_MUTE : 0; 2396 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0, 2397 HDA_AMP_MUTE, bits); 2398 snd_hda_codec_amp_stereo(codec, 0x16, HDA_OUTPUT, 0, 2399 HDA_AMP_MUTE, bits); 2400 } 2401 2402 /* auto-toggle front mic */ 2403 static void alc880_uniwill_mic_automute(struct hda_codec *codec) 2404 { 2405 unsigned int present; 2406 unsigned char bits; 2407 2408 present = snd_hda_codec_read(codec, 0x18, 0, 2409 AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; 2410 bits = present ? HDA_AMP_MUTE : 0; 2411 snd_hda_codec_amp_stereo(codec, 0x0b, HDA_INPUT, 1, HDA_AMP_MUTE, bits); 2412 } 2413 2414 static void alc880_uniwill_automute(struct hda_codec *codec) 2415 { 2416 alc880_uniwill_hp_automute(codec); 2417 alc880_uniwill_mic_automute(codec); 2418 } 2419 2420 static void alc880_uniwill_unsol_event(struct hda_codec *codec, 2421 unsigned int res) 2422 { 2423 /* Looks like the unsol event is incompatible with the standard 2424 * definition. 4bit tag is placed at 28 bit! 2425 */ 2426 switch (res >> 28) { 2427 case ALC880_HP_EVENT: 2428 alc880_uniwill_hp_automute(codec); 2429 break; 2430 case ALC880_MIC_EVENT: 2431 alc880_uniwill_mic_automute(codec); 2432 break; 2433 } 2434 } 2435 2436 static void alc880_uniwill_p53_hp_automute(struct hda_codec *codec) 2437 { 2438 unsigned int present; 2439 unsigned char bits; 2440 2441 present = snd_hda_codec_read(codec, 0x14, 0, 2442 AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; 2443 bits = present ? HDA_AMP_MUTE : 0; 2444 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0, HDA_AMP_MUTE, bits); 2445 } 2446 2447 static void alc880_uniwill_p53_dcvol_automute(struct hda_codec *codec) 2448 { 2449 unsigned int present; 2450 2451 present = snd_hda_codec_read(codec, 0x21, 0, 2452 AC_VERB_GET_VOLUME_KNOB_CONTROL, 0); 2453 present &= HDA_AMP_VOLMASK; 2454 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_OUTPUT, 0, 2455 HDA_AMP_VOLMASK, present); 2456 snd_hda_codec_amp_stereo(codec, 0x0d, HDA_OUTPUT, 0, 2457 HDA_AMP_VOLMASK, present); 2458 } 2459 2460 static void alc880_uniwill_p53_unsol_event(struct hda_codec *codec, 2461 unsigned int res) 2462 { 2463 /* Looks like the unsol event is incompatible with the standard 2464 * definition. 4bit tag is placed at 28 bit! 2465 */ 2466 if ((res >> 28) == ALC880_HP_EVENT) 2467 alc880_uniwill_p53_hp_automute(codec); 2468 if ((res >> 28) == ALC880_DCVOL_EVENT) 2469 alc880_uniwill_p53_dcvol_automute(codec); 2470 } 2471 2472 /* 2473 * F1734 pin configuration: 2474 * HP = 0x14, speaker-out = 0x15, mic = 0x18 2475 */ 2476 static struct hda_verb alc880_pin_f1734_init_verbs[] = { 2477 {0x07, AC_VERB_SET_CONNECT_SEL, 0x01}, 2478 {0x10, AC_VERB_SET_CONNECT_SEL, 0x02}, 2479 {0x11, AC_VERB_SET_CONNECT_SEL, 0x00}, 2480 {0x12, AC_VERB_SET_CONNECT_SEL, 0x01}, 2481 {0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, 2482 2483 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 2484 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 2485 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 2486 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 2487 2488 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, 2489 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 2490 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50}, 2491 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 2492 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 2493 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 2494 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 2495 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 2496 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 2497 2498 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_HP_EVENT}, 2499 {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_DCVOL_EVENT}, 2500 2501 { } 2502 }; 2503 2504 /* 2505 * ASUS pin configuration: 2506 * HP/front = 0x14, surr = 0x15, clfe = 0x16, mic = 0x18, line = 0x1a 2507 */ 2508 static struct hda_verb alc880_pin_asus_init_verbs[] = { 2509 {0x10, AC_VERB_SET_CONNECT_SEL, 0x02}, 2510 {0x11, AC_VERB_SET_CONNECT_SEL, 0x00}, 2511 {0x12, AC_VERB_SET_CONNECT_SEL, 0x01}, 2512 {0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, 2513 2514 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 2515 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 2516 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 2517 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 2518 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 2519 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 2520 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 2521 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 2522 2523 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, 2524 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 2525 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, 2526 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 2527 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 2528 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 2529 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 2530 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 2531 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 2532 2533 { } 2534 }; 2535 2536 /* Enable GPIO mask and set output */ 2537 #define alc880_gpio1_init_verbs alc_gpio1_init_verbs 2538 #define alc880_gpio2_init_verbs alc_gpio2_init_verbs 2539 2540 /* Clevo m520g init */ 2541 static struct hda_verb alc880_pin_clevo_init_verbs[] = { 2542 /* headphone output */ 2543 {0x11, AC_VERB_SET_CONNECT_SEL, 0x01}, 2544 /* line-out */ 2545 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 2546 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 2547 /* Line-in */ 2548 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 2549 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 2550 /* CD */ 2551 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 2552 {0x1c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 2553 /* Mic1 (rear panel) */ 2554 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, 2555 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 2556 /* Mic2 (front panel) */ 2557 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, 2558 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 2559 /* headphone */ 2560 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 2561 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 2562 /* change to EAPD mode */ 2563 {0x20, AC_VERB_SET_COEF_INDEX, 0x07}, 2564 {0x20, AC_VERB_SET_PROC_COEF, 0x3060}, 2565 2566 { } 2567 }; 2568 2569 static struct hda_verb alc880_pin_tcl_S700_init_verbs[] = { 2570 /* change to EAPD mode */ 2571 {0x20, AC_VERB_SET_COEF_INDEX, 0x07}, 2572 {0x20, AC_VERB_SET_PROC_COEF, 0x3060}, 2573 2574 /* Headphone output */ 2575 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 2576 /* Front output*/ 2577 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 2578 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, 2579 2580 /* Line In pin widget for input */ 2581 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 2582 /* CD pin widget for input */ 2583 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 2584 /* Mic1 (rear panel) pin widget for input and vref at 80% */ 2585 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, 2586 2587 /* change to EAPD mode */ 2588 {0x20, AC_VERB_SET_COEF_INDEX, 0x07}, 2589 {0x20, AC_VERB_SET_PROC_COEF, 0x3070}, 2590 2591 { } 2592 }; 2593 2594 /* 2595 * LG m1 express dual 2596 * 2597 * Pin assignment: 2598 * Rear Line-In/Out (blue): 0x14 2599 * Build-in Mic-In: 0x15 2600 * Speaker-out: 0x17 2601 * HP-Out (green): 0x1b 2602 * Mic-In/Out (red): 0x19 2603 * SPDIF-Out: 0x1e 2604 */ 2605 2606 /* To make 5.1 output working (green=Front, blue=Surr, red=CLFE) */ 2607 static hda_nid_t alc880_lg_dac_nids[3] = { 2608 0x05, 0x02, 0x03 2609 }; 2610 2611 /* seems analog CD is not working */ 2612 static struct hda_input_mux alc880_lg_capture_source = { 2613 .num_items = 3, 2614 .items = { 2615 { "Mic", 0x1 }, 2616 { "Line", 0x5 }, 2617 { "Internal Mic", 0x6 }, 2618 }, 2619 }; 2620 2621 /* 2,4,6 channel modes */ 2622 static struct hda_verb alc880_lg_ch2_init[] = { 2623 /* set line-in and mic-in to input */ 2624 { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN }, 2625 { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, 2626 { } 2627 }; 2628 2629 static struct hda_verb alc880_lg_ch4_init[] = { 2630 /* set line-in to out and mic-in to input */ 2631 { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP }, 2632 { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, 2633 { } 2634 }; 2635 2636 static struct hda_verb alc880_lg_ch6_init[] = { 2637 /* set line-in and mic-in to output */ 2638 { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP }, 2639 { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP }, 2640 { } 2641 }; 2642 2643 static struct hda_channel_mode alc880_lg_ch_modes[3] = { 2644 { 2, alc880_lg_ch2_init }, 2645 { 4, alc880_lg_ch4_init }, 2646 { 6, alc880_lg_ch6_init }, 2647 }; 2648 2649 static struct snd_kcontrol_new alc880_lg_mixer[] = { 2650 HDA_CODEC_VOLUME("Front Playback Volume", 0x0f, 0x0, HDA_OUTPUT), 2651 HDA_BIND_MUTE("Front Playback Switch", 0x0f, 2, HDA_INPUT), 2652 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 2653 HDA_BIND_MUTE("Surround Playback Switch", 0x0c, 2, HDA_INPUT), 2654 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0d, 1, 0x0, HDA_OUTPUT), 2655 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0d, 2, 0x0, HDA_OUTPUT), 2656 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0d, 1, 2, HDA_INPUT), 2657 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0d, 2, 2, HDA_INPUT), 2658 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), 2659 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), 2660 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x06, HDA_INPUT), 2661 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x06, HDA_INPUT), 2662 HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x07, HDA_INPUT), 2663 HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x07, HDA_INPUT), 2664 { 2665 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 2666 .name = "Channel Mode", 2667 .info = alc_ch_mode_info, 2668 .get = alc_ch_mode_get, 2669 .put = alc_ch_mode_put, 2670 }, 2671 { } /* end */ 2672 }; 2673 2674 static struct hda_verb alc880_lg_init_verbs[] = { 2675 /* set capture source to mic-in */ 2676 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 2677 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 2678 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 2679 /* mute all amp mixer inputs */ 2680 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(5)}, 2681 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)}, 2682 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)}, 2683 /* line-in to input */ 2684 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 2685 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 2686 /* built-in mic */ 2687 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, 2688 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 2689 /* speaker-out */ 2690 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 2691 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 2692 /* mic-in to input */ 2693 {0x11, AC_VERB_SET_CONNECT_SEL, 0x01}, 2694 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, 2695 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 2696 /* HP-out */ 2697 {0x13, AC_VERB_SET_CONNECT_SEL, 0x03}, 2698 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 2699 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 2700 /* jack sense */ 2701 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | 0x1}, 2702 { } 2703 }; 2704 2705 /* toggle speaker-output according to the hp-jack state */ 2706 static void alc880_lg_automute(struct hda_codec *codec) 2707 { 2708 unsigned int present; 2709 unsigned char bits; 2710 2711 present = snd_hda_codec_read(codec, 0x1b, 0, 2712 AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; 2713 bits = present ? HDA_AMP_MUTE : 0; 2714 snd_hda_codec_amp_stereo(codec, 0x17, HDA_OUTPUT, 0, 2715 HDA_AMP_MUTE, bits); 2716 } 2717 2718 static void alc880_lg_unsol_event(struct hda_codec *codec, unsigned int res) 2719 { 2720 /* Looks like the unsol event is incompatible with the standard 2721 * definition. 4bit tag is placed at 28 bit! 2722 */ 2723 if ((res >> 28) == 0x01) 2724 alc880_lg_automute(codec); 2725 } 2726 2727 /* 2728 * LG LW20 2729 * 2730 * Pin assignment: 2731 * Speaker-out: 0x14 2732 * Mic-In: 0x18 2733 * Built-in Mic-In: 0x19 2734 * Line-In: 0x1b 2735 * HP-Out: 0x1a 2736 * SPDIF-Out: 0x1e 2737 */ 2738 2739 static struct hda_input_mux alc880_lg_lw_capture_source = { 2740 .num_items = 3, 2741 .items = { 2742 { "Mic", 0x0 }, 2743 { "Internal Mic", 0x1 }, 2744 { "Line In", 0x2 }, 2745 }, 2746 }; 2747 2748 #define alc880_lg_lw_modes alc880_threestack_modes 2749 2750 static struct snd_kcontrol_new alc880_lg_lw_mixer[] = { 2751 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 2752 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 2753 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0f, 0x0, HDA_OUTPUT), 2754 HDA_BIND_MUTE("Surround Playback Switch", 0x0f, 2, HDA_INPUT), 2755 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT), 2756 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT), 2757 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT), 2758 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT), 2759 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), 2760 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), 2761 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 2762 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 2763 HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x01, HDA_INPUT), 2764 HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x01, HDA_INPUT), 2765 { 2766 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 2767 .name = "Channel Mode", 2768 .info = alc_ch_mode_info, 2769 .get = alc_ch_mode_get, 2770 .put = alc_ch_mode_put, 2771 }, 2772 { } /* end */ 2773 }; 2774 2775 static struct hda_verb alc880_lg_lw_init_verbs[] = { 2776 {0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */ 2777 {0x10, AC_VERB_SET_CONNECT_SEL, 0x02}, /* mic/clfe */ 2778 {0x12, AC_VERB_SET_CONNECT_SEL, 0x03}, /* line/surround */ 2779 2780 /* set capture source to mic-in */ 2781 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 2782 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 2783 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 2784 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)}, 2785 /* speaker-out */ 2786 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 2787 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 2788 /* HP-out */ 2789 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 2790 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 2791 /* mic-in to input */ 2792 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, 2793 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 2794 /* built-in mic */ 2795 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, 2796 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 2797 /* jack sense */ 2798 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | 0x1}, 2799 { } 2800 }; 2801 2802 /* toggle speaker-output according to the hp-jack state */ 2803 static void alc880_lg_lw_automute(struct hda_codec *codec) 2804 { 2805 unsigned int present; 2806 unsigned char bits; 2807 2808 present = snd_hda_codec_read(codec, 0x1b, 0, 2809 AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; 2810 bits = present ? HDA_AMP_MUTE : 0; 2811 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0, 2812 HDA_AMP_MUTE, bits); 2813 } 2814 2815 static void alc880_lg_lw_unsol_event(struct hda_codec *codec, unsigned int res) 2816 { 2817 /* Looks like the unsol event is incompatible with the standard 2818 * definition. 4bit tag is placed at 28 bit! 2819 */ 2820 if ((res >> 28) == 0x01) 2821 alc880_lg_lw_automute(codec); 2822 } 2823 2824 static struct snd_kcontrol_new alc880_medion_rim_mixer[] = { 2825 HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 2826 HDA_BIND_MUTE("Master Playback Switch", 0x0c, 2, HDA_INPUT), 2827 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 2828 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 2829 HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), 2830 HDA_CODEC_MUTE("Internal Playback Switch", 0x0b, 0x1, HDA_INPUT), 2831 { } /* end */ 2832 }; 2833 2834 static struct hda_input_mux alc880_medion_rim_capture_source = { 2835 .num_items = 2, 2836 .items = { 2837 { "Mic", 0x0 }, 2838 { "Internal Mic", 0x1 }, 2839 }, 2840 }; 2841 2842 static struct hda_verb alc880_medion_rim_init_verbs[] = { 2843 {0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */ 2844 2845 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 2846 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 2847 2848 /* Mic1 (rear panel) pin widget for input and vref at 80% */ 2849 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, 2850 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 2851 /* Mic2 (as headphone out) for HP output */ 2852 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 2853 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 2854 /* Internal Speaker */ 2855 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 2856 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 2857 2858 {0x20, AC_VERB_SET_COEF_INDEX, 0x07}, 2859 {0x20, AC_VERB_SET_PROC_COEF, 0x3060}, 2860 2861 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT}, 2862 { } 2863 }; 2864 2865 /* toggle speaker-output according to the hp-jack state */ 2866 static void alc880_medion_rim_automute(struct hda_codec *codec) 2867 { 2868 unsigned int present; 2869 unsigned char bits; 2870 2871 present = snd_hda_codec_read(codec, 0x14, 0, 2872 AC_VERB_GET_PIN_SENSE, 0) 2873 & AC_PINSENSE_PRESENCE; 2874 bits = present ? HDA_AMP_MUTE : 0; 2875 snd_hda_codec_amp_stereo(codec, 0x1b, HDA_OUTPUT, 0, 2876 HDA_AMP_MUTE, bits); 2877 if (present) 2878 snd_hda_codec_write(codec, 0x01, 0, AC_VERB_SET_GPIO_DATA, 0); 2879 else 2880 snd_hda_codec_write(codec, 0x01, 0, AC_VERB_SET_GPIO_DATA, 2); 2881 } 2882 2883 static void alc880_medion_rim_unsol_event(struct hda_codec *codec, 2884 unsigned int res) 2885 { 2886 /* Looks like the unsol event is incompatible with the standard 2887 * definition. 4bit tag is placed at 28 bit! 2888 */ 2889 if ((res >> 28) == ALC880_HP_EVENT) 2890 alc880_medion_rim_automute(codec); 2891 } 2892 2893 #ifdef CONFIG_SND_HDA_POWER_SAVE 2894 static struct hda_amp_list alc880_loopbacks[] = { 2895 { 0x0b, HDA_INPUT, 0 }, 2896 { 0x0b, HDA_INPUT, 1 }, 2897 { 0x0b, HDA_INPUT, 2 }, 2898 { 0x0b, HDA_INPUT, 3 }, 2899 { 0x0b, HDA_INPUT, 4 }, 2900 { } /* end */ 2901 }; 2902 2903 static struct hda_amp_list alc880_lg_loopbacks[] = { 2904 { 0x0b, HDA_INPUT, 1 }, 2905 { 0x0b, HDA_INPUT, 6 }, 2906 { 0x0b, HDA_INPUT, 7 }, 2907 { } /* end */ 2908 }; 2909 #endif 2910 2911 /* 2912 * Common callbacks 2913 */ 2914 2915 static int alc_init(struct hda_codec *codec) 2916 { 2917 struct alc_spec *spec = codec->spec; 2918 unsigned int i; 2919 2920 alc_fix_pll(codec); 2921 if (codec->vendor_id == 0x10ec0888) 2922 alc888_coef_init(codec); 2923 2924 for (i = 0; i < spec->num_init_verbs; i++) 2925 snd_hda_sequence_write(codec, spec->init_verbs[i]); 2926 2927 if (spec->init_hook) 2928 spec->init_hook(codec); 2929 2930 return 0; 2931 } 2932 2933 static void alc_unsol_event(struct hda_codec *codec, unsigned int res) 2934 { 2935 struct alc_spec *spec = codec->spec; 2936 2937 if (spec->unsol_event) 2938 spec->unsol_event(codec, res); 2939 } 2940 2941 #ifdef CONFIG_SND_HDA_POWER_SAVE 2942 static int alc_check_power_status(struct hda_codec *codec, hda_nid_t nid) 2943 { 2944 struct alc_spec *spec = codec->spec; 2945 return snd_hda_check_amp_list_power(codec, &spec->loopback, nid); 2946 } 2947 #endif 2948 2949 /* 2950 * Analog playback callbacks 2951 */ 2952 static int alc880_playback_pcm_open(struct hda_pcm_stream *hinfo, 2953 struct hda_codec *codec, 2954 struct snd_pcm_substream *substream) 2955 { 2956 struct alc_spec *spec = codec->spec; 2957 return snd_hda_multi_out_analog_open(codec, &spec->multiout, substream, 2958 hinfo); 2959 } 2960 2961 static int alc880_playback_pcm_prepare(struct hda_pcm_stream *hinfo, 2962 struct hda_codec *codec, 2963 unsigned int stream_tag, 2964 unsigned int format, 2965 struct snd_pcm_substream *substream) 2966 { 2967 struct alc_spec *spec = codec->spec; 2968 return snd_hda_multi_out_analog_prepare(codec, &spec->multiout, 2969 stream_tag, format, substream); 2970 } 2971 2972 static int alc880_playback_pcm_cleanup(struct hda_pcm_stream *hinfo, 2973 struct hda_codec *codec, 2974 struct snd_pcm_substream *substream) 2975 { 2976 struct alc_spec *spec = codec->spec; 2977 return snd_hda_multi_out_analog_cleanup(codec, &spec->multiout); 2978 } 2979 2980 /* 2981 * Digital out 2982 */ 2983 static int alc880_dig_playback_pcm_open(struct hda_pcm_stream *hinfo, 2984 struct hda_codec *codec, 2985 struct snd_pcm_substream *substream) 2986 { 2987 struct alc_spec *spec = codec->spec; 2988 return snd_hda_multi_out_dig_open(codec, &spec->multiout); 2989 } 2990 2991 static int alc880_dig_playback_pcm_prepare(struct hda_pcm_stream *hinfo, 2992 struct hda_codec *codec, 2993 unsigned int stream_tag, 2994 unsigned int format, 2995 struct snd_pcm_substream *substream) 2996 { 2997 struct alc_spec *spec = codec->spec; 2998 return snd_hda_multi_out_dig_prepare(codec, &spec->multiout, 2999 stream_tag, format, substream); 3000 } 3001 3002 static int alc880_dig_playback_pcm_cleanup(struct hda_pcm_stream *hinfo, 3003 struct hda_codec *codec, 3004 struct snd_pcm_substream *substream) 3005 { 3006 struct alc_spec *spec = codec->spec; 3007 return snd_hda_multi_out_dig_cleanup(codec, &spec->multiout); 3008 } 3009 3010 static int alc880_dig_playback_pcm_close(struct hda_pcm_stream *hinfo, 3011 struct hda_codec *codec, 3012 struct snd_pcm_substream *substream) 3013 { 3014 struct alc_spec *spec = codec->spec; 3015 return snd_hda_multi_out_dig_close(codec, &spec->multiout); 3016 } 3017 3018 /* 3019 * Analog capture 3020 */ 3021 static int alc880_alt_capture_pcm_prepare(struct hda_pcm_stream *hinfo, 3022 struct hda_codec *codec, 3023 unsigned int stream_tag, 3024 unsigned int format, 3025 struct snd_pcm_substream *substream) 3026 { 3027 struct alc_spec *spec = codec->spec; 3028 3029 snd_hda_codec_setup_stream(codec, spec->adc_nids[substream->number + 1], 3030 stream_tag, 0, format); 3031 return 0; 3032 } 3033 3034 static int alc880_alt_capture_pcm_cleanup(struct hda_pcm_stream *hinfo, 3035 struct hda_codec *codec, 3036 struct snd_pcm_substream *substream) 3037 { 3038 struct alc_spec *spec = codec->spec; 3039 3040 snd_hda_codec_cleanup_stream(codec, 3041 spec->adc_nids[substream->number + 1]); 3042 return 0; 3043 } 3044 3045 3046 /* 3047 */ 3048 static struct hda_pcm_stream alc880_pcm_analog_playback = { 3049 .substreams = 1, 3050 .channels_min = 2, 3051 .channels_max = 8, 3052 /* NID is set in alc_build_pcms */ 3053 .ops = { 3054 .open = alc880_playback_pcm_open, 3055 .prepare = alc880_playback_pcm_prepare, 3056 .cleanup = alc880_playback_pcm_cleanup 3057 }, 3058 }; 3059 3060 static struct hda_pcm_stream alc880_pcm_analog_capture = { 3061 .substreams = 1, 3062 .channels_min = 2, 3063 .channels_max = 2, 3064 /* NID is set in alc_build_pcms */ 3065 }; 3066 3067 static struct hda_pcm_stream alc880_pcm_analog_alt_playback = { 3068 .substreams = 1, 3069 .channels_min = 2, 3070 .channels_max = 2, 3071 /* NID is set in alc_build_pcms */ 3072 }; 3073 3074 static struct hda_pcm_stream alc880_pcm_analog_alt_capture = { 3075 .substreams = 2, /* can be overridden */ 3076 .channels_min = 2, 3077 .channels_max = 2, 3078 /* NID is set in alc_build_pcms */ 3079 .ops = { 3080 .prepare = alc880_alt_capture_pcm_prepare, 3081 .cleanup = alc880_alt_capture_pcm_cleanup 3082 }, 3083 }; 3084 3085 static struct hda_pcm_stream alc880_pcm_digital_playback = { 3086 .substreams = 1, 3087 .channels_min = 2, 3088 .channels_max = 2, 3089 /* NID is set in alc_build_pcms */ 3090 .ops = { 3091 .open = alc880_dig_playback_pcm_open, 3092 .close = alc880_dig_playback_pcm_close, 3093 .prepare = alc880_dig_playback_pcm_prepare, 3094 .cleanup = alc880_dig_playback_pcm_cleanup 3095 }, 3096 }; 3097 3098 static struct hda_pcm_stream alc880_pcm_digital_capture = { 3099 .substreams = 1, 3100 .channels_min = 2, 3101 .channels_max = 2, 3102 /* NID is set in alc_build_pcms */ 3103 }; 3104 3105 /* Used by alc_build_pcms to flag that a PCM has no playback stream */ 3106 static struct hda_pcm_stream alc_pcm_null_stream = { 3107 .substreams = 0, 3108 .channels_min = 0, 3109 .channels_max = 0, 3110 }; 3111 3112 static int alc_build_pcms(struct hda_codec *codec) 3113 { 3114 struct alc_spec *spec = codec->spec; 3115 struct hda_pcm *info = spec->pcm_rec; 3116 int i; 3117 3118 codec->num_pcms = 1; 3119 codec->pcm_info = info; 3120 3121 if (spec->no_analog) 3122 goto skip_analog; 3123 3124 info->name = spec->stream_name_analog; 3125 if (spec->stream_analog_playback) { 3126 if (snd_BUG_ON(!spec->multiout.dac_nids)) 3127 return -EINVAL; 3128 info->stream[SNDRV_PCM_STREAM_PLAYBACK] = *(spec->stream_analog_playback); 3129 info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = spec->multiout.dac_nids[0]; 3130 } 3131 if (spec->stream_analog_capture) { 3132 if (snd_BUG_ON(!spec->adc_nids)) 3133 return -EINVAL; 3134 info->stream[SNDRV_PCM_STREAM_CAPTURE] = *(spec->stream_analog_capture); 3135 info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->adc_nids[0]; 3136 } 3137 3138 if (spec->channel_mode) { 3139 info->stream[SNDRV_PCM_STREAM_PLAYBACK].channels_max = 0; 3140 for (i = 0; i < spec->num_channel_mode; i++) { 3141 if (spec->channel_mode[i].channels > info->stream[SNDRV_PCM_STREAM_PLAYBACK].channels_max) { 3142 info->stream[SNDRV_PCM_STREAM_PLAYBACK].channels_max = spec->channel_mode[i].channels; 3143 } 3144 } 3145 } 3146 3147 skip_analog: 3148 /* SPDIF for stream index #1 */ 3149 if (spec->multiout.dig_out_nid || spec->dig_in_nid) { 3150 codec->num_pcms = 2; 3151 codec->slave_dig_outs = spec->multiout.slave_dig_outs; 3152 info = spec->pcm_rec + 1; 3153 info->name = spec->stream_name_digital; 3154 if (spec->dig_out_type) 3155 info->pcm_type = spec->dig_out_type; 3156 else 3157 info->pcm_type = HDA_PCM_TYPE_SPDIF; 3158 if (spec->multiout.dig_out_nid && 3159 spec->stream_digital_playback) { 3160 info->stream[SNDRV_PCM_STREAM_PLAYBACK] = *(spec->stream_digital_playback); 3161 info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = spec->multiout.dig_out_nid; 3162 } 3163 if (spec->dig_in_nid && 3164 spec->stream_digital_capture) { 3165 info->stream[SNDRV_PCM_STREAM_CAPTURE] = *(spec->stream_digital_capture); 3166 info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->dig_in_nid; 3167 } 3168 /* FIXME: do we need this for all Realtek codec models? */ 3169 codec->spdif_status_reset = 1; 3170 } 3171 3172 if (spec->no_analog) 3173 return 0; 3174 3175 /* If the use of more than one ADC is requested for the current 3176 * model, configure a second analog capture-only PCM. 3177 */ 3178 /* Additional Analaog capture for index #2 */ 3179 if ((spec->alt_dac_nid && spec->stream_analog_alt_playback) || 3180 (spec->num_adc_nids > 1 && spec->stream_analog_alt_capture)) { 3181 codec->num_pcms = 3; 3182 info = spec->pcm_rec + 2; 3183 info->name = spec->stream_name_analog; 3184 if (spec->alt_dac_nid) { 3185 info->stream[SNDRV_PCM_STREAM_PLAYBACK] = 3186 *spec->stream_analog_alt_playback; 3187 info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = 3188 spec->alt_dac_nid; 3189 } else { 3190 info->stream[SNDRV_PCM_STREAM_PLAYBACK] = 3191 alc_pcm_null_stream; 3192 info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = 0; 3193 } 3194 if (spec->num_adc_nids > 1) { 3195 info->stream[SNDRV_PCM_STREAM_CAPTURE] = 3196 *spec->stream_analog_alt_capture; 3197 info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = 3198 spec->adc_nids[1]; 3199 info->stream[SNDRV_PCM_STREAM_CAPTURE].substreams = 3200 spec->num_adc_nids - 1; 3201 } else { 3202 info->stream[SNDRV_PCM_STREAM_CAPTURE] = 3203 alc_pcm_null_stream; 3204 info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = 0; 3205 } 3206 } 3207 3208 return 0; 3209 } 3210 3211 static void alc_free_kctls(struct hda_codec *codec) 3212 { 3213 struct alc_spec *spec = codec->spec; 3214 3215 if (spec->kctls.list) { 3216 struct snd_kcontrol_new *kctl = spec->kctls.list; 3217 int i; 3218 for (i = 0; i < spec->kctls.used; i++) 3219 kfree(kctl[i].name); 3220 } 3221 snd_array_free(&spec->kctls); 3222 } 3223 3224 static void alc_free(struct hda_codec *codec) 3225 { 3226 struct alc_spec *spec = codec->spec; 3227 3228 if (!spec) 3229 return; 3230 3231 alc_free_kctls(codec); 3232 kfree(spec); 3233 snd_hda_detach_beep_device(codec); 3234 } 3235 3236 #ifdef SND_HDA_NEEDS_RESUME 3237 static int alc_resume(struct hda_codec *codec) 3238 { 3239 codec->patch_ops.init(codec); 3240 snd_hda_codec_resume_amp(codec); 3241 snd_hda_codec_resume_cache(codec); 3242 return 0; 3243 } 3244 #endif 3245 3246 /* 3247 */ 3248 static struct hda_codec_ops alc_patch_ops = { 3249 .build_controls = alc_build_controls, 3250 .build_pcms = alc_build_pcms, 3251 .init = alc_init, 3252 .free = alc_free, 3253 .unsol_event = alc_unsol_event, 3254 #ifdef SND_HDA_NEEDS_RESUME 3255 .resume = alc_resume, 3256 #endif 3257 #ifdef CONFIG_SND_HDA_POWER_SAVE 3258 .check_power_status = alc_check_power_status, 3259 #endif 3260 }; 3261 3262 3263 /* 3264 * Test configuration for debugging 3265 * 3266 * Almost all inputs/outputs are enabled. I/O pins can be configured via 3267 * enum controls. 3268 */ 3269 #ifdef CONFIG_SND_DEBUG 3270 static hda_nid_t alc880_test_dac_nids[4] = { 3271 0x02, 0x03, 0x04, 0x05 3272 }; 3273 3274 static struct hda_input_mux alc880_test_capture_source = { 3275 .num_items = 7, 3276 .items = { 3277 { "In-1", 0x0 }, 3278 { "In-2", 0x1 }, 3279 { "In-3", 0x2 }, 3280 { "In-4", 0x3 }, 3281 { "CD", 0x4 }, 3282 { "Front", 0x5 }, 3283 { "Surround", 0x6 }, 3284 }, 3285 }; 3286 3287 static struct hda_channel_mode alc880_test_modes[4] = { 3288 { 2, NULL }, 3289 { 4, NULL }, 3290 { 6, NULL }, 3291 { 8, NULL }, 3292 }; 3293 3294 static int alc_test_pin_ctl_info(struct snd_kcontrol *kcontrol, 3295 struct snd_ctl_elem_info *uinfo) 3296 { 3297 static char *texts[] = { 3298 "N/A", "Line Out", "HP Out", 3299 "In Hi-Z", "In 50%", "In Grd", "In 80%", "In 100%" 3300 }; 3301 uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; 3302 uinfo->count = 1; 3303 uinfo->value.enumerated.items = 8; 3304 if (uinfo->value.enumerated.item >= 8) 3305 uinfo->value.enumerated.item = 7; 3306 strcpy(uinfo->value.enumerated.name, texts[uinfo->value.enumerated.item]); 3307 return 0; 3308 } 3309 3310 static int alc_test_pin_ctl_get(struct snd_kcontrol *kcontrol, 3311 struct snd_ctl_elem_value *ucontrol) 3312 { 3313 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 3314 hda_nid_t nid = (hda_nid_t)kcontrol->private_value; 3315 unsigned int pin_ctl, item = 0; 3316 3317 pin_ctl = snd_hda_codec_read(codec, nid, 0, 3318 AC_VERB_GET_PIN_WIDGET_CONTROL, 0); 3319 if (pin_ctl & AC_PINCTL_OUT_EN) { 3320 if (pin_ctl & AC_PINCTL_HP_EN) 3321 item = 2; 3322 else 3323 item = 1; 3324 } else if (pin_ctl & AC_PINCTL_IN_EN) { 3325 switch (pin_ctl & AC_PINCTL_VREFEN) { 3326 case AC_PINCTL_VREF_HIZ: item = 3; break; 3327 case AC_PINCTL_VREF_50: item = 4; break; 3328 case AC_PINCTL_VREF_GRD: item = 5; break; 3329 case AC_PINCTL_VREF_80: item = 6; break; 3330 case AC_PINCTL_VREF_100: item = 7; break; 3331 } 3332 } 3333 ucontrol->value.enumerated.item[0] = item; 3334 return 0; 3335 } 3336 3337 static int alc_test_pin_ctl_put(struct snd_kcontrol *kcontrol, 3338 struct snd_ctl_elem_value *ucontrol) 3339 { 3340 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 3341 hda_nid_t nid = (hda_nid_t)kcontrol->private_value; 3342 static unsigned int ctls[] = { 3343 0, AC_PINCTL_OUT_EN, AC_PINCTL_OUT_EN | AC_PINCTL_HP_EN, 3344 AC_PINCTL_IN_EN | AC_PINCTL_VREF_HIZ, 3345 AC_PINCTL_IN_EN | AC_PINCTL_VREF_50, 3346 AC_PINCTL_IN_EN | AC_PINCTL_VREF_GRD, 3347 AC_PINCTL_IN_EN | AC_PINCTL_VREF_80, 3348 AC_PINCTL_IN_EN | AC_PINCTL_VREF_100, 3349 }; 3350 unsigned int old_ctl, new_ctl; 3351 3352 old_ctl = snd_hda_codec_read(codec, nid, 0, 3353 AC_VERB_GET_PIN_WIDGET_CONTROL, 0); 3354 new_ctl = ctls[ucontrol->value.enumerated.item[0]]; 3355 if (old_ctl != new_ctl) { 3356 int val; 3357 snd_hda_codec_write_cache(codec, nid, 0, 3358 AC_VERB_SET_PIN_WIDGET_CONTROL, 3359 new_ctl); 3360 val = ucontrol->value.enumerated.item[0] >= 3 ? 3361 HDA_AMP_MUTE : 0; 3362 snd_hda_codec_amp_stereo(codec, nid, HDA_OUTPUT, 0, 3363 HDA_AMP_MUTE, val); 3364 return 1; 3365 } 3366 return 0; 3367 } 3368 3369 static int alc_test_pin_src_info(struct snd_kcontrol *kcontrol, 3370 struct snd_ctl_elem_info *uinfo) 3371 { 3372 static char *texts[] = { 3373 "Front", "Surround", "CLFE", "Side" 3374 }; 3375 uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; 3376 uinfo->count = 1; 3377 uinfo->value.enumerated.items = 4; 3378 if (uinfo->value.enumerated.item >= 4) 3379 uinfo->value.enumerated.item = 3; 3380 strcpy(uinfo->value.enumerated.name, texts[uinfo->value.enumerated.item]); 3381 return 0; 3382 } 3383 3384 static int alc_test_pin_src_get(struct snd_kcontrol *kcontrol, 3385 struct snd_ctl_elem_value *ucontrol) 3386 { 3387 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 3388 hda_nid_t nid = (hda_nid_t)kcontrol->private_value; 3389 unsigned int sel; 3390 3391 sel = snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_CONNECT_SEL, 0); 3392 ucontrol->value.enumerated.item[0] = sel & 3; 3393 return 0; 3394 } 3395 3396 static int alc_test_pin_src_put(struct snd_kcontrol *kcontrol, 3397 struct snd_ctl_elem_value *ucontrol) 3398 { 3399 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 3400 hda_nid_t nid = (hda_nid_t)kcontrol->private_value; 3401 unsigned int sel; 3402 3403 sel = snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_CONNECT_SEL, 0) & 3; 3404 if (ucontrol->value.enumerated.item[0] != sel) { 3405 sel = ucontrol->value.enumerated.item[0] & 3; 3406 snd_hda_codec_write_cache(codec, nid, 0, 3407 AC_VERB_SET_CONNECT_SEL, sel); 3408 return 1; 3409 } 3410 return 0; 3411 } 3412 3413 #define PIN_CTL_TEST(xname,nid) { \ 3414 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \ 3415 .name = xname, \ 3416 .info = alc_test_pin_ctl_info, \ 3417 .get = alc_test_pin_ctl_get, \ 3418 .put = alc_test_pin_ctl_put, \ 3419 .private_value = nid \ 3420 } 3421 3422 #define PIN_SRC_TEST(xname,nid) { \ 3423 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \ 3424 .name = xname, \ 3425 .info = alc_test_pin_src_info, \ 3426 .get = alc_test_pin_src_get, \ 3427 .put = alc_test_pin_src_put, \ 3428 .private_value = nid \ 3429 } 3430 3431 static struct snd_kcontrol_new alc880_test_mixer[] = { 3432 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 3433 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT), 3434 HDA_CODEC_VOLUME("CLFE Playback Volume", 0x0e, 0x0, HDA_OUTPUT), 3435 HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT), 3436 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 3437 HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT), 3438 HDA_BIND_MUTE("CLFE Playback Switch", 0x0e, 2, HDA_INPUT), 3439 HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT), 3440 PIN_CTL_TEST("Front Pin Mode", 0x14), 3441 PIN_CTL_TEST("Surround Pin Mode", 0x15), 3442 PIN_CTL_TEST("CLFE Pin Mode", 0x16), 3443 PIN_CTL_TEST("Side Pin Mode", 0x17), 3444 PIN_CTL_TEST("In-1 Pin Mode", 0x18), 3445 PIN_CTL_TEST("In-2 Pin Mode", 0x19), 3446 PIN_CTL_TEST("In-3 Pin Mode", 0x1a), 3447 PIN_CTL_TEST("In-4 Pin Mode", 0x1b), 3448 PIN_SRC_TEST("In-1 Pin Source", 0x18), 3449 PIN_SRC_TEST("In-2 Pin Source", 0x19), 3450 PIN_SRC_TEST("In-3 Pin Source", 0x1a), 3451 PIN_SRC_TEST("In-4 Pin Source", 0x1b), 3452 HDA_CODEC_VOLUME("In-1 Playback Volume", 0x0b, 0x0, HDA_INPUT), 3453 HDA_CODEC_MUTE("In-1 Playback Switch", 0x0b, 0x0, HDA_INPUT), 3454 HDA_CODEC_VOLUME("In-2 Playback Volume", 0x0b, 0x1, HDA_INPUT), 3455 HDA_CODEC_MUTE("In-2 Playback Switch", 0x0b, 0x1, HDA_INPUT), 3456 HDA_CODEC_VOLUME("In-3 Playback Volume", 0x0b, 0x2, HDA_INPUT), 3457 HDA_CODEC_MUTE("In-3 Playback Switch", 0x0b, 0x2, HDA_INPUT), 3458 HDA_CODEC_VOLUME("In-4 Playback Volume", 0x0b, 0x3, HDA_INPUT), 3459 HDA_CODEC_MUTE("In-4 Playback Switch", 0x0b, 0x3, HDA_INPUT), 3460 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x4, HDA_INPUT), 3461 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x4, HDA_INPUT), 3462 { 3463 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 3464 .name = "Channel Mode", 3465 .info = alc_ch_mode_info, 3466 .get = alc_ch_mode_get, 3467 .put = alc_ch_mode_put, 3468 }, 3469 { } /* end */ 3470 }; 3471 3472 static struct hda_verb alc880_test_init_verbs[] = { 3473 /* Unmute inputs of 0x0c - 0x0f */ 3474 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 3475 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 3476 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 3477 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 3478 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 3479 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 3480 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 3481 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 3482 /* Vol output for 0x0c-0x0f */ 3483 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 3484 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 3485 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 3486 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 3487 /* Set output pins 0x14-0x17 */ 3488 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 3489 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 3490 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 3491 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 3492 /* Unmute output pins 0x14-0x17 */ 3493 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 3494 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 3495 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 3496 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 3497 /* Set input pins 0x18-0x1c */ 3498 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, 3499 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, 3500 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 3501 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 3502 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 3503 /* Mute input pins 0x18-0x1b */ 3504 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 3505 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 3506 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 3507 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 3508 /* ADC set up */ 3509 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 3510 {0x07, AC_VERB_SET_CONNECT_SEL, 0x00}, 3511 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 3512 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00}, 3513 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 3514 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00}, 3515 /* Analog input/passthru */ 3516 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 3517 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 3518 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, 3519 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, 3520 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, 3521 { } 3522 }; 3523 #endif 3524 3525 /* 3526 */ 3527 3528 static const char *alc880_models[ALC880_MODEL_LAST] = { 3529 [ALC880_3ST] = "3stack", 3530 [ALC880_TCL_S700] = "tcl", 3531 [ALC880_3ST_DIG] = "3stack-digout", 3532 [ALC880_CLEVO] = "clevo", 3533 [ALC880_5ST] = "5stack", 3534 [ALC880_5ST_DIG] = "5stack-digout", 3535 [ALC880_W810] = "w810", 3536 [ALC880_Z71V] = "z71v", 3537 [ALC880_6ST] = "6stack", 3538 [ALC880_6ST_DIG] = "6stack-digout", 3539 [ALC880_ASUS] = "asus", 3540 [ALC880_ASUS_W1V] = "asus-w1v", 3541 [ALC880_ASUS_DIG] = "asus-dig", 3542 [ALC880_ASUS_DIG2] = "asus-dig2", 3543 [ALC880_UNIWILL_DIG] = "uniwill", 3544 [ALC880_UNIWILL_P53] = "uniwill-p53", 3545 [ALC880_FUJITSU] = "fujitsu", 3546 [ALC880_F1734] = "F1734", 3547 [ALC880_LG] = "lg", 3548 [ALC880_LG_LW] = "lg-lw", 3549 [ALC880_MEDION_RIM] = "medion", 3550 #ifdef CONFIG_SND_DEBUG 3551 [ALC880_TEST] = "test", 3552 #endif 3553 [ALC880_AUTO] = "auto", 3554 }; 3555 3556 static struct snd_pci_quirk alc880_cfg_tbl[] = { 3557 SND_PCI_QUIRK(0x1019, 0x0f69, "Coeus G610P", ALC880_W810), 3558 SND_PCI_QUIRK(0x1019, 0xa880, "ECS", ALC880_5ST_DIG), 3559 SND_PCI_QUIRK(0x1019, 0xa884, "Acer APFV", ALC880_6ST), 3560 SND_PCI_QUIRK(0x1025, 0x0070, "ULI", ALC880_3ST_DIG), 3561 SND_PCI_QUIRK(0x1025, 0x0077, "ULI", ALC880_6ST_DIG), 3562 SND_PCI_QUIRK(0x1025, 0x0078, "ULI", ALC880_6ST_DIG), 3563 SND_PCI_QUIRK(0x1025, 0x0087, "ULI", ALC880_6ST_DIG), 3564 SND_PCI_QUIRK(0x1025, 0xe309, "ULI", ALC880_3ST_DIG), 3565 SND_PCI_QUIRK(0x1025, 0xe310, "ULI", ALC880_3ST), 3566 SND_PCI_QUIRK(0x1039, 0x1234, NULL, ALC880_6ST_DIG), 3567 SND_PCI_QUIRK(0x103c, 0x2a09, "HP", ALC880_5ST), 3568 SND_PCI_QUIRK(0x1043, 0x10b3, "ASUS W1V", ALC880_ASUS_W1V), 3569 SND_PCI_QUIRK(0x1043, 0x10c2, "ASUS W6A", ALC880_ASUS_DIG), 3570 SND_PCI_QUIRK(0x1043, 0x10c3, "ASUS Wxx", ALC880_ASUS_DIG), 3571 SND_PCI_QUIRK(0x1043, 0x1113, "ASUS", ALC880_ASUS_DIG), 3572 SND_PCI_QUIRK(0x1043, 0x1123, "ASUS", ALC880_ASUS_DIG), 3573 SND_PCI_QUIRK(0x1043, 0x1173, "ASUS", ALC880_ASUS_DIG), 3574 SND_PCI_QUIRK(0x1043, 0x1964, "ASUS Z71V", ALC880_Z71V), 3575 /* SND_PCI_QUIRK(0x1043, 0x1964, "ASUS", ALC880_ASUS_DIG), */ 3576 SND_PCI_QUIRK(0x1043, 0x1973, "ASUS", ALC880_ASUS_DIG), 3577 SND_PCI_QUIRK(0x1043, 0x19b3, "ASUS", ALC880_ASUS_DIG), 3578 SND_PCI_QUIRK(0x1043, 0x814e, "ASUS P5GD1 w/SPDIF", ALC880_6ST_DIG), 3579 SND_PCI_QUIRK(0x1043, 0x8181, "ASUS P4GPL", ALC880_ASUS_DIG), 3580 SND_PCI_QUIRK(0x1043, 0x8196, "ASUS P5GD1", ALC880_6ST), 3581 SND_PCI_QUIRK(0x1043, 0x81b4, "ASUS", ALC880_6ST), 3582 SND_PCI_QUIRK_VENDOR(0x1043, "ASUS", ALC880_ASUS), /* default ASUS */ 3583 SND_PCI_QUIRK(0x104d, 0x81a0, "Sony", ALC880_3ST), 3584 SND_PCI_QUIRK(0x104d, 0x81d6, "Sony", ALC880_3ST), 3585 SND_PCI_QUIRK(0x107b, 0x3032, "Gateway", ALC880_5ST), 3586 SND_PCI_QUIRK(0x107b, 0x3033, "Gateway", ALC880_5ST), 3587 SND_PCI_QUIRK(0x107b, 0x4039, "Gateway", ALC880_5ST), 3588 SND_PCI_QUIRK(0x1297, 0xc790, "Shuttle ST20G5", ALC880_6ST_DIG), 3589 SND_PCI_QUIRK(0x1458, 0xa102, "Gigabyte K8", ALC880_6ST_DIG), 3590 SND_PCI_QUIRK(0x1462, 0x1150, "MSI", ALC880_6ST_DIG), 3591 SND_PCI_QUIRK(0x1509, 0x925d, "FIC P4M", ALC880_6ST_DIG), 3592 SND_PCI_QUIRK(0x1558, 0x0520, "Clevo m520G", ALC880_CLEVO), 3593 SND_PCI_QUIRK(0x1558, 0x0660, "Clevo m655n", ALC880_CLEVO), 3594 SND_PCI_QUIRK(0x1558, 0x5401, "ASUS", ALC880_ASUS_DIG2), 3595 SND_PCI_QUIRK(0x1565, 0x8202, "Biostar", ALC880_5ST_DIG), 3596 SND_PCI_QUIRK(0x1584, 0x9050, "Uniwill", ALC880_UNIWILL_DIG), 3597 SND_PCI_QUIRK(0x1584, 0x9054, "Uniwlll", ALC880_F1734), 3598 SND_PCI_QUIRK(0x1584, 0x9070, "Uniwill", ALC880_UNIWILL), 3599 SND_PCI_QUIRK(0x1584, 0x9077, "Uniwill P53", ALC880_UNIWILL_P53), 3600 SND_PCI_QUIRK(0x161f, 0x203d, "W810", ALC880_W810), 3601 SND_PCI_QUIRK(0x161f, 0x205d, "Medion Rim 2150", ALC880_MEDION_RIM), 3602 SND_PCI_QUIRK(0x1695, 0x400d, "EPoX", ALC880_5ST_DIG), 3603 SND_PCI_QUIRK(0x1695, 0x4012, "EPox EP-5LDA", ALC880_5ST_DIG), 3604 SND_PCI_QUIRK(0x1734, 0x107c, "FSC F1734", ALC880_F1734), 3605 SND_PCI_QUIRK(0x1734, 0x1094, "FSC Amilo M1451G", ALC880_FUJITSU), 3606 SND_PCI_QUIRK(0x1734, 0x10ac, "FSC", ALC880_UNIWILL), 3607 SND_PCI_QUIRK(0x1734, 0x10b0, "Fujitsu", ALC880_FUJITSU), 3608 SND_PCI_QUIRK(0x1854, 0x0018, "LG LW20", ALC880_LG_LW), 3609 SND_PCI_QUIRK(0x1854, 0x003b, "LG", ALC880_LG), 3610 SND_PCI_QUIRK(0x1854, 0x0068, "LG w1", ALC880_LG), 3611 SND_PCI_QUIRK(0x1854, 0x0077, "LG LW25", ALC880_LG_LW), 3612 SND_PCI_QUIRK(0x19db, 0x4188, "TCL S700", ALC880_TCL_S700), 3613 SND_PCI_QUIRK(0x2668, 0x8086, NULL, ALC880_6ST_DIG), /* broken BIOS */ 3614 SND_PCI_QUIRK(0x8086, 0x2668, NULL, ALC880_6ST_DIG), 3615 SND_PCI_QUIRK(0x8086, 0xa100, "Intel mobo", ALC880_5ST_DIG), 3616 SND_PCI_QUIRK(0x8086, 0xd400, "Intel mobo", ALC880_5ST_DIG), 3617 SND_PCI_QUIRK(0x8086, 0xd401, "Intel mobo", ALC880_5ST_DIG), 3618 SND_PCI_QUIRK(0x8086, 0xd402, "Intel mobo", ALC880_3ST_DIG), 3619 SND_PCI_QUIRK(0x8086, 0xe224, "Intel mobo", ALC880_5ST_DIG), 3620 SND_PCI_QUIRK(0x8086, 0xe305, "Intel mobo", ALC880_3ST_DIG), 3621 SND_PCI_QUIRK(0x8086, 0xe308, "Intel mobo", ALC880_3ST_DIG), 3622 SND_PCI_QUIRK(0x8086, 0xe400, "Intel mobo", ALC880_5ST_DIG), 3623 SND_PCI_QUIRK(0x8086, 0xe401, "Intel mobo", ALC880_5ST_DIG), 3624 SND_PCI_QUIRK(0x8086, 0xe402, "Intel mobo", ALC880_5ST_DIG), 3625 /* default Intel */ 3626 SND_PCI_QUIRK_VENDOR(0x8086, "Intel mobo", ALC880_3ST), 3627 SND_PCI_QUIRK(0xa0a0, 0x0560, "AOpen i915GMm-HFS", ALC880_5ST_DIG), 3628 SND_PCI_QUIRK(0xe803, 0x1019, NULL, ALC880_6ST_DIG), 3629 {} 3630 }; 3631 3632 /* 3633 * ALC880 codec presets 3634 */ 3635 static struct alc_config_preset alc880_presets[] = { 3636 [ALC880_3ST] = { 3637 .mixers = { alc880_three_stack_mixer }, 3638 .init_verbs = { alc880_volume_init_verbs, 3639 alc880_pin_3stack_init_verbs }, 3640 .num_dacs = ARRAY_SIZE(alc880_dac_nids), 3641 .dac_nids = alc880_dac_nids, 3642 .num_channel_mode = ARRAY_SIZE(alc880_threestack_modes), 3643 .channel_mode = alc880_threestack_modes, 3644 .need_dac_fix = 1, 3645 .input_mux = &alc880_capture_source, 3646 }, 3647 [ALC880_3ST_DIG] = { 3648 .mixers = { alc880_three_stack_mixer }, 3649 .init_verbs = { alc880_volume_init_verbs, 3650 alc880_pin_3stack_init_verbs }, 3651 .num_dacs = ARRAY_SIZE(alc880_dac_nids), 3652 .dac_nids = alc880_dac_nids, 3653 .dig_out_nid = ALC880_DIGOUT_NID, 3654 .num_channel_mode = ARRAY_SIZE(alc880_threestack_modes), 3655 .channel_mode = alc880_threestack_modes, 3656 .need_dac_fix = 1, 3657 .input_mux = &alc880_capture_source, 3658 }, 3659 [ALC880_TCL_S700] = { 3660 .mixers = { alc880_tcl_s700_mixer }, 3661 .init_verbs = { alc880_volume_init_verbs, 3662 alc880_pin_tcl_S700_init_verbs, 3663 alc880_gpio2_init_verbs }, 3664 .num_dacs = ARRAY_SIZE(alc880_dac_nids), 3665 .dac_nids = alc880_dac_nids, 3666 .adc_nids = alc880_adc_nids_alt, /* FIXME: correct? */ 3667 .num_adc_nids = 1, /* single ADC */ 3668 .hp_nid = 0x03, 3669 .num_channel_mode = ARRAY_SIZE(alc880_2_jack_modes), 3670 .channel_mode = alc880_2_jack_modes, 3671 .input_mux = &alc880_capture_source, 3672 }, 3673 [ALC880_5ST] = { 3674 .mixers = { alc880_three_stack_mixer, 3675 alc880_five_stack_mixer}, 3676 .init_verbs = { alc880_volume_init_verbs, 3677 alc880_pin_5stack_init_verbs }, 3678 .num_dacs = ARRAY_SIZE(alc880_dac_nids), 3679 .dac_nids = alc880_dac_nids, 3680 .num_channel_mode = ARRAY_SIZE(alc880_fivestack_modes), 3681 .channel_mode = alc880_fivestack_modes, 3682 .input_mux = &alc880_capture_source, 3683 }, 3684 [ALC880_5ST_DIG] = { 3685 .mixers = { alc880_three_stack_mixer, 3686 alc880_five_stack_mixer }, 3687 .init_verbs = { alc880_volume_init_verbs, 3688 alc880_pin_5stack_init_verbs }, 3689 .num_dacs = ARRAY_SIZE(alc880_dac_nids), 3690 .dac_nids = alc880_dac_nids, 3691 .dig_out_nid = ALC880_DIGOUT_NID, 3692 .num_channel_mode = ARRAY_SIZE(alc880_fivestack_modes), 3693 .channel_mode = alc880_fivestack_modes, 3694 .input_mux = &alc880_capture_source, 3695 }, 3696 [ALC880_6ST] = { 3697 .mixers = { alc880_six_stack_mixer }, 3698 .init_verbs = { alc880_volume_init_verbs, 3699 alc880_pin_6stack_init_verbs }, 3700 .num_dacs = ARRAY_SIZE(alc880_6st_dac_nids), 3701 .dac_nids = alc880_6st_dac_nids, 3702 .num_channel_mode = ARRAY_SIZE(alc880_sixstack_modes), 3703 .channel_mode = alc880_sixstack_modes, 3704 .input_mux = &alc880_6stack_capture_source, 3705 }, 3706 [ALC880_6ST_DIG] = { 3707 .mixers = { alc880_six_stack_mixer }, 3708 .init_verbs = { alc880_volume_init_verbs, 3709 alc880_pin_6stack_init_verbs }, 3710 .num_dacs = ARRAY_SIZE(alc880_6st_dac_nids), 3711 .dac_nids = alc880_6st_dac_nids, 3712 .dig_out_nid = ALC880_DIGOUT_NID, 3713 .num_channel_mode = ARRAY_SIZE(alc880_sixstack_modes), 3714 .channel_mode = alc880_sixstack_modes, 3715 .input_mux = &alc880_6stack_capture_source, 3716 }, 3717 [ALC880_W810] = { 3718 .mixers = { alc880_w810_base_mixer }, 3719 .init_verbs = { alc880_volume_init_verbs, 3720 alc880_pin_w810_init_verbs, 3721 alc880_gpio2_init_verbs }, 3722 .num_dacs = ARRAY_SIZE(alc880_w810_dac_nids), 3723 .dac_nids = alc880_w810_dac_nids, 3724 .dig_out_nid = ALC880_DIGOUT_NID, 3725 .num_channel_mode = ARRAY_SIZE(alc880_w810_modes), 3726 .channel_mode = alc880_w810_modes, 3727 .input_mux = &alc880_capture_source, 3728 }, 3729 [ALC880_Z71V] = { 3730 .mixers = { alc880_z71v_mixer }, 3731 .init_verbs = { alc880_volume_init_verbs, 3732 alc880_pin_z71v_init_verbs }, 3733 .num_dacs = ARRAY_SIZE(alc880_z71v_dac_nids), 3734 .dac_nids = alc880_z71v_dac_nids, 3735 .dig_out_nid = ALC880_DIGOUT_NID, 3736 .hp_nid = 0x03, 3737 .num_channel_mode = ARRAY_SIZE(alc880_2_jack_modes), 3738 .channel_mode = alc880_2_jack_modes, 3739 .input_mux = &alc880_capture_source, 3740 }, 3741 [ALC880_F1734] = { 3742 .mixers = { alc880_f1734_mixer }, 3743 .init_verbs = { alc880_volume_init_verbs, 3744 alc880_pin_f1734_init_verbs }, 3745 .num_dacs = ARRAY_SIZE(alc880_f1734_dac_nids), 3746 .dac_nids = alc880_f1734_dac_nids, 3747 .hp_nid = 0x02, 3748 .num_channel_mode = ARRAY_SIZE(alc880_2_jack_modes), 3749 .channel_mode = alc880_2_jack_modes, 3750 .input_mux = &alc880_f1734_capture_source, 3751 .unsol_event = alc880_uniwill_p53_unsol_event, 3752 .init_hook = alc880_uniwill_p53_hp_automute, 3753 }, 3754 [ALC880_ASUS] = { 3755 .mixers = { alc880_asus_mixer }, 3756 .init_verbs = { alc880_volume_init_verbs, 3757 alc880_pin_asus_init_verbs, 3758 alc880_gpio1_init_verbs }, 3759 .num_dacs = ARRAY_SIZE(alc880_asus_dac_nids), 3760 .dac_nids = alc880_asus_dac_nids, 3761 .num_channel_mode = ARRAY_SIZE(alc880_asus_modes), 3762 .channel_mode = alc880_asus_modes, 3763 .need_dac_fix = 1, 3764 .input_mux = &alc880_capture_source, 3765 }, 3766 [ALC880_ASUS_DIG] = { 3767 .mixers = { alc880_asus_mixer }, 3768 .init_verbs = { alc880_volume_init_verbs, 3769 alc880_pin_asus_init_verbs, 3770 alc880_gpio1_init_verbs }, 3771 .num_dacs = ARRAY_SIZE(alc880_asus_dac_nids), 3772 .dac_nids = alc880_asus_dac_nids, 3773 .dig_out_nid = ALC880_DIGOUT_NID, 3774 .num_channel_mode = ARRAY_SIZE(alc880_asus_modes), 3775 .channel_mode = alc880_asus_modes, 3776 .need_dac_fix = 1, 3777 .input_mux = &alc880_capture_source, 3778 }, 3779 [ALC880_ASUS_DIG2] = { 3780 .mixers = { alc880_asus_mixer }, 3781 .init_verbs = { alc880_volume_init_verbs, 3782 alc880_pin_asus_init_verbs, 3783 alc880_gpio2_init_verbs }, /* use GPIO2 */ 3784 .num_dacs = ARRAY_SIZE(alc880_asus_dac_nids), 3785 .dac_nids = alc880_asus_dac_nids, 3786 .dig_out_nid = ALC880_DIGOUT_NID, 3787 .num_channel_mode = ARRAY_SIZE(alc880_asus_modes), 3788 .channel_mode = alc880_asus_modes, 3789 .need_dac_fix = 1, 3790 .input_mux = &alc880_capture_source, 3791 }, 3792 [ALC880_ASUS_W1V] = { 3793 .mixers = { alc880_asus_mixer, alc880_asus_w1v_mixer }, 3794 .init_verbs = { alc880_volume_init_verbs, 3795 alc880_pin_asus_init_verbs, 3796 alc880_gpio1_init_verbs }, 3797 .num_dacs = ARRAY_SIZE(alc880_asus_dac_nids), 3798 .dac_nids = alc880_asus_dac_nids, 3799 .dig_out_nid = ALC880_DIGOUT_NID, 3800 .num_channel_mode = ARRAY_SIZE(alc880_asus_modes), 3801 .channel_mode = alc880_asus_modes, 3802 .need_dac_fix = 1, 3803 .input_mux = &alc880_capture_source, 3804 }, 3805 [ALC880_UNIWILL_DIG] = { 3806 .mixers = { alc880_asus_mixer }, 3807 .init_verbs = { alc880_volume_init_verbs, 3808 alc880_pin_asus_init_verbs }, 3809 .num_dacs = ARRAY_SIZE(alc880_asus_dac_nids), 3810 .dac_nids = alc880_asus_dac_nids, 3811 .dig_out_nid = ALC880_DIGOUT_NID, 3812 .num_channel_mode = ARRAY_SIZE(alc880_asus_modes), 3813 .channel_mode = alc880_asus_modes, 3814 .need_dac_fix = 1, 3815 .input_mux = &alc880_capture_source, 3816 }, 3817 [ALC880_UNIWILL] = { 3818 .mixers = { alc880_uniwill_mixer }, 3819 .init_verbs = { alc880_volume_init_verbs, 3820 alc880_uniwill_init_verbs }, 3821 .num_dacs = ARRAY_SIZE(alc880_asus_dac_nids), 3822 .dac_nids = alc880_asus_dac_nids, 3823 .dig_out_nid = ALC880_DIGOUT_NID, 3824 .num_channel_mode = ARRAY_SIZE(alc880_threestack_modes), 3825 .channel_mode = alc880_threestack_modes, 3826 .need_dac_fix = 1, 3827 .input_mux = &alc880_capture_source, 3828 .unsol_event = alc880_uniwill_unsol_event, 3829 .init_hook = alc880_uniwill_automute, 3830 }, 3831 [ALC880_UNIWILL_P53] = { 3832 .mixers = { alc880_uniwill_p53_mixer }, 3833 .init_verbs = { alc880_volume_init_verbs, 3834 alc880_uniwill_p53_init_verbs }, 3835 .num_dacs = ARRAY_SIZE(alc880_asus_dac_nids), 3836 .dac_nids = alc880_asus_dac_nids, 3837 .num_channel_mode = ARRAY_SIZE(alc880_w810_modes), 3838 .channel_mode = alc880_threestack_modes, 3839 .input_mux = &alc880_capture_source, 3840 .unsol_event = alc880_uniwill_p53_unsol_event, 3841 .init_hook = alc880_uniwill_p53_hp_automute, 3842 }, 3843 [ALC880_FUJITSU] = { 3844 .mixers = { alc880_fujitsu_mixer }, 3845 .init_verbs = { alc880_volume_init_verbs, 3846 alc880_uniwill_p53_init_verbs, 3847 alc880_beep_init_verbs }, 3848 .num_dacs = ARRAY_SIZE(alc880_dac_nids), 3849 .dac_nids = alc880_dac_nids, 3850 .dig_out_nid = ALC880_DIGOUT_NID, 3851 .num_channel_mode = ARRAY_SIZE(alc880_2_jack_modes), 3852 .channel_mode = alc880_2_jack_modes, 3853 .input_mux = &alc880_capture_source, 3854 .unsol_event = alc880_uniwill_p53_unsol_event, 3855 .init_hook = alc880_uniwill_p53_hp_automute, 3856 }, 3857 [ALC880_CLEVO] = { 3858 .mixers = { alc880_three_stack_mixer }, 3859 .init_verbs = { alc880_volume_init_verbs, 3860 alc880_pin_clevo_init_verbs }, 3861 .num_dacs = ARRAY_SIZE(alc880_dac_nids), 3862 .dac_nids = alc880_dac_nids, 3863 .hp_nid = 0x03, 3864 .num_channel_mode = ARRAY_SIZE(alc880_threestack_modes), 3865 .channel_mode = alc880_threestack_modes, 3866 .need_dac_fix = 1, 3867 .input_mux = &alc880_capture_source, 3868 }, 3869 [ALC880_LG] = { 3870 .mixers = { alc880_lg_mixer }, 3871 .init_verbs = { alc880_volume_init_verbs, 3872 alc880_lg_init_verbs }, 3873 .num_dacs = ARRAY_SIZE(alc880_lg_dac_nids), 3874 .dac_nids = alc880_lg_dac_nids, 3875 .dig_out_nid = ALC880_DIGOUT_NID, 3876 .num_channel_mode = ARRAY_SIZE(alc880_lg_ch_modes), 3877 .channel_mode = alc880_lg_ch_modes, 3878 .need_dac_fix = 1, 3879 .input_mux = &alc880_lg_capture_source, 3880 .unsol_event = alc880_lg_unsol_event, 3881 .init_hook = alc880_lg_automute, 3882 #ifdef CONFIG_SND_HDA_POWER_SAVE 3883 .loopbacks = alc880_lg_loopbacks, 3884 #endif 3885 }, 3886 [ALC880_LG_LW] = { 3887 .mixers = { alc880_lg_lw_mixer }, 3888 .init_verbs = { alc880_volume_init_verbs, 3889 alc880_lg_lw_init_verbs }, 3890 .num_dacs = ARRAY_SIZE(alc880_dac_nids), 3891 .dac_nids = alc880_dac_nids, 3892 .dig_out_nid = ALC880_DIGOUT_NID, 3893 .num_channel_mode = ARRAY_SIZE(alc880_lg_lw_modes), 3894 .channel_mode = alc880_lg_lw_modes, 3895 .input_mux = &alc880_lg_lw_capture_source, 3896 .unsol_event = alc880_lg_lw_unsol_event, 3897 .init_hook = alc880_lg_lw_automute, 3898 }, 3899 [ALC880_MEDION_RIM] = { 3900 .mixers = { alc880_medion_rim_mixer }, 3901 .init_verbs = { alc880_volume_init_verbs, 3902 alc880_medion_rim_init_verbs, 3903 alc_gpio2_init_verbs }, 3904 .num_dacs = ARRAY_SIZE(alc880_dac_nids), 3905 .dac_nids = alc880_dac_nids, 3906 .dig_out_nid = ALC880_DIGOUT_NID, 3907 .num_channel_mode = ARRAY_SIZE(alc880_2_jack_modes), 3908 .channel_mode = alc880_2_jack_modes, 3909 .input_mux = &alc880_medion_rim_capture_source, 3910 .unsol_event = alc880_medion_rim_unsol_event, 3911 .init_hook = alc880_medion_rim_automute, 3912 }, 3913 #ifdef CONFIG_SND_DEBUG 3914 [ALC880_TEST] = { 3915 .mixers = { alc880_test_mixer }, 3916 .init_verbs = { alc880_test_init_verbs }, 3917 .num_dacs = ARRAY_SIZE(alc880_test_dac_nids), 3918 .dac_nids = alc880_test_dac_nids, 3919 .dig_out_nid = ALC880_DIGOUT_NID, 3920 .num_channel_mode = ARRAY_SIZE(alc880_test_modes), 3921 .channel_mode = alc880_test_modes, 3922 .input_mux = &alc880_test_capture_source, 3923 }, 3924 #endif 3925 }; 3926 3927 /* 3928 * Automatic parse of I/O pins from the BIOS configuration 3929 */ 3930 3931 enum { 3932 ALC_CTL_WIDGET_VOL, 3933 ALC_CTL_WIDGET_MUTE, 3934 ALC_CTL_BIND_MUTE, 3935 }; 3936 static struct snd_kcontrol_new alc880_control_templates[] = { 3937 HDA_CODEC_VOLUME(NULL, 0, 0, 0), 3938 HDA_CODEC_MUTE(NULL, 0, 0, 0), 3939 HDA_BIND_MUTE(NULL, 0, 0, 0), 3940 }; 3941 3942 /* add dynamic controls */ 3943 static int add_control(struct alc_spec *spec, int type, const char *name, 3944 unsigned long val) 3945 { 3946 struct snd_kcontrol_new *knew; 3947 3948 snd_array_init(&spec->kctls, sizeof(*knew), 32); 3949 knew = snd_array_new(&spec->kctls); 3950 if (!knew) 3951 return -ENOMEM; 3952 *knew = alc880_control_templates[type]; 3953 knew->name = kstrdup(name, GFP_KERNEL); 3954 if (!knew->name) 3955 return -ENOMEM; 3956 knew->private_value = val; 3957 return 0; 3958 } 3959 3960 #define alc880_is_fixed_pin(nid) ((nid) >= 0x14 && (nid) <= 0x17) 3961 #define alc880_fixed_pin_idx(nid) ((nid) - 0x14) 3962 #define alc880_is_multi_pin(nid) ((nid) >= 0x18) 3963 #define alc880_multi_pin_idx(nid) ((nid) - 0x18) 3964 #define alc880_is_input_pin(nid) ((nid) >= 0x18) 3965 #define alc880_input_pin_idx(nid) ((nid) - 0x18) 3966 #define alc880_idx_to_dac(nid) ((nid) + 0x02) 3967 #define alc880_dac_to_idx(nid) ((nid) - 0x02) 3968 #define alc880_idx_to_mixer(nid) ((nid) + 0x0c) 3969 #define alc880_idx_to_selector(nid) ((nid) + 0x10) 3970 #define ALC880_PIN_CD_NID 0x1c 3971 3972 /* fill in the dac_nids table from the parsed pin configuration */ 3973 static int alc880_auto_fill_dac_nids(struct alc_spec *spec, 3974 const struct auto_pin_cfg *cfg) 3975 { 3976 hda_nid_t nid; 3977 int assigned[4]; 3978 int i, j; 3979 3980 memset(assigned, 0, sizeof(assigned)); 3981 spec->multiout.dac_nids = spec->private_dac_nids; 3982 3983 /* check the pins hardwired to audio widget */ 3984 for (i = 0; i < cfg->line_outs; i++) { 3985 nid = cfg->line_out_pins[i]; 3986 if (alc880_is_fixed_pin(nid)) { 3987 int idx = alc880_fixed_pin_idx(nid); 3988 spec->multiout.dac_nids[i] = alc880_idx_to_dac(idx); 3989 assigned[idx] = 1; 3990 } 3991 } 3992 /* left pins can be connect to any audio widget */ 3993 for (i = 0; i < cfg->line_outs; i++) { 3994 nid = cfg->line_out_pins[i]; 3995 if (alc880_is_fixed_pin(nid)) 3996 continue; 3997 /* search for an empty channel */ 3998 for (j = 0; j < cfg->line_outs; j++) { 3999 if (!assigned[j]) { 4000 spec->multiout.dac_nids[i] = 4001 alc880_idx_to_dac(j); 4002 assigned[j] = 1; 4003 break; 4004 } 4005 } 4006 } 4007 spec->multiout.num_dacs = cfg->line_outs; 4008 return 0; 4009 } 4010 4011 /* add playback controls from the parsed DAC table */ 4012 static int alc880_auto_create_multi_out_ctls(struct alc_spec *spec, 4013 const struct auto_pin_cfg *cfg) 4014 { 4015 char name[32]; 4016 static const char *chname[4] = { 4017 "Front", "Surround", NULL /*CLFE*/, "Side" 4018 }; 4019 hda_nid_t nid; 4020 int i, err; 4021 4022 for (i = 0; i < cfg->line_outs; i++) { 4023 if (!spec->multiout.dac_nids[i]) 4024 continue; 4025 nid = alc880_idx_to_mixer(alc880_dac_to_idx(spec->multiout.dac_nids[i])); 4026 if (i == 2) { 4027 /* Center/LFE */ 4028 err = add_control(spec, ALC_CTL_WIDGET_VOL, 4029 "Center Playback Volume", 4030 HDA_COMPOSE_AMP_VAL(nid, 1, 0, 4031 HDA_OUTPUT)); 4032 if (err < 0) 4033 return err; 4034 err = add_control(spec, ALC_CTL_WIDGET_VOL, 4035 "LFE Playback Volume", 4036 HDA_COMPOSE_AMP_VAL(nid, 2, 0, 4037 HDA_OUTPUT)); 4038 if (err < 0) 4039 return err; 4040 err = add_control(spec, ALC_CTL_BIND_MUTE, 4041 "Center Playback Switch", 4042 HDA_COMPOSE_AMP_VAL(nid, 1, 2, 4043 HDA_INPUT)); 4044 if (err < 0) 4045 return err; 4046 err = add_control(spec, ALC_CTL_BIND_MUTE, 4047 "LFE Playback Switch", 4048 HDA_COMPOSE_AMP_VAL(nid, 2, 2, 4049 HDA_INPUT)); 4050 if (err < 0) 4051 return err; 4052 } else { 4053 sprintf(name, "%s Playback Volume", chname[i]); 4054 err = add_control(spec, ALC_CTL_WIDGET_VOL, name, 4055 HDA_COMPOSE_AMP_VAL(nid, 3, 0, 4056 HDA_OUTPUT)); 4057 if (err < 0) 4058 return err; 4059 sprintf(name, "%s Playback Switch", chname[i]); 4060 err = add_control(spec, ALC_CTL_BIND_MUTE, name, 4061 HDA_COMPOSE_AMP_VAL(nid, 3, 2, 4062 HDA_INPUT)); 4063 if (err < 0) 4064 return err; 4065 } 4066 } 4067 return 0; 4068 } 4069 4070 /* add playback controls for speaker and HP outputs */ 4071 static int alc880_auto_create_extra_out(struct alc_spec *spec, hda_nid_t pin, 4072 const char *pfx) 4073 { 4074 hda_nid_t nid; 4075 int err; 4076 char name[32]; 4077 4078 if (!pin) 4079 return 0; 4080 4081 if (alc880_is_fixed_pin(pin)) { 4082 nid = alc880_idx_to_dac(alc880_fixed_pin_idx(pin)); 4083 /* specify the DAC as the extra output */ 4084 if (!spec->multiout.hp_nid) 4085 spec->multiout.hp_nid = nid; 4086 else 4087 spec->multiout.extra_out_nid[0] = nid; 4088 /* control HP volume/switch on the output mixer amp */ 4089 nid = alc880_idx_to_mixer(alc880_fixed_pin_idx(pin)); 4090 sprintf(name, "%s Playback Volume", pfx); 4091 err = add_control(spec, ALC_CTL_WIDGET_VOL, name, 4092 HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT)); 4093 if (err < 0) 4094 return err; 4095 sprintf(name, "%s Playback Switch", pfx); 4096 err = add_control(spec, ALC_CTL_BIND_MUTE, name, 4097 HDA_COMPOSE_AMP_VAL(nid, 3, 2, HDA_INPUT)); 4098 if (err < 0) 4099 return err; 4100 } else if (alc880_is_multi_pin(pin)) { 4101 /* set manual connection */ 4102 /* we have only a switch on HP-out PIN */ 4103 sprintf(name, "%s Playback Switch", pfx); 4104 err = add_control(spec, ALC_CTL_WIDGET_MUTE, name, 4105 HDA_COMPOSE_AMP_VAL(pin, 3, 0, HDA_OUTPUT)); 4106 if (err < 0) 4107 return err; 4108 } 4109 return 0; 4110 } 4111 4112 /* create input playback/capture controls for the given pin */ 4113 static int new_analog_input(struct alc_spec *spec, hda_nid_t pin, 4114 const char *ctlname, 4115 int idx, hda_nid_t mix_nid) 4116 { 4117 char name[32]; 4118 int err; 4119 4120 sprintf(name, "%s Playback Volume", ctlname); 4121 err = add_control(spec, ALC_CTL_WIDGET_VOL, name, 4122 HDA_COMPOSE_AMP_VAL(mix_nid, 3, idx, HDA_INPUT)); 4123 if (err < 0) 4124 return err; 4125 sprintf(name, "%s Playback Switch", ctlname); 4126 err = add_control(spec, ALC_CTL_WIDGET_MUTE, name, 4127 HDA_COMPOSE_AMP_VAL(mix_nid, 3, idx, HDA_INPUT)); 4128 if (err < 0) 4129 return err; 4130 return 0; 4131 } 4132 4133 /* create playback/capture controls for input pins */ 4134 static int alc880_auto_create_analog_input_ctls(struct alc_spec *spec, 4135 const struct auto_pin_cfg *cfg) 4136 { 4137 struct hda_input_mux *imux = &spec->private_imux[0]; 4138 int i, err, idx; 4139 4140 for (i = 0; i < AUTO_PIN_LAST; i++) { 4141 if (alc880_is_input_pin(cfg->input_pins[i])) { 4142 idx = alc880_input_pin_idx(cfg->input_pins[i]); 4143 err = new_analog_input(spec, cfg->input_pins[i], 4144 auto_pin_cfg_labels[i], 4145 idx, 0x0b); 4146 if (err < 0) 4147 return err; 4148 imux->items[imux->num_items].label = 4149 auto_pin_cfg_labels[i]; 4150 imux->items[imux->num_items].index = 4151 alc880_input_pin_idx(cfg->input_pins[i]); 4152 imux->num_items++; 4153 } 4154 } 4155 return 0; 4156 } 4157 4158 static void alc_set_pin_output(struct hda_codec *codec, hda_nid_t nid, 4159 unsigned int pin_type) 4160 { 4161 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_PIN_WIDGET_CONTROL, 4162 pin_type); 4163 /* unmute pin */ 4164 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_AMP_GAIN_MUTE, 4165 AMP_OUT_UNMUTE); 4166 } 4167 4168 static void alc880_auto_set_output_and_unmute(struct hda_codec *codec, 4169 hda_nid_t nid, int pin_type, 4170 int dac_idx) 4171 { 4172 alc_set_pin_output(codec, nid, pin_type); 4173 /* need the manual connection? */ 4174 if (alc880_is_multi_pin(nid)) { 4175 struct alc_spec *spec = codec->spec; 4176 int idx = alc880_multi_pin_idx(nid); 4177 snd_hda_codec_write(codec, alc880_idx_to_selector(idx), 0, 4178 AC_VERB_SET_CONNECT_SEL, 4179 alc880_dac_to_idx(spec->multiout.dac_nids[dac_idx])); 4180 } 4181 } 4182 4183 static int get_pin_type(int line_out_type) 4184 { 4185 if (line_out_type == AUTO_PIN_HP_OUT) 4186 return PIN_HP; 4187 else 4188 return PIN_OUT; 4189 } 4190 4191 static void alc880_auto_init_multi_out(struct hda_codec *codec) 4192 { 4193 struct alc_spec *spec = codec->spec; 4194 int i; 4195 4196 alc_subsystem_id(codec, 0x15, 0x1b, 0x14); 4197 for (i = 0; i < spec->autocfg.line_outs; i++) { 4198 hda_nid_t nid = spec->autocfg.line_out_pins[i]; 4199 int pin_type = get_pin_type(spec->autocfg.line_out_type); 4200 alc880_auto_set_output_and_unmute(codec, nid, pin_type, i); 4201 } 4202 } 4203 4204 static void alc880_auto_init_extra_out(struct hda_codec *codec) 4205 { 4206 struct alc_spec *spec = codec->spec; 4207 hda_nid_t pin; 4208 4209 pin = spec->autocfg.speaker_pins[0]; 4210 if (pin) /* connect to front */ 4211 alc880_auto_set_output_and_unmute(codec, pin, PIN_OUT, 0); 4212 pin = spec->autocfg.hp_pins[0]; 4213 if (pin) /* connect to front */ 4214 alc880_auto_set_output_and_unmute(codec, pin, PIN_HP, 0); 4215 } 4216 4217 static void alc880_auto_init_analog_input(struct hda_codec *codec) 4218 { 4219 struct alc_spec *spec = codec->spec; 4220 int i; 4221 4222 for (i = 0; i < AUTO_PIN_LAST; i++) { 4223 hda_nid_t nid = spec->autocfg.input_pins[i]; 4224 if (alc880_is_input_pin(nid)) { 4225 alc_set_input_pin(codec, nid, i); 4226 if (nid != ALC880_PIN_CD_NID && 4227 (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP)) 4228 snd_hda_codec_write(codec, nid, 0, 4229 AC_VERB_SET_AMP_GAIN_MUTE, 4230 AMP_OUT_MUTE); 4231 } 4232 } 4233 } 4234 4235 /* parse the BIOS configuration and set up the alc_spec */ 4236 /* return 1 if successful, 0 if the proper config is not found, 4237 * or a negative error code 4238 */ 4239 static int alc880_parse_auto_config(struct hda_codec *codec) 4240 { 4241 struct alc_spec *spec = codec->spec; 4242 int i, err; 4243 static hda_nid_t alc880_ignore[] = { 0x1d, 0 }; 4244 4245 err = snd_hda_parse_pin_def_config(codec, &spec->autocfg, 4246 alc880_ignore); 4247 if (err < 0) 4248 return err; 4249 if (!spec->autocfg.line_outs) 4250 return 0; /* can't find valid BIOS pin config */ 4251 4252 err = alc880_auto_fill_dac_nids(spec, &spec->autocfg); 4253 if (err < 0) 4254 return err; 4255 err = alc880_auto_create_multi_out_ctls(spec, &spec->autocfg); 4256 if (err < 0) 4257 return err; 4258 err = alc880_auto_create_extra_out(spec, 4259 spec->autocfg.speaker_pins[0], 4260 "Speaker"); 4261 if (err < 0) 4262 return err; 4263 err = alc880_auto_create_extra_out(spec, spec->autocfg.hp_pins[0], 4264 "Headphone"); 4265 if (err < 0) 4266 return err; 4267 err = alc880_auto_create_analog_input_ctls(spec, &spec->autocfg); 4268 if (err < 0) 4269 return err; 4270 4271 spec->multiout.max_channels = spec->multiout.num_dacs * 2; 4272 4273 /* check multiple SPDIF-out (for recent codecs) */ 4274 for (i = 0; i < spec->autocfg.dig_outs; i++) { 4275 hda_nid_t dig_nid; 4276 err = snd_hda_get_connections(codec, 4277 spec->autocfg.dig_out_pins[i], 4278 &dig_nid, 1); 4279 if (err < 0) 4280 continue; 4281 if (!i) 4282 spec->multiout.dig_out_nid = dig_nid; 4283 else { 4284 spec->multiout.slave_dig_outs = spec->slave_dig_outs; 4285 spec->slave_dig_outs[i - 1] = dig_nid; 4286 if (i == ARRAY_SIZE(spec->slave_dig_outs) - 1) 4287 break; 4288 } 4289 } 4290 if (spec->autocfg.dig_in_pin) 4291 spec->dig_in_nid = ALC880_DIGIN_NID; 4292 4293 if (spec->kctls.list) 4294 add_mixer(spec, spec->kctls.list); 4295 4296 add_verb(spec, alc880_volume_init_verbs); 4297 4298 spec->num_mux_defs = 1; 4299 spec->input_mux = &spec->private_imux[0]; 4300 4301 return 1; 4302 } 4303 4304 /* additional initialization for auto-configuration model */ 4305 static void alc880_auto_init(struct hda_codec *codec) 4306 { 4307 struct alc_spec *spec = codec->spec; 4308 alc880_auto_init_multi_out(codec); 4309 alc880_auto_init_extra_out(codec); 4310 alc880_auto_init_analog_input(codec); 4311 if (spec->unsol_event) 4312 alc_inithook(codec); 4313 } 4314 4315 static void set_capture_mixer(struct alc_spec *spec) 4316 { 4317 static struct snd_kcontrol_new *caps[2][3] = { 4318 { alc_capture_mixer_nosrc1, 4319 alc_capture_mixer_nosrc2, 4320 alc_capture_mixer_nosrc3 }, 4321 { alc_capture_mixer1, 4322 alc_capture_mixer2, 4323 alc_capture_mixer3 }, 4324 }; 4325 if (spec->num_adc_nids > 0 && spec->num_adc_nids <= 3) { 4326 int mux; 4327 if (spec->input_mux && spec->input_mux->num_items > 1) 4328 mux = 1; 4329 else 4330 mux = 0; 4331 spec->cap_mixer = caps[mux][spec->num_adc_nids - 1]; 4332 } 4333 } 4334 4335 #define set_beep_amp(spec, nid, idx, dir) \ 4336 ((spec)->beep_amp = HDA_COMPOSE_AMP_VAL(nid, 3, idx, dir)) 4337 4338 /* 4339 * OK, here we have finally the patch for ALC880 4340 */ 4341 4342 static int patch_alc880(struct hda_codec *codec) 4343 { 4344 struct alc_spec *spec; 4345 int board_config; 4346 int err; 4347 4348 spec = kzalloc(sizeof(*spec), GFP_KERNEL); 4349 if (spec == NULL) 4350 return -ENOMEM; 4351 4352 codec->spec = spec; 4353 4354 board_config = snd_hda_check_board_config(codec, ALC880_MODEL_LAST, 4355 alc880_models, 4356 alc880_cfg_tbl); 4357 if (board_config < 0) { 4358 printk(KERN_INFO "hda_codec: Unknown model for ALC880, " 4359 "trying auto-probe from BIOS...\n"); 4360 board_config = ALC880_AUTO; 4361 } 4362 4363 if (board_config == ALC880_AUTO) { 4364 /* automatic parse from the BIOS config */ 4365 err = alc880_parse_auto_config(codec); 4366 if (err < 0) { 4367 alc_free(codec); 4368 return err; 4369 } else if (!err) { 4370 printk(KERN_INFO 4371 "hda_codec: Cannot set up configuration " 4372 "from BIOS. Using 3-stack mode...\n"); 4373 board_config = ALC880_3ST; 4374 } 4375 } 4376 4377 err = snd_hda_attach_beep_device(codec, 0x1); 4378 if (err < 0) { 4379 alc_free(codec); 4380 return err; 4381 } 4382 4383 if (board_config != ALC880_AUTO) 4384 setup_preset(spec, &alc880_presets[board_config]); 4385 4386 spec->stream_name_analog = "ALC880 Analog"; 4387 spec->stream_analog_playback = &alc880_pcm_analog_playback; 4388 spec->stream_analog_capture = &alc880_pcm_analog_capture; 4389 spec->stream_analog_alt_capture = &alc880_pcm_analog_alt_capture; 4390 4391 spec->stream_name_digital = "ALC880 Digital"; 4392 spec->stream_digital_playback = &alc880_pcm_digital_playback; 4393 spec->stream_digital_capture = &alc880_pcm_digital_capture; 4394 4395 if (!spec->adc_nids && spec->input_mux) { 4396 /* check whether NID 0x07 is valid */ 4397 unsigned int wcap = get_wcaps(codec, alc880_adc_nids[0]); 4398 /* get type */ 4399 wcap = (wcap & AC_WCAP_TYPE) >> AC_WCAP_TYPE_SHIFT; 4400 if (wcap != AC_WID_AUD_IN) { 4401 spec->adc_nids = alc880_adc_nids_alt; 4402 spec->num_adc_nids = ARRAY_SIZE(alc880_adc_nids_alt); 4403 } else { 4404 spec->adc_nids = alc880_adc_nids; 4405 spec->num_adc_nids = ARRAY_SIZE(alc880_adc_nids); 4406 } 4407 } 4408 set_capture_mixer(spec); 4409 set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT); 4410 4411 spec->vmaster_nid = 0x0c; 4412 4413 codec->patch_ops = alc_patch_ops; 4414 if (board_config == ALC880_AUTO) 4415 spec->init_hook = alc880_auto_init; 4416 #ifdef CONFIG_SND_HDA_POWER_SAVE 4417 if (!spec->loopback.amplist) 4418 spec->loopback.amplist = alc880_loopbacks; 4419 #endif 4420 codec->proc_widget_hook = print_realtek_coef; 4421 4422 return 0; 4423 } 4424 4425 4426 /* 4427 * ALC260 support 4428 */ 4429 4430 static hda_nid_t alc260_dac_nids[1] = { 4431 /* front */ 4432 0x02, 4433 }; 4434 4435 static hda_nid_t alc260_adc_nids[1] = { 4436 /* ADC0 */ 4437 0x04, 4438 }; 4439 4440 static hda_nid_t alc260_adc_nids_alt[1] = { 4441 /* ADC1 */ 4442 0x05, 4443 }; 4444 4445 /* NIDs used when simultaneous access to both ADCs makes sense. Note that 4446 * alc260_capture_mixer assumes ADC0 (nid 0x04) is the first ADC. 4447 */ 4448 static hda_nid_t alc260_dual_adc_nids[2] = { 4449 /* ADC0, ADC1 */ 4450 0x04, 0x05 4451 }; 4452 4453 #define ALC260_DIGOUT_NID 0x03 4454 #define ALC260_DIGIN_NID 0x06 4455 4456 static struct hda_input_mux alc260_capture_source = { 4457 .num_items = 4, 4458 .items = { 4459 { "Mic", 0x0 }, 4460 { "Front Mic", 0x1 }, 4461 { "Line", 0x2 }, 4462 { "CD", 0x4 }, 4463 }, 4464 }; 4465 4466 /* On Fujitsu S702x laptops capture only makes sense from Mic/LineIn jack, 4467 * headphone jack and the internal CD lines since these are the only pins at 4468 * which audio can appear. For flexibility, also allow the option of 4469 * recording the mixer output on the second ADC (ADC0 doesn't have a 4470 * connection to the mixer output). 4471 */ 4472 static struct hda_input_mux alc260_fujitsu_capture_sources[2] = { 4473 { 4474 .num_items = 3, 4475 .items = { 4476 { "Mic/Line", 0x0 }, 4477 { "CD", 0x4 }, 4478 { "Headphone", 0x2 }, 4479 }, 4480 }, 4481 { 4482 .num_items = 4, 4483 .items = { 4484 { "Mic/Line", 0x0 }, 4485 { "CD", 0x4 }, 4486 { "Headphone", 0x2 }, 4487 { "Mixer", 0x5 }, 4488 }, 4489 }, 4490 4491 }; 4492 4493 /* Acer TravelMate(/Extensa/Aspire) notebooks have similar configuration to 4494 * the Fujitsu S702x, but jacks are marked differently. 4495 */ 4496 static struct hda_input_mux alc260_acer_capture_sources[2] = { 4497 { 4498 .num_items = 4, 4499 .items = { 4500 { "Mic", 0x0 }, 4501 { "Line", 0x2 }, 4502 { "CD", 0x4 }, 4503 { "Headphone", 0x5 }, 4504 }, 4505 }, 4506 { 4507 .num_items = 5, 4508 .items = { 4509 { "Mic", 0x0 }, 4510 { "Line", 0x2 }, 4511 { "CD", 0x4 }, 4512 { "Headphone", 0x6 }, 4513 { "Mixer", 0x5 }, 4514 }, 4515 }, 4516 }; 4517 4518 /* Maxdata Favorit 100XS */ 4519 static struct hda_input_mux alc260_favorit100_capture_sources[2] = { 4520 { 4521 .num_items = 2, 4522 .items = { 4523 { "Line/Mic", 0x0 }, 4524 { "CD", 0x4 }, 4525 }, 4526 }, 4527 { 4528 .num_items = 3, 4529 .items = { 4530 { "Line/Mic", 0x0 }, 4531 { "CD", 0x4 }, 4532 { "Mixer", 0x5 }, 4533 }, 4534 }, 4535 }; 4536 4537 /* 4538 * This is just place-holder, so there's something for alc_build_pcms to look 4539 * at when it calculates the maximum number of channels. ALC260 has no mixer 4540 * element which allows changing the channel mode, so the verb list is 4541 * never used. 4542 */ 4543 static struct hda_channel_mode alc260_modes[1] = { 4544 { 2, NULL }, 4545 }; 4546 4547 4548 /* Mixer combinations 4549 * 4550 * basic: base_output + input + pc_beep + capture 4551 * HP: base_output + input + capture_alt 4552 * HP_3013: hp_3013 + input + capture 4553 * fujitsu: fujitsu + capture 4554 * acer: acer + capture 4555 */ 4556 4557 static struct snd_kcontrol_new alc260_base_output_mixer[] = { 4558 HDA_CODEC_VOLUME("Front Playback Volume", 0x08, 0x0, HDA_OUTPUT), 4559 HDA_BIND_MUTE("Front Playback Switch", 0x08, 2, HDA_INPUT), 4560 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x09, 0x0, HDA_OUTPUT), 4561 HDA_BIND_MUTE("Headphone Playback Switch", 0x09, 2, HDA_INPUT), 4562 HDA_CODEC_VOLUME_MONO("Mono Playback Volume", 0x0a, 1, 0x0, HDA_OUTPUT), 4563 HDA_BIND_MUTE_MONO("Mono Playback Switch", 0x0a, 1, 2, HDA_INPUT), 4564 { } /* end */ 4565 }; 4566 4567 static struct snd_kcontrol_new alc260_input_mixer[] = { 4568 HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT), 4569 HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT), 4570 HDA_CODEC_VOLUME("Line Playback Volume", 0x07, 0x02, HDA_INPUT), 4571 HDA_CODEC_MUTE("Line Playback Switch", 0x07, 0x02, HDA_INPUT), 4572 HDA_CODEC_VOLUME("Mic Playback Volume", 0x07, 0x0, HDA_INPUT), 4573 HDA_CODEC_MUTE("Mic Playback Switch", 0x07, 0x0, HDA_INPUT), 4574 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x07, 0x01, HDA_INPUT), 4575 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x07, 0x01, HDA_INPUT), 4576 { } /* end */ 4577 }; 4578 4579 /* update HP, line and mono out pins according to the master switch */ 4580 static void alc260_hp_master_update(struct hda_codec *codec, 4581 hda_nid_t hp, hda_nid_t line, 4582 hda_nid_t mono) 4583 { 4584 struct alc_spec *spec = codec->spec; 4585 unsigned int val = spec->master_sw ? PIN_HP : 0; 4586 /* change HP and line-out pins */ 4587 snd_hda_codec_write(codec, hp, 0, AC_VERB_SET_PIN_WIDGET_CONTROL, 4588 val); 4589 snd_hda_codec_write(codec, line, 0, AC_VERB_SET_PIN_WIDGET_CONTROL, 4590 val); 4591 /* mono (speaker) depending on the HP jack sense */ 4592 val = (val && !spec->jack_present) ? PIN_OUT : 0; 4593 snd_hda_codec_write(codec, mono, 0, AC_VERB_SET_PIN_WIDGET_CONTROL, 4594 val); 4595 } 4596 4597 static int alc260_hp_master_sw_get(struct snd_kcontrol *kcontrol, 4598 struct snd_ctl_elem_value *ucontrol) 4599 { 4600 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 4601 struct alc_spec *spec = codec->spec; 4602 *ucontrol->value.integer.value = spec->master_sw; 4603 return 0; 4604 } 4605 4606 static int alc260_hp_master_sw_put(struct snd_kcontrol *kcontrol, 4607 struct snd_ctl_elem_value *ucontrol) 4608 { 4609 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 4610 struct alc_spec *spec = codec->spec; 4611 int val = !!*ucontrol->value.integer.value; 4612 hda_nid_t hp, line, mono; 4613 4614 if (val == spec->master_sw) 4615 return 0; 4616 spec->master_sw = val; 4617 hp = (kcontrol->private_value >> 16) & 0xff; 4618 line = (kcontrol->private_value >> 8) & 0xff; 4619 mono = kcontrol->private_value & 0xff; 4620 alc260_hp_master_update(codec, hp, line, mono); 4621 return 1; 4622 } 4623 4624 static struct snd_kcontrol_new alc260_hp_output_mixer[] = { 4625 { 4626 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 4627 .name = "Master Playback Switch", 4628 .info = snd_ctl_boolean_mono_info, 4629 .get = alc260_hp_master_sw_get, 4630 .put = alc260_hp_master_sw_put, 4631 .private_value = (0x0f << 16) | (0x10 << 8) | 0x11 4632 }, 4633 HDA_CODEC_VOLUME("Front Playback Volume", 0x08, 0x0, HDA_OUTPUT), 4634 HDA_BIND_MUTE("Front Playback Switch", 0x08, 2, HDA_INPUT), 4635 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x09, 0x0, HDA_OUTPUT), 4636 HDA_BIND_MUTE("Headphone Playback Switch", 0x09, 2, HDA_INPUT), 4637 HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0a, 1, 0x0, 4638 HDA_OUTPUT), 4639 HDA_BIND_MUTE_MONO("Speaker Playback Switch", 0x0a, 1, 2, HDA_INPUT), 4640 { } /* end */ 4641 }; 4642 4643 static struct hda_verb alc260_hp_unsol_verbs[] = { 4644 {0x10, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT}, 4645 {}, 4646 }; 4647 4648 static void alc260_hp_automute(struct hda_codec *codec) 4649 { 4650 struct alc_spec *spec = codec->spec; 4651 unsigned int present; 4652 4653 present = snd_hda_codec_read(codec, 0x10, 0, 4654 AC_VERB_GET_PIN_SENSE, 0); 4655 spec->jack_present = (present & AC_PINSENSE_PRESENCE) != 0; 4656 alc260_hp_master_update(codec, 0x0f, 0x10, 0x11); 4657 } 4658 4659 static void alc260_hp_unsol_event(struct hda_codec *codec, unsigned int res) 4660 { 4661 if ((res >> 26) == ALC880_HP_EVENT) 4662 alc260_hp_automute(codec); 4663 } 4664 4665 static struct snd_kcontrol_new alc260_hp_3013_mixer[] = { 4666 { 4667 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 4668 .name = "Master Playback Switch", 4669 .info = snd_ctl_boolean_mono_info, 4670 .get = alc260_hp_master_sw_get, 4671 .put = alc260_hp_master_sw_put, 4672 .private_value = (0x15 << 16) | (0x10 << 8) | 0x11 4673 }, 4674 HDA_CODEC_VOLUME("Front Playback Volume", 0x09, 0x0, HDA_OUTPUT), 4675 HDA_CODEC_MUTE("Front Playback Switch", 0x10, 0x0, HDA_OUTPUT), 4676 HDA_CODEC_VOLUME("Aux-In Playback Volume", 0x07, 0x06, HDA_INPUT), 4677 HDA_CODEC_MUTE("Aux-In Playback Switch", 0x07, 0x06, HDA_INPUT), 4678 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x08, 0x0, HDA_OUTPUT), 4679 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT), 4680 HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0a, 1, 0x0, HDA_OUTPUT), 4681 HDA_CODEC_MUTE_MONO("Speaker Playback Switch", 0x11, 1, 0x0, HDA_OUTPUT), 4682 { } /* end */ 4683 }; 4684 4685 static struct hda_bind_ctls alc260_dc7600_bind_master_vol = { 4686 .ops = &snd_hda_bind_vol, 4687 .values = { 4688 HDA_COMPOSE_AMP_VAL(0x08, 3, 0, HDA_OUTPUT), 4689 HDA_COMPOSE_AMP_VAL(0x09, 3, 0, HDA_OUTPUT), 4690 HDA_COMPOSE_AMP_VAL(0x0a, 3, 0, HDA_OUTPUT), 4691 0 4692 }, 4693 }; 4694 4695 static struct hda_bind_ctls alc260_dc7600_bind_switch = { 4696 .ops = &snd_hda_bind_sw, 4697 .values = { 4698 HDA_COMPOSE_AMP_VAL(0x11, 3, 0, HDA_OUTPUT), 4699 HDA_COMPOSE_AMP_VAL(0x15, 3, 0, HDA_OUTPUT), 4700 0 4701 }, 4702 }; 4703 4704 static struct snd_kcontrol_new alc260_hp_dc7600_mixer[] = { 4705 HDA_BIND_VOL("Master Playback Volume", &alc260_dc7600_bind_master_vol), 4706 HDA_BIND_SW("LineOut Playback Switch", &alc260_dc7600_bind_switch), 4707 HDA_CODEC_MUTE("Speaker Playback Switch", 0x0f, 0x0, HDA_OUTPUT), 4708 HDA_CODEC_MUTE("Headphone Playback Switch", 0x10, 0x0, HDA_OUTPUT), 4709 { } /* end */ 4710 }; 4711 4712 static struct hda_verb alc260_hp_3013_unsol_verbs[] = { 4713 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT}, 4714 {}, 4715 }; 4716 4717 static void alc260_hp_3013_automute(struct hda_codec *codec) 4718 { 4719 struct alc_spec *spec = codec->spec; 4720 unsigned int present; 4721 4722 present = snd_hda_codec_read(codec, 0x15, 0, 4723 AC_VERB_GET_PIN_SENSE, 0); 4724 spec->jack_present = (present & AC_PINSENSE_PRESENCE) != 0; 4725 alc260_hp_master_update(codec, 0x15, 0x10, 0x11); 4726 } 4727 4728 static void alc260_hp_3013_unsol_event(struct hda_codec *codec, 4729 unsigned int res) 4730 { 4731 if ((res >> 26) == ALC880_HP_EVENT) 4732 alc260_hp_3013_automute(codec); 4733 } 4734 4735 static void alc260_hp_3012_automute(struct hda_codec *codec) 4736 { 4737 unsigned int present, bits; 4738 4739 present = snd_hda_codec_read(codec, 0x10, 0, 4740 AC_VERB_GET_PIN_SENSE, 0) & AC_PINSENSE_PRESENCE; 4741 4742 bits = present ? 0 : PIN_OUT; 4743 snd_hda_codec_write(codec, 0x0f, 0, AC_VERB_SET_PIN_WIDGET_CONTROL, 4744 bits); 4745 snd_hda_codec_write(codec, 0x11, 0, AC_VERB_SET_PIN_WIDGET_CONTROL, 4746 bits); 4747 snd_hda_codec_write(codec, 0x15, 0, AC_VERB_SET_PIN_WIDGET_CONTROL, 4748 bits); 4749 } 4750 4751 static void alc260_hp_3012_unsol_event(struct hda_codec *codec, 4752 unsigned int res) 4753 { 4754 if ((res >> 26) == ALC880_HP_EVENT) 4755 alc260_hp_3012_automute(codec); 4756 } 4757 4758 /* Fujitsu S702x series laptops. ALC260 pin usage: Mic/Line jack = 0x12, 4759 * HP jack = 0x14, CD audio = 0x16, internal speaker = 0x10. 4760 */ 4761 static struct snd_kcontrol_new alc260_fujitsu_mixer[] = { 4762 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x08, 0x0, HDA_OUTPUT), 4763 HDA_BIND_MUTE("Headphone Playback Switch", 0x08, 2, HDA_INPUT), 4764 ALC_PIN_MODE("Headphone Jack Mode", 0x14, ALC_PIN_DIR_INOUT), 4765 HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT), 4766 HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT), 4767 HDA_CODEC_VOLUME("Mic/Line Playback Volume", 0x07, 0x0, HDA_INPUT), 4768 HDA_CODEC_MUTE("Mic/Line Playback Switch", 0x07, 0x0, HDA_INPUT), 4769 ALC_PIN_MODE("Mic/Line Jack Mode", 0x12, ALC_PIN_DIR_IN), 4770 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x09, 0x0, HDA_OUTPUT), 4771 HDA_BIND_MUTE("Speaker Playback Switch", 0x09, 2, HDA_INPUT), 4772 { } /* end */ 4773 }; 4774 4775 /* Mixer for Acer TravelMate(/Extensa/Aspire) notebooks. Note that current 4776 * versions of the ALC260 don't act on requests to enable mic bias from NID 4777 * 0x0f (used to drive the headphone jack in these laptops). The ALC260 4778 * datasheet doesn't mention this restriction. At this stage it's not clear 4779 * whether this behaviour is intentional or is a hardware bug in chip 4780 * revisions available in early 2006. Therefore for now allow the 4781 * "Headphone Jack Mode" control to span all choices, but if it turns out 4782 * that the lack of mic bias for this NID is intentional we could change the 4783 * mode from ALC_PIN_DIR_INOUT to ALC_PIN_DIR_INOUT_NOMICBIAS. 4784 * 4785 * In addition, Acer TravelMate(/Extensa/Aspire) notebooks in early 2006 4786 * don't appear to make the mic bias available from the "line" jack, even 4787 * though the NID used for this jack (0x14) can supply it. The theory is 4788 * that perhaps Acer have included blocking capacitors between the ALC260 4789 * and the output jack. If this turns out to be the case for all such 4790 * models the "Line Jack Mode" mode could be changed from ALC_PIN_DIR_INOUT 4791 * to ALC_PIN_DIR_INOUT_NOMICBIAS. 4792 * 4793 * The C20x Tablet series have a mono internal speaker which is controlled 4794 * via the chip's Mono sum widget and pin complex, so include the necessary 4795 * controls for such models. On models without a "mono speaker" the control 4796 * won't do anything. 4797 */ 4798 static struct snd_kcontrol_new alc260_acer_mixer[] = { 4799 HDA_CODEC_VOLUME("Master Playback Volume", 0x08, 0x0, HDA_OUTPUT), 4800 HDA_BIND_MUTE("Master Playback Switch", 0x08, 2, HDA_INPUT), 4801 ALC_PIN_MODE("Headphone Jack Mode", 0x0f, ALC_PIN_DIR_INOUT), 4802 HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0a, 1, 0x0, 4803 HDA_OUTPUT), 4804 HDA_BIND_MUTE_MONO("Speaker Playback Switch", 0x0a, 1, 2, 4805 HDA_INPUT), 4806 HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT), 4807 HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT), 4808 HDA_CODEC_VOLUME("Mic Playback Volume", 0x07, 0x0, HDA_INPUT), 4809 HDA_CODEC_MUTE("Mic Playback Switch", 0x07, 0x0, HDA_INPUT), 4810 ALC_PIN_MODE("Mic Jack Mode", 0x12, ALC_PIN_DIR_IN), 4811 HDA_CODEC_VOLUME("Line Playback Volume", 0x07, 0x02, HDA_INPUT), 4812 HDA_CODEC_MUTE("Line Playback Switch", 0x07, 0x02, HDA_INPUT), 4813 ALC_PIN_MODE("Line Jack Mode", 0x14, ALC_PIN_DIR_INOUT), 4814 { } /* end */ 4815 }; 4816 4817 /* Maxdata Favorit 100XS: one output and one input (0x12) jack 4818 */ 4819 static struct snd_kcontrol_new alc260_favorit100_mixer[] = { 4820 HDA_CODEC_VOLUME("Master Playback Volume", 0x08, 0x0, HDA_OUTPUT), 4821 HDA_BIND_MUTE("Master Playback Switch", 0x08, 2, HDA_INPUT), 4822 ALC_PIN_MODE("Output Jack Mode", 0x0f, ALC_PIN_DIR_INOUT), 4823 HDA_CODEC_VOLUME("Line/Mic Playback Volume", 0x07, 0x0, HDA_INPUT), 4824 HDA_CODEC_MUTE("Line/Mic Playback Switch", 0x07, 0x0, HDA_INPUT), 4825 ALC_PIN_MODE("Line/Mic Jack Mode", 0x12, ALC_PIN_DIR_IN), 4826 { } /* end */ 4827 }; 4828 4829 /* Packard bell V7900 ALC260 pin usage: HP = 0x0f, Mic jack = 0x12, 4830 * Line In jack = 0x14, CD audio = 0x16, pc beep = 0x17. 4831 */ 4832 static struct snd_kcontrol_new alc260_will_mixer[] = { 4833 HDA_CODEC_VOLUME("Master Playback Volume", 0x08, 0x0, HDA_OUTPUT), 4834 HDA_BIND_MUTE("Master Playback Switch", 0x08, 0x2, HDA_INPUT), 4835 HDA_CODEC_VOLUME("Mic Playback Volume", 0x07, 0x0, HDA_INPUT), 4836 HDA_CODEC_MUTE("Mic Playback Switch", 0x07, 0x0, HDA_INPUT), 4837 ALC_PIN_MODE("Mic Jack Mode", 0x12, ALC_PIN_DIR_IN), 4838 HDA_CODEC_VOLUME("Line Playback Volume", 0x07, 0x02, HDA_INPUT), 4839 HDA_CODEC_MUTE("Line Playback Switch", 0x07, 0x02, HDA_INPUT), 4840 ALC_PIN_MODE("Line Jack Mode", 0x14, ALC_PIN_DIR_INOUT), 4841 HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT), 4842 HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT), 4843 { } /* end */ 4844 }; 4845 4846 /* Replacer 672V ALC260 pin usage: Mic jack = 0x12, 4847 * Line In jack = 0x14, ATAPI Mic = 0x13, speaker = 0x0f. 4848 */ 4849 static struct snd_kcontrol_new alc260_replacer_672v_mixer[] = { 4850 HDA_CODEC_VOLUME("Master Playback Volume", 0x08, 0x0, HDA_OUTPUT), 4851 HDA_BIND_MUTE("Master Playback Switch", 0x08, 0x2, HDA_INPUT), 4852 HDA_CODEC_VOLUME("Mic Playback Volume", 0x07, 0x0, HDA_INPUT), 4853 HDA_CODEC_MUTE("Mic Playback Switch", 0x07, 0x0, HDA_INPUT), 4854 ALC_PIN_MODE("Mic Jack Mode", 0x12, ALC_PIN_DIR_IN), 4855 HDA_CODEC_VOLUME("ATAPI Mic Playback Volume", 0x07, 0x1, HDA_INPUT), 4856 HDA_CODEC_MUTE("ATATI Mic Playback Switch", 0x07, 0x1, HDA_INPUT), 4857 HDA_CODEC_VOLUME("Line Playback Volume", 0x07, 0x02, HDA_INPUT), 4858 HDA_CODEC_MUTE("Line Playback Switch", 0x07, 0x02, HDA_INPUT), 4859 ALC_PIN_MODE("Line Jack Mode", 0x14, ALC_PIN_DIR_INOUT), 4860 { } /* end */ 4861 }; 4862 4863 /* 4864 * initialization verbs 4865 */ 4866 static struct hda_verb alc260_init_verbs[] = { 4867 /* Line In pin widget for input */ 4868 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 4869 /* CD pin widget for input */ 4870 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 4871 /* Mic1 (rear panel) pin widget for input and vref at 80% */ 4872 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, 4873 /* Mic2 (front panel) pin widget for input and vref at 80% */ 4874 {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, 4875 /* LINE-2 is used for line-out in rear */ 4876 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 4877 /* select line-out */ 4878 {0x0e, AC_VERB_SET_CONNECT_SEL, 0x00}, 4879 /* LINE-OUT pin */ 4880 {0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 4881 /* enable HP */ 4882 {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 4883 /* enable Mono */ 4884 {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 4885 /* mute capture amp left and right */ 4886 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 4887 /* set connection select to line in (default select for this ADC) */ 4888 {0x04, AC_VERB_SET_CONNECT_SEL, 0x02}, 4889 /* mute capture amp left and right */ 4890 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 4891 /* set connection select to line in (default select for this ADC) */ 4892 {0x05, AC_VERB_SET_CONNECT_SEL, 0x02}, 4893 /* set vol=0 Line-Out mixer amp left and right */ 4894 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 4895 /* unmute pin widget amp left and right (no gain on this amp) */ 4896 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 4897 /* set vol=0 HP mixer amp left and right */ 4898 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 4899 /* unmute pin widget amp left and right (no gain on this amp) */ 4900 {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 4901 /* set vol=0 Mono mixer amp left and right */ 4902 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 4903 /* unmute pin widget amp left and right (no gain on this amp) */ 4904 {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 4905 /* unmute LINE-2 out pin */ 4906 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 4907 /* Amp Indexes: CD = 0x04, Line In 1 = 0x02, Mic 1 = 0x00 & 4908 * Line In 2 = 0x03 4909 */ 4910 /* mute analog inputs */ 4911 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 4912 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 4913 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, 4914 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, 4915 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, 4916 /* Amp Indexes: DAC = 0x01 & mixer = 0x00 */ 4917 /* mute Front out path */ 4918 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 4919 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 4920 /* mute Headphone out path */ 4921 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 4922 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 4923 /* mute Mono out path */ 4924 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 4925 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 4926 { } 4927 }; 4928 4929 #if 0 /* should be identical with alc260_init_verbs? */ 4930 static struct hda_verb alc260_hp_init_verbs[] = { 4931 /* Headphone and output */ 4932 {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0}, 4933 /* mono output */ 4934 {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40}, 4935 /* Mic1 (rear panel) pin widget for input and vref at 80% */ 4936 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24}, 4937 /* Mic2 (front panel) pin widget for input and vref at 80% */ 4938 {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24}, 4939 /* Line In pin widget for input */ 4940 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20}, 4941 /* Line-2 pin widget for output */ 4942 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40}, 4943 /* CD pin widget for input */ 4944 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20}, 4945 /* unmute amp left and right */ 4946 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000}, 4947 /* set connection select to line in (default select for this ADC) */ 4948 {0x04, AC_VERB_SET_CONNECT_SEL, 0x02}, 4949 /* unmute Line-Out mixer amp left and right (volume = 0) */ 4950 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000}, 4951 /* mute pin widget amp left and right (no gain on this amp) */ 4952 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000}, 4953 /* unmute HP mixer amp left and right (volume = 0) */ 4954 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000}, 4955 /* mute pin widget amp left and right (no gain on this amp) */ 4956 {0x10, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000}, 4957 /* Amp Indexes: CD = 0x04, Line In 1 = 0x02, Mic 1 = 0x00 & 4958 * Line In 2 = 0x03 4959 */ 4960 /* mute analog inputs */ 4961 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 4962 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 4963 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, 4964 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, 4965 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, 4966 /* Amp Indexes: DAC = 0x01 & mixer = 0x00 */ 4967 /* Unmute Front out path */ 4968 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))}, 4969 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))}, 4970 /* Unmute Headphone out path */ 4971 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))}, 4972 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))}, 4973 /* Unmute Mono out path */ 4974 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))}, 4975 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))}, 4976 { } 4977 }; 4978 #endif 4979 4980 static struct hda_verb alc260_hp_3013_init_verbs[] = { 4981 /* Line out and output */ 4982 {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40}, 4983 /* mono output */ 4984 {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40}, 4985 /* Mic1 (rear panel) pin widget for input and vref at 80% */ 4986 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24}, 4987 /* Mic2 (front panel) pin widget for input and vref at 80% */ 4988 {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24}, 4989 /* Line In pin widget for input */ 4990 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20}, 4991 /* Headphone pin widget for output */ 4992 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0}, 4993 /* CD pin widget for input */ 4994 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20}, 4995 /* unmute amp left and right */ 4996 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000}, 4997 /* set connection select to line in (default select for this ADC) */ 4998 {0x04, AC_VERB_SET_CONNECT_SEL, 0x02}, 4999 /* unmute Line-Out mixer amp left and right (volume = 0) */ 5000 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000}, 5001 /* mute pin widget amp left and right (no gain on this amp) */ 5002 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000}, 5003 /* unmute HP mixer amp left and right (volume = 0) */ 5004 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000}, 5005 /* mute pin widget amp left and right (no gain on this amp) */ 5006 {0x10, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000}, 5007 /* Amp Indexes: CD = 0x04, Line In 1 = 0x02, Mic 1 = 0x00 & 5008 * Line In 2 = 0x03 5009 */ 5010 /* mute analog inputs */ 5011 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 5012 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 5013 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, 5014 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, 5015 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, 5016 /* Amp Indexes: DAC = 0x01 & mixer = 0x00 */ 5017 /* Unmute Front out path */ 5018 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))}, 5019 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))}, 5020 /* Unmute Headphone out path */ 5021 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))}, 5022 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))}, 5023 /* Unmute Mono out path */ 5024 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))}, 5025 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))}, 5026 { } 5027 }; 5028 5029 /* Initialisation sequence for ALC260 as configured in Fujitsu S702x 5030 * laptops. ALC260 pin usage: Mic/Line jack = 0x12, HP jack = 0x14, CD 5031 * audio = 0x16, internal speaker = 0x10. 5032 */ 5033 static struct hda_verb alc260_fujitsu_init_verbs[] = { 5034 /* Disable all GPIOs */ 5035 {0x01, AC_VERB_SET_GPIO_MASK, 0}, 5036 /* Internal speaker is connected to headphone pin */ 5037 {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 5038 /* Headphone/Line-out jack connects to Line1 pin; make it an output */ 5039 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 5040 /* Mic/Line-in jack is connected to mic1 pin, so make it an input */ 5041 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 5042 /* Ensure all other unused pins are disabled and muted. */ 5043 {0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0}, 5044 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 5045 {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0}, 5046 {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 5047 {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, 0}, 5048 {0x13, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 5049 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0}, 5050 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 5051 5052 /* Disable digital (SPDIF) pins */ 5053 {0x03, AC_VERB_SET_DIGI_CONVERT_1, 0}, 5054 {0x06, AC_VERB_SET_DIGI_CONVERT_1, 0}, 5055 5056 /* Ensure Line1 pin widget takes its input from the OUT1 sum bus 5057 * when acting as an output. 5058 */ 5059 {0x0d, AC_VERB_SET_CONNECT_SEL, 0}, 5060 5061 /* Start with output sum widgets muted and their output gains at min */ 5062 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 5063 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 5064 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 5065 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 5066 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 5067 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 5068 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 5069 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 5070 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 5071 5072 /* Unmute HP pin widget amp left and right (no equiv mixer ctrl) */ 5073 {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 5074 /* Unmute Line1 pin widget output buffer since it starts as an output. 5075 * If the pin mode is changed by the user the pin mode control will 5076 * take care of enabling the pin's input/output buffers as needed. 5077 * Therefore there's no need to enable the input buffer at this 5078 * stage. 5079 */ 5080 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 5081 /* Unmute input buffer of pin widget used for Line-in (no equiv 5082 * mixer ctrl) 5083 */ 5084 {0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 5085 5086 /* Mute capture amp left and right */ 5087 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 5088 /* Set ADC connection select to match default mixer setting - line 5089 * in (on mic1 pin) 5090 */ 5091 {0x04, AC_VERB_SET_CONNECT_SEL, 0x00}, 5092 5093 /* Do the same for the second ADC: mute capture input amp and 5094 * set ADC connection to line in (on mic1 pin) 5095 */ 5096 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 5097 {0x05, AC_VERB_SET_CONNECT_SEL, 0x00}, 5098 5099 /* Mute all inputs to mixer widget (even unconnected ones) */ 5100 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, /* mic1 pin */ 5101 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, /* mic2 pin */ 5102 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, /* line1 pin */ 5103 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, /* line2 pin */ 5104 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, /* CD pin */ 5105 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)}, /* Beep-gen pin */ 5106 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)}, /* Line-out pin */ 5107 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)}, /* HP-pin pin */ 5108 5109 { } 5110 }; 5111 5112 /* Initialisation sequence for ALC260 as configured in Acer TravelMate and 5113 * similar laptops (adapted from Fujitsu init verbs). 5114 */ 5115 static struct hda_verb alc260_acer_init_verbs[] = { 5116 /* On TravelMate laptops, GPIO 0 enables the internal speaker and 5117 * the headphone jack. Turn this on and rely on the standard mute 5118 * methods whenever the user wants to turn these outputs off. 5119 */ 5120 {0x01, AC_VERB_SET_GPIO_MASK, 0x01}, 5121 {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01}, 5122 {0x01, AC_VERB_SET_GPIO_DATA, 0x01}, 5123 /* Internal speaker/Headphone jack is connected to Line-out pin */ 5124 {0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 5125 /* Internal microphone/Mic jack is connected to Mic1 pin */ 5126 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50}, 5127 /* Line In jack is connected to Line1 pin */ 5128 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 5129 /* Some Acers (eg: C20x Tablets) use Mono pin for internal speaker */ 5130 {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 5131 /* Ensure all other unused pins are disabled and muted. */ 5132 {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0}, 5133 {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 5134 {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, 0}, 5135 {0x13, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 5136 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0}, 5137 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 5138 /* Disable digital (SPDIF) pins */ 5139 {0x03, AC_VERB_SET_DIGI_CONVERT_1, 0}, 5140 {0x06, AC_VERB_SET_DIGI_CONVERT_1, 0}, 5141 5142 /* Ensure Mic1 and Line1 pin widgets take input from the OUT1 sum 5143 * bus when acting as outputs. 5144 */ 5145 {0x0b, AC_VERB_SET_CONNECT_SEL, 0}, 5146 {0x0d, AC_VERB_SET_CONNECT_SEL, 0}, 5147 5148 /* Start with output sum widgets muted and their output gains at min */ 5149 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 5150 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 5151 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 5152 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 5153 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 5154 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 5155 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 5156 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 5157 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 5158 5159 /* Unmute Line-out pin widget amp left and right 5160 * (no equiv mixer ctrl) 5161 */ 5162 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 5163 /* Unmute mono pin widget amp output (no equiv mixer ctrl) */ 5164 {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 5165 /* Unmute Mic1 and Line1 pin widget input buffers since they start as 5166 * inputs. If the pin mode is changed by the user the pin mode control 5167 * will take care of enabling the pin's input/output buffers as needed. 5168 * Therefore there's no need to enable the input buffer at this 5169 * stage. 5170 */ 5171 {0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 5172 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 5173 5174 /* Mute capture amp left and right */ 5175 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 5176 /* Set ADC connection select to match default mixer setting - mic 5177 * (on mic1 pin) 5178 */ 5179 {0x04, AC_VERB_SET_CONNECT_SEL, 0x00}, 5180 5181 /* Do similar with the second ADC: mute capture input amp and 5182 * set ADC connection to mic to match ALSA's default state. 5183 */ 5184 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 5185 {0x05, AC_VERB_SET_CONNECT_SEL, 0x00}, 5186 5187 /* Mute all inputs to mixer widget (even unconnected ones) */ 5188 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, /* mic1 pin */ 5189 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, /* mic2 pin */ 5190 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, /* line1 pin */ 5191 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, /* line2 pin */ 5192 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, /* CD pin */ 5193 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)}, /* Beep-gen pin */ 5194 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)}, /* Line-out pin */ 5195 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)}, /* HP-pin pin */ 5196 5197 { } 5198 }; 5199 5200 /* Initialisation sequence for Maxdata Favorit 100XS 5201 * (adapted from Acer init verbs). 5202 */ 5203 static struct hda_verb alc260_favorit100_init_verbs[] = { 5204 /* GPIO 0 enables the output jack. 5205 * Turn this on and rely on the standard mute 5206 * methods whenever the user wants to turn these outputs off. 5207 */ 5208 {0x01, AC_VERB_SET_GPIO_MASK, 0x01}, 5209 {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01}, 5210 {0x01, AC_VERB_SET_GPIO_DATA, 0x01}, 5211 /* Line/Mic input jack is connected to Mic1 pin */ 5212 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50}, 5213 /* Ensure all other unused pins are disabled and muted. */ 5214 {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0}, 5215 {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 5216 {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0}, 5217 {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 5218 {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, 0}, 5219 {0x13, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 5220 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0}, 5221 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 5222 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0}, 5223 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 5224 /* Disable digital (SPDIF) pins */ 5225 {0x03, AC_VERB_SET_DIGI_CONVERT_1, 0}, 5226 {0x06, AC_VERB_SET_DIGI_CONVERT_1, 0}, 5227 5228 /* Ensure Mic1 and Line1 pin widgets take input from the OUT1 sum 5229 * bus when acting as outputs. 5230 */ 5231 {0x0b, AC_VERB_SET_CONNECT_SEL, 0}, 5232 {0x0d, AC_VERB_SET_CONNECT_SEL, 0}, 5233 5234 /* Start with output sum widgets muted and their output gains at min */ 5235 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 5236 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 5237 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 5238 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 5239 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 5240 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 5241 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 5242 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 5243 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 5244 5245 /* Unmute Line-out pin widget amp left and right 5246 * (no equiv mixer ctrl) 5247 */ 5248 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 5249 /* Unmute Mic1 and Line1 pin widget input buffers since they start as 5250 * inputs. If the pin mode is changed by the user the pin mode control 5251 * will take care of enabling the pin's input/output buffers as needed. 5252 * Therefore there's no need to enable the input buffer at this 5253 * stage. 5254 */ 5255 {0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 5256 5257 /* Mute capture amp left and right */ 5258 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 5259 /* Set ADC connection select to match default mixer setting - mic 5260 * (on mic1 pin) 5261 */ 5262 {0x04, AC_VERB_SET_CONNECT_SEL, 0x00}, 5263 5264 /* Do similar with the second ADC: mute capture input amp and 5265 * set ADC connection to mic to match ALSA's default state. 5266 */ 5267 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 5268 {0x05, AC_VERB_SET_CONNECT_SEL, 0x00}, 5269 5270 /* Mute all inputs to mixer widget (even unconnected ones) */ 5271 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, /* mic1 pin */ 5272 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, /* mic2 pin */ 5273 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, /* line1 pin */ 5274 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, /* line2 pin */ 5275 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, /* CD pin */ 5276 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)}, /* Beep-gen pin */ 5277 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)}, /* Line-out pin */ 5278 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)}, /* HP-pin pin */ 5279 5280 { } 5281 }; 5282 5283 static struct hda_verb alc260_will_verbs[] = { 5284 {0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 5285 {0x0b, AC_VERB_SET_CONNECT_SEL, 0x00}, 5286 {0x0d, AC_VERB_SET_CONNECT_SEL, 0x00}, 5287 {0x0f, AC_VERB_SET_EAPD_BTLENABLE, 0x02}, 5288 {0x1a, AC_VERB_SET_COEF_INDEX, 0x07}, 5289 {0x1a, AC_VERB_SET_PROC_COEF, 0x3040}, 5290 {} 5291 }; 5292 5293 static struct hda_verb alc260_replacer_672v_verbs[] = { 5294 {0x0f, AC_VERB_SET_EAPD_BTLENABLE, 0x02}, 5295 {0x1a, AC_VERB_SET_COEF_INDEX, 0x07}, 5296 {0x1a, AC_VERB_SET_PROC_COEF, 0x3050}, 5297 5298 {0x01, AC_VERB_SET_GPIO_MASK, 0x01}, 5299 {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01}, 5300 {0x01, AC_VERB_SET_GPIO_DATA, 0x00}, 5301 5302 {0x0f, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT}, 5303 {} 5304 }; 5305 5306 /* toggle speaker-output according to the hp-jack state */ 5307 static void alc260_replacer_672v_automute(struct hda_codec *codec) 5308 { 5309 unsigned int present; 5310 5311 /* speaker --> GPIO Data 0, hp or spdif --> GPIO data 1 */ 5312 present = snd_hda_codec_read(codec, 0x0f, 0, 5313 AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; 5314 if (present) { 5315 snd_hda_codec_write_cache(codec, 0x01, 0, 5316 AC_VERB_SET_GPIO_DATA, 1); 5317 snd_hda_codec_write_cache(codec, 0x0f, 0, 5318 AC_VERB_SET_PIN_WIDGET_CONTROL, 5319 PIN_HP); 5320 } else { 5321 snd_hda_codec_write_cache(codec, 0x01, 0, 5322 AC_VERB_SET_GPIO_DATA, 0); 5323 snd_hda_codec_write_cache(codec, 0x0f, 0, 5324 AC_VERB_SET_PIN_WIDGET_CONTROL, 5325 PIN_OUT); 5326 } 5327 } 5328 5329 static void alc260_replacer_672v_unsol_event(struct hda_codec *codec, 5330 unsigned int res) 5331 { 5332 if ((res >> 26) == ALC880_HP_EVENT) 5333 alc260_replacer_672v_automute(codec); 5334 } 5335 5336 static struct hda_verb alc260_hp_dc7600_verbs[] = { 5337 {0x05, AC_VERB_SET_CONNECT_SEL, 0x01}, 5338 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, 5339 {0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 5340 {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 5341 {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 5342 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 5343 {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, 5344 {0x10, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT}, 5345 {0x11, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT}, 5346 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT}, 5347 {} 5348 }; 5349 5350 /* Test configuration for debugging, modelled after the ALC880 test 5351 * configuration. 5352 */ 5353 #ifdef CONFIG_SND_DEBUG 5354 static hda_nid_t alc260_test_dac_nids[1] = { 5355 0x02, 5356 }; 5357 static hda_nid_t alc260_test_adc_nids[2] = { 5358 0x04, 0x05, 5359 }; 5360 /* For testing the ALC260, each input MUX needs its own definition since 5361 * the signal assignments are different. This assumes that the first ADC 5362 * is NID 0x04. 5363 */ 5364 static struct hda_input_mux alc260_test_capture_sources[2] = { 5365 { 5366 .num_items = 7, 5367 .items = { 5368 { "MIC1 pin", 0x0 }, 5369 { "MIC2 pin", 0x1 }, 5370 { "LINE1 pin", 0x2 }, 5371 { "LINE2 pin", 0x3 }, 5372 { "CD pin", 0x4 }, 5373 { "LINE-OUT pin", 0x5 }, 5374 { "HP-OUT pin", 0x6 }, 5375 }, 5376 }, 5377 { 5378 .num_items = 8, 5379 .items = { 5380 { "MIC1 pin", 0x0 }, 5381 { "MIC2 pin", 0x1 }, 5382 { "LINE1 pin", 0x2 }, 5383 { "LINE2 pin", 0x3 }, 5384 { "CD pin", 0x4 }, 5385 { "Mixer", 0x5 }, 5386 { "LINE-OUT pin", 0x6 }, 5387 { "HP-OUT pin", 0x7 }, 5388 }, 5389 }, 5390 }; 5391 static struct snd_kcontrol_new alc260_test_mixer[] = { 5392 /* Output driver widgets */ 5393 HDA_CODEC_VOLUME_MONO("Mono Playback Volume", 0x0a, 1, 0x0, HDA_OUTPUT), 5394 HDA_BIND_MUTE_MONO("Mono Playback Switch", 0x0a, 1, 2, HDA_INPUT), 5395 HDA_CODEC_VOLUME("LOUT2 Playback Volume", 0x09, 0x0, HDA_OUTPUT), 5396 HDA_BIND_MUTE("LOUT2 Playback Switch", 0x09, 2, HDA_INPUT), 5397 HDA_CODEC_VOLUME("LOUT1 Playback Volume", 0x08, 0x0, HDA_OUTPUT), 5398 HDA_BIND_MUTE("LOUT1 Playback Switch", 0x08, 2, HDA_INPUT), 5399 5400 /* Modes for retasking pin widgets 5401 * Note: the ALC260 doesn't seem to act on requests to enable mic 5402 * bias from NIDs 0x0f and 0x10. The ALC260 datasheet doesn't 5403 * mention this restriction. At this stage it's not clear whether 5404 * this behaviour is intentional or is a hardware bug in chip 5405 * revisions available at least up until early 2006. Therefore for 5406 * now allow the "HP-OUT" and "LINE-OUT" Mode controls to span all 5407 * choices, but if it turns out that the lack of mic bias for these 5408 * NIDs is intentional we could change their modes from 5409 * ALC_PIN_DIR_INOUT to ALC_PIN_DIR_INOUT_NOMICBIAS. 5410 */ 5411 ALC_PIN_MODE("HP-OUT pin mode", 0x10, ALC_PIN_DIR_INOUT), 5412 ALC_PIN_MODE("LINE-OUT pin mode", 0x0f, ALC_PIN_DIR_INOUT), 5413 ALC_PIN_MODE("LINE2 pin mode", 0x15, ALC_PIN_DIR_INOUT), 5414 ALC_PIN_MODE("LINE1 pin mode", 0x14, ALC_PIN_DIR_INOUT), 5415 ALC_PIN_MODE("MIC2 pin mode", 0x13, ALC_PIN_DIR_INOUT), 5416 ALC_PIN_MODE("MIC1 pin mode", 0x12, ALC_PIN_DIR_INOUT), 5417 5418 /* Loopback mixer controls */ 5419 HDA_CODEC_VOLUME("MIC1 Playback Volume", 0x07, 0x00, HDA_INPUT), 5420 HDA_CODEC_MUTE("MIC1 Playback Switch", 0x07, 0x00, HDA_INPUT), 5421 HDA_CODEC_VOLUME("MIC2 Playback Volume", 0x07, 0x01, HDA_INPUT), 5422 HDA_CODEC_MUTE("MIC2 Playback Switch", 0x07, 0x01, HDA_INPUT), 5423 HDA_CODEC_VOLUME("LINE1 Playback Volume", 0x07, 0x02, HDA_INPUT), 5424 HDA_CODEC_MUTE("LINE1 Playback Switch", 0x07, 0x02, HDA_INPUT), 5425 HDA_CODEC_VOLUME("LINE2 Playback Volume", 0x07, 0x03, HDA_INPUT), 5426 HDA_CODEC_MUTE("LINE2 Playback Switch", 0x07, 0x03, HDA_INPUT), 5427 HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT), 5428 HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT), 5429 HDA_CODEC_VOLUME("LINE-OUT loopback Playback Volume", 0x07, 0x06, HDA_INPUT), 5430 HDA_CODEC_MUTE("LINE-OUT loopback Playback Switch", 0x07, 0x06, HDA_INPUT), 5431 HDA_CODEC_VOLUME("HP-OUT loopback Playback Volume", 0x07, 0x7, HDA_INPUT), 5432 HDA_CODEC_MUTE("HP-OUT loopback Playback Switch", 0x07, 0x7, HDA_INPUT), 5433 5434 /* Controls for GPIO pins, assuming they are configured as outputs */ 5435 ALC_GPIO_DATA_SWITCH("GPIO pin 0", 0x01, 0x01), 5436 ALC_GPIO_DATA_SWITCH("GPIO pin 1", 0x01, 0x02), 5437 ALC_GPIO_DATA_SWITCH("GPIO pin 2", 0x01, 0x04), 5438 ALC_GPIO_DATA_SWITCH("GPIO pin 3", 0x01, 0x08), 5439 5440 /* Switches to allow the digital IO pins to be enabled. The datasheet 5441 * is ambigious as to which NID is which; testing on laptops which 5442 * make this output available should provide clarification. 5443 */ 5444 ALC_SPDIF_CTRL_SWITCH("SPDIF Playback Switch", 0x03, 0x01), 5445 ALC_SPDIF_CTRL_SWITCH("SPDIF Capture Switch", 0x06, 0x01), 5446 5447 /* A switch allowing EAPD to be enabled. Some laptops seem to use 5448 * this output to turn on an external amplifier. 5449 */ 5450 ALC_EAPD_CTRL_SWITCH("LINE-OUT EAPD Enable Switch", 0x0f, 0x02), 5451 ALC_EAPD_CTRL_SWITCH("HP-OUT EAPD Enable Switch", 0x10, 0x02), 5452 5453 { } /* end */ 5454 }; 5455 static struct hda_verb alc260_test_init_verbs[] = { 5456 /* Enable all GPIOs as outputs with an initial value of 0 */ 5457 {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x0f}, 5458 {0x01, AC_VERB_SET_GPIO_DATA, 0x00}, 5459 {0x01, AC_VERB_SET_GPIO_MASK, 0x0f}, 5460 5461 /* Enable retasking pins as output, initially without power amp */ 5462 {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 5463 {0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 5464 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 5465 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 5466 {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 5467 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 5468 5469 /* Disable digital (SPDIF) pins initially, but users can enable 5470 * them via a mixer switch. In the case of SPDIF-out, this initverb 5471 * payload also sets the generation to 0, output to be in "consumer" 5472 * PCM format, copyright asserted, no pre-emphasis and no validity 5473 * control. 5474 */ 5475 {0x03, AC_VERB_SET_DIGI_CONVERT_1, 0}, 5476 {0x06, AC_VERB_SET_DIGI_CONVERT_1, 0}, 5477 5478 /* Ensure mic1, mic2, line1 and line2 pin widgets take input from the 5479 * OUT1 sum bus when acting as an output. 5480 */ 5481 {0x0b, AC_VERB_SET_CONNECT_SEL, 0}, 5482 {0x0c, AC_VERB_SET_CONNECT_SEL, 0}, 5483 {0x0d, AC_VERB_SET_CONNECT_SEL, 0}, 5484 {0x0e, AC_VERB_SET_CONNECT_SEL, 0}, 5485 5486 /* Start with output sum widgets muted and their output gains at min */ 5487 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 5488 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 5489 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 5490 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 5491 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 5492 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 5493 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 5494 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 5495 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 5496 5497 /* Unmute retasking pin widget output buffers since the default 5498 * state appears to be output. As the pin mode is changed by the 5499 * user the pin mode control will take care of enabling the pin's 5500 * input/output buffers as needed. 5501 */ 5502 {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 5503 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 5504 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 5505 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 5506 {0x13, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 5507 {0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 5508 /* Also unmute the mono-out pin widget */ 5509 {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 5510 5511 /* Mute capture amp left and right */ 5512 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 5513 /* Set ADC connection select to match default mixer setting (mic1 5514 * pin) 5515 */ 5516 {0x04, AC_VERB_SET_CONNECT_SEL, 0x00}, 5517 5518 /* Do the same for the second ADC: mute capture input amp and 5519 * set ADC connection to mic1 pin 5520 */ 5521 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 5522 {0x05, AC_VERB_SET_CONNECT_SEL, 0x00}, 5523 5524 /* Mute all inputs to mixer widget (even unconnected ones) */ 5525 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, /* mic1 pin */ 5526 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, /* mic2 pin */ 5527 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, /* line1 pin */ 5528 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, /* line2 pin */ 5529 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, /* CD pin */ 5530 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)}, /* Beep-gen pin */ 5531 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)}, /* Line-out pin */ 5532 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)}, /* HP-pin pin */ 5533 5534 { } 5535 }; 5536 #endif 5537 5538 #define alc260_pcm_analog_playback alc880_pcm_analog_alt_playback 5539 #define alc260_pcm_analog_capture alc880_pcm_analog_capture 5540 5541 #define alc260_pcm_digital_playback alc880_pcm_digital_playback 5542 #define alc260_pcm_digital_capture alc880_pcm_digital_capture 5543 5544 /* 5545 * for BIOS auto-configuration 5546 */ 5547 5548 static int alc260_add_playback_controls(struct alc_spec *spec, hda_nid_t nid, 5549 const char *pfx, int *vol_bits) 5550 { 5551 hda_nid_t nid_vol; 5552 unsigned long vol_val, sw_val; 5553 char name[32]; 5554 int err; 5555 5556 if (nid >= 0x0f && nid < 0x11) { 5557 nid_vol = nid - 0x7; 5558 vol_val = HDA_COMPOSE_AMP_VAL(nid_vol, 3, 0, HDA_OUTPUT); 5559 sw_val = HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT); 5560 } else if (nid == 0x11) { 5561 nid_vol = nid - 0x7; 5562 vol_val = HDA_COMPOSE_AMP_VAL(nid_vol, 2, 0, HDA_OUTPUT); 5563 sw_val = HDA_COMPOSE_AMP_VAL(nid, 2, 0, HDA_OUTPUT); 5564 } else if (nid >= 0x12 && nid <= 0x15) { 5565 nid_vol = 0x08; 5566 vol_val = HDA_COMPOSE_AMP_VAL(nid_vol, 3, 0, HDA_OUTPUT); 5567 sw_val = HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT); 5568 } else 5569 return 0; /* N/A */ 5570 5571 if (!(*vol_bits & (1 << nid_vol))) { 5572 /* first control for the volume widget */ 5573 snprintf(name, sizeof(name), "%s Playback Volume", pfx); 5574 err = add_control(spec, ALC_CTL_WIDGET_VOL, name, vol_val); 5575 if (err < 0) 5576 return err; 5577 *vol_bits |= (1 << nid_vol); 5578 } 5579 snprintf(name, sizeof(name), "%s Playback Switch", pfx); 5580 err = add_control(spec, ALC_CTL_WIDGET_MUTE, name, sw_val); 5581 if (err < 0) 5582 return err; 5583 return 1; 5584 } 5585 5586 /* add playback controls from the parsed DAC table */ 5587 static int alc260_auto_create_multi_out_ctls(struct alc_spec *spec, 5588 const struct auto_pin_cfg *cfg) 5589 { 5590 hda_nid_t nid; 5591 int err; 5592 int vols = 0; 5593 5594 spec->multiout.num_dacs = 1; 5595 spec->multiout.dac_nids = spec->private_dac_nids; 5596 spec->multiout.dac_nids[0] = 0x02; 5597 5598 nid = cfg->line_out_pins[0]; 5599 if (nid) { 5600 err = alc260_add_playback_controls(spec, nid, "Front", &vols); 5601 if (err < 0) 5602 return err; 5603 } 5604 5605 nid = cfg->speaker_pins[0]; 5606 if (nid) { 5607 err = alc260_add_playback_controls(spec, nid, "Speaker", &vols); 5608 if (err < 0) 5609 return err; 5610 } 5611 5612 nid = cfg->hp_pins[0]; 5613 if (nid) { 5614 err = alc260_add_playback_controls(spec, nid, "Headphone", 5615 &vols); 5616 if (err < 0) 5617 return err; 5618 } 5619 return 0; 5620 } 5621 5622 /* create playback/capture controls for input pins */ 5623 static int alc260_auto_create_analog_input_ctls(struct alc_spec *spec, 5624 const struct auto_pin_cfg *cfg) 5625 { 5626 struct hda_input_mux *imux = &spec->private_imux[0]; 5627 int i, err, idx; 5628 5629 for (i = 0; i < AUTO_PIN_LAST; i++) { 5630 if (cfg->input_pins[i] >= 0x12) { 5631 idx = cfg->input_pins[i] - 0x12; 5632 err = new_analog_input(spec, cfg->input_pins[i], 5633 auto_pin_cfg_labels[i], idx, 5634 0x07); 5635 if (err < 0) 5636 return err; 5637 imux->items[imux->num_items].label = 5638 auto_pin_cfg_labels[i]; 5639 imux->items[imux->num_items].index = idx; 5640 imux->num_items++; 5641 } 5642 if (cfg->input_pins[i] >= 0x0f && cfg->input_pins[i] <= 0x10){ 5643 idx = cfg->input_pins[i] - 0x09; 5644 err = new_analog_input(spec, cfg->input_pins[i], 5645 auto_pin_cfg_labels[i], idx, 5646 0x07); 5647 if (err < 0) 5648 return err; 5649 imux->items[imux->num_items].label = 5650 auto_pin_cfg_labels[i]; 5651 imux->items[imux->num_items].index = idx; 5652 imux->num_items++; 5653 } 5654 } 5655 return 0; 5656 } 5657 5658 static void alc260_auto_set_output_and_unmute(struct hda_codec *codec, 5659 hda_nid_t nid, int pin_type, 5660 int sel_idx) 5661 { 5662 alc_set_pin_output(codec, nid, pin_type); 5663 /* need the manual connection? */ 5664 if (nid >= 0x12) { 5665 int idx = nid - 0x12; 5666 snd_hda_codec_write(codec, idx + 0x0b, 0, 5667 AC_VERB_SET_CONNECT_SEL, sel_idx); 5668 } 5669 } 5670 5671 static void alc260_auto_init_multi_out(struct hda_codec *codec) 5672 { 5673 struct alc_spec *spec = codec->spec; 5674 hda_nid_t nid; 5675 5676 alc_subsystem_id(codec, 0x10, 0x15, 0x0f); 5677 nid = spec->autocfg.line_out_pins[0]; 5678 if (nid) { 5679 int pin_type = get_pin_type(spec->autocfg.line_out_type); 5680 alc260_auto_set_output_and_unmute(codec, nid, pin_type, 0); 5681 } 5682 5683 nid = spec->autocfg.speaker_pins[0]; 5684 if (nid) 5685 alc260_auto_set_output_and_unmute(codec, nid, PIN_OUT, 0); 5686 5687 nid = spec->autocfg.hp_pins[0]; 5688 if (nid) 5689 alc260_auto_set_output_and_unmute(codec, nid, PIN_HP, 0); 5690 } 5691 5692 #define ALC260_PIN_CD_NID 0x16 5693 static void alc260_auto_init_analog_input(struct hda_codec *codec) 5694 { 5695 struct alc_spec *spec = codec->spec; 5696 int i; 5697 5698 for (i = 0; i < AUTO_PIN_LAST; i++) { 5699 hda_nid_t nid = spec->autocfg.input_pins[i]; 5700 if (nid >= 0x12) { 5701 alc_set_input_pin(codec, nid, i); 5702 if (nid != ALC260_PIN_CD_NID && 5703 (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP)) 5704 snd_hda_codec_write(codec, nid, 0, 5705 AC_VERB_SET_AMP_GAIN_MUTE, 5706 AMP_OUT_MUTE); 5707 } 5708 } 5709 } 5710 5711 /* 5712 * generic initialization of ADC, input mixers and output mixers 5713 */ 5714 static struct hda_verb alc260_volume_init_verbs[] = { 5715 /* 5716 * Unmute ADC0-1 and set the default input to mic-in 5717 */ 5718 {0x04, AC_VERB_SET_CONNECT_SEL, 0x00}, 5719 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 5720 {0x05, AC_VERB_SET_CONNECT_SEL, 0x00}, 5721 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 5722 5723 /* Unmute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback 5724 * mixer widget 5725 * Note: PASD motherboards uses the Line In 2 as the input for 5726 * front panel mic (mic 2) 5727 */ 5728 /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */ 5729 /* mute analog inputs */ 5730 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 5731 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 5732 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, 5733 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, 5734 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, 5735 5736 /* 5737 * Set up output mixers (0x08 - 0x0a) 5738 */ 5739 /* set vol=0 to output mixers */ 5740 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 5741 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 5742 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 5743 /* set up input amps for analog loopback */ 5744 /* Amp Indices: DAC = 0, mixer = 1 */ 5745 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 5746 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 5747 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 5748 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 5749 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 5750 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 5751 5752 { } 5753 }; 5754 5755 static int alc260_parse_auto_config(struct hda_codec *codec) 5756 { 5757 struct alc_spec *spec = codec->spec; 5758 int err; 5759 static hda_nid_t alc260_ignore[] = { 0x17, 0 }; 5760 5761 err = snd_hda_parse_pin_def_config(codec, &spec->autocfg, 5762 alc260_ignore); 5763 if (err < 0) 5764 return err; 5765 err = alc260_auto_create_multi_out_ctls(spec, &spec->autocfg); 5766 if (err < 0) 5767 return err; 5768 if (!spec->kctls.list) 5769 return 0; /* can't find valid BIOS pin config */ 5770 err = alc260_auto_create_analog_input_ctls(spec, &spec->autocfg); 5771 if (err < 0) 5772 return err; 5773 5774 spec->multiout.max_channels = 2; 5775 5776 if (spec->autocfg.dig_outs) 5777 spec->multiout.dig_out_nid = ALC260_DIGOUT_NID; 5778 if (spec->kctls.list) 5779 add_mixer(spec, spec->kctls.list); 5780 5781 add_verb(spec, alc260_volume_init_verbs); 5782 5783 spec->num_mux_defs = 1; 5784 spec->input_mux = &spec->private_imux[0]; 5785 5786 return 1; 5787 } 5788 5789 /* additional initialization for auto-configuration model */ 5790 static void alc260_auto_init(struct hda_codec *codec) 5791 { 5792 struct alc_spec *spec = codec->spec; 5793 alc260_auto_init_multi_out(codec); 5794 alc260_auto_init_analog_input(codec); 5795 if (spec->unsol_event) 5796 alc_inithook(codec); 5797 } 5798 5799 #ifdef CONFIG_SND_HDA_POWER_SAVE 5800 static struct hda_amp_list alc260_loopbacks[] = { 5801 { 0x07, HDA_INPUT, 0 }, 5802 { 0x07, HDA_INPUT, 1 }, 5803 { 0x07, HDA_INPUT, 2 }, 5804 { 0x07, HDA_INPUT, 3 }, 5805 { 0x07, HDA_INPUT, 4 }, 5806 { } /* end */ 5807 }; 5808 #endif 5809 5810 /* 5811 * ALC260 configurations 5812 */ 5813 static const char *alc260_models[ALC260_MODEL_LAST] = { 5814 [ALC260_BASIC] = "basic", 5815 [ALC260_HP] = "hp", 5816 [ALC260_HP_3013] = "hp-3013", 5817 [ALC260_HP_DC7600] = "hp-dc7600", 5818 [ALC260_FUJITSU_S702X] = "fujitsu", 5819 [ALC260_ACER] = "acer", 5820 [ALC260_WILL] = "will", 5821 [ALC260_REPLACER_672V] = "replacer", 5822 [ALC260_FAVORIT100] = "favorit100", 5823 #ifdef CONFIG_SND_DEBUG 5824 [ALC260_TEST] = "test", 5825 #endif 5826 [ALC260_AUTO] = "auto", 5827 }; 5828 5829 static struct snd_pci_quirk alc260_cfg_tbl[] = { 5830 SND_PCI_QUIRK(0x1025, 0x007b, "Acer C20x", ALC260_ACER), 5831 SND_PCI_QUIRK(0x1025, 0x008f, "Acer", ALC260_ACER), 5832 SND_PCI_QUIRK(0x1509, 0x4540, "Favorit 100XS", ALC260_FAVORIT100), 5833 SND_PCI_QUIRK(0x103c, 0x2808, "HP d5700", ALC260_HP_3013), 5834 SND_PCI_QUIRK(0x103c, 0x280a, "HP d5750", ALC260_HP_3013), 5835 SND_PCI_QUIRK(0x103c, 0x3010, "HP", ALC260_HP_3013), 5836 SND_PCI_QUIRK(0x103c, 0x3011, "HP", ALC260_HP_3013), 5837 SND_PCI_QUIRK(0x103c, 0x3012, "HP", ALC260_HP_DC7600), 5838 SND_PCI_QUIRK(0x103c, 0x3013, "HP", ALC260_HP_3013), 5839 SND_PCI_QUIRK(0x103c, 0x3014, "HP", ALC260_HP), 5840 SND_PCI_QUIRK(0x103c, 0x3015, "HP", ALC260_HP), 5841 SND_PCI_QUIRK(0x103c, 0x3016, "HP", ALC260_HP), 5842 SND_PCI_QUIRK(0x104d, 0x81bb, "Sony VAIO", ALC260_BASIC), 5843 SND_PCI_QUIRK(0x104d, 0x81cc, "Sony VAIO", ALC260_BASIC), 5844 SND_PCI_QUIRK(0x104d, 0x81cd, "Sony VAIO", ALC260_BASIC), 5845 SND_PCI_QUIRK(0x10cf, 0x1326, "Fujitsu S702X", ALC260_FUJITSU_S702X), 5846 SND_PCI_QUIRK(0x152d, 0x0729, "CTL U553W", ALC260_BASIC), 5847 SND_PCI_QUIRK(0x161f, 0x2057, "Replacer 672V", ALC260_REPLACER_672V), 5848 SND_PCI_QUIRK(0x1631, 0xc017, "PB V7900", ALC260_WILL), 5849 {} 5850 }; 5851 5852 static struct alc_config_preset alc260_presets[] = { 5853 [ALC260_BASIC] = { 5854 .mixers = { alc260_base_output_mixer, 5855 alc260_input_mixer }, 5856 .init_verbs = { alc260_init_verbs }, 5857 .num_dacs = ARRAY_SIZE(alc260_dac_nids), 5858 .dac_nids = alc260_dac_nids, 5859 .num_adc_nids = ARRAY_SIZE(alc260_dual_adc_nids), 5860 .adc_nids = alc260_adc_nids, 5861 .num_channel_mode = ARRAY_SIZE(alc260_modes), 5862 .channel_mode = alc260_modes, 5863 .input_mux = &alc260_capture_source, 5864 }, 5865 [ALC260_HP] = { 5866 .mixers = { alc260_hp_output_mixer, 5867 alc260_input_mixer }, 5868 .init_verbs = { alc260_init_verbs, 5869 alc260_hp_unsol_verbs }, 5870 .num_dacs = ARRAY_SIZE(alc260_dac_nids), 5871 .dac_nids = alc260_dac_nids, 5872 .num_adc_nids = ARRAY_SIZE(alc260_adc_nids_alt), 5873 .adc_nids = alc260_adc_nids_alt, 5874 .num_channel_mode = ARRAY_SIZE(alc260_modes), 5875 .channel_mode = alc260_modes, 5876 .input_mux = &alc260_capture_source, 5877 .unsol_event = alc260_hp_unsol_event, 5878 .init_hook = alc260_hp_automute, 5879 }, 5880 [ALC260_HP_DC7600] = { 5881 .mixers = { alc260_hp_dc7600_mixer, 5882 alc260_input_mixer }, 5883 .init_verbs = { alc260_init_verbs, 5884 alc260_hp_dc7600_verbs }, 5885 .num_dacs = ARRAY_SIZE(alc260_dac_nids), 5886 .dac_nids = alc260_dac_nids, 5887 .num_adc_nids = ARRAY_SIZE(alc260_adc_nids_alt), 5888 .adc_nids = alc260_adc_nids_alt, 5889 .num_channel_mode = ARRAY_SIZE(alc260_modes), 5890 .channel_mode = alc260_modes, 5891 .input_mux = &alc260_capture_source, 5892 .unsol_event = alc260_hp_3012_unsol_event, 5893 .init_hook = alc260_hp_3012_automute, 5894 }, 5895 [ALC260_HP_3013] = { 5896 .mixers = { alc260_hp_3013_mixer, 5897 alc260_input_mixer }, 5898 .init_verbs = { alc260_hp_3013_init_verbs, 5899 alc260_hp_3013_unsol_verbs }, 5900 .num_dacs = ARRAY_SIZE(alc260_dac_nids), 5901 .dac_nids = alc260_dac_nids, 5902 .num_adc_nids = ARRAY_SIZE(alc260_adc_nids_alt), 5903 .adc_nids = alc260_adc_nids_alt, 5904 .num_channel_mode = ARRAY_SIZE(alc260_modes), 5905 .channel_mode = alc260_modes, 5906 .input_mux = &alc260_capture_source, 5907 .unsol_event = alc260_hp_3013_unsol_event, 5908 .init_hook = alc260_hp_3013_automute, 5909 }, 5910 [ALC260_FUJITSU_S702X] = { 5911 .mixers = { alc260_fujitsu_mixer }, 5912 .init_verbs = { alc260_fujitsu_init_verbs }, 5913 .num_dacs = ARRAY_SIZE(alc260_dac_nids), 5914 .dac_nids = alc260_dac_nids, 5915 .num_adc_nids = ARRAY_SIZE(alc260_dual_adc_nids), 5916 .adc_nids = alc260_dual_adc_nids, 5917 .num_channel_mode = ARRAY_SIZE(alc260_modes), 5918 .channel_mode = alc260_modes, 5919 .num_mux_defs = ARRAY_SIZE(alc260_fujitsu_capture_sources), 5920 .input_mux = alc260_fujitsu_capture_sources, 5921 }, 5922 [ALC260_ACER] = { 5923 .mixers = { alc260_acer_mixer }, 5924 .init_verbs = { alc260_acer_init_verbs }, 5925 .num_dacs = ARRAY_SIZE(alc260_dac_nids), 5926 .dac_nids = alc260_dac_nids, 5927 .num_adc_nids = ARRAY_SIZE(alc260_dual_adc_nids), 5928 .adc_nids = alc260_dual_adc_nids, 5929 .num_channel_mode = ARRAY_SIZE(alc260_modes), 5930 .channel_mode = alc260_modes, 5931 .num_mux_defs = ARRAY_SIZE(alc260_acer_capture_sources), 5932 .input_mux = alc260_acer_capture_sources, 5933 }, 5934 [ALC260_FAVORIT100] = { 5935 .mixers = { alc260_favorit100_mixer }, 5936 .init_verbs = { alc260_favorit100_init_verbs }, 5937 .num_dacs = ARRAY_SIZE(alc260_dac_nids), 5938 .dac_nids = alc260_dac_nids, 5939 .num_adc_nids = ARRAY_SIZE(alc260_dual_adc_nids), 5940 .adc_nids = alc260_dual_adc_nids, 5941 .num_channel_mode = ARRAY_SIZE(alc260_modes), 5942 .channel_mode = alc260_modes, 5943 .num_mux_defs = ARRAY_SIZE(alc260_favorit100_capture_sources), 5944 .input_mux = alc260_favorit100_capture_sources, 5945 }, 5946 [ALC260_WILL] = { 5947 .mixers = { alc260_will_mixer }, 5948 .init_verbs = { alc260_init_verbs, alc260_will_verbs }, 5949 .num_dacs = ARRAY_SIZE(alc260_dac_nids), 5950 .dac_nids = alc260_dac_nids, 5951 .num_adc_nids = ARRAY_SIZE(alc260_adc_nids), 5952 .adc_nids = alc260_adc_nids, 5953 .dig_out_nid = ALC260_DIGOUT_NID, 5954 .num_channel_mode = ARRAY_SIZE(alc260_modes), 5955 .channel_mode = alc260_modes, 5956 .input_mux = &alc260_capture_source, 5957 }, 5958 [ALC260_REPLACER_672V] = { 5959 .mixers = { alc260_replacer_672v_mixer }, 5960 .init_verbs = { alc260_init_verbs, alc260_replacer_672v_verbs }, 5961 .num_dacs = ARRAY_SIZE(alc260_dac_nids), 5962 .dac_nids = alc260_dac_nids, 5963 .num_adc_nids = ARRAY_SIZE(alc260_adc_nids), 5964 .adc_nids = alc260_adc_nids, 5965 .dig_out_nid = ALC260_DIGOUT_NID, 5966 .num_channel_mode = ARRAY_SIZE(alc260_modes), 5967 .channel_mode = alc260_modes, 5968 .input_mux = &alc260_capture_source, 5969 .unsol_event = alc260_replacer_672v_unsol_event, 5970 .init_hook = alc260_replacer_672v_automute, 5971 }, 5972 #ifdef CONFIG_SND_DEBUG 5973 [ALC260_TEST] = { 5974 .mixers = { alc260_test_mixer }, 5975 .init_verbs = { alc260_test_init_verbs }, 5976 .num_dacs = ARRAY_SIZE(alc260_test_dac_nids), 5977 .dac_nids = alc260_test_dac_nids, 5978 .num_adc_nids = ARRAY_SIZE(alc260_test_adc_nids), 5979 .adc_nids = alc260_test_adc_nids, 5980 .num_channel_mode = ARRAY_SIZE(alc260_modes), 5981 .channel_mode = alc260_modes, 5982 .num_mux_defs = ARRAY_SIZE(alc260_test_capture_sources), 5983 .input_mux = alc260_test_capture_sources, 5984 }, 5985 #endif 5986 }; 5987 5988 static int patch_alc260(struct hda_codec *codec) 5989 { 5990 struct alc_spec *spec; 5991 int err, board_config; 5992 5993 spec = kzalloc(sizeof(*spec), GFP_KERNEL); 5994 if (spec == NULL) 5995 return -ENOMEM; 5996 5997 codec->spec = spec; 5998 5999 board_config = snd_hda_check_board_config(codec, ALC260_MODEL_LAST, 6000 alc260_models, 6001 alc260_cfg_tbl); 6002 if (board_config < 0) { 6003 snd_printd(KERN_INFO "hda_codec: Unknown model for ALC260, " 6004 "trying auto-probe from BIOS...\n"); 6005 board_config = ALC260_AUTO; 6006 } 6007 6008 if (board_config == ALC260_AUTO) { 6009 /* automatic parse from the BIOS config */ 6010 err = alc260_parse_auto_config(codec); 6011 if (err < 0) { 6012 alc_free(codec); 6013 return err; 6014 } else if (!err) { 6015 printk(KERN_INFO 6016 "hda_codec: Cannot set up configuration " 6017 "from BIOS. Using base mode...\n"); 6018 board_config = ALC260_BASIC; 6019 } 6020 } 6021 6022 err = snd_hda_attach_beep_device(codec, 0x1); 6023 if (err < 0) { 6024 alc_free(codec); 6025 return err; 6026 } 6027 6028 if (board_config != ALC260_AUTO) 6029 setup_preset(spec, &alc260_presets[board_config]); 6030 6031 spec->stream_name_analog = "ALC260 Analog"; 6032 spec->stream_analog_playback = &alc260_pcm_analog_playback; 6033 spec->stream_analog_capture = &alc260_pcm_analog_capture; 6034 6035 spec->stream_name_digital = "ALC260 Digital"; 6036 spec->stream_digital_playback = &alc260_pcm_digital_playback; 6037 spec->stream_digital_capture = &alc260_pcm_digital_capture; 6038 6039 if (!spec->adc_nids && spec->input_mux) { 6040 /* check whether NID 0x04 is valid */ 6041 unsigned int wcap = get_wcaps(codec, 0x04); 6042 wcap = (wcap & AC_WCAP_TYPE) >> AC_WCAP_TYPE_SHIFT; 6043 /* get type */ 6044 if (wcap != AC_WID_AUD_IN || spec->input_mux->num_items == 1) { 6045 spec->adc_nids = alc260_adc_nids_alt; 6046 spec->num_adc_nids = ARRAY_SIZE(alc260_adc_nids_alt); 6047 } else { 6048 spec->adc_nids = alc260_adc_nids; 6049 spec->num_adc_nids = ARRAY_SIZE(alc260_adc_nids); 6050 } 6051 } 6052 set_capture_mixer(spec); 6053 set_beep_amp(spec, 0x07, 0x05, HDA_INPUT); 6054 6055 spec->vmaster_nid = 0x08; 6056 6057 codec->patch_ops = alc_patch_ops; 6058 if (board_config == ALC260_AUTO) 6059 spec->init_hook = alc260_auto_init; 6060 #ifdef CONFIG_SND_HDA_POWER_SAVE 6061 if (!spec->loopback.amplist) 6062 spec->loopback.amplist = alc260_loopbacks; 6063 #endif 6064 codec->proc_widget_hook = print_realtek_coef; 6065 6066 return 0; 6067 } 6068 6069 6070 /* 6071 * ALC882 support 6072 * 6073 * ALC882 is almost identical with ALC880 but has cleaner and more flexible 6074 * configuration. Each pin widget can choose any input DACs and a mixer. 6075 * Each ADC is connected from a mixer of all inputs. This makes possible 6076 * 6-channel independent captures. 6077 * 6078 * In addition, an independent DAC for the multi-playback (not used in this 6079 * driver yet). 6080 */ 6081 #define ALC882_DIGOUT_NID 0x06 6082 #define ALC882_DIGIN_NID 0x0a 6083 6084 static struct hda_channel_mode alc882_ch_modes[1] = { 6085 { 8, NULL } 6086 }; 6087 6088 static hda_nid_t alc882_dac_nids[4] = { 6089 /* front, rear, clfe, rear_surr */ 6090 0x02, 0x03, 0x04, 0x05 6091 }; 6092 6093 /* identical with ALC880 */ 6094 #define alc882_adc_nids alc880_adc_nids 6095 #define alc882_adc_nids_alt alc880_adc_nids_alt 6096 6097 static hda_nid_t alc882_capsrc_nids[3] = { 0x24, 0x23, 0x22 }; 6098 static hda_nid_t alc882_capsrc_nids_alt[2] = { 0x23, 0x22 }; 6099 6100 /* input MUX */ 6101 /* FIXME: should be a matrix-type input source selection */ 6102 6103 static struct hda_input_mux alc882_capture_source = { 6104 .num_items = 4, 6105 .items = { 6106 { "Mic", 0x0 }, 6107 { "Front Mic", 0x1 }, 6108 { "Line", 0x2 }, 6109 { "CD", 0x4 }, 6110 }, 6111 }; 6112 /* 6113 * 2ch mode 6114 */ 6115 static struct hda_verb alc882_3ST_ch2_init[] = { 6116 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, 6117 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE }, 6118 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN }, 6119 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE }, 6120 { } /* end */ 6121 }; 6122 6123 /* 6124 * 6ch mode 6125 */ 6126 static struct hda_verb alc882_3ST_ch6_init[] = { 6127 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 6128 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 6129 { 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 }, 6130 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 6131 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 6132 { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 }, 6133 { } /* end */ 6134 }; 6135 6136 static struct hda_channel_mode alc882_3ST_6ch_modes[2] = { 6137 { 2, alc882_3ST_ch2_init }, 6138 { 6, alc882_3ST_ch6_init }, 6139 }; 6140 6141 /* 6142 * 6ch mode 6143 */ 6144 static struct hda_verb alc882_sixstack_ch6_init[] = { 6145 { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 }, 6146 { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 6147 { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 6148 { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 6149 { } /* end */ 6150 }; 6151 6152 /* 6153 * 8ch mode 6154 */ 6155 static struct hda_verb alc882_sixstack_ch8_init[] = { 6156 { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 6157 { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 6158 { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 6159 { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 6160 { } /* end */ 6161 }; 6162 6163 static struct hda_channel_mode alc882_sixstack_modes[2] = { 6164 { 6, alc882_sixstack_ch6_init }, 6165 { 8, alc882_sixstack_ch8_init }, 6166 }; 6167 6168 /* 6169 * macbook pro ALC885 can switch LineIn to LineOut without loosing Mic 6170 */ 6171 6172 /* 6173 * 2ch mode 6174 */ 6175 static struct hda_verb alc885_mbp_ch2_init[] = { 6176 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN }, 6177 { 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 6178 { 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 6179 { } /* end */ 6180 }; 6181 6182 /* 6183 * 6ch mode 6184 */ 6185 static struct hda_verb alc885_mbp_ch6_init[] = { 6186 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 6187 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 6188 { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 }, 6189 { 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 6190 { 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 6191 { } /* end */ 6192 }; 6193 6194 static struct hda_channel_mode alc885_mbp_6ch_modes[2] = { 6195 { 2, alc885_mbp_ch2_init }, 6196 { 6, alc885_mbp_ch6_init }, 6197 }; 6198 6199 6200 /* Pin assignment: Front=0x14, Rear=0x15, CLFE=0x16, Side=0x17 6201 * Mic=0x18, Front Mic=0x19, Line-In=0x1a, HP=0x1b 6202 */ 6203 static struct snd_kcontrol_new alc882_base_mixer[] = { 6204 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 6205 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 6206 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT), 6207 HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT), 6208 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT), 6209 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT), 6210 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT), 6211 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT), 6212 HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT), 6213 HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT), 6214 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT), 6215 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), 6216 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), 6217 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), 6218 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), 6219 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 6220 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), 6221 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 6222 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), 6223 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT), 6224 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), 6225 { } /* end */ 6226 }; 6227 6228 static struct snd_kcontrol_new alc885_mbp3_mixer[] = { 6229 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x00, HDA_OUTPUT), 6230 HDA_BIND_MUTE ("Front Playback Switch", 0x0c, 0x02, HDA_INPUT), 6231 HDA_CODEC_MUTE ("Speaker Playback Switch", 0x14, 0x00, HDA_OUTPUT), 6232 HDA_CODEC_VOLUME("Line-Out Playback Volume", 0x0d, 0x00, HDA_OUTPUT), 6233 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), 6234 HDA_CODEC_MUTE ("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), 6235 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x00, HDA_INPUT), 6236 HDA_CODEC_MUTE ("Mic Playback Switch", 0x0b, 0x00, HDA_INPUT), 6237 HDA_CODEC_VOLUME("Line Boost", 0x1a, 0x00, HDA_INPUT), 6238 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0x00, HDA_INPUT), 6239 { } /* end */ 6240 }; 6241 static struct snd_kcontrol_new alc882_w2jc_mixer[] = { 6242 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 6243 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 6244 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), 6245 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), 6246 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), 6247 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), 6248 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 6249 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), 6250 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 6251 { } /* end */ 6252 }; 6253 6254 static struct snd_kcontrol_new alc882_targa_mixer[] = { 6255 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 6256 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 6257 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT), 6258 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), 6259 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), 6260 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), 6261 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), 6262 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 6263 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 6264 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), 6265 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), 6266 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), 6267 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT), 6268 { } /* end */ 6269 }; 6270 6271 /* Pin assignment: Front=0x14, HP = 0x15, Front = 0x16, ??? 6272 * Front Mic=0x18, Line In = 0x1a, Line In = 0x1b, CD = 0x1c 6273 */ 6274 static struct snd_kcontrol_new alc882_asus_a7j_mixer[] = { 6275 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 6276 HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT), 6277 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT), 6278 HDA_CODEC_MUTE("Mobile Front Playback Switch", 0x16, 0x0, HDA_OUTPUT), 6279 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), 6280 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), 6281 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), 6282 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), 6283 HDA_CODEC_VOLUME("Mobile Line Playback Volume", 0x0b, 0x03, HDA_INPUT), 6284 HDA_CODEC_MUTE("Mobile Line Playback Switch", 0x0b, 0x03, HDA_INPUT), 6285 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 6286 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 6287 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), 6288 { } /* end */ 6289 }; 6290 6291 static struct snd_kcontrol_new alc882_asus_a7m_mixer[] = { 6292 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 6293 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 6294 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT), 6295 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), 6296 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), 6297 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), 6298 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), 6299 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 6300 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), 6301 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 6302 { } /* end */ 6303 }; 6304 6305 static struct snd_kcontrol_new alc882_chmode_mixer[] = { 6306 { 6307 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 6308 .name = "Channel Mode", 6309 .info = alc_ch_mode_info, 6310 .get = alc_ch_mode_get, 6311 .put = alc_ch_mode_put, 6312 }, 6313 { } /* end */ 6314 }; 6315 6316 static struct hda_verb alc882_init_verbs[] = { 6317 /* Front mixer: unmute input/output amp left and right (volume = 0) */ 6318 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 6319 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 6320 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 6321 /* Rear mixer */ 6322 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 6323 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 6324 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 6325 /* CLFE mixer */ 6326 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 6327 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 6328 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 6329 /* Side mixer */ 6330 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 6331 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 6332 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 6333 6334 /* Front Pin: output 0 (0x0c) */ 6335 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 6336 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 6337 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, 6338 /* Rear Pin: output 1 (0x0d) */ 6339 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 6340 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 6341 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, 6342 /* CLFE Pin: output 2 (0x0e) */ 6343 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 6344 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 6345 {0x16, AC_VERB_SET_CONNECT_SEL, 0x02}, 6346 /* Side Pin: output 3 (0x0f) */ 6347 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 6348 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 6349 {0x17, AC_VERB_SET_CONNECT_SEL, 0x03}, 6350 /* Mic (rear) pin: input vref at 80% */ 6351 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, 6352 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 6353 /* Front Mic pin: input vref at 80% */ 6354 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, 6355 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 6356 /* Line In pin: input */ 6357 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 6358 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 6359 /* Line-2 In: Headphone output (output 0 - 0x0c) */ 6360 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 6361 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 6362 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, 6363 /* CD pin widget for input */ 6364 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 6365 6366 /* FIXME: use matrix-type input source selection */ 6367 /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */ 6368 /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */ 6369 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 6370 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, 6371 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, 6372 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, 6373 /* Input mixer2 */ 6374 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 6375 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, 6376 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, 6377 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, 6378 /* Input mixer3 */ 6379 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 6380 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, 6381 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, 6382 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, 6383 /* ADC1: mute amp left and right */ 6384 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 6385 {0x07, AC_VERB_SET_CONNECT_SEL, 0x00}, 6386 /* ADC2: mute amp left and right */ 6387 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 6388 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00}, 6389 /* ADC3: mute amp left and right */ 6390 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 6391 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00}, 6392 6393 { } 6394 }; 6395 6396 static struct hda_verb alc882_eapd_verbs[] = { 6397 /* change to EAPD mode */ 6398 {0x20, AC_VERB_SET_COEF_INDEX, 0x07}, 6399 {0x20, AC_VERB_SET_PROC_COEF, 0x3060}, 6400 { } 6401 }; 6402 6403 /* Mac Pro test */ 6404 static struct snd_kcontrol_new alc882_macpro_mixer[] = { 6405 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 6406 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 6407 HDA_CODEC_MUTE("Headphone Playback Switch", 0x18, 0x0, HDA_OUTPUT), 6408 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x01, HDA_INPUT), 6409 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x01, HDA_INPUT), 6410 /* FIXME: this looks suspicious... 6411 HDA_CODEC_VOLUME("PC Speaker Playback Volume", 0x0b, 0x02, HDA_INPUT), 6412 HDA_CODEC_MUTE("PC Speaker Playback Switch", 0x0b, 0x02, HDA_INPUT), 6413 */ 6414 { } /* end */ 6415 }; 6416 6417 static struct hda_verb alc882_macpro_init_verbs[] = { 6418 /* Front mixer: unmute input/output amp left and right (volume = 0) */ 6419 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 6420 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 6421 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 6422 /* Front Pin: output 0 (0x0c) */ 6423 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 6424 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 6425 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, 6426 /* Front Mic pin: input vref at 80% */ 6427 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, 6428 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 6429 /* Speaker: output */ 6430 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 6431 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 6432 {0x1a, AC_VERB_SET_CONNECT_SEL, 0x04}, 6433 /* Headphone output (output 0 - 0x0c) */ 6434 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 6435 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 6436 {0x18, AC_VERB_SET_CONNECT_SEL, 0x00}, 6437 6438 /* FIXME: use matrix-type input source selection */ 6439 /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */ 6440 /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */ 6441 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 6442 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, 6443 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, 6444 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, 6445 /* Input mixer2 */ 6446 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 6447 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, 6448 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, 6449 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, 6450 /* Input mixer3 */ 6451 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 6452 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, 6453 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, 6454 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, 6455 /* ADC1: mute amp left and right */ 6456 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 6457 {0x07, AC_VERB_SET_CONNECT_SEL, 0x00}, 6458 /* ADC2: mute amp left and right */ 6459 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 6460 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00}, 6461 /* ADC3: mute amp left and right */ 6462 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 6463 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00}, 6464 6465 { } 6466 }; 6467 6468 /* Macbook Pro rev3 */ 6469 static struct hda_verb alc885_mbp3_init_verbs[] = { 6470 /* Front mixer: unmute input/output amp left and right (volume = 0) */ 6471 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 6472 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 6473 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 6474 /* Rear mixer */ 6475 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 6476 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 6477 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 6478 /* Front Pin: output 0 (0x0c) */ 6479 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 6480 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 6481 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, 6482 /* HP Pin: output 0 (0x0d) */ 6483 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc4}, 6484 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 6485 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, 6486 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, 6487 /* Mic (rear) pin: input vref at 80% */ 6488 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, 6489 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 6490 /* Front Mic pin: input vref at 80% */ 6491 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, 6492 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 6493 /* Line In pin: use output 1 when in LineOut mode */ 6494 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 6495 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 6496 {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01}, 6497 6498 /* FIXME: use matrix-type input source selection */ 6499 /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */ 6500 /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */ 6501 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 6502 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, 6503 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, 6504 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, 6505 /* Input mixer2 */ 6506 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 6507 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, 6508 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, 6509 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, 6510 /* Input mixer3 */ 6511 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 6512 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, 6513 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, 6514 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, 6515 /* ADC1: mute amp left and right */ 6516 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 6517 {0x07, AC_VERB_SET_CONNECT_SEL, 0x00}, 6518 /* ADC2: mute amp left and right */ 6519 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 6520 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00}, 6521 /* ADC3: mute amp left and right */ 6522 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 6523 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00}, 6524 6525 { } 6526 }; 6527 6528 /* iMac 24 mixer. */ 6529 static struct snd_kcontrol_new alc885_imac24_mixer[] = { 6530 HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x00, HDA_OUTPUT), 6531 HDA_CODEC_MUTE("Master Playback Switch", 0x0c, 0x00, HDA_INPUT), 6532 { } /* end */ 6533 }; 6534 6535 /* iMac 24 init verbs. */ 6536 static struct hda_verb alc885_imac24_init_verbs[] = { 6537 /* Internal speakers: output 0 (0x0c) */ 6538 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 6539 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 6540 {0x18, AC_VERB_SET_CONNECT_SEL, 0x00}, 6541 /* Internal speakers: output 0 (0x0c) */ 6542 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 6543 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 6544 {0x1a, AC_VERB_SET_CONNECT_SEL, 0x00}, 6545 /* Headphone: output 0 (0x0c) */ 6546 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 6547 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 6548 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, 6549 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, 6550 /* Front Mic: input vref at 80% */ 6551 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, 6552 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 6553 { } 6554 }; 6555 6556 /* Toggle speaker-output according to the hp-jack state */ 6557 static void alc885_imac24_automute(struct hda_codec *codec) 6558 { 6559 unsigned int present; 6560 6561 present = snd_hda_codec_read(codec, 0x14, 0, 6562 AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; 6563 snd_hda_codec_amp_stereo(codec, 0x18, HDA_OUTPUT, 0, 6564 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0); 6565 snd_hda_codec_amp_stereo(codec, 0x1a, HDA_OUTPUT, 0, 6566 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0); 6567 } 6568 6569 /* Processes unsolicited events. */ 6570 static void alc885_imac24_unsol_event(struct hda_codec *codec, 6571 unsigned int res) 6572 { 6573 /* Headphone insertion or removal. */ 6574 if ((res >> 26) == ALC880_HP_EVENT) 6575 alc885_imac24_automute(codec); 6576 } 6577 6578 static void alc885_mbp3_automute(struct hda_codec *codec) 6579 { 6580 unsigned int present; 6581 6582 present = snd_hda_codec_read(codec, 0x15, 0, 6583 AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; 6584 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0, 6585 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0); 6586 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0, 6587 HDA_AMP_MUTE, present ? 0 : HDA_AMP_MUTE); 6588 6589 } 6590 static void alc885_mbp3_unsol_event(struct hda_codec *codec, 6591 unsigned int res) 6592 { 6593 /* Headphone insertion or removal. */ 6594 if ((res >> 26) == ALC880_HP_EVENT) 6595 alc885_mbp3_automute(codec); 6596 } 6597 6598 6599 static struct hda_verb alc882_targa_verbs[] = { 6600 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 6601 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 6602 6603 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 6604 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 6605 6606 {0x18, AC_VERB_SET_CONNECT_SEL, 0x02}, /* mic/clfe */ 6607 {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01}, /* line/surround */ 6608 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */ 6609 6610 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, 6611 {0x01, AC_VERB_SET_GPIO_MASK, 0x03}, 6612 {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x03}, 6613 {0x01, AC_VERB_SET_GPIO_DATA, 0x03}, 6614 { } /* end */ 6615 }; 6616 6617 /* toggle speaker-output according to the hp-jack state */ 6618 static void alc882_targa_automute(struct hda_codec *codec) 6619 { 6620 unsigned int present; 6621 6622 present = snd_hda_codec_read(codec, 0x14, 0, 6623 AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; 6624 snd_hda_codec_amp_stereo(codec, 0x1b, HDA_OUTPUT, 0, 6625 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0); 6626 snd_hda_codec_write_cache(codec, 1, 0, AC_VERB_SET_GPIO_DATA, 6627 present ? 1 : 3); 6628 } 6629 6630 static void alc882_targa_unsol_event(struct hda_codec *codec, unsigned int res) 6631 { 6632 /* Looks like the unsol event is incompatible with the standard 6633 * definition. 4bit tag is placed at 26 bit! 6634 */ 6635 if (((res >> 26) == ALC880_HP_EVENT)) { 6636 alc882_targa_automute(codec); 6637 } 6638 } 6639 6640 static struct hda_verb alc882_asus_a7j_verbs[] = { 6641 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 6642 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 6643 6644 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 6645 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 6646 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 6647 6648 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Front */ 6649 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */ 6650 {0x16, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Front */ 6651 6652 {0x18, AC_VERB_SET_CONNECT_SEL, 0x02}, /* mic/clfe */ 6653 {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01}, /* line/surround */ 6654 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */ 6655 { } /* end */ 6656 }; 6657 6658 static struct hda_verb alc882_asus_a7m_verbs[] = { 6659 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 6660 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 6661 6662 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 6663 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 6664 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 6665 6666 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Front */ 6667 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */ 6668 {0x16, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Front */ 6669 6670 {0x18, AC_VERB_SET_CONNECT_SEL, 0x02}, /* mic/clfe */ 6671 {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01}, /* line/surround */ 6672 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */ 6673 { } /* end */ 6674 }; 6675 6676 static void alc882_gpio_mute(struct hda_codec *codec, int pin, int muted) 6677 { 6678 unsigned int gpiostate, gpiomask, gpiodir; 6679 6680 gpiostate = snd_hda_codec_read(codec, codec->afg, 0, 6681 AC_VERB_GET_GPIO_DATA, 0); 6682 6683 if (!muted) 6684 gpiostate |= (1 << pin); 6685 else 6686 gpiostate &= ~(1 << pin); 6687 6688 gpiomask = snd_hda_codec_read(codec, codec->afg, 0, 6689 AC_VERB_GET_GPIO_MASK, 0); 6690 gpiomask |= (1 << pin); 6691 6692 gpiodir = snd_hda_codec_read(codec, codec->afg, 0, 6693 AC_VERB_GET_GPIO_DIRECTION, 0); 6694 gpiodir |= (1 << pin); 6695 6696 6697 snd_hda_codec_write(codec, codec->afg, 0, 6698 AC_VERB_SET_GPIO_MASK, gpiomask); 6699 snd_hda_codec_write(codec, codec->afg, 0, 6700 AC_VERB_SET_GPIO_DIRECTION, gpiodir); 6701 6702 msleep(1); 6703 6704 snd_hda_codec_write(codec, codec->afg, 0, 6705 AC_VERB_SET_GPIO_DATA, gpiostate); 6706 } 6707 6708 /* set up GPIO at initialization */ 6709 static void alc885_macpro_init_hook(struct hda_codec *codec) 6710 { 6711 alc882_gpio_mute(codec, 0, 0); 6712 alc882_gpio_mute(codec, 1, 0); 6713 } 6714 6715 /* set up GPIO and update auto-muting at initialization */ 6716 static void alc885_imac24_init_hook(struct hda_codec *codec) 6717 { 6718 alc885_macpro_init_hook(codec); 6719 alc885_imac24_automute(codec); 6720 } 6721 6722 /* 6723 * generic initialization of ADC, input mixers and output mixers 6724 */ 6725 static struct hda_verb alc882_auto_init_verbs[] = { 6726 /* 6727 * Unmute ADC0-2 and set the default input to mic-in 6728 */ 6729 {0x07, AC_VERB_SET_CONNECT_SEL, 0x00}, 6730 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 6731 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00}, 6732 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 6733 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00}, 6734 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 6735 6736 /* Mute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback 6737 * mixer widget 6738 * Note: PASD motherboards uses the Line In 2 as the input for 6739 * front panel mic (mic 2) 6740 */ 6741 /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */ 6742 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 6743 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 6744 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, 6745 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, 6746 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, 6747 6748 /* 6749 * Set up output mixers (0x0c - 0x0f) 6750 */ 6751 /* set vol=0 to output mixers */ 6752 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 6753 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 6754 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 6755 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 6756 /* set up input amps for analog loopback */ 6757 /* Amp Indices: DAC = 0, mixer = 1 */ 6758 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 6759 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 6760 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 6761 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 6762 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 6763 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 6764 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 6765 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 6766 {0x26, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 6767 {0x26, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 6768 6769 /* FIXME: use matrix-type input source selection */ 6770 /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */ 6771 /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */ 6772 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))}, 6773 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))}, 6774 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))}, 6775 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))}, 6776 /* Input mixer2 */ 6777 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))}, 6778 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))}, 6779 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))}, 6780 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))}, 6781 /* Input mixer3 */ 6782 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))}, 6783 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))}, 6784 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))}, 6785 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))}, 6786 6787 { } 6788 }; 6789 6790 #ifdef CONFIG_SND_HDA_POWER_SAVE 6791 #define alc882_loopbacks alc880_loopbacks 6792 #endif 6793 6794 /* pcm configuration: identiacal with ALC880 */ 6795 #define alc882_pcm_analog_playback alc880_pcm_analog_playback 6796 #define alc882_pcm_analog_capture alc880_pcm_analog_capture 6797 #define alc882_pcm_digital_playback alc880_pcm_digital_playback 6798 #define alc882_pcm_digital_capture alc880_pcm_digital_capture 6799 6800 /* 6801 * configuration and preset 6802 */ 6803 static const char *alc882_models[ALC882_MODEL_LAST] = { 6804 [ALC882_3ST_DIG] = "3stack-dig", 6805 [ALC882_6ST_DIG] = "6stack-dig", 6806 [ALC882_ARIMA] = "arima", 6807 [ALC882_W2JC] = "w2jc", 6808 [ALC882_TARGA] = "targa", 6809 [ALC882_ASUS_A7J] = "asus-a7j", 6810 [ALC882_ASUS_A7M] = "asus-a7m", 6811 [ALC885_MACPRO] = "macpro", 6812 [ALC885_MBP3] = "mbp3", 6813 [ALC885_IMAC24] = "imac24", 6814 [ALC882_AUTO] = "auto", 6815 }; 6816 6817 static struct snd_pci_quirk alc882_cfg_tbl[] = { 6818 SND_PCI_QUIRK(0x1019, 0x6668, "ECS", ALC882_6ST_DIG), 6819 SND_PCI_QUIRK(0x1043, 0x060d, "Asus A7J", ALC882_ASUS_A7J), 6820 SND_PCI_QUIRK(0x1043, 0x1243, "Asus A7J", ALC882_ASUS_A7J), 6821 SND_PCI_QUIRK(0x1043, 0x13c2, "Asus A7M", ALC882_ASUS_A7M), 6822 SND_PCI_QUIRK(0x1043, 0x1971, "Asus W2JC", ALC882_W2JC), 6823 SND_PCI_QUIRK(0x1043, 0x817f, "Asus P5LD2", ALC882_6ST_DIG), 6824 SND_PCI_QUIRK(0x1043, 0x81d8, "Asus P5WD", ALC882_6ST_DIG), 6825 SND_PCI_QUIRK(0x105b, 0x6668, "Foxconn", ALC882_6ST_DIG), 6826 SND_PCI_QUIRK(0x1458, 0xa002, "Gigabyte P35 DS3R", ALC882_6ST_DIG), 6827 SND_PCI_QUIRK(0x1462, 0x28fb, "Targa T8", ALC882_TARGA), /* MSI-1049 T8 */ 6828 SND_PCI_QUIRK(0x1462, 0x6668, "MSI", ALC882_6ST_DIG), 6829 SND_PCI_QUIRK(0x161f, 0x2054, "Arima W820", ALC882_ARIMA), 6830 {} 6831 }; 6832 6833 static struct alc_config_preset alc882_presets[] = { 6834 [ALC882_3ST_DIG] = { 6835 .mixers = { alc882_base_mixer }, 6836 .init_verbs = { alc882_init_verbs }, 6837 .num_dacs = ARRAY_SIZE(alc882_dac_nids), 6838 .dac_nids = alc882_dac_nids, 6839 .dig_out_nid = ALC882_DIGOUT_NID, 6840 .dig_in_nid = ALC882_DIGIN_NID, 6841 .num_channel_mode = ARRAY_SIZE(alc882_ch_modes), 6842 .channel_mode = alc882_ch_modes, 6843 .need_dac_fix = 1, 6844 .input_mux = &alc882_capture_source, 6845 }, 6846 [ALC882_6ST_DIG] = { 6847 .mixers = { alc882_base_mixer, alc882_chmode_mixer }, 6848 .init_verbs = { alc882_init_verbs }, 6849 .num_dacs = ARRAY_SIZE(alc882_dac_nids), 6850 .dac_nids = alc882_dac_nids, 6851 .dig_out_nid = ALC882_DIGOUT_NID, 6852 .dig_in_nid = ALC882_DIGIN_NID, 6853 .num_channel_mode = ARRAY_SIZE(alc882_sixstack_modes), 6854 .channel_mode = alc882_sixstack_modes, 6855 .input_mux = &alc882_capture_source, 6856 }, 6857 [ALC882_ARIMA] = { 6858 .mixers = { alc882_base_mixer, alc882_chmode_mixer }, 6859 .init_verbs = { alc882_init_verbs, alc882_eapd_verbs }, 6860 .num_dacs = ARRAY_SIZE(alc882_dac_nids), 6861 .dac_nids = alc882_dac_nids, 6862 .num_channel_mode = ARRAY_SIZE(alc882_sixstack_modes), 6863 .channel_mode = alc882_sixstack_modes, 6864 .input_mux = &alc882_capture_source, 6865 }, 6866 [ALC882_W2JC] = { 6867 .mixers = { alc882_w2jc_mixer, alc882_chmode_mixer }, 6868 .init_verbs = { alc882_init_verbs, alc882_eapd_verbs, 6869 alc880_gpio1_init_verbs }, 6870 .num_dacs = ARRAY_SIZE(alc882_dac_nids), 6871 .dac_nids = alc882_dac_nids, 6872 .num_channel_mode = ARRAY_SIZE(alc880_threestack_modes), 6873 .channel_mode = alc880_threestack_modes, 6874 .need_dac_fix = 1, 6875 .input_mux = &alc882_capture_source, 6876 .dig_out_nid = ALC882_DIGOUT_NID, 6877 }, 6878 [ALC885_MBP3] = { 6879 .mixers = { alc885_mbp3_mixer, alc882_chmode_mixer }, 6880 .init_verbs = { alc885_mbp3_init_verbs, 6881 alc880_gpio1_init_verbs }, 6882 .num_dacs = ARRAY_SIZE(alc882_dac_nids), 6883 .dac_nids = alc882_dac_nids, 6884 .channel_mode = alc885_mbp_6ch_modes, 6885 .num_channel_mode = ARRAY_SIZE(alc885_mbp_6ch_modes), 6886 .input_mux = &alc882_capture_source, 6887 .dig_out_nid = ALC882_DIGOUT_NID, 6888 .dig_in_nid = ALC882_DIGIN_NID, 6889 .unsol_event = alc885_mbp3_unsol_event, 6890 .init_hook = alc885_mbp3_automute, 6891 }, 6892 [ALC885_MACPRO] = { 6893 .mixers = { alc882_macpro_mixer }, 6894 .init_verbs = { alc882_macpro_init_verbs }, 6895 .num_dacs = ARRAY_SIZE(alc882_dac_nids), 6896 .dac_nids = alc882_dac_nids, 6897 .dig_out_nid = ALC882_DIGOUT_NID, 6898 .dig_in_nid = ALC882_DIGIN_NID, 6899 .num_channel_mode = ARRAY_SIZE(alc882_ch_modes), 6900 .channel_mode = alc882_ch_modes, 6901 .input_mux = &alc882_capture_source, 6902 .init_hook = alc885_macpro_init_hook, 6903 }, 6904 [ALC885_IMAC24] = { 6905 .mixers = { alc885_imac24_mixer }, 6906 .init_verbs = { alc885_imac24_init_verbs }, 6907 .num_dacs = ARRAY_SIZE(alc882_dac_nids), 6908 .dac_nids = alc882_dac_nids, 6909 .dig_out_nid = ALC882_DIGOUT_NID, 6910 .dig_in_nid = ALC882_DIGIN_NID, 6911 .num_channel_mode = ARRAY_SIZE(alc882_ch_modes), 6912 .channel_mode = alc882_ch_modes, 6913 .input_mux = &alc882_capture_source, 6914 .unsol_event = alc885_imac24_unsol_event, 6915 .init_hook = alc885_imac24_init_hook, 6916 }, 6917 [ALC882_TARGA] = { 6918 .mixers = { alc882_targa_mixer, alc882_chmode_mixer }, 6919 .init_verbs = { alc882_init_verbs, alc882_targa_verbs}, 6920 .num_dacs = ARRAY_SIZE(alc882_dac_nids), 6921 .dac_nids = alc882_dac_nids, 6922 .dig_out_nid = ALC882_DIGOUT_NID, 6923 .num_adc_nids = ARRAY_SIZE(alc882_adc_nids), 6924 .adc_nids = alc882_adc_nids, 6925 .capsrc_nids = alc882_capsrc_nids, 6926 .num_channel_mode = ARRAY_SIZE(alc882_3ST_6ch_modes), 6927 .channel_mode = alc882_3ST_6ch_modes, 6928 .need_dac_fix = 1, 6929 .input_mux = &alc882_capture_source, 6930 .unsol_event = alc882_targa_unsol_event, 6931 .init_hook = alc882_targa_automute, 6932 }, 6933 [ALC882_ASUS_A7J] = { 6934 .mixers = { alc882_asus_a7j_mixer, alc882_chmode_mixer }, 6935 .init_verbs = { alc882_init_verbs, alc882_asus_a7j_verbs}, 6936 .num_dacs = ARRAY_SIZE(alc882_dac_nids), 6937 .dac_nids = alc882_dac_nids, 6938 .dig_out_nid = ALC882_DIGOUT_NID, 6939 .num_adc_nids = ARRAY_SIZE(alc882_adc_nids), 6940 .adc_nids = alc882_adc_nids, 6941 .capsrc_nids = alc882_capsrc_nids, 6942 .num_channel_mode = ARRAY_SIZE(alc882_3ST_6ch_modes), 6943 .channel_mode = alc882_3ST_6ch_modes, 6944 .need_dac_fix = 1, 6945 .input_mux = &alc882_capture_source, 6946 }, 6947 [ALC882_ASUS_A7M] = { 6948 .mixers = { alc882_asus_a7m_mixer, alc882_chmode_mixer }, 6949 .init_verbs = { alc882_init_verbs, alc882_eapd_verbs, 6950 alc880_gpio1_init_verbs, 6951 alc882_asus_a7m_verbs }, 6952 .num_dacs = ARRAY_SIZE(alc882_dac_nids), 6953 .dac_nids = alc882_dac_nids, 6954 .dig_out_nid = ALC882_DIGOUT_NID, 6955 .num_channel_mode = ARRAY_SIZE(alc880_threestack_modes), 6956 .channel_mode = alc880_threestack_modes, 6957 .need_dac_fix = 1, 6958 .input_mux = &alc882_capture_source, 6959 }, 6960 }; 6961 6962 6963 /* 6964 * Pin config fixes 6965 */ 6966 enum { 6967 PINFIX_ABIT_AW9D_MAX 6968 }; 6969 6970 static struct alc_pincfg alc882_abit_aw9d_pinfix[] = { 6971 { 0x15, 0x01080104 }, /* side */ 6972 { 0x16, 0x01011012 }, /* rear */ 6973 { 0x17, 0x01016011 }, /* clfe */ 6974 { } 6975 }; 6976 6977 static const struct alc_pincfg *alc882_pin_fixes[] = { 6978 [PINFIX_ABIT_AW9D_MAX] = alc882_abit_aw9d_pinfix, 6979 }; 6980 6981 static struct snd_pci_quirk alc882_pinfix_tbl[] = { 6982 SND_PCI_QUIRK(0x147b, 0x107a, "Abit AW9D-MAX", PINFIX_ABIT_AW9D_MAX), 6983 {} 6984 }; 6985 6986 /* 6987 * BIOS auto configuration 6988 */ 6989 static void alc882_auto_set_output_and_unmute(struct hda_codec *codec, 6990 hda_nid_t nid, int pin_type, 6991 int dac_idx) 6992 { 6993 /* set as output */ 6994 struct alc_spec *spec = codec->spec; 6995 int idx; 6996 6997 alc_set_pin_output(codec, nid, pin_type); 6998 if (spec->multiout.dac_nids[dac_idx] == 0x25) 6999 idx = 4; 7000 else 7001 idx = spec->multiout.dac_nids[dac_idx] - 2; 7002 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_CONNECT_SEL, idx); 7003 7004 } 7005 7006 static void alc882_auto_init_multi_out(struct hda_codec *codec) 7007 { 7008 struct alc_spec *spec = codec->spec; 7009 int i; 7010 7011 alc_subsystem_id(codec, 0x15, 0x1b, 0x14); 7012 for (i = 0; i <= HDA_SIDE; i++) { 7013 hda_nid_t nid = spec->autocfg.line_out_pins[i]; 7014 int pin_type = get_pin_type(spec->autocfg.line_out_type); 7015 if (nid) 7016 alc882_auto_set_output_and_unmute(codec, nid, pin_type, 7017 i); 7018 } 7019 } 7020 7021 static void alc882_auto_init_hp_out(struct hda_codec *codec) 7022 { 7023 struct alc_spec *spec = codec->spec; 7024 hda_nid_t pin; 7025 7026 pin = spec->autocfg.hp_pins[0]; 7027 if (pin) /* connect to front */ 7028 /* use dac 0 */ 7029 alc882_auto_set_output_and_unmute(codec, pin, PIN_HP, 0); 7030 pin = spec->autocfg.speaker_pins[0]; 7031 if (pin) 7032 alc882_auto_set_output_and_unmute(codec, pin, PIN_OUT, 0); 7033 } 7034 7035 #define alc882_is_input_pin(nid) alc880_is_input_pin(nid) 7036 #define ALC882_PIN_CD_NID ALC880_PIN_CD_NID 7037 7038 static void alc882_auto_init_analog_input(struct hda_codec *codec) 7039 { 7040 struct alc_spec *spec = codec->spec; 7041 int i; 7042 7043 for (i = 0; i < AUTO_PIN_LAST; i++) { 7044 hda_nid_t nid = spec->autocfg.input_pins[i]; 7045 if (!nid) 7046 continue; 7047 alc_set_input_pin(codec, nid, AUTO_PIN_FRONT_MIC /*i*/); 7048 if (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP) 7049 snd_hda_codec_write(codec, nid, 0, 7050 AC_VERB_SET_AMP_GAIN_MUTE, 7051 AMP_OUT_MUTE); 7052 } 7053 } 7054 7055 static void alc882_auto_init_input_src(struct hda_codec *codec) 7056 { 7057 struct alc_spec *spec = codec->spec; 7058 int c; 7059 7060 for (c = 0; c < spec->num_adc_nids; c++) { 7061 hda_nid_t conn_list[HDA_MAX_NUM_INPUTS]; 7062 hda_nid_t nid = spec->capsrc_nids[c]; 7063 unsigned int mux_idx; 7064 const struct hda_input_mux *imux; 7065 int conns, mute, idx, item; 7066 7067 conns = snd_hda_get_connections(codec, nid, conn_list, 7068 ARRAY_SIZE(conn_list)); 7069 if (conns < 0) 7070 continue; 7071 mux_idx = c >= spec->num_mux_defs ? 0 : c; 7072 imux = &spec->input_mux[mux_idx]; 7073 for (idx = 0; idx < conns; idx++) { 7074 /* if the current connection is the selected one, 7075 * unmute it as default - otherwise mute it 7076 */ 7077 mute = AMP_IN_MUTE(idx); 7078 for (item = 0; item < imux->num_items; item++) { 7079 if (imux->items[item].index == idx) { 7080 if (spec->cur_mux[c] == item) 7081 mute = AMP_IN_UNMUTE(idx); 7082 break; 7083 } 7084 } 7085 /* check if we have a selector or mixer 7086 * we could check for the widget type instead, but 7087 * just check for Amp-In presence (in case of mixer 7088 * without amp-in there is something wrong, this 7089 * function shouldn't be used or capsrc nid is wrong) 7090 */ 7091 if (get_wcaps(codec, nid) & AC_WCAP_IN_AMP) 7092 snd_hda_codec_write(codec, nid, 0, 7093 AC_VERB_SET_AMP_GAIN_MUTE, 7094 mute); 7095 else if (mute != AMP_IN_MUTE(idx)) 7096 snd_hda_codec_write(codec, nid, 0, 7097 AC_VERB_SET_CONNECT_SEL, 7098 idx); 7099 } 7100 } 7101 } 7102 7103 /* add mic boosts if needed */ 7104 static int alc_auto_add_mic_boost(struct hda_codec *codec) 7105 { 7106 struct alc_spec *spec = codec->spec; 7107 int err; 7108 hda_nid_t nid; 7109 7110 nid = spec->autocfg.input_pins[AUTO_PIN_MIC]; 7111 if (nid && (get_wcaps(codec, nid) & AC_WCAP_IN_AMP)) { 7112 err = add_control(spec, ALC_CTL_WIDGET_VOL, 7113 "Mic Boost", 7114 HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_INPUT)); 7115 if (err < 0) 7116 return err; 7117 } 7118 nid = spec->autocfg.input_pins[AUTO_PIN_FRONT_MIC]; 7119 if (nid && (get_wcaps(codec, nid) & AC_WCAP_IN_AMP)) { 7120 err = add_control(spec, ALC_CTL_WIDGET_VOL, 7121 "Front Mic Boost", 7122 HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_INPUT)); 7123 if (err < 0) 7124 return err; 7125 } 7126 return 0; 7127 } 7128 7129 /* almost identical with ALC880 parser... */ 7130 static int alc882_parse_auto_config(struct hda_codec *codec) 7131 { 7132 struct alc_spec *spec = codec->spec; 7133 int err = alc880_parse_auto_config(codec); 7134 7135 if (err < 0) 7136 return err; 7137 else if (!err) 7138 return 0; /* no config found */ 7139 7140 err = alc_auto_add_mic_boost(codec); 7141 if (err < 0) 7142 return err; 7143 7144 /* hack - override the init verbs */ 7145 spec->init_verbs[0] = alc882_auto_init_verbs; 7146 7147 return 1; /* config found */ 7148 } 7149 7150 /* additional initialization for auto-configuration model */ 7151 static void alc882_auto_init(struct hda_codec *codec) 7152 { 7153 struct alc_spec *spec = codec->spec; 7154 alc882_auto_init_multi_out(codec); 7155 alc882_auto_init_hp_out(codec); 7156 alc882_auto_init_analog_input(codec); 7157 alc882_auto_init_input_src(codec); 7158 if (spec->unsol_event) 7159 alc_inithook(codec); 7160 } 7161 7162 static int patch_alc883(struct hda_codec *codec); /* called in patch_alc882() */ 7163 7164 static int patch_alc882(struct hda_codec *codec) 7165 { 7166 struct alc_spec *spec; 7167 int err, board_config; 7168 7169 spec = kzalloc(sizeof(*spec), GFP_KERNEL); 7170 if (spec == NULL) 7171 return -ENOMEM; 7172 7173 codec->spec = spec; 7174 7175 board_config = snd_hda_check_board_config(codec, ALC882_MODEL_LAST, 7176 alc882_models, 7177 alc882_cfg_tbl); 7178 7179 if (board_config < 0 || board_config >= ALC882_MODEL_LAST) { 7180 /* Pick up systems that don't supply PCI SSID */ 7181 switch (codec->subsystem_id) { 7182 case 0x106b0c00: /* Mac Pro */ 7183 board_config = ALC885_MACPRO; 7184 break; 7185 case 0x106b1000: /* iMac 24 */ 7186 case 0x106b2800: /* AppleTV */ 7187 case 0x106b3e00: /* iMac 24 Aluminium */ 7188 board_config = ALC885_IMAC24; 7189 break; 7190 case 0x106b00a0: /* MacBookPro3,1 - Another revision */ 7191 case 0x106b00a1: /* Macbook (might be wrong - PCI SSID?) */ 7192 case 0x106b00a4: /* MacbookPro4,1 */ 7193 case 0x106b2c00: /* Macbook Pro rev3 */ 7194 case 0x106b3600: /* Macbook 3.1 */ 7195 case 0x106b3800: /* MacbookPro4,1 - latter revision */ 7196 board_config = ALC885_MBP3; 7197 break; 7198 default: 7199 /* ALC889A is handled better as ALC888-compatible */ 7200 if (codec->revision_id == 0x100101 || 7201 codec->revision_id == 0x100103) { 7202 alc_free(codec); 7203 return patch_alc883(codec); 7204 } 7205 printk(KERN_INFO "hda_codec: Unknown model for ALC882, " 7206 "trying auto-probe from BIOS...\n"); 7207 board_config = ALC882_AUTO; 7208 } 7209 } 7210 7211 alc_fix_pincfg(codec, alc882_pinfix_tbl, alc882_pin_fixes); 7212 7213 if (board_config == ALC882_AUTO) { 7214 /* automatic parse from the BIOS config */ 7215 err = alc882_parse_auto_config(codec); 7216 if (err < 0) { 7217 alc_free(codec); 7218 return err; 7219 } else if (!err) { 7220 printk(KERN_INFO 7221 "hda_codec: Cannot set up configuration " 7222 "from BIOS. Using base mode...\n"); 7223 board_config = ALC882_3ST_DIG; 7224 } 7225 } 7226 7227 err = snd_hda_attach_beep_device(codec, 0x1); 7228 if (err < 0) { 7229 alc_free(codec); 7230 return err; 7231 } 7232 7233 if (board_config != ALC882_AUTO) 7234 setup_preset(spec, &alc882_presets[board_config]); 7235 7236 if (codec->vendor_id == 0x10ec0885) { 7237 spec->stream_name_analog = "ALC885 Analog"; 7238 spec->stream_name_digital = "ALC885 Digital"; 7239 } else { 7240 spec->stream_name_analog = "ALC882 Analog"; 7241 spec->stream_name_digital = "ALC882 Digital"; 7242 } 7243 7244 spec->stream_analog_playback = &alc882_pcm_analog_playback; 7245 spec->stream_analog_capture = &alc882_pcm_analog_capture; 7246 /* FIXME: setup DAC5 */ 7247 /*spec->stream_analog_alt_playback = &alc880_pcm_analog_alt_playback;*/ 7248 spec->stream_analog_alt_capture = &alc880_pcm_analog_alt_capture; 7249 7250 spec->stream_digital_playback = &alc882_pcm_digital_playback; 7251 spec->stream_digital_capture = &alc882_pcm_digital_capture; 7252 7253 spec->capture_style = CAPT_MIX; /* matrix-style capture */ 7254 if (!spec->adc_nids && spec->input_mux) { 7255 /* check whether NID 0x07 is valid */ 7256 unsigned int wcap = get_wcaps(codec, 0x07); 7257 /* get type */ 7258 wcap = (wcap & AC_WCAP_TYPE) >> AC_WCAP_TYPE_SHIFT; 7259 if (wcap != AC_WID_AUD_IN) { 7260 spec->adc_nids = alc882_adc_nids_alt; 7261 spec->num_adc_nids = ARRAY_SIZE(alc882_adc_nids_alt); 7262 spec->capsrc_nids = alc882_capsrc_nids_alt; 7263 } else { 7264 spec->adc_nids = alc882_adc_nids; 7265 spec->num_adc_nids = ARRAY_SIZE(alc882_adc_nids); 7266 spec->capsrc_nids = alc882_capsrc_nids; 7267 } 7268 } 7269 set_capture_mixer(spec); 7270 set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT); 7271 7272 spec->vmaster_nid = 0x0c; 7273 7274 codec->patch_ops = alc_patch_ops; 7275 if (board_config == ALC882_AUTO) 7276 spec->init_hook = alc882_auto_init; 7277 #ifdef CONFIG_SND_HDA_POWER_SAVE 7278 if (!spec->loopback.amplist) 7279 spec->loopback.amplist = alc882_loopbacks; 7280 #endif 7281 codec->proc_widget_hook = print_realtek_coef; 7282 7283 return 0; 7284 } 7285 7286 /* 7287 * ALC883 support 7288 * 7289 * ALC883 is almost identical with ALC880 but has cleaner and more flexible 7290 * configuration. Each pin widget can choose any input DACs and a mixer. 7291 * Each ADC is connected from a mixer of all inputs. This makes possible 7292 * 6-channel independent captures. 7293 * 7294 * In addition, an independent DAC for the multi-playback (not used in this 7295 * driver yet). 7296 */ 7297 #define ALC883_DIGOUT_NID 0x06 7298 #define ALC883_DIGIN_NID 0x0a 7299 7300 #define ALC1200_DIGOUT_NID 0x10 7301 7302 static hda_nid_t alc883_dac_nids[4] = { 7303 /* front, rear, clfe, rear_surr */ 7304 0x02, 0x03, 0x04, 0x05 7305 }; 7306 7307 static hda_nid_t alc883_adc_nids[2] = { 7308 /* ADC1-2 */ 7309 0x08, 0x09, 7310 }; 7311 7312 static hda_nid_t alc883_adc_nids_alt[1] = { 7313 /* ADC1 */ 7314 0x08, 7315 }; 7316 7317 static hda_nid_t alc883_adc_nids_rev[2] = { 7318 /* ADC2-1 */ 7319 0x09, 0x08 7320 }; 7321 7322 #define alc889_adc_nids alc880_adc_nids 7323 7324 static hda_nid_t alc883_capsrc_nids[2] = { 0x23, 0x22 }; 7325 7326 static hda_nid_t alc883_capsrc_nids_rev[2] = { 0x22, 0x23 }; 7327 7328 #define alc889_capsrc_nids alc882_capsrc_nids 7329 7330 /* input MUX */ 7331 /* FIXME: should be a matrix-type input source selection */ 7332 7333 static struct hda_input_mux alc883_capture_source = { 7334 .num_items = 4, 7335 .items = { 7336 { "Mic", 0x0 }, 7337 { "Front Mic", 0x1 }, 7338 { "Line", 0x2 }, 7339 { "CD", 0x4 }, 7340 }, 7341 }; 7342 7343 static struct hda_input_mux alc883_3stack_6ch_intel = { 7344 .num_items = 4, 7345 .items = { 7346 { "Mic", 0x1 }, 7347 { "Front Mic", 0x0 }, 7348 { "Line", 0x2 }, 7349 { "CD", 0x4 }, 7350 }, 7351 }; 7352 7353 static struct hda_input_mux alc883_lenovo_101e_capture_source = { 7354 .num_items = 2, 7355 .items = { 7356 { "Mic", 0x1 }, 7357 { "Line", 0x2 }, 7358 }, 7359 }; 7360 7361 static struct hda_input_mux alc883_lenovo_nb0763_capture_source = { 7362 .num_items = 4, 7363 .items = { 7364 { "Mic", 0x0 }, 7365 { "iMic", 0x1 }, 7366 { "Line", 0x2 }, 7367 { "CD", 0x4 }, 7368 }, 7369 }; 7370 7371 static struct hda_input_mux alc883_fujitsu_pi2515_capture_source = { 7372 .num_items = 2, 7373 .items = { 7374 { "Mic", 0x0 }, 7375 { "Int Mic", 0x1 }, 7376 }, 7377 }; 7378 7379 static struct hda_input_mux alc883_lenovo_sky_capture_source = { 7380 .num_items = 3, 7381 .items = { 7382 { "Mic", 0x0 }, 7383 { "Front Mic", 0x1 }, 7384 { "Line", 0x4 }, 7385 }, 7386 }; 7387 7388 static struct hda_input_mux alc883_asus_eee1601_capture_source = { 7389 .num_items = 2, 7390 .items = { 7391 { "Mic", 0x0 }, 7392 { "Line", 0x2 }, 7393 }, 7394 }; 7395 7396 /* 7397 * 2ch mode 7398 */ 7399 static struct hda_channel_mode alc883_3ST_2ch_modes[1] = { 7400 { 2, NULL } 7401 }; 7402 7403 /* 7404 * 2ch mode 7405 */ 7406 static struct hda_verb alc883_3ST_ch2_init[] = { 7407 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, 7408 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE }, 7409 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN }, 7410 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE }, 7411 { } /* end */ 7412 }; 7413 7414 /* 7415 * 4ch mode 7416 */ 7417 static struct hda_verb alc883_3ST_ch4_init[] = { 7418 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, 7419 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE }, 7420 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 7421 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 7422 { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 }, 7423 { } /* end */ 7424 }; 7425 7426 /* 7427 * 6ch mode 7428 */ 7429 static struct hda_verb alc883_3ST_ch6_init[] = { 7430 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 7431 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 7432 { 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 }, 7433 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 7434 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 7435 { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 }, 7436 { } /* end */ 7437 }; 7438 7439 static struct hda_channel_mode alc883_3ST_6ch_modes[3] = { 7440 { 2, alc883_3ST_ch2_init }, 7441 { 4, alc883_3ST_ch4_init }, 7442 { 6, alc883_3ST_ch6_init }, 7443 }; 7444 7445 /* 7446 * 2ch mode 7447 */ 7448 static struct hda_verb alc883_3ST_ch2_intel_init[] = { 7449 { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, 7450 { 0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE }, 7451 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN }, 7452 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE }, 7453 { } /* end */ 7454 }; 7455 7456 /* 7457 * 4ch mode 7458 */ 7459 static struct hda_verb alc883_3ST_ch4_intel_init[] = { 7460 { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, 7461 { 0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE }, 7462 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 7463 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 7464 { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 }, 7465 { } /* end */ 7466 }; 7467 7468 /* 7469 * 6ch mode 7470 */ 7471 static struct hda_verb alc883_3ST_ch6_intel_init[] = { 7472 { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 7473 { 0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 7474 { 0x19, AC_VERB_SET_CONNECT_SEL, 0x02 }, 7475 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 7476 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 7477 { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 }, 7478 { } /* end */ 7479 }; 7480 7481 static struct hda_channel_mode alc883_3ST_6ch_intel_modes[3] = { 7482 { 2, alc883_3ST_ch2_intel_init }, 7483 { 4, alc883_3ST_ch4_intel_init }, 7484 { 6, alc883_3ST_ch6_intel_init }, 7485 }; 7486 7487 /* 7488 * 6ch mode 7489 */ 7490 static struct hda_verb alc883_sixstack_ch6_init[] = { 7491 { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 }, 7492 { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 7493 { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 7494 { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 7495 { } /* end */ 7496 }; 7497 7498 /* 7499 * 8ch mode 7500 */ 7501 static struct hda_verb alc883_sixstack_ch8_init[] = { 7502 { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 7503 { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 7504 { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 7505 { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 7506 { } /* end */ 7507 }; 7508 7509 static struct hda_channel_mode alc883_sixstack_modes[2] = { 7510 { 6, alc883_sixstack_ch6_init }, 7511 { 8, alc883_sixstack_ch8_init }, 7512 }; 7513 7514 static struct hda_verb alc883_medion_eapd_verbs[] = { 7515 /* eanable EAPD on medion laptop */ 7516 {0x20, AC_VERB_SET_COEF_INDEX, 0x07}, 7517 {0x20, AC_VERB_SET_PROC_COEF, 0x3070}, 7518 { } 7519 }; 7520 7521 /* Pin assignment: Front=0x14, Rear=0x15, CLFE=0x16, Side=0x17 7522 * Mic=0x18, Front Mic=0x19, Line-In=0x1a, HP=0x1b 7523 */ 7524 7525 static struct snd_kcontrol_new alc883_base_mixer[] = { 7526 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 7527 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 7528 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT), 7529 HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT), 7530 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT), 7531 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT), 7532 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT), 7533 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT), 7534 HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT), 7535 HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT), 7536 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT), 7537 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), 7538 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), 7539 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), 7540 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), 7541 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 7542 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), 7543 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 7544 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), 7545 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT), 7546 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), 7547 { } /* end */ 7548 }; 7549 7550 static struct snd_kcontrol_new alc883_mitac_mixer[] = { 7551 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 7552 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 7553 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT), 7554 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT), 7555 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT), 7556 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT), 7557 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT), 7558 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 7559 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), 7560 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 7561 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), 7562 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT), 7563 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), 7564 { } /* end */ 7565 }; 7566 7567 static struct snd_kcontrol_new alc883_clevo_m720_mixer[] = { 7568 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 7569 HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT), 7570 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT), 7571 HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT), 7572 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 7573 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), 7574 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 7575 HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), 7576 HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT), 7577 HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), 7578 { } /* end */ 7579 }; 7580 7581 static struct snd_kcontrol_new alc883_2ch_fujitsu_pi2515_mixer[] = { 7582 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 7583 HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT), 7584 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT), 7585 HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT), 7586 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 7587 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), 7588 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 7589 HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), 7590 HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT), 7591 HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), 7592 { } /* end */ 7593 }; 7594 7595 static struct snd_kcontrol_new alc883_3ST_2ch_mixer[] = { 7596 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 7597 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 7598 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT), 7599 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), 7600 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), 7601 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), 7602 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), 7603 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 7604 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), 7605 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 7606 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), 7607 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT), 7608 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), 7609 { } /* end */ 7610 }; 7611 7612 static struct snd_kcontrol_new alc883_3ST_6ch_mixer[] = { 7613 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 7614 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 7615 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT), 7616 HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT), 7617 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT), 7618 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT), 7619 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT), 7620 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT), 7621 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT), 7622 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), 7623 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), 7624 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), 7625 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), 7626 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 7627 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), 7628 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 7629 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), 7630 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT), 7631 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), 7632 { } /* end */ 7633 }; 7634 7635 static struct snd_kcontrol_new alc883_3ST_6ch_intel_mixer[] = { 7636 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 7637 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 7638 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT), 7639 HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT), 7640 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, 7641 HDA_OUTPUT), 7642 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT), 7643 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT), 7644 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT), 7645 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT), 7646 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), 7647 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), 7648 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), 7649 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), 7650 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), 7651 HDA_CODEC_VOLUME("Mic Boost", 0x19, 0, HDA_INPUT), 7652 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), 7653 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 7654 HDA_CODEC_VOLUME("Front Mic Boost", 0x18, 0, HDA_INPUT), 7655 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 7656 { } /* end */ 7657 }; 7658 7659 static struct snd_kcontrol_new alc883_fivestack_mixer[] = { 7660 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 7661 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 7662 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT), 7663 HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT), 7664 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT), 7665 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT), 7666 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT), 7667 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT), 7668 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT), 7669 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), 7670 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), 7671 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), 7672 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), 7673 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 7674 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), 7675 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 7676 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), 7677 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT), 7678 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), 7679 { } /* end */ 7680 }; 7681 7682 static struct snd_kcontrol_new alc883_tagra_mixer[] = { 7683 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 7684 HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT), 7685 HDA_CODEC_MUTE("Front Playback Switch", 0x1b, 0x0, HDA_OUTPUT), 7686 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT), 7687 HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT), 7688 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT), 7689 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT), 7690 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT), 7691 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT), 7692 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), 7693 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), 7694 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), 7695 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), 7696 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 7697 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), 7698 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 7699 { } /* end */ 7700 }; 7701 7702 static struct snd_kcontrol_new alc883_tagra_2ch_mixer[] = { 7703 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 7704 HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT), 7705 HDA_CODEC_MUTE("Front Playback Switch", 0x1b, 0x0, HDA_OUTPUT), 7706 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), 7707 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), 7708 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 7709 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), 7710 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 7711 HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), 7712 HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT), 7713 HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), 7714 { } /* end */ 7715 }; 7716 7717 static struct snd_kcontrol_new alc883_lenovo_101e_2ch_mixer[] = { 7718 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 7719 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 7720 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT), 7721 HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT), 7722 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT), 7723 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), 7724 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), 7725 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), 7726 { } /* end */ 7727 }; 7728 7729 static struct snd_kcontrol_new alc883_lenovo_nb0763_mixer[] = { 7730 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 7731 HDA_BIND_MUTE("Speaker Playback Switch", 0x0c, 2, HDA_INPUT), 7732 HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT), 7733 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), 7734 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), 7735 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 7736 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 7737 HDA_CODEC_VOLUME("iMic Playback Volume", 0x0b, 0x1, HDA_INPUT), 7738 HDA_CODEC_MUTE("iMic Playback Switch", 0x0b, 0x1, HDA_INPUT), 7739 { } /* end */ 7740 }; 7741 7742 static struct snd_kcontrol_new alc883_medion_md2_mixer[] = { 7743 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 7744 HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT), 7745 HDA_CODEC_MUTE("Front Playback Switch", 0x15, 0x0, HDA_OUTPUT), 7746 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), 7747 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), 7748 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 7749 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 7750 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), 7751 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), 7752 { } /* end */ 7753 }; 7754 7755 static struct snd_kcontrol_new alc883_acer_aspire_mixer[] = { 7756 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 7757 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 7758 HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT), 7759 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), 7760 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), 7761 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 7762 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), 7763 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 7764 { } /* end */ 7765 }; 7766 7767 static struct snd_kcontrol_new alc888_lenovo_sky_mixer[] = { 7768 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 7769 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 7770 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0e, 0x0, HDA_OUTPUT), 7771 HDA_BIND_MUTE("Surround Playback Switch", 0x0e, 2, HDA_INPUT), 7772 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 7773 0x0d, 1, 0x0, HDA_OUTPUT), 7774 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0d, 2, 0x0, HDA_OUTPUT), 7775 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0d, 1, 2, HDA_INPUT), 7776 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0d, 2, 2, HDA_INPUT), 7777 HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT), 7778 HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT), 7779 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT), 7780 HDA_CODEC_MUTE("iSpeaker Playback Switch", 0x1a, 0x0, HDA_OUTPUT), 7781 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), 7782 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), 7783 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), 7784 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), 7785 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 7786 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), 7787 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 7788 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), 7789 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT), 7790 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), 7791 { } /* end */ 7792 }; 7793 7794 static struct hda_bind_ctls alc883_bind_cap_vol = { 7795 .ops = &snd_hda_bind_vol, 7796 .values = { 7797 HDA_COMPOSE_AMP_VAL(0x08, 3, 0, HDA_INPUT), 7798 HDA_COMPOSE_AMP_VAL(0x09, 3, 0, HDA_INPUT), 7799 0 7800 }, 7801 }; 7802 7803 static struct hda_bind_ctls alc883_bind_cap_switch = { 7804 .ops = &snd_hda_bind_sw, 7805 .values = { 7806 HDA_COMPOSE_AMP_VAL(0x08, 3, 0, HDA_INPUT), 7807 HDA_COMPOSE_AMP_VAL(0x09, 3, 0, HDA_INPUT), 7808 0 7809 }, 7810 }; 7811 7812 static struct snd_kcontrol_new alc883_asus_eee1601_mixer[] = { 7813 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 7814 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 7815 HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT), 7816 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), 7817 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), 7818 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 7819 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), 7820 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 7821 { } /* end */ 7822 }; 7823 7824 static struct snd_kcontrol_new alc883_asus_eee1601_cap_mixer[] = { 7825 HDA_BIND_VOL("Capture Volume", &alc883_bind_cap_vol), 7826 HDA_BIND_SW("Capture Switch", &alc883_bind_cap_switch), 7827 { 7828 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 7829 /* .name = "Capture Source", */ 7830 .name = "Input Source", 7831 .count = 1, 7832 .info = alc_mux_enum_info, 7833 .get = alc_mux_enum_get, 7834 .put = alc_mux_enum_put, 7835 }, 7836 { } /* end */ 7837 }; 7838 7839 static struct snd_kcontrol_new alc883_chmode_mixer[] = { 7840 { 7841 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 7842 .name = "Channel Mode", 7843 .info = alc_ch_mode_info, 7844 .get = alc_ch_mode_get, 7845 .put = alc_ch_mode_put, 7846 }, 7847 { } /* end */ 7848 }; 7849 7850 static struct hda_verb alc883_init_verbs[] = { 7851 /* ADC1: mute amp left and right */ 7852 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 7853 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00}, 7854 /* ADC2: mute amp left and right */ 7855 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 7856 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00}, 7857 /* Front mixer: unmute input/output amp left and right (volume = 0) */ 7858 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 7859 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 7860 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 7861 /* Rear mixer */ 7862 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 7863 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 7864 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 7865 /* CLFE mixer */ 7866 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 7867 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 7868 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 7869 /* Side mixer */ 7870 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 7871 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 7872 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 7873 7874 /* mute analog input loopbacks */ 7875 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 7876 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 7877 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, 7878 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, 7879 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, 7880 7881 /* Front Pin: output 0 (0x0c) */ 7882 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 7883 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 7884 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, 7885 /* Rear Pin: output 1 (0x0d) */ 7886 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 7887 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 7888 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, 7889 /* CLFE Pin: output 2 (0x0e) */ 7890 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 7891 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 7892 {0x16, AC_VERB_SET_CONNECT_SEL, 0x02}, 7893 /* Side Pin: output 3 (0x0f) */ 7894 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 7895 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 7896 {0x17, AC_VERB_SET_CONNECT_SEL, 0x03}, 7897 /* Mic (rear) pin: input vref at 80% */ 7898 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, 7899 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 7900 /* Front Mic pin: input vref at 80% */ 7901 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, 7902 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 7903 /* Line In pin: input */ 7904 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 7905 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 7906 /* Line-2 In: Headphone output (output 0 - 0x0c) */ 7907 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 7908 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 7909 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, 7910 /* CD pin widget for input */ 7911 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 7912 7913 /* FIXME: use matrix-type input source selection */ 7914 /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */ 7915 /* Input mixer2 */ 7916 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 7917 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 7918 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, 7919 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, 7920 /* Input mixer3 */ 7921 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 7922 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 7923 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, 7924 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, 7925 { } 7926 }; 7927 7928 /* toggle speaker-output according to the hp-jack state */ 7929 static void alc883_mitac_hp_automute(struct hda_codec *codec) 7930 { 7931 unsigned int present; 7932 7933 present = snd_hda_codec_read(codec, 0x15, 0, 7934 AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; 7935 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0, 7936 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0); 7937 snd_hda_codec_amp_stereo(codec, 0x17, HDA_OUTPUT, 0, 7938 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0); 7939 } 7940 7941 /* auto-toggle front mic */ 7942 /* 7943 static void alc883_mitac_mic_automute(struct hda_codec *codec) 7944 { 7945 unsigned int present; 7946 unsigned char bits; 7947 7948 present = snd_hda_codec_read(codec, 0x18, 0, 7949 AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; 7950 bits = present ? HDA_AMP_MUTE : 0; 7951 snd_hda_codec_amp_stereo(codec, 0x0b, HDA_INPUT, 1, HDA_AMP_MUTE, bits); 7952 } 7953 */ 7954 7955 static void alc883_mitac_automute(struct hda_codec *codec) 7956 { 7957 alc883_mitac_hp_automute(codec); 7958 /* alc883_mitac_mic_automute(codec); */ 7959 } 7960 7961 static void alc883_mitac_unsol_event(struct hda_codec *codec, 7962 unsigned int res) 7963 { 7964 switch (res >> 26) { 7965 case ALC880_HP_EVENT: 7966 alc883_mitac_hp_automute(codec); 7967 break; 7968 case ALC880_MIC_EVENT: 7969 /* alc883_mitac_mic_automute(codec); */ 7970 break; 7971 } 7972 } 7973 7974 static struct hda_verb alc883_mitac_verbs[] = { 7975 /* HP */ 7976 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, 7977 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 7978 /* Subwoofer */ 7979 {0x17, AC_VERB_SET_CONNECT_SEL, 0x02}, 7980 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 7981 7982 /* enable unsolicited event */ 7983 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, 7984 /* {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN}, */ 7985 7986 { } /* end */ 7987 }; 7988 7989 static struct hda_verb alc883_clevo_m720_verbs[] = { 7990 /* HP */ 7991 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, 7992 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 7993 /* Int speaker */ 7994 {0x14, AC_VERB_SET_CONNECT_SEL, 0x01}, 7995 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 7996 7997 /* enable unsolicited event */ 7998 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, 7999 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN}, 8000 8001 { } /* end */ 8002 }; 8003 8004 static struct hda_verb alc883_2ch_fujitsu_pi2515_verbs[] = { 8005 /* HP */ 8006 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, 8007 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 8008 /* Subwoofer */ 8009 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, 8010 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 8011 8012 /* enable unsolicited event */ 8013 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, 8014 8015 { } /* end */ 8016 }; 8017 8018 static struct hda_verb alc883_tagra_verbs[] = { 8019 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 8020 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 8021 8022 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 8023 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 8024 8025 {0x18, AC_VERB_SET_CONNECT_SEL, 0x02}, /* mic/clfe */ 8026 {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01}, /* line/surround */ 8027 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */ 8028 8029 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, 8030 {0x01, AC_VERB_SET_GPIO_MASK, 0x03}, 8031 {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x03}, 8032 {0x01, AC_VERB_SET_GPIO_DATA, 0x03}, 8033 8034 { } /* end */ 8035 }; 8036 8037 static struct hda_verb alc883_lenovo_101e_verbs[] = { 8038 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, 8039 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_FRONT_EVENT|AC_USRSP_EN}, 8040 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT|AC_USRSP_EN}, 8041 { } /* end */ 8042 }; 8043 8044 static struct hda_verb alc883_lenovo_nb0763_verbs[] = { 8045 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, 8046 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 8047 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, 8048 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 8049 { } /* end */ 8050 }; 8051 8052 static struct hda_verb alc888_lenovo_ms7195_verbs[] = { 8053 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 8054 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 8055 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, 8056 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_FRONT_EVENT | AC_USRSP_EN}, 8057 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, 8058 { } /* end */ 8059 }; 8060 8061 static struct hda_verb alc883_haier_w66_verbs[] = { 8062 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 8063 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 8064 8065 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 8066 8067 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, 8068 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 8069 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, 8070 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 8071 { } /* end */ 8072 }; 8073 8074 static struct hda_verb alc888_lenovo_sky_verbs[] = { 8075 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 8076 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 8077 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 8078 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 8079 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 8080 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 8081 {0x1a, AC_VERB_SET_CONNECT_SEL, 0x00}, 8082 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, 8083 { } /* end */ 8084 }; 8085 8086 static struct hda_verb alc888_6st_dell_verbs[] = { 8087 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, 8088 { } 8089 }; 8090 8091 static void alc888_3st_hp_front_automute(struct hda_codec *codec) 8092 { 8093 unsigned int present, bits; 8094 8095 present = snd_hda_codec_read(codec, 0x1b, 0, 8096 AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; 8097 bits = present ? HDA_AMP_MUTE : 0; 8098 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0, 8099 HDA_AMP_MUTE, bits); 8100 snd_hda_codec_amp_stereo(codec, 0x16, HDA_OUTPUT, 0, 8101 HDA_AMP_MUTE, bits); 8102 snd_hda_codec_amp_stereo(codec, 0x18, HDA_OUTPUT, 0, 8103 HDA_AMP_MUTE, bits); 8104 } 8105 8106 static void alc888_3st_hp_unsol_event(struct hda_codec *codec, 8107 unsigned int res) 8108 { 8109 switch (res >> 26) { 8110 case ALC880_HP_EVENT: 8111 alc888_3st_hp_front_automute(codec); 8112 break; 8113 } 8114 } 8115 8116 static struct hda_verb alc888_3st_hp_verbs[] = { 8117 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Front: output 0 (0x0c) */ 8118 {0x16, AC_VERB_SET_CONNECT_SEL, 0x01}, /* Rear : output 1 (0x0d) */ 8119 {0x18, AC_VERB_SET_CONNECT_SEL, 0x02}, /* CLFE : output 2 (0x0e) */ 8120 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, 8121 { } /* end */ 8122 }; 8123 8124 /* 8125 * 2ch mode 8126 */ 8127 static struct hda_verb alc888_3st_hp_2ch_init[] = { 8128 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, 8129 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE }, 8130 { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN }, 8131 { 0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE }, 8132 { } /* end */ 8133 }; 8134 8135 /* 8136 * 4ch mode 8137 */ 8138 static struct hda_verb alc888_3st_hp_4ch_init[] = { 8139 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, 8140 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE }, 8141 { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 8142 { 0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 8143 { 0x16, AC_VERB_SET_CONNECT_SEL, 0x01 }, 8144 { } /* end */ 8145 }; 8146 8147 /* 8148 * 6ch mode 8149 */ 8150 static struct hda_verb alc888_3st_hp_6ch_init[] = { 8151 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 8152 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 8153 { 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 }, 8154 { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 8155 { 0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 8156 { 0x16, AC_VERB_SET_CONNECT_SEL, 0x01 }, 8157 { } /* end */ 8158 }; 8159 8160 static struct hda_channel_mode alc888_3st_hp_modes[3] = { 8161 { 2, alc888_3st_hp_2ch_init }, 8162 { 4, alc888_3st_hp_4ch_init }, 8163 { 6, alc888_3st_hp_6ch_init }, 8164 }; 8165 8166 /* toggle front-jack and RCA according to the hp-jack state */ 8167 static void alc888_lenovo_ms7195_front_automute(struct hda_codec *codec) 8168 { 8169 unsigned int present; 8170 8171 present = snd_hda_codec_read(codec, 0x1b, 0, 8172 AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; 8173 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0, 8174 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0); 8175 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0, 8176 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0); 8177 } 8178 8179 /* toggle RCA according to the front-jack state */ 8180 static void alc888_lenovo_ms7195_rca_automute(struct hda_codec *codec) 8181 { 8182 unsigned int present; 8183 8184 present = snd_hda_codec_read(codec, 0x14, 0, 8185 AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; 8186 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0, 8187 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0); 8188 } 8189 8190 static void alc883_lenovo_ms7195_unsol_event(struct hda_codec *codec, 8191 unsigned int res) 8192 { 8193 if ((res >> 26) == ALC880_HP_EVENT) 8194 alc888_lenovo_ms7195_front_automute(codec); 8195 if ((res >> 26) == ALC880_FRONT_EVENT) 8196 alc888_lenovo_ms7195_rca_automute(codec); 8197 } 8198 8199 static struct hda_verb alc883_medion_md2_verbs[] = { 8200 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 8201 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 8202 8203 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 8204 8205 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, 8206 { } /* end */ 8207 }; 8208 8209 /* toggle speaker-output according to the hp-jack state */ 8210 static void alc883_medion_md2_automute(struct hda_codec *codec) 8211 { 8212 unsigned int present; 8213 8214 present = snd_hda_codec_read(codec, 0x14, 0, 8215 AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; 8216 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0, 8217 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0); 8218 } 8219 8220 static void alc883_medion_md2_unsol_event(struct hda_codec *codec, 8221 unsigned int res) 8222 { 8223 if ((res >> 26) == ALC880_HP_EVENT) 8224 alc883_medion_md2_automute(codec); 8225 } 8226 8227 /* toggle speaker-output according to the hp-jack state */ 8228 static void alc883_tagra_automute(struct hda_codec *codec) 8229 { 8230 unsigned int present; 8231 unsigned char bits; 8232 8233 present = snd_hda_codec_read(codec, 0x14, 0, 8234 AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; 8235 bits = present ? HDA_AMP_MUTE : 0; 8236 snd_hda_codec_amp_stereo(codec, 0x1b, HDA_OUTPUT, 0, 8237 HDA_AMP_MUTE, bits); 8238 snd_hda_codec_write_cache(codec, 1, 0, AC_VERB_SET_GPIO_DATA, 8239 present ? 1 : 3); 8240 } 8241 8242 static void alc883_tagra_unsol_event(struct hda_codec *codec, unsigned int res) 8243 { 8244 if ((res >> 26) == ALC880_HP_EVENT) 8245 alc883_tagra_automute(codec); 8246 } 8247 8248 /* toggle speaker-output according to the hp-jack state */ 8249 static void alc883_clevo_m720_hp_automute(struct hda_codec *codec) 8250 { 8251 unsigned int present; 8252 unsigned char bits; 8253 8254 present = snd_hda_codec_read(codec, 0x15, 0, AC_VERB_GET_PIN_SENSE, 0) 8255 & AC_PINSENSE_PRESENCE; 8256 bits = present ? HDA_AMP_MUTE : 0; 8257 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0, 8258 HDA_AMP_MUTE, bits); 8259 } 8260 8261 static void alc883_clevo_m720_mic_automute(struct hda_codec *codec) 8262 { 8263 unsigned int present; 8264 8265 present = snd_hda_codec_read(codec, 0x18, 0, 8266 AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; 8267 snd_hda_codec_amp_stereo(codec, 0x0b, HDA_INPUT, 1, 8268 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0); 8269 } 8270 8271 static void alc883_clevo_m720_automute(struct hda_codec *codec) 8272 { 8273 alc883_clevo_m720_hp_automute(codec); 8274 alc883_clevo_m720_mic_automute(codec); 8275 } 8276 8277 static void alc883_clevo_m720_unsol_event(struct hda_codec *codec, 8278 unsigned int res) 8279 { 8280 switch (res >> 26) { 8281 case ALC880_HP_EVENT: 8282 alc883_clevo_m720_hp_automute(codec); 8283 break; 8284 case ALC880_MIC_EVENT: 8285 alc883_clevo_m720_mic_automute(codec); 8286 break; 8287 } 8288 } 8289 8290 /* toggle speaker-output according to the hp-jack state */ 8291 static void alc883_2ch_fujitsu_pi2515_automute(struct hda_codec *codec) 8292 { 8293 unsigned int present; 8294 unsigned char bits; 8295 8296 present = snd_hda_codec_read(codec, 0x14, 0, AC_VERB_GET_PIN_SENSE, 0) 8297 & AC_PINSENSE_PRESENCE; 8298 bits = present ? HDA_AMP_MUTE : 0; 8299 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0, 8300 HDA_AMP_MUTE, bits); 8301 } 8302 8303 static void alc883_2ch_fujitsu_pi2515_unsol_event(struct hda_codec *codec, 8304 unsigned int res) 8305 { 8306 if ((res >> 26) == ALC880_HP_EVENT) 8307 alc883_2ch_fujitsu_pi2515_automute(codec); 8308 } 8309 8310 static void alc883_haier_w66_automute(struct hda_codec *codec) 8311 { 8312 unsigned int present; 8313 unsigned char bits; 8314 8315 present = snd_hda_codec_read(codec, 0x1b, 0, 8316 AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; 8317 bits = present ? 0x80 : 0; 8318 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0, 8319 0x80, bits); 8320 } 8321 8322 static void alc883_haier_w66_unsol_event(struct hda_codec *codec, 8323 unsigned int res) 8324 { 8325 if ((res >> 26) == ALC880_HP_EVENT) 8326 alc883_haier_w66_automute(codec); 8327 } 8328 8329 static void alc883_lenovo_101e_ispeaker_automute(struct hda_codec *codec) 8330 { 8331 unsigned int present; 8332 unsigned char bits; 8333 8334 present = snd_hda_codec_read(codec, 0x14, 0, 8335 AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; 8336 bits = present ? HDA_AMP_MUTE : 0; 8337 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0, 8338 HDA_AMP_MUTE, bits); 8339 } 8340 8341 static void alc883_lenovo_101e_all_automute(struct hda_codec *codec) 8342 { 8343 unsigned int present; 8344 unsigned char bits; 8345 8346 present = snd_hda_codec_read(codec, 0x1b, 0, 8347 AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; 8348 bits = present ? HDA_AMP_MUTE : 0; 8349 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0, 8350 HDA_AMP_MUTE, bits); 8351 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0, 8352 HDA_AMP_MUTE, bits); 8353 } 8354 8355 static void alc883_lenovo_101e_unsol_event(struct hda_codec *codec, 8356 unsigned int res) 8357 { 8358 if ((res >> 26) == ALC880_HP_EVENT) 8359 alc883_lenovo_101e_all_automute(codec); 8360 if ((res >> 26) == ALC880_FRONT_EVENT) 8361 alc883_lenovo_101e_ispeaker_automute(codec); 8362 } 8363 8364 /* toggle speaker-output according to the hp-jack state */ 8365 static void alc883_acer_aspire_automute(struct hda_codec *codec) 8366 { 8367 unsigned int present; 8368 8369 present = snd_hda_codec_read(codec, 0x14, 0, 8370 AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; 8371 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0, 8372 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0); 8373 snd_hda_codec_amp_stereo(codec, 0x16, HDA_OUTPUT, 0, 8374 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0); 8375 } 8376 8377 static void alc883_acer_aspire_unsol_event(struct hda_codec *codec, 8378 unsigned int res) 8379 { 8380 if ((res >> 26) == ALC880_HP_EVENT) 8381 alc883_acer_aspire_automute(codec); 8382 } 8383 8384 static struct hda_verb alc883_acer_eapd_verbs[] = { 8385 /* HP Pin: output 0 (0x0c) */ 8386 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 8387 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 8388 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, 8389 /* Front Pin: output 0 (0x0c) */ 8390 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 8391 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, 8392 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 8393 {0x16, AC_VERB_SET_CONNECT_SEL, 0x00}, 8394 /* eanable EAPD on medion laptop */ 8395 {0x20, AC_VERB_SET_COEF_INDEX, 0x07}, 8396 {0x20, AC_VERB_SET_PROC_COEF, 0x3050}, 8397 /* enable unsolicited event */ 8398 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, 8399 { } 8400 }; 8401 8402 static void alc888_6st_dell_front_automute(struct hda_codec *codec) 8403 { 8404 unsigned int present; 8405 8406 present = snd_hda_codec_read(codec, 0x1b, 0, 8407 AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; 8408 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0, 8409 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0); 8410 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0, 8411 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0); 8412 snd_hda_codec_amp_stereo(codec, 0x16, HDA_OUTPUT, 0, 8413 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0); 8414 snd_hda_codec_amp_stereo(codec, 0x17, HDA_OUTPUT, 0, 8415 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0); 8416 } 8417 8418 static void alc888_6st_dell_unsol_event(struct hda_codec *codec, 8419 unsigned int res) 8420 { 8421 switch (res >> 26) { 8422 case ALC880_HP_EVENT: 8423 /* printk(KERN_DEBUG "hp_event\n"); */ 8424 alc888_6st_dell_front_automute(codec); 8425 break; 8426 } 8427 } 8428 8429 static void alc888_lenovo_sky_front_automute(struct hda_codec *codec) 8430 { 8431 unsigned int mute; 8432 unsigned int present; 8433 8434 snd_hda_codec_read(codec, 0x1b, 0, AC_VERB_SET_PIN_SENSE, 0); 8435 present = snd_hda_codec_read(codec, 0x1b, 0, 8436 AC_VERB_GET_PIN_SENSE, 0); 8437 present = (present & 0x80000000) != 0; 8438 if (present) { 8439 /* mute internal speaker */ 8440 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0, 8441 HDA_AMP_MUTE, HDA_AMP_MUTE); 8442 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0, 8443 HDA_AMP_MUTE, HDA_AMP_MUTE); 8444 snd_hda_codec_amp_stereo(codec, 0x16, HDA_OUTPUT, 0, 8445 HDA_AMP_MUTE, HDA_AMP_MUTE); 8446 snd_hda_codec_amp_stereo(codec, 0x17, HDA_OUTPUT, 0, 8447 HDA_AMP_MUTE, HDA_AMP_MUTE); 8448 snd_hda_codec_amp_stereo(codec, 0x1a, HDA_OUTPUT, 0, 8449 HDA_AMP_MUTE, HDA_AMP_MUTE); 8450 } else { 8451 /* unmute internal speaker if necessary */ 8452 mute = snd_hda_codec_amp_read(codec, 0x1b, 0, HDA_OUTPUT, 0); 8453 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0, 8454 HDA_AMP_MUTE, mute); 8455 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0, 8456 HDA_AMP_MUTE, mute); 8457 snd_hda_codec_amp_stereo(codec, 0x16, HDA_OUTPUT, 0, 8458 HDA_AMP_MUTE, mute); 8459 snd_hda_codec_amp_stereo(codec, 0x17, HDA_OUTPUT, 0, 8460 HDA_AMP_MUTE, mute); 8461 snd_hda_codec_amp_stereo(codec, 0x1a, HDA_OUTPUT, 0, 8462 HDA_AMP_MUTE, mute); 8463 } 8464 } 8465 8466 static void alc883_lenovo_sky_unsol_event(struct hda_codec *codec, 8467 unsigned int res) 8468 { 8469 if ((res >> 26) == ALC880_HP_EVENT) 8470 alc888_lenovo_sky_front_automute(codec); 8471 } 8472 8473 /* 8474 * generic initialization of ADC, input mixers and output mixers 8475 */ 8476 static struct hda_verb alc883_auto_init_verbs[] = { 8477 /* 8478 * Unmute ADC0-2 and set the default input to mic-in 8479 */ 8480 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00}, 8481 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 8482 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00}, 8483 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 8484 8485 /* Mute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback 8486 * mixer widget 8487 * Note: PASD motherboards uses the Line In 2 as the input for 8488 * front panel mic (mic 2) 8489 */ 8490 /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */ 8491 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 8492 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 8493 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, 8494 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, 8495 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, 8496 8497 /* 8498 * Set up output mixers (0x0c - 0x0f) 8499 */ 8500 /* set vol=0 to output mixers */ 8501 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 8502 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 8503 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 8504 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 8505 /* set up input amps for analog loopback */ 8506 /* Amp Indices: DAC = 0, mixer = 1 */ 8507 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 8508 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 8509 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 8510 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 8511 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 8512 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 8513 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 8514 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 8515 {0x26, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 8516 {0x26, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 8517 8518 /* FIXME: use matrix-type input source selection */ 8519 /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */ 8520 /* Input mixer1 */ 8521 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 8522 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 8523 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)}, 8524 /* {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)}, */ 8525 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(4)}, 8526 /* Input mixer2 */ 8527 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 8528 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 8529 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)}, 8530 /* {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)}, */ 8531 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(4)}, 8532 8533 { } 8534 }; 8535 8536 static struct hda_verb alc888_asus_m90v_verbs[] = { 8537 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 8538 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 8539 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 8540 /* enable unsolicited event */ 8541 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, 8542 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN}, 8543 { } /* end */ 8544 }; 8545 8546 static void alc883_nb_mic_automute(struct hda_codec *codec) 8547 { 8548 unsigned int present; 8549 8550 present = snd_hda_codec_read(codec, 0x18, 0, 8551 AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; 8552 snd_hda_codec_write(codec, 0x23, 0, AC_VERB_SET_AMP_GAIN_MUTE, 8553 0x7000 | (0x00 << 8) | (present ? 0 : 0x80)); 8554 snd_hda_codec_write(codec, 0x23, 0, AC_VERB_SET_AMP_GAIN_MUTE, 8555 0x7000 | (0x01 << 8) | (present ? 0x80 : 0)); 8556 } 8557 8558 static void alc883_M90V_speaker_automute(struct hda_codec *codec) 8559 { 8560 unsigned int present; 8561 unsigned char bits; 8562 8563 present = snd_hda_codec_read(codec, 0x1b, 0, 8564 AC_VERB_GET_PIN_SENSE, 0) 8565 & AC_PINSENSE_PRESENCE; 8566 bits = present ? 0 : PIN_OUT; 8567 snd_hda_codec_write(codec, 0x14, 0, AC_VERB_SET_PIN_WIDGET_CONTROL, 8568 bits); 8569 snd_hda_codec_write(codec, 0x15, 0, AC_VERB_SET_PIN_WIDGET_CONTROL, 8570 bits); 8571 snd_hda_codec_write(codec, 0x16, 0, AC_VERB_SET_PIN_WIDGET_CONTROL, 8572 bits); 8573 } 8574 8575 static void alc883_mode2_unsol_event(struct hda_codec *codec, 8576 unsigned int res) 8577 { 8578 switch (res >> 26) { 8579 case ALC880_HP_EVENT: 8580 alc883_M90V_speaker_automute(codec); 8581 break; 8582 case ALC880_MIC_EVENT: 8583 alc883_nb_mic_automute(codec); 8584 break; 8585 } 8586 } 8587 8588 static void alc883_mode2_inithook(struct hda_codec *codec) 8589 { 8590 alc883_M90V_speaker_automute(codec); 8591 alc883_nb_mic_automute(codec); 8592 } 8593 8594 static struct hda_verb alc888_asus_eee1601_verbs[] = { 8595 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 8596 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 8597 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 8598 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 8599 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 8600 {0x20, AC_VERB_SET_COEF_INDEX, 0x0b}, 8601 {0x20, AC_VERB_SET_PROC_COEF, 0x0838}, 8602 /* enable unsolicited event */ 8603 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, 8604 { } /* end */ 8605 }; 8606 8607 static void alc883_eee1601_speaker_automute(struct hda_codec *codec) 8608 { 8609 unsigned int present; 8610 unsigned char bits; 8611 8612 present = snd_hda_codec_read(codec, 0x14, 0, 8613 AC_VERB_GET_PIN_SENSE, 0) 8614 & AC_PINSENSE_PRESENCE; 8615 bits = present ? 0 : PIN_OUT; 8616 snd_hda_codec_write(codec, 0x1b, 0, AC_VERB_SET_PIN_WIDGET_CONTROL, 8617 bits); 8618 } 8619 8620 static void alc883_eee1601_unsol_event(struct hda_codec *codec, 8621 unsigned int res) 8622 { 8623 switch (res >> 26) { 8624 case ALC880_HP_EVENT: 8625 alc883_eee1601_speaker_automute(codec); 8626 break; 8627 } 8628 } 8629 8630 static void alc883_eee1601_inithook(struct hda_codec *codec) 8631 { 8632 alc883_eee1601_speaker_automute(codec); 8633 } 8634 8635 #ifdef CONFIG_SND_HDA_POWER_SAVE 8636 #define alc883_loopbacks alc880_loopbacks 8637 #endif 8638 8639 /* pcm configuration: identiacal with ALC880 */ 8640 #define alc883_pcm_analog_playback alc880_pcm_analog_playback 8641 #define alc883_pcm_analog_capture alc880_pcm_analog_capture 8642 #define alc883_pcm_analog_alt_capture alc880_pcm_analog_alt_capture 8643 #define alc883_pcm_digital_playback alc880_pcm_digital_playback 8644 #define alc883_pcm_digital_capture alc880_pcm_digital_capture 8645 8646 /* 8647 * configuration and preset 8648 */ 8649 static const char *alc883_models[ALC883_MODEL_LAST] = { 8650 [ALC883_3ST_2ch_DIG] = "3stack-dig", 8651 [ALC883_3ST_6ch_DIG] = "3stack-6ch-dig", 8652 [ALC883_3ST_6ch] = "3stack-6ch", 8653 [ALC883_6ST_DIG] = "6stack-dig", 8654 [ALC883_TARGA_DIG] = "targa-dig", 8655 [ALC883_TARGA_2ch_DIG] = "targa-2ch-dig", 8656 [ALC883_ACER] = "acer", 8657 [ALC883_ACER_ASPIRE] = "acer-aspire", 8658 [ALC888_ACER_ASPIRE_4930G] = "acer-aspire-4930g", 8659 [ALC883_MEDION] = "medion", 8660 [ALC883_MEDION_MD2] = "medion-md2", 8661 [ALC883_LAPTOP_EAPD] = "laptop-eapd", 8662 [ALC883_LENOVO_101E_2ch] = "lenovo-101e", 8663 [ALC883_LENOVO_NB0763] = "lenovo-nb0763", 8664 [ALC888_LENOVO_MS7195_DIG] = "lenovo-ms7195-dig", 8665 [ALC888_LENOVO_SKY] = "lenovo-sky", 8666 [ALC883_HAIER_W66] = "haier-w66", 8667 [ALC888_3ST_HP] = "3stack-hp", 8668 [ALC888_6ST_DELL] = "6stack-dell", 8669 [ALC883_MITAC] = "mitac", 8670 [ALC883_CLEVO_M720] = "clevo-m720", 8671 [ALC883_FUJITSU_PI2515] = "fujitsu-pi2515", 8672 [ALC888_FUJITSU_XA3530] = "fujitsu-xa3530", 8673 [ALC883_3ST_6ch_INTEL] = "3stack-6ch-intel", 8674 [ALC1200_ASUS_P5Q] = "asus-p5q", 8675 [ALC883_AUTO] = "auto", 8676 }; 8677 8678 static struct snd_pci_quirk alc883_cfg_tbl[] = { 8679 SND_PCI_QUIRK(0x1019, 0x6668, "ECS", ALC883_3ST_6ch_DIG), 8680 SND_PCI_QUIRK(0x1025, 0x006c, "Acer Aspire 9810", ALC883_ACER_ASPIRE), 8681 SND_PCI_QUIRK(0x1025, 0x0090, "Acer Aspire", ALC883_ACER_ASPIRE), 8682 SND_PCI_QUIRK(0x1025, 0x010a, "Acer Ferrari 5000", ALC883_ACER_ASPIRE), 8683 SND_PCI_QUIRK(0x1025, 0x0110, "Acer Aspire", ALC883_ACER_ASPIRE), 8684 SND_PCI_QUIRK(0x1025, 0x0112, "Acer Aspire 9303", ALC883_ACER_ASPIRE), 8685 SND_PCI_QUIRK(0x1025, 0x0121, "Acer Aspire 5920G", ALC883_ACER_ASPIRE), 8686 SND_PCI_QUIRK(0x1025, 0x013e, "Acer Aspire 4930G", 8687 ALC888_ACER_ASPIRE_4930G), 8688 SND_PCI_QUIRK(0x1025, 0x013f, "Acer Aspire 5930G", 8689 ALC888_ACER_ASPIRE_4930G), 8690 SND_PCI_QUIRK(0x1025, 0x0157, "Acer X3200", ALC883_AUTO), 8691 SND_PCI_QUIRK(0x1025, 0x0158, "Acer AX1700-U3700A", ALC883_AUTO), 8692 SND_PCI_QUIRK(0x1025, 0x015e, "Acer Aspire 6930G", 8693 ALC888_ACER_ASPIRE_4930G), 8694 SND_PCI_QUIRK(0x1025, 0x0166, "Acer Aspire 6530G", 8695 ALC888_ACER_ASPIRE_4930G), 8696 /* default Acer */ 8697 SND_PCI_QUIRK_VENDOR(0x1025, "Acer laptop", ALC883_ACER), 8698 SND_PCI_QUIRK(0x1028, 0x020d, "Dell Inspiron 530", ALC888_6ST_DELL), 8699 SND_PCI_QUIRK(0x103c, 0x2a3d, "HP Pavillion", ALC883_6ST_DIG), 8700 SND_PCI_QUIRK(0x103c, 0x2a4f, "HP Samba", ALC888_3ST_HP), 8701 SND_PCI_QUIRK(0x103c, 0x2a60, "HP Lucknow", ALC888_3ST_HP), 8702 SND_PCI_QUIRK(0x103c, 0x2a61, "HP Nettle", ALC883_6ST_DIG), 8703 SND_PCI_QUIRK(0x103c, 0x2a66, "HP Acacia", ALC888_3ST_HP), 8704 SND_PCI_QUIRK(0x103c, 0x2a72, "HP Educ.ar", ALC888_3ST_HP), 8705 SND_PCI_QUIRK(0x1043, 0x1873, "Asus M90V", ALC888_ASUS_M90V), 8706 SND_PCI_QUIRK(0x1043, 0x8249, "Asus M2A-VM HDMI", ALC883_3ST_6ch_DIG), 8707 SND_PCI_QUIRK(0x1043, 0x8284, "Asus Z37E", ALC883_6ST_DIG), 8708 SND_PCI_QUIRK(0x1043, 0x82fe, "Asus P5Q-EM HDMI", ALC1200_ASUS_P5Q), 8709 SND_PCI_QUIRK(0x1043, 0x835f, "Asus Eee 1601", ALC888_ASUS_EEE1601), 8710 SND_PCI_QUIRK(0x105b, 0x0ce8, "Foxconn P35AX-S", ALC883_6ST_DIG), 8711 SND_PCI_QUIRK(0x105b, 0x6668, "Foxconn", ALC883_6ST_DIG), 8712 SND_PCI_QUIRK(0x1071, 0x8227, "Mitac 82801H", ALC883_MITAC), 8713 SND_PCI_QUIRK(0x1071, 0x8253, "Mitac 8252d", ALC883_MITAC), 8714 SND_PCI_QUIRK(0x1071, 0x8258, "Evesham Voyaeger", ALC883_LAPTOP_EAPD), 8715 SND_PCI_QUIRK(0x10f1, 0x2350, "TYAN-S2350", ALC888_6ST_DELL), 8716 SND_PCI_QUIRK(0x108e, 0x534d, NULL, ALC883_3ST_6ch), 8717 SND_PCI_QUIRK(0x1458, 0xa002, "MSI", ALC883_6ST_DIG), 8718 SND_PCI_QUIRK(0x1462, 0x0349, "MSI", ALC883_TARGA_2ch_DIG), 8719 SND_PCI_QUIRK(0x1462, 0x040d, "MSI", ALC883_TARGA_2ch_DIG), 8720 SND_PCI_QUIRK(0x1462, 0x0579, "MSI", ALC883_TARGA_2ch_DIG), 8721 SND_PCI_QUIRK(0x1462, 0x2fb3, "MSI", ALC883_TARGA_2ch_DIG), 8722 SND_PCI_QUIRK(0x1462, 0x3729, "MSI S420", ALC883_TARGA_DIG), 8723 SND_PCI_QUIRK(0x1462, 0x3783, "NEC S970", ALC883_TARGA_DIG), 8724 SND_PCI_QUIRK(0x1462, 0x3b7f, "MSI", ALC883_TARGA_2ch_DIG), 8725 SND_PCI_QUIRK(0x1462, 0x3ef9, "MSI", ALC883_TARGA_DIG), 8726 SND_PCI_QUIRK(0x1462, 0x3fc1, "MSI", ALC883_TARGA_DIG), 8727 SND_PCI_QUIRK(0x1462, 0x3fc3, "MSI", ALC883_TARGA_DIG), 8728 SND_PCI_QUIRK(0x1462, 0x3fcc, "MSI", ALC883_TARGA_DIG), 8729 SND_PCI_QUIRK(0x1462, 0x3fdf, "MSI", ALC883_TARGA_DIG), 8730 SND_PCI_QUIRK(0x1462, 0x4314, "MSI", ALC883_TARGA_DIG), 8731 SND_PCI_QUIRK(0x1462, 0x4319, "MSI", ALC883_TARGA_DIG), 8732 SND_PCI_QUIRK(0x1462, 0x4324, "MSI", ALC883_TARGA_DIG), 8733 SND_PCI_QUIRK(0x1462, 0x6668, "MSI", ALC883_6ST_DIG), 8734 SND_PCI_QUIRK(0x1462, 0x7187, "MSI", ALC883_6ST_DIG), 8735 SND_PCI_QUIRK(0x1462, 0x7250, "MSI", ALC883_6ST_DIG), 8736 SND_PCI_QUIRK(0x1462, 0x7260, "MSI 7260", ALC883_TARGA_DIG), 8737 SND_PCI_QUIRK(0x1462, 0x7267, "MSI", ALC883_3ST_6ch_DIG), 8738 SND_PCI_QUIRK(0x1462, 0x7280, "MSI", ALC883_6ST_DIG), 8739 SND_PCI_QUIRK(0x1462, 0x7327, "MSI", ALC883_6ST_DIG), 8740 SND_PCI_QUIRK(0x1462, 0xa422, "MSI", ALC883_TARGA_2ch_DIG), 8741 SND_PCI_QUIRK(0x147b, 0x1083, "Abit IP35-PRO", ALC883_6ST_DIG), 8742 SND_PCI_QUIRK(0x1558, 0x0721, "Clevo laptop M720R", ALC883_CLEVO_M720), 8743 SND_PCI_QUIRK(0x1558, 0x0722, "Clevo laptop M720SR", ALC883_CLEVO_M720), 8744 SND_PCI_QUIRK_VENDOR(0x1558, "Clevo laptop", ALC883_LAPTOP_EAPD), 8745 SND_PCI_QUIRK(0x15d9, 0x8780, "Supermicro PDSBA", ALC883_3ST_6ch), 8746 SND_PCI_QUIRK(0x161f, 0x2054, "Medion laptop", ALC883_MEDION), 8747 SND_PCI_QUIRK_MASK(0x1734, 0xfff0, 0x1100, "FSC AMILO Xi/Pi25xx", 8748 ALC883_FUJITSU_PI2515), 8749 SND_PCI_QUIRK_MASK(0x1734, 0xfff0, 0x1130, "Fujitsu AMILO Xa35xx", 8750 ALC888_FUJITSU_XA3530), 8751 SND_PCI_QUIRK(0x17aa, 0x101e, "Lenovo 101e", ALC883_LENOVO_101E_2ch), 8752 SND_PCI_QUIRK(0x17aa, 0x2085, "Lenovo NB0763", ALC883_LENOVO_NB0763), 8753 SND_PCI_QUIRK(0x17aa, 0x3bfc, "Lenovo NB0763", ALC883_LENOVO_NB0763), 8754 SND_PCI_QUIRK(0x17aa, 0x3bfd, "Lenovo NB0763", ALC883_LENOVO_NB0763), 8755 SND_PCI_QUIRK(0x17aa, 0x101d, "Lenovo Sky", ALC888_LENOVO_SKY), 8756 SND_PCI_QUIRK(0x17c0, 0x4071, "MEDION MD2", ALC883_MEDION_MD2), 8757 SND_PCI_QUIRK(0x17c0, 0x4085, "MEDION MD96630", ALC888_LENOVO_MS7195_DIG), 8758 SND_PCI_QUIRK(0x17f2, 0x5000, "Albatron KI690-AM2", ALC883_6ST_DIG), 8759 SND_PCI_QUIRK(0x1991, 0x5625, "Haier W66", ALC883_HAIER_W66), 8760 SND_PCI_QUIRK(0x8086, 0x0001, "DG33BUC", ALC883_3ST_6ch_INTEL), 8761 SND_PCI_QUIRK(0x8086, 0x0002, "DG33FBC", ALC883_3ST_6ch_INTEL), 8762 SND_PCI_QUIRK(0x8086, 0x2503, "82801H", ALC883_MITAC), 8763 SND_PCI_QUIRK(0x8086, 0x0022, "DX58SO", ALC883_3ST_6ch_INTEL), 8764 SND_PCI_QUIRK(0x8086, 0xd601, "D102GGC", ALC883_3ST_6ch), 8765 {} 8766 }; 8767 8768 static hda_nid_t alc883_slave_dig_outs[] = { 8769 ALC1200_DIGOUT_NID, 0, 8770 }; 8771 8772 static hda_nid_t alc1200_slave_dig_outs[] = { 8773 ALC883_DIGOUT_NID, 0, 8774 }; 8775 8776 static struct alc_config_preset alc883_presets[] = { 8777 [ALC883_3ST_2ch_DIG] = { 8778 .mixers = { alc883_3ST_2ch_mixer }, 8779 .init_verbs = { alc883_init_verbs }, 8780 .num_dacs = ARRAY_SIZE(alc883_dac_nids), 8781 .dac_nids = alc883_dac_nids, 8782 .dig_out_nid = ALC883_DIGOUT_NID, 8783 .dig_in_nid = ALC883_DIGIN_NID, 8784 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes), 8785 .channel_mode = alc883_3ST_2ch_modes, 8786 .input_mux = &alc883_capture_source, 8787 }, 8788 [ALC883_3ST_6ch_DIG] = { 8789 .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer }, 8790 .init_verbs = { alc883_init_verbs }, 8791 .num_dacs = ARRAY_SIZE(alc883_dac_nids), 8792 .dac_nids = alc883_dac_nids, 8793 .dig_out_nid = ALC883_DIGOUT_NID, 8794 .dig_in_nid = ALC883_DIGIN_NID, 8795 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes), 8796 .channel_mode = alc883_3ST_6ch_modes, 8797 .need_dac_fix = 1, 8798 .input_mux = &alc883_capture_source, 8799 }, 8800 [ALC883_3ST_6ch] = { 8801 .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer }, 8802 .init_verbs = { alc883_init_verbs }, 8803 .num_dacs = ARRAY_SIZE(alc883_dac_nids), 8804 .dac_nids = alc883_dac_nids, 8805 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes), 8806 .channel_mode = alc883_3ST_6ch_modes, 8807 .need_dac_fix = 1, 8808 .input_mux = &alc883_capture_source, 8809 }, 8810 [ALC883_3ST_6ch_INTEL] = { 8811 .mixers = { alc883_3ST_6ch_intel_mixer, alc883_chmode_mixer }, 8812 .init_verbs = { alc883_init_verbs }, 8813 .num_dacs = ARRAY_SIZE(alc883_dac_nids), 8814 .dac_nids = alc883_dac_nids, 8815 .dig_out_nid = ALC883_DIGOUT_NID, 8816 .dig_in_nid = ALC883_DIGIN_NID, 8817 .slave_dig_outs = alc883_slave_dig_outs, 8818 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_intel_modes), 8819 .channel_mode = alc883_3ST_6ch_intel_modes, 8820 .need_dac_fix = 1, 8821 .input_mux = &alc883_3stack_6ch_intel, 8822 }, 8823 [ALC883_6ST_DIG] = { 8824 .mixers = { alc883_base_mixer, alc883_chmode_mixer }, 8825 .init_verbs = { alc883_init_verbs }, 8826 .num_dacs = ARRAY_SIZE(alc883_dac_nids), 8827 .dac_nids = alc883_dac_nids, 8828 .dig_out_nid = ALC883_DIGOUT_NID, 8829 .dig_in_nid = ALC883_DIGIN_NID, 8830 .num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes), 8831 .channel_mode = alc883_sixstack_modes, 8832 .input_mux = &alc883_capture_source, 8833 }, 8834 [ALC883_TARGA_DIG] = { 8835 .mixers = { alc883_tagra_mixer, alc883_chmode_mixer }, 8836 .init_verbs = { alc883_init_verbs, alc883_tagra_verbs}, 8837 .num_dacs = ARRAY_SIZE(alc883_dac_nids), 8838 .dac_nids = alc883_dac_nids, 8839 .dig_out_nid = ALC883_DIGOUT_NID, 8840 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes), 8841 .channel_mode = alc883_3ST_6ch_modes, 8842 .need_dac_fix = 1, 8843 .input_mux = &alc883_capture_source, 8844 .unsol_event = alc883_tagra_unsol_event, 8845 .init_hook = alc883_tagra_automute, 8846 }, 8847 [ALC883_TARGA_2ch_DIG] = { 8848 .mixers = { alc883_tagra_2ch_mixer}, 8849 .init_verbs = { alc883_init_verbs, alc883_tagra_verbs}, 8850 .num_dacs = ARRAY_SIZE(alc883_dac_nids), 8851 .dac_nids = alc883_dac_nids, 8852 .adc_nids = alc883_adc_nids_alt, 8853 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_alt), 8854 .dig_out_nid = ALC883_DIGOUT_NID, 8855 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes), 8856 .channel_mode = alc883_3ST_2ch_modes, 8857 .input_mux = &alc883_capture_source, 8858 .unsol_event = alc883_tagra_unsol_event, 8859 .init_hook = alc883_tagra_automute, 8860 }, 8861 [ALC883_ACER] = { 8862 .mixers = { alc883_base_mixer }, 8863 /* On TravelMate laptops, GPIO 0 enables the internal speaker 8864 * and the headphone jack. Turn this on and rely on the 8865 * standard mute methods whenever the user wants to turn 8866 * these outputs off. 8867 */ 8868 .init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs }, 8869 .num_dacs = ARRAY_SIZE(alc883_dac_nids), 8870 .dac_nids = alc883_dac_nids, 8871 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes), 8872 .channel_mode = alc883_3ST_2ch_modes, 8873 .input_mux = &alc883_capture_source, 8874 }, 8875 [ALC883_ACER_ASPIRE] = { 8876 .mixers = { alc883_acer_aspire_mixer }, 8877 .init_verbs = { alc883_init_verbs, alc883_acer_eapd_verbs }, 8878 .num_dacs = ARRAY_SIZE(alc883_dac_nids), 8879 .dac_nids = alc883_dac_nids, 8880 .dig_out_nid = ALC883_DIGOUT_NID, 8881 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes), 8882 .channel_mode = alc883_3ST_2ch_modes, 8883 .input_mux = &alc883_capture_source, 8884 .unsol_event = alc883_acer_aspire_unsol_event, 8885 .init_hook = alc883_acer_aspire_automute, 8886 }, 8887 [ALC888_ACER_ASPIRE_4930G] = { 8888 .mixers = { alc888_base_mixer, 8889 alc883_chmode_mixer }, 8890 .init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs, 8891 alc888_acer_aspire_4930g_verbs }, 8892 .num_dacs = ARRAY_SIZE(alc883_dac_nids), 8893 .dac_nids = alc883_dac_nids, 8894 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev), 8895 .adc_nids = alc883_adc_nids_rev, 8896 .capsrc_nids = alc883_capsrc_nids_rev, 8897 .dig_out_nid = ALC883_DIGOUT_NID, 8898 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes), 8899 .channel_mode = alc883_3ST_6ch_modes, 8900 .need_dac_fix = 1, 8901 .num_mux_defs = 8902 ARRAY_SIZE(alc888_2_capture_sources), 8903 .input_mux = alc888_2_capture_sources, 8904 .unsol_event = alc888_acer_aspire_4930g_unsol_event, 8905 .init_hook = alc888_acer_aspire_4930g_automute, 8906 }, 8907 [ALC883_MEDION] = { 8908 .mixers = { alc883_fivestack_mixer, 8909 alc883_chmode_mixer }, 8910 .init_verbs = { alc883_init_verbs, 8911 alc883_medion_eapd_verbs }, 8912 .num_dacs = ARRAY_SIZE(alc883_dac_nids), 8913 .dac_nids = alc883_dac_nids, 8914 .adc_nids = alc883_adc_nids_alt, 8915 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_alt), 8916 .num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes), 8917 .channel_mode = alc883_sixstack_modes, 8918 .input_mux = &alc883_capture_source, 8919 }, 8920 [ALC883_MEDION_MD2] = { 8921 .mixers = { alc883_medion_md2_mixer}, 8922 .init_verbs = { alc883_init_verbs, alc883_medion_md2_verbs}, 8923 .num_dacs = ARRAY_SIZE(alc883_dac_nids), 8924 .dac_nids = alc883_dac_nids, 8925 .dig_out_nid = ALC883_DIGOUT_NID, 8926 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes), 8927 .channel_mode = alc883_3ST_2ch_modes, 8928 .input_mux = &alc883_capture_source, 8929 .unsol_event = alc883_medion_md2_unsol_event, 8930 .init_hook = alc883_medion_md2_automute, 8931 }, 8932 [ALC883_LAPTOP_EAPD] = { 8933 .mixers = { alc883_base_mixer }, 8934 .init_verbs = { alc883_init_verbs, alc882_eapd_verbs }, 8935 .num_dacs = ARRAY_SIZE(alc883_dac_nids), 8936 .dac_nids = alc883_dac_nids, 8937 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes), 8938 .channel_mode = alc883_3ST_2ch_modes, 8939 .input_mux = &alc883_capture_source, 8940 }, 8941 [ALC883_CLEVO_M720] = { 8942 .mixers = { alc883_clevo_m720_mixer }, 8943 .init_verbs = { alc883_init_verbs, alc883_clevo_m720_verbs }, 8944 .num_dacs = ARRAY_SIZE(alc883_dac_nids), 8945 .dac_nids = alc883_dac_nids, 8946 .dig_out_nid = ALC883_DIGOUT_NID, 8947 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes), 8948 .channel_mode = alc883_3ST_2ch_modes, 8949 .input_mux = &alc883_capture_source, 8950 .unsol_event = alc883_clevo_m720_unsol_event, 8951 .init_hook = alc883_clevo_m720_automute, 8952 }, 8953 [ALC883_LENOVO_101E_2ch] = { 8954 .mixers = { alc883_lenovo_101e_2ch_mixer}, 8955 .init_verbs = { alc883_init_verbs, alc883_lenovo_101e_verbs}, 8956 .num_dacs = ARRAY_SIZE(alc883_dac_nids), 8957 .dac_nids = alc883_dac_nids, 8958 .adc_nids = alc883_adc_nids_alt, 8959 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_alt), 8960 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes), 8961 .channel_mode = alc883_3ST_2ch_modes, 8962 .input_mux = &alc883_lenovo_101e_capture_source, 8963 .unsol_event = alc883_lenovo_101e_unsol_event, 8964 .init_hook = alc883_lenovo_101e_all_automute, 8965 }, 8966 [ALC883_LENOVO_NB0763] = { 8967 .mixers = { alc883_lenovo_nb0763_mixer }, 8968 .init_verbs = { alc883_init_verbs, alc883_lenovo_nb0763_verbs}, 8969 .num_dacs = ARRAY_SIZE(alc883_dac_nids), 8970 .dac_nids = alc883_dac_nids, 8971 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes), 8972 .channel_mode = alc883_3ST_2ch_modes, 8973 .need_dac_fix = 1, 8974 .input_mux = &alc883_lenovo_nb0763_capture_source, 8975 .unsol_event = alc883_medion_md2_unsol_event, 8976 .init_hook = alc883_medion_md2_automute, 8977 }, 8978 [ALC888_LENOVO_MS7195_DIG] = { 8979 .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer }, 8980 .init_verbs = { alc883_init_verbs, alc888_lenovo_ms7195_verbs}, 8981 .num_dacs = ARRAY_SIZE(alc883_dac_nids), 8982 .dac_nids = alc883_dac_nids, 8983 .dig_out_nid = ALC883_DIGOUT_NID, 8984 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes), 8985 .channel_mode = alc883_3ST_6ch_modes, 8986 .need_dac_fix = 1, 8987 .input_mux = &alc883_capture_source, 8988 .unsol_event = alc883_lenovo_ms7195_unsol_event, 8989 .init_hook = alc888_lenovo_ms7195_front_automute, 8990 }, 8991 [ALC883_HAIER_W66] = { 8992 .mixers = { alc883_tagra_2ch_mixer}, 8993 .init_verbs = { alc883_init_verbs, alc883_haier_w66_verbs}, 8994 .num_dacs = ARRAY_SIZE(alc883_dac_nids), 8995 .dac_nids = alc883_dac_nids, 8996 .dig_out_nid = ALC883_DIGOUT_NID, 8997 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes), 8998 .channel_mode = alc883_3ST_2ch_modes, 8999 .input_mux = &alc883_capture_source, 9000 .unsol_event = alc883_haier_w66_unsol_event, 9001 .init_hook = alc883_haier_w66_automute, 9002 }, 9003 [ALC888_3ST_HP] = { 9004 .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer }, 9005 .init_verbs = { alc883_init_verbs, alc888_3st_hp_verbs }, 9006 .num_dacs = ARRAY_SIZE(alc883_dac_nids), 9007 .dac_nids = alc883_dac_nids, 9008 .num_channel_mode = ARRAY_SIZE(alc888_3st_hp_modes), 9009 .channel_mode = alc888_3st_hp_modes, 9010 .need_dac_fix = 1, 9011 .input_mux = &alc883_capture_source, 9012 .unsol_event = alc888_3st_hp_unsol_event, 9013 .init_hook = alc888_3st_hp_front_automute, 9014 }, 9015 [ALC888_6ST_DELL] = { 9016 .mixers = { alc883_base_mixer, alc883_chmode_mixer }, 9017 .init_verbs = { alc883_init_verbs, alc888_6st_dell_verbs }, 9018 .num_dacs = ARRAY_SIZE(alc883_dac_nids), 9019 .dac_nids = alc883_dac_nids, 9020 .dig_out_nid = ALC883_DIGOUT_NID, 9021 .dig_in_nid = ALC883_DIGIN_NID, 9022 .num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes), 9023 .channel_mode = alc883_sixstack_modes, 9024 .input_mux = &alc883_capture_source, 9025 .unsol_event = alc888_6st_dell_unsol_event, 9026 .init_hook = alc888_6st_dell_front_automute, 9027 }, 9028 [ALC883_MITAC] = { 9029 .mixers = { alc883_mitac_mixer }, 9030 .init_verbs = { alc883_init_verbs, alc883_mitac_verbs }, 9031 .num_dacs = ARRAY_SIZE(alc883_dac_nids), 9032 .dac_nids = alc883_dac_nids, 9033 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes), 9034 .channel_mode = alc883_3ST_2ch_modes, 9035 .input_mux = &alc883_capture_source, 9036 .unsol_event = alc883_mitac_unsol_event, 9037 .init_hook = alc883_mitac_automute, 9038 }, 9039 [ALC883_FUJITSU_PI2515] = { 9040 .mixers = { alc883_2ch_fujitsu_pi2515_mixer }, 9041 .init_verbs = { alc883_init_verbs, 9042 alc883_2ch_fujitsu_pi2515_verbs}, 9043 .num_dacs = ARRAY_SIZE(alc883_dac_nids), 9044 .dac_nids = alc883_dac_nids, 9045 .dig_out_nid = ALC883_DIGOUT_NID, 9046 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes), 9047 .channel_mode = alc883_3ST_2ch_modes, 9048 .input_mux = &alc883_fujitsu_pi2515_capture_source, 9049 .unsol_event = alc883_2ch_fujitsu_pi2515_unsol_event, 9050 .init_hook = alc883_2ch_fujitsu_pi2515_automute, 9051 }, 9052 [ALC888_FUJITSU_XA3530] = { 9053 .mixers = { alc888_base_mixer, alc883_chmode_mixer }, 9054 .init_verbs = { alc883_init_verbs, 9055 alc888_fujitsu_xa3530_verbs }, 9056 .num_dacs = ARRAY_SIZE(alc883_dac_nids), 9057 .dac_nids = alc883_dac_nids, 9058 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev), 9059 .adc_nids = alc883_adc_nids_rev, 9060 .capsrc_nids = alc883_capsrc_nids_rev, 9061 .dig_out_nid = ALC883_DIGOUT_NID, 9062 .num_channel_mode = ARRAY_SIZE(alc888_4ST_8ch_intel_modes), 9063 .channel_mode = alc888_4ST_8ch_intel_modes, 9064 .num_mux_defs = 9065 ARRAY_SIZE(alc888_2_capture_sources), 9066 .input_mux = alc888_2_capture_sources, 9067 .unsol_event = alc888_fujitsu_xa3530_unsol_event, 9068 .init_hook = alc888_fujitsu_xa3530_automute, 9069 }, 9070 [ALC888_LENOVO_SKY] = { 9071 .mixers = { alc888_lenovo_sky_mixer, alc883_chmode_mixer }, 9072 .init_verbs = { alc883_init_verbs, alc888_lenovo_sky_verbs}, 9073 .num_dacs = ARRAY_SIZE(alc883_dac_nids), 9074 .dac_nids = alc883_dac_nids, 9075 .dig_out_nid = ALC883_DIGOUT_NID, 9076 .num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes), 9077 .channel_mode = alc883_sixstack_modes, 9078 .need_dac_fix = 1, 9079 .input_mux = &alc883_lenovo_sky_capture_source, 9080 .unsol_event = alc883_lenovo_sky_unsol_event, 9081 .init_hook = alc888_lenovo_sky_front_automute, 9082 }, 9083 [ALC888_ASUS_M90V] = { 9084 .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer }, 9085 .init_verbs = { alc883_init_verbs, alc888_asus_m90v_verbs }, 9086 .num_dacs = ARRAY_SIZE(alc883_dac_nids), 9087 .dac_nids = alc883_dac_nids, 9088 .dig_out_nid = ALC883_DIGOUT_NID, 9089 .dig_in_nid = ALC883_DIGIN_NID, 9090 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes), 9091 .channel_mode = alc883_3ST_6ch_modes, 9092 .need_dac_fix = 1, 9093 .input_mux = &alc883_fujitsu_pi2515_capture_source, 9094 .unsol_event = alc883_mode2_unsol_event, 9095 .init_hook = alc883_mode2_inithook, 9096 }, 9097 [ALC888_ASUS_EEE1601] = { 9098 .mixers = { alc883_asus_eee1601_mixer }, 9099 .cap_mixer = alc883_asus_eee1601_cap_mixer, 9100 .init_verbs = { alc883_init_verbs, alc888_asus_eee1601_verbs }, 9101 .num_dacs = ARRAY_SIZE(alc883_dac_nids), 9102 .dac_nids = alc883_dac_nids, 9103 .dig_out_nid = ALC883_DIGOUT_NID, 9104 .dig_in_nid = ALC883_DIGIN_NID, 9105 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes), 9106 .channel_mode = alc883_3ST_2ch_modes, 9107 .need_dac_fix = 1, 9108 .input_mux = &alc883_asus_eee1601_capture_source, 9109 .unsol_event = alc883_eee1601_unsol_event, 9110 .init_hook = alc883_eee1601_inithook, 9111 }, 9112 [ALC1200_ASUS_P5Q] = { 9113 .mixers = { alc883_base_mixer, alc883_chmode_mixer }, 9114 .init_verbs = { alc883_init_verbs }, 9115 .num_dacs = ARRAY_SIZE(alc883_dac_nids), 9116 .dac_nids = alc883_dac_nids, 9117 .dig_out_nid = ALC1200_DIGOUT_NID, 9118 .dig_in_nid = ALC883_DIGIN_NID, 9119 .slave_dig_outs = alc1200_slave_dig_outs, 9120 .num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes), 9121 .channel_mode = alc883_sixstack_modes, 9122 .input_mux = &alc883_capture_source, 9123 }, 9124 }; 9125 9126 9127 /* 9128 * BIOS auto configuration 9129 */ 9130 static void alc883_auto_set_output_and_unmute(struct hda_codec *codec, 9131 hda_nid_t nid, int pin_type, 9132 int dac_idx) 9133 { 9134 /* set as output */ 9135 struct alc_spec *spec = codec->spec; 9136 int idx; 9137 9138 alc_set_pin_output(codec, nid, pin_type); 9139 if (spec->multiout.dac_nids[dac_idx] == 0x25) 9140 idx = 4; 9141 else 9142 idx = spec->multiout.dac_nids[dac_idx] - 2; 9143 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_CONNECT_SEL, idx); 9144 9145 } 9146 9147 static void alc883_auto_init_multi_out(struct hda_codec *codec) 9148 { 9149 struct alc_spec *spec = codec->spec; 9150 int i; 9151 9152 alc_subsystem_id(codec, 0x15, 0x1b, 0x14); 9153 for (i = 0; i <= HDA_SIDE; i++) { 9154 hda_nid_t nid = spec->autocfg.line_out_pins[i]; 9155 int pin_type = get_pin_type(spec->autocfg.line_out_type); 9156 if (nid) 9157 alc883_auto_set_output_and_unmute(codec, nid, pin_type, 9158 i); 9159 } 9160 } 9161 9162 static void alc883_auto_init_hp_out(struct hda_codec *codec) 9163 { 9164 struct alc_spec *spec = codec->spec; 9165 hda_nid_t pin; 9166 9167 pin = spec->autocfg.hp_pins[0]; 9168 if (pin) /* connect to front */ 9169 /* use dac 0 */ 9170 alc883_auto_set_output_and_unmute(codec, pin, PIN_HP, 0); 9171 pin = spec->autocfg.speaker_pins[0]; 9172 if (pin) 9173 alc883_auto_set_output_and_unmute(codec, pin, PIN_OUT, 0); 9174 } 9175 9176 #define alc883_is_input_pin(nid) alc880_is_input_pin(nid) 9177 #define ALC883_PIN_CD_NID ALC880_PIN_CD_NID 9178 9179 static void alc883_auto_init_analog_input(struct hda_codec *codec) 9180 { 9181 struct alc_spec *spec = codec->spec; 9182 int i; 9183 9184 for (i = 0; i < AUTO_PIN_LAST; i++) { 9185 hda_nid_t nid = spec->autocfg.input_pins[i]; 9186 if (alc883_is_input_pin(nid)) { 9187 alc_set_input_pin(codec, nid, i); 9188 if (nid != ALC883_PIN_CD_NID && 9189 (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP)) 9190 snd_hda_codec_write(codec, nid, 0, 9191 AC_VERB_SET_AMP_GAIN_MUTE, 9192 AMP_OUT_MUTE); 9193 } 9194 } 9195 } 9196 9197 #define alc883_auto_init_input_src alc882_auto_init_input_src 9198 9199 /* almost identical with ALC880 parser... */ 9200 static int alc883_parse_auto_config(struct hda_codec *codec) 9201 { 9202 struct alc_spec *spec = codec->spec; 9203 int err = alc880_parse_auto_config(codec); 9204 struct auto_pin_cfg *cfg = &spec->autocfg; 9205 int i; 9206 9207 if (err < 0) 9208 return err; 9209 else if (!err) 9210 return 0; /* no config found */ 9211 9212 err = alc_auto_add_mic_boost(codec); 9213 if (err < 0) 9214 return err; 9215 9216 /* hack - override the init verbs */ 9217 spec->init_verbs[0] = alc883_auto_init_verbs; 9218 9219 /* setup input_mux for ALC889 */ 9220 if (codec->vendor_id == 0x10ec0889) { 9221 /* digital-mic input pin is excluded in alc880_auto_create..() 9222 * because it's under 0x18 9223 */ 9224 if (cfg->input_pins[AUTO_PIN_MIC] == 0x12 || 9225 cfg->input_pins[AUTO_PIN_FRONT_MIC] == 0x12) { 9226 struct hda_input_mux *imux = &spec->private_imux[0]; 9227 for (i = 1; i < 3; i++) 9228 memcpy(&spec->private_imux[i], 9229 &spec->private_imux[0], 9230 sizeof(spec->private_imux[0])); 9231 imux->items[imux->num_items].label = "Int DMic"; 9232 imux->items[imux->num_items].index = 0x0b; 9233 imux->num_items++; 9234 spec->num_mux_defs = 3; 9235 spec->input_mux = spec->private_imux; 9236 } 9237 } 9238 9239 return 1; /* config found */ 9240 } 9241 9242 /* additional initialization for auto-configuration model */ 9243 static void alc883_auto_init(struct hda_codec *codec) 9244 { 9245 struct alc_spec *spec = codec->spec; 9246 alc883_auto_init_multi_out(codec); 9247 alc883_auto_init_hp_out(codec); 9248 alc883_auto_init_analog_input(codec); 9249 alc883_auto_init_input_src(codec); 9250 if (spec->unsol_event) 9251 alc_inithook(codec); 9252 } 9253 9254 static int patch_alc883(struct hda_codec *codec) 9255 { 9256 struct alc_spec *spec; 9257 int err, board_config; 9258 9259 spec = kzalloc(sizeof(*spec), GFP_KERNEL); 9260 if (spec == NULL) 9261 return -ENOMEM; 9262 9263 codec->spec = spec; 9264 9265 alc_fix_pll_init(codec, 0x20, 0x0a, 10); 9266 9267 board_config = snd_hda_check_board_config(codec, ALC883_MODEL_LAST, 9268 alc883_models, 9269 alc883_cfg_tbl); 9270 if (board_config < 0) { 9271 printk(KERN_INFO "hda_codec: Unknown model for ALC883, " 9272 "trying auto-probe from BIOS...\n"); 9273 board_config = ALC883_AUTO; 9274 } 9275 9276 if (board_config == ALC883_AUTO) { 9277 /* automatic parse from the BIOS config */ 9278 err = alc883_parse_auto_config(codec); 9279 if (err < 0) { 9280 alc_free(codec); 9281 return err; 9282 } else if (!err) { 9283 printk(KERN_INFO 9284 "hda_codec: Cannot set up configuration " 9285 "from BIOS. Using base mode...\n"); 9286 board_config = ALC883_3ST_2ch_DIG; 9287 } 9288 } 9289 9290 err = snd_hda_attach_beep_device(codec, 0x1); 9291 if (err < 0) { 9292 alc_free(codec); 9293 return err; 9294 } 9295 9296 if (board_config != ALC883_AUTO) 9297 setup_preset(spec, &alc883_presets[board_config]); 9298 9299 switch (codec->vendor_id) { 9300 case 0x10ec0888: 9301 if (codec->revision_id == 0x100101) { 9302 spec->stream_name_analog = "ALC1200 Analog"; 9303 spec->stream_name_digital = "ALC1200 Digital"; 9304 } else { 9305 spec->stream_name_analog = "ALC888 Analog"; 9306 spec->stream_name_digital = "ALC888 Digital"; 9307 } 9308 if (!spec->num_adc_nids) { 9309 spec->num_adc_nids = ARRAY_SIZE(alc883_adc_nids); 9310 spec->adc_nids = alc883_adc_nids; 9311 } 9312 if (!spec->capsrc_nids) 9313 spec->capsrc_nids = alc883_capsrc_nids; 9314 spec->capture_style = CAPT_MIX; /* matrix-style capture */ 9315 break; 9316 case 0x10ec0889: 9317 spec->stream_name_analog = "ALC889 Analog"; 9318 spec->stream_name_digital = "ALC889 Digital"; 9319 if (!spec->num_adc_nids) { 9320 spec->num_adc_nids = ARRAY_SIZE(alc889_adc_nids); 9321 spec->adc_nids = alc889_adc_nids; 9322 } 9323 if (!spec->capsrc_nids) 9324 spec->capsrc_nids = alc889_capsrc_nids; 9325 spec->capture_style = CAPT_1MUX_MIX; /* 1mux/Nmix-style 9326 capture */ 9327 break; 9328 default: 9329 spec->stream_name_analog = "ALC883 Analog"; 9330 spec->stream_name_digital = "ALC883 Digital"; 9331 if (!spec->num_adc_nids) { 9332 spec->num_adc_nids = ARRAY_SIZE(alc883_adc_nids); 9333 spec->adc_nids = alc883_adc_nids; 9334 } 9335 if (!spec->capsrc_nids) 9336 spec->capsrc_nids = alc883_capsrc_nids; 9337 spec->capture_style = CAPT_MIX; /* matrix-style capture */ 9338 break; 9339 } 9340 9341 spec->stream_analog_playback = &alc883_pcm_analog_playback; 9342 spec->stream_analog_capture = &alc883_pcm_analog_capture; 9343 spec->stream_analog_alt_capture = &alc883_pcm_analog_alt_capture; 9344 9345 spec->stream_digital_playback = &alc883_pcm_digital_playback; 9346 spec->stream_digital_capture = &alc883_pcm_digital_capture; 9347 9348 if (!spec->cap_mixer) 9349 set_capture_mixer(spec); 9350 set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT); 9351 9352 spec->vmaster_nid = 0x0c; 9353 9354 codec->patch_ops = alc_patch_ops; 9355 if (board_config == ALC883_AUTO) 9356 spec->init_hook = alc883_auto_init; 9357 9358 #ifdef CONFIG_SND_HDA_POWER_SAVE 9359 if (!spec->loopback.amplist) 9360 spec->loopback.amplist = alc883_loopbacks; 9361 #endif 9362 codec->proc_widget_hook = print_realtek_coef; 9363 9364 return 0; 9365 } 9366 9367 /* 9368 * ALC262 support 9369 */ 9370 9371 #define ALC262_DIGOUT_NID ALC880_DIGOUT_NID 9372 #define ALC262_DIGIN_NID ALC880_DIGIN_NID 9373 9374 #define alc262_dac_nids alc260_dac_nids 9375 #define alc262_adc_nids alc882_adc_nids 9376 #define alc262_adc_nids_alt alc882_adc_nids_alt 9377 #define alc262_capsrc_nids alc882_capsrc_nids 9378 #define alc262_capsrc_nids_alt alc882_capsrc_nids_alt 9379 9380 #define alc262_modes alc260_modes 9381 #define alc262_capture_source alc882_capture_source 9382 9383 static hda_nid_t alc262_dmic_adc_nids[1] = { 9384 /* ADC0 */ 9385 0x09 9386 }; 9387 9388 static hda_nid_t alc262_dmic_capsrc_nids[1] = { 0x22 }; 9389 9390 static struct snd_kcontrol_new alc262_base_mixer[] = { 9391 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 9392 HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT), 9393 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), 9394 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), 9395 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), 9396 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), 9397 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 9398 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 9399 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), 9400 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT), 9401 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT), 9402 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT), 9403 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0D, 0x0, HDA_OUTPUT), 9404 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT), 9405 HDA_CODEC_VOLUME_MONO("Mono Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT), 9406 HDA_CODEC_MUTE_MONO("Mono Playback Switch", 0x16, 2, 0x0, HDA_OUTPUT), 9407 { } /* end */ 9408 }; 9409 9410 static struct snd_kcontrol_new alc262_hippo1_mixer[] = { 9411 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 9412 HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT), 9413 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), 9414 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), 9415 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), 9416 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), 9417 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 9418 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 9419 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), 9420 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT), 9421 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT), 9422 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT), 9423 /*HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0D, 0x0, HDA_OUTPUT),*/ 9424 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT), 9425 { } /* end */ 9426 }; 9427 9428 /* update HP, line and mono-out pins according to the master switch */ 9429 static void alc262_hp_master_update(struct hda_codec *codec) 9430 { 9431 struct alc_spec *spec = codec->spec; 9432 int val = spec->master_sw; 9433 9434 /* HP & line-out */ 9435 snd_hda_codec_write_cache(codec, 0x1b, 0, 9436 AC_VERB_SET_PIN_WIDGET_CONTROL, 9437 val ? PIN_HP : 0); 9438 snd_hda_codec_write_cache(codec, 0x15, 0, 9439 AC_VERB_SET_PIN_WIDGET_CONTROL, 9440 val ? PIN_HP : 0); 9441 /* mono (speaker) depending on the HP jack sense */ 9442 val = val && !spec->jack_present; 9443 snd_hda_codec_write_cache(codec, 0x16, 0, 9444 AC_VERB_SET_PIN_WIDGET_CONTROL, 9445 val ? PIN_OUT : 0); 9446 } 9447 9448 static void alc262_hp_bpc_automute(struct hda_codec *codec) 9449 { 9450 struct alc_spec *spec = codec->spec; 9451 unsigned int presence; 9452 presence = snd_hda_codec_read(codec, 0x1b, 0, 9453 AC_VERB_GET_PIN_SENSE, 0); 9454 spec->jack_present = !!(presence & AC_PINSENSE_PRESENCE); 9455 alc262_hp_master_update(codec); 9456 } 9457 9458 static void alc262_hp_bpc_unsol_event(struct hda_codec *codec, unsigned int res) 9459 { 9460 if ((res >> 26) != ALC880_HP_EVENT) 9461 return; 9462 alc262_hp_bpc_automute(codec); 9463 } 9464 9465 static void alc262_hp_wildwest_automute(struct hda_codec *codec) 9466 { 9467 struct alc_spec *spec = codec->spec; 9468 unsigned int presence; 9469 presence = snd_hda_codec_read(codec, 0x15, 0, 9470 AC_VERB_GET_PIN_SENSE, 0); 9471 spec->jack_present = !!(presence & AC_PINSENSE_PRESENCE); 9472 alc262_hp_master_update(codec); 9473 } 9474 9475 static void alc262_hp_wildwest_unsol_event(struct hda_codec *codec, 9476 unsigned int res) 9477 { 9478 if ((res >> 26) != ALC880_HP_EVENT) 9479 return; 9480 alc262_hp_wildwest_automute(codec); 9481 } 9482 9483 static int alc262_hp_master_sw_get(struct snd_kcontrol *kcontrol, 9484 struct snd_ctl_elem_value *ucontrol) 9485 { 9486 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 9487 struct alc_spec *spec = codec->spec; 9488 *ucontrol->value.integer.value = spec->master_sw; 9489 return 0; 9490 } 9491 9492 static int alc262_hp_master_sw_put(struct snd_kcontrol *kcontrol, 9493 struct snd_ctl_elem_value *ucontrol) 9494 { 9495 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 9496 struct alc_spec *spec = codec->spec; 9497 int val = !!*ucontrol->value.integer.value; 9498 9499 if (val == spec->master_sw) 9500 return 0; 9501 spec->master_sw = val; 9502 alc262_hp_master_update(codec); 9503 return 1; 9504 } 9505 9506 static struct snd_kcontrol_new alc262_HP_BPC_mixer[] = { 9507 { 9508 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 9509 .name = "Master Playback Switch", 9510 .info = snd_ctl_boolean_mono_info, 9511 .get = alc262_hp_master_sw_get, 9512 .put = alc262_hp_master_sw_put, 9513 }, 9514 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 9515 HDA_CODEC_MUTE("Front Playback Switch", 0x15, 0x0, HDA_OUTPUT), 9516 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT), 9517 HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0e, 2, 0x0, 9518 HDA_OUTPUT), 9519 HDA_CODEC_MUTE_MONO("Speaker Playback Switch", 0x16, 2, 0x0, 9520 HDA_OUTPUT), 9521 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 9522 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 9523 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), 9524 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT), 9525 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT), 9526 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT), 9527 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), 9528 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), 9529 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), 9530 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), 9531 HDA_CODEC_VOLUME("AUX IN Playback Volume", 0x0b, 0x06, HDA_INPUT), 9532 HDA_CODEC_MUTE("AUX IN Playback Switch", 0x0b, 0x06, HDA_INPUT), 9533 { } /* end */ 9534 }; 9535 9536 static struct snd_kcontrol_new alc262_HP_BPC_WildWest_mixer[] = { 9537 { 9538 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 9539 .name = "Master Playback Switch", 9540 .info = snd_ctl_boolean_mono_info, 9541 .get = alc262_hp_master_sw_get, 9542 .put = alc262_hp_master_sw_put, 9543 }, 9544 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 9545 HDA_CODEC_MUTE("Front Playback Switch", 0x1b, 0x0, HDA_OUTPUT), 9546 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT), 9547 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT), 9548 HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0e, 2, 0x0, 9549 HDA_OUTPUT), 9550 HDA_CODEC_MUTE_MONO("Speaker Playback Switch", 0x16, 2, 0x0, 9551 HDA_OUTPUT), 9552 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x02, HDA_INPUT), 9553 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x02, HDA_INPUT), 9554 HDA_CODEC_VOLUME("Front Mic Boost", 0x1a, 0, HDA_INPUT), 9555 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x01, HDA_INPUT), 9556 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x01, HDA_INPUT), 9557 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), 9558 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), 9559 { } /* end */ 9560 }; 9561 9562 static struct snd_kcontrol_new alc262_HP_BPC_WildWest_option_mixer[] = { 9563 HDA_CODEC_VOLUME("Rear Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 9564 HDA_CODEC_MUTE("Rear Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 9565 HDA_CODEC_VOLUME("Rear Mic Boost", 0x18, 0, HDA_INPUT), 9566 { } /* end */ 9567 }; 9568 9569 /* mute/unmute internal speaker according to the hp jack and mute state */ 9570 static void alc262_hp_t5735_automute(struct hda_codec *codec, int force) 9571 { 9572 struct alc_spec *spec = codec->spec; 9573 9574 if (force || !spec->sense_updated) { 9575 unsigned int present; 9576 present = snd_hda_codec_read(codec, 0x15, 0, 9577 AC_VERB_GET_PIN_SENSE, 0); 9578 spec->jack_present = (present & AC_PINSENSE_PRESENCE) != 0; 9579 spec->sense_updated = 1; 9580 } 9581 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_OUTPUT, 0, HDA_AMP_MUTE, 9582 spec->jack_present ? HDA_AMP_MUTE : 0); 9583 } 9584 9585 static void alc262_hp_t5735_unsol_event(struct hda_codec *codec, 9586 unsigned int res) 9587 { 9588 if ((res >> 26) != ALC880_HP_EVENT) 9589 return; 9590 alc262_hp_t5735_automute(codec, 1); 9591 } 9592 9593 static void alc262_hp_t5735_init_hook(struct hda_codec *codec) 9594 { 9595 alc262_hp_t5735_automute(codec, 1); 9596 } 9597 9598 static struct snd_kcontrol_new alc262_hp_t5735_mixer[] = { 9599 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 9600 HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT), 9601 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT), 9602 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT), 9603 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 9604 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 9605 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), 9606 { } /* end */ 9607 }; 9608 9609 static struct hda_verb alc262_hp_t5735_verbs[] = { 9610 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 9611 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 9612 9613 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, 9614 { } 9615 }; 9616 9617 static struct snd_kcontrol_new alc262_hp_rp5700_mixer[] = { 9618 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 9619 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT), 9620 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0e, 0x0, HDA_OUTPUT), 9621 HDA_CODEC_MUTE("Speaker Playback Switch", 0x16, 0x0, HDA_OUTPUT), 9622 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x01, HDA_INPUT), 9623 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x01, HDA_INPUT), 9624 { } /* end */ 9625 }; 9626 9627 static struct hda_verb alc262_hp_rp5700_verbs[] = { 9628 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 9629 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 9630 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 9631 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 9632 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 9633 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, 9634 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))}, 9635 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))}, 9636 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x00 << 8))}, 9637 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x00 << 8))}, 9638 {} 9639 }; 9640 9641 static struct hda_input_mux alc262_hp_rp5700_capture_source = { 9642 .num_items = 1, 9643 .items = { 9644 { "Line", 0x1 }, 9645 }, 9646 }; 9647 9648 /* bind hp and internal speaker mute (with plug check) */ 9649 static int alc262_sony_master_sw_put(struct snd_kcontrol *kcontrol, 9650 struct snd_ctl_elem_value *ucontrol) 9651 { 9652 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 9653 long *valp = ucontrol->value.integer.value; 9654 int change; 9655 9656 /* change hp mute */ 9657 change = snd_hda_codec_amp_update(codec, 0x15, 0, HDA_OUTPUT, 0, 9658 HDA_AMP_MUTE, 9659 valp[0] ? 0 : HDA_AMP_MUTE); 9660 change |= snd_hda_codec_amp_update(codec, 0x15, 1, HDA_OUTPUT, 0, 9661 HDA_AMP_MUTE, 9662 valp[1] ? 0 : HDA_AMP_MUTE); 9663 if (change) { 9664 /* change speaker according to HP jack state */ 9665 struct alc_spec *spec = codec->spec; 9666 unsigned int mute; 9667 if (spec->jack_present) 9668 mute = HDA_AMP_MUTE; 9669 else 9670 mute = snd_hda_codec_amp_read(codec, 0x15, 0, 9671 HDA_OUTPUT, 0); 9672 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0, 9673 HDA_AMP_MUTE, mute); 9674 } 9675 return change; 9676 } 9677 9678 static struct snd_kcontrol_new alc262_sony_mixer[] = { 9679 HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 9680 { 9681 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 9682 .name = "Master Playback Switch", 9683 .info = snd_hda_mixer_amp_switch_info, 9684 .get = snd_hda_mixer_amp_switch_get, 9685 .put = alc262_sony_master_sw_put, 9686 .private_value = HDA_COMPOSE_AMP_VAL(0x15, 3, 0, HDA_OUTPUT), 9687 }, 9688 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 9689 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 9690 HDA_CODEC_VOLUME("ATAPI Mic Playback Volume", 0x0b, 0x01, HDA_INPUT), 9691 HDA_CODEC_MUTE("ATAPI Mic Playback Switch", 0x0b, 0x01, HDA_INPUT), 9692 { } /* end */ 9693 }; 9694 9695 static struct snd_kcontrol_new alc262_benq_t31_mixer[] = { 9696 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 9697 HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT), 9698 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT), 9699 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 9700 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 9701 HDA_CODEC_VOLUME("ATAPI Mic Playback Volume", 0x0b, 0x01, HDA_INPUT), 9702 HDA_CODEC_MUTE("ATAPI Mic Playback Switch", 0x0b, 0x01, HDA_INPUT), 9703 { } /* end */ 9704 }; 9705 9706 static struct snd_kcontrol_new alc262_tyan_mixer[] = { 9707 HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 9708 HDA_BIND_MUTE("Master Playback Switch", 0x0c, 2, HDA_INPUT), 9709 HDA_CODEC_VOLUME("Aux Playback Volume", 0x0b, 0x06, HDA_INPUT), 9710 HDA_CODEC_MUTE("Aux Playback Switch", 0x0b, 0x06, HDA_INPUT), 9711 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), 9712 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), 9713 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 9714 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 9715 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), 9716 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT), 9717 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT), 9718 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT), 9719 { } /* end */ 9720 }; 9721 9722 static struct hda_verb alc262_tyan_verbs[] = { 9723 /* Headphone automute */ 9724 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT}, 9725 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 9726 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, 9727 9728 /* P11 AUX_IN, white 4-pin connector */ 9729 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 9730 {0x14, AC_VERB_SET_CONFIG_DEFAULT_BYTES_1, 0xe1}, 9731 {0x14, AC_VERB_SET_CONFIG_DEFAULT_BYTES_2, 0x93}, 9732 {0x14, AC_VERB_SET_CONFIG_DEFAULT_BYTES_3, 0x19}, 9733 9734 {} 9735 }; 9736 9737 /* unsolicited event for HP jack sensing */ 9738 static void alc262_tyan_automute(struct hda_codec *codec) 9739 { 9740 unsigned int mute; 9741 unsigned int present; 9742 9743 snd_hda_codec_read(codec, 0x1b, 0, AC_VERB_SET_PIN_SENSE, 0); 9744 present = snd_hda_codec_read(codec, 0x1b, 0, 9745 AC_VERB_GET_PIN_SENSE, 0); 9746 present = (present & 0x80000000) != 0; 9747 if (present) { 9748 /* mute line output on ATX panel */ 9749 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0, 9750 HDA_AMP_MUTE, HDA_AMP_MUTE); 9751 } else { 9752 /* unmute line output if necessary */ 9753 mute = snd_hda_codec_amp_read(codec, 0x1b, 0, HDA_OUTPUT, 0); 9754 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0, 9755 HDA_AMP_MUTE, mute); 9756 } 9757 } 9758 9759 static void alc262_tyan_unsol_event(struct hda_codec *codec, 9760 unsigned int res) 9761 { 9762 if ((res >> 26) != ALC880_HP_EVENT) 9763 return; 9764 alc262_tyan_automute(codec); 9765 } 9766 9767 #define alc262_capture_mixer alc882_capture_mixer 9768 #define alc262_capture_alt_mixer alc882_capture_alt_mixer 9769 9770 /* 9771 * generic initialization of ADC, input mixers and output mixers 9772 */ 9773 static struct hda_verb alc262_init_verbs[] = { 9774 /* 9775 * Unmute ADC0-2 and set the default input to mic-in 9776 */ 9777 {0x07, AC_VERB_SET_CONNECT_SEL, 0x00}, 9778 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 9779 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00}, 9780 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 9781 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00}, 9782 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 9783 9784 /* Mute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback 9785 * mixer widget 9786 * Note: PASD motherboards uses the Line In 2 as the input for 9787 * front panel mic (mic 2) 9788 */ 9789 /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */ 9790 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 9791 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 9792 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, 9793 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, 9794 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, 9795 9796 /* 9797 * Set up output mixers (0x0c - 0x0e) 9798 */ 9799 /* set vol=0 to output mixers */ 9800 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 9801 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 9802 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 9803 /* set up input amps for analog loopback */ 9804 /* Amp Indices: DAC = 0, mixer = 1 */ 9805 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 9806 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 9807 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 9808 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 9809 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 9810 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 9811 9812 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40}, 9813 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0}, 9814 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40}, 9815 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24}, 9816 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20}, 9817 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20}, 9818 9819 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000}, 9820 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000}, 9821 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000}, 9822 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000}, 9823 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000}, 9824 9825 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, 9826 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, 9827 9828 /* FIXME: use matrix-type input source selection */ 9829 /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */ 9830 /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */ 9831 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))}, 9832 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))}, 9833 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))}, 9834 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))}, 9835 /* Input mixer2 */ 9836 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))}, 9837 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))}, 9838 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))}, 9839 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))}, 9840 /* Input mixer3 */ 9841 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))}, 9842 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))}, 9843 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))}, 9844 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))}, 9845 9846 { } 9847 }; 9848 9849 static struct hda_verb alc262_eapd_verbs[] = { 9850 {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2}, 9851 {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2}, 9852 { } 9853 }; 9854 9855 static struct hda_verb alc262_hippo_unsol_verbs[] = { 9856 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT}, 9857 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 9858 {} 9859 }; 9860 9861 static struct hda_verb alc262_hippo1_unsol_verbs[] = { 9862 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0}, 9863 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, 9864 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000}, 9865 9866 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT}, 9867 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 9868 {} 9869 }; 9870 9871 static struct hda_verb alc262_sony_unsol_verbs[] = { 9872 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0}, 9873 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, 9874 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24}, // Front Mic 9875 9876 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT}, 9877 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 9878 {} 9879 }; 9880 9881 static struct hda_input_mux alc262_dmic_capture_source = { 9882 .num_items = 2, 9883 .items = { 9884 { "Int DMic", 0x9 }, 9885 { "Mic", 0x0 }, 9886 }, 9887 }; 9888 9889 static struct snd_kcontrol_new alc262_toshiba_s06_mixer[] = { 9890 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 9891 HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT), 9892 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT), 9893 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 9894 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 9895 { } /* end */ 9896 }; 9897 9898 static struct hda_verb alc262_toshiba_s06_verbs[] = { 9899 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 9900 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 9901 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 9902 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, 9903 {0x22, AC_VERB_SET_CONNECT_SEL, 0x09}, 9904 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24}, 9905 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT}, 9906 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT}, 9907 {} 9908 }; 9909 9910 static void alc262_dmic_automute(struct hda_codec *codec) 9911 { 9912 unsigned int present; 9913 9914 present = snd_hda_codec_read(codec, 0x18, 0, 9915 AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; 9916 snd_hda_codec_write(codec, 0x22, 0, 9917 AC_VERB_SET_CONNECT_SEL, present ? 0x0 : 0x09); 9918 } 9919 9920 /* toggle speaker-output according to the hp-jack state */ 9921 static void alc262_toshiba_s06_speaker_automute(struct hda_codec *codec) 9922 { 9923 unsigned int present; 9924 unsigned char bits; 9925 9926 present = snd_hda_codec_read(codec, 0x15, 0, 9927 AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; 9928 bits = present ? 0 : PIN_OUT; 9929 snd_hda_codec_write(codec, 0x14, 0, 9930 AC_VERB_SET_PIN_WIDGET_CONTROL, bits); 9931 } 9932 9933 9934 9935 /* unsolicited event for HP jack sensing */ 9936 static void alc262_toshiba_s06_unsol_event(struct hda_codec *codec, 9937 unsigned int res) 9938 { 9939 if ((res >> 26) == ALC880_HP_EVENT) 9940 alc262_toshiba_s06_speaker_automute(codec); 9941 if ((res >> 26) == ALC880_MIC_EVENT) 9942 alc262_dmic_automute(codec); 9943 9944 } 9945 9946 static void alc262_toshiba_s06_init_hook(struct hda_codec *codec) 9947 { 9948 alc262_toshiba_s06_speaker_automute(codec); 9949 alc262_dmic_automute(codec); 9950 } 9951 9952 /* mute/unmute internal speaker according to the hp jack and mute state */ 9953 static void alc262_hippo_automute(struct hda_codec *codec) 9954 { 9955 struct alc_spec *spec = codec->spec; 9956 unsigned int mute; 9957 unsigned int present; 9958 9959 /* need to execute and sync at first */ 9960 snd_hda_codec_read(codec, 0x15, 0, AC_VERB_SET_PIN_SENSE, 0); 9961 present = snd_hda_codec_read(codec, 0x15, 0, 9962 AC_VERB_GET_PIN_SENSE, 0); 9963 spec->jack_present = (present & 0x80000000) != 0; 9964 if (spec->jack_present) { 9965 /* mute internal speaker */ 9966 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0, 9967 HDA_AMP_MUTE, HDA_AMP_MUTE); 9968 } else { 9969 /* unmute internal speaker if necessary */ 9970 mute = snd_hda_codec_amp_read(codec, 0x15, 0, HDA_OUTPUT, 0); 9971 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0, 9972 HDA_AMP_MUTE, mute); 9973 } 9974 } 9975 9976 /* unsolicited event for HP jack sensing */ 9977 static void alc262_hippo_unsol_event(struct hda_codec *codec, 9978 unsigned int res) 9979 { 9980 if ((res >> 26) != ALC880_HP_EVENT) 9981 return; 9982 alc262_hippo_automute(codec); 9983 } 9984 9985 static void alc262_hippo1_automute(struct hda_codec *codec) 9986 { 9987 unsigned int mute; 9988 unsigned int present; 9989 9990 snd_hda_codec_read(codec, 0x1b, 0, AC_VERB_SET_PIN_SENSE, 0); 9991 present = snd_hda_codec_read(codec, 0x1b, 0, 9992 AC_VERB_GET_PIN_SENSE, 0); 9993 present = (present & 0x80000000) != 0; 9994 if (present) { 9995 /* mute internal speaker */ 9996 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0, 9997 HDA_AMP_MUTE, HDA_AMP_MUTE); 9998 } else { 9999 /* unmute internal speaker if necessary */ 10000 mute = snd_hda_codec_amp_read(codec, 0x1b, 0, HDA_OUTPUT, 0); 10001 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0, 10002 HDA_AMP_MUTE, mute); 10003 } 10004 } 10005 10006 /* unsolicited event for HP jack sensing */ 10007 static void alc262_hippo1_unsol_event(struct hda_codec *codec, 10008 unsigned int res) 10009 { 10010 if ((res >> 26) != ALC880_HP_EVENT) 10011 return; 10012 alc262_hippo1_automute(codec); 10013 } 10014 10015 /* 10016 * nec model 10017 * 0x15 = headphone 10018 * 0x16 = internal speaker 10019 * 0x18 = external mic 10020 */ 10021 10022 static struct snd_kcontrol_new alc262_nec_mixer[] = { 10023 HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT), 10024 HDA_CODEC_MUTE_MONO("Speaker Playback Switch", 0x16, 0, 0x0, HDA_OUTPUT), 10025 10026 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 10027 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 10028 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), 10029 10030 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT), 10031 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT), 10032 { } /* end */ 10033 }; 10034 10035 static struct hda_verb alc262_nec_verbs[] = { 10036 /* Unmute Speaker */ 10037 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 10038 10039 /* Headphone */ 10040 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT}, 10041 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 10042 10043 /* External mic to headphone */ 10044 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 10045 /* External mic to speaker */ 10046 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 10047 {} 10048 }; 10049 10050 /* 10051 * fujitsu model 10052 * 0x14 = headphone/spdif-out, 0x15 = internal speaker, 10053 * 0x1b = port replicator headphone out 10054 */ 10055 10056 #define ALC_HP_EVENT 0x37 10057 10058 static struct hda_verb alc262_fujitsu_unsol_verbs[] = { 10059 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT}, 10060 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 10061 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT}, 10062 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 10063 {} 10064 }; 10065 10066 static struct hda_verb alc262_lenovo_3000_unsol_verbs[] = { 10067 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT}, 10068 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 10069 {} 10070 }; 10071 10072 static struct hda_input_mux alc262_fujitsu_capture_source = { 10073 .num_items = 3, 10074 .items = { 10075 { "Mic", 0x0 }, 10076 { "Int Mic", 0x1 }, 10077 { "CD", 0x4 }, 10078 }, 10079 }; 10080 10081 static struct hda_input_mux alc262_HP_capture_source = { 10082 .num_items = 5, 10083 .items = { 10084 { "Mic", 0x0 }, 10085 { "Front Mic", 0x1 }, 10086 { "Line", 0x2 }, 10087 { "CD", 0x4 }, 10088 { "AUX IN", 0x6 }, 10089 }, 10090 }; 10091 10092 static struct hda_input_mux alc262_HP_D7000_capture_source = { 10093 .num_items = 4, 10094 .items = { 10095 { "Mic", 0x0 }, 10096 { "Front Mic", 0x2 }, 10097 { "Line", 0x1 }, 10098 { "CD", 0x4 }, 10099 }, 10100 }; 10101 10102 /* mute/unmute internal speaker according to the hp jacks and mute state */ 10103 static void alc262_fujitsu_automute(struct hda_codec *codec, int force) 10104 { 10105 struct alc_spec *spec = codec->spec; 10106 unsigned int mute; 10107 10108 if (force || !spec->sense_updated) { 10109 unsigned int present; 10110 /* need to execute and sync at first */ 10111 snd_hda_codec_read(codec, 0x14, 0, AC_VERB_SET_PIN_SENSE, 0); 10112 /* check laptop HP jack */ 10113 present = snd_hda_codec_read(codec, 0x14, 0, 10114 AC_VERB_GET_PIN_SENSE, 0); 10115 /* need to execute and sync at first */ 10116 snd_hda_codec_read(codec, 0x1b, 0, AC_VERB_SET_PIN_SENSE, 0); 10117 /* check docking HP jack */ 10118 present |= snd_hda_codec_read(codec, 0x1b, 0, 10119 AC_VERB_GET_PIN_SENSE, 0); 10120 if (present & AC_PINSENSE_PRESENCE) 10121 spec->jack_present = 1; 10122 else 10123 spec->jack_present = 0; 10124 spec->sense_updated = 1; 10125 } 10126 /* unmute internal speaker only if both HPs are unplugged and 10127 * master switch is on 10128 */ 10129 if (spec->jack_present) 10130 mute = HDA_AMP_MUTE; 10131 else 10132 mute = snd_hda_codec_amp_read(codec, 0x14, 0, HDA_OUTPUT, 0); 10133 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0, 10134 HDA_AMP_MUTE, mute); 10135 } 10136 10137 /* unsolicited event for HP jack sensing */ 10138 static void alc262_fujitsu_unsol_event(struct hda_codec *codec, 10139 unsigned int res) 10140 { 10141 if ((res >> 26) != ALC_HP_EVENT) 10142 return; 10143 alc262_fujitsu_automute(codec, 1); 10144 } 10145 10146 static void alc262_fujitsu_init_hook(struct hda_codec *codec) 10147 { 10148 alc262_fujitsu_automute(codec, 1); 10149 } 10150 10151 /* bind volumes of both NID 0x0c and 0x0d */ 10152 static struct hda_bind_ctls alc262_fujitsu_bind_master_vol = { 10153 .ops = &snd_hda_bind_vol, 10154 .values = { 10155 HDA_COMPOSE_AMP_VAL(0x0c, 3, 0, HDA_OUTPUT), 10156 HDA_COMPOSE_AMP_VAL(0x0d, 3, 0, HDA_OUTPUT), 10157 0 10158 }, 10159 }; 10160 10161 /* mute/unmute internal speaker according to the hp jack and mute state */ 10162 static void alc262_lenovo_3000_automute(struct hda_codec *codec, int force) 10163 { 10164 struct alc_spec *spec = codec->spec; 10165 unsigned int mute; 10166 10167 if (force || !spec->sense_updated) { 10168 unsigned int present_int_hp; 10169 /* need to execute and sync at first */ 10170 snd_hda_codec_read(codec, 0x1b, 0, AC_VERB_SET_PIN_SENSE, 0); 10171 present_int_hp = snd_hda_codec_read(codec, 0x1b, 0, 10172 AC_VERB_GET_PIN_SENSE, 0); 10173 spec->jack_present = (present_int_hp & 0x80000000) != 0; 10174 spec->sense_updated = 1; 10175 } 10176 if (spec->jack_present) { 10177 /* mute internal speaker */ 10178 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0, 10179 HDA_AMP_MUTE, HDA_AMP_MUTE); 10180 snd_hda_codec_amp_stereo(codec, 0x16, HDA_OUTPUT, 0, 10181 HDA_AMP_MUTE, HDA_AMP_MUTE); 10182 } else { 10183 /* unmute internal speaker if necessary */ 10184 mute = snd_hda_codec_amp_read(codec, 0x1b, 0, HDA_OUTPUT, 0); 10185 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0, 10186 HDA_AMP_MUTE, mute); 10187 snd_hda_codec_amp_stereo(codec, 0x16, HDA_OUTPUT, 0, 10188 HDA_AMP_MUTE, mute); 10189 } 10190 } 10191 10192 /* unsolicited event for HP jack sensing */ 10193 static void alc262_lenovo_3000_unsol_event(struct hda_codec *codec, 10194 unsigned int res) 10195 { 10196 if ((res >> 26) != ALC_HP_EVENT) 10197 return; 10198 alc262_lenovo_3000_automute(codec, 1); 10199 } 10200 10201 /* bind hp and internal speaker mute (with plug check) */ 10202 static int alc262_fujitsu_master_sw_put(struct snd_kcontrol *kcontrol, 10203 struct snd_ctl_elem_value *ucontrol) 10204 { 10205 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 10206 long *valp = ucontrol->value.integer.value; 10207 int change; 10208 10209 change = snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0, 10210 HDA_AMP_MUTE, 10211 valp ? 0 : HDA_AMP_MUTE); 10212 change |= snd_hda_codec_amp_stereo(codec, 0x1b, HDA_OUTPUT, 0, 10213 HDA_AMP_MUTE, 10214 valp ? 0 : HDA_AMP_MUTE); 10215 10216 if (change) 10217 alc262_fujitsu_automute(codec, 0); 10218 return change; 10219 } 10220 10221 static struct snd_kcontrol_new alc262_fujitsu_mixer[] = { 10222 HDA_BIND_VOL("Master Playback Volume", &alc262_fujitsu_bind_master_vol), 10223 { 10224 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 10225 .name = "Master Playback Switch", 10226 .info = snd_hda_mixer_amp_switch_info, 10227 .get = snd_hda_mixer_amp_switch_get, 10228 .put = alc262_fujitsu_master_sw_put, 10229 .private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT), 10230 }, 10231 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), 10232 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), 10233 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), 10234 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 10235 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 10236 HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT), 10237 HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), 10238 HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), 10239 { } /* end */ 10240 }; 10241 10242 /* bind hp and internal speaker mute (with plug check) */ 10243 static int alc262_lenovo_3000_master_sw_put(struct snd_kcontrol *kcontrol, 10244 struct snd_ctl_elem_value *ucontrol) 10245 { 10246 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 10247 long *valp = ucontrol->value.integer.value; 10248 int change; 10249 10250 change = snd_hda_codec_amp_stereo(codec, 0x1b, HDA_OUTPUT, 0, 10251 HDA_AMP_MUTE, 10252 valp ? 0 : HDA_AMP_MUTE); 10253 10254 if (change) 10255 alc262_lenovo_3000_automute(codec, 0); 10256 return change; 10257 } 10258 10259 static struct snd_kcontrol_new alc262_lenovo_3000_mixer[] = { 10260 HDA_BIND_VOL("Master Playback Volume", &alc262_fujitsu_bind_master_vol), 10261 { 10262 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 10263 .name = "Master Playback Switch", 10264 .info = snd_hda_mixer_amp_switch_info, 10265 .get = snd_hda_mixer_amp_switch_get, 10266 .put = alc262_lenovo_3000_master_sw_put, 10267 .private_value = HDA_COMPOSE_AMP_VAL(0x1b, 3, 0, HDA_OUTPUT), 10268 }, 10269 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), 10270 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), 10271 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), 10272 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 10273 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 10274 HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT), 10275 HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), 10276 HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), 10277 { } /* end */ 10278 }; 10279 10280 static struct snd_kcontrol_new alc262_toshiba_rx1_mixer[] = { 10281 HDA_BIND_VOL("Master Playback Volume", &alc262_fujitsu_bind_master_vol), 10282 { 10283 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 10284 .name = "Master Playback Switch", 10285 .info = snd_hda_mixer_amp_switch_info, 10286 .get = snd_hda_mixer_amp_switch_get, 10287 .put = alc262_sony_master_sw_put, 10288 .private_value = HDA_COMPOSE_AMP_VAL(0x15, 3, 0, HDA_OUTPUT), 10289 }, 10290 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 10291 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 10292 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), 10293 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT), 10294 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT), 10295 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT), 10296 { } /* end */ 10297 }; 10298 10299 /* additional init verbs for Benq laptops */ 10300 static struct hda_verb alc262_EAPD_verbs[] = { 10301 {0x20, AC_VERB_SET_COEF_INDEX, 0x07}, 10302 {0x20, AC_VERB_SET_PROC_COEF, 0x3070}, 10303 {} 10304 }; 10305 10306 static struct hda_verb alc262_benq_t31_EAPD_verbs[] = { 10307 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, 10308 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24}, 10309 10310 {0x20, AC_VERB_SET_COEF_INDEX, 0x07}, 10311 {0x20, AC_VERB_SET_PROC_COEF, 0x3050}, 10312 {} 10313 }; 10314 10315 /* Samsung Q1 Ultra Vista model setup */ 10316 static struct snd_kcontrol_new alc262_ultra_mixer[] = { 10317 HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 10318 HDA_BIND_MUTE("Master Playback Switch", 0x0c, 2, HDA_INPUT), 10319 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x01, HDA_INPUT), 10320 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x01, HDA_INPUT), 10321 HDA_CODEC_VOLUME("Mic Boost", 0x19, 0, HDA_INPUT), 10322 HDA_CODEC_VOLUME("Headphone Mic Boost", 0x15, 0, HDA_INPUT), 10323 { } /* end */ 10324 }; 10325 10326 static struct hda_verb alc262_ultra_verbs[] = { 10327 /* output mixer */ 10328 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 10329 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 10330 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 10331 /* speaker */ 10332 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 10333 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 10334 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 10335 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, 10336 /* HP */ 10337 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 10338 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 10339 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 10340 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, 10341 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT}, 10342 /* internal mic */ 10343 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, 10344 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 10345 /* ADC, choose mic */ 10346 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 10347 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 10348 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 10349 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, 10350 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, 10351 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, 10352 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)}, 10353 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)}, 10354 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)}, 10355 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(8)}, 10356 {} 10357 }; 10358 10359 /* mute/unmute internal speaker according to the hp jack and mute state */ 10360 static void alc262_ultra_automute(struct hda_codec *codec) 10361 { 10362 struct alc_spec *spec = codec->spec; 10363 unsigned int mute; 10364 10365 mute = 0; 10366 /* auto-mute only when HP is used as HP */ 10367 if (!spec->cur_mux[0]) { 10368 unsigned int present; 10369 /* need to execute and sync at first */ 10370 snd_hda_codec_read(codec, 0x15, 0, AC_VERB_SET_PIN_SENSE, 0); 10371 present = snd_hda_codec_read(codec, 0x15, 0, 10372 AC_VERB_GET_PIN_SENSE, 0); 10373 spec->jack_present = (present & AC_PINSENSE_PRESENCE) != 0; 10374 if (spec->jack_present) 10375 mute = HDA_AMP_MUTE; 10376 } 10377 /* mute/unmute internal speaker */ 10378 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0, 10379 HDA_AMP_MUTE, mute); 10380 /* mute/unmute HP */ 10381 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0, 10382 HDA_AMP_MUTE, mute ? 0 : HDA_AMP_MUTE); 10383 } 10384 10385 /* unsolicited event for HP jack sensing */ 10386 static void alc262_ultra_unsol_event(struct hda_codec *codec, 10387 unsigned int res) 10388 { 10389 if ((res >> 26) != ALC880_HP_EVENT) 10390 return; 10391 alc262_ultra_automute(codec); 10392 } 10393 10394 static struct hda_input_mux alc262_ultra_capture_source = { 10395 .num_items = 2, 10396 .items = { 10397 { "Mic", 0x1 }, 10398 { "Headphone", 0x7 }, 10399 }, 10400 }; 10401 10402 static int alc262_ultra_mux_enum_put(struct snd_kcontrol *kcontrol, 10403 struct snd_ctl_elem_value *ucontrol) 10404 { 10405 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 10406 struct alc_spec *spec = codec->spec; 10407 int ret; 10408 10409 ret = alc_mux_enum_put(kcontrol, ucontrol); 10410 if (!ret) 10411 return 0; 10412 /* reprogram the HP pin as mic or HP according to the input source */ 10413 snd_hda_codec_write_cache(codec, 0x15, 0, 10414 AC_VERB_SET_PIN_WIDGET_CONTROL, 10415 spec->cur_mux[0] ? PIN_VREF80 : PIN_HP); 10416 alc262_ultra_automute(codec); /* mute/unmute HP */ 10417 return ret; 10418 } 10419 10420 static struct snd_kcontrol_new alc262_ultra_capture_mixer[] = { 10421 HDA_CODEC_VOLUME("Capture Volume", 0x07, 0x0, HDA_INPUT), 10422 HDA_CODEC_MUTE("Capture Switch", 0x07, 0x0, HDA_INPUT), 10423 { 10424 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 10425 .name = "Capture Source", 10426 .info = alc_mux_enum_info, 10427 .get = alc_mux_enum_get, 10428 .put = alc262_ultra_mux_enum_put, 10429 }, 10430 { } /* end */ 10431 }; 10432 10433 /* add playback controls from the parsed DAC table */ 10434 static int alc262_auto_create_multi_out_ctls(struct alc_spec *spec, 10435 const struct auto_pin_cfg *cfg) 10436 { 10437 hda_nid_t nid; 10438 int err; 10439 10440 spec->multiout.num_dacs = 1; /* only use one dac */ 10441 spec->multiout.dac_nids = spec->private_dac_nids; 10442 spec->multiout.dac_nids[0] = 2; 10443 10444 nid = cfg->line_out_pins[0]; 10445 if (nid) { 10446 err = add_control(spec, ALC_CTL_WIDGET_VOL, 10447 "Front Playback Volume", 10448 HDA_COMPOSE_AMP_VAL(0x0c, 3, 0, HDA_OUTPUT)); 10449 if (err < 0) 10450 return err; 10451 err = add_control(spec, ALC_CTL_WIDGET_MUTE, 10452 "Front Playback Switch", 10453 HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT)); 10454 if (err < 0) 10455 return err; 10456 } 10457 10458 nid = cfg->speaker_pins[0]; 10459 if (nid) { 10460 if (nid == 0x16) { 10461 err = add_control(spec, ALC_CTL_WIDGET_VOL, 10462 "Speaker Playback Volume", 10463 HDA_COMPOSE_AMP_VAL(0x0e, 2, 0, 10464 HDA_OUTPUT)); 10465 if (err < 0) 10466 return err; 10467 err = add_control(spec, ALC_CTL_WIDGET_MUTE, 10468 "Speaker Playback Switch", 10469 HDA_COMPOSE_AMP_VAL(nid, 2, 0, 10470 HDA_OUTPUT)); 10471 if (err < 0) 10472 return err; 10473 } else { 10474 err = add_control(spec, ALC_CTL_WIDGET_MUTE, 10475 "Speaker Playback Switch", 10476 HDA_COMPOSE_AMP_VAL(nid, 3, 0, 10477 HDA_OUTPUT)); 10478 if (err < 0) 10479 return err; 10480 } 10481 } 10482 nid = cfg->hp_pins[0]; 10483 if (nid) { 10484 /* spec->multiout.hp_nid = 2; */ 10485 if (nid == 0x16) { 10486 err = add_control(spec, ALC_CTL_WIDGET_VOL, 10487 "Headphone Playback Volume", 10488 HDA_COMPOSE_AMP_VAL(0x0e, 2, 0, 10489 HDA_OUTPUT)); 10490 if (err < 0) 10491 return err; 10492 err = add_control(spec, ALC_CTL_WIDGET_MUTE, 10493 "Headphone Playback Switch", 10494 HDA_COMPOSE_AMP_VAL(nid, 2, 0, 10495 HDA_OUTPUT)); 10496 if (err < 0) 10497 return err; 10498 } else { 10499 err = add_control(spec, ALC_CTL_WIDGET_MUTE, 10500 "Headphone Playback Switch", 10501 HDA_COMPOSE_AMP_VAL(nid, 3, 0, 10502 HDA_OUTPUT)); 10503 if (err < 0) 10504 return err; 10505 } 10506 } 10507 return 0; 10508 } 10509 10510 /* identical with ALC880 */ 10511 #define alc262_auto_create_analog_input_ctls \ 10512 alc880_auto_create_analog_input_ctls 10513 10514 /* 10515 * generic initialization of ADC, input mixers and output mixers 10516 */ 10517 static struct hda_verb alc262_volume_init_verbs[] = { 10518 /* 10519 * Unmute ADC0-2 and set the default input to mic-in 10520 */ 10521 {0x07, AC_VERB_SET_CONNECT_SEL, 0x00}, 10522 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 10523 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00}, 10524 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 10525 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00}, 10526 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 10527 10528 /* Mute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback 10529 * mixer widget 10530 * Note: PASD motherboards uses the Line In 2 as the input for 10531 * front panel mic (mic 2) 10532 */ 10533 /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */ 10534 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 10535 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 10536 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, 10537 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, 10538 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, 10539 10540 /* 10541 * Set up output mixers (0x0c - 0x0f) 10542 */ 10543 /* set vol=0 to output mixers */ 10544 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 10545 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 10546 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 10547 10548 /* set up input amps for analog loopback */ 10549 /* Amp Indices: DAC = 0, mixer = 1 */ 10550 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 10551 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 10552 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 10553 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 10554 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 10555 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 10556 10557 /* FIXME: use matrix-type input source selection */ 10558 /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */ 10559 /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */ 10560 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))}, 10561 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))}, 10562 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))}, 10563 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))}, 10564 /* Input mixer2 */ 10565 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))}, 10566 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))}, 10567 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))}, 10568 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))}, 10569 /* Input mixer3 */ 10570 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))}, 10571 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))}, 10572 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))}, 10573 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))}, 10574 10575 { } 10576 }; 10577 10578 static struct hda_verb alc262_HP_BPC_init_verbs[] = { 10579 /* 10580 * Unmute ADC0-2 and set the default input to mic-in 10581 */ 10582 {0x07, AC_VERB_SET_CONNECT_SEL, 0x00}, 10583 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 10584 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00}, 10585 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 10586 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00}, 10587 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 10588 10589 /* Mute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback 10590 * mixer widget 10591 * Note: PASD motherboards uses the Line In 2 as the input for 10592 * front panel mic (mic 2) 10593 */ 10594 /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */ 10595 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 10596 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 10597 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, 10598 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, 10599 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, 10600 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)}, 10601 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)}, 10602 10603 /* 10604 * Set up output mixers (0x0c - 0x0e) 10605 */ 10606 /* set vol=0 to output mixers */ 10607 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 10608 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 10609 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 10610 10611 /* set up input amps for analog loopback */ 10612 /* Amp Indices: DAC = 0, mixer = 1 */ 10613 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 10614 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 10615 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 10616 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 10617 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 10618 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 10619 10620 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 10621 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 10622 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 10623 10624 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 10625 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 10626 10627 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, 10628 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, 10629 10630 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20}, 10631 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24}, 10632 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24}, 10633 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20}, 10634 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20}, 10635 10636 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, 0x7023 }, 10637 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 }, 10638 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 }, 10639 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, 0x7023 }, 10640 {0x1c, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 }, 10641 {0x1d, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 }, 10642 10643 10644 /* FIXME: use matrix-type input source selection */ 10645 /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */ 10646 /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */ 10647 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))}, 10648 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x03 << 8))}, 10649 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8))}, 10650 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x04 << 8))}, 10651 /* Input mixer2 */ 10652 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))}, 10653 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x03 << 8))}, 10654 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8))}, 10655 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x04 << 8))}, 10656 /* Input mixer3 */ 10657 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))}, 10658 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x03 << 8))}, 10659 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8))}, 10660 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x04 << 8))}, 10661 10662 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, 10663 10664 { } 10665 }; 10666 10667 static struct hda_verb alc262_HP_BPC_WildWest_init_verbs[] = { 10668 /* 10669 * Unmute ADC0-2 and set the default input to mic-in 10670 */ 10671 {0x07, AC_VERB_SET_CONNECT_SEL, 0x00}, 10672 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 10673 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00}, 10674 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 10675 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00}, 10676 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 10677 10678 /* Mute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback 10679 * mixer widget 10680 * Note: PASD motherboards uses the Line In 2 as the input for front 10681 * panel mic (mic 2) 10682 */ 10683 /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */ 10684 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 10685 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 10686 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, 10687 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, 10688 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, 10689 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)}, 10690 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)}, 10691 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)}, 10692 /* 10693 * Set up output mixers (0x0c - 0x0e) 10694 */ 10695 /* set vol=0 to output mixers */ 10696 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 10697 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 10698 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 10699 10700 /* set up input amps for analog loopback */ 10701 /* Amp Indices: DAC = 0, mixer = 1 */ 10702 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 10703 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 10704 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 10705 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 10706 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 10707 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 10708 10709 10710 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP }, /* HP */ 10711 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, /* Mono */ 10712 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, /* rear MIC */ 10713 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN }, /* Line in */ 10714 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, /* Front MIC */ 10715 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, /* Line out */ 10716 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN }, /* CD in */ 10717 10718 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 10719 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 10720 10721 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, 10722 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, 10723 10724 /* {0x14, AC_VERB_SET_AMP_GAIN_MUTE, 0x7023 }, */ 10725 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 }, 10726 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 }, 10727 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, 0x7023 }, 10728 {0x1c, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 }, 10729 {0x1d, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 }, 10730 10731 /* FIXME: use matrix-type input source selection */ 10732 /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */ 10733 /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */ 10734 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))}, /*rear MIC*/ 10735 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))}, /*Line in*/ 10736 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8))}, /*F MIC*/ 10737 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x03 << 8))}, /*Front*/ 10738 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x04 << 8))}, /*CD*/ 10739 /* {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x06 << 8))}, */ 10740 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x07 << 8))}, /*HP*/ 10741 /* Input mixer2 */ 10742 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))}, 10743 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))}, 10744 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8))}, 10745 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x03 << 8))}, 10746 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x04 << 8))}, 10747 /* {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x06 << 8))}, */ 10748 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x07 << 8))}, 10749 /* Input mixer3 */ 10750 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))}, 10751 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))}, 10752 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8))}, 10753 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x03 << 8))}, 10754 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x04 << 8))}, 10755 /* {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x06 << 8))}, */ 10756 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x07 << 8))}, 10757 10758 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, 10759 10760 { } 10761 }; 10762 10763 static struct hda_verb alc262_toshiba_rx1_unsol_verbs[] = { 10764 10765 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, /* Front Speaker */ 10766 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 10767 {0x14, AC_VERB_SET_CONNECT_SEL, 0x01}, 10768 10769 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, /* MIC jack */ 10770 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, /* Front MIC */ 10771 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0) }, 10772 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0) }, 10773 10774 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP }, /* HP jack */ 10775 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, 10776 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT}, 10777 {} 10778 }; 10779 10780 10781 #ifdef CONFIG_SND_HDA_POWER_SAVE 10782 #define alc262_loopbacks alc880_loopbacks 10783 #endif 10784 10785 /* pcm configuration: identiacal with ALC880 */ 10786 #define alc262_pcm_analog_playback alc880_pcm_analog_playback 10787 #define alc262_pcm_analog_capture alc880_pcm_analog_capture 10788 #define alc262_pcm_digital_playback alc880_pcm_digital_playback 10789 #define alc262_pcm_digital_capture alc880_pcm_digital_capture 10790 10791 /* 10792 * BIOS auto configuration 10793 */ 10794 static int alc262_parse_auto_config(struct hda_codec *codec) 10795 { 10796 struct alc_spec *spec = codec->spec; 10797 int err; 10798 static hda_nid_t alc262_ignore[] = { 0x1d, 0 }; 10799 10800 err = snd_hda_parse_pin_def_config(codec, &spec->autocfg, 10801 alc262_ignore); 10802 if (err < 0) 10803 return err; 10804 if (!spec->autocfg.line_outs) { 10805 if (spec->autocfg.dig_outs || spec->autocfg.dig_in_pin) { 10806 spec->multiout.max_channels = 2; 10807 spec->no_analog = 1; 10808 goto dig_only; 10809 } 10810 return 0; /* can't find valid BIOS pin config */ 10811 } 10812 err = alc262_auto_create_multi_out_ctls(spec, &spec->autocfg); 10813 if (err < 0) 10814 return err; 10815 err = alc262_auto_create_analog_input_ctls(spec, &spec->autocfg); 10816 if (err < 0) 10817 return err; 10818 10819 spec->multiout.max_channels = spec->multiout.num_dacs * 2; 10820 10821 dig_only: 10822 if (spec->autocfg.dig_outs) { 10823 spec->multiout.dig_out_nid = ALC262_DIGOUT_NID; 10824 spec->dig_out_type = spec->autocfg.dig_out_type[0]; 10825 } 10826 if (spec->autocfg.dig_in_pin) 10827 spec->dig_in_nid = ALC262_DIGIN_NID; 10828 10829 if (spec->kctls.list) 10830 add_mixer(spec, spec->kctls.list); 10831 10832 add_verb(spec, alc262_volume_init_verbs); 10833 spec->num_mux_defs = 1; 10834 spec->input_mux = &spec->private_imux[0]; 10835 10836 err = alc_auto_add_mic_boost(codec); 10837 if (err < 0) 10838 return err; 10839 10840 return 1; 10841 } 10842 10843 #define alc262_auto_init_multi_out alc882_auto_init_multi_out 10844 #define alc262_auto_init_hp_out alc882_auto_init_hp_out 10845 #define alc262_auto_init_analog_input alc882_auto_init_analog_input 10846 #define alc262_auto_init_input_src alc882_auto_init_input_src 10847 10848 10849 /* init callback for auto-configuration model -- overriding the default init */ 10850 static void alc262_auto_init(struct hda_codec *codec) 10851 { 10852 struct alc_spec *spec = codec->spec; 10853 alc262_auto_init_multi_out(codec); 10854 alc262_auto_init_hp_out(codec); 10855 alc262_auto_init_analog_input(codec); 10856 alc262_auto_init_input_src(codec); 10857 if (spec->unsol_event) 10858 alc_inithook(codec); 10859 } 10860 10861 /* 10862 * configuration and preset 10863 */ 10864 static const char *alc262_models[ALC262_MODEL_LAST] = { 10865 [ALC262_BASIC] = "basic", 10866 [ALC262_HIPPO] = "hippo", 10867 [ALC262_HIPPO_1] = "hippo_1", 10868 [ALC262_FUJITSU] = "fujitsu", 10869 [ALC262_HP_BPC] = "hp-bpc", 10870 [ALC262_HP_BPC_D7000_WL]= "hp-bpc-d7000", 10871 [ALC262_HP_TC_T5735] = "hp-tc-t5735", 10872 [ALC262_HP_RP5700] = "hp-rp5700", 10873 [ALC262_BENQ_ED8] = "benq", 10874 [ALC262_BENQ_T31] = "benq-t31", 10875 [ALC262_SONY_ASSAMD] = "sony-assamd", 10876 [ALC262_TOSHIBA_S06] = "toshiba-s06", 10877 [ALC262_TOSHIBA_RX1] = "toshiba-rx1", 10878 [ALC262_ULTRA] = "ultra", 10879 [ALC262_LENOVO_3000] = "lenovo-3000", 10880 [ALC262_NEC] = "nec", 10881 [ALC262_TYAN] = "tyan", 10882 [ALC262_AUTO] = "auto", 10883 }; 10884 10885 static struct snd_pci_quirk alc262_cfg_tbl[] = { 10886 SND_PCI_QUIRK(0x1002, 0x437b, "Hippo", ALC262_HIPPO), 10887 SND_PCI_QUIRK(0x1033, 0x8895, "NEC Versa S9100", ALC262_NEC), 10888 SND_PCI_QUIRK_MASK(0x103c, 0xff00, 0x1200, "HP xw series", 10889 ALC262_HP_BPC), 10890 SND_PCI_QUIRK_MASK(0x103c, 0xff00, 0x1300, "HP xw series", 10891 ALC262_HP_BPC), 10892 SND_PCI_QUIRK_MASK(0x103c, 0xff00, 0x1700, "HP xw series", 10893 ALC262_HP_BPC), 10894 SND_PCI_QUIRK(0x103c, 0x2800, "HP D7000", ALC262_HP_BPC_D7000_WL), 10895 SND_PCI_QUIRK(0x103c, 0x2801, "HP D7000", ALC262_HP_BPC_D7000_WF), 10896 SND_PCI_QUIRK(0x103c, 0x2802, "HP D7000", ALC262_HP_BPC_D7000_WL), 10897 SND_PCI_QUIRK(0x103c, 0x2803, "HP D7000", ALC262_HP_BPC_D7000_WF), 10898 SND_PCI_QUIRK(0x103c, 0x2804, "HP D7000", ALC262_HP_BPC_D7000_WL), 10899 SND_PCI_QUIRK(0x103c, 0x2805, "HP D7000", ALC262_HP_BPC_D7000_WF), 10900 SND_PCI_QUIRK(0x103c, 0x2806, "HP D7000", ALC262_HP_BPC_D7000_WL), 10901 SND_PCI_QUIRK(0x103c, 0x2807, "HP D7000", ALC262_HP_BPC_D7000_WF), 10902 SND_PCI_QUIRK(0x103c, 0x280c, "HP xw4400", ALC262_HP_BPC), 10903 SND_PCI_QUIRK(0x103c, 0x3014, "HP xw6400", ALC262_HP_BPC), 10904 SND_PCI_QUIRK(0x103c, 0x3015, "HP xw8400", ALC262_HP_BPC), 10905 SND_PCI_QUIRK(0x103c, 0x302f, "HP Thin Client T5735", 10906 ALC262_HP_TC_T5735), 10907 SND_PCI_QUIRK(0x103c, 0x2817, "HP RP5700", ALC262_HP_RP5700), 10908 SND_PCI_QUIRK(0x104d, 0x1f00, "Sony ASSAMD", ALC262_SONY_ASSAMD), 10909 SND_PCI_QUIRK(0x104d, 0x8203, "Sony UX-90", ALC262_HIPPO), 10910 SND_PCI_QUIRK(0x104d, 0x820f, "Sony ASSAMD", ALC262_SONY_ASSAMD), 10911 SND_PCI_QUIRK(0x104d, 0x9016, "Sony VAIO", ALC262_AUTO), /* dig-only */ 10912 SND_PCI_QUIRK_MASK(0x104d, 0xff00, 0x9000, "Sony VAIO", 10913 ALC262_SONY_ASSAMD), 10914 SND_PCI_QUIRK(0x1179, 0x0001, "Toshiba dynabook SS RX1", 10915 ALC262_TOSHIBA_RX1), 10916 SND_PCI_QUIRK(0x1179, 0xff7b, "Toshiba S06", ALC262_TOSHIBA_S06), 10917 SND_PCI_QUIRK(0x10cf, 0x1397, "Fujitsu", ALC262_FUJITSU), 10918 SND_PCI_QUIRK(0x10cf, 0x142d, "Fujitsu Lifebook E8410", ALC262_FUJITSU), 10919 SND_PCI_QUIRK(0x10f1, 0x2915, "Tyan Thunder n6650W", ALC262_TYAN), 10920 SND_PCI_QUIRK_MASK(0x144d, 0xff00, 0xc032, "Samsung Q1", 10921 ALC262_ULTRA), 10922 SND_PCI_QUIRK(0x144d, 0xc510, "Samsung Q45", ALC262_HIPPO), 10923 SND_PCI_QUIRK(0x17aa, 0x384e, "Lenovo 3000 y410", ALC262_LENOVO_3000), 10924 SND_PCI_QUIRK(0x17ff, 0x0560, "Benq ED8", ALC262_BENQ_ED8), 10925 SND_PCI_QUIRK(0x17ff, 0x058d, "Benq T31-16", ALC262_BENQ_T31), 10926 SND_PCI_QUIRK(0x17ff, 0x058f, "Benq Hippo", ALC262_HIPPO_1), 10927 {} 10928 }; 10929 10930 static struct alc_config_preset alc262_presets[] = { 10931 [ALC262_BASIC] = { 10932 .mixers = { alc262_base_mixer }, 10933 .init_verbs = { alc262_init_verbs }, 10934 .num_dacs = ARRAY_SIZE(alc262_dac_nids), 10935 .dac_nids = alc262_dac_nids, 10936 .hp_nid = 0x03, 10937 .num_channel_mode = ARRAY_SIZE(alc262_modes), 10938 .channel_mode = alc262_modes, 10939 .input_mux = &alc262_capture_source, 10940 }, 10941 [ALC262_HIPPO] = { 10942 .mixers = { alc262_base_mixer }, 10943 .init_verbs = { alc262_init_verbs, alc262_hippo_unsol_verbs}, 10944 .num_dacs = ARRAY_SIZE(alc262_dac_nids), 10945 .dac_nids = alc262_dac_nids, 10946 .hp_nid = 0x03, 10947 .dig_out_nid = ALC262_DIGOUT_NID, 10948 .num_channel_mode = ARRAY_SIZE(alc262_modes), 10949 .channel_mode = alc262_modes, 10950 .input_mux = &alc262_capture_source, 10951 .unsol_event = alc262_hippo_unsol_event, 10952 .init_hook = alc262_hippo_automute, 10953 }, 10954 [ALC262_HIPPO_1] = { 10955 .mixers = { alc262_hippo1_mixer }, 10956 .init_verbs = { alc262_init_verbs, alc262_hippo1_unsol_verbs}, 10957 .num_dacs = ARRAY_SIZE(alc262_dac_nids), 10958 .dac_nids = alc262_dac_nids, 10959 .hp_nid = 0x02, 10960 .dig_out_nid = ALC262_DIGOUT_NID, 10961 .num_channel_mode = ARRAY_SIZE(alc262_modes), 10962 .channel_mode = alc262_modes, 10963 .input_mux = &alc262_capture_source, 10964 .unsol_event = alc262_hippo1_unsol_event, 10965 .init_hook = alc262_hippo1_automute, 10966 }, 10967 [ALC262_FUJITSU] = { 10968 .mixers = { alc262_fujitsu_mixer }, 10969 .init_verbs = { alc262_init_verbs, alc262_EAPD_verbs, 10970 alc262_fujitsu_unsol_verbs }, 10971 .num_dacs = ARRAY_SIZE(alc262_dac_nids), 10972 .dac_nids = alc262_dac_nids, 10973 .hp_nid = 0x03, 10974 .dig_out_nid = ALC262_DIGOUT_NID, 10975 .num_channel_mode = ARRAY_SIZE(alc262_modes), 10976 .channel_mode = alc262_modes, 10977 .input_mux = &alc262_fujitsu_capture_source, 10978 .unsol_event = alc262_fujitsu_unsol_event, 10979 .init_hook = alc262_fujitsu_init_hook, 10980 }, 10981 [ALC262_HP_BPC] = { 10982 .mixers = { alc262_HP_BPC_mixer }, 10983 .init_verbs = { alc262_HP_BPC_init_verbs }, 10984 .num_dacs = ARRAY_SIZE(alc262_dac_nids), 10985 .dac_nids = alc262_dac_nids, 10986 .hp_nid = 0x03, 10987 .num_channel_mode = ARRAY_SIZE(alc262_modes), 10988 .channel_mode = alc262_modes, 10989 .input_mux = &alc262_HP_capture_source, 10990 .unsol_event = alc262_hp_bpc_unsol_event, 10991 .init_hook = alc262_hp_bpc_automute, 10992 }, 10993 [ALC262_HP_BPC_D7000_WF] = { 10994 .mixers = { alc262_HP_BPC_WildWest_mixer }, 10995 .init_verbs = { alc262_HP_BPC_WildWest_init_verbs }, 10996 .num_dacs = ARRAY_SIZE(alc262_dac_nids), 10997 .dac_nids = alc262_dac_nids, 10998 .hp_nid = 0x03, 10999 .num_channel_mode = ARRAY_SIZE(alc262_modes), 11000 .channel_mode = alc262_modes, 11001 .input_mux = &alc262_HP_D7000_capture_source, 11002 .unsol_event = alc262_hp_wildwest_unsol_event, 11003 .init_hook = alc262_hp_wildwest_automute, 11004 }, 11005 [ALC262_HP_BPC_D7000_WL] = { 11006 .mixers = { alc262_HP_BPC_WildWest_mixer, 11007 alc262_HP_BPC_WildWest_option_mixer }, 11008 .init_verbs = { alc262_HP_BPC_WildWest_init_verbs }, 11009 .num_dacs = ARRAY_SIZE(alc262_dac_nids), 11010 .dac_nids = alc262_dac_nids, 11011 .hp_nid = 0x03, 11012 .num_channel_mode = ARRAY_SIZE(alc262_modes), 11013 .channel_mode = alc262_modes, 11014 .input_mux = &alc262_HP_D7000_capture_source, 11015 .unsol_event = alc262_hp_wildwest_unsol_event, 11016 .init_hook = alc262_hp_wildwest_automute, 11017 }, 11018 [ALC262_HP_TC_T5735] = { 11019 .mixers = { alc262_hp_t5735_mixer }, 11020 .init_verbs = { alc262_init_verbs, alc262_hp_t5735_verbs }, 11021 .num_dacs = ARRAY_SIZE(alc262_dac_nids), 11022 .dac_nids = alc262_dac_nids, 11023 .hp_nid = 0x03, 11024 .num_channel_mode = ARRAY_SIZE(alc262_modes), 11025 .channel_mode = alc262_modes, 11026 .input_mux = &alc262_capture_source, 11027 .unsol_event = alc262_hp_t5735_unsol_event, 11028 .init_hook = alc262_hp_t5735_init_hook, 11029 }, 11030 [ALC262_HP_RP5700] = { 11031 .mixers = { alc262_hp_rp5700_mixer }, 11032 .init_verbs = { alc262_init_verbs, alc262_hp_rp5700_verbs }, 11033 .num_dacs = ARRAY_SIZE(alc262_dac_nids), 11034 .dac_nids = alc262_dac_nids, 11035 .num_channel_mode = ARRAY_SIZE(alc262_modes), 11036 .channel_mode = alc262_modes, 11037 .input_mux = &alc262_hp_rp5700_capture_source, 11038 }, 11039 [ALC262_BENQ_ED8] = { 11040 .mixers = { alc262_base_mixer }, 11041 .init_verbs = { alc262_init_verbs, alc262_EAPD_verbs }, 11042 .num_dacs = ARRAY_SIZE(alc262_dac_nids), 11043 .dac_nids = alc262_dac_nids, 11044 .hp_nid = 0x03, 11045 .num_channel_mode = ARRAY_SIZE(alc262_modes), 11046 .channel_mode = alc262_modes, 11047 .input_mux = &alc262_capture_source, 11048 }, 11049 [ALC262_SONY_ASSAMD] = { 11050 .mixers = { alc262_sony_mixer }, 11051 .init_verbs = { alc262_init_verbs, alc262_sony_unsol_verbs}, 11052 .num_dacs = ARRAY_SIZE(alc262_dac_nids), 11053 .dac_nids = alc262_dac_nids, 11054 .hp_nid = 0x02, 11055 .num_channel_mode = ARRAY_SIZE(alc262_modes), 11056 .channel_mode = alc262_modes, 11057 .input_mux = &alc262_capture_source, 11058 .unsol_event = alc262_hippo_unsol_event, 11059 .init_hook = alc262_hippo_automute, 11060 }, 11061 [ALC262_BENQ_T31] = { 11062 .mixers = { alc262_benq_t31_mixer }, 11063 .init_verbs = { alc262_init_verbs, alc262_benq_t31_EAPD_verbs, alc262_hippo_unsol_verbs }, 11064 .num_dacs = ARRAY_SIZE(alc262_dac_nids), 11065 .dac_nids = alc262_dac_nids, 11066 .hp_nid = 0x03, 11067 .num_channel_mode = ARRAY_SIZE(alc262_modes), 11068 .channel_mode = alc262_modes, 11069 .input_mux = &alc262_capture_source, 11070 .unsol_event = alc262_hippo_unsol_event, 11071 .init_hook = alc262_hippo_automute, 11072 }, 11073 [ALC262_ULTRA] = { 11074 .mixers = { alc262_ultra_mixer }, 11075 .cap_mixer = alc262_ultra_capture_mixer, 11076 .init_verbs = { alc262_ultra_verbs }, 11077 .num_dacs = ARRAY_SIZE(alc262_dac_nids), 11078 .dac_nids = alc262_dac_nids, 11079 .num_channel_mode = ARRAY_SIZE(alc262_modes), 11080 .channel_mode = alc262_modes, 11081 .input_mux = &alc262_ultra_capture_source, 11082 .adc_nids = alc262_adc_nids, /* ADC0 */ 11083 .capsrc_nids = alc262_capsrc_nids, 11084 .num_adc_nids = 1, /* single ADC */ 11085 .unsol_event = alc262_ultra_unsol_event, 11086 .init_hook = alc262_ultra_automute, 11087 }, 11088 [ALC262_LENOVO_3000] = { 11089 .mixers = { alc262_lenovo_3000_mixer }, 11090 .init_verbs = { alc262_init_verbs, alc262_EAPD_verbs, 11091 alc262_lenovo_3000_unsol_verbs }, 11092 .num_dacs = ARRAY_SIZE(alc262_dac_nids), 11093 .dac_nids = alc262_dac_nids, 11094 .hp_nid = 0x03, 11095 .dig_out_nid = ALC262_DIGOUT_NID, 11096 .num_channel_mode = ARRAY_SIZE(alc262_modes), 11097 .channel_mode = alc262_modes, 11098 .input_mux = &alc262_fujitsu_capture_source, 11099 .unsol_event = alc262_lenovo_3000_unsol_event, 11100 }, 11101 [ALC262_NEC] = { 11102 .mixers = { alc262_nec_mixer }, 11103 .init_verbs = { alc262_nec_verbs }, 11104 .num_dacs = ARRAY_SIZE(alc262_dac_nids), 11105 .dac_nids = alc262_dac_nids, 11106 .hp_nid = 0x03, 11107 .num_channel_mode = ARRAY_SIZE(alc262_modes), 11108 .channel_mode = alc262_modes, 11109 .input_mux = &alc262_capture_source, 11110 }, 11111 [ALC262_TOSHIBA_S06] = { 11112 .mixers = { alc262_toshiba_s06_mixer }, 11113 .init_verbs = { alc262_init_verbs, alc262_toshiba_s06_verbs, 11114 alc262_eapd_verbs }, 11115 .num_dacs = ARRAY_SIZE(alc262_dac_nids), 11116 .capsrc_nids = alc262_dmic_capsrc_nids, 11117 .dac_nids = alc262_dac_nids, 11118 .adc_nids = alc262_dmic_adc_nids, /* ADC0 */ 11119 .dig_out_nid = ALC262_DIGOUT_NID, 11120 .num_channel_mode = ARRAY_SIZE(alc262_modes), 11121 .channel_mode = alc262_modes, 11122 .input_mux = &alc262_dmic_capture_source, 11123 .unsol_event = alc262_toshiba_s06_unsol_event, 11124 .init_hook = alc262_toshiba_s06_init_hook, 11125 }, 11126 [ALC262_TOSHIBA_RX1] = { 11127 .mixers = { alc262_toshiba_rx1_mixer }, 11128 .init_verbs = { alc262_init_verbs, alc262_toshiba_rx1_unsol_verbs }, 11129 .num_dacs = ARRAY_SIZE(alc262_dac_nids), 11130 .dac_nids = alc262_dac_nids, 11131 .hp_nid = 0x03, 11132 .num_channel_mode = ARRAY_SIZE(alc262_modes), 11133 .channel_mode = alc262_modes, 11134 .input_mux = &alc262_capture_source, 11135 .unsol_event = alc262_hippo_unsol_event, 11136 .init_hook = alc262_hippo_automute, 11137 }, 11138 [ALC262_TYAN] = { 11139 .mixers = { alc262_tyan_mixer }, 11140 .init_verbs = { alc262_init_verbs, alc262_tyan_verbs}, 11141 .num_dacs = ARRAY_SIZE(alc262_dac_nids), 11142 .dac_nids = alc262_dac_nids, 11143 .hp_nid = 0x02, 11144 .dig_out_nid = ALC262_DIGOUT_NID, 11145 .num_channel_mode = ARRAY_SIZE(alc262_modes), 11146 .channel_mode = alc262_modes, 11147 .input_mux = &alc262_capture_source, 11148 .unsol_event = alc262_tyan_unsol_event, 11149 .init_hook = alc262_tyan_automute, 11150 }, 11151 }; 11152 11153 static int patch_alc262(struct hda_codec *codec) 11154 { 11155 struct alc_spec *spec; 11156 int board_config; 11157 int err; 11158 11159 spec = kzalloc(sizeof(*spec), GFP_KERNEL); 11160 if (spec == NULL) 11161 return -ENOMEM; 11162 11163 codec->spec = spec; 11164 #if 0 11165 /* pshou 07/11/05 set a zero PCM sample to DAC when FIFO is 11166 * under-run 11167 */ 11168 { 11169 int tmp; 11170 snd_hda_codec_write(codec, 0x1a, 0, AC_VERB_SET_COEF_INDEX, 7); 11171 tmp = snd_hda_codec_read(codec, 0x20, 0, AC_VERB_GET_PROC_COEF, 0); 11172 snd_hda_codec_write(codec, 0x1a, 0, AC_VERB_SET_COEF_INDEX, 7); 11173 snd_hda_codec_write(codec, 0x1a, 0, AC_VERB_SET_PROC_COEF, tmp | 0x80); 11174 } 11175 #endif 11176 11177 alc_fix_pll_init(codec, 0x20, 0x0a, 10); 11178 11179 board_config = snd_hda_check_board_config(codec, ALC262_MODEL_LAST, 11180 alc262_models, 11181 alc262_cfg_tbl); 11182 11183 if (board_config < 0) { 11184 printk(KERN_INFO "hda_codec: Unknown model for ALC262, " 11185 "trying auto-probe from BIOS...\n"); 11186 board_config = ALC262_AUTO; 11187 } 11188 11189 if (board_config == ALC262_AUTO) { 11190 /* automatic parse from the BIOS config */ 11191 err = alc262_parse_auto_config(codec); 11192 if (err < 0) { 11193 alc_free(codec); 11194 return err; 11195 } else if (!err) { 11196 printk(KERN_INFO 11197 "hda_codec: Cannot set up configuration " 11198 "from BIOS. Using base mode...\n"); 11199 board_config = ALC262_BASIC; 11200 } 11201 } 11202 11203 if (!spec->no_analog) { 11204 err = snd_hda_attach_beep_device(codec, 0x1); 11205 if (err < 0) { 11206 alc_free(codec); 11207 return err; 11208 } 11209 } 11210 11211 if (board_config != ALC262_AUTO) 11212 setup_preset(spec, &alc262_presets[board_config]); 11213 11214 spec->stream_name_analog = "ALC262 Analog"; 11215 spec->stream_analog_playback = &alc262_pcm_analog_playback; 11216 spec->stream_analog_capture = &alc262_pcm_analog_capture; 11217 11218 spec->stream_name_digital = "ALC262 Digital"; 11219 spec->stream_digital_playback = &alc262_pcm_digital_playback; 11220 spec->stream_digital_capture = &alc262_pcm_digital_capture; 11221 11222 spec->capture_style = CAPT_MIX; 11223 if (!spec->adc_nids && spec->input_mux) { 11224 /* check whether NID 0x07 is valid */ 11225 unsigned int wcap = get_wcaps(codec, 0x07); 11226 11227 /* get type */ 11228 wcap = (wcap & AC_WCAP_TYPE) >> AC_WCAP_TYPE_SHIFT; 11229 if (wcap != AC_WID_AUD_IN) { 11230 spec->adc_nids = alc262_adc_nids_alt; 11231 spec->num_adc_nids = ARRAY_SIZE(alc262_adc_nids_alt); 11232 spec->capsrc_nids = alc262_capsrc_nids_alt; 11233 } else { 11234 spec->adc_nids = alc262_adc_nids; 11235 spec->num_adc_nids = ARRAY_SIZE(alc262_adc_nids); 11236 spec->capsrc_nids = alc262_capsrc_nids; 11237 } 11238 } 11239 if (!spec->cap_mixer && !spec->no_analog) 11240 set_capture_mixer(spec); 11241 if (!spec->no_analog) 11242 set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT); 11243 11244 spec->vmaster_nid = 0x0c; 11245 11246 codec->patch_ops = alc_patch_ops; 11247 if (board_config == ALC262_AUTO) 11248 spec->init_hook = alc262_auto_init; 11249 #ifdef CONFIG_SND_HDA_POWER_SAVE 11250 if (!spec->loopback.amplist) 11251 spec->loopback.amplist = alc262_loopbacks; 11252 #endif 11253 codec->proc_widget_hook = print_realtek_coef; 11254 11255 return 0; 11256 } 11257 11258 /* 11259 * ALC268 channel source setting (2 channel) 11260 */ 11261 #define ALC268_DIGOUT_NID ALC880_DIGOUT_NID 11262 #define alc268_modes alc260_modes 11263 11264 static hda_nid_t alc268_dac_nids[2] = { 11265 /* front, hp */ 11266 0x02, 0x03 11267 }; 11268 11269 static hda_nid_t alc268_adc_nids[2] = { 11270 /* ADC0-1 */ 11271 0x08, 0x07 11272 }; 11273 11274 static hda_nid_t alc268_adc_nids_alt[1] = { 11275 /* ADC0 */ 11276 0x08 11277 }; 11278 11279 static hda_nid_t alc268_capsrc_nids[2] = { 0x23, 0x24 }; 11280 11281 static struct snd_kcontrol_new alc268_base_mixer[] = { 11282 /* output mixer control */ 11283 HDA_CODEC_VOLUME("Front Playback Volume", 0x2, 0x0, HDA_OUTPUT), 11284 HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT), 11285 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x3, 0x0, HDA_OUTPUT), 11286 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT), 11287 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), 11288 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT), 11289 HDA_CODEC_VOLUME("Line In Boost", 0x1a, 0, HDA_INPUT), 11290 { } 11291 }; 11292 11293 /* bind Beep switches of both NID 0x0f and 0x10 */ 11294 static struct hda_bind_ctls alc268_bind_beep_sw = { 11295 .ops = &snd_hda_bind_sw, 11296 .values = { 11297 HDA_COMPOSE_AMP_VAL(0x0f, 3, 1, HDA_INPUT), 11298 HDA_COMPOSE_AMP_VAL(0x10, 3, 1, HDA_INPUT), 11299 0 11300 }, 11301 }; 11302 11303 static struct snd_kcontrol_new alc268_beep_mixer[] = { 11304 HDA_CODEC_VOLUME("Beep Playback Volume", 0x1d, 0x0, HDA_INPUT), 11305 HDA_BIND_SW("Beep Playback Switch", &alc268_bind_beep_sw), 11306 { } 11307 }; 11308 11309 static struct hda_verb alc268_eapd_verbs[] = { 11310 {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2}, 11311 {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2}, 11312 { } 11313 }; 11314 11315 /* Toshiba specific */ 11316 #define alc268_toshiba_automute alc262_hippo_automute 11317 11318 static struct hda_verb alc268_toshiba_verbs[] = { 11319 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, 11320 { } /* end */ 11321 }; 11322 11323 static struct hda_input_mux alc268_acer_lc_capture_source = { 11324 .num_items = 2, 11325 .items = { 11326 { "i-Mic", 0x6 }, 11327 { "E-Mic", 0x0 }, 11328 }, 11329 }; 11330 11331 /* Acer specific */ 11332 /* bind volumes of both NID 0x02 and 0x03 */ 11333 static struct hda_bind_ctls alc268_acer_bind_master_vol = { 11334 .ops = &snd_hda_bind_vol, 11335 .values = { 11336 HDA_COMPOSE_AMP_VAL(0x02, 3, 0, HDA_OUTPUT), 11337 HDA_COMPOSE_AMP_VAL(0x03, 3, 0, HDA_OUTPUT), 11338 0 11339 }, 11340 }; 11341 11342 /* mute/unmute internal speaker according to the hp jack and mute state */ 11343 static void alc268_acer_automute(struct hda_codec *codec, int force) 11344 { 11345 struct alc_spec *spec = codec->spec; 11346 unsigned int mute; 11347 11348 if (force || !spec->sense_updated) { 11349 unsigned int present; 11350 present = snd_hda_codec_read(codec, 0x14, 0, 11351 AC_VERB_GET_PIN_SENSE, 0); 11352 spec->jack_present = (present & 0x80000000) != 0; 11353 spec->sense_updated = 1; 11354 } 11355 if (spec->jack_present) 11356 mute = HDA_AMP_MUTE; /* mute internal speaker */ 11357 else /* unmute internal speaker if necessary */ 11358 mute = snd_hda_codec_amp_read(codec, 0x14, 0, HDA_OUTPUT, 0); 11359 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0, 11360 HDA_AMP_MUTE, mute); 11361 } 11362 11363 11364 /* bind hp and internal speaker mute (with plug check) */ 11365 static int alc268_acer_master_sw_put(struct snd_kcontrol *kcontrol, 11366 struct snd_ctl_elem_value *ucontrol) 11367 { 11368 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 11369 long *valp = ucontrol->value.integer.value; 11370 int change; 11371 11372 change = snd_hda_codec_amp_update(codec, 0x14, 0, HDA_OUTPUT, 0, 11373 HDA_AMP_MUTE, 11374 valp[0] ? 0 : HDA_AMP_MUTE); 11375 change |= snd_hda_codec_amp_update(codec, 0x14, 1, HDA_OUTPUT, 0, 11376 HDA_AMP_MUTE, 11377 valp[1] ? 0 : HDA_AMP_MUTE); 11378 if (change) 11379 alc268_acer_automute(codec, 0); 11380 return change; 11381 } 11382 11383 static struct snd_kcontrol_new alc268_acer_aspire_one_mixer[] = { 11384 /* output mixer control */ 11385 HDA_BIND_VOL("Master Playback Volume", &alc268_acer_bind_master_vol), 11386 { 11387 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 11388 .name = "Master Playback Switch", 11389 .info = snd_hda_mixer_amp_switch_info, 11390 .get = snd_hda_mixer_amp_switch_get, 11391 .put = alc268_acer_master_sw_put, 11392 .private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT), 11393 }, 11394 HDA_CODEC_VOLUME("Mic Boost Capture Volume", 0x18, 0, HDA_INPUT), 11395 { } 11396 }; 11397 11398 static struct snd_kcontrol_new alc268_acer_mixer[] = { 11399 /* output mixer control */ 11400 HDA_BIND_VOL("Master Playback Volume", &alc268_acer_bind_master_vol), 11401 { 11402 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 11403 .name = "Master Playback Switch", 11404 .info = snd_hda_mixer_amp_switch_info, 11405 .get = snd_hda_mixer_amp_switch_get, 11406 .put = alc268_acer_master_sw_put, 11407 .private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT), 11408 }, 11409 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), 11410 HDA_CODEC_VOLUME("Internal Mic Boost", 0x19, 0, HDA_INPUT), 11411 HDA_CODEC_VOLUME("Line In Boost", 0x1a, 0, HDA_INPUT), 11412 { } 11413 }; 11414 11415 static struct snd_kcontrol_new alc268_acer_dmic_mixer[] = { 11416 /* output mixer control */ 11417 HDA_BIND_VOL("Master Playback Volume", &alc268_acer_bind_master_vol), 11418 { 11419 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 11420 .name = "Master Playback Switch", 11421 .info = snd_hda_mixer_amp_switch_info, 11422 .get = snd_hda_mixer_amp_switch_get, 11423 .put = alc268_acer_master_sw_put, 11424 .private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT), 11425 }, 11426 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), 11427 HDA_CODEC_VOLUME("Line In Boost", 0x1a, 0, HDA_INPUT), 11428 { } 11429 }; 11430 11431 static struct hda_verb alc268_acer_aspire_one_verbs[] = { 11432 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 11433 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 11434 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, 11435 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT}, 11436 {0x23, AC_VERB_SET_CONNECT_SEL, 0x06}, 11437 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, 0xa017}, 11438 { } 11439 }; 11440 11441 static struct hda_verb alc268_acer_verbs[] = { 11442 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, /* internal dmic? */ 11443 {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 11444 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 11445 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 11446 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, 11447 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, 11448 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, 11449 { } 11450 }; 11451 11452 /* unsolicited event for HP jack sensing */ 11453 static void alc268_toshiba_unsol_event(struct hda_codec *codec, 11454 unsigned int res) 11455 { 11456 if ((res >> 26) != ALC880_HP_EVENT) 11457 return; 11458 alc268_toshiba_automute(codec); 11459 } 11460 11461 static void alc268_acer_unsol_event(struct hda_codec *codec, 11462 unsigned int res) 11463 { 11464 if ((res >> 26) != ALC880_HP_EVENT) 11465 return; 11466 alc268_acer_automute(codec, 1); 11467 } 11468 11469 static void alc268_acer_init_hook(struct hda_codec *codec) 11470 { 11471 alc268_acer_automute(codec, 1); 11472 } 11473 11474 /* toggle speaker-output according to the hp-jack state */ 11475 static void alc268_aspire_one_speaker_automute(struct hda_codec *codec) 11476 { 11477 unsigned int present; 11478 unsigned char bits; 11479 11480 present = snd_hda_codec_read(codec, 0x15, 0, 11481 AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; 11482 bits = present ? AMP_IN_MUTE(0) : 0; 11483 snd_hda_codec_amp_stereo(codec, 0x0f, HDA_INPUT, 0, 11484 AMP_IN_MUTE(0), bits); 11485 snd_hda_codec_amp_stereo(codec, 0x0f, HDA_INPUT, 1, 11486 AMP_IN_MUTE(0), bits); 11487 } 11488 11489 11490 static void alc268_acer_mic_automute(struct hda_codec *codec) 11491 { 11492 unsigned int present; 11493 11494 present = snd_hda_codec_read(codec, 0x18, 0, 11495 AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; 11496 snd_hda_codec_write(codec, 0x23, 0, AC_VERB_SET_CONNECT_SEL, 11497 present ? 0x0 : 0x6); 11498 } 11499 11500 static void alc268_acer_lc_unsol_event(struct hda_codec *codec, 11501 unsigned int res) 11502 { 11503 if ((res >> 26) == ALC880_HP_EVENT) 11504 alc268_aspire_one_speaker_automute(codec); 11505 if ((res >> 26) == ALC880_MIC_EVENT) 11506 alc268_acer_mic_automute(codec); 11507 } 11508 11509 static void alc268_acer_lc_init_hook(struct hda_codec *codec) 11510 { 11511 alc268_aspire_one_speaker_automute(codec); 11512 alc268_acer_mic_automute(codec); 11513 } 11514 11515 static struct snd_kcontrol_new alc268_dell_mixer[] = { 11516 /* output mixer control */ 11517 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT), 11518 HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT), 11519 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT), 11520 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT), 11521 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), 11522 HDA_CODEC_VOLUME("Internal Mic Boost", 0x19, 0, HDA_INPUT), 11523 { } 11524 }; 11525 11526 static struct hda_verb alc268_dell_verbs[] = { 11527 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 11528 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 11529 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, 11530 { } 11531 }; 11532 11533 /* mute/unmute internal speaker according to the hp jack and mute state */ 11534 static void alc268_dell_automute(struct hda_codec *codec) 11535 { 11536 unsigned int present; 11537 unsigned int mute; 11538 11539 present = snd_hda_codec_read(codec, 0x15, 0, AC_VERB_GET_PIN_SENSE, 0); 11540 if (present & 0x80000000) 11541 mute = HDA_AMP_MUTE; 11542 else 11543 mute = snd_hda_codec_amp_read(codec, 0x15, 0, HDA_OUTPUT, 0); 11544 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0, 11545 HDA_AMP_MUTE, mute); 11546 } 11547 11548 static void alc268_dell_unsol_event(struct hda_codec *codec, 11549 unsigned int res) 11550 { 11551 if ((res >> 26) != ALC880_HP_EVENT) 11552 return; 11553 alc268_dell_automute(codec); 11554 } 11555 11556 #define alc268_dell_init_hook alc268_dell_automute 11557 11558 static struct snd_kcontrol_new alc267_quanta_il1_mixer[] = { 11559 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x2, 0x0, HDA_OUTPUT), 11560 HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT), 11561 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x3, 0x0, HDA_OUTPUT), 11562 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT), 11563 HDA_CODEC_VOLUME("Mic Capture Volume", 0x23, 0x0, HDA_OUTPUT), 11564 HDA_BIND_MUTE("Mic Capture Switch", 0x23, 2, HDA_OUTPUT), 11565 HDA_CODEC_VOLUME("Ext Mic Boost", 0x18, 0, HDA_INPUT), 11566 HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT), 11567 { } 11568 }; 11569 11570 static struct hda_verb alc267_quanta_il1_verbs[] = { 11571 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, 11572 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN}, 11573 { } 11574 }; 11575 11576 static void alc267_quanta_il1_hp_automute(struct hda_codec *codec) 11577 { 11578 unsigned int present; 11579 11580 present = snd_hda_codec_read(codec, 0x15, 0, AC_VERB_GET_PIN_SENSE, 0) 11581 & AC_PINSENSE_PRESENCE; 11582 snd_hda_codec_write(codec, 0x14, 0, AC_VERB_SET_PIN_WIDGET_CONTROL, 11583 present ? 0 : PIN_OUT); 11584 } 11585 11586 static void alc267_quanta_il1_mic_automute(struct hda_codec *codec) 11587 { 11588 unsigned int present; 11589 11590 present = snd_hda_codec_read(codec, 0x18, 0, 11591 AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; 11592 snd_hda_codec_write(codec, 0x23, 0, 11593 AC_VERB_SET_CONNECT_SEL, 11594 present ? 0x00 : 0x01); 11595 } 11596 11597 static void alc267_quanta_il1_automute(struct hda_codec *codec) 11598 { 11599 alc267_quanta_il1_hp_automute(codec); 11600 alc267_quanta_il1_mic_automute(codec); 11601 } 11602 11603 static void alc267_quanta_il1_unsol_event(struct hda_codec *codec, 11604 unsigned int res) 11605 { 11606 switch (res >> 26) { 11607 case ALC880_HP_EVENT: 11608 alc267_quanta_il1_hp_automute(codec); 11609 break; 11610 case ALC880_MIC_EVENT: 11611 alc267_quanta_il1_mic_automute(codec); 11612 break; 11613 } 11614 } 11615 11616 /* 11617 * generic initialization of ADC, input mixers and output mixers 11618 */ 11619 static struct hda_verb alc268_base_init_verbs[] = { 11620 /* Unmute DAC0-1 and set vol = 0 */ 11621 {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 11622 {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 11623 11624 /* 11625 * Set up output mixers (0x0c - 0x0e) 11626 */ 11627 /* set vol=0 to output mixers */ 11628 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 11629 {0x0e, AC_VERB_SET_CONNECT_SEL, 0x00}, 11630 11631 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 11632 {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 11633 11634 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40}, 11635 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0}, 11636 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40}, 11637 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24}, 11638 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24}, 11639 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20}, 11640 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20}, 11641 {0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20}, 11642 11643 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 11644 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 11645 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 11646 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 11647 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 11648 11649 /* set PCBEEP vol = 0, mute connections */ 11650 {0x1d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 11651 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 11652 {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 11653 11654 /* Unmute Selector 23h,24h and set the default input to mic-in */ 11655 11656 {0x23, AC_VERB_SET_CONNECT_SEL, 0x00}, 11657 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 11658 {0x24, AC_VERB_SET_CONNECT_SEL, 0x00}, 11659 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 11660 11661 { } 11662 }; 11663 11664 /* 11665 * generic initialization of ADC, input mixers and output mixers 11666 */ 11667 static struct hda_verb alc268_volume_init_verbs[] = { 11668 /* set output DAC */ 11669 {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 11670 {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 11671 11672 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24}, 11673 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24}, 11674 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20}, 11675 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20}, 11676 {0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20}, 11677 11678 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 11679 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 11680 {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 11681 11682 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 11683 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 11684 11685 /* set PCBEEP vol = 0, mute connections */ 11686 {0x1d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 11687 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 11688 {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 11689 11690 { } 11691 }; 11692 11693 static struct snd_kcontrol_new alc268_capture_alt_mixer[] = { 11694 HDA_CODEC_VOLUME("Capture Volume", 0x23, 0x0, HDA_OUTPUT), 11695 HDA_CODEC_MUTE("Capture Switch", 0x23, 0x0, HDA_OUTPUT), 11696 { 11697 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 11698 /* The multiple "Capture Source" controls confuse alsamixer 11699 * So call somewhat different.. 11700 */ 11701 /* .name = "Capture Source", */ 11702 .name = "Input Source", 11703 .count = 1, 11704 .info = alc_mux_enum_info, 11705 .get = alc_mux_enum_get, 11706 .put = alc_mux_enum_put, 11707 }, 11708 { } /* end */ 11709 }; 11710 11711 static struct snd_kcontrol_new alc268_capture_mixer[] = { 11712 HDA_CODEC_VOLUME("Capture Volume", 0x23, 0x0, HDA_OUTPUT), 11713 HDA_CODEC_MUTE("Capture Switch", 0x23, 0x0, HDA_OUTPUT), 11714 HDA_CODEC_VOLUME_IDX("Capture Volume", 1, 0x24, 0x0, HDA_OUTPUT), 11715 HDA_CODEC_MUTE_IDX("Capture Switch", 1, 0x24, 0x0, HDA_OUTPUT), 11716 { 11717 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 11718 /* The multiple "Capture Source" controls confuse alsamixer 11719 * So call somewhat different.. 11720 */ 11721 /* .name = "Capture Source", */ 11722 .name = "Input Source", 11723 .count = 2, 11724 .info = alc_mux_enum_info, 11725 .get = alc_mux_enum_get, 11726 .put = alc_mux_enum_put, 11727 }, 11728 { } /* end */ 11729 }; 11730 11731 static struct hda_input_mux alc268_capture_source = { 11732 .num_items = 4, 11733 .items = { 11734 { "Mic", 0x0 }, 11735 { "Front Mic", 0x1 }, 11736 { "Line", 0x2 }, 11737 { "CD", 0x3 }, 11738 }, 11739 }; 11740 11741 static struct hda_input_mux alc268_acer_capture_source = { 11742 .num_items = 3, 11743 .items = { 11744 { "Mic", 0x0 }, 11745 { "Internal Mic", 0x1 }, 11746 { "Line", 0x2 }, 11747 }, 11748 }; 11749 11750 static struct hda_input_mux alc268_acer_dmic_capture_source = { 11751 .num_items = 3, 11752 .items = { 11753 { "Mic", 0x0 }, 11754 { "Internal Mic", 0x6 }, 11755 { "Line", 0x2 }, 11756 }, 11757 }; 11758 11759 #ifdef CONFIG_SND_DEBUG 11760 static struct snd_kcontrol_new alc268_test_mixer[] = { 11761 /* Volume widgets */ 11762 HDA_CODEC_VOLUME("LOUT1 Playback Volume", 0x02, 0x0, HDA_OUTPUT), 11763 HDA_CODEC_VOLUME("LOUT2 Playback Volume", 0x03, 0x0, HDA_OUTPUT), 11764 HDA_BIND_MUTE_MONO("Mono sum Playback Switch", 0x0e, 1, 2, HDA_INPUT), 11765 HDA_BIND_MUTE("LINE-OUT sum Playback Switch", 0x0f, 2, HDA_INPUT), 11766 HDA_BIND_MUTE("HP-OUT sum Playback Switch", 0x10, 2, HDA_INPUT), 11767 HDA_BIND_MUTE("LINE-OUT Playback Switch", 0x14, 2, HDA_OUTPUT), 11768 HDA_BIND_MUTE("HP-OUT Playback Switch", 0x15, 2, HDA_OUTPUT), 11769 HDA_BIND_MUTE("Mono Playback Switch", 0x16, 2, HDA_OUTPUT), 11770 HDA_CODEC_VOLUME("MIC1 Capture Volume", 0x18, 0x0, HDA_INPUT), 11771 HDA_BIND_MUTE("MIC1 Capture Switch", 0x18, 2, HDA_OUTPUT), 11772 HDA_CODEC_VOLUME("MIC2 Capture Volume", 0x19, 0x0, HDA_INPUT), 11773 HDA_CODEC_VOLUME("LINE1 Capture Volume", 0x1a, 0x0, HDA_INPUT), 11774 HDA_BIND_MUTE("LINE1 Capture Switch", 0x1a, 2, HDA_OUTPUT), 11775 /* The below appears problematic on some hardwares */ 11776 /*HDA_CODEC_VOLUME("PCBEEP Playback Volume", 0x1d, 0x0, HDA_INPUT),*/ 11777 HDA_CODEC_VOLUME("PCM-IN1 Capture Volume", 0x23, 0x0, HDA_OUTPUT), 11778 HDA_BIND_MUTE("PCM-IN1 Capture Switch", 0x23, 2, HDA_OUTPUT), 11779 HDA_CODEC_VOLUME("PCM-IN2 Capture Volume", 0x24, 0x0, HDA_OUTPUT), 11780 HDA_BIND_MUTE("PCM-IN2 Capture Switch", 0x24, 2, HDA_OUTPUT), 11781 11782 /* Modes for retasking pin widgets */ 11783 ALC_PIN_MODE("LINE-OUT pin mode", 0x14, ALC_PIN_DIR_INOUT), 11784 ALC_PIN_MODE("HP-OUT pin mode", 0x15, ALC_PIN_DIR_INOUT), 11785 ALC_PIN_MODE("MIC1 pin mode", 0x18, ALC_PIN_DIR_INOUT), 11786 ALC_PIN_MODE("LINE1 pin mode", 0x1a, ALC_PIN_DIR_INOUT), 11787 11788 /* Controls for GPIO pins, assuming they are configured as outputs */ 11789 ALC_GPIO_DATA_SWITCH("GPIO pin 0", 0x01, 0x01), 11790 ALC_GPIO_DATA_SWITCH("GPIO pin 1", 0x01, 0x02), 11791 ALC_GPIO_DATA_SWITCH("GPIO pin 2", 0x01, 0x04), 11792 ALC_GPIO_DATA_SWITCH("GPIO pin 3", 0x01, 0x08), 11793 11794 /* Switches to allow the digital SPDIF output pin to be enabled. 11795 * The ALC268 does not have an SPDIF input. 11796 */ 11797 ALC_SPDIF_CTRL_SWITCH("SPDIF Playback Switch", 0x06, 0x01), 11798 11799 /* A switch allowing EAPD to be enabled. Some laptops seem to use 11800 * this output to turn on an external amplifier. 11801 */ 11802 ALC_EAPD_CTRL_SWITCH("LINE-OUT EAPD Enable Switch", 0x0f, 0x02), 11803 ALC_EAPD_CTRL_SWITCH("HP-OUT EAPD Enable Switch", 0x10, 0x02), 11804 11805 { } /* end */ 11806 }; 11807 #endif 11808 11809 /* create input playback/capture controls for the given pin */ 11810 static int alc268_new_analog_output(struct alc_spec *spec, hda_nid_t nid, 11811 const char *ctlname, int idx) 11812 { 11813 char name[32]; 11814 int err; 11815 11816 sprintf(name, "%s Playback Volume", ctlname); 11817 if (nid == 0x14) { 11818 err = add_control(spec, ALC_CTL_WIDGET_VOL, name, 11819 HDA_COMPOSE_AMP_VAL(0x02, 3, idx, 11820 HDA_OUTPUT)); 11821 if (err < 0) 11822 return err; 11823 } else if (nid == 0x15) { 11824 err = add_control(spec, ALC_CTL_WIDGET_VOL, name, 11825 HDA_COMPOSE_AMP_VAL(0x03, 3, idx, 11826 HDA_OUTPUT)); 11827 if (err < 0) 11828 return err; 11829 } else 11830 return -1; 11831 sprintf(name, "%s Playback Switch", ctlname); 11832 err = add_control(spec, ALC_CTL_WIDGET_MUTE, name, 11833 HDA_COMPOSE_AMP_VAL(nid, 3, idx, HDA_OUTPUT)); 11834 if (err < 0) 11835 return err; 11836 return 0; 11837 } 11838 11839 /* add playback controls from the parsed DAC table */ 11840 static int alc268_auto_create_multi_out_ctls(struct alc_spec *spec, 11841 const struct auto_pin_cfg *cfg) 11842 { 11843 hda_nid_t nid; 11844 int err; 11845 11846 spec->multiout.num_dacs = 2; /* only use one dac */ 11847 spec->multiout.dac_nids = spec->private_dac_nids; 11848 spec->multiout.dac_nids[0] = 2; 11849 spec->multiout.dac_nids[1] = 3; 11850 11851 nid = cfg->line_out_pins[0]; 11852 if (nid) 11853 alc268_new_analog_output(spec, nid, "Front", 0); 11854 11855 nid = cfg->speaker_pins[0]; 11856 if (nid == 0x1d) { 11857 err = add_control(spec, ALC_CTL_WIDGET_VOL, 11858 "Speaker Playback Volume", 11859 HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_INPUT)); 11860 if (err < 0) 11861 return err; 11862 } 11863 nid = cfg->hp_pins[0]; 11864 if (nid) 11865 alc268_new_analog_output(spec, nid, "Headphone", 0); 11866 11867 nid = cfg->line_out_pins[1] | cfg->line_out_pins[2]; 11868 if (nid == 0x16) { 11869 err = add_control(spec, ALC_CTL_WIDGET_MUTE, 11870 "Mono Playback Switch", 11871 HDA_COMPOSE_AMP_VAL(nid, 2, 0, HDA_INPUT)); 11872 if (err < 0) 11873 return err; 11874 } 11875 return 0; 11876 } 11877 11878 /* create playback/capture controls for input pins */ 11879 static int alc268_auto_create_analog_input_ctls(struct alc_spec *spec, 11880 const struct auto_pin_cfg *cfg) 11881 { 11882 struct hda_input_mux *imux = &spec->private_imux[0]; 11883 int i, idx1; 11884 11885 for (i = 0; i < AUTO_PIN_LAST; i++) { 11886 switch(cfg->input_pins[i]) { 11887 case 0x18: 11888 idx1 = 0; /* Mic 1 */ 11889 break; 11890 case 0x19: 11891 idx1 = 1; /* Mic 2 */ 11892 break; 11893 case 0x1a: 11894 idx1 = 2; /* Line In */ 11895 break; 11896 case 0x1c: 11897 idx1 = 3; /* CD */ 11898 break; 11899 case 0x12: 11900 case 0x13: 11901 idx1 = 6; /* digital mics */ 11902 break; 11903 default: 11904 continue; 11905 } 11906 imux->items[imux->num_items].label = auto_pin_cfg_labels[i]; 11907 imux->items[imux->num_items].index = idx1; 11908 imux->num_items++; 11909 } 11910 return 0; 11911 } 11912 11913 static void alc268_auto_init_mono_speaker_out(struct hda_codec *codec) 11914 { 11915 struct alc_spec *spec = codec->spec; 11916 hda_nid_t speaker_nid = spec->autocfg.speaker_pins[0]; 11917 hda_nid_t hp_nid = spec->autocfg.hp_pins[0]; 11918 hda_nid_t line_nid = spec->autocfg.line_out_pins[0]; 11919 unsigned int dac_vol1, dac_vol2; 11920 11921 if (speaker_nid) { 11922 snd_hda_codec_write(codec, speaker_nid, 0, 11923 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT); 11924 snd_hda_codec_write(codec, 0x0f, 0, 11925 AC_VERB_SET_AMP_GAIN_MUTE, 11926 AMP_IN_UNMUTE(1)); 11927 snd_hda_codec_write(codec, 0x10, 0, 11928 AC_VERB_SET_AMP_GAIN_MUTE, 11929 AMP_IN_UNMUTE(1)); 11930 } else { 11931 snd_hda_codec_write(codec, 0x0f, 0, 11932 AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)); 11933 snd_hda_codec_write(codec, 0x10, 0, 11934 AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)); 11935 } 11936 11937 dac_vol1 = dac_vol2 = 0xb000 | 0x40; /* set max volume */ 11938 if (line_nid == 0x14) 11939 dac_vol2 = AMP_OUT_ZERO; 11940 else if (line_nid == 0x15) 11941 dac_vol1 = AMP_OUT_ZERO; 11942 if (hp_nid == 0x14) 11943 dac_vol2 = AMP_OUT_ZERO; 11944 else if (hp_nid == 0x15) 11945 dac_vol1 = AMP_OUT_ZERO; 11946 if (line_nid != 0x16 || hp_nid != 0x16 || 11947 spec->autocfg.line_out_pins[1] != 0x16 || 11948 spec->autocfg.line_out_pins[2] != 0x16) 11949 dac_vol1 = dac_vol2 = AMP_OUT_ZERO; 11950 11951 snd_hda_codec_write(codec, 0x02, 0, 11952 AC_VERB_SET_AMP_GAIN_MUTE, dac_vol1); 11953 snd_hda_codec_write(codec, 0x03, 0, 11954 AC_VERB_SET_AMP_GAIN_MUTE, dac_vol2); 11955 } 11956 11957 /* pcm configuration: identiacal with ALC880 */ 11958 #define alc268_pcm_analog_playback alc880_pcm_analog_playback 11959 #define alc268_pcm_analog_capture alc880_pcm_analog_capture 11960 #define alc268_pcm_analog_alt_capture alc880_pcm_analog_alt_capture 11961 #define alc268_pcm_digital_playback alc880_pcm_digital_playback 11962 11963 /* 11964 * BIOS auto configuration 11965 */ 11966 static int alc268_parse_auto_config(struct hda_codec *codec) 11967 { 11968 struct alc_spec *spec = codec->spec; 11969 int err; 11970 static hda_nid_t alc268_ignore[] = { 0 }; 11971 11972 err = snd_hda_parse_pin_def_config(codec, &spec->autocfg, 11973 alc268_ignore); 11974 if (err < 0) 11975 return err; 11976 if (!spec->autocfg.line_outs) { 11977 if (spec->autocfg.dig_outs || spec->autocfg.dig_in_pin) { 11978 spec->multiout.max_channels = 2; 11979 spec->no_analog = 1; 11980 goto dig_only; 11981 } 11982 return 0; /* can't find valid BIOS pin config */ 11983 } 11984 err = alc268_auto_create_multi_out_ctls(spec, &spec->autocfg); 11985 if (err < 0) 11986 return err; 11987 err = alc268_auto_create_analog_input_ctls(spec, &spec->autocfg); 11988 if (err < 0) 11989 return err; 11990 11991 spec->multiout.max_channels = 2; 11992 11993 dig_only: 11994 /* digital only support output */ 11995 if (spec->autocfg.dig_outs) { 11996 spec->multiout.dig_out_nid = ALC268_DIGOUT_NID; 11997 spec->dig_out_type = spec->autocfg.dig_out_type[0]; 11998 } 11999 if (spec->kctls.list) 12000 add_mixer(spec, spec->kctls.list); 12001 12002 if (!spec->no_analog && spec->autocfg.speaker_pins[0] != 0x1d) 12003 add_mixer(spec, alc268_beep_mixer); 12004 12005 add_verb(spec, alc268_volume_init_verbs); 12006 spec->num_mux_defs = 1; 12007 spec->input_mux = &spec->private_imux[0]; 12008 12009 err = alc_auto_add_mic_boost(codec); 12010 if (err < 0) 12011 return err; 12012 12013 return 1; 12014 } 12015 12016 #define alc268_auto_init_multi_out alc882_auto_init_multi_out 12017 #define alc268_auto_init_hp_out alc882_auto_init_hp_out 12018 #define alc268_auto_init_analog_input alc882_auto_init_analog_input 12019 12020 /* init callback for auto-configuration model -- overriding the default init */ 12021 static void alc268_auto_init(struct hda_codec *codec) 12022 { 12023 struct alc_spec *spec = codec->spec; 12024 alc268_auto_init_multi_out(codec); 12025 alc268_auto_init_hp_out(codec); 12026 alc268_auto_init_mono_speaker_out(codec); 12027 alc268_auto_init_analog_input(codec); 12028 if (spec->unsol_event) 12029 alc_inithook(codec); 12030 } 12031 12032 /* 12033 * configuration and preset 12034 */ 12035 static const char *alc268_models[ALC268_MODEL_LAST] = { 12036 [ALC267_QUANTA_IL1] = "quanta-il1", 12037 [ALC268_3ST] = "3stack", 12038 [ALC268_TOSHIBA] = "toshiba", 12039 [ALC268_ACER] = "acer", 12040 [ALC268_ACER_DMIC] = "acer-dmic", 12041 [ALC268_ACER_ASPIRE_ONE] = "acer-aspire", 12042 [ALC268_DELL] = "dell", 12043 [ALC268_ZEPTO] = "zepto", 12044 #ifdef CONFIG_SND_DEBUG 12045 [ALC268_TEST] = "test", 12046 #endif 12047 [ALC268_AUTO] = "auto", 12048 }; 12049 12050 static struct snd_pci_quirk alc268_cfg_tbl[] = { 12051 SND_PCI_QUIRK(0x1025, 0x011e, "Acer Aspire 5720z", ALC268_ACER), 12052 SND_PCI_QUIRK(0x1025, 0x0126, "Acer", ALC268_ACER), 12053 SND_PCI_QUIRK(0x1025, 0x012e, "Acer Aspire 5310", ALC268_ACER), 12054 SND_PCI_QUIRK(0x1025, 0x0130, "Acer Extensa 5210", ALC268_ACER), 12055 SND_PCI_QUIRK(0x1025, 0x0136, "Acer Aspire 5315", ALC268_ACER), 12056 SND_PCI_QUIRK(0x1025, 0x015b, "Acer Aspire One", 12057 ALC268_ACER_ASPIRE_ONE), 12058 SND_PCI_QUIRK(0x1028, 0x0253, "Dell OEM", ALC268_DELL), 12059 SND_PCI_QUIRK(0x1028, 0x02b0, "Dell Inspiron Mini9", ALC268_DELL), 12060 SND_PCI_QUIRK(0x103c, 0x30cc, "TOSHIBA", ALC268_TOSHIBA), 12061 SND_PCI_QUIRK(0x1043, 0x1205, "ASUS W7J", ALC268_3ST), 12062 SND_PCI_QUIRK(0x1179, 0xff10, "TOSHIBA A205", ALC268_TOSHIBA), 12063 SND_PCI_QUIRK(0x1179, 0xff50, "TOSHIBA A305", ALC268_TOSHIBA), 12064 SND_PCI_QUIRK(0x1179, 0xff64, "TOSHIBA L305", ALC268_TOSHIBA), 12065 SND_PCI_QUIRK(0x14c0, 0x0025, "COMPAL IFL90/JFL-92", ALC268_TOSHIBA), 12066 SND_PCI_QUIRK(0x152d, 0x0763, "Diverse (CPR2000)", ALC268_ACER), 12067 SND_PCI_QUIRK(0x152d, 0x0771, "Quanta IL1", ALC267_QUANTA_IL1), 12068 SND_PCI_QUIRK(0x1170, 0x0040, "ZEPTO", ALC268_ZEPTO), 12069 {} 12070 }; 12071 12072 static struct alc_config_preset alc268_presets[] = { 12073 [ALC267_QUANTA_IL1] = { 12074 .mixers = { alc267_quanta_il1_mixer, alc268_beep_mixer }, 12075 .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs, 12076 alc267_quanta_il1_verbs }, 12077 .num_dacs = ARRAY_SIZE(alc268_dac_nids), 12078 .dac_nids = alc268_dac_nids, 12079 .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt), 12080 .adc_nids = alc268_adc_nids_alt, 12081 .hp_nid = 0x03, 12082 .num_channel_mode = ARRAY_SIZE(alc268_modes), 12083 .channel_mode = alc268_modes, 12084 .input_mux = &alc268_capture_source, 12085 .unsol_event = alc267_quanta_il1_unsol_event, 12086 .init_hook = alc267_quanta_il1_automute, 12087 }, 12088 [ALC268_3ST] = { 12089 .mixers = { alc268_base_mixer, alc268_capture_alt_mixer, 12090 alc268_beep_mixer }, 12091 .init_verbs = { alc268_base_init_verbs }, 12092 .num_dacs = ARRAY_SIZE(alc268_dac_nids), 12093 .dac_nids = alc268_dac_nids, 12094 .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt), 12095 .adc_nids = alc268_adc_nids_alt, 12096 .capsrc_nids = alc268_capsrc_nids, 12097 .hp_nid = 0x03, 12098 .dig_out_nid = ALC268_DIGOUT_NID, 12099 .num_channel_mode = ARRAY_SIZE(alc268_modes), 12100 .channel_mode = alc268_modes, 12101 .input_mux = &alc268_capture_source, 12102 }, 12103 [ALC268_TOSHIBA] = { 12104 .mixers = { alc268_base_mixer, alc268_capture_alt_mixer, 12105 alc268_beep_mixer }, 12106 .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs, 12107 alc268_toshiba_verbs }, 12108 .num_dacs = ARRAY_SIZE(alc268_dac_nids), 12109 .dac_nids = alc268_dac_nids, 12110 .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt), 12111 .adc_nids = alc268_adc_nids_alt, 12112 .capsrc_nids = alc268_capsrc_nids, 12113 .hp_nid = 0x03, 12114 .num_channel_mode = ARRAY_SIZE(alc268_modes), 12115 .channel_mode = alc268_modes, 12116 .input_mux = &alc268_capture_source, 12117 .unsol_event = alc268_toshiba_unsol_event, 12118 .init_hook = alc268_toshiba_automute, 12119 }, 12120 [ALC268_ACER] = { 12121 .mixers = { alc268_acer_mixer, alc268_capture_alt_mixer, 12122 alc268_beep_mixer }, 12123 .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs, 12124 alc268_acer_verbs }, 12125 .num_dacs = ARRAY_SIZE(alc268_dac_nids), 12126 .dac_nids = alc268_dac_nids, 12127 .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt), 12128 .adc_nids = alc268_adc_nids_alt, 12129 .capsrc_nids = alc268_capsrc_nids, 12130 .hp_nid = 0x02, 12131 .num_channel_mode = ARRAY_SIZE(alc268_modes), 12132 .channel_mode = alc268_modes, 12133 .input_mux = &alc268_acer_capture_source, 12134 .unsol_event = alc268_acer_unsol_event, 12135 .init_hook = alc268_acer_init_hook, 12136 }, 12137 [ALC268_ACER_DMIC] = { 12138 .mixers = { alc268_acer_dmic_mixer, alc268_capture_alt_mixer, 12139 alc268_beep_mixer }, 12140 .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs, 12141 alc268_acer_verbs }, 12142 .num_dacs = ARRAY_SIZE(alc268_dac_nids), 12143 .dac_nids = alc268_dac_nids, 12144 .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt), 12145 .adc_nids = alc268_adc_nids_alt, 12146 .capsrc_nids = alc268_capsrc_nids, 12147 .hp_nid = 0x02, 12148 .num_channel_mode = ARRAY_SIZE(alc268_modes), 12149 .channel_mode = alc268_modes, 12150 .input_mux = &alc268_acer_dmic_capture_source, 12151 .unsol_event = alc268_acer_unsol_event, 12152 .init_hook = alc268_acer_init_hook, 12153 }, 12154 [ALC268_ACER_ASPIRE_ONE] = { 12155 .mixers = { alc268_acer_aspire_one_mixer, 12156 alc268_beep_mixer, 12157 alc268_capture_alt_mixer }, 12158 .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs, 12159 alc268_acer_aspire_one_verbs }, 12160 .num_dacs = ARRAY_SIZE(alc268_dac_nids), 12161 .dac_nids = alc268_dac_nids, 12162 .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt), 12163 .adc_nids = alc268_adc_nids_alt, 12164 .capsrc_nids = alc268_capsrc_nids, 12165 .hp_nid = 0x03, 12166 .num_channel_mode = ARRAY_SIZE(alc268_modes), 12167 .channel_mode = alc268_modes, 12168 .input_mux = &alc268_acer_lc_capture_source, 12169 .unsol_event = alc268_acer_lc_unsol_event, 12170 .init_hook = alc268_acer_lc_init_hook, 12171 }, 12172 [ALC268_DELL] = { 12173 .mixers = { alc268_dell_mixer, alc268_beep_mixer }, 12174 .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs, 12175 alc268_dell_verbs }, 12176 .num_dacs = ARRAY_SIZE(alc268_dac_nids), 12177 .dac_nids = alc268_dac_nids, 12178 .hp_nid = 0x02, 12179 .num_channel_mode = ARRAY_SIZE(alc268_modes), 12180 .channel_mode = alc268_modes, 12181 .unsol_event = alc268_dell_unsol_event, 12182 .init_hook = alc268_dell_init_hook, 12183 .input_mux = &alc268_capture_source, 12184 }, 12185 [ALC268_ZEPTO] = { 12186 .mixers = { alc268_base_mixer, alc268_capture_alt_mixer, 12187 alc268_beep_mixer }, 12188 .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs, 12189 alc268_toshiba_verbs }, 12190 .num_dacs = ARRAY_SIZE(alc268_dac_nids), 12191 .dac_nids = alc268_dac_nids, 12192 .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt), 12193 .adc_nids = alc268_adc_nids_alt, 12194 .capsrc_nids = alc268_capsrc_nids, 12195 .hp_nid = 0x03, 12196 .dig_out_nid = ALC268_DIGOUT_NID, 12197 .num_channel_mode = ARRAY_SIZE(alc268_modes), 12198 .channel_mode = alc268_modes, 12199 .input_mux = &alc268_capture_source, 12200 .unsol_event = alc268_toshiba_unsol_event, 12201 .init_hook = alc268_toshiba_automute 12202 }, 12203 #ifdef CONFIG_SND_DEBUG 12204 [ALC268_TEST] = { 12205 .mixers = { alc268_test_mixer, alc268_capture_mixer }, 12206 .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs, 12207 alc268_volume_init_verbs }, 12208 .num_dacs = ARRAY_SIZE(alc268_dac_nids), 12209 .dac_nids = alc268_dac_nids, 12210 .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt), 12211 .adc_nids = alc268_adc_nids_alt, 12212 .capsrc_nids = alc268_capsrc_nids, 12213 .hp_nid = 0x03, 12214 .dig_out_nid = ALC268_DIGOUT_NID, 12215 .num_channel_mode = ARRAY_SIZE(alc268_modes), 12216 .channel_mode = alc268_modes, 12217 .input_mux = &alc268_capture_source, 12218 }, 12219 #endif 12220 }; 12221 12222 static int patch_alc268(struct hda_codec *codec) 12223 { 12224 struct alc_spec *spec; 12225 int board_config; 12226 int i, has_beep, err; 12227 12228 spec = kcalloc(1, sizeof(*spec), GFP_KERNEL); 12229 if (spec == NULL) 12230 return -ENOMEM; 12231 12232 codec->spec = spec; 12233 12234 board_config = snd_hda_check_board_config(codec, ALC268_MODEL_LAST, 12235 alc268_models, 12236 alc268_cfg_tbl); 12237 12238 if (board_config < 0 || board_config >= ALC268_MODEL_LAST) { 12239 printk(KERN_INFO "hda_codec: Unknown model for ALC268, " 12240 "trying auto-probe from BIOS...\n"); 12241 board_config = ALC268_AUTO; 12242 } 12243 12244 if (board_config == ALC268_AUTO) { 12245 /* automatic parse from the BIOS config */ 12246 err = alc268_parse_auto_config(codec); 12247 if (err < 0) { 12248 alc_free(codec); 12249 return err; 12250 } else if (!err) { 12251 printk(KERN_INFO 12252 "hda_codec: Cannot set up configuration " 12253 "from BIOS. Using base mode...\n"); 12254 board_config = ALC268_3ST; 12255 } 12256 } 12257 12258 if (board_config != ALC268_AUTO) 12259 setup_preset(spec, &alc268_presets[board_config]); 12260 12261 if (codec->vendor_id == 0x10ec0267) { 12262 spec->stream_name_analog = "ALC267 Analog"; 12263 spec->stream_name_digital = "ALC267 Digital"; 12264 } else { 12265 spec->stream_name_analog = "ALC268 Analog"; 12266 spec->stream_name_digital = "ALC268 Digital"; 12267 } 12268 12269 spec->stream_analog_playback = &alc268_pcm_analog_playback; 12270 spec->stream_analog_capture = &alc268_pcm_analog_capture; 12271 spec->stream_analog_alt_capture = &alc268_pcm_analog_alt_capture; 12272 12273 spec->stream_digital_playback = &alc268_pcm_digital_playback; 12274 12275 has_beep = 0; 12276 for (i = 0; i < spec->num_mixers; i++) { 12277 if (spec->mixers[i] == alc268_beep_mixer) { 12278 has_beep = 1; 12279 break; 12280 } 12281 } 12282 12283 if (has_beep) { 12284 err = snd_hda_attach_beep_device(codec, 0x1); 12285 if (err < 0) { 12286 alc_free(codec); 12287 return err; 12288 } 12289 if (!query_amp_caps(codec, 0x1d, HDA_INPUT)) 12290 /* override the amp caps for beep generator */ 12291 snd_hda_override_amp_caps(codec, 0x1d, HDA_INPUT, 12292 (0x0c << AC_AMPCAP_OFFSET_SHIFT) | 12293 (0x0c << AC_AMPCAP_NUM_STEPS_SHIFT) | 12294 (0x07 << AC_AMPCAP_STEP_SIZE_SHIFT) | 12295 (0 << AC_AMPCAP_MUTE_SHIFT)); 12296 } 12297 12298 if (!spec->no_analog && !spec->adc_nids && spec->input_mux) { 12299 /* check whether NID 0x07 is valid */ 12300 unsigned int wcap = get_wcaps(codec, 0x07); 12301 int i; 12302 12303 /* get type */ 12304 wcap = (wcap & AC_WCAP_TYPE) >> AC_WCAP_TYPE_SHIFT; 12305 if (wcap != AC_WID_AUD_IN || spec->input_mux->num_items == 1) { 12306 spec->adc_nids = alc268_adc_nids_alt; 12307 spec->num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt); 12308 add_mixer(spec, alc268_capture_alt_mixer); 12309 } else { 12310 spec->adc_nids = alc268_adc_nids; 12311 spec->num_adc_nids = ARRAY_SIZE(alc268_adc_nids); 12312 add_mixer(spec, alc268_capture_mixer); 12313 } 12314 spec->capsrc_nids = alc268_capsrc_nids; 12315 /* set default input source */ 12316 for (i = 0; i < spec->num_adc_nids; i++) 12317 snd_hda_codec_write_cache(codec, alc268_capsrc_nids[i], 12318 0, AC_VERB_SET_CONNECT_SEL, 12319 spec->input_mux->items[0].index); 12320 } 12321 12322 spec->vmaster_nid = 0x02; 12323 12324 codec->patch_ops = alc_patch_ops; 12325 if (board_config == ALC268_AUTO) 12326 spec->init_hook = alc268_auto_init; 12327 12328 codec->proc_widget_hook = print_realtek_coef; 12329 12330 return 0; 12331 } 12332 12333 /* 12334 * ALC269 channel source setting (2 channel) 12335 */ 12336 #define ALC269_DIGOUT_NID ALC880_DIGOUT_NID 12337 12338 #define alc269_dac_nids alc260_dac_nids 12339 12340 static hda_nid_t alc269_adc_nids[1] = { 12341 /* ADC1 */ 12342 0x08, 12343 }; 12344 12345 static hda_nid_t alc269_capsrc_nids[1] = { 12346 0x23, 12347 }; 12348 12349 /* NOTE: ADC2 (0x07) is connected from a recording *MIXER* (0x24), 12350 * not a mux! 12351 */ 12352 12353 static struct hda_input_mux alc269_eeepc_dmic_capture_source = { 12354 .num_items = 2, 12355 .items = { 12356 { "i-Mic", 0x5 }, 12357 { "e-Mic", 0x0 }, 12358 }, 12359 }; 12360 12361 static struct hda_input_mux alc269_eeepc_amic_capture_source = { 12362 .num_items = 2, 12363 .items = { 12364 { "i-Mic", 0x1 }, 12365 { "e-Mic", 0x0 }, 12366 }, 12367 }; 12368 12369 #define alc269_modes alc260_modes 12370 #define alc269_capture_source alc880_lg_lw_capture_source 12371 12372 static struct snd_kcontrol_new alc269_base_mixer[] = { 12373 HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT), 12374 HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT), 12375 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), 12376 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), 12377 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 12378 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 12379 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), 12380 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT), 12381 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT), 12382 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT), 12383 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT), 12384 HDA_CODEC_MUTE_MONO("Mono Playback Switch", 0x16, 2, 0x0, HDA_OUTPUT), 12385 { } /* end */ 12386 }; 12387 12388 static struct snd_kcontrol_new alc269_quanta_fl1_mixer[] = { 12389 /* output mixer control */ 12390 HDA_BIND_VOL("Master Playback Volume", &alc268_acer_bind_master_vol), 12391 { 12392 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 12393 .name = "Master Playback Switch", 12394 .info = snd_hda_mixer_amp_switch_info, 12395 .get = snd_hda_mixer_amp_switch_get, 12396 .put = alc268_acer_master_sw_put, 12397 .private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT), 12398 }, 12399 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 12400 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 12401 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), 12402 HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x01, HDA_INPUT), 12403 HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x01, HDA_INPUT), 12404 HDA_CODEC_VOLUME("Internal Mic Boost", 0x19, 0, HDA_INPUT), 12405 { } 12406 }; 12407 12408 static struct snd_kcontrol_new alc269_lifebook_mixer[] = { 12409 /* output mixer control */ 12410 HDA_BIND_VOL("Master Playback Volume", &alc268_acer_bind_master_vol), 12411 { 12412 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 12413 .name = "Master Playback Switch", 12414 .info = snd_hda_mixer_amp_switch_info, 12415 .get = snd_hda_mixer_amp_switch_get, 12416 .put = alc268_acer_master_sw_put, 12417 .private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT), 12418 }, 12419 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 12420 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 12421 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), 12422 HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x01, HDA_INPUT), 12423 HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x01, HDA_INPUT), 12424 HDA_CODEC_VOLUME("Internal Mic Boost", 0x19, 0, HDA_INPUT), 12425 HDA_CODEC_VOLUME("Dock Mic Playback Volume", 0x0b, 0x03, HDA_INPUT), 12426 HDA_CODEC_MUTE("Dock Mic Playback Switch", 0x0b, 0x03, HDA_INPUT), 12427 HDA_CODEC_VOLUME("Dock Mic Boost", 0x1b, 0, HDA_INPUT), 12428 { } 12429 }; 12430 12431 /* bind volumes of both NID 0x0c and 0x0d */ 12432 static struct hda_bind_ctls alc269_epc_bind_vol = { 12433 .ops = &snd_hda_bind_vol, 12434 .values = { 12435 HDA_COMPOSE_AMP_VAL(0x02, 3, 0, HDA_OUTPUT), 12436 HDA_COMPOSE_AMP_VAL(0x03, 3, 0, HDA_OUTPUT), 12437 0 12438 }, 12439 }; 12440 12441 static struct snd_kcontrol_new alc269_eeepc_mixer[] = { 12442 HDA_CODEC_MUTE("iSpeaker Playback Switch", 0x14, 0x0, HDA_OUTPUT), 12443 HDA_BIND_VOL("LineOut Playback Volume", &alc269_epc_bind_vol), 12444 HDA_CODEC_MUTE("LineOut Playback Switch", 0x15, 0x0, HDA_OUTPUT), 12445 { } /* end */ 12446 }; 12447 12448 /* capture mixer elements */ 12449 static struct snd_kcontrol_new alc269_epc_capture_mixer[] = { 12450 HDA_CODEC_VOLUME("Capture Volume", 0x08, 0x0, HDA_INPUT), 12451 HDA_CODEC_MUTE("Capture Switch", 0x08, 0x0, HDA_INPUT), 12452 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), 12453 { } /* end */ 12454 }; 12455 12456 /* FSC amilo */ 12457 static struct snd_kcontrol_new alc269_fujitsu_mixer[] = { 12458 HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT), 12459 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT), 12460 HDA_BIND_VOL("PCM Playback Volume", &alc269_epc_bind_vol), 12461 { } /* end */ 12462 }; 12463 12464 static struct hda_verb alc269_quanta_fl1_verbs[] = { 12465 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, 12466 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 12467 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 12468 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, 12469 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT}, 12470 {0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 12471 { } 12472 }; 12473 12474 static struct hda_verb alc269_lifebook_verbs[] = { 12475 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, 12476 {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01}, 12477 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 12478 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 12479 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, 12480 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 12481 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 12482 {0x1a, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, 12483 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT}, 12484 {0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 12485 { } 12486 }; 12487 12488 /* toggle speaker-output according to the hp-jack state */ 12489 static void alc269_quanta_fl1_speaker_automute(struct hda_codec *codec) 12490 { 12491 unsigned int present; 12492 unsigned char bits; 12493 12494 present = snd_hda_codec_read(codec, 0x15, 0, 12495 AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; 12496 bits = present ? AMP_IN_MUTE(0) : 0; 12497 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0, 12498 AMP_IN_MUTE(0), bits); 12499 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1, 12500 AMP_IN_MUTE(0), bits); 12501 12502 snd_hda_codec_write(codec, 0x20, 0, 12503 AC_VERB_SET_COEF_INDEX, 0x0c); 12504 snd_hda_codec_write(codec, 0x20, 0, 12505 AC_VERB_SET_PROC_COEF, 0x680); 12506 12507 snd_hda_codec_write(codec, 0x20, 0, 12508 AC_VERB_SET_COEF_INDEX, 0x0c); 12509 snd_hda_codec_write(codec, 0x20, 0, 12510 AC_VERB_SET_PROC_COEF, 0x480); 12511 } 12512 12513 /* toggle speaker-output according to the hp-jacks state */ 12514 static void alc269_lifebook_speaker_automute(struct hda_codec *codec) 12515 { 12516 unsigned int present; 12517 unsigned char bits; 12518 12519 /* Check laptop headphone socket */ 12520 present = snd_hda_codec_read(codec, 0x15, 0, 12521 AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; 12522 12523 /* Check port replicator headphone socket */ 12524 present |= snd_hda_codec_read(codec, 0x1a, 0, 12525 AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; 12526 12527 bits = present ? AMP_IN_MUTE(0) : 0; 12528 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0, 12529 AMP_IN_MUTE(0), bits); 12530 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1, 12531 AMP_IN_MUTE(0), bits); 12532 12533 snd_hda_codec_write(codec, 0x20, 0, 12534 AC_VERB_SET_COEF_INDEX, 0x0c); 12535 snd_hda_codec_write(codec, 0x20, 0, 12536 AC_VERB_SET_PROC_COEF, 0x680); 12537 12538 snd_hda_codec_write(codec, 0x20, 0, 12539 AC_VERB_SET_COEF_INDEX, 0x0c); 12540 snd_hda_codec_write(codec, 0x20, 0, 12541 AC_VERB_SET_PROC_COEF, 0x480); 12542 } 12543 12544 static void alc269_quanta_fl1_mic_automute(struct hda_codec *codec) 12545 { 12546 unsigned int present; 12547 12548 present = snd_hda_codec_read(codec, 0x18, 0, 12549 AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; 12550 snd_hda_codec_write(codec, 0x23, 0, 12551 AC_VERB_SET_CONNECT_SEL, present ? 0x0 : 0x1); 12552 } 12553 12554 static void alc269_lifebook_mic_autoswitch(struct hda_codec *codec) 12555 { 12556 unsigned int present_laptop; 12557 unsigned int present_dock; 12558 12559 present_laptop = snd_hda_codec_read(codec, 0x18, 0, 12560 AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; 12561 12562 present_dock = snd_hda_codec_read(codec, 0x1b, 0, 12563 AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; 12564 12565 /* Laptop mic port overrides dock mic port, design decision */ 12566 if (present_dock) 12567 snd_hda_codec_write(codec, 0x23, 0, 12568 AC_VERB_SET_CONNECT_SEL, 0x3); 12569 if (present_laptop) 12570 snd_hda_codec_write(codec, 0x23, 0, 12571 AC_VERB_SET_CONNECT_SEL, 0x0); 12572 if (!present_dock && !present_laptop) 12573 snd_hda_codec_write(codec, 0x23, 0, 12574 AC_VERB_SET_CONNECT_SEL, 0x1); 12575 } 12576 12577 static void alc269_quanta_fl1_unsol_event(struct hda_codec *codec, 12578 unsigned int res) 12579 { 12580 if ((res >> 26) == ALC880_HP_EVENT) 12581 alc269_quanta_fl1_speaker_automute(codec); 12582 if ((res >> 26) == ALC880_MIC_EVENT) 12583 alc269_quanta_fl1_mic_automute(codec); 12584 } 12585 12586 static void alc269_lifebook_unsol_event(struct hda_codec *codec, 12587 unsigned int res) 12588 { 12589 if ((res >> 26) == ALC880_HP_EVENT) 12590 alc269_lifebook_speaker_automute(codec); 12591 if ((res >> 26) == ALC880_MIC_EVENT) 12592 alc269_lifebook_mic_autoswitch(codec); 12593 } 12594 12595 static void alc269_quanta_fl1_init_hook(struct hda_codec *codec) 12596 { 12597 alc269_quanta_fl1_speaker_automute(codec); 12598 alc269_quanta_fl1_mic_automute(codec); 12599 } 12600 12601 static void alc269_lifebook_init_hook(struct hda_codec *codec) 12602 { 12603 alc269_lifebook_speaker_automute(codec); 12604 alc269_lifebook_mic_autoswitch(codec); 12605 } 12606 12607 static struct hda_verb alc269_eeepc_dmic_init_verbs[] = { 12608 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, 12609 {0x23, AC_VERB_SET_CONNECT_SEL, 0x05}, 12610 {0x02, AC_VERB_SET_AMP_GAIN_MUTE, 0xb026 }, 12611 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x7019 | (0x00 << 8))}, 12612 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 12613 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT}, 12614 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT}, 12615 {} 12616 }; 12617 12618 static struct hda_verb alc269_eeepc_amic_init_verbs[] = { 12619 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, 12620 {0x23, AC_VERB_SET_CONNECT_SEL, 0x01}, 12621 {0x02, AC_VERB_SET_AMP_GAIN_MUTE, 0xb026 }, 12622 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x701b | (0x00 << 8))}, 12623 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT}, 12624 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT}, 12625 {} 12626 }; 12627 12628 /* toggle speaker-output according to the hp-jack state */ 12629 static void alc269_speaker_automute(struct hda_codec *codec) 12630 { 12631 unsigned int present; 12632 unsigned char bits; 12633 12634 present = snd_hda_codec_read(codec, 0x15, 0, 12635 AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; 12636 bits = present ? AMP_IN_MUTE(0) : 0; 12637 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0, 12638 AMP_IN_MUTE(0), bits); 12639 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1, 12640 AMP_IN_MUTE(0), bits); 12641 } 12642 12643 static void alc269_eeepc_dmic_automute(struct hda_codec *codec) 12644 { 12645 unsigned int present; 12646 12647 present = snd_hda_codec_read(codec, 0x18, 0, 12648 AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; 12649 snd_hda_codec_write(codec, 0x23, 0, 12650 AC_VERB_SET_CONNECT_SEL, (present ? 0 : 5)); 12651 } 12652 12653 static void alc269_eeepc_amic_automute(struct hda_codec *codec) 12654 { 12655 unsigned int present; 12656 12657 present = snd_hda_codec_read(codec, 0x18, 0, 12658 AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; 12659 snd_hda_codec_write(codec, 0x24, 0, AC_VERB_SET_AMP_GAIN_MUTE, 12660 0x7000 | (0x00 << 8) | (present ? 0 : 0x80)); 12661 snd_hda_codec_write(codec, 0x24, 0, AC_VERB_SET_AMP_GAIN_MUTE, 12662 0x7000 | (0x01 << 8) | (present ? 0x80 : 0)); 12663 } 12664 12665 /* unsolicited event for HP jack sensing */ 12666 static void alc269_eeepc_dmic_unsol_event(struct hda_codec *codec, 12667 unsigned int res) 12668 { 12669 if ((res >> 26) == ALC880_HP_EVENT) 12670 alc269_speaker_automute(codec); 12671 12672 if ((res >> 26) == ALC880_MIC_EVENT) 12673 alc269_eeepc_dmic_automute(codec); 12674 } 12675 12676 static void alc269_eeepc_dmic_inithook(struct hda_codec *codec) 12677 { 12678 alc269_speaker_automute(codec); 12679 alc269_eeepc_dmic_automute(codec); 12680 } 12681 12682 /* unsolicited event for HP jack sensing */ 12683 static void alc269_eeepc_amic_unsol_event(struct hda_codec *codec, 12684 unsigned int res) 12685 { 12686 if ((res >> 26) == ALC880_HP_EVENT) 12687 alc269_speaker_automute(codec); 12688 12689 if ((res >> 26) == ALC880_MIC_EVENT) 12690 alc269_eeepc_amic_automute(codec); 12691 } 12692 12693 static void alc269_eeepc_amic_inithook(struct hda_codec *codec) 12694 { 12695 alc269_speaker_automute(codec); 12696 alc269_eeepc_amic_automute(codec); 12697 } 12698 12699 /* 12700 * generic initialization of ADC, input mixers and output mixers 12701 */ 12702 static struct hda_verb alc269_init_verbs[] = { 12703 /* 12704 * Unmute ADC0 and set the default input to mic-in 12705 */ 12706 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 12707 12708 /* Mute input amps (PCBeep, Line In, Mic 1 & Mic 2) of the 12709 * analog-loopback mixer widget 12710 * Note: PASD motherboards uses the Line In 2 as the input for 12711 * front panel mic (mic 2) 12712 */ 12713 /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */ 12714 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 12715 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 12716 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, 12717 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, 12718 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, 12719 12720 /* 12721 * Set up output mixers (0x0c - 0x0e) 12722 */ 12723 /* set vol=0 to output mixers */ 12724 {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 12725 {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 12726 12727 /* set up input amps for analog loopback */ 12728 /* Amp Indices: DAC = 0, mixer = 1 */ 12729 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 12730 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 12731 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 12732 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 12733 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 12734 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 12735 12736 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 12737 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 12738 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 12739 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, 12740 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, 12741 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 12742 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 12743 12744 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 12745 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 12746 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 12747 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 12748 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 12749 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 12750 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 12751 12752 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, 12753 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, 12754 12755 /* FIXME: use matrix-type input source selection */ 12756 /* Mixer elements: 0x18, 19, 1a, 1b, 1d, 0b */ 12757 /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */ 12758 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 12759 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 12760 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, 12761 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, 12762 12763 /* set EAPD */ 12764 {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2}, 12765 {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2}, 12766 { } 12767 }; 12768 12769 /* add playback controls from the parsed DAC table */ 12770 static int alc269_auto_create_multi_out_ctls(struct alc_spec *spec, 12771 const struct auto_pin_cfg *cfg) 12772 { 12773 hda_nid_t nid; 12774 int err; 12775 12776 spec->multiout.num_dacs = 1; /* only use one dac */ 12777 spec->multiout.dac_nids = spec->private_dac_nids; 12778 spec->multiout.dac_nids[0] = 2; 12779 12780 nid = cfg->line_out_pins[0]; 12781 if (nid) { 12782 err = add_control(spec, ALC_CTL_WIDGET_VOL, 12783 "Front Playback Volume", 12784 HDA_COMPOSE_AMP_VAL(0x02, 3, 0, HDA_OUTPUT)); 12785 if (err < 0) 12786 return err; 12787 err = add_control(spec, ALC_CTL_WIDGET_MUTE, 12788 "Front Playback Switch", 12789 HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT)); 12790 if (err < 0) 12791 return err; 12792 } 12793 12794 nid = cfg->speaker_pins[0]; 12795 if (nid) { 12796 if (!cfg->line_out_pins[0]) { 12797 err = add_control(spec, ALC_CTL_WIDGET_VOL, 12798 "Speaker Playback Volume", 12799 HDA_COMPOSE_AMP_VAL(0x02, 3, 0, 12800 HDA_OUTPUT)); 12801 if (err < 0) 12802 return err; 12803 } 12804 if (nid == 0x16) { 12805 err = add_control(spec, ALC_CTL_WIDGET_MUTE, 12806 "Speaker Playback Switch", 12807 HDA_COMPOSE_AMP_VAL(nid, 2, 0, 12808 HDA_OUTPUT)); 12809 if (err < 0) 12810 return err; 12811 } else { 12812 err = add_control(spec, ALC_CTL_WIDGET_MUTE, 12813 "Speaker Playback Switch", 12814 HDA_COMPOSE_AMP_VAL(nid, 3, 0, 12815 HDA_OUTPUT)); 12816 if (err < 0) 12817 return err; 12818 } 12819 } 12820 nid = cfg->hp_pins[0]; 12821 if (nid) { 12822 /* spec->multiout.hp_nid = 2; */ 12823 if (!cfg->line_out_pins[0] && !cfg->speaker_pins[0]) { 12824 err = add_control(spec, ALC_CTL_WIDGET_VOL, 12825 "Headphone Playback Volume", 12826 HDA_COMPOSE_AMP_VAL(0x02, 3, 0, 12827 HDA_OUTPUT)); 12828 if (err < 0) 12829 return err; 12830 } 12831 if (nid == 0x16) { 12832 err = add_control(spec, ALC_CTL_WIDGET_MUTE, 12833 "Headphone Playback Switch", 12834 HDA_COMPOSE_AMP_VAL(nid, 2, 0, 12835 HDA_OUTPUT)); 12836 if (err < 0) 12837 return err; 12838 } else { 12839 err = add_control(spec, ALC_CTL_WIDGET_MUTE, 12840 "Headphone Playback Switch", 12841 HDA_COMPOSE_AMP_VAL(nid, 3, 0, 12842 HDA_OUTPUT)); 12843 if (err < 0) 12844 return err; 12845 } 12846 } 12847 return 0; 12848 } 12849 12850 static int alc269_auto_create_analog_input_ctls(struct alc_spec *spec, 12851 const struct auto_pin_cfg *cfg) 12852 { 12853 int err; 12854 12855 err = alc880_auto_create_analog_input_ctls(spec, cfg); 12856 if (err < 0) 12857 return err; 12858 /* digital-mic input pin is excluded in alc880_auto_create..() 12859 * because it's under 0x18 12860 */ 12861 if (cfg->input_pins[AUTO_PIN_MIC] == 0x12 || 12862 cfg->input_pins[AUTO_PIN_FRONT_MIC] == 0x12) { 12863 struct hda_input_mux *imux = &spec->private_imux[0]; 12864 imux->items[imux->num_items].label = "Int Mic"; 12865 imux->items[imux->num_items].index = 0x05; 12866 imux->num_items++; 12867 } 12868 return 0; 12869 } 12870 12871 #ifdef CONFIG_SND_HDA_POWER_SAVE 12872 #define alc269_loopbacks alc880_loopbacks 12873 #endif 12874 12875 /* pcm configuration: identiacal with ALC880 */ 12876 #define alc269_pcm_analog_playback alc880_pcm_analog_playback 12877 #define alc269_pcm_analog_capture alc880_pcm_analog_capture 12878 #define alc269_pcm_digital_playback alc880_pcm_digital_playback 12879 #define alc269_pcm_digital_capture alc880_pcm_digital_capture 12880 12881 static struct hda_pcm_stream alc269_44k_pcm_analog_playback = { 12882 .substreams = 1, 12883 .channels_min = 2, 12884 .channels_max = 8, 12885 .rates = SNDRV_PCM_RATE_44100, /* fixed rate */ 12886 /* NID is set in alc_build_pcms */ 12887 .ops = { 12888 .open = alc880_playback_pcm_open, 12889 .prepare = alc880_playback_pcm_prepare, 12890 .cleanup = alc880_playback_pcm_cleanup 12891 }, 12892 }; 12893 12894 static struct hda_pcm_stream alc269_44k_pcm_analog_capture = { 12895 .substreams = 1, 12896 .channels_min = 2, 12897 .channels_max = 2, 12898 .rates = SNDRV_PCM_RATE_44100, /* fixed rate */ 12899 /* NID is set in alc_build_pcms */ 12900 }; 12901 12902 /* 12903 * BIOS auto configuration 12904 */ 12905 static int alc269_parse_auto_config(struct hda_codec *codec) 12906 { 12907 struct alc_spec *spec = codec->spec; 12908 int err; 12909 static hda_nid_t alc269_ignore[] = { 0x1d, 0 }; 12910 12911 err = snd_hda_parse_pin_def_config(codec, &spec->autocfg, 12912 alc269_ignore); 12913 if (err < 0) 12914 return err; 12915 12916 err = alc269_auto_create_multi_out_ctls(spec, &spec->autocfg); 12917 if (err < 0) 12918 return err; 12919 err = alc269_auto_create_analog_input_ctls(spec, &spec->autocfg); 12920 if (err < 0) 12921 return err; 12922 12923 spec->multiout.max_channels = spec->multiout.num_dacs * 2; 12924 12925 if (spec->autocfg.dig_outs) 12926 spec->multiout.dig_out_nid = ALC269_DIGOUT_NID; 12927 12928 if (spec->kctls.list) 12929 add_mixer(spec, spec->kctls.list); 12930 12931 add_verb(spec, alc269_init_verbs); 12932 spec->num_mux_defs = 1; 12933 spec->input_mux = &spec->private_imux[0]; 12934 /* set default input source */ 12935 snd_hda_codec_write_cache(codec, alc269_capsrc_nids[0], 12936 0, AC_VERB_SET_CONNECT_SEL, 12937 spec->input_mux->items[0].index); 12938 12939 err = alc_auto_add_mic_boost(codec); 12940 if (err < 0) 12941 return err; 12942 12943 if (!spec->cap_mixer && !spec->no_analog) 12944 set_capture_mixer(spec); 12945 12946 return 1; 12947 } 12948 12949 #define alc269_auto_init_multi_out alc882_auto_init_multi_out 12950 #define alc269_auto_init_hp_out alc882_auto_init_hp_out 12951 #define alc269_auto_init_analog_input alc882_auto_init_analog_input 12952 12953 12954 /* init callback for auto-configuration model -- overriding the default init */ 12955 static void alc269_auto_init(struct hda_codec *codec) 12956 { 12957 struct alc_spec *spec = codec->spec; 12958 alc269_auto_init_multi_out(codec); 12959 alc269_auto_init_hp_out(codec); 12960 alc269_auto_init_analog_input(codec); 12961 if (spec->unsol_event) 12962 alc_inithook(codec); 12963 } 12964 12965 /* 12966 * configuration and preset 12967 */ 12968 static const char *alc269_models[ALC269_MODEL_LAST] = { 12969 [ALC269_BASIC] = "basic", 12970 [ALC269_QUANTA_FL1] = "quanta", 12971 [ALC269_ASUS_EEEPC_P703] = "eeepc-p703", 12972 [ALC269_ASUS_EEEPC_P901] = "eeepc-p901", 12973 [ALC269_FUJITSU] = "fujitsu", 12974 [ALC269_LIFEBOOK] = "lifebook" 12975 }; 12976 12977 static struct snd_pci_quirk alc269_cfg_tbl[] = { 12978 SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_QUANTA_FL1), 12979 SND_PCI_QUIRK(0x1043, 0x8330, "ASUS Eeepc P703 P900A", 12980 ALC269_ASUS_EEEPC_P703), 12981 SND_PCI_QUIRK(0x1043, 0x1883, "ASUS F81Se", ALC269_ASUS_EEEPC_P703), 12982 SND_PCI_QUIRK(0x1043, 0x16a3, "ASUS F5Q", ALC269_ASUS_EEEPC_P703), 12983 SND_PCI_QUIRK(0x1043, 0x1723, "ASUS P80", ALC269_ASUS_EEEPC_P703), 12984 SND_PCI_QUIRK(0x1043, 0x1773, "ASUS U20A", ALC269_ASUS_EEEPC_P703), 12985 SND_PCI_QUIRK(0x1043, 0x1743, "ASUS U80", ALC269_ASUS_EEEPC_P703), 12986 SND_PCI_QUIRK(0x1043, 0x1653, "ASUS U50", ALC269_ASUS_EEEPC_P703), 12987 SND_PCI_QUIRK(0x1043, 0x831a, "ASUS Eeepc P901", 12988 ALC269_ASUS_EEEPC_P901), 12989 SND_PCI_QUIRK(0x1043, 0x834a, "ASUS Eeepc S101", 12990 ALC269_ASUS_EEEPC_P901), 12991 SND_PCI_QUIRK(0x1043, 0x16e3, "ASUS UX50", ALC269_ASUS_EEEPC_P901), 12992 SND_PCI_QUIRK(0x1734, 0x115d, "FSC Amilo", ALC269_FUJITSU), 12993 SND_PCI_QUIRK(0x10cf, 0x1475, "Lifebook ICH9M-based", ALC269_LIFEBOOK), 12994 {} 12995 }; 12996 12997 static struct alc_config_preset alc269_presets[] = { 12998 [ALC269_BASIC] = { 12999 .mixers = { alc269_base_mixer }, 13000 .init_verbs = { alc269_init_verbs }, 13001 .num_dacs = ARRAY_SIZE(alc269_dac_nids), 13002 .dac_nids = alc269_dac_nids, 13003 .hp_nid = 0x03, 13004 .num_channel_mode = ARRAY_SIZE(alc269_modes), 13005 .channel_mode = alc269_modes, 13006 .input_mux = &alc269_capture_source, 13007 }, 13008 [ALC269_QUANTA_FL1] = { 13009 .mixers = { alc269_quanta_fl1_mixer }, 13010 .init_verbs = { alc269_init_verbs, alc269_quanta_fl1_verbs }, 13011 .num_dacs = ARRAY_SIZE(alc269_dac_nids), 13012 .dac_nids = alc269_dac_nids, 13013 .hp_nid = 0x03, 13014 .num_channel_mode = ARRAY_SIZE(alc269_modes), 13015 .channel_mode = alc269_modes, 13016 .input_mux = &alc269_capture_source, 13017 .unsol_event = alc269_quanta_fl1_unsol_event, 13018 .init_hook = alc269_quanta_fl1_init_hook, 13019 }, 13020 [ALC269_ASUS_EEEPC_P703] = { 13021 .mixers = { alc269_eeepc_mixer }, 13022 .cap_mixer = alc269_epc_capture_mixer, 13023 .init_verbs = { alc269_init_verbs, 13024 alc269_eeepc_amic_init_verbs }, 13025 .num_dacs = ARRAY_SIZE(alc269_dac_nids), 13026 .dac_nids = alc269_dac_nids, 13027 .hp_nid = 0x03, 13028 .num_channel_mode = ARRAY_SIZE(alc269_modes), 13029 .channel_mode = alc269_modes, 13030 .input_mux = &alc269_eeepc_amic_capture_source, 13031 .unsol_event = alc269_eeepc_amic_unsol_event, 13032 .init_hook = alc269_eeepc_amic_inithook, 13033 }, 13034 [ALC269_ASUS_EEEPC_P901] = { 13035 .mixers = { alc269_eeepc_mixer }, 13036 .cap_mixer = alc269_epc_capture_mixer, 13037 .init_verbs = { alc269_init_verbs, 13038 alc269_eeepc_dmic_init_verbs }, 13039 .num_dacs = ARRAY_SIZE(alc269_dac_nids), 13040 .dac_nids = alc269_dac_nids, 13041 .hp_nid = 0x03, 13042 .num_channel_mode = ARRAY_SIZE(alc269_modes), 13043 .channel_mode = alc269_modes, 13044 .input_mux = &alc269_eeepc_dmic_capture_source, 13045 .unsol_event = alc269_eeepc_dmic_unsol_event, 13046 .init_hook = alc269_eeepc_dmic_inithook, 13047 }, 13048 [ALC269_FUJITSU] = { 13049 .mixers = { alc269_fujitsu_mixer }, 13050 .cap_mixer = alc269_epc_capture_mixer, 13051 .init_verbs = { alc269_init_verbs, 13052 alc269_eeepc_dmic_init_verbs }, 13053 .num_dacs = ARRAY_SIZE(alc269_dac_nids), 13054 .dac_nids = alc269_dac_nids, 13055 .hp_nid = 0x03, 13056 .num_channel_mode = ARRAY_SIZE(alc269_modes), 13057 .channel_mode = alc269_modes, 13058 .input_mux = &alc269_eeepc_dmic_capture_source, 13059 .unsol_event = alc269_eeepc_dmic_unsol_event, 13060 .init_hook = alc269_eeepc_dmic_inithook, 13061 }, 13062 [ALC269_LIFEBOOK] = { 13063 .mixers = { alc269_lifebook_mixer }, 13064 .init_verbs = { alc269_init_verbs, alc269_lifebook_verbs }, 13065 .num_dacs = ARRAY_SIZE(alc269_dac_nids), 13066 .dac_nids = alc269_dac_nids, 13067 .hp_nid = 0x03, 13068 .num_channel_mode = ARRAY_SIZE(alc269_modes), 13069 .channel_mode = alc269_modes, 13070 .input_mux = &alc269_capture_source, 13071 .unsol_event = alc269_lifebook_unsol_event, 13072 .init_hook = alc269_lifebook_init_hook, 13073 }, 13074 }; 13075 13076 static int patch_alc269(struct hda_codec *codec) 13077 { 13078 struct alc_spec *spec; 13079 int board_config; 13080 int err; 13081 13082 spec = kzalloc(sizeof(*spec), GFP_KERNEL); 13083 if (spec == NULL) 13084 return -ENOMEM; 13085 13086 codec->spec = spec; 13087 13088 alc_fix_pll_init(codec, 0x20, 0x04, 15); 13089 13090 board_config = snd_hda_check_board_config(codec, ALC269_MODEL_LAST, 13091 alc269_models, 13092 alc269_cfg_tbl); 13093 13094 if (board_config < 0) { 13095 printk(KERN_INFO "hda_codec: Unknown model for ALC269, " 13096 "trying auto-probe from BIOS...\n"); 13097 board_config = ALC269_AUTO; 13098 } 13099 13100 if (board_config == ALC269_AUTO) { 13101 /* automatic parse from the BIOS config */ 13102 err = alc269_parse_auto_config(codec); 13103 if (err < 0) { 13104 alc_free(codec); 13105 return err; 13106 } else if (!err) { 13107 printk(KERN_INFO 13108 "hda_codec: Cannot set up configuration " 13109 "from BIOS. Using base mode...\n"); 13110 board_config = ALC269_BASIC; 13111 } 13112 } 13113 13114 err = snd_hda_attach_beep_device(codec, 0x1); 13115 if (err < 0) { 13116 alc_free(codec); 13117 return err; 13118 } 13119 13120 if (board_config != ALC269_AUTO) 13121 setup_preset(spec, &alc269_presets[board_config]); 13122 13123 spec->stream_name_analog = "ALC269 Analog"; 13124 if (codec->subsystem_id == 0x17aa3bf8) { 13125 /* Due to a hardware problem on Lenovo Ideadpad, we need to 13126 * fix the sample rate of analog I/O to 44.1kHz 13127 */ 13128 spec->stream_analog_playback = &alc269_44k_pcm_analog_playback; 13129 spec->stream_analog_capture = &alc269_44k_pcm_analog_capture; 13130 } else { 13131 spec->stream_analog_playback = &alc269_pcm_analog_playback; 13132 spec->stream_analog_capture = &alc269_pcm_analog_capture; 13133 } 13134 spec->stream_name_digital = "ALC269 Digital"; 13135 spec->stream_digital_playback = &alc269_pcm_digital_playback; 13136 spec->stream_digital_capture = &alc269_pcm_digital_capture; 13137 13138 spec->adc_nids = alc269_adc_nids; 13139 spec->num_adc_nids = ARRAY_SIZE(alc269_adc_nids); 13140 spec->capsrc_nids = alc269_capsrc_nids; 13141 if (!spec->cap_mixer) 13142 set_capture_mixer(spec); 13143 set_beep_amp(spec, 0x0b, 0x04, HDA_INPUT); 13144 13145 codec->patch_ops = alc_patch_ops; 13146 if (board_config == ALC269_AUTO) 13147 spec->init_hook = alc269_auto_init; 13148 #ifdef CONFIG_SND_HDA_POWER_SAVE 13149 if (!spec->loopback.amplist) 13150 spec->loopback.amplist = alc269_loopbacks; 13151 #endif 13152 codec->proc_widget_hook = print_realtek_coef; 13153 13154 return 0; 13155 } 13156 13157 /* 13158 * ALC861 channel source setting (2/6 channel selection for 3-stack) 13159 */ 13160 13161 /* 13162 * set the path ways for 2 channel output 13163 * need to set the codec line out and mic 1 pin widgets to inputs 13164 */ 13165 static struct hda_verb alc861_threestack_ch2_init[] = { 13166 /* set pin widget 1Ah (line in) for input */ 13167 { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 }, 13168 /* set pin widget 18h (mic1/2) for input, for mic also enable 13169 * the vref 13170 */ 13171 { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 }, 13172 13173 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c }, 13174 #if 0 13175 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8)) }, /*mic*/ 13176 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8)) }, /*line-in*/ 13177 #endif 13178 { } /* end */ 13179 }; 13180 /* 13181 * 6ch mode 13182 * need to set the codec line out and mic 1 pin widgets to outputs 13183 */ 13184 static struct hda_verb alc861_threestack_ch6_init[] = { 13185 /* set pin widget 1Ah (line in) for output (Back Surround)*/ 13186 { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 }, 13187 /* set pin widget 18h (mic1) for output (CLFE)*/ 13188 { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 }, 13189 13190 { 0x0c, AC_VERB_SET_CONNECT_SEL, 0x00 }, 13191 { 0x0d, AC_VERB_SET_CONNECT_SEL, 0x00 }, 13192 13193 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080 }, 13194 #if 0 13195 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8)) }, /*mic*/ 13196 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8)) }, /*line in*/ 13197 #endif 13198 { } /* end */ 13199 }; 13200 13201 static struct hda_channel_mode alc861_threestack_modes[2] = { 13202 { 2, alc861_threestack_ch2_init }, 13203 { 6, alc861_threestack_ch6_init }, 13204 }; 13205 /* Set mic1 as input and unmute the mixer */ 13206 static struct hda_verb alc861_uniwill_m31_ch2_init[] = { 13207 { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 }, 13208 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8)) }, /*mic*/ 13209 { } /* end */ 13210 }; 13211 /* Set mic1 as output and mute mixer */ 13212 static struct hda_verb alc861_uniwill_m31_ch4_init[] = { 13213 { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 }, 13214 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8)) }, /*mic*/ 13215 { } /* end */ 13216 }; 13217 13218 static struct hda_channel_mode alc861_uniwill_m31_modes[2] = { 13219 { 2, alc861_uniwill_m31_ch2_init }, 13220 { 4, alc861_uniwill_m31_ch4_init }, 13221 }; 13222 13223 /* Set mic1 and line-in as input and unmute the mixer */ 13224 static struct hda_verb alc861_asus_ch2_init[] = { 13225 /* set pin widget 1Ah (line in) for input */ 13226 { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 }, 13227 /* set pin widget 18h (mic1/2) for input, for mic also enable 13228 * the vref 13229 */ 13230 { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 }, 13231 13232 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c }, 13233 #if 0 13234 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8)) }, /*mic*/ 13235 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8)) }, /*line-in*/ 13236 #endif 13237 { } /* end */ 13238 }; 13239 /* Set mic1 nad line-in as output and mute mixer */ 13240 static struct hda_verb alc861_asus_ch6_init[] = { 13241 /* set pin widget 1Ah (line in) for output (Back Surround)*/ 13242 { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 }, 13243 /* { 0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, */ 13244 /* set pin widget 18h (mic1) for output (CLFE)*/ 13245 { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 }, 13246 /* { 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, */ 13247 { 0x0c, AC_VERB_SET_CONNECT_SEL, 0x00 }, 13248 { 0x0d, AC_VERB_SET_CONNECT_SEL, 0x00 }, 13249 13250 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080 }, 13251 #if 0 13252 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8)) }, /*mic*/ 13253 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8)) }, /*line in*/ 13254 #endif 13255 { } /* end */ 13256 }; 13257 13258 static struct hda_channel_mode alc861_asus_modes[2] = { 13259 { 2, alc861_asus_ch2_init }, 13260 { 6, alc861_asus_ch6_init }, 13261 }; 13262 13263 /* patch-ALC861 */ 13264 13265 static struct snd_kcontrol_new alc861_base_mixer[] = { 13266 /* output mixer control */ 13267 HDA_CODEC_MUTE("Front Playback Switch", 0x03, 0x0, HDA_OUTPUT), 13268 HDA_CODEC_MUTE("Surround Playback Switch", 0x06, 0x0, HDA_OUTPUT), 13269 HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x05, 1, 0x0, HDA_OUTPUT), 13270 HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x05, 2, 0x0, HDA_OUTPUT), 13271 HDA_CODEC_MUTE("Side Playback Switch", 0x04, 0x0, HDA_OUTPUT), 13272 13273 /*Input mixer control */ 13274 /* HDA_CODEC_VOLUME("Input Playback Volume", 0x15, 0x0, HDA_OUTPUT), 13275 HDA_CODEC_MUTE("Input Playback Switch", 0x15, 0x0, HDA_OUTPUT), */ 13276 HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_INPUT), 13277 HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_INPUT), 13278 HDA_CODEC_VOLUME("Line Playback Volume", 0x15, 0x02, HDA_INPUT), 13279 HDA_CODEC_MUTE("Line Playback Switch", 0x15, 0x02, HDA_INPUT), 13280 HDA_CODEC_VOLUME("Mic Playback Volume", 0x15, 0x01, HDA_INPUT), 13281 HDA_CODEC_MUTE("Mic Playback Switch", 0x15, 0x01, HDA_INPUT), 13282 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x10, 0x01, HDA_OUTPUT), 13283 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1a, 0x03, HDA_INPUT), 13284 13285 { } /* end */ 13286 }; 13287 13288 static struct snd_kcontrol_new alc861_3ST_mixer[] = { 13289 /* output mixer control */ 13290 HDA_CODEC_MUTE("Front Playback Switch", 0x03, 0x0, HDA_OUTPUT), 13291 HDA_CODEC_MUTE("Surround Playback Switch", 0x06, 0x0, HDA_OUTPUT), 13292 HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x05, 1, 0x0, HDA_OUTPUT), 13293 HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x05, 2, 0x0, HDA_OUTPUT), 13294 /*HDA_CODEC_MUTE("Side Playback Switch", 0x04, 0x0, HDA_OUTPUT), */ 13295 13296 /* Input mixer control */ 13297 /* HDA_CODEC_VOLUME("Input Playback Volume", 0x15, 0x0, HDA_OUTPUT), 13298 HDA_CODEC_MUTE("Input Playback Switch", 0x15, 0x0, HDA_OUTPUT), */ 13299 HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_INPUT), 13300 HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_INPUT), 13301 HDA_CODEC_VOLUME("Line Playback Volume", 0x15, 0x02, HDA_INPUT), 13302 HDA_CODEC_MUTE("Line Playback Switch", 0x15, 0x02, HDA_INPUT), 13303 HDA_CODEC_VOLUME("Mic Playback Volume", 0x15, 0x01, HDA_INPUT), 13304 HDA_CODEC_MUTE("Mic Playback Switch", 0x15, 0x01, HDA_INPUT), 13305 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x10, 0x01, HDA_OUTPUT), 13306 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1a, 0x03, HDA_INPUT), 13307 13308 { 13309 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 13310 .name = "Channel Mode", 13311 .info = alc_ch_mode_info, 13312 .get = alc_ch_mode_get, 13313 .put = alc_ch_mode_put, 13314 .private_value = ARRAY_SIZE(alc861_threestack_modes), 13315 }, 13316 { } /* end */ 13317 }; 13318 13319 static struct snd_kcontrol_new alc861_toshiba_mixer[] = { 13320 /* output mixer control */ 13321 HDA_CODEC_MUTE("Master Playback Switch", 0x03, 0x0, HDA_OUTPUT), 13322 HDA_CODEC_VOLUME("Mic Playback Volume", 0x15, 0x01, HDA_INPUT), 13323 HDA_CODEC_MUTE("Mic Playback Switch", 0x15, 0x01, HDA_INPUT), 13324 13325 { } /* end */ 13326 }; 13327 13328 static struct snd_kcontrol_new alc861_uniwill_m31_mixer[] = { 13329 /* output mixer control */ 13330 HDA_CODEC_MUTE("Front Playback Switch", 0x03, 0x0, HDA_OUTPUT), 13331 HDA_CODEC_MUTE("Surround Playback Switch", 0x06, 0x0, HDA_OUTPUT), 13332 HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x05, 1, 0x0, HDA_OUTPUT), 13333 HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x05, 2, 0x0, HDA_OUTPUT), 13334 /*HDA_CODEC_MUTE("Side Playback Switch", 0x04, 0x0, HDA_OUTPUT), */ 13335 13336 /* Input mixer control */ 13337 /* HDA_CODEC_VOLUME("Input Playback Volume", 0x15, 0x0, HDA_OUTPUT), 13338 HDA_CODEC_MUTE("Input Playback Switch", 0x15, 0x0, HDA_OUTPUT), */ 13339 HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_INPUT), 13340 HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_INPUT), 13341 HDA_CODEC_VOLUME("Line Playback Volume", 0x15, 0x02, HDA_INPUT), 13342 HDA_CODEC_MUTE("Line Playback Switch", 0x15, 0x02, HDA_INPUT), 13343 HDA_CODEC_VOLUME("Mic Playback Volume", 0x15, 0x01, HDA_INPUT), 13344 HDA_CODEC_MUTE("Mic Playback Switch", 0x15, 0x01, HDA_INPUT), 13345 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x10, 0x01, HDA_OUTPUT), 13346 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1a, 0x03, HDA_INPUT), 13347 13348 { 13349 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 13350 .name = "Channel Mode", 13351 .info = alc_ch_mode_info, 13352 .get = alc_ch_mode_get, 13353 .put = alc_ch_mode_put, 13354 .private_value = ARRAY_SIZE(alc861_uniwill_m31_modes), 13355 }, 13356 { } /* end */ 13357 }; 13358 13359 static struct snd_kcontrol_new alc861_asus_mixer[] = { 13360 /* output mixer control */ 13361 HDA_CODEC_MUTE("Front Playback Switch", 0x03, 0x0, HDA_OUTPUT), 13362 HDA_CODEC_MUTE("Surround Playback Switch", 0x06, 0x0, HDA_OUTPUT), 13363 HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x05, 1, 0x0, HDA_OUTPUT), 13364 HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x05, 2, 0x0, HDA_OUTPUT), 13365 HDA_CODEC_MUTE("Side Playback Switch", 0x04, 0x0, HDA_OUTPUT), 13366 13367 /* Input mixer control */ 13368 HDA_CODEC_VOLUME("Input Playback Volume", 0x15, 0x0, HDA_OUTPUT), 13369 HDA_CODEC_MUTE("Input Playback Switch", 0x15, 0x0, HDA_OUTPUT), 13370 HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_INPUT), 13371 HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_INPUT), 13372 HDA_CODEC_VOLUME("Line Playback Volume", 0x15, 0x02, HDA_INPUT), 13373 HDA_CODEC_MUTE("Line Playback Switch", 0x15, 0x02, HDA_INPUT), 13374 HDA_CODEC_VOLUME("Mic Playback Volume", 0x15, 0x01, HDA_INPUT), 13375 HDA_CODEC_MUTE("Mic Playback Switch", 0x15, 0x01, HDA_INPUT), 13376 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x10, 0x01, HDA_OUTPUT), 13377 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1a, 0x03, HDA_OUTPUT), 13378 13379 { 13380 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 13381 .name = "Channel Mode", 13382 .info = alc_ch_mode_info, 13383 .get = alc_ch_mode_get, 13384 .put = alc_ch_mode_put, 13385 .private_value = ARRAY_SIZE(alc861_asus_modes), 13386 }, 13387 { } 13388 }; 13389 13390 /* additional mixer */ 13391 static struct snd_kcontrol_new alc861_asus_laptop_mixer[] = { 13392 HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_INPUT), 13393 HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_INPUT), 13394 { } 13395 }; 13396 13397 /* 13398 * generic initialization of ADC, input mixers and output mixers 13399 */ 13400 static struct hda_verb alc861_base_init_verbs[] = { 13401 /* 13402 * Unmute ADC0 and set the default input to mic-in 13403 */ 13404 /* port-A for surround (rear panel) */ 13405 { 0x0e, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 }, 13406 { 0x0e, AC_VERB_SET_CONNECT_SEL, 0x00 }, 13407 /* port-B for mic-in (rear panel) with vref */ 13408 { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 }, 13409 /* port-C for line-in (rear panel) */ 13410 { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 }, 13411 /* port-D for Front */ 13412 { 0x0b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 }, 13413 { 0x0b, AC_VERB_SET_CONNECT_SEL, 0x00 }, 13414 /* port-E for HP out (front panel) */ 13415 { 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0 }, 13416 /* route front PCM to HP */ 13417 { 0x0f, AC_VERB_SET_CONNECT_SEL, 0x00 }, 13418 /* port-F for mic-in (front panel) with vref */ 13419 { 0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 }, 13420 /* port-G for CLFE (rear panel) */ 13421 { 0x1f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 }, 13422 { 0x1f, AC_VERB_SET_CONNECT_SEL, 0x00 }, 13423 /* port-H for side (rear panel) */ 13424 { 0x20, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 }, 13425 { 0x20, AC_VERB_SET_CONNECT_SEL, 0x00 }, 13426 /* CD-in */ 13427 { 0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 }, 13428 /* route front mic to ADC1*/ 13429 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00}, 13430 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 13431 13432 /* Unmute DAC0~3 & spdif out*/ 13433 {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 13434 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 13435 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 13436 {0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 13437 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 13438 13439 /* Unmute Mixer 14 (mic) 1c (Line in)*/ 13440 {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 13441 {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 13442 {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 13443 {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 13444 13445 /* Unmute Stereo Mixer 15 */ 13446 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 13447 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 13448 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)}, 13449 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c}, /* Output 0~12 step */ 13450 13451 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 13452 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 13453 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 13454 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 13455 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 13456 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 13457 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 13458 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 13459 /* hp used DAC 3 (Front) */ 13460 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)}, 13461 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)}, 13462 13463 { } 13464 }; 13465 13466 static struct hda_verb alc861_threestack_init_verbs[] = { 13467 /* 13468 * Unmute ADC0 and set the default input to mic-in 13469 */ 13470 /* port-A for surround (rear panel) */ 13471 { 0x0e, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 }, 13472 /* port-B for mic-in (rear panel) with vref */ 13473 { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 }, 13474 /* port-C for line-in (rear panel) */ 13475 { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 }, 13476 /* port-D for Front */ 13477 { 0x0b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 }, 13478 { 0x0b, AC_VERB_SET_CONNECT_SEL, 0x00 }, 13479 /* port-E for HP out (front panel) */ 13480 { 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0 }, 13481 /* route front PCM to HP */ 13482 { 0x0f, AC_VERB_SET_CONNECT_SEL, 0x00 }, 13483 /* port-F for mic-in (front panel) with vref */ 13484 { 0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 }, 13485 /* port-G for CLFE (rear panel) */ 13486 { 0x1f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 }, 13487 /* port-H for side (rear panel) */ 13488 { 0x20, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 }, 13489 /* CD-in */ 13490 { 0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 }, 13491 /* route front mic to ADC1*/ 13492 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00}, 13493 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 13494 /* Unmute DAC0~3 & spdif out*/ 13495 {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 13496 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 13497 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 13498 {0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 13499 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 13500 13501 /* Unmute Mixer 14 (mic) 1c (Line in)*/ 13502 {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 13503 {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 13504 {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 13505 {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 13506 13507 /* Unmute Stereo Mixer 15 */ 13508 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 13509 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 13510 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)}, 13511 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c}, /* Output 0~12 step */ 13512 13513 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 13514 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 13515 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 13516 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 13517 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 13518 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 13519 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 13520 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 13521 /* hp used DAC 3 (Front) */ 13522 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)}, 13523 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)}, 13524 { } 13525 }; 13526 13527 static struct hda_verb alc861_uniwill_m31_init_verbs[] = { 13528 /* 13529 * Unmute ADC0 and set the default input to mic-in 13530 */ 13531 /* port-A for surround (rear panel) */ 13532 { 0x0e, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 }, 13533 /* port-B for mic-in (rear panel) with vref */ 13534 { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 }, 13535 /* port-C for line-in (rear panel) */ 13536 { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 }, 13537 /* port-D for Front */ 13538 { 0x0b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 }, 13539 { 0x0b, AC_VERB_SET_CONNECT_SEL, 0x00 }, 13540 /* port-E for HP out (front panel) */ 13541 /* this has to be set to VREF80 */ 13542 { 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 }, 13543 /* route front PCM to HP */ 13544 { 0x0f, AC_VERB_SET_CONNECT_SEL, 0x00 }, 13545 /* port-F for mic-in (front panel) with vref */ 13546 { 0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 }, 13547 /* port-G for CLFE (rear panel) */ 13548 { 0x1f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 }, 13549 /* port-H for side (rear panel) */ 13550 { 0x20, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 }, 13551 /* CD-in */ 13552 { 0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 }, 13553 /* route front mic to ADC1*/ 13554 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00}, 13555 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 13556 /* Unmute DAC0~3 & spdif out*/ 13557 {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 13558 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 13559 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 13560 {0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 13561 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 13562 13563 /* Unmute Mixer 14 (mic) 1c (Line in)*/ 13564 {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 13565 {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 13566 {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 13567 {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 13568 13569 /* Unmute Stereo Mixer 15 */ 13570 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 13571 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 13572 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)}, 13573 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c}, /* Output 0~12 step */ 13574 13575 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 13576 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 13577 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 13578 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 13579 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 13580 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 13581 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 13582 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 13583 /* hp used DAC 3 (Front) */ 13584 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)}, 13585 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)}, 13586 { } 13587 }; 13588 13589 static struct hda_verb alc861_asus_init_verbs[] = { 13590 /* 13591 * Unmute ADC0 and set the default input to mic-in 13592 */ 13593 /* port-A for surround (rear panel) 13594 * according to codec#0 this is the HP jack 13595 */ 13596 { 0x0e, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0 }, /* was 0x00 */ 13597 /* route front PCM to HP */ 13598 { 0x0e, AC_VERB_SET_CONNECT_SEL, 0x01 }, 13599 /* port-B for mic-in (rear panel) with vref */ 13600 { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 }, 13601 /* port-C for line-in (rear panel) */ 13602 { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 }, 13603 /* port-D for Front */ 13604 { 0x0b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 }, 13605 { 0x0b, AC_VERB_SET_CONNECT_SEL, 0x00 }, 13606 /* port-E for HP out (front panel) */ 13607 /* this has to be set to VREF80 */ 13608 { 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 }, 13609 /* route front PCM to HP */ 13610 { 0x0f, AC_VERB_SET_CONNECT_SEL, 0x00 }, 13611 /* port-F for mic-in (front panel) with vref */ 13612 { 0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 }, 13613 /* port-G for CLFE (rear panel) */ 13614 { 0x1f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 }, 13615 /* port-H for side (rear panel) */ 13616 { 0x20, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 }, 13617 /* CD-in */ 13618 { 0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 }, 13619 /* route front mic to ADC1*/ 13620 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00}, 13621 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 13622 /* Unmute DAC0~3 & spdif out*/ 13623 {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 13624 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 13625 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 13626 {0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 13627 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 13628 /* Unmute Mixer 14 (mic) 1c (Line in)*/ 13629 {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 13630 {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 13631 {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 13632 {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 13633 13634 /* Unmute Stereo Mixer 15 */ 13635 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 13636 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 13637 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)}, 13638 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c}, /* Output 0~12 step */ 13639 13640 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 13641 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 13642 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 13643 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 13644 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 13645 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 13646 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 13647 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 13648 /* hp used DAC 3 (Front) */ 13649 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)}, 13650 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)}, 13651 { } 13652 }; 13653 13654 /* additional init verbs for ASUS laptops */ 13655 static struct hda_verb alc861_asus_laptop_init_verbs[] = { 13656 { 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x45 }, /* HP-out */ 13657 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2) }, /* mute line-in */ 13658 { } 13659 }; 13660 13661 /* 13662 * generic initialization of ADC, input mixers and output mixers 13663 */ 13664 static struct hda_verb alc861_auto_init_verbs[] = { 13665 /* 13666 * Unmute ADC0 and set the default input to mic-in 13667 */ 13668 /* {0x08, AC_VERB_SET_CONNECT_SEL, 0x00}, */ 13669 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 13670 13671 /* Unmute DAC0~3 & spdif out*/ 13672 {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 13673 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 13674 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 13675 {0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 13676 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 13677 13678 /* Unmute Mixer 14 (mic) 1c (Line in)*/ 13679 {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 13680 {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 13681 {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 13682 {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 13683 13684 /* Unmute Stereo Mixer 15 */ 13685 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 13686 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 13687 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)}, 13688 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c}, 13689 13690 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 13691 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 13692 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 13693 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 13694 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 13695 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 13696 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 13697 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 13698 13699 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 13700 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 13701 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)}, 13702 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)}, 13703 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 13704 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 13705 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)}, 13706 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)}, 13707 13708 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00}, /* set Mic 1 */ 13709 13710 { } 13711 }; 13712 13713 static struct hda_verb alc861_toshiba_init_verbs[] = { 13714 {0x0f, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT}, 13715 13716 { } 13717 }; 13718 13719 /* toggle speaker-output according to the hp-jack state */ 13720 static void alc861_toshiba_automute(struct hda_codec *codec) 13721 { 13722 unsigned int present; 13723 13724 present = snd_hda_codec_read(codec, 0x0f, 0, 13725 AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; 13726 snd_hda_codec_amp_stereo(codec, 0x16, HDA_INPUT, 0, 13727 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0); 13728 snd_hda_codec_amp_stereo(codec, 0x1a, HDA_INPUT, 3, 13729 HDA_AMP_MUTE, present ? 0 : HDA_AMP_MUTE); 13730 } 13731 13732 static void alc861_toshiba_unsol_event(struct hda_codec *codec, 13733 unsigned int res) 13734 { 13735 if ((res >> 26) == ALC880_HP_EVENT) 13736 alc861_toshiba_automute(codec); 13737 } 13738 13739 /* pcm configuration: identiacal with ALC880 */ 13740 #define alc861_pcm_analog_playback alc880_pcm_analog_playback 13741 #define alc861_pcm_analog_capture alc880_pcm_analog_capture 13742 #define alc861_pcm_digital_playback alc880_pcm_digital_playback 13743 #define alc861_pcm_digital_capture alc880_pcm_digital_capture 13744 13745 13746 #define ALC861_DIGOUT_NID 0x07 13747 13748 static struct hda_channel_mode alc861_8ch_modes[1] = { 13749 { 8, NULL } 13750 }; 13751 13752 static hda_nid_t alc861_dac_nids[4] = { 13753 /* front, surround, clfe, side */ 13754 0x03, 0x06, 0x05, 0x04 13755 }; 13756 13757 static hda_nid_t alc660_dac_nids[3] = { 13758 /* front, clfe, surround */ 13759 0x03, 0x05, 0x06 13760 }; 13761 13762 static hda_nid_t alc861_adc_nids[1] = { 13763 /* ADC0-2 */ 13764 0x08, 13765 }; 13766 13767 static struct hda_input_mux alc861_capture_source = { 13768 .num_items = 5, 13769 .items = { 13770 { "Mic", 0x0 }, 13771 { "Front Mic", 0x3 }, 13772 { "Line", 0x1 }, 13773 { "CD", 0x4 }, 13774 { "Mixer", 0x5 }, 13775 }, 13776 }; 13777 13778 /* fill in the dac_nids table from the parsed pin configuration */ 13779 static int alc861_auto_fill_dac_nids(struct alc_spec *spec, 13780 const struct auto_pin_cfg *cfg) 13781 { 13782 int i; 13783 hda_nid_t nid; 13784 13785 spec->multiout.dac_nids = spec->private_dac_nids; 13786 for (i = 0; i < cfg->line_outs; i++) { 13787 nid = cfg->line_out_pins[i]; 13788 if (nid) { 13789 if (i >= ARRAY_SIZE(alc861_dac_nids)) 13790 continue; 13791 spec->multiout.dac_nids[i] = alc861_dac_nids[i]; 13792 } 13793 } 13794 spec->multiout.num_dacs = cfg->line_outs; 13795 return 0; 13796 } 13797 13798 /* add playback controls from the parsed DAC table */ 13799 static int alc861_auto_create_multi_out_ctls(struct alc_spec *spec, 13800 const struct auto_pin_cfg *cfg) 13801 { 13802 char name[32]; 13803 static const char *chname[4] = { 13804 "Front", "Surround", NULL /*CLFE*/, "Side" 13805 }; 13806 hda_nid_t nid; 13807 int i, idx, err; 13808 13809 for (i = 0; i < cfg->line_outs; i++) { 13810 nid = spec->multiout.dac_nids[i]; 13811 if (!nid) 13812 continue; 13813 if (nid == 0x05) { 13814 /* Center/LFE */ 13815 err = add_control(spec, ALC_CTL_BIND_MUTE, 13816 "Center Playback Switch", 13817 HDA_COMPOSE_AMP_VAL(nid, 1, 0, 13818 HDA_OUTPUT)); 13819 if (err < 0) 13820 return err; 13821 err = add_control(spec, ALC_CTL_BIND_MUTE, 13822 "LFE Playback Switch", 13823 HDA_COMPOSE_AMP_VAL(nid, 2, 0, 13824 HDA_OUTPUT)); 13825 if (err < 0) 13826 return err; 13827 } else { 13828 for (idx = 0; idx < ARRAY_SIZE(alc861_dac_nids) - 1; 13829 idx++) 13830 if (nid == alc861_dac_nids[idx]) 13831 break; 13832 sprintf(name, "%s Playback Switch", chname[idx]); 13833 err = add_control(spec, ALC_CTL_BIND_MUTE, name, 13834 HDA_COMPOSE_AMP_VAL(nid, 3, 0, 13835 HDA_OUTPUT)); 13836 if (err < 0) 13837 return err; 13838 } 13839 } 13840 return 0; 13841 } 13842 13843 static int alc861_auto_create_hp_ctls(struct alc_spec *spec, hda_nid_t pin) 13844 { 13845 int err; 13846 hda_nid_t nid; 13847 13848 if (!pin) 13849 return 0; 13850 13851 if ((pin >= 0x0b && pin <= 0x10) || pin == 0x1f || pin == 0x20) { 13852 nid = 0x03; 13853 err = add_control(spec, ALC_CTL_WIDGET_MUTE, 13854 "Headphone Playback Switch", 13855 HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT)); 13856 if (err < 0) 13857 return err; 13858 spec->multiout.hp_nid = nid; 13859 } 13860 return 0; 13861 } 13862 13863 /* create playback/capture controls for input pins */ 13864 static int alc861_auto_create_analog_input_ctls(struct alc_spec *spec, 13865 const struct auto_pin_cfg *cfg) 13866 { 13867 struct hda_input_mux *imux = &spec->private_imux[0]; 13868 int i, err, idx, idx1; 13869 13870 for (i = 0; i < AUTO_PIN_LAST; i++) { 13871 switch (cfg->input_pins[i]) { 13872 case 0x0c: 13873 idx1 = 1; 13874 idx = 2; /* Line In */ 13875 break; 13876 case 0x0f: 13877 idx1 = 2; 13878 idx = 2; /* Line In */ 13879 break; 13880 case 0x0d: 13881 idx1 = 0; 13882 idx = 1; /* Mic In */ 13883 break; 13884 case 0x10: 13885 idx1 = 3; 13886 idx = 1; /* Mic In */ 13887 break; 13888 case 0x11: 13889 idx1 = 4; 13890 idx = 0; /* CD */ 13891 break; 13892 default: 13893 continue; 13894 } 13895 13896 err = new_analog_input(spec, cfg->input_pins[i], 13897 auto_pin_cfg_labels[i], idx, 0x15); 13898 if (err < 0) 13899 return err; 13900 13901 imux->items[imux->num_items].label = auto_pin_cfg_labels[i]; 13902 imux->items[imux->num_items].index = idx1; 13903 imux->num_items++; 13904 } 13905 return 0; 13906 } 13907 13908 static void alc861_auto_set_output_and_unmute(struct hda_codec *codec, 13909 hda_nid_t nid, 13910 int pin_type, int dac_idx) 13911 { 13912 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_PIN_WIDGET_CONTROL, 13913 pin_type); 13914 snd_hda_codec_write(codec, dac_idx, 0, AC_VERB_SET_AMP_GAIN_MUTE, 13915 AMP_OUT_UNMUTE); 13916 } 13917 13918 static void alc861_auto_init_multi_out(struct hda_codec *codec) 13919 { 13920 struct alc_spec *spec = codec->spec; 13921 int i; 13922 13923 alc_subsystem_id(codec, 0x0e, 0x0f, 0x0b); 13924 for (i = 0; i < spec->autocfg.line_outs; i++) { 13925 hda_nid_t nid = spec->autocfg.line_out_pins[i]; 13926 int pin_type = get_pin_type(spec->autocfg.line_out_type); 13927 if (nid) 13928 alc861_auto_set_output_and_unmute(codec, nid, pin_type, 13929 spec->multiout.dac_nids[i]); 13930 } 13931 } 13932 13933 static void alc861_auto_init_hp_out(struct hda_codec *codec) 13934 { 13935 struct alc_spec *spec = codec->spec; 13936 hda_nid_t pin; 13937 13938 pin = spec->autocfg.hp_pins[0]; 13939 if (pin) /* connect to front */ 13940 alc861_auto_set_output_and_unmute(codec, pin, PIN_HP, 13941 spec->multiout.dac_nids[0]); 13942 pin = spec->autocfg.speaker_pins[0]; 13943 if (pin) 13944 alc861_auto_set_output_and_unmute(codec, pin, PIN_OUT, 0); 13945 } 13946 13947 static void alc861_auto_init_analog_input(struct hda_codec *codec) 13948 { 13949 struct alc_spec *spec = codec->spec; 13950 int i; 13951 13952 for (i = 0; i < AUTO_PIN_LAST; i++) { 13953 hda_nid_t nid = spec->autocfg.input_pins[i]; 13954 if (nid >= 0x0c && nid <= 0x11) 13955 alc_set_input_pin(codec, nid, i); 13956 } 13957 } 13958 13959 /* parse the BIOS configuration and set up the alc_spec */ 13960 /* return 1 if successful, 0 if the proper config is not found, 13961 * or a negative error code 13962 */ 13963 static int alc861_parse_auto_config(struct hda_codec *codec) 13964 { 13965 struct alc_spec *spec = codec->spec; 13966 int err; 13967 static hda_nid_t alc861_ignore[] = { 0x1d, 0 }; 13968 13969 err = snd_hda_parse_pin_def_config(codec, &spec->autocfg, 13970 alc861_ignore); 13971 if (err < 0) 13972 return err; 13973 if (!spec->autocfg.line_outs) 13974 return 0; /* can't find valid BIOS pin config */ 13975 13976 err = alc861_auto_fill_dac_nids(spec, &spec->autocfg); 13977 if (err < 0) 13978 return err; 13979 err = alc861_auto_create_multi_out_ctls(spec, &spec->autocfg); 13980 if (err < 0) 13981 return err; 13982 err = alc861_auto_create_hp_ctls(spec, spec->autocfg.hp_pins[0]); 13983 if (err < 0) 13984 return err; 13985 err = alc861_auto_create_analog_input_ctls(spec, &spec->autocfg); 13986 if (err < 0) 13987 return err; 13988 13989 spec->multiout.max_channels = spec->multiout.num_dacs * 2; 13990 13991 if (spec->autocfg.dig_outs) 13992 spec->multiout.dig_out_nid = ALC861_DIGOUT_NID; 13993 13994 if (spec->kctls.list) 13995 add_mixer(spec, spec->kctls.list); 13996 13997 add_verb(spec, alc861_auto_init_verbs); 13998 13999 spec->num_mux_defs = 1; 14000 spec->input_mux = &spec->private_imux[0]; 14001 14002 spec->adc_nids = alc861_adc_nids; 14003 spec->num_adc_nids = ARRAY_SIZE(alc861_adc_nids); 14004 set_capture_mixer(spec); 14005 14006 return 1; 14007 } 14008 14009 /* additional initialization for auto-configuration model */ 14010 static void alc861_auto_init(struct hda_codec *codec) 14011 { 14012 struct alc_spec *spec = codec->spec; 14013 alc861_auto_init_multi_out(codec); 14014 alc861_auto_init_hp_out(codec); 14015 alc861_auto_init_analog_input(codec); 14016 if (spec->unsol_event) 14017 alc_inithook(codec); 14018 } 14019 14020 #ifdef CONFIG_SND_HDA_POWER_SAVE 14021 static struct hda_amp_list alc861_loopbacks[] = { 14022 { 0x15, HDA_INPUT, 0 }, 14023 { 0x15, HDA_INPUT, 1 }, 14024 { 0x15, HDA_INPUT, 2 }, 14025 { 0x15, HDA_INPUT, 3 }, 14026 { } /* end */ 14027 }; 14028 #endif 14029 14030 14031 /* 14032 * configuration and preset 14033 */ 14034 static const char *alc861_models[ALC861_MODEL_LAST] = { 14035 [ALC861_3ST] = "3stack", 14036 [ALC660_3ST] = "3stack-660", 14037 [ALC861_3ST_DIG] = "3stack-dig", 14038 [ALC861_6ST_DIG] = "6stack-dig", 14039 [ALC861_UNIWILL_M31] = "uniwill-m31", 14040 [ALC861_TOSHIBA] = "toshiba", 14041 [ALC861_ASUS] = "asus", 14042 [ALC861_ASUS_LAPTOP] = "asus-laptop", 14043 [ALC861_AUTO] = "auto", 14044 }; 14045 14046 static struct snd_pci_quirk alc861_cfg_tbl[] = { 14047 SND_PCI_QUIRK(0x1043, 0x1205, "ASUS W7J", ALC861_3ST), 14048 SND_PCI_QUIRK(0x1043, 0x1335, "ASUS F2/3", ALC861_ASUS_LAPTOP), 14049 SND_PCI_QUIRK(0x1043, 0x1338, "ASUS F2/3", ALC861_ASUS_LAPTOP), 14050 SND_PCI_QUIRK(0x1043, 0x1393, "ASUS", ALC861_ASUS), 14051 SND_PCI_QUIRK(0x1043, 0x13d7, "ASUS A9rp", ALC861_ASUS_LAPTOP), 14052 SND_PCI_QUIRK(0x1043, 0x81cb, "ASUS P1-AH2", ALC861_3ST_DIG), 14053 SND_PCI_QUIRK(0x1179, 0xff00, "Toshiba", ALC861_TOSHIBA), 14054 /* FIXME: the entry below breaks Toshiba A100 (model=auto works!) 14055 * Any other models that need this preset? 14056 */ 14057 /* SND_PCI_QUIRK(0x1179, 0xff10, "Toshiba", ALC861_TOSHIBA), */ 14058 SND_PCI_QUIRK(0x1462, 0x7254, "HP dx2200 (MSI MS-7254)", ALC861_3ST), 14059 SND_PCI_QUIRK(0x1462, 0x7297, "HP dx2250 (MSI MS-7297)", ALC861_3ST), 14060 SND_PCI_QUIRK(0x1584, 0x2b01, "Uniwill X40AIx", ALC861_UNIWILL_M31), 14061 SND_PCI_QUIRK(0x1584, 0x9072, "Uniwill m31", ALC861_UNIWILL_M31), 14062 SND_PCI_QUIRK(0x1584, 0x9075, "Airis Praxis N1212", ALC861_ASUS_LAPTOP), 14063 /* FIXME: the below seems conflict */ 14064 /* SND_PCI_QUIRK(0x1584, 0x9075, "Uniwill", ALC861_UNIWILL_M31), */ 14065 SND_PCI_QUIRK(0x1849, 0x0660, "Asrock 939SLI32", ALC660_3ST), 14066 SND_PCI_QUIRK(0x8086, 0xd600, "Intel", ALC861_3ST), 14067 {} 14068 }; 14069 14070 static struct alc_config_preset alc861_presets[] = { 14071 [ALC861_3ST] = { 14072 .mixers = { alc861_3ST_mixer }, 14073 .init_verbs = { alc861_threestack_init_verbs }, 14074 .num_dacs = ARRAY_SIZE(alc861_dac_nids), 14075 .dac_nids = alc861_dac_nids, 14076 .num_channel_mode = ARRAY_SIZE(alc861_threestack_modes), 14077 .channel_mode = alc861_threestack_modes, 14078 .need_dac_fix = 1, 14079 .num_adc_nids = ARRAY_SIZE(alc861_adc_nids), 14080 .adc_nids = alc861_adc_nids, 14081 .input_mux = &alc861_capture_source, 14082 }, 14083 [ALC861_3ST_DIG] = { 14084 .mixers = { alc861_base_mixer }, 14085 .init_verbs = { alc861_threestack_init_verbs }, 14086 .num_dacs = ARRAY_SIZE(alc861_dac_nids), 14087 .dac_nids = alc861_dac_nids, 14088 .dig_out_nid = ALC861_DIGOUT_NID, 14089 .num_channel_mode = ARRAY_SIZE(alc861_threestack_modes), 14090 .channel_mode = alc861_threestack_modes, 14091 .need_dac_fix = 1, 14092 .num_adc_nids = ARRAY_SIZE(alc861_adc_nids), 14093 .adc_nids = alc861_adc_nids, 14094 .input_mux = &alc861_capture_source, 14095 }, 14096 [ALC861_6ST_DIG] = { 14097 .mixers = { alc861_base_mixer }, 14098 .init_verbs = { alc861_base_init_verbs }, 14099 .num_dacs = ARRAY_SIZE(alc861_dac_nids), 14100 .dac_nids = alc861_dac_nids, 14101 .dig_out_nid = ALC861_DIGOUT_NID, 14102 .num_channel_mode = ARRAY_SIZE(alc861_8ch_modes), 14103 .channel_mode = alc861_8ch_modes, 14104 .num_adc_nids = ARRAY_SIZE(alc861_adc_nids), 14105 .adc_nids = alc861_adc_nids, 14106 .input_mux = &alc861_capture_source, 14107 }, 14108 [ALC660_3ST] = { 14109 .mixers = { alc861_3ST_mixer }, 14110 .init_verbs = { alc861_threestack_init_verbs }, 14111 .num_dacs = ARRAY_SIZE(alc660_dac_nids), 14112 .dac_nids = alc660_dac_nids, 14113 .num_channel_mode = ARRAY_SIZE(alc861_threestack_modes), 14114 .channel_mode = alc861_threestack_modes, 14115 .need_dac_fix = 1, 14116 .num_adc_nids = ARRAY_SIZE(alc861_adc_nids), 14117 .adc_nids = alc861_adc_nids, 14118 .input_mux = &alc861_capture_source, 14119 }, 14120 [ALC861_UNIWILL_M31] = { 14121 .mixers = { alc861_uniwill_m31_mixer }, 14122 .init_verbs = { alc861_uniwill_m31_init_verbs }, 14123 .num_dacs = ARRAY_SIZE(alc861_dac_nids), 14124 .dac_nids = alc861_dac_nids, 14125 .dig_out_nid = ALC861_DIGOUT_NID, 14126 .num_channel_mode = ARRAY_SIZE(alc861_uniwill_m31_modes), 14127 .channel_mode = alc861_uniwill_m31_modes, 14128 .need_dac_fix = 1, 14129 .num_adc_nids = ARRAY_SIZE(alc861_adc_nids), 14130 .adc_nids = alc861_adc_nids, 14131 .input_mux = &alc861_capture_source, 14132 }, 14133 [ALC861_TOSHIBA] = { 14134 .mixers = { alc861_toshiba_mixer }, 14135 .init_verbs = { alc861_base_init_verbs, 14136 alc861_toshiba_init_verbs }, 14137 .num_dacs = ARRAY_SIZE(alc861_dac_nids), 14138 .dac_nids = alc861_dac_nids, 14139 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes), 14140 .channel_mode = alc883_3ST_2ch_modes, 14141 .num_adc_nids = ARRAY_SIZE(alc861_adc_nids), 14142 .adc_nids = alc861_adc_nids, 14143 .input_mux = &alc861_capture_source, 14144 .unsol_event = alc861_toshiba_unsol_event, 14145 .init_hook = alc861_toshiba_automute, 14146 }, 14147 [ALC861_ASUS] = { 14148 .mixers = { alc861_asus_mixer }, 14149 .init_verbs = { alc861_asus_init_verbs }, 14150 .num_dacs = ARRAY_SIZE(alc861_dac_nids), 14151 .dac_nids = alc861_dac_nids, 14152 .dig_out_nid = ALC861_DIGOUT_NID, 14153 .num_channel_mode = ARRAY_SIZE(alc861_asus_modes), 14154 .channel_mode = alc861_asus_modes, 14155 .need_dac_fix = 1, 14156 .hp_nid = 0x06, 14157 .num_adc_nids = ARRAY_SIZE(alc861_adc_nids), 14158 .adc_nids = alc861_adc_nids, 14159 .input_mux = &alc861_capture_source, 14160 }, 14161 [ALC861_ASUS_LAPTOP] = { 14162 .mixers = { alc861_toshiba_mixer, alc861_asus_laptop_mixer }, 14163 .init_verbs = { alc861_asus_init_verbs, 14164 alc861_asus_laptop_init_verbs }, 14165 .num_dacs = ARRAY_SIZE(alc861_dac_nids), 14166 .dac_nids = alc861_dac_nids, 14167 .dig_out_nid = ALC861_DIGOUT_NID, 14168 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes), 14169 .channel_mode = alc883_3ST_2ch_modes, 14170 .need_dac_fix = 1, 14171 .num_adc_nids = ARRAY_SIZE(alc861_adc_nids), 14172 .adc_nids = alc861_adc_nids, 14173 .input_mux = &alc861_capture_source, 14174 }, 14175 }; 14176 14177 14178 static int patch_alc861(struct hda_codec *codec) 14179 { 14180 struct alc_spec *spec; 14181 int board_config; 14182 int err; 14183 14184 spec = kzalloc(sizeof(*spec), GFP_KERNEL); 14185 if (spec == NULL) 14186 return -ENOMEM; 14187 14188 codec->spec = spec; 14189 14190 board_config = snd_hda_check_board_config(codec, ALC861_MODEL_LAST, 14191 alc861_models, 14192 alc861_cfg_tbl); 14193 14194 if (board_config < 0) { 14195 printk(KERN_INFO "hda_codec: Unknown model for ALC861, " 14196 "trying auto-probe from BIOS...\n"); 14197 board_config = ALC861_AUTO; 14198 } 14199 14200 if (board_config == ALC861_AUTO) { 14201 /* automatic parse from the BIOS config */ 14202 err = alc861_parse_auto_config(codec); 14203 if (err < 0) { 14204 alc_free(codec); 14205 return err; 14206 } else if (!err) { 14207 printk(KERN_INFO 14208 "hda_codec: Cannot set up configuration " 14209 "from BIOS. Using base mode...\n"); 14210 board_config = ALC861_3ST_DIG; 14211 } 14212 } 14213 14214 err = snd_hda_attach_beep_device(codec, 0x23); 14215 if (err < 0) { 14216 alc_free(codec); 14217 return err; 14218 } 14219 14220 if (board_config != ALC861_AUTO) 14221 setup_preset(spec, &alc861_presets[board_config]); 14222 14223 spec->stream_name_analog = "ALC861 Analog"; 14224 spec->stream_analog_playback = &alc861_pcm_analog_playback; 14225 spec->stream_analog_capture = &alc861_pcm_analog_capture; 14226 14227 spec->stream_name_digital = "ALC861 Digital"; 14228 spec->stream_digital_playback = &alc861_pcm_digital_playback; 14229 spec->stream_digital_capture = &alc861_pcm_digital_capture; 14230 14231 set_beep_amp(spec, 0x23, 0, HDA_OUTPUT); 14232 14233 spec->vmaster_nid = 0x03; 14234 14235 codec->patch_ops = alc_patch_ops; 14236 if (board_config == ALC861_AUTO) 14237 spec->init_hook = alc861_auto_init; 14238 #ifdef CONFIG_SND_HDA_POWER_SAVE 14239 if (!spec->loopback.amplist) 14240 spec->loopback.amplist = alc861_loopbacks; 14241 #endif 14242 codec->proc_widget_hook = print_realtek_coef; 14243 14244 return 0; 14245 } 14246 14247 /* 14248 * ALC861-VD support 14249 * 14250 * Based on ALC882 14251 * 14252 * In addition, an independent DAC 14253 */ 14254 #define ALC861VD_DIGOUT_NID 0x06 14255 14256 static hda_nid_t alc861vd_dac_nids[4] = { 14257 /* front, surr, clfe, side surr */ 14258 0x02, 0x03, 0x04, 0x05 14259 }; 14260 14261 /* dac_nids for ALC660vd are in a different order - according to 14262 * Realtek's driver. 14263 * This should probably tesult in a different mixer for 6stack models 14264 * of ALC660vd codecs, but for now there is only 3stack mixer 14265 * - and it is the same as in 861vd. 14266 * adc_nids in ALC660vd are (is) the same as in 861vd 14267 */ 14268 static hda_nid_t alc660vd_dac_nids[3] = { 14269 /* front, rear, clfe, rear_surr */ 14270 0x02, 0x04, 0x03 14271 }; 14272 14273 static hda_nid_t alc861vd_adc_nids[1] = { 14274 /* ADC0 */ 14275 0x09, 14276 }; 14277 14278 static hda_nid_t alc861vd_capsrc_nids[1] = { 0x22 }; 14279 14280 /* input MUX */ 14281 /* FIXME: should be a matrix-type input source selection */ 14282 static struct hda_input_mux alc861vd_capture_source = { 14283 .num_items = 4, 14284 .items = { 14285 { "Mic", 0x0 }, 14286 { "Front Mic", 0x1 }, 14287 { "Line", 0x2 }, 14288 { "CD", 0x4 }, 14289 }, 14290 }; 14291 14292 static struct hda_input_mux alc861vd_dallas_capture_source = { 14293 .num_items = 2, 14294 .items = { 14295 { "Ext Mic", 0x0 }, 14296 { "Int Mic", 0x1 }, 14297 }, 14298 }; 14299 14300 static struct hda_input_mux alc861vd_hp_capture_source = { 14301 .num_items = 2, 14302 .items = { 14303 { "Front Mic", 0x0 }, 14304 { "ATAPI Mic", 0x1 }, 14305 }, 14306 }; 14307 14308 /* 14309 * 2ch mode 14310 */ 14311 static struct hda_channel_mode alc861vd_3stack_2ch_modes[1] = { 14312 { 2, NULL } 14313 }; 14314 14315 /* 14316 * 6ch mode 14317 */ 14318 static struct hda_verb alc861vd_6stack_ch6_init[] = { 14319 { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 }, 14320 { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 14321 { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 14322 { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 14323 { } /* end */ 14324 }; 14325 14326 /* 14327 * 8ch mode 14328 */ 14329 static struct hda_verb alc861vd_6stack_ch8_init[] = { 14330 { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 14331 { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 14332 { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 14333 { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 14334 { } /* end */ 14335 }; 14336 14337 static struct hda_channel_mode alc861vd_6stack_modes[2] = { 14338 { 6, alc861vd_6stack_ch6_init }, 14339 { 8, alc861vd_6stack_ch8_init }, 14340 }; 14341 14342 static struct snd_kcontrol_new alc861vd_chmode_mixer[] = { 14343 { 14344 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 14345 .name = "Channel Mode", 14346 .info = alc_ch_mode_info, 14347 .get = alc_ch_mode_get, 14348 .put = alc_ch_mode_put, 14349 }, 14350 { } /* end */ 14351 }; 14352 14353 /* Pin assignment: Front=0x14, Rear=0x15, CLFE=0x16, Side=0x17 14354 * Mic=0x18, Front Mic=0x19, Line-In=0x1a, HP=0x1b 14355 */ 14356 static struct snd_kcontrol_new alc861vd_6st_mixer[] = { 14357 HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT), 14358 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 14359 14360 HDA_CODEC_VOLUME("Surround Playback Volume", 0x03, 0x0, HDA_OUTPUT), 14361 HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT), 14362 14363 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x04, 1, 0x0, 14364 HDA_OUTPUT), 14365 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x04, 2, 0x0, 14366 HDA_OUTPUT), 14367 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT), 14368 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT), 14369 14370 HDA_CODEC_VOLUME("Side Playback Volume", 0x05, 0x0, HDA_OUTPUT), 14371 HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT), 14372 14373 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT), 14374 14375 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), 14376 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 14377 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 14378 14379 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT), 14380 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), 14381 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), 14382 14383 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), 14384 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), 14385 14386 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), 14387 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), 14388 14389 { } /* end */ 14390 }; 14391 14392 static struct snd_kcontrol_new alc861vd_3st_mixer[] = { 14393 HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT), 14394 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 14395 14396 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT), 14397 14398 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), 14399 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 14400 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 14401 14402 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT), 14403 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), 14404 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), 14405 14406 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), 14407 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), 14408 14409 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), 14410 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), 14411 14412 { } /* end */ 14413 }; 14414 14415 static struct snd_kcontrol_new alc861vd_lenovo_mixer[] = { 14416 HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT), 14417 /*HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),*/ 14418 HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT), 14419 14420 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT), 14421 14422 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), 14423 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 14424 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 14425 14426 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT), 14427 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), 14428 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), 14429 14430 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), 14431 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), 14432 14433 { } /* end */ 14434 }; 14435 14436 /* Pin assignment: Speaker=0x14, HP = 0x15, 14437 * Ext Mic=0x18, Int Mic = 0x19, CD = 0x1c, PC Beep = 0x1d 14438 */ 14439 static struct snd_kcontrol_new alc861vd_dallas_mixer[] = { 14440 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT), 14441 HDA_BIND_MUTE("Speaker Playback Switch", 0x0c, 2, HDA_INPUT), 14442 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT), 14443 HDA_BIND_MUTE("Headphone Playback Switch", 0x0d, 2, HDA_INPUT), 14444 HDA_CODEC_VOLUME("Ext Mic Boost", 0x18, 0, HDA_INPUT), 14445 HDA_CODEC_VOLUME("Ext Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 14446 HDA_CODEC_MUTE("Ext Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 14447 HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT), 14448 HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), 14449 HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), 14450 { } /* end */ 14451 }; 14452 14453 /* Pin assignment: Speaker=0x14, Line-out = 0x15, 14454 * Front Mic=0x18, ATAPI Mic = 0x19, 14455 */ 14456 static struct snd_kcontrol_new alc861vd_hp_mixer[] = { 14457 HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT), 14458 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 14459 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT), 14460 HDA_BIND_MUTE("Headphone Playback Switch", 0x0d, 2, HDA_INPUT), 14461 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 14462 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 14463 HDA_CODEC_VOLUME("ATAPI Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), 14464 HDA_CODEC_MUTE("ATAPI Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), 14465 14466 { } /* end */ 14467 }; 14468 14469 /* 14470 * generic initialization of ADC, input mixers and output mixers 14471 */ 14472 static struct hda_verb alc861vd_volume_init_verbs[] = { 14473 /* 14474 * Unmute ADC0 and set the default input to mic-in 14475 */ 14476 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00}, 14477 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 14478 14479 /* Unmute input amps (CD, Line In, Mic 1 & Mic 2) of 14480 * the analog-loopback mixer widget 14481 */ 14482 /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */ 14483 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 14484 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 14485 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, 14486 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, 14487 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, 14488 14489 /* Capture mixer: unmute Mic, F-Mic, Line, CD inputs */ 14490 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 14491 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 14492 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)}, 14493 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(4)}, 14494 14495 /* 14496 * Set up output mixers (0x02 - 0x05) 14497 */ 14498 /* set vol=0 to output mixers */ 14499 {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 14500 {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 14501 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 14502 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 14503 14504 /* set up input amps for analog loopback */ 14505 /* Amp Indices: DAC = 0, mixer = 1 */ 14506 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 14507 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 14508 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 14509 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 14510 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 14511 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 14512 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 14513 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 14514 14515 { } 14516 }; 14517 14518 /* 14519 * 3-stack pin configuration: 14520 * front = 0x14, mic/clfe = 0x18, HP = 0x19, line/surr = 0x1a, f-mic = 0x1b 14521 */ 14522 static struct hda_verb alc861vd_3stack_init_verbs[] = { 14523 /* 14524 * Set pin mode and muting 14525 */ 14526 /* set front pin widgets 0x14 for output */ 14527 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 14528 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 14529 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, 14530 14531 /* Mic (rear) pin: input vref at 80% */ 14532 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, 14533 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 14534 /* Front Mic pin: input vref at 80% */ 14535 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, 14536 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 14537 /* Line In pin: input */ 14538 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 14539 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 14540 /* Line-2 In: Headphone output (output 0 - 0x0c) */ 14541 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 14542 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 14543 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, 14544 /* CD pin widget for input */ 14545 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 14546 14547 { } 14548 }; 14549 14550 /* 14551 * 6-stack pin configuration: 14552 */ 14553 static struct hda_verb alc861vd_6stack_init_verbs[] = { 14554 /* 14555 * Set pin mode and muting 14556 */ 14557 /* set front pin widgets 0x14 for output */ 14558 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 14559 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 14560 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, 14561 14562 /* Rear Pin: output 1 (0x0d) */ 14563 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 14564 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 14565 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, 14566 /* CLFE Pin: output 2 (0x0e) */ 14567 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 14568 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 14569 {0x16, AC_VERB_SET_CONNECT_SEL, 0x02}, 14570 /* Side Pin: output 3 (0x0f) */ 14571 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 14572 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 14573 {0x17, AC_VERB_SET_CONNECT_SEL, 0x03}, 14574 14575 /* Mic (rear) pin: input vref at 80% */ 14576 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, 14577 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 14578 /* Front Mic pin: input vref at 80% */ 14579 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, 14580 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 14581 /* Line In pin: input */ 14582 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 14583 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 14584 /* Line-2 In: Headphone output (output 0 - 0x0c) */ 14585 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 14586 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 14587 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, 14588 /* CD pin widget for input */ 14589 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 14590 14591 { } 14592 }; 14593 14594 static struct hda_verb alc861vd_eapd_verbs[] = { 14595 {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2}, 14596 { } 14597 }; 14598 14599 static struct hda_verb alc660vd_eapd_verbs[] = { 14600 {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2}, 14601 {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2}, 14602 { } 14603 }; 14604 14605 static struct hda_verb alc861vd_lenovo_unsol_verbs[] = { 14606 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 14607 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 14608 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)}, 14609 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT}, 14610 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT}, 14611 {} 14612 }; 14613 14614 /* toggle speaker-output according to the hp-jack state */ 14615 static void alc861vd_lenovo_hp_automute(struct hda_codec *codec) 14616 { 14617 unsigned int present; 14618 unsigned char bits; 14619 14620 present = snd_hda_codec_read(codec, 0x1b, 0, 14621 AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; 14622 bits = present ? HDA_AMP_MUTE : 0; 14623 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0, 14624 HDA_AMP_MUTE, bits); 14625 } 14626 14627 static void alc861vd_lenovo_mic_automute(struct hda_codec *codec) 14628 { 14629 unsigned int present; 14630 unsigned char bits; 14631 14632 present = snd_hda_codec_read(codec, 0x18, 0, 14633 AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; 14634 bits = present ? HDA_AMP_MUTE : 0; 14635 snd_hda_codec_amp_stereo(codec, 0x0b, HDA_INPUT, 1, 14636 HDA_AMP_MUTE, bits); 14637 } 14638 14639 static void alc861vd_lenovo_automute(struct hda_codec *codec) 14640 { 14641 alc861vd_lenovo_hp_automute(codec); 14642 alc861vd_lenovo_mic_automute(codec); 14643 } 14644 14645 static void alc861vd_lenovo_unsol_event(struct hda_codec *codec, 14646 unsigned int res) 14647 { 14648 switch (res >> 26) { 14649 case ALC880_HP_EVENT: 14650 alc861vd_lenovo_hp_automute(codec); 14651 break; 14652 case ALC880_MIC_EVENT: 14653 alc861vd_lenovo_mic_automute(codec); 14654 break; 14655 } 14656 } 14657 14658 static struct hda_verb alc861vd_dallas_verbs[] = { 14659 {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 14660 {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 14661 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 14662 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 14663 14664 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 14665 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 14666 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 14667 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 14668 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 14669 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 14670 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 14671 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 14672 14673 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 14674 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 14675 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 14676 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 14677 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 14678 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 14679 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 14680 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 14681 14682 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50}, 14683 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 14684 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50}, 14685 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 14686 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 14687 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 14688 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 14689 {0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 14690 14691 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 14692 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, 14693 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, 14694 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, 14695 14696 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 14697 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00}, 14698 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT}, 14699 14700 { } /* end */ 14701 }; 14702 14703 /* toggle speaker-output according to the hp-jack state */ 14704 static void alc861vd_dallas_automute(struct hda_codec *codec) 14705 { 14706 unsigned int present; 14707 14708 present = snd_hda_codec_read(codec, 0x15, 0, 14709 AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; 14710 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0, 14711 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0); 14712 } 14713 14714 static void alc861vd_dallas_unsol_event(struct hda_codec *codec, unsigned int res) 14715 { 14716 if ((res >> 26) == ALC880_HP_EVENT) 14717 alc861vd_dallas_automute(codec); 14718 } 14719 14720 #ifdef CONFIG_SND_HDA_POWER_SAVE 14721 #define alc861vd_loopbacks alc880_loopbacks 14722 #endif 14723 14724 /* pcm configuration: identiacal with ALC880 */ 14725 #define alc861vd_pcm_analog_playback alc880_pcm_analog_playback 14726 #define alc861vd_pcm_analog_capture alc880_pcm_analog_capture 14727 #define alc861vd_pcm_digital_playback alc880_pcm_digital_playback 14728 #define alc861vd_pcm_digital_capture alc880_pcm_digital_capture 14729 14730 /* 14731 * configuration and preset 14732 */ 14733 static const char *alc861vd_models[ALC861VD_MODEL_LAST] = { 14734 [ALC660VD_3ST] = "3stack-660", 14735 [ALC660VD_3ST_DIG] = "3stack-660-digout", 14736 [ALC660VD_ASUS_V1S] = "asus-v1s", 14737 [ALC861VD_3ST] = "3stack", 14738 [ALC861VD_3ST_DIG] = "3stack-digout", 14739 [ALC861VD_6ST_DIG] = "6stack-digout", 14740 [ALC861VD_LENOVO] = "lenovo", 14741 [ALC861VD_DALLAS] = "dallas", 14742 [ALC861VD_HP] = "hp", 14743 [ALC861VD_AUTO] = "auto", 14744 }; 14745 14746 static struct snd_pci_quirk alc861vd_cfg_tbl[] = { 14747 SND_PCI_QUIRK(0x1019, 0xa88d, "Realtek ALC660 demo", ALC660VD_3ST), 14748 SND_PCI_QUIRK(0x103c, 0x30bf, "HP TX1000", ALC861VD_HP), 14749 SND_PCI_QUIRK(0x1043, 0x12e2, "Asus z35m", ALC660VD_3ST), 14750 SND_PCI_QUIRK(0x1043, 0x1339, "Asus G1", ALC660VD_3ST), 14751 SND_PCI_QUIRK(0x1043, 0x1633, "Asus V1Sn", ALC660VD_ASUS_V1S), 14752 SND_PCI_QUIRK(0x1043, 0x81e7, "ASUS", ALC660VD_3ST_DIG), 14753 SND_PCI_QUIRK(0x10de, 0x03f0, "Realtek ALC660 demo", ALC660VD_3ST), 14754 SND_PCI_QUIRK(0x1179, 0xff00, "Toshiba A135", ALC861VD_LENOVO), 14755 /*SND_PCI_QUIRK(0x1179, 0xff00, "DALLAS", ALC861VD_DALLAS),*/ /*lenovo*/ 14756 SND_PCI_QUIRK(0x1179, 0xff01, "DALLAS", ALC861VD_DALLAS), 14757 SND_PCI_QUIRK(0x1179, 0xff03, "Toshiba P205", ALC861VD_LENOVO), 14758 SND_PCI_QUIRK(0x1179, 0xff31, "Toshiba L30-149", ALC861VD_DALLAS), 14759 SND_PCI_QUIRK(0x1565, 0x820d, "Biostar NF61S SE", ALC861VD_6ST_DIG), 14760 SND_PCI_QUIRK_VENDOR(0x17aa, "Lenovo", ALC861VD_LENOVO), 14761 SND_PCI_QUIRK(0x1849, 0x0862, "ASRock K8NF6G-VSTA", ALC861VD_6ST_DIG), 14762 {} 14763 }; 14764 14765 static struct alc_config_preset alc861vd_presets[] = { 14766 [ALC660VD_3ST] = { 14767 .mixers = { alc861vd_3st_mixer }, 14768 .init_verbs = { alc861vd_volume_init_verbs, 14769 alc861vd_3stack_init_verbs }, 14770 .num_dacs = ARRAY_SIZE(alc660vd_dac_nids), 14771 .dac_nids = alc660vd_dac_nids, 14772 .num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes), 14773 .channel_mode = alc861vd_3stack_2ch_modes, 14774 .input_mux = &alc861vd_capture_source, 14775 }, 14776 [ALC660VD_3ST_DIG] = { 14777 .mixers = { alc861vd_3st_mixer }, 14778 .init_verbs = { alc861vd_volume_init_verbs, 14779 alc861vd_3stack_init_verbs }, 14780 .num_dacs = ARRAY_SIZE(alc660vd_dac_nids), 14781 .dac_nids = alc660vd_dac_nids, 14782 .dig_out_nid = ALC861VD_DIGOUT_NID, 14783 .num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes), 14784 .channel_mode = alc861vd_3stack_2ch_modes, 14785 .input_mux = &alc861vd_capture_source, 14786 }, 14787 [ALC861VD_3ST] = { 14788 .mixers = { alc861vd_3st_mixer }, 14789 .init_verbs = { alc861vd_volume_init_verbs, 14790 alc861vd_3stack_init_verbs }, 14791 .num_dacs = ARRAY_SIZE(alc861vd_dac_nids), 14792 .dac_nids = alc861vd_dac_nids, 14793 .num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes), 14794 .channel_mode = alc861vd_3stack_2ch_modes, 14795 .input_mux = &alc861vd_capture_source, 14796 }, 14797 [ALC861VD_3ST_DIG] = { 14798 .mixers = { alc861vd_3st_mixer }, 14799 .init_verbs = { alc861vd_volume_init_verbs, 14800 alc861vd_3stack_init_verbs }, 14801 .num_dacs = ARRAY_SIZE(alc861vd_dac_nids), 14802 .dac_nids = alc861vd_dac_nids, 14803 .dig_out_nid = ALC861VD_DIGOUT_NID, 14804 .num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes), 14805 .channel_mode = alc861vd_3stack_2ch_modes, 14806 .input_mux = &alc861vd_capture_source, 14807 }, 14808 [ALC861VD_6ST_DIG] = { 14809 .mixers = { alc861vd_6st_mixer, alc861vd_chmode_mixer }, 14810 .init_verbs = { alc861vd_volume_init_verbs, 14811 alc861vd_6stack_init_verbs }, 14812 .num_dacs = ARRAY_SIZE(alc861vd_dac_nids), 14813 .dac_nids = alc861vd_dac_nids, 14814 .dig_out_nid = ALC861VD_DIGOUT_NID, 14815 .num_channel_mode = ARRAY_SIZE(alc861vd_6stack_modes), 14816 .channel_mode = alc861vd_6stack_modes, 14817 .input_mux = &alc861vd_capture_source, 14818 }, 14819 [ALC861VD_LENOVO] = { 14820 .mixers = { alc861vd_lenovo_mixer }, 14821 .init_verbs = { alc861vd_volume_init_verbs, 14822 alc861vd_3stack_init_verbs, 14823 alc861vd_eapd_verbs, 14824 alc861vd_lenovo_unsol_verbs }, 14825 .num_dacs = ARRAY_SIZE(alc660vd_dac_nids), 14826 .dac_nids = alc660vd_dac_nids, 14827 .num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes), 14828 .channel_mode = alc861vd_3stack_2ch_modes, 14829 .input_mux = &alc861vd_capture_source, 14830 .unsol_event = alc861vd_lenovo_unsol_event, 14831 .init_hook = alc861vd_lenovo_automute, 14832 }, 14833 [ALC861VD_DALLAS] = { 14834 .mixers = { alc861vd_dallas_mixer }, 14835 .init_verbs = { alc861vd_dallas_verbs }, 14836 .num_dacs = ARRAY_SIZE(alc861vd_dac_nids), 14837 .dac_nids = alc861vd_dac_nids, 14838 .num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes), 14839 .channel_mode = alc861vd_3stack_2ch_modes, 14840 .input_mux = &alc861vd_dallas_capture_source, 14841 .unsol_event = alc861vd_dallas_unsol_event, 14842 .init_hook = alc861vd_dallas_automute, 14843 }, 14844 [ALC861VD_HP] = { 14845 .mixers = { alc861vd_hp_mixer }, 14846 .init_verbs = { alc861vd_dallas_verbs, alc861vd_eapd_verbs }, 14847 .num_dacs = ARRAY_SIZE(alc861vd_dac_nids), 14848 .dac_nids = alc861vd_dac_nids, 14849 .dig_out_nid = ALC861VD_DIGOUT_NID, 14850 .num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes), 14851 .channel_mode = alc861vd_3stack_2ch_modes, 14852 .input_mux = &alc861vd_hp_capture_source, 14853 .unsol_event = alc861vd_dallas_unsol_event, 14854 .init_hook = alc861vd_dallas_automute, 14855 }, 14856 [ALC660VD_ASUS_V1S] = { 14857 .mixers = { alc861vd_lenovo_mixer }, 14858 .init_verbs = { alc861vd_volume_init_verbs, 14859 alc861vd_3stack_init_verbs, 14860 alc861vd_eapd_verbs, 14861 alc861vd_lenovo_unsol_verbs }, 14862 .num_dacs = ARRAY_SIZE(alc660vd_dac_nids), 14863 .dac_nids = alc660vd_dac_nids, 14864 .dig_out_nid = ALC861VD_DIGOUT_NID, 14865 .num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes), 14866 .channel_mode = alc861vd_3stack_2ch_modes, 14867 .input_mux = &alc861vd_capture_source, 14868 .unsol_event = alc861vd_lenovo_unsol_event, 14869 .init_hook = alc861vd_lenovo_automute, 14870 }, 14871 }; 14872 14873 /* 14874 * BIOS auto configuration 14875 */ 14876 static void alc861vd_auto_set_output_and_unmute(struct hda_codec *codec, 14877 hda_nid_t nid, int pin_type, int dac_idx) 14878 { 14879 alc_set_pin_output(codec, nid, pin_type); 14880 } 14881 14882 static void alc861vd_auto_init_multi_out(struct hda_codec *codec) 14883 { 14884 struct alc_spec *spec = codec->spec; 14885 int i; 14886 14887 alc_subsystem_id(codec, 0x15, 0x1b, 0x14); 14888 for (i = 0; i <= HDA_SIDE; i++) { 14889 hda_nid_t nid = spec->autocfg.line_out_pins[i]; 14890 int pin_type = get_pin_type(spec->autocfg.line_out_type); 14891 if (nid) 14892 alc861vd_auto_set_output_and_unmute(codec, nid, 14893 pin_type, i); 14894 } 14895 } 14896 14897 14898 static void alc861vd_auto_init_hp_out(struct hda_codec *codec) 14899 { 14900 struct alc_spec *spec = codec->spec; 14901 hda_nid_t pin; 14902 14903 pin = spec->autocfg.hp_pins[0]; 14904 if (pin) /* connect to front and use dac 0 */ 14905 alc861vd_auto_set_output_and_unmute(codec, pin, PIN_HP, 0); 14906 pin = spec->autocfg.speaker_pins[0]; 14907 if (pin) 14908 alc861vd_auto_set_output_and_unmute(codec, pin, PIN_OUT, 0); 14909 } 14910 14911 #define alc861vd_is_input_pin(nid) alc880_is_input_pin(nid) 14912 #define ALC861VD_PIN_CD_NID ALC880_PIN_CD_NID 14913 14914 static void alc861vd_auto_init_analog_input(struct hda_codec *codec) 14915 { 14916 struct alc_spec *spec = codec->spec; 14917 int i; 14918 14919 for (i = 0; i < AUTO_PIN_LAST; i++) { 14920 hda_nid_t nid = spec->autocfg.input_pins[i]; 14921 if (alc861vd_is_input_pin(nid)) { 14922 alc_set_input_pin(codec, nid, i); 14923 if (nid != ALC861VD_PIN_CD_NID && 14924 (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP)) 14925 snd_hda_codec_write(codec, nid, 0, 14926 AC_VERB_SET_AMP_GAIN_MUTE, 14927 AMP_OUT_MUTE); 14928 } 14929 } 14930 } 14931 14932 #define alc861vd_auto_init_input_src alc882_auto_init_input_src 14933 14934 #define alc861vd_idx_to_mixer_vol(nid) ((nid) + 0x02) 14935 #define alc861vd_idx_to_mixer_switch(nid) ((nid) + 0x0c) 14936 14937 /* add playback controls from the parsed DAC table */ 14938 /* Based on ALC880 version. But ALC861VD has separate, 14939 * different NIDs for mute/unmute switch and volume control */ 14940 static int alc861vd_auto_create_multi_out_ctls(struct alc_spec *spec, 14941 const struct auto_pin_cfg *cfg) 14942 { 14943 char name[32]; 14944 static const char *chname[4] = {"Front", "Surround", "CLFE", "Side"}; 14945 hda_nid_t nid_v, nid_s; 14946 int i, err; 14947 14948 for (i = 0; i < cfg->line_outs; i++) { 14949 if (!spec->multiout.dac_nids[i]) 14950 continue; 14951 nid_v = alc861vd_idx_to_mixer_vol( 14952 alc880_dac_to_idx( 14953 spec->multiout.dac_nids[i])); 14954 nid_s = alc861vd_idx_to_mixer_switch( 14955 alc880_dac_to_idx( 14956 spec->multiout.dac_nids[i])); 14957 14958 if (i == 2) { 14959 /* Center/LFE */ 14960 err = add_control(spec, ALC_CTL_WIDGET_VOL, 14961 "Center Playback Volume", 14962 HDA_COMPOSE_AMP_VAL(nid_v, 1, 0, 14963 HDA_OUTPUT)); 14964 if (err < 0) 14965 return err; 14966 err = add_control(spec, ALC_CTL_WIDGET_VOL, 14967 "LFE Playback Volume", 14968 HDA_COMPOSE_AMP_VAL(nid_v, 2, 0, 14969 HDA_OUTPUT)); 14970 if (err < 0) 14971 return err; 14972 err = add_control(spec, ALC_CTL_BIND_MUTE, 14973 "Center Playback Switch", 14974 HDA_COMPOSE_AMP_VAL(nid_s, 1, 2, 14975 HDA_INPUT)); 14976 if (err < 0) 14977 return err; 14978 err = add_control(spec, ALC_CTL_BIND_MUTE, 14979 "LFE Playback Switch", 14980 HDA_COMPOSE_AMP_VAL(nid_s, 2, 2, 14981 HDA_INPUT)); 14982 if (err < 0) 14983 return err; 14984 } else { 14985 sprintf(name, "%s Playback Volume", chname[i]); 14986 err = add_control(spec, ALC_CTL_WIDGET_VOL, name, 14987 HDA_COMPOSE_AMP_VAL(nid_v, 3, 0, 14988 HDA_OUTPUT)); 14989 if (err < 0) 14990 return err; 14991 sprintf(name, "%s Playback Switch", chname[i]); 14992 err = add_control(spec, ALC_CTL_BIND_MUTE, name, 14993 HDA_COMPOSE_AMP_VAL(nid_s, 3, 2, 14994 HDA_INPUT)); 14995 if (err < 0) 14996 return err; 14997 } 14998 } 14999 return 0; 15000 } 15001 15002 /* add playback controls for speaker and HP outputs */ 15003 /* Based on ALC880 version. But ALC861VD has separate, 15004 * different NIDs for mute/unmute switch and volume control */ 15005 static int alc861vd_auto_create_extra_out(struct alc_spec *spec, 15006 hda_nid_t pin, const char *pfx) 15007 { 15008 hda_nid_t nid_v, nid_s; 15009 int err; 15010 char name[32]; 15011 15012 if (!pin) 15013 return 0; 15014 15015 if (alc880_is_fixed_pin(pin)) { 15016 nid_v = alc880_idx_to_dac(alc880_fixed_pin_idx(pin)); 15017 /* specify the DAC as the extra output */ 15018 if (!spec->multiout.hp_nid) 15019 spec->multiout.hp_nid = nid_v; 15020 else 15021 spec->multiout.extra_out_nid[0] = nid_v; 15022 /* control HP volume/switch on the output mixer amp */ 15023 nid_v = alc861vd_idx_to_mixer_vol( 15024 alc880_fixed_pin_idx(pin)); 15025 nid_s = alc861vd_idx_to_mixer_switch( 15026 alc880_fixed_pin_idx(pin)); 15027 15028 sprintf(name, "%s Playback Volume", pfx); 15029 err = add_control(spec, ALC_CTL_WIDGET_VOL, name, 15030 HDA_COMPOSE_AMP_VAL(nid_v, 3, 0, HDA_OUTPUT)); 15031 if (err < 0) 15032 return err; 15033 sprintf(name, "%s Playback Switch", pfx); 15034 err = add_control(spec, ALC_CTL_BIND_MUTE, name, 15035 HDA_COMPOSE_AMP_VAL(nid_s, 3, 2, HDA_INPUT)); 15036 if (err < 0) 15037 return err; 15038 } else if (alc880_is_multi_pin(pin)) { 15039 /* set manual connection */ 15040 /* we have only a switch on HP-out PIN */ 15041 sprintf(name, "%s Playback Switch", pfx); 15042 err = add_control(spec, ALC_CTL_WIDGET_MUTE, name, 15043 HDA_COMPOSE_AMP_VAL(pin, 3, 0, HDA_OUTPUT)); 15044 if (err < 0) 15045 return err; 15046 } 15047 return 0; 15048 } 15049 15050 /* parse the BIOS configuration and set up the alc_spec 15051 * return 1 if successful, 0 if the proper config is not found, 15052 * or a negative error code 15053 * Based on ALC880 version - had to change it to override 15054 * alc880_auto_create_extra_out and alc880_auto_create_multi_out_ctls */ 15055 static int alc861vd_parse_auto_config(struct hda_codec *codec) 15056 { 15057 struct alc_spec *spec = codec->spec; 15058 int err; 15059 static hda_nid_t alc861vd_ignore[] = { 0x1d, 0 }; 15060 15061 err = snd_hda_parse_pin_def_config(codec, &spec->autocfg, 15062 alc861vd_ignore); 15063 if (err < 0) 15064 return err; 15065 if (!spec->autocfg.line_outs) 15066 return 0; /* can't find valid BIOS pin config */ 15067 15068 err = alc880_auto_fill_dac_nids(spec, &spec->autocfg); 15069 if (err < 0) 15070 return err; 15071 err = alc861vd_auto_create_multi_out_ctls(spec, &spec->autocfg); 15072 if (err < 0) 15073 return err; 15074 err = alc861vd_auto_create_extra_out(spec, 15075 spec->autocfg.speaker_pins[0], 15076 "Speaker"); 15077 if (err < 0) 15078 return err; 15079 err = alc861vd_auto_create_extra_out(spec, 15080 spec->autocfg.hp_pins[0], 15081 "Headphone"); 15082 if (err < 0) 15083 return err; 15084 err = alc880_auto_create_analog_input_ctls(spec, &spec->autocfg); 15085 if (err < 0) 15086 return err; 15087 15088 spec->multiout.max_channels = spec->multiout.num_dacs * 2; 15089 15090 if (spec->autocfg.dig_outs) 15091 spec->multiout.dig_out_nid = ALC861VD_DIGOUT_NID; 15092 15093 if (spec->kctls.list) 15094 add_mixer(spec, spec->kctls.list); 15095 15096 add_verb(spec, alc861vd_volume_init_verbs); 15097 15098 spec->num_mux_defs = 1; 15099 spec->input_mux = &spec->private_imux[0]; 15100 15101 err = alc_auto_add_mic_boost(codec); 15102 if (err < 0) 15103 return err; 15104 15105 return 1; 15106 } 15107 15108 /* additional initialization for auto-configuration model */ 15109 static void alc861vd_auto_init(struct hda_codec *codec) 15110 { 15111 struct alc_spec *spec = codec->spec; 15112 alc861vd_auto_init_multi_out(codec); 15113 alc861vd_auto_init_hp_out(codec); 15114 alc861vd_auto_init_analog_input(codec); 15115 alc861vd_auto_init_input_src(codec); 15116 if (spec->unsol_event) 15117 alc_inithook(codec); 15118 } 15119 15120 static int patch_alc861vd(struct hda_codec *codec) 15121 { 15122 struct alc_spec *spec; 15123 int err, board_config; 15124 15125 spec = kzalloc(sizeof(*spec), GFP_KERNEL); 15126 if (spec == NULL) 15127 return -ENOMEM; 15128 15129 codec->spec = spec; 15130 15131 board_config = snd_hda_check_board_config(codec, ALC861VD_MODEL_LAST, 15132 alc861vd_models, 15133 alc861vd_cfg_tbl); 15134 15135 if (board_config < 0 || board_config >= ALC861VD_MODEL_LAST) { 15136 printk(KERN_INFO "hda_codec: Unknown model for ALC660VD/" 15137 "ALC861VD, trying auto-probe from BIOS...\n"); 15138 board_config = ALC861VD_AUTO; 15139 } 15140 15141 if (board_config == ALC861VD_AUTO) { 15142 /* automatic parse from the BIOS config */ 15143 err = alc861vd_parse_auto_config(codec); 15144 if (err < 0) { 15145 alc_free(codec); 15146 return err; 15147 } else if (!err) { 15148 printk(KERN_INFO 15149 "hda_codec: Cannot set up configuration " 15150 "from BIOS. Using base mode...\n"); 15151 board_config = ALC861VD_3ST; 15152 } 15153 } 15154 15155 err = snd_hda_attach_beep_device(codec, 0x23); 15156 if (err < 0) { 15157 alc_free(codec); 15158 return err; 15159 } 15160 15161 if (board_config != ALC861VD_AUTO) 15162 setup_preset(spec, &alc861vd_presets[board_config]); 15163 15164 if (codec->vendor_id == 0x10ec0660) { 15165 spec->stream_name_analog = "ALC660-VD Analog"; 15166 spec->stream_name_digital = "ALC660-VD Digital"; 15167 /* always turn on EAPD */ 15168 add_verb(spec, alc660vd_eapd_verbs); 15169 } else { 15170 spec->stream_name_analog = "ALC861VD Analog"; 15171 spec->stream_name_digital = "ALC861VD Digital"; 15172 } 15173 15174 spec->stream_analog_playback = &alc861vd_pcm_analog_playback; 15175 spec->stream_analog_capture = &alc861vd_pcm_analog_capture; 15176 15177 spec->stream_digital_playback = &alc861vd_pcm_digital_playback; 15178 spec->stream_digital_capture = &alc861vd_pcm_digital_capture; 15179 15180 spec->adc_nids = alc861vd_adc_nids; 15181 spec->num_adc_nids = ARRAY_SIZE(alc861vd_adc_nids); 15182 spec->capsrc_nids = alc861vd_capsrc_nids; 15183 spec->capture_style = CAPT_MIX; 15184 15185 set_capture_mixer(spec); 15186 set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT); 15187 15188 spec->vmaster_nid = 0x02; 15189 15190 codec->patch_ops = alc_patch_ops; 15191 15192 if (board_config == ALC861VD_AUTO) 15193 spec->init_hook = alc861vd_auto_init; 15194 #ifdef CONFIG_SND_HDA_POWER_SAVE 15195 if (!spec->loopback.amplist) 15196 spec->loopback.amplist = alc861vd_loopbacks; 15197 #endif 15198 codec->proc_widget_hook = print_realtek_coef; 15199 15200 return 0; 15201 } 15202 15203 /* 15204 * ALC662 support 15205 * 15206 * ALC662 is almost identical with ALC880 but has cleaner and more flexible 15207 * configuration. Each pin widget can choose any input DACs and a mixer. 15208 * Each ADC is connected from a mixer of all inputs. This makes possible 15209 * 6-channel independent captures. 15210 * 15211 * In addition, an independent DAC for the multi-playback (not used in this 15212 * driver yet). 15213 */ 15214 #define ALC662_DIGOUT_NID 0x06 15215 #define ALC662_DIGIN_NID 0x0a 15216 15217 static hda_nid_t alc662_dac_nids[4] = { 15218 /* front, rear, clfe, rear_surr */ 15219 0x02, 0x03, 0x04 15220 }; 15221 15222 static hda_nid_t alc272_dac_nids[2] = { 15223 0x02, 0x03 15224 }; 15225 15226 static hda_nid_t alc662_adc_nids[1] = { 15227 /* ADC1-2 */ 15228 0x09, 15229 }; 15230 15231 static hda_nid_t alc272_adc_nids[1] = { 15232 /* ADC1-2 */ 15233 0x08, 15234 }; 15235 15236 static hda_nid_t alc662_capsrc_nids[1] = { 0x22 }; 15237 static hda_nid_t alc272_capsrc_nids[1] = { 0x23 }; 15238 15239 15240 /* input MUX */ 15241 /* FIXME: should be a matrix-type input source selection */ 15242 static struct hda_input_mux alc662_capture_source = { 15243 .num_items = 4, 15244 .items = { 15245 { "Mic", 0x0 }, 15246 { "Front Mic", 0x1 }, 15247 { "Line", 0x2 }, 15248 { "CD", 0x4 }, 15249 }, 15250 }; 15251 15252 static struct hda_input_mux alc662_lenovo_101e_capture_source = { 15253 .num_items = 2, 15254 .items = { 15255 { "Mic", 0x1 }, 15256 { "Line", 0x2 }, 15257 }, 15258 }; 15259 15260 static struct hda_input_mux alc662_eeepc_capture_source = { 15261 .num_items = 2, 15262 .items = { 15263 { "i-Mic", 0x1 }, 15264 { "e-Mic", 0x0 }, 15265 }, 15266 }; 15267 15268 static struct hda_input_mux alc663_capture_source = { 15269 .num_items = 3, 15270 .items = { 15271 { "Mic", 0x0 }, 15272 { "Front Mic", 0x1 }, 15273 { "Line", 0x2 }, 15274 }, 15275 }; 15276 15277 static struct hda_input_mux alc663_m51va_capture_source = { 15278 .num_items = 2, 15279 .items = { 15280 { "Ext-Mic", 0x0 }, 15281 { "D-Mic", 0x9 }, 15282 }, 15283 }; 15284 15285 /* 15286 * 2ch mode 15287 */ 15288 static struct hda_channel_mode alc662_3ST_2ch_modes[1] = { 15289 { 2, NULL } 15290 }; 15291 15292 /* 15293 * 2ch mode 15294 */ 15295 static struct hda_verb alc662_3ST_ch2_init[] = { 15296 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, 15297 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE }, 15298 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN }, 15299 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE }, 15300 { } /* end */ 15301 }; 15302 15303 /* 15304 * 6ch mode 15305 */ 15306 static struct hda_verb alc662_3ST_ch6_init[] = { 15307 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 15308 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 15309 { 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 }, 15310 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 15311 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 15312 { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 }, 15313 { } /* end */ 15314 }; 15315 15316 static struct hda_channel_mode alc662_3ST_6ch_modes[2] = { 15317 { 2, alc662_3ST_ch2_init }, 15318 { 6, alc662_3ST_ch6_init }, 15319 }; 15320 15321 /* 15322 * 2ch mode 15323 */ 15324 static struct hda_verb alc662_sixstack_ch6_init[] = { 15325 { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 }, 15326 { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 }, 15327 { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 15328 { } /* end */ 15329 }; 15330 15331 /* 15332 * 6ch mode 15333 */ 15334 static struct hda_verb alc662_sixstack_ch8_init[] = { 15335 { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 15336 { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 15337 { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 15338 { } /* end */ 15339 }; 15340 15341 static struct hda_channel_mode alc662_5stack_modes[2] = { 15342 { 2, alc662_sixstack_ch6_init }, 15343 { 6, alc662_sixstack_ch8_init }, 15344 }; 15345 15346 /* Pin assignment: Front=0x14, Rear=0x15, CLFE=0x16, Side=0x17 15347 * Mic=0x18, Front Mic=0x19, Line-In=0x1a, HP=0x1b 15348 */ 15349 15350 static struct snd_kcontrol_new alc662_base_mixer[] = { 15351 /* output mixer control */ 15352 HDA_CODEC_VOLUME("Front Playback Volume", 0x2, 0x0, HDA_OUTPUT), 15353 HDA_CODEC_MUTE("Front Playback Switch", 0x0c, 0x0, HDA_INPUT), 15354 HDA_CODEC_VOLUME("Surround Playback Volume", 0x3, 0x0, HDA_OUTPUT), 15355 HDA_CODEC_MUTE("Surround Playback Switch", 0x0d, 0x0, HDA_INPUT), 15356 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x04, 1, 0x0, HDA_OUTPUT), 15357 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x04, 2, 0x0, HDA_OUTPUT), 15358 HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x0e, 1, 0x0, HDA_INPUT), 15359 HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 0x0, HDA_INPUT), 15360 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT), 15361 15362 /*Input mixer control */ 15363 HDA_CODEC_VOLUME("CD Playback Volume", 0xb, 0x4, HDA_INPUT), 15364 HDA_CODEC_MUTE("CD Playback Switch", 0xb, 0x4, HDA_INPUT), 15365 HDA_CODEC_VOLUME("Line Playback Volume", 0xb, 0x02, HDA_INPUT), 15366 HDA_CODEC_MUTE("Line Playback Switch", 0xb, 0x02, HDA_INPUT), 15367 HDA_CODEC_VOLUME("Mic Playback Volume", 0xb, 0x0, HDA_INPUT), 15368 HDA_CODEC_MUTE("Mic Playback Switch", 0xb, 0x0, HDA_INPUT), 15369 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0xb, 0x01, HDA_INPUT), 15370 HDA_CODEC_MUTE("Front Mic Playback Switch", 0xb, 0x01, HDA_INPUT), 15371 { } /* end */ 15372 }; 15373 15374 static struct snd_kcontrol_new alc662_3ST_2ch_mixer[] = { 15375 HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT), 15376 HDA_CODEC_MUTE("Front Playback Switch", 0x0c, 0x0, HDA_INPUT), 15377 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT), 15378 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), 15379 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), 15380 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), 15381 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), 15382 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 15383 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 15384 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), 15385 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), 15386 { } /* end */ 15387 }; 15388 15389 static struct snd_kcontrol_new alc662_3ST_6ch_mixer[] = { 15390 HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT), 15391 HDA_CODEC_MUTE("Front Playback Switch", 0x0c, 0x0, HDA_INPUT), 15392 HDA_CODEC_VOLUME("Surround Playback Volume", 0x03, 0x0, HDA_OUTPUT), 15393 HDA_CODEC_MUTE("Surround Playback Switch", 0x0d, 0x0, HDA_INPUT), 15394 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x04, 1, 0x0, HDA_OUTPUT), 15395 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x04, 2, 0x0, HDA_OUTPUT), 15396 HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x0e, 1, 0x0, HDA_INPUT), 15397 HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 0x0, HDA_INPUT), 15398 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT), 15399 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), 15400 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), 15401 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), 15402 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), 15403 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 15404 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 15405 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), 15406 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), 15407 { } /* end */ 15408 }; 15409 15410 static struct snd_kcontrol_new alc662_lenovo_101e_mixer[] = { 15411 HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT), 15412 HDA_BIND_MUTE("Front Playback Switch", 0x02, 2, HDA_INPUT), 15413 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x03, 0x0, HDA_OUTPUT), 15414 HDA_BIND_MUTE("Speaker Playback Switch", 0x03, 2, HDA_INPUT), 15415 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT), 15416 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), 15417 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), 15418 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), 15419 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), 15420 { } /* end */ 15421 }; 15422 15423 static struct snd_kcontrol_new alc662_eeepc_p701_mixer[] = { 15424 HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT), 15425 15426 HDA_CODEC_VOLUME("Line-Out Playback Volume", 0x02, 0x0, HDA_OUTPUT), 15427 HDA_CODEC_MUTE("Line-Out Playback Switch", 0x1b, 0x0, HDA_OUTPUT), 15428 15429 HDA_CODEC_VOLUME("e-Mic Boost", 0x18, 0, HDA_INPUT), 15430 HDA_CODEC_VOLUME("e-Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 15431 HDA_CODEC_MUTE("e-Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 15432 15433 HDA_CODEC_VOLUME("i-Mic Boost", 0x19, 0, HDA_INPUT), 15434 HDA_CODEC_VOLUME("i-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), 15435 HDA_CODEC_MUTE("i-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), 15436 { } /* end */ 15437 }; 15438 15439 static struct snd_kcontrol_new alc662_eeepc_ep20_mixer[] = { 15440 HDA_CODEC_VOLUME("Line-Out Playback Volume", 0x02, 0x0, HDA_OUTPUT), 15441 HDA_CODEC_MUTE("Line-Out Playback Switch", 0x14, 0x0, HDA_OUTPUT), 15442 HDA_CODEC_VOLUME("Surround Playback Volume", 0x03, 0x0, HDA_OUTPUT), 15443 HDA_BIND_MUTE("Surround Playback Switch", 0x03, 2, HDA_INPUT), 15444 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x04, 1, 0x0, HDA_OUTPUT), 15445 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x04, 2, 0x0, HDA_OUTPUT), 15446 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x04, 1, 2, HDA_INPUT), 15447 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x04, 2, 2, HDA_INPUT), 15448 HDA_CODEC_MUTE("Speaker Playback Switch", 0x1b, 0x0, HDA_OUTPUT), 15449 HDA_BIND_MUTE("MuteCtrl Playback Switch", 0x0c, 2, HDA_INPUT), 15450 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), 15451 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), 15452 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 15453 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 15454 { } /* end */ 15455 }; 15456 15457 static struct hda_bind_ctls alc663_asus_bind_master_vol = { 15458 .ops = &snd_hda_bind_vol, 15459 .values = { 15460 HDA_COMPOSE_AMP_VAL(0x02, 3, 0, HDA_OUTPUT), 15461 HDA_COMPOSE_AMP_VAL(0x03, 3, 0, HDA_OUTPUT), 15462 0 15463 }, 15464 }; 15465 15466 static struct hda_bind_ctls alc663_asus_one_bind_switch = { 15467 .ops = &snd_hda_bind_sw, 15468 .values = { 15469 HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT), 15470 HDA_COMPOSE_AMP_VAL(0x21, 3, 0, HDA_OUTPUT), 15471 0 15472 }, 15473 }; 15474 15475 static struct snd_kcontrol_new alc663_m51va_mixer[] = { 15476 HDA_BIND_VOL("Master Playback Volume", &alc663_asus_bind_master_vol), 15477 HDA_BIND_SW("Master Playback Switch", &alc663_asus_one_bind_switch), 15478 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 15479 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 15480 { } /* end */ 15481 }; 15482 15483 static struct hda_bind_ctls alc663_asus_tree_bind_switch = { 15484 .ops = &snd_hda_bind_sw, 15485 .values = { 15486 HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT), 15487 HDA_COMPOSE_AMP_VAL(0x15, 3, 0, HDA_OUTPUT), 15488 HDA_COMPOSE_AMP_VAL(0x21, 3, 0, HDA_OUTPUT), 15489 0 15490 }, 15491 }; 15492 15493 static struct snd_kcontrol_new alc663_two_hp_m1_mixer[] = { 15494 HDA_BIND_VOL("Master Playback Volume", &alc663_asus_bind_master_vol), 15495 HDA_BIND_SW("Master Playback Switch", &alc663_asus_tree_bind_switch), 15496 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 15497 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 15498 HDA_CODEC_VOLUME("F-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), 15499 HDA_CODEC_MUTE("F-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), 15500 15501 { } /* end */ 15502 }; 15503 15504 static struct hda_bind_ctls alc663_asus_four_bind_switch = { 15505 .ops = &snd_hda_bind_sw, 15506 .values = { 15507 HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT), 15508 HDA_COMPOSE_AMP_VAL(0x15, 3, 0, HDA_OUTPUT), 15509 HDA_COMPOSE_AMP_VAL(0x1b, 3, 0, HDA_OUTPUT), 15510 0 15511 }, 15512 }; 15513 15514 static struct snd_kcontrol_new alc663_two_hp_m2_mixer[] = { 15515 HDA_BIND_VOL("Master Playback Volume", &alc663_asus_bind_master_vol), 15516 HDA_BIND_SW("Master Playback Switch", &alc663_asus_four_bind_switch), 15517 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 15518 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 15519 HDA_CODEC_VOLUME("F-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), 15520 HDA_CODEC_MUTE("F-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), 15521 { } /* end */ 15522 }; 15523 15524 static struct snd_kcontrol_new alc662_1bjd_mixer[] = { 15525 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT), 15526 HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT), 15527 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT), 15528 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 15529 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 15530 HDA_CODEC_VOLUME("F-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), 15531 HDA_CODEC_MUTE("F-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), 15532 { } /* end */ 15533 }; 15534 15535 static struct hda_bind_ctls alc663_asus_two_bind_master_vol = { 15536 .ops = &snd_hda_bind_vol, 15537 .values = { 15538 HDA_COMPOSE_AMP_VAL(0x02, 3, 0, HDA_OUTPUT), 15539 HDA_COMPOSE_AMP_VAL(0x04, 3, 0, HDA_OUTPUT), 15540 0 15541 }, 15542 }; 15543 15544 static struct hda_bind_ctls alc663_asus_two_bind_switch = { 15545 .ops = &snd_hda_bind_sw, 15546 .values = { 15547 HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT), 15548 HDA_COMPOSE_AMP_VAL(0x16, 3, 0, HDA_OUTPUT), 15549 0 15550 }, 15551 }; 15552 15553 static struct snd_kcontrol_new alc663_asus_21jd_clfe_mixer[] = { 15554 HDA_BIND_VOL("Master Playback Volume", 15555 &alc663_asus_two_bind_master_vol), 15556 HDA_BIND_SW("Master Playback Switch", &alc663_asus_two_bind_switch), 15557 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT), 15558 HDA_CODEC_MUTE("Headphone Playback Switch", 0x21, 0x0, HDA_OUTPUT), 15559 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 15560 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 15561 { } /* end */ 15562 }; 15563 15564 static struct snd_kcontrol_new alc663_asus_15jd_clfe_mixer[] = { 15565 HDA_BIND_VOL("Master Playback Volume", &alc663_asus_bind_master_vol), 15566 HDA_BIND_SW("Master Playback Switch", &alc663_asus_two_bind_switch), 15567 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT), 15568 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT), 15569 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 15570 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 15571 { } /* end */ 15572 }; 15573 15574 static struct snd_kcontrol_new alc663_g71v_mixer[] = { 15575 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT), 15576 HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT), 15577 HDA_CODEC_VOLUME("Front Playback Volume", 0x03, 0x0, HDA_OUTPUT), 15578 HDA_CODEC_MUTE("Front Playback Switch", 0x15, 0x0, HDA_OUTPUT), 15579 HDA_CODEC_MUTE("Headphone Playback Switch", 0x21, 0x0, HDA_OUTPUT), 15580 15581 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 15582 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 15583 HDA_CODEC_VOLUME("i-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), 15584 HDA_CODEC_MUTE("i-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), 15585 { } /* end */ 15586 }; 15587 15588 static struct snd_kcontrol_new alc663_g50v_mixer[] = { 15589 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT), 15590 HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT), 15591 HDA_CODEC_MUTE("Headphone Playback Switch", 0x21, 0x0, HDA_OUTPUT), 15592 15593 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 15594 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 15595 HDA_CODEC_VOLUME("i-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), 15596 HDA_CODEC_MUTE("i-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), 15597 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), 15598 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), 15599 { } /* end */ 15600 }; 15601 15602 static struct snd_kcontrol_new alc662_chmode_mixer[] = { 15603 { 15604 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 15605 .name = "Channel Mode", 15606 .info = alc_ch_mode_info, 15607 .get = alc_ch_mode_get, 15608 .put = alc_ch_mode_put, 15609 }, 15610 { } /* end */ 15611 }; 15612 15613 static struct hda_verb alc662_init_verbs[] = { 15614 /* ADC: mute amp left and right */ 15615 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 15616 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00}, 15617 /* Front mixer: unmute input/output amp left and right (volume = 0) */ 15618 15619 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 15620 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 15621 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, 15622 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, 15623 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, 15624 15625 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 15626 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 15627 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 15628 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 15629 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 15630 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 15631 15632 /* Front Pin: output 0 (0x0c) */ 15633 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 15634 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 15635 15636 /* Rear Pin: output 1 (0x0d) */ 15637 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 15638 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 15639 15640 /* CLFE Pin: output 2 (0x0e) */ 15641 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 15642 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 15643 15644 /* Mic (rear) pin: input vref at 80% */ 15645 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, 15646 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 15647 /* Front Mic pin: input vref at 80% */ 15648 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, 15649 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 15650 /* Line In pin: input */ 15651 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 15652 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 15653 /* Line-2 In: Headphone output (output 0 - 0x0c) */ 15654 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 15655 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 15656 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, 15657 /* CD pin widget for input */ 15658 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 15659 15660 /* FIXME: use matrix-type input source selection */ 15661 /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */ 15662 /* Input mixer */ 15663 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 15664 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 15665 15666 /* always trun on EAPD */ 15667 {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2}, 15668 {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2}, 15669 15670 { } 15671 }; 15672 15673 static struct hda_verb alc662_sue_init_verbs[] = { 15674 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_FRONT_EVENT}, 15675 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_HP_EVENT}, 15676 {} 15677 }; 15678 15679 static struct hda_verb alc662_eeepc_sue_init_verbs[] = { 15680 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT}, 15681 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT}, 15682 {} 15683 }; 15684 15685 /* Set Unsolicited Event*/ 15686 static struct hda_verb alc662_eeepc_ep20_sue_init_verbs[] = { 15687 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 15688 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT}, 15689 {} 15690 }; 15691 15692 /* 15693 * generic initialization of ADC, input mixers and output mixers 15694 */ 15695 static struct hda_verb alc662_auto_init_verbs[] = { 15696 /* 15697 * Unmute ADC and set the default input to mic-in 15698 */ 15699 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00}, 15700 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 15701 15702 /* Unmute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback 15703 * mixer widget 15704 * Note: PASD motherboards uses the Line In 2 as the input for front 15705 * panel mic (mic 2) 15706 */ 15707 /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */ 15708 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 15709 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 15710 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, 15711 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, 15712 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, 15713 15714 /* 15715 * Set up output mixers (0x0c - 0x0f) 15716 */ 15717 /* set vol=0 to output mixers */ 15718 {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 15719 {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 15720 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 15721 15722 /* set up input amps for analog loopback */ 15723 /* Amp Indices: DAC = 0, mixer = 1 */ 15724 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 15725 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 15726 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 15727 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 15728 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 15729 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 15730 15731 15732 /* FIXME: use matrix-type input source selection */ 15733 /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */ 15734 /* Input mixer */ 15735 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 15736 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 15737 { } 15738 }; 15739 15740 /* additional verbs for ALC663 */ 15741 static struct hda_verb alc663_auto_init_verbs[] = { 15742 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 15743 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 15744 { } 15745 }; 15746 15747 static struct hda_verb alc663_m51va_init_verbs[] = { 15748 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 15749 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 15750 {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 15751 {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 15752 {0x21, AC_VERB_SET_CONNECT_SEL, 0x01}, /* Headphone */ 15753 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 15754 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(9)}, 15755 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT}, 15756 {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT}, 15757 {} 15758 }; 15759 15760 static struct hda_verb alc663_21jd_amic_init_verbs[] = { 15761 {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 15762 {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 15763 {0x21, AC_VERB_SET_CONNECT_SEL, 0x01}, /* Headphone */ 15764 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 15765 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 15766 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT}, 15767 {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT}, 15768 {} 15769 }; 15770 15771 static struct hda_verb alc662_1bjd_amic_init_verbs[] = { 15772 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 15773 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 15774 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 15775 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Headphone */ 15776 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 15777 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 15778 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT}, 15779 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT}, 15780 {} 15781 }; 15782 15783 static struct hda_verb alc663_15jd_amic_init_verbs[] = { 15784 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 15785 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 15786 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, /* Headphone */ 15787 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 15788 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 15789 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT}, 15790 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT}, 15791 {} 15792 }; 15793 15794 static struct hda_verb alc663_two_hp_amic_m1_init_verbs[] = { 15795 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 15796 {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 15797 {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 15798 {0x21, AC_VERB_SET_CONNECT_SEL, 0x0}, /* Headphone */ 15799 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 15800 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 15801 {0x15, AC_VERB_SET_CONNECT_SEL, 0x0}, /* Headphone */ 15802 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 15803 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 15804 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT}, 15805 {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT}, 15806 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT}, 15807 {} 15808 }; 15809 15810 static struct hda_verb alc663_two_hp_amic_m2_init_verbs[] = { 15811 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 15812 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 15813 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 15814 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x01}, /* Headphone */ 15815 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 15816 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 15817 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, /* Headphone */ 15818 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 15819 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 15820 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT}, 15821 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT}, 15822 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT}, 15823 {} 15824 }; 15825 15826 static struct hda_verb alc663_g71v_init_verbs[] = { 15827 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 15828 /* {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, */ 15829 /* {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, */ /* Headphone */ 15830 15831 {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 15832 {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 15833 {0x21, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Headphone */ 15834 15835 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_FRONT_EVENT}, 15836 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_MIC_EVENT}, 15837 {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_HP_EVENT}, 15838 {} 15839 }; 15840 15841 static struct hda_verb alc663_g50v_init_verbs[] = { 15842 {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 15843 {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 15844 {0x21, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Headphone */ 15845 15846 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT}, 15847 {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT}, 15848 {} 15849 }; 15850 15851 static struct hda_verb alc662_ecs_init_verbs[] = { 15852 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, 0x701f}, 15853 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 15854 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT}, 15855 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT}, 15856 {} 15857 }; 15858 15859 static struct hda_verb alc272_dell_zm1_init_verbs[] = { 15860 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 15861 {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 15862 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 15863 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 15864 {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 15865 {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 15866 {0x21, AC_VERB_SET_CONNECT_SEL, 0x01}, /* Headphone */ 15867 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 15868 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(9)}, 15869 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT}, 15870 {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT}, 15871 {} 15872 }; 15873 15874 static struct hda_verb alc272_dell_init_verbs[] = { 15875 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 15876 {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 15877 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 15878 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 15879 {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 15880 {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 15881 {0x21, AC_VERB_SET_CONNECT_SEL, 0x01}, /* Headphone */ 15882 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 15883 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(9)}, 15884 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT}, 15885 {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT}, 15886 {} 15887 }; 15888 15889 static struct snd_kcontrol_new alc662_auto_capture_mixer[] = { 15890 HDA_CODEC_VOLUME("Capture Volume", 0x09, 0x0, HDA_INPUT), 15891 HDA_CODEC_MUTE("Capture Switch", 0x09, 0x0, HDA_INPUT), 15892 { } /* end */ 15893 }; 15894 15895 static struct snd_kcontrol_new alc272_auto_capture_mixer[] = { 15896 HDA_CODEC_VOLUME("Capture Volume", 0x08, 0x0, HDA_INPUT), 15897 HDA_CODEC_MUTE("Capture Switch", 0x08, 0x0, HDA_INPUT), 15898 { } /* end */ 15899 }; 15900 15901 static void alc662_lenovo_101e_ispeaker_automute(struct hda_codec *codec) 15902 { 15903 unsigned int present; 15904 unsigned char bits; 15905 15906 present = snd_hda_codec_read(codec, 0x14, 0, 15907 AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; 15908 bits = present ? HDA_AMP_MUTE : 0; 15909 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0, 15910 HDA_AMP_MUTE, bits); 15911 } 15912 15913 static void alc662_lenovo_101e_all_automute(struct hda_codec *codec) 15914 { 15915 unsigned int present; 15916 unsigned char bits; 15917 15918 present = snd_hda_codec_read(codec, 0x1b, 0, 15919 AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; 15920 bits = present ? HDA_AMP_MUTE : 0; 15921 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0, 15922 HDA_AMP_MUTE, bits); 15923 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0, 15924 HDA_AMP_MUTE, bits); 15925 } 15926 15927 static void alc662_lenovo_101e_unsol_event(struct hda_codec *codec, 15928 unsigned int res) 15929 { 15930 if ((res >> 26) == ALC880_HP_EVENT) 15931 alc662_lenovo_101e_all_automute(codec); 15932 if ((res >> 26) == ALC880_FRONT_EVENT) 15933 alc662_lenovo_101e_ispeaker_automute(codec); 15934 } 15935 15936 static void alc662_eeepc_mic_automute(struct hda_codec *codec) 15937 { 15938 unsigned int present; 15939 15940 present = snd_hda_codec_read(codec, 0x18, 0, 15941 AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; 15942 snd_hda_codec_write(codec, 0x22, 0, AC_VERB_SET_AMP_GAIN_MUTE, 15943 0x7000 | (0x00 << 8) | (present ? 0 : 0x80)); 15944 snd_hda_codec_write(codec, 0x23, 0, AC_VERB_SET_AMP_GAIN_MUTE, 15945 0x7000 | (0x00 << 8) | (present ? 0 : 0x80)); 15946 snd_hda_codec_write(codec, 0x22, 0, AC_VERB_SET_AMP_GAIN_MUTE, 15947 0x7000 | (0x01 << 8) | (present ? 0x80 : 0)); 15948 snd_hda_codec_write(codec, 0x23, 0, AC_VERB_SET_AMP_GAIN_MUTE, 15949 0x7000 | (0x01 << 8) | (present ? 0x80 : 0)); 15950 } 15951 15952 /* unsolicited event for HP jack sensing */ 15953 static void alc662_eeepc_unsol_event(struct hda_codec *codec, 15954 unsigned int res) 15955 { 15956 if ((res >> 26) == ALC880_HP_EVENT) 15957 alc262_hippo1_automute( codec ); 15958 15959 if ((res >> 26) == ALC880_MIC_EVENT) 15960 alc662_eeepc_mic_automute(codec); 15961 } 15962 15963 static void alc662_eeepc_inithook(struct hda_codec *codec) 15964 { 15965 alc262_hippo1_automute( codec ); 15966 alc662_eeepc_mic_automute(codec); 15967 } 15968 15969 static void alc662_eeepc_ep20_automute(struct hda_codec *codec) 15970 { 15971 unsigned int mute; 15972 unsigned int present; 15973 15974 snd_hda_codec_read(codec, 0x14, 0, AC_VERB_SET_PIN_SENSE, 0); 15975 present = snd_hda_codec_read(codec, 0x14, 0, 15976 AC_VERB_GET_PIN_SENSE, 0); 15977 present = (present & 0x80000000) != 0; 15978 if (present) { 15979 /* mute internal speaker */ 15980 snd_hda_codec_amp_stereo(codec, 0x1b, HDA_OUTPUT, 0, 15981 HDA_AMP_MUTE, HDA_AMP_MUTE); 15982 } else { 15983 /* unmute internal speaker if necessary */ 15984 mute = snd_hda_codec_amp_read(codec, 0x14, 0, HDA_OUTPUT, 0); 15985 snd_hda_codec_amp_stereo(codec, 0x1b, HDA_OUTPUT, 0, 15986 HDA_AMP_MUTE, mute); 15987 } 15988 } 15989 15990 /* unsolicited event for HP jack sensing */ 15991 static void alc662_eeepc_ep20_unsol_event(struct hda_codec *codec, 15992 unsigned int res) 15993 { 15994 if ((res >> 26) == ALC880_HP_EVENT) 15995 alc662_eeepc_ep20_automute(codec); 15996 } 15997 15998 static void alc662_eeepc_ep20_inithook(struct hda_codec *codec) 15999 { 16000 alc662_eeepc_ep20_automute(codec); 16001 } 16002 16003 static void alc663_m51va_speaker_automute(struct hda_codec *codec) 16004 { 16005 unsigned int present; 16006 unsigned char bits; 16007 16008 present = snd_hda_codec_read(codec, 0x21, 0, 16009 AC_VERB_GET_PIN_SENSE, 0) 16010 & AC_PINSENSE_PRESENCE; 16011 bits = present ? HDA_AMP_MUTE : 0; 16012 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0, 16013 AMP_IN_MUTE(0), bits); 16014 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1, 16015 AMP_IN_MUTE(0), bits); 16016 } 16017 16018 static void alc663_21jd_two_speaker_automute(struct hda_codec *codec) 16019 { 16020 unsigned int present; 16021 unsigned char bits; 16022 16023 present = snd_hda_codec_read(codec, 0x21, 0, 16024 AC_VERB_GET_PIN_SENSE, 0) 16025 & AC_PINSENSE_PRESENCE; 16026 bits = present ? HDA_AMP_MUTE : 0; 16027 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0, 16028 AMP_IN_MUTE(0), bits); 16029 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1, 16030 AMP_IN_MUTE(0), bits); 16031 snd_hda_codec_amp_stereo(codec, 0x0e, HDA_INPUT, 0, 16032 AMP_IN_MUTE(0), bits); 16033 snd_hda_codec_amp_stereo(codec, 0x0e, HDA_INPUT, 1, 16034 AMP_IN_MUTE(0), bits); 16035 } 16036 16037 static void alc663_15jd_two_speaker_automute(struct hda_codec *codec) 16038 { 16039 unsigned int present; 16040 unsigned char bits; 16041 16042 present = snd_hda_codec_read(codec, 0x15, 0, 16043 AC_VERB_GET_PIN_SENSE, 0) 16044 & AC_PINSENSE_PRESENCE; 16045 bits = present ? HDA_AMP_MUTE : 0; 16046 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0, 16047 AMP_IN_MUTE(0), bits); 16048 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1, 16049 AMP_IN_MUTE(0), bits); 16050 snd_hda_codec_amp_stereo(codec, 0x0e, HDA_INPUT, 0, 16051 AMP_IN_MUTE(0), bits); 16052 snd_hda_codec_amp_stereo(codec, 0x0e, HDA_INPUT, 1, 16053 AMP_IN_MUTE(0), bits); 16054 } 16055 16056 static void alc662_f5z_speaker_automute(struct hda_codec *codec) 16057 { 16058 unsigned int present; 16059 unsigned char bits; 16060 16061 present = snd_hda_codec_read(codec, 0x1b, 0, 16062 AC_VERB_GET_PIN_SENSE, 0) 16063 & AC_PINSENSE_PRESENCE; 16064 bits = present ? 0 : PIN_OUT; 16065 snd_hda_codec_write(codec, 0x14, 0, 16066 AC_VERB_SET_PIN_WIDGET_CONTROL, bits); 16067 } 16068 16069 static void alc663_two_hp_m1_speaker_automute(struct hda_codec *codec) 16070 { 16071 unsigned int present1, present2; 16072 16073 present1 = snd_hda_codec_read(codec, 0x21, 0, 16074 AC_VERB_GET_PIN_SENSE, 0) 16075 & AC_PINSENSE_PRESENCE; 16076 present2 = snd_hda_codec_read(codec, 0x15, 0, 16077 AC_VERB_GET_PIN_SENSE, 0) 16078 & AC_PINSENSE_PRESENCE; 16079 16080 if (present1 || present2) { 16081 snd_hda_codec_write_cache(codec, 0x14, 0, 16082 AC_VERB_SET_PIN_WIDGET_CONTROL, 0); 16083 } else { 16084 snd_hda_codec_write_cache(codec, 0x14, 0, 16085 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT); 16086 } 16087 } 16088 16089 static void alc663_two_hp_m2_speaker_automute(struct hda_codec *codec) 16090 { 16091 unsigned int present1, present2; 16092 16093 present1 = snd_hda_codec_read(codec, 0x1b, 0, 16094 AC_VERB_GET_PIN_SENSE, 0) 16095 & AC_PINSENSE_PRESENCE; 16096 present2 = snd_hda_codec_read(codec, 0x15, 0, 16097 AC_VERB_GET_PIN_SENSE, 0) 16098 & AC_PINSENSE_PRESENCE; 16099 16100 if (present1 || present2) { 16101 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0, 16102 AMP_IN_MUTE(0), AMP_IN_MUTE(0)); 16103 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1, 16104 AMP_IN_MUTE(0), AMP_IN_MUTE(0)); 16105 } else { 16106 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0, 16107 AMP_IN_MUTE(0), 0); 16108 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1, 16109 AMP_IN_MUTE(0), 0); 16110 } 16111 } 16112 16113 static void alc663_m51va_mic_automute(struct hda_codec *codec) 16114 { 16115 unsigned int present; 16116 16117 present = snd_hda_codec_read(codec, 0x18, 0, 16118 AC_VERB_GET_PIN_SENSE, 0) 16119 & AC_PINSENSE_PRESENCE; 16120 snd_hda_codec_write_cache(codec, 0x22, 0, AC_VERB_SET_AMP_GAIN_MUTE, 16121 0x7000 | (0x00 << 8) | (present ? 0 : 0x80)); 16122 snd_hda_codec_write_cache(codec, 0x23, 0, AC_VERB_SET_AMP_GAIN_MUTE, 16123 0x7000 | (0x00 << 8) | (present ? 0 : 0x80)); 16124 snd_hda_codec_write_cache(codec, 0x22, 0, AC_VERB_SET_AMP_GAIN_MUTE, 16125 0x7000 | (0x09 << 8) | (present ? 0x80 : 0)); 16126 snd_hda_codec_write_cache(codec, 0x23, 0, AC_VERB_SET_AMP_GAIN_MUTE, 16127 0x7000 | (0x09 << 8) | (present ? 0x80 : 0)); 16128 } 16129 16130 static void alc663_m51va_unsol_event(struct hda_codec *codec, 16131 unsigned int res) 16132 { 16133 switch (res >> 26) { 16134 case ALC880_HP_EVENT: 16135 alc663_m51va_speaker_automute(codec); 16136 break; 16137 case ALC880_MIC_EVENT: 16138 alc663_m51va_mic_automute(codec); 16139 break; 16140 } 16141 } 16142 16143 static void alc663_m51va_inithook(struct hda_codec *codec) 16144 { 16145 alc663_m51va_speaker_automute(codec); 16146 alc663_m51va_mic_automute(codec); 16147 } 16148 16149 /* ***************** Mode1 ******************************/ 16150 static void alc663_mode1_unsol_event(struct hda_codec *codec, 16151 unsigned int res) 16152 { 16153 switch (res >> 26) { 16154 case ALC880_HP_EVENT: 16155 alc663_m51va_speaker_automute(codec); 16156 break; 16157 case ALC880_MIC_EVENT: 16158 alc662_eeepc_mic_automute(codec); 16159 break; 16160 } 16161 } 16162 16163 static void alc663_mode1_inithook(struct hda_codec *codec) 16164 { 16165 alc663_m51va_speaker_automute(codec); 16166 alc662_eeepc_mic_automute(codec); 16167 } 16168 /* ***************** Mode2 ******************************/ 16169 static void alc662_mode2_unsol_event(struct hda_codec *codec, 16170 unsigned int res) 16171 { 16172 switch (res >> 26) { 16173 case ALC880_HP_EVENT: 16174 alc662_f5z_speaker_automute(codec); 16175 break; 16176 case ALC880_MIC_EVENT: 16177 alc662_eeepc_mic_automute(codec); 16178 break; 16179 } 16180 } 16181 16182 static void alc662_mode2_inithook(struct hda_codec *codec) 16183 { 16184 alc662_f5z_speaker_automute(codec); 16185 alc662_eeepc_mic_automute(codec); 16186 } 16187 /* ***************** Mode3 ******************************/ 16188 static void alc663_mode3_unsol_event(struct hda_codec *codec, 16189 unsigned int res) 16190 { 16191 switch (res >> 26) { 16192 case ALC880_HP_EVENT: 16193 alc663_two_hp_m1_speaker_automute(codec); 16194 break; 16195 case ALC880_MIC_EVENT: 16196 alc662_eeepc_mic_automute(codec); 16197 break; 16198 } 16199 } 16200 16201 static void alc663_mode3_inithook(struct hda_codec *codec) 16202 { 16203 alc663_two_hp_m1_speaker_automute(codec); 16204 alc662_eeepc_mic_automute(codec); 16205 } 16206 /* ***************** Mode4 ******************************/ 16207 static void alc663_mode4_unsol_event(struct hda_codec *codec, 16208 unsigned int res) 16209 { 16210 switch (res >> 26) { 16211 case ALC880_HP_EVENT: 16212 alc663_21jd_two_speaker_automute(codec); 16213 break; 16214 case ALC880_MIC_EVENT: 16215 alc662_eeepc_mic_automute(codec); 16216 break; 16217 } 16218 } 16219 16220 static void alc663_mode4_inithook(struct hda_codec *codec) 16221 { 16222 alc663_21jd_two_speaker_automute(codec); 16223 alc662_eeepc_mic_automute(codec); 16224 } 16225 /* ***************** Mode5 ******************************/ 16226 static void alc663_mode5_unsol_event(struct hda_codec *codec, 16227 unsigned int res) 16228 { 16229 switch (res >> 26) { 16230 case ALC880_HP_EVENT: 16231 alc663_15jd_two_speaker_automute(codec); 16232 break; 16233 case ALC880_MIC_EVENT: 16234 alc662_eeepc_mic_automute(codec); 16235 break; 16236 } 16237 } 16238 16239 static void alc663_mode5_inithook(struct hda_codec *codec) 16240 { 16241 alc663_15jd_two_speaker_automute(codec); 16242 alc662_eeepc_mic_automute(codec); 16243 } 16244 /* ***************** Mode6 ******************************/ 16245 static void alc663_mode6_unsol_event(struct hda_codec *codec, 16246 unsigned int res) 16247 { 16248 switch (res >> 26) { 16249 case ALC880_HP_EVENT: 16250 alc663_two_hp_m2_speaker_automute(codec); 16251 break; 16252 case ALC880_MIC_EVENT: 16253 alc662_eeepc_mic_automute(codec); 16254 break; 16255 } 16256 } 16257 16258 static void alc663_mode6_inithook(struct hda_codec *codec) 16259 { 16260 alc663_two_hp_m2_speaker_automute(codec); 16261 alc662_eeepc_mic_automute(codec); 16262 } 16263 16264 static void alc663_g71v_hp_automute(struct hda_codec *codec) 16265 { 16266 unsigned int present; 16267 unsigned char bits; 16268 16269 present = snd_hda_codec_read(codec, 0x21, 0, 16270 AC_VERB_GET_PIN_SENSE, 0) 16271 & AC_PINSENSE_PRESENCE; 16272 bits = present ? HDA_AMP_MUTE : 0; 16273 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0, 16274 HDA_AMP_MUTE, bits); 16275 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0, 16276 HDA_AMP_MUTE, bits); 16277 } 16278 16279 static void alc663_g71v_front_automute(struct hda_codec *codec) 16280 { 16281 unsigned int present; 16282 unsigned char bits; 16283 16284 present = snd_hda_codec_read(codec, 0x15, 0, 16285 AC_VERB_GET_PIN_SENSE, 0) 16286 & AC_PINSENSE_PRESENCE; 16287 bits = present ? HDA_AMP_MUTE : 0; 16288 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0, 16289 HDA_AMP_MUTE, bits); 16290 } 16291 16292 static void alc663_g71v_unsol_event(struct hda_codec *codec, 16293 unsigned int res) 16294 { 16295 switch (res >> 26) { 16296 case ALC880_HP_EVENT: 16297 alc663_g71v_hp_automute(codec); 16298 break; 16299 case ALC880_FRONT_EVENT: 16300 alc663_g71v_front_automute(codec); 16301 break; 16302 case ALC880_MIC_EVENT: 16303 alc662_eeepc_mic_automute(codec); 16304 break; 16305 } 16306 } 16307 16308 static void alc663_g71v_inithook(struct hda_codec *codec) 16309 { 16310 alc663_g71v_front_automute(codec); 16311 alc663_g71v_hp_automute(codec); 16312 alc662_eeepc_mic_automute(codec); 16313 } 16314 16315 static void alc663_g50v_unsol_event(struct hda_codec *codec, 16316 unsigned int res) 16317 { 16318 switch (res >> 26) { 16319 case ALC880_HP_EVENT: 16320 alc663_m51va_speaker_automute(codec); 16321 break; 16322 case ALC880_MIC_EVENT: 16323 alc662_eeepc_mic_automute(codec); 16324 break; 16325 } 16326 } 16327 16328 static void alc663_g50v_inithook(struct hda_codec *codec) 16329 { 16330 alc663_m51va_speaker_automute(codec); 16331 alc662_eeepc_mic_automute(codec); 16332 } 16333 16334 /* bind hp and internal speaker mute (with plug check) */ 16335 static int alc662_ecs_master_sw_put(struct snd_kcontrol *kcontrol, 16336 struct snd_ctl_elem_value *ucontrol) 16337 { 16338 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 16339 long *valp = ucontrol->value.integer.value; 16340 int change; 16341 16342 change = snd_hda_codec_amp_update(codec, 0x1b, 0, HDA_OUTPUT, 0, 16343 HDA_AMP_MUTE, 16344 valp[0] ? 0 : HDA_AMP_MUTE); 16345 change |= snd_hda_codec_amp_update(codec, 0x1b, 1, HDA_OUTPUT, 0, 16346 HDA_AMP_MUTE, 16347 valp[1] ? 0 : HDA_AMP_MUTE); 16348 if (change) 16349 alc262_hippo1_automute(codec); 16350 return change; 16351 } 16352 16353 static struct snd_kcontrol_new alc662_ecs_mixer[] = { 16354 HDA_CODEC_VOLUME("Master Playback Volume", 0x02, 0x0, HDA_OUTPUT), 16355 { 16356 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 16357 .name = "Master Playback Switch", 16358 .info = snd_hda_mixer_amp_switch_info, 16359 .get = snd_hda_mixer_amp_switch_get, 16360 .put = alc662_ecs_master_sw_put, 16361 .private_value = HDA_COMPOSE_AMP_VAL(0x1b, 3, 0, HDA_OUTPUT), 16362 }, 16363 16364 HDA_CODEC_VOLUME("e-Mic/LineIn Boost", 0x18, 0, HDA_INPUT), 16365 HDA_CODEC_VOLUME("e-Mic/LineIn Playback Volume", 0x0b, 0x0, HDA_INPUT), 16366 HDA_CODEC_MUTE("e-Mic/LineIn Playback Switch", 0x0b, 0x0, HDA_INPUT), 16367 16368 HDA_CODEC_VOLUME("i-Mic Boost", 0x19, 0, HDA_INPUT), 16369 HDA_CODEC_VOLUME("i-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), 16370 HDA_CODEC_MUTE("i-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), 16371 { } /* end */ 16372 }; 16373 16374 #ifdef CONFIG_SND_HDA_POWER_SAVE 16375 #define alc662_loopbacks alc880_loopbacks 16376 #endif 16377 16378 16379 /* pcm configuration: identiacal with ALC880 */ 16380 #define alc662_pcm_analog_playback alc880_pcm_analog_playback 16381 #define alc662_pcm_analog_capture alc880_pcm_analog_capture 16382 #define alc662_pcm_digital_playback alc880_pcm_digital_playback 16383 #define alc662_pcm_digital_capture alc880_pcm_digital_capture 16384 16385 /* 16386 * configuration and preset 16387 */ 16388 static const char *alc662_models[ALC662_MODEL_LAST] = { 16389 [ALC662_3ST_2ch_DIG] = "3stack-dig", 16390 [ALC662_3ST_6ch_DIG] = "3stack-6ch-dig", 16391 [ALC662_3ST_6ch] = "3stack-6ch", 16392 [ALC662_5ST_DIG] = "6stack-dig", 16393 [ALC662_LENOVO_101E] = "lenovo-101e", 16394 [ALC662_ASUS_EEEPC_P701] = "eeepc-p701", 16395 [ALC662_ASUS_EEEPC_EP20] = "eeepc-ep20", 16396 [ALC662_ECS] = "ecs", 16397 [ALC663_ASUS_M51VA] = "m51va", 16398 [ALC663_ASUS_G71V] = "g71v", 16399 [ALC663_ASUS_H13] = "h13", 16400 [ALC663_ASUS_G50V] = "g50v", 16401 [ALC663_ASUS_MODE1] = "asus-mode1", 16402 [ALC662_ASUS_MODE2] = "asus-mode2", 16403 [ALC663_ASUS_MODE3] = "asus-mode3", 16404 [ALC663_ASUS_MODE4] = "asus-mode4", 16405 [ALC663_ASUS_MODE5] = "asus-mode5", 16406 [ALC663_ASUS_MODE6] = "asus-mode6", 16407 [ALC662_AUTO] = "auto", 16408 }; 16409 16410 static struct snd_pci_quirk alc662_cfg_tbl[] = { 16411 SND_PCI_QUIRK(0x1019, 0x9087, "ECS", ALC662_ECS), 16412 SND_PCI_QUIRK(0x1028, 0x02d6, "DELL", ALC272_DELL), 16413 SND_PCI_QUIRK(0x1028, 0x02f4, "DELL ZM1", ALC272_DELL_ZM1), 16414 SND_PCI_QUIRK(0x1043, 0x1000, "ASUS N50Vm", ALC663_ASUS_MODE1), 16415 SND_PCI_QUIRK(0x1043, 0x1092, "ASUS NB", ALC663_ASUS_MODE3), 16416 SND_PCI_QUIRK(0x1043, 0x11c3, "ASUS M70V", ALC663_ASUS_MODE3), 16417 SND_PCI_QUIRK(0x1043, 0x11d3, "ASUS NB", ALC663_ASUS_MODE1), 16418 SND_PCI_QUIRK(0x1043, 0x11f3, "ASUS NB", ALC662_ASUS_MODE2), 16419 SND_PCI_QUIRK(0x1043, 0x1203, "ASUS NB", ALC663_ASUS_MODE1), 16420 SND_PCI_QUIRK(0x1043, 0x1339, "ASUS NB", ALC662_ASUS_MODE2), 16421 SND_PCI_QUIRK(0x1043, 0x16c3, "ASUS NB", ALC662_ASUS_MODE2), 16422 SND_PCI_QUIRK(0x1043, 0x1753, "ASUS NB", ALC662_ASUS_MODE2), 16423 SND_PCI_QUIRK(0x1043, 0x1763, "ASUS NB", ALC663_ASUS_MODE6), 16424 SND_PCI_QUIRK(0x1043, 0x1765, "ASUS NB", ALC663_ASUS_MODE6), 16425 SND_PCI_QUIRK(0x1043, 0x1783, "ASUS NB", ALC662_ASUS_MODE2), 16426 SND_PCI_QUIRK(0x1043, 0x17b3, "ASUS F70SL", ALC663_ASUS_MODE3), 16427 SND_PCI_QUIRK(0x1043, 0x17c3, "ASUS UX20", ALC663_ASUS_M51VA), 16428 SND_PCI_QUIRK(0x1043, 0x17f3, "ASUS X58LE", ALC662_ASUS_MODE2), 16429 SND_PCI_QUIRK(0x1043, 0x1813, "ASUS NB", ALC662_ASUS_MODE2), 16430 SND_PCI_QUIRK(0x1043, 0x1823, "ASUS NB", ALC663_ASUS_MODE5), 16431 SND_PCI_QUIRK(0x1043, 0x1833, "ASUS NB", ALC663_ASUS_MODE6), 16432 SND_PCI_QUIRK(0x1043, 0x1843, "ASUS NB", ALC662_ASUS_MODE2), 16433 SND_PCI_QUIRK(0x1043, 0x1853, "ASUS F50Z", ALC663_ASUS_MODE1), 16434 SND_PCI_QUIRK(0x1043, 0x1864, "ASUS NB", ALC662_ASUS_MODE2), 16435 SND_PCI_QUIRK(0x1043, 0x1876, "ASUS NB", ALC662_ASUS_MODE2), 16436 SND_PCI_QUIRK(0x1043, 0x1878, "ASUS M51VA", ALC663_ASUS_M51VA), 16437 /*SND_PCI_QUIRK(0x1043, 0x1878, "ASUS M50Vr", ALC663_ASUS_MODE1),*/ 16438 SND_PCI_QUIRK(0x1043, 0x1893, "ASUS M50Vm", ALC663_ASUS_MODE3), 16439 SND_PCI_QUIRK(0x1043, 0x1894, "ASUS X55", ALC663_ASUS_MODE3), 16440 SND_PCI_QUIRK(0x1043, 0x18b3, "ASUS N80Vc", ALC663_ASUS_MODE1), 16441 SND_PCI_QUIRK(0x1043, 0x18d3, "ASUS N81Te", ALC663_ASUS_MODE1), 16442 SND_PCI_QUIRK(0x1043, 0x18f3, "ASUS N505Tp", ALC663_ASUS_MODE1), 16443 SND_PCI_QUIRK(0x1043, 0x1903, "ASUS F5GL", ALC663_ASUS_MODE1), 16444 SND_PCI_QUIRK(0x1043, 0x1913, "ASUS NB", ALC662_ASUS_MODE2), 16445 SND_PCI_QUIRK(0x1043, 0x1933, "ASUS F80Q", ALC662_ASUS_MODE2), 16446 SND_PCI_QUIRK(0x1043, 0x1943, "ASUS Vx3V", ALC663_ASUS_MODE1), 16447 SND_PCI_QUIRK(0x1043, 0x1953, "ASUS NB", ALC663_ASUS_MODE1), 16448 SND_PCI_QUIRK(0x1043, 0x1963, "ASUS X71C", ALC663_ASUS_MODE3), 16449 SND_PCI_QUIRK(0x1043, 0x1983, "ASUS N5051A", ALC663_ASUS_MODE1), 16450 SND_PCI_QUIRK(0x1043, 0x1993, "ASUS N20", ALC663_ASUS_MODE1), 16451 SND_PCI_QUIRK(0x1043, 0x19a3, "ASUS G50V", ALC663_ASUS_G50V), 16452 /*SND_PCI_QUIRK(0x1043, 0x19a3, "ASUS NB", ALC663_ASUS_MODE1),*/ 16453 SND_PCI_QUIRK(0x1043, 0x19b3, "ASUS F7Z", ALC663_ASUS_MODE1), 16454 SND_PCI_QUIRK(0x1043, 0x19c3, "ASUS F5Z/F6x", ALC662_ASUS_MODE2), 16455 SND_PCI_QUIRK(0x1043, 0x19d3, "ASUS NB", ALC663_ASUS_M51VA), 16456 SND_PCI_QUIRK(0x1043, 0x19e3, "ASUS NB", ALC663_ASUS_MODE1), 16457 SND_PCI_QUIRK(0x1043, 0x19f3, "ASUS NB", ALC663_ASUS_MODE4), 16458 SND_PCI_QUIRK(0x1043, 0x8290, "ASUS P5GC-MX", ALC662_3ST_6ch_DIG), 16459 SND_PCI_QUIRK(0x1043, 0x82a1, "ASUS Eeepc", ALC662_ASUS_EEEPC_P701), 16460 SND_PCI_QUIRK(0x1043, 0x82d1, "ASUS Eeepc EP20", ALC662_ASUS_EEEPC_EP20), 16461 SND_PCI_QUIRK(0x105b, 0x0cd6, "Foxconn", ALC662_ECS), 16462 SND_PCI_QUIRK(0x105b, 0x0d47, "Foxconn 45CMX/45GMX/45CMX-K", 16463 ALC662_3ST_6ch_DIG), 16464 SND_PCI_QUIRK(0x1458, 0xa002, "Gigabyte 945GCM-S2L", 16465 ALC662_3ST_6ch_DIG), 16466 SND_PCI_QUIRK(0x1565, 0x820f, "Biostar TA780G M2+", ALC662_3ST_6ch_DIG), 16467 SND_PCI_QUIRK(0x1631, 0xc10c, "PB RS65", ALC663_ASUS_M51VA), 16468 SND_PCI_QUIRK(0x17aa, 0x101e, "Lenovo", ALC662_LENOVO_101E), 16469 SND_PCI_QUIRK(0x1849, 0x3662, "ASROCK K10N78FullHD-hSLI R3.0", 16470 ALC662_3ST_6ch_DIG), 16471 SND_PCI_QUIRK_MASK(0x1854, 0xf000, 0x2000, "ASUS H13-200x", 16472 ALC663_ASUS_H13), 16473 {} 16474 }; 16475 16476 static struct alc_config_preset alc662_presets[] = { 16477 [ALC662_3ST_2ch_DIG] = { 16478 .mixers = { alc662_3ST_2ch_mixer }, 16479 .init_verbs = { alc662_init_verbs }, 16480 .num_dacs = ARRAY_SIZE(alc662_dac_nids), 16481 .dac_nids = alc662_dac_nids, 16482 .dig_out_nid = ALC662_DIGOUT_NID, 16483 .dig_in_nid = ALC662_DIGIN_NID, 16484 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes), 16485 .channel_mode = alc662_3ST_2ch_modes, 16486 .input_mux = &alc662_capture_source, 16487 }, 16488 [ALC662_3ST_6ch_DIG] = { 16489 .mixers = { alc662_3ST_6ch_mixer, alc662_chmode_mixer }, 16490 .init_verbs = { alc662_init_verbs }, 16491 .num_dacs = ARRAY_SIZE(alc662_dac_nids), 16492 .dac_nids = alc662_dac_nids, 16493 .dig_out_nid = ALC662_DIGOUT_NID, 16494 .dig_in_nid = ALC662_DIGIN_NID, 16495 .num_channel_mode = ARRAY_SIZE(alc662_3ST_6ch_modes), 16496 .channel_mode = alc662_3ST_6ch_modes, 16497 .need_dac_fix = 1, 16498 .input_mux = &alc662_capture_source, 16499 }, 16500 [ALC662_3ST_6ch] = { 16501 .mixers = { alc662_3ST_6ch_mixer, alc662_chmode_mixer }, 16502 .init_verbs = { alc662_init_verbs }, 16503 .num_dacs = ARRAY_SIZE(alc662_dac_nids), 16504 .dac_nids = alc662_dac_nids, 16505 .num_channel_mode = ARRAY_SIZE(alc662_3ST_6ch_modes), 16506 .channel_mode = alc662_3ST_6ch_modes, 16507 .need_dac_fix = 1, 16508 .input_mux = &alc662_capture_source, 16509 }, 16510 [ALC662_5ST_DIG] = { 16511 .mixers = { alc662_base_mixer, alc662_chmode_mixer }, 16512 .init_verbs = { alc662_init_verbs }, 16513 .num_dacs = ARRAY_SIZE(alc662_dac_nids), 16514 .dac_nids = alc662_dac_nids, 16515 .dig_out_nid = ALC662_DIGOUT_NID, 16516 .dig_in_nid = ALC662_DIGIN_NID, 16517 .num_channel_mode = ARRAY_SIZE(alc662_5stack_modes), 16518 .channel_mode = alc662_5stack_modes, 16519 .input_mux = &alc662_capture_source, 16520 }, 16521 [ALC662_LENOVO_101E] = { 16522 .mixers = { alc662_lenovo_101e_mixer }, 16523 .init_verbs = { alc662_init_verbs, alc662_sue_init_verbs }, 16524 .num_dacs = ARRAY_SIZE(alc662_dac_nids), 16525 .dac_nids = alc662_dac_nids, 16526 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes), 16527 .channel_mode = alc662_3ST_2ch_modes, 16528 .input_mux = &alc662_lenovo_101e_capture_source, 16529 .unsol_event = alc662_lenovo_101e_unsol_event, 16530 .init_hook = alc662_lenovo_101e_all_automute, 16531 }, 16532 [ALC662_ASUS_EEEPC_P701] = { 16533 .mixers = { alc662_eeepc_p701_mixer }, 16534 .init_verbs = { alc662_init_verbs, 16535 alc662_eeepc_sue_init_verbs }, 16536 .num_dacs = ARRAY_SIZE(alc662_dac_nids), 16537 .dac_nids = alc662_dac_nids, 16538 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes), 16539 .channel_mode = alc662_3ST_2ch_modes, 16540 .input_mux = &alc662_eeepc_capture_source, 16541 .unsol_event = alc662_eeepc_unsol_event, 16542 .init_hook = alc662_eeepc_inithook, 16543 }, 16544 [ALC662_ASUS_EEEPC_EP20] = { 16545 .mixers = { alc662_eeepc_ep20_mixer, 16546 alc662_chmode_mixer }, 16547 .init_verbs = { alc662_init_verbs, 16548 alc662_eeepc_ep20_sue_init_verbs }, 16549 .num_dacs = ARRAY_SIZE(alc662_dac_nids), 16550 .dac_nids = alc662_dac_nids, 16551 .num_channel_mode = ARRAY_SIZE(alc662_3ST_6ch_modes), 16552 .channel_mode = alc662_3ST_6ch_modes, 16553 .input_mux = &alc662_lenovo_101e_capture_source, 16554 .unsol_event = alc662_eeepc_ep20_unsol_event, 16555 .init_hook = alc662_eeepc_ep20_inithook, 16556 }, 16557 [ALC662_ECS] = { 16558 .mixers = { alc662_ecs_mixer }, 16559 .init_verbs = { alc662_init_verbs, 16560 alc662_ecs_init_verbs }, 16561 .num_dacs = ARRAY_SIZE(alc662_dac_nids), 16562 .dac_nids = alc662_dac_nids, 16563 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes), 16564 .channel_mode = alc662_3ST_2ch_modes, 16565 .input_mux = &alc662_eeepc_capture_source, 16566 .unsol_event = alc662_eeepc_unsol_event, 16567 .init_hook = alc662_eeepc_inithook, 16568 }, 16569 [ALC663_ASUS_M51VA] = { 16570 .mixers = { alc663_m51va_mixer }, 16571 .init_verbs = { alc662_init_verbs, alc663_m51va_init_verbs }, 16572 .num_dacs = ARRAY_SIZE(alc662_dac_nids), 16573 .dac_nids = alc662_dac_nids, 16574 .dig_out_nid = ALC662_DIGOUT_NID, 16575 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes), 16576 .channel_mode = alc662_3ST_2ch_modes, 16577 .input_mux = &alc663_m51va_capture_source, 16578 .unsol_event = alc663_m51va_unsol_event, 16579 .init_hook = alc663_m51va_inithook, 16580 }, 16581 [ALC663_ASUS_G71V] = { 16582 .mixers = { alc663_g71v_mixer }, 16583 .init_verbs = { alc662_init_verbs, alc663_g71v_init_verbs }, 16584 .num_dacs = ARRAY_SIZE(alc662_dac_nids), 16585 .dac_nids = alc662_dac_nids, 16586 .dig_out_nid = ALC662_DIGOUT_NID, 16587 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes), 16588 .channel_mode = alc662_3ST_2ch_modes, 16589 .input_mux = &alc662_eeepc_capture_source, 16590 .unsol_event = alc663_g71v_unsol_event, 16591 .init_hook = alc663_g71v_inithook, 16592 }, 16593 [ALC663_ASUS_H13] = { 16594 .mixers = { alc663_m51va_mixer }, 16595 .init_verbs = { alc662_init_verbs, alc663_m51va_init_verbs }, 16596 .num_dacs = ARRAY_SIZE(alc662_dac_nids), 16597 .dac_nids = alc662_dac_nids, 16598 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes), 16599 .channel_mode = alc662_3ST_2ch_modes, 16600 .input_mux = &alc663_m51va_capture_source, 16601 .unsol_event = alc663_m51va_unsol_event, 16602 .init_hook = alc663_m51va_inithook, 16603 }, 16604 [ALC663_ASUS_G50V] = { 16605 .mixers = { alc663_g50v_mixer }, 16606 .init_verbs = { alc662_init_verbs, alc663_g50v_init_verbs }, 16607 .num_dacs = ARRAY_SIZE(alc662_dac_nids), 16608 .dac_nids = alc662_dac_nids, 16609 .dig_out_nid = ALC662_DIGOUT_NID, 16610 .num_channel_mode = ARRAY_SIZE(alc662_3ST_6ch_modes), 16611 .channel_mode = alc662_3ST_6ch_modes, 16612 .input_mux = &alc663_capture_source, 16613 .unsol_event = alc663_g50v_unsol_event, 16614 .init_hook = alc663_g50v_inithook, 16615 }, 16616 [ALC663_ASUS_MODE1] = { 16617 .mixers = { alc663_m51va_mixer }, 16618 .cap_mixer = alc662_auto_capture_mixer, 16619 .init_verbs = { alc662_init_verbs, 16620 alc663_21jd_amic_init_verbs }, 16621 .num_dacs = ARRAY_SIZE(alc662_dac_nids), 16622 .hp_nid = 0x03, 16623 .dac_nids = alc662_dac_nids, 16624 .dig_out_nid = ALC662_DIGOUT_NID, 16625 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes), 16626 .channel_mode = alc662_3ST_2ch_modes, 16627 .input_mux = &alc662_eeepc_capture_source, 16628 .unsol_event = alc663_mode1_unsol_event, 16629 .init_hook = alc663_mode1_inithook, 16630 }, 16631 [ALC662_ASUS_MODE2] = { 16632 .mixers = { alc662_1bjd_mixer }, 16633 .cap_mixer = alc662_auto_capture_mixer, 16634 .init_verbs = { alc662_init_verbs, 16635 alc662_1bjd_amic_init_verbs }, 16636 .num_dacs = ARRAY_SIZE(alc662_dac_nids), 16637 .dac_nids = alc662_dac_nids, 16638 .dig_out_nid = ALC662_DIGOUT_NID, 16639 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes), 16640 .channel_mode = alc662_3ST_2ch_modes, 16641 .input_mux = &alc662_eeepc_capture_source, 16642 .unsol_event = alc662_mode2_unsol_event, 16643 .init_hook = alc662_mode2_inithook, 16644 }, 16645 [ALC663_ASUS_MODE3] = { 16646 .mixers = { alc663_two_hp_m1_mixer }, 16647 .cap_mixer = alc662_auto_capture_mixer, 16648 .init_verbs = { alc662_init_verbs, 16649 alc663_two_hp_amic_m1_init_verbs }, 16650 .num_dacs = ARRAY_SIZE(alc662_dac_nids), 16651 .hp_nid = 0x03, 16652 .dac_nids = alc662_dac_nids, 16653 .dig_out_nid = ALC662_DIGOUT_NID, 16654 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes), 16655 .channel_mode = alc662_3ST_2ch_modes, 16656 .input_mux = &alc662_eeepc_capture_source, 16657 .unsol_event = alc663_mode3_unsol_event, 16658 .init_hook = alc663_mode3_inithook, 16659 }, 16660 [ALC663_ASUS_MODE4] = { 16661 .mixers = { alc663_asus_21jd_clfe_mixer }, 16662 .cap_mixer = alc662_auto_capture_mixer, 16663 .init_verbs = { alc662_init_verbs, 16664 alc663_21jd_amic_init_verbs}, 16665 .num_dacs = ARRAY_SIZE(alc662_dac_nids), 16666 .hp_nid = 0x03, 16667 .dac_nids = alc662_dac_nids, 16668 .dig_out_nid = ALC662_DIGOUT_NID, 16669 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes), 16670 .channel_mode = alc662_3ST_2ch_modes, 16671 .input_mux = &alc662_eeepc_capture_source, 16672 .unsol_event = alc663_mode4_unsol_event, 16673 .init_hook = alc663_mode4_inithook, 16674 }, 16675 [ALC663_ASUS_MODE5] = { 16676 .mixers = { alc663_asus_15jd_clfe_mixer }, 16677 .cap_mixer = alc662_auto_capture_mixer, 16678 .init_verbs = { alc662_init_verbs, 16679 alc663_15jd_amic_init_verbs }, 16680 .num_dacs = ARRAY_SIZE(alc662_dac_nids), 16681 .hp_nid = 0x03, 16682 .dac_nids = alc662_dac_nids, 16683 .dig_out_nid = ALC662_DIGOUT_NID, 16684 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes), 16685 .channel_mode = alc662_3ST_2ch_modes, 16686 .input_mux = &alc662_eeepc_capture_source, 16687 .unsol_event = alc663_mode5_unsol_event, 16688 .init_hook = alc663_mode5_inithook, 16689 }, 16690 [ALC663_ASUS_MODE6] = { 16691 .mixers = { alc663_two_hp_m2_mixer }, 16692 .cap_mixer = alc662_auto_capture_mixer, 16693 .init_verbs = { alc662_init_verbs, 16694 alc663_two_hp_amic_m2_init_verbs }, 16695 .num_dacs = ARRAY_SIZE(alc662_dac_nids), 16696 .hp_nid = 0x03, 16697 .dac_nids = alc662_dac_nids, 16698 .dig_out_nid = ALC662_DIGOUT_NID, 16699 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes), 16700 .channel_mode = alc662_3ST_2ch_modes, 16701 .input_mux = &alc662_eeepc_capture_source, 16702 .unsol_event = alc663_mode6_unsol_event, 16703 .init_hook = alc663_mode6_inithook, 16704 }, 16705 [ALC272_DELL] = { 16706 .mixers = { alc663_m51va_mixer }, 16707 .cap_mixer = alc272_auto_capture_mixer, 16708 .init_verbs = { alc662_init_verbs, alc272_dell_init_verbs }, 16709 .num_dacs = ARRAY_SIZE(alc272_dac_nids), 16710 .dac_nids = alc662_dac_nids, 16711 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes), 16712 .adc_nids = alc272_adc_nids, 16713 .num_adc_nids = ARRAY_SIZE(alc272_adc_nids), 16714 .capsrc_nids = alc272_capsrc_nids, 16715 .channel_mode = alc662_3ST_2ch_modes, 16716 .input_mux = &alc663_m51va_capture_source, 16717 .unsol_event = alc663_m51va_unsol_event, 16718 .init_hook = alc663_m51va_inithook, 16719 }, 16720 [ALC272_DELL_ZM1] = { 16721 .mixers = { alc663_m51va_mixer }, 16722 .cap_mixer = alc662_auto_capture_mixer, 16723 .init_verbs = { alc662_init_verbs, alc272_dell_zm1_init_verbs }, 16724 .num_dacs = ARRAY_SIZE(alc272_dac_nids), 16725 .dac_nids = alc662_dac_nids, 16726 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes), 16727 .adc_nids = alc662_adc_nids, 16728 .num_adc_nids = ARRAY_SIZE(alc662_adc_nids), 16729 .capsrc_nids = alc662_capsrc_nids, 16730 .channel_mode = alc662_3ST_2ch_modes, 16731 .input_mux = &alc663_m51va_capture_source, 16732 .unsol_event = alc663_m51va_unsol_event, 16733 .init_hook = alc663_m51va_inithook, 16734 }, 16735 }; 16736 16737 16738 /* 16739 * BIOS auto configuration 16740 */ 16741 16742 /* add playback controls from the parsed DAC table */ 16743 static int alc662_auto_create_multi_out_ctls(struct alc_spec *spec, 16744 const struct auto_pin_cfg *cfg) 16745 { 16746 char name[32]; 16747 static const char *chname[4] = { 16748 "Front", "Surround", NULL /*CLFE*/, "Side" 16749 }; 16750 hda_nid_t nid; 16751 int i, err; 16752 16753 for (i = 0; i < cfg->line_outs; i++) { 16754 if (!spec->multiout.dac_nids[i]) 16755 continue; 16756 nid = alc880_idx_to_dac(i); 16757 if (i == 2) { 16758 /* Center/LFE */ 16759 err = add_control(spec, ALC_CTL_WIDGET_VOL, 16760 "Center Playback Volume", 16761 HDA_COMPOSE_AMP_VAL(nid, 1, 0, 16762 HDA_OUTPUT)); 16763 if (err < 0) 16764 return err; 16765 err = add_control(spec, ALC_CTL_WIDGET_VOL, 16766 "LFE Playback Volume", 16767 HDA_COMPOSE_AMP_VAL(nid, 2, 0, 16768 HDA_OUTPUT)); 16769 if (err < 0) 16770 return err; 16771 err = add_control(spec, ALC_CTL_WIDGET_MUTE, 16772 "Center Playback Switch", 16773 HDA_COMPOSE_AMP_VAL(0x0e, 1, 0, 16774 HDA_INPUT)); 16775 if (err < 0) 16776 return err; 16777 err = add_control(spec, ALC_CTL_WIDGET_MUTE, 16778 "LFE Playback Switch", 16779 HDA_COMPOSE_AMP_VAL(0x0e, 2, 0, 16780 HDA_INPUT)); 16781 if (err < 0) 16782 return err; 16783 } else { 16784 sprintf(name, "%s Playback Volume", chname[i]); 16785 err = add_control(spec, ALC_CTL_WIDGET_VOL, name, 16786 HDA_COMPOSE_AMP_VAL(nid, 3, 0, 16787 HDA_OUTPUT)); 16788 if (err < 0) 16789 return err; 16790 sprintf(name, "%s Playback Switch", chname[i]); 16791 err = add_control(spec, ALC_CTL_WIDGET_MUTE, name, 16792 HDA_COMPOSE_AMP_VAL(alc880_idx_to_mixer(i), 16793 3, 0, HDA_INPUT)); 16794 if (err < 0) 16795 return err; 16796 } 16797 } 16798 return 0; 16799 } 16800 16801 /* add playback controls for speaker and HP outputs */ 16802 static int alc662_auto_create_extra_out(struct alc_spec *spec, hda_nid_t pin, 16803 const char *pfx) 16804 { 16805 hda_nid_t nid; 16806 int err; 16807 char name[32]; 16808 16809 if (!pin) 16810 return 0; 16811 16812 if (pin == 0x17) { 16813 /* ALC663 has a mono output pin on 0x17 */ 16814 sprintf(name, "%s Playback Switch", pfx); 16815 err = add_control(spec, ALC_CTL_WIDGET_MUTE, name, 16816 HDA_COMPOSE_AMP_VAL(pin, 2, 0, HDA_OUTPUT)); 16817 return err; 16818 } 16819 16820 if (alc880_is_fixed_pin(pin)) { 16821 nid = alc880_idx_to_dac(alc880_fixed_pin_idx(pin)); 16822 /* printk(KERN_DEBUG "DAC nid=%x\n",nid); */ 16823 /* specify the DAC as the extra output */ 16824 if (!spec->multiout.hp_nid) 16825 spec->multiout.hp_nid = nid; 16826 else 16827 spec->multiout.extra_out_nid[0] = nid; 16828 /* control HP volume/switch on the output mixer amp */ 16829 nid = alc880_idx_to_dac(alc880_fixed_pin_idx(pin)); 16830 sprintf(name, "%s Playback Volume", pfx); 16831 err = add_control(spec, ALC_CTL_WIDGET_VOL, name, 16832 HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT)); 16833 if (err < 0) 16834 return err; 16835 sprintf(name, "%s Playback Switch", pfx); 16836 err = add_control(spec, ALC_CTL_BIND_MUTE, name, 16837 HDA_COMPOSE_AMP_VAL(nid, 3, 2, HDA_INPUT)); 16838 if (err < 0) 16839 return err; 16840 } else if (alc880_is_multi_pin(pin)) { 16841 /* set manual connection */ 16842 /* we have only a switch on HP-out PIN */ 16843 sprintf(name, "%s Playback Switch", pfx); 16844 err = add_control(spec, ALC_CTL_WIDGET_MUTE, name, 16845 HDA_COMPOSE_AMP_VAL(pin, 3, 0, HDA_OUTPUT)); 16846 if (err < 0) 16847 return err; 16848 } 16849 return 0; 16850 } 16851 16852 /* return the index of the src widget from the connection list of the nid. 16853 * return -1 if not found 16854 */ 16855 static int alc662_input_pin_idx(struct hda_codec *codec, hda_nid_t nid, 16856 hda_nid_t src) 16857 { 16858 hda_nid_t conn_list[HDA_MAX_CONNECTIONS]; 16859 int i, conns; 16860 16861 conns = snd_hda_get_connections(codec, nid, conn_list, 16862 ARRAY_SIZE(conn_list)); 16863 if (conns < 0) 16864 return -1; 16865 for (i = 0; i < conns; i++) 16866 if (conn_list[i] == src) 16867 return i; 16868 return -1; 16869 } 16870 16871 static int alc662_is_input_pin(struct hda_codec *codec, hda_nid_t nid) 16872 { 16873 unsigned int pincap = snd_hda_query_pin_caps(codec, nid); 16874 return (pincap & AC_PINCAP_IN) != 0; 16875 } 16876 16877 /* create playback/capture controls for input pins */ 16878 static int alc662_auto_create_analog_input_ctls(struct hda_codec *codec, 16879 const struct auto_pin_cfg *cfg) 16880 { 16881 struct alc_spec *spec = codec->spec; 16882 struct hda_input_mux *imux = &spec->private_imux[0]; 16883 int i, err, idx; 16884 16885 for (i = 0; i < AUTO_PIN_LAST; i++) { 16886 if (alc662_is_input_pin(codec, cfg->input_pins[i])) { 16887 idx = alc662_input_pin_idx(codec, 0x0b, 16888 cfg->input_pins[i]); 16889 if (idx >= 0) { 16890 err = new_analog_input(spec, cfg->input_pins[i], 16891 auto_pin_cfg_labels[i], 16892 idx, 0x0b); 16893 if (err < 0) 16894 return err; 16895 } 16896 idx = alc662_input_pin_idx(codec, 0x22, 16897 cfg->input_pins[i]); 16898 if (idx >= 0) { 16899 imux->items[imux->num_items].label = 16900 auto_pin_cfg_labels[i]; 16901 imux->items[imux->num_items].index = idx; 16902 imux->num_items++; 16903 } 16904 } 16905 } 16906 return 0; 16907 } 16908 16909 static void alc662_auto_set_output_and_unmute(struct hda_codec *codec, 16910 hda_nid_t nid, int pin_type, 16911 int dac_idx) 16912 { 16913 alc_set_pin_output(codec, nid, pin_type); 16914 /* need the manual connection? */ 16915 if (alc880_is_multi_pin(nid)) { 16916 struct alc_spec *spec = codec->spec; 16917 int idx = alc880_multi_pin_idx(nid); 16918 snd_hda_codec_write(codec, alc880_idx_to_selector(idx), 0, 16919 AC_VERB_SET_CONNECT_SEL, 16920 alc880_dac_to_idx(spec->multiout.dac_nids[dac_idx])); 16921 } 16922 } 16923 16924 static void alc662_auto_init_multi_out(struct hda_codec *codec) 16925 { 16926 struct alc_spec *spec = codec->spec; 16927 int i; 16928 16929 alc_subsystem_id(codec, 0x15, 0x1b, 0x14); 16930 for (i = 0; i <= HDA_SIDE; i++) { 16931 hda_nid_t nid = spec->autocfg.line_out_pins[i]; 16932 int pin_type = get_pin_type(spec->autocfg.line_out_type); 16933 if (nid) 16934 alc662_auto_set_output_and_unmute(codec, nid, pin_type, 16935 i); 16936 } 16937 } 16938 16939 static void alc662_auto_init_hp_out(struct hda_codec *codec) 16940 { 16941 struct alc_spec *spec = codec->spec; 16942 hda_nid_t pin; 16943 16944 pin = spec->autocfg.hp_pins[0]; 16945 if (pin) /* connect to front */ 16946 /* use dac 0 */ 16947 alc662_auto_set_output_and_unmute(codec, pin, PIN_HP, 0); 16948 pin = spec->autocfg.speaker_pins[0]; 16949 if (pin) 16950 alc662_auto_set_output_and_unmute(codec, pin, PIN_OUT, 0); 16951 } 16952 16953 #define ALC662_PIN_CD_NID ALC880_PIN_CD_NID 16954 16955 static void alc662_auto_init_analog_input(struct hda_codec *codec) 16956 { 16957 struct alc_spec *spec = codec->spec; 16958 int i; 16959 16960 for (i = 0; i < AUTO_PIN_LAST; i++) { 16961 hda_nid_t nid = spec->autocfg.input_pins[i]; 16962 if (alc662_is_input_pin(codec, nid)) { 16963 alc_set_input_pin(codec, nid, i); 16964 if (nid != ALC662_PIN_CD_NID && 16965 (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP)) 16966 snd_hda_codec_write(codec, nid, 0, 16967 AC_VERB_SET_AMP_GAIN_MUTE, 16968 AMP_OUT_MUTE); 16969 } 16970 } 16971 } 16972 16973 #define alc662_auto_init_input_src alc882_auto_init_input_src 16974 16975 static int alc662_parse_auto_config(struct hda_codec *codec) 16976 { 16977 struct alc_spec *spec = codec->spec; 16978 int err; 16979 static hda_nid_t alc662_ignore[] = { 0x1d, 0 }; 16980 16981 err = snd_hda_parse_pin_def_config(codec, &spec->autocfg, 16982 alc662_ignore); 16983 if (err < 0) 16984 return err; 16985 if (!spec->autocfg.line_outs) 16986 return 0; /* can't find valid BIOS pin config */ 16987 16988 err = alc880_auto_fill_dac_nids(spec, &spec->autocfg); 16989 if (err < 0) 16990 return err; 16991 err = alc662_auto_create_multi_out_ctls(spec, &spec->autocfg); 16992 if (err < 0) 16993 return err; 16994 err = alc662_auto_create_extra_out(spec, 16995 spec->autocfg.speaker_pins[0], 16996 "Speaker"); 16997 if (err < 0) 16998 return err; 16999 err = alc662_auto_create_extra_out(spec, spec->autocfg.hp_pins[0], 17000 "Headphone"); 17001 if (err < 0) 17002 return err; 17003 err = alc662_auto_create_analog_input_ctls(codec, &spec->autocfg); 17004 if (err < 0) 17005 return err; 17006 17007 spec->multiout.max_channels = spec->multiout.num_dacs * 2; 17008 17009 if (spec->autocfg.dig_outs) 17010 spec->multiout.dig_out_nid = ALC880_DIGOUT_NID; 17011 17012 if (spec->kctls.list) 17013 add_mixer(spec, spec->kctls.list); 17014 17015 spec->num_mux_defs = 1; 17016 spec->input_mux = &spec->private_imux[0]; 17017 17018 add_verb(spec, alc662_auto_init_verbs); 17019 if (codec->vendor_id == 0x10ec0663) 17020 add_verb(spec, alc663_auto_init_verbs); 17021 17022 err = alc_auto_add_mic_boost(codec); 17023 if (err < 0) 17024 return err; 17025 17026 return 1; 17027 } 17028 17029 /* additional initialization for auto-configuration model */ 17030 static void alc662_auto_init(struct hda_codec *codec) 17031 { 17032 struct alc_spec *spec = codec->spec; 17033 alc662_auto_init_multi_out(codec); 17034 alc662_auto_init_hp_out(codec); 17035 alc662_auto_init_analog_input(codec); 17036 alc662_auto_init_input_src(codec); 17037 if (spec->unsol_event) 17038 alc_inithook(codec); 17039 } 17040 17041 static int patch_alc662(struct hda_codec *codec) 17042 { 17043 struct alc_spec *spec; 17044 int err, board_config; 17045 17046 spec = kzalloc(sizeof(*spec), GFP_KERNEL); 17047 if (!spec) 17048 return -ENOMEM; 17049 17050 codec->spec = spec; 17051 17052 alc_fix_pll_init(codec, 0x20, 0x04, 15); 17053 17054 board_config = snd_hda_check_board_config(codec, ALC662_MODEL_LAST, 17055 alc662_models, 17056 alc662_cfg_tbl); 17057 if (board_config < 0) { 17058 printk(KERN_INFO "hda_codec: Unknown model for ALC662, " 17059 "trying auto-probe from BIOS...\n"); 17060 board_config = ALC662_AUTO; 17061 } 17062 17063 if (board_config == ALC662_AUTO) { 17064 /* automatic parse from the BIOS config */ 17065 err = alc662_parse_auto_config(codec); 17066 if (err < 0) { 17067 alc_free(codec); 17068 return err; 17069 } else if (!err) { 17070 printk(KERN_INFO 17071 "hda_codec: Cannot set up configuration " 17072 "from BIOS. Using base mode...\n"); 17073 board_config = ALC662_3ST_2ch_DIG; 17074 } 17075 } 17076 17077 err = snd_hda_attach_beep_device(codec, 0x1); 17078 if (err < 0) { 17079 alc_free(codec); 17080 return err; 17081 } 17082 17083 if (board_config != ALC662_AUTO) 17084 setup_preset(spec, &alc662_presets[board_config]); 17085 17086 if (codec->vendor_id == 0x10ec0663) { 17087 spec->stream_name_analog = "ALC663 Analog"; 17088 spec->stream_name_digital = "ALC663 Digital"; 17089 } else if (codec->vendor_id == 0x10ec0272) { 17090 spec->stream_name_analog = "ALC272 Analog"; 17091 spec->stream_name_digital = "ALC272 Digital"; 17092 } else { 17093 spec->stream_name_analog = "ALC662 Analog"; 17094 spec->stream_name_digital = "ALC662 Digital"; 17095 } 17096 17097 spec->stream_analog_playback = &alc662_pcm_analog_playback; 17098 spec->stream_analog_capture = &alc662_pcm_analog_capture; 17099 17100 spec->stream_digital_playback = &alc662_pcm_digital_playback; 17101 spec->stream_digital_capture = &alc662_pcm_digital_capture; 17102 17103 spec->adc_nids = alc662_adc_nids; 17104 spec->num_adc_nids = ARRAY_SIZE(alc662_adc_nids); 17105 spec->capsrc_nids = alc662_capsrc_nids; 17106 spec->capture_style = CAPT_MIX; 17107 17108 if (!spec->cap_mixer) 17109 set_capture_mixer(spec); 17110 if (codec->vendor_id == 0x10ec0662) 17111 set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT); 17112 else 17113 set_beep_amp(spec, 0x0b, 0x04, HDA_INPUT); 17114 17115 spec->vmaster_nid = 0x02; 17116 17117 codec->patch_ops = alc_patch_ops; 17118 if (board_config == ALC662_AUTO) 17119 spec->init_hook = alc662_auto_init; 17120 #ifdef CONFIG_SND_HDA_POWER_SAVE 17121 if (!spec->loopback.amplist) 17122 spec->loopback.amplist = alc662_loopbacks; 17123 #endif 17124 codec->proc_widget_hook = print_realtek_coef; 17125 17126 return 0; 17127 } 17128 17129 /* 17130 * patch entries 17131 */ 17132 static struct hda_codec_preset snd_hda_preset_realtek[] = { 17133 { .id = 0x10ec0260, .name = "ALC260", .patch = patch_alc260 }, 17134 { .id = 0x10ec0262, .name = "ALC262", .patch = patch_alc262 }, 17135 { .id = 0x10ec0267, .name = "ALC267", .patch = patch_alc268 }, 17136 { .id = 0x10ec0268, .name = "ALC268", .patch = patch_alc268 }, 17137 { .id = 0x10ec0269, .name = "ALC269", .patch = patch_alc269 }, 17138 { .id = 0x10ec0272, .name = "ALC272", .patch = patch_alc662 }, 17139 { .id = 0x10ec0861, .rev = 0x100340, .name = "ALC660", 17140 .patch = patch_alc861 }, 17141 { .id = 0x10ec0660, .name = "ALC660-VD", .patch = patch_alc861vd }, 17142 { .id = 0x10ec0861, .name = "ALC861", .patch = patch_alc861 }, 17143 { .id = 0x10ec0862, .name = "ALC861-VD", .patch = patch_alc861vd }, 17144 { .id = 0x10ec0662, .rev = 0x100002, .name = "ALC662 rev2", 17145 .patch = patch_alc883 }, 17146 { .id = 0x10ec0662, .rev = 0x100101, .name = "ALC662 rev1", 17147 .patch = patch_alc662 }, 17148 { .id = 0x10ec0663, .name = "ALC663", .patch = patch_alc662 }, 17149 { .id = 0x10ec0880, .name = "ALC880", .patch = patch_alc880 }, 17150 { .id = 0x10ec0882, .name = "ALC882", .patch = patch_alc882 }, 17151 { .id = 0x10ec0883, .name = "ALC883", .patch = patch_alc883 }, 17152 { .id = 0x10ec0885, .rev = 0x100101, .name = "ALC889A", 17153 .patch = patch_alc882 }, /* should be patch_alc883() in future */ 17154 { .id = 0x10ec0885, .rev = 0x100103, .name = "ALC889A", 17155 .patch = patch_alc882 }, /* should be patch_alc883() in future */ 17156 { .id = 0x10ec0885, .name = "ALC885", .patch = patch_alc882 }, 17157 { .id = 0x10ec0887, .name = "ALC887", .patch = patch_alc883 }, 17158 { .id = 0x10ec0888, .rev = 0x100101, .name = "ALC1200", 17159 .patch = patch_alc883 }, 17160 { .id = 0x10ec0888, .name = "ALC888", .patch = patch_alc883 }, 17161 { .id = 0x10ec0889, .name = "ALC889", .patch = patch_alc883 }, 17162 {} /* terminator */ 17163 }; 17164 17165 MODULE_ALIAS("snd-hda-codec-id:10ec*"); 17166 17167 MODULE_LICENSE("GPL"); 17168 MODULE_DESCRIPTION("Realtek HD-audio codec"); 17169 17170 static struct hda_codec_preset_list realtek_list = { 17171 .preset = snd_hda_preset_realtek, 17172 .owner = THIS_MODULE, 17173 }; 17174 17175 static int __init patch_realtek_init(void) 17176 { 17177 return snd_hda_add_codec_preset(&realtek_list); 17178 } 17179 17180 static void __exit patch_realtek_exit(void) 17181 { 17182 snd_hda_delete_codec_preset(&realtek_list); 17183 } 17184 17185 module_init(patch_realtek_init) 17186 module_exit(patch_realtek_exit) 17187