diff options
-rw-r--r-- | Documentation/sound/alsa/HD-Audio-Models.txt | 50 | ||||
-rw-r--r-- | sound/pci/hda/alc882_quirks.c | 874 | ||||
-rw-r--r-- | sound/pci/hda/alc_quirks.c | 167 | ||||
-rw-r--r-- | sound/pci/hda/patch_realtek.c | 143 |
4 files changed, 93 insertions, 1141 deletions
diff --git a/Documentation/sound/alsa/HD-Audio-Models.txt b/Documentation/sound/alsa/HD-Audio-Models.txt index 1f64fb810522..d97d992ced14 100644 --- a/Documentation/sound/alsa/HD-Audio-Models.txt +++ b/Documentation/sound/alsa/HD-Audio-Models.txt | |||
@@ -43,55 +43,7 @@ ALC680 | |||
43 | 43 | ||
44 | ALC882/883/885/888/889 | 44 | ALC882/883/885/888/889 |
45 | ====================== | 45 | ====================== |
46 | 3stack-dig 3-jack with SPDIF I/O | 46 | N/A |
47 | 6stack-dig 6-jack digital with SPDIF I/O | ||
48 | arima Arima W820Di1 | ||
49 | targa Targa T8, MSI-1049 T8 | ||
50 | asus-a7j ASUS A7J | ||
51 | asus-a7m ASUS A7M | ||
52 | macpro MacPro support | ||
53 | mb5 Macbook 5,1 | ||
54 | macmini3 Macmini 3,1 | ||
55 | mba21 Macbook Air 2,1 | ||
56 | mbp3 Macbook Pro rev3 | ||
57 | imac24 iMac 24'' with jack detection | ||
58 | imac91 iMac 9,1 | ||
59 | w2jc ASUS W2JC | ||
60 | 3stack-2ch-dig 3-jack with SPDIF I/O (ALC883) | ||
61 | alc883-6stack-dig 6-jack digital with SPDIF I/O (ALC883) | ||
62 | 3stack-6ch 3-jack 6-channel | ||
63 | 3stack-6ch-dig 3-jack 6-channel with SPDIF I/O | ||
64 | 6stack-dig-demo 6-jack digital for Intel demo board | ||
65 | acer Acer laptops (Travelmate 3012WTMi, Aspire 5600, etc) | ||
66 | acer-aspire Acer Aspire 9810 | ||
67 | acer-aspire-4930g Acer Aspire 4930G | ||
68 | acer-aspire-6530g Acer Aspire 6530G | ||
69 | acer-aspire-7730g Acer Aspire 7730G | ||
70 | acer-aspire-8930g Acer Aspire 8930G | ||
71 | medion Medion Laptops | ||
72 | targa-dig Targa/MSI | ||
73 | targa-2ch-dig Targa/MSI with 2-channel | ||
74 | targa-8ch-dig Targa/MSI with 8-channel (MSI GX620) | ||
75 | laptop-eapd 3-jack with SPDIF I/O and EAPD (Clevo M540JE, M550JE) | ||
76 | lenovo-101e Lenovo 101E | ||
77 | lenovo-nb0763 Lenovo NB0763 | ||
78 | lenovo-ms7195-dig Lenovo MS7195 | ||
79 | lenovo-sky Lenovo Sky | ||
80 | haier-w66 Haier W66 | ||
81 | 3stack-hp HP machines with 3stack (Lucknow, Samba boards) | ||
82 | 6stack-dell Dell machines with 6stack (Inspiron 530) | ||
83 | mitac Mitac 8252D | ||
84 | clevo-m540r Clevo M540R (6ch + digital) | ||
85 | clevo-m720 Clevo M720 laptop series | ||
86 | fujitsu-pi2515 Fujitsu AMILO Pi2515 | ||
87 | fujitsu-xa3530 Fujitsu AMILO XA3530 | ||
88 | 3stack-6ch-intel Intel DG33* boards | ||
89 | intel-alc889a Intel IbexPeak with ALC889A | ||
90 | intel-x58 Intel DX58 with ALC889 | ||
91 | asus-p5q ASUS P5Q-EM boards | ||
92 | mb31 MacBook 3,1 | ||
93 | sony-vaio-tt Sony VAIO TT | ||
94 | auto auto-config reading BIOS (default) | ||
95 | 47 | ||
96 | ALC861/660 | 48 | ALC861/660 |
97 | ========== | 49 | ========== |
diff --git a/sound/pci/hda/alc882_quirks.c b/sound/pci/hda/alc882_quirks.c deleted file mode 100644 index 0f4292688e18..000000000000 --- a/sound/pci/hda/alc882_quirks.c +++ /dev/null | |||
@@ -1,874 +0,0 @@ | |||
1 | /* | ||
2 | * ALC882/ALC883/ALC888/ALC889 quirk models | ||
3 | * included by patch_realtek.c | ||
4 | */ | ||
5 | |||
6 | /* ALC882 models */ | ||
7 | enum { | ||
8 | ALC882_AUTO, | ||
9 | ALC885_MBA21, | ||
10 | ALC885_MBP3, | ||
11 | ALC885_MB5, | ||
12 | ALC885_MACMINI3, | ||
13 | ALC885_IMAC91, | ||
14 | ALC889A_MB31, | ||
15 | ALC882_MODEL_LAST, | ||
16 | }; | ||
17 | |||
18 | #define ALC882_DIGOUT_NID 0x06 | ||
19 | #define ALC882_DIGIN_NID 0x0a | ||
20 | #define ALC883_DIGOUT_NID ALC882_DIGOUT_NID | ||
21 | #define ALC883_DIGIN_NID ALC882_DIGIN_NID | ||
22 | #define ALC1200_DIGOUT_NID 0x10 | ||
23 | |||
24 | |||
25 | static const struct hda_channel_mode alc882_ch_modes[1] = { | ||
26 | { 8, NULL } | ||
27 | }; | ||
28 | |||
29 | /* DACs */ | ||
30 | static const hda_nid_t alc882_dac_nids[4] = { | ||
31 | /* front, rear, clfe, rear_surr */ | ||
32 | 0x02, 0x03, 0x04, 0x05 | ||
33 | }; | ||
34 | #define alc883_dac_nids alc882_dac_nids | ||
35 | |||
36 | /* ADCs */ | ||
37 | static const hda_nid_t alc882_adc_nids[3] = { | ||
38 | /* ADC0-2 */ | ||
39 | 0x07, 0x08, 0x09, | ||
40 | }; | ||
41 | |||
42 | static const hda_nid_t alc882_adc_nids_alt[2] = { | ||
43 | /* ADC1-2 */ | ||
44 | 0x08, 0x09, | ||
45 | }; | ||
46 | |||
47 | #define alc883_adc_nids alc882_adc_nids_alt | ||
48 | |||
49 | static const hda_nid_t alc882_capsrc_nids_alt[2] = { 0x23, 0x22 }; | ||
50 | #define alc883_capsrc_nids alc882_capsrc_nids_alt | ||
51 | |||
52 | /* input MUX */ | ||
53 | /* FIXME: should be a matrix-type input source selection */ | ||
54 | |||
55 | static const struct hda_input_mux alc882_capture_source = { | ||
56 | .num_items = 4, | ||
57 | .items = { | ||
58 | { "Mic", 0x0 }, | ||
59 | { "Front Mic", 0x1 }, | ||
60 | { "Line", 0x2 }, | ||
61 | { "CD", 0x4 }, | ||
62 | }, | ||
63 | }; | ||
64 | |||
65 | #define alc883_capture_source alc882_capture_source | ||
66 | |||
67 | static const struct hda_input_mux mb5_capture_source = { | ||
68 | .num_items = 3, | ||
69 | .items = { | ||
70 | { "Mic", 0x1 }, | ||
71 | { "Line", 0x7 }, | ||
72 | { "CD", 0x4 }, | ||
73 | }, | ||
74 | }; | ||
75 | |||
76 | static const struct hda_input_mux macmini3_capture_source = { | ||
77 | .num_items = 2, | ||
78 | .items = { | ||
79 | { "Line", 0x2 }, | ||
80 | { "CD", 0x4 }, | ||
81 | }, | ||
82 | }; | ||
83 | |||
84 | static const struct hda_input_mux alc883_3stack_6ch_intel = { | ||
85 | .num_items = 4, | ||
86 | .items = { | ||
87 | { "Mic", 0x1 }, | ||
88 | { "Front Mic", 0x0 }, | ||
89 | { "Line", 0x2 }, | ||
90 | { "CD", 0x4 }, | ||
91 | }, | ||
92 | }; | ||
93 | |||
94 | static const struct hda_input_mux alc889A_mb31_capture_source = { | ||
95 | .num_items = 2, | ||
96 | .items = { | ||
97 | { "Mic", 0x0 }, | ||
98 | /* Front Mic (0x01) unused */ | ||
99 | { "Line", 0x2 }, | ||
100 | /* Line 2 (0x03) unused */ | ||
101 | /* CD (0x04) unused? */ | ||
102 | }, | ||
103 | }; | ||
104 | |||
105 | static const struct hda_input_mux alc889A_imac91_capture_source = { | ||
106 | .num_items = 2, | ||
107 | .items = { | ||
108 | { "Mic", 0x01 }, | ||
109 | { "Line", 0x2 }, /* Not sure! */ | ||
110 | }, | ||
111 | }; | ||
112 | |||
113 | /* Macbook Air 2,1 */ | ||
114 | |||
115 | static const struct hda_channel_mode alc885_mba21_ch_modes[1] = { | ||
116 | { 2, NULL }, | ||
117 | }; | ||
118 | |||
119 | /* | ||
120 | * macbook pro ALC885 can switch LineIn to LineOut without losing Mic | ||
121 | */ | ||
122 | |||
123 | /* | ||
124 | * 2ch mode | ||
125 | */ | ||
126 | static const struct hda_verb alc885_mbp_ch2_init[] = { | ||
127 | { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN }, | ||
128 | { 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, | ||
129 | { 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, | ||
130 | { } /* end */ | ||
131 | }; | ||
132 | |||
133 | /* | ||
134 | * 4ch mode | ||
135 | */ | ||
136 | static const struct hda_verb alc885_mbp_ch4_init[] = { | ||
137 | { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, | ||
138 | { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | ||
139 | { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 }, | ||
140 | { 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, | ||
141 | { 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, | ||
142 | { } /* end */ | ||
143 | }; | ||
144 | |||
145 | static const struct hda_channel_mode alc885_mbp_4ch_modes[2] = { | ||
146 | { 2, alc885_mbp_ch2_init }, | ||
147 | { 4, alc885_mbp_ch4_init }, | ||
148 | }; | ||
149 | |||
150 | /* | ||
151 | * 2ch | ||
152 | * Speakers/Woofer/HP = Front | ||
153 | * LineIn = Input | ||
154 | */ | ||
155 | static const struct hda_verb alc885_mb5_ch2_init[] = { | ||
156 | {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, | ||
157 | {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, | ||
158 | { } /* end */ | ||
159 | }; | ||
160 | |||
161 | /* | ||
162 | * 6ch mode | ||
163 | * Speakers/HP = Front | ||
164 | * Woofer = LFE | ||
165 | * LineIn = Surround | ||
166 | */ | ||
167 | static const struct hda_verb alc885_mb5_ch6_init[] = { | ||
168 | {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, | ||
169 | {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | ||
170 | {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, | ||
171 | { } /* end */ | ||
172 | }; | ||
173 | |||
174 | static const struct hda_channel_mode alc885_mb5_6ch_modes[2] = { | ||
175 | { 2, alc885_mb5_ch2_init }, | ||
176 | { 6, alc885_mb5_ch6_init }, | ||
177 | }; | ||
178 | |||
179 | #define alc885_macmini3_6ch_modes alc885_mb5_6ch_modes | ||
180 | |||
181 | /* Macbook Air 2,1 same control for HP and internal Speaker */ | ||
182 | |||
183 | static const struct snd_kcontrol_new alc885_mba21_mixer[] = { | ||
184 | HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x00, HDA_OUTPUT), | ||
185 | HDA_BIND_MUTE("Speaker Playback Switch", 0x0c, 0x02, HDA_OUTPUT), | ||
186 | { } | ||
187 | }; | ||
188 | |||
189 | |||
190 | static const struct snd_kcontrol_new alc885_mbp3_mixer[] = { | ||
191 | HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x00, HDA_OUTPUT), | ||
192 | HDA_BIND_MUTE ("Speaker Playback Switch", 0x0c, 0x02, HDA_INPUT), | ||
193 | HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0e, 0x00, HDA_OUTPUT), | ||
194 | HDA_BIND_MUTE ("Headphone Playback Switch", 0x0e, 0x02, HDA_INPUT), | ||
195 | HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x00, HDA_OUTPUT), | ||
196 | HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), | ||
197 | HDA_CODEC_MUTE ("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), | ||
198 | HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x00, HDA_INPUT), | ||
199 | HDA_CODEC_MUTE ("Mic Playback Switch", 0x0b, 0x00, HDA_INPUT), | ||
200 | HDA_CODEC_VOLUME("Line Boost Volume", 0x1a, 0x00, HDA_INPUT), | ||
201 | HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0x00, HDA_INPUT), | ||
202 | { } /* end */ | ||
203 | }; | ||
204 | |||
205 | static const struct snd_kcontrol_new alc885_mb5_mixer[] = { | ||
206 | HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x00, HDA_OUTPUT), | ||
207 | HDA_BIND_MUTE ("Front Playback Switch", 0x0c, 0x02, HDA_INPUT), | ||
208 | HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x00, HDA_OUTPUT), | ||
209 | HDA_BIND_MUTE ("Surround Playback Switch", 0x0d, 0x02, HDA_INPUT), | ||
210 | HDA_CODEC_VOLUME("LFE Playback Volume", 0x0e, 0x00, HDA_OUTPUT), | ||
211 | HDA_BIND_MUTE ("LFE Playback Switch", 0x0e, 0x02, HDA_INPUT), | ||
212 | HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0f, 0x00, HDA_OUTPUT), | ||
213 | HDA_BIND_MUTE ("Headphone Playback Switch", 0x0f, 0x02, HDA_INPUT), | ||
214 | HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x07, HDA_INPUT), | ||
215 | HDA_CODEC_MUTE ("Line Playback Switch", 0x0b, 0x07, HDA_INPUT), | ||
216 | HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x01, HDA_INPUT), | ||
217 | HDA_CODEC_MUTE ("Mic Playback Switch", 0x0b, 0x01, HDA_INPUT), | ||
218 | HDA_CODEC_VOLUME("Line Boost Volume", 0x15, 0x00, HDA_INPUT), | ||
219 | HDA_CODEC_VOLUME("Mic Boost Volume", 0x19, 0x00, HDA_INPUT), | ||
220 | { } /* end */ | ||
221 | }; | ||
222 | |||
223 | static const struct snd_kcontrol_new alc885_macmini3_mixer[] = { | ||
224 | HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x00, HDA_OUTPUT), | ||
225 | HDA_BIND_MUTE ("Front Playback Switch", 0x0c, 0x02, HDA_INPUT), | ||
226 | HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x00, HDA_OUTPUT), | ||
227 | HDA_BIND_MUTE ("Surround Playback Switch", 0x0d, 0x02, HDA_INPUT), | ||
228 | HDA_CODEC_VOLUME("LFE Playback Volume", 0x0e, 0x00, HDA_OUTPUT), | ||
229 | HDA_BIND_MUTE ("LFE Playback Switch", 0x0e, 0x02, HDA_INPUT), | ||
230 | HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0f, 0x00, HDA_OUTPUT), | ||
231 | HDA_BIND_MUTE ("Headphone Playback Switch", 0x0f, 0x02, HDA_INPUT), | ||
232 | HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x07, HDA_INPUT), | ||
233 | HDA_CODEC_MUTE ("Line Playback Switch", 0x0b, 0x07, HDA_INPUT), | ||
234 | HDA_CODEC_VOLUME("Line Boost Volume", 0x15, 0x00, HDA_INPUT), | ||
235 | { } /* end */ | ||
236 | }; | ||
237 | |||
238 | static const struct snd_kcontrol_new alc885_imac91_mixer[] = { | ||
239 | HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x00, HDA_OUTPUT), | ||
240 | HDA_BIND_MUTE("Speaker Playback Switch", 0x0c, 0x02, HDA_INPUT), | ||
241 | { } /* end */ | ||
242 | }; | ||
243 | |||
244 | |||
245 | static const struct snd_kcontrol_new alc882_chmode_mixer[] = { | ||
246 | { | ||
247 | .iface = SNDRV_CTL_ELEM_IFACE_MIXER, | ||
248 | .name = "Channel Mode", | ||
249 | .info = alc_ch_mode_info, | ||
250 | .get = alc_ch_mode_get, | ||
251 | .put = alc_ch_mode_put, | ||
252 | }, | ||
253 | { } /* end */ | ||
254 | }; | ||
255 | |||
256 | static const struct hda_verb alc882_base_init_verbs[] = { | ||
257 | /* Front mixer: unmute input/output amp left and right (volume = 0) */ | ||
258 | {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, | ||
259 | {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, | ||
260 | /* Rear mixer */ | ||
261 | {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, | ||
262 | {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, | ||
263 | /* CLFE mixer */ | ||
264 | {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, | ||
265 | {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, | ||
266 | /* Side mixer */ | ||
267 | {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, | ||
268 | {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, | ||
269 | |||
270 | /* Front Pin: output 0 (0x0c) */ | ||
271 | {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, | ||
272 | {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | ||
273 | {0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, | ||
274 | /* Rear Pin: output 1 (0x0d) */ | ||
275 | {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, | ||
276 | {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | ||
277 | {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, | ||
278 | /* CLFE Pin: output 2 (0x0e) */ | ||
279 | {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, | ||
280 | {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | ||
281 | {0x16, AC_VERB_SET_CONNECT_SEL, 0x02}, | ||
282 | /* Side Pin: output 3 (0x0f) */ | ||
283 | {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, | ||
284 | {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | ||
285 | {0x17, AC_VERB_SET_CONNECT_SEL, 0x03}, | ||
286 | /* Mic (rear) pin: input vref at 80% */ | ||
287 | {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, | ||
288 | {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, | ||
289 | /* Front Mic pin: input vref at 80% */ | ||
290 | {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, | ||
291 | {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, | ||
292 | /* Line In pin: input */ | ||
293 | {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, | ||
294 | {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, | ||
295 | /* Line-2 In: Headphone output (output 0 - 0x0c) */ | ||
296 | {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, | ||
297 | {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | ||
298 | {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, | ||
299 | /* CD pin widget for input */ | ||
300 | {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, | ||
301 | |||
302 | /* FIXME: use matrix-type input source selection */ | ||
303 | /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */ | ||
304 | /* Input mixer2 */ | ||
305 | {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, | ||
306 | /* Input mixer3 */ | ||
307 | {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, | ||
308 | /* ADC2: mute amp left and right */ | ||
309 | {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, | ||
310 | {0x08, AC_VERB_SET_CONNECT_SEL, 0x00}, | ||
311 | /* ADC3: mute amp left and right */ | ||
312 | {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, | ||
313 | {0x09, AC_VERB_SET_CONNECT_SEL, 0x00}, | ||
314 | |||
315 | { } | ||
316 | }; | ||
317 | |||
318 | #define alc883_init_verbs alc882_base_init_verbs | ||
319 | |||
320 | /* Macbook 5,1 */ | ||
321 | static const struct hda_verb alc885_mb5_init_verbs[] = { | ||
322 | /* DACs */ | ||
323 | {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | ||
324 | {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | ||
325 | {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | ||
326 | {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | ||
327 | /* Front mixer */ | ||
328 | {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, | ||
329 | {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, | ||
330 | {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, | ||
331 | /* Surround mixer */ | ||
332 | {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, | ||
333 | {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, | ||
334 | {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, | ||
335 | /* LFE mixer */ | ||
336 | {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, | ||
337 | {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, | ||
338 | {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, | ||
339 | /* HP mixer */ | ||
340 | {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, | ||
341 | {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, | ||
342 | {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, | ||
343 | /* Front Pin (0x0c) */ | ||
344 | {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | 0x01}, | ||
345 | {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | ||
346 | {0x18, AC_VERB_SET_CONNECT_SEL, 0x00}, | ||
347 | /* LFE Pin (0x0e) */ | ||
348 | {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | 0x01}, | ||
349 | {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | ||
350 | {0x1a, AC_VERB_SET_CONNECT_SEL, 0x02}, | ||
351 | /* HP Pin (0x0f) */ | ||
352 | {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, | ||
353 | {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | ||
354 | {0x14, AC_VERB_SET_CONNECT_SEL, 0x03}, | ||
355 | {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC_HP_EVENT | AC_USRSP_EN}, | ||
356 | /* Front Mic pin: input vref at 80% */ | ||
357 | {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, | ||
358 | {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, | ||
359 | /* Line In pin */ | ||
360 | {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, | ||
361 | {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, | ||
362 | |||
363 | {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0x1)}, | ||
364 | {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0x7)}, | ||
365 | {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0x4)}, | ||
366 | { } | ||
367 | }; | ||
368 | |||
369 | /* Macmini 3,1 */ | ||
370 | static const struct hda_verb alc885_macmini3_init_verbs[] = { | ||
371 | /* DACs */ | ||
372 | {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | ||
373 | {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | ||
374 | {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | ||
375 | {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | ||
376 | /* Front mixer */ | ||
377 | {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, | ||
378 | {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, | ||
379 | {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, | ||
380 | /* Surround mixer */ | ||
381 | {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, | ||
382 | {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, | ||
383 | {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, | ||
384 | /* LFE mixer */ | ||
385 | {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, | ||
386 | {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, | ||
387 | {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, | ||
388 | /* HP mixer */ | ||
389 | {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, | ||
390 | {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, | ||
391 | {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, | ||
392 | /* Front Pin (0x0c) */ | ||
393 | {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | 0x01}, | ||
394 | {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | ||
395 | {0x18, AC_VERB_SET_CONNECT_SEL, 0x00}, | ||
396 | /* LFE Pin (0x0e) */ | ||
397 | {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | 0x01}, | ||
398 | {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | ||
399 | {0x1a, AC_VERB_SET_CONNECT_SEL, 0x02}, | ||
400 | /* HP Pin (0x0f) */ | ||
401 | {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, | ||
402 | {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | ||
403 | {0x14, AC_VERB_SET_CONNECT_SEL, 0x03}, | ||
404 | {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC_HP_EVENT | AC_USRSP_EN}, | ||
405 | /* Line In pin */ | ||
406 | {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, | ||
407 | {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, | ||
408 | |||
409 | {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, | ||
410 | {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, | ||
411 | {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, | ||
412 | {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, | ||
413 | { } | ||
414 | }; | ||
415 | |||
416 | |||
417 | static const struct hda_verb alc885_mba21_init_verbs[] = { | ||
418 | /*Internal and HP Speaker Mixer*/ | ||
419 | {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, | ||
420 | {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, | ||
421 | {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, | ||
422 | /*Internal Speaker Pin (0x0c)*/ | ||
423 | {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, (PIN_OUT | AC_PINCTL_VREF_50) }, | ||
424 | {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | ||
425 | {0x18, AC_VERB_SET_CONNECT_SEL, 0x00}, | ||
426 | /* HP Pin: output 0 (0x0e) */ | ||
427 | {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc4}, | ||
428 | {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | ||
429 | {0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, | ||
430 | {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, (ALC_HP_EVENT | AC_USRSP_EN)}, | ||
431 | /* Line in (is hp when jack connected)*/ | ||
432 | {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, AC_PINCTL_VREF_50}, | ||
433 | {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, | ||
434 | |||
435 | { } | ||
436 | }; | ||
437 | |||
438 | |||
439 | /* Macbook Pro rev3 */ | ||
440 | static const struct hda_verb alc885_mbp3_init_verbs[] = { | ||
441 | /* Front mixer: unmute input/output amp left and right (volume = 0) */ | ||
442 | {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, | ||
443 | {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, | ||
444 | {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, | ||
445 | /* Rear mixer */ | ||
446 | {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, | ||
447 | {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, | ||
448 | {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, | ||
449 | /* HP mixer */ | ||
450 | {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, | ||
451 | {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, | ||
452 | {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, | ||
453 | /* Front Pin: output 0 (0x0c) */ | ||
454 | {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, | ||
455 | {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | ||
456 | {0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, | ||
457 | /* HP Pin: output 0 (0x0e) */ | ||
458 | {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc4}, | ||
459 | {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | ||
460 | {0x15, AC_VERB_SET_CONNECT_SEL, 0x02}, | ||
461 | {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC_HP_EVENT | AC_USRSP_EN}, | ||
462 | /* Mic (rear) pin: input vref at 80% */ | ||
463 | {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, | ||
464 | {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, | ||
465 | /* Front Mic pin: input vref at 80% */ | ||
466 | {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, | ||
467 | {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, | ||
468 | /* Line In pin: use output 1 when in LineOut mode */ | ||
469 | {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, | ||
470 | {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, | ||
471 | {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01}, | ||
472 | |||
473 | /* FIXME: use matrix-type input source selection */ | ||
474 | /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */ | ||
475 | /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */ | ||
476 | {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, | ||
477 | {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, | ||
478 | {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, | ||
479 | {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, | ||
480 | /* Input mixer2 */ | ||
481 | {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, | ||
482 | {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, | ||
483 | {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, | ||
484 | {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, | ||
485 | /* Input mixer3 */ | ||
486 | {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, | ||
487 | {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, | ||
488 | {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, | ||
489 | {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, | ||
490 | /* ADC1: mute amp left and right */ | ||
491 | {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, | ||
492 | {0x07, AC_VERB_SET_CONNECT_SEL, 0x00}, | ||
493 | /* ADC2: mute amp left and right */ | ||
494 | {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, | ||
495 | {0x08, AC_VERB_SET_CONNECT_SEL, 0x00}, | ||
496 | /* ADC3: mute amp left and right */ | ||
497 | {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, | ||
498 | {0x09, AC_VERB_SET_CONNECT_SEL, 0x00}, | ||
499 | |||
500 | { } | ||
501 | }; | ||
502 | |||
503 | /* iMac 9,1 */ | ||
504 | static const struct hda_verb alc885_imac91_init_verbs[] = { | ||
505 | /* Internal Speaker Pin (0x0c) */ | ||
506 | {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, (PIN_OUT | AC_PINCTL_VREF_50) }, | ||
507 | {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | ||
508 | {0x18, AC_VERB_SET_CONNECT_SEL, 0x00}, | ||
509 | {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, (PIN_OUT | AC_PINCTL_VREF_50) }, | ||
510 | {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | ||
511 | {0x1a, AC_VERB_SET_CONNECT_SEL, 0x00}, | ||
512 | /* HP Pin: Rear */ | ||
513 | {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, | ||
514 | {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | ||
515 | {0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, | ||
516 | {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, (ALC_HP_EVENT | AC_USRSP_EN)}, | ||
517 | /* Line in Rear */ | ||
518 | {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, AC_PINCTL_VREF_50}, | ||
519 | {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, | ||
520 | /* Front Mic pin: input vref at 80% */ | ||
521 | {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, | ||
522 | {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, | ||
523 | /* Rear mixer */ | ||
524 | {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, | ||
525 | {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, | ||
526 | {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, | ||
527 | /* Line-Out mixer: unmute input/output amp left and right (volume = 0) */ | ||
528 | {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, | ||
529 | {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, | ||
530 | {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, | ||
531 | /* 0x24 [Audio Mixer] wcaps 0x20010b: Stereo Amp-In */ | ||
532 | {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, | ||
533 | {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, | ||
534 | {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, | ||
535 | {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, | ||
536 | /* 0x23 [Audio Mixer] wcaps 0x20010b: Stereo Amp-In */ | ||
537 | {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, | ||
538 | {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, | ||
539 | {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, | ||
540 | {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, | ||
541 | /* 0x22 [Audio Mixer] wcaps 0x20010b: Stereo Amp-In */ | ||
542 | {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, | ||
543 | {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, | ||
544 | {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, | ||
545 | {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, | ||
546 | /* 0x07 [Audio Input] wcaps 0x10011b: Stereo Amp-In */ | ||
547 | {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, | ||
548 | {0x07, AC_VERB_SET_CONNECT_SEL, 0x00}, | ||
549 | /* 0x08 [Audio Input] wcaps 0x10011b: Stereo Amp-In */ | ||
550 | {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, | ||
551 | {0x08, AC_VERB_SET_CONNECT_SEL, 0x00}, | ||
552 | /* 0x09 [Audio Input] wcaps 0x10011b: Stereo Amp-In */ | ||
553 | {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, | ||
554 | {0x09, AC_VERB_SET_CONNECT_SEL, 0x00}, | ||
555 | { } | ||
556 | }; | ||
557 | |||
558 | /* Toggle speaker-output according to the hp-jack state */ | ||
559 | static void alc885_imac24_setup(struct hda_codec *codec) | ||
560 | { | ||
561 | struct alc_spec *spec = codec->spec; | ||
562 | |||
563 | spec->autocfg.hp_pins[0] = 0x14; | ||
564 | spec->autocfg.speaker_pins[0] = 0x18; | ||
565 | spec->autocfg.speaker_pins[1] = 0x1a; | ||
566 | alc_simple_setup_automute(spec, ALC_AUTOMUTE_AMP); | ||
567 | } | ||
568 | |||
569 | #define alc885_mb5_setup alc885_imac24_setup | ||
570 | #define alc885_macmini3_setup alc885_imac24_setup | ||
571 | |||
572 | /* Macbook Air 2,1 */ | ||
573 | static void alc885_mba21_setup(struct hda_codec *codec) | ||
574 | { | ||
575 | struct alc_spec *spec = codec->spec; | ||
576 | |||
577 | spec->autocfg.hp_pins[0] = 0x14; | ||
578 | spec->autocfg.speaker_pins[0] = 0x18; | ||
579 | alc_simple_setup_automute(spec, ALC_AUTOMUTE_AMP); | ||
580 | } | ||
581 | |||
582 | |||
583 | |||
584 | static void alc885_mbp3_setup(struct hda_codec *codec) | ||
585 | { | ||
586 | struct alc_spec *spec = codec->spec; | ||
587 | |||
588 | spec->autocfg.hp_pins[0] = 0x15; | ||
589 | spec->autocfg.speaker_pins[0] = 0x14; | ||
590 | alc_simple_setup_automute(spec, ALC_AUTOMUTE_AMP); | ||
591 | } | ||
592 | |||
593 | static void alc885_imac91_setup(struct hda_codec *codec) | ||
594 | { | ||
595 | struct alc_spec *spec = codec->spec; | ||
596 | |||
597 | spec->autocfg.hp_pins[0] = 0x14; | ||
598 | spec->autocfg.speaker_pins[0] = 0x18; | ||
599 | spec->autocfg.speaker_pins[1] = 0x1a; | ||
600 | alc_simple_setup_automute(spec, ALC_AUTOMUTE_AMP); | ||
601 | } | ||
602 | |||
603 | /* 2ch mode (Speaker:front, Subwoofer:CLFE, Line:input, Headphones:front) */ | ||
604 | static const struct hda_verb alc889A_mb31_ch2_init[] = { | ||
605 | {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP as front */ | ||
606 | {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Subwoofer on */ | ||
607 | {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, /* Line as input */ | ||
608 | {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, /* Line off */ | ||
609 | { } /* end */ | ||
610 | }; | ||
611 | |||
612 | /* 4ch mode (Speaker:front, Subwoofer:CLFE, Line:CLFE, Headphones:front) */ | ||
613 | static const struct hda_verb alc889A_mb31_ch4_init[] = { | ||
614 | {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP as front */ | ||
615 | {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Subwoofer on */ | ||
616 | {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, /* Line as output */ | ||
617 | {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Line on */ | ||
618 | { } /* end */ | ||
619 | }; | ||
620 | |||
621 | /* 5ch mode (Speaker:front, Subwoofer:CLFE, Line:input, Headphones:rear) */ | ||
622 | static const struct hda_verb alc889A_mb31_ch5_init[] = { | ||
623 | {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, /* HP as rear */ | ||
624 | {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Subwoofer on */ | ||
625 | {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, /* Line as input */ | ||
626 | {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, /* Line off */ | ||
627 | { } /* end */ | ||
628 | }; | ||
629 | |||
630 | /* 6ch mode (Speaker:front, Subwoofer:off, Line:CLFE, Headphones:Rear) */ | ||
631 | static const struct hda_verb alc889A_mb31_ch6_init[] = { | ||
632 | {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, /* HP as front */ | ||
633 | {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, /* Subwoofer off */ | ||
634 | {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, /* Line as output */ | ||
635 | {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Line on */ | ||
636 | { } /* end */ | ||
637 | }; | ||
638 | |||
639 | static const struct hda_channel_mode alc889A_mb31_6ch_modes[4] = { | ||
640 | { 2, alc889A_mb31_ch2_init }, | ||
641 | { 4, alc889A_mb31_ch4_init }, | ||
642 | { 5, alc889A_mb31_ch5_init }, | ||
643 | { 6, alc889A_mb31_ch6_init }, | ||
644 | }; | ||
645 | |||
646 | static const struct snd_kcontrol_new alc883_3ST_6ch_mixer[] = { | ||
647 | HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), | ||
648 | HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), | ||
649 | HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT), | ||
650 | HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT), | ||
651 | HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT), | ||
652 | HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT), | ||
653 | HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT), | ||
654 | HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT), | ||
655 | HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT), | ||
656 | HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), | ||
657 | HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), | ||
658 | HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), | ||
659 | HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), | ||
660 | HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), | ||
661 | HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT), | ||
662 | HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), | ||
663 | HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), | ||
664 | HDA_CODEC_VOLUME("Front Mic Boost Volume", 0x19, 0, HDA_INPUT), | ||
665 | HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), | ||
666 | { } /* end */ | ||
667 | }; | ||
668 | |||
669 | static const struct snd_kcontrol_new alc889A_mb31_mixer[] = { | ||
670 | /* Output mixers */ | ||
671 | HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x00, HDA_OUTPUT), | ||
672 | HDA_BIND_MUTE("Front Playback Switch", 0x0c, 0x02, HDA_INPUT), | ||
673 | HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x00, HDA_OUTPUT), | ||
674 | HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 0x02, HDA_INPUT), | ||
675 | HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x00, | ||
676 | HDA_OUTPUT), | ||
677 | HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 0x02, HDA_INPUT), | ||
678 | HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x00, HDA_OUTPUT), | ||
679 | HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 0x02, HDA_INPUT), | ||
680 | /* Output switches */ | ||
681 | HDA_CODEC_MUTE("Enable Speaker", 0x14, 0x00, HDA_OUTPUT), | ||
682 | HDA_CODEC_MUTE("Enable Headphones", 0x15, 0x00, HDA_OUTPUT), | ||
683 | HDA_CODEC_MUTE_MONO("Enable LFE", 0x16, 2, 0x00, HDA_OUTPUT), | ||
684 | /* Boost mixers */ | ||
685 | HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0x00, HDA_INPUT), | ||
686 | HDA_CODEC_VOLUME("Line Boost Volume", 0x1a, 0x00, HDA_INPUT), | ||
687 | /* Input mixers */ | ||
688 | HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x00, HDA_INPUT), | ||
689 | HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x00, HDA_INPUT), | ||
690 | HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), | ||
691 | HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), | ||
692 | { } /* end */ | ||
693 | }; | ||
694 | |||
695 | static const struct snd_kcontrol_new alc883_chmode_mixer[] = { | ||
696 | { | ||
697 | .iface = SNDRV_CTL_ELEM_IFACE_MIXER, | ||
698 | .name = "Channel Mode", | ||
699 | .info = alc_ch_mode_info, | ||
700 | .get = alc_ch_mode_get, | ||
701 | .put = alc_ch_mode_put, | ||
702 | }, | ||
703 | { } /* end */ | ||
704 | }; | ||
705 | |||
706 | static const struct hda_verb alc889A_mb31_verbs[] = { | ||
707 | /* Init rear pin (used as headphone output) */ | ||
708 | {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc4}, /* Apple Headphones */ | ||
709 | {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Connect to front */ | ||
710 | {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC_HP_EVENT | AC_USRSP_EN}, | ||
711 | /* Init line pin (used as output in 4ch and 6ch mode) */ | ||
712 | {0x1a, AC_VERB_SET_CONNECT_SEL, 0x02}, /* Connect to CLFE */ | ||
713 | /* Init line 2 pin (used as headphone out by default) */ | ||
714 | {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, /* Use as input */ | ||
715 | {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, /* Mute output */ | ||
716 | { } /* end */ | ||
717 | }; | ||
718 | |||
719 | /* Mute speakers according to the headphone jack state */ | ||
720 | static void alc889A_mb31_automute(struct hda_codec *codec) | ||
721 | { | ||
722 | unsigned int present; | ||
723 | |||
724 | /* Mute only in 2ch or 4ch mode */ | ||
725 | if (snd_hda_codec_read(codec, 0x15, 0, AC_VERB_GET_CONNECT_SEL, 0) | ||
726 | == 0x00) { | ||
727 | present = snd_hda_jack_detect(codec, 0x15); | ||
728 | snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0, | ||
729 | HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0); | ||
730 | snd_hda_codec_amp_stereo(codec, 0x16, HDA_OUTPUT, 0, | ||
731 | HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0); | ||
732 | } | ||
733 | } | ||
734 | |||
735 | static void alc889A_mb31_unsol_event(struct hda_codec *codec, unsigned int res) | ||
736 | { | ||
737 | if ((res >> 26) == ALC_HP_EVENT) | ||
738 | alc889A_mb31_automute(codec); | ||
739 | } | ||
740 | |||
741 | static void alc882_unsol_event(struct hda_codec *codec, unsigned int res) | ||
742 | { | ||
743 | alc_exec_unsol_event(codec, res >> 26); | ||
744 | } | ||
745 | |||
746 | /* | ||
747 | * configuration and preset | ||
748 | */ | ||
749 | static const char * const alc882_models[ALC882_MODEL_LAST] = { | ||
750 | [ALC885_MB5] = "mb5", | ||
751 | [ALC885_MACMINI3] = "macmini3", | ||
752 | [ALC885_MBA21] = "mba21", | ||
753 | [ALC885_MBP3] = "mbp3", | ||
754 | [ALC885_IMAC91] = "imac91", | ||
755 | [ALC889A_MB31] = "mb31", | ||
756 | [ALC882_AUTO] = "auto", | ||
757 | }; | ||
758 | |||
759 | /* codec SSID table for Intel Mac */ | ||
760 | static const struct snd_pci_quirk alc882_ssid_cfg_tbl[] = { | ||
761 | SND_PCI_QUIRK(0x106b, 0x00a0, "MacBookPro 3,1", ALC885_MBP3), | ||
762 | SND_PCI_QUIRK(0x106b, 0x00a1, "Macbook", ALC885_MBP3), | ||
763 | SND_PCI_QUIRK(0x106b, 0x00a4, "MacbookPro 4,1", ALC885_MBP3), | ||
764 | SND_PCI_QUIRK(0x106b, 0x2c00, "MacbookPro rev3", ALC885_MBP3), | ||
765 | SND_PCI_QUIRK(0x106b, 0x3000, "iMac", ALC889A_MB31), | ||
766 | SND_PCI_QUIRK(0x106b, 0x3400, "MacBookAir 1,1", ALC885_MBP3), | ||
767 | SND_PCI_QUIRK(0x106b, 0x3500, "MacBookAir 2,1", ALC885_MBA21), | ||
768 | SND_PCI_QUIRK(0x106b, 0x3600, "Macbook 3,1", ALC889A_MB31), | ||
769 | SND_PCI_QUIRK(0x106b, 0x3800, "MacbookPro 4,1", ALC885_MBP3), | ||
770 | SND_PCI_QUIRK(0x106b, 0x4900, "iMac 9,1 Aluminum", ALC885_IMAC91), | ||
771 | SND_PCI_QUIRK(0x106b, 0x3f00, "Macbook 5,1", ALC885_MB5), | ||
772 | SND_PCI_QUIRK(0x106b, 0x4a00, "Macbook 5,2", ALC885_MB5), | ||
773 | /* FIXME: HP jack sense seems not working for MBP 5,1 or 5,2, | ||
774 | * so apparently no perfect solution yet | ||
775 | */ | ||
776 | SND_PCI_QUIRK(0x106b, 0x4000, "MacbookPro 5,1", ALC885_MB5), | ||
777 | SND_PCI_QUIRK(0x106b, 0x4600, "MacbookPro 5,2", ALC885_MB5), | ||
778 | SND_PCI_QUIRK(0x106b, 0x4100, "Macmini 3,1", ALC885_MACMINI3), | ||
779 | {} /* terminator */ | ||
780 | }; | ||
781 | |||
782 | static const struct alc_config_preset alc882_presets[] = { | ||
783 | [ALC885_MBA21] = { | ||
784 | .mixers = { alc885_mba21_mixer }, | ||
785 | .init_verbs = { alc885_mba21_init_verbs, alc_gpio1_init_verbs }, | ||
786 | .num_dacs = 2, | ||
787 | .dac_nids = alc882_dac_nids, | ||
788 | .channel_mode = alc885_mba21_ch_modes, | ||
789 | .num_channel_mode = ARRAY_SIZE(alc885_mba21_ch_modes), | ||
790 | .input_mux = &alc882_capture_source, | ||
791 | .unsol_event = alc882_unsol_event, | ||
792 | .setup = alc885_mba21_setup, | ||
793 | .init_hook = alc_hp_automute, | ||
794 | }, | ||
795 | [ALC885_MBP3] = { | ||
796 | .mixers = { alc885_mbp3_mixer, alc882_chmode_mixer }, | ||
797 | .init_verbs = { alc885_mbp3_init_verbs, | ||
798 | alc_gpio1_init_verbs }, | ||
799 | .num_dacs = 2, | ||
800 | .dac_nids = alc882_dac_nids, | ||
801 | .hp_nid = 0x04, | ||
802 | .channel_mode = alc885_mbp_4ch_modes, | ||
803 | .num_channel_mode = ARRAY_SIZE(alc885_mbp_4ch_modes), | ||
804 | .input_mux = &alc882_capture_source, | ||
805 | .dig_out_nid = ALC882_DIGOUT_NID, | ||
806 | .dig_in_nid = ALC882_DIGIN_NID, | ||
807 | .unsol_event = alc882_unsol_event, | ||
808 | .setup = alc885_mbp3_setup, | ||
809 | .init_hook = alc_hp_automute, | ||
810 | }, | ||
811 | [ALC885_MB5] = { | ||
812 | .mixers = { alc885_mb5_mixer, alc882_chmode_mixer }, | ||
813 | .init_verbs = { alc885_mb5_init_verbs, | ||
814 | alc_gpio1_init_verbs }, | ||
815 | .num_dacs = ARRAY_SIZE(alc882_dac_nids), | ||
816 | .dac_nids = alc882_dac_nids, | ||
817 | .channel_mode = alc885_mb5_6ch_modes, | ||
818 | .num_channel_mode = ARRAY_SIZE(alc885_mb5_6ch_modes), | ||
819 | .input_mux = &mb5_capture_source, | ||
820 | .dig_out_nid = ALC882_DIGOUT_NID, | ||
821 | .dig_in_nid = ALC882_DIGIN_NID, | ||
822 | .unsol_event = alc882_unsol_event, | ||
823 | .setup = alc885_mb5_setup, | ||
824 | .init_hook = alc_hp_automute, | ||
825 | }, | ||
826 | [ALC885_MACMINI3] = { | ||
827 | .mixers = { alc885_macmini3_mixer, alc882_chmode_mixer }, | ||
828 | .init_verbs = { alc885_macmini3_init_verbs, | ||
829 | alc_gpio1_init_verbs }, | ||
830 | .num_dacs = ARRAY_SIZE(alc882_dac_nids), | ||
831 | .dac_nids = alc882_dac_nids, | ||
832 | .channel_mode = alc885_macmini3_6ch_modes, | ||
833 | .num_channel_mode = ARRAY_SIZE(alc885_macmini3_6ch_modes), | ||
834 | .input_mux = &macmini3_capture_source, | ||
835 | .dig_out_nid = ALC882_DIGOUT_NID, | ||
836 | .dig_in_nid = ALC882_DIGIN_NID, | ||
837 | .unsol_event = alc882_unsol_event, | ||
838 | .setup = alc885_macmini3_setup, | ||
839 | .init_hook = alc_hp_automute, | ||
840 | }, | ||
841 | [ALC885_IMAC91] = { | ||
842 | .mixers = {alc885_imac91_mixer}, | ||
843 | .init_verbs = { alc885_imac91_init_verbs, | ||
844 | alc_gpio1_init_verbs }, | ||
845 | .num_dacs = ARRAY_SIZE(alc882_dac_nids), | ||
846 | .dac_nids = alc882_dac_nids, | ||
847 | .channel_mode = alc885_mba21_ch_modes, | ||
848 | .num_channel_mode = ARRAY_SIZE(alc885_mba21_ch_modes), | ||
849 | .input_mux = &alc889A_imac91_capture_source, | ||
850 | .dig_out_nid = ALC882_DIGOUT_NID, | ||
851 | .dig_in_nid = ALC882_DIGIN_NID, | ||
852 | .unsol_event = alc882_unsol_event, | ||
853 | .setup = alc885_imac91_setup, | ||
854 | .init_hook = alc_hp_automute, | ||
855 | }, | ||
856 | [ALC889A_MB31] = { | ||
857 | .mixers = { alc889A_mb31_mixer, alc883_chmode_mixer}, | ||
858 | .init_verbs = { alc883_init_verbs, alc889A_mb31_verbs, | ||
859 | alc_gpio1_init_verbs }, | ||
860 | .adc_nids = alc883_adc_nids, | ||
861 | .num_adc_nids = ARRAY_SIZE(alc883_adc_nids), | ||
862 | .capsrc_nids = alc883_capsrc_nids, | ||
863 | .dac_nids = alc883_dac_nids, | ||
864 | .num_dacs = ARRAY_SIZE(alc883_dac_nids), | ||
865 | .channel_mode = alc889A_mb31_6ch_modes, | ||
866 | .num_channel_mode = ARRAY_SIZE(alc889A_mb31_6ch_modes), | ||
867 | .input_mux = &alc889A_mb31_capture_source, | ||
868 | .dig_out_nid = ALC883_DIGOUT_NID, | ||
869 | .unsol_event = alc889A_mb31_unsol_event, | ||
870 | .init_hook = alc889A_mb31_automute, | ||
871 | }, | ||
872 | }; | ||
873 | |||
874 | |||
diff --git a/sound/pci/hda/alc_quirks.c b/sound/pci/hda/alc_quirks.c deleted file mode 100644 index a63a517780d6..000000000000 --- a/sound/pci/hda/alc_quirks.c +++ /dev/null | |||
@@ -1,167 +0,0 @@ | |||
1 | /* | ||
2 | * Common codes for Realtek codec quirks | ||
3 | * included by patch_realtek.c | ||
4 | */ | ||
5 | |||
6 | /* | ||
7 | * configuration template - to be copied to the spec instance | ||
8 | */ | ||
9 | struct alc_config_preset { | ||
10 | const struct snd_kcontrol_new *mixers[5]; /* should be identical size | ||
11 | * with spec | ||
12 | */ | ||
13 | const struct snd_kcontrol_new *cap_mixer; /* capture mixer */ | ||
14 | const struct hda_verb *init_verbs[5]; | ||
15 | unsigned int num_dacs; | ||
16 | const hda_nid_t *dac_nids; | ||
17 | hda_nid_t dig_out_nid; /* optional */ | ||
18 | hda_nid_t hp_nid; /* optional */ | ||
19 | const hda_nid_t *slave_dig_outs; | ||
20 | unsigned int num_adc_nids; | ||
21 | const hda_nid_t *adc_nids; | ||
22 | const hda_nid_t *capsrc_nids; | ||
23 | hda_nid_t dig_in_nid; | ||
24 | unsigned int num_channel_mode; | ||
25 | const struct hda_channel_mode *channel_mode; | ||
26 | int need_dac_fix; | ||
27 | int const_channel_count; | ||
28 | unsigned int num_mux_defs; | ||
29 | const struct hda_input_mux *input_mux; | ||
30 | void (*unsol_event)(struct hda_codec *, unsigned int); | ||
31 | void (*setup)(struct hda_codec *); | ||
32 | void (*init_hook)(struct hda_codec *); | ||
33 | #ifdef CONFIG_SND_HDA_POWER_SAVE | ||
34 | const struct hda_amp_list *loopbacks; | ||
35 | void (*power_hook)(struct hda_codec *codec); | ||
36 | #endif | ||
37 | }; | ||
38 | |||
39 | /* | ||
40 | * channel mode setting | ||
41 | */ | ||
42 | static int alc_ch_mode_info(struct snd_kcontrol *kcontrol, | ||
43 | struct snd_ctl_elem_info *uinfo) | ||
44 | { | ||
45 | struct hda_codec *codec = snd_kcontrol_chip(kcontrol); | ||
46 | struct alc_spec *spec = codec->spec; | ||
47 | return snd_hda_ch_mode_info(codec, uinfo, spec->channel_mode, | ||
48 | spec->num_channel_mode); | ||
49 | } | ||
50 | |||
51 | static int alc_ch_mode_get(struct snd_kcontrol *kcontrol, | ||
52 | struct snd_ctl_elem_value *ucontrol) | ||
53 | { | ||
54 | struct hda_codec *codec = snd_kcontrol_chip(kcontrol); | ||
55 | struct alc_spec *spec = codec->spec; | ||
56 | return snd_hda_ch_mode_get(codec, ucontrol, spec->channel_mode, | ||
57 | spec->num_channel_mode, | ||
58 | spec->ext_channel_count); | ||
59 | } | ||
60 | |||
61 | static int alc_ch_mode_put(struct snd_kcontrol *kcontrol, | ||
62 | struct snd_ctl_elem_value *ucontrol) | ||
63 | { | ||
64 | struct hda_codec *codec = snd_kcontrol_chip(kcontrol); | ||
65 | struct alc_spec *spec = codec->spec; | ||
66 | int err = snd_hda_ch_mode_put(codec, ucontrol, spec->channel_mode, | ||
67 | spec->num_channel_mode, | ||
68 | &spec->ext_channel_count); | ||
69 | if (err >= 0 && !spec->const_channel_count) { | ||
70 | spec->multiout.max_channels = spec->ext_channel_count; | ||
71 | if (spec->need_dac_fix) | ||
72 | spec->multiout.num_dacs = spec->multiout.max_channels / 2; | ||
73 | } | ||
74 | return err; | ||
75 | } | ||
76 | |||
77 | static void alc_fixup_autocfg_pin_nums(struct hda_codec *codec) | ||
78 | { | ||
79 | struct alc_spec *spec = codec->spec; | ||
80 | struct auto_pin_cfg *cfg = &spec->autocfg; | ||
81 | |||
82 | if (!cfg->line_outs) { | ||
83 | while (cfg->line_outs < AUTO_CFG_MAX_OUTS && | ||
84 | cfg->line_out_pins[cfg->line_outs]) | ||
85 | cfg->line_outs++; | ||
86 | } | ||
87 | if (!cfg->speaker_outs) { | ||
88 | while (cfg->speaker_outs < AUTO_CFG_MAX_OUTS && | ||
89 | cfg->speaker_pins[cfg->speaker_outs]) | ||
90 | cfg->speaker_outs++; | ||
91 | } | ||
92 | if (!cfg->hp_outs) { | ||
93 | while (cfg->hp_outs < AUTO_CFG_MAX_OUTS && | ||
94 | cfg->hp_pins[cfg->hp_outs]) | ||
95 | cfg->hp_outs++; | ||
96 | } | ||
97 | } | ||
98 | |||
99 | /* | ||
100 | * set up from the preset table | ||
101 | */ | ||
102 | static void setup_preset(struct hda_codec *codec, | ||
103 | const struct alc_config_preset *preset) | ||
104 | { | ||
105 | struct alc_spec *spec = codec->spec; | ||
106 | int i; | ||
107 | |||
108 | for (i = 0; i < ARRAY_SIZE(preset->mixers) && preset->mixers[i]; i++) | ||
109 | add_mixer(spec, preset->mixers[i]); | ||
110 | spec->cap_mixer = preset->cap_mixer; | ||
111 | for (i = 0; i < ARRAY_SIZE(preset->init_verbs) && preset->init_verbs[i]; | ||
112 | i++) | ||
113 | add_verb(spec, preset->init_verbs[i]); | ||
114 | |||
115 | spec->channel_mode = preset->channel_mode; | ||
116 | spec->num_channel_mode = preset->num_channel_mode; | ||
117 | spec->need_dac_fix = preset->need_dac_fix; | ||
118 | spec->const_channel_count = preset->const_channel_count; | ||
119 | |||
120 | if (preset->const_channel_count) | ||
121 | spec->multiout.max_channels = preset->const_channel_count; | ||
122 | else | ||
123 | spec->multiout.max_channels = spec->channel_mode[0].channels; | ||
124 | spec->ext_channel_count = spec->channel_mode[0].channels; | ||
125 | |||
126 | spec->multiout.num_dacs = preset->num_dacs; | ||
127 | spec->multiout.dac_nids = preset->dac_nids; | ||
128 | spec->multiout.dig_out_nid = preset->dig_out_nid; | ||
129 | spec->multiout.slave_dig_outs = preset->slave_dig_outs; | ||
130 | spec->multiout.hp_nid = preset->hp_nid; | ||
131 | |||
132 | spec->num_mux_defs = preset->num_mux_defs; | ||
133 | if (!spec->num_mux_defs) | ||
134 | spec->num_mux_defs = 1; | ||
135 | spec->input_mux = preset->input_mux; | ||
136 | |||
137 | spec->num_adc_nids = preset->num_adc_nids; | ||
138 | spec->adc_nids = preset->adc_nids; | ||
139 | spec->capsrc_nids = preset->capsrc_nids; | ||
140 | spec->dig_in_nid = preset->dig_in_nid; | ||
141 | |||
142 | spec->unsol_event = preset->unsol_event; | ||
143 | spec->init_hook = preset->init_hook; | ||
144 | #ifdef CONFIG_SND_HDA_POWER_SAVE | ||
145 | spec->power_hook = preset->power_hook; | ||
146 | spec->loopback.amplist = preset->loopbacks; | ||
147 | #endif | ||
148 | |||
149 | if (preset->setup) | ||
150 | preset->setup(codec); | ||
151 | |||
152 | alc_fixup_autocfg_pin_nums(codec); | ||
153 | } | ||
154 | |||
155 | static void alc_simple_setup_automute(struct alc_spec *spec, int mode) | ||
156 | { | ||
157 | int lo_pin = spec->autocfg.line_out_pins[0]; | ||
158 | |||
159 | if (lo_pin == spec->autocfg.speaker_pins[0] || | ||
160 | lo_pin == spec->autocfg.hp_pins[0]) | ||
161 | lo_pin = 0; | ||
162 | spec->automute_mode = mode; | ||
163 | spec->detect_hp = !!spec->autocfg.hp_pins[0]; | ||
164 | spec->detect_lo = !!lo_pin; | ||
165 | spec->automute_lo = spec->automute_lo_possible = !!lo_pin; | ||
166 | spec->automute_speaker = spec->automute_speaker_possible = !!spec->autocfg.speaker_pins[0]; | ||
167 | } | ||
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index 3c6f5b5161f0..c5216b58d218 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c | |||
@@ -4808,21 +4808,6 @@ static const struct alc_model_fixup alc880_fixup_models[] = { | |||
4808 | 4808 | ||
4809 | 4809 | ||
4810 | /* | 4810 | /* |
4811 | * board setups | ||
4812 | */ | ||
4813 | #ifdef CONFIG_SND_HDA_ENABLE_REALTEK_QUIRKS | ||
4814 | #define alc_board_config \ | ||
4815 | snd_hda_check_board_config | ||
4816 | #define alc_board_codec_sid_config \ | ||
4817 | snd_hda_check_board_codec_sid_config | ||
4818 | #include "alc_quirks.c" | ||
4819 | #else | ||
4820 | #define alc_board_config(codec, nums, models, tbl) -1 | ||
4821 | #define alc_board_codec_sid_config(codec, nums, models, tbl) -1 | ||
4822 | #define setup_preset(codec, x) /* NOP */ | ||
4823 | #endif | ||
4824 | |||
4825 | /* | ||
4826 | * OK, here we have finally the patch for ALC880 | 4811 | * OK, here we have finally the patch for ALC880 |
4827 | */ | 4812 | */ |
4828 | static int patch_alc880(struct hda_codec *codec) | 4813 | static int patch_alc880(struct hda_codec *codec) |
@@ -5091,6 +5076,8 @@ enum { | |||
5091 | ALC882_FIXUP_EAPD, | 5076 | ALC882_FIXUP_EAPD, |
5092 | ALC883_FIXUP_EAPD, | 5077 | ALC883_FIXUP_EAPD, |
5093 | ALC883_FIXUP_ACER_EAPD, | 5078 | ALC883_FIXUP_ACER_EAPD, |
5079 | ALC882_FIXUP_GPIO1, | ||
5080 | ALC882_FIXUP_GPIO2, | ||
5094 | ALC882_FIXUP_GPIO3, | 5081 | ALC882_FIXUP_GPIO3, |
5095 | ALC889_FIXUP_COEF, | 5082 | ALC889_FIXUP_COEF, |
5096 | ALC882_FIXUP_ASUS_W2JC, | 5083 | ALC882_FIXUP_ASUS_W2JC, |
@@ -5099,6 +5086,8 @@ enum { | |||
5099 | ALC882_FIXUP_ASPIRE_8930G_VERBS, | 5086 | ALC882_FIXUP_ASPIRE_8930G_VERBS, |
5100 | ALC885_FIXUP_MACPRO_GPIO, | 5087 | ALC885_FIXUP_MACPRO_GPIO, |
5101 | ALC889_FIXUP_DAC_ROUTE, | 5088 | ALC889_FIXUP_DAC_ROUTE, |
5089 | ALC889_FIXUP_MBP_VREF, | ||
5090 | ALC889_FIXUP_IMAC91_VREF, | ||
5102 | }; | 5091 | }; |
5103 | 5092 | ||
5104 | static void alc889_fixup_coef(struct hda_codec *codec, | 5093 | static void alc889_fixup_coef(struct hda_codec *codec, |
@@ -5169,6 +5158,51 @@ static void alc889_fixup_dac_route(struct hda_codec *codec, | |||
5169 | } | 5158 | } |
5170 | } | 5159 | } |
5171 | 5160 | ||
5161 | /* Set VREF on HP pin */ | ||
5162 | static void alc889_fixup_mbp_vref(struct hda_codec *codec, | ||
5163 | const struct alc_fixup *fix, int action) | ||
5164 | { | ||
5165 | struct alc_spec *spec = codec->spec; | ||
5166 | static hda_nid_t nids[2] = { 0x14, 0x15 }; | ||
5167 | int i; | ||
5168 | |||
5169 | if (action != ALC_FIXUP_ACT_INIT) | ||
5170 | return; | ||
5171 | for (i = 0; i < ARRAY_SIZE(nids); i++) { | ||
5172 | unsigned int val = snd_hda_codec_get_pincfg(codec, nids[i]); | ||
5173 | if (get_defcfg_device(val) != AC_JACK_HP_OUT) | ||
5174 | continue; | ||
5175 | val = snd_hda_codec_read(codec, nids[i], 0, | ||
5176 | AC_VERB_GET_PIN_WIDGET_CONTROL, 0); | ||
5177 | val |= AC_PINCTL_VREF_80; | ||
5178 | snd_hda_codec_write(codec, nids[i], 0, | ||
5179 | AC_VERB_SET_PIN_WIDGET_CONTROL, val); | ||
5180 | spec->keep_vref_in_automute = 1; | ||
5181 | break; | ||
5182 | } | ||
5183 | } | ||
5184 | |||
5185 | /* Set VREF on speaker pins on imac91 */ | ||
5186 | static void alc889_fixup_imac91_vref(struct hda_codec *codec, | ||
5187 | const struct alc_fixup *fix, int action) | ||
5188 | { | ||
5189 | struct alc_spec *spec = codec->spec; | ||
5190 | static hda_nid_t nids[2] = { 0x18, 0x1a }; | ||
5191 | int i; | ||
5192 | |||
5193 | if (action != ALC_FIXUP_ACT_INIT) | ||
5194 | return; | ||
5195 | for (i = 0; i < ARRAY_SIZE(nids); i++) { | ||
5196 | unsigned int val; | ||
5197 | val = snd_hda_codec_read(codec, nids[i], 0, | ||
5198 | AC_VERB_GET_PIN_WIDGET_CONTROL, 0); | ||
5199 | val |= AC_PINCTL_VREF_50; | ||
5200 | snd_hda_codec_write(codec, nids[i], 0, | ||
5201 | AC_VERB_SET_PIN_WIDGET_CONTROL, val); | ||
5202 | } | ||
5203 | spec->keep_vref_in_automute = 1; | ||
5204 | } | ||
5205 | |||
5172 | static const struct alc_fixup alc882_fixups[] = { | 5206 | static const struct alc_fixup alc882_fixups[] = { |
5173 | [ALC882_FIXUP_ABIT_AW9D_MAX] = { | 5207 | [ALC882_FIXUP_ABIT_AW9D_MAX] = { |
5174 | .type = ALC_FIXUP_PINS, | 5208 | .type = ALC_FIXUP_PINS, |
@@ -5247,6 +5281,14 @@ static const struct alc_fixup alc882_fixups[] = { | |||
5247 | { } | 5281 | { } |
5248 | } | 5282 | } |
5249 | }, | 5283 | }, |
5284 | [ALC882_FIXUP_GPIO1] = { | ||
5285 | .type = ALC_FIXUP_VERBS, | ||
5286 | .v.verbs = alc_gpio1_init_verbs, | ||
5287 | }, | ||
5288 | [ALC882_FIXUP_GPIO2] = { | ||
5289 | .type = ALC_FIXUP_VERBS, | ||
5290 | .v.verbs = alc_gpio2_init_verbs, | ||
5291 | }, | ||
5250 | [ALC882_FIXUP_GPIO3] = { | 5292 | [ALC882_FIXUP_GPIO3] = { |
5251 | .type = ALC_FIXUP_VERBS, | 5293 | .type = ALC_FIXUP_VERBS, |
5252 | .v.verbs = alc_gpio3_init_verbs, | 5294 | .v.verbs = alc_gpio3_init_verbs, |
@@ -5320,6 +5362,18 @@ static const struct alc_fixup alc882_fixups[] = { | |||
5320 | .type = ALC_FIXUP_FUNC, | 5362 | .type = ALC_FIXUP_FUNC, |
5321 | .v.func = alc889_fixup_dac_route, | 5363 | .v.func = alc889_fixup_dac_route, |
5322 | }, | 5364 | }, |
5365 | [ALC889_FIXUP_MBP_VREF] = { | ||
5366 | .type = ALC_FIXUP_FUNC, | ||
5367 | .v.func = alc889_fixup_mbp_vref, | ||
5368 | .chained = true, | ||
5369 | .chain_id = ALC882_FIXUP_GPIO1, | ||
5370 | }, | ||
5371 | [ALC889_FIXUP_IMAC91_VREF] = { | ||
5372 | .type = ALC_FIXUP_FUNC, | ||
5373 | .v.func = alc889_fixup_imac91_vref, | ||
5374 | .chained = true, | ||
5375 | .chain_id = ALC882_FIXUP_GPIO1, | ||
5376 | }, | ||
5323 | }; | 5377 | }; |
5324 | 5378 | ||
5325 | static const struct snd_pci_quirk alc882_fixup_tbl[] = { | 5379 | static const struct snd_pci_quirk alc882_fixup_tbl[] = { |
@@ -5353,11 +5407,26 @@ static const struct snd_pci_quirk alc882_fixup_tbl[] = { | |||
5353 | SND_PCI_QUIRK(0x104d, 0x9047, "Sony Vaio TT", ALC889_FIXUP_VAIO_TT), | 5407 | SND_PCI_QUIRK(0x104d, 0x9047, "Sony Vaio TT", ALC889_FIXUP_VAIO_TT), |
5354 | 5408 | ||
5355 | /* All Apple entries are in codec SSIDs */ | 5409 | /* All Apple entries are in codec SSIDs */ |
5410 | SND_PCI_QUIRK(0x106b, 0x00a0, "MacBookPro 3,1", ALC889_FIXUP_MBP_VREF), | ||
5411 | SND_PCI_QUIRK(0x106b, 0x00a1, "Macbook", ALC889_FIXUP_MBP_VREF), | ||
5412 | SND_PCI_QUIRK(0x106b, 0x00a4, "MacbookPro 4,1", ALC889_FIXUP_MBP_VREF), | ||
5356 | SND_PCI_QUIRK(0x106b, 0x0c00, "Mac Pro", ALC885_FIXUP_MACPRO_GPIO), | 5413 | SND_PCI_QUIRK(0x106b, 0x0c00, "Mac Pro", ALC885_FIXUP_MACPRO_GPIO), |
5357 | SND_PCI_QUIRK(0x106b, 0x1000, "iMac 24", ALC885_FIXUP_MACPRO_GPIO), | 5414 | SND_PCI_QUIRK(0x106b, 0x1000, "iMac 24", ALC885_FIXUP_MACPRO_GPIO), |
5358 | SND_PCI_QUIRK(0x106b, 0x2800, "AppleTV", ALC885_FIXUP_MACPRO_GPIO), | 5415 | SND_PCI_QUIRK(0x106b, 0x2800, "AppleTV", ALC885_FIXUP_MACPRO_GPIO), |
5416 | SND_PCI_QUIRK(0x106b, 0x2c00, "MacbookPro rev3", ALC889_FIXUP_MBP_VREF), | ||
5417 | SND_PCI_QUIRK(0x106b, 0x3000, "iMac", ALC889_FIXUP_MBP_VREF), | ||
5359 | SND_PCI_QUIRK(0x106b, 0x3200, "iMac 7,1 Aluminum", ALC882_FIXUP_EAPD), | 5418 | SND_PCI_QUIRK(0x106b, 0x3200, "iMac 7,1 Aluminum", ALC882_FIXUP_EAPD), |
5419 | SND_PCI_QUIRK(0x106b, 0x3400, "MacBookAir 1,1", ALC889_FIXUP_MBP_VREF), | ||
5420 | SND_PCI_QUIRK(0x106b, 0x3500, "MacBookAir 2,1", ALC889_FIXUP_MBP_VREF), | ||
5421 | SND_PCI_QUIRK(0x106b, 0x3600, "Macbook 3,1", ALC889_FIXUP_MBP_VREF), | ||
5422 | SND_PCI_QUIRK(0x106b, 0x3800, "MacbookPro 4,1", ALC889_FIXUP_MBP_VREF), | ||
5360 | SND_PCI_QUIRK(0x106b, 0x3e00, "iMac 24 Aluminum", ALC885_FIXUP_MACPRO_GPIO), | 5423 | SND_PCI_QUIRK(0x106b, 0x3e00, "iMac 24 Aluminum", ALC885_FIXUP_MACPRO_GPIO), |
5424 | SND_PCI_QUIRK(0x106b, 0x3f00, "Macbook 5,1", ALC889_FIXUP_IMAC91_VREF), | ||
5425 | SND_PCI_QUIRK(0x106b, 0x4000, "MacbookPro 5,1", ALC889_FIXUP_IMAC91_VREF), | ||
5426 | SND_PCI_QUIRK(0x106b, 0x4100, "Macmini 3,1", ALC889_FIXUP_IMAC91_VREF), | ||
5427 | SND_PCI_QUIRK(0x106b, 0x4600, "MacbookPro 5,2", ALC889_FIXUP_IMAC91_VREF), | ||
5428 | SND_PCI_QUIRK(0x106b, 0x4900, "iMac 9,1 Aluminum", ALC889_FIXUP_IMAC91_VREF), | ||
5429 | SND_PCI_QUIRK(0x106b, 0x4a00, "Macbook 5,2", ALC889_FIXUP_IMAC91_VREF), | ||
5361 | 5430 | ||
5362 | SND_PCI_QUIRK(0x1071, 0x8258, "Evesham Voyaeger", ALC882_FIXUP_EAPD), | 5431 | SND_PCI_QUIRK(0x1071, 0x8258, "Evesham Voyaeger", ALC882_FIXUP_EAPD), |
5363 | SND_PCI_QUIRK_VENDOR(0x1462, "MSI", ALC882_FIXUP_GPIO3), | 5432 | SND_PCI_QUIRK_VENDOR(0x1462, "MSI", ALC882_FIXUP_GPIO3), |
@@ -5382,14 +5451,10 @@ static int alc882_parse_auto_config(struct hda_codec *codec) | |||
5382 | 5451 | ||
5383 | /* | 5452 | /* |
5384 | */ | 5453 | */ |
5385 | #ifdef CONFIG_SND_HDA_ENABLE_REALTEK_QUIRKS | ||
5386 | #include "alc882_quirks.c" | ||
5387 | #endif | ||
5388 | |||
5389 | static int patch_alc882(struct hda_codec *codec) | 5454 | static int patch_alc882(struct hda_codec *codec) |
5390 | { | 5455 | { |
5391 | struct alc_spec *spec; | 5456 | struct alc_spec *spec; |
5392 | int err, board_config; | 5457 | int err; |
5393 | 5458 | ||
5394 | spec = kzalloc(sizeof(*spec), GFP_KERNEL); | 5459 | spec = kzalloc(sizeof(*spec), GFP_KERNEL); |
5395 | if (spec == NULL) | 5460 | if (spec == NULL) |
@@ -5413,36 +5478,15 @@ static int patch_alc882(struct hda_codec *codec) | |||
5413 | if (err < 0) | 5478 | if (err < 0) |
5414 | goto error; | 5479 | goto error; |
5415 | 5480 | ||
5416 | board_config = alc_board_config(codec, ALC882_MODEL_LAST, | 5481 | alc_pick_fixup(codec, NULL, alc882_fixup_tbl, alc882_fixups); |
5417 | alc882_models, NULL); | 5482 | alc_apply_fixup(codec, ALC_FIXUP_ACT_PRE_PROBE); |
5418 | if (board_config < 0) | ||
5419 | board_config = alc_board_codec_sid_config(codec, | ||
5420 | ALC882_MODEL_LAST, alc882_models, alc882_ssid_cfg_tbl); | ||
5421 | |||
5422 | if (board_config < 0) { | ||
5423 | printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n", | ||
5424 | codec->chip_name); | ||
5425 | board_config = ALC_MODEL_AUTO; | ||
5426 | } | ||
5427 | |||
5428 | if (board_config == ALC_MODEL_AUTO) { | ||
5429 | alc_pick_fixup(codec, NULL, alc882_fixup_tbl, alc882_fixups); | ||
5430 | alc_apply_fixup(codec, ALC_FIXUP_ACT_PRE_PROBE); | ||
5431 | } | ||
5432 | 5483 | ||
5433 | alc_auto_parse_customize_define(codec); | 5484 | alc_auto_parse_customize_define(codec); |
5434 | 5485 | ||
5435 | if (board_config == ALC_MODEL_AUTO) { | 5486 | /* automatic parse from the BIOS config */ |
5436 | /* automatic parse from the BIOS config */ | 5487 | err = alc882_parse_auto_config(codec); |
5437 | err = alc882_parse_auto_config(codec); | 5488 | if (err < 0) |
5438 | if (err < 0) | 5489 | goto error; |
5439 | goto error; | ||
5440 | } | ||
5441 | |||
5442 | if (board_config != ALC_MODEL_AUTO) { | ||
5443 | setup_preset(codec, &alc882_presets[board_config]); | ||
5444 | spec->vmaster_nid = 0x0c; | ||
5445 | } | ||
5446 | 5490 | ||
5447 | if (!spec->no_analog && !spec->adc_nids) { | 5491 | if (!spec->no_analog && !spec->adc_nids) { |
5448 | alc_auto_fill_adc_caps(codec); | 5492 | alc_auto_fill_adc_caps(codec); |
@@ -5461,10 +5505,7 @@ static int patch_alc882(struct hda_codec *codec) | |||
5461 | } | 5505 | } |
5462 | 5506 | ||
5463 | codec->patch_ops = alc_patch_ops; | 5507 | codec->patch_ops = alc_patch_ops; |
5464 | if (board_config == ALC_MODEL_AUTO) | 5508 | spec->init_hook = alc_auto_init_std; |
5465 | spec->init_hook = alc_auto_init_std; | ||
5466 | else | ||
5467 | codec->patch_ops.build_controls = __alc_build_controls; | ||
5468 | 5509 | ||
5469 | #ifdef CONFIG_SND_HDA_POWER_SAVE | 5510 | #ifdef CONFIG_SND_HDA_POWER_SAVE |
5470 | if (!spec->loopback.amplist) | 5511 | if (!spec->loopback.amplist) |