diff options
| -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, |
