aboutsummaryrefslogtreecommitdiffstats
path: root/sound/pci/hda
diff options
context:
space:
mode:
authorKailang Yang <kailang@realtek.com>2014-11-12 04:38:08 -0500
committerTakashi Iwai <tiwai@suse.de>2014-11-12 05:34:13 -0500
commit394c97f824fa6b62351fe08b722fff2fc5188bfc (patch)
tree5b8e9e7d151342c598fbddeddef5a004b2a22b7a /sound/pci/hda
parent1a290581ded60e87276741f8ca97b161d2b226fc (diff)
ALSA: hda/realtek - Change EAPD to verb control
This will fix no sound in Linux system after reboot from windows. Change log: - alc662_fill_coef() is replaced with alc_fill_eapd_coef_idx() and move into alc_auto_init_amp(). - For ALC262, ALC267, ALC268, ALC269, ALC233, ALC255, ALC280, ALC282, ALC283, ALC284, ALC285, ALC286, ALC288, ALC290, ALC292, ALC293, ALC294, ALC668, ALC888VC, ALC888VD, ALC891, ALC892, ALC898 and ALC1150, add update COEF control for EAPD setting. - Remove alc269_fill_coef() for update EAPD control line. ADDITIONAL NOTE: Many Realtek cdoecs have a COEF bit to switch the master amp control between COEF and EAPD. Windows drivers seem using COEF while we use EAPD, which is more standard. As a result, some system suffer from the silent output when booting after Windows. This patch sets the COEF bits on the relevant codecs properly to switch to EAPD control. Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=87771 Signed-off-by: Kailang Yang <kailang@realtek.com> Signed-off-by: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to 'sound/pci/hda')
-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,