Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branch 'topic/hda' into for-linus

+1625 -4723
+1 -14
Documentation/sound/alsa/HD-Audio-Models.txt
··· 42 42 43 43 ALC262 44 44 ====== 45 - fujitsu Fujitsu Laptop 46 - benq Benq ED8 47 - benq-t31 Benq T31 48 - hippo Hippo (ATI) with jack detection, Sony UX-90s 49 - hippo_1 Hippo (Benq) with jack detection 50 - toshiba-s06 Toshiba S06 51 - toshiba-rx1 Toshiba RX1 52 - tyan Tyan Thunder n6650W (S2915-E) 53 - ultra Samsung Q1 Ultra Vista model 54 - lenovo-3000 Lenovo 3000 y410 55 - nec NEC Versa S9100 56 - basic fixed pin assignment w/o SPDIF 57 - auto auto-config reading BIOS (default) 45 + N/A 58 46 59 47 ALC267/268 60 48 ========== ··· 338 350 mic-ref Reference board with power management for ports 339 351 dell-s14 Dell laptop 340 352 dell-vostro-3500 Dell Vostro 3500 laptop 341 - hp HP laptops with (inverted) mute-LED 342 353 hp-dv7-4000 HP dv-7 4000 343 354 auto BIOS setup (default) 344 355
+8
include/sound/control.h
··· 227 227 return _snd_ctl_add_slave(master, slave, SND_CTL_SLAVE_NEED_UPDATE); 228 228 } 229 229 230 + /* 231 + * Helper functions for jack-detection controls 232 + */ 233 + struct snd_kcontrol * 234 + snd_kctl_jack_new(const char *name, int idx, void *private_data); 235 + void snd_kctl_jack_report(struct snd_card *card, 236 + struct snd_kcontrol *kctl, bool status); 237 + 230 238 #endif /* __SOUND_CONTROL_H */
+3
sound/core/Kconfig
··· 217 217 config SND_VMASTER 218 218 bool 219 219 220 + config SND_KCTL_JACK 221 + bool 222 + 220 223 config SND_DMA_SGBUF 221 224 def_bool y 222 225 depends on X86
+1
sound/core/Makefile
··· 7 7 snd-$(CONFIG_ISA_DMA_API) += isadma.o 8 8 snd-$(CONFIG_SND_OSSEMUL) += sound_oss.o info_oss.o 9 9 snd-$(CONFIG_SND_VMASTER) += vmaster.o 10 + snd-$(CONFIG_SND_KCTL_JACK) += ctljack.o 10 11 snd-$(CONFIG_SND_JACK) += jack.o 11 12 12 13 snd-pcm-objs := pcm.o pcm_native.o pcm_lib.o pcm_timer.o pcm_misc.o \
+56
sound/core/ctljack.c
··· 1 + /* 2 + * Helper functions for jack-detection kcontrols 3 + * 4 + * Copyright (c) 2011 Takashi Iwai <tiwai@suse.de> 5 + * 6 + * This program is free software; you can redistribute it and/or modify it 7 + * under the terms of the GNU General Public License as published by the Free 8 + * Software Foundation; either version 2 of the License, or (at your option) 9 + * any later version. 10 + */ 11 + 12 + #include <linux/kernel.h> 13 + #include <linux/export.h> 14 + #include <sound/core.h> 15 + #include <sound/control.h> 16 + 17 + #define jack_detect_kctl_info snd_ctl_boolean_mono_info 18 + 19 + static int jack_detect_kctl_get(struct snd_kcontrol *kcontrol, 20 + struct snd_ctl_elem_value *ucontrol) 21 + { 22 + ucontrol->value.integer.value[0] = kcontrol->private_value; 23 + return 0; 24 + } 25 + 26 + static struct snd_kcontrol_new jack_detect_kctl = { 27 + /* name is filled later */ 28 + .iface = SNDRV_CTL_ELEM_IFACE_CARD, 29 + .access = SNDRV_CTL_ELEM_ACCESS_READ, 30 + .info = jack_detect_kctl_info, 31 + .get = jack_detect_kctl_get, 32 + }; 33 + 34 + struct snd_kcontrol * 35 + snd_kctl_jack_new(const char *name, int idx, void *private_data) 36 + { 37 + struct snd_kcontrol *kctl; 38 + kctl = snd_ctl_new1(&jack_detect_kctl, private_data); 39 + if (!kctl) 40 + return NULL; 41 + snprintf(kctl->id.name, sizeof(kctl->id.name), "%s Jack", name); 42 + kctl->id.index = idx; 43 + kctl->private_value = 0; 44 + return kctl; 45 + } 46 + EXPORT_SYMBOL_GPL(snd_kctl_jack_new); 47 + 48 + void snd_kctl_jack_report(struct snd_card *card, 49 + struct snd_kcontrol *kctl, bool status) 50 + { 51 + if (kctl->private_value == status) 52 + return; 53 + kctl->private_value = status; 54 + snd_ctl_notify(card, SNDRV_CTL_EVENT_MASK_VALUE, &kctl->id); 55 + } 56 + EXPORT_SYMBOL_GPL(snd_kctl_jack_report);
+1
sound/pci/hda/Kconfig
··· 2 2 tristate "Intel HD Audio" 3 3 select SND_PCM 4 4 select SND_VMASTER 5 + select SND_KCTL_JACK 5 6 help 6 7 Say Y here to include support for Intel "High Definition 7 8 Audio" (Azalia) and its compatible devices.
+1 -1
sound/pci/hda/Makefile
··· 1 1 snd-hda-intel-objs := hda_intel.o 2 2 3 - snd-hda-codec-y := hda_codec.o 3 + snd-hda-codec-y := hda_codec.o hda_jack.o 4 4 snd-hda-codec-$(CONFIG_SND_HDA_GENERIC) += hda_generic.o 5 5 snd-hda-codec-$(CONFIG_PROC_FS) += hda_proc.o 6 6 snd-hda-codec-$(CONFIG_SND_HDA_HWDEP) += hda_hwdep.o
-875
sound/pci/hda/alc262_quirks.c
··· 1 - /* 2 - * ALC262 quirk models 3 - * included by patch_realtek.c 4 - */ 5 - 6 - /* ALC262 models */ 7 - enum { 8 - ALC262_AUTO, 9 - ALC262_BASIC, 10 - ALC262_HIPPO, 11 - ALC262_HIPPO_1, 12 - ALC262_FUJITSU, 13 - ALC262_BENQ_ED8, 14 - ALC262_BENQ_T31, 15 - ALC262_ULTRA, 16 - ALC262_LENOVO_3000, 17 - ALC262_NEC, 18 - ALC262_TOSHIBA_S06, 19 - ALC262_TOSHIBA_RX1, 20 - ALC262_TYAN, 21 - ALC262_MODEL_LAST /* last tag */ 22 - }; 23 - 24 - #define ALC262_DIGOUT_NID ALC880_DIGOUT_NID 25 - #define ALC262_DIGIN_NID ALC880_DIGIN_NID 26 - 27 - #define alc262_dac_nids alc260_dac_nids 28 - #define alc262_adc_nids alc882_adc_nids 29 - #define alc262_adc_nids_alt alc882_adc_nids_alt 30 - #define alc262_capsrc_nids alc882_capsrc_nids 31 - #define alc262_capsrc_nids_alt alc882_capsrc_nids_alt 32 - 33 - #define alc262_modes alc260_modes 34 - #define alc262_capture_source alc882_capture_source 35 - 36 - static const hda_nid_t alc262_dmic_adc_nids[1] = { 37 - /* ADC0 */ 38 - 0x09 39 - }; 40 - 41 - static const hda_nid_t alc262_dmic_capsrc_nids[1] = { 0x22 }; 42 - 43 - static const struct snd_kcontrol_new alc262_base_mixer[] = { 44 - HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 45 - HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT), 46 - HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), 47 - HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), 48 - HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), 49 - HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), 50 - HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 51 - HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 52 - HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT), 53 - HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT), 54 - HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT), 55 - HDA_CODEC_VOLUME("Front Mic Boost Volume", 0x19, 0, HDA_INPUT), 56 - HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0D, 0x0, HDA_OUTPUT), 57 - HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT), 58 - HDA_CODEC_VOLUME_MONO("Mono Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT), 59 - HDA_CODEC_MUTE_MONO("Mono Playback Switch", 0x16, 2, 0x0, HDA_OUTPUT), 60 - { } /* end */ 61 - }; 62 - 63 - /* bind hp and internal speaker mute (with plug check) as master switch */ 64 - 65 - static int alc262_hippo_master_sw_get(struct snd_kcontrol *kcontrol, 66 - struct snd_ctl_elem_value *ucontrol) 67 - { 68 - struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 69 - struct alc_spec *spec = codec->spec; 70 - *ucontrol->value.integer.value = !spec->master_mute; 71 - return 0; 72 - } 73 - 74 - static int alc262_hippo_master_sw_put(struct snd_kcontrol *kcontrol, 75 - struct snd_ctl_elem_value *ucontrol) 76 - { 77 - struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 78 - struct alc_spec *spec = codec->spec; 79 - int val = !*ucontrol->value.integer.value; 80 - 81 - if (val == spec->master_mute) 82 - return 0; 83 - spec->master_mute = val; 84 - update_outputs(codec); 85 - return 1; 86 - } 87 - 88 - #define ALC262_HIPPO_MASTER_SWITCH \ 89 - { \ 90 - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \ 91 - .name = "Master Playback Switch", \ 92 - .info = snd_ctl_boolean_mono_info, \ 93 - .get = alc262_hippo_master_sw_get, \ 94 - .put = alc262_hippo_master_sw_put, \ 95 - }, \ 96 - { \ 97 - .iface = NID_MAPPING, \ 98 - .name = "Master Playback Switch", \ 99 - .subdevice = SUBDEV_HP(0) | (SUBDEV_LINE(0) << 8) | \ 100 - (SUBDEV_SPEAKER(0) << 16), \ 101 - } 102 - 103 - #define alc262_hp_master_sw_get alc262_hippo_master_sw_get 104 - #define alc262_hp_master_sw_put alc262_hippo_master_sw_put 105 - 106 - static const struct snd_kcontrol_new alc262_hippo_mixer[] = { 107 - ALC262_HIPPO_MASTER_SWITCH, 108 - HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 109 - HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), 110 - HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), 111 - HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), 112 - HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), 113 - HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 114 - HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 115 - HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT), 116 - HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT), 117 - HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT), 118 - HDA_CODEC_VOLUME("Front Mic Boost Volume", 0x19, 0, HDA_INPUT), 119 - HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT), 120 - { } /* end */ 121 - }; 122 - 123 - static const struct snd_kcontrol_new alc262_hippo1_mixer[] = { 124 - HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 125 - ALC262_HIPPO_MASTER_SWITCH, 126 - HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), 127 - HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), 128 - HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), 129 - HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), 130 - HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 131 - HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 132 - HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT), 133 - HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT), 134 - HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT), 135 - HDA_CODEC_VOLUME("Front Mic Boost Volume", 0x19, 0, HDA_INPUT), 136 - { } /* end */ 137 - }; 138 - 139 - /* mute/unmute internal speaker according to the hp jack and mute state */ 140 - static void alc262_hippo_setup(struct hda_codec *codec) 141 - { 142 - struct alc_spec *spec = codec->spec; 143 - 144 - spec->autocfg.hp_pins[0] = 0x15; 145 - spec->autocfg.speaker_pins[0] = 0x14; 146 - alc_simple_setup_automute(spec, ALC_AUTOMUTE_AMP); 147 - } 148 - 149 - static void alc262_hippo1_setup(struct hda_codec *codec) 150 - { 151 - struct alc_spec *spec = codec->spec; 152 - 153 - spec->autocfg.hp_pins[0] = 0x1b; 154 - spec->autocfg.speaker_pins[0] = 0x14; 155 - alc_simple_setup_automute(spec, ALC_AUTOMUTE_AMP); 156 - } 157 - 158 - 159 - static const struct snd_kcontrol_new alc262_sony_mixer[] = { 160 - HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 161 - ALC262_HIPPO_MASTER_SWITCH, 162 - HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 163 - HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 164 - HDA_CODEC_VOLUME("ATAPI Mic Playback Volume", 0x0b, 0x01, HDA_INPUT), 165 - HDA_CODEC_MUTE("ATAPI Mic Playback Switch", 0x0b, 0x01, HDA_INPUT), 166 - { } /* end */ 167 - }; 168 - 169 - static const struct snd_kcontrol_new alc262_benq_t31_mixer[] = { 170 - HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 171 - ALC262_HIPPO_MASTER_SWITCH, 172 - HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT), 173 - HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 174 - HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 175 - HDA_CODEC_VOLUME("ATAPI Mic Playback Volume", 0x0b, 0x01, HDA_INPUT), 176 - HDA_CODEC_MUTE("ATAPI Mic Playback Switch", 0x0b, 0x01, HDA_INPUT), 177 - { } /* end */ 178 - }; 179 - 180 - static const struct snd_kcontrol_new alc262_tyan_mixer[] = { 181 - HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 182 - HDA_BIND_MUTE("Master Playback Switch", 0x0c, 2, HDA_INPUT), 183 - HDA_CODEC_VOLUME("Aux Playback Volume", 0x0b, 0x06, HDA_INPUT), 184 - HDA_CODEC_MUTE("Aux Playback Switch", 0x0b, 0x06, HDA_INPUT), 185 - HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), 186 - HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), 187 - HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 188 - HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 189 - HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT), 190 - HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT), 191 - HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT), 192 - HDA_CODEC_VOLUME("Front Mic Boost Volume", 0x19, 0, HDA_INPUT), 193 - { } /* end */ 194 - }; 195 - 196 - static const struct hda_verb alc262_tyan_verbs[] = { 197 - /* Headphone automute */ 198 - {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT}, 199 - {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 200 - {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, 201 - 202 - /* P11 AUX_IN, white 4-pin connector */ 203 - {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 204 - {0x14, AC_VERB_SET_CONFIG_DEFAULT_BYTES_1, 0xe1}, 205 - {0x14, AC_VERB_SET_CONFIG_DEFAULT_BYTES_2, 0x93}, 206 - {0x14, AC_VERB_SET_CONFIG_DEFAULT_BYTES_3, 0x19}, 207 - 208 - {} 209 - }; 210 - 211 - /* unsolicited event for HP jack sensing */ 212 - static void alc262_tyan_setup(struct hda_codec *codec) 213 - { 214 - struct alc_spec *spec = codec->spec; 215 - 216 - spec->autocfg.hp_pins[0] = 0x1b; 217 - spec->autocfg.speaker_pins[0] = 0x15; 218 - alc_simple_setup_automute(spec, ALC_AUTOMUTE_AMP); 219 - } 220 - 221 - 222 - #define alc262_capture_mixer alc882_capture_mixer 223 - #define alc262_capture_alt_mixer alc882_capture_alt_mixer 224 - 225 - /* 226 - * generic initialization of ADC, input mixers and output mixers 227 - */ 228 - static const struct hda_verb alc262_init_verbs[] = { 229 - /* 230 - * Unmute ADC0-2 and set the default input to mic-in 231 - */ 232 - {0x07, AC_VERB_SET_CONNECT_SEL, 0x00}, 233 - {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 234 - {0x08, AC_VERB_SET_CONNECT_SEL, 0x00}, 235 - {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 236 - {0x09, AC_VERB_SET_CONNECT_SEL, 0x00}, 237 - {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 238 - 239 - /* Mute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback 240 - * mixer widget 241 - * Note: PASD motherboards uses the Line In 2 as the input for 242 - * front panel mic (mic 2) 243 - */ 244 - /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */ 245 - {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 246 - {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 247 - {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, 248 - {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, 249 - {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, 250 - 251 - /* 252 - * Set up output mixers (0x0c - 0x0e) 253 - */ 254 - /* set vol=0 to output mixers */ 255 - {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 256 - {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 257 - {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 258 - /* set up input amps for analog loopback */ 259 - /* Amp Indices: DAC = 0, mixer = 1 */ 260 - {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 261 - {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 262 - {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 263 - {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 264 - {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 265 - {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 266 - 267 - {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40}, 268 - {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0}, 269 - {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40}, 270 - {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24}, 271 - {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20}, 272 - {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20}, 273 - 274 - {0x14, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000}, 275 - {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000}, 276 - {0x16, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000}, 277 - {0x18, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000}, 278 - {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000}, 279 - 280 - {0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, 281 - {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, 282 - 283 - /* FIXME: use matrix-type input source selection */ 284 - /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */ 285 - /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */ 286 - {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))}, 287 - {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))}, 288 - {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))}, 289 - {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))}, 290 - /* Input mixer2 */ 291 - {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))}, 292 - {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))}, 293 - {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))}, 294 - {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))}, 295 - /* Input mixer3 */ 296 - {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))}, 297 - {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))}, 298 - {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))}, 299 - {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))}, 300 - 301 - { } 302 - }; 303 - 304 - static const struct hda_verb alc262_eapd_verbs[] = { 305 - {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2}, 306 - {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2}, 307 - { } 308 - }; 309 - 310 - static const struct hda_verb alc262_hippo1_unsol_verbs[] = { 311 - {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0}, 312 - {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, 313 - {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000}, 314 - 315 - {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT}, 316 - {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 317 - {} 318 - }; 319 - 320 - static const struct hda_verb alc262_sony_unsol_verbs[] = { 321 - {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0}, 322 - {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, 323 - {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24}, // Front Mic 324 - 325 - {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT}, 326 - {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 327 - {} 328 - }; 329 - 330 - static const struct snd_kcontrol_new alc262_toshiba_s06_mixer[] = { 331 - HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 332 - HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT), 333 - HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT), 334 - HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 335 - HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 336 - { } /* end */ 337 - }; 338 - 339 - static const struct hda_verb alc262_toshiba_s06_verbs[] = { 340 - {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 341 - {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 342 - {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 343 - {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, 344 - {0x22, AC_VERB_SET_CONNECT_SEL, 0x09}, 345 - {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24}, 346 - {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_MIC_EVENT}, 347 - {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT}, 348 - {} 349 - }; 350 - 351 - static void alc262_toshiba_s06_setup(struct hda_codec *codec) 352 - { 353 - struct alc_spec *spec = codec->spec; 354 - 355 - spec->autocfg.hp_pins[0] = 0x15; 356 - spec->autocfg.speaker_pins[0] = 0x14; 357 - spec->ext_mic_pin = 0x18; 358 - spec->int_mic_pin = 0x12; 359 - spec->auto_mic = 1; 360 - alc_simple_setup_automute(spec, ALC_AUTOMUTE_PIN); 361 - } 362 - 363 - /* 364 - * nec model 365 - * 0x15 = headphone 366 - * 0x16 = internal speaker 367 - * 0x18 = external mic 368 - */ 369 - 370 - static const struct snd_kcontrol_new alc262_nec_mixer[] = { 371 - HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT), 372 - HDA_CODEC_MUTE_MONO("Speaker Playback Switch", 0x16, 0, 0x0, HDA_OUTPUT), 373 - 374 - HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 375 - HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 376 - HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT), 377 - 378 - HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT), 379 - HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT), 380 - { } /* end */ 381 - }; 382 - 383 - static const struct hda_verb alc262_nec_verbs[] = { 384 - /* Unmute Speaker */ 385 - {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 386 - 387 - /* Headphone */ 388 - {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT}, 389 - {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 390 - 391 - /* External mic to headphone */ 392 - {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 393 - /* External mic to speaker */ 394 - {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 395 - {} 396 - }; 397 - 398 - /* 399 - * fujitsu model 400 - * 0x14 = headphone/spdif-out, 0x15 = internal speaker, 401 - * 0x1b = port replicator headphone out 402 - */ 403 - 404 - static const struct hda_verb alc262_fujitsu_unsol_verbs[] = { 405 - {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT}, 406 - {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 407 - {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT}, 408 - {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 409 - {} 410 - }; 411 - 412 - static const struct hda_verb alc262_lenovo_3000_unsol_verbs[] = { 413 - {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT}, 414 - {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 415 - {} 416 - }; 417 - 418 - static const struct hda_verb alc262_lenovo_3000_init_verbs[] = { 419 - /* Front Mic pin: input vref at 50% */ 420 - {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50}, 421 - {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 422 - {} 423 - }; 424 - 425 - static const struct hda_input_mux alc262_fujitsu_capture_source = { 426 - .num_items = 3, 427 - .items = { 428 - { "Mic", 0x0 }, 429 - { "Internal Mic", 0x1 }, 430 - { "CD", 0x4 }, 431 - }, 432 - }; 433 - 434 - static void alc262_fujitsu_setup(struct hda_codec *codec) 435 - { 436 - struct alc_spec *spec = codec->spec; 437 - 438 - spec->autocfg.hp_pins[0] = 0x14; 439 - spec->autocfg.hp_pins[1] = 0x1b; 440 - spec->autocfg.speaker_pins[0] = 0x15; 441 - alc_simple_setup_automute(spec, ALC_AUTOMUTE_AMP); 442 - } 443 - 444 - /* bind volumes of both NID 0x0c and 0x0d */ 445 - static const struct hda_bind_ctls alc262_fujitsu_bind_master_vol = { 446 - .ops = &snd_hda_bind_vol, 447 - .values = { 448 - HDA_COMPOSE_AMP_VAL(0x0c, 3, 0, HDA_OUTPUT), 449 - HDA_COMPOSE_AMP_VAL(0x0d, 3, 0, HDA_OUTPUT), 450 - 0 451 - }, 452 - }; 453 - 454 - static const struct snd_kcontrol_new alc262_fujitsu_mixer[] = { 455 - HDA_BIND_VOL("Master Playback Volume", &alc262_fujitsu_bind_master_vol), 456 - { 457 - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 458 - .name = "Master Playback Switch", 459 - .subdevice = HDA_SUBDEV_NID_FLAG | 0x14, 460 - .info = snd_ctl_boolean_mono_info, 461 - .get = alc262_hp_master_sw_get, 462 - .put = alc262_hp_master_sw_put, 463 - }, 464 - { 465 - .iface = NID_MAPPING, 466 - .name = "Master Playback Switch", 467 - .private_value = 0x1b, 468 - }, 469 - HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), 470 - HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), 471 - HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT), 472 - HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 473 - HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 474 - HDA_CODEC_VOLUME("Internal Mic Boost Volume", 0x19, 0, HDA_INPUT), 475 - HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), 476 - HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), 477 - { } /* end */ 478 - }; 479 - 480 - static void alc262_lenovo_3000_setup(struct hda_codec *codec) 481 - { 482 - struct alc_spec *spec = codec->spec; 483 - 484 - spec->autocfg.hp_pins[0] = 0x1b; 485 - spec->autocfg.speaker_pins[0] = 0x14; 486 - spec->autocfg.speaker_pins[1] = 0x16; 487 - alc_simple_setup_automute(spec, ALC_AUTOMUTE_AMP); 488 - } 489 - 490 - static const struct snd_kcontrol_new alc262_lenovo_3000_mixer[] = { 491 - HDA_BIND_VOL("Master Playback Volume", &alc262_fujitsu_bind_master_vol), 492 - { 493 - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 494 - .name = "Master Playback Switch", 495 - .subdevice = HDA_SUBDEV_NID_FLAG | 0x1b, 496 - .info = snd_ctl_boolean_mono_info, 497 - .get = alc262_hp_master_sw_get, 498 - .put = alc262_hp_master_sw_put, 499 - }, 500 - HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), 501 - HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), 502 - HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT), 503 - HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 504 - HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 505 - HDA_CODEC_VOLUME("Internal Mic Boost Volume", 0x19, 0, HDA_INPUT), 506 - HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), 507 - HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), 508 - { } /* end */ 509 - }; 510 - 511 - static const struct snd_kcontrol_new alc262_toshiba_rx1_mixer[] = { 512 - HDA_BIND_VOL("Master Playback Volume", &alc262_fujitsu_bind_master_vol), 513 - ALC262_HIPPO_MASTER_SWITCH, 514 - HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 515 - HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 516 - HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT), 517 - HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT), 518 - HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT), 519 - HDA_CODEC_VOLUME("Front Mic Boost Volume", 0x19, 0, HDA_INPUT), 520 - { } /* end */ 521 - }; 522 - 523 - /* additional init verbs for Benq laptops */ 524 - static const struct hda_verb alc262_EAPD_verbs[] = { 525 - {0x20, AC_VERB_SET_COEF_INDEX, 0x07}, 526 - {0x20, AC_VERB_SET_PROC_COEF, 0x3070}, 527 - {} 528 - }; 529 - 530 - static const struct hda_verb alc262_benq_t31_EAPD_verbs[] = { 531 - {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, 532 - {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24}, 533 - 534 - {0x20, AC_VERB_SET_COEF_INDEX, 0x07}, 535 - {0x20, AC_VERB_SET_PROC_COEF, 0x3050}, 536 - {} 537 - }; 538 - 539 - /* Samsung Q1 Ultra Vista model setup */ 540 - static const struct snd_kcontrol_new alc262_ultra_mixer[] = { 541 - HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 542 - HDA_BIND_MUTE("Master Playback Switch", 0x0c, 2, HDA_INPUT), 543 - HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x01, HDA_INPUT), 544 - HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x01, HDA_INPUT), 545 - HDA_CODEC_VOLUME("Mic Boost Volume", 0x19, 0, HDA_INPUT), 546 - HDA_CODEC_VOLUME("Headphone Mic Boost Volume", 0x15, 0, HDA_INPUT), 547 - { } /* end */ 548 - }; 549 - 550 - static const struct hda_verb alc262_ultra_verbs[] = { 551 - /* output mixer */ 552 - {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 553 - {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 554 - {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 555 - /* speaker */ 556 - {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 557 - {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 558 - {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 559 - {0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, 560 - /* HP */ 561 - {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 562 - {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 563 - {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 564 - {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, 565 - {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT}, 566 - /* internal mic */ 567 - {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, 568 - {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 569 - /* ADC, choose mic */ 570 - {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 571 - {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 572 - {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 573 - {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, 574 - {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, 575 - {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, 576 - {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)}, 577 - {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)}, 578 - {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)}, 579 - {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(8)}, 580 - {} 581 - }; 582 - 583 - /* mute/unmute internal speaker according to the hp jack and mute state */ 584 - static void alc262_ultra_automute(struct hda_codec *codec) 585 - { 586 - struct alc_spec *spec = codec->spec; 587 - unsigned int mute; 588 - 589 - mute = 0; 590 - /* auto-mute only when HP is used as HP */ 591 - if (!spec->cur_mux[0]) { 592 - spec->hp_jack_present = snd_hda_jack_detect(codec, 0x15); 593 - if (spec->hp_jack_present) 594 - mute = HDA_AMP_MUTE; 595 - } 596 - /* mute/unmute internal speaker */ 597 - snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0, 598 - HDA_AMP_MUTE, mute); 599 - /* mute/unmute HP */ 600 - snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0, 601 - HDA_AMP_MUTE, mute ? 0 : HDA_AMP_MUTE); 602 - } 603 - 604 - /* unsolicited event for HP jack sensing */ 605 - static void alc262_ultra_unsol_event(struct hda_codec *codec, 606 - unsigned int res) 607 - { 608 - if ((res >> 26) != ALC_HP_EVENT) 609 - return; 610 - alc262_ultra_automute(codec); 611 - } 612 - 613 - static const struct hda_input_mux alc262_ultra_capture_source = { 614 - .num_items = 2, 615 - .items = { 616 - { "Mic", 0x1 }, 617 - { "Headphone", 0x7 }, 618 - }, 619 - }; 620 - 621 - static int alc262_ultra_mux_enum_put(struct snd_kcontrol *kcontrol, 622 - struct snd_ctl_elem_value *ucontrol) 623 - { 624 - struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 625 - struct alc_spec *spec = codec->spec; 626 - int ret; 627 - 628 - ret = alc_mux_enum_put(kcontrol, ucontrol); 629 - if (!ret) 630 - return 0; 631 - /* reprogram the HP pin as mic or HP according to the input source */ 632 - snd_hda_codec_write_cache(codec, 0x15, 0, 633 - AC_VERB_SET_PIN_WIDGET_CONTROL, 634 - spec->cur_mux[0] ? PIN_VREF80 : PIN_HP); 635 - alc262_ultra_automute(codec); /* mute/unmute HP */ 636 - return ret; 637 - } 638 - 639 - static const struct snd_kcontrol_new alc262_ultra_capture_mixer[] = { 640 - HDA_CODEC_VOLUME("Capture Volume", 0x07, 0x0, HDA_INPUT), 641 - HDA_CODEC_MUTE("Capture Switch", 0x07, 0x0, HDA_INPUT), 642 - { 643 - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 644 - .name = "Capture Source", 645 - .info = alc_mux_enum_info, 646 - .get = alc_mux_enum_get, 647 - .put = alc262_ultra_mux_enum_put, 648 - }, 649 - { 650 - .iface = NID_MAPPING, 651 - .name = "Capture Source", 652 - .private_value = 0x15, 653 - }, 654 - { } /* end */ 655 - }; 656 - 657 - static const struct hda_verb alc262_toshiba_rx1_unsol_verbs[] = { 658 - 659 - {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, /* Front Speaker */ 660 - {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 661 - {0x14, AC_VERB_SET_CONNECT_SEL, 0x01}, 662 - 663 - {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, /* MIC jack */ 664 - {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, /* Front MIC */ 665 - {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0) }, 666 - {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0) }, 667 - 668 - {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP }, /* HP jack */ 669 - {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, 670 - {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT}, 671 - {} 672 - }; 673 - 674 - /* 675 - * configuration and preset 676 - */ 677 - static const char * const alc262_models[ALC262_MODEL_LAST] = { 678 - [ALC262_BASIC] = "basic", 679 - [ALC262_HIPPO] = "hippo", 680 - [ALC262_HIPPO_1] = "hippo_1", 681 - [ALC262_FUJITSU] = "fujitsu", 682 - [ALC262_BENQ_ED8] = "benq", 683 - [ALC262_BENQ_T31] = "benq-t31", 684 - [ALC262_TOSHIBA_S06] = "toshiba-s06", 685 - [ALC262_TOSHIBA_RX1] = "toshiba-rx1", 686 - [ALC262_ULTRA] = "ultra", 687 - [ALC262_LENOVO_3000] = "lenovo-3000", 688 - [ALC262_NEC] = "nec", 689 - [ALC262_TYAN] = "tyan", 690 - [ALC262_AUTO] = "auto", 691 - }; 692 - 693 - static const struct snd_pci_quirk alc262_cfg_tbl[] = { 694 - SND_PCI_QUIRK(0x1002, 0x437b, "Hippo", ALC262_HIPPO), 695 - SND_PCI_QUIRK(0x1033, 0x8895, "NEC Versa S9100", ALC262_NEC), 696 - SND_PCI_QUIRK(0x1179, 0x0001, "Toshiba dynabook SS RX1", 697 - ALC262_TOSHIBA_RX1), 698 - SND_PCI_QUIRK(0x1179, 0xff7b, "Toshiba S06", ALC262_TOSHIBA_S06), 699 - SND_PCI_QUIRK(0x10cf, 0x1397, "Fujitsu", ALC262_FUJITSU), 700 - SND_PCI_QUIRK(0x10cf, 0x142d, "Fujitsu Lifebook E8410", ALC262_FUJITSU), 701 - SND_PCI_QUIRK(0x10f1, 0x2915, "Tyan Thunder n6650W", ALC262_TYAN), 702 - SND_PCI_QUIRK_MASK(0x144d, 0xff00, 0xc032, "Samsung Q1", 703 - ALC262_ULTRA), 704 - SND_PCI_QUIRK(0x144d, 0xc510, "Samsung Q45", ALC262_HIPPO), 705 - SND_PCI_QUIRK(0x17aa, 0x384e, "Lenovo 3000 y410", ALC262_LENOVO_3000), 706 - SND_PCI_QUIRK(0x17ff, 0x0560, "Benq ED8", ALC262_BENQ_ED8), 707 - SND_PCI_QUIRK(0x17ff, 0x058d, "Benq T31-16", ALC262_BENQ_T31), 708 - SND_PCI_QUIRK(0x17ff, 0x058f, "Benq Hippo", ALC262_HIPPO_1), 709 - {} 710 - }; 711 - 712 - static const struct alc_config_preset alc262_presets[] = { 713 - [ALC262_BASIC] = { 714 - .mixers = { alc262_base_mixer }, 715 - .init_verbs = { alc262_init_verbs }, 716 - .num_dacs = ARRAY_SIZE(alc262_dac_nids), 717 - .dac_nids = alc262_dac_nids, 718 - .hp_nid = 0x03, 719 - .num_channel_mode = ARRAY_SIZE(alc262_modes), 720 - .channel_mode = alc262_modes, 721 - .input_mux = &alc262_capture_source, 722 - }, 723 - [ALC262_HIPPO] = { 724 - .mixers = { alc262_hippo_mixer }, 725 - .init_verbs = { alc262_init_verbs, alc_hp15_unsol_verbs}, 726 - .num_dacs = ARRAY_SIZE(alc262_dac_nids), 727 - .dac_nids = alc262_dac_nids, 728 - .hp_nid = 0x03, 729 - .dig_out_nid = ALC262_DIGOUT_NID, 730 - .num_channel_mode = ARRAY_SIZE(alc262_modes), 731 - .channel_mode = alc262_modes, 732 - .input_mux = &alc262_capture_source, 733 - .unsol_event = alc_sku_unsol_event, 734 - .setup = alc262_hippo_setup, 735 - .init_hook = alc_inithook, 736 - }, 737 - [ALC262_HIPPO_1] = { 738 - .mixers = { alc262_hippo1_mixer }, 739 - .init_verbs = { alc262_init_verbs, alc262_hippo1_unsol_verbs}, 740 - .num_dacs = ARRAY_SIZE(alc262_dac_nids), 741 - .dac_nids = alc262_dac_nids, 742 - .hp_nid = 0x02, 743 - .dig_out_nid = ALC262_DIGOUT_NID, 744 - .num_channel_mode = ARRAY_SIZE(alc262_modes), 745 - .channel_mode = alc262_modes, 746 - .input_mux = &alc262_capture_source, 747 - .unsol_event = alc_sku_unsol_event, 748 - .setup = alc262_hippo1_setup, 749 - .init_hook = alc_inithook, 750 - }, 751 - [ALC262_FUJITSU] = { 752 - .mixers = { alc262_fujitsu_mixer }, 753 - .init_verbs = { alc262_init_verbs, alc262_EAPD_verbs, 754 - alc262_fujitsu_unsol_verbs }, 755 - .num_dacs = ARRAY_SIZE(alc262_dac_nids), 756 - .dac_nids = alc262_dac_nids, 757 - .hp_nid = 0x03, 758 - .dig_out_nid = ALC262_DIGOUT_NID, 759 - .num_channel_mode = ARRAY_SIZE(alc262_modes), 760 - .channel_mode = alc262_modes, 761 - .input_mux = &alc262_fujitsu_capture_source, 762 - .unsol_event = alc_sku_unsol_event, 763 - .setup = alc262_fujitsu_setup, 764 - .init_hook = alc_inithook, 765 - }, 766 - [ALC262_BENQ_ED8] = { 767 - .mixers = { alc262_base_mixer }, 768 - .init_verbs = { alc262_init_verbs, alc262_EAPD_verbs }, 769 - .num_dacs = ARRAY_SIZE(alc262_dac_nids), 770 - .dac_nids = alc262_dac_nids, 771 - .hp_nid = 0x03, 772 - .num_channel_mode = ARRAY_SIZE(alc262_modes), 773 - .channel_mode = alc262_modes, 774 - .input_mux = &alc262_capture_source, 775 - }, 776 - [ALC262_BENQ_T31] = { 777 - .mixers = { alc262_benq_t31_mixer }, 778 - .init_verbs = { alc262_init_verbs, alc262_benq_t31_EAPD_verbs, 779 - alc_hp15_unsol_verbs }, 780 - .num_dacs = ARRAY_SIZE(alc262_dac_nids), 781 - .dac_nids = alc262_dac_nids, 782 - .hp_nid = 0x03, 783 - .num_channel_mode = ARRAY_SIZE(alc262_modes), 784 - .channel_mode = alc262_modes, 785 - .input_mux = &alc262_capture_source, 786 - .unsol_event = alc_sku_unsol_event, 787 - .setup = alc262_hippo_setup, 788 - .init_hook = alc_inithook, 789 - }, 790 - [ALC262_ULTRA] = { 791 - .mixers = { alc262_ultra_mixer }, 792 - .cap_mixer = alc262_ultra_capture_mixer, 793 - .init_verbs = { alc262_ultra_verbs }, 794 - .num_dacs = ARRAY_SIZE(alc262_dac_nids), 795 - .dac_nids = alc262_dac_nids, 796 - .num_channel_mode = ARRAY_SIZE(alc262_modes), 797 - .channel_mode = alc262_modes, 798 - .input_mux = &alc262_ultra_capture_source, 799 - .adc_nids = alc262_adc_nids, /* ADC0 */ 800 - .capsrc_nids = alc262_capsrc_nids, 801 - .num_adc_nids = 1, /* single ADC */ 802 - .unsol_event = alc262_ultra_unsol_event, 803 - .init_hook = alc262_ultra_automute, 804 - }, 805 - [ALC262_LENOVO_3000] = { 806 - .mixers = { alc262_lenovo_3000_mixer }, 807 - .init_verbs = { alc262_init_verbs, alc262_EAPD_verbs, 808 - alc262_lenovo_3000_unsol_verbs, 809 - alc262_lenovo_3000_init_verbs }, 810 - .num_dacs = ARRAY_SIZE(alc262_dac_nids), 811 - .dac_nids = alc262_dac_nids, 812 - .hp_nid = 0x03, 813 - .dig_out_nid = ALC262_DIGOUT_NID, 814 - .num_channel_mode = ARRAY_SIZE(alc262_modes), 815 - .channel_mode = alc262_modes, 816 - .input_mux = &alc262_fujitsu_capture_source, 817 - .unsol_event = alc_sku_unsol_event, 818 - .setup = alc262_lenovo_3000_setup, 819 - .init_hook = alc_inithook, 820 - }, 821 - [ALC262_NEC] = { 822 - .mixers = { alc262_nec_mixer }, 823 - .init_verbs = { alc262_nec_verbs }, 824 - .num_dacs = ARRAY_SIZE(alc262_dac_nids), 825 - .dac_nids = alc262_dac_nids, 826 - .hp_nid = 0x03, 827 - .num_channel_mode = ARRAY_SIZE(alc262_modes), 828 - .channel_mode = alc262_modes, 829 - .input_mux = &alc262_capture_source, 830 - }, 831 - [ALC262_TOSHIBA_S06] = { 832 - .mixers = { alc262_toshiba_s06_mixer }, 833 - .init_verbs = { alc262_init_verbs, alc262_toshiba_s06_verbs, 834 - alc262_eapd_verbs }, 835 - .num_dacs = ARRAY_SIZE(alc262_dac_nids), 836 - .capsrc_nids = alc262_dmic_capsrc_nids, 837 - .dac_nids = alc262_dac_nids, 838 - .adc_nids = alc262_dmic_adc_nids, /* ADC0 */ 839 - .num_adc_nids = 1, /* single ADC */ 840 - .dig_out_nid = ALC262_DIGOUT_NID, 841 - .num_channel_mode = ARRAY_SIZE(alc262_modes), 842 - .channel_mode = alc262_modes, 843 - .unsol_event = alc_sku_unsol_event, 844 - .setup = alc262_toshiba_s06_setup, 845 - .init_hook = alc_inithook, 846 - }, 847 - [ALC262_TOSHIBA_RX1] = { 848 - .mixers = { alc262_toshiba_rx1_mixer }, 849 - .init_verbs = { alc262_init_verbs, alc262_toshiba_rx1_unsol_verbs }, 850 - .num_dacs = ARRAY_SIZE(alc262_dac_nids), 851 - .dac_nids = alc262_dac_nids, 852 - .hp_nid = 0x03, 853 - .num_channel_mode = ARRAY_SIZE(alc262_modes), 854 - .channel_mode = alc262_modes, 855 - .input_mux = &alc262_capture_source, 856 - .unsol_event = alc_sku_unsol_event, 857 - .setup = alc262_hippo_setup, 858 - .init_hook = alc_inithook, 859 - }, 860 - [ALC262_TYAN] = { 861 - .mixers = { alc262_tyan_mixer }, 862 - .init_verbs = { alc262_init_verbs, alc262_tyan_verbs}, 863 - .num_dacs = ARRAY_SIZE(alc262_dac_nids), 864 - .dac_nids = alc262_dac_nids, 865 - .hp_nid = 0x02, 866 - .dig_out_nid = ALC262_DIGOUT_NID, 867 - .num_channel_mode = ARRAY_SIZE(alc262_modes), 868 - .channel_mode = alc262_modes, 869 - .input_mux = &alc262_capture_source, 870 - .unsol_event = alc_sku_unsol_event, 871 - .setup = alc262_tyan_setup, 872 - .init_hook = alc_hp_automute, 873 - }, 874 - }; 875 -
-193
sound/pci/hda/alc880_quirks.c
··· 26 26 ALC880_CLEVO, 27 27 ALC880_TCL_S700, 28 28 ALC880_LG, 29 - ALC880_LG_LW, 30 - ALC880_MEDION_RIM, 31 29 #ifdef CONFIG_SND_DEBUG 32 30 ALC880_TEST, 33 31 #endif ··· 1050 1052 alc_simple_setup_automute(spec, ALC_AUTOMUTE_AMP); 1051 1053 } 1052 1054 1053 - /* 1054 - * LG LW20 1055 - * 1056 - * Pin assignment: 1057 - * Speaker-out: 0x14 1058 - * Mic-In: 0x18 1059 - * Built-in Mic-In: 0x19 1060 - * Line-In: 0x1b 1061 - * HP-Out: 0x1a 1062 - * SPDIF-Out: 0x1e 1063 - */ 1064 - 1065 - static const struct hda_input_mux alc880_lg_lw_capture_source = { 1066 - .num_items = 3, 1067 - .items = { 1068 - { "Mic", 0x0 }, 1069 - { "Internal Mic", 0x1 }, 1070 - { "Line In", 0x2 }, 1071 - }, 1072 - }; 1073 - 1074 - #define alc880_lg_lw_modes alc880_threestack_modes 1075 - 1076 - static const struct snd_kcontrol_new alc880_lg_lw_mixer[] = { 1077 - HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 1078 - HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 1079 - HDA_CODEC_VOLUME("Surround Playback Volume", 0x0f, 0x0, HDA_OUTPUT), 1080 - HDA_BIND_MUTE("Surround Playback Switch", 0x0f, 2, HDA_INPUT), 1081 - HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT), 1082 - HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT), 1083 - HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT), 1084 - HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT), 1085 - HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), 1086 - HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), 1087 - HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 1088 - HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 1089 - HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x01, HDA_INPUT), 1090 - HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x01, HDA_INPUT), 1091 - { 1092 - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 1093 - .name = "Channel Mode", 1094 - .info = alc_ch_mode_info, 1095 - .get = alc_ch_mode_get, 1096 - .put = alc_ch_mode_put, 1097 - }, 1098 - { } /* end */ 1099 - }; 1100 - 1101 - static const struct hda_verb alc880_lg_lw_init_verbs[] = { 1102 - {0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */ 1103 - {0x10, AC_VERB_SET_CONNECT_SEL, 0x02}, /* mic/clfe */ 1104 - {0x12, AC_VERB_SET_CONNECT_SEL, 0x03}, /* line/surround */ 1105 - 1106 - /* set capture source to mic-in */ 1107 - {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 1108 - {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 1109 - {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 1110 - {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)}, 1111 - /* speaker-out */ 1112 - {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 1113 - {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 1114 - /* HP-out */ 1115 - {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 1116 - {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 1117 - /* mic-in to input */ 1118 - {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, 1119 - {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 1120 - /* built-in mic */ 1121 - {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, 1122 - {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 1123 - /* jack sense */ 1124 - {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT}, 1125 - { } 1126 - }; 1127 - 1128 - /* toggle speaker-output according to the hp-jack state */ 1129 - static void alc880_lg_lw_setup(struct hda_codec *codec) 1130 - { 1131 - struct alc_spec *spec = codec->spec; 1132 - 1133 - spec->autocfg.hp_pins[0] = 0x1b; 1134 - spec->autocfg.speaker_pins[0] = 0x14; 1135 - alc_simple_setup_automute(spec, ALC_AUTOMUTE_AMP); 1136 - } 1137 - 1138 - static const struct snd_kcontrol_new alc880_medion_rim_mixer[] = { 1139 - HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 1140 - HDA_BIND_MUTE("Master Playback Switch", 0x0c, 2, HDA_INPUT), 1141 - HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 1142 - HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 1143 - HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), 1144 - HDA_CODEC_MUTE("Internal Playback Switch", 0x0b, 0x1, HDA_INPUT), 1145 - { } /* end */ 1146 - }; 1147 - 1148 - static const struct hda_input_mux alc880_medion_rim_capture_source = { 1149 - .num_items = 2, 1150 - .items = { 1151 - { "Mic", 0x0 }, 1152 - { "Internal Mic", 0x1 }, 1153 - }, 1154 - }; 1155 - 1156 - static const struct hda_verb alc880_medion_rim_init_verbs[] = { 1157 - {0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */ 1158 - 1159 - {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 1160 - {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 1161 - 1162 - /* Mic1 (rear panel) pin widget for input and vref at 80% */ 1163 - {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, 1164 - {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 1165 - /* Mic2 (as headphone out) for HP output */ 1166 - {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 1167 - {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 1168 - /* Internal Speaker */ 1169 - {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 1170 - {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 1171 - 1172 - {0x20, AC_VERB_SET_COEF_INDEX, 0x07}, 1173 - {0x20, AC_VERB_SET_PROC_COEF, 0x3060}, 1174 - 1175 - {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT}, 1176 - { } 1177 - }; 1178 - 1179 - /* toggle speaker-output according to the hp-jack state */ 1180 - static void alc880_medion_rim_automute(struct hda_codec *codec) 1181 - { 1182 - struct alc_spec *spec = codec->spec; 1183 - alc_hp_automute(codec); 1184 - /* toggle EAPD */ 1185 - if (spec->hp_jack_present) 1186 - snd_hda_codec_write(codec, 0x01, 0, AC_VERB_SET_GPIO_DATA, 0); 1187 - else 1188 - snd_hda_codec_write(codec, 0x01, 0, AC_VERB_SET_GPIO_DATA, 2); 1189 - } 1190 - 1191 - static void alc880_medion_rim_unsol_event(struct hda_codec *codec, 1192 - unsigned int res) 1193 - { 1194 - /* Looks like the unsol event is incompatible with the standard 1195 - * definition. 4bit tag is placed at 28 bit! 1196 - */ 1197 - if ((res >> 28) == ALC_HP_EVENT) 1198 - alc880_medion_rim_automute(codec); 1199 - } 1200 - 1201 - static void alc880_medion_rim_setup(struct hda_codec *codec) 1202 - { 1203 - struct alc_spec *spec = codec->spec; 1204 - 1205 - spec->autocfg.hp_pins[0] = 0x14; 1206 - spec->autocfg.speaker_pins[0] = 0x1b; 1207 - alc_simple_setup_automute(spec, ALC_AUTOMUTE_AMP); 1208 - } 1209 - 1210 1055 #ifdef CONFIG_SND_HDA_POWER_SAVE 1211 1056 static const struct hda_amp_list alc880_lg_loopbacks[] = { 1212 1057 { 0x0b, HDA_INPUT, 1 }, ··· 1346 1505 [ALC880_FUJITSU] = "fujitsu", 1347 1506 [ALC880_F1734] = "F1734", 1348 1507 [ALC880_LG] = "lg", 1349 - [ALC880_LG_LW] = "lg-lw", 1350 - [ALC880_MEDION_RIM] = "medion", 1351 1508 #ifdef CONFIG_SND_DEBUG 1352 1509 [ALC880_TEST] = "test", 1353 1510 #endif ··· 1396 1557 SND_PCI_QUIRK(0x1584, 0x9070, "Uniwill", ALC880_UNIWILL), 1397 1558 SND_PCI_QUIRK(0x1584, 0x9077, "Uniwill P53", ALC880_UNIWILL_P53), 1398 1559 SND_PCI_QUIRK(0x161f, 0x203d, "W810", ALC880_W810), 1399 - SND_PCI_QUIRK(0x161f, 0x205d, "Medion Rim 2150", ALC880_MEDION_RIM), 1400 1560 SND_PCI_QUIRK(0x1695, 0x400d, "EPoX", ALC880_5ST_DIG), 1401 1561 SND_PCI_QUIRK(0x1695, 0x4012, "EPox EP-5LDA", ALC880_5ST_DIG), 1402 1562 SND_PCI_QUIRK(0x1734, 0x107c, "FSC F1734", ALC880_F1734), 1403 1563 SND_PCI_QUIRK(0x1734, 0x1094, "FSC Amilo M1451G", ALC880_FUJITSU), 1404 1564 SND_PCI_QUIRK(0x1734, 0x10ac, "FSC AMILO Xi 1526", ALC880_F1734), 1405 1565 SND_PCI_QUIRK(0x1734, 0x10b0, "Fujitsu", ALC880_FUJITSU), 1406 - SND_PCI_QUIRK(0x1854, 0x0018, "LG LW20", ALC880_LG_LW), 1407 1566 SND_PCI_QUIRK(0x1854, 0x003b, "LG", ALC880_LG), 1408 1567 SND_PCI_QUIRK(0x1854, 0x005f, "LG P1 Express", ALC880_LG), 1409 1568 SND_PCI_QUIRK(0x1854, 0x0068, "LG w1", ALC880_LG), 1410 - SND_PCI_QUIRK(0x1854, 0x0077, "LG LW25", ALC880_LG_LW), 1411 1569 SND_PCI_QUIRK(0x19db, 0x4188, "TCL S700", ALC880_TCL_S700), 1412 1570 SND_PCI_QUIRK(0x2668, 0x8086, NULL, ALC880_6ST_DIG), /* broken BIOS */ 1413 1571 SND_PCI_QUIRK(0x8086, 0x2668, NULL, ALC880_6ST_DIG), ··· 1683 1847 #ifdef CONFIG_SND_HDA_POWER_SAVE 1684 1848 .loopbacks = alc880_lg_loopbacks, 1685 1849 #endif 1686 - }, 1687 - [ALC880_LG_LW] = { 1688 - .mixers = { alc880_lg_lw_mixer }, 1689 - .init_verbs = { alc880_volume_init_verbs, 1690 - alc880_lg_lw_init_verbs }, 1691 - .num_dacs = ARRAY_SIZE(alc880_dac_nids), 1692 - .dac_nids = alc880_dac_nids, 1693 - .dig_out_nid = ALC880_DIGOUT_NID, 1694 - .num_channel_mode = ARRAY_SIZE(alc880_lg_lw_modes), 1695 - .channel_mode = alc880_lg_lw_modes, 1696 - .input_mux = &alc880_lg_lw_capture_source, 1697 - .unsol_event = alc_sku_unsol_event, 1698 - .setup = alc880_lg_lw_setup, 1699 - .init_hook = alc_hp_automute, 1700 - }, 1701 - [ALC880_MEDION_RIM] = { 1702 - .mixers = { alc880_medion_rim_mixer }, 1703 - .init_verbs = { alc880_volume_init_verbs, 1704 - alc880_medion_rim_init_verbs, 1705 - alc_gpio2_init_verbs }, 1706 - .num_dacs = ARRAY_SIZE(alc880_dac_nids), 1707 - .dac_nids = alc880_dac_nids, 1708 - .dig_out_nid = ALC880_DIGOUT_NID, 1709 - .num_channel_mode = ARRAY_SIZE(alc880_2_jack_modes), 1710 - .channel_mode = alc880_2_jack_modes, 1711 - .input_mux = &alc880_medion_rim_capture_source, 1712 - .unsol_event = alc880_medion_rim_unsol_event, 1713 - .setup = alc880_medion_rim_setup, 1714 - .init_hook = alc880_medion_rim_automute, 1715 1850 }, 1716 1851 #ifdef CONFIG_SND_DEBUG 1717 1852 [ALC880_TEST] = {
-2867
sound/pci/hda/alc882_quirks.c
··· 6 6 /* ALC882 models */ 7 7 enum { 8 8 ALC882_AUTO, 9 - ALC882_3ST_DIG, 10 - ALC882_6ST_DIG, 11 - ALC882_ARIMA, 12 - ALC882_W2JC, 13 - ALC882_TARGA, 14 - ALC882_ASUS_A7J, 15 - ALC882_ASUS_A7M, 16 - ALC885_MACPRO, 17 9 ALC885_MBA21, 18 10 ALC885_MBP3, 19 11 ALC885_MB5, 20 12 ALC885_MACMINI3, 21 - ALC885_IMAC24, 22 13 ALC885_IMAC91, 23 - ALC883_3ST_2ch_DIG, 24 - ALC883_3ST_6ch_DIG, 25 - ALC883_3ST_6ch, 26 - ALC883_6ST_DIG, 27 - ALC883_TARGA_DIG, 28 - ALC883_TARGA_2ch_DIG, 29 - ALC883_TARGA_8ch_DIG, 30 - ALC883_ACER, 31 - ALC883_ACER_ASPIRE, 32 - ALC888_ACER_ASPIRE_4930G, 33 - ALC888_ACER_ASPIRE_6530G, 34 - ALC888_ACER_ASPIRE_8930G, 35 - ALC888_ACER_ASPIRE_7730G, 36 - ALC883_MEDION, 37 - ALC883_MEDION_WIM2160, 38 - ALC883_LAPTOP_EAPD, 39 - ALC883_LENOVO_101E_2ch, 40 - ALC883_LENOVO_NB0763, 41 - ALC888_LENOVO_MS7195_DIG, 42 - ALC888_LENOVO_SKY, 43 - ALC883_HAIER_W66, 44 - ALC888_3ST_HP, 45 - ALC888_6ST_DELL, 46 - ALC883_MITAC, 47 - ALC883_CLEVO_M540R, 48 - ALC883_CLEVO_M720, 49 - ALC883_FUJITSU_PI2515, 50 - ALC888_FUJITSU_XA3530, 51 - ALC883_3ST_6ch_INTEL, 52 - ALC889A_INTEL, 53 - ALC889_INTEL, 54 - ALC888_ASUS_M90V, 55 - ALC888_ASUS_EEE1601, 56 14 ALC889A_MB31, 57 - ALC1200_ASUS_P5Q, 58 - ALC883_SONY_VAIO_TT, 59 15 ALC882_MODEL_LAST, 60 16 }; 61 - 62 - /* 63 - * 2ch mode 64 - */ 65 - static const struct hda_verb alc888_4ST_ch2_intel_init[] = { 66 - /* Mic-in jack as mic in */ 67 - { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, 68 - { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE }, 69 - /* Line-in jack as Line in */ 70 - { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN }, 71 - { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE }, 72 - /* Line-Out as Front */ 73 - { 0x17, AC_VERB_SET_CONNECT_SEL, 0x00}, 74 - { } /* end */ 75 - }; 76 - 77 - /* 78 - * 4ch mode 79 - */ 80 - static const struct hda_verb alc888_4ST_ch4_intel_init[] = { 81 - /* Mic-in jack as mic in */ 82 - { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, 83 - { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE }, 84 - /* Line-in jack as Surround */ 85 - { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 86 - { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 87 - /* Line-Out as Front */ 88 - { 0x17, AC_VERB_SET_CONNECT_SEL, 0x00}, 89 - { } /* end */ 90 - }; 91 - 92 - /* 93 - * 6ch mode 94 - */ 95 - static const struct hda_verb alc888_4ST_ch6_intel_init[] = { 96 - /* Mic-in jack as CLFE */ 97 - { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 98 - { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 99 - /* Line-in jack as Surround */ 100 - { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 101 - { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 102 - /* Line-Out as CLFE (workaround because Mic-in is not loud enough) */ 103 - { 0x17, AC_VERB_SET_CONNECT_SEL, 0x03}, 104 - { } /* end */ 105 - }; 106 - 107 - /* 108 - * 8ch mode 109 - */ 110 - static const struct hda_verb alc888_4ST_ch8_intel_init[] = { 111 - /* Mic-in jack as CLFE */ 112 - { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 113 - { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 114 - /* Line-in jack as Surround */ 115 - { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 116 - { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 117 - /* Line-Out as Side */ 118 - { 0x17, AC_VERB_SET_CONNECT_SEL, 0x03}, 119 - { } /* end */ 120 - }; 121 - 122 - static const struct hda_channel_mode alc888_4ST_8ch_intel_modes[4] = { 123 - { 2, alc888_4ST_ch2_intel_init }, 124 - { 4, alc888_4ST_ch4_intel_init }, 125 - { 6, alc888_4ST_ch6_intel_init }, 126 - { 8, alc888_4ST_ch8_intel_init }, 127 - }; 128 - 129 - /* 130 - * ALC888 Fujitsu Siemens Amillo xa3530 131 - */ 132 - 133 - static const struct hda_verb alc888_fujitsu_xa3530_verbs[] = { 134 - /* Front Mic: set to PIN_IN (empty by default) */ 135 - {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 136 - /* Connect Internal HP to Front */ 137 - {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 138 - {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 139 - {0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, 140 - /* Connect Bass HP to Front */ 141 - {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 142 - {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 143 - {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, 144 - /* Connect Line-Out side jack (SPDIF) to Side */ 145 - {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 146 - {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 147 - {0x17, AC_VERB_SET_CONNECT_SEL, 0x03}, 148 - /* Connect Mic jack to CLFE */ 149 - {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 150 - {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 151 - {0x18, AC_VERB_SET_CONNECT_SEL, 0x02}, 152 - /* Connect Line-in jack to Surround */ 153 - {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 154 - {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 155 - {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01}, 156 - /* Connect HP out jack to Front */ 157 - {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 158 - {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 159 - {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, 160 - /* Enable unsolicited event for HP jack and Line-out jack */ 161 - {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC_HP_EVENT | AC_USRSP_EN}, 162 - {0x17, AC_VERB_SET_UNSOLICITED_ENABLE, ALC_HP_EVENT | AC_USRSP_EN}, 163 - {} 164 - }; 165 - 166 - static void alc889_automute_setup(struct hda_codec *codec) 167 - { 168 - struct alc_spec *spec = codec->spec; 169 - 170 - spec->autocfg.hp_pins[0] = 0x15; 171 - spec->autocfg.speaker_pins[0] = 0x14; 172 - spec->autocfg.speaker_pins[1] = 0x16; 173 - spec->autocfg.speaker_pins[2] = 0x17; 174 - spec->autocfg.speaker_pins[3] = 0x19; 175 - spec->autocfg.speaker_pins[4] = 0x1a; 176 - alc_simple_setup_automute(spec, ALC_AUTOMUTE_AMP); 177 - } 178 - 179 - static void alc889_intel_init_hook(struct hda_codec *codec) 180 - { 181 - alc889_coef_init(codec); 182 - alc_hp_automute(codec); 183 - } 184 - 185 - static void alc888_fujitsu_xa3530_setup(struct hda_codec *codec) 186 - { 187 - struct alc_spec *spec = codec->spec; 188 - 189 - spec->autocfg.hp_pins[0] = 0x17; /* line-out */ 190 - spec->autocfg.hp_pins[1] = 0x1b; /* hp */ 191 - spec->autocfg.speaker_pins[0] = 0x14; /* speaker */ 192 - spec->autocfg.speaker_pins[1] = 0x15; /* bass */ 193 - alc_simple_setup_automute(spec, ALC_AUTOMUTE_AMP); 194 - } 195 - 196 - /* 197 - * ALC888 Acer Aspire 4930G model 198 - */ 199 - 200 - static const struct hda_verb alc888_acer_aspire_4930g_verbs[] = { 201 - /* Front Mic: set to PIN_IN (empty by default) */ 202 - {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 203 - /* Unselect Front Mic by default in input mixer 3 */ 204 - {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0xb)}, 205 - /* Enable unsolicited event for HP jack */ 206 - {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC_HP_EVENT | AC_USRSP_EN}, 207 - /* Connect Internal HP to front */ 208 - {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 209 - {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 210 - {0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, 211 - /* Connect HP out to front */ 212 - {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 213 - {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 214 - {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, 215 - {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2}, 216 - { } 217 - }; 218 - 219 - /* 220 - * ALC888 Acer Aspire 6530G model 221 - */ 222 - 223 - static const struct hda_verb alc888_acer_aspire_6530g_verbs[] = { 224 - /* Route to built-in subwoofer as well as speakers */ 225 - {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 226 - {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 227 - {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 228 - {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 229 - /* Bias voltage on for external mic port */ 230 - {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN | PIN_VREF80}, 231 - /* Front Mic: set to PIN_IN (empty by default) */ 232 - {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 233 - /* Unselect Front Mic by default in input mixer 3 */ 234 - {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0xb)}, 235 - /* Enable unsolicited event for HP jack */ 236 - {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC_HP_EVENT | AC_USRSP_EN}, 237 - /* Enable speaker output */ 238 - {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 239 - {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 240 - {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2}, 241 - /* Enable headphone output */ 242 - {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | PIN_HP}, 243 - {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 244 - {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, 245 - {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2}, 246 - { } 247 - }; 248 - 249 - /* 250 - *ALC888 Acer Aspire 7730G model 251 - */ 252 - 253 - static const struct hda_verb alc888_acer_aspire_7730G_verbs[] = { 254 - /* Bias voltage on for external mic port */ 255 - {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN | PIN_VREF80}, 256 - /* Front Mic: set to PIN_IN (empty by default) */ 257 - {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 258 - /* Unselect Front Mic by default in input mixer 3 */ 259 - {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0xb)}, 260 - /* Enable unsolicited event for HP jack */ 261 - {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC_HP_EVENT | AC_USRSP_EN}, 262 - /* Enable speaker output */ 263 - {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 264 - {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 265 - {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2}, 266 - /* Enable headphone output */ 267 - {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | PIN_HP}, 268 - {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 269 - {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, 270 - {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2}, 271 - /*Enable internal subwoofer */ 272 - {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 273 - {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 274 - {0x17, AC_VERB_SET_CONNECT_SEL, 0x02}, 275 - {0x17, AC_VERB_SET_EAPD_BTLENABLE, 2}, 276 - { } 277 - }; 278 - 279 - /* 280 - * ALC889 Acer Aspire 8930G model 281 - */ 282 - 283 - static const struct hda_verb alc889_acer_aspire_8930g_verbs[] = { 284 - /* Front Mic: set to PIN_IN (empty by default) */ 285 - {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 286 - /* Unselect Front Mic by default in input mixer 3 */ 287 - {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0xb)}, 288 - /* Enable unsolicited event for HP jack */ 289 - {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC_HP_EVENT | AC_USRSP_EN}, 290 - /* Connect Internal Front to Front */ 291 - {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 292 - {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 293 - {0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, 294 - /* Connect Internal Rear to Rear */ 295 - {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 296 - {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 297 - {0x1b, AC_VERB_SET_CONNECT_SEL, 0x01}, 298 - /* Connect Internal CLFE to CLFE */ 299 - {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 300 - {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 301 - {0x16, AC_VERB_SET_CONNECT_SEL, 0x02}, 302 - /* Connect HP out to Front */ 303 - {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | PIN_HP}, 304 - {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 305 - {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, 306 - /* Enable all DACs */ 307 - /* DAC DISABLE/MUTE 1? */ 308 - /* setting bits 1-5 disables DAC nids 0x02-0x06 apparently. Init=0x38 */ 309 - {0x20, AC_VERB_SET_COEF_INDEX, 0x03}, 310 - {0x20, AC_VERB_SET_PROC_COEF, 0x0000}, 311 - /* DAC DISABLE/MUTE 2? */ 312 - /* some bit here disables the other DACs. Init=0x4900 */ 313 - {0x20, AC_VERB_SET_COEF_INDEX, 0x08}, 314 - {0x20, AC_VERB_SET_PROC_COEF, 0x0000}, 315 - /* DMIC fix 316 - * This laptop has a stereo digital microphone. The mics are only 1cm apart 317 - * which makes the stereo useless. However, either the mic or the ALC889 318 - * makes the signal become a difference/sum signal instead of standard 319 - * stereo, which is annoying. So instead we flip this bit which makes the 320 - * codec replicate the sum signal to both channels, turning it into a 321 - * normal mono mic. 322 - */ 323 - /* DMIC_CONTROL? Init value = 0x0001 */ 324 - {0x20, AC_VERB_SET_COEF_INDEX, 0x0b}, 325 - {0x20, AC_VERB_SET_PROC_COEF, 0x0003}, 326 - { } 327 - }; 328 - 329 - static const struct hda_input_mux alc888_2_capture_sources[2] = { 330 - /* Front mic only available on one ADC */ 331 - { 332 - .num_items = 4, 333 - .items = { 334 - { "Mic", 0x0 }, 335 - { "Line", 0x2 }, 336 - { "CD", 0x4 }, 337 - { "Front Mic", 0xb }, 338 - }, 339 - }, 340 - { 341 - .num_items = 3, 342 - .items = { 343 - { "Mic", 0x0 }, 344 - { "Line", 0x2 }, 345 - { "CD", 0x4 }, 346 - }, 347 - } 348 - }; 349 - 350 - static const struct hda_input_mux alc888_acer_aspire_6530_sources[2] = { 351 - /* Interal mic only available on one ADC */ 352 - { 353 - .num_items = 5, 354 - .items = { 355 - { "Mic", 0x0 }, 356 - { "Line In", 0x2 }, 357 - { "CD", 0x4 }, 358 - { "Input Mix", 0xa }, 359 - { "Internal Mic", 0xb }, 360 - }, 361 - }, 362 - { 363 - .num_items = 4, 364 - .items = { 365 - { "Mic", 0x0 }, 366 - { "Line In", 0x2 }, 367 - { "CD", 0x4 }, 368 - { "Input Mix", 0xa }, 369 - }, 370 - } 371 - }; 372 - 373 - static const struct hda_input_mux alc889_capture_sources[3] = { 374 - /* Digital mic only available on first "ADC" */ 375 - { 376 - .num_items = 5, 377 - .items = { 378 - { "Mic", 0x0 }, 379 - { "Line", 0x2 }, 380 - { "CD", 0x4 }, 381 - { "Front Mic", 0xb }, 382 - { "Input Mix", 0xa }, 383 - }, 384 - }, 385 - { 386 - .num_items = 4, 387 - .items = { 388 - { "Mic", 0x0 }, 389 - { "Line", 0x2 }, 390 - { "CD", 0x4 }, 391 - { "Input Mix", 0xa }, 392 - }, 393 - }, 394 - { 395 - .num_items = 4, 396 - .items = { 397 - { "Mic", 0x0 }, 398 - { "Line", 0x2 }, 399 - { "CD", 0x4 }, 400 - { "Input Mix", 0xa }, 401 - }, 402 - } 403 - }; 404 - 405 - static const struct snd_kcontrol_new alc888_base_mixer[] = { 406 - HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 407 - HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 408 - HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT), 409 - HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT), 410 - HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, 411 - HDA_OUTPUT), 412 - HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT), 413 - HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT), 414 - HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT), 415 - HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT), 416 - HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT), 417 - HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), 418 - HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), 419 - HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), 420 - HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), 421 - HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 422 - HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT), 423 - HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 424 - { } /* end */ 425 - }; 426 - 427 - static const struct snd_kcontrol_new alc888_acer_aspire_4930g_mixer[] = { 428 - HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 429 - HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 430 - HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT), 431 - HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT), 432 - HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, 433 - HDA_OUTPUT), 434 - HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT), 435 - HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT), 436 - HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT), 437 - HDA_CODEC_VOLUME_MONO("Internal LFE Playback Volume", 0x0f, 1, 0x0, HDA_OUTPUT), 438 - HDA_BIND_MUTE_MONO("Internal LFE Playback Switch", 0x0f, 1, 2, HDA_INPUT), 439 - HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), 440 - HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), 441 - HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), 442 - HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), 443 - HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 444 - HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT), 445 - HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 446 - { } /* end */ 447 - }; 448 - 449 - static const struct snd_kcontrol_new alc889_acer_aspire_8930g_mixer[] = { 450 - HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 451 - HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 452 - HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT), 453 - HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT), 454 - HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, 455 - HDA_OUTPUT), 456 - HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT), 457 - HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT), 458 - HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT), 459 - HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), 460 - HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), 461 - HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 462 - HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT), 463 - HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 464 - { } /* end */ 465 - }; 466 - 467 - 468 - static void alc888_acer_aspire_4930g_setup(struct hda_codec *codec) 469 - { 470 - struct alc_spec *spec = codec->spec; 471 - 472 - spec->autocfg.hp_pins[0] = 0x15; 473 - spec->autocfg.speaker_pins[0] = 0x14; 474 - spec->autocfg.speaker_pins[1] = 0x16; 475 - spec->autocfg.speaker_pins[2] = 0x17; 476 - alc_simple_setup_automute(spec, ALC_AUTOMUTE_AMP); 477 - } 478 - 479 - static void alc888_acer_aspire_6530g_setup(struct hda_codec *codec) 480 - { 481 - struct alc_spec *spec = codec->spec; 482 - 483 - spec->autocfg.hp_pins[0] = 0x15; 484 - spec->autocfg.speaker_pins[0] = 0x14; 485 - spec->autocfg.speaker_pins[1] = 0x16; 486 - spec->autocfg.speaker_pins[2] = 0x17; 487 - alc_simple_setup_automute(spec, ALC_AUTOMUTE_AMP); 488 - } 489 - 490 - static void alc888_acer_aspire_7730g_setup(struct hda_codec *codec) 491 - { 492 - struct alc_spec *spec = codec->spec; 493 - 494 - spec->autocfg.hp_pins[0] = 0x15; 495 - spec->autocfg.speaker_pins[0] = 0x14; 496 - spec->autocfg.speaker_pins[1] = 0x16; 497 - spec->autocfg.speaker_pins[2] = 0x17; 498 - alc_simple_setup_automute(spec, ALC_AUTOMUTE_AMP); 499 - } 500 - 501 - static void alc889_acer_aspire_8930g_setup(struct hda_codec *codec) 502 - { 503 - struct alc_spec *spec = codec->spec; 504 - 505 - spec->autocfg.hp_pins[0] = 0x15; 506 - spec->autocfg.speaker_pins[0] = 0x14; 507 - spec->autocfg.speaker_pins[1] = 0x16; 508 - spec->autocfg.speaker_pins[2] = 0x1b; 509 - alc_simple_setup_automute(spec, ALC_AUTOMUTE_AMP); 510 - } 511 17 512 18 #define ALC882_DIGOUT_NID 0x06 513 19 #define ALC882_DIGIN_NID 0x0a ··· 37 531 #define alc882_adc_nids alc880_adc_nids 38 532 #define alc882_adc_nids_alt alc880_adc_nids_alt 39 533 #define alc883_adc_nids alc882_adc_nids_alt 40 - static const hda_nid_t alc883_adc_nids_alt[1] = { 0x08 }; 41 - static const hda_nid_t alc883_adc_nids_rev[2] = { 0x09, 0x08 }; 42 - #define alc889_adc_nids alc880_adc_nids 43 534 44 - static const hda_nid_t alc882_capsrc_nids[3] = { 0x24, 0x23, 0x22 }; 45 535 static const hda_nid_t alc882_capsrc_nids_alt[2] = { 0x23, 0x22 }; 46 536 #define alc883_capsrc_nids alc882_capsrc_nids_alt 47 - static const hda_nid_t alc883_capsrc_nids_rev[2] = { 0x22, 0x23 }; 48 - #define alc889_capsrc_nids alc882_capsrc_nids 49 537 50 538 /* input MUX */ 51 539 /* FIXME: should be a matrix-type input source selection */ ··· 55 555 }; 56 556 57 557 #define alc883_capture_source alc882_capture_source 58 - 59 - static const struct hda_input_mux alc889_capture_source = { 60 - .num_items = 3, 61 - .items = { 62 - { "Front Mic", 0x0 }, 63 - { "Mic", 0x3 }, 64 - { "Line", 0x2 }, 65 - }, 66 - }; 67 558 68 559 static const struct hda_input_mux mb5_capture_source = { 69 560 .num_items = 3, ··· 83 592 }, 84 593 }; 85 594 86 - static const struct hda_input_mux alc883_lenovo_101e_capture_source = { 87 - .num_items = 2, 88 - .items = { 89 - { "Mic", 0x1 }, 90 - { "Line", 0x2 }, 91 - }, 92 - }; 93 - 94 - static const struct hda_input_mux alc883_lenovo_nb0763_capture_source = { 95 - .num_items = 4, 96 - .items = { 97 - { "Mic", 0x0 }, 98 - { "Internal Mic", 0x1 }, 99 - { "Line", 0x2 }, 100 - { "CD", 0x4 }, 101 - }, 102 - }; 103 - 104 - static const struct hda_input_mux alc883_fujitsu_pi2515_capture_source = { 105 - .num_items = 2, 106 - .items = { 107 - { "Mic", 0x0 }, 108 - { "Internal Mic", 0x1 }, 109 - }, 110 - }; 111 - 112 - static const struct hda_input_mux alc883_lenovo_sky_capture_source = { 113 - .num_items = 3, 114 - .items = { 115 - { "Mic", 0x0 }, 116 - { "Front Mic", 0x1 }, 117 - { "Line", 0x4 }, 118 - }, 119 - }; 120 - 121 - static const struct hda_input_mux alc883_asus_eee1601_capture_source = { 122 - .num_items = 2, 123 - .items = { 124 - { "Mic", 0x0 }, 125 - { "Line", 0x2 }, 126 - }, 127 - }; 128 - 129 595 static const struct hda_input_mux alc889A_mb31_capture_source = { 130 596 .num_items = 2, 131 597 .items = { ··· 101 653 { "Line", 0x2 }, /* Not sure! */ 102 654 }, 103 655 }; 104 - 105 - /* 106 - * 2ch mode 107 - */ 108 - static const struct hda_channel_mode alc883_3ST_2ch_modes[1] = { 109 - { 2, NULL } 110 - }; 111 - 112 - /* 113 - * 2ch mode 114 - */ 115 - static const struct hda_verb alc882_3ST_ch2_init[] = { 116 - { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, 117 - { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE }, 118 - { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN }, 119 - { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE }, 120 - { } /* end */ 121 - }; 122 - 123 - /* 124 - * 4ch mode 125 - */ 126 - static const struct hda_verb alc882_3ST_ch4_init[] = { 127 - { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, 128 - { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE }, 129 - { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 130 - { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 131 - { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 }, 132 - { } /* end */ 133 - }; 134 - 135 - /* 136 - * 6ch mode 137 - */ 138 - static const struct hda_verb alc882_3ST_ch6_init[] = { 139 - { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 140 - { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 141 - { 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 }, 142 - { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 143 - { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 144 - { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 }, 145 - { } /* end */ 146 - }; 147 - 148 - static const struct hda_channel_mode alc882_3ST_6ch_modes[3] = { 149 - { 2, alc882_3ST_ch2_init }, 150 - { 4, alc882_3ST_ch4_init }, 151 - { 6, alc882_3ST_ch6_init }, 152 - }; 153 - 154 - #define alc883_3ST_6ch_modes alc882_3ST_6ch_modes 155 - 156 - /* 157 - * 2ch mode 158 - */ 159 - static const struct hda_verb alc883_3ST_ch2_clevo_init[] = { 160 - { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP }, 161 - { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, 162 - { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE }, 163 - { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN }, 164 - { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE }, 165 - { } /* end */ 166 - }; 167 - 168 - /* 169 - * 4ch mode 170 - */ 171 - static const struct hda_verb alc883_3ST_ch4_clevo_init[] = { 172 - { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 173 - { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, 174 - { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE }, 175 - { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 176 - { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 177 - { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 }, 178 - { } /* end */ 179 - }; 180 - 181 - /* 182 - * 6ch mode 183 - */ 184 - static const struct hda_verb alc883_3ST_ch6_clevo_init[] = { 185 - { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 186 - { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 187 - { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 188 - { 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 }, 189 - { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 190 - { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 191 - { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 }, 192 - { } /* end */ 193 - }; 194 - 195 - static const struct hda_channel_mode alc883_3ST_6ch_clevo_modes[3] = { 196 - { 2, alc883_3ST_ch2_clevo_init }, 197 - { 4, alc883_3ST_ch4_clevo_init }, 198 - { 6, alc883_3ST_ch6_clevo_init }, 199 - }; 200 - 201 - 202 - /* 203 - * 6ch mode 204 - */ 205 - static const struct hda_verb alc882_sixstack_ch6_init[] = { 206 - { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 }, 207 - { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 208 - { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 209 - { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 210 - { } /* end */ 211 - }; 212 - 213 - /* 214 - * 8ch mode 215 - */ 216 - static const struct hda_verb alc882_sixstack_ch8_init[] = { 217 - { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 218 - { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 219 - { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 220 - { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 221 - { } /* end */ 222 - }; 223 - 224 - static const struct hda_channel_mode alc882_sixstack_modes[2] = { 225 - { 6, alc882_sixstack_ch6_init }, 226 - { 8, alc882_sixstack_ch8_init }, 227 - }; 228 - 229 656 230 657 /* Macbook Air 2,1 */ 231 658 ··· 170 847 171 848 #define alc885_macmini3_6ch_modes alc885_mb5_6ch_modes 172 849 173 - /* 174 - * 2ch mode 175 - */ 176 - static const struct hda_verb alc883_4ST_ch2_init[] = { 177 - { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 178 - { 0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 179 - { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, 180 - { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE }, 181 - { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN }, 182 - { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE }, 183 - { } /* end */ 184 - }; 185 - 186 - /* 187 - * 4ch mode 188 - */ 189 - static const struct hda_verb alc883_4ST_ch4_init[] = { 190 - { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 191 - { 0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 192 - { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, 193 - { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE }, 194 - { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 195 - { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 196 - { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 }, 197 - { } /* end */ 198 - }; 199 - 200 - /* 201 - * 6ch mode 202 - */ 203 - static const struct hda_verb alc883_4ST_ch6_init[] = { 204 - { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 205 - { 0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 206 - { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 207 - { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 208 - { 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 }, 209 - { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 210 - { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 211 - { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 }, 212 - { } /* end */ 213 - }; 214 - 215 - /* 216 - * 8ch mode 217 - */ 218 - static const struct hda_verb alc883_4ST_ch8_init[] = { 219 - { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 220 - { 0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 221 - { 0x17, AC_VERB_SET_CONNECT_SEL, 0x03 }, 222 - { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 223 - { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 224 - { 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 }, 225 - { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 226 - { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 227 - { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 }, 228 - { } /* end */ 229 - }; 230 - 231 - static const struct hda_channel_mode alc883_4ST_8ch_modes[4] = { 232 - { 2, alc883_4ST_ch2_init }, 233 - { 4, alc883_4ST_ch4_init }, 234 - { 6, alc883_4ST_ch6_init }, 235 - { 8, alc883_4ST_ch8_init }, 236 - }; 237 - 238 - 239 - /* 240 - * 2ch mode 241 - */ 242 - static const struct hda_verb alc883_3ST_ch2_intel_init[] = { 243 - { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, 244 - { 0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE }, 245 - { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN }, 246 - { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE }, 247 - { } /* end */ 248 - }; 249 - 250 - /* 251 - * 4ch mode 252 - */ 253 - static const struct hda_verb alc883_3ST_ch4_intel_init[] = { 254 - { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, 255 - { 0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE }, 256 - { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 257 - { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 258 - { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 }, 259 - { } /* end */ 260 - }; 261 - 262 - /* 263 - * 6ch mode 264 - */ 265 - static const struct hda_verb alc883_3ST_ch6_intel_init[] = { 266 - { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 267 - { 0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 268 - { 0x19, AC_VERB_SET_CONNECT_SEL, 0x02 }, 269 - { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 270 - { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 271 - { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 }, 272 - { } /* end */ 273 - }; 274 - 275 - static const struct hda_channel_mode alc883_3ST_6ch_intel_modes[3] = { 276 - { 2, alc883_3ST_ch2_intel_init }, 277 - { 4, alc883_3ST_ch4_intel_init }, 278 - { 6, alc883_3ST_ch6_intel_init }, 279 - }; 280 - 281 - /* 282 - * 2ch mode 283 - */ 284 - static const struct hda_verb alc889_ch2_intel_init[] = { 285 - { 0x14, AC_VERB_SET_CONNECT_SEL, 0x00 }, 286 - { 0x19, AC_VERB_SET_CONNECT_SEL, 0x00 }, 287 - { 0x16, AC_VERB_SET_CONNECT_SEL, 0x00 }, 288 - { 0x17, AC_VERB_SET_CONNECT_SEL, 0x00 }, 289 - { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN }, 290 - { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE }, 291 - { } /* end */ 292 - }; 293 - 294 - /* 295 - * 6ch mode 296 - */ 297 - static const struct hda_verb alc889_ch6_intel_init[] = { 298 - { 0x14, AC_VERB_SET_CONNECT_SEL, 0x00 }, 299 - { 0x19, AC_VERB_SET_CONNECT_SEL, 0x01 }, 300 - { 0x16, AC_VERB_SET_CONNECT_SEL, 0x02 }, 301 - { 0x17, AC_VERB_SET_CONNECT_SEL, 0x03 }, 302 - { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN }, 303 - { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE }, 304 - { } /* end */ 305 - }; 306 - 307 - /* 308 - * 8ch mode 309 - */ 310 - static const struct hda_verb alc889_ch8_intel_init[] = { 311 - { 0x14, AC_VERB_SET_CONNECT_SEL, 0x00 }, 312 - { 0x19, AC_VERB_SET_CONNECT_SEL, 0x01 }, 313 - { 0x16, AC_VERB_SET_CONNECT_SEL, 0x02 }, 314 - { 0x17, AC_VERB_SET_CONNECT_SEL, 0x03 }, 315 - { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x03 }, 316 - { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 317 - { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 318 - { } /* end */ 319 - }; 320 - 321 - static const struct hda_channel_mode alc889_8ch_intel_modes[3] = { 322 - { 2, alc889_ch2_intel_init }, 323 - { 6, alc889_ch6_intel_init }, 324 - { 8, alc889_ch8_intel_init }, 325 - }; 326 - 327 - /* 328 - * 6ch mode 329 - */ 330 - static const struct hda_verb alc883_sixstack_ch6_init[] = { 331 - { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 }, 332 - { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 333 - { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 334 - { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 335 - { } /* end */ 336 - }; 337 - 338 - /* 339 - * 8ch mode 340 - */ 341 - static const struct hda_verb alc883_sixstack_ch8_init[] = { 342 - { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 343 - { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 344 - { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 345 - { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 346 - { } /* end */ 347 - }; 348 - 349 - static const struct hda_channel_mode alc883_sixstack_modes[2] = { 350 - { 6, alc883_sixstack_ch6_init }, 351 - { 8, alc883_sixstack_ch8_init }, 352 - }; 353 - 354 - 355 - /* Pin assignment: Front=0x14, Rear=0x15, CLFE=0x16, Side=0x17 356 - * Mic=0x18, Front Mic=0x19, Line-In=0x1a, HP=0x1b 357 - */ 358 - static const struct snd_kcontrol_new alc882_base_mixer[] = { 359 - HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 360 - HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 361 - HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT), 362 - HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT), 363 - HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT), 364 - HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT), 365 - HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT), 366 - HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT), 367 - HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT), 368 - HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT), 369 - HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT), 370 - HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), 371 - HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), 372 - HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), 373 - HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), 374 - HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 375 - HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT), 376 - HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 377 - HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), 378 - HDA_CODEC_VOLUME("Front Mic Boost Volume", 0x19, 0, HDA_INPUT), 379 - HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), 380 - { } /* end */ 381 - }; 382 - 383 850 /* Macbook Air 2,1 same control for HP and internal Speaker */ 384 851 385 852 static const struct snd_kcontrol_new alc885_mba21_mixer[] = { ··· 233 1120 { } /* end */ 234 1121 }; 235 1122 236 - 237 - static const struct snd_kcontrol_new alc882_w2jc_mixer[] = { 238 - HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 239 - HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 240 - HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), 241 - HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), 242 - HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), 243 - HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), 244 - HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 245 - HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT), 246 - HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 247 - { } /* end */ 248 - }; 249 - 250 - static const struct snd_kcontrol_new alc882_targa_mixer[] = { 251 - HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 252 - HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 253 - HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT), 254 - HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), 255 - HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), 256 - HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), 257 - HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), 258 - HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 259 - HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 260 - HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT), 261 - HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), 262 - HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), 263 - HDA_CODEC_VOLUME("Front Mic Boost Volume", 0x19, 0, HDA_INPUT), 264 - { } /* end */ 265 - }; 266 - 267 - /* Pin assignment: Front=0x14, HP = 0x15, Front = 0x16, ??? 268 - * Front Mic=0x18, Line In = 0x1a, Line In = 0x1b, CD = 0x1c 269 - */ 270 - static const struct snd_kcontrol_new alc882_asus_a7j_mixer[] = { 271 - HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 272 - HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT), 273 - HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT), 274 - HDA_CODEC_MUTE("Mobile Front Playback Switch", 0x16, 0x0, HDA_OUTPUT), 275 - HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), 276 - HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), 277 - HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), 278 - HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), 279 - HDA_CODEC_VOLUME("Mobile Line Playback Volume", 0x0b, 0x03, HDA_INPUT), 280 - HDA_CODEC_MUTE("Mobile Line Playback Switch", 0x0b, 0x03, HDA_INPUT), 281 - HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 282 - HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 283 - HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT), 284 - { } /* end */ 285 - }; 286 - 287 - static const struct snd_kcontrol_new alc882_asus_a7m_mixer[] = { 288 - HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 289 - HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 290 - HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT), 291 - HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), 292 - HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), 293 - HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), 294 - HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), 295 - HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 296 - HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT), 297 - HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 298 - { } /* end */ 299 - }; 300 1123 301 1124 static const struct snd_kcontrol_new alc882_chmode_mixer[] = { 302 1125 { ··· 307 1258 { } 308 1259 }; 309 1260 310 - static const struct hda_verb alc882_adc1_init_verbs[] = { 311 - /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */ 312 - {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 313 - {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, 314 - {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, 315 - {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, 316 - /* ADC1: mute amp left and right */ 317 - {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 318 - {0x07, AC_VERB_SET_CONNECT_SEL, 0x00}, 319 - { } 320 - }; 321 - 322 - static const struct hda_verb alc882_eapd_verbs[] = { 323 - /* change to EAPD mode */ 324 - {0x20, AC_VERB_SET_COEF_INDEX, 0x07}, 325 - {0x20, AC_VERB_SET_PROC_COEF, 0x3060}, 326 - { } 327 - }; 328 - 329 - static const struct hda_verb alc889_eapd_verbs[] = { 330 - {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2}, 331 - {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2}, 332 - { } 333 - }; 334 - 335 - static const struct hda_verb alc_hp15_unsol_verbs[] = { 336 - {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT}, 337 - {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 338 - {} 339 - }; 340 - 341 - static const struct hda_verb alc885_init_verbs[] = { 342 - /* Front mixer: unmute input/output amp left and right (volume = 0) */ 343 - {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 344 - {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 345 - /* Rear mixer */ 346 - {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 347 - {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 348 - /* CLFE mixer */ 349 - {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 350 - {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 351 - /* Side mixer */ 352 - {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 353 - {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 354 - 355 - /* Front HP Pin: output 0 (0x0c) */ 356 - {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 357 - {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 358 - {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, 359 - /* Front Pin: output 0 (0x0c) */ 360 - {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 361 - {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 362 - {0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, 363 - /* Rear Pin: output 1 (0x0d) */ 364 - {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 365 - {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 366 - {0x19, AC_VERB_SET_CONNECT_SEL, 0x01}, 367 - /* CLFE Pin: output 2 (0x0e) */ 368 - {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 369 - {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 370 - {0x16, AC_VERB_SET_CONNECT_SEL, 0x02}, 371 - /* Side Pin: output 3 (0x0f) */ 372 - {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 373 - {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 374 - {0x17, AC_VERB_SET_CONNECT_SEL, 0x03}, 375 - /* Mic (rear) pin: input vref at 80% */ 376 - {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, 377 - {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 378 - /* Front Mic pin: input vref at 80% */ 379 - {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, 380 - {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 381 - /* Line In pin: input */ 382 - {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 383 - {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 384 - 385 - /* Mixer elements: 0x18, , 0x1a, 0x1b */ 386 - /* Input mixer1 */ 387 - {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 388 - /* Input mixer2 */ 389 - {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 390 - /* Input mixer3 */ 391 - {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 392 - /* ADC2: mute amp left and right */ 393 - {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 394 - /* ADC3: mute amp left and right */ 395 - {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 396 - 397 - { } 398 - }; 399 - 400 - static const struct hda_verb alc885_init_input_verbs[] = { 401 - {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 402 - {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)}, 403 - {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)}, 404 - { } 405 - }; 406 - 407 - 408 - /* Unmute Selector 24h and set the default input to front mic */ 409 - static const struct hda_verb alc889_init_input_verbs[] = { 410 - {0x24, AC_VERB_SET_CONNECT_SEL, 0x00}, 411 - {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 412 - { } 413 - }; 414 - 415 - 416 1261 #define alc883_init_verbs alc882_base_init_verbs 417 - 418 - /* Mac Pro test */ 419 - static const struct snd_kcontrol_new alc882_macpro_mixer[] = { 420 - HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 421 - HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 422 - HDA_CODEC_MUTE("Headphone Playback Switch", 0x18, 0x0, HDA_OUTPUT), 423 - HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x01, HDA_INPUT), 424 - HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x01, HDA_INPUT), 425 - /* FIXME: this looks suspicious... 426 - HDA_CODEC_VOLUME("Beep Playback Volume", 0x0b, 0x02, HDA_INPUT), 427 - HDA_CODEC_MUTE("Beep Playback Switch", 0x0b, 0x02, HDA_INPUT), 428 - */ 429 - { } /* end */ 430 - }; 431 - 432 - static const struct hda_verb alc882_macpro_init_verbs[] = { 433 - /* Front mixer: unmute input/output amp left and right (volume = 0) */ 434 - {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 435 - {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 436 - {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 437 - /* Front Pin: output 0 (0x0c) */ 438 - {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 439 - {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 440 - {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, 441 - /* Front Mic pin: input vref at 80% */ 442 - {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, 443 - {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 444 - /* Speaker: output */ 445 - {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 446 - {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 447 - {0x1a, AC_VERB_SET_CONNECT_SEL, 0x04}, 448 - /* Headphone output (output 0 - 0x0c) */ 449 - {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 450 - {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 451 - {0x18, AC_VERB_SET_CONNECT_SEL, 0x00}, 452 - 453 - /* FIXME: use matrix-type input source selection */ 454 - /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */ 455 - /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */ 456 - {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 457 - {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, 458 - {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, 459 - {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, 460 - /* Input mixer2 */ 461 - {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 462 - {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, 463 - {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, 464 - {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, 465 - /* Input mixer3 */ 466 - {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 467 - {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, 468 - {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, 469 - {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, 470 - /* ADC1: mute amp left and right */ 471 - {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 472 - {0x07, AC_VERB_SET_CONNECT_SEL, 0x00}, 473 - /* ADC2: mute amp left and right */ 474 - {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 475 - {0x08, AC_VERB_SET_CONNECT_SEL, 0x00}, 476 - /* ADC3: mute amp left and right */ 477 - {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 478 - {0x09, AC_VERB_SET_CONNECT_SEL, 0x00}, 479 - 480 - { } 481 - }; 482 1262 483 1263 /* Macbook 5,1 */ 484 1264 static const struct hda_verb alc885_mb5_init_verbs[] = { ··· 547 1669 { } 548 1670 }; 549 1671 550 - /* iMac 24 mixer. */ 551 - static const struct snd_kcontrol_new alc885_imac24_mixer[] = { 552 - HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x00, HDA_OUTPUT), 553 - HDA_CODEC_MUTE("Master Playback Switch", 0x0c, 0x00, HDA_INPUT), 554 - { } /* end */ 555 - }; 556 - 557 - /* iMac 24 init verbs. */ 558 - static const struct hda_verb alc885_imac24_init_verbs[] = { 559 - /* Internal speakers: output 0 (0x0c) */ 560 - {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 561 - {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 562 - {0x18, AC_VERB_SET_CONNECT_SEL, 0x00}, 563 - /* Internal speakers: output 0 (0x0c) */ 564 - {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 565 - {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 566 - {0x1a, AC_VERB_SET_CONNECT_SEL, 0x00}, 567 - /* Headphone: output 0 (0x0c) */ 568 - {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 569 - {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 570 - {0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, 571 - {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC_HP_EVENT | AC_USRSP_EN}, 572 - /* Front Mic: input vref at 80% */ 573 - {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, 574 - {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 575 - { } 576 - }; 577 - 578 1672 /* Toggle speaker-output according to the hp-jack state */ 579 1673 static void alc885_imac24_setup(struct hda_codec *codec) 580 1674 { ··· 592 1742 alc_simple_setup_automute(spec, ALC_AUTOMUTE_AMP); 593 1743 } 594 1744 595 - static const struct hda_verb alc882_targa_verbs[] = { 596 - {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 597 - {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 598 - 599 - {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 600 - {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 601 - 602 - {0x18, AC_VERB_SET_CONNECT_SEL, 0x02}, /* mic/clfe */ 603 - {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01}, /* line/surround */ 604 - {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */ 605 - 606 - {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC_HP_EVENT | AC_USRSP_EN}, 607 - { } /* end */ 608 - }; 609 - 610 - /* toggle speaker-output according to the hp-jack state */ 611 - static void alc882_targa_automute(struct hda_codec *codec) 612 - { 613 - struct alc_spec *spec = codec->spec; 614 - alc_hp_automute(codec); 615 - snd_hda_codec_write_cache(codec, 1, 0, AC_VERB_SET_GPIO_DATA, 616 - spec->hp_jack_present ? 1 : 3); 617 - } 618 - 619 - static void alc882_targa_setup(struct hda_codec *codec) 620 - { 621 - struct alc_spec *spec = codec->spec; 622 - 623 - spec->autocfg.hp_pins[0] = 0x14; 624 - spec->autocfg.speaker_pins[0] = 0x1b; 625 - alc_simple_setup_automute(spec, ALC_AUTOMUTE_AMP); 626 - } 627 - 628 - static void alc882_targa_unsol_event(struct hda_codec *codec, unsigned int res) 629 - { 630 - if ((res >> 26) == ALC_HP_EVENT) 631 - alc882_targa_automute(codec); 632 - } 633 - 634 - static const struct hda_verb alc882_asus_a7j_verbs[] = { 635 - {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 636 - {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 637 - 638 - {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 639 - {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 640 - {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 641 - 642 - {0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Front */ 643 - {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */ 644 - {0x16, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Front */ 645 - 646 - {0x18, AC_VERB_SET_CONNECT_SEL, 0x02}, /* mic/clfe */ 647 - {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01}, /* line/surround */ 648 - {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */ 649 - { } /* end */ 650 - }; 651 - 652 - static const struct hda_verb alc882_asus_a7m_verbs[] = { 653 - {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 654 - {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 655 - 656 - {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 657 - {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 658 - {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 659 - 660 - {0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Front */ 661 - {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */ 662 - {0x16, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Front */ 663 - 664 - {0x18, AC_VERB_SET_CONNECT_SEL, 0x02}, /* mic/clfe */ 665 - {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01}, /* line/surround */ 666 - {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */ 667 - { } /* end */ 668 - }; 669 - 670 - static void alc882_gpio_mute(struct hda_codec *codec, int pin, int muted) 671 - { 672 - unsigned int gpiostate, gpiomask, gpiodir; 673 - 674 - gpiostate = snd_hda_codec_read(codec, codec->afg, 0, 675 - AC_VERB_GET_GPIO_DATA, 0); 676 - 677 - if (!muted) 678 - gpiostate |= (1 << pin); 679 - else 680 - gpiostate &= ~(1 << pin); 681 - 682 - gpiomask = snd_hda_codec_read(codec, codec->afg, 0, 683 - AC_VERB_GET_GPIO_MASK, 0); 684 - gpiomask |= (1 << pin); 685 - 686 - gpiodir = snd_hda_codec_read(codec, codec->afg, 0, 687 - AC_VERB_GET_GPIO_DIRECTION, 0); 688 - gpiodir |= (1 << pin); 689 - 690 - 691 - snd_hda_codec_write(codec, codec->afg, 0, 692 - AC_VERB_SET_GPIO_MASK, gpiomask); 693 - snd_hda_codec_write(codec, codec->afg, 0, 694 - AC_VERB_SET_GPIO_DIRECTION, gpiodir); 695 - 696 - msleep(1); 697 - 698 - snd_hda_codec_write(codec, codec->afg, 0, 699 - AC_VERB_SET_GPIO_DATA, gpiostate); 700 - } 701 - 702 - /* set up GPIO at initialization */ 703 - static void alc885_macpro_init_hook(struct hda_codec *codec) 704 - { 705 - alc882_gpio_mute(codec, 0, 0); 706 - alc882_gpio_mute(codec, 1, 0); 707 - } 708 - 709 - /* set up GPIO and update auto-muting at initialization */ 710 - static void alc885_imac24_init_hook(struct hda_codec *codec) 711 - { 712 - alc885_macpro_init_hook(codec); 713 - alc_hp_automute(codec); 714 - } 715 - 716 1745 /* 2ch mode (Speaker:front, Subwoofer:CLFE, Line:input, Headphones:front) */ 717 1746 static const struct hda_verb alc889A_mb31_ch2_init[] = { 718 1747 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP as front */ ··· 635 1906 { 6, alc889A_mb31_ch6_init }, 636 1907 }; 637 1908 638 - static const struct hda_verb alc883_medion_eapd_verbs[] = { 639 - /* eanable EAPD on medion laptop */ 640 - {0x20, AC_VERB_SET_COEF_INDEX, 0x07}, 641 - {0x20, AC_VERB_SET_PROC_COEF, 0x3070}, 642 - { } 643 - }; 644 - 645 - #define alc883_base_mixer alc882_base_mixer 646 - 647 - static const struct snd_kcontrol_new alc883_mitac_mixer[] = { 648 - HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 649 - HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 650 - HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT), 651 - HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT), 652 - HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT), 653 - HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT), 654 - HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT), 655 - HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 656 - HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT), 657 - HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 658 - HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), 659 - HDA_CODEC_VOLUME("Front Mic Boost Volume", 0x19, 0, HDA_INPUT), 660 - HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), 661 - { } /* end */ 662 - }; 663 - 664 - static const struct snd_kcontrol_new alc883_clevo_m720_mixer[] = { 665 - HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 666 - HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT), 667 - HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT), 668 - HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT), 669 - HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 670 - HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT), 671 - HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 672 - HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), 673 - HDA_CODEC_VOLUME("Internal Mic Boost Volume", 0x19, 0, HDA_INPUT), 674 - HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), 675 - { } /* end */ 676 - }; 677 - 678 - static const struct snd_kcontrol_new alc883_2ch_fujitsu_pi2515_mixer[] = { 679 - HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 680 - HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT), 681 - HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT), 682 - HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT), 683 - HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 684 - HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT), 685 - HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 686 - HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), 687 - HDA_CODEC_VOLUME("Internal Mic Boost Volume", 0x19, 0, HDA_INPUT), 688 - HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), 689 - { } /* end */ 690 - }; 691 - 692 - static const struct snd_kcontrol_new alc883_3ST_2ch_mixer[] = { 693 - HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 694 - HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 695 - HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT), 696 - HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), 697 - HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), 698 - HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), 699 - HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), 700 - HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 701 - HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT), 702 - HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 703 - HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), 704 - HDA_CODEC_VOLUME("Front Mic Boost Volume", 0x19, 0, HDA_INPUT), 705 - HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), 706 - { } /* end */ 707 - }; 708 - 709 1909 static const struct snd_kcontrol_new alc883_3ST_6ch_mixer[] = { 710 1910 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 711 1911 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), ··· 645 1987 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT), 646 1988 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT), 647 1989 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT), 648 - HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), 649 - HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), 650 - HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), 651 - HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), 652 - HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 653 - HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT), 654 - HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 655 - HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), 656 - HDA_CODEC_VOLUME("Front Mic Boost Volume", 0x19, 0, HDA_INPUT), 657 - HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), 658 - { } /* end */ 659 - }; 660 - 661 - static const struct snd_kcontrol_new alc883_3ST_6ch_intel_mixer[] = { 662 - HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 663 - HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 664 - HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT), 665 - HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT), 666 - HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, 667 - HDA_OUTPUT), 668 - HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT), 669 - HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT), 670 - HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT), 671 - HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT), 672 - HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), 673 - HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), 674 - HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), 675 - HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), 676 - HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), 677 - HDA_CODEC_VOLUME("Mic Boost Volume", 0x19, 0, HDA_INPUT), 678 - HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), 679 - HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 680 - HDA_CODEC_VOLUME("Front Mic Boost Volume", 0x18, 0, HDA_INPUT), 681 - HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 682 - { } /* end */ 683 - }; 684 - 685 - static const struct snd_kcontrol_new alc885_8ch_intel_mixer[] = { 686 - HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 687 - HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 688 - HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT), 689 - HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT), 690 - HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, 691 - HDA_OUTPUT), 692 - HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT), 693 - HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT), 694 - HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT), 695 - HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0f, 0x0, HDA_OUTPUT), 696 - HDA_BIND_MUTE("Speaker Playback Switch", 0x0f, 2, HDA_INPUT), 697 - HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT), 698 - HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), 699 - HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), 700 - HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x3, HDA_INPUT), 701 - HDA_CODEC_VOLUME("Mic Boost Volume", 0x1b, 0, HDA_INPUT), 702 - HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x3, HDA_INPUT), 703 - HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 704 - HDA_CODEC_VOLUME("Front Mic Boost Volume", 0x18, 0, HDA_INPUT), 705 - HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 706 - { } /* end */ 707 - }; 708 - 709 - static const struct snd_kcontrol_new alc883_fivestack_mixer[] = { 710 - HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 711 - HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 712 - HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT), 713 - HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT), 714 - HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT), 715 - HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT), 716 - HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT), 717 - HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT), 718 - HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT), 719 - HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), 720 - HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), 721 - HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), 722 - HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), 723 - HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 724 - HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT), 725 - HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 726 - HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), 727 - HDA_CODEC_VOLUME("Front Mic Boost Volume", 0x19, 0, HDA_INPUT), 728 - HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), 729 - { } /* end */ 730 - }; 731 - 732 - static const struct snd_kcontrol_new alc883_targa_mixer[] = { 733 - HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 734 - HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 735 - HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT), 736 - HDA_CODEC_MUTE("Speaker Playback Switch", 0x1b, 0x0, HDA_OUTPUT), 737 - HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT), 738 - HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT), 739 - HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT), 740 - HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT), 741 - HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT), 742 - HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT), 743 - HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), 744 - HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), 745 - HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), 746 - HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), 747 - HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 748 - HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT), 749 - HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 750 - { } /* end */ 751 - }; 752 - 753 - static const struct snd_kcontrol_new alc883_targa_2ch_mixer[] = { 754 - HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 755 - HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 756 - HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT), 757 - HDA_CODEC_MUTE("Speaker Playback Switch", 0x1b, 0x0, HDA_OUTPUT), 758 - HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), 759 - HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), 760 - HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 761 - HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT), 762 - HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 763 - HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), 764 - HDA_CODEC_VOLUME("Internal Mic Boost Volume", 0x19, 0, HDA_INPUT), 765 - HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), 766 - { } /* end */ 767 - }; 768 - 769 - static const struct snd_kcontrol_new alc883_targa_8ch_mixer[] = { 770 - HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT), 771 - HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT), 772 - HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), 773 - HDA_CODEC_VOLUME("Internal Mic Boost Volume", 0x19, 0, HDA_INPUT), 774 - HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), 775 - { } /* end */ 776 - }; 777 - 778 - static const struct snd_kcontrol_new alc883_lenovo_101e_2ch_mixer[] = { 779 - HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 780 - HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 781 - HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT), 782 - HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT), 783 - HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT), 784 - HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), 785 - HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT), 786 - HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), 787 - { } /* end */ 788 - }; 789 - 790 - static const struct snd_kcontrol_new alc883_lenovo_nb0763_mixer[] = { 791 - HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 792 - HDA_BIND_MUTE("Speaker Playback Switch", 0x0c, 2, HDA_INPUT), 793 - HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT), 794 - HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), 795 - HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), 796 - HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 797 - HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 798 - HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), 799 - HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), 800 - { } /* end */ 801 - }; 802 - 803 - static const struct snd_kcontrol_new alc883_medion_wim2160_mixer[] = { 804 - HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 805 - HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 806 - HDA_CODEC_MUTE("Speaker Playback Switch", 0x15, 0x0, HDA_OUTPUT), 807 - HDA_CODEC_MUTE("Headphone Playback Switch", 0x1a, 0x0, HDA_OUTPUT), 808 - HDA_CODEC_VOLUME("Line Playback Volume", 0x08, 0x0, HDA_INPUT), 809 - HDA_CODEC_MUTE("Line Playback Switch", 0x08, 0x0, HDA_INPUT), 810 - { } /* end */ 811 - }; 812 - 813 - static const struct hda_verb alc883_medion_wim2160_verbs[] = { 814 - /* Unmute front mixer */ 815 - {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 816 - {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 817 - 818 - /* Set speaker pin to front mixer */ 819 - {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, 820 - 821 - /* Init headphone pin */ 822 - {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 823 - {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 824 - {0x1a, AC_VERB_SET_CONNECT_SEL, 0x00}, 825 - {0x1a, AC_VERB_SET_UNSOLICITED_ENABLE, ALC_HP_EVENT | AC_USRSP_EN}, 826 - 827 - { } /* end */ 828 - }; 829 - 830 - /* toggle speaker-output according to the hp-jack state */ 831 - static void alc883_medion_wim2160_setup(struct hda_codec *codec) 832 - { 833 - struct alc_spec *spec = codec->spec; 834 - 835 - spec->autocfg.hp_pins[0] = 0x1a; 836 - spec->autocfg.speaker_pins[0] = 0x15; 837 - alc_simple_setup_automute(spec, ALC_AUTOMUTE_AMP); 838 - } 839 - 840 - static const struct snd_kcontrol_new alc883_acer_aspire_mixer[] = { 841 - HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 842 - HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 843 - HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT), 844 - HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), 845 - HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), 846 - HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 847 - HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT), 848 - HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 849 - { } /* end */ 850 - }; 851 - 852 - static const struct snd_kcontrol_new alc888_acer_aspire_6530_mixer[] = { 853 - HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 854 - HDA_CODEC_VOLUME("LFE Playback Volume", 0x0f, 0x0, HDA_OUTPUT), 855 - HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), 856 - HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), 857 - HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), 858 - HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), 859 - HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 860 - HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT), 861 - HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 862 - { } /* end */ 863 - }; 864 - 865 - static const struct snd_kcontrol_new alc888_lenovo_sky_mixer[] = { 866 - HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 867 - HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 868 - HDA_CODEC_VOLUME("Surround Playback Volume", 0x0e, 0x0, HDA_OUTPUT), 869 - HDA_BIND_MUTE("Surround Playback Switch", 0x0e, 2, HDA_INPUT), 870 - HDA_CODEC_VOLUME_MONO("Center Playback Volume", 871 - 0x0d, 1, 0x0, HDA_OUTPUT), 872 - HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0d, 2, 0x0, HDA_OUTPUT), 873 - HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0d, 1, 2, HDA_INPUT), 874 - HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0d, 2, 2, HDA_INPUT), 875 - HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT), 876 - HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT), 877 1990 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), 878 1991 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), 879 1992 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), ··· 684 2255 { } /* end */ 685 2256 }; 686 2257 687 - static const struct snd_kcontrol_new alc883_vaiott_mixer[] = { 688 - HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 689 - HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 690 - HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT), 691 - HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), 692 - HDA_CODEC_VOLUME("Mic Boost Volume", 0x19, 0, HDA_INPUT), 693 - HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), 694 - { } /* end */ 695 - }; 696 - 697 - static const struct hda_bind_ctls alc883_bind_cap_vol = { 698 - .ops = &snd_hda_bind_vol, 699 - .values = { 700 - HDA_COMPOSE_AMP_VAL(0x08, 3, 0, HDA_INPUT), 701 - HDA_COMPOSE_AMP_VAL(0x09, 3, 0, HDA_INPUT), 702 - 0 703 - }, 704 - }; 705 - 706 - static const struct hda_bind_ctls alc883_bind_cap_switch = { 707 - .ops = &snd_hda_bind_sw, 708 - .values = { 709 - HDA_COMPOSE_AMP_VAL(0x08, 3, 0, HDA_INPUT), 710 - HDA_COMPOSE_AMP_VAL(0x09, 3, 0, HDA_INPUT), 711 - 0 712 - }, 713 - }; 714 - 715 - static const struct snd_kcontrol_new alc883_asus_eee1601_mixer[] = { 716 - HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 717 - HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 718 - HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT), 719 - HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), 720 - HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), 721 - HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 722 - HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT), 723 - HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 724 - { } /* end */ 725 - }; 726 - 727 - static const struct snd_kcontrol_new alc883_asus_eee1601_cap_mixer[] = { 728 - HDA_BIND_VOL("Capture Volume", &alc883_bind_cap_vol), 729 - HDA_BIND_SW("Capture Switch", &alc883_bind_cap_switch), 730 - { 731 - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 732 - /* .name = "Capture Source", */ 733 - .name = "Input Source", 734 - .count = 1, 735 - .info = alc_mux_enum_info, 736 - .get = alc_mux_enum_get, 737 - .put = alc_mux_enum_put, 738 - }, 739 - { } /* end */ 740 - }; 741 - 742 2258 static const struct snd_kcontrol_new alc883_chmode_mixer[] = { 743 2259 { 744 2260 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, ··· 694 2320 }, 695 2321 { } /* end */ 696 2322 }; 697 - 698 - /* toggle speaker-output according to the hp-jack state */ 699 - static void alc883_mitac_setup(struct hda_codec *codec) 700 - { 701 - struct alc_spec *spec = codec->spec; 702 - 703 - spec->autocfg.hp_pins[0] = 0x15; 704 - spec->autocfg.speaker_pins[0] = 0x14; 705 - spec->autocfg.speaker_pins[1] = 0x17; 706 - alc_simple_setup_automute(spec, ALC_AUTOMUTE_AMP); 707 - } 708 - 709 - static const struct hda_verb alc883_mitac_verbs[] = { 710 - /* HP */ 711 - {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, 712 - {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 713 - /* Subwoofer */ 714 - {0x17, AC_VERB_SET_CONNECT_SEL, 0x02}, 715 - {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 716 - 717 - /* enable unsolicited event */ 718 - {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC_HP_EVENT | AC_USRSP_EN}, 719 - /* {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC_MIC_EVENT | AC_USRSP_EN}, */ 720 - 721 - { } /* end */ 722 - }; 723 - 724 - static const struct hda_verb alc883_clevo_m540r_verbs[] = { 725 - /* HP */ 726 - {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, 727 - {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 728 - /* Int speaker */ 729 - /*{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},*/ 730 - 731 - /* enable unsolicited event */ 732 - /* 733 - {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC_HP_EVENT | AC_USRSP_EN}, 734 - {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC_MIC_EVENT | AC_USRSP_EN}, 735 - */ 736 - 737 - { } /* end */ 738 - }; 739 - 740 - static const struct hda_verb alc883_clevo_m720_verbs[] = { 741 - /* HP */ 742 - {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, 743 - {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 744 - /* Int speaker */ 745 - {0x14, AC_VERB_SET_CONNECT_SEL, 0x01}, 746 - {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 747 - 748 - /* enable unsolicited event */ 749 - {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC_HP_EVENT | AC_USRSP_EN}, 750 - {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC_MIC_EVENT | AC_USRSP_EN}, 751 - 752 - { } /* end */ 753 - }; 754 - 755 - static const struct hda_verb alc883_2ch_fujitsu_pi2515_verbs[] = { 756 - /* HP */ 757 - {0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, 758 - {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 759 - /* Subwoofer */ 760 - {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, 761 - {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 762 - 763 - /* enable unsolicited event */ 764 - {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC_HP_EVENT | AC_USRSP_EN}, 765 - 766 - { } /* end */ 767 - }; 768 - 769 - static const struct hda_verb alc883_targa_verbs[] = { 770 - {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 771 - {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 772 - 773 - {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 774 - {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 775 - 776 - /* Connect Line-Out side jack (SPDIF) to Side */ 777 - {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 778 - {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 779 - {0x17, AC_VERB_SET_CONNECT_SEL, 0x03}, 780 - /* Connect Mic jack to CLFE */ 781 - {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 782 - {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 783 - {0x18, AC_VERB_SET_CONNECT_SEL, 0x02}, 784 - /* Connect Line-in jack to Surround */ 785 - {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 786 - {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 787 - {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01}, 788 - /* Connect HP out jack to Front */ 789 - {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 790 - {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 791 - {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, 792 - 793 - {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC_HP_EVENT | AC_USRSP_EN}, 794 - 795 - { } /* end */ 796 - }; 797 - 798 - static const struct hda_verb alc883_lenovo_101e_verbs[] = { 799 - {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, 800 - {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC_FRONT_EVENT|AC_USRSP_EN}, 801 - {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC_HP_EVENT|AC_USRSP_EN}, 802 - { } /* end */ 803 - }; 804 - 805 - static const struct hda_verb alc883_lenovo_nb0763_verbs[] = { 806 - {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, 807 - {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 808 - {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC_HP_EVENT | AC_USRSP_EN}, 809 - {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 810 - { } /* end */ 811 - }; 812 - 813 - static const struct hda_verb alc888_lenovo_ms7195_verbs[] = { 814 - {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 815 - {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 816 - {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, 817 - {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC_FRONT_EVENT | AC_USRSP_EN}, 818 - {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC_HP_EVENT | AC_USRSP_EN}, 819 - { } /* end */ 820 - }; 821 - 822 - static const struct hda_verb alc883_haier_w66_verbs[] = { 823 - {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 824 - {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 825 - 826 - {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 827 - 828 - {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, 829 - {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 830 - {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC_HP_EVENT | AC_USRSP_EN}, 831 - {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 832 - { } /* end */ 833 - }; 834 - 835 - static const struct hda_verb alc888_lenovo_sky_verbs[] = { 836 - {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 837 - {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 838 - {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 839 - {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 840 - {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 841 - {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 842 - {0x1a, AC_VERB_SET_CONNECT_SEL, 0x00}, 843 - {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC_HP_EVENT | AC_USRSP_EN}, 844 - { } /* end */ 845 - }; 846 - 847 - static const struct hda_verb alc888_6st_dell_verbs[] = { 848 - {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC_HP_EVENT | AC_USRSP_EN}, 849 - { } 850 - }; 851 - 852 - static const struct hda_verb alc883_vaiott_verbs[] = { 853 - /* HP */ 854 - {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, 855 - {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 856 - 857 - /* enable unsolicited event */ 858 - {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC_HP_EVENT | AC_USRSP_EN}, 859 - 860 - { } /* end */ 861 - }; 862 - 863 - static void alc888_3st_hp_setup(struct hda_codec *codec) 864 - { 865 - struct alc_spec *spec = codec->spec; 866 - 867 - spec->autocfg.hp_pins[0] = 0x1b; 868 - spec->autocfg.speaker_pins[0] = 0x14; 869 - spec->autocfg.speaker_pins[1] = 0x16; 870 - spec->autocfg.speaker_pins[2] = 0x18; 871 - alc_simple_setup_automute(spec, ALC_AUTOMUTE_AMP); 872 - } 873 - 874 - static const struct hda_verb alc888_3st_hp_verbs[] = { 875 - {0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Front: output 0 (0x0c) */ 876 - {0x16, AC_VERB_SET_CONNECT_SEL, 0x01}, /* Rear : output 1 (0x0d) */ 877 - {0x18, AC_VERB_SET_CONNECT_SEL, 0x02}, /* CLFE : output 2 (0x0e) */ 878 - {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC_HP_EVENT | AC_USRSP_EN}, 879 - { } /* end */ 880 - }; 881 - 882 - /* 883 - * 2ch mode 884 - */ 885 - static const struct hda_verb alc888_3st_hp_2ch_init[] = { 886 - { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, 887 - { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE }, 888 - { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN }, 889 - { 0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE }, 890 - { } /* end */ 891 - }; 892 - 893 - /* 894 - * 4ch mode 895 - */ 896 - static const struct hda_verb alc888_3st_hp_4ch_init[] = { 897 - { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, 898 - { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE }, 899 - { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 900 - { 0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 901 - { 0x16, AC_VERB_SET_CONNECT_SEL, 0x01 }, 902 - { } /* end */ 903 - }; 904 - 905 - /* 906 - * 6ch mode 907 - */ 908 - static const struct hda_verb alc888_3st_hp_6ch_init[] = { 909 - { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 910 - { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 911 - { 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 }, 912 - { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 913 - { 0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 914 - { 0x16, AC_VERB_SET_CONNECT_SEL, 0x01 }, 915 - { } /* end */ 916 - }; 917 - 918 - static const struct hda_channel_mode alc888_3st_hp_modes[3] = { 919 - { 2, alc888_3st_hp_2ch_init }, 920 - { 4, alc888_3st_hp_4ch_init }, 921 - { 6, alc888_3st_hp_6ch_init }, 922 - }; 923 - 924 - static void alc888_lenovo_ms7195_setup(struct hda_codec *codec) 925 - { 926 - struct alc_spec *spec = codec->spec; 927 - 928 - spec->autocfg.hp_pins[0] = 0x1b; 929 - spec->autocfg.line_out_pins[0] = 0x14; 930 - spec->autocfg.speaker_pins[0] = 0x15; 931 - alc_simple_setup_automute(spec, ALC_AUTOMUTE_AMP); 932 - } 933 - 934 - /* toggle speaker-output according to the hp-jack state */ 935 - static void alc883_lenovo_nb0763_setup(struct hda_codec *codec) 936 - { 937 - struct alc_spec *spec = codec->spec; 938 - 939 - spec->autocfg.hp_pins[0] = 0x14; 940 - spec->autocfg.speaker_pins[0] = 0x15; 941 - alc_simple_setup_automute(spec, ALC_AUTOMUTE_AMP); 942 - } 943 - 944 - /* toggle speaker-output according to the hp-jack state */ 945 - #define alc883_targa_init_hook alc882_targa_init_hook 946 - #define alc883_targa_unsol_event alc882_targa_unsol_event 947 - 948 - static void alc883_clevo_m720_setup(struct hda_codec *codec) 949 - { 950 - struct alc_spec *spec = codec->spec; 951 - 952 - spec->autocfg.hp_pins[0] = 0x15; 953 - spec->autocfg.speaker_pins[0] = 0x14; 954 - alc_simple_setup_automute(spec, ALC_AUTOMUTE_AMP); 955 - } 956 - 957 - static void alc883_clevo_m720_init_hook(struct hda_codec *codec) 958 - { 959 - alc_hp_automute(codec); 960 - alc88x_simple_mic_automute(codec); 961 - } 962 - 963 - static void alc883_clevo_m720_unsol_event(struct hda_codec *codec, 964 - unsigned int res) 965 - { 966 - switch (res >> 26) { 967 - case ALC_MIC_EVENT: 968 - alc88x_simple_mic_automute(codec); 969 - break; 970 - default: 971 - alc_sku_unsol_event(codec, res); 972 - break; 973 - } 974 - } 975 - 976 - /* toggle speaker-output according to the hp-jack state */ 977 - static void alc883_2ch_fujitsu_pi2515_setup(struct hda_codec *codec) 978 - { 979 - struct alc_spec *spec = codec->spec; 980 - 981 - spec->autocfg.hp_pins[0] = 0x14; 982 - spec->autocfg.speaker_pins[0] = 0x15; 983 - alc_simple_setup_automute(spec, ALC_AUTOMUTE_AMP); 984 - } 985 - 986 - static void alc883_haier_w66_setup(struct hda_codec *codec) 987 - { 988 - struct alc_spec *spec = codec->spec; 989 - 990 - spec->autocfg.hp_pins[0] = 0x1b; 991 - spec->autocfg.speaker_pins[0] = 0x14; 992 - alc_simple_setup_automute(spec, ALC_AUTOMUTE_AMP); 993 - } 994 - 995 - static void alc883_lenovo_101e_setup(struct hda_codec *codec) 996 - { 997 - struct alc_spec *spec = codec->spec; 998 - 999 - spec->autocfg.hp_pins[0] = 0x1b; 1000 - spec->autocfg.line_out_pins[0] = 0x14; 1001 - spec->autocfg.speaker_pins[0] = 0x15; 1002 - alc_simple_setup_automute(spec, ALC_AUTOMUTE_AMP); 1003 - } 1004 - 1005 - /* toggle speaker-output according to the hp-jack state */ 1006 - static void alc883_acer_aspire_setup(struct hda_codec *codec) 1007 - { 1008 - struct alc_spec *spec = codec->spec; 1009 - 1010 - spec->autocfg.hp_pins[0] = 0x14; 1011 - spec->autocfg.speaker_pins[0] = 0x15; 1012 - spec->autocfg.speaker_pins[1] = 0x16; 1013 - alc_simple_setup_automute(spec, ALC_AUTOMUTE_AMP); 1014 - } 1015 - 1016 - static const struct hda_verb alc883_acer_eapd_verbs[] = { 1017 - /* HP Pin: output 0 (0x0c) */ 1018 - {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 1019 - {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 1020 - {0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, 1021 - /* Front Pin: output 0 (0x0c) */ 1022 - {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 1023 - {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, 1024 - {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 1025 - {0x16, AC_VERB_SET_CONNECT_SEL, 0x00}, 1026 - /* eanable EAPD on medion laptop */ 1027 - {0x20, AC_VERB_SET_COEF_INDEX, 0x07}, 1028 - {0x20, AC_VERB_SET_PROC_COEF, 0x3050}, 1029 - /* enable unsolicited event */ 1030 - {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC_HP_EVENT | AC_USRSP_EN}, 1031 - { } 1032 - }; 1033 - 1034 - static void alc888_6st_dell_setup(struct hda_codec *codec) 1035 - { 1036 - struct alc_spec *spec = codec->spec; 1037 - 1038 - spec->autocfg.hp_pins[0] = 0x1b; 1039 - spec->autocfg.speaker_pins[0] = 0x14; 1040 - spec->autocfg.speaker_pins[1] = 0x15; 1041 - spec->autocfg.speaker_pins[2] = 0x16; 1042 - spec->autocfg.speaker_pins[3] = 0x17; 1043 - alc_simple_setup_automute(spec, ALC_AUTOMUTE_AMP); 1044 - } 1045 - 1046 - static void alc888_lenovo_sky_setup(struct hda_codec *codec) 1047 - { 1048 - struct alc_spec *spec = codec->spec; 1049 - 1050 - spec->autocfg.hp_pins[0] = 0x1b; 1051 - spec->autocfg.speaker_pins[0] = 0x14; 1052 - spec->autocfg.speaker_pins[1] = 0x15; 1053 - spec->autocfg.speaker_pins[2] = 0x16; 1054 - spec->autocfg.speaker_pins[3] = 0x17; 1055 - spec->autocfg.speaker_pins[4] = 0x1a; 1056 - alc_simple_setup_automute(spec, ALC_AUTOMUTE_AMP); 1057 - } 1058 - 1059 - static void alc883_vaiott_setup(struct hda_codec *codec) 1060 - { 1061 - struct alc_spec *spec = codec->spec; 1062 - 1063 - spec->autocfg.hp_pins[0] = 0x15; 1064 - spec->autocfg.speaker_pins[0] = 0x14; 1065 - spec->autocfg.speaker_pins[1] = 0x17; 1066 - alc_simple_setup_automute(spec, ALC_AUTOMUTE_AMP); 1067 - } 1068 - 1069 - static const struct hda_verb alc888_asus_m90v_verbs[] = { 1070 - {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 1071 - {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 1072 - {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 1073 - /* enable unsolicited event */ 1074 - {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC_HP_EVENT | AC_USRSP_EN}, 1075 - {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC_MIC_EVENT | AC_USRSP_EN}, 1076 - { } /* end */ 1077 - }; 1078 - 1079 - static void alc883_mode2_setup(struct hda_codec *codec) 1080 - { 1081 - struct alc_spec *spec = codec->spec; 1082 - 1083 - spec->autocfg.hp_pins[0] = 0x1b; 1084 - spec->autocfg.speaker_pins[0] = 0x14; 1085 - spec->autocfg.speaker_pins[1] = 0x15; 1086 - spec->autocfg.speaker_pins[2] = 0x16; 1087 - spec->ext_mic_pin = 0x18; 1088 - spec->int_mic_pin = 0x19; 1089 - spec->auto_mic = 1; 1090 - alc_simple_setup_automute(spec, ALC_AUTOMUTE_AMP); 1091 - } 1092 - 1093 - static const struct hda_verb alc888_asus_eee1601_verbs[] = { 1094 - {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 1095 - {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 1096 - {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 1097 - {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 1098 - {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 1099 - {0x20, AC_VERB_SET_COEF_INDEX, 0x0b}, 1100 - {0x20, AC_VERB_SET_PROC_COEF, 0x0838}, 1101 - /* enable unsolicited event */ 1102 - {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC_HP_EVENT | AC_USRSP_EN}, 1103 - { } /* end */ 1104 - }; 1105 - 1106 - static void alc883_eee1601_inithook(struct hda_codec *codec) 1107 - { 1108 - struct alc_spec *spec = codec->spec; 1109 - 1110 - spec->autocfg.hp_pins[0] = 0x14; 1111 - spec->autocfg.speaker_pins[0] = 0x1b; 1112 - alc_hp_automute(codec); 1113 - } 1114 2323 1115 2324 static const struct hda_verb alc889A_mb31_verbs[] = { 1116 2325 /* Init rear pin (used as headphone output) */ ··· 730 2773 alc889A_mb31_automute(codec); 731 2774 } 732 2775 733 - static const hda_nid_t alc883_slave_dig_outs[] = { 734 - ALC1200_DIGOUT_NID, 0, 735 - }; 736 - 737 - static const hda_nid_t alc1200_slave_dig_outs[] = { 738 - ALC883_DIGOUT_NID, 0, 739 - }; 740 - 741 2776 /* 742 2777 * configuration and preset 743 2778 */ 744 2779 static const char * const alc882_models[ALC882_MODEL_LAST] = { 745 - [ALC882_3ST_DIG] = "3stack-dig", 746 - [ALC882_6ST_DIG] = "6stack-dig", 747 - [ALC882_ARIMA] = "arima", 748 - [ALC882_W2JC] = "w2jc", 749 - [ALC882_TARGA] = "targa", 750 - [ALC882_ASUS_A7J] = "asus-a7j", 751 - [ALC882_ASUS_A7M] = "asus-a7m", 752 - [ALC885_MACPRO] = "macpro", 753 2780 [ALC885_MB5] = "mb5", 754 2781 [ALC885_MACMINI3] = "macmini3", 755 2782 [ALC885_MBA21] = "mba21", 756 2783 [ALC885_MBP3] = "mbp3", 757 - [ALC885_IMAC24] = "imac24", 758 2784 [ALC885_IMAC91] = "imac91", 759 - [ALC883_3ST_2ch_DIG] = "3stack-2ch-dig", 760 - [ALC883_3ST_6ch_DIG] = "3stack-6ch-dig", 761 - [ALC883_3ST_6ch] = "3stack-6ch", 762 - [ALC883_6ST_DIG] = "alc883-6stack-dig", 763 - [ALC883_TARGA_DIG] = "targa-dig", 764 - [ALC883_TARGA_2ch_DIG] = "targa-2ch-dig", 765 - [ALC883_TARGA_8ch_DIG] = "targa-8ch-dig", 766 - [ALC883_ACER] = "acer", 767 - [ALC883_ACER_ASPIRE] = "acer-aspire", 768 - [ALC888_ACER_ASPIRE_4930G] = "acer-aspire-4930g", 769 - [ALC888_ACER_ASPIRE_6530G] = "acer-aspire-6530g", 770 - [ALC888_ACER_ASPIRE_8930G] = "acer-aspire-8930g", 771 - [ALC888_ACER_ASPIRE_7730G] = "acer-aspire-7730g", 772 - [ALC883_MEDION] = "medion", 773 - [ALC883_MEDION_WIM2160] = "medion-wim2160", 774 - [ALC883_LAPTOP_EAPD] = "laptop-eapd", 775 - [ALC883_LENOVO_101E_2ch] = "lenovo-101e", 776 - [ALC883_LENOVO_NB0763] = "lenovo-nb0763", 777 - [ALC888_LENOVO_MS7195_DIG] = "lenovo-ms7195-dig", 778 - [ALC888_LENOVO_SKY] = "lenovo-sky", 779 - [ALC883_HAIER_W66] = "haier-w66", 780 - [ALC888_3ST_HP] = "3stack-hp", 781 - [ALC888_6ST_DELL] = "6stack-dell", 782 - [ALC883_MITAC] = "mitac", 783 - [ALC883_CLEVO_M540R] = "clevo-m540r", 784 - [ALC883_CLEVO_M720] = "clevo-m720", 785 - [ALC883_FUJITSU_PI2515] = "fujitsu-pi2515", 786 - [ALC888_FUJITSU_XA3530] = "fujitsu-xa3530", 787 - [ALC883_3ST_6ch_INTEL] = "3stack-6ch-intel", 788 - [ALC889A_INTEL] = "intel-alc889a", 789 - [ALC889_INTEL] = "intel-x58", 790 - [ALC1200_ASUS_P5Q] = "asus-p5q", 791 2785 [ALC889A_MB31] = "mb31", 792 - [ALC883_SONY_VAIO_TT] = "sony-vaio-tt", 793 2786 [ALC882_AUTO] = "auto", 794 - }; 795 - 796 - static const struct snd_pci_quirk alc882_cfg_tbl[] = { 797 - SND_PCI_QUIRK(0x1019, 0x6668, "ECS", ALC882_6ST_DIG), 798 - 799 - SND_PCI_QUIRK(0x1025, 0x006c, "Acer Aspire 9810", ALC883_ACER_ASPIRE), 800 - SND_PCI_QUIRK(0x1025, 0x0090, "Acer Aspire", ALC883_ACER_ASPIRE), 801 - SND_PCI_QUIRK(0x1025, 0x010a, "Acer Ferrari 5000", ALC883_ACER_ASPIRE), 802 - SND_PCI_QUIRK(0x1025, 0x0110, "Acer Aspire", ALC883_ACER_ASPIRE), 803 - SND_PCI_QUIRK(0x1025, 0x0112, "Acer Aspire 9303", ALC883_ACER_ASPIRE), 804 - SND_PCI_QUIRK(0x1025, 0x0121, "Acer Aspire 5920G", ALC883_ACER_ASPIRE), 805 - SND_PCI_QUIRK(0x1025, 0x013e, "Acer Aspire 4930G", 806 - ALC888_ACER_ASPIRE_4930G), 807 - SND_PCI_QUIRK(0x1025, 0x013f, "Acer Aspire 5930G", 808 - ALC888_ACER_ASPIRE_4930G), 809 - SND_PCI_QUIRK(0x1025, 0x0145, "Acer Aspire 8930G", 810 - ALC888_ACER_ASPIRE_8930G), 811 - SND_PCI_QUIRK(0x1025, 0x0146, "Acer Aspire 6935G", 812 - ALC888_ACER_ASPIRE_8930G), 813 - SND_PCI_QUIRK(0x1025, 0x0157, "Acer X3200", ALC882_AUTO), 814 - SND_PCI_QUIRK(0x1025, 0x0158, "Acer AX1700-U3700A", ALC882_AUTO), 815 - SND_PCI_QUIRK(0x1025, 0x015e, "Acer Aspire 6930G", 816 - ALC888_ACER_ASPIRE_6530G), 817 - SND_PCI_QUIRK(0x1025, 0x0166, "Acer Aspire 6530G", 818 - ALC888_ACER_ASPIRE_6530G), 819 - SND_PCI_QUIRK(0x1025, 0x0142, "Acer Aspire 7730G", 820 - ALC888_ACER_ASPIRE_7730G), 821 - /* default Acer -- disabled as it causes more problems. 822 - * model=auto should work fine now 823 - */ 824 - /* SND_PCI_QUIRK_VENDOR(0x1025, "Acer laptop", ALC883_ACER), */ 825 - 826 - SND_PCI_QUIRK(0x1028, 0x020d, "Dell Inspiron 530", ALC888_6ST_DELL), 827 - 828 - SND_PCI_QUIRK(0x103c, 0x2a3d, "HP Pavilion", ALC883_6ST_DIG), 829 - SND_PCI_QUIRK(0x103c, 0x2a4f, "HP Samba", ALC888_3ST_HP), 830 - SND_PCI_QUIRK(0x103c, 0x2a60, "HP Lucknow", ALC888_3ST_HP), 831 - SND_PCI_QUIRK(0x103c, 0x2a61, "HP Nettle", ALC883_6ST_DIG), 832 - SND_PCI_QUIRK(0x103c, 0x2a66, "HP Acacia", ALC888_3ST_HP), 833 - SND_PCI_QUIRK(0x103c, 0x2a72, "HP Educ.ar", ALC888_3ST_HP), 834 - 835 - SND_PCI_QUIRK(0x1043, 0x060d, "Asus A7J", ALC882_ASUS_A7J), 836 - SND_PCI_QUIRK(0x1043, 0x1243, "Asus A7J", ALC882_ASUS_A7J), 837 - SND_PCI_QUIRK(0x1043, 0x13c2, "Asus A7M", ALC882_ASUS_A7M), 838 - SND_PCI_QUIRK(0x1043, 0x1873, "Asus M90V", ALC888_ASUS_M90V), 839 - SND_PCI_QUIRK(0x1043, 0x1971, "Asus W2JC", ALC882_W2JC), 840 - SND_PCI_QUIRK(0x1043, 0x817f, "Asus P5LD2", ALC882_6ST_DIG), 841 - SND_PCI_QUIRK(0x1043, 0x81d8, "Asus P5WD", ALC882_6ST_DIG), 842 - SND_PCI_QUIRK(0x1043, 0x8249, "Asus M2A-VM HDMI", ALC883_3ST_6ch_DIG), 843 - SND_PCI_QUIRK(0x1043, 0x8284, "Asus Z37E", ALC883_6ST_DIG), 844 - SND_PCI_QUIRK(0x1043, 0x82fe, "Asus P5Q-EM HDMI", ALC1200_ASUS_P5Q), 845 - SND_PCI_QUIRK(0x1043, 0x835f, "Asus Eee 1601", ALC888_ASUS_EEE1601), 846 - 847 - SND_PCI_QUIRK(0x104d, 0x9047, "Sony Vaio TT", ALC883_SONY_VAIO_TT), 848 - SND_PCI_QUIRK(0x105b, 0x0ce8, "Foxconn P35AX-S", ALC883_6ST_DIG), 849 - SND_PCI_QUIRK(0x105b, 0x6668, "Foxconn", ALC882_6ST_DIG), 850 - SND_PCI_QUIRK(0x1071, 0x8227, "Mitac 82801H", ALC883_MITAC), 851 - SND_PCI_QUIRK(0x1071, 0x8253, "Mitac 8252d", ALC883_MITAC), 852 - SND_PCI_QUIRK(0x1071, 0x8258, "Evesham Voyaeger", ALC883_LAPTOP_EAPD), 853 - SND_PCI_QUIRK(0x10f1, 0x2350, "TYAN-S2350", ALC888_6ST_DELL), 854 - SND_PCI_QUIRK(0x108e, 0x534d, NULL, ALC883_3ST_6ch), 855 - SND_PCI_QUIRK(0x1458, 0xa002, "Gigabyte P35 DS3R", ALC882_6ST_DIG), 856 - 857 - SND_PCI_QUIRK(0x1462, 0x0349, "MSI", ALC883_TARGA_2ch_DIG), 858 - SND_PCI_QUIRK(0x1462, 0x040d, "MSI", ALC883_TARGA_2ch_DIG), 859 - SND_PCI_QUIRK(0x1462, 0x0579, "MSI", ALC883_TARGA_2ch_DIG), 860 - SND_PCI_QUIRK(0x1462, 0x28fb, "Targa T8", ALC882_TARGA), /* MSI-1049 T8 */ 861 - SND_PCI_QUIRK(0x1462, 0x2fb3, "MSI", ALC882_AUTO), 862 - SND_PCI_QUIRK(0x1462, 0x6668, "MSI", ALC882_6ST_DIG), 863 - SND_PCI_QUIRK(0x1462, 0x3729, "MSI S420", ALC883_TARGA_DIG), 864 - SND_PCI_QUIRK(0x1462, 0x3783, "NEC S970", ALC883_TARGA_DIG), 865 - SND_PCI_QUIRK(0x1462, 0x3b7f, "MSI", ALC883_TARGA_2ch_DIG), 866 - SND_PCI_QUIRK(0x1462, 0x3ef9, "MSI", ALC883_TARGA_DIG), 867 - SND_PCI_QUIRK(0x1462, 0x3fc1, "MSI", ALC883_TARGA_DIG), 868 - SND_PCI_QUIRK(0x1462, 0x3fc3, "MSI", ALC883_TARGA_DIG), 869 - SND_PCI_QUIRK(0x1462, 0x3fcc, "MSI", ALC883_TARGA_DIG), 870 - SND_PCI_QUIRK(0x1462, 0x3fdf, "MSI", ALC883_TARGA_DIG), 871 - SND_PCI_QUIRK(0x1462, 0x42cd, "MSI", ALC883_TARGA_DIG), 872 - SND_PCI_QUIRK(0x1462, 0x4314, "MSI", ALC883_TARGA_DIG), 873 - SND_PCI_QUIRK(0x1462, 0x4319, "MSI", ALC883_TARGA_DIG), 874 - SND_PCI_QUIRK(0x1462, 0x4324, "MSI", ALC883_TARGA_DIG), 875 - SND_PCI_QUIRK(0x1462, 0x4570, "MSI Wind Top AE2220", ALC883_TARGA_DIG), 876 - SND_PCI_QUIRK(0x1462, 0x6510, "MSI GX620", ALC883_TARGA_8ch_DIG), 877 - SND_PCI_QUIRK(0x1462, 0x6668, "MSI", ALC883_6ST_DIG), 878 - SND_PCI_QUIRK(0x1462, 0x7187, "MSI", ALC883_6ST_DIG), 879 - SND_PCI_QUIRK(0x1462, 0x7250, "MSI", ALC883_6ST_DIG), 880 - SND_PCI_QUIRK(0x1462, 0x7260, "MSI 7260", ALC883_TARGA_DIG), 881 - SND_PCI_QUIRK(0x1462, 0x7267, "MSI", ALC883_3ST_6ch_DIG), 882 - SND_PCI_QUIRK(0x1462, 0x7280, "MSI", ALC883_6ST_DIG), 883 - SND_PCI_QUIRK(0x1462, 0x7327, "MSI", ALC883_6ST_DIG), 884 - SND_PCI_QUIRK(0x1462, 0x7350, "MSI", ALC883_6ST_DIG), 885 - SND_PCI_QUIRK(0x1462, 0x7437, "MSI NetOn AP1900", ALC883_TARGA_DIG), 886 - SND_PCI_QUIRK(0x1462, 0xa422, "MSI", ALC883_TARGA_2ch_DIG), 887 - SND_PCI_QUIRK(0x1462, 0xaa08, "MSI", ALC883_TARGA_2ch_DIG), 888 - 889 - SND_PCI_QUIRK(0x147b, 0x1083, "Abit IP35-PRO", ALC883_6ST_DIG), 890 - SND_PCI_QUIRK(0x1558, 0x0571, "Clevo laptop M570U", ALC883_3ST_6ch_DIG), 891 - SND_PCI_QUIRK(0x1558, 0x0721, "Clevo laptop M720R", ALC883_CLEVO_M720), 892 - SND_PCI_QUIRK(0x1558, 0x0722, "Clevo laptop M720SR", ALC883_CLEVO_M720), 893 - SND_PCI_QUIRK(0x1558, 0x5409, "Clevo laptop M540R", ALC883_CLEVO_M540R), 894 - SND_PCI_QUIRK_VENDOR(0x1558, "Clevo laptop", ALC883_LAPTOP_EAPD), 895 - SND_PCI_QUIRK(0x15d9, 0x8780, "Supermicro PDSBA", ALC883_3ST_6ch), 896 - /* SND_PCI_QUIRK(0x161f, 0x2054, "Arima W820", ALC882_ARIMA), */ 897 - SND_PCI_QUIRK(0x161f, 0x2054, "Medion laptop", ALC883_MEDION), 898 - SND_PCI_QUIRK_MASK(0x1734, 0xfff0, 0x1100, "FSC AMILO Xi/Pi25xx", 899 - ALC883_FUJITSU_PI2515), 900 - SND_PCI_QUIRK_MASK(0x1734, 0xfff0, 0x1130, "Fujitsu AMILO Xa35xx", 901 - ALC888_FUJITSU_XA3530), 902 - SND_PCI_QUIRK(0x17aa, 0x101e, "Lenovo 101e", ALC883_LENOVO_101E_2ch), 903 - SND_PCI_QUIRK(0x17aa, 0x2085, "Lenovo NB0763", ALC883_LENOVO_NB0763), 904 - SND_PCI_QUIRK(0x17aa, 0x3bfc, "Lenovo NB0763", ALC883_LENOVO_NB0763), 905 - SND_PCI_QUIRK(0x17aa, 0x3bfd, "Lenovo NB0763", ALC883_LENOVO_NB0763), 906 - SND_PCI_QUIRK(0x17aa, 0x101d, "Lenovo Sky", ALC888_LENOVO_SKY), 907 - SND_PCI_QUIRK(0x17c0, 0x4085, "MEDION MD96630", ALC888_LENOVO_MS7195_DIG), 908 - SND_PCI_QUIRK(0x17f2, 0x5000, "Albatron KI690-AM2", ALC883_6ST_DIG), 909 - SND_PCI_QUIRK(0x1991, 0x5625, "Haier W66", ALC883_HAIER_W66), 910 - 911 - SND_PCI_QUIRK(0x8086, 0x0001, "DG33BUC", ALC883_3ST_6ch_INTEL), 912 - SND_PCI_QUIRK(0x8086, 0x0002, "DG33FBC", ALC883_3ST_6ch_INTEL), 913 - SND_PCI_QUIRK(0x8086, 0x2503, "82801H", ALC883_MITAC), 914 - SND_PCI_QUIRK(0x8086, 0x0022, "DX58SO", ALC889_INTEL), 915 - SND_PCI_QUIRK(0x8086, 0x0021, "Intel IbexPeak", ALC889A_INTEL), 916 - SND_PCI_QUIRK(0x8086, 0x3b56, "Intel IbexPeak", ALC889A_INTEL), 917 - SND_PCI_QUIRK(0x8086, 0xd601, "D102GGC", ALC882_6ST_DIG), 918 - 919 - {} 920 2787 }; 921 2788 922 2789 /* codec SSID table for Intel Mac */ ··· 748 2967 SND_PCI_QUIRK(0x106b, 0x00a0, "MacBookPro 3,1", ALC885_MBP3), 749 2968 SND_PCI_QUIRK(0x106b, 0x00a1, "Macbook", ALC885_MBP3), 750 2969 SND_PCI_QUIRK(0x106b, 0x00a4, "MacbookPro 4,1", ALC885_MBP3), 751 - SND_PCI_QUIRK(0x106b, 0x0c00, "Mac Pro", ALC885_MACPRO), 752 - SND_PCI_QUIRK(0x106b, 0x1000, "iMac 24", ALC885_IMAC24), 753 - SND_PCI_QUIRK(0x106b, 0x2800, "AppleTV", ALC885_IMAC24), 754 2970 SND_PCI_QUIRK(0x106b, 0x2c00, "MacbookPro rev3", ALC885_MBP3), 755 2971 SND_PCI_QUIRK(0x106b, 0x3000, "iMac", ALC889A_MB31), 756 - SND_PCI_QUIRK(0x106b, 0x3200, "iMac 7,1 Aluminum", ALC882_ASUS_A7M), 757 2972 SND_PCI_QUIRK(0x106b, 0x3400, "MacBookAir 1,1", ALC885_MBP3), 758 2973 SND_PCI_QUIRK(0x106b, 0x3500, "MacBookAir 2,1", ALC885_MBA21), 759 2974 SND_PCI_QUIRK(0x106b, 0x3600, "Macbook 3,1", ALC889A_MB31), 760 2975 SND_PCI_QUIRK(0x106b, 0x3800, "MacbookPro 4,1", ALC885_MBP3), 761 - SND_PCI_QUIRK(0x106b, 0x3e00, "iMac 24 Aluminum", ALC885_IMAC24), 762 2976 SND_PCI_QUIRK(0x106b, 0x4900, "iMac 9,1 Aluminum", ALC885_IMAC91), 763 2977 SND_PCI_QUIRK(0x106b, 0x3f00, "Macbook 5,1", ALC885_MB5), 764 2978 SND_PCI_QUIRK(0x106b, 0x4a00, "Macbook 5,2", ALC885_MB5), ··· 767 2991 }; 768 2992 769 2993 static const struct alc_config_preset alc882_presets[] = { 770 - [ALC882_3ST_DIG] = { 771 - .mixers = { alc882_base_mixer }, 772 - .init_verbs = { alc882_base_init_verbs, 773 - alc882_adc1_init_verbs }, 774 - .num_dacs = ARRAY_SIZE(alc882_dac_nids), 775 - .dac_nids = alc882_dac_nids, 776 - .dig_out_nid = ALC882_DIGOUT_NID, 777 - .dig_in_nid = ALC882_DIGIN_NID, 778 - .num_channel_mode = ARRAY_SIZE(alc882_ch_modes), 779 - .channel_mode = alc882_ch_modes, 780 - .need_dac_fix = 1, 781 - .input_mux = &alc882_capture_source, 782 - }, 783 - [ALC882_6ST_DIG] = { 784 - .mixers = { alc882_base_mixer, alc882_chmode_mixer }, 785 - .init_verbs = { alc882_base_init_verbs, 786 - alc882_adc1_init_verbs }, 787 - .num_dacs = ARRAY_SIZE(alc882_dac_nids), 788 - .dac_nids = alc882_dac_nids, 789 - .dig_out_nid = ALC882_DIGOUT_NID, 790 - .dig_in_nid = ALC882_DIGIN_NID, 791 - .num_channel_mode = ARRAY_SIZE(alc882_sixstack_modes), 792 - .channel_mode = alc882_sixstack_modes, 793 - .input_mux = &alc882_capture_source, 794 - }, 795 - [ALC882_ARIMA] = { 796 - .mixers = { alc882_base_mixer, alc882_chmode_mixer }, 797 - .init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs, 798 - alc882_eapd_verbs }, 799 - .num_dacs = ARRAY_SIZE(alc882_dac_nids), 800 - .dac_nids = alc882_dac_nids, 801 - .num_channel_mode = ARRAY_SIZE(alc882_sixstack_modes), 802 - .channel_mode = alc882_sixstack_modes, 803 - .input_mux = &alc882_capture_source, 804 - }, 805 - [ALC882_W2JC] = { 806 - .mixers = { alc882_w2jc_mixer, alc882_chmode_mixer }, 807 - .init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs, 808 - alc882_eapd_verbs, alc880_gpio1_init_verbs }, 809 - .num_dacs = ARRAY_SIZE(alc882_dac_nids), 810 - .dac_nids = alc882_dac_nids, 811 - .num_channel_mode = ARRAY_SIZE(alc880_threestack_modes), 812 - .channel_mode = alc880_threestack_modes, 813 - .need_dac_fix = 1, 814 - .input_mux = &alc882_capture_source, 815 - .dig_out_nid = ALC882_DIGOUT_NID, 816 - }, 817 2994 [ALC885_MBA21] = { 818 2995 .mixers = { alc885_mba21_mixer }, 819 2996 .init_verbs = { alc885_mba21_init_verbs, alc880_gpio1_init_verbs }, ··· 825 3096 .setup = alc885_macmini3_setup, 826 3097 .init_hook = alc_hp_automute, 827 3098 }, 828 - [ALC885_MACPRO] = { 829 - .mixers = { alc882_macpro_mixer }, 830 - .init_verbs = { alc882_macpro_init_verbs }, 831 - .num_dacs = ARRAY_SIZE(alc882_dac_nids), 832 - .dac_nids = alc882_dac_nids, 833 - .dig_out_nid = ALC882_DIGOUT_NID, 834 - .dig_in_nid = ALC882_DIGIN_NID, 835 - .num_channel_mode = ARRAY_SIZE(alc882_ch_modes), 836 - .channel_mode = alc882_ch_modes, 837 - .input_mux = &alc882_capture_source, 838 - .init_hook = alc885_macpro_init_hook, 839 - }, 840 - [ALC885_IMAC24] = { 841 - .mixers = { alc885_imac24_mixer }, 842 - .init_verbs = { alc885_imac24_init_verbs }, 843 - .num_dacs = ARRAY_SIZE(alc882_dac_nids), 844 - .dac_nids = alc882_dac_nids, 845 - .dig_out_nid = ALC882_DIGOUT_NID, 846 - .dig_in_nid = ALC882_DIGIN_NID, 847 - .num_channel_mode = ARRAY_SIZE(alc882_ch_modes), 848 - .channel_mode = alc882_ch_modes, 849 - .input_mux = &alc882_capture_source, 850 - .unsol_event = alc_sku_unsol_event, 851 - .setup = alc885_imac24_setup, 852 - .init_hook = alc885_imac24_init_hook, 853 - }, 854 3099 [ALC885_IMAC91] = { 855 3100 .mixers = {alc885_imac91_mixer}, 856 3101 .init_verbs = { alc885_imac91_init_verbs, ··· 839 3136 .unsol_event = alc_sku_unsol_event, 840 3137 .setup = alc885_imac91_setup, 841 3138 .init_hook = alc_hp_automute, 842 - }, 843 - [ALC882_TARGA] = { 844 - .mixers = { alc882_targa_mixer, alc882_chmode_mixer }, 845 - .init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs, 846 - alc880_gpio3_init_verbs, alc882_targa_verbs}, 847 - .num_dacs = ARRAY_SIZE(alc882_dac_nids), 848 - .dac_nids = alc882_dac_nids, 849 - .dig_out_nid = ALC882_DIGOUT_NID, 850 - .num_adc_nids = ARRAY_SIZE(alc882_adc_nids), 851 - .adc_nids = alc882_adc_nids, 852 - .capsrc_nids = alc882_capsrc_nids, 853 - .num_channel_mode = ARRAY_SIZE(alc882_3ST_6ch_modes), 854 - .channel_mode = alc882_3ST_6ch_modes, 855 - .need_dac_fix = 1, 856 - .input_mux = &alc882_capture_source, 857 - .unsol_event = alc_sku_unsol_event, 858 - .setup = alc882_targa_setup, 859 - .init_hook = alc882_targa_automute, 860 - }, 861 - [ALC882_ASUS_A7J] = { 862 - .mixers = { alc882_asus_a7j_mixer, alc882_chmode_mixer }, 863 - .init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs, 864 - alc882_asus_a7j_verbs}, 865 - .num_dacs = ARRAY_SIZE(alc882_dac_nids), 866 - .dac_nids = alc882_dac_nids, 867 - .dig_out_nid = ALC882_DIGOUT_NID, 868 - .num_adc_nids = ARRAY_SIZE(alc882_adc_nids), 869 - .adc_nids = alc882_adc_nids, 870 - .capsrc_nids = alc882_capsrc_nids, 871 - .num_channel_mode = ARRAY_SIZE(alc882_3ST_6ch_modes), 872 - .channel_mode = alc882_3ST_6ch_modes, 873 - .need_dac_fix = 1, 874 - .input_mux = &alc882_capture_source, 875 - }, 876 - [ALC882_ASUS_A7M] = { 877 - .mixers = { alc882_asus_a7m_mixer, alc882_chmode_mixer }, 878 - .init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs, 879 - alc882_eapd_verbs, alc880_gpio1_init_verbs, 880 - alc882_asus_a7m_verbs }, 881 - .num_dacs = ARRAY_SIZE(alc882_dac_nids), 882 - .dac_nids = alc882_dac_nids, 883 - .dig_out_nid = ALC882_DIGOUT_NID, 884 - .num_channel_mode = ARRAY_SIZE(alc880_threestack_modes), 885 - .channel_mode = alc880_threestack_modes, 886 - .need_dac_fix = 1, 887 - .input_mux = &alc882_capture_source, 888 - }, 889 - [ALC883_3ST_2ch_DIG] = { 890 - .mixers = { alc883_3ST_2ch_mixer }, 891 - .init_verbs = { alc883_init_verbs }, 892 - .num_dacs = ARRAY_SIZE(alc883_dac_nids), 893 - .dac_nids = alc883_dac_nids, 894 - .dig_out_nid = ALC883_DIGOUT_NID, 895 - .dig_in_nid = ALC883_DIGIN_NID, 896 - .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes), 897 - .channel_mode = alc883_3ST_2ch_modes, 898 - .input_mux = &alc883_capture_source, 899 - }, 900 - [ALC883_3ST_6ch_DIG] = { 901 - .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer }, 902 - .init_verbs = { alc883_init_verbs }, 903 - .num_dacs = ARRAY_SIZE(alc883_dac_nids), 904 - .dac_nids = alc883_dac_nids, 905 - .dig_out_nid = ALC883_DIGOUT_NID, 906 - .dig_in_nid = ALC883_DIGIN_NID, 907 - .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes), 908 - .channel_mode = alc883_3ST_6ch_modes, 909 - .need_dac_fix = 1, 910 - .input_mux = &alc883_capture_source, 911 - }, 912 - [ALC883_3ST_6ch] = { 913 - .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer }, 914 - .init_verbs = { alc883_init_verbs }, 915 - .num_dacs = ARRAY_SIZE(alc883_dac_nids), 916 - .dac_nids = alc883_dac_nids, 917 - .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes), 918 - .channel_mode = alc883_3ST_6ch_modes, 919 - .need_dac_fix = 1, 920 - .input_mux = &alc883_capture_source, 921 - }, 922 - [ALC883_3ST_6ch_INTEL] = { 923 - .mixers = { alc883_3ST_6ch_intel_mixer, alc883_chmode_mixer }, 924 - .init_verbs = { alc883_init_verbs }, 925 - .num_dacs = ARRAY_SIZE(alc883_dac_nids), 926 - .dac_nids = alc883_dac_nids, 927 - .dig_out_nid = ALC883_DIGOUT_NID, 928 - .dig_in_nid = ALC883_DIGIN_NID, 929 - .slave_dig_outs = alc883_slave_dig_outs, 930 - .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_intel_modes), 931 - .channel_mode = alc883_3ST_6ch_intel_modes, 932 - .need_dac_fix = 1, 933 - .input_mux = &alc883_3stack_6ch_intel, 934 - }, 935 - [ALC889A_INTEL] = { 936 - .mixers = { alc885_8ch_intel_mixer, alc883_chmode_mixer }, 937 - .init_verbs = { alc885_init_verbs, alc885_init_input_verbs, 938 - alc_hp15_unsol_verbs }, 939 - .num_dacs = ARRAY_SIZE(alc883_dac_nids), 940 - .dac_nids = alc883_dac_nids, 941 - .num_adc_nids = ARRAY_SIZE(alc889_adc_nids), 942 - .adc_nids = alc889_adc_nids, 943 - .dig_out_nid = ALC883_DIGOUT_NID, 944 - .dig_in_nid = ALC883_DIGIN_NID, 945 - .slave_dig_outs = alc883_slave_dig_outs, 946 - .num_channel_mode = ARRAY_SIZE(alc889_8ch_intel_modes), 947 - .channel_mode = alc889_8ch_intel_modes, 948 - .capsrc_nids = alc889_capsrc_nids, 949 - .input_mux = &alc889_capture_source, 950 - .setup = alc889_automute_setup, 951 - .init_hook = alc_hp_automute, 952 - .unsol_event = alc_sku_unsol_event, 953 - .need_dac_fix = 1, 954 - }, 955 - [ALC889_INTEL] = { 956 - .mixers = { alc885_8ch_intel_mixer, alc883_chmode_mixer }, 957 - .init_verbs = { alc885_init_verbs, alc889_init_input_verbs, 958 - alc889_eapd_verbs, alc_hp15_unsol_verbs}, 959 - .num_dacs = ARRAY_SIZE(alc883_dac_nids), 960 - .dac_nids = alc883_dac_nids, 961 - .num_adc_nids = ARRAY_SIZE(alc889_adc_nids), 962 - .adc_nids = alc889_adc_nids, 963 - .dig_out_nid = ALC883_DIGOUT_NID, 964 - .dig_in_nid = ALC883_DIGIN_NID, 965 - .slave_dig_outs = alc883_slave_dig_outs, 966 - .num_channel_mode = ARRAY_SIZE(alc889_8ch_intel_modes), 967 - .channel_mode = alc889_8ch_intel_modes, 968 - .capsrc_nids = alc889_capsrc_nids, 969 - .input_mux = &alc889_capture_source, 970 - .setup = alc889_automute_setup, 971 - .init_hook = alc889_intel_init_hook, 972 - .unsol_event = alc_sku_unsol_event, 973 - .need_dac_fix = 1, 974 - }, 975 - [ALC883_6ST_DIG] = { 976 - .mixers = { alc883_base_mixer, alc883_chmode_mixer }, 977 - .init_verbs = { alc883_init_verbs }, 978 - .num_dacs = ARRAY_SIZE(alc883_dac_nids), 979 - .dac_nids = alc883_dac_nids, 980 - .dig_out_nid = ALC883_DIGOUT_NID, 981 - .dig_in_nid = ALC883_DIGIN_NID, 982 - .num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes), 983 - .channel_mode = alc883_sixstack_modes, 984 - .input_mux = &alc883_capture_source, 985 - }, 986 - [ALC883_TARGA_DIG] = { 987 - .mixers = { alc883_targa_mixer, alc883_chmode_mixer }, 988 - .init_verbs = { alc883_init_verbs, alc880_gpio3_init_verbs, 989 - alc883_targa_verbs}, 990 - .num_dacs = ARRAY_SIZE(alc883_dac_nids), 991 - .dac_nids = alc883_dac_nids, 992 - .dig_out_nid = ALC883_DIGOUT_NID, 993 - .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes), 994 - .channel_mode = alc883_3ST_6ch_modes, 995 - .need_dac_fix = 1, 996 - .input_mux = &alc883_capture_source, 997 - .unsol_event = alc883_targa_unsol_event, 998 - .setup = alc882_targa_setup, 999 - .init_hook = alc882_targa_automute, 1000 - }, 1001 - [ALC883_TARGA_2ch_DIG] = { 1002 - .mixers = { alc883_targa_2ch_mixer}, 1003 - .init_verbs = { alc883_init_verbs, alc880_gpio3_init_verbs, 1004 - alc883_targa_verbs}, 1005 - .num_dacs = ARRAY_SIZE(alc883_dac_nids), 1006 - .dac_nids = alc883_dac_nids, 1007 - .adc_nids = alc883_adc_nids_alt, 1008 - .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_alt), 1009 - .capsrc_nids = alc883_capsrc_nids, 1010 - .dig_out_nid = ALC883_DIGOUT_NID, 1011 - .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes), 1012 - .channel_mode = alc883_3ST_2ch_modes, 1013 - .input_mux = &alc883_capture_source, 1014 - .unsol_event = alc883_targa_unsol_event, 1015 - .setup = alc882_targa_setup, 1016 - .init_hook = alc882_targa_automute, 1017 - }, 1018 - [ALC883_TARGA_8ch_DIG] = { 1019 - .mixers = { alc883_targa_mixer, alc883_targa_8ch_mixer, 1020 - alc883_chmode_mixer }, 1021 - .init_verbs = { alc883_init_verbs, alc880_gpio3_init_verbs, 1022 - alc883_targa_verbs }, 1023 - .num_dacs = ARRAY_SIZE(alc883_dac_nids), 1024 - .dac_nids = alc883_dac_nids, 1025 - .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev), 1026 - .adc_nids = alc883_adc_nids_rev, 1027 - .capsrc_nids = alc883_capsrc_nids_rev, 1028 - .dig_out_nid = ALC883_DIGOUT_NID, 1029 - .dig_in_nid = ALC883_DIGIN_NID, 1030 - .num_channel_mode = ARRAY_SIZE(alc883_4ST_8ch_modes), 1031 - .channel_mode = alc883_4ST_8ch_modes, 1032 - .need_dac_fix = 1, 1033 - .input_mux = &alc883_capture_source, 1034 - .unsol_event = alc883_targa_unsol_event, 1035 - .setup = alc882_targa_setup, 1036 - .init_hook = alc882_targa_automute, 1037 - }, 1038 - [ALC883_ACER] = { 1039 - .mixers = { alc883_base_mixer }, 1040 - /* On TravelMate laptops, GPIO 0 enables the internal speaker 1041 - * and the headphone jack. Turn this on and rely on the 1042 - * standard mute methods whenever the user wants to turn 1043 - * these outputs off. 1044 - */ 1045 - .init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs }, 1046 - .num_dacs = ARRAY_SIZE(alc883_dac_nids), 1047 - .dac_nids = alc883_dac_nids, 1048 - .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes), 1049 - .channel_mode = alc883_3ST_2ch_modes, 1050 - .input_mux = &alc883_capture_source, 1051 - }, 1052 - [ALC883_ACER_ASPIRE] = { 1053 - .mixers = { alc883_acer_aspire_mixer }, 1054 - .init_verbs = { alc883_init_verbs, alc883_acer_eapd_verbs }, 1055 - .num_dacs = ARRAY_SIZE(alc883_dac_nids), 1056 - .dac_nids = alc883_dac_nids, 1057 - .dig_out_nid = ALC883_DIGOUT_NID, 1058 - .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes), 1059 - .channel_mode = alc883_3ST_2ch_modes, 1060 - .input_mux = &alc883_capture_source, 1061 - .unsol_event = alc_sku_unsol_event, 1062 - .setup = alc883_acer_aspire_setup, 1063 - .init_hook = alc_hp_automute, 1064 - }, 1065 - [ALC888_ACER_ASPIRE_4930G] = { 1066 - .mixers = { alc888_acer_aspire_4930g_mixer, 1067 - alc883_chmode_mixer }, 1068 - .init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs, 1069 - alc888_acer_aspire_4930g_verbs }, 1070 - .num_dacs = ARRAY_SIZE(alc883_dac_nids), 1071 - .dac_nids = alc883_dac_nids, 1072 - .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev), 1073 - .adc_nids = alc883_adc_nids_rev, 1074 - .capsrc_nids = alc883_capsrc_nids_rev, 1075 - .dig_out_nid = ALC883_DIGOUT_NID, 1076 - .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes), 1077 - .channel_mode = alc883_3ST_6ch_modes, 1078 - .need_dac_fix = 1, 1079 - .const_channel_count = 6, 1080 - .num_mux_defs = 1081 - ARRAY_SIZE(alc888_2_capture_sources), 1082 - .input_mux = alc888_2_capture_sources, 1083 - .unsol_event = alc_sku_unsol_event, 1084 - .setup = alc888_acer_aspire_4930g_setup, 1085 - .init_hook = alc_hp_automute, 1086 - }, 1087 - [ALC888_ACER_ASPIRE_6530G] = { 1088 - .mixers = { alc888_acer_aspire_6530_mixer }, 1089 - .init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs, 1090 - alc888_acer_aspire_6530g_verbs }, 1091 - .num_dacs = ARRAY_SIZE(alc883_dac_nids), 1092 - .dac_nids = alc883_dac_nids, 1093 - .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev), 1094 - .adc_nids = alc883_adc_nids_rev, 1095 - .capsrc_nids = alc883_capsrc_nids_rev, 1096 - .dig_out_nid = ALC883_DIGOUT_NID, 1097 - .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes), 1098 - .channel_mode = alc883_3ST_2ch_modes, 1099 - .num_mux_defs = 1100 - ARRAY_SIZE(alc888_2_capture_sources), 1101 - .input_mux = alc888_acer_aspire_6530_sources, 1102 - .unsol_event = alc_sku_unsol_event, 1103 - .setup = alc888_acer_aspire_6530g_setup, 1104 - .init_hook = alc_hp_automute, 1105 - }, 1106 - [ALC888_ACER_ASPIRE_8930G] = { 1107 - .mixers = { alc889_acer_aspire_8930g_mixer, 1108 - alc883_chmode_mixer }, 1109 - .init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs, 1110 - alc889_acer_aspire_8930g_verbs, 1111 - alc889_eapd_verbs}, 1112 - .num_dacs = ARRAY_SIZE(alc883_dac_nids), 1113 - .dac_nids = alc883_dac_nids, 1114 - .num_adc_nids = ARRAY_SIZE(alc889_adc_nids), 1115 - .adc_nids = alc889_adc_nids, 1116 - .capsrc_nids = alc889_capsrc_nids, 1117 - .dig_out_nid = ALC883_DIGOUT_NID, 1118 - .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes), 1119 - .channel_mode = alc883_3ST_6ch_modes, 1120 - .need_dac_fix = 1, 1121 - .const_channel_count = 6, 1122 - .num_mux_defs = 1123 - ARRAY_SIZE(alc889_capture_sources), 1124 - .input_mux = alc889_capture_sources, 1125 - .unsol_event = alc_sku_unsol_event, 1126 - .setup = alc889_acer_aspire_8930g_setup, 1127 - .init_hook = alc_hp_automute, 1128 - #ifdef CONFIG_SND_HDA_POWER_SAVE 1129 - .power_hook = alc_power_eapd, 1130 - #endif 1131 - }, 1132 - [ALC888_ACER_ASPIRE_7730G] = { 1133 - .mixers = { alc883_3ST_6ch_mixer, 1134 - alc883_chmode_mixer }, 1135 - .init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs, 1136 - alc888_acer_aspire_7730G_verbs }, 1137 - .num_dacs = ARRAY_SIZE(alc883_dac_nids), 1138 - .dac_nids = alc883_dac_nids, 1139 - .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev), 1140 - .adc_nids = alc883_adc_nids_rev, 1141 - .capsrc_nids = alc883_capsrc_nids_rev, 1142 - .dig_out_nid = ALC883_DIGOUT_NID, 1143 - .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes), 1144 - .channel_mode = alc883_3ST_6ch_modes, 1145 - .need_dac_fix = 1, 1146 - .const_channel_count = 6, 1147 - .input_mux = &alc883_capture_source, 1148 - .unsol_event = alc_sku_unsol_event, 1149 - .setup = alc888_acer_aspire_7730g_setup, 1150 - .init_hook = alc_hp_automute, 1151 - }, 1152 - [ALC883_MEDION] = { 1153 - .mixers = { alc883_fivestack_mixer, 1154 - alc883_chmode_mixer }, 1155 - .init_verbs = { alc883_init_verbs, 1156 - alc883_medion_eapd_verbs }, 1157 - .num_dacs = ARRAY_SIZE(alc883_dac_nids), 1158 - .dac_nids = alc883_dac_nids, 1159 - .adc_nids = alc883_adc_nids_alt, 1160 - .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_alt), 1161 - .capsrc_nids = alc883_capsrc_nids, 1162 - .num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes), 1163 - .channel_mode = alc883_sixstack_modes, 1164 - .input_mux = &alc883_capture_source, 1165 - }, 1166 - [ALC883_MEDION_WIM2160] = { 1167 - .mixers = { alc883_medion_wim2160_mixer }, 1168 - .init_verbs = { alc883_init_verbs, alc883_medion_wim2160_verbs }, 1169 - .num_dacs = ARRAY_SIZE(alc883_dac_nids), 1170 - .dac_nids = alc883_dac_nids, 1171 - .dig_out_nid = ALC883_DIGOUT_NID, 1172 - .num_adc_nids = ARRAY_SIZE(alc883_adc_nids), 1173 - .adc_nids = alc883_adc_nids, 1174 - .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes), 1175 - .channel_mode = alc883_3ST_2ch_modes, 1176 - .input_mux = &alc883_capture_source, 1177 - .unsol_event = alc_sku_unsol_event, 1178 - .setup = alc883_medion_wim2160_setup, 1179 - .init_hook = alc_hp_automute, 1180 - }, 1181 - [ALC883_LAPTOP_EAPD] = { 1182 - .mixers = { alc883_base_mixer }, 1183 - .init_verbs = { alc883_init_verbs, alc882_eapd_verbs }, 1184 - .num_dacs = ARRAY_SIZE(alc883_dac_nids), 1185 - .dac_nids = alc883_dac_nids, 1186 - .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes), 1187 - .channel_mode = alc883_3ST_2ch_modes, 1188 - .input_mux = &alc883_capture_source, 1189 - }, 1190 - [ALC883_CLEVO_M540R] = { 1191 - .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer }, 1192 - .init_verbs = { alc883_init_verbs, alc883_clevo_m540r_verbs }, 1193 - .num_dacs = ARRAY_SIZE(alc883_dac_nids), 1194 - .dac_nids = alc883_dac_nids, 1195 - .dig_out_nid = ALC883_DIGOUT_NID, 1196 - .dig_in_nid = ALC883_DIGIN_NID, 1197 - .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_clevo_modes), 1198 - .channel_mode = alc883_3ST_6ch_clevo_modes, 1199 - .need_dac_fix = 1, 1200 - .input_mux = &alc883_capture_source, 1201 - /* This machine has the hardware HP auto-muting, thus 1202 - * we need no software mute via unsol event 1203 - */ 1204 - }, 1205 - [ALC883_CLEVO_M720] = { 1206 - .mixers = { alc883_clevo_m720_mixer }, 1207 - .init_verbs = { alc883_init_verbs, alc883_clevo_m720_verbs }, 1208 - .num_dacs = ARRAY_SIZE(alc883_dac_nids), 1209 - .dac_nids = alc883_dac_nids, 1210 - .dig_out_nid = ALC883_DIGOUT_NID, 1211 - .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes), 1212 - .channel_mode = alc883_3ST_2ch_modes, 1213 - .input_mux = &alc883_capture_source, 1214 - .unsol_event = alc883_clevo_m720_unsol_event, 1215 - .setup = alc883_clevo_m720_setup, 1216 - .init_hook = alc883_clevo_m720_init_hook, 1217 - }, 1218 - [ALC883_LENOVO_101E_2ch] = { 1219 - .mixers = { alc883_lenovo_101e_2ch_mixer}, 1220 - .init_verbs = { alc883_init_verbs, alc883_lenovo_101e_verbs}, 1221 - .num_dacs = ARRAY_SIZE(alc883_dac_nids), 1222 - .dac_nids = alc883_dac_nids, 1223 - .adc_nids = alc883_adc_nids_alt, 1224 - .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_alt), 1225 - .capsrc_nids = alc883_capsrc_nids, 1226 - .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes), 1227 - .channel_mode = alc883_3ST_2ch_modes, 1228 - .input_mux = &alc883_lenovo_101e_capture_source, 1229 - .setup = alc883_lenovo_101e_setup, 1230 - .unsol_event = alc_sku_unsol_event, 1231 - .init_hook = alc_inithook, 1232 - }, 1233 - [ALC883_LENOVO_NB0763] = { 1234 - .mixers = { alc883_lenovo_nb0763_mixer }, 1235 - .init_verbs = { alc883_init_verbs, alc883_lenovo_nb0763_verbs}, 1236 - .num_dacs = ARRAY_SIZE(alc883_dac_nids), 1237 - .dac_nids = alc883_dac_nids, 1238 - .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes), 1239 - .channel_mode = alc883_3ST_2ch_modes, 1240 - .need_dac_fix = 1, 1241 - .input_mux = &alc883_lenovo_nb0763_capture_source, 1242 - .unsol_event = alc_sku_unsol_event, 1243 - .setup = alc883_lenovo_nb0763_setup, 1244 - .init_hook = alc_hp_automute, 1245 - }, 1246 - [ALC888_LENOVO_MS7195_DIG] = { 1247 - .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer }, 1248 - .init_verbs = { alc883_init_verbs, alc888_lenovo_ms7195_verbs}, 1249 - .num_dacs = ARRAY_SIZE(alc883_dac_nids), 1250 - .dac_nids = alc883_dac_nids, 1251 - .dig_out_nid = ALC883_DIGOUT_NID, 1252 - .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes), 1253 - .channel_mode = alc883_3ST_6ch_modes, 1254 - .need_dac_fix = 1, 1255 - .input_mux = &alc883_capture_source, 1256 - .unsol_event = alc_sku_unsol_event, 1257 - .setup = alc888_lenovo_ms7195_setup, 1258 - .init_hook = alc_inithook, 1259 - }, 1260 - [ALC883_HAIER_W66] = { 1261 - .mixers = { alc883_targa_2ch_mixer}, 1262 - .init_verbs = { alc883_init_verbs, alc883_haier_w66_verbs}, 1263 - .num_dacs = ARRAY_SIZE(alc883_dac_nids), 1264 - .dac_nids = alc883_dac_nids, 1265 - .dig_out_nid = ALC883_DIGOUT_NID, 1266 - .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes), 1267 - .channel_mode = alc883_3ST_2ch_modes, 1268 - .input_mux = &alc883_capture_source, 1269 - .unsol_event = alc_sku_unsol_event, 1270 - .setup = alc883_haier_w66_setup, 1271 - .init_hook = alc_hp_automute, 1272 - }, 1273 - [ALC888_3ST_HP] = { 1274 - .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer }, 1275 - .init_verbs = { alc883_init_verbs, alc888_3st_hp_verbs }, 1276 - .num_dacs = ARRAY_SIZE(alc883_dac_nids), 1277 - .dac_nids = alc883_dac_nids, 1278 - .num_channel_mode = ARRAY_SIZE(alc888_3st_hp_modes), 1279 - .channel_mode = alc888_3st_hp_modes, 1280 - .need_dac_fix = 1, 1281 - .input_mux = &alc883_capture_source, 1282 - .unsol_event = alc_sku_unsol_event, 1283 - .setup = alc888_3st_hp_setup, 1284 - .init_hook = alc_hp_automute, 1285 - }, 1286 - [ALC888_6ST_DELL] = { 1287 - .mixers = { alc883_base_mixer, alc883_chmode_mixer }, 1288 - .init_verbs = { alc883_init_verbs, alc888_6st_dell_verbs }, 1289 - .num_dacs = ARRAY_SIZE(alc883_dac_nids), 1290 - .dac_nids = alc883_dac_nids, 1291 - .dig_out_nid = ALC883_DIGOUT_NID, 1292 - .dig_in_nid = ALC883_DIGIN_NID, 1293 - .num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes), 1294 - .channel_mode = alc883_sixstack_modes, 1295 - .input_mux = &alc883_capture_source, 1296 - .unsol_event = alc_sku_unsol_event, 1297 - .setup = alc888_6st_dell_setup, 1298 - .init_hook = alc_hp_automute, 1299 - }, 1300 - [ALC883_MITAC] = { 1301 - .mixers = { alc883_mitac_mixer }, 1302 - .init_verbs = { alc883_init_verbs, alc883_mitac_verbs }, 1303 - .num_dacs = ARRAY_SIZE(alc883_dac_nids), 1304 - .dac_nids = alc883_dac_nids, 1305 - .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes), 1306 - .channel_mode = alc883_3ST_2ch_modes, 1307 - .input_mux = &alc883_capture_source, 1308 - .unsol_event = alc_sku_unsol_event, 1309 - .setup = alc883_mitac_setup, 1310 - .init_hook = alc_hp_automute, 1311 - }, 1312 - [ALC883_FUJITSU_PI2515] = { 1313 - .mixers = { alc883_2ch_fujitsu_pi2515_mixer }, 1314 - .init_verbs = { alc883_init_verbs, 1315 - alc883_2ch_fujitsu_pi2515_verbs}, 1316 - .num_dacs = ARRAY_SIZE(alc883_dac_nids), 1317 - .dac_nids = alc883_dac_nids, 1318 - .dig_out_nid = ALC883_DIGOUT_NID, 1319 - .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes), 1320 - .channel_mode = alc883_3ST_2ch_modes, 1321 - .input_mux = &alc883_fujitsu_pi2515_capture_source, 1322 - .unsol_event = alc_sku_unsol_event, 1323 - .setup = alc883_2ch_fujitsu_pi2515_setup, 1324 - .init_hook = alc_hp_automute, 1325 - }, 1326 - [ALC888_FUJITSU_XA3530] = { 1327 - .mixers = { alc888_base_mixer, alc883_chmode_mixer }, 1328 - .init_verbs = { alc883_init_verbs, 1329 - alc888_fujitsu_xa3530_verbs }, 1330 - .num_dacs = ARRAY_SIZE(alc883_dac_nids), 1331 - .dac_nids = alc883_dac_nids, 1332 - .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev), 1333 - .adc_nids = alc883_adc_nids_rev, 1334 - .capsrc_nids = alc883_capsrc_nids_rev, 1335 - .dig_out_nid = ALC883_DIGOUT_NID, 1336 - .num_channel_mode = ARRAY_SIZE(alc888_4ST_8ch_intel_modes), 1337 - .channel_mode = alc888_4ST_8ch_intel_modes, 1338 - .num_mux_defs = 1339 - ARRAY_SIZE(alc888_2_capture_sources), 1340 - .input_mux = alc888_2_capture_sources, 1341 - .unsol_event = alc_sku_unsol_event, 1342 - .setup = alc888_fujitsu_xa3530_setup, 1343 - .init_hook = alc_hp_automute, 1344 - }, 1345 - [ALC888_LENOVO_SKY] = { 1346 - .mixers = { alc888_lenovo_sky_mixer, alc883_chmode_mixer }, 1347 - .init_verbs = { alc883_init_verbs, alc888_lenovo_sky_verbs}, 1348 - .num_dacs = ARRAY_SIZE(alc883_dac_nids), 1349 - .dac_nids = alc883_dac_nids, 1350 - .dig_out_nid = ALC883_DIGOUT_NID, 1351 - .num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes), 1352 - .channel_mode = alc883_sixstack_modes, 1353 - .need_dac_fix = 1, 1354 - .input_mux = &alc883_lenovo_sky_capture_source, 1355 - .unsol_event = alc_sku_unsol_event, 1356 - .setup = alc888_lenovo_sky_setup, 1357 - .init_hook = alc_hp_automute, 1358 - }, 1359 - [ALC888_ASUS_M90V] = { 1360 - .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer }, 1361 - .init_verbs = { alc883_init_verbs, alc888_asus_m90v_verbs }, 1362 - .num_dacs = ARRAY_SIZE(alc883_dac_nids), 1363 - .dac_nids = alc883_dac_nids, 1364 - .dig_out_nid = ALC883_DIGOUT_NID, 1365 - .dig_in_nid = ALC883_DIGIN_NID, 1366 - .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes), 1367 - .channel_mode = alc883_3ST_6ch_modes, 1368 - .need_dac_fix = 1, 1369 - .input_mux = &alc883_fujitsu_pi2515_capture_source, 1370 - .unsol_event = alc_sku_unsol_event, 1371 - .setup = alc883_mode2_setup, 1372 - .init_hook = alc_inithook, 1373 - }, 1374 - [ALC888_ASUS_EEE1601] = { 1375 - .mixers = { alc883_asus_eee1601_mixer }, 1376 - .cap_mixer = alc883_asus_eee1601_cap_mixer, 1377 - .init_verbs = { alc883_init_verbs, alc888_asus_eee1601_verbs }, 1378 - .num_dacs = ARRAY_SIZE(alc883_dac_nids), 1379 - .dac_nids = alc883_dac_nids, 1380 - .dig_out_nid = ALC883_DIGOUT_NID, 1381 - .dig_in_nid = ALC883_DIGIN_NID, 1382 - .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes), 1383 - .channel_mode = alc883_3ST_2ch_modes, 1384 - .need_dac_fix = 1, 1385 - .input_mux = &alc883_asus_eee1601_capture_source, 1386 - .unsol_event = alc_sku_unsol_event, 1387 - .init_hook = alc883_eee1601_inithook, 1388 - }, 1389 - [ALC1200_ASUS_P5Q] = { 1390 - .mixers = { alc883_base_mixer, alc883_chmode_mixer }, 1391 - .init_verbs = { alc883_init_verbs }, 1392 - .num_dacs = ARRAY_SIZE(alc883_dac_nids), 1393 - .dac_nids = alc883_dac_nids, 1394 - .dig_out_nid = ALC1200_DIGOUT_NID, 1395 - .dig_in_nid = ALC883_DIGIN_NID, 1396 - .slave_dig_outs = alc1200_slave_dig_outs, 1397 - .num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes), 1398 - .channel_mode = alc883_sixstack_modes, 1399 - .input_mux = &alc883_capture_source, 1400 3139 }, 1401 3140 [ALC889A_MB31] = { 1402 3141 .mixers = { alc889A_mb31_mixer, alc883_chmode_mixer}, ··· 855 3710 .dig_out_nid = ALC883_DIGOUT_NID, 856 3711 .unsol_event = alc889A_mb31_unsol_event, 857 3712 .init_hook = alc889A_mb31_automute, 858 - }, 859 - [ALC883_SONY_VAIO_TT] = { 860 - .mixers = { alc883_vaiott_mixer }, 861 - .init_verbs = { alc883_init_verbs, alc883_vaiott_verbs }, 862 - .num_dacs = ARRAY_SIZE(alc883_dac_nids), 863 - .dac_nids = alc883_dac_nids, 864 - .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes), 865 - .channel_mode = alc883_3ST_2ch_modes, 866 - .input_mux = &alc883_capture_source, 867 - .unsol_event = alc_sku_unsol_event, 868 - .setup = alc883_vaiott_setup, 869 - .init_hook = alc_hp_automute, 870 3713 }, 871 3714 }; 872 3715
+154 -148
sound/pci/hda/hda_codec.c
··· 33 33 #include <sound/jack.h> 34 34 #include "hda_local.h" 35 35 #include "hda_beep.h" 36 + #include "hda_jack.h" 36 37 #include <sound/hda_hwdep.h> 37 38 38 39 #define CREATE_TRACE_POINTS ··· 1724 1723 } 1725 1724 EXPORT_SYMBOL_HDA(snd_hda_override_pin_caps); 1726 1725 1727 - /** 1728 - * snd_hda_pin_sense - execute pin sense measurement 1729 - * @codec: the CODEC to sense 1730 - * @nid: the pin NID to sense 1731 - * 1732 - * Execute necessary pin sense measurement and return its Presence Detect, 1733 - * Impedance, ELD Valid etc. status bits. 1734 - */ 1735 - u32 snd_hda_pin_sense(struct hda_codec *codec, hda_nid_t nid) 1736 - { 1737 - u32 pincap; 1738 - 1739 - if (!codec->no_trigger_sense) { 1740 - pincap = snd_hda_query_pin_caps(codec, nid); 1741 - if (pincap & AC_PINCAP_TRIG_REQ) /* need trigger? */ 1742 - snd_hda_codec_read(codec, nid, 0, 1743 - AC_VERB_SET_PIN_SENSE, 0); 1744 - } 1745 - return snd_hda_codec_read(codec, nid, 0, 1746 - AC_VERB_GET_PIN_SENSE, 0); 1747 - } 1748 - EXPORT_SYMBOL_HDA(snd_hda_pin_sense); 1749 - 1750 - /** 1751 - * snd_hda_jack_detect - query pin Presence Detect status 1752 - * @codec: the CODEC to sense 1753 - * @nid: the pin NID to sense 1754 - * 1755 - * Query and return the pin's Presence Detect status. 1756 - */ 1757 - int snd_hda_jack_detect(struct hda_codec *codec, hda_nid_t nid) 1758 - { 1759 - u32 sense = snd_hda_pin_sense(codec, nid); 1760 - return !!(sense & AC_PINSENSE_PRESENCE); 1761 - } 1762 - EXPORT_SYMBOL_HDA(snd_hda_jack_detect); 1763 - 1764 1726 /* 1765 1727 * read the current volume to info 1766 1728 * if the cache exists, read the cache value. ··· 2272 2308 } 2273 2309 if (codec->patch_ops.free) 2274 2310 codec->patch_ops.free(codec); 2311 + snd_hda_jack_tbl_clear(codec); 2275 2312 codec->proc_widget_hook = NULL; 2276 2313 codec->spec = NULL; 2277 2314 free_hda_cache(&codec->amp_cache); ··· 3329 3364 restore_pincfgs(codec); /* restore all current pin configs */ 3330 3365 restore_shutup_pins(codec); 3331 3366 hda_exec_init_verbs(codec); 3367 + snd_hda_jack_set_dirty_all(codec); 3332 3368 if (codec->patch_ops.resume) 3333 3369 codec->patch_ops.resume(codec); 3334 3370 else { ··· 3815 3849 for (i = 0; audio_idx[type][i] >= 0 ; i++) 3816 3850 if (!test_and_set_bit(audio_idx[type][i], bus->pcm_dev_bits)) 3817 3851 return audio_idx[type][i]; 3852 + 3853 + /* non-fixed slots starting from 10 */ 3854 + for (i = 10; i < 32; i++) { 3855 + if (!test_and_set_bit(i, bus->pcm_dev_bits)) 3856 + return i; 3857 + } 3818 3858 3819 3859 snd_printk(KERN_WARNING "Too many %s devices\n", 3820 3860 snd_hda_pcm_type_name[type]); ··· 4976 5004 * "Rear", "Internal". 4977 5005 */ 4978 5006 4979 - const char *hda_get_input_pin_label(struct hda_codec *codec, hda_nid_t pin, 4980 - int check_location) 5007 + static const char *hda_get_input_pin_label(struct hda_codec *codec, 5008 + hda_nid_t pin, bool check_location) 4981 5009 { 4982 5010 unsigned int def_conf; 4983 5011 static const char * const mic_names[] = { ··· 5016 5044 return "Misc"; 5017 5045 } 5018 5046 } 5019 - EXPORT_SYMBOL_HDA(hda_get_input_pin_label); 5020 5047 5021 5048 /* Check whether the location prefix needs to be added to the label. 5022 5049 * If all mic-jacks are in the same location (e.g. rear panel), we don't ··· 5071 5100 has_multiple_pins); 5072 5101 } 5073 5102 EXPORT_SYMBOL_HDA(hda_get_autocfg_input_label); 5103 + 5104 + /* return the position of NID in the list, or -1 if not found */ 5105 + static int find_idx_in_nid_list(hda_nid_t nid, const hda_nid_t *list, int nums) 5106 + { 5107 + int i; 5108 + for (i = 0; i < nums; i++) 5109 + if (list[i] == nid) 5110 + return i; 5111 + return -1; 5112 + } 5113 + 5114 + /* get a unique suffix or an index number */ 5115 + static const char *check_output_sfx(hda_nid_t nid, const hda_nid_t *pins, 5116 + int num_pins, int *indexp) 5117 + { 5118 + static const char * const channel_sfx[] = { 5119 + " Front", " Surround", " CLFE", " Side" 5120 + }; 5121 + int i; 5122 + 5123 + i = find_idx_in_nid_list(nid, pins, num_pins); 5124 + if (i < 0) 5125 + return NULL; 5126 + if (num_pins == 1) 5127 + return ""; 5128 + if (num_pins > ARRAY_SIZE(channel_sfx)) { 5129 + if (indexp) 5130 + *indexp = i; 5131 + return ""; 5132 + } 5133 + return channel_sfx[i]; 5134 + } 5135 + 5136 + static int fill_audio_out_name(struct hda_codec *codec, hda_nid_t nid, 5137 + const struct auto_pin_cfg *cfg, 5138 + const char *name, char *label, int maxlen, 5139 + int *indexp) 5140 + { 5141 + unsigned int def_conf = snd_hda_codec_get_pincfg(codec, nid); 5142 + int attr = snd_hda_get_input_pin_attr(def_conf); 5143 + const char *pfx = "", *sfx = ""; 5144 + 5145 + /* handle as a speaker if it's a fixed line-out */ 5146 + if (!strcmp(name, "Line-Out") && attr == INPUT_PIN_ATTR_INT) 5147 + name = "Speaker"; 5148 + /* check the location */ 5149 + switch (attr) { 5150 + case INPUT_PIN_ATTR_DOCK: 5151 + pfx = "Dock "; 5152 + break; 5153 + case INPUT_PIN_ATTR_FRONT: 5154 + pfx = "Front "; 5155 + break; 5156 + } 5157 + if (cfg) { 5158 + /* try to give a unique suffix if needed */ 5159 + sfx = check_output_sfx(nid, cfg->line_out_pins, cfg->line_outs, 5160 + indexp); 5161 + if (!sfx) 5162 + sfx = check_output_sfx(nid, cfg->speaker_pins, cfg->speaker_outs, 5163 + indexp); 5164 + if (!sfx) { 5165 + /* don't add channel suffix for Headphone controls */ 5166 + int idx = find_idx_in_nid_list(nid, cfg->hp_pins, 5167 + cfg->hp_outs); 5168 + if (idx >= 0) 5169 + *indexp = idx; 5170 + sfx = ""; 5171 + } 5172 + } 5173 + snprintf(label, maxlen, "%s%s%s", pfx, name, sfx); 5174 + return 1; 5175 + } 5176 + 5177 + /** 5178 + * snd_hda_get_pin_label - Get a label for the given I/O pin 5179 + * 5180 + * Get a label for the given pin. This function works for both input and 5181 + * output pins. When @cfg is given as non-NULL, the function tries to get 5182 + * an optimized label using hda_get_autocfg_input_label(). 5183 + * 5184 + * This function tries to give a unique label string for the pin as much as 5185 + * possible. For example, when the multiple line-outs are present, it adds 5186 + * the channel suffix like "Front", "Surround", etc (only when @cfg is given). 5187 + * If no unique name with a suffix is available and @indexp is non-NULL, the 5188 + * index number is stored in the pointer. 5189 + */ 5190 + int snd_hda_get_pin_label(struct hda_codec *codec, hda_nid_t nid, 5191 + const struct auto_pin_cfg *cfg, 5192 + char *label, int maxlen, int *indexp) 5193 + { 5194 + unsigned int def_conf = snd_hda_codec_get_pincfg(codec, nid); 5195 + const char *name = NULL; 5196 + int i; 5197 + 5198 + if (indexp) 5199 + *indexp = 0; 5200 + if (get_defcfg_connect(def_conf) == AC_JACK_PORT_NONE) 5201 + return 0; 5202 + 5203 + switch (get_defcfg_device(def_conf)) { 5204 + case AC_JACK_LINE_OUT: 5205 + return fill_audio_out_name(codec, nid, cfg, "Line-Out", 5206 + label, maxlen, indexp); 5207 + case AC_JACK_SPEAKER: 5208 + return fill_audio_out_name(codec, nid, cfg, "Speaker", 5209 + label, maxlen, indexp); 5210 + case AC_JACK_HP_OUT: 5211 + return fill_audio_out_name(codec, nid, cfg, "Headphone", 5212 + label, maxlen, indexp); 5213 + case AC_JACK_SPDIF_OUT: 5214 + case AC_JACK_DIG_OTHER_OUT: 5215 + if (get_defcfg_location(def_conf) == AC_JACK_LOC_HDMI) 5216 + name = "HDMI"; 5217 + else 5218 + name = "SPDIF"; 5219 + if (cfg && indexp) { 5220 + i = find_idx_in_nid_list(nid, cfg->dig_out_pins, 5221 + cfg->dig_outs); 5222 + if (i >= 0) 5223 + *indexp = i; 5224 + } 5225 + break; 5226 + default: 5227 + if (cfg) { 5228 + for (i = 0; i < cfg->num_inputs; i++) { 5229 + if (cfg->inputs[i].pin != nid) 5230 + continue; 5231 + name = hda_get_autocfg_input_label(codec, cfg, i); 5232 + if (name) 5233 + break; 5234 + } 5235 + } 5236 + if (!name) 5237 + name = hda_get_input_pin_label(codec, nid, true); 5238 + break; 5239 + } 5240 + if (!name) 5241 + return 0; 5242 + strlcpy(label, name, maxlen); 5243 + return 1; 5244 + } 5245 + EXPORT_SYMBOL_HDA(snd_hda_get_pin_label); 5074 5246 5075 5247 /** 5076 5248 * snd_hda_add_imux_item - Add an item to input_mux ··· 5365 5251 buf[j] = '\0'; /* necessary when j == 0 */ 5366 5252 } 5367 5253 EXPORT_SYMBOL_HDA(snd_print_pcm_bits); 5368 - 5369 - #ifdef CONFIG_SND_HDA_INPUT_JACK 5370 - /* 5371 - * Input-jack notification support 5372 - */ 5373 - struct hda_jack_item { 5374 - hda_nid_t nid; 5375 - int type; 5376 - struct snd_jack *jack; 5377 - }; 5378 - 5379 - static const char *get_jack_default_name(struct hda_codec *codec, hda_nid_t nid, 5380 - int type) 5381 - { 5382 - switch (type) { 5383 - case SND_JACK_HEADPHONE: 5384 - return "Headphone"; 5385 - case SND_JACK_MICROPHONE: 5386 - return "Mic"; 5387 - case SND_JACK_LINEOUT: 5388 - return "Line-out"; 5389 - case SND_JACK_LINEIN: 5390 - return "Line-in"; 5391 - case SND_JACK_HEADSET: 5392 - return "Headset"; 5393 - case SND_JACK_VIDEOOUT: 5394 - return "HDMI/DP"; 5395 - default: 5396 - return "Misc"; 5397 - } 5398 - } 5399 - 5400 - static void hda_free_jack_priv(struct snd_jack *jack) 5401 - { 5402 - struct hda_jack_item *jacks = jack->private_data; 5403 - jacks->nid = 0; 5404 - jacks->jack = NULL; 5405 - } 5406 - 5407 - int snd_hda_input_jack_add(struct hda_codec *codec, hda_nid_t nid, int type, 5408 - const char *name) 5409 - { 5410 - struct hda_jack_item *jack; 5411 - int err; 5412 - 5413 - snd_array_init(&codec->jacks, sizeof(*jack), 32); 5414 - jack = snd_array_new(&codec->jacks); 5415 - if (!jack) 5416 - return -ENOMEM; 5417 - 5418 - jack->nid = nid; 5419 - jack->type = type; 5420 - if (!name) 5421 - name = get_jack_default_name(codec, nid, type); 5422 - err = snd_jack_new(codec->bus->card, name, type, &jack->jack); 5423 - if (err < 0) { 5424 - jack->nid = 0; 5425 - return err; 5426 - } 5427 - jack->jack->private_data = jack; 5428 - jack->jack->private_free = hda_free_jack_priv; 5429 - return 0; 5430 - } 5431 - EXPORT_SYMBOL_HDA(snd_hda_input_jack_add); 5432 - 5433 - void snd_hda_input_jack_report(struct hda_codec *codec, hda_nid_t nid) 5434 - { 5435 - struct hda_jack_item *jacks = codec->jacks.list; 5436 - int i; 5437 - 5438 - if (!jacks) 5439 - return; 5440 - 5441 - for (i = 0; i < codec->jacks.used; i++, jacks++) { 5442 - unsigned int pin_ctl; 5443 - unsigned int present; 5444 - int type; 5445 - 5446 - if (jacks->nid != nid) 5447 - continue; 5448 - present = snd_hda_jack_detect(codec, nid); 5449 - type = jacks->type; 5450 - if (type == (SND_JACK_HEADPHONE | SND_JACK_LINEOUT)) { 5451 - pin_ctl = snd_hda_codec_read(codec, nid, 0, 5452 - AC_VERB_GET_PIN_WIDGET_CONTROL, 0); 5453 - type = (pin_ctl & AC_PINCTL_HP_EN) ? 5454 - SND_JACK_HEADPHONE : SND_JACK_LINEOUT; 5455 - } 5456 - snd_jack_report(jacks->jack, present ? type : 0); 5457 - } 5458 - } 5459 - EXPORT_SYMBOL_HDA(snd_hda_input_jack_report); 5460 - 5461 - /* free jack instances manually when clearing/reconfiguring */ 5462 - void snd_hda_input_jack_free(struct hda_codec *codec) 5463 - { 5464 - if (!codec->bus->shutdown && codec->jacks.list) { 5465 - struct hda_jack_item *jacks = codec->jacks.list; 5466 - int i; 5467 - for (i = 0; i < codec->jacks.used; i++, jacks++) { 5468 - if (jacks->jack) 5469 - snd_device_free(codec->bus->card, jacks->jack); 5470 - } 5471 - } 5472 - snd_array_free(&codec->jacks); 5473 - } 5474 - EXPORT_SYMBOL_HDA(snd_hda_input_jack_free); 5475 - #endif /* CONFIG_SND_HDA_INPUT_JACK */ 5476 5254 5477 5255 MODULE_DESCRIPTION("HDA codec core"); 5478 5256 MODULE_LICENSE("GPL");
+3 -3
sound/pci/hda/hda_codec.h
··· 547 547 /* max. codec address */ 548 548 #define HDA_MAX_CODEC_ADDRESS 0x0f 549 549 550 - /* max number of PCM devics per card */ 551 - #define HDA_MAX_PCMS 10 552 - 553 550 /* 554 551 * generic arrays 555 552 */ ··· 865 868 /* codec-specific additional proc output */ 866 869 void (*proc_widget_hook)(struct snd_info_buffer *buffer, 867 870 struct hda_codec *codec, hda_nid_t nid); 871 + 872 + /* jack detection */ 873 + struct snd_array jacktbl; 868 874 869 875 #ifdef CONFIG_SND_HDA_INPUT_JACK 870 876 /* jack detection */
+70 -36
sound/pci/hda/hda_intel.c
··· 407 407 u32 res[AZX_MAX_CODECS]; /* last read value */ 408 408 }; 409 409 410 + struct azx_pcm { 411 + struct azx *chip; 412 + struct snd_pcm *pcm; 413 + struct hda_codec *codec; 414 + struct hda_pcm_stream *hinfo[2]; 415 + struct list_head list; 416 + }; 417 + 410 418 struct azx { 411 419 struct snd_card *card; 412 420 struct pci_dev *pci; ··· 442 434 struct azx_dev *azx_dev; 443 435 444 436 /* PCM */ 445 - struct snd_pcm *pcm[HDA_MAX_PCMS]; 437 + struct list_head pcm_list; /* azx_pcm list */ 446 438 447 439 /* HD codec */ 448 440 unsigned short codec_mask; ··· 487 479 AZX_DRIVER_SCH, 488 480 AZX_DRIVER_ATI, 489 481 AZX_DRIVER_ATIHDMI, 482 + AZX_DRIVER_ATIHDMI_NS, 490 483 AZX_DRIVER_VIA, 491 484 AZX_DRIVER_SIS, 492 485 AZX_DRIVER_ULI, ··· 534 525 [AZX_DRIVER_SCH] = "HDA Intel MID", 535 526 [AZX_DRIVER_ATI] = "HDA ATI SB", 536 527 [AZX_DRIVER_ATIHDMI] = "HDA ATI HDMI", 528 + [AZX_DRIVER_ATIHDMI_NS] = "HDA ATI HDMI", 537 529 [AZX_DRIVER_VIA] = "HDA VIA VT82xx", 538 530 [AZX_DRIVER_SIS] = "HDA SIS966", 539 531 [AZX_DRIVER_ULI] = "HDA ULI M5461", ··· 1153 1143 1154 1144 static void azx_init_pci(struct azx *chip) 1155 1145 { 1156 - /* force to non-snoop mode for a new VIA controller when BIOS is set */ 1157 - if (chip->snoop && chip->driver_type == AZX_DRIVER_VIA) { 1158 - u8 snoop; 1159 - pci_read_config_byte(chip->pci, 0x42, &snoop); 1160 - if (!(snoop & 0x80) && chip->pci->revision == 0x30) { 1161 - chip->snoop = 0; 1162 - snd_printdd(SFX "Force to non-snoop mode\n"); 1163 - } 1164 - } 1165 - 1166 1146 /* Clear bits 0-2 of PCI register TCSEL (at offset 0x44) 1167 1147 * TCSEL == Traffic Class Select Register, which sets PCI express QOS 1168 1148 * Ensuring these bits are 0 clears playback static on some HD Audio ··· 1486 1486 azx_init_chip(chip, 1); 1487 1487 #ifdef CONFIG_PM 1488 1488 if (chip->initialized) { 1489 - int i; 1490 - 1491 - for (i = 0; i < HDA_MAX_PCMS; i++) 1492 - snd_pcm_suspend_all(chip->pcm[i]); 1489 + struct azx_pcm *p; 1490 + list_for_each_entry(p, &chip->pcm_list, list) 1491 + snd_pcm_suspend_all(p->pcm); 1493 1492 snd_hda_suspend(chip->bus); 1494 1493 snd_hda_resume(chip->bus); 1495 1494 } ··· 1664 1665 .periods_min = 2, 1665 1666 .periods_max = AZX_MAX_FRAG, 1666 1667 .fifo_size = 0, 1667 - }; 1668 - 1669 - struct azx_pcm { 1670 - struct azx *chip; 1671 - struct hda_codec *codec; 1672 - struct hda_pcm_stream *hinfo[2]; 1673 1668 }; 1674 1669 1675 1670 static int azx_pcm_open(struct snd_pcm_substream *substream) ··· 2190 2197 { 2191 2198 struct azx_pcm *apcm = pcm->private_data; 2192 2199 if (apcm) { 2193 - apcm->chip->pcm[pcm->device] = NULL; 2200 + list_del(&apcm->list); 2194 2201 kfree(apcm); 2195 2202 } 2196 2203 } ··· 2208 2215 unsigned int size; 2209 2216 int s, err; 2210 2217 2211 - if (pcm_dev >= HDA_MAX_PCMS) { 2212 - snd_printk(KERN_ERR SFX "Invalid PCM device number %d\n", 2213 - pcm_dev); 2214 - return -EINVAL; 2215 - } 2216 - if (chip->pcm[pcm_dev]) { 2217 - snd_printk(KERN_ERR SFX "PCM %d already exists\n", pcm_dev); 2218 - return -EBUSY; 2218 + list_for_each_entry(apcm, &chip->pcm_list, list) { 2219 + if (apcm->pcm->device == pcm_dev) { 2220 + snd_printk(KERN_ERR SFX "PCM %d already exists\n", pcm_dev); 2221 + return -EBUSY; 2222 + } 2219 2223 } 2220 2224 err = snd_pcm_new(chip->card, cpcm->name, pcm_dev, 2221 2225 cpcm->stream[SNDRV_PCM_STREAM_PLAYBACK].substreams, ··· 2225 2235 if (apcm == NULL) 2226 2236 return -ENOMEM; 2227 2237 apcm->chip = chip; 2238 + apcm->pcm = pcm; 2228 2239 apcm->codec = codec; 2229 2240 pcm->private_data = apcm; 2230 2241 pcm->private_free = azx_pcm_free; 2231 2242 if (cpcm->pcm_type == HDA_PCM_TYPE_MODEM) 2232 2243 pcm->dev_class = SNDRV_PCM_CLASS_MODEM; 2233 - chip->pcm[pcm_dev] = pcm; 2244 + list_add_tail(&apcm->list, &chip->pcm_list); 2234 2245 cpcm->pcm = pcm; 2235 2246 for (s = 0; s < 2; s++) { 2236 2247 apcm->hinfo[s] = &cpcm->stream[s]; ··· 2361 2370 { 2362 2371 struct snd_card *card = pci_get_drvdata(pci); 2363 2372 struct azx *chip = card->private_data; 2364 - int i; 2373 + struct azx_pcm *p; 2365 2374 2366 2375 snd_power_change_state(card, SNDRV_CTL_POWER_D3hot); 2367 2376 azx_clear_irq_pending(chip); 2368 - for (i = 0; i < HDA_MAX_PCMS; i++) 2369 - snd_pcm_suspend_all(chip->pcm[i]); 2377 + list_for_each_entry(p, &chip->pcm_list, list) 2378 + snd_pcm_suspend_all(p->pcm); 2370 2379 if (chip->initialized) 2371 2380 snd_hda_suspend(chip->bus); 2372 2381 azx_stop_chip(chip); ··· 2493 2502 static struct snd_pci_quirk position_fix_list[] __devinitdata = { 2494 2503 SND_PCI_QUIRK(0x1028, 0x01cc, "Dell D820", POS_FIX_LPIB), 2495 2504 SND_PCI_QUIRK(0x1028, 0x01de, "Dell Precision 390", POS_FIX_LPIB), 2496 - SND_PCI_QUIRK(0x1028, 0x02c6, "Dell Inspiron 1010", POS_FIX_LPIB), 2497 2505 SND_PCI_QUIRK(0x103c, 0x306d, "HP dv3", POS_FIX_LPIB), 2498 2506 SND_PCI_QUIRK(0x1043, 0x813d, "ASUS P5AD2", POS_FIX_LPIB), 2499 2507 SND_PCI_QUIRK(0x1043, 0x81b3, "ASUS", POS_FIX_LPIB), ··· 2623 2633 } 2624 2634 } 2625 2635 2636 + /* check the snoop mode availability */ 2637 + static void __devinit azx_check_snoop_available(struct azx *chip) 2638 + { 2639 + bool snoop = chip->snoop; 2640 + 2641 + switch (chip->driver_type) { 2642 + case AZX_DRIVER_VIA: 2643 + /* force to non-snoop mode for a new VIA controller 2644 + * when BIOS is set 2645 + */ 2646 + if (snoop) { 2647 + u8 val; 2648 + pci_read_config_byte(chip->pci, 0x42, &val); 2649 + if (!(val & 0x80) && chip->pci->revision == 0x30) 2650 + snoop = false; 2651 + } 2652 + break; 2653 + case AZX_DRIVER_ATIHDMI_NS: 2654 + /* new ATI HDMI requires non-snoop */ 2655 + snoop = false; 2656 + break; 2657 + } 2658 + 2659 + if (snoop != chip->snoop) { 2660 + snd_printk(KERN_INFO SFX "Force to %s mode\n", 2661 + snoop ? "snoop" : "non-snoop"); 2662 + chip->snoop = snoop; 2663 + } 2664 + } 2626 2665 2627 2666 /* 2628 2667 * constructor ··· 2690 2671 check_msi(chip); 2691 2672 chip->dev_index = dev; 2692 2673 INIT_WORK(&chip->irq_pending_work, azx_irq_pending_work); 2674 + INIT_LIST_HEAD(&chip->pcm_list); 2693 2675 2694 2676 chip->position_fix[0] = chip->position_fix[1] = 2695 2677 check_position_fix(chip, position_fix[dev]); ··· 2698 2678 2699 2679 chip->single_cmd = single_cmd; 2700 2680 chip->snoop = hda_snoop; 2681 + azx_check_snoop_available(chip); 2701 2682 2702 2683 if (bdl_pos_adj[dev] < 0) { 2703 2684 switch (chip->driver_type) { ··· 2797 2776 chip->capture_streams = ULI_NUM_CAPTURE; 2798 2777 break; 2799 2778 case AZX_DRIVER_ATIHDMI: 2779 + case AZX_DRIVER_ATIHDMI_NS: 2800 2780 chip->playback_streams = ATIHDMI_NUM_PLAYBACK; 2801 2781 chip->capture_streams = ATIHDMI_NUM_CAPTURE; 2802 2782 break; ··· 2992 2970 /* SCH */ 2993 2971 { PCI_DEVICE(0x8086, 0x811b), 2994 2972 .driver_data = AZX_DRIVER_SCH | AZX_DCAPS_SCH_SNOOP | 2995 - AZX_DCAPS_BUFSIZE}, 2973 + AZX_DCAPS_BUFSIZE | AZX_DCAPS_POSFIX_LPIB }, /* Poulsbo */ 2974 + { PCI_DEVICE(0x8086, 0x080a), 2975 + .driver_data = AZX_DRIVER_SCH | AZX_DCAPS_SCH_SNOOP | 2976 + AZX_DCAPS_BUFSIZE | AZX_DCAPS_POSFIX_LPIB }, /* Oaktrail */ 2977 + /* ICH */ 2996 2978 { PCI_DEVICE(0x8086, 0x2668), 2997 2979 .driver_data = AZX_DRIVER_ICH | AZX_DCAPS_OLD_SSYNC | 2998 2980 AZX_DCAPS_BUFSIZE }, /* ICH6 */ ··· 3063 3037 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI }, 3064 3038 { PCI_DEVICE(0x1002, 0xaa48), 3065 3039 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI }, 3040 + { PCI_DEVICE(0x1002, 0x9902), 3041 + .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI }, 3042 + { PCI_DEVICE(0x1002, 0xaaa0), 3043 + .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI }, 3044 + { PCI_DEVICE(0x1002, 0xaaa8), 3045 + .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI }, 3046 + { PCI_DEVICE(0x1002, 0xaab0), 3047 + .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI }, 3066 3048 /* VIA VT8251/VT8237A */ 3067 3049 { PCI_DEVICE(0x1106, 0x3288), 3068 3050 .driver_data = AZX_DRIVER_VIA | AZX_DCAPS_POSFIX_VIA },
+353
sound/pci/hda/hda_jack.c
··· 1 + /* 2 + * Jack-detection handling for HD-audio 3 + * 4 + * Copyright (c) 2011 Takashi Iwai <tiwai@suse.de> 5 + * 6 + * This driver is free software; you can redistribute it and/or modify 7 + * it under the terms of the GNU General Public License as published by 8 + * the Free Software Foundation; either version 2 of the License, or 9 + * (at your option) any later version. 10 + */ 11 + 12 + #include <linux/init.h> 13 + #include <linux/slab.h> 14 + #include <linux/export.h> 15 + #include <sound/core.h> 16 + #include <sound/control.h> 17 + #include <sound/jack.h> 18 + #include "hda_codec.h" 19 + #include "hda_local.h" 20 + #include "hda_jack.h" 21 + 22 + /* execute pin sense measurement */ 23 + static u32 read_pin_sense(struct hda_codec *codec, hda_nid_t nid) 24 + { 25 + u32 pincap; 26 + 27 + if (!codec->no_trigger_sense) { 28 + pincap = snd_hda_query_pin_caps(codec, nid); 29 + if (pincap & AC_PINCAP_TRIG_REQ) /* need trigger? */ 30 + snd_hda_codec_read(codec, nid, 0, 31 + AC_VERB_SET_PIN_SENSE, 0); 32 + } 33 + return snd_hda_codec_read(codec, nid, 0, 34 + AC_VERB_GET_PIN_SENSE, 0); 35 + } 36 + 37 + /** 38 + * snd_hda_jack_tbl_get - query the jack-table entry for the given NID 39 + */ 40 + struct hda_jack_tbl * 41 + snd_hda_jack_tbl_get(struct hda_codec *codec, hda_nid_t nid) 42 + { 43 + struct hda_jack_tbl *jack = codec->jacktbl.list; 44 + int i; 45 + 46 + if (!nid || !jack) 47 + return NULL; 48 + for (i = 0; i < codec->jacktbl.used; i++, jack++) 49 + if (jack->nid == nid) 50 + return jack; 51 + return NULL; 52 + } 53 + EXPORT_SYMBOL_HDA(snd_hda_jack_tbl_get); 54 + 55 + /** 56 + * snd_hda_jack_tbl_get_from_tag - query the jack-table entry for the given tag 57 + */ 58 + struct hda_jack_tbl * 59 + snd_hda_jack_tbl_get_from_tag(struct hda_codec *codec, unsigned char tag) 60 + { 61 + struct hda_jack_tbl *jack = codec->jacktbl.list; 62 + int i; 63 + 64 + if (!tag || !jack) 65 + return NULL; 66 + for (i = 0; i < codec->jacktbl.used; i++, jack++) 67 + if (jack->tag == tag) 68 + return jack; 69 + return NULL; 70 + } 71 + EXPORT_SYMBOL_HDA(snd_hda_jack_tbl_get_from_tag); 72 + 73 + /** 74 + * snd_hda_jack_tbl_new - create a jack-table entry for the given NID 75 + */ 76 + struct hda_jack_tbl * 77 + snd_hda_jack_tbl_new(struct hda_codec *codec, hda_nid_t nid) 78 + { 79 + struct hda_jack_tbl *jack = snd_hda_jack_tbl_get(codec, nid); 80 + if (jack) 81 + return jack; 82 + snd_array_init(&codec->jacktbl, sizeof(*jack), 16); 83 + jack = snd_array_new(&codec->jacktbl); 84 + if (!jack) 85 + return NULL; 86 + jack->nid = nid; 87 + jack->jack_dirty = 1; 88 + jack->tag = codec->jacktbl.used; 89 + return jack; 90 + } 91 + EXPORT_SYMBOL_HDA(snd_hda_jack_tbl_new); 92 + 93 + void snd_hda_jack_tbl_clear(struct hda_codec *codec) 94 + { 95 + #ifdef CONFIG_SND_HDA_INPUT_JACK 96 + /* free jack instances manually when clearing/reconfiguring */ 97 + if (!codec->bus->shutdown && codec->jacktbl.list) { 98 + struct hda_jack_tbl *jack = codec->jacktbl.list; 99 + int i; 100 + for (i = 0; i < codec->jacktbl.used; i++, jack++) { 101 + if (jack->jack) 102 + snd_device_free(codec->bus->card, jack->jack); 103 + } 104 + } 105 + #endif 106 + snd_array_free(&codec->jacktbl); 107 + } 108 + 109 + /* update the cached value and notification flag if needed */ 110 + static void jack_detect_update(struct hda_codec *codec, 111 + struct hda_jack_tbl *jack) 112 + { 113 + if (jack->jack_dirty || !jack->jack_detect) { 114 + jack->pin_sense = read_pin_sense(codec, jack->nid); 115 + jack->jack_dirty = 0; 116 + } 117 + } 118 + 119 + /** 120 + * snd_hda_set_dirty_all - Mark all the cached as dirty 121 + * 122 + * This function sets the dirty flag to all entries of jack table. 123 + * It's called from the resume path in hda_codec.c. 124 + */ 125 + void snd_hda_jack_set_dirty_all(struct hda_codec *codec) 126 + { 127 + struct hda_jack_tbl *jack = codec->jacktbl.list; 128 + int i; 129 + 130 + for (i = 0; i < codec->jacktbl.used; i++, jack++) 131 + if (jack->nid) 132 + jack->jack_dirty = 1; 133 + } 134 + EXPORT_SYMBOL_HDA(snd_hda_jack_set_dirty_all); 135 + 136 + /** 137 + * snd_hda_pin_sense - execute pin sense measurement 138 + * @codec: the CODEC to sense 139 + * @nid: the pin NID to sense 140 + * 141 + * Execute necessary pin sense measurement and return its Presence Detect, 142 + * Impedance, ELD Valid etc. status bits. 143 + */ 144 + u32 snd_hda_pin_sense(struct hda_codec *codec, hda_nid_t nid) 145 + { 146 + struct hda_jack_tbl *jack = snd_hda_jack_tbl_get(codec, nid); 147 + if (jack) { 148 + jack_detect_update(codec, jack); 149 + return jack->pin_sense; 150 + } 151 + return read_pin_sense(codec, nid); 152 + } 153 + EXPORT_SYMBOL_HDA(snd_hda_pin_sense); 154 + 155 + #define get_jack_plug_state(sense) !!(sense & AC_PINSENSE_PRESENCE) 156 + 157 + /** 158 + * snd_hda_jack_detect - query pin Presence Detect status 159 + * @codec: the CODEC to sense 160 + * @nid: the pin NID to sense 161 + * 162 + * Query and return the pin's Presence Detect status. 163 + */ 164 + int snd_hda_jack_detect(struct hda_codec *codec, hda_nid_t nid) 165 + { 166 + u32 sense = snd_hda_pin_sense(codec, nid); 167 + return get_jack_plug_state(sense); 168 + } 169 + EXPORT_SYMBOL_HDA(snd_hda_jack_detect); 170 + 171 + /** 172 + * snd_hda_jack_detect_enable - enable the jack-detection 173 + */ 174 + int snd_hda_jack_detect_enable(struct hda_codec *codec, hda_nid_t nid, 175 + unsigned char action) 176 + { 177 + struct hda_jack_tbl *jack = snd_hda_jack_tbl_new(codec, nid); 178 + if (!jack) 179 + return -ENOMEM; 180 + if (jack->jack_detect) 181 + return 0; /* already registered */ 182 + jack->jack_detect = 1; 183 + if (action) 184 + jack->action = action; 185 + return snd_hda_codec_write_cache(codec, nid, 0, 186 + AC_VERB_SET_UNSOLICITED_ENABLE, 187 + AC_USRSP_EN | jack->tag); 188 + } 189 + EXPORT_SYMBOL_HDA(snd_hda_jack_detect_enable); 190 + 191 + /** 192 + * snd_hda_jack_report_sync - sync the states of all jacks and report if changed 193 + */ 194 + void snd_hda_jack_report_sync(struct hda_codec *codec) 195 + { 196 + struct hda_jack_tbl *jack = codec->jacktbl.list; 197 + int i, state; 198 + 199 + for (i = 0; i < codec->jacktbl.used; i++, jack++) 200 + if (jack->nid) { 201 + jack_detect_update(codec, jack); 202 + if (!jack->kctl) 203 + continue; 204 + state = get_jack_plug_state(jack->pin_sense); 205 + snd_kctl_jack_report(codec->bus->card, jack->kctl, state); 206 + #ifdef CONFIG_SND_HDA_INPUT_JACK 207 + if (jack->jack) 208 + snd_jack_report(jack->jack, 209 + state ? jack->type : 0); 210 + #endif 211 + } 212 + } 213 + EXPORT_SYMBOL_HDA(snd_hda_jack_report_sync); 214 + 215 + #ifdef CONFIG_SND_HDA_INPUT_JACK 216 + /* guess the jack type from the pin-config */ 217 + static int get_input_jack_type(struct hda_codec *codec, hda_nid_t nid) 218 + { 219 + unsigned int def_conf = snd_hda_codec_get_pincfg(codec, nid); 220 + switch (get_defcfg_device(def_conf)) { 221 + case AC_JACK_LINE_OUT: 222 + case AC_JACK_SPEAKER: 223 + return SND_JACK_LINEOUT; 224 + case AC_JACK_HP_OUT: 225 + return SND_JACK_HEADPHONE; 226 + case AC_JACK_SPDIF_OUT: 227 + case AC_JACK_DIG_OTHER_OUT: 228 + return SND_JACK_AVOUT; 229 + case AC_JACK_MIC_IN: 230 + return SND_JACK_MICROPHONE; 231 + default: 232 + return SND_JACK_LINEIN; 233 + } 234 + } 235 + 236 + static void hda_free_jack_priv(struct snd_jack *jack) 237 + { 238 + struct hda_jack_tbl *jacks = jack->private_data; 239 + jacks->nid = 0; 240 + jacks->jack = NULL; 241 + } 242 + #endif 243 + 244 + /** 245 + * snd_hda_jack_add_kctl - Add a kctl for the given pin 246 + * 247 + * This assigns a jack-detection kctl to the given pin. The kcontrol 248 + * will have the given name and index. 249 + */ 250 + int snd_hda_jack_add_kctl(struct hda_codec *codec, hda_nid_t nid, 251 + const char *name, int idx) 252 + { 253 + struct hda_jack_tbl *jack; 254 + struct snd_kcontrol *kctl; 255 + int err, state; 256 + 257 + jack = snd_hda_jack_tbl_new(codec, nid); 258 + if (!jack) 259 + return 0; 260 + if (jack->kctl) 261 + return 0; /* already created */ 262 + kctl = snd_kctl_jack_new(name, idx, codec); 263 + if (!kctl) 264 + return -ENOMEM; 265 + err = snd_hda_ctl_add(codec, nid, kctl); 266 + if (err < 0) 267 + return err; 268 + jack->kctl = kctl; 269 + state = snd_hda_jack_detect(codec, nid); 270 + snd_kctl_jack_report(codec->bus->card, kctl, state); 271 + #ifdef CONFIG_SND_HDA_INPUT_JACK 272 + jack->type = get_input_jack_type(codec, nid); 273 + err = snd_jack_new(codec->bus->card, name, jack->type, &jack->jack); 274 + if (err < 0) 275 + return err; 276 + jack->jack->private_data = jack; 277 + jack->jack->private_free = hda_free_jack_priv; 278 + snd_jack_report(jack->jack, state ? jack->type : 0); 279 + #endif 280 + return 0; 281 + } 282 + EXPORT_SYMBOL_HDA(snd_hda_jack_add_kctl); 283 + 284 + static int add_jack_kctl(struct hda_codec *codec, hda_nid_t nid, 285 + const struct auto_pin_cfg *cfg) 286 + { 287 + unsigned int def_conf, conn; 288 + char name[44]; 289 + int idx, err; 290 + 291 + if (!nid) 292 + return 0; 293 + if (!is_jack_detectable(codec, nid)) 294 + return 0; 295 + def_conf = snd_hda_codec_get_pincfg(codec, nid); 296 + conn = get_defcfg_connect(def_conf); 297 + if (conn != AC_JACK_PORT_COMPLEX) 298 + return 0; 299 + 300 + snd_hda_get_pin_label(codec, nid, cfg, name, sizeof(name), &idx); 301 + err = snd_hda_jack_add_kctl(codec, nid, name, idx); 302 + if (err < 0) 303 + return err; 304 + return snd_hda_jack_detect_enable(codec, nid, 0); 305 + } 306 + 307 + /** 308 + * snd_hda_jack_add_kctls - Add kctls for all pins included in the given pincfg 309 + */ 310 + int snd_hda_jack_add_kctls(struct hda_codec *codec, 311 + const struct auto_pin_cfg *cfg) 312 + { 313 + const hda_nid_t *p; 314 + int i, err; 315 + 316 + for (i = 0, p = cfg->line_out_pins; i < cfg->line_outs; i++, p++) { 317 + err = add_jack_kctl(codec, *p, cfg); 318 + if (err < 0) 319 + return err; 320 + } 321 + for (i = 0, p = cfg->hp_pins; i < cfg->hp_outs; i++, p++) { 322 + if (*p == *cfg->line_out_pins) /* might be duplicated */ 323 + break; 324 + err = add_jack_kctl(codec, *p, cfg); 325 + if (err < 0) 326 + return err; 327 + } 328 + for (i = 0, p = cfg->speaker_pins; i < cfg->speaker_outs; i++, p++) { 329 + if (*p == *cfg->line_out_pins) /* might be duplicated */ 330 + break; 331 + err = add_jack_kctl(codec, *p, cfg); 332 + if (err < 0) 333 + return err; 334 + } 335 + for (i = 0; i < cfg->num_inputs; i++) { 336 + err = add_jack_kctl(codec, cfg->inputs[i].pin, cfg); 337 + if (err < 0) 338 + return err; 339 + } 340 + for (i = 0, p = cfg->dig_out_pins; i < cfg->dig_outs; i++, p++) { 341 + err = add_jack_kctl(codec, *p, cfg); 342 + if (err < 0) 343 + return err; 344 + } 345 + err = add_jack_kctl(codec, cfg->dig_in_pin, cfg); 346 + if (err < 0) 347 + return err; 348 + err = add_jack_kctl(codec, cfg->mono_out_pin, cfg); 349 + if (err < 0) 350 + return err; 351 + return 0; 352 + } 353 + EXPORT_SYMBOL_HDA(snd_hda_jack_add_kctls);
+86
sound/pci/hda/hda_jack.h
··· 1 + /* 2 + * Jack-detection handling for HD-audio 3 + * 4 + * Copyright (c) 2011 Takashi Iwai <tiwai@suse.de> 5 + * 6 + * This driver is free software; you can redistribute it and/or modify 7 + * it under the terms of the GNU General Public License as published by 8 + * the Free Software Foundation; either version 2 of the License, or 9 + * (at your option) any later version. 10 + */ 11 + 12 + #ifndef __SOUND_HDA_JACK_H 13 + #define __SOUND_HDA_JACK_H 14 + 15 + struct hda_jack_tbl { 16 + hda_nid_t nid; 17 + unsigned char action; /* event action (0 = none) */ 18 + unsigned char tag; /* unsol event tag */ 19 + unsigned int private_data; /* arbitrary data */ 20 + /* jack-detection stuff */ 21 + unsigned int pin_sense; /* cached pin-sense value */ 22 + unsigned int jack_detect:1; /* capable of jack-detection? */ 23 + unsigned int jack_dirty:1; /* needs to update? */ 24 + struct snd_kcontrol *kctl; /* assigned kctl for jack-detection */ 25 + #ifdef CONFIG_SND_HDA_INPUT_JACK 26 + int type; 27 + struct snd_jack *jack; 28 + #endif 29 + }; 30 + 31 + struct hda_jack_tbl * 32 + snd_hda_jack_tbl_get(struct hda_codec *codec, hda_nid_t nid); 33 + struct hda_jack_tbl * 34 + snd_hda_jack_tbl_get_from_tag(struct hda_codec *codec, unsigned char tag); 35 + 36 + struct hda_jack_tbl * 37 + snd_hda_jack_tbl_new(struct hda_codec *codec, hda_nid_t nid); 38 + void snd_hda_jack_tbl_clear(struct hda_codec *codec); 39 + 40 + /** 41 + * snd_hda_jack_get_action - get jack-tbl entry for the tag 42 + * 43 + * Call this from the unsol event handler to get the assigned action for the 44 + * event. This will mark the dirty flag for the later reporting, too. 45 + */ 46 + static inline unsigned char 47 + snd_hda_jack_get_action(struct hda_codec *codec, unsigned int tag) 48 + { 49 + struct hda_jack_tbl *jack = snd_hda_jack_tbl_get_from_tag(codec, tag); 50 + if (jack) { 51 + jack->jack_dirty = 1; 52 + return jack->action; 53 + } 54 + return 0; 55 + } 56 + 57 + void snd_hda_jack_set_dirty_all(struct hda_codec *codec); 58 + 59 + int snd_hda_jack_detect_enable(struct hda_codec *codec, hda_nid_t nid, 60 + unsigned char action); 61 + 62 + u32 snd_hda_pin_sense(struct hda_codec *codec, hda_nid_t nid); 63 + int snd_hda_jack_detect(struct hda_codec *codec, hda_nid_t nid); 64 + 65 + static inline bool is_jack_detectable(struct hda_codec *codec, hda_nid_t nid) 66 + { 67 + if (!(snd_hda_query_pin_caps(codec, nid) & AC_PINCAP_PRES_DETECT)) 68 + return false; 69 + if (!codec->ignore_misc_bit && 70 + (get_defcfg_misc(snd_hda_codec_get_pincfg(codec, nid)) & 71 + AC_DEFCFG_MISC_NO_PRESENCE)) 72 + return false; 73 + if (!(get_wcaps(codec, nid) & AC_WCAP_UNSOL_CAP)) 74 + return false; 75 + return true; 76 + } 77 + 78 + int snd_hda_jack_add_kctl(struct hda_codec *codec, hda_nid_t nid, 79 + const char *name, int idx); 80 + int snd_hda_jack_add_kctls(struct hda_codec *codec, 81 + const struct auto_pin_cfg *cfg); 82 + 83 + void snd_hda_jack_report_sync(struct hda_codec *codec); 84 + 85 + 86 + #endif /* __SOUND_HDA_JACK_H */
+9 -42
sound/pci/hda/hda_local.h
··· 394 394 }; 395 395 396 396 struct auto_pin_cfg; 397 - const char *hda_get_input_pin_label(struct hda_codec *codec, hda_nid_t pin, 398 - int check_location); 399 397 const char *hda_get_autocfg_input_label(struct hda_codec *codec, 400 398 const struct auto_pin_cfg *cfg, 401 399 int input); 400 + int snd_hda_get_pin_label(struct hda_codec *codec, hda_nid_t nid, 401 + const struct auto_pin_cfg *cfg, 402 + char *label, int maxlen, int *indexp); 402 403 int snd_hda_add_imux_item(struct hda_input_mux *imux, const char *label, 403 404 int index, int *type_index_ret); 404 405 ··· 488 487 } 489 488 490 489 /* get the widget type from widget capability bits */ 491 - #define get_wcaps_type(wcaps) (((wcaps) & AC_WCAP_TYPE) >> AC_WCAP_TYPE_SHIFT) 490 + static inline int get_wcaps_type(unsigned int wcaps) 491 + { 492 + if (!wcaps) 493 + return -1; /* invalid type */ 494 + return (wcaps & AC_WCAP_TYPE) >> AC_WCAP_TYPE_SHIFT; 495 + } 492 496 493 497 static inline unsigned int get_wcaps_channels(u32 wcaps) 494 498 { ··· 511 505 u32 snd_hda_query_pin_caps(struct hda_codec *codec, hda_nid_t nid); 512 506 int snd_hda_override_pin_caps(struct hda_codec *codec, hda_nid_t nid, 513 507 unsigned int caps); 514 - u32 snd_hda_pin_sense(struct hda_codec *codec, hda_nid_t nid); 515 - int snd_hda_jack_detect(struct hda_codec *codec, hda_nid_t nid); 516 - 517 - static inline bool is_jack_detectable(struct hda_codec *codec, hda_nid_t nid) 518 - { 519 - if (!(snd_hda_query_pin_caps(codec, nid) & AC_PINCAP_PRES_DETECT)) 520 - return false; 521 - if (!codec->ignore_misc_bit && 522 - (get_defcfg_misc(snd_hda_codec_get_pincfg(codec, nid)) & 523 - AC_DEFCFG_MISC_NO_PRESENCE)) 524 - return false; 525 - if (!(get_wcaps(codec, nid) & AC_WCAP_UNSOL_CAP)) 526 - return false; 527 - return true; 528 - } 529 508 530 509 /* flags for hda_nid_item */ 531 510 #define HDA_NID_ITEM_AMP (1<<0) ··· 678 687 679 688 #define SND_PRINT_CHANNEL_ALLOCATION_ADVISED_BUFSIZE 80 680 689 void snd_print_channel_allocation(int spk_alloc, char *buf, int buflen); 681 - 682 - /* 683 - * Input-jack notification support 684 - */ 685 - #ifdef CONFIG_SND_HDA_INPUT_JACK 686 - int snd_hda_input_jack_add(struct hda_codec *codec, hda_nid_t nid, int type, 687 - const char *name); 688 - void snd_hda_input_jack_report(struct hda_codec *codec, hda_nid_t nid); 689 - void snd_hda_input_jack_free(struct hda_codec *codec); 690 - #else /* CONFIG_SND_HDA_INPUT_JACK */ 691 - static inline int snd_hda_input_jack_add(struct hda_codec *codec, 692 - hda_nid_t nid, int type, 693 - const char *name) 694 - { 695 - return 0; 696 - } 697 - static inline void snd_hda_input_jack_report(struct hda_codec *codec, 698 - hda_nid_t nid) 699 - { 700 - } 701 - static inline void snd_hda_input_jack_free(struct hda_codec *codec) 702 - { 703 - } 704 - #endif /* CONFIG_SND_HDA_INPUT_JACK */ 705 690 706 691 #endif /* __SOUND_HDA_LOCAL_H */
+2
sound/pci/hda/hda_proc.c
··· 54 54 [AC_WID_BEEP] = "Beep Generator Widget", 55 55 [AC_WID_VENDOR] = "Vendor Defined Widget", 56 56 }; 57 + if (wid_value == -1) 58 + return "UNKNOWN Widget"; 57 59 wid_value &= 0xf; 58 60 if (names[wid_value]) 59 61 return names[wid_value];
+1
sound/pci/hda/patch_analog.c
··· 29 29 #include "hda_codec.h" 30 30 #include "hda_local.h" 31 31 #include "hda_beep.h" 32 + #include "hda_jack.h" 32 33 33 34 struct ad198x_spec { 34 35 const struct snd_kcontrol_new *mixers[6];
+4 -2
sound/pci/hda/patch_ca0110.c
··· 41 41 hda_nid_t dig_out; 42 42 hda_nid_t dig_in; 43 43 unsigned int num_inputs; 44 - const char *input_labels[AUTO_PIN_LAST]; 44 + char input_labels[AUTO_PIN_LAST][32]; 45 45 struct hda_pcm pcm_rec[2]; /* PCM information */ 46 46 }; 47 47 ··· 476 476 if (j >= cfg->num_inputs) 477 477 continue; 478 478 spec->input_pins[n] = pin; 479 - spec->input_labels[n] = hda_get_input_pin_label(codec, pin, 1); 479 + snd_hda_get_pin_label(codec, pin, cfg, 480 + spec->input_labels[n], 481 + sizeof(spec->input_labels[n]), NULL); 480 482 spec->adcs[n] = nid; 481 483 n++; 482 484 }
+118 -69
sound/pci/hda/patch_cirrus.c
··· 26 26 #include <sound/core.h> 27 27 #include "hda_codec.h" 28 28 #include "hda_local.h" 29 + #include "hda_jack.h" 29 30 #include <sound/tlv.h> 30 31 31 32 /* ··· 79 78 CS420X_MBP53, 80 79 CS420X_MBP55, 81 80 CS420X_IMAC27, 81 + CS420X_IMAC27_122, 82 82 CS420X_APPLE, 83 83 CS420X_AUTO, 84 84 CS420X_MODELS ··· 139 137 */ 140 138 #define CS4210_DAC_NID 0x02 141 139 #define CS4210_ADC_NID 0x03 142 - #define CS421X_VENDOR_NID 0x0B 140 + #define CS4210_VENDOR_NID 0x0B 143 141 #define CS421X_DMIC_PIN_NID 0x09 /* Port E */ 144 142 #define CS421X_SPDIF_PIN_NID 0x0A /* Port H */ 145 143 ··· 149 147 #define CS421X_IDX_SPK_CTL 0x04 150 148 151 149 #define SPDIF_EVENT 0x04 150 + 151 + /* Cirrus Logic CS4213 is like CS4210 but does not have SPDIF input/output */ 152 + #define CS4213_VENDOR_NID 0x09 153 + 152 154 153 155 static inline int cs_vendor_coef_get(struct hda_codec *codec, unsigned int idx) 154 156 { ··· 727 721 if (uinfo->value.enumerated.item >= spec->num_inputs) 728 722 uinfo->value.enumerated.item = spec->num_inputs - 1; 729 723 idx = spec->input_idx[uinfo->value.enumerated.item]; 730 - strcpy(uinfo->value.enumerated.name, 731 - hda_get_input_pin_label(codec, cfg->inputs[idx].pin, 1)); 724 + snd_hda_get_pin_label(codec, cfg->inputs[idx].pin, cfg, 725 + uinfo->value.enumerated.name, 726 + sizeof(uinfo->value.enumerated.name), NULL); 732 727 return 0; 733 728 } 734 729 ··· 927 920 928 921 /* mute speakers if spdif or hp jack is plugged in */ 929 922 for (i = 0; i < cfg->speaker_outs; i++) { 923 + int pin_ctl = hp_present ? 0 : PIN_OUT; 924 + /* detect on spdif is specific to CS4210 */ 925 + if (spdif_present && (spec->vendor_nid == CS4210_VENDOR_NID)) 926 + pin_ctl = 0; 927 + 930 928 nid = cfg->speaker_pins[i]; 931 929 snd_hda_codec_write(codec, nid, 0, 932 - AC_VERB_SET_PIN_WIDGET_CONTROL, 933 - hp_present ? 0 : PIN_OUT); 934 - /* detect on spdif is specific to CS421x */ 935 - if (spec->vendor_nid == CS421X_VENDOR_NID) { 936 - snd_hda_codec_write(codec, nid, 0, 937 - AC_VERB_SET_PIN_WIDGET_CONTROL, 938 - spdif_present ? 0 : PIN_OUT); 939 - } 930 + AC_VERB_SET_PIN_WIDGET_CONTROL, pin_ctl); 940 931 } 941 932 if (spec->gpio_eapd_hp) { 942 933 unsigned int gpio = hp_present ? ··· 943 938 AC_VERB_SET_GPIO_DATA, gpio); 944 939 } 945 940 946 - /* specific to CS421x */ 947 - if (spec->vendor_nid == CS421X_VENDOR_NID) { 941 + /* specific to CS4210 */ 942 + if (spec->vendor_nid == CS4210_VENDOR_NID) { 948 943 /* mute HPs if spdif jack (SENSE_B) is present */ 949 944 for (i = 0; i < cfg->hp_outs; i++) { 950 945 nid = cfg->hp_pins[i]; ··· 981 976 present = snd_hda_jack_detect(codec, nid); 982 977 983 978 /* specific to CS421x, single ADC */ 984 - if (spec->vendor_nid == CS421X_VENDOR_NID) { 979 + if (spec->vendor_nid == CS420X_VENDOR_NID) { 980 + if (present) 981 + change_cur_input(codec, spec->automic_idx, 0); 982 + else 983 + change_cur_input(codec, !spec->automic_idx, 0); 984 + } else { 985 985 if (present) { 986 986 spec->last_input = spec->cur_input; 987 987 spec->cur_input = spec->automic_idx; ··· 994 984 spec->cur_input = spec->last_input; 995 985 } 996 986 cs_update_input_select(codec); 997 - } else { 998 - if (present) 999 - change_cur_input(codec, spec->automic_idx, 0); 1000 - else 1001 - change_cur_input(codec, !spec->automic_idx, 0); 1002 987 } 1003 988 } 1004 989 ··· 1032 1027 if (!cfg->speaker_outs) 1033 1028 continue; 1034 1029 if (get_wcaps(codec, nid) & AC_WCAP_UNSOL_CAP) { 1035 - snd_hda_codec_write(codec, nid, 0, 1036 - AC_VERB_SET_UNSOLICITED_ENABLE, 1037 - AC_USRSP_EN | HP_EVENT); 1030 + snd_hda_jack_detect_enable(codec, nid, HP_EVENT); 1038 1031 spec->hp_detect = 1; 1039 1032 } 1040 1033 } ··· 1073 1070 AC_VERB_SET_AMP_GAIN_MUTE, 1074 1071 AMP_IN_MUTE(spec->adc_idx[i])); 1075 1072 if (spec->mic_detect && spec->automic_idx == i) 1076 - snd_hda_codec_write(codec, pin, 0, 1077 - AC_VERB_SET_UNSOLICITED_ENABLE, 1078 - AC_USRSP_EN | MIC_EVENT); 1073 + snd_hda_jack_detect_enable(codec, pin, MIC_EVENT); 1079 1074 } 1080 - /* specific to CS421x */ 1081 - if (spec->vendor_nid == CS421X_VENDOR_NID) { 1082 - if (spec->mic_detect) 1083 - cs_automic(codec); 1084 - else { 1085 - spec->cur_adc = spec->adc_nid[spec->cur_input]; 1086 - cs_update_input_select(codec); 1087 - } 1088 - } else { 1075 + /* CS420x has multiple ADC, CS421x has single ADC */ 1076 + if (spec->vendor_nid == CS420X_VENDOR_NID) { 1089 1077 change_cur_input(codec, spec->cur_input, 1); 1090 1078 if (spec->mic_detect) 1091 1079 cs_automic(codec); ··· 1090 1096 * selected in IDX_SPDIF_CTL. 1091 1097 */ 1092 1098 cs_vendor_coef_set(codec, IDX_ADC_CFG, coef); 1099 + } else { 1100 + if (spec->mic_detect) 1101 + cs_automic(codec); 1102 + else { 1103 + spec->cur_adc = spec->adc_nid[spec->cur_input]; 1104 + cs_update_input_select(codec); 1105 + } 1093 1106 } 1094 1107 } 1095 1108 ··· 1201 1200 init_output(codec); 1202 1201 init_input(codec); 1203 1202 init_digital(codec); 1203 + snd_hda_jack_report_sync(codec); 1204 + 1204 1205 return 0; 1205 1206 } 1206 1207 1207 1208 static int cs_build_controls(struct hda_codec *codec) 1208 1209 { 1210 + struct cs_spec *spec = codec->spec; 1209 1211 int err; 1210 1212 1211 1213 err = build_output(codec); ··· 1223 1219 err = build_digital_input(codec); 1224 1220 if (err < 0) 1225 1221 return err; 1226 - return cs_init(codec); 1222 + err = cs_init(codec); 1223 + if (err < 0) 1224 + return err; 1225 + 1226 + err = snd_hda_jack_add_kctls(codec, &spec->autocfg); 1227 + if (err < 0) 1228 + return err; 1229 + 1230 + return 0; 1227 1231 } 1228 1232 1229 1233 static void cs_free(struct hda_codec *codec) ··· 1244 1232 1245 1233 static void cs_unsol_event(struct hda_codec *codec, unsigned int res) 1246 1234 { 1247 - switch ((res >> 26) & 0x7f) { 1235 + switch (snd_hda_jack_get_action(codec, res >> 26)) { 1248 1236 case HP_EVENT: 1249 1237 cs_automute(codec); 1250 1238 break; ··· 1252 1240 cs_automic(codec); 1253 1241 break; 1254 1242 } 1243 + snd_hda_jack_report_sync(codec); 1255 1244 } 1256 1245 1257 1246 static const struct hda_codec_ops cs_patch_ops = { ··· 1291 1278 [CS420X_MBP53] = "mbp53", 1292 1279 [CS420X_MBP55] = "mbp55", 1293 1280 [CS420X_IMAC27] = "imac27", 1281 + [CS420X_IMAC27_122] = "imac27_122", 1294 1282 [CS420X_APPLE] = "apple", 1295 1283 [CS420X_AUTO] = "auto", 1296 1284 }; ··· 1308 1294 }; 1309 1295 1310 1296 static const struct snd_pci_quirk cs420x_codec_cfg_tbl[] = { 1297 + SND_PCI_QUIRK(0x106b, 0x2000, "iMac 12,2", CS420X_IMAC27_122), 1311 1298 SND_PCI_QUIRK_VENDOR(0x106b, "Apple", CS420X_APPLE), 1312 1299 {} /* terminator */ 1313 1300 }; ··· 1404 1389 case CS420X_MBP55: 1405 1390 case CS420X_APPLE: 1406 1391 spec->gpio_eapd_hp = 2; /* GPIO1 = headphones */ 1392 + spec->gpio_eapd_speaker = 8; /* GPIO3 = speakers */ 1393 + spec->gpio_mask = spec->gpio_dir = 1394 + spec->gpio_eapd_hp | spec->gpio_eapd_speaker; 1395 + break; 1396 + case CS420X_IMAC27_122: 1397 + spec->gpio_eapd_hp = 4; /* GPIO2 = headphones */ 1407 1398 spec->gpio_eapd_speaker = 8; /* GPIO3 = speakers */ 1408 1399 spec->gpio_mask = spec->gpio_dir = 1409 1400 spec->gpio_eapd_hp | spec->gpio_eapd_speaker; ··· 1578 1557 .tlv = { .p = cs421x_speaker_boost_db_scale }, 1579 1558 }; 1580 1559 1581 - static void cs421x_pinmux_init(struct hda_codec *codec) 1560 + static void cs4210_pinmux_init(struct hda_codec *codec) 1582 1561 { 1583 1562 struct cs_spec *spec = codec->spec; 1584 1563 unsigned int def_conf, coef; ··· 1623 1602 if (!cfg->speaker_outs) 1624 1603 continue; 1625 1604 if (get_wcaps(codec, nid) & AC_WCAP_UNSOL_CAP) { 1626 - 1627 - snd_hda_codec_write(codec, nid, 0, 1628 - AC_VERB_SET_UNSOLICITED_ENABLE, 1629 - AC_USRSP_EN | SPDIF_EVENT); 1605 + snd_hda_jack_detect_enable(codec, nid, SPDIF_EVENT); 1630 1606 spec->spdif_detect = 1; 1631 1607 } 1632 1608 } ··· 1633 1615 { 1634 1616 struct cs_spec *spec = codec->spec; 1635 1617 1636 - snd_hda_sequence_write(codec, cs421x_coef_init_verbs); 1637 - snd_hda_sequence_write(codec, cs421x_coef_init_verbs_A1_silicon_fixes); 1638 - 1639 - cs421x_pinmux_init(codec); 1618 + if (spec->vendor_nid == CS4210_VENDOR_NID) { 1619 + snd_hda_sequence_write(codec, cs421x_coef_init_verbs); 1620 + snd_hda_sequence_write(codec, cs421x_coef_init_verbs_A1_silicon_fixes); 1621 + cs4210_pinmux_init(codec); 1622 + } 1640 1623 1641 1624 if (spec->gpio_mask) { 1642 1625 snd_hda_codec_write(codec, 0x01, 0, AC_VERB_SET_GPIO_MASK, ··· 1651 1632 init_output(codec); 1652 1633 init_input(codec); 1653 1634 init_cs421x_digital(codec); 1635 + snd_hda_jack_report_sync(codec); 1654 1636 1655 1637 return 0; 1656 1638 } ··· 1791 1771 struct auto_pin_cfg *cfg = &spec->autocfg; 1792 1772 struct snd_kcontrol *kctl; 1793 1773 int err; 1794 - char *name = "HP/Speakers"; 1774 + char *name = "Master"; 1795 1775 1796 1776 fix_volume_caps(codec, dac); 1797 - if (!spec->vmaster_sw) { 1798 - err = add_vmaster(codec, dac); 1799 - if (err < 0) 1800 - return err; 1801 - } 1802 1777 1803 1778 err = add_mute(codec, name, 0, 1804 1779 HDA_COMPOSE_AMP_VAL(dac, 3, 0, HDA_OUTPUT), 0, &kctl); 1805 - if (err < 0) 1806 - return err; 1807 - err = snd_ctl_add_slave(spec->vmaster_sw, kctl); 1808 1780 if (err < 0) 1809 1781 return err; 1810 1782 ··· 1804 1792 HDA_COMPOSE_AMP_VAL(dac, 3, 0, HDA_OUTPUT), 0, &kctl); 1805 1793 if (err < 0) 1806 1794 return err; 1807 - err = snd_ctl_add_slave(spec->vmaster_vol, kctl); 1808 - if (err < 0) 1809 - return err; 1810 1795 1811 - if (cfg->speaker_outs) { 1796 + if (cfg->speaker_outs && (spec->vendor_nid == CS4210_VENDOR_NID)) { 1812 1797 err = snd_hda_ctl_add(codec, 0, 1813 1798 snd_ctl_new1(&cs421x_speaker_bost_ctl, codec)); 1814 1799 if (err < 0) ··· 1816 1807 1817 1808 static int cs421x_build_controls(struct hda_codec *codec) 1818 1809 { 1810 + struct cs_spec *spec = codec->spec; 1819 1811 int err; 1820 1812 1821 1813 err = build_cs421x_output(codec); ··· 1828 1818 err = build_digital_output(codec); 1829 1819 if (err < 0) 1830 1820 return err; 1831 - return cs421x_init(codec); 1821 + err = cs421x_init(codec); 1822 + if (err < 0) 1823 + return err; 1824 + 1825 + err = snd_hda_jack_add_kctls(codec, &spec->autocfg); 1826 + if (err < 0) 1827 + return err; 1828 + 1829 + return 0; 1832 1830 } 1833 1831 1834 1832 static void cs421x_unsol_event(struct hda_codec *codec, unsigned int res) 1835 1833 { 1836 - switch ((res >> 26) & 0x3f) { 1834 + switch (snd_hda_jack_get_action(codec, res >> 26)) { 1837 1835 case HP_EVENT: 1838 1836 case SPDIF_EVENT: 1839 1837 cs_automute(codec); ··· 1851 1833 cs_automic(codec); 1852 1834 break; 1853 1835 } 1836 + snd_hda_jack_report_sync(codec); 1854 1837 } 1855 1838 1856 1839 static int parse_cs421x_input(struct hda_codec *codec) ··· 1902 1883 */ 1903 1884 static int cs421x_suspend(struct hda_codec *codec, pm_message_t state) 1904 1885 { 1886 + struct cs_spec *spec = codec->spec; 1905 1887 unsigned int coef; 1906 1888 1907 1889 snd_hda_shutup_pins(codec); ··· 1912 1892 snd_hda_codec_write(codec, CS4210_ADC_NID, 0, 1913 1893 AC_VERB_SET_POWER_STATE, AC_PWRST_D3); 1914 1894 1915 - coef = cs_vendor_coef_get(codec, CS421X_IDX_DEV_CFG); 1916 - coef |= 0x0004; /* PDREF */ 1917 - cs_vendor_coef_set(codec, CS421X_IDX_DEV_CFG, coef); 1895 + if (spec->vendor_nid == CS4210_VENDOR_NID) { 1896 + coef = cs_vendor_coef_get(codec, CS421X_IDX_DEV_CFG); 1897 + coef |= 0x0004; /* PDREF */ 1898 + cs_vendor_coef_set(codec, CS421X_IDX_DEV_CFG, coef); 1899 + } 1918 1900 1919 1901 return 0; 1920 1902 } 1921 1903 #endif 1922 1904 1923 - static struct hda_codec_ops cs4210_patch_ops = { 1905 + static struct hda_codec_ops cs421x_patch_ops = { 1924 1906 .build_controls = cs421x_build_controls, 1925 1907 .build_pcms = cs_build_pcms, 1926 1908 .init = cs421x_init, ··· 1933 1911 #endif 1934 1912 }; 1935 1913 1936 - static int patch_cs421x(struct hda_codec *codec) 1914 + static int patch_cs4210(struct hda_codec *codec) 1937 1915 { 1938 1916 struct cs_spec *spec; 1939 1917 int err; ··· 1943 1921 return -ENOMEM; 1944 1922 codec->spec = spec; 1945 1923 1946 - spec->vendor_nid = CS421X_VENDOR_NID; 1924 + spec->vendor_nid = CS4210_VENDOR_NID; 1947 1925 1948 1926 spec->board_config = 1949 1927 snd_hda_check_board_config(codec, CS421X_MODELS, ··· 1971 1949 is auto-parsed. If GPIO or SENSE_B is forced, DMIC input 1972 1950 is disabled. 1973 1951 */ 1974 - cs421x_pinmux_init(codec); 1952 + cs4210_pinmux_init(codec); 1975 1953 1976 1954 err = cs421x_parse_auto_config(codec); 1977 1955 if (err < 0) 1978 1956 goto error; 1979 1957 1980 - codec->patch_ops = cs4210_patch_ops; 1958 + codec->patch_ops = cs421x_patch_ops; 1981 1959 1960 + return 0; 1961 + 1962 + error: 1963 + kfree(codec->spec); 1964 + codec->spec = NULL; 1965 + return err; 1966 + } 1967 + 1968 + static int patch_cs4213(struct hda_codec *codec) 1969 + { 1970 + struct cs_spec *spec; 1971 + int err; 1972 + 1973 + spec = kzalloc(sizeof(*spec), GFP_KERNEL); 1974 + if (!spec) 1975 + return -ENOMEM; 1976 + codec->spec = spec; 1977 + 1978 + spec->vendor_nid = CS4213_VENDOR_NID; 1979 + 1980 + err = cs421x_parse_auto_config(codec); 1981 + if (err < 0) 1982 + goto error; 1983 + 1984 + codec->patch_ops = cs421x_patch_ops; 1982 1985 return 0; 1983 1986 1984 1987 error: ··· 2019 1972 static const struct hda_codec_preset snd_hda_preset_cirrus[] = { 2020 1973 { .id = 0x10134206, .name = "CS4206", .patch = patch_cs420x }, 2021 1974 { .id = 0x10134207, .name = "CS4207", .patch = patch_cs420x }, 2022 - { .id = 0x10134210, .name = "CS4210", .patch = patch_cs421x }, 1975 + { .id = 0x10134210, .name = "CS4210", .patch = patch_cs4210 }, 1976 + { .id = 0x10134213, .name = "CS4213", .patch = patch_cs4213 }, 2023 1977 {} /* terminator */ 2024 1978 }; 2025 1979 2026 1980 MODULE_ALIAS("snd-hda-codec-id:10134206"); 2027 1981 MODULE_ALIAS("snd-hda-codec-id:10134207"); 2028 1982 MODULE_ALIAS("snd-hda-codec-id:10134210"); 1983 + MODULE_ALIAS("snd-hda-codec-id:10134213"); 2029 1984 2030 1985 MODULE_LICENSE("GPL"); 2031 1986 MODULE_DESCRIPTION("Cirrus Logic HD-audio codec");
+20 -59
sound/pci/hda/patch_conexant.c
··· 31 31 #include "hda_codec.h" 32 32 #include "hda_local.h" 33 33 #include "hda_beep.h" 34 + #include "hda_jack.h" 34 35 35 36 #define CXT_PIN_DIR_IN 0x00 36 37 #define CXT_PIN_DIR_OUT 0x01 ··· 416 415 &spec->cur_mux[adc_idx]); 417 416 } 418 417 419 - static int conexant_init_jacks(struct hda_codec *codec) 420 - { 421 - #ifdef CONFIG_SND_HDA_INPUT_JACK 422 - struct conexant_spec *spec = codec->spec; 423 - int i; 424 - 425 - for (i = 0; i < spec->num_init_verbs; i++) { 426 - const struct hda_verb *hv; 427 - 428 - hv = spec->init_verbs[i]; 429 - while (hv->nid) { 430 - int err = 0; 431 - switch (hv->param ^ AC_USRSP_EN) { 432 - case CONEXANT_HP_EVENT: 433 - err = snd_hda_input_jack_add(codec, hv->nid, 434 - SND_JACK_HEADPHONE, NULL); 435 - snd_hda_input_jack_report(codec, hv->nid); 436 - break; 437 - case CXT5051_PORTC_EVENT: 438 - case CONEXANT_MIC_EVENT: 439 - err = snd_hda_input_jack_add(codec, hv->nid, 440 - SND_JACK_MICROPHONE, NULL); 441 - snd_hda_input_jack_report(codec, hv->nid); 442 - break; 443 - } 444 - if (err < 0) 445 - return err; 446 - ++hv; 447 - } 448 - } 449 - #endif /* CONFIG_SND_HDA_INPUT_JACK */ 450 - return 0; 451 - } 452 - 453 418 static void conexant_set_power(struct hda_codec *codec, hda_nid_t fg, 454 419 unsigned int power_state) 455 420 { ··· 441 474 442 475 static void conexant_free(struct hda_codec *codec) 443 476 { 444 - snd_hda_input_jack_free(codec); 445 477 snd_hda_detach_beep_device(codec); 446 478 kfree(codec->spec); 447 479 } ··· 1086 1120 1087 1121 static const struct snd_pci_quirk cxt5045_cfg_tbl[] = { 1088 1122 SND_PCI_QUIRK(0x103c, 0x30d5, "HP 530", CXT5045_LAPTOP_HP530), 1089 - SND_PCI_QUIRK_MASK(0x103c, 0xff00, 0x3000, "HP DV Series", 1090 - CXT5045_LAPTOP_HPSENSE), 1091 1123 SND_PCI_QUIRK(0x1179, 0xff31, "Toshiba P105", CXT5045_LAPTOP_MICSENSE), 1092 1124 SND_PCI_QUIRK(0x152d, 0x0753, "Benq R55E", CXT5045_BENQ), 1093 1125 SND_PCI_QUIRK(0x1734, 0x10ad, "Fujitsu Si1520", CXT5045_LAPTOP_MICSENSE), ··· 1714 1750 static void cxt5051_hp_unsol_event(struct hda_codec *codec, 1715 1751 unsigned int res) 1716 1752 { 1717 - int nid = (res & AC_UNSOL_RES_SUBTAG) >> 20; 1718 1753 switch (res >> 26) { 1719 1754 case CONEXANT_HP_EVENT: 1720 1755 cxt5051_hp_automute(codec); ··· 1725 1762 cxt5051_portc_automic(codec); 1726 1763 break; 1727 1764 } 1728 - snd_hda_input_jack_report(codec, nid); 1729 1765 } 1730 1766 1731 1767 static const struct snd_kcontrol_new cxt5051_playback_mixers[] = { ··· 1863 1901 snd_hda_codec_write(codec, nid, 0, 1864 1902 AC_VERB_SET_UNSOLICITED_ENABLE, 1865 1903 AC_USRSP_EN | event); 1866 - snd_hda_input_jack_add(codec, nid, SND_JACK_MICROPHONE, NULL); 1867 - snd_hda_input_jack_report(codec, nid); 1868 1904 } 1869 1905 1870 1906 static const struct hda_verb cxt5051_ideapad_init_verbs[] = { ··· 1878 1918 struct conexant_spec *spec = codec->spec; 1879 1919 1880 1920 conexant_init(codec); 1881 - conexant_init_jacks(codec); 1882 1921 1883 1922 if (spec->auto_mic & AUTO_MIC_PORTB) 1884 1923 cxt5051_init_mic_port(codec, 0x17, CXT5051_PORTB_EVENT); ··· 3409 3450 hda_nid_t nid = pins[i]; 3410 3451 if (!nid || !is_jack_detectable(codec, nid)) 3411 3452 break; 3412 - snd_hda_input_jack_report(codec, nid); 3413 3453 present |= snd_hda_jack_detect(codec, nid); 3414 3454 } 3415 3455 return present; ··· 3713 3755 3714 3756 static void cx_auto_unsol_event(struct hda_codec *codec, unsigned int res) 3715 3757 { 3716 - int nid = (res & AC_UNSOL_RES_SUBTAG) >> 20; 3717 - switch (res >> 26) { 3758 + switch (snd_hda_jack_get_action(codec, res >> 26)) { 3718 3759 case CONEXANT_HP_EVENT: 3719 3760 cx_auto_hp_automute(codec); 3720 3761 break; ··· 3722 3765 break; 3723 3766 case CONEXANT_MIC_EVENT: 3724 3767 cx_auto_automic(codec); 3725 - snd_hda_input_jack_report(codec, nid); 3726 3768 break; 3727 3769 } 3770 + snd_hda_jack_report_sync(codec); 3728 3771 } 3729 3772 3730 3773 /* check whether the pin config is suitable for auto-mic switching; ··· 3936 3979 } 3937 3980 3938 3981 static void enable_unsol_pins(struct hda_codec *codec, int num_pins, 3939 - hda_nid_t *pins, unsigned int tag) 3982 + hda_nid_t *pins, unsigned int action) 3940 3983 { 3941 3984 int i; 3942 3985 for (i = 0; i < num_pins; i++) 3943 - snd_hda_codec_write(codec, pins[i], 0, 3944 - AC_VERB_SET_UNSOLICITED_ENABLE, 3945 - AC_USRSP_EN | tag); 3986 + snd_hda_jack_detect_enable(codec, pins[i], action); 3946 3987 } 3947 3988 3948 3989 static void cx_auto_init_output(struct hda_codec *codec) ··· 4015 4060 4016 4061 if (spec->auto_mic) { 4017 4062 if (spec->auto_mic_ext >= 0) { 4018 - snd_hda_codec_write(codec, 4019 - cfg->inputs[spec->auto_mic_ext].pin, 0, 4020 - AC_VERB_SET_UNSOLICITED_ENABLE, 4021 - AC_USRSP_EN | CONEXANT_MIC_EVENT); 4063 + snd_hda_jack_detect_enable(codec, 4064 + cfg->inputs[spec->auto_mic_ext].pin, 4065 + CONEXANT_MIC_EVENT); 4022 4066 } 4023 4067 if (spec->auto_mic_dock >= 0) { 4024 - snd_hda_codec_write(codec, 4025 - cfg->inputs[spec->auto_mic_dock].pin, 0, 4026 - AC_VERB_SET_UNSOLICITED_ENABLE, 4027 - AC_USRSP_EN | CONEXANT_MIC_EVENT); 4068 + snd_hda_jack_detect_enable(codec, 4069 + cfg->inputs[spec->auto_mic_dock].pin, 4070 + CONEXANT_MIC_EVENT); 4028 4071 } 4029 4072 cx_auto_automic(codec); 4030 4073 } else { ··· 4050 4097 cx_auto_init_output(codec); 4051 4098 cx_auto_init_input(codec); 4052 4099 cx_auto_init_digital(codec); 4100 + snd_hda_jack_report_sync(codec); 4053 4101 return 0; 4054 4102 } 4055 4103 ··· 4280 4326 4281 4327 static int cx_auto_build_controls(struct hda_codec *codec) 4282 4328 { 4329 + struct conexant_spec *spec = codec->spec; 4283 4330 int err; 4284 4331 4285 4332 err = cx_auto_build_output_controls(codec); ··· 4289 4334 err = cx_auto_build_input_controls(codec); 4290 4335 if (err < 0) 4291 4336 return err; 4292 - return conexant_build_controls(codec); 4337 + err = conexant_build_controls(codec); 4338 + if (err < 0) 4339 + return err; 4340 + err = snd_hda_jack_add_kctls(codec, &spec->autocfg); 4341 + if (err < 0) 4342 + return err; 4343 + return 0; 4293 4344 } 4294 4345 4295 4346 static int cx_auto_search_adcs(struct hda_codec *codec)
+30 -29
sound/pci/hda/patch_hdmi.c
··· 36 36 #include <sound/jack.h> 37 37 #include "hda_codec.h" 38 38 #include "hda_local.h" 39 + #include "hda_jack.h" 39 40 40 41 static bool static_hdmi_pcm; 41 42 module_param(static_hdmi_pcm, bool, 0644); ··· 49 48 * 50 49 * The HDA correspondence of pipes/ports are converter/pin nodes. 51 50 */ 52 - #define MAX_HDMI_CVTS 4 53 - #define MAX_HDMI_PINS 4 51 + #define MAX_HDMI_CVTS 8 52 + #define MAX_HDMI_PINS 8 54 53 55 54 struct hdmi_spec_per_cvt { 56 55 hda_nid_t cvt_nid; ··· 755 754 static void hdmi_intrinsic_event(struct hda_codec *codec, unsigned int res) 756 755 { 757 756 struct hdmi_spec *spec = codec->spec; 758 - int pin_nid = res >> AC_UNSOL_RES_TAG_SHIFT; 757 + int tag = res >> AC_UNSOL_RES_TAG_SHIFT; 758 + int pin_nid; 759 759 int pd = !!(res & AC_UNSOL_RES_PD); 760 760 int eldv = !!(res & AC_UNSOL_RES_ELDV); 761 761 int pin_idx; 762 + struct hda_jack_tbl *jack; 763 + 764 + jack = snd_hda_jack_tbl_get_from_tag(codec, tag); 765 + if (!jack) 766 + return; 767 + pin_nid = jack->nid; 768 + jack->jack_dirty = 1; 762 769 763 770 printk(KERN_INFO 764 771 "HDMI hot plug event: Codec=%d Pin=%d Presence_Detect=%d ELD_Valid=%d\n", ··· 777 768 return; 778 769 779 770 hdmi_present_sense(&spec->pins[pin_idx], 1); 771 + snd_hda_jack_report_sync(codec); 780 772 } 781 773 782 774 static void hdmi_non_intrinsic_event(struct hda_codec *codec, unsigned int res) ··· 805 795 806 796 static void hdmi_unsol_event(struct hda_codec *codec, unsigned int res) 807 797 { 808 - struct hdmi_spec *spec = codec->spec; 809 798 int tag = res >> AC_UNSOL_RES_TAG_SHIFT; 810 799 int subtag = (res & AC_UNSOL_RES_SUBTAG) >> AC_UNSOL_RES_SUBTAG_SHIFT; 811 800 812 - if (pin_nid_to_pin_index(spec, tag) < 0) { 801 + if (!snd_hda_jack_tbl_get_from_tag(codec, tag)) { 813 802 snd_printd(KERN_INFO "Unexpected HDMI event tag 0x%x\n", tag); 814 803 return; 815 804 } ··· 1005 996 msecs_to_jiffies(300)); 1006 997 } 1007 998 } 1008 - 1009 - snd_hda_input_jack_report(codec, pin_nid); 1010 999 } 1011 1000 1012 1001 static void hdmi_repoll_eld(struct work_struct *work) ··· 1133 1126 1134 1127 /* 1135 1128 */ 1136 - static char *generic_hdmi_pcm_names[MAX_HDMI_PINS] = { 1137 - "HDMI 0", 1138 - "HDMI 1", 1139 - "HDMI 2", 1140 - "HDMI 3", 1141 - }; 1129 + static char *get_hdmi_pcm_name(int idx) 1130 + { 1131 + static char names[MAX_HDMI_PINS][8]; 1132 + sprintf(&names[idx][0], "HDMI %d", idx); 1133 + return &names[idx][0]; 1134 + } 1142 1135 1143 1136 /* 1144 1137 * HDMI callbacks ··· 1216 1209 struct hda_pcm_stream *pstr; 1217 1210 1218 1211 info = &spec->pcm_rec[pin_idx]; 1219 - info->name = generic_hdmi_pcm_names[pin_idx]; 1212 + info->name = get_hdmi_pcm_name(pin_idx); 1220 1213 info->pcm_type = HDA_PCM_TYPE_HDMI; 1221 1214 1222 1215 pstr = &info->stream[SNDRV_PCM_STREAM_PLAYBACK]; ··· 1233 1226 1234 1227 static int generic_hdmi_build_jack(struct hda_codec *codec, int pin_idx) 1235 1228 { 1236 - int err; 1237 - char hdmi_str[32]; 1229 + char hdmi_str[32] = "HDMI/DP"; 1238 1230 struct hdmi_spec *spec = codec->spec; 1239 1231 struct hdmi_spec_per_pin *per_pin = &spec->pins[pin_idx]; 1240 1232 int pcmdev = spec->pcm_rec[pin_idx].device; 1241 1233 1242 - snprintf(hdmi_str, sizeof(hdmi_str), "HDMI/DP,pcm=%d", pcmdev); 1234 + if (pcmdev > 0) 1235 + sprintf(hdmi_str + strlen(hdmi_str), ",pcm=%d", pcmdev); 1243 1236 1244 - err = snd_hda_input_jack_add(codec, per_pin->pin_nid, 1245 - SND_JACK_VIDEOOUT, pcmdev > 0 ? hdmi_str : NULL); 1246 - if (err < 0) 1247 - return err; 1248 - 1249 - hdmi_present_sense(per_pin, 0); 1250 - return 0; 1237 + return snd_hda_jack_add_kctl(codec, per_pin->pin_nid, hdmi_str, 0); 1251 1238 } 1252 1239 1253 1240 static int generic_hdmi_build_controls(struct hda_codec *codec) ··· 1271 1270 1272 1271 if (err < 0) 1273 1272 return err; 1273 + 1274 + hdmi_present_sense(per_pin, 0); 1274 1275 } 1275 1276 1276 1277 return 0; ··· 1289 1286 struct hdmi_eld *eld = &per_pin->sink_eld; 1290 1287 1291 1288 hdmi_init_pin(codec, pin_nid); 1292 - snd_hda_codec_write(codec, pin_nid, 0, 1293 - AC_VERB_SET_UNSOLICITED_ENABLE, 1294 - AC_USRSP_EN | pin_nid); 1289 + snd_hda_jack_detect_enable(codec, pin_nid, pin_nid); 1295 1290 1296 1291 per_pin->codec = codec; 1297 1292 INIT_DELAYED_WORK(&per_pin->work, hdmi_repoll_eld); 1298 1293 snd_hda_eld_proc_new(codec, eld, pin_idx); 1299 1294 } 1295 + snd_hda_jack_report_sync(codec); 1300 1296 return 0; 1301 1297 } 1302 1298 ··· 1311 1309 cancel_delayed_work(&per_pin->work); 1312 1310 snd_hda_eld_proc_free(codec, eld); 1313 1311 } 1314 - snd_hda_input_jack_free(codec); 1315 1312 1316 1313 flush_workqueue(codec->bus->workq); 1317 1314 kfree(spec); ··· 1365 1364 chans = get_wcaps(codec, spec->cvts[i].cvt_nid); 1366 1365 chans = get_wcaps_channels(chans); 1367 1366 1368 - info->name = generic_hdmi_pcm_names[i]; 1367 + info->name = get_hdmi_pcm_name(i); 1369 1368 info->pcm_type = HDA_PCM_TYPE_HDMI; 1370 1369 pstr = &info->stream[SNDRV_PCM_STREAM_PLAYBACK]; 1371 1370 snd_BUG_ON(!spec->pcm_playback);
+566 -192
sound/pci/hda/patch_realtek.c
··· 33 33 #include "hda_codec.h" 34 34 #include "hda_local.h" 35 35 #include "hda_beep.h" 36 + #include "hda_jack.h" 36 37 37 38 /* unsol event tags */ 38 39 #define ALC_FRONT_EVENT 0x01 ··· 184 183 unsigned int single_input_src:1; 185 184 unsigned int vol_in_capsrc:1; /* use capsrc volume (ADC has no vol) */ 186 185 unsigned int parse_flags; /* passed to snd_hda_parse_pin_defcfg() */ 186 + unsigned int shared_mic_hp:1; /* HP/Mic-in sharing */ 187 + unsigned int use_jack_tbl:1; /* 1 for model=auto */ 187 188 188 189 /* auto-mute control */ 189 190 int automute_mode; ··· 286 283 spec->capsrc_nids[idx] : spec->adc_nids[idx]; 287 284 } 288 285 286 + static void call_update_outputs(struct hda_codec *codec); 287 + 289 288 /* select the given imux item; either unmute exclusively or select the route */ 290 289 static int alc_mux_select(struct hda_codec *codec, unsigned int adc_idx, 291 290 unsigned int idx, bool force) ··· 302 297 imux = &spec->input_mux[mux_idx]; 303 298 if (!imux->num_items && mux_idx > 0) 304 299 imux = &spec->input_mux[0]; 300 + if (!imux->num_items) 301 + return 0; 305 302 306 303 if (idx >= imux->num_items) 307 304 idx = imux->num_items - 1; 308 305 if (spec->cur_mux[adc_idx] == idx && !force) 309 306 return 0; 310 307 spec->cur_mux[adc_idx] = idx; 308 + 309 + /* for shared I/O, change the pin-control accordingly */ 310 + if (spec->shared_mic_hp) { 311 + /* NOTE: this assumes that there are only two inputs, the 312 + * first is the real internal mic and the second is HP jack. 313 + */ 314 + snd_hda_codec_write(codec, spec->autocfg.inputs[1].pin, 0, 315 + AC_VERB_SET_PIN_WIDGET_CONTROL, 316 + spec->cur_mux[adc_idx] ? 317 + PIN_VREF80 : PIN_HP); 318 + spec->automute_speaker = !spec->cur_mux[adc_idx]; 319 + call_update_outputs(codec); 320 + } 311 321 312 322 if (spec->dyn_adc_switch) { 313 323 alc_dyn_adc_pcm_resetup(codec, idx); ··· 468 448 } 469 449 470 450 /* 471 - * Jack-reporting via input-jack layer 472 - */ 473 - 474 - /* initialization of jacks; currently checks only a few known pins */ 475 - static int alc_init_jacks(struct hda_codec *codec) 476 - { 477 - #ifdef CONFIG_SND_HDA_INPUT_JACK 478 - struct alc_spec *spec = codec->spec; 479 - int err; 480 - unsigned int hp_nid = spec->autocfg.hp_pins[0]; 481 - unsigned int mic_nid = spec->ext_mic_pin; 482 - unsigned int dock_nid = spec->dock_mic_pin; 483 - 484 - if (hp_nid) { 485 - err = snd_hda_input_jack_add(codec, hp_nid, 486 - SND_JACK_HEADPHONE, NULL); 487 - if (err < 0) 488 - return err; 489 - snd_hda_input_jack_report(codec, hp_nid); 490 - } 491 - 492 - if (mic_nid) { 493 - err = snd_hda_input_jack_add(codec, mic_nid, 494 - SND_JACK_MICROPHONE, NULL); 495 - if (err < 0) 496 - return err; 497 - snd_hda_input_jack_report(codec, mic_nid); 498 - } 499 - if (dock_nid) { 500 - err = snd_hda_input_jack_add(codec, dock_nid, 501 - SND_JACK_MICROPHONE, NULL); 502 - if (err < 0) 503 - return err; 504 - snd_hda_input_jack_report(codec, dock_nid); 505 - } 506 - #endif /* CONFIG_SND_HDA_INPUT_JACK */ 507 - return 0; 508 - } 509 - 510 - /* 511 451 * Jack detections for HP auto-mute and mic-switch 512 452 */ 513 453 ··· 480 500 hda_nid_t nid = pins[i]; 481 501 if (!nid) 482 502 break; 483 - snd_hda_input_jack_report(codec, nid); 484 503 present |= snd_hda_jack_detect(codec, nid); 485 504 } 486 505 return present; ··· 531 552 * in general, HP pins/amps control should be enabled in all cases, 532 553 * but currently set only for master_mute, just to be safe 533 554 */ 534 - do_automute(codec, ARRAY_SIZE(spec->autocfg.hp_pins), 555 + if (!spec->shared_mic_hp) /* don't change HP-pin when shared with mic */ 556 + do_automute(codec, ARRAY_SIZE(spec->autocfg.hp_pins), 535 557 spec->autocfg.hp_pins, spec->master_mute, true); 536 558 537 559 if (!spec->automute_speaker) ··· 619 639 alc_mux_select(codec, 0, spec->dock_mic_idx, false); 620 640 else 621 641 alc_mux_select(codec, 0, spec->int_mic_idx, false); 622 - 623 - snd_hda_input_jack_report(codec, pins[spec->ext_mic_idx]); 624 - if (spec->dock_mic_idx >= 0) 625 - snd_hda_input_jack_report(codec, pins[spec->dock_mic_idx]); 626 642 } 627 643 628 644 /* unsolicited event for HP jack sensing */ 629 645 static void alc_sku_unsol_event(struct hda_codec *codec, unsigned int res) 630 646 { 647 + struct alc_spec *spec = codec->spec; 631 648 if (codec->vendor_id == 0x10ec0880) 632 649 res >>= 28; 633 650 else 634 651 res >>= 26; 652 + if (spec->use_jack_tbl) 653 + res = snd_hda_jack_get_action(codec, res); 635 654 switch (res) { 636 655 case ALC_HP_EVENT: 637 656 alc_hp_automute(codec); ··· 642 663 alc_mic_automute(codec); 643 664 break; 644 665 } 666 + snd_hda_jack_report_sync(codec); 645 667 } 646 668 647 669 /* call init functions of standard auto-mute helpers */ ··· 932 952 continue; 933 953 snd_printdd("realtek: Enable HP auto-muting on NID 0x%x\n", 934 954 nid); 935 - snd_hda_codec_write_cache(codec, nid, 0, 936 - AC_VERB_SET_UNSOLICITED_ENABLE, 937 - AC_USRSP_EN | ALC_HP_EVENT); 955 + snd_hda_jack_detect_enable(codec, nid, ALC_HP_EVENT); 938 956 spec->detect_hp = 1; 939 957 } 940 958 ··· 944 966 continue; 945 967 snd_printdd("realtek: Enable Line-Out " 946 968 "auto-muting on NID 0x%x\n", nid); 947 - snd_hda_codec_write_cache(codec, nid, 0, 948 - AC_VERB_SET_UNSOLICITED_ENABLE, 949 - AC_USRSP_EN | ALC_FRONT_EVENT); 969 + snd_hda_jack_detect_enable(codec, nid, 970 + ALC_FRONT_EVENT); 950 971 spec->detect_lo = 1; 951 972 } 952 973 spec->automute_lo_possible = spec->detect_hp; ··· 1084 1107 return false; /* no corresponding imux */ 1085 1108 } 1086 1109 1087 - snd_hda_codec_write_cache(codec, spec->ext_mic_pin, 0, 1088 - AC_VERB_SET_UNSOLICITED_ENABLE, 1089 - AC_USRSP_EN | ALC_MIC_EVENT); 1110 + snd_hda_jack_detect_enable(codec, spec->ext_mic_pin, ALC_MIC_EVENT); 1090 1111 if (spec->dock_mic_pin) 1091 - snd_hda_codec_write_cache(codec, spec->dock_mic_pin, 0, 1092 - AC_VERB_SET_UNSOLICITED_ENABLE, 1093 - AC_USRSP_EN | ALC_MIC_EVENT); 1112 + snd_hda_jack_detect_enable(codec, spec->dock_mic_pin, 1113 + ALC_MIC_EVENT); 1094 1114 1095 1115 spec->auto_mic_valid_imux = 1; 1096 1116 spec->auto_mic = 1; ··· 1104 1130 struct auto_pin_cfg *cfg = &spec->autocfg; 1105 1131 hda_nid_t fixed, ext, dock; 1106 1132 int i; 1133 + 1134 + if (spec->shared_mic_hp) 1135 + return; /* no auto-mic for the shared I/O */ 1107 1136 1108 1137 spec->ext_mic_idx = spec->int_mic_idx = spec->dock_mic_idx = -1; 1109 1138 ··· 1499 1522 const struct alc_fixup *fixlist) 1500 1523 { 1501 1524 struct alc_spec *spec = codec->spec; 1525 + const struct snd_pci_quirk *q; 1502 1526 int id = -1; 1503 1527 const char *name = NULL; 1504 1528 ··· 1514 1536 } 1515 1537 } 1516 1538 if (id < 0) { 1517 - quirk = snd_pci_quirk_lookup(codec->bus->pci, quirk); 1518 - if (quirk) { 1519 - id = quirk->value; 1539 + q = snd_pci_quirk_lookup(codec->bus->pci, quirk); 1540 + if (q) { 1541 + id = q->value; 1520 1542 #ifdef CONFIG_SND_DEBUG_VERBOSE 1521 - name = quirk->name; 1543 + name = q->name; 1522 1544 #endif 1545 + } 1546 + } 1547 + if (id < 0) { 1548 + for (q = quirk; q->subvendor; q++) { 1549 + unsigned int vendorid = 1550 + q->subdevice | (q->subvendor << 16); 1551 + if (vendorid == codec->subsystem_id) { 1552 + id = q->value; 1553 + #ifdef CONFIG_SND_DEBUG_VERBOSE 1554 + name = q->name; 1555 + #endif 1556 + break; 1557 + } 1523 1558 } 1524 1559 } 1525 1560 ··· 2029 2038 2030 2039 alc_free_kctls(codec); /* no longer needed */ 2031 2040 2041 + err = snd_hda_jack_add_kctls(codec, &spec->autocfg); 2042 + if (err < 0) 2043 + return err; 2044 + 2032 2045 return 0; 2033 2046 } 2034 2047 ··· 2059 2064 spec->init_hook(codec); 2060 2065 2061 2066 alc_apply_fixup(codec, ALC_FIXUP_ACT_INIT); 2067 + 2068 + snd_hda_jack_report_sync(codec); 2062 2069 2063 2070 hda_call_check_power_status(codec, 0x01); 2064 2071 return 0; ··· 2445 2448 return; 2446 2449 2447 2450 alc_shutup(codec); 2448 - snd_hda_input_jack_free(codec); 2449 2451 alc_free_kctls(codec); 2450 2452 alc_free_bind_ctls(codec); 2451 2453 kfree(spec); ··· 2625 2629 case AUTO_PIN_SPEAKER_OUT: 2626 2630 if (cfg->line_outs == 1) 2627 2631 return "Speaker"; 2632 + if (cfg->line_outs == 2) 2633 + return ch ? "Bass Speaker" : "Speaker"; 2628 2634 break; 2629 2635 case AUTO_PIN_HP_OUT: 2630 2636 /* for multi-io case, only the primary out */ ··· 2678 2680 hda_nid_t *cap_nids = spec->private_capsrc_nids; 2679 2681 int max_nums = ARRAY_SIZE(spec->private_adc_nids); 2680 2682 int i, nums = 0; 2683 + 2684 + if (spec->shared_mic_hp) 2685 + max_nums = 1; /* no multi streams with the shared HP/mic */ 2681 2686 2682 2687 nid = codec->start_nid; 2683 2688 for (i = 0; i < codec->num_nodes; i++, nid++) { ··· 2744 2743 continue; 2745 2744 2746 2745 label = hda_get_autocfg_input_label(codec, cfg, i); 2746 + if (spec->shared_mic_hp && !strcmp(label, "Misc")) 2747 + label = "Headphone Mic"; 2747 2748 if (prev_label && !strcmp(label, prev_label)) 2748 2749 type_idx++; 2749 2750 else ··· 2777 2774 spec->num_mux_defs = 1; 2778 2775 spec->input_mux = imux; 2779 2776 2777 + return 0; 2778 + } 2779 + 2780 + /* create a shared input with the headphone out */ 2781 + static int alc_auto_create_shared_input(struct hda_codec *codec) 2782 + { 2783 + struct alc_spec *spec = codec->spec; 2784 + struct auto_pin_cfg *cfg = &spec->autocfg; 2785 + unsigned int defcfg; 2786 + hda_nid_t nid; 2787 + 2788 + /* only one internal input pin? */ 2789 + if (cfg->num_inputs != 1) 2790 + return 0; 2791 + defcfg = snd_hda_codec_get_pincfg(codec, cfg->inputs[0].pin); 2792 + if (snd_hda_get_input_pin_attr(defcfg) != INPUT_PIN_ATTR_INT) 2793 + return 0; 2794 + 2795 + if (cfg->hp_outs == 1 && cfg->line_out_type == AUTO_PIN_SPEAKER_OUT) 2796 + nid = cfg->hp_pins[0]; /* OK, we have a single HP-out */ 2797 + else if (cfg->line_outs == 1 && cfg->line_out_type == AUTO_PIN_HP_OUT) 2798 + nid = cfg->line_out_pins[0]; /* OK, we have a single line-out */ 2799 + else 2800 + return 0; /* both not available */ 2801 + 2802 + if (!(snd_hda_query_pin_caps(codec, nid) & AC_PINCAP_IN)) 2803 + return 0; /* no input */ 2804 + 2805 + cfg->inputs[1].pin = nid; 2806 + cfg->inputs[1].type = AUTO_PIN_MIC; 2807 + cfg->num_inputs = 2; 2808 + spec->shared_mic_hp = 1; 2809 + snd_printdd("realtek: Enable shared I/O jack on NID 0x%x\n", nid); 2780 2810 return 0; 2781 2811 } 2782 2812 ··· 2938 2902 if (!nid) 2939 2903 continue; 2940 2904 if (found_in_nid_list(nid, spec->multiout.dac_nids, 2941 - spec->multiout.num_dacs)) 2905 + ARRAY_SIZE(spec->private_dac_nids))) 2942 2906 continue; 2943 2907 if (found_in_nid_list(nid, spec->multiout.hp_out_nid, 2944 2908 ARRAY_SIZE(spec->multiout.hp_out_nid))) ··· 2951 2915 return 0; 2952 2916 } 2953 2917 2918 + /* check whether the DAC is reachable from the pin */ 2919 + static bool alc_auto_is_dac_reachable(struct hda_codec *codec, 2920 + hda_nid_t pin, hda_nid_t dac) 2921 + { 2922 + hda_nid_t srcs[5]; 2923 + int i, num; 2924 + 2925 + pin = alc_go_down_to_selector(codec, pin); 2926 + num = snd_hda_get_connections(codec, pin, srcs, ARRAY_SIZE(srcs)); 2927 + for (i = 0; i < num; i++) { 2928 + hda_nid_t nid = alc_auto_mix_to_dac(codec, srcs[i]); 2929 + if (nid == dac) 2930 + return true; 2931 + } 2932 + return false; 2933 + } 2934 + 2954 2935 static hda_nid_t get_dac_if_single(struct hda_codec *codec, hda_nid_t pin) 2955 2936 { 2956 2937 hda_nid_t sel = alc_go_down_to_selector(codec, pin); ··· 2976 2923 return 0; 2977 2924 } 2978 2925 2926 + /* return 0 if no possible DAC is found, 1 if one or more found */ 2979 2927 static int alc_auto_fill_extra_dacs(struct hda_codec *codec, int num_outs, 2980 2928 const hda_nid_t *pins, hda_nid_t *dacs) 2981 2929 { ··· 2994 2940 if (!dacs[i]) 2995 2941 dacs[i] = alc_auto_look_for_dac(codec, pins[i]); 2996 2942 } 2997 - return 0; 2943 + return 1; 2998 2944 } 2999 2945 3000 2946 static int alc_auto_fill_multi_ios(struct hda_codec *codec, 3001 - unsigned int location); 2947 + unsigned int location, int offset); 2948 + static hda_nid_t alc_look_for_out_vol_nid(struct hda_codec *codec, 2949 + hda_nid_t pin, hda_nid_t dac); 3002 2950 3003 2951 /* fill in the dac_nids table from the parsed pin configuration */ 3004 2952 static int alc_auto_fill_dac_nids(struct hda_codec *codec) 3005 2953 { 3006 2954 struct alc_spec *spec = codec->spec; 3007 - const struct auto_pin_cfg *cfg = &spec->autocfg; 2955 + struct auto_pin_cfg *cfg = &spec->autocfg; 2956 + unsigned int location, defcfg; 2957 + int num_pins; 3008 2958 bool redone = false; 3009 2959 int i; 3010 2960 ··· 3019 2961 spec->multiout.extra_out_nid[0] = 0; 3020 2962 memset(spec->private_dac_nids, 0, sizeof(spec->private_dac_nids)); 3021 2963 spec->multiout.dac_nids = spec->private_dac_nids; 2964 + spec->multi_ios = 0; 3022 2965 3023 2966 /* fill hard-wired DACs first */ 3024 2967 if (!redone) { ··· 3053 2994 for (i = 0; i < cfg->line_outs; i++) { 3054 2995 if (spec->private_dac_nids[i]) 3055 2996 spec->multiout.num_dacs++; 3056 - else 2997 + else { 3057 2998 memmove(spec->private_dac_nids + i, 3058 2999 spec->private_dac_nids + i + 1, 3059 3000 sizeof(hda_nid_t) * (cfg->line_outs - i - 1)); 3001 + spec->private_dac_nids[cfg->line_outs - 1] = 0; 3002 + } 3060 3003 } 3061 3004 3062 3005 if (cfg->line_outs == 1 && cfg->line_out_type != AUTO_PIN_SPEAKER_OUT) { 3063 3006 /* try to fill multi-io first */ 3064 - unsigned int location, defcfg; 3065 - int num_pins; 3066 - 3067 3007 defcfg = snd_hda_codec_get_pincfg(codec, cfg->line_out_pins[0]); 3068 3008 location = get_defcfg_location(defcfg); 3069 3009 3070 - num_pins = alc_auto_fill_multi_ios(codec, location); 3010 + num_pins = alc_auto_fill_multi_ios(codec, location, 0); 3071 3011 if (num_pins > 0) { 3072 3012 spec->multi_ios = num_pins; 3073 3013 spec->ext_channel_count = 2; ··· 3077 3019 if (cfg->line_out_type != AUTO_PIN_HP_OUT) 3078 3020 alc_auto_fill_extra_dacs(codec, cfg->hp_outs, cfg->hp_pins, 3079 3021 spec->multiout.hp_out_nid); 3080 - if (cfg->line_out_type != AUTO_PIN_SPEAKER_OUT) 3081 - alc_auto_fill_extra_dacs(codec, cfg->speaker_outs, cfg->speaker_pins, 3082 - spec->multiout.extra_out_nid); 3022 + if (cfg->line_out_type != AUTO_PIN_SPEAKER_OUT) { 3023 + int err = alc_auto_fill_extra_dacs(codec, cfg->speaker_outs, 3024 + cfg->speaker_pins, 3025 + spec->multiout.extra_out_nid); 3026 + /* if no speaker volume is assigned, try again as the primary 3027 + * output 3028 + */ 3029 + if (!err && cfg->speaker_outs > 0 && 3030 + cfg->line_out_type == AUTO_PIN_HP_OUT) { 3031 + cfg->hp_outs = cfg->line_outs; 3032 + memcpy(cfg->hp_pins, cfg->line_out_pins, 3033 + sizeof(cfg->hp_pins)); 3034 + cfg->line_outs = cfg->speaker_outs; 3035 + memcpy(cfg->line_out_pins, cfg->speaker_pins, 3036 + sizeof(cfg->speaker_pins)); 3037 + cfg->speaker_outs = 0; 3038 + memset(cfg->speaker_pins, 0, sizeof(cfg->speaker_pins)); 3039 + cfg->line_out_type = AUTO_PIN_SPEAKER_OUT; 3040 + redone = false; 3041 + goto again; 3042 + } 3043 + } 3083 3044 3045 + if (!spec->multi_ios && 3046 + cfg->line_out_type == AUTO_PIN_SPEAKER_OUT && 3047 + cfg->hp_outs) { 3048 + /* try multi-ios with HP + inputs */ 3049 + defcfg = snd_hda_codec_get_pincfg(codec, cfg->hp_pins[0]); 3050 + location = get_defcfg_location(defcfg); 3051 + 3052 + num_pins = alc_auto_fill_multi_ios(codec, location, 1); 3053 + if (num_pins > 0) { 3054 + spec->multi_ios = num_pins; 3055 + spec->ext_channel_count = 2; 3056 + spec->multiout.num_dacs = num_pins + 1; 3057 + } 3058 + } 3059 + 3060 + if (cfg->line_out_pins[0]) 3061 + spec->vmaster_nid = 3062 + alc_look_for_out_vol_nid(codec, cfg->line_out_pins[0], 3063 + spec->multiout.dac_nids[0]); 3084 3064 return 0; 3085 3065 } 3086 3066 ··· 3150 3054 val); 3151 3055 } 3152 3056 3153 - #define alc_auto_add_stereo_vol(codec, pfx, cidx, nid) \ 3154 - alc_auto_add_vol_ctl(codec, pfx, cidx, nid, 3) 3057 + static int alc_auto_add_stereo_vol(struct hda_codec *codec, 3058 + const char *pfx, int cidx, 3059 + hda_nid_t nid) 3060 + { 3061 + int chs = 1; 3062 + if (get_wcaps(codec, nid) & AC_WCAP_STEREO) 3063 + chs = 3; 3064 + return alc_auto_add_vol_ctl(codec, pfx, cidx, nid, chs); 3065 + } 3155 3066 3156 3067 /* create a mute-switch for the given mixer widget; 3157 3068 * if it has multiple sources (e.g. DAC and loopback), create a bind-mute ··· 3190 3087 return __add_pb_sw_ctrl(codec->spec, type, pfx, cidx, val); 3191 3088 } 3192 3089 3193 - #define alc_auto_add_stereo_sw(codec, pfx, cidx, nid) \ 3194 - alc_auto_add_sw_ctl(codec, pfx, cidx, nid, 3) 3090 + static int alc_auto_add_stereo_sw(struct hda_codec *codec, const char *pfx, 3091 + int cidx, hda_nid_t nid) 3092 + { 3093 + int chs = 1; 3094 + if (get_wcaps(codec, nid) & AC_WCAP_STEREO) 3095 + chs = 3; 3096 + return alc_auto_add_sw_ctl(codec, pfx, cidx, nid, chs); 3097 + } 3195 3098 3196 3099 static hda_nid_t alc_look_for_out_mute_nid(struct hda_codec *codec, 3197 3100 hda_nid_t pin, hda_nid_t dac) ··· 3280 3171 } 3281 3172 3282 3173 static int alc_auto_create_extra_out(struct hda_codec *codec, hda_nid_t pin, 3283 - hda_nid_t dac, const char *pfx) 3174 + hda_nid_t dac, const char *pfx, 3175 + int cidx) 3284 3176 { 3285 3177 struct alc_spec *spec = codec->spec; 3286 3178 hda_nid_t sw, vol; ··· 3297 3187 if (is_ctl_used(spec->sw_ctls, val)) 3298 3188 return 0; /* already created */ 3299 3189 mark_ctl_usage(spec->sw_ctls, val); 3300 - return add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, pfx, val); 3190 + return __add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, pfx, cidx, val); 3301 3191 } 3302 3192 3303 3193 sw = alc_look_for_out_mute_nid(codec, pin, dac); 3304 3194 vol = alc_look_for_out_vol_nid(codec, pin, dac); 3305 - err = alc_auto_add_stereo_vol(codec, pfx, 0, vol); 3195 + err = alc_auto_add_stereo_vol(codec, pfx, cidx, vol); 3306 3196 if (err < 0) 3307 3197 return err; 3308 - err = alc_auto_add_stereo_sw(codec, pfx, 0, sw); 3198 + err = alc_auto_add_stereo_sw(codec, pfx, cidx, sw); 3309 3199 if (err < 0) 3310 3200 return err; 3311 3201 return 0; ··· 3346 3236 hda_nid_t dac = *dacs; 3347 3237 if (!dac) 3348 3238 dac = spec->multiout.dac_nids[0]; 3349 - return alc_auto_create_extra_out(codec, *pins, dac, pfx); 3239 + return alc_auto_create_extra_out(codec, *pins, dac, pfx, 0); 3350 3240 } 3351 3241 3352 3242 if (dacs[num_pins - 1]) { 3353 3243 /* OK, we have a multi-output system with individual volumes */ 3354 3244 for (i = 0; i < num_pins; i++) { 3355 - snprintf(name, sizeof(name), "%s %s", 3356 - pfx, channel_name[i]); 3357 - err = alc_auto_create_extra_out(codec, pins[i], dacs[i], 3358 - name); 3245 + if (num_pins >= 3) { 3246 + snprintf(name, sizeof(name), "%s %s", 3247 + pfx, channel_name[i]); 3248 + err = alc_auto_create_extra_out(codec, pins[i], dacs[i], 3249 + name, 0); 3250 + } else { 3251 + err = alc_auto_create_extra_out(codec, pins[i], dacs[i], 3252 + pfx, i); 3253 + } 3359 3254 if (err < 0) 3360 3255 return err; 3361 3256 } ··· 3523 3408 * multi-io helper 3524 3409 */ 3525 3410 static int alc_auto_fill_multi_ios(struct hda_codec *codec, 3526 - unsigned int location) 3411 + unsigned int location, 3412 + int offset) 3527 3413 { 3528 3414 struct alc_spec *spec = codec->spec; 3529 3415 struct auto_pin_cfg *cfg = &spec->autocfg; 3530 3416 hda_nid_t prime_dac = spec->private_dac_nids[0]; 3531 - int type, i, num_pins = 0; 3417 + int type, i, dacs, num_pins = 0; 3532 3418 3419 + dacs = spec->multiout.num_dacs; 3533 3420 for (type = AUTO_PIN_LINE_IN; type >= AUTO_PIN_MIC; type--) { 3534 3421 for (i = 0; i < cfg->num_inputs; i++) { 3535 3422 hda_nid_t nid = cfg->inputs[i].pin; 3536 - hda_nid_t dac; 3423 + hda_nid_t dac = 0; 3537 3424 unsigned int defcfg, caps; 3538 3425 if (cfg->inputs[i].type != type) 3539 3426 continue; ··· 3547 3430 caps = snd_hda_query_pin_caps(codec, nid); 3548 3431 if (!(caps & AC_PINCAP_OUT)) 3549 3432 continue; 3550 - dac = alc_auto_look_for_dac(codec, nid); 3433 + if (offset && offset + num_pins < dacs) { 3434 + dac = spec->private_dac_nids[offset + num_pins]; 3435 + if (!alc_auto_is_dac_reachable(codec, nid, dac)) 3436 + dac = 0; 3437 + } 3438 + if (!dac) 3439 + dac = alc_auto_look_for_dac(codec, nid); 3551 3440 if (!dac) 3552 3441 continue; 3553 3442 spec->multi_io[num_pins].pin = nid; ··· 3562 3439 spec->private_dac_nids[spec->multiout.num_dacs++] = dac; 3563 3440 } 3564 3441 } 3565 - spec->multiout.num_dacs = 1; 3442 + spec->multiout.num_dacs = dacs; 3566 3443 if (num_pins < 2) { 3567 3444 /* clear up again */ 3568 - memset(spec->private_dac_nids, 0, 3569 - sizeof(spec->private_dac_nids)); 3445 + memset(spec->private_dac_nids + dacs, 0, 3446 + sizeof(hda_nid_t) * (AUTO_CFG_MAX_OUTS - dacs)); 3570 3447 spec->private_dac_nids[0] = prime_dac; 3571 3448 return 0; 3572 3449 } ··· 3790 3667 char boost_label[32]; 3791 3668 3792 3669 label = hda_get_autocfg_input_label(codec, cfg, i); 3670 + if (spec->shared_mic_hp && !strcmp(label, "Misc")) 3671 + label = "Headphone Mic"; 3793 3672 if (prev_label && !strcmp(label, prev_label)) 3794 3673 type_idx++; 3795 3674 else ··· 3904 3779 static void alc_auto_init_std(struct hda_codec *codec) 3905 3780 { 3906 3781 struct alc_spec *spec = codec->spec; 3782 + spec->use_jack_tbl = 1; 3907 3783 alc_auto_init_multi_out(codec); 3908 3784 alc_auto_init_extra_out(codec); 3909 3785 alc_auto_init_analog_input(codec); ··· 3997 3871 err = alc_auto_create_speaker_out(codec); 3998 3872 if (err < 0) 3999 3873 return err; 3874 + err = alc_auto_create_shared_input(codec); 3875 + if (err < 0) 3876 + return err; 4000 3877 err = alc_auto_create_input_ctls(codec); 4001 3878 if (err < 0) 4002 3879 return err; ··· 4047 3918 #endif 4048 3919 4049 3920 /* 3921 + * ALC880 fix-ups 3922 + */ 3923 + enum { 3924 + ALC880_FIXUP_GPIO2, 3925 + ALC880_FIXUP_MEDION_RIM, 3926 + }; 3927 + 3928 + static const struct alc_fixup alc880_fixups[] = { 3929 + [ALC880_FIXUP_GPIO2] = { 3930 + .type = ALC_FIXUP_VERBS, 3931 + .v.verbs = alc_gpio2_init_verbs, 3932 + }, 3933 + [ALC880_FIXUP_MEDION_RIM] = { 3934 + .type = ALC_FIXUP_VERBS, 3935 + .v.verbs = (const struct hda_verb[]) { 3936 + { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 }, 3937 + { 0x20, AC_VERB_SET_PROC_COEF, 0x3060 }, 3938 + { } 3939 + }, 3940 + .chained = true, 3941 + .chain_id = ALC880_FIXUP_GPIO2, 3942 + }, 3943 + }; 3944 + 3945 + static const struct snd_pci_quirk alc880_fixup_tbl[] = { 3946 + SND_PCI_QUIRK(0x161f, 0x205d, "Medion Rim 2150", ALC880_FIXUP_MEDION_RIM), 3947 + {} 3948 + }; 3949 + 3950 + 3951 + /* 4050 3952 * board setups 4051 3953 */ 4052 3954 #ifdef CONFIG_SND_HDA_ENABLE_REALTEK_QUIRKS ··· 4123 3963 } 4124 3964 4125 3965 if (board_config == ALC_MODEL_AUTO) { 3966 + alc_pick_fixup(codec, NULL, alc880_fixup_tbl, alc880_fixups); 3967 + alc_apply_fixup(codec, ALC_FIXUP_ACT_PRE_PROBE); 3968 + } 3969 + 3970 + if (board_config == ALC_MODEL_AUTO) { 4126 3971 /* automatic parse from the BIOS config */ 4127 3972 err = alc880_parse_auto_config(codec); 4128 3973 if (err < 0) ··· 4142 3977 #endif 4143 3978 } 4144 3979 4145 - if (board_config != ALC_MODEL_AUTO) 3980 + if (board_config != ALC_MODEL_AUTO) { 3981 + spec->vmaster_nid = 0x0c; 4146 3982 setup_preset(codec, &alc880_presets[board_config]); 3983 + } 4147 3984 4148 3985 if (!spec->no_analog && !spec->adc_nids) { 4149 3986 alc_auto_fill_adc_caps(codec); ··· 4163 3996 set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT); 4164 3997 } 4165 3998 4166 - spec->vmaster_nid = 0x0c; 3999 + alc_apply_fixup(codec, ALC_FIXUP_ACT_PROBE); 4167 4000 4168 4001 codec->patch_ops = alc_patch_ops; 4169 4002 if (board_config == ALC_MODEL_AUTO) ··· 4271 4104 #endif 4272 4105 } 4273 4106 4274 - if (board_config != ALC_MODEL_AUTO) 4107 + if (board_config != ALC_MODEL_AUTO) { 4275 4108 setup_preset(codec, &alc260_presets[board_config]); 4109 + spec->vmaster_nid = 0x08; 4110 + } 4276 4111 4277 4112 if (!spec->no_analog && !spec->adc_nids) { 4278 4113 alc_auto_fill_adc_caps(codec); ··· 4293 4124 } 4294 4125 4295 4126 alc_apply_fixup(codec, ALC_FIXUP_ACT_PROBE); 4296 - 4297 - spec->vmaster_nid = 0x08; 4298 4127 4299 4128 codec->patch_ops = alc_patch_ops; 4300 4129 if (board_config == ALC_MODEL_AUTO) ··· 4330 4163 * Pin config fixes 4331 4164 */ 4332 4165 enum { 4333 - PINFIX_ABIT_AW9D_MAX, 4334 - PINFIX_LENOVO_Y530, 4335 - PINFIX_PB_M5210, 4336 - PINFIX_ACER_ASPIRE_7736, 4337 - PINFIX_ASUS_W90V, 4166 + ALC882_FIXUP_ABIT_AW9D_MAX, 4167 + ALC882_FIXUP_LENOVO_Y530, 4168 + ALC882_FIXUP_PB_M5210, 4169 + ALC882_FIXUP_ACER_ASPIRE_7736, 4170 + ALC882_FIXUP_ASUS_W90V, 4171 + ALC889_FIXUP_VAIO_TT, 4172 + ALC888_FIXUP_EEE1601, 4173 + ALC882_FIXUP_EAPD, 4174 + ALC883_FIXUP_EAPD, 4175 + ALC883_FIXUP_ACER_EAPD, 4176 + ALC882_FIXUP_GPIO3, 4177 + ALC889_FIXUP_COEF, 4178 + ALC882_FIXUP_ASUS_W2JC, 4179 + ALC882_FIXUP_ACER_ASPIRE_4930G, 4180 + ALC882_FIXUP_ACER_ASPIRE_8930G, 4181 + ALC882_FIXUP_ASPIRE_8930G_VERBS, 4182 + ALC885_FIXUP_MACPRO_GPIO, 4338 4183 }; 4339 4184 4185 + static void alc889_fixup_coef(struct hda_codec *codec, 4186 + const struct alc_fixup *fix, int action) 4187 + { 4188 + if (action != ALC_FIXUP_ACT_INIT) 4189 + return; 4190 + alc889_coef_init(codec); 4191 + } 4192 + 4193 + /* toggle speaker-output according to the hp-jack state */ 4194 + static void alc882_gpio_mute(struct hda_codec *codec, int pin, int muted) 4195 + { 4196 + unsigned int gpiostate, gpiomask, gpiodir; 4197 + 4198 + gpiostate = snd_hda_codec_read(codec, codec->afg, 0, 4199 + AC_VERB_GET_GPIO_DATA, 0); 4200 + 4201 + if (!muted) 4202 + gpiostate |= (1 << pin); 4203 + else 4204 + gpiostate &= ~(1 << pin); 4205 + 4206 + gpiomask = snd_hda_codec_read(codec, codec->afg, 0, 4207 + AC_VERB_GET_GPIO_MASK, 0); 4208 + gpiomask |= (1 << pin); 4209 + 4210 + gpiodir = snd_hda_codec_read(codec, codec->afg, 0, 4211 + AC_VERB_GET_GPIO_DIRECTION, 0); 4212 + gpiodir |= (1 << pin); 4213 + 4214 + 4215 + snd_hda_codec_write(codec, codec->afg, 0, 4216 + AC_VERB_SET_GPIO_MASK, gpiomask); 4217 + snd_hda_codec_write(codec, codec->afg, 0, 4218 + AC_VERB_SET_GPIO_DIRECTION, gpiodir); 4219 + 4220 + msleep(1); 4221 + 4222 + snd_hda_codec_write(codec, codec->afg, 0, 4223 + AC_VERB_SET_GPIO_DATA, gpiostate); 4224 + } 4225 + 4226 + /* set up GPIO at initialization */ 4227 + static void alc885_fixup_macpro_gpio(struct hda_codec *codec, 4228 + const struct alc_fixup *fix, int action) 4229 + { 4230 + if (action != ALC_FIXUP_ACT_INIT) 4231 + return; 4232 + alc882_gpio_mute(codec, 0, 0); 4233 + alc882_gpio_mute(codec, 1, 0); 4234 + } 4235 + 4340 4236 static const struct alc_fixup alc882_fixups[] = { 4341 - [PINFIX_ABIT_AW9D_MAX] = { 4237 + [ALC882_FIXUP_ABIT_AW9D_MAX] = { 4342 4238 .type = ALC_FIXUP_PINS, 4343 4239 .v.pins = (const struct alc_pincfg[]) { 4344 4240 { 0x15, 0x01080104 }, /* side */ ··· 4410 4180 { } 4411 4181 } 4412 4182 }, 4413 - [PINFIX_LENOVO_Y530] = { 4183 + [ALC882_FIXUP_LENOVO_Y530] = { 4414 4184 .type = ALC_FIXUP_PINS, 4415 4185 .v.pins = (const struct alc_pincfg[]) { 4416 4186 { 0x15, 0x99130112 }, /* rear int speakers */ ··· 4418 4188 { } 4419 4189 } 4420 4190 }, 4421 - [PINFIX_PB_M5210] = { 4191 + [ALC882_FIXUP_PB_M5210] = { 4422 4192 .type = ALC_FIXUP_VERBS, 4423 4193 .v.verbs = (const struct hda_verb[]) { 4424 4194 { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50 }, 4425 4195 {} 4426 4196 } 4427 4197 }, 4428 - [PINFIX_ACER_ASPIRE_7736] = { 4198 + [ALC882_FIXUP_ACER_ASPIRE_7736] = { 4429 4199 .type = ALC_FIXUP_SKU, 4430 4200 .v.sku = ALC_FIXUP_SKU_IGNORE, 4431 4201 }, 4432 - [PINFIX_ASUS_W90V] = { 4202 + [ALC882_FIXUP_ASUS_W90V] = { 4433 4203 .type = ALC_FIXUP_PINS, 4434 4204 .v.pins = (const struct alc_pincfg[]) { 4435 4205 { 0x16, 0x99130110 }, /* fix sequence for CLFE */ 4436 4206 { } 4437 4207 } 4438 4208 }, 4209 + [ALC889_FIXUP_VAIO_TT] = { 4210 + .type = ALC_FIXUP_PINS, 4211 + .v.pins = (const struct alc_pincfg[]) { 4212 + { 0x17, 0x90170111 }, /* hidden surround speaker */ 4213 + { } 4214 + } 4215 + }, 4216 + [ALC888_FIXUP_EEE1601] = { 4217 + .type = ALC_FIXUP_VERBS, 4218 + .v.verbs = (const struct hda_verb[]) { 4219 + { 0x20, AC_VERB_SET_COEF_INDEX, 0x0b }, 4220 + { 0x20, AC_VERB_SET_PROC_COEF, 0x0838 }, 4221 + { } 4222 + } 4223 + }, 4224 + [ALC882_FIXUP_EAPD] = { 4225 + .type = ALC_FIXUP_VERBS, 4226 + .v.verbs = (const struct hda_verb[]) { 4227 + /* change to EAPD mode */ 4228 + { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 }, 4229 + { 0x20, AC_VERB_SET_PROC_COEF, 0x3060 }, 4230 + { } 4231 + } 4232 + }, 4233 + [ALC883_FIXUP_EAPD] = { 4234 + .type = ALC_FIXUP_VERBS, 4235 + .v.verbs = (const struct hda_verb[]) { 4236 + /* change to EAPD mode */ 4237 + { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 }, 4238 + { 0x20, AC_VERB_SET_PROC_COEF, 0x3070 }, 4239 + { } 4240 + } 4241 + }, 4242 + [ALC883_FIXUP_ACER_EAPD] = { 4243 + .type = ALC_FIXUP_VERBS, 4244 + .v.verbs = (const struct hda_verb[]) { 4245 + /* eanable EAPD on Acer laptops */ 4246 + { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 }, 4247 + { 0x20, AC_VERB_SET_PROC_COEF, 0x3050 }, 4248 + { } 4249 + } 4250 + }, 4251 + [ALC882_FIXUP_GPIO3] = { 4252 + .type = ALC_FIXUP_VERBS, 4253 + .v.verbs = alc_gpio3_init_verbs, 4254 + }, 4255 + [ALC882_FIXUP_ASUS_W2JC] = { 4256 + .type = ALC_FIXUP_VERBS, 4257 + .v.verbs = alc_gpio1_init_verbs, 4258 + .chained = true, 4259 + .chain_id = ALC882_FIXUP_EAPD, 4260 + }, 4261 + [ALC889_FIXUP_COEF] = { 4262 + .type = ALC_FIXUP_FUNC, 4263 + .v.func = alc889_fixup_coef, 4264 + }, 4265 + [ALC882_FIXUP_ACER_ASPIRE_4930G] = { 4266 + .type = ALC_FIXUP_PINS, 4267 + .v.pins = (const struct alc_pincfg[]) { 4268 + { 0x16, 0x99130111 }, /* CLFE speaker */ 4269 + { 0x17, 0x99130112 }, /* surround speaker */ 4270 + { } 4271 + } 4272 + }, 4273 + [ALC882_FIXUP_ACER_ASPIRE_8930G] = { 4274 + .type = ALC_FIXUP_PINS, 4275 + .v.pins = (const struct alc_pincfg[]) { 4276 + { 0x16, 0x99130111 }, /* CLFE speaker */ 4277 + { 0x1b, 0x99130112 }, /* surround speaker */ 4278 + { } 4279 + }, 4280 + .chained = true, 4281 + .chain_id = ALC882_FIXUP_ASPIRE_8930G_VERBS, 4282 + }, 4283 + [ALC882_FIXUP_ASPIRE_8930G_VERBS] = { 4284 + /* additional init verbs for Acer Aspire 8930G */ 4285 + .type = ALC_FIXUP_VERBS, 4286 + .v.verbs = (const struct hda_verb[]) { 4287 + /* Enable all DACs */ 4288 + /* DAC DISABLE/MUTE 1? */ 4289 + /* setting bits 1-5 disables DAC nids 0x02-0x06 4290 + * apparently. Init=0x38 */ 4291 + { 0x20, AC_VERB_SET_COEF_INDEX, 0x03 }, 4292 + { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 }, 4293 + /* DAC DISABLE/MUTE 2? */ 4294 + /* some bit here disables the other DACs. 4295 + * Init=0x4900 */ 4296 + { 0x20, AC_VERB_SET_COEF_INDEX, 0x08 }, 4297 + { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 }, 4298 + /* DMIC fix 4299 + * This laptop has a stereo digital microphone. 4300 + * The mics are only 1cm apart which makes the stereo 4301 + * useless. However, either the mic or the ALC889 4302 + * makes the signal become a difference/sum signal 4303 + * instead of standard stereo, which is annoying. 4304 + * So instead we flip this bit which makes the 4305 + * codec replicate the sum signal to both channels, 4306 + * turning it into a normal mono mic. 4307 + */ 4308 + /* DMIC_CONTROL? Init value = 0x0001 */ 4309 + { 0x20, AC_VERB_SET_COEF_INDEX, 0x0b }, 4310 + { 0x20, AC_VERB_SET_PROC_COEF, 0x0003 }, 4311 + { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 }, 4312 + { 0x20, AC_VERB_SET_PROC_COEF, 0x3050 }, 4313 + { } 4314 + } 4315 + }, 4316 + [ALC885_FIXUP_MACPRO_GPIO] = { 4317 + .type = ALC_FIXUP_FUNC, 4318 + .v.func = alc885_fixup_macpro_gpio, 4319 + }, 4439 4320 }; 4440 4321 4441 4322 static const struct snd_pci_quirk alc882_fixup_tbl[] = { 4442 - SND_PCI_QUIRK(0x1025, 0x0155, "Packard-Bell M5120", PINFIX_PB_M5210), 4443 - SND_PCI_QUIRK(0x1043, 0x1873, "ASUS W90V", PINFIX_ASUS_W90V), 4444 - SND_PCI_QUIRK(0x17aa, 0x3a0d, "Lenovo Y530", PINFIX_LENOVO_Y530), 4445 - SND_PCI_QUIRK(0x147b, 0x107a, "Abit AW9D-MAX", PINFIX_ABIT_AW9D_MAX), 4446 - SND_PCI_QUIRK(0x1025, 0x0296, "Acer Aspire 7736z", PINFIX_ACER_ASPIRE_7736), 4323 + SND_PCI_QUIRK(0x1025, 0x006c, "Acer Aspire 9810", ALC883_FIXUP_ACER_EAPD), 4324 + SND_PCI_QUIRK(0x1025, 0x0090, "Acer Aspire", ALC883_FIXUP_ACER_EAPD), 4325 + SND_PCI_QUIRK(0x1025, 0x010a, "Acer Ferrari 5000", ALC883_FIXUP_ACER_EAPD), 4326 + SND_PCI_QUIRK(0x1025, 0x0110, "Acer Aspire", ALC883_FIXUP_ACER_EAPD), 4327 + SND_PCI_QUIRK(0x1025, 0x0112, "Acer Aspire 9303", ALC883_FIXUP_ACER_EAPD), 4328 + SND_PCI_QUIRK(0x1025, 0x0121, "Acer Aspire 5920G", ALC883_FIXUP_ACER_EAPD), 4329 + SND_PCI_QUIRK(0x1025, 0x013e, "Acer Aspire 4930G", 4330 + ALC882_FIXUP_ACER_ASPIRE_4930G), 4331 + SND_PCI_QUIRK(0x1025, 0x013f, "Acer Aspire 5930G", 4332 + ALC882_FIXUP_ACER_ASPIRE_4930G), 4333 + SND_PCI_QUIRK(0x1025, 0x0145, "Acer Aspire 8930G", 4334 + ALC882_FIXUP_ACER_ASPIRE_8930G), 4335 + SND_PCI_QUIRK(0x1025, 0x0146, "Acer Aspire 6935G", 4336 + ALC882_FIXUP_ACER_ASPIRE_8930G), 4337 + SND_PCI_QUIRK(0x1025, 0x015e, "Acer Aspire 6930G", 4338 + ALC882_FIXUP_ACER_ASPIRE_4930G), 4339 + SND_PCI_QUIRK(0x1025, 0x0166, "Acer Aspire 6530G", 4340 + ALC882_FIXUP_ACER_ASPIRE_4930G), 4341 + SND_PCI_QUIRK(0x1025, 0x0142, "Acer Aspire 7730G", 4342 + ALC882_FIXUP_ACER_ASPIRE_4930G), 4343 + SND_PCI_QUIRK(0x1025, 0x0155, "Packard-Bell M5120", ALC882_FIXUP_PB_M5210), 4344 + SND_PCI_QUIRK(0x1025, 0x0296, "Acer Aspire 7736z", ALC882_FIXUP_ACER_ASPIRE_7736), 4345 + SND_PCI_QUIRK(0x1043, 0x13c2, "Asus A7M", ALC882_FIXUP_EAPD), 4346 + SND_PCI_QUIRK(0x1043, 0x1873, "ASUS W90V", ALC882_FIXUP_ASUS_W90V), 4347 + SND_PCI_QUIRK(0x1043, 0x1971, "Asus W2JC", ALC882_FIXUP_ASUS_W2JC), 4348 + SND_PCI_QUIRK(0x1043, 0x835f, "Asus Eee 1601", ALC888_FIXUP_EEE1601), 4349 + SND_PCI_QUIRK(0x104d, 0x9047, "Sony Vaio TT", ALC889_FIXUP_VAIO_TT), 4350 + 4351 + /* All Apple entries are in codec SSIDs */ 4352 + SND_PCI_QUIRK(0x106b, 0x0c00, "Mac Pro", ALC885_FIXUP_MACPRO_GPIO), 4353 + SND_PCI_QUIRK(0x106b, 0x1000, "iMac 24", ALC885_FIXUP_MACPRO_GPIO), 4354 + SND_PCI_QUIRK(0x106b, 0x2800, "AppleTV", ALC885_FIXUP_MACPRO_GPIO), 4355 + SND_PCI_QUIRK(0x106b, 0x3200, "iMac 7,1 Aluminum", ALC882_FIXUP_EAPD), 4356 + SND_PCI_QUIRK(0x106b, 0x3e00, "iMac 24 Aluminum", ALC885_FIXUP_MACPRO_GPIO), 4357 + 4358 + SND_PCI_QUIRK(0x1071, 0x8258, "Evesham Voyaeger", ALC882_FIXUP_EAPD), 4359 + SND_PCI_QUIRK_VENDOR(0x1462, "MSI", ALC882_FIXUP_GPIO3), 4360 + SND_PCI_QUIRK(0x147b, 0x107a, "Abit AW9D-MAX", ALC882_FIXUP_ABIT_AW9D_MAX), 4361 + SND_PCI_QUIRK_VENDOR(0x1558, "Clevo laptop", ALC882_FIXUP_EAPD), 4362 + SND_PCI_QUIRK(0x161f, 0x2054, "Medion laptop", ALC883_FIXUP_EAPD), 4363 + SND_PCI_QUIRK(0x17aa, 0x3a0d, "Lenovo Y530", ALC882_FIXUP_LENOVO_Y530), 4364 + SND_PCI_QUIRK(0x8086, 0x0022, "DX58SO", ALC889_FIXUP_COEF), 4447 4365 {} 4448 4366 }; 4449 4367 ··· 4640 4262 goto error; 4641 4263 4642 4264 board_config = alc_board_config(codec, ALC882_MODEL_LAST, 4643 - alc882_models, alc882_cfg_tbl); 4644 - 4265 + alc882_models, NULL); 4645 4266 if (board_config < 0) 4646 4267 board_config = alc_board_codec_sid_config(codec, 4647 4268 ALC882_MODEL_LAST, alc882_models, alc882_ssid_cfg_tbl); ··· 4663 4286 err = alc882_parse_auto_config(codec); 4664 4287 if (err < 0) 4665 4288 goto error; 4666 - #ifdef CONFIG_SND_HDA_ENABLE_REALTEK_QUIRKS 4667 - else if (!err) { 4668 - printk(KERN_INFO 4669 - "hda_codec: Cannot set up configuration " 4670 - "from BIOS. Using base mode...\n"); 4671 - board_config = ALC882_3ST_DIG; 4672 - } 4673 - #endif 4674 4289 } 4675 4290 4676 - if (board_config != ALC_MODEL_AUTO) 4291 + if (board_config != ALC_MODEL_AUTO) { 4677 4292 setup_preset(codec, &alc882_presets[board_config]); 4293 + spec->vmaster_nid = 0x0c; 4294 + } 4678 4295 4679 4296 if (!spec->no_analog && !spec->adc_nids) { 4680 4297 alc_auto_fill_adc_caps(codec); ··· 4688 4317 4689 4318 alc_apply_fixup(codec, ALC_FIXUP_ACT_PROBE); 4690 4319 4691 - spec->vmaster_nid = 0x0c; 4692 - 4693 4320 codec->patch_ops = alc_patch_ops; 4694 4321 if (board_config == ALC_MODEL_AUTO) 4695 4322 spec->init_hook = alc_auto_init_std; 4696 4323 4697 - alc_init_jacks(codec); 4698 4324 #ifdef CONFIG_SND_HDA_POWER_SAVE 4699 4325 if (!spec->loopback.amplist) 4700 4326 spec->loopback.amplist = alc882_loopbacks; ··· 4719 4351 * Pin config fixes 4720 4352 */ 4721 4353 enum { 4722 - PINFIX_FSC_H270, 4723 - PINFIX_HP_Z200, 4354 + ALC262_FIXUP_FSC_H270, 4355 + ALC262_FIXUP_HP_Z200, 4356 + ALC262_FIXUP_TYAN, 4357 + ALC262_FIXUP_TOSHIBA_RX1, 4358 + ALC262_FIXUP_LENOVO_3000, 4359 + ALC262_FIXUP_BENQ, 4360 + ALC262_FIXUP_BENQ_T31, 4724 4361 }; 4725 4362 4726 4363 static const struct alc_fixup alc262_fixups[] = { 4727 - [PINFIX_FSC_H270] = { 4364 + [ALC262_FIXUP_FSC_H270] = { 4728 4365 .type = ALC_FIXUP_PINS, 4729 4366 .v.pins = (const struct alc_pincfg[]) { 4730 4367 { 0x14, 0x99130110 }, /* speaker */ ··· 4738 4365 { } 4739 4366 } 4740 4367 }, 4741 - [PINFIX_HP_Z200] = { 4368 + [ALC262_FIXUP_HP_Z200] = { 4742 4369 .type = ALC_FIXUP_PINS, 4743 4370 .v.pins = (const struct alc_pincfg[]) { 4744 4371 { 0x16, 0x99130120 }, /* internal speaker */ 4745 4372 { } 4746 4373 } 4747 4374 }, 4375 + [ALC262_FIXUP_TYAN] = { 4376 + .type = ALC_FIXUP_PINS, 4377 + .v.pins = (const struct alc_pincfg[]) { 4378 + { 0x14, 0x1993e1f0 }, /* int AUX */ 4379 + { } 4380 + } 4381 + }, 4382 + [ALC262_FIXUP_TOSHIBA_RX1] = { 4383 + .type = ALC_FIXUP_PINS, 4384 + .v.pins = (const struct alc_pincfg[]) { 4385 + { 0x14, 0x90170110 }, /* speaker */ 4386 + { 0x15, 0x0421101f }, /* HP */ 4387 + { 0x1a, 0x40f000f0 }, /* N/A */ 4388 + { 0x1b, 0x40f000f0 }, /* N/A */ 4389 + { 0x1e, 0x40f000f0 }, /* N/A */ 4390 + } 4391 + }, 4392 + [ALC262_FIXUP_LENOVO_3000] = { 4393 + .type = ALC_FIXUP_VERBS, 4394 + .v.verbs = (const struct hda_verb[]) { 4395 + { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50 }, 4396 + {} 4397 + }, 4398 + .chained = true, 4399 + .chain_id = ALC262_FIXUP_BENQ, 4400 + }, 4401 + [ALC262_FIXUP_BENQ] = { 4402 + .type = ALC_FIXUP_VERBS, 4403 + .v.verbs = (const struct hda_verb[]) { 4404 + { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 }, 4405 + { 0x20, AC_VERB_SET_PROC_COEF, 0x3070 }, 4406 + {} 4407 + } 4408 + }, 4409 + [ALC262_FIXUP_BENQ_T31] = { 4410 + .type = ALC_FIXUP_VERBS, 4411 + .v.verbs = (const struct hda_verb[]) { 4412 + { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 }, 4413 + { 0x20, AC_VERB_SET_PROC_COEF, 0x3050 }, 4414 + {} 4415 + } 4416 + }, 4748 4417 }; 4749 4418 4750 4419 static const struct snd_pci_quirk alc262_fixup_tbl[] = { 4751 - SND_PCI_QUIRK(0x103c, 0x170b, "HP Z200", PINFIX_HP_Z200), 4752 - SND_PCI_QUIRK(0x1734, 0x1147, "FSC Celsius H270", PINFIX_FSC_H270), 4420 + SND_PCI_QUIRK(0x103c, 0x170b, "HP Z200", ALC262_FIXUP_HP_Z200), 4421 + SND_PCI_QUIRK(0x10cf, 0x1397, "Fujitsu", ALC262_FIXUP_BENQ), 4422 + SND_PCI_QUIRK(0x10cf, 0x142d, "Fujitsu Lifebook E8410", ALC262_FIXUP_BENQ), 4423 + SND_PCI_QUIRK(0x10f1, 0x2915, "Tyan Thunder n6650W", ALC262_FIXUP_TYAN), 4424 + SND_PCI_QUIRK(0x1179, 0x0001, "Toshiba dynabook SS RX1", 4425 + ALC262_FIXUP_TOSHIBA_RX1), 4426 + SND_PCI_QUIRK(0x1734, 0x1147, "FSC Celsius H270", ALC262_FIXUP_FSC_H270), 4427 + SND_PCI_QUIRK(0x17aa, 0x384e, "Lenovo 3000", ALC262_FIXUP_LENOVO_3000), 4428 + SND_PCI_QUIRK(0x17ff, 0x0560, "Benq ED8", ALC262_FIXUP_BENQ), 4429 + SND_PCI_QUIRK(0x17ff, 0x058d, "Benq T31-16", ALC262_FIXUP_BENQ_T31), 4753 4430 {} 4754 4431 }; 4755 4432 ··· 4810 4387 4811 4388 /* 4812 4389 */ 4813 - #ifdef CONFIG_SND_HDA_ENABLE_REALTEK_QUIRKS 4814 - #include "alc262_quirks.c" 4815 - #endif 4816 - 4817 4390 static int patch_alc262(struct hda_codec *codec) 4818 4391 { 4819 4392 struct alc_spec *spec; 4820 - int board_config; 4821 4393 int err; 4822 4394 4823 4395 spec = kzalloc(sizeof(*spec), GFP_KERNEL); ··· 4839 4421 4840 4422 alc_fix_pll_init(codec, 0x20, 0x0a, 10); 4841 4423 4842 - board_config = alc_board_config(codec, ALC262_MODEL_LAST, 4843 - alc262_models, alc262_cfg_tbl); 4424 + alc_pick_fixup(codec, NULL, alc262_fixup_tbl, alc262_fixups); 4425 + alc_apply_fixup(codec, ALC_FIXUP_ACT_PRE_PROBE); 4844 4426 4845 - if (board_config < 0) { 4846 - printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n", 4847 - codec->chip_name); 4848 - board_config = ALC_MODEL_AUTO; 4849 - } 4850 - 4851 - if (board_config == ALC_MODEL_AUTO) { 4852 - alc_pick_fixup(codec, NULL, alc262_fixup_tbl, alc262_fixups); 4853 - alc_apply_fixup(codec, ALC_FIXUP_ACT_PRE_PROBE); 4854 - } 4855 - 4856 - if (board_config == ALC_MODEL_AUTO) { 4857 - /* automatic parse from the BIOS config */ 4858 - err = alc262_parse_auto_config(codec); 4859 - if (err < 0) 4860 - goto error; 4861 - #ifdef CONFIG_SND_HDA_ENABLE_REALTEK_QUIRKS 4862 - else if (!err) { 4863 - printk(KERN_INFO 4864 - "hda_codec: Cannot set up configuration " 4865 - "from BIOS. Using base mode...\n"); 4866 - board_config = ALC262_BASIC; 4867 - } 4868 - #endif 4869 - } 4870 - 4871 - if (board_config != ALC_MODEL_AUTO) 4872 - setup_preset(codec, &alc262_presets[board_config]); 4427 + /* automatic parse from the BIOS config */ 4428 + err = alc262_parse_auto_config(codec); 4429 + if (err < 0) 4430 + goto error; 4873 4431 4874 4432 if (!spec->no_analog && !spec->adc_nids) { 4875 4433 alc_auto_fill_adc_caps(codec); ··· 4865 4471 4866 4472 alc_apply_fixup(codec, ALC_FIXUP_ACT_PROBE); 4867 4473 4868 - spec->vmaster_nid = 0x0c; 4869 - 4870 4474 codec->patch_ops = alc_patch_ops; 4871 - if (board_config == ALC_MODEL_AUTO) 4872 - spec->init_hook = alc_auto_init_std; 4475 + spec->init_hook = alc_auto_init_std; 4873 4476 spec->shutup = alc_eapd_shutup; 4874 4477 4875 - alc_init_jacks(codec); 4876 4478 #ifdef CONFIG_SND_HDA_POWER_SAVE 4877 4479 if (!spec->loopback.amplist) 4878 4480 spec->loopback.amplist = alc262_loopbacks; ··· 4975 4585 if (!spec->no_analog && !spec->cap_mixer) 4976 4586 set_capture_mixer(codec); 4977 4587 4978 - spec->vmaster_nid = 0x02; 4979 - 4980 4588 codec->patch_ops = alc_patch_ops; 4981 4589 spec->init_hook = alc_auto_init_std; 4982 4590 spec->shutup = alc_eapd_shutup; 4983 - 4984 - alc_init_jacks(codec); 4985 4591 4986 4592 return 0; 4987 4593 ··· 5320 4934 { } 5321 4935 }, 5322 4936 }, 5323 - [ALC269_FIXUP_DMIC] = { 4937 + [ALC269VB_FIXUP_DMIC] = { 5324 4938 .type = ALC_FIXUP_PINS, 5325 4939 .v.pins = (const struct alc_pincfg[]) { 5326 4940 { 0x12, 0x99a3092f }, /* int-mic */ ··· 5527 5141 5528 5142 alc_apply_fixup(codec, ALC_FIXUP_ACT_PROBE); 5529 5143 5530 - spec->vmaster_nid = 0x02; 5531 - 5532 5144 codec->patch_ops = alc_patch_ops; 5533 5145 #ifdef CONFIG_PM 5534 5146 codec->patch_ops.resume = alc269_resume; ··· 5534 5150 spec->init_hook = alc_auto_init_std; 5535 5151 spec->shutup = alc269_shutup; 5536 5152 5537 - alc_init_jacks(codec); 5538 5153 #ifdef CONFIG_SND_HDA_POWER_SAVE 5539 5154 if (!spec->loopback.amplist) 5540 5155 spec->loopback.amplist = alc269_loopbacks; ··· 5629 5246 goto error; 5630 5247 set_beep_amp(spec, 0x23, 0, HDA_OUTPUT); 5631 5248 } 5632 - 5633 - spec->vmaster_nid = 0x03; 5634 5249 5635 5250 alc_apply_fixup(codec, ALC_FIXUP_ACT_PROBE); 5636 5251 ··· 5753 5372 goto error; 5754 5373 set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT); 5755 5374 } 5756 - 5757 - spec->vmaster_nid = 0x02; 5758 5375 5759 5376 alc_apply_fixup(codec, ALC_FIXUP_ACT_PROBE); 5760 5377 ··· 6136 5757 break; 6137 5758 } 6138 5759 } 6139 - spec->vmaster_nid = 0x02; 6140 5760 6141 5761 alc_apply_fixup(codec, ALC_FIXUP_ACT_PROBE); 6142 5762 6143 5763 codec->patch_ops = alc_patch_ops; 6144 5764 spec->init_hook = alc_auto_init_std; 6145 5765 spec->shutup = alc_eapd_shutup; 6146 - 6147 - alc_init_jacks(codec); 6148 5766 6149 5767 #ifdef CONFIG_SND_HDA_POWER_SAVE 6150 5768 if (!spec->loopback.amplist) ··· 6188 5812 6189 5813 if (!spec->no_analog && !spec->cap_mixer) 6190 5814 set_capture_mixer(codec); 6191 - 6192 - spec->vmaster_nid = 0x02; 6193 5815 6194 5816 codec->patch_ops = alc_patch_ops; 6195 5817 spec->init_hook = alc_auto_init_std;
+118 -183
sound/pci/hda/patch_sigmatel.c
··· 37 37 #include "hda_codec.h" 38 38 #include "hda_local.h" 39 39 #include "hda_beep.h" 40 + #include "hda_jack.h" 40 41 41 42 enum { 42 43 STAC_VREF_EVENT = 1, ··· 97 96 STAC_92HD83XXX_PWR_REF, 98 97 STAC_DELL_S14, 99 98 STAC_DELL_VOSTRO_3500, 100 - STAC_92HD83XXX_HP, 101 99 STAC_92HD83XXX_HP_cNB11_INTQUAD, 102 100 STAC_HP_DV7_4000, 103 101 STAC_92HD83XXX_MODELS ··· 176 176 STAC_9872_MODELS 177 177 }; 178 178 179 - struct sigmatel_event { 180 - hda_nid_t nid; 181 - unsigned char type; 182 - unsigned char tag; 183 - int data; 184 - }; 185 - 186 179 struct sigmatel_mic_route { 187 180 hda_nid_t pin; 188 181 signed char mux_idx; ··· 208 215 unsigned int gpio_mute; 209 216 unsigned int gpio_led; 210 217 unsigned int gpio_led_polarity; 218 + unsigned int vref_mute_led_nid; /* pin NID for mute-LED vref control */ 211 219 unsigned int vref_led; 212 220 213 221 /* stream */ ··· 223 229 unsigned int num_pwrs; 224 230 const hda_nid_t *pwr_nids; 225 231 const hda_nid_t *dac_list; 226 - 227 - /* events */ 228 - struct snd_array events; 229 232 230 233 /* playback */ 231 234 struct hda_input_mux *mono_mux; ··· 1084 1093 }; 1085 1094 1086 1095 static void stac92xx_free_kctls(struct hda_codec *codec); 1087 - static int stac92xx_add_jack(struct hda_codec *codec, hda_nid_t nid, int type); 1088 1096 1089 1097 static int stac92xx_build_controls(struct hda_codec *codec) 1090 1098 { 1091 1099 struct sigmatel_spec *spec = codec->spec; 1092 - struct auto_pin_cfg *cfg = &spec->autocfg; 1093 - hda_nid_t nid; 1094 1100 int err; 1095 1101 int i; 1096 1102 ··· 1173 1185 1174 1186 stac92xx_free_kctls(codec); /* no longer needed */ 1175 1187 1176 - /* create jack input elements */ 1177 - if (spec->hp_detect) { 1178 - for (i = 0; i < cfg->hp_outs; i++) { 1179 - int type = SND_JACK_HEADPHONE; 1180 - nid = cfg->hp_pins[i]; 1181 - /* jack detection */ 1182 - if (cfg->hp_outs == i) 1183 - type |= SND_JACK_LINEOUT; 1184 - err = stac92xx_add_jack(codec, nid, type); 1185 - if (err < 0) 1186 - return err; 1187 - } 1188 - } 1189 - for (i = 0; i < cfg->line_outs; i++) { 1190 - err = stac92xx_add_jack(codec, cfg->line_out_pins[i], 1191 - SND_JACK_LINEOUT); 1192 - if (err < 0) 1193 - return err; 1194 - } 1195 - for (i = 0; i < cfg->num_inputs; i++) { 1196 - nid = cfg->inputs[i].pin; 1197 - err = stac92xx_add_jack(codec, nid, SND_JACK_MICROPHONE); 1198 - if (err < 0) 1199 - return err; 1200 - } 1188 + err = snd_hda_jack_add_kctls(codec, &spec->autocfg); 1189 + if (err < 0) 1190 + return err; 1201 1191 1202 1192 return 0; 1203 1193 } ··· 1657 1691 [STAC_92HD83XXX_PWR_REF] = "mic-ref", 1658 1692 [STAC_DELL_S14] = "dell-s14", 1659 1693 [STAC_DELL_VOSTRO_3500] = "dell-vostro-3500", 1660 - [STAC_92HD83XXX_HP] = "hp", 1661 1694 [STAC_92HD83XXX_HP_cNB11_INTQUAD] = "hp_cNB11_intquad", 1662 1695 [STAC_HP_DV7_4000] = "hp-dv7-4000", 1663 1696 }; ··· 1671 1706 "unknown Dell", STAC_DELL_S14), 1672 1707 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x1028, 1673 1708 "Dell Vostro 3500", STAC_DELL_VOSTRO_3500), 1674 - SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_HP, 0xff00, 0x3600, 1675 - "HP", STAC_92HD83XXX_HP), 1676 1709 SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x1656, 1677 1710 "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD), 1678 1711 SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x1657, ··· 2837 2874 } 2838 2875 2839 2876 if (control) { 2840 - strcpy(name, hda_get_input_pin_label(codec, nid, 1)); 2877 + snd_hda_get_pin_label(codec, nid, &spec->autocfg, 2878 + name, sizeof(name), NULL); 2841 2879 return stac92xx_add_control(codec->spec, control, 2842 2880 strcat(name, " Jack Mode"), nid); 2843 2881 } ··· 3516 3552 for (i = 0; i < spec->num_dmics; i++) { 3517 3553 hda_nid_t nid; 3518 3554 int index, type_idx; 3519 - const char *label; 3555 + char label[32]; 3520 3556 3521 3557 nid = spec->dmic_nids[i]; 3522 3558 if (get_wcaps_type(get_wcaps(codec, nid)) != AC_WID_PIN) ··· 3529 3565 if (index < 0) 3530 3566 continue; 3531 3567 3532 - label = hda_get_input_pin_label(codec, nid, 1); 3568 + snd_hda_get_pin_label(codec, nid, &spec->autocfg, 3569 + label, sizeof(label), NULL); 3533 3570 snd_hda_add_imux_item(dimux, label, index, &type_idx); 3534 3571 if (snd_hda_get_bool_hint(codec, "separate_dmux") != 1) 3535 3572 snd_hda_add_imux_item(imux, label, index, &type_idx); ··· 4128 4163 AC_VERB_SET_GPIO_DATA, gpiostate); /* sync */ 4129 4164 } 4130 4165 4131 - static int stac92xx_add_jack(struct hda_codec *codec, 4132 - hda_nid_t nid, int type) 4133 - { 4134 - #ifdef CONFIG_SND_HDA_INPUT_JACK 4135 - int def_conf = snd_hda_codec_get_pincfg(codec, nid); 4136 - int connectivity = get_defcfg_connect(def_conf); 4137 - 4138 - if (connectivity && connectivity != AC_JACK_PORT_FIXED) 4139 - return 0; 4140 - 4141 - return snd_hda_input_jack_add(codec, nid, type, NULL); 4142 - #else 4143 - return 0; 4144 - #endif /* CONFIG_SND_HDA_INPUT_JACK */ 4145 - } 4146 - 4147 - static int stac_add_event(struct sigmatel_spec *spec, hda_nid_t nid, 4166 + static int stac_add_event(struct hda_codec *codec, hda_nid_t nid, 4148 4167 unsigned char type, int data) 4149 4168 { 4150 - struct sigmatel_event *event; 4169 + struct hda_jack_tbl *event; 4151 4170 4152 - snd_array_init(&spec->events, sizeof(*event), 32); 4153 - event = snd_array_new(&spec->events); 4171 + event = snd_hda_jack_tbl_new(codec, nid); 4154 4172 if (!event) 4155 4173 return -ENOMEM; 4156 - event->nid = nid; 4157 - event->type = type; 4158 - event->tag = spec->events.used; 4159 - event->data = data; 4174 + event->action = type; 4175 + event->private_data = data; 4160 4176 4161 - return event->tag; 4162 - } 4163 - 4164 - static struct sigmatel_event *stac_get_event(struct hda_codec *codec, 4165 - hda_nid_t nid) 4166 - { 4167 - struct sigmatel_spec *spec = codec->spec; 4168 - struct sigmatel_event *event = spec->events.list; 4169 - int i; 4170 - 4171 - for (i = 0; i < spec->events.used; i++, event++) { 4172 - if (event->nid == nid) 4173 - return event; 4174 - } 4175 - return NULL; 4176 - } 4177 - 4178 - static struct sigmatel_event *stac_get_event_from_tag(struct hda_codec *codec, 4179 - unsigned char tag) 4180 - { 4181 - struct sigmatel_spec *spec = codec->spec; 4182 - struct sigmatel_event *event = spec->events.list; 4183 - int i; 4184 - 4185 - for (i = 0; i < spec->events.used; i++, event++) { 4186 - if (event->tag == tag) 4187 - return event; 4188 - } 4189 - return NULL; 4177 + return 0; 4190 4178 } 4191 4179 4192 4180 /* check if given nid is a valid pin and no other events are assigned ··· 4149 4231 static int enable_pin_detect(struct hda_codec *codec, hda_nid_t nid, 4150 4232 unsigned int type) 4151 4233 { 4152 - struct sigmatel_event *event; 4153 - int tag; 4234 + struct hda_jack_tbl *event; 4154 4235 4155 4236 if (!is_jack_detectable(codec, nid)) 4156 4237 return 0; 4157 - event = stac_get_event(codec, nid); 4158 - if (event) { 4159 - if (event->type != type) 4160 - return 0; 4161 - tag = event->tag; 4162 - } else { 4163 - tag = stac_add_event(codec->spec, nid, type, 0); 4164 - if (tag < 0) 4165 - return 0; 4166 - } 4167 - snd_hda_codec_write_cache(codec, nid, 0, 4168 - AC_VERB_SET_UNSOLICITED_ENABLE, 4169 - AC_USRSP_EN | tag); 4238 + event = snd_hda_jack_tbl_new(codec, nid); 4239 + if (!event) 4240 + return -ENOMEM; 4241 + if (event->action && event->action != type) 4242 + return 0; 4243 + event->action = type; 4244 + snd_hda_jack_detect_enable(codec, nid, 0); 4170 4245 return 1; 4171 4246 } 4172 4247 ··· 4229 4318 spec->eapd_switch = val; 4230 4319 get_int_hint(codec, "gpio_led_polarity", &spec->gpio_led_polarity); 4231 4320 if (get_int_hint(codec, "gpio_led", &spec->gpio_led)) { 4232 - if (spec->gpio_led <= 8) { 4233 - spec->gpio_mask |= spec->gpio_led; 4234 - spec->gpio_dir |= spec->gpio_led; 4235 - if (spec->gpio_led_polarity) 4236 - spec->gpio_data |= spec->gpio_led; 4237 - } 4321 + spec->gpio_mask |= spec->gpio_led; 4322 + spec->gpio_dir |= spec->gpio_led; 4323 + if (spec->gpio_led_polarity) 4324 + spec->gpio_data |= spec->gpio_led; 4238 4325 } 4326 + } 4327 + 4328 + static void stac_issue_unsol_events(struct hda_codec *codec, int num_pins, 4329 + const hda_nid_t *pins) 4330 + { 4331 + while (num_pins--) 4332 + stac_issue_unsol_event(codec, *pins++); 4333 + } 4334 + 4335 + /* fake event to set up pins */ 4336 + static void stac_fake_hp_events(struct hda_codec *codec) 4337 + { 4338 + struct sigmatel_spec *spec = codec->spec; 4339 + 4340 + if (spec->autocfg.hp_outs) 4341 + stac_issue_unsol_events(codec, spec->autocfg.hp_outs, 4342 + spec->autocfg.hp_pins); 4343 + if (spec->autocfg.line_outs && 4344 + spec->autocfg.line_out_pins[0] != spec->autocfg.hp_pins[0]) 4345 + stac_issue_unsol_events(codec, spec->autocfg.line_outs, 4346 + spec->autocfg.line_out_pins); 4239 4347 } 4240 4348 4241 4349 static int stac92xx_init(struct hda_codec *codec) ··· 4307 4377 stac92xx_auto_set_pinctl(codec, spec->autocfg.line_out_pins[0], 4308 4378 AC_PINCTL_OUT_EN); 4309 4379 /* fake event to set up pins */ 4310 - if (cfg->hp_pins[0]) 4311 - stac_issue_unsol_event(codec, cfg->hp_pins[0]); 4312 - else if (cfg->line_out_pins[0]) 4313 - stac_issue_unsol_event(codec, cfg->line_out_pins[0]); 4380 + stac_fake_hp_events(codec); 4314 4381 } else { 4315 4382 stac92xx_auto_init_multi_out(codec); 4316 4383 stac92xx_auto_init_hp_out(codec); ··· 4370 4443 /* power on when no jack detection is available */ 4371 4444 /* or when the VREF is used for controlling LED */ 4372 4445 if (!spec->hp_detect || 4373 - (spec->gpio_led > 8 && spec->gpio_led == nid)) { 4446 + spec->vref_mute_led_nid == nid) { 4374 4447 stac_toggle_power_map(codec, nid, 1); 4375 4448 continue; 4376 4449 } ··· 4404 4477 /* none of the above, turn the port OFF */ 4405 4478 stac_toggle_power_map(codec, nid, 0); 4406 4479 } 4480 + 4481 + snd_hda_jack_report_sync(codec); 4407 4482 4408 4483 /* sync mute LED */ 4409 4484 if (spec->gpio_led) ··· 4463 4534 return; 4464 4535 4465 4536 stac92xx_shutup(codec); 4466 - snd_hda_input_jack_free(codec); 4467 - snd_array_free(&spec->events); 4468 4537 4469 4538 kfree(spec); 4470 4539 snd_hda_detach_beep_device(codec); ··· 4726 4799 mic->mux_idx); 4727 4800 } 4728 4801 4729 - static void stac_issue_unsol_event(struct hda_codec *codec, hda_nid_t nid) 4730 - { 4731 - struct sigmatel_event *event = stac_get_event(codec, nid); 4732 - if (!event) 4733 - return; 4734 - codec->patch_ops.unsol_event(codec, (unsigned)event->tag << 26); 4735 - } 4736 - 4737 - static void stac92xx_unsol_event(struct hda_codec *codec, unsigned int res) 4802 + static void handle_unsol_event(struct hda_codec *codec, 4803 + struct hda_jack_tbl *event) 4738 4804 { 4739 4805 struct sigmatel_spec *spec = codec->spec; 4740 - struct sigmatel_event *event; 4741 - int tag, data; 4806 + int data; 4742 4807 4743 - tag = (res >> 26) & 0x7f; 4744 - event = stac_get_event_from_tag(codec, tag); 4745 - if (!event) 4746 - return; 4747 - 4748 - switch (event->type) { 4808 + switch (event->action) { 4749 4809 case STAC_HP_EVENT: 4750 4810 case STAC_LO_EVENT: 4751 4811 stac92xx_hp_detect(codec); ··· 4742 4828 break; 4743 4829 } 4744 4830 4745 - switch (event->type) { 4831 + switch (event->action) { 4746 4832 case STAC_HP_EVENT: 4747 4833 case STAC_LO_EVENT: 4748 4834 case STAC_MIC_EVENT: ··· 4750 4836 case STAC_PWR_EVENT: 4751 4837 if (spec->num_pwrs > 0) 4752 4838 stac92xx_pin_sense(codec, event->nid); 4753 - snd_hda_input_jack_report(codec, event->nid); 4754 4839 4755 4840 switch (codec->subsystem_id) { 4756 4841 case 0x103c308f: ··· 4774 4861 AC_VERB_GET_GPIO_DATA, 0); 4775 4862 /* toggle VREF state based on GPIOx status */ 4776 4863 snd_hda_codec_write(codec, codec->afg, 0, 0x7e0, 4777 - !!(data & (1 << event->data))); 4864 + !!(data & (1 << event->private_data))); 4778 4865 break; 4779 4866 } 4867 + } 4868 + 4869 + static void stac_issue_unsol_event(struct hda_codec *codec, hda_nid_t nid) 4870 + { 4871 + struct hda_jack_tbl *event = snd_hda_jack_tbl_get(codec, nid); 4872 + if (!event) 4873 + return; 4874 + handle_unsol_event(codec, event); 4875 + } 4876 + 4877 + static void stac92xx_unsol_event(struct hda_codec *codec, unsigned int res) 4878 + { 4879 + struct hda_jack_tbl *event; 4880 + int tag; 4881 + 4882 + tag = (res >> 26) & 0x7f; 4883 + event = snd_hda_jack_tbl_get_from_tag(codec, tag); 4884 + if (!event) 4885 + return; 4886 + event->jack_dirty = 1; 4887 + handle_unsol_event(codec, event); 4888 + snd_hda_jack_report_sync(codec); 4780 4889 } 4781 4890 4782 4891 static int hp_blike_system(u32 subsystem_id); ··· 4839 4904 * Need more information on whether it is true across the entire series. 4840 4905 * -- kunal 4841 4906 */ 4842 - static int find_mute_led_gpio(struct hda_codec *codec, int default_polarity) 4907 + static int find_mute_led_cfg(struct hda_codec *codec, int default_polarity) 4843 4908 { 4844 4909 struct sigmatel_spec *spec = codec->spec; 4845 4910 const struct dmi_device *dev = NULL; ··· 4850 4915 if (sscanf(dev->name, "HP_Mute_LED_%d_%x", 4851 4916 &spec->gpio_led_polarity, 4852 4917 &spec->gpio_led) == 2) { 4853 - if (spec->gpio_led < 4) 4918 + unsigned int max_gpio; 4919 + max_gpio = snd_hda_param_read(codec, codec->afg, 4920 + AC_PAR_GPIO_CAP); 4921 + max_gpio &= AC_GPIO_IO_COUNT; 4922 + if (spec->gpio_led < max_gpio) 4854 4923 spec->gpio_led = 1 << spec->gpio_led; 4924 + else 4925 + spec->vref_mute_led_nid = spec->gpio_led; 4855 4926 return 1; 4856 4927 } 4857 4928 if (sscanf(dev->name, "HP_Mute_LED_%d", ··· 4865 4924 set_hp_led_gpio(codec); 4866 4925 return 1; 4867 4926 } 4927 + /* BIOS bug: unfilled OEM string */ 4928 + if (strstr(dev->name, "HP_Mute_LED_P_G")) { 4929 + set_hp_led_gpio(codec); 4930 + spec->gpio_led_polarity = 1; 4931 + return 1; 4932 + } 4868 4933 } 4869 4934 4870 4935 /* 4871 4936 * Fallback case - if we don't find the DMI strings, 4872 - * we statically set the GPIO - if not a B-series system. 4937 + * we statically set the GPIO - if not a B-series system 4938 + * and default polarity is provided 4873 4939 */ 4874 - if (!hp_blike_system(codec->subsystem_id)) { 4940 + if (!hp_blike_system(codec->subsystem_id) && 4941 + (default_polarity == 0 || default_polarity == 1)) { 4875 4942 set_hp_led_gpio(codec); 4876 4943 spec->gpio_led_polarity = default_polarity; 4877 4944 return 1; ··· 4966 5017 #ifdef CONFIG_PM 4967 5018 static int stac92xx_resume(struct hda_codec *codec) 4968 5019 { 4969 - struct sigmatel_spec *spec = codec->spec; 4970 - 4971 5020 stac92xx_init(codec); 4972 5021 snd_hda_codec_resume_amp(codec); 4973 5022 snd_hda_codec_resume_cache(codec); 4974 5023 /* fake event to set up pins again to override cached values */ 4975 - if (spec->hp_detect) { 4976 - if (spec->autocfg.hp_pins[0]) 4977 - stac_issue_unsol_event(codec, spec->autocfg.hp_pins[0]); 4978 - else if (spec->autocfg.line_out_pins[0]) 4979 - stac_issue_unsol_event(codec, 4980 - spec->autocfg.line_out_pins[0]); 4981 - } 5024 + stac_fake_hp_events(codec); 4982 5025 return 0; 4983 5026 } 4984 5027 ··· 4986 5045 struct sigmatel_spec *spec = codec->spec; 4987 5046 4988 5047 /* sync mute LED */ 4989 - if (spec->gpio_led) { 4990 - if (spec->gpio_led <= 8) { 4991 - stac_gpio_set(codec, spec->gpio_mask, 4992 - spec->gpio_dir, spec->gpio_data); 4993 - } else { 4994 - stac_vrefout_set(codec, 4995 - spec->gpio_led, spec->vref_led); 4996 - } 4997 - } 5048 + if (spec->vref_mute_led_nid) 5049 + stac_vrefout_set(codec, spec->vref_mute_led_nid, 5050 + spec->vref_led); 5051 + else if (spec->gpio_led) 5052 + stac_gpio_set(codec, spec->gpio_mask, 5053 + spec->gpio_dir, spec->gpio_data); 4998 5054 return 0; 4999 5055 } 5000 5056 ··· 5002 5064 struct sigmatel_spec *spec = codec->spec; 5003 5065 5004 5066 if (power_state == AC_PWRST_D3) { 5005 - if (spec->gpio_led > 8) { 5067 + if (spec->vref_mute_led_nid) { 5006 5068 /* with vref-out pin used for mute led control 5007 5069 * codec AFG is prevented from D3 state 5008 5070 */ ··· 5055 5117 } 5056 5118 } 5057 5119 /*polarity defines *not* muted state level*/ 5058 - if (spec->gpio_led <= 8) { 5120 + if (!spec->vref_mute_led_nid) { 5059 5121 if (muted) 5060 5122 spec->gpio_data &= ~spec->gpio_led; /* orange */ 5061 5123 else ··· 5073 5135 muted_lvl = spec->gpio_led_polarity ? 5074 5136 AC_PINCTL_VREF_GRD : AC_PINCTL_VREF_HIZ; 5075 5137 spec->vref_led = muted ? muted_lvl : notmtd_lvl; 5076 - stac_vrefout_set(codec, spec->gpio_led, spec->vref_led); 5138 + stac_vrefout_set(codec, spec->vref_mute_led_nid, 5139 + spec->vref_led); 5077 5140 } 5078 5141 return 0; 5079 5142 } ··· 5581 5642 5582 5643 codec->patch_ops = stac92xx_patch_ops; 5583 5644 5584 - if (find_mute_led_gpio(codec, 0)) 5645 + if (find_mute_led_cfg(codec, -1/*no default cfg*/)) 5585 5646 snd_printd("mute LED gpio %d polarity %d\n", 5586 5647 spec->gpio_led, 5587 5648 spec->gpio_led_polarity); 5588 5649 5589 5650 #ifdef CONFIG_SND_HDA_POWER_SAVE 5590 5651 if (spec->gpio_led) { 5591 - if (spec->gpio_led <= 8) { 5652 + if (!spec->vref_mute_led_nid) { 5592 5653 spec->gpio_mask |= spec->gpio_led; 5593 5654 spec->gpio_dir |= spec->gpio_led; 5594 5655 spec->gpio_data |= spec->gpio_led; ··· 5769 5830 switch (spec->board_config) { 5770 5831 case STAC_HP_M4: 5771 5832 /* Enable VREF power saving on GPIO1 detect */ 5772 - err = stac_add_event(spec, codec->afg, 5833 + err = stac_add_event(codec, codec->afg, 5773 5834 STAC_VREF_EVENT, 0x02); 5774 5835 if (err < 0) 5775 5836 return err; 5776 5837 snd_hda_codec_write_cache(codec, codec->afg, 0, 5777 5838 AC_VERB_SET_GPIO_UNSOLICITED_RSP_MASK, 0x02); 5778 - snd_hda_codec_write_cache(codec, codec->afg, 0, 5779 - AC_VERB_SET_UNSOLICITED_ENABLE, 5780 - AC_USRSP_EN | err); 5839 + snd_hda_jack_detect_enable(codec, codec->afg, 0); 5781 5840 spec->gpio_mask |= 0x02; 5782 5841 break; 5783 5842 } ··· 5892 5955 } 5893 5956 } 5894 5957 5895 - if (find_mute_led_gpio(codec, 1)) 5958 + if (find_mute_led_cfg(codec, 1)) 5896 5959 snd_printd("mute LED gpio %d polarity %d\n", 5897 5960 spec->gpio_led, 5898 5961 spec->gpio_led_polarity); 5899 5962 5900 5963 #ifdef CONFIG_SND_HDA_POWER_SAVE 5901 5964 if (spec->gpio_led) { 5902 - if (spec->gpio_led <= 8) { 5965 + if (!spec->vref_mute_led_nid) { 5903 5966 spec->gpio_mask |= spec->gpio_led; 5904 5967 spec->gpio_dir |= spec->gpio_led; 5905 5968 spec->gpio_data |= spec->gpio_led; ··· 6246 6309 snd_hda_codec_set_pincfg(codec, 0x20, 0x1c410030); 6247 6310 6248 6311 /* Enable unsol response for GPIO4/Dock HP connection */ 6249 - err = stac_add_event(spec, codec->afg, STAC_VREF_EVENT, 0x01); 6312 + err = stac_add_event(codec, codec->afg, STAC_VREF_EVENT, 0x01); 6250 6313 if (err < 0) 6251 6314 return err; 6252 6315 snd_hda_codec_write_cache(codec, codec->afg, 0, 6253 6316 AC_VERB_SET_GPIO_UNSOLICITED_RSP_MASK, 0x10); 6254 - snd_hda_codec_write_cache(codec, codec->afg, 0, 6255 - AC_VERB_SET_UNSOLICITED_ENABLE, 6256 - AC_USRSP_EN | err); 6317 + snd_hda_jack_detect_enable(codec, codec->afg, 0); 6257 6318 6258 6319 spec->gpio_dir = 0x0b; 6259 6320 spec->eapd_mask = 0x01;
+20 -10
sound/pci/hda/patch_via.c
··· 54 54 #include <sound/asoundef.h> 55 55 #include "hda_codec.h" 56 56 #include "hda_local.h" 57 + #include "hda_jack.h" 57 58 58 59 /* Pin Widget NID */ 59 60 #define VT1708_HP_PIN_NID 0x20 ··· 1504 1503 analog_low_current_mode(codec); 1505 1504 1506 1505 via_free_kctls(codec); /* no longer needed */ 1506 + 1507 + err = snd_hda_jack_add_kctls(codec, &spec->autocfg); 1508 + if (err < 0) 1509 + return err; 1510 + 1507 1511 return 0; 1508 1512 } 1509 1513 ··· 1720 1714 unsigned int res) 1721 1715 { 1722 1716 res >>= 26; 1717 + res = snd_hda_jack_get_action(codec, res); 1723 1718 1724 1719 if (res & VIA_JACK_EVENT) 1725 1720 set_widgets_power_state(codec); ··· 1731 1724 via_hp_automute(codec); 1732 1725 else if (res == VIA_GPIO_EVENT) 1733 1726 via_gpio_control(codec); 1727 + snd_hda_jack_report_sync(codec); 1734 1728 } 1735 1729 1736 1730 #ifdef CONFIG_PM ··· 2208 2200 { 2209 2201 struct via_spec *spec = codec->spec; 2210 2202 2211 - if (!spec->aa_mix_nid || !spec->out_mix_path.depth) 2203 + if (!spec->aa_mix_nid) 2204 + return 0; /* no loopback switching available */ 2205 + if (!(spec->out_mix_path.depth || spec->hp_mix_path.depth || 2206 + spec->speaker_path.depth)) 2212 2207 return 0; /* no loopback switching available */ 2213 2208 if (!via_clone_control(spec, &via_aamix_ctl_enum)) 2214 2209 return -ENOMEM; ··· 2747 2736 int i; 2748 2737 2749 2738 if (cfg->hp_pins[0] && is_jack_detectable(codec, cfg->hp_pins[0])) 2750 - snd_hda_codec_write(codec, cfg->hp_pins[0], 0, 2751 - AC_VERB_SET_UNSOLICITED_ENABLE, 2752 - AC_USRSP_EN | VIA_HP_EVENT | VIA_JACK_EVENT); 2739 + snd_hda_jack_detect_enable(codec, cfg->hp_pins[0], 2740 + VIA_HP_EVENT | VIA_JACK_EVENT); 2753 2741 2754 2742 if (cfg->speaker_pins[0]) 2755 2743 ev = VIA_LINE_EVENT; ··· 2757 2747 for (i = 0; i < cfg->line_outs; i++) { 2758 2748 if (cfg->line_out_pins[i] && 2759 2749 is_jack_detectable(codec, cfg->line_out_pins[i])) 2760 - snd_hda_codec_write(codec, cfg->line_out_pins[i], 0, 2761 - AC_VERB_SET_UNSOLICITED_ENABLE, 2762 - AC_USRSP_EN | ev | VIA_JACK_EVENT); 2750 + snd_hda_jack_detect_enable(codec, cfg->line_out_pins[i], 2751 + ev | VIA_JACK_EVENT); 2763 2752 } 2764 2753 2765 2754 for (i = 0; i < cfg->num_inputs; i++) { 2766 2755 if (is_jack_detectable(codec, cfg->inputs[i].pin)) 2767 - snd_hda_codec_write(codec, cfg->inputs[i].pin, 0, 2768 - AC_VERB_SET_UNSOLICITED_ENABLE, 2769 - AC_USRSP_EN | VIA_JACK_EVENT); 2756 + snd_hda_jack_detect_enable(codec, cfg->inputs[i].pin, 2757 + VIA_JACK_EVENT); 2770 2758 } 2771 2759 } 2772 2760 ··· 2787 2779 2788 2780 via_hp_automute(codec); 2789 2781 vt1708_update_hp_work(spec); 2782 + snd_hda_jack_report_sync(codec); 2790 2783 2791 2784 return 0; 2792 2785 } ··· 2798 2789 vt1708_hp_work.work); 2799 2790 if (spec->codec_type != VT1708) 2800 2791 return; 2792 + snd_hda_jack_set_dirty_all(spec->codec); 2801 2793 /* if jack state toggled */ 2802 2794 if (spec->vt1708_hp_present 2803 2795 != snd_hda_jack_detect(spec->codec, spec->autocfg.hp_pins[0])) {