diff options
| -rw-r--r-- | sound/isa/dt019x.c | 51 |
1 files changed, 41 insertions, 10 deletions
diff --git a/sound/isa/dt019x.c b/sound/isa/dt019x.c index 7559956157e9..50e7bc5ef561 100644 --- a/sound/isa/dt019x.c +++ b/sound/isa/dt019x.c | |||
| @@ -74,6 +74,7 @@ struct snd_card_dt019x { | |||
| 74 | struct pnp_dev *dev; | 74 | struct pnp_dev *dev; |
| 75 | struct pnp_dev *devmpu; | 75 | struct pnp_dev *devmpu; |
| 76 | struct pnp_dev *devopl; | 76 | struct pnp_dev *devopl; |
| 77 | struct snd_sb *chip; | ||
| 77 | }; | 78 | }; |
| 78 | 79 | ||
| 79 | static struct pnp_card_device_id snd_dt019x_pnpids[] = { | 80 | static struct pnp_card_device_id snd_dt019x_pnpids[] = { |
| @@ -196,7 +197,7 @@ static int __devinit snd_card_dt019x_probe(int dev, struct pnp_card_link *pcard, | |||
| 196 | if ((card = snd_card_new(index[dev], id[dev], THIS_MODULE, | 197 | if ((card = snd_card_new(index[dev], id[dev], THIS_MODULE, |
| 197 | sizeof(struct snd_card_dt019x))) == NULL) | 198 | sizeof(struct snd_card_dt019x))) == NULL) |
| 198 | return -ENOMEM; | 199 | return -ENOMEM; |
| 199 | acard = (struct snd_card_dt019x *)card->private_data; | 200 | acard = card->private_data; |
| 200 | 201 | ||
| 201 | snd_card_set_dev(card, &pcard->card->dev); | 202 | snd_card_set_dev(card, &pcard->card->dev); |
| 202 | if ((error = snd_card_dt019x_pnp(dev, acard, pcard, pid))) { | 203 | if ((error = snd_card_dt019x_pnp(dev, acard, pcard, pid))) { |
| @@ -214,6 +215,7 @@ static int __devinit snd_card_dt019x_probe(int dev, struct pnp_card_link *pcard, | |||
| 214 | snd_card_free(card); | 215 | snd_card_free(card); |
| 215 | return error; | 216 | return error; |
| 216 | } | 217 | } |
| 218 | acard->chip = chip; | ||
| 217 | 219 | ||
| 218 | strcpy(card->driver, "DT-019X"); | 220 | strcpy(card->driver, "DT-019X"); |
| 219 | strcpy(card->shortname, "Diamond Tech. DT-019X"); | 221 | strcpy(card->shortname, "Diamond Tech. DT-019X"); |
| @@ -290,10 +292,35 @@ static int __devinit snd_dt019x_pnp_probe(struct pnp_card_link *card, | |||
| 290 | 292 | ||
| 291 | static void __devexit snd_dt019x_pnp_remove(struct pnp_card_link * pcard) | 293 | static void __devexit snd_dt019x_pnp_remove(struct pnp_card_link * pcard) |
| 292 | { | 294 | { |
| 293 | struct snd_card *card = (struct snd_card *) pnp_get_card_drvdata(pcard); | 295 | snd_card_free(pnp_get_card_drvdata(pcard)); |
| 294 | snd_card_disconnect(card); | 296 | pnp_set_card_drvdata(pcard, NULL); |
| 295 | snd_card_free_in_thread(card); | 297 | } |
| 298 | |||
| 299 | #ifdef CONFIG_PM | ||
| 300 | static int snd_dt019x_pnp_suspend(struct pnp_card_link *pcard, pm_message_t state) | ||
| 301 | { | ||
| 302 | struct snd_card *card = pnp_get_card_drvdata(pcard); | ||
| 303 | struct snd_card_dt019x *acard = card->private_data; | ||
| 304 | struct snd_sb *chip = acard->chip; | ||
| 305 | |||
| 306 | snd_power_change_state(card, SNDRV_CTL_POWER_D3hot); | ||
| 307 | snd_pcm_suspend_all(chip->pcm); | ||
| 308 | snd_sbmixer_suspend(chip); | ||
| 309 | return 0; | ||
| 310 | } | ||
| 311 | |||
| 312 | static int snd_dt019x_pnp_resume(struct pnp_card_link *pcard) | ||
| 313 | { | ||
| 314 | struct snd_card *card = pnp_get_card_drvdata(pcard); | ||
| 315 | struct snd_card_dt019x *acard = card->private_data; | ||
| 316 | struct snd_sb *chip = acard->chip; | ||
| 317 | |||
| 318 | snd_sbdsp_reset(chip); | ||
| 319 | snd_sbmixer_resume(chip); | ||
| 320 | snd_power_change_state(card, SNDRV_CTL_POWER_D0); | ||
| 321 | return 0; | ||
| 296 | } | 322 | } |
| 323 | #endif | ||
| 297 | 324 | ||
| 298 | static struct pnp_card_driver dt019x_pnpc_driver = { | 325 | static struct pnp_card_driver dt019x_pnpc_driver = { |
| 299 | .flags = PNP_DRIVER_RES_DISABLE, | 326 | .flags = PNP_DRIVER_RES_DISABLE, |
| @@ -301,21 +328,25 @@ static struct pnp_card_driver dt019x_pnpc_driver = { | |||
| 301 | .id_table = snd_dt019x_pnpids, | 328 | .id_table = snd_dt019x_pnpids, |
| 302 | .probe = snd_dt019x_pnp_probe, | 329 | .probe = snd_dt019x_pnp_probe, |
| 303 | .remove = __devexit_p(snd_dt019x_pnp_remove), | 330 | .remove = __devexit_p(snd_dt019x_pnp_remove), |
| 331 | #ifdef CONFIG_PM | ||
| 332 | .suspend = snd_dt019x_pnp_suspend, | ||
| 333 | .resume = snd_dt019x_pnp_resume, | ||
| 334 | #endif | ||
| 304 | }; | 335 | }; |
| 305 | 336 | ||
| 306 | static int __init alsa_card_dt019x_init(void) | 337 | static int __init alsa_card_dt019x_init(void) |
| 307 | { | 338 | { |
| 308 | int cards = 0; | 339 | int cards = 0; |
| 309 | 340 | ||
| 310 | cards += pnp_register_card_driver(&dt019x_pnpc_driver); | 341 | cards = pnp_register_card_driver(&dt019x_pnpc_driver); |
| 311 | 342 | if (cards <= 0) { | |
| 312 | #ifdef MODULE | ||
| 313 | if (!cards) { | ||
| 314 | pnp_unregister_card_driver(&dt019x_pnpc_driver); | 343 | pnp_unregister_card_driver(&dt019x_pnpc_driver); |
| 344 | #ifdef MODULE | ||
| 315 | snd_printk(KERN_ERR "no DT-019X / ALS-007 based soundcards found\n"); | 345 | snd_printk(KERN_ERR "no DT-019X / ALS-007 based soundcards found\n"); |
| 316 | } | ||
| 317 | #endif | 346 | #endif |
| 318 | return cards ? 0 : -ENODEV; | 347 | return -ENODEV; |
| 348 | } | ||
| 349 | return 0; | ||
| 319 | } | 350 | } |
| 320 | 351 | ||
| 321 | static void __exit alsa_card_dt019x_exit(void) | 352 | static void __exit alsa_card_dt019x_exit(void) |
