浏览代码

[ALSA] pdaudiocf - Fix PM support

Modules: PDAudioCF driver

Fix the PM support on pdaudiocf driver.

Signed-off-by: Takashi Iwai <tiwai@suse.de>
Takashi Iwai 19 年之前
父节点
当前提交
e4f163d960
共有 3 个文件被更改,包括 8 次插入10 次删除
  1. 2 4
      sound/pcmcia/pdaudiocf/pdaudiocf.c
  2. 2 2
      sound/pcmcia/pdaudiocf/pdaudiocf.h
  3. 4 4
      sound/pcmcia/pdaudiocf/pdaudiocf_core.c

+ 2 - 4
sound/pcmcia/pdaudiocf/pdaudiocf.c

@@ -217,8 +217,6 @@ static int snd_pdacf_assign_resources(struct snd_pdacf *pdacf, int port, int irq
 	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;
 
@@ -339,7 +337,7 @@ static int pdacf_event(event_t event, int priority, event_callback_args_t *args)
 		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:
@@ -358,7 +356,7 @@ static int pdacf_event(event_t event, int priority, event_callback_args_t *args)
 			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");

+ 2 - 2
sound/pcmcia/pdaudiocf/pdaudiocf.h

@@ -134,8 +134,8 @@ struct snd_pdacf *snd_pdacf_create(struct snd_card *card);
 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);

+ 4 - 4
sound/pcmcia/pdaudiocf/pdaudiocf_core.c

@@ -255,11 +255,11 @@ 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_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);
@@ -275,9 +275,8 @@ static inline int check_signal(struct snd_pdacf *chip)
 	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);
@@ -286,6 +285,7 @@ int snd_pdacf_resume(struct snd_card *card)
 	       (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