diff options
Diffstat (limited to 'sound/pci')
-rw-r--r-- | sound/pci/hda/patch_realtek.c | 129 |
1 files changed, 129 insertions, 0 deletions
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index 4f6dea23d8b2..104d2a37f45a 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c | |||
@@ -64,6 +64,7 @@ enum { | |||
64 | ALC260_HP, | 64 | ALC260_HP, |
65 | ALC260_HP_3013, | 65 | ALC260_HP_3013, |
66 | ALC260_FUJITSU_S702X, | 66 | ALC260_FUJITSU_S702X, |
67 | ALC260_ACER, | ||
67 | #ifdef CONFIG_SND_DEBUG | 68 | #ifdef CONFIG_SND_DEBUG |
68 | ALC260_TEST, | 69 | ALC260_TEST, |
69 | #endif | 70 | #endif |
@@ -2504,6 +2505,19 @@ static struct hda_input_mux alc260_fujitsu_capture_source = { | |||
2504 | }, | 2505 | }, |
2505 | }; | 2506 | }; |
2506 | 2507 | ||
2508 | /* Acer TravelMate(/Extensa/Aspire) notebooks have similar configutation to | ||
2509 | * the Fujitsu S702x, but jacks are marked differently. We won't allow | ||
2510 | * retasking the Headphone jack, so it won't be available here. | ||
2511 | */ | ||
2512 | static struct hda_input_mux alc260_acer_capture_source = { | ||
2513 | .num_items = 3, | ||
2514 | .items = { | ||
2515 | { "Mic", 0x0 }, | ||
2516 | { "Line", 0x2 }, | ||
2517 | { "CD", 0x4 }, | ||
2518 | }, | ||
2519 | }; | ||
2520 | |||
2507 | /* | 2521 | /* |
2508 | * This is just place-holder, so there's something for alc_build_pcms to look | 2522 | * This is just place-holder, so there's something for alc_build_pcms to look |
2509 | * at when it calculates the maximum number of channels. ALC260 has no mixer | 2523 | * at when it calculates the maximum number of channels. ALC260 has no mixer |
@@ -2521,6 +2535,7 @@ static struct hda_channel_mode alc260_modes[1] = { | |||
2521 | * HP: base_output + input + capture_alt | 2535 | * HP: base_output + input + capture_alt |
2522 | * HP_3013: hp_3013 + input + capture | 2536 | * HP_3013: hp_3013 + input + capture |
2523 | * fujitsu: fujitsu + capture | 2537 | * fujitsu: fujitsu + capture |
2538 | * acer: acer + capture | ||
2524 | */ | 2539 | */ |
2525 | 2540 | ||
2526 | static struct snd_kcontrol_new alc260_base_output_mixer[] = { | 2541 | static struct snd_kcontrol_new alc260_base_output_mixer[] = { |
@@ -2579,6 +2594,22 @@ static struct snd_kcontrol_new alc260_fujitsu_mixer[] = { | |||
2579 | { } /* end */ | 2594 | { } /* end */ |
2580 | }; | 2595 | }; |
2581 | 2596 | ||
2597 | static struct snd_kcontrol_new alc260_acer_mixer[] = { | ||
2598 | HDA_CODEC_VOLUME("Master Playback Volume", 0x08, 0x0, HDA_OUTPUT), | ||
2599 | HDA_BIND_MUTE("Master Playback Switch", 0x08, 2, HDA_INPUT), | ||
2600 | HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT), | ||
2601 | HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT), | ||
2602 | HDA_CODEC_VOLUME("Mic Playback Volume", 0x07, 0x0, HDA_INPUT), | ||
2603 | HDA_CODEC_MUTE("Mic Playback Switch", 0x07, 0x0, HDA_INPUT), | ||
2604 | ALC_PIN_MODE("Mic Jack Mode", 0x12, ALC_PIN_DIR_IN), | ||
2605 | HDA_CODEC_VOLUME("Line Playback Volume", 0x07, 0x02, HDA_INPUT), | ||
2606 | HDA_CODEC_MUTE("Line Playback Switch", 0x07, 0x02, HDA_INPUT), | ||
2607 | ALC_PIN_MODE("Line Jack Mode", 0x14, ALC_PIN_DIR_INOUT), | ||
2608 | HDA_CODEC_VOLUME("Beep Playback Volume", 0x07, 0x05, HDA_INPUT), | ||
2609 | HDA_CODEC_MUTE("Beep Playback Switch", 0x07, 0x05, HDA_INPUT), | ||
2610 | { } /* end */ | ||
2611 | }; | ||
2612 | |||
2582 | /* capture mixer elements */ | 2613 | /* capture mixer elements */ |
2583 | static struct snd_kcontrol_new alc260_capture_mixer[] = { | 2614 | static struct snd_kcontrol_new alc260_capture_mixer[] = { |
2584 | HDA_CODEC_VOLUME("Capture Volume", 0x04, 0x0, HDA_INPUT), | 2615 | HDA_CODEC_VOLUME("Capture Volume", 0x04, 0x0, HDA_INPUT), |
@@ -2860,6 +2891,90 @@ static struct hda_verb alc260_fujitsu_init_verbs[] = { | |||
2860 | { } | 2891 | { } |
2861 | }; | 2892 | }; |
2862 | 2893 | ||
2894 | /* Initialisation sequence for ALC260 as configured in Acer TravelMate and | ||
2895 | * similar laptops (adapted from Fujitsu init verbs). | ||
2896 | */ | ||
2897 | static struct hda_verb alc260_acer_init_verbs[] = { | ||
2898 | /* On TravelMate laptops, GPIO 0 enables the internal speaker and | ||
2899 | * the headphone jack. Turn this on and rely on the standard mute | ||
2900 | * methods whenever the user wants to turn these outputs off. | ||
2901 | */ | ||
2902 | {0x01, AC_VERB_SET_GPIO_MASK, 0x01}, | ||
2903 | {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01}, | ||
2904 | {0x01, AC_VERB_SET_GPIO_DATA, 0x01}, | ||
2905 | /* Internal speaker/Headphone jack is connected to Line-out pin */ | ||
2906 | {0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, | ||
2907 | /* Internal microphone/Mic jack is connected to Mic1 pin */ | ||
2908 | {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50}, | ||
2909 | /* Line In jack is connected to Line1 pin */ | ||
2910 | {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, | ||
2911 | /* Ensure all other unused pins are disabled and muted. */ | ||
2912 | {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0}, | ||
2913 | {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, | ||
2914 | {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0}, | ||
2915 | {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, | ||
2916 | {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, 0}, | ||
2917 | {0x13, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, | ||
2918 | {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0}, | ||
2919 | {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, | ||
2920 | /* Disable digital (SPDIF) pins */ | ||
2921 | {0x03, AC_VERB_SET_DIGI_CONVERT_1, 0}, | ||
2922 | {0x06, AC_VERB_SET_DIGI_CONVERT_1, 0}, | ||
2923 | |||
2924 | /* Ensure Mic1 and Line1 pin widgets take input from the OUT1 sum | ||
2925 | * bus when acting as outputs. | ||
2926 | */ | ||
2927 | {0x0b, AC_VERB_SET_CONNECT_SEL, 0}, | ||
2928 | {0x0d, AC_VERB_SET_CONNECT_SEL, 0}, | ||
2929 | |||
2930 | /* Start with output sum widgets muted and their output gains at min */ | ||
2931 | {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, | ||
2932 | {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, | ||
2933 | {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, | ||
2934 | {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, | ||
2935 | {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, | ||
2936 | {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, | ||
2937 | {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, | ||
2938 | {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, | ||
2939 | {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, | ||
2940 | |||
2941 | /* Unmute Line-out pin widget amp left and right (no equiv mixer ctrl) */ | ||
2942 | {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | ||
2943 | /* Unmute Mic1 and Line1 pin widget input buffers since they start as | ||
2944 | * inputs. If the pin mode is changed by the user the pin mode control | ||
2945 | * will take care of enabling the pin's input/output buffers as needed. | ||
2946 | * Therefore there's no need to enable the input buffer at this | ||
2947 | * stage. | ||
2948 | */ | ||
2949 | {0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, | ||
2950 | {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, | ||
2951 | |||
2952 | /* Mute capture amp left and right */ | ||
2953 | {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, | ||
2954 | /* Set ADC connection select to match default mixer setting - mic | ||
2955 | * (on mic1 pin) | ||
2956 | */ | ||
2957 | {0x04, AC_VERB_SET_CONNECT_SEL, 0x00}, | ||
2958 | |||
2959 | /* Do similar with the second ADC: mute capture input amp and | ||
2960 | * set ADC connection to line (on line1 pin) | ||
2961 | */ | ||
2962 | {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, | ||
2963 | {0x05, AC_VERB_SET_CONNECT_SEL, 0x02}, | ||
2964 | |||
2965 | /* Mute all inputs to mixer widget (even unconnected ones) */ | ||
2966 | {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, /* mic1 pin */ | ||
2967 | {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, /* mic2 pin */ | ||
2968 | {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, /* line1 pin */ | ||
2969 | {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, /* line2 pin */ | ||
2970 | {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, /* CD pin */ | ||
2971 | {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)}, /* Beep-gen pin */ | ||
2972 | {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)}, /* Line-out pin */ | ||
2973 | {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)}, /* HP-pin pin */ | ||
2974 | |||
2975 | { } | ||
2976 | }; | ||
2977 | |||
2863 | /* Test configuration for debugging, modelled after the ALC880 test | 2978 | /* Test configuration for debugging, modelled after the ALC880 test |
2864 | * configuration. | 2979 | * configuration. |
2865 | */ | 2980 | */ |
@@ -3296,6 +3411,8 @@ static struct hda_board_config alc260_cfg_tbl[] = { | |||
3296 | { .pci_subvendor = 0x103c, .pci_subdevice = 0x3016, .config = ALC260_HP }, | 3411 | { .pci_subvendor = 0x103c, .pci_subdevice = 0x3016, .config = ALC260_HP }, |
3297 | { .modelname = "fujitsu", .config = ALC260_FUJITSU_S702X }, | 3412 | { .modelname = "fujitsu", .config = ALC260_FUJITSU_S702X }, |
3298 | { .pci_subvendor = 0x10cf, .pci_subdevice = 0x1326, .config = ALC260_FUJITSU_S702X }, | 3413 | { .pci_subvendor = 0x10cf, .pci_subdevice = 0x1326, .config = ALC260_FUJITSU_S702X }, |
3414 | { .modelname = "acer", .config = ALC260_ACER }, | ||
3415 | { .pci_subvendor = 0x1025, .pci_subdevice = 0x008f, .config = ALC260_ACER }, | ||
3299 | #ifdef CONFIG_SND_DEBUG | 3416 | #ifdef CONFIG_SND_DEBUG |
3300 | { .modelname = "test", .config = ALC260_TEST }, | 3417 | { .modelname = "test", .config = ALC260_TEST }, |
3301 | #endif | 3418 | #endif |
@@ -3356,6 +3473,18 @@ static struct alc_config_preset alc260_presets[] = { | |||
3356 | .channel_mode = alc260_modes, | 3473 | .channel_mode = alc260_modes, |
3357 | .input_mux = &alc260_fujitsu_capture_source, | 3474 | .input_mux = &alc260_fujitsu_capture_source, |
3358 | }, | 3475 | }, |
3476 | [ALC260_ACER] = { | ||
3477 | .mixers = { alc260_acer_mixer, | ||
3478 | alc260_capture_mixer }, | ||
3479 | .init_verbs = { alc260_acer_init_verbs }, | ||
3480 | .num_dacs = ARRAY_SIZE(alc260_dac_nids), | ||
3481 | .dac_nids = alc260_dac_nids, | ||
3482 | .num_adc_nids = ARRAY_SIZE(alc260_dual_adc_nids), | ||
3483 | .adc_nids = alc260_dual_adc_nids, | ||
3484 | .num_channel_mode = ARRAY_SIZE(alc260_modes), | ||
3485 | .channel_mode = alc260_modes, | ||
3486 | .input_mux = &alc260_acer_capture_source, | ||
3487 | }, | ||
3359 | #ifdef CONFIG_SND_DEBUG | 3488 | #ifdef CONFIG_SND_DEBUG |
3360 | [ALC260_TEST] = { | 3489 | [ALC260_TEST] = { |
3361 | .mixers = { alc260_test_mixer, | 3490 | .mixers = { alc260_test_mixer, |