diff options
Diffstat (limited to 'sound/pci/hda/patch_realtek.c')
-rw-r--r-- | sound/pci/hda/patch_realtek.c | 105 |
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 */ | ||
292 | static 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 */ |
292 | static void alc888_coef_init(struct hda_codec *codec) | 366 | static 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 */ |
340 | static void alc_auto_init_amp(struct hda_codec *codec, int type) | 414 | static 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 | ||
6127 | static 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 | */ |
6152 | static int patch_alc662(struct hda_codec *codec) | 6201 | static 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, |