diff options
author | Kailang Yang <kailang@realtek.com> | 2008-08-26 07:13:00 -0400 |
---|---|---|
committer | Jaroslav Kysela <perex@perex.cz> | 2008-08-29 04:05:57 -0400 |
commit | 60db6b53fb43421beb2ff3fe3e63412bf81620aa (patch) | |
tree | 8f5e4f9518f51b49d47eec610c83727b17aba6de /sound/pci/hda/patch_realtek.c | |
parent | 8ef355da64ff087b6f26c4c28a14753861e83e4b (diff) |
ALSA: hda - Add support of Quanta FL1
Added the support of Quanta FL1 with ALC269 code chip.
Also a bit space clean-ups.
Signed-off-by: Kailang Yang <kailang@realtek.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
Diffstat (limited to 'sound/pci/hda/patch_realtek.c')
-rw-r--r-- | sound/pci/hda/patch_realtek.c | 250 |
1 files changed, 175 insertions, 75 deletions
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index 99c1de639e97..538d85440a30 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c | |||
@@ -126,6 +126,7 @@ enum { | |||
126 | /* ALC269 models */ | 126 | /* ALC269 models */ |
127 | enum { | 127 | enum { |
128 | ALC269_BASIC, | 128 | ALC269_BASIC, |
129 | ALC269_QUANTA_FL1, | ||
129 | ALC269_ASUS_EEEPC_P703, | 130 | ALC269_ASUS_EEEPC_P703, |
130 | ALC269_ASUS_EEEPC_P901, | 131 | ALC269_ASUS_EEEPC_P901, |
131 | ALC269_AUTO, | 132 | ALC269_AUTO, |
@@ -11378,6 +11379,28 @@ static struct snd_kcontrol_new alc269_base_mixer[] = { | |||
11378 | { } /* end */ | 11379 | { } /* end */ |
11379 | }; | 11380 | }; |
11380 | 11381 | ||
11382 | static struct snd_kcontrol_new alc269_quanta_fl1_mixer[] = { | ||
11383 | /* output mixer control */ | ||
11384 | HDA_BIND_VOL("Master Playback Volume", &alc268_acer_bind_master_vol), | ||
11385 | { | ||
11386 | .iface = SNDRV_CTL_ELEM_IFACE_MIXER, | ||
11387 | .name = "Master Playback Switch", | ||
11388 | .info = snd_hda_mixer_amp_switch_info, | ||
11389 | .get = snd_hda_mixer_amp_switch_get, | ||
11390 | .put = alc268_acer_master_sw_put, | ||
11391 | .private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT), | ||
11392 | }, | ||
11393 | HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), | ||
11394 | HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), | ||
11395 | HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), | ||
11396 | HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x01, HDA_INPUT), | ||
11397 | HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x01, HDA_INPUT), | ||
11398 | HDA_CODEC_VOLUME("Internal Mic Boost", 0x19, 0, HDA_INPUT), | ||
11399 | HDA_CODEC_VOLUME("PC Speaker Playback Volume", 0x0b, 0x04, HDA_INPUT), | ||
11400 | HDA_CODEC_MUTE("PC Speaker Playback Switch", 0x0b, 0x04, HDA_INPUT), | ||
11401 | { } | ||
11402 | }; | ||
11403 | |||
11381 | /* bind volumes of both NID 0x0c and 0x0d */ | 11404 | /* bind volumes of both NID 0x0c and 0x0d */ |
11382 | static struct hda_bind_ctls alc269_epc_bind_vol = { | 11405 | static struct hda_bind_ctls alc269_epc_bind_vol = { |
11383 | .ops = &snd_hda_bind_vol, | 11406 | .ops = &snd_hda_bind_vol, |
@@ -11428,75 +11451,65 @@ static struct snd_kcontrol_new alc269_beep_mixer[] = { | |||
11428 | { } /* end */ | 11451 | { } /* end */ |
11429 | }; | 11452 | }; |
11430 | 11453 | ||
11431 | /* | 11454 | static struct hda_verb alc269_quanta_fl1_verbs[] = { |
11432 | * generic initialization of ADC, input mixers and output mixers | 11455 | {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, |
11433 | */ | 11456 | {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, |
11434 | static struct hda_verb alc269_init_verbs[] = { | 11457 | {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, |
11435 | /* | 11458 | {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, |
11436 | * Unmute ADC0 and set the default input to mic-in | 11459 | {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT}, |
11437 | */ | 11460 | {0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, |
11438 | {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, | 11461 | { } |
11462 | }; | ||
11439 | 11463 | ||
11440 | /* Mute input amps (PCBeep, Line In, Mic 1 & Mic 2) of the | 11464 | /* toggle speaker-output according to the hp-jack state */ |
11441 | * analog-loopback mixer widget | 11465 | static void alc269_quanta_fl1_speaker_automute(struct hda_codec *codec) |
11442 | * Note: PASD motherboards uses the Line In 2 as the input for | 11466 | { |
11443 | * front panel mic (mic 2) | 11467 | unsigned int present; |
11444 | */ | 11468 | unsigned char bits; |
11445 | /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */ | ||
11446 | {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, | ||
11447 | {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, | ||
11448 | {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, | ||
11449 | {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, | ||
11450 | {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, | ||
11451 | 11469 | ||
11452 | /* | 11470 | present = snd_hda_codec_read(codec, 0x15, 0, |
11453 | * Set up output mixers (0x0c - 0x0e) | 11471 | AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; |
11454 | */ | 11472 | bits = present ? AMP_IN_MUTE(0) : 0; |
11455 | /* set vol=0 to output mixers */ | 11473 | snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0, |
11456 | {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, | 11474 | AMP_IN_MUTE(0), bits); |
11457 | {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, | 11475 | snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1, |
11476 | AMP_IN_MUTE(0), bits); | ||
11458 | 11477 | ||
11459 | /* set up input amps for analog loopback */ | 11478 | snd_hda_codec_write(codec, 0x20, 0, |
11460 | /* Amp Indices: DAC = 0, mixer = 1 */ | 11479 | AC_VERB_SET_COEF_INDEX, 0x0c); |
11461 | {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, | 11480 | snd_hda_codec_write(codec, 0x20, 0, |
11462 | {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, | 11481 | AC_VERB_SET_PROC_COEF, 0x680); |
11463 | {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, | ||
11464 | {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, | ||
11465 | {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, | ||
11466 | {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, | ||
11467 | 11482 | ||
11468 | {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, | 11483 | snd_hda_codec_write(codec, 0x20, 0, |
11469 | {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, | 11484 | AC_VERB_SET_COEF_INDEX, 0x0c); |
11470 | {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, | 11485 | snd_hda_codec_write(codec, 0x20, 0, |
11471 | {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, | 11486 | AC_VERB_SET_PROC_COEF, 0x480); |
11472 | {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, | 11487 | } |
11473 | {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, | ||
11474 | {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, | ||
11475 | 11488 | ||
11476 | {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | 11489 | static void alc269_quanta_fl1_mic_automute(struct hda_codec *codec) |
11477 | {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | 11490 | { |
11478 | {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, | 11491 | unsigned int present; |
11479 | {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, | ||
11480 | {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, | ||
11481 | {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, | ||
11482 | {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, | ||
11483 | 11492 | ||
11484 | {0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, | 11493 | present = snd_hda_codec_read(codec, 0x18, 0, |
11485 | {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, | 11494 | AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; |
11495 | snd_hda_codec_write(codec, 0x23, 0, | ||
11496 | AC_VERB_SET_CONNECT_SEL, present ? 0x0 : 0x1); | ||
11497 | } | ||
11486 | 11498 | ||
11487 | /* FIXME: use matrix-type input source selection */ | 11499 | static void alc269_quanta_fl1_unsol_event(struct hda_codec *codec, |
11488 | /* Mixer elements: 0x18, 19, 1a, 1b, 1d, 0b */ | 11500 | unsigned int res) |
11489 | /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */ | 11501 | { |
11490 | {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, | 11502 | if ((res >> 26) == ALC880_HP_EVENT) |
11491 | {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, | 11503 | alc269_quanta_fl1_speaker_automute(codec); |
11492 | {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, | 11504 | if ((res >> 26) == ALC880_MIC_EVENT) |
11493 | {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, | 11505 | alc269_quanta_fl1_mic_automute(codec); |
11506 | } | ||
11494 | 11507 | ||
11495 | /* set EAPD */ | 11508 | static void alc269_quanta_fl1_init_hook(struct hda_codec *codec) |
11496 | {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2}, | 11509 | { |
11497 | {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2}, | 11510 | alc269_quanta_fl1_speaker_automute(codec); |
11498 | { } | 11511 | alc269_quanta_fl1_mic_automute(codec); |
11499 | }; | 11512 | } |
11500 | 11513 | ||
11501 | static struct hda_verb alc269_eeepc_dmic_init_verbs[] = { | 11514 | static struct hda_verb alc269_eeepc_dmic_init_verbs[] = { |
11502 | {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, | 11515 | {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, |
@@ -11523,42 +11536,42 @@ static struct hda_verb alc269_eeepc_amic_init_verbs[] = { | |||
11523 | static void alc269_speaker_automute(struct hda_codec *codec) | 11536 | static void alc269_speaker_automute(struct hda_codec *codec) |
11524 | { | 11537 | { |
11525 | unsigned int present; | 11538 | unsigned int present; |
11526 | unsigned int bits; | 11539 | unsigned char bits; |
11527 | 11540 | ||
11528 | present = snd_hda_codec_read(codec, 0x15, 0, | 11541 | present = snd_hda_codec_read(codec, 0x15, 0, |
11529 | AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; | 11542 | AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; |
11530 | bits = present ? AMP_IN_MUTE(0) : 0; | 11543 | bits = present ? AMP_IN_MUTE(0) : 0; |
11531 | snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0, | 11544 | snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0, |
11532 | AMP_IN_MUTE(0), bits); | 11545 | AMP_IN_MUTE(0), bits); |
11533 | snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1, | 11546 | snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1, |
11534 | AMP_IN_MUTE(0), bits); | 11547 | AMP_IN_MUTE(0), bits); |
11535 | } | 11548 | } |
11536 | 11549 | ||
11537 | static void alc269_eeepc_dmic_automute(struct hda_codec *codec) | 11550 | static void alc269_eeepc_dmic_automute(struct hda_codec *codec) |
11538 | { | 11551 | { |
11539 | unsigned int present; | 11552 | unsigned int present; |
11540 | 11553 | ||
11541 | present = snd_hda_codec_read(codec, 0x18, 0, AC_VERB_GET_PIN_SENSE, 0) | 11554 | present = snd_hda_codec_read(codec, 0x18, 0, |
11542 | & AC_PINSENSE_PRESENCE; | 11555 | AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; |
11543 | snd_hda_codec_write(codec, 0x23, 0, AC_VERB_SET_CONNECT_SEL, | 11556 | snd_hda_codec_write(codec, 0x23, 0, |
11544 | present ? 0 : 5); | 11557 | AC_VERB_SET_CONNECT_SEL, (present ? 0 : 5)); |
11545 | } | 11558 | } |
11546 | 11559 | ||
11547 | static void alc269_eeepc_amic_automute(struct hda_codec *codec) | 11560 | static void alc269_eeepc_amic_automute(struct hda_codec *codec) |
11548 | { | 11561 | { |
11549 | unsigned int present; | 11562 | unsigned int present; |
11550 | 11563 | ||
11551 | present = snd_hda_codec_read(codec, 0x18, 0, AC_VERB_GET_PIN_SENSE, 0) | 11564 | present = snd_hda_codec_read(codec, 0x18, 0, |
11552 | & AC_PINSENSE_PRESENCE; | 11565 | AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; |
11553 | snd_hda_codec_write(codec, 0x24, 0, AC_VERB_SET_AMP_GAIN_MUTE, | 11566 | snd_hda_codec_write(codec, 0x24, 0, AC_VERB_SET_AMP_GAIN_MUTE, |
11554 | present ? AMP_IN_UNMUTE(0) : AMP_IN_MUTE(0)); | 11567 | 0x7000 | (0x00 << 8) | (present ? 0 : 0x80)); |
11555 | snd_hda_codec_write(codec, 0x24, 0, AC_VERB_SET_AMP_GAIN_MUTE, | 11568 | snd_hda_codec_write(codec, 0x24, 0, AC_VERB_SET_AMP_GAIN_MUTE, |
11556 | present ? AMP_IN_MUTE(1) : AMP_IN_UNMUTE(1)); | 11569 | 0x7000 | (0x01 << 8) | (present ? 0x80 : 0)); |
11557 | } | 11570 | } |
11558 | 11571 | ||
11559 | /* unsolicited event for HP jack sensing */ | 11572 | /* unsolicited event for HP jack sensing */ |
11560 | static void alc269_eeepc_dmic_unsol_event(struct hda_codec *codec, | 11573 | static void alc269_eeepc_dmic_unsol_event(struct hda_codec *codec, |
11561 | unsigned int res) | 11574 | unsigned int res) |
11562 | { | 11575 | { |
11563 | if ((res >> 26) == ALC880_HP_EVENT) | 11576 | if ((res >> 26) == ALC880_HP_EVENT) |
11564 | alc269_speaker_automute(codec); | 11577 | alc269_speaker_automute(codec); |
@@ -11590,6 +11603,76 @@ static void alc269_eeepc_amic_inithook(struct hda_codec *codec) | |||
11590 | alc269_eeepc_amic_automute(codec); | 11603 | alc269_eeepc_amic_automute(codec); |
11591 | } | 11604 | } |
11592 | 11605 | ||
11606 | /* | ||
11607 | * generic initialization of ADC, input mixers and output mixers | ||
11608 | */ | ||
11609 | static struct hda_verb alc269_init_verbs[] = { | ||
11610 | /* | ||
11611 | * Unmute ADC0 and set the default input to mic-in | ||
11612 | */ | ||
11613 | {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, | ||
11614 | |||
11615 | /* Mute input amps (PCBeep, Line In, Mic 1 & Mic 2) of the | ||
11616 | * analog-loopback mixer widget | ||
11617 | * Note: PASD motherboards uses the Line In 2 as the input for | ||
11618 | * front panel mic (mic 2) | ||
11619 | */ | ||
11620 | /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */ | ||
11621 | {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, | ||
11622 | {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, | ||
11623 | {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, | ||
11624 | {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, | ||
11625 | {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, | ||
11626 | |||
11627 | /* | ||
11628 | * Set up output mixers (0x0c - 0x0e) | ||
11629 | */ | ||
11630 | /* set vol=0 to output mixers */ | ||
11631 | {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, | ||
11632 | {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, | ||
11633 | |||
11634 | /* set up input amps for analog loopback */ | ||
11635 | /* Amp Indices: DAC = 0, mixer = 1 */ | ||
11636 | {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, | ||
11637 | {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, | ||
11638 | {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, | ||
11639 | {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, | ||
11640 | {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, | ||
11641 | {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, | ||
11642 | |||
11643 | {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, | ||
11644 | {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, | ||
11645 | {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, | ||
11646 | {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, | ||
11647 | {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, | ||
11648 | {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, | ||
11649 | {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, | ||
11650 | |||
11651 | {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | ||
11652 | {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | ||
11653 | {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, | ||
11654 | {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, | ||
11655 | {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, | ||
11656 | {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, | ||
11657 | {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, | ||
11658 | |||
11659 | {0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, | ||
11660 | {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, | ||
11661 | |||
11662 | /* FIXME: use matrix-type input source selection */ | ||
11663 | /* Mixer elements: 0x18, 19, 1a, 1b, 1d, 0b */ | ||
11664 | /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */ | ||
11665 | {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, | ||
11666 | {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, | ||
11667 | {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, | ||
11668 | {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, | ||
11669 | |||
11670 | /* set EAPD */ | ||
11671 | {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2}, | ||
11672 | {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2}, | ||
11673 | { } | ||
11674 | }; | ||
11675 | |||
11593 | /* add playback controls from the parsed DAC table */ | 11676 | /* add playback controls from the parsed DAC table */ |
11594 | static int alc269_auto_create_multi_out_ctls(struct alc_spec *spec, | 11677 | static int alc269_auto_create_multi_out_ctls(struct alc_spec *spec, |
11595 | const struct auto_pin_cfg *cfg) | 11678 | const struct auto_pin_cfg *cfg) |
@@ -11758,14 +11841,19 @@ static void alc269_auto_init(struct hda_codec *codec) | |||
11758 | * configuration and preset | 11841 | * configuration and preset |
11759 | */ | 11842 | */ |
11760 | static const char *alc269_models[ALC269_MODEL_LAST] = { | 11843 | static const char *alc269_models[ALC269_MODEL_LAST] = { |
11761 | [ALC269_BASIC] = "basic", | 11844 | [ALC269_BASIC] = "basic", |
11845 | [ALC269_QUANTA_FL1] = "Quanta", | ||
11846 | [ALC269_ASUS_EEEPC_P901] = "Asus_Epc_Dmic" | ||
11762 | }; | 11847 | }; |
11763 | 11848 | ||
11764 | static struct snd_pci_quirk alc269_cfg_tbl[] = { | 11849 | static struct snd_pci_quirk alc269_cfg_tbl[] = { |
11850 | SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_QUANTA_FL1), | ||
11765 | SND_PCI_QUIRK(0x1043, 0x8330, "ASUS Eeepc P703 P900A", | 11851 | SND_PCI_QUIRK(0x1043, 0x8330, "ASUS Eeepc P703 P900A", |
11766 | ALC269_ASUS_EEEPC_P703), | 11852 | ALC269_ASUS_EEEPC_P703), |
11767 | SND_PCI_QUIRK(0x1043, 0x831a, "ASUS Eeepc P901", | 11853 | SND_PCI_QUIRK(0x1043, 0x831a, "ASUS Eeepc P901", |
11768 | ALC269_ASUS_EEEPC_P901), | 11854 | ALC269_ASUS_EEEPC_P901), |
11855 | SND_PCI_QUIRK(0x1043, 0x834a, "ASUS Eeepc S101", | ||
11856 | ALC269_ASUS_EEEPC_P901), | ||
11769 | {} | 11857 | {} |
11770 | }; | 11858 | }; |
11771 | 11859 | ||
@@ -11780,6 +11868,18 @@ static struct alc_config_preset alc269_presets[] = { | |||
11780 | .channel_mode = alc269_modes, | 11868 | .channel_mode = alc269_modes, |
11781 | .input_mux = &alc269_capture_source, | 11869 | .input_mux = &alc269_capture_source, |
11782 | }, | 11870 | }, |
11871 | [ALC269_QUANTA_FL1] = { | ||
11872 | .mixers = { alc269_quanta_fl1_mixer }, | ||
11873 | .init_verbs = { alc269_init_verbs, alc269_quanta_fl1_verbs }, | ||
11874 | .num_dacs = ARRAY_SIZE(alc269_dac_nids), | ||
11875 | .dac_nids = alc269_dac_nids, | ||
11876 | .hp_nid = 0x03, | ||
11877 | .num_channel_mode = ARRAY_SIZE(alc269_modes), | ||
11878 | .channel_mode = alc269_modes, | ||
11879 | .input_mux = &alc269_capture_source, | ||
11880 | .unsol_event = alc269_quanta_fl1_unsol_event, | ||
11881 | .init_hook = alc269_quanta_fl1_init_hook, | ||
11882 | }, | ||
11783 | [ALC269_ASUS_EEEPC_P703] = { | 11883 | [ALC269_ASUS_EEEPC_P703] = { |
11784 | .mixers = { alc269_eeepc_mixer, alc269_epc_capture_mixer }, | 11884 | .mixers = { alc269_eeepc_mixer, alc269_epc_capture_mixer }, |
11785 | .init_verbs = { alc269_init_verbs, | 11885 | .init_verbs = { alc269_init_verbs, |