if (err < 0)
                return err;
 
-       snd_card_set_pm_callback(card, snd_pdacf_suspend, snd_pdacf_resume, pdacf);
-
        if ((err = snd_card_register(card)) < 0)
                return err;
 
                link->state |= DEV_SUSPEND;
                if (chip) {
                        snd_printdd(KERN_DEBUG "snd_pdacf_suspend calling\n");
-                       snd_pdacf_suspend(chip->card, PMSG_SUSPEND);
+                       snd_pdacf_suspend(chip, PMSG_SUSPEND);
                }
                /* Fall through... */
        case CS_EVENT_RESET_PHYSICAL:
                        pcmcia_request_configuration(link->handle, &link->conf);
                        if (chip) {
                                snd_printdd(KERN_DEBUG "calling snd_pdacf_resume\n");
-                               snd_pdacf_resume(chip->card);
+                               snd_pdacf_resume(chip);
                        }
                }
                snd_printdd(KERN_DEBUG "resume done!\n");
 
 int snd_pdacf_ak4117_create(struct snd_pdacf *pdacf);
 void snd_pdacf_powerdown(struct snd_pdacf *chip);
 #ifdef CONFIG_PM
-int snd_pdacf_suspend(struct snd_card *card, pm_message_t state);
-int snd_pdacf_resume(struct snd_card *card);
+int snd_pdacf_suspend(struct snd_pdacf *chip, pm_message_t state);
+int snd_pdacf_resume(struct snd_pdacf *chip);
 #endif
 int snd_pdacf_pcm_new(struct snd_pdacf *chip);
 irqreturn_t pdacf_interrupt(int irq, void *dev, struct pt_regs *regs);
 
 
 #ifdef CONFIG_PM
 
-int snd_pdacf_suspend(struct snd_card *card, pm_message_t state)
+int snd_pdacf_suspend(struct snd_pdacf *chip, pm_message_t state)
 {
-       struct snd_pdacf *chip = card->pm_private_data;
        u16 val;
        
+       snd_power_change_state(chip->card, SNDRV_CTL_POWER_D3hot);
        snd_pcm_suspend_all(chip->pcm);
        /* disable interrupts, but use direct write to preserve old register value in chip->regmap */
        val = inw(chip->port + PDAUDIOCF_REG_IER);
        return (chip->ak4117->rcs0 & AK4117_UNLCK) == 0;
 }
 
-int snd_pdacf_resume(struct snd_card *card)
+int snd_pdacf_resume(struct snd_pdacf *chip)
 {
-       struct snd_pdacf *chip = card->pm_private_data;
        int timeout = 40;
 
        pdacf_reinit(chip, 1);
               (snd_ak4117_external_rate(chip->ak4117) <= 0 || !check_signal(chip)))
                mdelay(1);
        chip->chip_status &= ~PDAUDIOCF_STAT_IS_SUSPENDED;
+       snd_power_change_state(chip->card, SNDRV_CTL_POWER_D0);
        return 0;
 }
 #endif