+#ifdef CONFIG_PM
+static int
+snd_azf3328_suspend(struct pci_dev *pci, pm_message_t state)
+{
+ struct snd_card *card = pci_get_drvdata(pci);
+ struct snd_azf3328 *chip = card->private_data;
+ int reg;
+
+ snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
+
+ snd_pcm_suspend_all(chip->pcm);
+
+ for (reg = 0; reg < AZF_IO_SIZE_MIXER_PM / 2; reg++)
+ chip->saved_regs_mixer[reg] = inw(chip->mixer_port + reg * 2);
+
+ /* make sure to disable master volume etc. to prevent looping sound */
+ snd_azf3328_mixer_set_mute(chip, IDX_MIXER_PLAY_MASTER, 1);
+ snd_azf3328_mixer_set_mute(chip, IDX_MIXER_WAVEOUT, 1);
+
+ for (reg = 0; reg < AZF_IO_SIZE_CODEC_PM / 2; reg++)
+ chip->saved_regs_codec[reg] = inw(chip->codec_port + reg * 2);
+ for (reg = 0; reg < AZF_IO_SIZE_IO2_PM / 2; reg++)
+ chip->saved_regs_io2[reg] = inw(chip->io2_port + reg * 2);
+ for (reg = 0; reg < AZF_IO_SIZE_MPU_PM / 2; reg++)
+ chip->saved_regs_mpu[reg] = inw(chip->mpu_port + reg * 2);
+ for (reg = 0; reg < AZF_IO_SIZE_SYNTH_PM / 2; reg++)
+ chip->saved_regs_synth[reg] = inw(chip->synth_port + reg * 2);
+
+ pci_disable_device(pci);
+ pci_save_state(pci);
+ pci_set_power_state(pci, pci_choose_state(pci, state));
+ return 0;
+}
+
+static int
+snd_azf3328_resume(struct pci_dev *pci)
+{
+ struct snd_card *card = pci_get_drvdata(pci);
+ struct snd_azf3328 *chip = card->private_data;
+ int reg;
+
+ pci_set_power_state(pci, PCI_D0);
+ pci_restore_state(pci);
+ if (pci_enable_device(pci) < 0) {
+ printk(KERN_ERR "azt3328: pci_enable_device failed, "
+ "disabling device\n");
+ snd_card_disconnect(card);
+ return -EIO;
+ }
+ pci_set_master(pci);
+
+ for (reg = 0; reg < AZF_IO_SIZE_IO2_PM / 2; reg++)
+ outw(chip->saved_regs_io2[reg], chip->io2_port + reg * 2);
+ for (reg = 0; reg < AZF_IO_SIZE_MPU_PM / 2; reg++)
+ outw(chip->saved_regs_mpu[reg], chip->mpu_port + reg * 2);
+ for (reg = 0; reg < AZF_IO_SIZE_SYNTH_PM / 2; reg++)
+ outw(chip->saved_regs_synth[reg], chip->synth_port + reg * 2);
+ for (reg = 0; reg < AZF_IO_SIZE_MIXER_PM / 2; reg++)
+ outw(chip->saved_regs_mixer[reg], chip->mixer_port + reg * 2);
+ for (reg = 0; reg < AZF_IO_SIZE_CODEC_PM / 2; reg++)
+ outw(chip->saved_regs_codec[reg], chip->codec_port + reg * 2);
+
+ snd_power_change_state(card, SNDRV_CTL_POWER_D0);
+ return 0;
+}
+#endif
+
+
+
+