X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=sound%2Fpci%2Fcs46xx%2Fcs46xx_lib.c;h=29861bb0ec867e0576220a9ebb2fc5dfe14cae97;hb=78a6196531f0fe10aae05a9bc4c2701df614ac3d;hp=e4ea90cd3a361d4a3b0389fafb9d09de3024858c;hpb=86090fcac5e27b630656fe3d963a6b80e26dac44;p=linux-2.6.git diff --git a/sound/pci/cs46xx/cs46xx_lib.c b/sound/pci/cs46xx/cs46xx_lib.c index e4ea90cd3..29861bb0e 100644 --- a/sound/pci/cs46xx/cs46xx_lib.c +++ b/sound/pci/cs46xx/cs46xx_lib.c @@ -3784,17 +3784,19 @@ static struct cs_card_type __devinitdata cards[] = { * APM support */ #ifdef CONFIG_PM -void snd_cs46xx_suspend(cs46xx_t *chip) +static int snd_cs46xx_suspend(snd_card_t *card, unsigned int state) { + cs46xx_t *chip = snd_magic_cast(cs46xx_t, card->pm_private_data, return -EINVAL); int amp_saved; - snd_card_t *card = chip->card; - - if (card->power_state == SNDRV_CTL_POWER_D3hot) - return; snd_pcm_suspend_all(chip->pcm); // chip->ac97_powerdown = snd_cs46xx_codec_read(chip, AC97_POWER_CONTROL); // chip->ac97_general_purpose = snd_cs46xx_codec_read(chip, BA0_AC97_GENERAL_PURPOSE); + + snd_ac97_suspend(chip->ac97[CS46XX_PRIMARY_CODEC_INDEX]); + if (chip->ac97[CS46XX_SECONDARY_CODEC_INDEX]) + snd_ac97_suspend(chip->ac97[CS46XX_SECONDARY_CODEC_INDEX]); + amp_saved = chip->amplifier; /* turn off amp */ chip->amplifier_ctrl(chip, -chip->amplifier); @@ -3803,16 +3805,14 @@ void snd_cs46xx_suspend(cs46xx_t *chip) chip->active_ctrl(chip, -chip->amplifier); chip->amplifier = amp_saved; /* restore the status */ snd_power_change_state(card, SNDRV_CTL_POWER_D3hot); + return 0; } -void snd_cs46xx_resume(cs46xx_t *chip) +static int snd_cs46xx_resume(snd_card_t *card, unsigned int state) { - snd_card_t *card = chip->card; + cs46xx_t *chip = snd_magic_cast(cs46xx_t, card->pm_private_data, return -EINVAL); int amp_saved; - if (card->power_state == SNDRV_CTL_POWER_D0) - return; - pci_enable_device(chip->pci); amp_saved = chip->amplifier; chip->amplifier = 0; @@ -3832,6 +3832,8 @@ void snd_cs46xx_resume(cs46xx_t *chip) #endif snd_ac97_resume(chip->ac97[CS46XX_PRIMARY_CODEC_INDEX]); + if (chip->ac97[CS46XX_SECONDARY_CODEC_INDEX]) + snd_ac97_resume(chip->ac97[CS46XX_SECONDARY_CODEC_INDEX]); if (amp_saved) chip->amplifier_ctrl(chip, 1); /* turn amp on */ @@ -3839,25 +3841,6 @@ void snd_cs46xx_resume(cs46xx_t *chip) chip->active_ctrl(chip, -1); /* disable CLKRUN */ chip->amplifier = amp_saved; snd_power_change_state(card, SNDRV_CTL_POWER_D0); -} - -static int snd_cs46xx_set_power_state(snd_card_t *card, unsigned int power_state) -{ - cs46xx_t *chip = snd_magic_cast(cs46xx_t, card->power_state_private_data, return -ENXIO); - - switch (power_state) { - case SNDRV_CTL_POWER_D0: - case SNDRV_CTL_POWER_D1: - case SNDRV_CTL_POWER_D2: - snd_cs46xx_resume(chip); - break; - case SNDRV_CTL_POWER_D3hot: - case SNDRV_CTL_POWER_D3cold: - snd_cs46xx_suspend(chip); - break; - default: - return -EINVAL; - } return 0; } #endif /* CONFIG_PM */ @@ -4010,10 +3993,7 @@ int __devinit snd_cs46xx_create(snd_card_t * card, snd_cs46xx_proc_init(card, chip); -#ifdef CONFIG_PM - card->set_power_state = snd_cs46xx_set_power_state; - card->power_state_private_data = chip; -#endif + snd_card_set_pm_callback(card, snd_cs46xx_suspend, snd_cs46xx_resume, chip); if ((err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops)) < 0) { snd_cs46xx_free(chip);