From 3ebfad5606b66fdcd4b10ebfac49bbfec7e2fb4b Mon Sep 17 00:00:00 2001 From: Takashi Iwai Date: Thu, 17 Nov 2005 16:13:05 +0100 Subject: [PATCH] --- yaml --- r: 16066 b: refs/heads/master c: 11d3824ad7d6240d7ce44bdf1d9e81e62a903f72 h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/include/sound/ak4531_codec.h | 5 ++++ trunk/sound/pci/ac97/ak4531_codec.c | 36 ++++++++++++++++++++++++++++- 3 files changed, 41 insertions(+), 2 deletions(-) diff --git a/[refs] b/[refs] index 32124a1aa3c7..47aa285b17f1 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 3fcf7d2cd8e0ebce10e4bf89da175ff9bd6aa2da +refs/heads/master: 11d3824ad7d6240d7ce44bdf1d9e81e62a903f72 diff --git a/trunk/include/sound/ak4531_codec.h b/trunk/include/sound/ak4531_codec.h index 4e7c661af484..edf04070ce7c 100644 --- a/trunk/include/sound/ak4531_codec.h +++ b/trunk/include/sound/ak4531_codec.h @@ -77,4 +77,9 @@ struct snd_ak4531 { int snd_ak4531_mixer(struct snd_card *card, struct snd_ak4531 *_ak4531, struct snd_ak4531 **rak4531); +#ifdef CONFIG_PM +void snd_ak4531_suspend(struct snd_ak4531 *ak4531); +void snd_ak4531_resume(struct snd_ak4531 *ak4531); +#endif + #endif /* __SOUND_AK4531_CODEC_H */ diff --git a/trunk/sound/pci/ac97/ak4531_codec.c b/trunk/sound/pci/ac97/ak4531_codec.c index 088d8dc336be..3eb885584e9a 100644 --- a/trunk/sound/pci/ac97/ak4531_codec.c +++ b/trunk/sound/pci/ac97/ak4531_codec.c @@ -371,7 +371,7 @@ int snd_ak4531_mixer(struct snd_card *card, struct snd_ak4531 *_ak4531, ak4531->write(ak4531, AK4531_RESET, 0x03); /* no RST, PD */ udelay(100); ak4531->write(ak4531, AK4531_CLOCK, 0x00); /* CODEC ADC and CODEC DAC use {LR,B}CLK2 and run off LRCLK2 PLL */ - for (idx = 0; idx < 0x19; idx++) { + for (idx = 0; idx <= 0x19; idx++) { if (idx == AK4531_RESET || idx == AK4531_CLOCK) continue; ak4531->write(ak4531, idx, ak4531->regs[idx] = snd_ak4531_initial_map[idx]); /* recording source is mixer */ @@ -395,6 +395,36 @@ int snd_ak4531_mixer(struct snd_card *card, struct snd_ak4531 *_ak4531, return 0; } +/* + * power management + */ +#ifdef CONFIG_PM +void snd_ak4531_suspend(struct snd_ak4531 *ak4531) +{ + /* mute */ + ak4531->write(ak4531, AK4531_LMASTER, 0x9f); + ak4531->write(ak4531, AK4531_RMASTER, 0x9f); + /* powerdown */ + ak4531->write(ak4531, AK4531_RESET, 0x01); +} + +void snd_ak4531_resume(struct snd_ak4531 *ak4531) +{ + int idx; + + /* initialize */ + ak4531->write(ak4531, AK4531_RESET, 0x03); + udelay(100); + ak4531->write(ak4531, AK4531_CLOCK, 0x00); + /* restore mixer registers */ + for (idx = 0; idx <= 0x19; idx++) { + if (idx == AK4531_RESET || idx == AK4531_CLOCK) + continue; + ak4531->write(ak4531, idx, ak4531->regs[idx]); + } +} +#endif + /* */ @@ -420,6 +450,10 @@ static void snd_ak4531_proc_init(struct snd_card *card, struct snd_ak4531 *ak453 } EXPORT_SYMBOL(snd_ak4531_mixer); +#ifdef CONFIG_PM +EXPORT_SYMBOL(snd_ak4531_suspend); +EXPORT_SYMBOL(snd_ak4531_resume); +#endif /* * INIT part