diff options
author | Takashi Iwai <tiwai@suse.de> | 2006-10-11 12:52:53 -0400 |
---|---|---|
committer | Jaroslav Kysela <perex@suse.cz> | 2006-10-22 04:51:10 -0400 |
commit | 30b35399ceb2398d05837863476dcb12f12f3a82 (patch) | |
tree | 14a7cfad1c5d28d207bb1be8addb86ead33f7b63 /sound/pci/hda/hda_intel.c | |
parent | c06134d73cdc02bb8ab1fad180f6da1f28d2e049 (diff) |
[ALSA] Various fixes for suspend/resume of ALSA PCI drivers
- Check the return value of pci_enable_device() and request_irq()
in the suspend. If any error occurs there, disable the device
using snd_card_disconnect().
- Call pci_set_power_state() properly with pci_choose_state().
- Fix the order to call pci_set_power_state().
- Removed obsolete house-made PM codes in some drivers.
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Signed-off-by: Jaroslav Kysela <perex@suse.cz>
Diffstat (limited to 'sound/pci/hda/hda_intel.c')
-rw-r--r-- | sound/pci/hda/hda_intel.c | 33 |
1 files changed, 23 insertions, 10 deletions
diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c index feeed12920b4..7c96361b95e3 100644 --- a/sound/pci/hda/hda_intel.c +++ b/sound/pci/hda/hda_intel.c | |||
@@ -1379,12 +1379,16 @@ static int azx_suspend(struct pci_dev *pci, pm_message_t state) | |||
1379 | snd_pcm_suspend_all(chip->pcm[i]); | 1379 | snd_pcm_suspend_all(chip->pcm[i]); |
1380 | snd_hda_suspend(chip->bus, state); | 1380 | snd_hda_suspend(chip->bus, state); |
1381 | azx_free_cmd_io(chip); | 1381 | azx_free_cmd_io(chip); |
1382 | if (chip->irq >= 0) | 1382 | if (chip->irq >= 0) { |
1383 | synchronize_irq(chip->irq); | ||
1383 | free_irq(chip->irq, chip); | 1384 | free_irq(chip->irq, chip); |
1385 | chip->irq = -1; | ||
1386 | } | ||
1384 | if (!disable_msi) | 1387 | if (!disable_msi) |
1385 | pci_disable_msi(chip->pci); | 1388 | pci_disable_msi(chip->pci); |
1386 | pci_disable_device(pci); | 1389 | pci_disable_device(pci); |
1387 | pci_save_state(pci); | 1390 | pci_save_state(pci); |
1391 | pci_set_power_state(pci, pci_choose_state(pci, state)); | ||
1388 | return 0; | 1392 | return 0; |
1389 | } | 1393 | } |
1390 | 1394 | ||
@@ -1393,15 +1397,25 @@ static int azx_resume(struct pci_dev *pci) | |||
1393 | struct snd_card *card = pci_get_drvdata(pci); | 1397 | struct snd_card *card = pci_get_drvdata(pci); |
1394 | struct azx *chip = card->private_data; | 1398 | struct azx *chip = card->private_data; |
1395 | 1399 | ||
1400 | pci_set_power_state(pci, PCI_D0); | ||
1396 | pci_restore_state(pci); | 1401 | pci_restore_state(pci); |
1397 | pci_enable_device(pci); | 1402 | if (pci_enable_device(pci) < 0) { |
1403 | printk(KERN_ERR "hda-intel: pci_enable_device failed, " | ||
1404 | "disabling device\n"); | ||
1405 | snd_card_disconnect(card); | ||
1406 | return -EIO; | ||
1407 | } | ||
1408 | pci_set_master(pci); | ||
1398 | if (!disable_msi) | 1409 | if (!disable_msi) |
1399 | pci_enable_msi(pci); | 1410 | pci_enable_msi(pci); |
1400 | /* FIXME: need proper error handling */ | 1411 | if (request_irq(pci->irq, azx_interrupt, IRQF_DISABLED|IRQF_SHARED, |
1401 | request_irq(pci->irq, azx_interrupt, IRQF_DISABLED|IRQF_SHARED, | 1412 | "HDA Intel", chip)) { |
1402 | "HDA Intel", chip); | 1413 | printk(KERN_ERR "hda-intel: unable to grab IRQ %d, " |
1414 | "disabling device\n", pci->irq); | ||
1415 | snd_card_disconnect(card); | ||
1416 | return -EIO; | ||
1417 | } | ||
1403 | chip->irq = pci->irq; | 1418 | chip->irq = pci->irq; |
1404 | pci_set_master(pci); | ||
1405 | azx_init_chip(chip); | 1419 | azx_init_chip(chip); |
1406 | snd_hda_resume(chip->bus); | 1420 | snd_hda_resume(chip->bus); |
1407 | snd_power_change_state(card, SNDRV_CTL_POWER_D0); | 1421 | snd_power_change_state(card, SNDRV_CTL_POWER_D0); |
@@ -1431,15 +1445,14 @@ static int azx_free(struct azx *chip) | |||
1431 | /* disable position buffer */ | 1445 | /* disable position buffer */ |
1432 | azx_writel(chip, DPLBASE, 0); | 1446 | azx_writel(chip, DPLBASE, 0); |
1433 | azx_writel(chip, DPUBASE, 0); | 1447 | azx_writel(chip, DPUBASE, 0); |
1434 | |||
1435 | synchronize_irq(chip->irq); | ||
1436 | } | 1448 | } |
1437 | 1449 | ||
1438 | if (chip->irq >= 0) { | 1450 | if (chip->irq >= 0) { |
1451 | synchronize_irq(chip->irq); | ||
1439 | free_irq(chip->irq, (void*)chip); | 1452 | free_irq(chip->irq, (void*)chip); |
1440 | if (!disable_msi) | ||
1441 | pci_disable_msi(chip->pci); | ||
1442 | } | 1453 | } |
1454 | if (!disable_msi) | ||
1455 | pci_disable_msi(chip->pci); | ||
1443 | if (chip->remap_addr) | 1456 | if (chip->remap_addr) |
1444 | iounmap(chip->remap_addr); | 1457 | iounmap(chip->remap_addr); |
1445 | 1458 | ||