aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTakashi Iwai <tiwai@suse.de>2005-11-17 10:09:25 -0500
committerJaroslav Kysela <perex@suse.cz>2006-01-03 06:27:37 -0500
commitfb0700b4debbf45fb0465b40188bdc5396947bda (patch)
tree6a314571cd81b9995de254932ab7fe37038fa7b5
parentcb28e45ba2aa42393596a364d4f947027db8a1b5 (diff)
[ALSA] trident - Fix PM support
Modules: Trident driver Fix PM support on Trident driver. Signed-off-by: Takashi Iwai <tiwai@suse.de>
-rw-r--r--include/sound/trident.h2
-rw-r--r--sound/pci/trident/trident.c6
-rw-r--r--sound/pci/trident/trident_main.c41
3 files changed, 24 insertions, 25 deletions
diff --git a/include/sound/trident.h b/include/sound/trident.h
index 2c54569fc606..9752243241e5 100644
--- a/include/sound/trident.h
+++ b/include/sound/trident.h
@@ -452,6 +452,8 @@ void snd_trident_free_voice(struct snd_trident * trident, struct snd_trident_voi
452void snd_trident_start_voice(struct snd_trident * trident, unsigned int voice); 452void snd_trident_start_voice(struct snd_trident * trident, unsigned int voice);
453void snd_trident_stop_voice(struct snd_trident * trident, unsigned int voice); 453void snd_trident_stop_voice(struct snd_trident * trident, unsigned int voice);
454void snd_trident_write_voice_regs(struct snd_trident * trident, struct snd_trident_voice *voice); 454void snd_trident_write_voice_regs(struct snd_trident * trident, struct snd_trident_voice *voice);
455int snd_trident_suspend(struct pci_dev *pci, pm_message_t state);
456int snd_trident_resume(struct pci_dev *pci);
455 457
456/* TLB memory allocation */ 458/* TLB memory allocation */
457struct snd_util_memblk *snd_trident_alloc_pages(struct snd_trident *trident, 459struct snd_util_memblk *snd_trident_alloc_pages(struct snd_trident *trident,
diff --git a/sound/pci/trident/trident.c b/sound/pci/trident/trident.c
index 0999f1f83a99..2b21df16ad6a 100644
--- a/sound/pci/trident/trident.c
+++ b/sound/pci/trident/trident.c
@@ -100,6 +100,7 @@ static int __devinit snd_trident_probe(struct pci_dev *pci,
100 snd_card_free(card); 100 snd_card_free(card);
101 return err; 101 return err;
102 } 102 }
103 card->private_data = trident;
103 104
104 switch (trident->device) { 105 switch (trident->device) {
105 case TRIDENT_DEVICE_ID_DX: 106 case TRIDENT_DEVICE_ID_DX:
@@ -180,7 +181,10 @@ static struct pci_driver driver = {
180 .id_table = snd_trident_ids, 181 .id_table = snd_trident_ids,
181 .probe = snd_trident_probe, 182 .probe = snd_trident_probe,
182 .remove = __devexit_p(snd_trident_remove), 183 .remove = __devexit_p(snd_trident_remove),
183 SND_PCI_PM_CALLBACKS 184#ifdef CONFIG_PM
185 .suspend = snd_trident_suspend,
186 .resume = snd_trident_resume,
187#endif
184}; 188};
185 189
186static int __init alsa_card_trident_init(void) 190static int __init alsa_card_trident_init(void)
diff --git a/sound/pci/trident/trident_main.c b/sound/pci/trident/trident_main.c
index 6277dccebf64..83b7d8aba9e6 100644
--- a/sound/pci/trident/trident_main.c
+++ b/sound/pci/trident/trident_main.c
@@ -52,10 +52,6 @@ static int snd_trident_pcm_mixer_free(struct snd_trident *trident,
52 struct snd_pcm_substream *substream); 52 struct snd_pcm_substream *substream);
53static irqreturn_t snd_trident_interrupt(int irq, void *dev_id, 53static irqreturn_t snd_trident_interrupt(int irq, void *dev_id,
54 struct pt_regs *regs); 54 struct pt_regs *regs);
55#ifdef CONFIG_PM
56static int snd_trident_suspend(struct snd_card *card, pm_message_t state);
57static int snd_trident_resume(struct snd_card *card);
58#endif
59static int snd_trident_sis_reset(struct snd_trident *trident); 55static int snd_trident_sis_reset(struct snd_trident *trident);
60 56
61static void snd_trident_clear_voices(struct snd_trident * trident, 57static void snd_trident_clear_voices(struct snd_trident * trident,
@@ -3661,8 +3657,6 @@ int __devinit snd_trident_create(struct snd_card *card,
3661 3657
3662 snd_trident_enable_eso(trident); 3658 snd_trident_enable_eso(trident);
3663 3659
3664
3665 snd_card_set_pm_callback(card, snd_trident_suspend, snd_trident_resume, trident);
3666 snd_trident_proc_init(trident); 3660 snd_trident_proc_init(trident);
3667 snd_card_set_dev(card, &pci->dev); 3661 snd_card_set_dev(card, &pci->dev);
3668 *rtrident = trident; 3662 *rtrident = trident;
@@ -3938,20 +3932,19 @@ static void snd_trident_clear_voices(struct snd_trident * trident, unsigned shor
3938} 3932}
3939 3933
3940#ifdef CONFIG_PM 3934#ifdef CONFIG_PM
3941static int snd_trident_suspend(struct snd_card *card, pm_message_t state) 3935int snd_trident_suspend(struct pci_dev *pci, pm_message_t state)
3942{ 3936{
3943 struct snd_trident *trident = card->pm_private_data; 3937 struct snd_card *card = pci_get_drvdata(pci);
3938 struct snd_trident *trident = card->private_data;
3944 3939
3945 trident->in_suspend = 1; 3940 trident->in_suspend = 1;
3941 snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
3946 snd_pcm_suspend_all(trident->pcm); 3942 snd_pcm_suspend_all(trident->pcm);
3947 if (trident->foldback) 3943 snd_pcm_suspend_all(trident->foldback);
3948 snd_pcm_suspend_all(trident->foldback); 3944 snd_pcm_suspend_all(trident->spdif);
3949 if (trident->spdif)
3950 snd_pcm_suspend_all(trident->spdif);
3951 3945
3952 snd_ac97_suspend(trident->ac97); 3946 snd_ac97_suspend(trident->ac97);
3953 if (trident->ac97_sec) 3947 snd_ac97_suspend(trident->ac97_sec);
3954 snd_ac97_suspend(trident->ac97_sec);
3955 3948
3956 switch (trident->device) { 3949 switch (trident->device) {
3957 case TRIDENT_DEVICE_ID_DX: 3950 case TRIDENT_DEVICE_ID_DX:
@@ -3960,19 +3953,19 @@ static int snd_trident_suspend(struct snd_card *card, pm_message_t state)
3960 case TRIDENT_DEVICE_ID_SI7018: 3953 case TRIDENT_DEVICE_ID_SI7018:
3961 break; 3954 break;
3962 } 3955 }
3963 pci_disable_device(trident->pci); 3956 pci_disable_device(pci);
3957 pci_save_state(pci);
3964 return 0; 3958 return 0;
3965} 3959}
3966 3960
3967static int snd_trident_resume(struct snd_card *card) 3961int snd_trident_resume(struct pci_dev *pci)
3968{ 3962{
3969 struct snd_trident *trident = card->pm_private_data; 3963 struct snd_card *card = pci_get_drvdata(pci);
3964 struct snd_trident *trident = card->private_data;
3970 3965
3971 pci_enable_device(trident->pci); 3966 pci_restore_state(pci);
3972 if (pci_set_dma_mask(trident->pci, 0x3fffffff) < 0 || 3967 pci_enable_device(pci);
3973 pci_set_consistent_dma_mask(trident->pci, 0x3fffffff) < 0) 3968 pci_set_master(pci); /* to be sure */
3974 snd_printk(KERN_WARNING "trident: can't set the proper DMA mask\n");
3975 pci_set_master(trident->pci); /* to be sure */
3976 3969
3977 switch (trident->device) { 3970 switch (trident->device) {
3978 case TRIDENT_DEVICE_ID_DX: 3971 case TRIDENT_DEVICE_ID_DX:
@@ -3987,14 +3980,14 @@ static int snd_trident_resume(struct snd_card *card)
3987 } 3980 }
3988 3981
3989 snd_ac97_resume(trident->ac97); 3982 snd_ac97_resume(trident->ac97);
3990 if (trident->ac97_sec) 3983 snd_ac97_resume(trident->ac97_sec);
3991 snd_ac97_resume(trident->ac97_sec);
3992 3984
3993 /* restore some registers */ 3985 /* restore some registers */
3994 outl(trident->musicvol_wavevol, TRID_REG(trident, T4D_MUSICVOL_WAVEVOL)); 3986 outl(trident->musicvol_wavevol, TRID_REG(trident, T4D_MUSICVOL_WAVEVOL));
3995 3987
3996 snd_trident_enable_eso(trident); 3988 snd_trident_enable_eso(trident);
3997 3989
3990 snd_power_change_state(card, SNDRV_CTL_POWER_D0);
3998 trident->in_suspend = 0; 3991 trident->in_suspend = 0;
3999 return 0; 3992 return 0;
4000} 3993}