diff options
Diffstat (limited to 'sound/pci/hda/patch_realtek.c')
-rw-r--r-- | sound/pci/hda/patch_realtek.c | 2328 |
1 files changed, 1309 insertions, 1019 deletions
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index 0fd258eba3a5..337d2a59c67e 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c | |||
@@ -190,6 +190,7 @@ enum { | |||
190 | ALC663_ASUS_MODE6, | 190 | ALC663_ASUS_MODE6, |
191 | ALC272_DELL, | 191 | ALC272_DELL, |
192 | ALC272_DELL_ZM1, | 192 | ALC272_DELL_ZM1, |
193 | ALC272_SAMSUNG_NC10, | ||
193 | ALC662_AUTO, | 194 | ALC662_AUTO, |
194 | ALC662_MODEL_LAST, | 195 | ALC662_MODEL_LAST, |
195 | }; | 196 | }; |
@@ -205,6 +206,7 @@ enum { | |||
205 | ALC882_ASUS_A7M, | 206 | ALC882_ASUS_A7M, |
206 | ALC885_MACPRO, | 207 | ALC885_MACPRO, |
207 | ALC885_MBP3, | 208 | ALC885_MBP3, |
209 | ALC885_MB5, | ||
208 | ALC885_IMAC24, | 210 | ALC885_IMAC24, |
209 | ALC882_AUTO, | 211 | ALC882_AUTO, |
210 | ALC882_MODEL_LAST, | 212 | ALC882_MODEL_LAST, |
@@ -218,9 +220,11 @@ enum { | |||
218 | ALC883_6ST_DIG, | 220 | ALC883_6ST_DIG, |
219 | ALC883_TARGA_DIG, | 221 | ALC883_TARGA_DIG, |
220 | ALC883_TARGA_2ch_DIG, | 222 | ALC883_TARGA_2ch_DIG, |
223 | ALC883_TARGA_8ch_DIG, | ||
221 | ALC883_ACER, | 224 | ALC883_ACER, |
222 | ALC883_ACER_ASPIRE, | 225 | ALC883_ACER_ASPIRE, |
223 | ALC888_ACER_ASPIRE_4930G, | 226 | ALC888_ACER_ASPIRE_4930G, |
227 | ALC888_ACER_ASPIRE_8930G, | ||
224 | ALC883_MEDION, | 228 | ALC883_MEDION, |
225 | ALC883_MEDION_MD2, | 229 | ALC883_MEDION_MD2, |
226 | ALC883_LAPTOP_EAPD, | 230 | ALC883_LAPTOP_EAPD, |
@@ -238,7 +242,9 @@ enum { | |||
238 | ALC883_3ST_6ch_INTEL, | 242 | ALC883_3ST_6ch_INTEL, |
239 | ALC888_ASUS_M90V, | 243 | ALC888_ASUS_M90V, |
240 | ALC888_ASUS_EEE1601, | 244 | ALC888_ASUS_EEE1601, |
245 | ALC889A_MB31, | ||
241 | ALC1200_ASUS_P5Q, | 246 | ALC1200_ASUS_P5Q, |
247 | ALC883_SONY_VAIO_TT, | ||
242 | ALC883_AUTO, | 248 | ALC883_AUTO, |
243 | ALC883_MODEL_LAST, | 249 | ALC883_MODEL_LAST, |
244 | }; | 250 | }; |
@@ -253,6 +259,15 @@ enum { | |||
253 | /* for GPIO Poll */ | 259 | /* for GPIO Poll */ |
254 | #define GPIO_MASK 0x03 | 260 | #define GPIO_MASK 0x03 |
255 | 261 | ||
262 | /* extra amp-initialization sequence types */ | ||
263 | enum { | ||
264 | ALC_INIT_NONE, | ||
265 | ALC_INIT_DEFAULT, | ||
266 | ALC_INIT_GPIO1, | ||
267 | ALC_INIT_GPIO2, | ||
268 | ALC_INIT_GPIO3, | ||
269 | }; | ||
270 | |||
256 | struct alc_spec { | 271 | struct alc_spec { |
257 | /* codec parameterization */ | 272 | /* codec parameterization */ |
258 | struct snd_kcontrol_new *mixers[5]; /* mixer arrays */ | 273 | struct snd_kcontrol_new *mixers[5]; /* mixer arrays */ |
@@ -266,13 +281,13 @@ struct alc_spec { | |||
266 | */ | 281 | */ |
267 | unsigned int num_init_verbs; | 282 | unsigned int num_init_verbs; |
268 | 283 | ||
269 | char *stream_name_analog; /* analog PCM stream */ | 284 | char stream_name_analog[16]; /* analog PCM stream */ |
270 | struct hda_pcm_stream *stream_analog_playback; | 285 | struct hda_pcm_stream *stream_analog_playback; |
271 | struct hda_pcm_stream *stream_analog_capture; | 286 | struct hda_pcm_stream *stream_analog_capture; |
272 | struct hda_pcm_stream *stream_analog_alt_playback; | 287 | struct hda_pcm_stream *stream_analog_alt_playback; |
273 | struct hda_pcm_stream *stream_analog_alt_capture; | 288 | struct hda_pcm_stream *stream_analog_alt_capture; |
274 | 289 | ||
275 | char *stream_name_digital; /* digital PCM stream */ | 290 | char stream_name_digital[16]; /* digital PCM stream */ |
276 | struct hda_pcm_stream *stream_digital_playback; | 291 | struct hda_pcm_stream *stream_digital_playback; |
277 | struct hda_pcm_stream *stream_digital_capture; | 292 | struct hda_pcm_stream *stream_digital_capture; |
278 | 293 | ||
@@ -301,6 +316,8 @@ struct alc_spec { | |||
301 | const struct hda_channel_mode *channel_mode; | 316 | const struct hda_channel_mode *channel_mode; |
302 | int num_channel_mode; | 317 | int num_channel_mode; |
303 | int need_dac_fix; | 318 | int need_dac_fix; |
319 | int const_channel_count; | ||
320 | int ext_channel_count; | ||
304 | 321 | ||
305 | /* PCM information */ | 322 | /* PCM information */ |
306 | struct hda_pcm pcm_rec[3]; /* used in alc_build_pcms() */ | 323 | struct hda_pcm pcm_rec[3]; /* used in alc_build_pcms() */ |
@@ -322,6 +339,7 @@ struct alc_spec { | |||
322 | 339 | ||
323 | /* other flags */ | 340 | /* other flags */ |
324 | unsigned int no_analog :1; /* digital I/O only */ | 341 | unsigned int no_analog :1; /* digital I/O only */ |
342 | int init_amp; | ||
325 | 343 | ||
326 | /* for virtual master */ | 344 | /* for virtual master */ |
327 | hda_nid_t vmaster_nid; | 345 | hda_nid_t vmaster_nid; |
@@ -355,6 +373,7 @@ struct alc_config_preset { | |||
355 | unsigned int num_channel_mode; | 373 | unsigned int num_channel_mode; |
356 | const struct hda_channel_mode *channel_mode; | 374 | const struct hda_channel_mode *channel_mode; |
357 | int need_dac_fix; | 375 | int need_dac_fix; |
376 | int const_channel_count; | ||
358 | unsigned int num_mux_defs; | 377 | unsigned int num_mux_defs; |
359 | const struct hda_input_mux *input_mux; | 378 | const struct hda_input_mux *input_mux; |
360 | void (*unsol_event)(struct hda_codec *, unsigned int); | 379 | void (*unsol_event)(struct hda_codec *, unsigned int); |
@@ -449,7 +468,7 @@ static int alc_ch_mode_get(struct snd_kcontrol *kcontrol, | |||
449 | struct alc_spec *spec = codec->spec; | 468 | struct alc_spec *spec = codec->spec; |
450 | return snd_hda_ch_mode_get(codec, ucontrol, spec->channel_mode, | 469 | return snd_hda_ch_mode_get(codec, ucontrol, spec->channel_mode, |
451 | spec->num_channel_mode, | 470 | spec->num_channel_mode, |
452 | spec->multiout.max_channels); | 471 | spec->ext_channel_count); |
453 | } | 472 | } |
454 | 473 | ||
455 | static int alc_ch_mode_put(struct snd_kcontrol *kcontrol, | 474 | static int alc_ch_mode_put(struct snd_kcontrol *kcontrol, |
@@ -459,9 +478,12 @@ static int alc_ch_mode_put(struct snd_kcontrol *kcontrol, | |||
459 | struct alc_spec *spec = codec->spec; | 478 | struct alc_spec *spec = codec->spec; |
460 | int err = snd_hda_ch_mode_put(codec, ucontrol, spec->channel_mode, | 479 | int err = snd_hda_ch_mode_put(codec, ucontrol, spec->channel_mode, |
461 | spec->num_channel_mode, | 480 | spec->num_channel_mode, |
462 | &spec->multiout.max_channels); | 481 | &spec->ext_channel_count); |
463 | if (err >= 0 && spec->need_dac_fix) | 482 | if (err >= 0 && !spec->const_channel_count) { |
464 | spec->multiout.num_dacs = spec->multiout.max_channels / 2; | 483 | spec->multiout.max_channels = spec->ext_channel_count; |
484 | if (spec->need_dac_fix) | ||
485 | spec->multiout.num_dacs = spec->multiout.max_channels / 2; | ||
486 | } | ||
465 | return err; | 487 | return err; |
466 | } | 488 | } |
467 | 489 | ||
@@ -841,8 +863,13 @@ static void setup_preset(struct alc_spec *spec, | |||
841 | spec->channel_mode = preset->channel_mode; | 863 | spec->channel_mode = preset->channel_mode; |
842 | spec->num_channel_mode = preset->num_channel_mode; | 864 | spec->num_channel_mode = preset->num_channel_mode; |
843 | spec->need_dac_fix = preset->need_dac_fix; | 865 | spec->need_dac_fix = preset->need_dac_fix; |
866 | spec->const_channel_count = preset->const_channel_count; | ||
844 | 867 | ||
845 | spec->multiout.max_channels = spec->channel_mode[0].channels; | 868 | if (preset->const_channel_count) |
869 | spec->multiout.max_channels = preset->const_channel_count; | ||
870 | else | ||
871 | spec->multiout.max_channels = spec->channel_mode[0].channels; | ||
872 | spec->ext_channel_count = spec->channel_mode[0].channels; | ||
846 | 873 | ||
847 | spec->multiout.num_dacs = preset->num_dacs; | 874 | spec->multiout.num_dacs = preset->num_dacs; |
848 | spec->multiout.dac_nids = preset->dac_nids; | 875 | spec->multiout.dac_nids = preset->dac_nids; |
@@ -921,20 +948,26 @@ static void alc_fix_pll_init(struct hda_codec *codec, hda_nid_t nid, | |||
921 | alc_fix_pll(codec); | 948 | alc_fix_pll(codec); |
922 | } | 949 | } |
923 | 950 | ||
924 | static void alc_sku_automute(struct hda_codec *codec) | 951 | static void alc_automute_pin(struct hda_codec *codec) |
925 | { | 952 | { |
926 | struct alc_spec *spec = codec->spec; | 953 | struct alc_spec *spec = codec->spec; |
927 | unsigned int present; | 954 | unsigned int present; |
928 | unsigned int hp_nid = spec->autocfg.hp_pins[0]; | 955 | unsigned int nid = spec->autocfg.hp_pins[0]; |
929 | unsigned int sp_nid = spec->autocfg.speaker_pins[0]; | 956 | int i; |
930 | 957 | ||
931 | /* need to execute and sync at first */ | 958 | /* need to execute and sync at first */ |
932 | snd_hda_codec_read(codec, hp_nid, 0, AC_VERB_SET_PIN_SENSE, 0); | 959 | snd_hda_codec_read(codec, nid, 0, AC_VERB_SET_PIN_SENSE, 0); |
933 | present = snd_hda_codec_read(codec, hp_nid, 0, | 960 | present = snd_hda_codec_read(codec, nid, 0, |
934 | AC_VERB_GET_PIN_SENSE, 0); | 961 | AC_VERB_GET_PIN_SENSE, 0); |
935 | spec->jack_present = (present & 0x80000000) != 0; | 962 | spec->jack_present = (present & AC_PINSENSE_PRESENCE) != 0; |
936 | snd_hda_codec_write(codec, sp_nid, 0, AC_VERB_SET_PIN_WIDGET_CONTROL, | 963 | for (i = 0; i < ARRAY_SIZE(spec->autocfg.speaker_pins); i++) { |
937 | spec->jack_present ? 0 : PIN_OUT); | 964 | nid = spec->autocfg.speaker_pins[i]; |
965 | if (!nid) | ||
966 | break; | ||
967 | snd_hda_codec_write(codec, nid, 0, | ||
968 | AC_VERB_SET_PIN_WIDGET_CONTROL, | ||
969 | spec->jack_present ? 0 : PIN_OUT); | ||
970 | } | ||
938 | } | 971 | } |
939 | 972 | ||
940 | #if 0 /* it's broken in some acses -- temporarily disabled */ | 973 | #if 0 /* it's broken in some acses -- temporarily disabled */ |
@@ -969,16 +1002,19 @@ static void alc_sku_unsol_event(struct hda_codec *codec, unsigned int res) | |||
969 | res >>= 28; | 1002 | res >>= 28; |
970 | else | 1003 | else |
971 | res >>= 26; | 1004 | res >>= 26; |
972 | if (res == ALC880_HP_EVENT) | 1005 | switch (res) { |
973 | alc_sku_automute(codec); | 1006 | case ALC880_HP_EVENT: |
974 | 1007 | alc_automute_pin(codec); | |
975 | if (res == ALC880_MIC_EVENT) | 1008 | break; |
1009 | case ALC880_MIC_EVENT: | ||
976 | alc_mic_automute(codec); | 1010 | alc_mic_automute(codec); |
1011 | break; | ||
1012 | } | ||
977 | } | 1013 | } |
978 | 1014 | ||
979 | static void alc_inithook(struct hda_codec *codec) | 1015 | static void alc_inithook(struct hda_codec *codec) |
980 | { | 1016 | { |
981 | alc_sku_automute(codec); | 1017 | alc_automute_pin(codec); |
982 | alc_mic_automute(codec); | 1018 | alc_mic_automute(codec); |
983 | } | 1019 | } |
984 | 1020 | ||
@@ -1000,69 +1036,21 @@ static void alc888_coef_init(struct hda_codec *codec) | |||
1000 | AC_VERB_SET_PROC_COEF, 0x3030); | 1036 | AC_VERB_SET_PROC_COEF, 0x3030); |
1001 | } | 1037 | } |
1002 | 1038 | ||
1003 | /* 32-bit subsystem ID for BIOS loading in HD Audio codec. | 1039 | static void alc_auto_init_amp(struct hda_codec *codec, int type) |
1004 | * 31 ~ 16 : Manufacture ID | ||
1005 | * 15 ~ 8 : SKU ID | ||
1006 | * 7 ~ 0 : Assembly ID | ||
1007 | * port-A --> pin 39/41, port-E --> pin 14/15, port-D --> pin 35/36 | ||
1008 | */ | ||
1009 | static void alc_subsystem_id(struct hda_codec *codec, | ||
1010 | unsigned int porta, unsigned int porte, | ||
1011 | unsigned int portd) | ||
1012 | { | 1040 | { |
1013 | unsigned int ass, tmp, i; | 1041 | unsigned int tmp; |
1014 | unsigned nid; | ||
1015 | struct alc_spec *spec = codec->spec; | ||
1016 | |||
1017 | ass = codec->subsystem_id & 0xffff; | ||
1018 | if ((ass != codec->bus->pci->subsystem_device) && (ass & 1)) | ||
1019 | goto do_sku; | ||
1020 | |||
1021 | /* | ||
1022 | * 31~30 : port conetcivity | ||
1023 | * 29~21 : reserve | ||
1024 | * 20 : PCBEEP input | ||
1025 | * 19~16 : Check sum (15:1) | ||
1026 | * 15~1 : Custom | ||
1027 | * 0 : override | ||
1028 | */ | ||
1029 | nid = 0x1d; | ||
1030 | if (codec->vendor_id == 0x10ec0260) | ||
1031 | nid = 0x17; | ||
1032 | ass = snd_hda_codec_get_pincfg(codec, nid); | ||
1033 | if (!(ass & 1) && !(ass & 0x100000)) | ||
1034 | return; | ||
1035 | if ((ass >> 30) != 1) /* no physical connection */ | ||
1036 | return; | ||
1037 | 1042 | ||
1038 | /* check sum */ | 1043 | switch (type) { |
1039 | tmp = 0; | 1044 | case ALC_INIT_GPIO1: |
1040 | for (i = 1; i < 16; i++) { | ||
1041 | if ((ass >> i) & 1) | ||
1042 | tmp++; | ||
1043 | } | ||
1044 | if (((ass >> 16) & 0xf) != tmp) | ||
1045 | return; | ||
1046 | do_sku: | ||
1047 | /* | ||
1048 | * 0 : override | ||
1049 | * 1 : Swap Jack | ||
1050 | * 2 : 0 --> Desktop, 1 --> Laptop | ||
1051 | * 3~5 : External Amplifier control | ||
1052 | * 7~6 : Reserved | ||
1053 | */ | ||
1054 | tmp = (ass & 0x38) >> 3; /* external Amp control */ | ||
1055 | switch (tmp) { | ||
1056 | case 1: | ||
1057 | snd_hda_sequence_write(codec, alc_gpio1_init_verbs); | 1045 | snd_hda_sequence_write(codec, alc_gpio1_init_verbs); |
1058 | break; | 1046 | break; |
1059 | case 3: | 1047 | case ALC_INIT_GPIO2: |
1060 | snd_hda_sequence_write(codec, alc_gpio2_init_verbs); | 1048 | snd_hda_sequence_write(codec, alc_gpio2_init_verbs); |
1061 | break; | 1049 | break; |
1062 | case 7: | 1050 | case ALC_INIT_GPIO3: |
1063 | snd_hda_sequence_write(codec, alc_gpio3_init_verbs); | 1051 | snd_hda_sequence_write(codec, alc_gpio3_init_verbs); |
1064 | break; | 1052 | break; |
1065 | case 5: /* set EAPD output high */ | 1053 | case ALC_INIT_DEFAULT: |
1066 | switch (codec->vendor_id) { | 1054 | switch (codec->vendor_id) { |
1067 | case 0x10ec0260: | 1055 | case 0x10ec0260: |
1068 | snd_hda_codec_write(codec, 0x0f, 0, | 1056 | snd_hda_codec_write(codec, 0x0f, 0, |
@@ -1116,7 +1104,7 @@ do_sku: | |||
1116 | tmp | 0x2010); | 1104 | tmp | 0x2010); |
1117 | break; | 1105 | break; |
1118 | case 0x10ec0888: | 1106 | case 0x10ec0888: |
1119 | /*alc888_coef_init(codec);*/ /* called in alc_init() */ | 1107 | alc888_coef_init(codec); |
1120 | break; | 1108 | break; |
1121 | case 0x10ec0267: | 1109 | case 0x10ec0267: |
1122 | case 0x10ec0268: | 1110 | case 0x10ec0268: |
@@ -1131,7 +1119,107 @@ do_sku: | |||
1131 | tmp | 0x3000); | 1119 | tmp | 0x3000); |
1132 | break; | 1120 | break; |
1133 | } | 1121 | } |
1134 | default: | 1122 | break; |
1123 | } | ||
1124 | } | ||
1125 | |||
1126 | static void alc_init_auto_hp(struct hda_codec *codec) | ||
1127 | { | ||
1128 | struct alc_spec *spec = codec->spec; | ||
1129 | |||
1130 | if (!spec->autocfg.hp_pins[0]) | ||
1131 | return; | ||
1132 | |||
1133 | if (!spec->autocfg.speaker_pins[0]) { | ||
1134 | if (spec->autocfg.line_out_pins[0] && | ||
1135 | spec->autocfg.line_out_type == AUTO_PIN_SPEAKER_OUT) | ||
1136 | spec->autocfg.speaker_pins[0] = | ||
1137 | spec->autocfg.line_out_pins[0]; | ||
1138 | else | ||
1139 | return; | ||
1140 | } | ||
1141 | |||
1142 | snd_printdd("realtek: Enable HP auto-muting on NID 0x%x\n", | ||
1143 | spec->autocfg.hp_pins[0]); | ||
1144 | snd_hda_codec_write_cache(codec, spec->autocfg.hp_pins[0], 0, | ||
1145 | AC_VERB_SET_UNSOLICITED_ENABLE, | ||
1146 | AC_USRSP_EN | ALC880_HP_EVENT); | ||
1147 | spec->unsol_event = alc_sku_unsol_event; | ||
1148 | } | ||
1149 | |||
1150 | /* check subsystem ID and set up device-specific initialization; | ||
1151 | * return 1 if initialized, 0 if invalid SSID | ||
1152 | */ | ||
1153 | /* 32-bit subsystem ID for BIOS loading in HD Audio codec. | ||
1154 | * 31 ~ 16 : Manufacture ID | ||
1155 | * 15 ~ 8 : SKU ID | ||
1156 | * 7 ~ 0 : Assembly ID | ||
1157 | * port-A --> pin 39/41, port-E --> pin 14/15, port-D --> pin 35/36 | ||
1158 | */ | ||
1159 | static int alc_subsystem_id(struct hda_codec *codec, | ||
1160 | hda_nid_t porta, hda_nid_t porte, | ||
1161 | hda_nid_t portd) | ||
1162 | { | ||
1163 | unsigned int ass, tmp, i; | ||
1164 | unsigned nid; | ||
1165 | struct alc_spec *spec = codec->spec; | ||
1166 | |||
1167 | ass = codec->subsystem_id & 0xffff; | ||
1168 | if ((ass != codec->bus->pci->subsystem_device) && (ass & 1)) | ||
1169 | goto do_sku; | ||
1170 | |||
1171 | /* invalid SSID, check the special NID pin defcfg instead */ | ||
1172 | /* | ||
1173 | * 31~30 : port conetcivity | ||
1174 | * 29~21 : reserve | ||
1175 | * 20 : PCBEEP input | ||
1176 | * 19~16 : Check sum (15:1) | ||
1177 | * 15~1 : Custom | ||
1178 | * 0 : override | ||
1179 | */ | ||
1180 | nid = 0x1d; | ||
1181 | if (codec->vendor_id == 0x10ec0260) | ||
1182 | nid = 0x17; | ||
1183 | ass = snd_hda_codec_get_pincfg(codec, nid); | ||
1184 | snd_printd("realtek: No valid SSID, " | ||
1185 | "checking pincfg 0x%08x for NID 0x%x\n", | ||
1186 | ass, nid); | ||
1187 | if (!(ass & 1) && !(ass & 0x100000)) | ||
1188 | return 0; | ||
1189 | if ((ass >> 30) != 1) /* no physical connection */ | ||
1190 | return 0; | ||
1191 | |||
1192 | /* check sum */ | ||
1193 | tmp = 0; | ||
1194 | for (i = 1; i < 16; i++) { | ||
1195 | if ((ass >> i) & 1) | ||
1196 | tmp++; | ||
1197 | } | ||
1198 | if (((ass >> 16) & 0xf) != tmp) | ||
1199 | return 0; | ||
1200 | do_sku: | ||
1201 | snd_printd("realtek: Enabling init ASM_ID=0x%04x CODEC_ID=%08x\n", | ||
1202 | ass & 0xffff, codec->vendor_id); | ||
1203 | /* | ||
1204 | * 0 : override | ||
1205 | * 1 : Swap Jack | ||
1206 | * 2 : 0 --> Desktop, 1 --> Laptop | ||
1207 | * 3~5 : External Amplifier control | ||
1208 | * 7~6 : Reserved | ||
1209 | */ | ||
1210 | tmp = (ass & 0x38) >> 3; /* external Amp control */ | ||
1211 | switch (tmp) { | ||
1212 | case 1: | ||
1213 | spec->init_amp = ALC_INIT_GPIO1; | ||
1214 | break; | ||
1215 | case 3: | ||
1216 | spec->init_amp = ALC_INIT_GPIO2; | ||
1217 | break; | ||
1218 | case 7: | ||
1219 | spec->init_amp = ALC_INIT_GPIO3; | ||
1220 | break; | ||
1221 | case 5: | ||
1222 | spec->init_amp = ALC_INIT_DEFAULT; | ||
1135 | break; | 1223 | break; |
1136 | } | 1224 | } |
1137 | 1225 | ||
@@ -1139,7 +1227,7 @@ do_sku: | |||
1139 | * when the external headphone out jack is plugged" | 1227 | * when the external headphone out jack is plugged" |
1140 | */ | 1228 | */ |
1141 | if (!(ass & 0x8000)) | 1229 | if (!(ass & 0x8000)) |
1142 | return; | 1230 | return 1; |
1143 | /* | 1231 | /* |
1144 | * 10~8 : Jack location | 1232 | * 10~8 : Jack location |
1145 | * 12~11: Headphone out -> 00: PortA, 01: PortE, 02: PortD, 03: Resvered | 1233 | * 12~11: Headphone out -> 00: PortA, 01: PortE, 02: PortD, 03: Resvered |
@@ -1147,14 +1235,6 @@ do_sku: | |||
1147 | * 15 : 1 --> enable the function "Mute internal speaker | 1235 | * 15 : 1 --> enable the function "Mute internal speaker |
1148 | * when the external headphone out jack is plugged" | 1236 | * when the external headphone out jack is plugged" |
1149 | */ | 1237 | */ |
1150 | if (!spec->autocfg.speaker_pins[0]) { | ||
1151 | if (spec->autocfg.line_out_pins[0]) | ||
1152 | spec->autocfg.speaker_pins[0] = | ||
1153 | spec->autocfg.line_out_pins[0]; | ||
1154 | else | ||
1155 | return; | ||
1156 | } | ||
1157 | |||
1158 | if (!spec->autocfg.hp_pins[0]) { | 1238 | if (!spec->autocfg.hp_pins[0]) { |
1159 | tmp = (ass >> 11) & 0x3; /* HP to chassis */ | 1239 | tmp = (ass >> 11) & 0x3; /* HP to chassis */ |
1160 | if (tmp == 0) | 1240 | if (tmp == 0) |
@@ -1164,23 +1244,23 @@ do_sku: | |||
1164 | else if (tmp == 2) | 1244 | else if (tmp == 2) |
1165 | spec->autocfg.hp_pins[0] = portd; | 1245 | spec->autocfg.hp_pins[0] = portd; |
1166 | else | 1246 | else |
1167 | return; | 1247 | return 1; |
1168 | } | 1248 | } |
1169 | if (spec->autocfg.hp_pins[0]) | ||
1170 | snd_hda_codec_write(codec, spec->autocfg.hp_pins[0], 0, | ||
1171 | AC_VERB_SET_UNSOLICITED_ENABLE, | ||
1172 | AC_USRSP_EN | ALC880_HP_EVENT); | ||
1173 | 1249 | ||
1174 | #if 0 /* it's broken in some acses -- temporarily disabled */ | 1250 | alc_init_auto_hp(codec); |
1175 | if (spec->autocfg.input_pins[AUTO_PIN_MIC] && | 1251 | return 1; |
1176 | spec->autocfg.input_pins[AUTO_PIN_FRONT_MIC]) | 1252 | } |
1177 | snd_hda_codec_write(codec, | ||
1178 | spec->autocfg.input_pins[AUTO_PIN_MIC], 0, | ||
1179 | AC_VERB_SET_UNSOLICITED_ENABLE, | ||
1180 | AC_USRSP_EN | ALC880_MIC_EVENT); | ||
1181 | #endif /* disabled */ | ||
1182 | 1253 | ||
1183 | spec->unsol_event = alc_sku_unsol_event; | 1254 | static void alc_ssid_check(struct hda_codec *codec, |
1255 | hda_nid_t porta, hda_nid_t porte, hda_nid_t portd) | ||
1256 | { | ||
1257 | if (!alc_subsystem_id(codec, porta, porte, portd)) { | ||
1258 | struct alc_spec *spec = codec->spec; | ||
1259 | snd_printd("realtek: " | ||
1260 | "Enable default setup for auto mode as fallback\n"); | ||
1261 | spec->init_amp = ALC_INIT_DEFAULT; | ||
1262 | alc_init_auto_hp(codec); | ||
1263 | } | ||
1184 | } | 1264 | } |
1185 | 1265 | ||
1186 | /* | 1266 | /* |
@@ -1315,32 +1395,58 @@ static struct hda_verb alc888_fujitsu_xa3530_verbs[] = { | |||
1315 | {} | 1395 | {} |
1316 | }; | 1396 | }; |
1317 | 1397 | ||
1318 | static void alc888_fujitsu_xa3530_automute(struct hda_codec *codec) | 1398 | static void alc_automute_amp(struct hda_codec *codec) |
1319 | { | 1399 | { |
1320 | unsigned int present; | 1400 | struct alc_spec *spec = codec->spec; |
1321 | unsigned int bits; | 1401 | unsigned int val, mute; |
1322 | /* Line out presence */ | 1402 | hda_nid_t nid; |
1323 | present = snd_hda_codec_read(codec, 0x17, 0, | 1403 | int i; |
1324 | AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; | 1404 | |
1325 | /* HP out presence */ | 1405 | spec->jack_present = 0; |
1326 | present = present || snd_hda_codec_read(codec, 0x1b, 0, | 1406 | for (i = 0; i < ARRAY_SIZE(spec->autocfg.hp_pins); i++) { |
1327 | AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; | 1407 | nid = spec->autocfg.hp_pins[i]; |
1328 | bits = present ? HDA_AMP_MUTE : 0; | 1408 | if (!nid) |
1409 | break; | ||
1410 | val = snd_hda_codec_read(codec, nid, 0, | ||
1411 | AC_VERB_GET_PIN_SENSE, 0); | ||
1412 | if (val & AC_PINSENSE_PRESENCE) { | ||
1413 | spec->jack_present = 1; | ||
1414 | break; | ||
1415 | } | ||
1416 | } | ||
1417 | |||
1418 | mute = spec->jack_present ? HDA_AMP_MUTE : 0; | ||
1329 | /* Toggle internal speakers muting */ | 1419 | /* Toggle internal speakers muting */ |
1330 | snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0, | 1420 | for (i = 0; i < ARRAY_SIZE(spec->autocfg.speaker_pins); i++) { |
1331 | HDA_AMP_MUTE, bits); | 1421 | nid = spec->autocfg.speaker_pins[i]; |
1332 | /* Toggle internal bass muting */ | 1422 | if (!nid) |
1333 | snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0, | 1423 | break; |
1334 | HDA_AMP_MUTE, bits); | 1424 | snd_hda_codec_amp_stereo(codec, nid, HDA_OUTPUT, 0, |
1425 | HDA_AMP_MUTE, mute); | ||
1426 | } | ||
1335 | } | 1427 | } |
1336 | 1428 | ||
1337 | static void alc888_fujitsu_xa3530_unsol_event(struct hda_codec *codec, | 1429 | static void alc_automute_amp_unsol_event(struct hda_codec *codec, |
1338 | unsigned int res) | 1430 | unsigned int res) |
1339 | { | 1431 | { |
1340 | if (res >> 26 == ALC880_HP_EVENT) | 1432 | if (codec->vendor_id == 0x10ec0880) |
1341 | alc888_fujitsu_xa3530_automute(codec); | 1433 | res >>= 28; |
1434 | else | ||
1435 | res >>= 26; | ||
1436 | if (res == ALC880_HP_EVENT) | ||
1437 | alc_automute_amp(codec); | ||
1342 | } | 1438 | } |
1343 | 1439 | ||
1440 | static void alc888_fujitsu_xa3530_init_hook(struct hda_codec *codec) | ||
1441 | { | ||
1442 | struct alc_spec *spec = codec->spec; | ||
1443 | |||
1444 | spec->autocfg.hp_pins[0] = 0x17; /* line-out */ | ||
1445 | spec->autocfg.hp_pins[1] = 0x1b; /* hp */ | ||
1446 | spec->autocfg.speaker_pins[0] = 0x14; /* speaker */ | ||
1447 | spec->autocfg.speaker_pins[1] = 0x15; /* bass */ | ||
1448 | alc_automute_amp(codec); | ||
1449 | } | ||
1344 | 1450 | ||
1345 | /* | 1451 | /* |
1346 | * ALC888 Acer Aspire 4930G model | 1452 | * ALC888 Acer Aspire 4930G model |
@@ -1364,6 +1470,59 @@ static struct hda_verb alc888_acer_aspire_4930g_verbs[] = { | |||
1364 | { } | 1470 | { } |
1365 | }; | 1471 | }; |
1366 | 1472 | ||
1473 | /* | ||
1474 | * ALC889 Acer Aspire 8930G model | ||
1475 | */ | ||
1476 | |||
1477 | static struct hda_verb alc889_acer_aspire_8930g_verbs[] = { | ||
1478 | /* Front Mic: set to PIN_IN (empty by default) */ | ||
1479 | {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, | ||
1480 | /* Unselect Front Mic by default in input mixer 3 */ | ||
1481 | {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0xb)}, | ||
1482 | /* Enable unsolicited event for HP jack */ | ||
1483 | {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, | ||
1484 | /* Connect Internal Front to Front */ | ||
1485 | {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, | ||
1486 | {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | ||
1487 | {0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, | ||
1488 | /* Connect Internal Rear to Rear */ | ||
1489 | {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, | ||
1490 | {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | ||
1491 | {0x1b, AC_VERB_SET_CONNECT_SEL, 0x01}, | ||
1492 | /* Connect Internal CLFE to CLFE */ | ||
1493 | {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, | ||
1494 | {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | ||
1495 | {0x16, AC_VERB_SET_CONNECT_SEL, 0x02}, | ||
1496 | /* Connect HP out to Front */ | ||
1497 | {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | PIN_HP}, | ||
1498 | {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | ||
1499 | {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, | ||
1500 | /* Enable all DACs */ | ||
1501 | /* DAC DISABLE/MUTE 1? */ | ||
1502 | /* setting bits 1-5 disables DAC nids 0x02-0x06 apparently. Init=0x38 */ | ||
1503 | {0x20, AC_VERB_SET_COEF_INDEX, 0x03}, | ||
1504 | {0x20, AC_VERB_SET_PROC_COEF, 0x0000}, | ||
1505 | /* DAC DISABLE/MUTE 2? */ | ||
1506 | /* some bit here disables the other DACs. Init=0x4900 */ | ||
1507 | {0x20, AC_VERB_SET_COEF_INDEX, 0x08}, | ||
1508 | {0x20, AC_VERB_SET_PROC_COEF, 0x0000}, | ||
1509 | /* Enable amplifiers */ | ||
1510 | {0x14, AC_VERB_SET_EAPD_BTLENABLE, 0x02}, | ||
1511 | {0x15, AC_VERB_SET_EAPD_BTLENABLE, 0x02}, | ||
1512 | /* DMIC fix | ||
1513 | * This laptop has a stereo digital microphone. The mics are only 1cm apart | ||
1514 | * which makes the stereo useless. However, either the mic or the ALC889 | ||
1515 | * makes the signal become a difference/sum signal instead of standard | ||
1516 | * stereo, which is annoying. So instead we flip this bit which makes the | ||
1517 | * codec replicate the sum signal to both channels, turning it into a | ||
1518 | * normal mono mic. | ||
1519 | */ | ||
1520 | /* DMIC_CONTROL? Init value = 0x0001 */ | ||
1521 | {0x20, AC_VERB_SET_COEF_INDEX, 0x0b}, | ||
1522 | {0x20, AC_VERB_SET_PROC_COEF, 0x0003}, | ||
1523 | { } | ||
1524 | }; | ||
1525 | |||
1367 | static struct hda_input_mux alc888_2_capture_sources[2] = { | 1526 | static struct hda_input_mux alc888_2_capture_sources[2] = { |
1368 | /* Front mic only available on one ADC */ | 1527 | /* Front mic only available on one ADC */ |
1369 | { | 1528 | { |
@@ -1385,6 +1544,38 @@ static struct hda_input_mux alc888_2_capture_sources[2] = { | |||
1385 | } | 1544 | } |
1386 | }; | 1545 | }; |
1387 | 1546 | ||
1547 | static struct hda_input_mux alc889_capture_sources[3] = { | ||
1548 | /* Digital mic only available on first "ADC" */ | ||
1549 | { | ||
1550 | .num_items = 5, | ||
1551 | .items = { | ||
1552 | { "Mic", 0x0 }, | ||
1553 | { "Line", 0x2 }, | ||
1554 | { "CD", 0x4 }, | ||
1555 | { "Front Mic", 0xb }, | ||
1556 | { "Input Mix", 0xa }, | ||
1557 | }, | ||
1558 | }, | ||
1559 | { | ||
1560 | .num_items = 4, | ||
1561 | .items = { | ||
1562 | { "Mic", 0x0 }, | ||
1563 | { "Line", 0x2 }, | ||
1564 | { "CD", 0x4 }, | ||
1565 | { "Input Mix", 0xa }, | ||
1566 | }, | ||
1567 | }, | ||
1568 | { | ||
1569 | .num_items = 4, | ||
1570 | .items = { | ||
1571 | { "Mic", 0x0 }, | ||
1572 | { "Line", 0x2 }, | ||
1573 | { "CD", 0x4 }, | ||
1574 | { "Input Mix", 0xa }, | ||
1575 | }, | ||
1576 | } | ||
1577 | }; | ||
1578 | |||
1388 | static struct snd_kcontrol_new alc888_base_mixer[] = { | 1579 | static struct snd_kcontrol_new alc888_base_mixer[] = { |
1389 | HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), | 1580 | HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), |
1390 | HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), | 1581 | HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), |
@@ -1407,22 +1598,24 @@ static struct snd_kcontrol_new alc888_base_mixer[] = { | |||
1407 | { } /* end */ | 1598 | { } /* end */ |
1408 | }; | 1599 | }; |
1409 | 1600 | ||
1410 | static void alc888_acer_aspire_4930g_automute(struct hda_codec *codec) | 1601 | static void alc888_acer_aspire_4930g_init_hook(struct hda_codec *codec) |
1411 | { | 1602 | { |
1412 | unsigned int present; | 1603 | struct alc_spec *spec = codec->spec; |
1413 | unsigned int bits; | 1604 | |
1414 | present = snd_hda_codec_read(codec, 0x15, 0, | 1605 | spec->autocfg.hp_pins[0] = 0x15; |
1415 | AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; | 1606 | spec->autocfg.speaker_pins[0] = 0x14; |
1416 | bits = present ? HDA_AMP_MUTE : 0; | 1607 | alc_automute_amp(codec); |
1417 | snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0, | ||
1418 | HDA_AMP_MUTE, bits); | ||
1419 | } | 1608 | } |
1420 | 1609 | ||
1421 | static void alc888_acer_aspire_4930g_unsol_event(struct hda_codec *codec, | 1610 | static void alc889_acer_aspire_8930g_init_hook(struct hda_codec *codec) |
1422 | unsigned int res) | ||
1423 | { | 1611 | { |
1424 | if (res >> 26 == ALC880_HP_EVENT) | 1612 | struct alc_spec *spec = codec->spec; |
1425 | alc888_acer_aspire_4930g_automute(codec); | 1613 | |
1614 | spec->autocfg.hp_pins[0] = 0x15; | ||
1615 | spec->autocfg.speaker_pins[0] = 0x14; | ||
1616 | spec->autocfg.speaker_pins[1] = 0x16; | ||
1617 | spec->autocfg.speaker_pins[2] = 0x1b; | ||
1618 | alc_automute_amp(codec); | ||
1426 | } | 1619 | } |
1427 | 1620 | ||
1428 | /* | 1621 | /* |
@@ -2390,21 +2583,6 @@ static struct hda_verb alc880_beep_init_verbs[] = { | |||
2390 | { } | 2583 | { } |
2391 | }; | 2584 | }; |
2392 | 2585 | ||
2393 | /* toggle speaker-output according to the hp-jack state */ | ||
2394 | static void alc880_uniwill_hp_automute(struct hda_codec *codec) | ||
2395 | { | ||
2396 | unsigned int present; | ||
2397 | unsigned char bits; | ||
2398 | |||
2399 | present = snd_hda_codec_read(codec, 0x14, 0, | ||
2400 | AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; | ||
2401 | bits = present ? HDA_AMP_MUTE : 0; | ||
2402 | snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0, | ||
2403 | HDA_AMP_MUTE, bits); | ||
2404 | snd_hda_codec_amp_stereo(codec, 0x16, HDA_OUTPUT, 0, | ||
2405 | HDA_AMP_MUTE, bits); | ||
2406 | } | ||
2407 | |||
2408 | /* auto-toggle front mic */ | 2586 | /* auto-toggle front mic */ |
2409 | static void alc880_uniwill_mic_automute(struct hda_codec *codec) | 2587 | static void alc880_uniwill_mic_automute(struct hda_codec *codec) |
2410 | { | 2588 | { |
@@ -2417,9 +2595,14 @@ static void alc880_uniwill_mic_automute(struct hda_codec *codec) | |||
2417 | snd_hda_codec_amp_stereo(codec, 0x0b, HDA_INPUT, 1, HDA_AMP_MUTE, bits); | 2595 | snd_hda_codec_amp_stereo(codec, 0x0b, HDA_INPUT, 1, HDA_AMP_MUTE, bits); |
2418 | } | 2596 | } |
2419 | 2597 | ||
2420 | static void alc880_uniwill_automute(struct hda_codec *codec) | 2598 | static void alc880_uniwill_init_hook(struct hda_codec *codec) |
2421 | { | 2599 | { |
2422 | alc880_uniwill_hp_automute(codec); | 2600 | struct alc_spec *spec = codec->spec; |
2601 | |||
2602 | spec->autocfg.hp_pins[0] = 0x14; | ||
2603 | spec->autocfg.speaker_pins[0] = 0x15; | ||
2604 | spec->autocfg.speaker_pins[0] = 0x16; | ||
2605 | alc_automute_amp(codec); | ||
2423 | alc880_uniwill_mic_automute(codec); | 2606 | alc880_uniwill_mic_automute(codec); |
2424 | } | 2607 | } |
2425 | 2608 | ||
@@ -2430,24 +2613,22 @@ static void alc880_uniwill_unsol_event(struct hda_codec *codec, | |||
2430 | * definition. 4bit tag is placed at 28 bit! | 2613 | * definition. 4bit tag is placed at 28 bit! |
2431 | */ | 2614 | */ |
2432 | switch (res >> 28) { | 2615 | switch (res >> 28) { |
2433 | case ALC880_HP_EVENT: | ||
2434 | alc880_uniwill_hp_automute(codec); | ||
2435 | break; | ||
2436 | case ALC880_MIC_EVENT: | 2616 | case ALC880_MIC_EVENT: |
2437 | alc880_uniwill_mic_automute(codec); | 2617 | alc880_uniwill_mic_automute(codec); |
2438 | break; | 2618 | break; |
2619 | default: | ||
2620 | alc_automute_amp_unsol_event(codec, res); | ||
2621 | break; | ||
2439 | } | 2622 | } |
2440 | } | 2623 | } |
2441 | 2624 | ||
2442 | static void alc880_uniwill_p53_hp_automute(struct hda_codec *codec) | 2625 | static void alc880_uniwill_p53_init_hook(struct hda_codec *codec) |
2443 | { | 2626 | { |
2444 | unsigned int present; | 2627 | struct alc_spec *spec = codec->spec; |
2445 | unsigned char bits; | ||
2446 | 2628 | ||
2447 | present = snd_hda_codec_read(codec, 0x14, 0, | 2629 | spec->autocfg.hp_pins[0] = 0x14; |
2448 | AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; | 2630 | spec->autocfg.speaker_pins[0] = 0x15; |
2449 | bits = present ? HDA_AMP_MUTE : 0; | 2631 | alc_automute_amp(codec); |
2450 | snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0, HDA_AMP_MUTE, bits); | ||
2451 | } | 2632 | } |
2452 | 2633 | ||
2453 | static void alc880_uniwill_p53_dcvol_automute(struct hda_codec *codec) | 2634 | static void alc880_uniwill_p53_dcvol_automute(struct hda_codec *codec) |
@@ -2469,10 +2650,10 @@ static void alc880_uniwill_p53_unsol_event(struct hda_codec *codec, | |||
2469 | /* Looks like the unsol event is incompatible with the standard | 2650 | /* Looks like the unsol event is incompatible with the standard |
2470 | * definition. 4bit tag is placed at 28 bit! | 2651 | * definition. 4bit tag is placed at 28 bit! |
2471 | */ | 2652 | */ |
2472 | if ((res >> 28) == ALC880_HP_EVENT) | ||
2473 | alc880_uniwill_p53_hp_automute(codec); | ||
2474 | if ((res >> 28) == ALC880_DCVOL_EVENT) | 2653 | if ((res >> 28) == ALC880_DCVOL_EVENT) |
2475 | alc880_uniwill_p53_dcvol_automute(codec); | 2654 | alc880_uniwill_p53_dcvol_automute(codec); |
2655 | else | ||
2656 | alc_automute_amp_unsol_event(codec, res); | ||
2476 | } | 2657 | } |
2477 | 2658 | ||
2478 | /* | 2659 | /* |
@@ -2542,6 +2723,7 @@ static struct hda_verb alc880_pin_asus_init_verbs[] = { | |||
2542 | /* Enable GPIO mask and set output */ | 2723 | /* Enable GPIO mask and set output */ |
2543 | #define alc880_gpio1_init_verbs alc_gpio1_init_verbs | 2724 | #define alc880_gpio1_init_verbs alc_gpio1_init_verbs |
2544 | #define alc880_gpio2_init_verbs alc_gpio2_init_verbs | 2725 | #define alc880_gpio2_init_verbs alc_gpio2_init_verbs |
2726 | #define alc880_gpio3_init_verbs alc_gpio3_init_verbs | ||
2545 | 2727 | ||
2546 | /* Clevo m520g init */ | 2728 | /* Clevo m520g init */ |
2547 | static struct hda_verb alc880_pin_clevo_init_verbs[] = { | 2729 | static struct hda_verb alc880_pin_clevo_init_verbs[] = { |
@@ -2704,30 +2886,18 @@ static struct hda_verb alc880_lg_init_verbs[] = { | |||
2704 | {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, | 2886 | {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, |
2705 | {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | 2887 | {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, |
2706 | /* jack sense */ | 2888 | /* jack sense */ |
2707 | {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | 0x1}, | 2889 | {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT}, |
2708 | { } | 2890 | { } |
2709 | }; | 2891 | }; |
2710 | 2892 | ||
2711 | /* toggle speaker-output according to the hp-jack state */ | 2893 | /* toggle speaker-output according to the hp-jack state */ |
2712 | static void alc880_lg_automute(struct hda_codec *codec) | 2894 | static void alc880_lg_init_hook(struct hda_codec *codec) |
2713 | { | 2895 | { |
2714 | unsigned int present; | 2896 | struct alc_spec *spec = codec->spec; |
2715 | unsigned char bits; | ||
2716 | |||
2717 | present = snd_hda_codec_read(codec, 0x1b, 0, | ||
2718 | AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; | ||
2719 | bits = present ? HDA_AMP_MUTE : 0; | ||
2720 | snd_hda_codec_amp_stereo(codec, 0x17, HDA_OUTPUT, 0, | ||
2721 | HDA_AMP_MUTE, bits); | ||
2722 | } | ||
2723 | 2897 | ||
2724 | static void alc880_lg_unsol_event(struct hda_codec *codec, unsigned int res) | 2898 | spec->autocfg.hp_pins[0] = 0x1b; |
2725 | { | 2899 | spec->autocfg.speaker_pins[0] = 0x17; |
2726 | /* Looks like the unsol event is incompatible with the standard | 2900 | alc_automute_amp(codec); |
2727 | * definition. 4bit tag is placed at 28 bit! | ||
2728 | */ | ||
2729 | if ((res >> 28) == 0x01) | ||
2730 | alc880_lg_automute(codec); | ||
2731 | } | 2901 | } |
2732 | 2902 | ||
2733 | /* | 2903 | /* |
@@ -2801,30 +2971,18 @@ static struct hda_verb alc880_lg_lw_init_verbs[] = { | |||
2801 | {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, | 2971 | {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, |
2802 | {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | 2972 | {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, |
2803 | /* jack sense */ | 2973 | /* jack sense */ |
2804 | {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | 0x1}, | 2974 | {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT}, |
2805 | { } | 2975 | { } |
2806 | }; | 2976 | }; |
2807 | 2977 | ||
2808 | /* toggle speaker-output according to the hp-jack state */ | 2978 | /* toggle speaker-output according to the hp-jack state */ |
2809 | static void alc880_lg_lw_automute(struct hda_codec *codec) | 2979 | static void alc880_lg_lw_init_hook(struct hda_codec *codec) |
2810 | { | 2980 | { |
2811 | unsigned int present; | 2981 | struct alc_spec *spec = codec->spec; |
2812 | unsigned char bits; | ||
2813 | 2982 | ||
2814 | present = snd_hda_codec_read(codec, 0x1b, 0, | 2983 | spec->autocfg.hp_pins[0] = 0x1b; |
2815 | AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; | 2984 | spec->autocfg.speaker_pins[0] = 0x14; |
2816 | bits = present ? HDA_AMP_MUTE : 0; | 2985 | alc_automute_amp(codec); |
2817 | snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0, | ||
2818 | HDA_AMP_MUTE, bits); | ||
2819 | } | ||
2820 | |||
2821 | static void alc880_lg_lw_unsol_event(struct hda_codec *codec, unsigned int res) | ||
2822 | { | ||
2823 | /* Looks like the unsol event is incompatible with the standard | ||
2824 | * definition. 4bit tag is placed at 28 bit! | ||
2825 | */ | ||
2826 | if ((res >> 28) == 0x01) | ||
2827 | alc880_lg_lw_automute(codec); | ||
2828 | } | 2986 | } |
2829 | 2987 | ||
2830 | static struct snd_kcontrol_new alc880_medion_rim_mixer[] = { | 2988 | static struct snd_kcontrol_new alc880_medion_rim_mixer[] = { |
@@ -2871,16 +3029,10 @@ static struct hda_verb alc880_medion_rim_init_verbs[] = { | |||
2871 | /* toggle speaker-output according to the hp-jack state */ | 3029 | /* toggle speaker-output according to the hp-jack state */ |
2872 | static void alc880_medion_rim_automute(struct hda_codec *codec) | 3030 | static void alc880_medion_rim_automute(struct hda_codec *codec) |
2873 | { | 3031 | { |
2874 | unsigned int present; | 3032 | struct alc_spec *spec = codec->spec; |
2875 | unsigned char bits; | 3033 | alc_automute_amp(codec); |
2876 | 3034 | /* toggle EAPD */ | |
2877 | present = snd_hda_codec_read(codec, 0x14, 0, | 3035 | if (spec->jack_present) |
2878 | AC_VERB_GET_PIN_SENSE, 0) | ||
2879 | & AC_PINSENSE_PRESENCE; | ||
2880 | bits = present ? HDA_AMP_MUTE : 0; | ||
2881 | snd_hda_codec_amp_stereo(codec, 0x1b, HDA_OUTPUT, 0, | ||
2882 | HDA_AMP_MUTE, bits); | ||
2883 | if (present) | ||
2884 | snd_hda_codec_write(codec, 0x01, 0, AC_VERB_SET_GPIO_DATA, 0); | 3036 | snd_hda_codec_write(codec, 0x01, 0, AC_VERB_SET_GPIO_DATA, 0); |
2885 | else | 3037 | else |
2886 | snd_hda_codec_write(codec, 0x01, 0, AC_VERB_SET_GPIO_DATA, 2); | 3038 | snd_hda_codec_write(codec, 0x01, 0, AC_VERB_SET_GPIO_DATA, 2); |
@@ -2896,6 +3048,15 @@ static void alc880_medion_rim_unsol_event(struct hda_codec *codec, | |||
2896 | alc880_medion_rim_automute(codec); | 3048 | alc880_medion_rim_automute(codec); |
2897 | } | 3049 | } |
2898 | 3050 | ||
3051 | static void alc880_medion_rim_init_hook(struct hda_codec *codec) | ||
3052 | { | ||
3053 | struct alc_spec *spec = codec->spec; | ||
3054 | |||
3055 | spec->autocfg.hp_pins[0] = 0x14; | ||
3056 | spec->autocfg.speaker_pins[0] = 0x1b; | ||
3057 | alc880_medion_rim_automute(codec); | ||
3058 | } | ||
3059 | |||
2899 | #ifdef CONFIG_SND_HDA_POWER_SAVE | 3060 | #ifdef CONFIG_SND_HDA_POWER_SAVE |
2900 | static struct hda_amp_list alc880_loopbacks[] = { | 3061 | static struct hda_amp_list alc880_loopbacks[] = { |
2901 | { 0x0b, HDA_INPUT, 0 }, | 3062 | { 0x0b, HDA_INPUT, 0 }, |
@@ -2924,8 +3085,7 @@ static int alc_init(struct hda_codec *codec) | |||
2924 | unsigned int i; | 3085 | unsigned int i; |
2925 | 3086 | ||
2926 | alc_fix_pll(codec); | 3087 | alc_fix_pll(codec); |
2927 | if (codec->vendor_id == 0x10ec0888) | 3088 | alc_auto_init_amp(codec, spec->init_amp); |
2928 | alc888_coef_init(codec); | ||
2929 | 3089 | ||
2930 | for (i = 0; i < spec->num_init_verbs; i++) | 3090 | for (i = 0; i < spec->num_init_verbs; i++) |
2931 | snd_hda_sequence_write(codec, spec->init_verbs[i]); | 3091 | snd_hda_sequence_write(codec, spec->init_verbs[i]); |
@@ -3127,7 +3287,10 @@ static int alc_build_pcms(struct hda_codec *codec) | |||
3127 | if (spec->no_analog) | 3287 | if (spec->no_analog) |
3128 | goto skip_analog; | 3288 | goto skip_analog; |
3129 | 3289 | ||
3290 | snprintf(spec->stream_name_analog, sizeof(spec->stream_name_analog), | ||
3291 | "%s Analog", codec->chip_name); | ||
3130 | info->name = spec->stream_name_analog; | 3292 | info->name = spec->stream_name_analog; |
3293 | |||
3131 | if (spec->stream_analog_playback) { | 3294 | if (spec->stream_analog_playback) { |
3132 | if (snd_BUG_ON(!spec->multiout.dac_nids)) | 3295 | if (snd_BUG_ON(!spec->multiout.dac_nids)) |
3133 | return -EINVAL; | 3296 | return -EINVAL; |
@@ -3153,6 +3316,9 @@ static int alc_build_pcms(struct hda_codec *codec) | |||
3153 | skip_analog: | 3316 | skip_analog: |
3154 | /* SPDIF for stream index #1 */ | 3317 | /* SPDIF for stream index #1 */ |
3155 | if (spec->multiout.dig_out_nid || spec->dig_in_nid) { | 3318 | if (spec->multiout.dig_out_nid || spec->dig_in_nid) { |
3319 | snprintf(spec->stream_name_digital, | ||
3320 | sizeof(spec->stream_name_digital), | ||
3321 | "%s Digital", codec->chip_name); | ||
3156 | codec->num_pcms = 2; | 3322 | codec->num_pcms = 2; |
3157 | codec->slave_dig_outs = spec->multiout.slave_dig_outs; | 3323 | codec->slave_dig_outs = spec->multiout.slave_dig_outs; |
3158 | info = spec->pcm_rec + 1; | 3324 | info = spec->pcm_rec + 1; |
@@ -3755,7 +3921,7 @@ static struct alc_config_preset alc880_presets[] = { | |||
3755 | .channel_mode = alc880_2_jack_modes, | 3921 | .channel_mode = alc880_2_jack_modes, |
3756 | .input_mux = &alc880_f1734_capture_source, | 3922 | .input_mux = &alc880_f1734_capture_source, |
3757 | .unsol_event = alc880_uniwill_p53_unsol_event, | 3923 | .unsol_event = alc880_uniwill_p53_unsol_event, |
3758 | .init_hook = alc880_uniwill_p53_hp_automute, | 3924 | .init_hook = alc880_uniwill_p53_init_hook, |
3759 | }, | 3925 | }, |
3760 | [ALC880_ASUS] = { | 3926 | [ALC880_ASUS] = { |
3761 | .mixers = { alc880_asus_mixer }, | 3927 | .mixers = { alc880_asus_mixer }, |
@@ -3832,7 +3998,7 @@ static struct alc_config_preset alc880_presets[] = { | |||
3832 | .need_dac_fix = 1, | 3998 | .need_dac_fix = 1, |
3833 | .input_mux = &alc880_capture_source, | 3999 | .input_mux = &alc880_capture_source, |
3834 | .unsol_event = alc880_uniwill_unsol_event, | 4000 | .unsol_event = alc880_uniwill_unsol_event, |
3835 | .init_hook = alc880_uniwill_automute, | 4001 | .init_hook = alc880_uniwill_init_hook, |
3836 | }, | 4002 | }, |
3837 | [ALC880_UNIWILL_P53] = { | 4003 | [ALC880_UNIWILL_P53] = { |
3838 | .mixers = { alc880_uniwill_p53_mixer }, | 4004 | .mixers = { alc880_uniwill_p53_mixer }, |
@@ -3844,7 +4010,7 @@ static struct alc_config_preset alc880_presets[] = { | |||
3844 | .channel_mode = alc880_threestack_modes, | 4010 | .channel_mode = alc880_threestack_modes, |
3845 | .input_mux = &alc880_capture_source, | 4011 | .input_mux = &alc880_capture_source, |
3846 | .unsol_event = alc880_uniwill_p53_unsol_event, | 4012 | .unsol_event = alc880_uniwill_p53_unsol_event, |
3847 | .init_hook = alc880_uniwill_p53_hp_automute, | 4013 | .init_hook = alc880_uniwill_p53_init_hook, |
3848 | }, | 4014 | }, |
3849 | [ALC880_FUJITSU] = { | 4015 | [ALC880_FUJITSU] = { |
3850 | .mixers = { alc880_fujitsu_mixer }, | 4016 | .mixers = { alc880_fujitsu_mixer }, |
@@ -3858,7 +4024,7 @@ static struct alc_config_preset alc880_presets[] = { | |||
3858 | .channel_mode = alc880_2_jack_modes, | 4024 | .channel_mode = alc880_2_jack_modes, |
3859 | .input_mux = &alc880_capture_source, | 4025 | .input_mux = &alc880_capture_source, |
3860 | .unsol_event = alc880_uniwill_p53_unsol_event, | 4026 | .unsol_event = alc880_uniwill_p53_unsol_event, |
3861 | .init_hook = alc880_uniwill_p53_hp_automute, | 4027 | .init_hook = alc880_uniwill_p53_init_hook, |
3862 | }, | 4028 | }, |
3863 | [ALC880_CLEVO] = { | 4029 | [ALC880_CLEVO] = { |
3864 | .mixers = { alc880_three_stack_mixer }, | 4030 | .mixers = { alc880_three_stack_mixer }, |
@@ -3883,8 +4049,8 @@ static struct alc_config_preset alc880_presets[] = { | |||
3883 | .channel_mode = alc880_lg_ch_modes, | 4049 | .channel_mode = alc880_lg_ch_modes, |
3884 | .need_dac_fix = 1, | 4050 | .need_dac_fix = 1, |
3885 | .input_mux = &alc880_lg_capture_source, | 4051 | .input_mux = &alc880_lg_capture_source, |
3886 | .unsol_event = alc880_lg_unsol_event, | 4052 | .unsol_event = alc_automute_amp_unsol_event, |
3887 | .init_hook = alc880_lg_automute, | 4053 | .init_hook = alc880_lg_init_hook, |
3888 | #ifdef CONFIG_SND_HDA_POWER_SAVE | 4054 | #ifdef CONFIG_SND_HDA_POWER_SAVE |
3889 | .loopbacks = alc880_lg_loopbacks, | 4055 | .loopbacks = alc880_lg_loopbacks, |
3890 | #endif | 4056 | #endif |
@@ -3899,8 +4065,8 @@ static struct alc_config_preset alc880_presets[] = { | |||
3899 | .num_channel_mode = ARRAY_SIZE(alc880_lg_lw_modes), | 4065 | .num_channel_mode = ARRAY_SIZE(alc880_lg_lw_modes), |
3900 | .channel_mode = alc880_lg_lw_modes, | 4066 | .channel_mode = alc880_lg_lw_modes, |
3901 | .input_mux = &alc880_lg_lw_capture_source, | 4067 | .input_mux = &alc880_lg_lw_capture_source, |
3902 | .unsol_event = alc880_lg_lw_unsol_event, | 4068 | .unsol_event = alc_automute_amp_unsol_event, |
3903 | .init_hook = alc880_lg_lw_automute, | 4069 | .init_hook = alc880_lg_lw_init_hook, |
3904 | }, | 4070 | }, |
3905 | [ALC880_MEDION_RIM] = { | 4071 | [ALC880_MEDION_RIM] = { |
3906 | .mixers = { alc880_medion_rim_mixer }, | 4072 | .mixers = { alc880_medion_rim_mixer }, |
@@ -3914,7 +4080,7 @@ static struct alc_config_preset alc880_presets[] = { | |||
3914 | .channel_mode = alc880_2_jack_modes, | 4080 | .channel_mode = alc880_2_jack_modes, |
3915 | .input_mux = &alc880_medion_rim_capture_source, | 4081 | .input_mux = &alc880_medion_rim_capture_source, |
3916 | .unsol_event = alc880_medion_rim_unsol_event, | 4082 | .unsol_event = alc880_medion_rim_unsol_event, |
3917 | .init_hook = alc880_medion_rim_automute, | 4083 | .init_hook = alc880_medion_rim_init_hook, |
3918 | }, | 4084 | }, |
3919 | #ifdef CONFIG_SND_DEBUG | 4085 | #ifdef CONFIG_SND_DEBUG |
3920 | [ALC880_TEST] = { | 4086 | [ALC880_TEST] = { |
@@ -4199,7 +4365,6 @@ static void alc880_auto_init_multi_out(struct hda_codec *codec) | |||
4199 | struct alc_spec *spec = codec->spec; | 4365 | struct alc_spec *spec = codec->spec; |
4200 | int i; | 4366 | int i; |
4201 | 4367 | ||
4202 | alc_subsystem_id(codec, 0x15, 0x1b, 0x14); | ||
4203 | for (i = 0; i < spec->autocfg.line_outs; i++) { | 4368 | for (i = 0; i < spec->autocfg.line_outs; i++) { |
4204 | hda_nid_t nid = spec->autocfg.line_out_pins[i]; | 4369 | hda_nid_t nid = spec->autocfg.line_out_pins[i]; |
4205 | int pin_type = get_pin_type(spec->autocfg.line_out_type); | 4370 | int pin_type = get_pin_type(spec->autocfg.line_out_type); |
@@ -4304,6 +4469,8 @@ static int alc880_parse_auto_config(struct hda_codec *codec) | |||
4304 | spec->num_mux_defs = 1; | 4469 | spec->num_mux_defs = 1; |
4305 | spec->input_mux = &spec->private_imux[0]; | 4470 | spec->input_mux = &spec->private_imux[0]; |
4306 | 4471 | ||
4472 | alc_ssid_check(codec, 0x15, 0x1b, 0x14); | ||
4473 | |||
4307 | return 1; | 4474 | return 1; |
4308 | } | 4475 | } |
4309 | 4476 | ||
@@ -4361,8 +4528,8 @@ static int patch_alc880(struct hda_codec *codec) | |||
4361 | alc880_models, | 4528 | alc880_models, |
4362 | alc880_cfg_tbl); | 4529 | alc880_cfg_tbl); |
4363 | if (board_config < 0) { | 4530 | if (board_config < 0) { |
4364 | printk(KERN_INFO "hda_codec: Unknown model for ALC880, " | 4531 | printk(KERN_INFO "hda_codec: Unknown model for %s, " |
4365 | "trying auto-probe from BIOS...\n"); | 4532 | "trying auto-probe from BIOS...\n", codec->chip_name); |
4366 | board_config = ALC880_AUTO; | 4533 | board_config = ALC880_AUTO; |
4367 | } | 4534 | } |
4368 | 4535 | ||
@@ -4389,12 +4556,10 @@ static int patch_alc880(struct hda_codec *codec) | |||
4389 | if (board_config != ALC880_AUTO) | 4556 | if (board_config != ALC880_AUTO) |
4390 | setup_preset(spec, &alc880_presets[board_config]); | 4557 | setup_preset(spec, &alc880_presets[board_config]); |
4391 | 4558 | ||
4392 | spec->stream_name_analog = "ALC880 Analog"; | ||
4393 | spec->stream_analog_playback = &alc880_pcm_analog_playback; | 4559 | spec->stream_analog_playback = &alc880_pcm_analog_playback; |
4394 | spec->stream_analog_capture = &alc880_pcm_analog_capture; | 4560 | spec->stream_analog_capture = &alc880_pcm_analog_capture; |
4395 | spec->stream_analog_alt_capture = &alc880_pcm_analog_alt_capture; | 4561 | spec->stream_analog_alt_capture = &alc880_pcm_analog_alt_capture; |
4396 | 4562 | ||
4397 | spec->stream_name_digital = "ALC880 Digital"; | ||
4398 | spec->stream_digital_playback = &alc880_pcm_digital_playback; | 4563 | spec->stream_digital_playback = &alc880_pcm_digital_playback; |
4399 | spec->stream_digital_capture = &alc880_pcm_digital_capture; | 4564 | spec->stream_digital_capture = &alc880_pcm_digital_capture; |
4400 | 4565 | ||
@@ -5679,7 +5844,6 @@ static void alc260_auto_init_multi_out(struct hda_codec *codec) | |||
5679 | struct alc_spec *spec = codec->spec; | 5844 | struct alc_spec *spec = codec->spec; |
5680 | hda_nid_t nid; | 5845 | hda_nid_t nid; |
5681 | 5846 | ||
5682 | alc_subsystem_id(codec, 0x10, 0x15, 0x0f); | ||
5683 | nid = spec->autocfg.line_out_pins[0]; | 5847 | nid = spec->autocfg.line_out_pins[0]; |
5684 | if (nid) { | 5848 | if (nid) { |
5685 | int pin_type = get_pin_type(spec->autocfg.line_out_type); | 5849 | int pin_type = get_pin_type(spec->autocfg.line_out_type); |
@@ -5789,6 +5953,8 @@ static int alc260_parse_auto_config(struct hda_codec *codec) | |||
5789 | spec->num_mux_defs = 1; | 5953 | spec->num_mux_defs = 1; |
5790 | spec->input_mux = &spec->private_imux[0]; | 5954 | spec->input_mux = &spec->private_imux[0]; |
5791 | 5955 | ||
5956 | alc_ssid_check(codec, 0x10, 0x15, 0x0f); | ||
5957 | |||
5792 | return 1; | 5958 | return 1; |
5793 | } | 5959 | } |
5794 | 5960 | ||
@@ -6006,8 +6172,9 @@ static int patch_alc260(struct hda_codec *codec) | |||
6006 | alc260_models, | 6172 | alc260_models, |
6007 | alc260_cfg_tbl); | 6173 | alc260_cfg_tbl); |
6008 | if (board_config < 0) { | 6174 | if (board_config < 0) { |
6009 | snd_printd(KERN_INFO "hda_codec: Unknown model for ALC260, " | 6175 | snd_printd(KERN_INFO "hda_codec: Unknown model for %s, " |
6010 | "trying auto-probe from BIOS...\n"); | 6176 | "trying auto-probe from BIOS...\n", |
6177 | codec->chip_name); | ||
6011 | board_config = ALC260_AUTO; | 6178 | board_config = ALC260_AUTO; |
6012 | } | 6179 | } |
6013 | 6180 | ||
@@ -6034,11 +6201,9 @@ static int patch_alc260(struct hda_codec *codec) | |||
6034 | if (board_config != ALC260_AUTO) | 6201 | if (board_config != ALC260_AUTO) |
6035 | setup_preset(spec, &alc260_presets[board_config]); | 6202 | setup_preset(spec, &alc260_presets[board_config]); |
6036 | 6203 | ||
6037 | spec->stream_name_analog = "ALC260 Analog"; | ||
6038 | spec->stream_analog_playback = &alc260_pcm_analog_playback; | 6204 | spec->stream_analog_playback = &alc260_pcm_analog_playback; |
6039 | spec->stream_analog_capture = &alc260_pcm_analog_capture; | 6205 | spec->stream_analog_capture = &alc260_pcm_analog_capture; |
6040 | 6206 | ||
6041 | spec->stream_name_digital = "ALC260 Digital"; | ||
6042 | spec->stream_digital_playback = &alc260_pcm_digital_playback; | 6207 | spec->stream_digital_playback = &alc260_pcm_digital_playback; |
6043 | spec->stream_digital_capture = &alc260_pcm_digital_capture; | 6208 | spec->stream_digital_capture = &alc260_pcm_digital_capture; |
6044 | 6209 | ||
@@ -6115,6 +6280,16 @@ static struct hda_input_mux alc882_capture_source = { | |||
6115 | { "CD", 0x4 }, | 6280 | { "CD", 0x4 }, |
6116 | }, | 6281 | }, |
6117 | }; | 6282 | }; |
6283 | |||
6284 | static struct hda_input_mux mb5_capture_source = { | ||
6285 | .num_items = 3, | ||
6286 | .items = { | ||
6287 | { "Mic", 0x1 }, | ||
6288 | { "Line", 0x2 }, | ||
6289 | { "CD", 0x4 }, | ||
6290 | }, | ||
6291 | }; | ||
6292 | |||
6118 | /* | 6293 | /* |
6119 | * 2ch mode | 6294 | * 2ch mode |
6120 | */ | 6295 | */ |
@@ -6202,6 +6377,34 @@ static struct hda_channel_mode alc885_mbp_6ch_modes[2] = { | |||
6202 | { 6, alc885_mbp_ch6_init }, | 6377 | { 6, alc885_mbp_ch6_init }, |
6203 | }; | 6378 | }; |
6204 | 6379 | ||
6380 | /* | ||
6381 | * 2ch | ||
6382 | * Speakers/Woofer/HP = Front | ||
6383 | * LineIn = Input | ||
6384 | */ | ||
6385 | static struct hda_verb alc885_mb5_ch2_init[] = { | ||
6386 | {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, | ||
6387 | {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, | ||
6388 | { } /* end */ | ||
6389 | }; | ||
6390 | |||
6391 | /* | ||
6392 | * 6ch mode | ||
6393 | * Speakers/HP = Front | ||
6394 | * Woofer = LFE | ||
6395 | * LineIn = Surround | ||
6396 | */ | ||
6397 | static struct hda_verb alc885_mb5_ch6_init[] = { | ||
6398 | {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, | ||
6399 | {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | ||
6400 | {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, | ||
6401 | { } /* end */ | ||
6402 | }; | ||
6403 | |||
6404 | static struct hda_channel_mode alc885_mb5_6ch_modes[2] = { | ||
6405 | { 2, alc885_mb5_ch2_init }, | ||
6406 | { 6, alc885_mb5_ch6_init }, | ||
6407 | }; | ||
6205 | 6408 | ||
6206 | /* Pin assignment: Front=0x14, Rear=0x15, CLFE=0x16, Side=0x17 | 6409 | /* Pin assignment: Front=0x14, Rear=0x15, CLFE=0x16, Side=0x17 |
6207 | * Mic=0x18, Front Mic=0x19, Line-In=0x1a, HP=0x1b | 6410 | * Mic=0x18, Front Mic=0x19, Line-In=0x1a, HP=0x1b |
@@ -6244,6 +6447,25 @@ static struct snd_kcontrol_new alc885_mbp3_mixer[] = { | |||
6244 | HDA_CODEC_VOLUME("Mic Boost", 0x18, 0x00, HDA_INPUT), | 6447 | HDA_CODEC_VOLUME("Mic Boost", 0x18, 0x00, HDA_INPUT), |
6245 | { } /* end */ | 6448 | { } /* end */ |
6246 | }; | 6449 | }; |
6450 | |||
6451 | static struct snd_kcontrol_new alc885_mb5_mixer[] = { | ||
6452 | HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x00, HDA_OUTPUT), | ||
6453 | HDA_BIND_MUTE ("Front Playback Switch", 0x0c, 0x02, HDA_INPUT), | ||
6454 | HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x00, HDA_OUTPUT), | ||
6455 | HDA_BIND_MUTE ("Surround Playback Switch", 0x0d, 0x02, HDA_INPUT), | ||
6456 | HDA_CODEC_VOLUME("LFE Playback Volume", 0x0e, 0x00, HDA_OUTPUT), | ||
6457 | HDA_BIND_MUTE ("LFE Playback Switch", 0x0e, 0x02, HDA_INPUT), | ||
6458 | HDA_CODEC_VOLUME("HP Playback Volume", 0x0f, 0x00, HDA_OUTPUT), | ||
6459 | HDA_BIND_MUTE ("HP Playback Switch", 0x0f, 0x02, HDA_INPUT), | ||
6460 | HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), | ||
6461 | HDA_CODEC_MUTE ("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), | ||
6462 | HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x01, HDA_INPUT), | ||
6463 | HDA_CODEC_MUTE ("Mic Playback Switch", 0x0b, 0x01, HDA_INPUT), | ||
6464 | HDA_CODEC_VOLUME("Line Boost", 0x15, 0x00, HDA_INPUT), | ||
6465 | HDA_CODEC_VOLUME("Mic Boost", 0x19, 0x00, HDA_INPUT), | ||
6466 | { } /* end */ | ||
6467 | }; | ||
6468 | |||
6247 | static struct snd_kcontrol_new alc882_w2jc_mixer[] = { | 6469 | static struct snd_kcontrol_new alc882_w2jc_mixer[] = { |
6248 | HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), | 6470 | HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), |
6249 | HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), | 6471 | HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), |
@@ -6471,6 +6693,55 @@ static struct hda_verb alc882_macpro_init_verbs[] = { | |||
6471 | { } | 6693 | { } |
6472 | }; | 6694 | }; |
6473 | 6695 | ||
6696 | /* Macbook 5,1 */ | ||
6697 | static struct hda_verb alc885_mb5_init_verbs[] = { | ||
6698 | /* DACs */ | ||
6699 | {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | ||
6700 | {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | ||
6701 | {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | ||
6702 | {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | ||
6703 | /* Front mixer */ | ||
6704 | {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, | ||
6705 | {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, | ||
6706 | {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, | ||
6707 | /* Surround mixer */ | ||
6708 | {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, | ||
6709 | {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, | ||
6710 | {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, | ||
6711 | /* LFE mixer */ | ||
6712 | {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, | ||
6713 | {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, | ||
6714 | {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, | ||
6715 | /* HP mixer */ | ||
6716 | {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, | ||
6717 | {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, | ||
6718 | {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, | ||
6719 | /* Front Pin (0x0c) */ | ||
6720 | {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | 0x01}, | ||
6721 | {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | ||
6722 | {0x18, AC_VERB_SET_CONNECT_SEL, 0x00}, | ||
6723 | /* LFE Pin (0x0e) */ | ||
6724 | {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | 0x01}, | ||
6725 | {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | ||
6726 | {0x1a, AC_VERB_SET_CONNECT_SEL, 0x02}, | ||
6727 | /* HP Pin (0x0f) */ | ||
6728 | {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, | ||
6729 | {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | ||
6730 | {0x14, AC_VERB_SET_CONNECT_SEL, 0x03}, | ||
6731 | /* Front Mic pin: input vref at 80% */ | ||
6732 | {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, | ||
6733 | {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, | ||
6734 | /* Line In pin */ | ||
6735 | {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, | ||
6736 | {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, | ||
6737 | |||
6738 | {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, | ||
6739 | {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, | ||
6740 | {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, | ||
6741 | {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, | ||
6742 | { } | ||
6743 | }; | ||
6744 | |||
6474 | /* Macbook Pro rev3 */ | 6745 | /* Macbook Pro rev3 */ |
6475 | static struct hda_verb alc885_mbp3_init_verbs[] = { | 6746 | static struct hda_verb alc885_mbp3_init_verbs[] = { |
6476 | /* Front mixer: unmute input/output amp left and right (volume = 0) */ | 6747 | /* Front mixer: unmute input/output amp left and right (volume = 0) */ |
@@ -6560,45 +6831,23 @@ static struct hda_verb alc885_imac24_init_verbs[] = { | |||
6560 | }; | 6831 | }; |
6561 | 6832 | ||
6562 | /* Toggle speaker-output according to the hp-jack state */ | 6833 | /* Toggle speaker-output according to the hp-jack state */ |
6563 | static void alc885_imac24_automute(struct hda_codec *codec) | 6834 | static void alc885_imac24_automute_init_hook(struct hda_codec *codec) |
6564 | { | 6835 | { |
6565 | unsigned int present; | 6836 | struct alc_spec *spec = codec->spec; |
6566 | |||
6567 | present = snd_hda_codec_read(codec, 0x14, 0, | ||
6568 | AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; | ||
6569 | snd_hda_codec_amp_stereo(codec, 0x18, HDA_OUTPUT, 0, | ||
6570 | HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0); | ||
6571 | snd_hda_codec_amp_stereo(codec, 0x1a, HDA_OUTPUT, 0, | ||
6572 | HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0); | ||
6573 | } | ||
6574 | 6837 | ||
6575 | /* Processes unsolicited events. */ | 6838 | spec->autocfg.hp_pins[0] = 0x14; |
6576 | static void alc885_imac24_unsol_event(struct hda_codec *codec, | 6839 | spec->autocfg.speaker_pins[0] = 0x18; |
6577 | unsigned int res) | 6840 | spec->autocfg.speaker_pins[1] = 0x1a; |
6578 | { | 6841 | alc_automute_amp(codec); |
6579 | /* Headphone insertion or removal. */ | ||
6580 | if ((res >> 26) == ALC880_HP_EVENT) | ||
6581 | alc885_imac24_automute(codec); | ||
6582 | } | 6842 | } |
6583 | 6843 | ||
6584 | static void alc885_mbp3_automute(struct hda_codec *codec) | 6844 | static void alc885_mbp3_init_hook(struct hda_codec *codec) |
6585 | { | 6845 | { |
6586 | unsigned int present; | 6846 | struct alc_spec *spec = codec->spec; |
6587 | |||
6588 | present = snd_hda_codec_read(codec, 0x15, 0, | ||
6589 | AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; | ||
6590 | snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0, | ||
6591 | HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0); | ||
6592 | snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0, | ||
6593 | HDA_AMP_MUTE, present ? 0 : HDA_AMP_MUTE); | ||
6594 | 6847 | ||
6595 | } | 6848 | spec->autocfg.hp_pins[0] = 0x15; |
6596 | static void alc885_mbp3_unsol_event(struct hda_codec *codec, | 6849 | spec->autocfg.speaker_pins[0] = 0x14; |
6597 | unsigned int res) | 6850 | alc_automute_amp(codec); |
6598 | { | ||
6599 | /* Headphone insertion or removal. */ | ||
6600 | if ((res >> 26) == ALC880_HP_EVENT) | ||
6601 | alc885_mbp3_automute(codec); | ||
6602 | } | 6851 | } |
6603 | 6852 | ||
6604 | 6853 | ||
@@ -6623,24 +6872,25 @@ static struct hda_verb alc882_targa_verbs[] = { | |||
6623 | /* toggle speaker-output according to the hp-jack state */ | 6872 | /* toggle speaker-output according to the hp-jack state */ |
6624 | static void alc882_targa_automute(struct hda_codec *codec) | 6873 | static void alc882_targa_automute(struct hda_codec *codec) |
6625 | { | 6874 | { |
6626 | unsigned int present; | 6875 | struct alc_spec *spec = codec->spec; |
6627 | 6876 | alc_automute_amp(codec); | |
6628 | present = snd_hda_codec_read(codec, 0x14, 0, | ||
6629 | AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; | ||
6630 | snd_hda_codec_amp_stereo(codec, 0x1b, HDA_OUTPUT, 0, | ||
6631 | HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0); | ||
6632 | snd_hda_codec_write_cache(codec, 1, 0, AC_VERB_SET_GPIO_DATA, | 6877 | snd_hda_codec_write_cache(codec, 1, 0, AC_VERB_SET_GPIO_DATA, |
6633 | present ? 1 : 3); | 6878 | spec->jack_present ? 1 : 3); |
6879 | } | ||
6880 | |||
6881 | static void alc882_targa_init_hook(struct hda_codec *codec) | ||
6882 | { | ||
6883 | struct alc_spec *spec = codec->spec; | ||
6884 | |||
6885 | spec->autocfg.hp_pins[0] = 0x14; | ||
6886 | spec->autocfg.speaker_pins[0] = 0x1b; | ||
6887 | alc882_targa_automute(codec); | ||
6634 | } | 6888 | } |
6635 | 6889 | ||
6636 | static void alc882_targa_unsol_event(struct hda_codec *codec, unsigned int res) | 6890 | static void alc882_targa_unsol_event(struct hda_codec *codec, unsigned int res) |
6637 | { | 6891 | { |
6638 | /* Looks like the unsol event is incompatible with the standard | 6892 | if ((res >> 26) == ALC880_HP_EVENT) |
6639 | * definition. 4bit tag is placed at 26 bit! | ||
6640 | */ | ||
6641 | if (((res >> 26) == ALC880_HP_EVENT)) { | ||
6642 | alc882_targa_automute(codec); | 6893 | alc882_targa_automute(codec); |
6643 | } | ||
6644 | } | 6894 | } |
6645 | 6895 | ||
6646 | static struct hda_verb alc882_asus_a7j_verbs[] = { | 6896 | static struct hda_verb alc882_asus_a7j_verbs[] = { |
@@ -6722,7 +6972,7 @@ static void alc885_macpro_init_hook(struct hda_codec *codec) | |||
6722 | static void alc885_imac24_init_hook(struct hda_codec *codec) | 6972 | static void alc885_imac24_init_hook(struct hda_codec *codec) |
6723 | { | 6973 | { |
6724 | alc885_macpro_init_hook(codec); | 6974 | alc885_macpro_init_hook(codec); |
6725 | alc885_imac24_automute(codec); | 6975 | alc885_imac24_automute_init_hook(codec); |
6726 | } | 6976 | } |
6727 | 6977 | ||
6728 | /* | 6978 | /* |
@@ -6815,6 +7065,7 @@ static const char *alc882_models[ALC882_MODEL_LAST] = { | |||
6815 | [ALC882_ASUS_A7J] = "asus-a7j", | 7065 | [ALC882_ASUS_A7J] = "asus-a7j", |
6816 | [ALC882_ASUS_A7M] = "asus-a7m", | 7066 | [ALC882_ASUS_A7M] = "asus-a7m", |
6817 | [ALC885_MACPRO] = "macpro", | 7067 | [ALC885_MACPRO] = "macpro", |
7068 | [ALC885_MB5] = "mb5", | ||
6818 | [ALC885_MBP3] = "mbp3", | 7069 | [ALC885_MBP3] = "mbp3", |
6819 | [ALC885_IMAC24] = "imac24", | 7070 | [ALC885_IMAC24] = "imac24", |
6820 | [ALC882_AUTO] = "auto", | 7071 | [ALC882_AUTO] = "auto", |
@@ -6892,8 +7143,20 @@ static struct alc_config_preset alc882_presets[] = { | |||
6892 | .input_mux = &alc882_capture_source, | 7143 | .input_mux = &alc882_capture_source, |
6893 | .dig_out_nid = ALC882_DIGOUT_NID, | 7144 | .dig_out_nid = ALC882_DIGOUT_NID, |
6894 | .dig_in_nid = ALC882_DIGIN_NID, | 7145 | .dig_in_nid = ALC882_DIGIN_NID, |
6895 | .unsol_event = alc885_mbp3_unsol_event, | 7146 | .unsol_event = alc_automute_amp_unsol_event, |
6896 | .init_hook = alc885_mbp3_automute, | 7147 | .init_hook = alc885_mbp3_init_hook, |
7148 | }, | ||
7149 | [ALC885_MB5] = { | ||
7150 | .mixers = { alc885_mb5_mixer, alc882_chmode_mixer }, | ||
7151 | .init_verbs = { alc885_mb5_init_verbs, | ||
7152 | alc880_gpio1_init_verbs }, | ||
7153 | .num_dacs = ARRAY_SIZE(alc882_dac_nids), | ||
7154 | .dac_nids = alc882_dac_nids, | ||
7155 | .channel_mode = alc885_mb5_6ch_modes, | ||
7156 | .num_channel_mode = ARRAY_SIZE(alc885_mb5_6ch_modes), | ||
7157 | .input_mux = &mb5_capture_source, | ||
7158 | .dig_out_nid = ALC882_DIGOUT_NID, | ||
7159 | .dig_in_nid = ALC882_DIGIN_NID, | ||
6897 | }, | 7160 | }, |
6898 | [ALC885_MACPRO] = { | 7161 | [ALC885_MACPRO] = { |
6899 | .mixers = { alc882_macpro_mixer }, | 7162 | .mixers = { alc882_macpro_mixer }, |
@@ -6917,7 +7180,7 @@ static struct alc_config_preset alc882_presets[] = { | |||
6917 | .num_channel_mode = ARRAY_SIZE(alc882_ch_modes), | 7180 | .num_channel_mode = ARRAY_SIZE(alc882_ch_modes), |
6918 | .channel_mode = alc882_ch_modes, | 7181 | .channel_mode = alc882_ch_modes, |
6919 | .input_mux = &alc882_capture_source, | 7182 | .input_mux = &alc882_capture_source, |
6920 | .unsol_event = alc885_imac24_unsol_event, | 7183 | .unsol_event = alc_automute_amp_unsol_event, |
6921 | .init_hook = alc885_imac24_init_hook, | 7184 | .init_hook = alc885_imac24_init_hook, |
6922 | }, | 7185 | }, |
6923 | [ALC882_TARGA] = { | 7186 | [ALC882_TARGA] = { |
@@ -6934,7 +7197,7 @@ static struct alc_config_preset alc882_presets[] = { | |||
6934 | .need_dac_fix = 1, | 7197 | .need_dac_fix = 1, |
6935 | .input_mux = &alc882_capture_source, | 7198 | .input_mux = &alc882_capture_source, |
6936 | .unsol_event = alc882_targa_unsol_event, | 7199 | .unsol_event = alc882_targa_unsol_event, |
6937 | .init_hook = alc882_targa_automute, | 7200 | .init_hook = alc882_targa_init_hook, |
6938 | }, | 7201 | }, |
6939 | [ALC882_ASUS_A7J] = { | 7202 | [ALC882_ASUS_A7J] = { |
6940 | .mixers = { alc882_asus_a7j_mixer, alc882_chmode_mixer }, | 7203 | .mixers = { alc882_asus_a7j_mixer, alc882_chmode_mixer }, |
@@ -7014,7 +7277,6 @@ static void alc882_auto_init_multi_out(struct hda_codec *codec) | |||
7014 | struct alc_spec *spec = codec->spec; | 7277 | struct alc_spec *spec = codec->spec; |
7015 | int i; | 7278 | int i; |
7016 | 7279 | ||
7017 | alc_subsystem_id(codec, 0x15, 0x1b, 0x14); | ||
7018 | for (i = 0; i <= HDA_SIDE; i++) { | 7280 | for (i = 0; i <= HDA_SIDE; i++) { |
7019 | hda_nid_t nid = spec->autocfg.line_out_pins[i]; | 7281 | hda_nid_t nid = spec->autocfg.line_out_pins[i]; |
7020 | int pin_type = get_pin_type(spec->autocfg.line_out_type); | 7282 | int pin_type = get_pin_type(spec->autocfg.line_out_type); |
@@ -7197,10 +7459,17 @@ static int patch_alc882(struct hda_codec *codec) | |||
7197 | case 0x106b00a1: /* Macbook (might be wrong - PCI SSID?) */ | 7459 | case 0x106b00a1: /* Macbook (might be wrong - PCI SSID?) */ |
7198 | case 0x106b00a4: /* MacbookPro4,1 */ | 7460 | case 0x106b00a4: /* MacbookPro4,1 */ |
7199 | case 0x106b2c00: /* Macbook Pro rev3 */ | 7461 | case 0x106b2c00: /* Macbook Pro rev3 */ |
7200 | case 0x106b3600: /* Macbook 3.1 */ | 7462 | /* Macbook 3.1 (0x106b3600) is handled by patch_alc883() */ |
7201 | case 0x106b3800: /* MacbookPro4,1 - latter revision */ | 7463 | case 0x106b3800: /* MacbookPro4,1 - latter revision */ |
7202 | board_config = ALC885_MBP3; | 7464 | board_config = ALC885_MBP3; |
7203 | break; | 7465 | break; |
7466 | case 0x106b3f00: /* Macbook 5,1 */ | ||
7467 | case 0x106b4000: /* Macbook Pro 5,1 - FIXME: HP jack sense | ||
7468 | * seems not working, so apparently | ||
7469 | * no perfect solution yet | ||
7470 | */ | ||
7471 | board_config = ALC885_MB5; | ||
7472 | break; | ||
7204 | default: | 7473 | default: |
7205 | /* ALC889A is handled better as ALC888-compatible */ | 7474 | /* ALC889A is handled better as ALC888-compatible */ |
7206 | if (codec->revision_id == 0x100101 || | 7475 | if (codec->revision_id == 0x100101 || |
@@ -7208,8 +7477,9 @@ static int patch_alc882(struct hda_codec *codec) | |||
7208 | alc_free(codec); | 7477 | alc_free(codec); |
7209 | return patch_alc883(codec); | 7478 | return patch_alc883(codec); |
7210 | } | 7479 | } |
7211 | printk(KERN_INFO "hda_codec: Unknown model for ALC882, " | 7480 | printk(KERN_INFO "hda_codec: Unknown model for %s, " |
7212 | "trying auto-probe from BIOS...\n"); | 7481 | "trying auto-probe from BIOS...\n", |
7482 | codec->chip_name); | ||
7213 | board_config = ALC882_AUTO; | 7483 | board_config = ALC882_AUTO; |
7214 | } | 7484 | } |
7215 | } | 7485 | } |
@@ -7239,14 +7509,6 @@ static int patch_alc882(struct hda_codec *codec) | |||
7239 | if (board_config != ALC882_AUTO) | 7509 | if (board_config != ALC882_AUTO) |
7240 | setup_preset(spec, &alc882_presets[board_config]); | 7510 | setup_preset(spec, &alc882_presets[board_config]); |
7241 | 7511 | ||
7242 | if (codec->vendor_id == 0x10ec0885) { | ||
7243 | spec->stream_name_analog = "ALC885 Analog"; | ||
7244 | spec->stream_name_digital = "ALC885 Digital"; | ||
7245 | } else { | ||
7246 | spec->stream_name_analog = "ALC882 Analog"; | ||
7247 | spec->stream_name_digital = "ALC882 Digital"; | ||
7248 | } | ||
7249 | |||
7250 | spec->stream_analog_playback = &alc882_pcm_analog_playback; | 7512 | spec->stream_analog_playback = &alc882_pcm_analog_playback; |
7251 | spec->stream_analog_capture = &alc882_pcm_analog_capture; | 7513 | spec->stream_analog_capture = &alc882_pcm_analog_capture; |
7252 | /* FIXME: setup DAC5 */ | 7514 | /* FIXME: setup DAC5 */ |
@@ -7399,6 +7661,17 @@ static struct hda_input_mux alc883_asus_eee1601_capture_source = { | |||
7399 | }, | 7661 | }, |
7400 | }; | 7662 | }; |
7401 | 7663 | ||
7664 | static struct hda_input_mux alc889A_mb31_capture_source = { | ||
7665 | .num_items = 2, | ||
7666 | .items = { | ||
7667 | { "Mic", 0x0 }, | ||
7668 | /* Front Mic (0x01) unused */ | ||
7669 | { "Line", 0x2 }, | ||
7670 | /* Line 2 (0x03) unused */ | ||
7671 | /* CD (0x04) unsused? */ | ||
7672 | }, | ||
7673 | }; | ||
7674 | |||
7402 | /* | 7675 | /* |
7403 | * 2ch mode | 7676 | * 2ch mode |
7404 | */ | 7677 | */ |
@@ -7448,6 +7721,73 @@ static struct hda_channel_mode alc883_3ST_6ch_modes[3] = { | |||
7448 | { 6, alc883_3ST_ch6_init }, | 7721 | { 6, alc883_3ST_ch6_init }, |
7449 | }; | 7722 | }; |
7450 | 7723 | ||
7724 | |||
7725 | /* | ||
7726 | * 2ch mode | ||
7727 | */ | ||
7728 | static struct hda_verb alc883_4ST_ch2_init[] = { | ||
7729 | { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, | ||
7730 | { 0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, | ||
7731 | { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, | ||
7732 | { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE }, | ||
7733 | { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN }, | ||
7734 | { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE }, | ||
7735 | { } /* end */ | ||
7736 | }; | ||
7737 | |||
7738 | /* | ||
7739 | * 4ch mode | ||
7740 | */ | ||
7741 | static struct hda_verb alc883_4ST_ch4_init[] = { | ||
7742 | { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, | ||
7743 | { 0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, | ||
7744 | { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, | ||
7745 | { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE }, | ||
7746 | { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, | ||
7747 | { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, | ||
7748 | { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 }, | ||
7749 | { } /* end */ | ||
7750 | }; | ||
7751 | |||
7752 | /* | ||
7753 | * 6ch mode | ||
7754 | */ | ||
7755 | static struct hda_verb alc883_4ST_ch6_init[] = { | ||
7756 | { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, | ||
7757 | { 0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, | ||
7758 | { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, | ||
7759 | { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, | ||
7760 | { 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 }, | ||
7761 | { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, | ||
7762 | { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, | ||
7763 | { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 }, | ||
7764 | { } /* end */ | ||
7765 | }; | ||
7766 | |||
7767 | /* | ||
7768 | * 8ch mode | ||
7769 | */ | ||
7770 | static struct hda_verb alc883_4ST_ch8_init[] = { | ||
7771 | { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, | ||
7772 | { 0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, | ||
7773 | { 0x17, AC_VERB_SET_CONNECT_SEL, 0x03 }, | ||
7774 | { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, | ||
7775 | { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, | ||
7776 | { 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 }, | ||
7777 | { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, | ||
7778 | { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, | ||
7779 | { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 }, | ||
7780 | { } /* end */ | ||
7781 | }; | ||
7782 | |||
7783 | static struct hda_channel_mode alc883_4ST_8ch_modes[4] = { | ||
7784 | { 2, alc883_4ST_ch2_init }, | ||
7785 | { 4, alc883_4ST_ch4_init }, | ||
7786 | { 6, alc883_4ST_ch6_init }, | ||
7787 | { 8, alc883_4ST_ch8_init }, | ||
7788 | }; | ||
7789 | |||
7790 | |||
7451 | /* | 7791 | /* |
7452 | * 2ch mode | 7792 | * 2ch mode |
7453 | */ | 7793 | */ |
@@ -7517,6 +7857,49 @@ static struct hda_channel_mode alc883_sixstack_modes[2] = { | |||
7517 | { 8, alc883_sixstack_ch8_init }, | 7857 | { 8, alc883_sixstack_ch8_init }, |
7518 | }; | 7858 | }; |
7519 | 7859 | ||
7860 | /* 2ch mode (Speaker:front, Subwoofer:CLFE, Line:input, Headphones:front) */ | ||
7861 | static struct hda_verb alc889A_mb31_ch2_init[] = { | ||
7862 | {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP as front */ | ||
7863 | {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Subwoofer on */ | ||
7864 | {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, /* Line as input */ | ||
7865 | {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, /* Line off */ | ||
7866 | { } /* end */ | ||
7867 | }; | ||
7868 | |||
7869 | /* 4ch mode (Speaker:front, Subwoofer:CLFE, Line:CLFE, Headphones:front) */ | ||
7870 | static struct hda_verb alc889A_mb31_ch4_init[] = { | ||
7871 | {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP as front */ | ||
7872 | {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Subwoofer on */ | ||
7873 | {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, /* Line as output */ | ||
7874 | {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Line on */ | ||
7875 | { } /* end */ | ||
7876 | }; | ||
7877 | |||
7878 | /* 5ch mode (Speaker:front, Subwoofer:CLFE, Line:input, Headphones:rear) */ | ||
7879 | static struct hda_verb alc889A_mb31_ch5_init[] = { | ||
7880 | {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, /* HP as rear */ | ||
7881 | {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Subwoofer on */ | ||
7882 | {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, /* Line as input */ | ||
7883 | {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, /* Line off */ | ||
7884 | { } /* end */ | ||
7885 | }; | ||
7886 | |||
7887 | /* 6ch mode (Speaker:front, Subwoofer:off, Line:CLFE, Headphones:Rear) */ | ||
7888 | static struct hda_verb alc889A_mb31_ch6_init[] = { | ||
7889 | {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, /* HP as front */ | ||
7890 | {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, /* Subwoofer off */ | ||
7891 | {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, /* Line as output */ | ||
7892 | {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Line on */ | ||
7893 | { } /* end */ | ||
7894 | }; | ||
7895 | |||
7896 | static struct hda_channel_mode alc889A_mb31_6ch_modes[4] = { | ||
7897 | { 2, alc889A_mb31_ch2_init }, | ||
7898 | { 4, alc889A_mb31_ch4_init }, | ||
7899 | { 5, alc889A_mb31_ch5_init }, | ||
7900 | { 6, alc889A_mb31_ch6_init }, | ||
7901 | }; | ||
7902 | |||
7520 | static struct hda_verb alc883_medion_eapd_verbs[] = { | 7903 | static struct hda_verb alc883_medion_eapd_verbs[] = { |
7521 | /* eanable EAPD on medion laptop */ | 7904 | /* eanable EAPD on medion laptop */ |
7522 | {0x20, AC_VERB_SET_COEF_INDEX, 0x07}, | 7905 | {0x20, AC_VERB_SET_COEF_INDEX, 0x07}, |
@@ -7782,8 +8165,6 @@ static struct snd_kcontrol_new alc888_lenovo_sky_mixer[] = { | |||
7782 | HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0d, 2, 2, HDA_INPUT), | 8165 | HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0d, 2, 2, HDA_INPUT), |
7783 | HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT), | 8166 | HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT), |
7784 | HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT), | 8167 | HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT), |
7785 | HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT), | ||
7786 | HDA_CODEC_MUTE("iSpeaker Playback Switch", 0x1a, 0x0, HDA_OUTPUT), | ||
7787 | HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), | 8168 | HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), |
7788 | HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), | 8169 | HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), |
7789 | HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), | 8170 | HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), |
@@ -7797,6 +8178,42 @@ static struct snd_kcontrol_new alc888_lenovo_sky_mixer[] = { | |||
7797 | { } /* end */ | 8178 | { } /* end */ |
7798 | }; | 8179 | }; |
7799 | 8180 | ||
8181 | static struct snd_kcontrol_new alc889A_mb31_mixer[] = { | ||
8182 | /* Output mixers */ | ||
8183 | HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x00, HDA_OUTPUT), | ||
8184 | HDA_BIND_MUTE("Front Playback Switch", 0x0c, 0x02, HDA_INPUT), | ||
8185 | HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x00, HDA_OUTPUT), | ||
8186 | HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 0x02, HDA_INPUT), | ||
8187 | HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x00, | ||
8188 | HDA_OUTPUT), | ||
8189 | HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 0x02, HDA_INPUT), | ||
8190 | HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x00, HDA_OUTPUT), | ||
8191 | HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 0x02, HDA_INPUT), | ||
8192 | /* Output switches */ | ||
8193 | HDA_CODEC_MUTE("Enable Speaker", 0x14, 0x00, HDA_OUTPUT), | ||
8194 | HDA_CODEC_MUTE("Enable Headphones", 0x15, 0x00, HDA_OUTPUT), | ||
8195 | HDA_CODEC_MUTE_MONO("Enable LFE", 0x16, 2, 0x00, HDA_OUTPUT), | ||
8196 | /* Boost mixers */ | ||
8197 | HDA_CODEC_VOLUME("Mic Boost", 0x18, 0x00, HDA_INPUT), | ||
8198 | HDA_CODEC_VOLUME("Line Boost", 0x1a, 0x00, HDA_INPUT), | ||
8199 | /* Input mixers */ | ||
8200 | HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x00, HDA_INPUT), | ||
8201 | HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x00, HDA_INPUT), | ||
8202 | HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), | ||
8203 | HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), | ||
8204 | { } /* end */ | ||
8205 | }; | ||
8206 | |||
8207 | static struct snd_kcontrol_new alc883_vaiott_mixer[] = { | ||
8208 | HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), | ||
8209 | HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), | ||
8210 | HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT), | ||
8211 | HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), | ||
8212 | HDA_CODEC_VOLUME("Mic Boost", 0x19, 0, HDA_INPUT), | ||
8213 | HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), | ||
8214 | { } /* end */ | ||
8215 | }; | ||
8216 | |||
7800 | static struct hda_bind_ctls alc883_bind_cap_vol = { | 8217 | static struct hda_bind_ctls alc883_bind_cap_vol = { |
7801 | .ops = &snd_hda_bind_vol, | 8218 | .ops = &snd_hda_bind_vol, |
7802 | .values = { | 8219 | .values = { |
@@ -7932,16 +8349,14 @@ static struct hda_verb alc883_init_verbs[] = { | |||
7932 | }; | 8349 | }; |
7933 | 8350 | ||
7934 | /* toggle speaker-output according to the hp-jack state */ | 8351 | /* toggle speaker-output according to the hp-jack state */ |
7935 | static void alc883_mitac_hp_automute(struct hda_codec *codec) | 8352 | static void alc883_mitac_init_hook(struct hda_codec *codec) |
7936 | { | 8353 | { |
7937 | unsigned int present; | 8354 | struct alc_spec *spec = codec->spec; |
7938 | 8355 | ||
7939 | present = snd_hda_codec_read(codec, 0x15, 0, | 8356 | spec->autocfg.hp_pins[0] = 0x15; |
7940 | AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; | 8357 | spec->autocfg.speaker_pins[0] = 0x14; |
7941 | snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0, | 8358 | spec->autocfg.speaker_pins[1] = 0x17; |
7942 | HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0); | 8359 | alc_automute_amp(codec); |
7943 | snd_hda_codec_amp_stereo(codec, 0x17, HDA_OUTPUT, 0, | ||
7944 | HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0); | ||
7945 | } | 8360 | } |
7946 | 8361 | ||
7947 | /* auto-toggle front mic */ | 8362 | /* auto-toggle front mic */ |
@@ -7958,25 +8373,6 @@ static void alc883_mitac_mic_automute(struct hda_codec *codec) | |||
7958 | } | 8373 | } |
7959 | */ | 8374 | */ |
7960 | 8375 | ||
7961 | static void alc883_mitac_automute(struct hda_codec *codec) | ||
7962 | { | ||
7963 | alc883_mitac_hp_automute(codec); | ||
7964 | /* alc883_mitac_mic_automute(codec); */ | ||
7965 | } | ||
7966 | |||
7967 | static void alc883_mitac_unsol_event(struct hda_codec *codec, | ||
7968 | unsigned int res) | ||
7969 | { | ||
7970 | switch (res >> 26) { | ||
7971 | case ALC880_HP_EVENT: | ||
7972 | alc883_mitac_hp_automute(codec); | ||
7973 | break; | ||
7974 | case ALC880_MIC_EVENT: | ||
7975 | /* alc883_mitac_mic_automute(codec); */ | ||
7976 | break; | ||
7977 | } | ||
7978 | } | ||
7979 | |||
7980 | static struct hda_verb alc883_mitac_verbs[] = { | 8376 | static struct hda_verb alc883_mitac_verbs[] = { |
7981 | /* HP */ | 8377 | /* HP */ |
7982 | {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, | 8378 | {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, |
@@ -8028,14 +8424,24 @@ static struct hda_verb alc883_tagra_verbs[] = { | |||
8028 | {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, | 8424 | {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, |
8029 | {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, | 8425 | {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, |
8030 | 8426 | ||
8031 | {0x18, AC_VERB_SET_CONNECT_SEL, 0x02}, /* mic/clfe */ | 8427 | /* Connect Line-Out side jack (SPDIF) to Side */ |
8032 | {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01}, /* line/surround */ | 8428 | {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, |
8033 | {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */ | 8429 | {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, |
8430 | {0x17, AC_VERB_SET_CONNECT_SEL, 0x03}, | ||
8431 | /* Connect Mic jack to CLFE */ | ||
8432 | {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, | ||
8433 | {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | ||
8434 | {0x18, AC_VERB_SET_CONNECT_SEL, 0x02}, | ||
8435 | /* Connect Line-in jack to Surround */ | ||
8436 | {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, | ||
8437 | {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | ||
8438 | {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01}, | ||
8439 | /* Connect HP out jack to Front */ | ||
8440 | {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, | ||
8441 | {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | ||
8442 | {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, | ||
8034 | 8443 | ||
8035 | {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, | 8444 | {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, |
8036 | {0x01, AC_VERB_SET_GPIO_MASK, 0x03}, | ||
8037 | {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x03}, | ||
8038 | {0x01, AC_VERB_SET_GPIO_DATA, 0x03}, | ||
8039 | 8445 | ||
8040 | { } /* end */ | 8446 | { } /* end */ |
8041 | }; | 8447 | }; |
@@ -8094,29 +8500,26 @@ static struct hda_verb alc888_6st_dell_verbs[] = { | |||
8094 | { } | 8500 | { } |
8095 | }; | 8501 | }; |
8096 | 8502 | ||
8097 | static void alc888_3st_hp_front_automute(struct hda_codec *codec) | 8503 | static struct hda_verb alc883_vaiott_verbs[] = { |
8098 | { | 8504 | /* HP */ |
8099 | unsigned int present, bits; | 8505 | {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, |
8506 | {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, | ||
8100 | 8507 | ||
8101 | present = snd_hda_codec_read(codec, 0x1b, 0, | 8508 | /* enable unsolicited event */ |
8102 | AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; | 8509 | {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, |
8103 | bits = present ? HDA_AMP_MUTE : 0; | 8510 | |
8104 | snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0, | 8511 | { } /* end */ |
8105 | HDA_AMP_MUTE, bits); | 8512 | }; |
8106 | snd_hda_codec_amp_stereo(codec, 0x16, HDA_OUTPUT, 0, | ||
8107 | HDA_AMP_MUTE, bits); | ||
8108 | snd_hda_codec_amp_stereo(codec, 0x18, HDA_OUTPUT, 0, | ||
8109 | HDA_AMP_MUTE, bits); | ||
8110 | } | ||
8111 | 8513 | ||
8112 | static void alc888_3st_hp_unsol_event(struct hda_codec *codec, | 8514 | static void alc888_3st_hp_init_hook(struct hda_codec *codec) |
8113 | unsigned int res) | ||
8114 | { | 8515 | { |
8115 | switch (res >> 26) { | 8516 | struct alc_spec *spec = codec->spec; |
8116 | case ALC880_HP_EVENT: | 8517 | |
8117 | alc888_3st_hp_front_automute(codec); | 8518 | spec->autocfg.hp_pins[0] = 0x1b; |
8118 | break; | 8519 | spec->autocfg.speaker_pins[0] = 0x14; |
8119 | } | 8520 | spec->autocfg.speaker_pins[1] = 0x16; |
8521 | spec->autocfg.speaker_pins[2] = 0x18; | ||
8522 | alc_automute_amp(codec); | ||
8120 | } | 8523 | } |
8121 | 8524 | ||
8122 | static struct hda_verb alc888_3st_hp_verbs[] = { | 8525 | static struct hda_verb alc888_3st_hp_verbs[] = { |
@@ -8213,56 +8616,18 @@ static struct hda_verb alc883_medion_md2_verbs[] = { | |||
8213 | }; | 8616 | }; |
8214 | 8617 | ||
8215 | /* toggle speaker-output according to the hp-jack state */ | 8618 | /* toggle speaker-output according to the hp-jack state */ |
8216 | static void alc883_medion_md2_automute(struct hda_codec *codec) | 8619 | static void alc883_medion_md2_init_hook(struct hda_codec *codec) |
8217 | { | 8620 | { |
8218 | unsigned int present; | 8621 | struct alc_spec *spec = codec->spec; |
8219 | |||
8220 | present = snd_hda_codec_read(codec, 0x14, 0, | ||
8221 | AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; | ||
8222 | snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0, | ||
8223 | HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0); | ||
8224 | } | ||
8225 | |||
8226 | static void alc883_medion_md2_unsol_event(struct hda_codec *codec, | ||
8227 | unsigned int res) | ||
8228 | { | ||
8229 | if ((res >> 26) == ALC880_HP_EVENT) | ||
8230 | alc883_medion_md2_automute(codec); | ||
8231 | } | ||
8232 | |||
8233 | /* toggle speaker-output according to the hp-jack state */ | ||
8234 | static void alc883_tagra_automute(struct hda_codec *codec) | ||
8235 | { | ||
8236 | unsigned int present; | ||
8237 | unsigned char bits; | ||
8238 | |||
8239 | present = snd_hda_codec_read(codec, 0x14, 0, | ||
8240 | AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; | ||
8241 | bits = present ? HDA_AMP_MUTE : 0; | ||
8242 | snd_hda_codec_amp_stereo(codec, 0x1b, HDA_OUTPUT, 0, | ||
8243 | HDA_AMP_MUTE, bits); | ||
8244 | snd_hda_codec_write_cache(codec, 1, 0, AC_VERB_SET_GPIO_DATA, | ||
8245 | present ? 1 : 3); | ||
8246 | } | ||
8247 | 8622 | ||
8248 | static void alc883_tagra_unsol_event(struct hda_codec *codec, unsigned int res) | 8623 | spec->autocfg.hp_pins[0] = 0x14; |
8249 | { | 8624 | spec->autocfg.speaker_pins[0] = 0x15; |
8250 | if ((res >> 26) == ALC880_HP_EVENT) | 8625 | alc_automute_amp(codec); |
8251 | alc883_tagra_automute(codec); | ||
8252 | } | 8626 | } |
8253 | 8627 | ||
8254 | /* toggle speaker-output according to the hp-jack state */ | 8628 | /* toggle speaker-output according to the hp-jack state */ |
8255 | static void alc883_clevo_m720_hp_automute(struct hda_codec *codec) | 8629 | #define alc883_tagra_init_hook alc882_targa_init_hook |
8256 | { | 8630 | #define alc883_tagra_unsol_event alc882_targa_unsol_event |
8257 | unsigned int present; | ||
8258 | unsigned char bits; | ||
8259 | |||
8260 | present = snd_hda_codec_read(codec, 0x15, 0, AC_VERB_GET_PIN_SENSE, 0) | ||
8261 | & AC_PINSENSE_PRESENCE; | ||
8262 | bits = present ? HDA_AMP_MUTE : 0; | ||
8263 | snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0, | ||
8264 | HDA_AMP_MUTE, bits); | ||
8265 | } | ||
8266 | 8631 | ||
8267 | static void alc883_clevo_m720_mic_automute(struct hda_codec *codec) | 8632 | static void alc883_clevo_m720_mic_automute(struct hda_codec *codec) |
8268 | { | 8633 | { |
@@ -8274,9 +8639,13 @@ static void alc883_clevo_m720_mic_automute(struct hda_codec *codec) | |||
8274 | HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0); | 8639 | HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0); |
8275 | } | 8640 | } |
8276 | 8641 | ||
8277 | static void alc883_clevo_m720_automute(struct hda_codec *codec) | 8642 | static void alc883_clevo_m720_init_hook(struct hda_codec *codec) |
8278 | { | 8643 | { |
8279 | alc883_clevo_m720_hp_automute(codec); | 8644 | struct alc_spec *spec = codec->spec; |
8645 | |||
8646 | spec->autocfg.hp_pins[0] = 0x15; | ||
8647 | spec->autocfg.speaker_pins[0] = 0x14; | ||
8648 | alc_automute_amp(codec); | ||
8280 | alc883_clevo_m720_mic_automute(codec); | 8649 | alc883_clevo_m720_mic_automute(codec); |
8281 | } | 8650 | } |
8282 | 8651 | ||
@@ -8284,52 +8653,32 @@ static void alc883_clevo_m720_unsol_event(struct hda_codec *codec, | |||
8284 | unsigned int res) | 8653 | unsigned int res) |
8285 | { | 8654 | { |
8286 | switch (res >> 26) { | 8655 | switch (res >> 26) { |
8287 | case ALC880_HP_EVENT: | ||
8288 | alc883_clevo_m720_hp_automute(codec); | ||
8289 | break; | ||
8290 | case ALC880_MIC_EVENT: | 8656 | case ALC880_MIC_EVENT: |
8291 | alc883_clevo_m720_mic_automute(codec); | 8657 | alc883_clevo_m720_mic_automute(codec); |
8292 | break; | 8658 | break; |
8659 | default: | ||
8660 | alc_automute_amp_unsol_event(codec, res); | ||
8661 | break; | ||
8293 | } | 8662 | } |
8294 | } | 8663 | } |
8295 | 8664 | ||
8296 | /* toggle speaker-output according to the hp-jack state */ | 8665 | /* toggle speaker-output according to the hp-jack state */ |
8297 | static void alc883_2ch_fujitsu_pi2515_automute(struct hda_codec *codec) | 8666 | static void alc883_2ch_fujitsu_pi2515_init_hook(struct hda_codec *codec) |
8298 | { | 8667 | { |
8299 | unsigned int present; | 8668 | struct alc_spec *spec = codec->spec; |
8300 | unsigned char bits; | ||
8301 | |||
8302 | present = snd_hda_codec_read(codec, 0x14, 0, AC_VERB_GET_PIN_SENSE, 0) | ||
8303 | & AC_PINSENSE_PRESENCE; | ||
8304 | bits = present ? HDA_AMP_MUTE : 0; | ||
8305 | snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0, | ||
8306 | HDA_AMP_MUTE, bits); | ||
8307 | } | ||
8308 | 8669 | ||
8309 | static void alc883_2ch_fujitsu_pi2515_unsol_event(struct hda_codec *codec, | 8670 | spec->autocfg.hp_pins[0] = 0x14; |
8310 | unsigned int res) | 8671 | spec->autocfg.speaker_pins[0] = 0x15; |
8311 | { | 8672 | alc_automute_amp(codec); |
8312 | if ((res >> 26) == ALC880_HP_EVENT) | ||
8313 | alc883_2ch_fujitsu_pi2515_automute(codec); | ||
8314 | } | 8673 | } |
8315 | 8674 | ||
8316 | static void alc883_haier_w66_automute(struct hda_codec *codec) | 8675 | static void alc883_haier_w66_init_hook(struct hda_codec *codec) |
8317 | { | 8676 | { |
8318 | unsigned int present; | 8677 | struct alc_spec *spec = codec->spec; |
8319 | unsigned char bits; | ||
8320 | 8678 | ||
8321 | present = snd_hda_codec_read(codec, 0x1b, 0, | 8679 | spec->autocfg.hp_pins[0] = 0x1b; |
8322 | AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; | 8680 | spec->autocfg.speaker_pins[0] = 0x14; |
8323 | bits = present ? 0x80 : 0; | 8681 | alc_automute_amp(codec); |
8324 | snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0, | ||
8325 | 0x80, bits); | ||
8326 | } | ||
8327 | |||
8328 | static void alc883_haier_w66_unsol_event(struct hda_codec *codec, | ||
8329 | unsigned int res) | ||
8330 | { | ||
8331 | if ((res >> 26) == ALC880_HP_EVENT) | ||
8332 | alc883_haier_w66_automute(codec); | ||
8333 | } | 8682 | } |
8334 | 8683 | ||
8335 | static void alc883_lenovo_101e_ispeaker_automute(struct hda_codec *codec) | 8684 | static void alc883_lenovo_101e_ispeaker_automute(struct hda_codec *codec) |
@@ -8337,8 +8686,8 @@ static void alc883_lenovo_101e_ispeaker_automute(struct hda_codec *codec) | |||
8337 | unsigned int present; | 8686 | unsigned int present; |
8338 | unsigned char bits; | 8687 | unsigned char bits; |
8339 | 8688 | ||
8340 | present = snd_hda_codec_read(codec, 0x14, 0, | 8689 | present = snd_hda_codec_read(codec, 0x14, 0, AC_VERB_GET_PIN_SENSE, 0) |
8341 | AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; | 8690 | & AC_PINSENSE_PRESENCE; |
8342 | bits = present ? HDA_AMP_MUTE : 0; | 8691 | bits = present ? HDA_AMP_MUTE : 0; |
8343 | snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0, | 8692 | snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0, |
8344 | HDA_AMP_MUTE, bits); | 8693 | HDA_AMP_MUTE, bits); |
@@ -8368,23 +8717,14 @@ static void alc883_lenovo_101e_unsol_event(struct hda_codec *codec, | |||
8368 | } | 8717 | } |
8369 | 8718 | ||
8370 | /* toggle speaker-output according to the hp-jack state */ | 8719 | /* toggle speaker-output according to the hp-jack state */ |
8371 | static void alc883_acer_aspire_automute(struct hda_codec *codec) | 8720 | static void alc883_acer_aspire_init_hook(struct hda_codec *codec) |
8372 | { | 8721 | { |
8373 | unsigned int present; | 8722 | struct alc_spec *spec = codec->spec; |
8374 | |||
8375 | present = snd_hda_codec_read(codec, 0x14, 0, | ||
8376 | AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; | ||
8377 | snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0, | ||
8378 | HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0); | ||
8379 | snd_hda_codec_amp_stereo(codec, 0x16, HDA_OUTPUT, 0, | ||
8380 | HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0); | ||
8381 | } | ||
8382 | 8723 | ||
8383 | static void alc883_acer_aspire_unsol_event(struct hda_codec *codec, | 8724 | spec->autocfg.hp_pins[0] = 0x14; |
8384 | unsigned int res) | 8725 | spec->autocfg.speaker_pins[0] = 0x15; |
8385 | { | 8726 | spec->autocfg.speaker_pins[1] = 0x16; |
8386 | if ((res >> 26) == ALC880_HP_EVENT) | 8727 | alc_automute_amp(codec); |
8387 | alc883_acer_aspire_automute(codec); | ||
8388 | } | 8728 | } |
8389 | 8729 | ||
8390 | static struct hda_verb alc883_acer_eapd_verbs[] = { | 8730 | static struct hda_verb alc883_acer_eapd_verbs[] = { |
@@ -8405,75 +8745,39 @@ static struct hda_verb alc883_acer_eapd_verbs[] = { | |||
8405 | { } | 8745 | { } |
8406 | }; | 8746 | }; |
8407 | 8747 | ||
8408 | static void alc888_6st_dell_front_automute(struct hda_codec *codec) | 8748 | static void alc888_6st_dell_init_hook(struct hda_codec *codec) |
8409 | { | 8749 | { |
8410 | unsigned int present; | 8750 | struct alc_spec *spec = codec->spec; |
8411 | |||
8412 | present = snd_hda_codec_read(codec, 0x1b, 0, | ||
8413 | AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; | ||
8414 | snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0, | ||
8415 | HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0); | ||
8416 | snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0, | ||
8417 | HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0); | ||
8418 | snd_hda_codec_amp_stereo(codec, 0x16, HDA_OUTPUT, 0, | ||
8419 | HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0); | ||
8420 | snd_hda_codec_amp_stereo(codec, 0x17, HDA_OUTPUT, 0, | ||
8421 | HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0); | ||
8422 | } | ||
8423 | 8751 | ||
8424 | static void alc888_6st_dell_unsol_event(struct hda_codec *codec, | 8752 | spec->autocfg.hp_pins[0] = 0x1b; |
8425 | unsigned int res) | 8753 | spec->autocfg.speaker_pins[0] = 0x14; |
8426 | { | 8754 | spec->autocfg.speaker_pins[1] = 0x15; |
8427 | switch (res >> 26) { | 8755 | spec->autocfg.speaker_pins[2] = 0x16; |
8428 | case ALC880_HP_EVENT: | 8756 | spec->autocfg.speaker_pins[3] = 0x17; |
8429 | /* printk(KERN_DEBUG "hp_event\n"); */ | 8757 | alc_automute_amp(codec); |
8430 | alc888_6st_dell_front_automute(codec); | ||
8431 | break; | ||
8432 | } | ||
8433 | } | 8758 | } |
8434 | 8759 | ||
8435 | static void alc888_lenovo_sky_front_automute(struct hda_codec *codec) | 8760 | static void alc888_lenovo_sky_init_hook(struct hda_codec *codec) |
8436 | { | 8761 | { |
8437 | unsigned int mute; | 8762 | struct alc_spec *spec = codec->spec; |
8438 | unsigned int present; | ||
8439 | 8763 | ||
8440 | snd_hda_codec_read(codec, 0x1b, 0, AC_VERB_SET_PIN_SENSE, 0); | 8764 | spec->autocfg.hp_pins[0] = 0x1b; |
8441 | present = snd_hda_codec_read(codec, 0x1b, 0, | 8765 | spec->autocfg.speaker_pins[0] = 0x14; |
8442 | AC_VERB_GET_PIN_SENSE, 0); | 8766 | spec->autocfg.speaker_pins[1] = 0x15; |
8443 | present = (present & 0x80000000) != 0; | 8767 | spec->autocfg.speaker_pins[2] = 0x16; |
8444 | if (present) { | 8768 | spec->autocfg.speaker_pins[3] = 0x17; |
8445 | /* mute internal speaker */ | 8769 | spec->autocfg.speaker_pins[4] = 0x1a; |
8446 | snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0, | 8770 | alc_automute_amp(codec); |
8447 | HDA_AMP_MUTE, HDA_AMP_MUTE); | ||
8448 | snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0, | ||
8449 | HDA_AMP_MUTE, HDA_AMP_MUTE); | ||
8450 | snd_hda_codec_amp_stereo(codec, 0x16, HDA_OUTPUT, 0, | ||
8451 | HDA_AMP_MUTE, HDA_AMP_MUTE); | ||
8452 | snd_hda_codec_amp_stereo(codec, 0x17, HDA_OUTPUT, 0, | ||
8453 | HDA_AMP_MUTE, HDA_AMP_MUTE); | ||
8454 | snd_hda_codec_amp_stereo(codec, 0x1a, HDA_OUTPUT, 0, | ||
8455 | HDA_AMP_MUTE, HDA_AMP_MUTE); | ||
8456 | } else { | ||
8457 | /* unmute internal speaker if necessary */ | ||
8458 | mute = snd_hda_codec_amp_read(codec, 0x1b, 0, HDA_OUTPUT, 0); | ||
8459 | snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0, | ||
8460 | HDA_AMP_MUTE, mute); | ||
8461 | snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0, | ||
8462 | HDA_AMP_MUTE, mute); | ||
8463 | snd_hda_codec_amp_stereo(codec, 0x16, HDA_OUTPUT, 0, | ||
8464 | HDA_AMP_MUTE, mute); | ||
8465 | snd_hda_codec_amp_stereo(codec, 0x17, HDA_OUTPUT, 0, | ||
8466 | HDA_AMP_MUTE, mute); | ||
8467 | snd_hda_codec_amp_stereo(codec, 0x1a, HDA_OUTPUT, 0, | ||
8468 | HDA_AMP_MUTE, mute); | ||
8469 | } | ||
8470 | } | 8771 | } |
8471 | 8772 | ||
8472 | static void alc883_lenovo_sky_unsol_event(struct hda_codec *codec, | 8773 | static void alc883_vaiott_init_hook(struct hda_codec *codec) |
8473 | unsigned int res) | ||
8474 | { | 8774 | { |
8475 | if ((res >> 26) == ALC880_HP_EVENT) | 8775 | struct alc_spec *spec = codec->spec; |
8476 | alc888_lenovo_sky_front_automute(codec); | 8776 | |
8777 | spec->autocfg.hp_pins[0] = 0x15; | ||
8778 | spec->autocfg.speaker_pins[0] = 0x14; | ||
8779 | spec->autocfg.speaker_pins[1] = 0x17; | ||
8780 | alc_automute_amp(codec); | ||
8477 | } | 8781 | } |
8478 | 8782 | ||
8479 | /* | 8783 | /* |
@@ -8561,39 +8865,33 @@ static void alc883_nb_mic_automute(struct hda_codec *codec) | |||
8561 | 0x7000 | (0x01 << 8) | (present ? 0x80 : 0)); | 8865 | 0x7000 | (0x01 << 8) | (present ? 0x80 : 0)); |
8562 | } | 8866 | } |
8563 | 8867 | ||
8564 | static void alc883_M90V_speaker_automute(struct hda_codec *codec) | 8868 | static void alc883_M90V_init_hook(struct hda_codec *codec) |
8565 | { | 8869 | { |
8566 | unsigned int present; | 8870 | struct alc_spec *spec = codec->spec; |
8567 | unsigned char bits; | ||
8568 | 8871 | ||
8569 | present = snd_hda_codec_read(codec, 0x1b, 0, | 8872 | spec->autocfg.hp_pins[0] = 0x1b; |
8570 | AC_VERB_GET_PIN_SENSE, 0) | 8873 | spec->autocfg.speaker_pins[0] = 0x14; |
8571 | & AC_PINSENSE_PRESENCE; | 8874 | spec->autocfg.speaker_pins[1] = 0x15; |
8572 | bits = present ? 0 : PIN_OUT; | 8875 | spec->autocfg.speaker_pins[2] = 0x16; |
8573 | snd_hda_codec_write(codec, 0x14, 0, AC_VERB_SET_PIN_WIDGET_CONTROL, | 8876 | alc_automute_pin(codec); |
8574 | bits); | ||
8575 | snd_hda_codec_write(codec, 0x15, 0, AC_VERB_SET_PIN_WIDGET_CONTROL, | ||
8576 | bits); | ||
8577 | snd_hda_codec_write(codec, 0x16, 0, AC_VERB_SET_PIN_WIDGET_CONTROL, | ||
8578 | bits); | ||
8579 | } | 8877 | } |
8580 | 8878 | ||
8581 | static void alc883_mode2_unsol_event(struct hda_codec *codec, | 8879 | static void alc883_mode2_unsol_event(struct hda_codec *codec, |
8582 | unsigned int res) | 8880 | unsigned int res) |
8583 | { | 8881 | { |
8584 | switch (res >> 26) { | 8882 | switch (res >> 26) { |
8585 | case ALC880_HP_EVENT: | ||
8586 | alc883_M90V_speaker_automute(codec); | ||
8587 | break; | ||
8588 | case ALC880_MIC_EVENT: | 8883 | case ALC880_MIC_EVENT: |
8589 | alc883_nb_mic_automute(codec); | 8884 | alc883_nb_mic_automute(codec); |
8590 | break; | 8885 | break; |
8886 | default: | ||
8887 | alc_sku_unsol_event(codec, res); | ||
8888 | break; | ||
8591 | } | 8889 | } |
8592 | } | 8890 | } |
8593 | 8891 | ||
8594 | static void alc883_mode2_inithook(struct hda_codec *codec) | 8892 | static void alc883_mode2_inithook(struct hda_codec *codec) |
8595 | { | 8893 | { |
8596 | alc883_M90V_speaker_automute(codec); | 8894 | alc883_M90V_init_hook(codec); |
8597 | alc883_nb_mic_automute(codec); | 8895 | alc883_nb_mic_automute(codec); |
8598 | } | 8896 | } |
8599 | 8897 | ||
@@ -8610,32 +8908,49 @@ static struct hda_verb alc888_asus_eee1601_verbs[] = { | |||
8610 | { } /* end */ | 8908 | { } /* end */ |
8611 | }; | 8909 | }; |
8612 | 8910 | ||
8613 | static void alc883_eee1601_speaker_automute(struct hda_codec *codec) | 8911 | static void alc883_eee1601_inithook(struct hda_codec *codec) |
8614 | { | 8912 | { |
8615 | unsigned int present; | 8913 | struct alc_spec *spec = codec->spec; |
8616 | unsigned char bits; | ||
8617 | 8914 | ||
8618 | present = snd_hda_codec_read(codec, 0x14, 0, | 8915 | spec->autocfg.hp_pins[0] = 0x14; |
8619 | AC_VERB_GET_PIN_SENSE, 0) | 8916 | spec->autocfg.speaker_pins[0] = 0x1b; |
8620 | & AC_PINSENSE_PRESENCE; | 8917 | alc_automute_pin(codec); |
8621 | bits = present ? 0 : PIN_OUT; | ||
8622 | snd_hda_codec_write(codec, 0x1b, 0, AC_VERB_SET_PIN_WIDGET_CONTROL, | ||
8623 | bits); | ||
8624 | } | 8918 | } |
8625 | 8919 | ||
8626 | static void alc883_eee1601_unsol_event(struct hda_codec *codec, | 8920 | static struct hda_verb alc889A_mb31_verbs[] = { |
8627 | unsigned int res) | 8921 | /* Init rear pin (used as headphone output) */ |
8922 | {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc4}, /* Apple Headphones */ | ||
8923 | {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Connect to front */ | ||
8924 | {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, | ||
8925 | /* Init line pin (used as output in 4ch and 6ch mode) */ | ||
8926 | {0x1a, AC_VERB_SET_CONNECT_SEL, 0x02}, /* Connect to CLFE */ | ||
8927 | /* Init line 2 pin (used as headphone out by default) */ | ||
8928 | {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, /* Use as input */ | ||
8929 | {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, /* Mute output */ | ||
8930 | { } /* end */ | ||
8931 | }; | ||
8932 | |||
8933 | /* Mute speakers according to the headphone jack state */ | ||
8934 | static void alc889A_mb31_automute(struct hda_codec *codec) | ||
8628 | { | 8935 | { |
8629 | switch (res >> 26) { | 8936 | unsigned int present; |
8630 | case ALC880_HP_EVENT: | 8937 | |
8631 | alc883_eee1601_speaker_automute(codec); | 8938 | /* Mute only in 2ch or 4ch mode */ |
8632 | break; | 8939 | if (snd_hda_codec_read(codec, 0x15, 0, AC_VERB_GET_CONNECT_SEL, 0) |
8940 | == 0x00) { | ||
8941 | present = snd_hda_codec_read(codec, 0x15, 0, | ||
8942 | AC_VERB_GET_PIN_SENSE, 0) & AC_PINSENSE_PRESENCE; | ||
8943 | snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0, | ||
8944 | HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0); | ||
8945 | snd_hda_codec_amp_stereo(codec, 0x16, HDA_OUTPUT, 0, | ||
8946 | HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0); | ||
8633 | } | 8947 | } |
8634 | } | 8948 | } |
8635 | 8949 | ||
8636 | static void alc883_eee1601_inithook(struct hda_codec *codec) | 8950 | static void alc889A_mb31_unsol_event(struct hda_codec *codec, unsigned int res) |
8637 | { | 8951 | { |
8638 | alc883_eee1601_speaker_automute(codec); | 8952 | if ((res >> 26) == ALC880_HP_EVENT) |
8953 | alc889A_mb31_automute(codec); | ||
8639 | } | 8954 | } |
8640 | 8955 | ||
8641 | #ifdef CONFIG_SND_HDA_POWER_SAVE | 8956 | #ifdef CONFIG_SND_HDA_POWER_SAVE |
@@ -8659,9 +8974,11 @@ static const char *alc883_models[ALC883_MODEL_LAST] = { | |||
8659 | [ALC883_6ST_DIG] = "6stack-dig", | 8974 | [ALC883_6ST_DIG] = "6stack-dig", |
8660 | [ALC883_TARGA_DIG] = "targa-dig", | 8975 | [ALC883_TARGA_DIG] = "targa-dig", |
8661 | [ALC883_TARGA_2ch_DIG] = "targa-2ch-dig", | 8976 | [ALC883_TARGA_2ch_DIG] = "targa-2ch-dig", |
8977 | [ALC883_TARGA_8ch_DIG] = "targa-8ch-dig", | ||
8662 | [ALC883_ACER] = "acer", | 8978 | [ALC883_ACER] = "acer", |
8663 | [ALC883_ACER_ASPIRE] = "acer-aspire", | 8979 | [ALC883_ACER_ASPIRE] = "acer-aspire", |
8664 | [ALC888_ACER_ASPIRE_4930G] = "acer-aspire-4930g", | 8980 | [ALC888_ACER_ASPIRE_4930G] = "acer-aspire-4930g", |
8981 | [ALC888_ACER_ASPIRE_8930G] = "acer-aspire-8930g", | ||
8665 | [ALC883_MEDION] = "medion", | 8982 | [ALC883_MEDION] = "medion", |
8666 | [ALC883_MEDION_MD2] = "medion-md2", | 8983 | [ALC883_MEDION_MD2] = "medion-md2", |
8667 | [ALC883_LAPTOP_EAPD] = "laptop-eapd", | 8984 | [ALC883_LAPTOP_EAPD] = "laptop-eapd", |
@@ -8678,6 +8995,8 @@ static const char *alc883_models[ALC883_MODEL_LAST] = { | |||
8678 | [ALC888_FUJITSU_XA3530] = "fujitsu-xa3530", | 8995 | [ALC888_FUJITSU_XA3530] = "fujitsu-xa3530", |
8679 | [ALC883_3ST_6ch_INTEL] = "3stack-6ch-intel", | 8996 | [ALC883_3ST_6ch_INTEL] = "3stack-6ch-intel", |
8680 | [ALC1200_ASUS_P5Q] = "asus-p5q", | 8997 | [ALC1200_ASUS_P5Q] = "asus-p5q", |
8998 | [ALC889A_MB31] = "mb31", | ||
8999 | [ALC883_SONY_VAIO_TT] = "sony-vaio-tt", | ||
8681 | [ALC883_AUTO] = "auto", | 9000 | [ALC883_AUTO] = "auto", |
8682 | }; | 9001 | }; |
8683 | 9002 | ||
@@ -8693,14 +9012,18 @@ static struct snd_pci_quirk alc883_cfg_tbl[] = { | |||
8693 | ALC888_ACER_ASPIRE_4930G), | 9012 | ALC888_ACER_ASPIRE_4930G), |
8694 | SND_PCI_QUIRK(0x1025, 0x013f, "Acer Aspire 5930G", | 9013 | SND_PCI_QUIRK(0x1025, 0x013f, "Acer Aspire 5930G", |
8695 | ALC888_ACER_ASPIRE_4930G), | 9014 | ALC888_ACER_ASPIRE_4930G), |
9015 | SND_PCI_QUIRK(0x1025, 0x0145, "Acer Aspire 8930G", | ||
9016 | ALC888_ACER_ASPIRE_8930G), | ||
8696 | SND_PCI_QUIRK(0x1025, 0x0157, "Acer X3200", ALC883_AUTO), | 9017 | SND_PCI_QUIRK(0x1025, 0x0157, "Acer X3200", ALC883_AUTO), |
8697 | SND_PCI_QUIRK(0x1025, 0x0158, "Acer AX1700-U3700A", ALC883_AUTO), | 9018 | SND_PCI_QUIRK(0x1025, 0x0158, "Acer AX1700-U3700A", ALC883_AUTO), |
8698 | SND_PCI_QUIRK(0x1025, 0x015e, "Acer Aspire 6930G", | 9019 | SND_PCI_QUIRK(0x1025, 0x015e, "Acer Aspire 6930G", |
8699 | ALC888_ACER_ASPIRE_4930G), | 9020 | ALC888_ACER_ASPIRE_4930G), |
8700 | SND_PCI_QUIRK(0x1025, 0x0166, "Acer Aspire 6530G", | 9021 | SND_PCI_QUIRK(0x1025, 0x0166, "Acer Aspire 6530G", |
8701 | ALC888_ACER_ASPIRE_4930G), | 9022 | ALC888_ACER_ASPIRE_4930G), |
8702 | /* default Acer */ | 9023 | /* default Acer -- disabled as it causes more problems. |
8703 | SND_PCI_QUIRK_VENDOR(0x1025, "Acer laptop", ALC883_ACER), | 9024 | * model=auto should work fine now |
9025 | */ | ||
9026 | /* SND_PCI_QUIRK_VENDOR(0x1025, "Acer laptop", ALC883_ACER), */ | ||
8704 | SND_PCI_QUIRK(0x1028, 0x020d, "Dell Inspiron 530", ALC888_6ST_DELL), | 9027 | SND_PCI_QUIRK(0x1028, 0x020d, "Dell Inspiron 530", ALC888_6ST_DELL), |
8705 | SND_PCI_QUIRK(0x103c, 0x2a3d, "HP Pavillion", ALC883_6ST_DIG), | 9028 | SND_PCI_QUIRK(0x103c, 0x2a3d, "HP Pavillion", ALC883_6ST_DIG), |
8706 | SND_PCI_QUIRK(0x103c, 0x2a4f, "HP Samba", ALC888_3ST_HP), | 9029 | SND_PCI_QUIRK(0x103c, 0x2a4f, "HP Samba", ALC888_3ST_HP), |
@@ -8736,6 +9059,7 @@ static struct snd_pci_quirk alc883_cfg_tbl[] = { | |||
8736 | SND_PCI_QUIRK(0x1462, 0x4314, "MSI", ALC883_TARGA_DIG), | 9059 | SND_PCI_QUIRK(0x1462, 0x4314, "MSI", ALC883_TARGA_DIG), |
8737 | SND_PCI_QUIRK(0x1462, 0x4319, "MSI", ALC883_TARGA_DIG), | 9060 | SND_PCI_QUIRK(0x1462, 0x4319, "MSI", ALC883_TARGA_DIG), |
8738 | SND_PCI_QUIRK(0x1462, 0x4324, "MSI", ALC883_TARGA_DIG), | 9061 | SND_PCI_QUIRK(0x1462, 0x4324, "MSI", ALC883_TARGA_DIG), |
9062 | SND_PCI_QUIRK(0x1462, 0x6510, "MSI GX620", ALC883_TARGA_8ch_DIG), | ||
8739 | SND_PCI_QUIRK(0x1462, 0x6668, "MSI", ALC883_6ST_DIG), | 9063 | SND_PCI_QUIRK(0x1462, 0x6668, "MSI", ALC883_6ST_DIG), |
8740 | SND_PCI_QUIRK(0x1462, 0x7187, "MSI", ALC883_6ST_DIG), | 9064 | SND_PCI_QUIRK(0x1462, 0x7187, "MSI", ALC883_6ST_DIG), |
8741 | SND_PCI_QUIRK(0x1462, 0x7250, "MSI", ALC883_6ST_DIG), | 9065 | SND_PCI_QUIRK(0x1462, 0x7250, "MSI", ALC883_6ST_DIG), |
@@ -8768,6 +9092,7 @@ static struct snd_pci_quirk alc883_cfg_tbl[] = { | |||
8768 | SND_PCI_QUIRK(0x8086, 0x2503, "82801H", ALC883_MITAC), | 9092 | SND_PCI_QUIRK(0x8086, 0x2503, "82801H", ALC883_MITAC), |
8769 | SND_PCI_QUIRK(0x8086, 0x0022, "DX58SO", ALC883_3ST_6ch_INTEL), | 9093 | SND_PCI_QUIRK(0x8086, 0x0022, "DX58SO", ALC883_3ST_6ch_INTEL), |
8770 | SND_PCI_QUIRK(0x8086, 0xd601, "D102GGC", ALC883_3ST_6ch), | 9094 | SND_PCI_QUIRK(0x8086, 0xd601, "D102GGC", ALC883_3ST_6ch), |
9095 | SND_PCI_QUIRK(0x104d, 0x9047, "Sony Vaio TT", ALC883_SONY_VAIO_TT), | ||
8771 | {} | 9096 | {} |
8772 | }; | 9097 | }; |
8773 | 9098 | ||
@@ -8848,7 +9173,7 @@ static struct alc_config_preset alc883_presets[] = { | |||
8848 | .need_dac_fix = 1, | 9173 | .need_dac_fix = 1, |
8849 | .input_mux = &alc883_capture_source, | 9174 | .input_mux = &alc883_capture_source, |
8850 | .unsol_event = alc883_tagra_unsol_event, | 9175 | .unsol_event = alc883_tagra_unsol_event, |
8851 | .init_hook = alc883_tagra_automute, | 9176 | .init_hook = alc883_tagra_init_hook, |
8852 | }, | 9177 | }, |
8853 | [ALC883_TARGA_2ch_DIG] = { | 9178 | [ALC883_TARGA_2ch_DIG] = { |
8854 | .mixers = { alc883_tagra_2ch_mixer}, | 9179 | .mixers = { alc883_tagra_2ch_mixer}, |
@@ -8862,7 +9187,25 @@ static struct alc_config_preset alc883_presets[] = { | |||
8862 | .channel_mode = alc883_3ST_2ch_modes, | 9187 | .channel_mode = alc883_3ST_2ch_modes, |
8863 | .input_mux = &alc883_capture_source, | 9188 | .input_mux = &alc883_capture_source, |
8864 | .unsol_event = alc883_tagra_unsol_event, | 9189 | .unsol_event = alc883_tagra_unsol_event, |
8865 | .init_hook = alc883_tagra_automute, | 9190 | .init_hook = alc883_tagra_init_hook, |
9191 | }, | ||
9192 | [ALC883_TARGA_8ch_DIG] = { | ||
9193 | .mixers = { alc883_base_mixer, alc883_chmode_mixer }, | ||
9194 | .init_verbs = { alc883_init_verbs, alc880_gpio3_init_verbs, | ||
9195 | alc883_tagra_verbs }, | ||
9196 | .num_dacs = ARRAY_SIZE(alc883_dac_nids), | ||
9197 | .dac_nids = alc883_dac_nids, | ||
9198 | .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev), | ||
9199 | .adc_nids = alc883_adc_nids_rev, | ||
9200 | .capsrc_nids = alc883_capsrc_nids_rev, | ||
9201 | .dig_out_nid = ALC883_DIGOUT_NID, | ||
9202 | .dig_in_nid = ALC883_DIGIN_NID, | ||
9203 | .num_channel_mode = ARRAY_SIZE(alc883_4ST_8ch_modes), | ||
9204 | .channel_mode = alc883_4ST_8ch_modes, | ||
9205 | .need_dac_fix = 1, | ||
9206 | .input_mux = &alc883_capture_source, | ||
9207 | .unsol_event = alc883_tagra_unsol_event, | ||
9208 | .init_hook = alc883_tagra_init_hook, | ||
8866 | }, | 9209 | }, |
8867 | [ALC883_ACER] = { | 9210 | [ALC883_ACER] = { |
8868 | .mixers = { alc883_base_mixer }, | 9211 | .mixers = { alc883_base_mixer }, |
@@ -8887,8 +9230,8 @@ static struct alc_config_preset alc883_presets[] = { | |||
8887 | .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes), | 9230 | .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes), |
8888 | .channel_mode = alc883_3ST_2ch_modes, | 9231 | .channel_mode = alc883_3ST_2ch_modes, |
8889 | .input_mux = &alc883_capture_source, | 9232 | .input_mux = &alc883_capture_source, |
8890 | .unsol_event = alc883_acer_aspire_unsol_event, | 9233 | .unsol_event = alc_automute_amp_unsol_event, |
8891 | .init_hook = alc883_acer_aspire_automute, | 9234 | .init_hook = alc883_acer_aspire_init_hook, |
8892 | }, | 9235 | }, |
8893 | [ALC888_ACER_ASPIRE_4930G] = { | 9236 | [ALC888_ACER_ASPIRE_4930G] = { |
8894 | .mixers = { alc888_base_mixer, | 9237 | .mixers = { alc888_base_mixer, |
@@ -8907,8 +9250,29 @@ static struct alc_config_preset alc883_presets[] = { | |||
8907 | .num_mux_defs = | 9250 | .num_mux_defs = |
8908 | ARRAY_SIZE(alc888_2_capture_sources), | 9251 | ARRAY_SIZE(alc888_2_capture_sources), |
8909 | .input_mux = alc888_2_capture_sources, | 9252 | .input_mux = alc888_2_capture_sources, |
8910 | .unsol_event = alc888_acer_aspire_4930g_unsol_event, | 9253 | .unsol_event = alc_automute_amp_unsol_event, |
8911 | .init_hook = alc888_acer_aspire_4930g_automute, | 9254 | .init_hook = alc888_acer_aspire_4930g_init_hook, |
9255 | }, | ||
9256 | [ALC888_ACER_ASPIRE_8930G] = { | ||
9257 | .mixers = { alc888_base_mixer, | ||
9258 | alc883_chmode_mixer }, | ||
9259 | .init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs, | ||
9260 | alc889_acer_aspire_8930g_verbs }, | ||
9261 | .num_dacs = ARRAY_SIZE(alc883_dac_nids), | ||
9262 | .dac_nids = alc883_dac_nids, | ||
9263 | .num_adc_nids = ARRAY_SIZE(alc889_adc_nids), | ||
9264 | .adc_nids = alc889_adc_nids, | ||
9265 | .capsrc_nids = alc889_capsrc_nids, | ||
9266 | .dig_out_nid = ALC883_DIGOUT_NID, | ||
9267 | .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes), | ||
9268 | .channel_mode = alc883_3ST_6ch_modes, | ||
9269 | .need_dac_fix = 1, | ||
9270 | .const_channel_count = 6, | ||
9271 | .num_mux_defs = | ||
9272 | ARRAY_SIZE(alc889_capture_sources), | ||
9273 | .input_mux = alc889_capture_sources, | ||
9274 | .unsol_event = alc_automute_amp_unsol_event, | ||
9275 | .init_hook = alc889_acer_aspire_8930g_init_hook, | ||
8912 | }, | 9276 | }, |
8913 | [ALC883_MEDION] = { | 9277 | [ALC883_MEDION] = { |
8914 | .mixers = { alc883_fivestack_mixer, | 9278 | .mixers = { alc883_fivestack_mixer, |
@@ -8932,8 +9296,8 @@ static struct alc_config_preset alc883_presets[] = { | |||
8932 | .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes), | 9296 | .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes), |
8933 | .channel_mode = alc883_3ST_2ch_modes, | 9297 | .channel_mode = alc883_3ST_2ch_modes, |
8934 | .input_mux = &alc883_capture_source, | 9298 | .input_mux = &alc883_capture_source, |
8935 | .unsol_event = alc883_medion_md2_unsol_event, | 9299 | .unsol_event = alc_automute_amp_unsol_event, |
8936 | .init_hook = alc883_medion_md2_automute, | 9300 | .init_hook = alc883_medion_md2_init_hook, |
8937 | }, | 9301 | }, |
8938 | [ALC883_LAPTOP_EAPD] = { | 9302 | [ALC883_LAPTOP_EAPD] = { |
8939 | .mixers = { alc883_base_mixer }, | 9303 | .mixers = { alc883_base_mixer }, |
@@ -8954,7 +9318,7 @@ static struct alc_config_preset alc883_presets[] = { | |||
8954 | .channel_mode = alc883_3ST_2ch_modes, | 9318 | .channel_mode = alc883_3ST_2ch_modes, |
8955 | .input_mux = &alc883_capture_source, | 9319 | .input_mux = &alc883_capture_source, |
8956 | .unsol_event = alc883_clevo_m720_unsol_event, | 9320 | .unsol_event = alc883_clevo_m720_unsol_event, |
8957 | .init_hook = alc883_clevo_m720_automute, | 9321 | .init_hook = alc883_clevo_m720_init_hook, |
8958 | }, | 9322 | }, |
8959 | [ALC883_LENOVO_101E_2ch] = { | 9323 | [ALC883_LENOVO_101E_2ch] = { |
8960 | .mixers = { alc883_lenovo_101e_2ch_mixer}, | 9324 | .mixers = { alc883_lenovo_101e_2ch_mixer}, |
@@ -8978,8 +9342,8 @@ static struct alc_config_preset alc883_presets[] = { | |||
8978 | .channel_mode = alc883_3ST_2ch_modes, | 9342 | .channel_mode = alc883_3ST_2ch_modes, |
8979 | .need_dac_fix = 1, | 9343 | .need_dac_fix = 1, |
8980 | .input_mux = &alc883_lenovo_nb0763_capture_source, | 9344 | .input_mux = &alc883_lenovo_nb0763_capture_source, |
8981 | .unsol_event = alc883_medion_md2_unsol_event, | 9345 | .unsol_event = alc_automute_amp_unsol_event, |
8982 | .init_hook = alc883_medion_md2_automute, | 9346 | .init_hook = alc883_medion_md2_init_hook, |
8983 | }, | 9347 | }, |
8984 | [ALC888_LENOVO_MS7195_DIG] = { | 9348 | [ALC888_LENOVO_MS7195_DIG] = { |
8985 | .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer }, | 9349 | .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer }, |
@@ -9003,8 +9367,8 @@ static struct alc_config_preset alc883_presets[] = { | |||
9003 | .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes), | 9367 | .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes), |
9004 | .channel_mode = alc883_3ST_2ch_modes, | 9368 | .channel_mode = alc883_3ST_2ch_modes, |
9005 | .input_mux = &alc883_capture_source, | 9369 | .input_mux = &alc883_capture_source, |
9006 | .unsol_event = alc883_haier_w66_unsol_event, | 9370 | .unsol_event = alc_automute_amp_unsol_event, |
9007 | .init_hook = alc883_haier_w66_automute, | 9371 | .init_hook = alc883_haier_w66_init_hook, |
9008 | }, | 9372 | }, |
9009 | [ALC888_3ST_HP] = { | 9373 | [ALC888_3ST_HP] = { |
9010 | .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer }, | 9374 | .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer }, |
@@ -9015,8 +9379,8 @@ static struct alc_config_preset alc883_presets[] = { | |||
9015 | .channel_mode = alc888_3st_hp_modes, | 9379 | .channel_mode = alc888_3st_hp_modes, |
9016 | .need_dac_fix = 1, | 9380 | .need_dac_fix = 1, |
9017 | .input_mux = &alc883_capture_source, | 9381 | .input_mux = &alc883_capture_source, |
9018 | .unsol_event = alc888_3st_hp_unsol_event, | 9382 | .unsol_event = alc_automute_amp_unsol_event, |
9019 | .init_hook = alc888_3st_hp_front_automute, | 9383 | .init_hook = alc888_3st_hp_init_hook, |
9020 | }, | 9384 | }, |
9021 | [ALC888_6ST_DELL] = { | 9385 | [ALC888_6ST_DELL] = { |
9022 | .mixers = { alc883_base_mixer, alc883_chmode_mixer }, | 9386 | .mixers = { alc883_base_mixer, alc883_chmode_mixer }, |
@@ -9028,8 +9392,8 @@ static struct alc_config_preset alc883_presets[] = { | |||
9028 | .num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes), | 9392 | .num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes), |
9029 | .channel_mode = alc883_sixstack_modes, | 9393 | .channel_mode = alc883_sixstack_modes, |
9030 | .input_mux = &alc883_capture_source, | 9394 | .input_mux = &alc883_capture_source, |
9031 | .unsol_event = alc888_6st_dell_unsol_event, | 9395 | .unsol_event = alc_automute_amp_unsol_event, |
9032 | .init_hook = alc888_6st_dell_front_automute, | 9396 | .init_hook = alc888_6st_dell_init_hook, |
9033 | }, | 9397 | }, |
9034 | [ALC883_MITAC] = { | 9398 | [ALC883_MITAC] = { |
9035 | .mixers = { alc883_mitac_mixer }, | 9399 | .mixers = { alc883_mitac_mixer }, |
@@ -9039,8 +9403,8 @@ static struct alc_config_preset alc883_presets[] = { | |||
9039 | .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes), | 9403 | .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes), |
9040 | .channel_mode = alc883_3ST_2ch_modes, | 9404 | .channel_mode = alc883_3ST_2ch_modes, |
9041 | .input_mux = &alc883_capture_source, | 9405 | .input_mux = &alc883_capture_source, |
9042 | .unsol_event = alc883_mitac_unsol_event, | 9406 | .unsol_event = alc_automute_amp_unsol_event, |
9043 | .init_hook = alc883_mitac_automute, | 9407 | .init_hook = alc883_mitac_init_hook, |
9044 | }, | 9408 | }, |
9045 | [ALC883_FUJITSU_PI2515] = { | 9409 | [ALC883_FUJITSU_PI2515] = { |
9046 | .mixers = { alc883_2ch_fujitsu_pi2515_mixer }, | 9410 | .mixers = { alc883_2ch_fujitsu_pi2515_mixer }, |
@@ -9052,8 +9416,8 @@ static struct alc_config_preset alc883_presets[] = { | |||
9052 | .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes), | 9416 | .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes), |
9053 | .channel_mode = alc883_3ST_2ch_modes, | 9417 | .channel_mode = alc883_3ST_2ch_modes, |
9054 | .input_mux = &alc883_fujitsu_pi2515_capture_source, | 9418 | .input_mux = &alc883_fujitsu_pi2515_capture_source, |
9055 | .unsol_event = alc883_2ch_fujitsu_pi2515_unsol_event, | 9419 | .unsol_event = alc_automute_amp_unsol_event, |
9056 | .init_hook = alc883_2ch_fujitsu_pi2515_automute, | 9420 | .init_hook = alc883_2ch_fujitsu_pi2515_init_hook, |
9057 | }, | 9421 | }, |
9058 | [ALC888_FUJITSU_XA3530] = { | 9422 | [ALC888_FUJITSU_XA3530] = { |
9059 | .mixers = { alc888_base_mixer, alc883_chmode_mixer }, | 9423 | .mixers = { alc888_base_mixer, alc883_chmode_mixer }, |
@@ -9070,8 +9434,8 @@ static struct alc_config_preset alc883_presets[] = { | |||
9070 | .num_mux_defs = | 9434 | .num_mux_defs = |
9071 | ARRAY_SIZE(alc888_2_capture_sources), | 9435 | ARRAY_SIZE(alc888_2_capture_sources), |
9072 | .input_mux = alc888_2_capture_sources, | 9436 | .input_mux = alc888_2_capture_sources, |
9073 | .unsol_event = alc888_fujitsu_xa3530_unsol_event, | 9437 | .unsol_event = alc_automute_amp_unsol_event, |
9074 | .init_hook = alc888_fujitsu_xa3530_automute, | 9438 | .init_hook = alc888_fujitsu_xa3530_init_hook, |
9075 | }, | 9439 | }, |
9076 | [ALC888_LENOVO_SKY] = { | 9440 | [ALC888_LENOVO_SKY] = { |
9077 | .mixers = { alc888_lenovo_sky_mixer, alc883_chmode_mixer }, | 9441 | .mixers = { alc888_lenovo_sky_mixer, alc883_chmode_mixer }, |
@@ -9083,8 +9447,8 @@ static struct alc_config_preset alc883_presets[] = { | |||
9083 | .channel_mode = alc883_sixstack_modes, | 9447 | .channel_mode = alc883_sixstack_modes, |
9084 | .need_dac_fix = 1, | 9448 | .need_dac_fix = 1, |
9085 | .input_mux = &alc883_lenovo_sky_capture_source, | 9449 | .input_mux = &alc883_lenovo_sky_capture_source, |
9086 | .unsol_event = alc883_lenovo_sky_unsol_event, | 9450 | .unsol_event = alc_automute_amp_unsol_event, |
9087 | .init_hook = alc888_lenovo_sky_front_automute, | 9451 | .init_hook = alc888_lenovo_sky_init_hook, |
9088 | }, | 9452 | }, |
9089 | [ALC888_ASUS_M90V] = { | 9453 | [ALC888_ASUS_M90V] = { |
9090 | .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer }, | 9454 | .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer }, |
@@ -9112,7 +9476,7 @@ static struct alc_config_preset alc883_presets[] = { | |||
9112 | .channel_mode = alc883_3ST_2ch_modes, | 9476 | .channel_mode = alc883_3ST_2ch_modes, |
9113 | .need_dac_fix = 1, | 9477 | .need_dac_fix = 1, |
9114 | .input_mux = &alc883_asus_eee1601_capture_source, | 9478 | .input_mux = &alc883_asus_eee1601_capture_source, |
9115 | .unsol_event = alc883_eee1601_unsol_event, | 9479 | .unsol_event = alc_sku_unsol_event, |
9116 | .init_hook = alc883_eee1601_inithook, | 9480 | .init_hook = alc883_eee1601_inithook, |
9117 | }, | 9481 | }, |
9118 | [ALC1200_ASUS_P5Q] = { | 9482 | [ALC1200_ASUS_P5Q] = { |
@@ -9127,6 +9491,32 @@ static struct alc_config_preset alc883_presets[] = { | |||
9127 | .channel_mode = alc883_sixstack_modes, | 9491 | .channel_mode = alc883_sixstack_modes, |
9128 | .input_mux = &alc883_capture_source, | 9492 | .input_mux = &alc883_capture_source, |
9129 | }, | 9493 | }, |
9494 | [ALC889A_MB31] = { | ||
9495 | .mixers = { alc889A_mb31_mixer, alc883_chmode_mixer}, | ||
9496 | .init_verbs = { alc883_init_verbs, alc889A_mb31_verbs, | ||
9497 | alc880_gpio1_init_verbs }, | ||
9498 | .adc_nids = alc883_adc_nids, | ||
9499 | .num_adc_nids = ARRAY_SIZE(alc883_adc_nids), | ||
9500 | .dac_nids = alc883_dac_nids, | ||
9501 | .num_dacs = ARRAY_SIZE(alc883_dac_nids), | ||
9502 | .channel_mode = alc889A_mb31_6ch_modes, | ||
9503 | .num_channel_mode = ARRAY_SIZE(alc889A_mb31_6ch_modes), | ||
9504 | .input_mux = &alc889A_mb31_capture_source, | ||
9505 | .dig_out_nid = ALC883_DIGOUT_NID, | ||
9506 | .unsol_event = alc889A_mb31_unsol_event, | ||
9507 | .init_hook = alc889A_mb31_automute, | ||
9508 | }, | ||
9509 | [ALC883_SONY_VAIO_TT] = { | ||
9510 | .mixers = { alc883_vaiott_mixer }, | ||
9511 | .init_verbs = { alc883_init_verbs, alc883_vaiott_verbs }, | ||
9512 | .num_dacs = ARRAY_SIZE(alc883_dac_nids), | ||
9513 | .dac_nids = alc883_dac_nids, | ||
9514 | .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes), | ||
9515 | .channel_mode = alc883_3ST_2ch_modes, | ||
9516 | .input_mux = &alc883_capture_source, | ||
9517 | .unsol_event = alc_automute_amp_unsol_event, | ||
9518 | .init_hook = alc883_vaiott_init_hook, | ||
9519 | }, | ||
9130 | }; | 9520 | }; |
9131 | 9521 | ||
9132 | 9522 | ||
@@ -9155,7 +9545,6 @@ static void alc883_auto_init_multi_out(struct hda_codec *codec) | |||
9155 | struct alc_spec *spec = codec->spec; | 9545 | struct alc_spec *spec = codec->spec; |
9156 | int i; | 9546 | int i; |
9157 | 9547 | ||
9158 | alc_subsystem_id(codec, 0x15, 0x1b, 0x14); | ||
9159 | for (i = 0; i <= HDA_SIDE; i++) { | 9548 | for (i = 0; i <= HDA_SIDE; i++) { |
9160 | hda_nid_t nid = spec->autocfg.line_out_pins[i]; | 9549 | hda_nid_t nid = spec->autocfg.line_out_pins[i]; |
9161 | int pin_type = get_pin_type(spec->autocfg.line_out_type); | 9550 | int pin_type = get_pin_type(spec->autocfg.line_out_type); |
@@ -9273,10 +9662,18 @@ static int patch_alc883(struct hda_codec *codec) | |||
9273 | board_config = snd_hda_check_board_config(codec, ALC883_MODEL_LAST, | 9662 | board_config = snd_hda_check_board_config(codec, ALC883_MODEL_LAST, |
9274 | alc883_models, | 9663 | alc883_models, |
9275 | alc883_cfg_tbl); | 9664 | alc883_cfg_tbl); |
9276 | if (board_config < 0) { | 9665 | if (board_config < 0 || board_config >= ALC883_MODEL_LAST) { |
9277 | printk(KERN_INFO "hda_codec: Unknown model for ALC883, " | 9666 | /* Pick up systems that don't supply PCI SSID */ |
9278 | "trying auto-probe from BIOS...\n"); | 9667 | switch (codec->subsystem_id) { |
9279 | board_config = ALC883_AUTO; | 9668 | case 0x106b3600: /* Macbook 3.1 */ |
9669 | board_config = ALC889A_MB31; | ||
9670 | break; | ||
9671 | default: | ||
9672 | printk(KERN_INFO | ||
9673 | "hda_codec: Unknown model for %s, trying " | ||
9674 | "auto-probe from BIOS...\n", codec->chip_name); | ||
9675 | board_config = ALC883_AUTO; | ||
9676 | } | ||
9280 | } | 9677 | } |
9281 | 9678 | ||
9282 | if (board_config == ALC883_AUTO) { | 9679 | if (board_config == ALC883_AUTO) { |
@@ -9304,13 +9701,6 @@ static int patch_alc883(struct hda_codec *codec) | |||
9304 | 9701 | ||
9305 | switch (codec->vendor_id) { | 9702 | switch (codec->vendor_id) { |
9306 | case 0x10ec0888: | 9703 | case 0x10ec0888: |
9307 | if (codec->revision_id == 0x100101) { | ||
9308 | spec->stream_name_analog = "ALC1200 Analog"; | ||
9309 | spec->stream_name_digital = "ALC1200 Digital"; | ||
9310 | } else { | ||
9311 | spec->stream_name_analog = "ALC888 Analog"; | ||
9312 | spec->stream_name_digital = "ALC888 Digital"; | ||
9313 | } | ||
9314 | if (!spec->num_adc_nids) { | 9704 | if (!spec->num_adc_nids) { |
9315 | spec->num_adc_nids = ARRAY_SIZE(alc883_adc_nids); | 9705 | spec->num_adc_nids = ARRAY_SIZE(alc883_adc_nids); |
9316 | spec->adc_nids = alc883_adc_nids; | 9706 | spec->adc_nids = alc883_adc_nids; |
@@ -9318,10 +9708,9 @@ static int patch_alc883(struct hda_codec *codec) | |||
9318 | if (!spec->capsrc_nids) | 9708 | if (!spec->capsrc_nids) |
9319 | spec->capsrc_nids = alc883_capsrc_nids; | 9709 | spec->capsrc_nids = alc883_capsrc_nids; |
9320 | spec->capture_style = CAPT_MIX; /* matrix-style capture */ | 9710 | spec->capture_style = CAPT_MIX; /* matrix-style capture */ |
9711 | spec->init_amp = ALC_INIT_DEFAULT; /* always initialize */ | ||
9321 | break; | 9712 | break; |
9322 | case 0x10ec0889: | 9713 | case 0x10ec0889: |
9323 | spec->stream_name_analog = "ALC889 Analog"; | ||
9324 | spec->stream_name_digital = "ALC889 Digital"; | ||
9325 | if (!spec->num_adc_nids) { | 9714 | if (!spec->num_adc_nids) { |
9326 | spec->num_adc_nids = ARRAY_SIZE(alc889_adc_nids); | 9715 | spec->num_adc_nids = ARRAY_SIZE(alc889_adc_nids); |
9327 | spec->adc_nids = alc889_adc_nids; | 9716 | spec->adc_nids = alc889_adc_nids; |
@@ -9332,8 +9721,6 @@ static int patch_alc883(struct hda_codec *codec) | |||
9332 | capture */ | 9721 | capture */ |
9333 | break; | 9722 | break; |
9334 | default: | 9723 | default: |
9335 | spec->stream_name_analog = "ALC883 Analog"; | ||
9336 | spec->stream_name_digital = "ALC883 Digital"; | ||
9337 | if (!spec->num_adc_nids) { | 9724 | if (!spec->num_adc_nids) { |
9338 | spec->num_adc_nids = ARRAY_SIZE(alc883_adc_nids); | 9725 | spec->num_adc_nids = ARRAY_SIZE(alc883_adc_nids); |
9339 | spec->adc_nids = alc883_adc_nids; | 9726 | spec->adc_nids = alc883_adc_nids; |
@@ -9413,24 +9800,6 @@ static struct snd_kcontrol_new alc262_base_mixer[] = { | |||
9413 | { } /* end */ | 9800 | { } /* end */ |
9414 | }; | 9801 | }; |
9415 | 9802 | ||
9416 | static struct snd_kcontrol_new alc262_hippo1_mixer[] = { | ||
9417 | HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), | ||
9418 | HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT), | ||
9419 | HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), | ||
9420 | HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), | ||
9421 | HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), | ||
9422 | HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), | ||
9423 | HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), | ||
9424 | HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), | ||
9425 | HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), | ||
9426 | HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT), | ||
9427 | HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT), | ||
9428 | HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT), | ||
9429 | /*HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0D, 0x0, HDA_OUTPUT),*/ | ||
9430 | HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT), | ||
9431 | { } /* end */ | ||
9432 | }; | ||
9433 | |||
9434 | /* update HP, line and mono-out pins according to the master switch */ | 9803 | /* update HP, line and mono-out pins according to the master switch */ |
9435 | static void alc262_hp_master_update(struct hda_codec *codec) | 9804 | static void alc262_hp_master_update(struct hda_codec *codec) |
9436 | { | 9805 | { |
@@ -9486,14 +9855,7 @@ static void alc262_hp_wildwest_unsol_event(struct hda_codec *codec, | |||
9486 | alc262_hp_wildwest_automute(codec); | 9855 | alc262_hp_wildwest_automute(codec); |
9487 | } | 9856 | } |
9488 | 9857 | ||
9489 | static int alc262_hp_master_sw_get(struct snd_kcontrol *kcontrol, | 9858 | #define alc262_hp_master_sw_get alc260_hp_master_sw_get |
9490 | struct snd_ctl_elem_value *ucontrol) | ||
9491 | { | ||
9492 | struct hda_codec *codec = snd_kcontrol_chip(kcontrol); | ||
9493 | struct alc_spec *spec = codec->spec; | ||
9494 | *ucontrol->value.integer.value = spec->master_sw; | ||
9495 | return 0; | ||
9496 | } | ||
9497 | 9859 | ||
9498 | static int alc262_hp_master_sw_put(struct snd_kcontrol *kcontrol, | 9860 | static int alc262_hp_master_sw_put(struct snd_kcontrol *kcontrol, |
9499 | struct snd_ctl_elem_value *ucontrol) | 9861 | struct snd_ctl_elem_value *ucontrol) |
@@ -9509,14 +9871,17 @@ static int alc262_hp_master_sw_put(struct snd_kcontrol *kcontrol, | |||
9509 | return 1; | 9871 | return 1; |
9510 | } | 9872 | } |
9511 | 9873 | ||
9874 | #define ALC262_HP_MASTER_SWITCH \ | ||
9875 | { \ | ||
9876 | .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \ | ||
9877 | .name = "Master Playback Switch", \ | ||
9878 | .info = snd_ctl_boolean_mono_info, \ | ||
9879 | .get = alc262_hp_master_sw_get, \ | ||
9880 | .put = alc262_hp_master_sw_put, \ | ||
9881 | } | ||
9882 | |||
9512 | static struct snd_kcontrol_new alc262_HP_BPC_mixer[] = { | 9883 | static struct snd_kcontrol_new alc262_HP_BPC_mixer[] = { |
9513 | { | 9884 | ALC262_HP_MASTER_SWITCH, |
9514 | .iface = SNDRV_CTL_ELEM_IFACE_MIXER, | ||
9515 | .name = "Master Playback Switch", | ||
9516 | .info = snd_ctl_boolean_mono_info, | ||
9517 | .get = alc262_hp_master_sw_get, | ||
9518 | .put = alc262_hp_master_sw_put, | ||
9519 | }, | ||
9520 | HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), | 9885 | HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), |
9521 | HDA_CODEC_MUTE("Front Playback Switch", 0x15, 0x0, HDA_OUTPUT), | 9886 | HDA_CODEC_MUTE("Front Playback Switch", 0x15, 0x0, HDA_OUTPUT), |
9522 | HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT), | 9887 | HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT), |
@@ -9540,13 +9905,7 @@ static struct snd_kcontrol_new alc262_HP_BPC_mixer[] = { | |||
9540 | }; | 9905 | }; |
9541 | 9906 | ||
9542 | static struct snd_kcontrol_new alc262_HP_BPC_WildWest_mixer[] = { | 9907 | static struct snd_kcontrol_new alc262_HP_BPC_WildWest_mixer[] = { |
9543 | { | 9908 | ALC262_HP_MASTER_SWITCH, |
9544 | .iface = SNDRV_CTL_ELEM_IFACE_MIXER, | ||
9545 | .name = "Master Playback Switch", | ||
9546 | .info = snd_ctl_boolean_mono_info, | ||
9547 | .get = alc262_hp_master_sw_get, | ||
9548 | .put = alc262_hp_master_sw_put, | ||
9549 | }, | ||
9550 | HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), | 9909 | HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), |
9551 | HDA_CODEC_MUTE("Front Playback Switch", 0x1b, 0x0, HDA_OUTPUT), | 9910 | HDA_CODEC_MUTE("Front Playback Switch", 0x1b, 0x0, HDA_OUTPUT), |
9552 | HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT), | 9911 | HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT), |
@@ -9573,32 +9932,13 @@ static struct snd_kcontrol_new alc262_HP_BPC_WildWest_option_mixer[] = { | |||
9573 | }; | 9932 | }; |
9574 | 9933 | ||
9575 | /* mute/unmute internal speaker according to the hp jack and mute state */ | 9934 | /* mute/unmute internal speaker according to the hp jack and mute state */ |
9576 | static void alc262_hp_t5735_automute(struct hda_codec *codec, int force) | 9935 | static void alc262_hp_t5735_init_hook(struct hda_codec *codec) |
9577 | { | 9936 | { |
9578 | struct alc_spec *spec = codec->spec; | 9937 | struct alc_spec *spec = codec->spec; |
9579 | 9938 | ||
9580 | if (force || !spec->sense_updated) { | 9939 | spec->autocfg.hp_pins[0] = 0x15; |
9581 | unsigned int present; | 9940 | spec->autocfg.speaker_pins[0] = 0x0c; /* HACK: not actually a pin */ |
9582 | present = snd_hda_codec_read(codec, 0x15, 0, | 9941 | alc_automute_amp(codec); |
9583 | AC_VERB_GET_PIN_SENSE, 0); | ||
9584 | spec->jack_present = (present & AC_PINSENSE_PRESENCE) != 0; | ||
9585 | spec->sense_updated = 1; | ||
9586 | } | ||
9587 | snd_hda_codec_amp_stereo(codec, 0x0c, HDA_OUTPUT, 0, HDA_AMP_MUTE, | ||
9588 | spec->jack_present ? HDA_AMP_MUTE : 0); | ||
9589 | } | ||
9590 | |||
9591 | static void alc262_hp_t5735_unsol_event(struct hda_codec *codec, | ||
9592 | unsigned int res) | ||
9593 | { | ||
9594 | if ((res >> 26) != ALC880_HP_EVENT) | ||
9595 | return; | ||
9596 | alc262_hp_t5735_automute(codec, 1); | ||
9597 | } | ||
9598 | |||
9599 | static void alc262_hp_t5735_init_hook(struct hda_codec *codec) | ||
9600 | { | ||
9601 | alc262_hp_t5735_automute(codec, 1); | ||
9602 | } | 9942 | } |
9603 | 9943 | ||
9604 | static struct snd_kcontrol_new alc262_hp_t5735_mixer[] = { | 9944 | static struct snd_kcontrol_new alc262_hp_t5735_mixer[] = { |
@@ -9651,46 +9991,132 @@ static struct hda_input_mux alc262_hp_rp5700_capture_source = { | |||
9651 | }, | 9991 | }, |
9652 | }; | 9992 | }; |
9653 | 9993 | ||
9654 | /* bind hp and internal speaker mute (with plug check) */ | 9994 | /* bind hp and internal speaker mute (with plug check) as master switch */ |
9655 | static int alc262_sony_master_sw_put(struct snd_kcontrol *kcontrol, | 9995 | static void alc262_hippo_master_update(struct hda_codec *codec) |
9656 | struct snd_ctl_elem_value *ucontrol) | ||
9657 | { | 9996 | { |
9658 | struct hda_codec *codec = snd_kcontrol_chip(kcontrol); | 9997 | struct alc_spec *spec = codec->spec; |
9659 | long *valp = ucontrol->value.integer.value; | 9998 | hda_nid_t hp_nid = spec->autocfg.hp_pins[0]; |
9660 | int change; | 9999 | hda_nid_t line_nid = spec->autocfg.line_out_pins[0]; |
10000 | hda_nid_t speaker_nid = spec->autocfg.speaker_pins[0]; | ||
10001 | unsigned int mute; | ||
9661 | 10002 | ||
9662 | /* change hp mute */ | 10003 | /* HP */ |
9663 | change = snd_hda_codec_amp_update(codec, 0x15, 0, HDA_OUTPUT, 0, | 10004 | mute = spec->master_sw ? 0 : HDA_AMP_MUTE; |
9664 | HDA_AMP_MUTE, | 10005 | snd_hda_codec_amp_stereo(codec, hp_nid, HDA_OUTPUT, 0, |
9665 | valp[0] ? 0 : HDA_AMP_MUTE); | 10006 | HDA_AMP_MUTE, mute); |
9666 | change |= snd_hda_codec_amp_update(codec, 0x15, 1, HDA_OUTPUT, 0, | 10007 | /* mute internal speaker per jack sense */ |
9667 | HDA_AMP_MUTE, | 10008 | if (spec->jack_present) |
9668 | valp[1] ? 0 : HDA_AMP_MUTE); | 10009 | mute = HDA_AMP_MUTE; |
9669 | if (change) { | 10010 | if (line_nid) |
9670 | /* change speaker according to HP jack state */ | 10011 | snd_hda_codec_amp_stereo(codec, line_nid, HDA_OUTPUT, 0, |
9671 | struct alc_spec *spec = codec->spec; | ||
9672 | unsigned int mute; | ||
9673 | if (spec->jack_present) | ||
9674 | mute = HDA_AMP_MUTE; | ||
9675 | else | ||
9676 | mute = snd_hda_codec_amp_read(codec, 0x15, 0, | ||
9677 | HDA_OUTPUT, 0); | ||
9678 | snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0, | ||
9679 | HDA_AMP_MUTE, mute); | 10012 | HDA_AMP_MUTE, mute); |
10013 | if (speaker_nid && speaker_nid != line_nid) | ||
10014 | snd_hda_codec_amp_stereo(codec, speaker_nid, HDA_OUTPUT, 0, | ||
10015 | HDA_AMP_MUTE, mute); | ||
10016 | } | ||
10017 | |||
10018 | #define alc262_hippo_master_sw_get alc262_hp_master_sw_get | ||
10019 | |||
10020 | static int alc262_hippo_master_sw_put(struct snd_kcontrol *kcontrol, | ||
10021 | struct snd_ctl_elem_value *ucontrol) | ||
10022 | { | ||
10023 | struct hda_codec *codec = snd_kcontrol_chip(kcontrol); | ||
10024 | struct alc_spec *spec = codec->spec; | ||
10025 | int val = !!*ucontrol->value.integer.value; | ||
10026 | |||
10027 | if (val == spec->master_sw) | ||
10028 | return 0; | ||
10029 | spec->master_sw = val; | ||
10030 | alc262_hippo_master_update(codec); | ||
10031 | return 1; | ||
10032 | } | ||
10033 | |||
10034 | #define ALC262_HIPPO_MASTER_SWITCH \ | ||
10035 | { \ | ||
10036 | .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \ | ||
10037 | .name = "Master Playback Switch", \ | ||
10038 | .info = snd_ctl_boolean_mono_info, \ | ||
10039 | .get = alc262_hippo_master_sw_get, \ | ||
10040 | .put = alc262_hippo_master_sw_put, \ | ||
9680 | } | 10041 | } |
9681 | return change; | 10042 | |
10043 | static struct snd_kcontrol_new alc262_hippo_mixer[] = { | ||
10044 | ALC262_HIPPO_MASTER_SWITCH, | ||
10045 | HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x0, HDA_OUTPUT), | ||
10046 | HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), | ||
10047 | HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), | ||
10048 | HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), | ||
10049 | HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), | ||
10050 | HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), | ||
10051 | HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), | ||
10052 | HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), | ||
10053 | HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT), | ||
10054 | HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT), | ||
10055 | HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT), | ||
10056 | HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT), | ||
10057 | { } /* end */ | ||
10058 | }; | ||
10059 | |||
10060 | static struct snd_kcontrol_new alc262_hippo1_mixer[] = { | ||
10061 | HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT), | ||
10062 | ALC262_HIPPO_MASTER_SWITCH, | ||
10063 | HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), | ||
10064 | HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), | ||
10065 | HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), | ||
10066 | HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), | ||
10067 | HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), | ||
10068 | HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), | ||
10069 | HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), | ||
10070 | HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT), | ||
10071 | HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT), | ||
10072 | HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT), | ||
10073 | { } /* end */ | ||
10074 | }; | ||
10075 | |||
10076 | /* mute/unmute internal speaker according to the hp jack and mute state */ | ||
10077 | static void alc262_hippo_automute(struct hda_codec *codec) | ||
10078 | { | ||
10079 | struct alc_spec *spec = codec->spec; | ||
10080 | hda_nid_t hp_nid = spec->autocfg.hp_pins[0]; | ||
10081 | unsigned int present; | ||
10082 | |||
10083 | /* need to execute and sync at first */ | ||
10084 | snd_hda_codec_read(codec, hp_nid, 0, AC_VERB_SET_PIN_SENSE, 0); | ||
10085 | present = snd_hda_codec_read(codec, hp_nid, 0, | ||
10086 | AC_VERB_GET_PIN_SENSE, 0); | ||
10087 | spec->jack_present = (present & 0x80000000) != 0; | ||
10088 | alc262_hippo_master_update(codec); | ||
10089 | } | ||
10090 | |||
10091 | static void alc262_hippo_unsol_event(struct hda_codec *codec, unsigned int res) | ||
10092 | { | ||
10093 | if ((res >> 26) != ALC880_HP_EVENT) | ||
10094 | return; | ||
10095 | alc262_hippo_automute(codec); | ||
10096 | } | ||
10097 | |||
10098 | static void alc262_hippo_init_hook(struct hda_codec *codec) | ||
10099 | { | ||
10100 | struct alc_spec *spec = codec->spec; | ||
10101 | |||
10102 | spec->autocfg.hp_pins[0] = 0x15; | ||
10103 | spec->autocfg.speaker_pins[0] = 0x14; | ||
10104 | alc262_hippo_automute(codec); | ||
10105 | } | ||
10106 | |||
10107 | static void alc262_hippo1_init_hook(struct hda_codec *codec) | ||
10108 | { | ||
10109 | struct alc_spec *spec = codec->spec; | ||
10110 | |||
10111 | spec->autocfg.hp_pins[0] = 0x1b; | ||
10112 | spec->autocfg.speaker_pins[0] = 0x14; | ||
10113 | alc262_hippo_automute(codec); | ||
9682 | } | 10114 | } |
9683 | 10115 | ||
10116 | |||
9684 | static struct snd_kcontrol_new alc262_sony_mixer[] = { | 10117 | static struct snd_kcontrol_new alc262_sony_mixer[] = { |
9685 | HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT), | 10118 | HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT), |
9686 | { | 10119 | ALC262_HIPPO_MASTER_SWITCH, |
9687 | .iface = SNDRV_CTL_ELEM_IFACE_MIXER, | ||
9688 | .name = "Master Playback Switch", | ||
9689 | .info = snd_hda_mixer_amp_switch_info, | ||
9690 | .get = snd_hda_mixer_amp_switch_get, | ||
9691 | .put = alc262_sony_master_sw_put, | ||
9692 | .private_value = HDA_COMPOSE_AMP_VAL(0x15, 3, 0, HDA_OUTPUT), | ||
9693 | }, | ||
9694 | HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), | 10120 | HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), |
9695 | HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), | 10121 | HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), |
9696 | HDA_CODEC_VOLUME("ATAPI Mic Playback Volume", 0x0b, 0x01, HDA_INPUT), | 10122 | HDA_CODEC_VOLUME("ATAPI Mic Playback Volume", 0x0b, 0x01, HDA_INPUT), |
@@ -9699,8 +10125,8 @@ static struct snd_kcontrol_new alc262_sony_mixer[] = { | |||
9699 | }; | 10125 | }; |
9700 | 10126 | ||
9701 | static struct snd_kcontrol_new alc262_benq_t31_mixer[] = { | 10127 | static struct snd_kcontrol_new alc262_benq_t31_mixer[] = { |
9702 | HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), | 10128 | HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT), |
9703 | HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT), | 10129 | ALC262_HIPPO_MASTER_SWITCH, |
9704 | HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT), | 10130 | HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT), |
9705 | HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), | 10131 | HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), |
9706 | HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), | 10132 | HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), |
@@ -9741,34 +10167,15 @@ static struct hda_verb alc262_tyan_verbs[] = { | |||
9741 | }; | 10167 | }; |
9742 | 10168 | ||
9743 | /* unsolicited event for HP jack sensing */ | 10169 | /* unsolicited event for HP jack sensing */ |
9744 | static void alc262_tyan_automute(struct hda_codec *codec) | 10170 | static void alc262_tyan_init_hook(struct hda_codec *codec) |
9745 | { | 10171 | { |
9746 | unsigned int mute; | 10172 | struct alc_spec *spec = codec->spec; |
9747 | unsigned int present; | ||
9748 | 10173 | ||
9749 | snd_hda_codec_read(codec, 0x1b, 0, AC_VERB_SET_PIN_SENSE, 0); | 10174 | spec->autocfg.hp_pins[0] = 0x1b; |
9750 | present = snd_hda_codec_read(codec, 0x1b, 0, | 10175 | spec->autocfg.speaker_pins[0] = 0x15; |
9751 | AC_VERB_GET_PIN_SENSE, 0); | 10176 | alc_automute_amp(codec); |
9752 | present = (present & 0x80000000) != 0; | ||
9753 | if (present) { | ||
9754 | /* mute line output on ATX panel */ | ||
9755 | snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0, | ||
9756 | HDA_AMP_MUTE, HDA_AMP_MUTE); | ||
9757 | } else { | ||
9758 | /* unmute line output if necessary */ | ||
9759 | mute = snd_hda_codec_amp_read(codec, 0x1b, 0, HDA_OUTPUT, 0); | ||
9760 | snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0, | ||
9761 | HDA_AMP_MUTE, mute); | ||
9762 | } | ||
9763 | } | 10177 | } |
9764 | 10178 | ||
9765 | static void alc262_tyan_unsol_event(struct hda_codec *codec, | ||
9766 | unsigned int res) | ||
9767 | { | ||
9768 | if ((res >> 26) != ALC880_HP_EVENT) | ||
9769 | return; | ||
9770 | alc262_tyan_automute(codec); | ||
9771 | } | ||
9772 | 10179 | ||
9773 | #define alc262_capture_mixer alc882_capture_mixer | 10180 | #define alc262_capture_mixer alc882_capture_mixer |
9774 | #define alc262_capture_alt_mixer alc882_capture_alt_mixer | 10181 | #define alc262_capture_alt_mixer alc882_capture_alt_mixer |
@@ -9923,99 +10330,25 @@ static void alc262_dmic_automute(struct hda_codec *codec) | |||
9923 | AC_VERB_SET_CONNECT_SEL, present ? 0x0 : 0x09); | 10330 | AC_VERB_SET_CONNECT_SEL, present ? 0x0 : 0x09); |
9924 | } | 10331 | } |
9925 | 10332 | ||
9926 | /* toggle speaker-output according to the hp-jack state */ | ||
9927 | static void alc262_toshiba_s06_speaker_automute(struct hda_codec *codec) | ||
9928 | { | ||
9929 | unsigned int present; | ||
9930 | unsigned char bits; | ||
9931 | |||
9932 | present = snd_hda_codec_read(codec, 0x15, 0, | ||
9933 | AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; | ||
9934 | bits = present ? 0 : PIN_OUT; | ||
9935 | snd_hda_codec_write(codec, 0x14, 0, | ||
9936 | AC_VERB_SET_PIN_WIDGET_CONTROL, bits); | ||
9937 | } | ||
9938 | |||
9939 | |||
9940 | 10333 | ||
9941 | /* unsolicited event for HP jack sensing */ | 10334 | /* unsolicited event for HP jack sensing */ |
9942 | static void alc262_toshiba_s06_unsol_event(struct hda_codec *codec, | 10335 | static void alc262_toshiba_s06_unsol_event(struct hda_codec *codec, |
9943 | unsigned int res) | 10336 | unsigned int res) |
9944 | { | 10337 | { |
9945 | if ((res >> 26) == ALC880_HP_EVENT) | ||
9946 | alc262_toshiba_s06_speaker_automute(codec); | ||
9947 | if ((res >> 26) == ALC880_MIC_EVENT) | 10338 | if ((res >> 26) == ALC880_MIC_EVENT) |
9948 | alc262_dmic_automute(codec); | 10339 | alc262_dmic_automute(codec); |
9949 | 10340 | else | |
10341 | alc_sku_unsol_event(codec, res); | ||
9950 | } | 10342 | } |
9951 | 10343 | ||
9952 | static void alc262_toshiba_s06_init_hook(struct hda_codec *codec) | 10344 | static void alc262_toshiba_s06_init_hook(struct hda_codec *codec) |
9953 | { | 10345 | { |
9954 | alc262_toshiba_s06_speaker_automute(codec); | ||
9955 | alc262_dmic_automute(codec); | ||
9956 | } | ||
9957 | |||
9958 | /* mute/unmute internal speaker according to the hp jack and mute state */ | ||
9959 | static void alc262_hippo_automute(struct hda_codec *codec) | ||
9960 | { | ||
9961 | struct alc_spec *spec = codec->spec; | 10346 | struct alc_spec *spec = codec->spec; |
9962 | unsigned int mute; | ||
9963 | unsigned int present; | ||
9964 | |||
9965 | /* need to execute and sync at first */ | ||
9966 | snd_hda_codec_read(codec, 0x15, 0, AC_VERB_SET_PIN_SENSE, 0); | ||
9967 | present = snd_hda_codec_read(codec, 0x15, 0, | ||
9968 | AC_VERB_GET_PIN_SENSE, 0); | ||
9969 | spec->jack_present = (present & 0x80000000) != 0; | ||
9970 | if (spec->jack_present) { | ||
9971 | /* mute internal speaker */ | ||
9972 | snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0, | ||
9973 | HDA_AMP_MUTE, HDA_AMP_MUTE); | ||
9974 | } else { | ||
9975 | /* unmute internal speaker if necessary */ | ||
9976 | mute = snd_hda_codec_amp_read(codec, 0x15, 0, HDA_OUTPUT, 0); | ||
9977 | snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0, | ||
9978 | HDA_AMP_MUTE, mute); | ||
9979 | } | ||
9980 | } | ||
9981 | |||
9982 | /* unsolicited event for HP jack sensing */ | ||
9983 | static void alc262_hippo_unsol_event(struct hda_codec *codec, | ||
9984 | unsigned int res) | ||
9985 | { | ||
9986 | if ((res >> 26) != ALC880_HP_EVENT) | ||
9987 | return; | ||
9988 | alc262_hippo_automute(codec); | ||
9989 | } | ||
9990 | |||
9991 | static void alc262_hippo1_automute(struct hda_codec *codec) | ||
9992 | { | ||
9993 | unsigned int mute; | ||
9994 | unsigned int present; | ||
9995 | 10347 | ||
9996 | snd_hda_codec_read(codec, 0x1b, 0, AC_VERB_SET_PIN_SENSE, 0); | 10348 | spec->autocfg.hp_pins[0] = 0x15; |
9997 | present = snd_hda_codec_read(codec, 0x1b, 0, | 10349 | spec->autocfg.speaker_pins[0] = 0x14; |
9998 | AC_VERB_GET_PIN_SENSE, 0); | 10350 | alc_automute_pin(codec); |
9999 | present = (present & 0x80000000) != 0; | 10351 | alc262_dmic_automute(codec); |
10000 | if (present) { | ||
10001 | /* mute internal speaker */ | ||
10002 | snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0, | ||
10003 | HDA_AMP_MUTE, HDA_AMP_MUTE); | ||
10004 | } else { | ||
10005 | /* unmute internal speaker if necessary */ | ||
10006 | mute = snd_hda_codec_amp_read(codec, 0x1b, 0, HDA_OUTPUT, 0); | ||
10007 | snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0, | ||
10008 | HDA_AMP_MUTE, mute); | ||
10009 | } | ||
10010 | } | ||
10011 | |||
10012 | /* unsolicited event for HP jack sensing */ | ||
10013 | static void alc262_hippo1_unsol_event(struct hda_codec *codec, | ||
10014 | unsigned int res) | ||
10015 | { | ||
10016 | if ((res >> 26) != ALC880_HP_EVENT) | ||
10017 | return; | ||
10018 | alc262_hippo1_automute(codec); | ||
10019 | } | 10352 | } |
10020 | 10353 | ||
10021 | /* | 10354 | /* |
@@ -10285,14 +10618,7 @@ static struct snd_kcontrol_new alc262_lenovo_3000_mixer[] = { | |||
10285 | 10618 | ||
10286 | static struct snd_kcontrol_new alc262_toshiba_rx1_mixer[] = { | 10619 | static struct snd_kcontrol_new alc262_toshiba_rx1_mixer[] = { |
10287 | HDA_BIND_VOL("Master Playback Volume", &alc262_fujitsu_bind_master_vol), | 10620 | HDA_BIND_VOL("Master Playback Volume", &alc262_fujitsu_bind_master_vol), |
10288 | { | 10621 | ALC262_HIPPO_MASTER_SWITCH, |
10289 | .iface = SNDRV_CTL_ELEM_IFACE_MIXER, | ||
10290 | .name = "Master Playback Switch", | ||
10291 | .info = snd_hda_mixer_amp_switch_info, | ||
10292 | .get = snd_hda_mixer_amp_switch_get, | ||
10293 | .put = alc262_sony_master_sw_put, | ||
10294 | .private_value = HDA_COMPOSE_AMP_VAL(0x15, 3, 0, HDA_OUTPUT), | ||
10295 | }, | ||
10296 | HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), | 10622 | HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), |
10297 | HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), | 10623 | HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), |
10298 | HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), | 10624 | HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), |
@@ -10639,31 +10965,46 @@ static struct hda_verb alc262_HP_BPC_init_verbs[] = { | |||
10639 | {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20}, | 10965 | {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20}, |
10640 | {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20}, | 10966 | {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20}, |
10641 | 10967 | ||
10642 | {0x14, AC_VERB_SET_AMP_GAIN_MUTE, 0x7023 }, | 10968 | {0x14, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 }, |
10643 | {0x18, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 }, | 10969 | {0x18, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 }, |
10644 | {0x19, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 }, | 10970 | {0x19, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 }, |
10645 | {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, 0x7023 }, | 10971 | {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 }, |
10646 | {0x1c, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 }, | 10972 | {0x1c, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 }, |
10647 | {0x1d, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 }, | 10973 | {0x1d, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 }, |
10648 | 10974 | ||
10649 | 10975 | ||
10650 | /* FIXME: use matrix-type input source selection */ | 10976 | /* FIXME: use matrix-type input source selection */ |
10651 | /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */ | 10977 | /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 0b, 12 */ |
10652 | /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */ | 10978 | /* Input mixer1: only unmute Mic */ |
10653 | {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))}, | 10979 | {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))}, |
10654 | {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x03 << 8))}, | 10980 | {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8))}, |
10655 | {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8))}, | 10981 | {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))}, |
10656 | {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x04 << 8))}, | 10982 | {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))}, |
10983 | {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))}, | ||
10984 | {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x05 << 8))}, | ||
10985 | {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x06 << 8))}, | ||
10986 | {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x07 << 8))}, | ||
10987 | {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x08 << 8))}, | ||
10657 | /* Input mixer2 */ | 10988 | /* Input mixer2 */ |
10658 | {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))}, | 10989 | {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))}, |
10659 | {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x03 << 8))}, | 10990 | {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8))}, |
10660 | {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8))}, | 10991 | {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))}, |
10661 | {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x04 << 8))}, | 10992 | {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))}, |
10993 | {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))}, | ||
10994 | {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x05 << 8))}, | ||
10995 | {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x06 << 8))}, | ||
10996 | {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x07 << 8))}, | ||
10997 | {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x08 << 8))}, | ||
10662 | /* Input mixer3 */ | 10998 | /* Input mixer3 */ |
10663 | {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))}, | 10999 | {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))}, |
10664 | {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x03 << 8))}, | 11000 | {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8))}, |
10665 | {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8))}, | 11001 | {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))}, |
10666 | {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x04 << 8))}, | 11002 | {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))}, |
11003 | {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))}, | ||
11004 | {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x05 << 8))}, | ||
11005 | {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x06 << 8))}, | ||
11006 | {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x07 << 8))}, | ||
11007 | {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x08 << 8))}, | ||
10667 | 11008 | ||
10668 | {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, | 11009 | {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, |
10669 | 11010 | ||
@@ -10843,6 +11184,8 @@ static int alc262_parse_auto_config(struct hda_codec *codec) | |||
10843 | if (err < 0) | 11184 | if (err < 0) |
10844 | return err; | 11185 | return err; |
10845 | 11186 | ||
11187 | alc_ssid_check(codec, 0x15, 0x14, 0x1b); | ||
11188 | |||
10846 | return 1; | 11189 | return 1; |
10847 | } | 11190 | } |
10848 | 11191 | ||
@@ -10945,7 +11288,7 @@ static struct alc_config_preset alc262_presets[] = { | |||
10945 | .input_mux = &alc262_capture_source, | 11288 | .input_mux = &alc262_capture_source, |
10946 | }, | 11289 | }, |
10947 | [ALC262_HIPPO] = { | 11290 | [ALC262_HIPPO] = { |
10948 | .mixers = { alc262_base_mixer }, | 11291 | .mixers = { alc262_hippo_mixer }, |
10949 | .init_verbs = { alc262_init_verbs, alc262_hippo_unsol_verbs}, | 11292 | .init_verbs = { alc262_init_verbs, alc262_hippo_unsol_verbs}, |
10950 | .num_dacs = ARRAY_SIZE(alc262_dac_nids), | 11293 | .num_dacs = ARRAY_SIZE(alc262_dac_nids), |
10951 | .dac_nids = alc262_dac_nids, | 11294 | .dac_nids = alc262_dac_nids, |
@@ -10955,7 +11298,7 @@ static struct alc_config_preset alc262_presets[] = { | |||
10955 | .channel_mode = alc262_modes, | 11298 | .channel_mode = alc262_modes, |
10956 | .input_mux = &alc262_capture_source, | 11299 | .input_mux = &alc262_capture_source, |
10957 | .unsol_event = alc262_hippo_unsol_event, | 11300 | .unsol_event = alc262_hippo_unsol_event, |
10958 | .init_hook = alc262_hippo_automute, | 11301 | .init_hook = alc262_hippo_init_hook, |
10959 | }, | 11302 | }, |
10960 | [ALC262_HIPPO_1] = { | 11303 | [ALC262_HIPPO_1] = { |
10961 | .mixers = { alc262_hippo1_mixer }, | 11304 | .mixers = { alc262_hippo1_mixer }, |
@@ -10967,8 +11310,8 @@ static struct alc_config_preset alc262_presets[] = { | |||
10967 | .num_channel_mode = ARRAY_SIZE(alc262_modes), | 11310 | .num_channel_mode = ARRAY_SIZE(alc262_modes), |
10968 | .channel_mode = alc262_modes, | 11311 | .channel_mode = alc262_modes, |
10969 | .input_mux = &alc262_capture_source, | 11312 | .input_mux = &alc262_capture_source, |
10970 | .unsol_event = alc262_hippo1_unsol_event, | 11313 | .unsol_event = alc262_hippo_unsol_event, |
10971 | .init_hook = alc262_hippo1_automute, | 11314 | .init_hook = alc262_hippo1_init_hook, |
10972 | }, | 11315 | }, |
10973 | [ALC262_FUJITSU] = { | 11316 | [ALC262_FUJITSU] = { |
10974 | .mixers = { alc262_fujitsu_mixer }, | 11317 | .mixers = { alc262_fujitsu_mixer }, |
@@ -11030,7 +11373,7 @@ static struct alc_config_preset alc262_presets[] = { | |||
11030 | .num_channel_mode = ARRAY_SIZE(alc262_modes), | 11373 | .num_channel_mode = ARRAY_SIZE(alc262_modes), |
11031 | .channel_mode = alc262_modes, | 11374 | .channel_mode = alc262_modes, |
11032 | .input_mux = &alc262_capture_source, | 11375 | .input_mux = &alc262_capture_source, |
11033 | .unsol_event = alc262_hp_t5735_unsol_event, | 11376 | .unsol_event = alc_automute_amp_unsol_event, |
11034 | .init_hook = alc262_hp_t5735_init_hook, | 11377 | .init_hook = alc262_hp_t5735_init_hook, |
11035 | }, | 11378 | }, |
11036 | [ALC262_HP_RP5700] = { | 11379 | [ALC262_HP_RP5700] = { |
@@ -11062,7 +11405,7 @@ static struct alc_config_preset alc262_presets[] = { | |||
11062 | .channel_mode = alc262_modes, | 11405 | .channel_mode = alc262_modes, |
11063 | .input_mux = &alc262_capture_source, | 11406 | .input_mux = &alc262_capture_source, |
11064 | .unsol_event = alc262_hippo_unsol_event, | 11407 | .unsol_event = alc262_hippo_unsol_event, |
11065 | .init_hook = alc262_hippo_automute, | 11408 | .init_hook = alc262_hippo_init_hook, |
11066 | }, | 11409 | }, |
11067 | [ALC262_BENQ_T31] = { | 11410 | [ALC262_BENQ_T31] = { |
11068 | .mixers = { alc262_benq_t31_mixer }, | 11411 | .mixers = { alc262_benq_t31_mixer }, |
@@ -11074,7 +11417,7 @@ static struct alc_config_preset alc262_presets[] = { | |||
11074 | .channel_mode = alc262_modes, | 11417 | .channel_mode = alc262_modes, |
11075 | .input_mux = &alc262_capture_source, | 11418 | .input_mux = &alc262_capture_source, |
11076 | .unsol_event = alc262_hippo_unsol_event, | 11419 | .unsol_event = alc262_hippo_unsol_event, |
11077 | .init_hook = alc262_hippo_automute, | 11420 | .init_hook = alc262_hippo_init_hook, |
11078 | }, | 11421 | }, |
11079 | [ALC262_ULTRA] = { | 11422 | [ALC262_ULTRA] = { |
11080 | .mixers = { alc262_ultra_mixer }, | 11423 | .mixers = { alc262_ultra_mixer }, |
@@ -11139,7 +11482,7 @@ static struct alc_config_preset alc262_presets[] = { | |||
11139 | .channel_mode = alc262_modes, | 11482 | .channel_mode = alc262_modes, |
11140 | .input_mux = &alc262_capture_source, | 11483 | .input_mux = &alc262_capture_source, |
11141 | .unsol_event = alc262_hippo_unsol_event, | 11484 | .unsol_event = alc262_hippo_unsol_event, |
11142 | .init_hook = alc262_hippo_automute, | 11485 | .init_hook = alc262_hippo_init_hook, |
11143 | }, | 11486 | }, |
11144 | [ALC262_TYAN] = { | 11487 | [ALC262_TYAN] = { |
11145 | .mixers = { alc262_tyan_mixer }, | 11488 | .mixers = { alc262_tyan_mixer }, |
@@ -11151,8 +11494,8 @@ static struct alc_config_preset alc262_presets[] = { | |||
11151 | .num_channel_mode = ARRAY_SIZE(alc262_modes), | 11494 | .num_channel_mode = ARRAY_SIZE(alc262_modes), |
11152 | .channel_mode = alc262_modes, | 11495 | .channel_mode = alc262_modes, |
11153 | .input_mux = &alc262_capture_source, | 11496 | .input_mux = &alc262_capture_source, |
11154 | .unsol_event = alc262_tyan_unsol_event, | 11497 | .unsol_event = alc_automute_amp_unsol_event, |
11155 | .init_hook = alc262_tyan_automute, | 11498 | .init_hook = alc262_tyan_init_hook, |
11156 | }, | 11499 | }, |
11157 | }; | 11500 | }; |
11158 | 11501 | ||
@@ -11187,8 +11530,8 @@ static int patch_alc262(struct hda_codec *codec) | |||
11187 | alc262_cfg_tbl); | 11530 | alc262_cfg_tbl); |
11188 | 11531 | ||
11189 | if (board_config < 0) { | 11532 | if (board_config < 0) { |
11190 | printk(KERN_INFO "hda_codec: Unknown model for ALC262, " | 11533 | printk(KERN_INFO "hda_codec: Unknown model for %s, " |
11191 | "trying auto-probe from BIOS...\n"); | 11534 | "trying auto-probe from BIOS...\n", codec->chip_name); |
11192 | board_config = ALC262_AUTO; | 11535 | board_config = ALC262_AUTO; |
11193 | } | 11536 | } |
11194 | 11537 | ||
@@ -11217,11 +11560,9 @@ static int patch_alc262(struct hda_codec *codec) | |||
11217 | if (board_config != ALC262_AUTO) | 11560 | if (board_config != ALC262_AUTO) |
11218 | setup_preset(spec, &alc262_presets[board_config]); | 11561 | setup_preset(spec, &alc262_presets[board_config]); |
11219 | 11562 | ||
11220 | spec->stream_name_analog = "ALC262 Analog"; | ||
11221 | spec->stream_analog_playback = &alc262_pcm_analog_playback; | 11563 | spec->stream_analog_playback = &alc262_pcm_analog_playback; |
11222 | spec->stream_analog_capture = &alc262_pcm_analog_capture; | 11564 | spec->stream_analog_capture = &alc262_pcm_analog_capture; |
11223 | 11565 | ||
11224 | spec->stream_name_digital = "ALC262 Digital"; | ||
11225 | spec->stream_digital_playback = &alc262_pcm_digital_playback; | 11566 | spec->stream_digital_playback = &alc262_pcm_digital_playback; |
11226 | spec->stream_digital_capture = &alc262_pcm_digital_capture; | 11567 | spec->stream_digital_capture = &alc262_pcm_digital_capture; |
11227 | 11568 | ||
@@ -11296,6 +11637,17 @@ static struct snd_kcontrol_new alc268_base_mixer[] = { | |||
11296 | { } | 11637 | { } |
11297 | }; | 11638 | }; |
11298 | 11639 | ||
11640 | static struct snd_kcontrol_new alc268_toshiba_mixer[] = { | ||
11641 | /* output mixer control */ | ||
11642 | HDA_CODEC_VOLUME("Front Playback Volume", 0x2, 0x0, HDA_OUTPUT), | ||
11643 | HDA_CODEC_VOLUME("Headphone Playback Volume", 0x3, 0x0, HDA_OUTPUT), | ||
11644 | ALC262_HIPPO_MASTER_SWITCH, | ||
11645 | HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), | ||
11646 | HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT), | ||
11647 | HDA_CODEC_VOLUME("Line In Boost", 0x1a, 0, HDA_INPUT), | ||
11648 | { } | ||
11649 | }; | ||
11650 | |||
11299 | /* bind Beep switches of both NID 0x0f and 0x10 */ | 11651 | /* bind Beep switches of both NID 0x0f and 0x10 */ |
11300 | static struct hda_bind_ctls alc268_bind_beep_sw = { | 11652 | static struct hda_bind_ctls alc268_bind_beep_sw = { |
11301 | .ops = &snd_hda_bind_sw, | 11653 | .ops = &snd_hda_bind_sw, |
@@ -11319,8 +11671,6 @@ static struct hda_verb alc268_eapd_verbs[] = { | |||
11319 | }; | 11671 | }; |
11320 | 11672 | ||
11321 | /* Toshiba specific */ | 11673 | /* Toshiba specific */ |
11322 | #define alc268_toshiba_automute alc262_hippo_automute | ||
11323 | |||
11324 | static struct hda_verb alc268_toshiba_verbs[] = { | 11674 | static struct hda_verb alc268_toshiba_verbs[] = { |
11325 | {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, | 11675 | {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, |
11326 | { } /* end */ | 11676 | { } /* end */ |
@@ -11456,13 +11806,8 @@ static struct hda_verb alc268_acer_verbs[] = { | |||
11456 | }; | 11806 | }; |
11457 | 11807 | ||
11458 | /* unsolicited event for HP jack sensing */ | 11808 | /* unsolicited event for HP jack sensing */ |
11459 | static void alc268_toshiba_unsol_event(struct hda_codec *codec, | 11809 | #define alc268_toshiba_unsol_event alc262_hippo_unsol_event |
11460 | unsigned int res) | 11810 | #define alc268_toshiba_init_hook alc262_hippo_init_hook |
11461 | { | ||
11462 | if ((res >> 26) != ALC880_HP_EVENT) | ||
11463 | return; | ||
11464 | alc268_toshiba_automute(codec); | ||
11465 | } | ||
11466 | 11811 | ||
11467 | static void alc268_acer_unsol_event(struct hda_codec *codec, | 11812 | static void alc268_acer_unsol_event(struct hda_codec *codec, |
11468 | unsigned int res) | 11813 | unsigned int res) |
@@ -11537,30 +11882,15 @@ static struct hda_verb alc268_dell_verbs[] = { | |||
11537 | }; | 11882 | }; |
11538 | 11883 | ||
11539 | /* mute/unmute internal speaker according to the hp jack and mute state */ | 11884 | /* mute/unmute internal speaker according to the hp jack and mute state */ |
11540 | static void alc268_dell_automute(struct hda_codec *codec) | 11885 | static void alc268_dell_init_hook(struct hda_codec *codec) |
11541 | { | 11886 | { |
11542 | unsigned int present; | 11887 | struct alc_spec *spec = codec->spec; |
11543 | unsigned int mute; | ||
11544 | |||
11545 | present = snd_hda_codec_read(codec, 0x15, 0, AC_VERB_GET_PIN_SENSE, 0); | ||
11546 | if (present & 0x80000000) | ||
11547 | mute = HDA_AMP_MUTE; | ||
11548 | else | ||
11549 | mute = snd_hda_codec_amp_read(codec, 0x15, 0, HDA_OUTPUT, 0); | ||
11550 | snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0, | ||
11551 | HDA_AMP_MUTE, mute); | ||
11552 | } | ||
11553 | 11888 | ||
11554 | static void alc268_dell_unsol_event(struct hda_codec *codec, | 11889 | spec->autocfg.hp_pins[0] = 0x15; |
11555 | unsigned int res) | 11890 | spec->autocfg.speaker_pins[0] = 0x14; |
11556 | { | 11891 | alc_automute_pin(codec); |
11557 | if ((res >> 26) != ALC880_HP_EVENT) | ||
11558 | return; | ||
11559 | alc268_dell_automute(codec); | ||
11560 | } | 11892 | } |
11561 | 11893 | ||
11562 | #define alc268_dell_init_hook alc268_dell_automute | ||
11563 | |||
11564 | static struct snd_kcontrol_new alc267_quanta_il1_mixer[] = { | 11894 | static struct snd_kcontrol_new alc267_quanta_il1_mixer[] = { |
11565 | HDA_CODEC_VOLUME("Speaker Playback Volume", 0x2, 0x0, HDA_OUTPUT), | 11895 | HDA_CODEC_VOLUME("Speaker Playback Volume", 0x2, 0x0, HDA_OUTPUT), |
11566 | HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT), | 11896 | HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT), |
@@ -11579,16 +11909,6 @@ static struct hda_verb alc267_quanta_il1_verbs[] = { | |||
11579 | { } | 11909 | { } |
11580 | }; | 11910 | }; |
11581 | 11911 | ||
11582 | static void alc267_quanta_il1_hp_automute(struct hda_codec *codec) | ||
11583 | { | ||
11584 | unsigned int present; | ||
11585 | |||
11586 | present = snd_hda_codec_read(codec, 0x15, 0, AC_VERB_GET_PIN_SENSE, 0) | ||
11587 | & AC_PINSENSE_PRESENCE; | ||
11588 | snd_hda_codec_write(codec, 0x14, 0, AC_VERB_SET_PIN_WIDGET_CONTROL, | ||
11589 | present ? 0 : PIN_OUT); | ||
11590 | } | ||
11591 | |||
11592 | static void alc267_quanta_il1_mic_automute(struct hda_codec *codec) | 11912 | static void alc267_quanta_il1_mic_automute(struct hda_codec *codec) |
11593 | { | 11913 | { |
11594 | unsigned int present; | 11914 | unsigned int present; |
@@ -11600,9 +11920,13 @@ static void alc267_quanta_il1_mic_automute(struct hda_codec *codec) | |||
11600 | present ? 0x00 : 0x01); | 11920 | present ? 0x00 : 0x01); |
11601 | } | 11921 | } |
11602 | 11922 | ||
11603 | static void alc267_quanta_il1_automute(struct hda_codec *codec) | 11923 | static void alc267_quanta_il1_init_hook(struct hda_codec *codec) |
11604 | { | 11924 | { |
11605 | alc267_quanta_il1_hp_automute(codec); | 11925 | struct alc_spec *spec = codec->spec; |
11926 | |||
11927 | spec->autocfg.hp_pins[0] = 0x15; | ||
11928 | spec->autocfg.speaker_pins[0] = 0x14; | ||
11929 | alc_automute_pin(codec); | ||
11606 | alc267_quanta_il1_mic_automute(codec); | 11930 | alc267_quanta_il1_mic_automute(codec); |
11607 | } | 11931 | } |
11608 | 11932 | ||
@@ -11610,12 +11934,12 @@ static void alc267_quanta_il1_unsol_event(struct hda_codec *codec, | |||
11610 | unsigned int res) | 11934 | unsigned int res) |
11611 | { | 11935 | { |
11612 | switch (res >> 26) { | 11936 | switch (res >> 26) { |
11613 | case ALC880_HP_EVENT: | ||
11614 | alc267_quanta_il1_hp_automute(codec); | ||
11615 | break; | ||
11616 | case ALC880_MIC_EVENT: | 11937 | case ALC880_MIC_EVENT: |
11617 | alc267_quanta_il1_mic_automute(codec); | 11938 | alc267_quanta_il1_mic_automute(codec); |
11618 | break; | 11939 | break; |
11940 | default: | ||
11941 | alc_sku_unsol_event(codec, res); | ||
11942 | break; | ||
11619 | } | 11943 | } |
11620 | } | 11944 | } |
11621 | 11945 | ||
@@ -12063,16 +12387,16 @@ static struct snd_pci_quirk alc268_cfg_tbl[] = { | |||
12063 | ALC268_ACER_ASPIRE_ONE), | 12387 | ALC268_ACER_ASPIRE_ONE), |
12064 | SND_PCI_QUIRK(0x1028, 0x0253, "Dell OEM", ALC268_DELL), | 12388 | SND_PCI_QUIRK(0x1028, 0x0253, "Dell OEM", ALC268_DELL), |
12065 | SND_PCI_QUIRK(0x1028, 0x02b0, "Dell Inspiron Mini9", ALC268_DELL), | 12389 | SND_PCI_QUIRK(0x1028, 0x02b0, "Dell Inspiron Mini9", ALC268_DELL), |
12066 | SND_PCI_QUIRK(0x103c, 0x30cc, "TOSHIBA", ALC268_TOSHIBA), | 12390 | SND_PCI_QUIRK_MASK(0x103c, 0xff00, 0x3000, "HP TX25xx series", |
12067 | SND_PCI_QUIRK(0x103c, 0x30f1, "HP TX25xx series", ALC268_TOSHIBA), | 12391 | ALC268_TOSHIBA), |
12068 | SND_PCI_QUIRK(0x1043, 0x1205, "ASUS W7J", ALC268_3ST), | 12392 | SND_PCI_QUIRK(0x1043, 0x1205, "ASUS W7J", ALC268_3ST), |
12069 | SND_PCI_QUIRK(0x1179, 0xff10, "TOSHIBA A205", ALC268_TOSHIBA), | 12393 | SND_PCI_QUIRK(0x1170, 0x0040, "ZEPTO", ALC268_ZEPTO), |
12070 | SND_PCI_QUIRK(0x1179, 0xff50, "TOSHIBA A305", ALC268_TOSHIBA), | 12394 | SND_PCI_QUIRK_MASK(0x1179, 0xff00, 0xff00, "TOSHIBA A/Lx05", |
12071 | SND_PCI_QUIRK(0x1179, 0xff64, "TOSHIBA L305", ALC268_TOSHIBA), | 12395 | ALC268_TOSHIBA), |
12072 | SND_PCI_QUIRK(0x14c0, 0x0025, "COMPAL IFL90/JFL-92", ALC268_TOSHIBA), | 12396 | SND_PCI_QUIRK(0x14c0, 0x0025, "COMPAL IFL90/JFL-92", ALC268_TOSHIBA), |
12073 | SND_PCI_QUIRK(0x152d, 0x0763, "Diverse (CPR2000)", ALC268_ACER), | 12397 | SND_PCI_QUIRK(0x152d, 0x0763, "Diverse (CPR2000)", ALC268_ACER), |
12074 | SND_PCI_QUIRK(0x152d, 0x0771, "Quanta IL1", ALC267_QUANTA_IL1), | 12398 | SND_PCI_QUIRK(0x152d, 0x0771, "Quanta IL1", ALC267_QUANTA_IL1), |
12075 | SND_PCI_QUIRK(0x1170, 0x0040, "ZEPTO", ALC268_ZEPTO), | 12399 | SND_PCI_QUIRK(0x1854, 0x1775, "LG R510", ALC268_DELL), |
12076 | {} | 12400 | {} |
12077 | }; | 12401 | }; |
12078 | 12402 | ||
@@ -12090,7 +12414,7 @@ static struct alc_config_preset alc268_presets[] = { | |||
12090 | .channel_mode = alc268_modes, | 12414 | .channel_mode = alc268_modes, |
12091 | .input_mux = &alc268_capture_source, | 12415 | .input_mux = &alc268_capture_source, |
12092 | .unsol_event = alc267_quanta_il1_unsol_event, | 12416 | .unsol_event = alc267_quanta_il1_unsol_event, |
12093 | .init_hook = alc267_quanta_il1_automute, | 12417 | .init_hook = alc267_quanta_il1_init_hook, |
12094 | }, | 12418 | }, |
12095 | [ALC268_3ST] = { | 12419 | [ALC268_3ST] = { |
12096 | .mixers = { alc268_base_mixer, alc268_capture_alt_mixer, | 12420 | .mixers = { alc268_base_mixer, alc268_capture_alt_mixer, |
@@ -12108,7 +12432,7 @@ static struct alc_config_preset alc268_presets[] = { | |||
12108 | .input_mux = &alc268_capture_source, | 12432 | .input_mux = &alc268_capture_source, |
12109 | }, | 12433 | }, |
12110 | [ALC268_TOSHIBA] = { | 12434 | [ALC268_TOSHIBA] = { |
12111 | .mixers = { alc268_base_mixer, alc268_capture_alt_mixer, | 12435 | .mixers = { alc268_toshiba_mixer, alc268_capture_alt_mixer, |
12112 | alc268_beep_mixer }, | 12436 | alc268_beep_mixer }, |
12113 | .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs, | 12437 | .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs, |
12114 | alc268_toshiba_verbs }, | 12438 | alc268_toshiba_verbs }, |
@@ -12122,7 +12446,7 @@ static struct alc_config_preset alc268_presets[] = { | |||
12122 | .channel_mode = alc268_modes, | 12446 | .channel_mode = alc268_modes, |
12123 | .input_mux = &alc268_capture_source, | 12447 | .input_mux = &alc268_capture_source, |
12124 | .unsol_event = alc268_toshiba_unsol_event, | 12448 | .unsol_event = alc268_toshiba_unsol_event, |
12125 | .init_hook = alc268_toshiba_automute, | 12449 | .init_hook = alc268_toshiba_init_hook, |
12126 | }, | 12450 | }, |
12127 | [ALC268_ACER] = { | 12451 | [ALC268_ACER] = { |
12128 | .mixers = { alc268_acer_mixer, alc268_capture_alt_mixer, | 12452 | .mixers = { alc268_acer_mixer, alc268_capture_alt_mixer, |
@@ -12185,7 +12509,7 @@ static struct alc_config_preset alc268_presets[] = { | |||
12185 | .hp_nid = 0x02, | 12509 | .hp_nid = 0x02, |
12186 | .num_channel_mode = ARRAY_SIZE(alc268_modes), | 12510 | .num_channel_mode = ARRAY_SIZE(alc268_modes), |
12187 | .channel_mode = alc268_modes, | 12511 | .channel_mode = alc268_modes, |
12188 | .unsol_event = alc268_dell_unsol_event, | 12512 | .unsol_event = alc_sku_unsol_event, |
12189 | .init_hook = alc268_dell_init_hook, | 12513 | .init_hook = alc268_dell_init_hook, |
12190 | .input_mux = &alc268_capture_source, | 12514 | .input_mux = &alc268_capture_source, |
12191 | }, | 12515 | }, |
@@ -12205,7 +12529,7 @@ static struct alc_config_preset alc268_presets[] = { | |||
12205 | .channel_mode = alc268_modes, | 12529 | .channel_mode = alc268_modes, |
12206 | .input_mux = &alc268_capture_source, | 12530 | .input_mux = &alc268_capture_source, |
12207 | .unsol_event = alc268_toshiba_unsol_event, | 12531 | .unsol_event = alc268_toshiba_unsol_event, |
12208 | .init_hook = alc268_toshiba_automute | 12532 | .init_hook = alc268_toshiba_init_hook |
12209 | }, | 12533 | }, |
12210 | #ifdef CONFIG_SND_DEBUG | 12534 | #ifdef CONFIG_SND_DEBUG |
12211 | [ALC268_TEST] = { | 12535 | [ALC268_TEST] = { |
@@ -12243,8 +12567,8 @@ static int patch_alc268(struct hda_codec *codec) | |||
12243 | alc268_cfg_tbl); | 12567 | alc268_cfg_tbl); |
12244 | 12568 | ||
12245 | if (board_config < 0 || board_config >= ALC268_MODEL_LAST) { | 12569 | if (board_config < 0 || board_config >= ALC268_MODEL_LAST) { |
12246 | printk(KERN_INFO "hda_codec: Unknown model for ALC268, " | 12570 | printk(KERN_INFO "hda_codec: Unknown model for %s, " |
12247 | "trying auto-probe from BIOS...\n"); | 12571 | "trying auto-probe from BIOS...\n", codec->chip_name); |
12248 | board_config = ALC268_AUTO; | 12572 | board_config = ALC268_AUTO; |
12249 | } | 12573 | } |
12250 | 12574 | ||
@@ -12265,14 +12589,6 @@ static int patch_alc268(struct hda_codec *codec) | |||
12265 | if (board_config != ALC268_AUTO) | 12589 | if (board_config != ALC268_AUTO) |
12266 | setup_preset(spec, &alc268_presets[board_config]); | 12590 | setup_preset(spec, &alc268_presets[board_config]); |
12267 | 12591 | ||
12268 | if (codec->vendor_id == 0x10ec0267) { | ||
12269 | spec->stream_name_analog = "ALC267 Analog"; | ||
12270 | spec->stream_name_digital = "ALC267 Digital"; | ||
12271 | } else { | ||
12272 | spec->stream_name_analog = "ALC268 Analog"; | ||
12273 | spec->stream_name_digital = "ALC268 Digital"; | ||
12274 | } | ||
12275 | |||
12276 | spec->stream_analog_playback = &alc268_pcm_analog_playback; | 12592 | spec->stream_analog_playback = &alc268_pcm_analog_playback; |
12277 | spec->stream_analog_capture = &alc268_pcm_analog_capture; | 12593 | spec->stream_analog_capture = &alc268_pcm_analog_capture; |
12278 | spec->stream_analog_alt_capture = &alc268_pcm_analog_alt_capture; | 12594 | spec->stream_analog_alt_capture = &alc268_pcm_analog_alt_capture; |
@@ -13099,8 +13415,8 @@ static int patch_alc269(struct hda_codec *codec) | |||
13099 | alc269_cfg_tbl); | 13415 | alc269_cfg_tbl); |
13100 | 13416 | ||
13101 | if (board_config < 0) { | 13417 | if (board_config < 0) { |
13102 | printk(KERN_INFO "hda_codec: Unknown model for ALC269, " | 13418 | printk(KERN_INFO "hda_codec: Unknown model for %s, " |
13103 | "trying auto-probe from BIOS...\n"); | 13419 | "trying auto-probe from BIOS...\n", codec->chip_name); |
13104 | board_config = ALC269_AUTO; | 13420 | board_config = ALC269_AUTO; |
13105 | } | 13421 | } |
13106 | 13422 | ||
@@ -13127,7 +13443,6 @@ static int patch_alc269(struct hda_codec *codec) | |||
13127 | if (board_config != ALC269_AUTO) | 13443 | if (board_config != ALC269_AUTO) |
13128 | setup_preset(spec, &alc269_presets[board_config]); | 13444 | setup_preset(spec, &alc269_presets[board_config]); |
13129 | 13445 | ||
13130 | spec->stream_name_analog = "ALC269 Analog"; | ||
13131 | if (codec->subsystem_id == 0x17aa3bf8) { | 13446 | if (codec->subsystem_id == 0x17aa3bf8) { |
13132 | /* Due to a hardware problem on Lenovo Ideadpad, we need to | 13447 | /* Due to a hardware problem on Lenovo Ideadpad, we need to |
13133 | * fix the sample rate of analog I/O to 44.1kHz | 13448 | * fix the sample rate of analog I/O to 44.1kHz |
@@ -13138,7 +13453,6 @@ static int patch_alc269(struct hda_codec *codec) | |||
13138 | spec->stream_analog_playback = &alc269_pcm_analog_playback; | 13453 | spec->stream_analog_playback = &alc269_pcm_analog_playback; |
13139 | spec->stream_analog_capture = &alc269_pcm_analog_capture; | 13454 | spec->stream_analog_capture = &alc269_pcm_analog_capture; |
13140 | } | 13455 | } |
13141 | spec->stream_name_digital = "ALC269 Digital"; | ||
13142 | spec->stream_digital_playback = &alc269_pcm_digital_playback; | 13456 | spec->stream_digital_playback = &alc269_pcm_digital_playback; |
13143 | spec->stream_digital_capture = &alc269_pcm_digital_capture; | 13457 | spec->stream_digital_capture = &alc269_pcm_digital_capture; |
13144 | 13458 | ||
@@ -13927,7 +14241,6 @@ static void alc861_auto_init_multi_out(struct hda_codec *codec) | |||
13927 | struct alc_spec *spec = codec->spec; | 14241 | struct alc_spec *spec = codec->spec; |
13928 | int i; | 14242 | int i; |
13929 | 14243 | ||
13930 | alc_subsystem_id(codec, 0x0e, 0x0f, 0x0b); | ||
13931 | for (i = 0; i < spec->autocfg.line_outs; i++) { | 14244 | for (i = 0; i < spec->autocfg.line_outs; i++) { |
13932 | hda_nid_t nid = spec->autocfg.line_out_pins[i]; | 14245 | hda_nid_t nid = spec->autocfg.line_out_pins[i]; |
13933 | int pin_type = get_pin_type(spec->autocfg.line_out_type); | 14246 | int pin_type = get_pin_type(spec->autocfg.line_out_type); |
@@ -14010,6 +14323,8 @@ static int alc861_parse_auto_config(struct hda_codec *codec) | |||
14010 | spec->num_adc_nids = ARRAY_SIZE(alc861_adc_nids); | 14323 | spec->num_adc_nids = ARRAY_SIZE(alc861_adc_nids); |
14011 | set_capture_mixer(spec); | 14324 | set_capture_mixer(spec); |
14012 | 14325 | ||
14326 | alc_ssid_check(codec, 0x0e, 0x0f, 0x0b); | ||
14327 | |||
14013 | return 1; | 14328 | return 1; |
14014 | } | 14329 | } |
14015 | 14330 | ||
@@ -14199,8 +14514,8 @@ static int patch_alc861(struct hda_codec *codec) | |||
14199 | alc861_cfg_tbl); | 14514 | alc861_cfg_tbl); |
14200 | 14515 | ||
14201 | if (board_config < 0) { | 14516 | if (board_config < 0) { |
14202 | printk(KERN_INFO "hda_codec: Unknown model for ALC861, " | 14517 | printk(KERN_INFO "hda_codec: Unknown model for %s, " |
14203 | "trying auto-probe from BIOS...\n"); | 14518 | "trying auto-probe from BIOS...\n", codec->chip_name); |
14204 | board_config = ALC861_AUTO; | 14519 | board_config = ALC861_AUTO; |
14205 | } | 14520 | } |
14206 | 14521 | ||
@@ -14227,11 +14542,9 @@ static int patch_alc861(struct hda_codec *codec) | |||
14227 | if (board_config != ALC861_AUTO) | 14542 | if (board_config != ALC861_AUTO) |
14228 | setup_preset(spec, &alc861_presets[board_config]); | 14543 | setup_preset(spec, &alc861_presets[board_config]); |
14229 | 14544 | ||
14230 | spec->stream_name_analog = "ALC861 Analog"; | ||
14231 | spec->stream_analog_playback = &alc861_pcm_analog_playback; | 14545 | spec->stream_analog_playback = &alc861_pcm_analog_playback; |
14232 | spec->stream_analog_capture = &alc861_pcm_analog_capture; | 14546 | spec->stream_analog_capture = &alc861_pcm_analog_capture; |
14233 | 14547 | ||
14234 | spec->stream_name_digital = "ALC861 Digital"; | ||
14235 | spec->stream_digital_playback = &alc861_pcm_digital_playback; | 14548 | spec->stream_digital_playback = &alc861_pcm_digital_playback; |
14236 | spec->stream_digital_capture = &alc861_pcm_digital_capture; | 14549 | spec->stream_digital_capture = &alc861_pcm_digital_capture; |
14237 | 14550 | ||
@@ -14618,19 +14931,6 @@ static struct hda_verb alc861vd_lenovo_unsol_verbs[] = { | |||
14618 | {} | 14931 | {} |
14619 | }; | 14932 | }; |
14620 | 14933 | ||
14621 | /* toggle speaker-output according to the hp-jack state */ | ||
14622 | static void alc861vd_lenovo_hp_automute(struct hda_codec *codec) | ||
14623 | { | ||
14624 | unsigned int present; | ||
14625 | unsigned char bits; | ||
14626 | |||
14627 | present = snd_hda_codec_read(codec, 0x1b, 0, | ||
14628 | AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; | ||
14629 | bits = present ? HDA_AMP_MUTE : 0; | ||
14630 | snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0, | ||
14631 | HDA_AMP_MUTE, bits); | ||
14632 | } | ||
14633 | |||
14634 | static void alc861vd_lenovo_mic_automute(struct hda_codec *codec) | 14934 | static void alc861vd_lenovo_mic_automute(struct hda_codec *codec) |
14635 | { | 14935 | { |
14636 | unsigned int present; | 14936 | unsigned int present; |
@@ -14643,9 +14943,13 @@ static void alc861vd_lenovo_mic_automute(struct hda_codec *codec) | |||
14643 | HDA_AMP_MUTE, bits); | 14943 | HDA_AMP_MUTE, bits); |
14644 | } | 14944 | } |
14645 | 14945 | ||
14646 | static void alc861vd_lenovo_automute(struct hda_codec *codec) | 14946 | static void alc861vd_lenovo_init_hook(struct hda_codec *codec) |
14647 | { | 14947 | { |
14648 | alc861vd_lenovo_hp_automute(codec); | 14948 | struct alc_spec *spec = codec->spec; |
14949 | |||
14950 | spec->autocfg.hp_pins[0] = 0x1b; | ||
14951 | spec->autocfg.speaker_pins[0] = 0x14; | ||
14952 | alc_automute_amp(codec); | ||
14649 | alc861vd_lenovo_mic_automute(codec); | 14953 | alc861vd_lenovo_mic_automute(codec); |
14650 | } | 14954 | } |
14651 | 14955 | ||
@@ -14653,12 +14957,12 @@ static void alc861vd_lenovo_unsol_event(struct hda_codec *codec, | |||
14653 | unsigned int res) | 14957 | unsigned int res) |
14654 | { | 14958 | { |
14655 | switch (res >> 26) { | 14959 | switch (res >> 26) { |
14656 | case ALC880_HP_EVENT: | ||
14657 | alc861vd_lenovo_hp_automute(codec); | ||
14658 | break; | ||
14659 | case ALC880_MIC_EVENT: | 14960 | case ALC880_MIC_EVENT: |
14660 | alc861vd_lenovo_mic_automute(codec); | 14961 | alc861vd_lenovo_mic_automute(codec); |
14661 | break; | 14962 | break; |
14963 | default: | ||
14964 | alc_automute_amp_unsol_event(codec, res); | ||
14965 | break; | ||
14662 | } | 14966 | } |
14663 | } | 14967 | } |
14664 | 14968 | ||
@@ -14708,20 +15012,13 @@ static struct hda_verb alc861vd_dallas_verbs[] = { | |||
14708 | }; | 15012 | }; |
14709 | 15013 | ||
14710 | /* toggle speaker-output according to the hp-jack state */ | 15014 | /* toggle speaker-output according to the hp-jack state */ |
14711 | static void alc861vd_dallas_automute(struct hda_codec *codec) | 15015 | static void alc861vd_dallas_init_hook(struct hda_codec *codec) |
14712 | { | 15016 | { |
14713 | unsigned int present; | 15017 | struct alc_spec *spec = codec->spec; |
14714 | |||
14715 | present = snd_hda_codec_read(codec, 0x15, 0, | ||
14716 | AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; | ||
14717 | snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0, | ||
14718 | HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0); | ||
14719 | } | ||
14720 | 15018 | ||
14721 | static void alc861vd_dallas_unsol_event(struct hda_codec *codec, unsigned int res) | 15019 | spec->autocfg.hp_pins[0] = 0x15; |
14722 | { | 15020 | spec->autocfg.speaker_pins[0] = 0x14; |
14723 | if ((res >> 26) == ALC880_HP_EVENT) | 15021 | alc_automute_amp(codec); |
14724 | alc861vd_dallas_automute(codec); | ||
14725 | } | 15022 | } |
14726 | 15023 | ||
14727 | #ifdef CONFIG_SND_HDA_POWER_SAVE | 15024 | #ifdef CONFIG_SND_HDA_POWER_SAVE |
@@ -14835,7 +15132,7 @@ static struct alc_config_preset alc861vd_presets[] = { | |||
14835 | .channel_mode = alc861vd_3stack_2ch_modes, | 15132 | .channel_mode = alc861vd_3stack_2ch_modes, |
14836 | .input_mux = &alc861vd_capture_source, | 15133 | .input_mux = &alc861vd_capture_source, |
14837 | .unsol_event = alc861vd_lenovo_unsol_event, | 15134 | .unsol_event = alc861vd_lenovo_unsol_event, |
14838 | .init_hook = alc861vd_lenovo_automute, | 15135 | .init_hook = alc861vd_lenovo_init_hook, |
14839 | }, | 15136 | }, |
14840 | [ALC861VD_DALLAS] = { | 15137 | [ALC861VD_DALLAS] = { |
14841 | .mixers = { alc861vd_dallas_mixer }, | 15138 | .mixers = { alc861vd_dallas_mixer }, |
@@ -14845,8 +15142,8 @@ static struct alc_config_preset alc861vd_presets[] = { | |||
14845 | .num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes), | 15142 | .num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes), |
14846 | .channel_mode = alc861vd_3stack_2ch_modes, | 15143 | .channel_mode = alc861vd_3stack_2ch_modes, |
14847 | .input_mux = &alc861vd_dallas_capture_source, | 15144 | .input_mux = &alc861vd_dallas_capture_source, |
14848 | .unsol_event = alc861vd_dallas_unsol_event, | 15145 | .unsol_event = alc_automute_amp_unsol_event, |
14849 | .init_hook = alc861vd_dallas_automute, | 15146 | .init_hook = alc861vd_dallas_init_hook, |
14850 | }, | 15147 | }, |
14851 | [ALC861VD_HP] = { | 15148 | [ALC861VD_HP] = { |
14852 | .mixers = { alc861vd_hp_mixer }, | 15149 | .mixers = { alc861vd_hp_mixer }, |
@@ -14857,8 +15154,8 @@ static struct alc_config_preset alc861vd_presets[] = { | |||
14857 | .num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes), | 15154 | .num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes), |
14858 | .channel_mode = alc861vd_3stack_2ch_modes, | 15155 | .channel_mode = alc861vd_3stack_2ch_modes, |
14859 | .input_mux = &alc861vd_hp_capture_source, | 15156 | .input_mux = &alc861vd_hp_capture_source, |
14860 | .unsol_event = alc861vd_dallas_unsol_event, | 15157 | .unsol_event = alc_automute_amp_unsol_event, |
14861 | .init_hook = alc861vd_dallas_automute, | 15158 | .init_hook = alc861vd_dallas_init_hook, |
14862 | }, | 15159 | }, |
14863 | [ALC660VD_ASUS_V1S] = { | 15160 | [ALC660VD_ASUS_V1S] = { |
14864 | .mixers = { alc861vd_lenovo_mixer }, | 15161 | .mixers = { alc861vd_lenovo_mixer }, |
@@ -14873,7 +15170,7 @@ static struct alc_config_preset alc861vd_presets[] = { | |||
14873 | .channel_mode = alc861vd_3stack_2ch_modes, | 15170 | .channel_mode = alc861vd_3stack_2ch_modes, |
14874 | .input_mux = &alc861vd_capture_source, | 15171 | .input_mux = &alc861vd_capture_source, |
14875 | .unsol_event = alc861vd_lenovo_unsol_event, | 15172 | .unsol_event = alc861vd_lenovo_unsol_event, |
14876 | .init_hook = alc861vd_lenovo_automute, | 15173 | .init_hook = alc861vd_lenovo_init_hook, |
14877 | }, | 15174 | }, |
14878 | }; | 15175 | }; |
14879 | 15176 | ||
@@ -14891,7 +15188,6 @@ static void alc861vd_auto_init_multi_out(struct hda_codec *codec) | |||
14891 | struct alc_spec *spec = codec->spec; | 15188 | struct alc_spec *spec = codec->spec; |
14892 | int i; | 15189 | int i; |
14893 | 15190 | ||
14894 | alc_subsystem_id(codec, 0x15, 0x1b, 0x14); | ||
14895 | for (i = 0; i <= HDA_SIDE; i++) { | 15191 | for (i = 0; i <= HDA_SIDE; i++) { |
14896 | hda_nid_t nid = spec->autocfg.line_out_pins[i]; | 15192 | hda_nid_t nid = spec->autocfg.line_out_pins[i]; |
14897 | int pin_type = get_pin_type(spec->autocfg.line_out_type); | 15193 | int pin_type = get_pin_type(spec->autocfg.line_out_type); |
@@ -15109,6 +15405,8 @@ static int alc861vd_parse_auto_config(struct hda_codec *codec) | |||
15109 | if (err < 0) | 15405 | if (err < 0) |
15110 | return err; | 15406 | return err; |
15111 | 15407 | ||
15408 | alc_ssid_check(codec, 0x15, 0x1b, 0x14); | ||
15409 | |||
15112 | return 1; | 15410 | return 1; |
15113 | } | 15411 | } |
15114 | 15412 | ||
@@ -15140,8 +15438,8 @@ static int patch_alc861vd(struct hda_codec *codec) | |||
15140 | alc861vd_cfg_tbl); | 15438 | alc861vd_cfg_tbl); |
15141 | 15439 | ||
15142 | if (board_config < 0 || board_config >= ALC861VD_MODEL_LAST) { | 15440 | if (board_config < 0 || board_config >= ALC861VD_MODEL_LAST) { |
15143 | printk(KERN_INFO "hda_codec: Unknown model for ALC660VD/" | 15441 | printk(KERN_INFO "hda_codec: Unknown model for %s, " |
15144 | "ALC861VD, trying auto-probe from BIOS...\n"); | 15442 | "trying auto-probe from BIOS...\n", codec->chip_name); |
15145 | board_config = ALC861VD_AUTO; | 15443 | board_config = ALC861VD_AUTO; |
15146 | } | 15444 | } |
15147 | 15445 | ||
@@ -15169,13 +15467,8 @@ static int patch_alc861vd(struct hda_codec *codec) | |||
15169 | setup_preset(spec, &alc861vd_presets[board_config]); | 15467 | setup_preset(spec, &alc861vd_presets[board_config]); |
15170 | 15468 | ||
15171 | if (codec->vendor_id == 0x10ec0660) { | 15469 | if (codec->vendor_id == 0x10ec0660) { |
15172 | spec->stream_name_analog = "ALC660-VD Analog"; | ||
15173 | spec->stream_name_digital = "ALC660-VD Digital"; | ||
15174 | /* always turn on EAPD */ | 15470 | /* always turn on EAPD */ |
15175 | add_verb(spec, alc660vd_eapd_verbs); | 15471 | add_verb(spec, alc660vd_eapd_verbs); |
15176 | } else { | ||
15177 | spec->stream_name_analog = "ALC861VD Analog"; | ||
15178 | spec->stream_name_digital = "ALC861VD Digital"; | ||
15179 | } | 15472 | } |
15180 | 15473 | ||
15181 | spec->stream_analog_playback = &alc861vd_pcm_analog_playback; | 15474 | spec->stream_analog_playback = &alc861vd_pcm_analog_playback; |
@@ -15289,6 +15582,38 @@ static struct hda_input_mux alc663_m51va_capture_source = { | |||
15289 | }, | 15582 | }, |
15290 | }; | 15583 | }; |
15291 | 15584 | ||
15585 | #if 1 /* set to 0 for testing other input sources below */ | ||
15586 | static struct hda_input_mux alc272_nc10_capture_source = { | ||
15587 | .num_items = 2, | ||
15588 | .items = { | ||
15589 | { "Autoselect Mic", 0x0 }, | ||
15590 | { "Internal Mic", 0x1 }, | ||
15591 | }, | ||
15592 | }; | ||
15593 | #else | ||
15594 | static struct hda_input_mux alc272_nc10_capture_source = { | ||
15595 | .num_items = 16, | ||
15596 | .items = { | ||
15597 | { "Autoselect Mic", 0x0 }, | ||
15598 | { "Internal Mic", 0x1 }, | ||
15599 | { "In-0x02", 0x2 }, | ||
15600 | { "In-0x03", 0x3 }, | ||
15601 | { "In-0x04", 0x4 }, | ||
15602 | { "In-0x05", 0x5 }, | ||
15603 | { "In-0x06", 0x6 }, | ||
15604 | { "In-0x07", 0x7 }, | ||
15605 | { "In-0x08", 0x8 }, | ||
15606 | { "In-0x09", 0x9 }, | ||
15607 | { "In-0x0a", 0x0a }, | ||
15608 | { "In-0x0b", 0x0b }, | ||
15609 | { "In-0x0c", 0x0c }, | ||
15610 | { "In-0x0d", 0x0d }, | ||
15611 | { "In-0x0e", 0x0e }, | ||
15612 | { "In-0x0f", 0x0f }, | ||
15613 | }, | ||
15614 | }; | ||
15615 | #endif | ||
15616 | |||
15292 | /* | 15617 | /* |
15293 | * 2ch mode | 15618 | * 2ch mode |
15294 | */ | 15619 | */ |
@@ -15428,10 +15753,8 @@ static struct snd_kcontrol_new alc662_lenovo_101e_mixer[] = { | |||
15428 | }; | 15753 | }; |
15429 | 15754 | ||
15430 | static struct snd_kcontrol_new alc662_eeepc_p701_mixer[] = { | 15755 | static struct snd_kcontrol_new alc662_eeepc_p701_mixer[] = { |
15431 | HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT), | 15756 | HDA_CODEC_VOLUME("Master Playback Volume", 0x02, 0x0, HDA_OUTPUT), |
15432 | 15757 | ALC262_HIPPO_MASTER_SWITCH, | |
15433 | HDA_CODEC_VOLUME("Line-Out Playback Volume", 0x02, 0x0, HDA_OUTPUT), | ||
15434 | HDA_CODEC_MUTE("Line-Out Playback Switch", 0x1b, 0x0, HDA_OUTPUT), | ||
15435 | 15758 | ||
15436 | HDA_CODEC_VOLUME("e-Mic Boost", 0x18, 0, HDA_INPUT), | 15759 | HDA_CODEC_VOLUME("e-Mic Boost", 0x18, 0, HDA_INPUT), |
15437 | HDA_CODEC_VOLUME("e-Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), | 15760 | HDA_CODEC_VOLUME("e-Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), |
@@ -15444,15 +15767,11 @@ static struct snd_kcontrol_new alc662_eeepc_p701_mixer[] = { | |||
15444 | }; | 15767 | }; |
15445 | 15768 | ||
15446 | static struct snd_kcontrol_new alc662_eeepc_ep20_mixer[] = { | 15769 | static struct snd_kcontrol_new alc662_eeepc_ep20_mixer[] = { |
15447 | HDA_CODEC_VOLUME("Line-Out Playback Volume", 0x02, 0x0, HDA_OUTPUT), | 15770 | ALC262_HIPPO_MASTER_SWITCH, |
15448 | HDA_CODEC_MUTE("Line-Out Playback Switch", 0x14, 0x0, HDA_OUTPUT), | 15771 | HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT), |
15449 | HDA_CODEC_VOLUME("Surround Playback Volume", 0x03, 0x0, HDA_OUTPUT), | 15772 | HDA_CODEC_VOLUME("Surround Playback Volume", 0x03, 0x0, HDA_OUTPUT), |
15450 | HDA_BIND_MUTE("Surround Playback Switch", 0x03, 2, HDA_INPUT), | ||
15451 | HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x04, 1, 0x0, HDA_OUTPUT), | 15773 | HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x04, 1, 0x0, HDA_OUTPUT), |
15452 | HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x04, 2, 0x0, HDA_OUTPUT), | 15774 | HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x04, 2, 0x0, HDA_OUTPUT), |
15453 | HDA_BIND_MUTE_MONO("Center Playback Switch", 0x04, 1, 2, HDA_INPUT), | ||
15454 | HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x04, 2, 2, HDA_INPUT), | ||
15455 | HDA_CODEC_MUTE("Speaker Playback Switch", 0x1b, 0x0, HDA_OUTPUT), | ||
15456 | HDA_BIND_MUTE("MuteCtrl Playback Switch", 0x0c, 2, HDA_INPUT), | 15775 | HDA_BIND_MUTE("MuteCtrl Playback Switch", 0x0c, 2, HDA_INPUT), |
15457 | HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), | 15776 | HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), |
15458 | HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), | 15777 | HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), |
@@ -15960,51 +16279,25 @@ static void alc662_eeepc_mic_automute(struct hda_codec *codec) | |||
15960 | static void alc662_eeepc_unsol_event(struct hda_codec *codec, | 16279 | static void alc662_eeepc_unsol_event(struct hda_codec *codec, |
15961 | unsigned int res) | 16280 | unsigned int res) |
15962 | { | 16281 | { |
15963 | if ((res >> 26) == ALC880_HP_EVENT) | ||
15964 | alc262_hippo1_automute( codec ); | ||
15965 | |||
15966 | if ((res >> 26) == ALC880_MIC_EVENT) | 16282 | if ((res >> 26) == ALC880_MIC_EVENT) |
15967 | alc662_eeepc_mic_automute(codec); | 16283 | alc662_eeepc_mic_automute(codec); |
16284 | else | ||
16285 | alc262_hippo_unsol_event(codec, res); | ||
15968 | } | 16286 | } |
15969 | 16287 | ||
15970 | static void alc662_eeepc_inithook(struct hda_codec *codec) | 16288 | static void alc662_eeepc_inithook(struct hda_codec *codec) |
15971 | { | 16289 | { |
15972 | alc262_hippo1_automute( codec ); | 16290 | alc262_hippo1_init_hook(codec); |
15973 | alc662_eeepc_mic_automute(codec); | 16291 | alc662_eeepc_mic_automute(codec); |
15974 | } | 16292 | } |
15975 | 16293 | ||
15976 | static void alc662_eeepc_ep20_automute(struct hda_codec *codec) | ||
15977 | { | ||
15978 | unsigned int mute; | ||
15979 | unsigned int present; | ||
15980 | |||
15981 | snd_hda_codec_read(codec, 0x14, 0, AC_VERB_SET_PIN_SENSE, 0); | ||
15982 | present = snd_hda_codec_read(codec, 0x14, 0, | ||
15983 | AC_VERB_GET_PIN_SENSE, 0); | ||
15984 | present = (present & 0x80000000) != 0; | ||
15985 | if (present) { | ||
15986 | /* mute internal speaker */ | ||
15987 | snd_hda_codec_amp_stereo(codec, 0x1b, HDA_OUTPUT, 0, | ||
15988 | HDA_AMP_MUTE, HDA_AMP_MUTE); | ||
15989 | } else { | ||
15990 | /* unmute internal speaker if necessary */ | ||
15991 | mute = snd_hda_codec_amp_read(codec, 0x14, 0, HDA_OUTPUT, 0); | ||
15992 | snd_hda_codec_amp_stereo(codec, 0x1b, HDA_OUTPUT, 0, | ||
15993 | HDA_AMP_MUTE, mute); | ||
15994 | } | ||
15995 | } | ||
15996 | |||
15997 | /* unsolicited event for HP jack sensing */ | ||
15998 | static void alc662_eeepc_ep20_unsol_event(struct hda_codec *codec, | ||
15999 | unsigned int res) | ||
16000 | { | ||
16001 | if ((res >> 26) == ALC880_HP_EVENT) | ||
16002 | alc662_eeepc_ep20_automute(codec); | ||
16003 | } | ||
16004 | |||
16005 | static void alc662_eeepc_ep20_inithook(struct hda_codec *codec) | 16294 | static void alc662_eeepc_ep20_inithook(struct hda_codec *codec) |
16006 | { | 16295 | { |
16007 | alc662_eeepc_ep20_automute(codec); | 16296 | struct alc_spec *spec = codec->spec; |
16297 | |||
16298 | spec->autocfg.hp_pins[0] = 0x14; | ||
16299 | spec->autocfg.speaker_pins[0] = 0x1b; | ||
16300 | alc262_hippo_master_update(codec); | ||
16008 | } | 16301 | } |
16009 | 16302 | ||
16010 | static void alc663_m51va_speaker_automute(struct hda_codec *codec) | 16303 | static void alc663_m51va_speaker_automute(struct hda_codec *codec) |
@@ -16338,35 +16631,9 @@ static void alc663_g50v_inithook(struct hda_codec *codec) | |||
16338 | alc662_eeepc_mic_automute(codec); | 16631 | alc662_eeepc_mic_automute(codec); |
16339 | } | 16632 | } |
16340 | 16633 | ||
16341 | /* bind hp and internal speaker mute (with plug check) */ | ||
16342 | static int alc662_ecs_master_sw_put(struct snd_kcontrol *kcontrol, | ||
16343 | struct snd_ctl_elem_value *ucontrol) | ||
16344 | { | ||
16345 | struct hda_codec *codec = snd_kcontrol_chip(kcontrol); | ||
16346 | long *valp = ucontrol->value.integer.value; | ||
16347 | int change; | ||
16348 | |||
16349 | change = snd_hda_codec_amp_update(codec, 0x1b, 0, HDA_OUTPUT, 0, | ||
16350 | HDA_AMP_MUTE, | ||
16351 | valp[0] ? 0 : HDA_AMP_MUTE); | ||
16352 | change |= snd_hda_codec_amp_update(codec, 0x1b, 1, HDA_OUTPUT, 0, | ||
16353 | HDA_AMP_MUTE, | ||
16354 | valp[1] ? 0 : HDA_AMP_MUTE); | ||
16355 | if (change) | ||
16356 | alc262_hippo1_automute(codec); | ||
16357 | return change; | ||
16358 | } | ||
16359 | |||
16360 | static struct snd_kcontrol_new alc662_ecs_mixer[] = { | 16634 | static struct snd_kcontrol_new alc662_ecs_mixer[] = { |
16361 | HDA_CODEC_VOLUME("Master Playback Volume", 0x02, 0x0, HDA_OUTPUT), | 16635 | HDA_CODEC_VOLUME("Master Playback Volume", 0x02, 0x0, HDA_OUTPUT), |
16362 | { | 16636 | ALC262_HIPPO_MASTER_SWITCH, |
16363 | .iface = SNDRV_CTL_ELEM_IFACE_MIXER, | ||
16364 | .name = "Master Playback Switch", | ||
16365 | .info = snd_hda_mixer_amp_switch_info, | ||
16366 | .get = snd_hda_mixer_amp_switch_get, | ||
16367 | .put = alc662_ecs_master_sw_put, | ||
16368 | .private_value = HDA_COMPOSE_AMP_VAL(0x1b, 3, 0, HDA_OUTPUT), | ||
16369 | }, | ||
16370 | 16637 | ||
16371 | HDA_CODEC_VOLUME("e-Mic/LineIn Boost", 0x18, 0, HDA_INPUT), | 16638 | HDA_CODEC_VOLUME("e-Mic/LineIn Boost", 0x18, 0, HDA_INPUT), |
16372 | HDA_CODEC_VOLUME("e-Mic/LineIn Playback Volume", 0x0b, 0x0, HDA_INPUT), | 16639 | HDA_CODEC_VOLUME("e-Mic/LineIn Playback Volume", 0x0b, 0x0, HDA_INPUT), |
@@ -16378,6 +16645,23 @@ static struct snd_kcontrol_new alc662_ecs_mixer[] = { | |||
16378 | { } /* end */ | 16645 | { } /* end */ |
16379 | }; | 16646 | }; |
16380 | 16647 | ||
16648 | static struct snd_kcontrol_new alc272_nc10_mixer[] = { | ||
16649 | /* Master Playback automatically created from Speaker and Headphone */ | ||
16650 | HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT), | ||
16651 | HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT), | ||
16652 | HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT), | ||
16653 | HDA_CODEC_MUTE("Headphone Playback Switch", 0x21, 0x0, HDA_OUTPUT), | ||
16654 | |||
16655 | HDA_CODEC_VOLUME("Ext Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), | ||
16656 | HDA_CODEC_MUTE("Ext Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), | ||
16657 | HDA_CODEC_VOLUME("Ext Mic Boost", 0x18, 0, HDA_INPUT), | ||
16658 | |||
16659 | HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), | ||
16660 | HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), | ||
16661 | HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT), | ||
16662 | { } /* end */ | ||
16663 | }; | ||
16664 | |||
16381 | #ifdef CONFIG_SND_HDA_POWER_SAVE | 16665 | #ifdef CONFIG_SND_HDA_POWER_SAVE |
16382 | #define alc662_loopbacks alc880_loopbacks | 16666 | #define alc662_loopbacks alc880_loopbacks |
16383 | #endif | 16667 | #endif |
@@ -16411,6 +16695,9 @@ static const char *alc662_models[ALC662_MODEL_LAST] = { | |||
16411 | [ALC663_ASUS_MODE4] = "asus-mode4", | 16695 | [ALC663_ASUS_MODE4] = "asus-mode4", |
16412 | [ALC663_ASUS_MODE5] = "asus-mode5", | 16696 | [ALC663_ASUS_MODE5] = "asus-mode5", |
16413 | [ALC663_ASUS_MODE6] = "asus-mode6", | 16697 | [ALC663_ASUS_MODE6] = "asus-mode6", |
16698 | [ALC272_DELL] = "dell", | ||
16699 | [ALC272_DELL_ZM1] = "dell-zm1", | ||
16700 | [ALC272_SAMSUNG_NC10] = "samsung-nc10", | ||
16414 | [ALC662_AUTO] = "auto", | 16701 | [ALC662_AUTO] = "auto", |
16415 | }; | 16702 | }; |
16416 | 16703 | ||
@@ -16468,6 +16755,7 @@ static struct snd_pci_quirk alc662_cfg_tbl[] = { | |||
16468 | SND_PCI_QUIRK(0x105b, 0x0cd6, "Foxconn", ALC662_ECS), | 16755 | SND_PCI_QUIRK(0x105b, 0x0cd6, "Foxconn", ALC662_ECS), |
16469 | SND_PCI_QUIRK(0x105b, 0x0d47, "Foxconn 45CMX/45GMX/45CMX-K", | 16756 | SND_PCI_QUIRK(0x105b, 0x0d47, "Foxconn 45CMX/45GMX/45CMX-K", |
16470 | ALC662_3ST_6ch_DIG), | 16757 | ALC662_3ST_6ch_DIG), |
16758 | SND_PCI_QUIRK(0x144d, 0xca00, "Samsung NC10", ALC272_SAMSUNG_NC10), | ||
16471 | SND_PCI_QUIRK(0x1458, 0xa002, "Gigabyte 945GCM-S2L", | 16759 | SND_PCI_QUIRK(0x1458, 0xa002, "Gigabyte 945GCM-S2L", |
16472 | ALC662_3ST_6ch_DIG), | 16760 | ALC662_3ST_6ch_DIG), |
16473 | SND_PCI_QUIRK(0x1565, 0x820f, "Biostar TA780G M2+", ALC662_3ST_6ch_DIG), | 16761 | SND_PCI_QUIRK(0x1565, 0x820f, "Biostar TA780G M2+", ALC662_3ST_6ch_DIG), |
@@ -16558,7 +16846,7 @@ static struct alc_config_preset alc662_presets[] = { | |||
16558 | .num_channel_mode = ARRAY_SIZE(alc662_3ST_6ch_modes), | 16846 | .num_channel_mode = ARRAY_SIZE(alc662_3ST_6ch_modes), |
16559 | .channel_mode = alc662_3ST_6ch_modes, | 16847 | .channel_mode = alc662_3ST_6ch_modes, |
16560 | .input_mux = &alc662_lenovo_101e_capture_source, | 16848 | .input_mux = &alc662_lenovo_101e_capture_source, |
16561 | .unsol_event = alc662_eeepc_ep20_unsol_event, | 16849 | .unsol_event = alc662_eeepc_unsol_event, |
16562 | .init_hook = alc662_eeepc_ep20_inithook, | 16850 | .init_hook = alc662_eeepc_ep20_inithook, |
16563 | }, | 16851 | }, |
16564 | [ALC662_ECS] = { | 16852 | [ALC662_ECS] = { |
@@ -16739,6 +17027,18 @@ static struct alc_config_preset alc662_presets[] = { | |||
16739 | .unsol_event = alc663_m51va_unsol_event, | 17027 | .unsol_event = alc663_m51va_unsol_event, |
16740 | .init_hook = alc663_m51va_inithook, | 17028 | .init_hook = alc663_m51va_inithook, |
16741 | }, | 17029 | }, |
17030 | [ALC272_SAMSUNG_NC10] = { | ||
17031 | .mixers = { alc272_nc10_mixer }, | ||
17032 | .init_verbs = { alc662_init_verbs, | ||
17033 | alc663_21jd_amic_init_verbs }, | ||
17034 | .num_dacs = ARRAY_SIZE(alc272_dac_nids), | ||
17035 | .dac_nids = alc272_dac_nids, | ||
17036 | .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes), | ||
17037 | .channel_mode = alc662_3ST_2ch_modes, | ||
17038 | .input_mux = &alc272_nc10_capture_source, | ||
17039 | .unsol_event = alc663_mode4_unsol_event, | ||
17040 | .init_hook = alc663_mode4_inithook, | ||
17041 | }, | ||
16742 | }; | 17042 | }; |
16743 | 17043 | ||
16744 | 17044 | ||
@@ -16933,7 +17233,6 @@ static void alc662_auto_init_multi_out(struct hda_codec *codec) | |||
16933 | struct alc_spec *spec = codec->spec; | 17233 | struct alc_spec *spec = codec->spec; |
16934 | int i; | 17234 | int i; |
16935 | 17235 | ||
16936 | alc_subsystem_id(codec, 0x15, 0x1b, 0x14); | ||
16937 | for (i = 0; i <= HDA_SIDE; i++) { | 17236 | for (i = 0; i <= HDA_SIDE; i++) { |
16938 | hda_nid_t nid = spec->autocfg.line_out_pins[i]; | 17237 | hda_nid_t nid = spec->autocfg.line_out_pins[i]; |
16939 | int pin_type = get_pin_type(spec->autocfg.line_out_type); | 17238 | int pin_type = get_pin_type(spec->autocfg.line_out_type); |
@@ -17030,6 +17329,8 @@ static int alc662_parse_auto_config(struct hda_codec *codec) | |||
17030 | if (err < 0) | 17329 | if (err < 0) |
17031 | return err; | 17330 | return err; |
17032 | 17331 | ||
17332 | alc_ssid_check(codec, 0x15, 0x1b, 0x14); | ||
17333 | |||
17033 | return 1; | 17334 | return 1; |
17034 | } | 17335 | } |
17035 | 17336 | ||
@@ -17062,8 +17363,8 @@ static int patch_alc662(struct hda_codec *codec) | |||
17062 | alc662_models, | 17363 | alc662_models, |
17063 | alc662_cfg_tbl); | 17364 | alc662_cfg_tbl); |
17064 | if (board_config < 0) { | 17365 | if (board_config < 0) { |
17065 | printk(KERN_INFO "hda_codec: Unknown model for ALC662, " | 17366 | printk(KERN_INFO "hda_codec: Unknown model for %s, " |
17066 | "trying auto-probe from BIOS...\n"); | 17367 | "trying auto-probe from BIOS...\n", codec->chip_name); |
17067 | board_config = ALC662_AUTO; | 17368 | board_config = ALC662_AUTO; |
17068 | } | 17369 | } |
17069 | 17370 | ||
@@ -17090,17 +17391,6 @@ static int patch_alc662(struct hda_codec *codec) | |||
17090 | if (board_config != ALC662_AUTO) | 17391 | if (board_config != ALC662_AUTO) |
17091 | setup_preset(spec, &alc662_presets[board_config]); | 17392 | setup_preset(spec, &alc662_presets[board_config]); |
17092 | 17393 | ||
17093 | if (codec->vendor_id == 0x10ec0663) { | ||
17094 | spec->stream_name_analog = "ALC663 Analog"; | ||
17095 | spec->stream_name_digital = "ALC663 Digital"; | ||
17096 | } else if (codec->vendor_id == 0x10ec0272) { | ||
17097 | spec->stream_name_analog = "ALC272 Analog"; | ||
17098 | spec->stream_name_digital = "ALC272 Digital"; | ||
17099 | } else { | ||
17100 | spec->stream_name_analog = "ALC662 Analog"; | ||
17101 | spec->stream_name_digital = "ALC662 Digital"; | ||
17102 | } | ||
17103 | |||
17104 | spec->stream_analog_playback = &alc662_pcm_analog_playback; | 17394 | spec->stream_analog_playback = &alc662_pcm_analog_playback; |
17105 | spec->stream_analog_capture = &alc662_pcm_analog_capture; | 17395 | spec->stream_analog_capture = &alc662_pcm_analog_capture; |
17106 | 17396 | ||