diff options
| author | Takashi Iwai <tiwai@suse.de> | 2005-11-17 10:56:11 -0500 |
|---|---|---|
| committer | Jaroslav Kysela <perex@suse.cz> | 2006-01-03 06:28:08 -0500 |
| commit | 7a8fef1f95e563a93c7d70048b63c1ca20685a1b (patch) | |
| tree | 34fa516e4d6775d50fefbab9bfe1bda8d6deb57b /sound | |
| parent | 67be445871bb35c450100753b72392ad6ddc0245 (diff) | |
[ALSA] es968 - Add PM support
Modules: ES968 driver
Add PM support to es968 driver.
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to 'sound')
| -rw-r--r-- | sound/isa/sb/es968.c | 47 |
1 files changed, 39 insertions, 8 deletions
diff --git a/sound/isa/sb/es968.c b/sound/isa/sb/es968.c index f7d1afe83dfe..9da80bfa3027 100644 --- a/sound/isa/sb/es968.c +++ b/sound/isa/sb/es968.c | |||
| @@ -58,6 +58,7 @@ MODULE_PARM_DESC(dma8, "8-bit DMA # for es968 driver."); | |||
| 58 | 58 | ||
| 59 | struct snd_card_es968 { | 59 | struct snd_card_es968 { |
| 60 | struct pnp_dev *dev; | 60 | struct pnp_dev *dev; |
| 61 | struct snd_sb *chip; | ||
| 61 | }; | 62 | }; |
| 62 | 63 | ||
| 63 | static struct pnp_card_device_id snd_es968_pnpids[] = { | 64 | static struct pnp_card_device_id snd_es968_pnpids[] = { |
| @@ -135,7 +136,7 @@ static int __init snd_card_es968_probe(int dev, | |||
| 135 | if ((card = snd_card_new(index[dev], id[dev], THIS_MODULE, | 136 | if ((card = snd_card_new(index[dev], id[dev], THIS_MODULE, |
| 136 | sizeof(struct snd_card_es968))) == NULL) | 137 | sizeof(struct snd_card_es968))) == NULL) |
| 137 | return -ENOMEM; | 138 | return -ENOMEM; |
| 138 | acard = (struct snd_card_es968 *)card->private_data; | 139 | acard = card->private_data; |
| 139 | if ((error = snd_card_es968_pnp(dev, acard, pcard, pid))) { | 140 | if ((error = snd_card_es968_pnp(dev, acard, pcard, pid))) { |
| 140 | snd_card_free(card); | 141 | snd_card_free(card); |
| 141 | return error; | 142 | return error; |
| @@ -151,6 +152,7 @@ static int __init snd_card_es968_probe(int dev, | |||
| 151 | snd_card_free(card); | 152 | snd_card_free(card); |
| 152 | return error; | 153 | return error; |
| 153 | } | 154 | } |
| 155 | acard->chip = chip; | ||
| 154 | 156 | ||
| 155 | if ((error = snd_sb8dsp_pcm(chip, 0, NULL)) < 0) { | 157 | if ((error = snd_sb8dsp_pcm(chip, 0, NULL)) < 0) { |
| 156 | snd_card_free(card); | 158 | snd_card_free(card); |
| @@ -200,11 +202,35 @@ static int __devinit snd_es968_pnp_detect(struct pnp_card_link *card, | |||
| 200 | 202 | ||
| 201 | static void __devexit snd_es968_pnp_remove(struct pnp_card_link * pcard) | 203 | static void __devexit snd_es968_pnp_remove(struct pnp_card_link * pcard) |
| 202 | { | 204 | { |
| 203 | struct snd_card *card = (struct snd_card *) pnp_get_card_drvdata(pcard); | 205 | snd_card_free(pnp_get_card_drvdata(pcard)); |
| 206 | pnp_set_card_drvdata(pcard, NULL); | ||
| 207 | } | ||
| 208 | |||
| 209 | #ifdef CONFIG_PM | ||
| 210 | static int snd_es968_pnp_suspend(struct pnp_card_link *pcard, pm_message_t state) | ||
| 211 | { | ||
| 212 | struct snd_card *card = pnp_get_card_drvdata(pcard); | ||
| 213 | struct snd_card_es968 *acard = card->private_data; | ||
| 214 | struct snd_sb *chip = acard->chip; | ||
| 215 | |||
| 216 | snd_power_change_state(card, SNDRV_CTL_POWER_D3hot); | ||
| 217 | snd_pcm_suspend_all(chip->pcm); | ||
| 218 | snd_sbmixer_suspend(chip); | ||
| 219 | return 0; | ||
| 220 | } | ||
| 221 | |||
| 222 | static int snd_es968_pnp_resume(struct pnp_card_link *pcard) | ||
| 223 | { | ||
| 224 | struct snd_card *card = pnp_get_card_drvdata(pcard); | ||
| 225 | struct snd_card_es968 *acard = card->private_data; | ||
| 226 | struct snd_sb *chip = acard->chip; | ||
| 204 | 227 | ||
| 205 | snd_card_disconnect(card); | 228 | snd_sbdsp_reset(chip); |
| 206 | snd_card_free_in_thread(card); | 229 | snd_sbmixer_resume(chip); |
| 230 | snd_power_change_state(card, SNDRV_CTL_POWER_D0); | ||
| 231 | return 0; | ||
| 207 | } | 232 | } |
| 233 | #endif | ||
| 208 | 234 | ||
| 209 | static struct pnp_card_driver es968_pnpc_driver = { | 235 | static struct pnp_card_driver es968_pnpc_driver = { |
| 210 | .flags = PNP_DRIVER_RES_DISABLE, | 236 | .flags = PNP_DRIVER_RES_DISABLE, |
| @@ -212,18 +238,23 @@ static struct pnp_card_driver es968_pnpc_driver = { | |||
| 212 | .id_table = snd_es968_pnpids, | 238 | .id_table = snd_es968_pnpids, |
| 213 | .probe = snd_es968_pnp_detect, | 239 | .probe = snd_es968_pnp_detect, |
| 214 | .remove = __devexit_p(snd_es968_pnp_remove), | 240 | .remove = __devexit_p(snd_es968_pnp_remove), |
| 241 | #ifdef CONFIG_PM | ||
| 242 | .suspend = snd_es968_pnp_suspend, | ||
| 243 | .resume = snd_es968_pnp_resume, | ||
| 244 | #endif | ||
| 215 | }; | 245 | }; |
| 216 | 246 | ||
| 217 | static int __init alsa_card_es968_init(void) | 247 | static int __init alsa_card_es968_init(void) |
| 218 | { | 248 | { |
| 219 | int cards = pnp_register_card_driver(&es968_pnpc_driver); | 249 | int cards = pnp_register_card_driver(&es968_pnpc_driver); |
| 220 | #ifdef MODULE | 250 | if (cards <= 0) { |
| 221 | if (cards == 0) { | ||
| 222 | pnp_unregister_card_driver(&es968_pnpc_driver); | 251 | pnp_unregister_card_driver(&es968_pnpc_driver); |
| 252 | #ifdef MODULE | ||
| 223 | snd_printk(KERN_ERR "no ES968 based soundcards found\n"); | 253 | snd_printk(KERN_ERR "no ES968 based soundcards found\n"); |
| 224 | } | ||
| 225 | #endif | 254 | #endif |
| 226 | return cards ? 0 : -ENODEV; | 255 | return -ENODEV; |
| 256 | } | ||
| 257 | return 0; | ||
| 227 | } | 258 | } |
| 228 | 259 | ||
| 229 | static void __exit alsa_card_es968_exit(void) | 260 | static void __exit alsa_card_es968_exit(void) |
