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/es1968.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/es1968.c')
-rw-r--r-- | sound/pci/es1968.c | 71 |
1 files changed, 10 insertions, 61 deletions
diff --git a/sound/pci/es1968.c b/sound/pci/es1968.c index b9d723c7e1db..092da53e1464 100644 --- a/sound/pci/es1968.c +++ b/sound/pci/es1968.c | |||
@@ -432,46 +432,6 @@ MODULE_PARM_DESC(joystick, "Enable joystick."); | |||
432 | #define ESM_MODE_PLAY 0 | 432 | #define ESM_MODE_PLAY 0 |
433 | #define ESM_MODE_CAPTURE 1 | 433 | #define ESM_MODE_CAPTURE 1 |
434 | 434 | ||
435 | /* acpi states */ | ||
436 | enum { | ||
437 | ACPI_D0=0, | ||
438 | ACPI_D1, | ||
439 | ACPI_D2, | ||
440 | ACPI_D3 | ||
441 | }; | ||
442 | |||
443 | /* bits in the acpi masks */ | ||
444 | #define ACPI_12MHZ ( 1 << 15) | ||
445 | #define ACPI_24MHZ ( 1 << 14) | ||
446 | #define ACPI_978 ( 1 << 13) | ||
447 | #define ACPI_SPDIF ( 1 << 12) | ||
448 | #define ACPI_GLUE ( 1 << 11) | ||
449 | #define ACPI__10 ( 1 << 10) /* reserved */ | ||
450 | #define ACPI_PCIINT ( 1 << 9) | ||
451 | #define ACPI_HV ( 1 << 8) /* hardware volume */ | ||
452 | #define ACPI_GPIO ( 1 << 7) | ||
453 | #define ACPI_ASSP ( 1 << 6) | ||
454 | #define ACPI_SB ( 1 << 5) /* sb emul */ | ||
455 | #define ACPI_FM ( 1 << 4) /* fm emul */ | ||
456 | #define ACPI_RB ( 1 << 3) /* ringbus / aclink */ | ||
457 | #define ACPI_MIDI ( 1 << 2) | ||
458 | #define ACPI_GP ( 1 << 1) /* game port */ | ||
459 | #define ACPI_WP ( 1 << 0) /* wave processor */ | ||
460 | |||
461 | #define ACPI_ALL (0xffff) | ||
462 | #define ACPI_SLEEP (~(ACPI_SPDIF|ACPI_ASSP|ACPI_SB|ACPI_FM| \ | ||
463 | ACPI_MIDI|ACPI_GP|ACPI_WP)) | ||
464 | #define ACPI_NONE (ACPI__10) | ||
465 | |||
466 | /* these masks indicate which units we care about at | ||
467 | which states */ | ||
468 | static u16 acpi_state_mask[] = { | ||
469 | [ACPI_D0] = ACPI_ALL, | ||
470 | [ACPI_D1] = ACPI_SLEEP, | ||
471 | [ACPI_D2] = ACPI_SLEEP, | ||
472 | [ACPI_D3] = ACPI_NONE | ||
473 | }; | ||
474 | |||
475 | 435 | ||
476 | /* APU use in the driver */ | 436 | /* APU use in the driver */ |
477 | enum snd_enum_apu_type { | 437 | enum snd_enum_apu_type { |
@@ -2160,21 +2120,6 @@ static void snd_es1968_reset(struct es1968 *chip) | |||
2160 | } | 2120 | } |
2161 | 2121 | ||
2162 | /* | 2122 | /* |
2163 | * power management | ||
2164 | */ | ||
2165 | static void snd_es1968_set_acpi(struct es1968 *chip, int state) | ||
2166 | { | ||
2167 | u16 active_mask = acpi_state_mask[state]; | ||
2168 | |||
2169 | pci_set_power_state(chip->pci, state); | ||
2170 | /* make sure the units we care about are on | ||
2171 | XXX we might want to do this before state flipping? */ | ||
2172 | pci_write_config_word(chip->pci, 0x54, ~ active_mask); | ||
2173 | pci_write_config_word(chip->pci, 0x56, ~ active_mask); | ||
2174 | } | ||
2175 | |||
2176 | |||
2177 | /* | ||
2178 | * initialize maestro chip | 2123 | * initialize maestro chip |
2179 | */ | 2124 | */ |
2180 | static void snd_es1968_chip_init(struct es1968 *chip) | 2125 | static void snd_es1968_chip_init(struct es1968 *chip) |
@@ -2196,9 +2141,6 @@ static void snd_es1968_chip_init(struct es1968 *chip) | |||
2196 | * IRQs. | 2141 | * IRQs. |
2197 | */ | 2142 | */ |
2198 | 2143 | ||
2199 | /* do config work at full power */ | ||
2200 | snd_es1968_set_acpi(chip, ACPI_D0); | ||
2201 | |||
2202 | /* Config Reg A */ | 2144 | /* Config Reg A */ |
2203 | pci_read_config_word(pci, ESM_CONFIG_A, &w); | 2145 | pci_read_config_word(pci, ESM_CONFIG_A, &w); |
2204 | 2146 | ||
@@ -2397,9 +2339,10 @@ static int es1968_suspend(struct pci_dev *pci, pm_message_t state) | |||
2397 | snd_pcm_suspend_all(chip->pcm); | 2339 | snd_pcm_suspend_all(chip->pcm); |
2398 | snd_ac97_suspend(chip->ac97); | 2340 | snd_ac97_suspend(chip->ac97); |
2399 | snd_es1968_bob_stop(chip); | 2341 | snd_es1968_bob_stop(chip); |
2400 | snd_es1968_set_acpi(chip, ACPI_D3); | 2342 | |
2401 | pci_disable_device(pci); | 2343 | pci_disable_device(pci); |
2402 | pci_save_state(pci); | 2344 | pci_save_state(pci); |
2345 | pci_set_power_state(pci, pci_choose_state(pci, state)); | ||
2403 | return 0; | 2346 | return 0; |
2404 | } | 2347 | } |
2405 | 2348 | ||
@@ -2413,9 +2356,16 @@ static int es1968_resume(struct pci_dev *pci) | |||
2413 | return 0; | 2356 | return 0; |
2414 | 2357 | ||
2415 | /* restore all our config */ | 2358 | /* restore all our config */ |
2359 | pci_set_power_state(pci, PCI_D0); | ||
2416 | pci_restore_state(pci); | 2360 | pci_restore_state(pci); |
2417 | pci_enable_device(pci); | 2361 | if (pci_enable_device(pci) < 0) { |
2362 | printk(KERN_ERR "es1968: pci_enable_device failed, " | ||
2363 | "disabling device\n"); | ||
2364 | snd_card_disconnect(card); | ||
2365 | return -EIO; | ||
2366 | } | ||
2418 | pci_set_master(pci); | 2367 | pci_set_master(pci); |
2368 | |||
2419 | snd_es1968_chip_init(chip); | 2369 | snd_es1968_chip_init(chip); |
2420 | 2370 | ||
2421 | /* need to restore the base pointers.. */ | 2371 | /* need to restore the base pointers.. */ |
@@ -2514,7 +2464,6 @@ static int snd_es1968_free(struct es1968 *chip) | |||
2514 | if (chip->irq >= 0) | 2464 | if (chip->irq >= 0) |
2515 | free_irq(chip->irq, (void *)chip); | 2465 | free_irq(chip->irq, (void *)chip); |
2516 | snd_es1968_free_gameport(chip); | 2466 | snd_es1968_free_gameport(chip); |
2517 | snd_es1968_set_acpi(chip, ACPI_D3); | ||
2518 | chip->master_switch = NULL; | 2467 | chip->master_switch = NULL; |
2519 | chip->master_volume = NULL; | 2468 | chip->master_volume = NULL; |
2520 | pci_release_regions(chip->pci); | 2469 | pci_release_regions(chip->pci); |