aboutsummaryrefslogtreecommitdiffstats
path: root/sound/pci/hda/patch_realtek.c
diff options
context:
space:
mode:
Diffstat (limited to 'sound/pci/hda/patch_realtek.c')
-rw-r--r--sound/pci/hda/patch_realtek.c105
1 files changed, 75 insertions, 30 deletions
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
index da03693099eb..172395465e8a 100644
--- a/sound/pci/hda/patch_realtek.c
+++ b/sound/pci/hda/patch_realtek.c
@@ -288,6 +288,80 @@ static void alc880_unsol_event(struct hda_codec *codec, unsigned int res)
288 snd_hda_jack_unsol_event(codec, res >> 2); 288 snd_hda_jack_unsol_event(codec, res >> 2);
289} 289}
290 290
291/* Change EAPD to verb control */
292static void alc_fill_eapd_coef(struct hda_codec *codec)
293{
294 int coef;
295
296 coef = alc_get_coef0(codec);
297
298 switch (codec->vendor_id) {
299 case 0x10ec0262:
300 alc_update_coef_idx(codec, 0x7, 0, 1<<5);
301 break;
302 case 0x10ec0267:
303 case 0x10ec0268:
304 alc_update_coef_idx(codec, 0x7, 0, 1<<13);
305 break;
306 case 0x10ec0269:
307 if ((coef & 0x00f0) == 0x0010)
308 alc_update_coef_idx(codec, 0xd, 0, 1<<14);
309 if ((coef & 0x00f0) == 0x0020)
310 alc_update_coef_idx(codec, 0x4, 1<<15, 0);
311 if ((coef & 0x00f0) == 0x0030)
312 alc_update_coef_idx(codec, 0x10, 1<<9, 0);
313 break;
314 case 0x10ec0280:
315 case 0x10ec0284:
316 case 0x10ec0290:
317 case 0x10ec0292:
318 alc_update_coef_idx(codec, 0x4, 1<<15, 0);
319 break;
320 case 0x10ec0233:
321 case 0x10ec0255:
322 case 0x10ec0282:
323 case 0x10ec0283:
324 case 0x10ec0286:
325 case 0x10ec0288:
326 alc_update_coef_idx(codec, 0x10, 1<<9, 0);
327 break;
328 case 0x10ec0285:
329 case 0x10ec0293:
330 alc_update_coef_idx(codec, 0xa, 1<<13, 0);
331 break;
332 case 0x10ec0662:
333 if ((coef & 0x00f0) == 0x0030)
334 alc_update_coef_idx(codec, 0x4, 1<<10, 0); /* EAPD Ctrl */
335 break;
336 case 0x10ec0272:
337 case 0x10ec0273:
338 case 0x10ec0663:
339 case 0x10ec0665:
340 case 0x10ec0670:
341 case 0x10ec0671:
342 case 0x10ec0672:
343 alc_update_coef_idx(codec, 0xd, 0, 1<<14); /* EAPD Ctrl */
344 break;
345 case 0x10ec0668:
346 alc_update_coef_idx(codec, 0x7, 3<<13, 0);
347 break;
348 case 0x10ec0867:
349 alc_update_coef_idx(codec, 0x4, 1<<10, 0);
350 break;
351 case 0x10ec0888:
352 if ((coef & 0x00f0) == 0x0020 || (coef & 0x00f0) == 0x0030)
353 alc_update_coef_idx(codec, 0x7, 1<<5, 0);
354 break;
355 case 0x10ec0892:
356 alc_update_coef_idx(codec, 0x7, 1<<5, 0);
357 break;
358 case 0x10ec0899:
359 case 0x10ec0900:
360 alc_update_coef_idx(codec, 0x7, 1<<1, 0);
361 break;
362 }
363}
364
291/* additional initialization for ALC888 variants */ 365/* additional initialization for ALC888 variants */
292static void alc888_coef_init(struct hda_codec *codec) 366static void alc888_coef_init(struct hda_codec *codec)
293{ 367{
@@ -339,6 +413,7 @@ static void alc_eapd_shutup(struct hda_codec *codec)
339/* generic EAPD initialization */ 413/* generic EAPD initialization */
340static void alc_auto_init_amp(struct hda_codec *codec, int type) 414static void alc_auto_init_amp(struct hda_codec *codec, int type)
341{ 415{
416 alc_fill_eapd_coef(codec);
342 alc_auto_setup_eapd(codec, true); 417 alc_auto_setup_eapd(codec, true);
343 switch (type) { 418 switch (type) {
344 case ALC_INIT_GPIO1: 419 case ALC_INIT_GPIO1:
@@ -5212,9 +5287,6 @@ static void alc269_fill_coef(struct hda_codec *codec)
5212 } 5287 }
5213 } 5288 }
5214 5289
5215 /* Class D */
5216 alc_update_coef_idx(codec, 0xd, 0, 1<<14);
5217
5218 /* HP */ 5290 /* HP */
5219 alc_update_coef_idx(codec, 0x4, 0, 1<<11); 5291 alc_update_coef_idx(codec, 0x4, 0, 1<<11);
5220} 5292}
@@ -6124,29 +6196,6 @@ static const struct snd_hda_pin_quirk alc662_pin_fixup_tbl[] = {
6124 {} 6196 {}
6125}; 6197};
6126 6198
6127static void alc662_fill_coef(struct hda_codec *codec)
6128{
6129 int coef;
6130
6131 coef = alc_get_coef0(codec);
6132
6133 switch (codec->vendor_id) {
6134 case 0x10ec0662:
6135 if ((coef & 0x00f0) == 0x0030)
6136 alc_update_coef_idx(codec, 0x4, 1<<10, 0); /* EAPD Ctrl */
6137 break;
6138 case 0x10ec0272:
6139 case 0x10ec0273:
6140 case 0x10ec0663:
6141 case 0x10ec0665:
6142 case 0x10ec0670:
6143 case 0x10ec0671:
6144 case 0x10ec0672:
6145 alc_update_coef_idx(codec, 0xd, 0, 1<<14); /* EAPD Ctrl */
6146 break;
6147 }
6148}
6149
6150/* 6199/*
6151 */ 6200 */
6152static int patch_alc662(struct hda_codec *codec) 6201static int patch_alc662(struct hda_codec *codec)
@@ -6169,10 +6218,6 @@ static int patch_alc662(struct hda_codec *codec)
6169 case 0x10ec0668: 6218 case 0x10ec0668:
6170 spec->init_hook = alc668_restore_default_value; 6219 spec->init_hook = alc668_restore_default_value;
6171 break; 6220 break;
6172 default:
6173 spec->init_hook = alc662_fill_coef;
6174 alc662_fill_coef(codec);
6175 break;
6176 } 6221 }
6177 6222
6178 snd_hda_pick_fixup(codec, alc662_fixup_models, 6223 snd_hda_pick_fixup(codec, alc662_fixup_models,