aboutsummaryrefslogtreecommitdiffstats
path: root/sound/pci
diff options
context:
space:
mode:
authorDaniel T Chen <crimsun@ubuntu.com>2009-12-27 18:48:29 -0500
committerTakashi Iwai <tiwai@suse.de>2009-12-28 06:15:17 -0500
commitea52bf260ecbb175339af3178c15788df21b7516 (patch)
tree764857013b46d1bd5f7c89541ac265259baa6e96 /sound/pci
parent014c41fce1bd5cec381e70fc6f58fdfc96cdaf69 (diff)
ALSA: hda: Add powerdown for Analog Devices HDA codecs
This patch ports powerdown fixes to AD198x. Currently we only turn off Front and HP for suspend, but this is easily extended for additional nids. Signed-off-by: Daniel T Chen <crimsun@ubuntu.com> Signed-off-by: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to 'sound/pci')
-rw-r--r--sound/pci/hda/patch_analog.c68
1 files changed, 68 insertions, 0 deletions
diff --git a/sound/pci/hda/patch_analog.c b/sound/pci/hda/patch_analog.c
index 45ee352df329..cecd3c108990 100644
--- a/sound/pci/hda/patch_analog.c
+++ b/sound/pci/hda/patch_analog.c
@@ -441,6 +441,11 @@ static int ad198x_build_pcms(struct hda_codec *codec)
441 return 0; 441 return 0;
442} 442}
443 443
444static inline void ad198x_shutup(struct hda_codec *codec)
445{
446 snd_hda_shutup_pins(codec);
447}
448
444static void ad198x_free_kctls(struct hda_codec *codec) 449static void ad198x_free_kctls(struct hda_codec *codec)
445{ 450{
446 struct ad198x_spec *spec = codec->spec; 451 struct ad198x_spec *spec = codec->spec;
@@ -454,6 +459,46 @@ static void ad198x_free_kctls(struct hda_codec *codec)
454 snd_array_free(&spec->kctls); 459 snd_array_free(&spec->kctls);
455} 460}
456 461
462static void ad198x_power_eapd_write(struct hda_codec *codec, hda_nid_t front,
463 hda_nid_t hp)
464{
465 struct ad198x_spec *spec = codec->spec;
466 snd_hda_codec_write(codec, front, 0, AC_VERB_SET_EAPD_BTLENABLE,
467 !spec->inv_eapd ? 0x00 : 0x02);
468 snd_hda_codec_write(codec, hp, 0, AC_VERB_SET_EAPD_BTLENABLE,
469 !spec->inv_eapd ? 0x00 : 0x02);
470}
471
472static void ad198x_power_eapd(struct hda_codec *codec)
473{
474 /* We currently only handle front, HP */
475 switch (codec->vendor_id) {
476 case 0x11d41882:
477 case 0x11d4882a:
478 case 0x11d41884:
479 case 0x11d41984:
480 case 0x11d41883:
481 case 0x11d4184a:
482 case 0x11d4194a:
483 case 0x11d4194b:
484 ad198x_power_eapd_write(codec, 0x12, 0x11);
485 break;
486 case 0x11d41981:
487 case 0x11d41983:
488 ad198x_power_eapd_write(codec, 0x05, 0x06);
489 break;
490 case 0x11d41986:
491 ad198x_power_eapd_write(codec, 0x1b, 0x1a);
492 break;
493 case 0x11d41988:
494 case 0x11d4198b:
495 case 0x11d4989a:
496 case 0x11d4989b:
497 ad198x_power_eapd_write(codec, 0x29, 0x22);
498 break;
499 }
500}
501
457static void ad198x_free(struct hda_codec *codec) 502static void ad198x_free(struct hda_codec *codec)
458{ 503{
459 struct ad198x_spec *spec = codec->spec; 504 struct ad198x_spec *spec = codec->spec;
@@ -461,11 +506,29 @@ static void ad198x_free(struct hda_codec *codec)
461 if (!spec) 506 if (!spec)
462 return; 507 return;
463 508
509 ad198x_shutup(codec);
464 ad198x_free_kctls(codec); 510 ad198x_free_kctls(codec);
465 kfree(spec); 511 kfree(spec);
466 snd_hda_detach_beep_device(codec); 512 snd_hda_detach_beep_device(codec);
467} 513}
468 514
515#ifdef SND_HDA_NEEDS_RESUME
516static int ad198x_suspend(struct hda_codec *codec, pm_message_t state)
517{
518 ad198x_shutup(codec);
519 ad198x_power_eapd(codec);
520 return 0;
521}
522
523static int ad198x_resume(struct hda_codec *codec)
524{
525 ad198x_init(codec);
526 snd_hda_codec_resume_amp(codec);
527 snd_hda_codec_resume_cache(codec);
528 return 0;
529}
530#endif
531
469static struct hda_codec_ops ad198x_patch_ops = { 532static struct hda_codec_ops ad198x_patch_ops = {
470 .build_controls = ad198x_build_controls, 533 .build_controls = ad198x_build_controls,
471 .build_pcms = ad198x_build_pcms, 534 .build_pcms = ad198x_build_pcms,
@@ -474,6 +537,11 @@ static struct hda_codec_ops ad198x_patch_ops = {
474#ifdef CONFIG_SND_HDA_POWER_SAVE 537#ifdef CONFIG_SND_HDA_POWER_SAVE
475 .check_power_status = ad198x_check_power_status, 538 .check_power_status = ad198x_check_power_status,
476#endif 539#endif
540#ifdef SND_HDA_NEEDS_RESUME
541 .suspend = ad198x_suspend,
542 .resume = ad198x_resume,
543#endif
544 .reboot_notify = ad198x_shutup,
477}; 545};
478 546
479 547