diff options
author | Takashi Iwai <tiwai@suse.de> | 2005-11-17 16:57:48 +0100 |
---|---|---|
committer | Jaroslav Kysela <perex@suse.cz> | 2006-01-03 12:28:10 +0100 |
commit | c66d7f72569e304acc134b2561b148fe7c23c0f7 (patch) | |
tree | 5404f454238c7f3546eaa1f7d892b7c5a1b5e020 | |
parent | 7a8fef1f95e563a93c7d70048b63c1ca20685a1b (diff) | |
download | op-kernel-dev-c66d7f72569e304acc134b2561b148fe7c23c0f7.zip op-kernel-dev-c66d7f72569e304acc134b2561b148fe7c23c0f7.tar.gz |
[ALSA] ad1848 - Add PM support
Modules: AD1848 driver
Add PM support to ad1848 support code.
Signed-off-by: Takashi Iwai <tiwai@suse.de>
-rw-r--r-- | include/sound/ad1848.h | 5 | ||||
-rw-r--r-- | sound/isa/ad1848/ad1848_lib.c | 28 |
2 files changed, 20 insertions, 13 deletions
diff --git a/include/sound/ad1848.h b/include/sound/ad1848.h index a038070..1a2759f 100644 --- a/include/sound/ad1848.h +++ b/include/sound/ad1848.h @@ -148,6 +148,11 @@ struct snd_ad1848 { int dma_size; int thinkpad_flag; /* Thinkpad CS4248 needs some extra help */ +#ifdef CONFIG_PM + void (*suspend)(struct snd_ad1848 *chip); + void (*resume)(struct snd_ad1848 *chip); +#endif + spinlock_t reg_lock; struct semaphore open_mutex; }; diff --git a/sound/isa/ad1848/ad1848_lib.c b/sound/isa/ad1848/ad1848_lib.c index 55ba32d..83764c9 100644 --- a/sound/isa/ad1848/ad1848_lib.c +++ b/sound/isa/ad1848/ad1848_lib.c @@ -24,7 +24,6 @@ #include <linux/delay.h> #include <linux/init.h> #include <linux/interrupt.h> -#include <linux/pm.h> #include <linux/slab.h> #include <linux/ioport.h> #include <sound/core.h> @@ -642,29 +641,30 @@ static void snd_ad1848_thinkpad_twiddle(struct snd_ad1848 *chip, int on) { } #ifdef CONFIG_PM -static int snd_ad1848_suspend(struct snd_card *card, pm_message_t state) +static void snd_ad1848_suspend(struct snd_ad1848 *chip) { - struct snd_ad1848 *chip = card->pm_private_data; - snd_pcm_suspend_all(chip->pcm); - /* FIXME: save registers? */ - if (chip->thinkpad_flag) snd_ad1848_thinkpad_twiddle(chip, 0); - - return 0; } -static int snd_ad1848_resume(struct snd_card *card) +static void snd_ad1848_resume(struct snd_ad1848 *chip) { - struct snd_ad1848 *chip = card->pm_private_data; + int i; if (chip->thinkpad_flag) snd_ad1848_thinkpad_twiddle(chip, 1); - /* FIXME: restore registers? */ + /* clear any pendings IRQ */ + inb(AD1848P(chip, STATUS)); + outb(0, AD1848P(chip, STATUS)); + mb(); - return 0; + snd_ad1848_mce_down(chip); + for (i = 0; i < 16; i++) + snd_ad1848_out(chip, i, chip->image[i]); + snd_ad1848_mce_up(chip); + snd_ad1848_mce_down(chip); } #endif /* CONFIG_PM */ @@ -919,7 +919,6 @@ int snd_ad1848_create(struct snd_card *card, chip->thinkpad_flag = 1; chip->hardware = AD1848_HW_DETECT; /* reset */ snd_ad1848_thinkpad_twiddle(chip, 1); - snd_card_set_isa_pm_callback(card, snd_ad1848_suspend, snd_ad1848_resume, chip); } if (snd_ad1848_probe(chip) < 0) { @@ -933,6 +932,9 @@ int snd_ad1848_create(struct snd_card *card, return err; } + chip->suspend = snd_ad1848_suspend; + chip->resume = snd_ad1848_resume; + *rchip = chip; return 0; } |