diff options
| -rw-r--r-- | sound/pci/hda/patch_realtek.c | 205 |
1 files changed, 149 insertions, 56 deletions
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index 6b45635b3ea3..66bbdb60f50b 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c | |||
| @@ -132,6 +132,7 @@ struct alc_spec { | |||
| 132 | hda_nid_t dig_in_nid; /* digital-in NID; optional */ | 132 | hda_nid_t dig_in_nid; /* digital-in NID; optional */ |
| 133 | 133 | ||
| 134 | /* capture source */ | 134 | /* capture source */ |
| 135 | unsigned int num_mux_defs; | ||
| 135 | const struct hda_input_mux *input_mux; | 136 | const struct hda_input_mux *input_mux; |
| 136 | unsigned int cur_mux[3]; | 137 | unsigned int cur_mux[3]; |
| 137 | 138 | ||
| @@ -173,6 +174,7 @@ struct alc_config_preset { | |||
| 173 | hda_nid_t dig_in_nid; | 174 | hda_nid_t dig_in_nid; |
| 174 | unsigned int num_channel_mode; | 175 | unsigned int num_channel_mode; |
| 175 | const struct hda_channel_mode *channel_mode; | 176 | const struct hda_channel_mode *channel_mode; |
| 177 | unsigned int num_mux_defs; | ||
| 176 | const struct hda_input_mux *input_mux; | 178 | const struct hda_input_mux *input_mux; |
| 177 | void (*unsol_event)(struct hda_codec *, unsigned int); | 179 | void (*unsol_event)(struct hda_codec *, unsigned int); |
| 178 | void (*init_hook)(struct hda_codec *); | 180 | void (*init_hook)(struct hda_codec *); |
| @@ -186,7 +188,10 @@ static int alc_mux_enum_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_ | |||
| 186 | { | 188 | { |
| 187 | struct hda_codec *codec = snd_kcontrol_chip(kcontrol); | 189 | struct hda_codec *codec = snd_kcontrol_chip(kcontrol); |
| 188 | struct alc_spec *spec = codec->spec; | 190 | struct alc_spec *spec = codec->spec; |
| 189 | return snd_hda_input_mux_info(spec->input_mux, uinfo); | 191 | unsigned int mux_idx = snd_ctl_get_ioffidx(kcontrol, &uinfo->id); |
| 192 | if (mux_idx >= spec->num_mux_defs) | ||
| 193 | mux_idx = 0; | ||
| 194 | return snd_hda_input_mux_info(&spec->input_mux[mux_idx], uinfo); | ||
| 190 | } | 195 | } |
| 191 | 196 | ||
| 192 | static int alc_mux_enum_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) | 197 | static int alc_mux_enum_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) |
| @@ -204,7 +209,8 @@ static int alc_mux_enum_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_v | |||
| 204 | struct hda_codec *codec = snd_kcontrol_chip(kcontrol); | 209 | struct hda_codec *codec = snd_kcontrol_chip(kcontrol); |
| 205 | struct alc_spec *spec = codec->spec; | 210 | struct alc_spec *spec = codec->spec; |
| 206 | unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id); | 211 | unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id); |
| 207 | return snd_hda_input_mux_put(codec, spec->input_mux, ucontrol, | 212 | unsigned int mux_idx = adc_idx >= spec->num_mux_defs ? 0 : adc_idx; |
| 213 | return snd_hda_input_mux_put(codec, &spec->input_mux[mux_idx], ucontrol, | ||
| 208 | spec->adc_nids[adc_idx], &spec->cur_mux[adc_idx]); | 214 | spec->adc_nids[adc_idx], &spec->cur_mux[adc_idx]); |
| 209 | } | 215 | } |
| 210 | 216 | ||
| @@ -246,7 +252,8 @@ static int alc_ch_mode_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_va | |||
| 246 | * states other than HiZ (eg: PIN_VREFxx) and revert to HiZ if any of these | 252 | * states other than HiZ (eg: PIN_VREFxx) and revert to HiZ if any of these |
| 247 | * are requested. Therefore order this list so that this behaviour will not | 253 | * are requested. Therefore order this list so that this behaviour will not |
| 248 | * cause problems when mixer clients move through the enum sequentially. | 254 | * cause problems when mixer clients move through the enum sequentially. |
| 249 | * NIDs 0x0f and 0x10 have been observed to have this behaviour. | 255 | * NIDs 0x0f and 0x10 have been observed to have this behaviour as of |
| 256 | * March 2006. | ||
| 250 | */ | 257 | */ |
| 251 | static char *alc_pin_mode_names[] = { | 258 | static char *alc_pin_mode_names[] = { |
| 252 | "Mic 50pc bias", "Mic 80pc bias", | 259 | "Mic 50pc bias", "Mic 80pc bias", |
| @@ -256,19 +263,27 @@ static unsigned char alc_pin_mode_values[] = { | |||
| 256 | PIN_VREF50, PIN_VREF80, PIN_IN, PIN_OUT, PIN_HP, | 263 | PIN_VREF50, PIN_VREF80, PIN_IN, PIN_OUT, PIN_HP, |
| 257 | }; | 264 | }; |
| 258 | /* The control can present all 5 options, or it can limit the options based | 265 | /* The control can present all 5 options, or it can limit the options based |
| 259 | * in the pin being assumed to be exclusively an input or an output pin. | 266 | * in the pin being assumed to be exclusively an input or an output pin. In |
| 267 | * addition, "input" pins may or may not process the mic bias option | ||
| 268 | * depending on actual widget capability (NIDs 0x0f and 0x10 don't seem to | ||
| 269 | * accept requests for bias as of chip versions up to March 2006) and/or | ||
| 270 | * wiring in the computer. | ||
| 260 | */ | 271 | */ |
| 261 | #define ALC_PIN_DIR_IN 0x00 | 272 | #define ALC_PIN_DIR_IN 0x00 |
| 262 | #define ALC_PIN_DIR_OUT 0x01 | 273 | #define ALC_PIN_DIR_OUT 0x01 |
| 263 | #define ALC_PIN_DIR_INOUT 0x02 | 274 | #define ALC_PIN_DIR_INOUT 0x02 |
| 275 | #define ALC_PIN_DIR_IN_NOMICBIAS 0x03 | ||
| 276 | #define ALC_PIN_DIR_INOUT_NOMICBIAS 0x04 | ||
| 264 | 277 | ||
| 265 | /* Info about the pin modes supported by the three different pin directions. | 278 | /* Info about the pin modes supported by the different pin direction modes. |
| 266 | * For each direction the minimum and maximum values are given. | 279 | * For each direction the minimum and maximum values are given. |
| 267 | */ | 280 | */ |
| 268 | static signed char alc_pin_mode_dir_info[3][2] = { | 281 | static signed char alc_pin_mode_dir_info[5][2] = { |
| 269 | { 0, 2 }, /* ALC_PIN_DIR_IN */ | 282 | { 0, 2 }, /* ALC_PIN_DIR_IN */ |
| 270 | { 3, 4 }, /* ALC_PIN_DIR_OUT */ | 283 | { 3, 4 }, /* ALC_PIN_DIR_OUT */ |
| 271 | { 0, 4 }, /* ALC_PIN_DIR_INOUT */ | 284 | { 0, 4 }, /* ALC_PIN_DIR_INOUT */ |
| 285 | { 2, 2 }, /* ALC_PIN_DIR_IN_NOMICBIAS */ | ||
| 286 | { 2, 4 }, /* ALC_PIN_DIR_INOUT_NOMICBIAS */ | ||
| 272 | }; | 287 | }; |
| 273 | #define alc_pin_mode_min(_dir) (alc_pin_mode_dir_info[_dir][0]) | 288 | #define alc_pin_mode_min(_dir) (alc_pin_mode_dir_info[_dir][0]) |
| 274 | #define alc_pin_mode_max(_dir) (alc_pin_mode_dir_info[_dir][1]) | 289 | #define alc_pin_mode_max(_dir) (alc_pin_mode_dir_info[_dir][1]) |
| @@ -330,9 +345,10 @@ static int alc_pin_mode_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_v | |||
| 330 | * input modes. | 345 | * input modes. |
| 331 | * | 346 | * |
| 332 | * Dynamically switching the input/output buffers probably | 347 | * Dynamically switching the input/output buffers probably |
| 333 | * reduces noise slightly, particularly on input. However, | 348 | * reduces noise slightly (particularly on input) so we'll |
| 334 | * havingboth input and output buffers enabled | 349 | * do it. However, having both input and output buffers |
| 335 | * simultaneously doesn't seem to be problematic. | 350 | * enabled simultaneously doesn't seem to be problematic if |
| 351 | * this turns out to be necessary in the future. | ||
| 336 | */ | 352 | */ |
| 337 | if (val <= 2) { | 353 | if (val <= 2) { |
| 338 | snd_hda_codec_write(codec,nid,0,AC_VERB_SET_AMP_GAIN_MUTE, | 354 | snd_hda_codec_write(codec,nid,0,AC_VERB_SET_AMP_GAIN_MUTE, |
| @@ -484,6 +500,9 @@ static void setup_preset(struct alc_spec *spec, const struct alc_config_preset * | |||
| 484 | spec->multiout.dig_out_nid = preset->dig_out_nid; | 500 | spec->multiout.dig_out_nid = preset->dig_out_nid; |
| 485 | spec->multiout.hp_nid = preset->hp_nid; | 501 | spec->multiout.hp_nid = preset->hp_nid; |
| 486 | 502 | ||
| 503 | spec->num_mux_defs = preset->num_mux_defs; | ||
| 504 | if (! spec->num_mux_defs) | ||
| 505 | spec->num_mux_defs = 1; | ||
| 487 | spec->input_mux = preset->input_mux; | 506 | spec->input_mux = preset->input_mux; |
| 488 | 507 | ||
| 489 | spec->num_adc_nids = preset->num_adc_nids; | 508 | spec->num_adc_nids = preset->num_adc_nids; |
| @@ -2686,6 +2705,7 @@ static int alc880_parse_auto_config(struct hda_codec *codec) | |||
| 2686 | 2705 | ||
| 2687 | spec->init_verbs[spec->num_init_verbs++] = alc880_volume_init_verbs; | 2706 | spec->init_verbs[spec->num_init_verbs++] = alc880_volume_init_verbs; |
| 2688 | 2707 | ||
| 2708 | spec->num_mux_defs = 1; | ||
| 2689 | spec->input_mux = &spec->private_imux; | 2709 | spec->input_mux = &spec->private_imux; |
| 2690 | 2710 | ||
| 2691 | return 1; | 2711 | return 1; |
| @@ -2815,30 +2835,56 @@ static struct hda_input_mux alc260_capture_source = { | |||
| 2815 | }; | 2835 | }; |
| 2816 | 2836 | ||
| 2817 | /* On Fujitsu S702x laptops capture only makes sense from Mic/LineIn jack, | 2837 | /* On Fujitsu S702x laptops capture only makes sense from Mic/LineIn jack, |
| 2818 | * headphone jack and the internal CD lines. | 2838 | * headphone jack and the internal CD lines since these are the only pins at |
| 2839 | * which audio can appear. For flexibility, also allow the option of | ||
| 2840 | * recording the mixer output on the second ADC (ADC0 doesn't have a | ||
| 2841 | * connection to the mixer output). | ||
| 2819 | */ | 2842 | */ |
| 2820 | static struct hda_input_mux alc260_fujitsu_capture_source = { | 2843 | static struct hda_input_mux alc260_fujitsu_capture_sources[2] = { |
| 2821 | .num_items = 3, | 2844 | { |
| 2822 | .items = { | 2845 | .num_items = 3, |
| 2823 | { "Mic/Line", 0x0 }, | 2846 | .items = { |
| 2824 | { "CD", 0x4 }, | 2847 | { "Mic/Line", 0x0 }, |
| 2825 | { "Headphone", 0x2 }, | 2848 | { "CD", 0x4 }, |
| 2849 | { "Headphone", 0x2 }, | ||
| 2850 | }, | ||
| 2826 | }, | 2851 | }, |
| 2852 | { | ||
| 2853 | .num_items = 4, | ||
| 2854 | .items = { | ||
| 2855 | { "Mic/Line", 0x0 }, | ||
| 2856 | { "CD", 0x4 }, | ||
| 2857 | { "Headphone", 0x2 }, | ||
| 2858 | { "Mixer", 0x5 }, | ||
| 2859 | }, | ||
| 2860 | }, | ||
| 2861 | |||
| 2827 | }; | 2862 | }; |
| 2828 | 2863 | ||
| 2829 | /* Acer TravelMate(/Extensa/Aspire) notebooks have similar configutation to | 2864 | /* Acer TravelMate(/Extensa/Aspire) notebooks have similar configuration to |
| 2830 | * the Fujitsu S702x, but jacks are marked differently. We won't allow | 2865 | * the Fujitsu S702x, but jacks are marked differently. |
| 2831 | * retasking the Headphone jack, so it won't be available here. | ||
| 2832 | */ | 2866 | */ |
| 2833 | static struct hda_input_mux alc260_acer_capture_source = { | 2867 | static struct hda_input_mux alc260_acer_capture_sources[2] = { |
| 2834 | .num_items = 3, | 2868 | { |
| 2835 | .items = { | 2869 | .num_items = 4, |
| 2836 | { "Mic", 0x0 }, | 2870 | .items = { |
| 2837 | { "Line", 0x2 }, | 2871 | { "Mic", 0x0 }, |
| 2838 | { "CD", 0x4 }, | 2872 | { "Line", 0x2 }, |
| 2873 | { "CD", 0x4 }, | ||
| 2874 | { "Headphone", 0x5 }, | ||
| 2875 | }, | ||
| 2876 | }, | ||
| 2877 | { | ||
| 2878 | .num_items = 5, | ||
| 2879 | .items = { | ||
| 2880 | { "Mic", 0x0 }, | ||
| 2881 | { "Line", 0x2 }, | ||
| 2882 | { "CD", 0x4 }, | ||
| 2883 | { "Headphone", 0x6 }, | ||
| 2884 | { "Mixer", 0x5 }, | ||
| 2885 | }, | ||
| 2839 | }, | 2886 | }, |
| 2840 | }; | 2887 | }; |
| 2841 | |||
| 2842 | /* | 2888 | /* |
| 2843 | * This is just place-holder, so there's something for alc_build_pcms to look | 2889 | * This is just place-holder, so there's something for alc_build_pcms to look |
| 2844 | * at when it calculates the maximum number of channels. ALC260 has no mixer | 2890 | * at when it calculates the maximum number of channels. ALC260 has no mixer |
| @@ -2899,6 +2945,9 @@ static struct snd_kcontrol_new alc260_hp_3013_mixer[] = { | |||
| 2899 | { } /* end */ | 2945 | { } /* end */ |
| 2900 | }; | 2946 | }; |
| 2901 | 2947 | ||
| 2948 | /* Fujitsu S702x series laptops. ALC260 pin usage: Mic/Line jack = 0x12, | ||
| 2949 | * HP jack = 0x14, CD audio = 0x16, internal speaker = 0x10. | ||
| 2950 | */ | ||
| 2902 | static struct snd_kcontrol_new alc260_fujitsu_mixer[] = { | 2951 | static struct snd_kcontrol_new alc260_fujitsu_mixer[] = { |
| 2903 | HDA_CODEC_VOLUME("Headphone Playback Volume", 0x08, 0x0, HDA_OUTPUT), | 2952 | HDA_CODEC_VOLUME("Headphone Playback Volume", 0x08, 0x0, HDA_OUTPUT), |
| 2904 | HDA_BIND_MUTE("Headphone Playback Switch", 0x08, 2, HDA_INPUT), | 2953 | HDA_BIND_MUTE("Headphone Playback Switch", 0x08, 2, HDA_INPUT), |
| @@ -2915,9 +2964,28 @@ static struct snd_kcontrol_new alc260_fujitsu_mixer[] = { | |||
| 2915 | { } /* end */ | 2964 | { } /* end */ |
| 2916 | }; | 2965 | }; |
| 2917 | 2966 | ||
| 2967 | /* Mixer for Acer TravelMate(/Extensa/Aspire) notebooks. Note that current | ||
| 2968 | * versions of the ALC260 don't act on requests to enable mic bias from NID | ||
| 2969 | * 0x0f (used to drive the headphone jack in these laptops). The ALC260 | ||
| 2970 | * datasheet doesn't mention this restriction. At this stage it's not clear | ||
| 2971 | * whether this behaviour is intentional or is a hardware bug in chip | ||
| 2972 | * revisions available in early 2006. Therefore for now allow the | ||
| 2973 | * "Headphone Jack Mode" control to span all choices, but if it turns out | ||
| 2974 | * that the lack of mic bias for this NID is intentional we could change the | ||
| 2975 | * mode from ALC_PIN_DIR_INOUT to ALC_PIN_DIR_INOUT_NOMICBIAS. | ||
| 2976 | * | ||
| 2977 | * In addition, Acer TravelMate(/Extensa/Aspire) notebooks in early 2006 | ||
| 2978 | * don't appear to make the mic bias available from the "line" jack, even | ||
| 2979 | * though the NID used for this jack (0x14) can supply it. The theory is | ||
| 2980 | * that perhaps Acer have included blocking capacitors between the ALC260 | ||
| 2981 | * and the output jack. If this turns out to be the case for all such | ||
| 2982 | * models the "Line Jack Mode" mode could be changed from ALC_PIN_DIR_INOUT | ||
| 2983 | * to ALC_PIN_DIR_INOUT_NOMICBIAS. | ||
| 2984 | */ | ||
| 2918 | static struct snd_kcontrol_new alc260_acer_mixer[] = { | 2985 | static struct snd_kcontrol_new alc260_acer_mixer[] = { |
| 2919 | HDA_CODEC_VOLUME("Master Playback Volume", 0x08, 0x0, HDA_OUTPUT), | 2986 | HDA_CODEC_VOLUME("Master Playback Volume", 0x08, 0x0, HDA_OUTPUT), |
| 2920 | HDA_BIND_MUTE("Master Playback Switch", 0x08, 2, HDA_INPUT), | 2987 | HDA_BIND_MUTE("Master Playback Switch", 0x08, 2, HDA_INPUT), |
| 2988 | ALC_PIN_MODE("Headphone Jack Mode", 0x0f, ALC_PIN_DIR_INOUT), | ||
| 2921 | HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT), | 2989 | HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT), |
| 2922 | HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT), | 2990 | HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT), |
| 2923 | HDA_CODEC_VOLUME("Mic Playback Volume", 0x07, 0x0, HDA_INPUT), | 2991 | HDA_CODEC_VOLUME("Mic Playback Volume", 0x07, 0x0, HDA_INPUT), |
| @@ -3131,7 +3199,8 @@ static struct hda_verb alc260_hp_3013_init_verbs[] = { | |||
| 3131 | }; | 3199 | }; |
| 3132 | 3200 | ||
| 3133 | /* Initialisation sequence for ALC260 as configured in Fujitsu S702x | 3201 | /* Initialisation sequence for ALC260 as configured in Fujitsu S702x |
| 3134 | * laptops. | 3202 | * laptops. ALC260 pin usage: Mic/Line jack = 0x12, HP jack = 0x14, CD |
| 3203 | * audio = 0x16, internal speaker = 0x10. | ||
| 3135 | */ | 3204 | */ |
| 3136 | static struct hda_verb alc260_fujitsu_init_verbs[] = { | 3205 | static struct hda_verb alc260_fujitsu_init_verbs[] = { |
| 3137 | /* Disable all GPIOs */ | 3206 | /* Disable all GPIOs */ |
| @@ -3278,10 +3347,10 @@ static struct hda_verb alc260_acer_init_verbs[] = { | |||
| 3278 | {0x04, AC_VERB_SET_CONNECT_SEL, 0x00}, | 3347 | {0x04, AC_VERB_SET_CONNECT_SEL, 0x00}, |
| 3279 | 3348 | ||
| 3280 | /* Do similar with the second ADC: mute capture input amp and | 3349 | /* Do similar with the second ADC: mute capture input amp and |
| 3281 | * set ADC connection to line (on line1 pin) | 3350 | * set ADC connection to mic to match ALSA's default state. |
| 3282 | */ | 3351 | */ |
| 3283 | {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, | 3352 | {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, |
| 3284 | {0x05, AC_VERB_SET_CONNECT_SEL, 0x02}, | 3353 | {0x05, AC_VERB_SET_CONNECT_SEL, 0x00}, |
| 3285 | 3354 | ||
| 3286 | /* Mute all inputs to mixer widget (even unconnected ones) */ | 3355 | /* Mute all inputs to mixer widget (even unconnected ones) */ |
| 3287 | {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, /* mic1 pin */ | 3356 | {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, /* mic1 pin */ |
| @@ -3306,26 +3375,35 @@ static hda_nid_t alc260_test_dac_nids[1] = { | |||
| 3306 | static hda_nid_t alc260_test_adc_nids[2] = { | 3375 | static hda_nid_t alc260_test_adc_nids[2] = { |
| 3307 | 0x04, 0x05, | 3376 | 0x04, 0x05, |
| 3308 | }; | 3377 | }; |
| 3309 | /* This is a bit messy since the two input muxes in the ALC260 have slight | 3378 | /* For testing the ALC260, each input MUX needs its own definition since |
| 3310 | * variations in their signal assignments. The ideal way to deal with this | 3379 | * the signal assignments are different. This assumes that the first ADC |
| 3311 | * is to extend alc_spec.input_mux to allow a different input MUX for each | 3380 | * is NID 0x04. |
| 3312 | * ADC. For the purposes of the test model it's sufficient to just list | ||
| 3313 | * both options for affected signal indices. The separate input mux | ||
| 3314 | * functionality only needs to be considered if a model comes along which | ||
| 3315 | * actually uses signals 0x5, 0x6 and 0x7 for something which makes sense to | ||
| 3316 | * record. | ||
| 3317 | */ | 3381 | */ |
| 3318 | static struct hda_input_mux alc260_test_capture_source = { | 3382 | static struct hda_input_mux alc260_test_capture_sources[2] = { |
| 3319 | .num_items = 8, | 3383 | { |
| 3320 | .items = { | 3384 | .num_items = 7, |
| 3321 | { "MIC1 pin", 0x0 }, | 3385 | .items = { |
| 3322 | { "MIC2 pin", 0x1 }, | 3386 | { "MIC1 pin", 0x0 }, |
| 3323 | { "LINE1 pin", 0x2 }, | 3387 | { "MIC2 pin", 0x1 }, |
| 3324 | { "LINE2 pin", 0x3 }, | 3388 | { "LINE1 pin", 0x2 }, |
| 3325 | { "CD pin", 0x4 }, | 3389 | { "LINE2 pin", 0x3 }, |
| 3326 | { "LINE-OUT pin (cap1), Mixer (cap2)", 0x5 }, | 3390 | { "CD pin", 0x4 }, |
| 3327 | { "HP-OUT pin (cap1), LINE-OUT pin (cap2)", 0x6 }, | 3391 | { "LINE-OUT pin", 0x5 }, |
| 3328 | { "HP-OUT pin (cap2 only)", 0x7 }, | 3392 | { "HP-OUT pin", 0x6 }, |
| 3393 | }, | ||
| 3394 | }, | ||
| 3395 | { | ||
| 3396 | .num_items = 8, | ||
| 3397 | .items = { | ||
| 3398 | { "MIC1 pin", 0x0 }, | ||
| 3399 | { "MIC2 pin", 0x1 }, | ||
| 3400 | { "LINE1 pin", 0x2 }, | ||
| 3401 | { "LINE2 pin", 0x3 }, | ||
| 3402 | { "CD pin", 0x4 }, | ||
| 3403 | { "Mixer", 0x5 }, | ||
| 3404 | { "LINE-OUT pin", 0x6 }, | ||
| 3405 | { "HP-OUT pin", 0x7 }, | ||
| 3406 | }, | ||
| 3329 | }, | 3407 | }, |
| 3330 | }; | 3408 | }; |
| 3331 | static struct snd_kcontrol_new alc260_test_mixer[] = { | 3409 | static struct snd_kcontrol_new alc260_test_mixer[] = { |
| @@ -3337,7 +3415,17 @@ static struct snd_kcontrol_new alc260_test_mixer[] = { | |||
| 3337 | HDA_CODEC_VOLUME("LOUT1 Playback Volume", 0x08, 0x0, HDA_OUTPUT), | 3415 | HDA_CODEC_VOLUME("LOUT1 Playback Volume", 0x08, 0x0, HDA_OUTPUT), |
| 3338 | HDA_BIND_MUTE("LOUT1 Playback Switch", 0x08, 2, HDA_INPUT), | 3416 | HDA_BIND_MUTE("LOUT1 Playback Switch", 0x08, 2, HDA_INPUT), |
| 3339 | 3417 | ||
| 3340 | /* Modes for retasking pin widgets */ | 3418 | /* Modes for retasking pin widgets |
| 3419 | * Note: the ALC260 doesn't seem to act on requests to enable mic | ||
| 3420 | * bias from NIDs 0x0f and 0x10. The ALC260 datasheet doesn't | ||
| 3421 | * mention this restriction. At this stage it's not clear whether | ||
| 3422 | * this behaviour is intentional or is a hardware bug in chip | ||
| 3423 | * revisions available at least up until early 2006. Therefore for | ||
| 3424 | * now allow the "HP-OUT" and "LINE-OUT" Mode controls to span all | ||
| 3425 | * choices, but if it turns out that the lack of mic bias for these | ||
| 3426 | * NIDs is intentional we could change their modes from | ||
| 3427 | * ALC_PIN_DIR_INOUT to ALC_PIN_DIR_INOUT_NOMICBIAS. | ||
| 3428 | */ | ||
| 3341 | ALC_PIN_MODE("HP-OUT pin mode", 0x10, ALC_PIN_DIR_INOUT), | 3429 | ALC_PIN_MODE("HP-OUT pin mode", 0x10, ALC_PIN_DIR_INOUT), |
| 3342 | ALC_PIN_MODE("LINE-OUT pin mode", 0x0f, ALC_PIN_DIR_INOUT), | 3430 | ALC_PIN_MODE("LINE-OUT pin mode", 0x0f, ALC_PIN_DIR_INOUT), |
| 3343 | ALC_PIN_MODE("LINE2 pin mode", 0x15, ALC_PIN_DIR_INOUT), | 3431 | ALC_PIN_MODE("LINE2 pin mode", 0x15, ALC_PIN_DIR_INOUT), |
| @@ -3699,6 +3787,7 @@ static int alc260_parse_auto_config(struct hda_codec *codec) | |||
| 3699 | 3787 | ||
| 3700 | spec->init_verbs[spec->num_init_verbs++] = alc260_volume_init_verbs; | 3788 | spec->init_verbs[spec->num_init_verbs++] = alc260_volume_init_verbs; |
| 3701 | 3789 | ||
| 3790 | spec->num_mux_defs = 1; | ||
| 3702 | spec->input_mux = &spec->private_imux; | 3791 | spec->input_mux = &spec->private_imux; |
| 3703 | 3792 | ||
| 3704 | /* check whether NID 0x04 is valid */ | 3793 | /* check whether NID 0x04 is valid */ |
| @@ -3804,7 +3893,8 @@ static struct alc_config_preset alc260_presets[] = { | |||
| 3804 | .adc_nids = alc260_dual_adc_nids, | 3893 | .adc_nids = alc260_dual_adc_nids, |
| 3805 | .num_channel_mode = ARRAY_SIZE(alc260_modes), | 3894 | .num_channel_mode = ARRAY_SIZE(alc260_modes), |
| 3806 | .channel_mode = alc260_modes, | 3895 | .channel_mode = alc260_modes, |
| 3807 | .input_mux = &alc260_fujitsu_capture_source, | 3896 | .num_mux_defs = ARRAY_SIZE(alc260_fujitsu_capture_sources), |
| 3897 | .input_mux = alc260_fujitsu_capture_sources, | ||
| 3808 | }, | 3898 | }, |
| 3809 | [ALC260_ACER] = { | 3899 | [ALC260_ACER] = { |
| 3810 | .mixers = { alc260_acer_mixer, | 3900 | .mixers = { alc260_acer_mixer, |
| @@ -3816,7 +3906,8 @@ static struct alc_config_preset alc260_presets[] = { | |||
| 3816 | .adc_nids = alc260_dual_adc_nids, | 3906 | .adc_nids = alc260_dual_adc_nids, |
| 3817 | .num_channel_mode = ARRAY_SIZE(alc260_modes), | 3907 | .num_channel_mode = ARRAY_SIZE(alc260_modes), |
| 3818 | .channel_mode = alc260_modes, | 3908 | .channel_mode = alc260_modes, |
| 3819 | .input_mux = &alc260_acer_capture_source, | 3909 | .num_mux_defs = ARRAY_SIZE(alc260_acer_capture_sources), |
| 3910 | .input_mux = alc260_acer_capture_sources, | ||
| 3820 | }, | 3911 | }, |
| 3821 | #ifdef CONFIG_SND_DEBUG | 3912 | #ifdef CONFIG_SND_DEBUG |
| 3822 | [ALC260_TEST] = { | 3913 | [ALC260_TEST] = { |
| @@ -3829,7 +3920,8 @@ static struct alc_config_preset alc260_presets[] = { | |||
| 3829 | .adc_nids = alc260_test_adc_nids, | 3920 | .adc_nids = alc260_test_adc_nids, |
| 3830 | .num_channel_mode = ARRAY_SIZE(alc260_modes), | 3921 | .num_channel_mode = ARRAY_SIZE(alc260_modes), |
| 3831 | .channel_mode = alc260_modes, | 3922 | .channel_mode = alc260_modes, |
| 3832 | .input_mux = &alc260_test_capture_source, | 3923 | .num_mux_defs = ARRAY_SIZE(alc260_test_capture_sources), |
| 3924 | .input_mux = alc260_test_capture_sources, | ||
| 3833 | }, | 3925 | }, |
| 3834 | #endif | 3926 | #endif |
| 3835 | }; | 3927 | }; |
| @@ -3921,7 +4013,6 @@ static struct hda_input_mux alc882_capture_source = { | |||
| 3921 | { "CD", 0x4 }, | 4013 | { "CD", 0x4 }, |
| 3922 | }, | 4014 | }, |
| 3923 | }; | 4015 | }; |
| 3924 | |||
| 3925 | #define alc882_mux_enum_info alc_mux_enum_info | 4016 | #define alc882_mux_enum_info alc_mux_enum_info |
| 3926 | #define alc882_mux_enum_get alc_mux_enum_get | 4017 | #define alc882_mux_enum_get alc_mux_enum_get |
| 3927 | 4018 | ||
| @@ -4823,6 +4914,7 @@ static int alc262_parse_auto_config(struct hda_codec *codec) | |||
| 4823 | spec->mixers[spec->num_mixers++] = spec->kctl_alloc; | 4914 | spec->mixers[spec->num_mixers++] = spec->kctl_alloc; |
| 4824 | 4915 | ||
| 4825 | spec->init_verbs[spec->num_init_verbs++] = alc262_volume_init_verbs; | 4916 | spec->init_verbs[spec->num_init_verbs++] = alc262_volume_init_verbs; |
| 4917 | spec->num_mux_defs = 1; | ||
| 4826 | spec->input_mux = &spec->private_imux; | 4918 | spec->input_mux = &spec->private_imux; |
| 4827 | 4919 | ||
| 4828 | return 1; | 4920 | return 1; |
| @@ -5499,6 +5591,7 @@ static int alc861_parse_auto_config(struct hda_codec *codec) | |||
| 5499 | 5591 | ||
| 5500 | spec->init_verbs[spec->num_init_verbs++] = alc861_auto_init_verbs; | 5592 | spec->init_verbs[spec->num_init_verbs++] = alc861_auto_init_verbs; |
| 5501 | 5593 | ||
| 5594 | spec->num_mux_defs = 1; | ||
| 5502 | spec->input_mux = &spec->private_imux; | 5595 | spec->input_mux = &spec->private_imux; |
| 5503 | 5596 | ||
| 5504 | spec->adc_nids = alc861_adc_nids; | 5597 | spec->adc_nids = alc861_adc_nids; |
