diff options
-rw-r--r-- | sound/pci/hda/patch_realtek.c | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index faeb74f28207..b3abe9ca826d 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c | |||
@@ -337,6 +337,9 @@ struct alc_spec { | |||
337 | /* hooks */ | 337 | /* hooks */ |
338 | void (*init_hook)(struct hda_codec *codec); | 338 | void (*init_hook)(struct hda_codec *codec); |
339 | void (*unsol_event)(struct hda_codec *codec, unsigned int res); | 339 | void (*unsol_event)(struct hda_codec *codec, unsigned int res); |
340 | #ifdef CONFIG_SND_HDA_POWER_SAVE | ||
341 | void (*power_hook)(struct hda_codec *codec, int power); | ||
342 | #endif | ||
340 | 343 | ||
341 | /* for pin sensing */ | 344 | /* for pin sensing */ |
342 | unsigned int sense_updated: 1; | 345 | unsigned int sense_updated: 1; |
@@ -388,6 +391,7 @@ struct alc_config_preset { | |||
388 | void (*init_hook)(struct hda_codec *); | 391 | void (*init_hook)(struct hda_codec *); |
389 | #ifdef CONFIG_SND_HDA_POWER_SAVE | 392 | #ifdef CONFIG_SND_HDA_POWER_SAVE |
390 | struct hda_amp_list *loopbacks; | 393 | struct hda_amp_list *loopbacks; |
394 | void (*power_hook)(struct hda_codec *codec, int power); | ||
391 | #endif | 395 | #endif |
392 | }; | 396 | }; |
393 | 397 | ||
@@ -900,6 +904,7 @@ static void setup_preset(struct hda_codec *codec, | |||
900 | spec->unsol_event = preset->unsol_event; | 904 | spec->unsol_event = preset->unsol_event; |
901 | spec->init_hook = preset->init_hook; | 905 | spec->init_hook = preset->init_hook; |
902 | #ifdef CONFIG_SND_HDA_POWER_SAVE | 906 | #ifdef CONFIG_SND_HDA_POWER_SAVE |
907 | spec->power_hook = preset->power_hook; | ||
903 | spec->loopback.amplist = preset->loopbacks; | 908 | spec->loopback.amplist = preset->loopbacks; |
904 | #endif | 909 | #endif |
905 | 910 | ||
@@ -1826,6 +1831,16 @@ static void alc889_acer_aspire_8930g_setup(struct hda_codec *codec) | |||
1826 | spec->autocfg.speaker_pins[2] = 0x1b; | 1831 | spec->autocfg.speaker_pins[2] = 0x1b; |
1827 | } | 1832 | } |
1828 | 1833 | ||
1834 | #ifdef CONFIG_SND_HDA_POWER_SAVE | ||
1835 | static void alc889_power_eapd(struct hda_codec *codec, int power) | ||
1836 | { | ||
1837 | snd_hda_codec_write(codec, 0x14, 0, | ||
1838 | AC_VERB_SET_EAPD_BTLENABLE, power ? 2 : 0); | ||
1839 | snd_hda_codec_write(codec, 0x15, 0, | ||
1840 | AC_VERB_SET_EAPD_BTLENABLE, power ? 2 : 0); | ||
1841 | } | ||
1842 | #endif | ||
1843 | |||
1829 | /* | 1844 | /* |
1830 | * ALC880 3-stack model | 1845 | * ALC880 3-stack model |
1831 | * | 1846 | * |
@@ -3619,12 +3634,29 @@ static void alc_free(struct hda_codec *codec) | |||
3619 | snd_hda_detach_beep_device(codec); | 3634 | snd_hda_detach_beep_device(codec); |
3620 | } | 3635 | } |
3621 | 3636 | ||
3637 | #ifdef CONFIG_SND_HDA_POWER_SAVE | ||
3638 | static int alc_suspend(struct hda_codec *codec, pm_message_t state) | ||
3639 | { | ||
3640 | struct alc_spec *spec = codec->spec; | ||
3641 | if (spec && spec->power_hook) | ||
3642 | spec->power_hook(codec, 0); | ||
3643 | return 0; | ||
3644 | } | ||
3645 | #endif | ||
3646 | |||
3622 | #ifdef SND_HDA_NEEDS_RESUME | 3647 | #ifdef SND_HDA_NEEDS_RESUME |
3623 | static int alc_resume(struct hda_codec *codec) | 3648 | static int alc_resume(struct hda_codec *codec) |
3624 | { | 3649 | { |
3650 | #ifdef CONFIG_SND_HDA_POWER_SAVE | ||
3651 | struct alc_spec *spec = codec->spec; | ||
3652 | #endif | ||
3625 | codec->patch_ops.init(codec); | 3653 | codec->patch_ops.init(codec); |
3626 | snd_hda_codec_resume_amp(codec); | 3654 | snd_hda_codec_resume_amp(codec); |
3627 | snd_hda_codec_resume_cache(codec); | 3655 | snd_hda_codec_resume_cache(codec); |
3656 | #ifdef CONFIG_SND_HDA_POWER_SAVE | ||
3657 | if (spec && spec->power_hook) | ||
3658 | spec->power_hook(codec, 1); | ||
3659 | #endif | ||
3628 | return 0; | 3660 | return 0; |
3629 | } | 3661 | } |
3630 | #endif | 3662 | #endif |
@@ -3641,6 +3673,7 @@ static struct hda_codec_ops alc_patch_ops = { | |||
3641 | .resume = alc_resume, | 3673 | .resume = alc_resume, |
3642 | #endif | 3674 | #endif |
3643 | #ifdef CONFIG_SND_HDA_POWER_SAVE | 3675 | #ifdef CONFIG_SND_HDA_POWER_SAVE |
3676 | .suspend = alc_suspend, | ||
3644 | .check_power_status = alc_check_power_status, | 3677 | .check_power_status = alc_check_power_status, |
3645 | #endif | 3678 | #endif |
3646 | }; | 3679 | }; |
@@ -9420,6 +9453,9 @@ static struct alc_config_preset alc882_presets[] = { | |||
9420 | .unsol_event = alc_automute_amp_unsol_event, | 9453 | .unsol_event = alc_automute_amp_unsol_event, |
9421 | .setup = alc889_acer_aspire_8930g_setup, | 9454 | .setup = alc889_acer_aspire_8930g_setup, |
9422 | .init_hook = alc_automute_amp, | 9455 | .init_hook = alc_automute_amp, |
9456 | #ifdef CONFIG_SND_HDA_POWER_SAVE | ||
9457 | .power_hook = alc889_power_eapd, | ||
9458 | #endif | ||
9423 | }, | 9459 | }, |
9424 | [ALC888_ACER_ASPIRE_7730G] = { | 9460 | [ALC888_ACER_ASPIRE_7730G] = { |
9425 | .mixers = { alc883_3ST_6ch_mixer, | 9461 | .mixers = { alc883_3ST_6ch_mixer, |