diff options
Diffstat (limited to 'sound/isa/ad1816a/ad1816a_lib.c')
| -rw-r--r-- | sound/isa/ad1816a/ad1816a_lib.c | 57 | 
1 files changed, 38 insertions, 19 deletions
diff --git a/sound/isa/ad1816a/ad1816a_lib.c b/sound/isa/ad1816a/ad1816a_lib.c index 05aef8b97e9..f0fd98e695e 100644 --- a/sound/isa/ad1816a/ad1816a_lib.c +++ b/sound/isa/ad1816a/ad1816a_lib.c @@ -491,7 +491,7 @@ static int snd_ad1816a_capture_close(struct snd_pcm_substream *substream)  } -static void __devinit snd_ad1816a_init(struct snd_ad1816a *chip) +static void snd_ad1816a_init(struct snd_ad1816a *chip)  {  	unsigned long flags; @@ -511,7 +511,33 @@ static void __devinit snd_ad1816a_init(struct snd_ad1816a *chip)  	spin_unlock_irqrestore(&chip->lock, flags);  } -static int __devinit snd_ad1816a_probe(struct snd_ad1816a *chip) +#ifdef CONFIG_PM +void snd_ad1816a_suspend(struct snd_ad1816a *chip) +{ +	int reg; +	unsigned long flags; + +	snd_pcm_suspend_all(chip->pcm); +	spin_lock_irqsave(&chip->lock, flags); +	for (reg = 0; reg < 48; reg++) +		chip->image[reg] = snd_ad1816a_read(chip, reg); +	spin_unlock_irqrestore(&chip->lock, flags); +} + +void snd_ad1816a_resume(struct snd_ad1816a *chip) +{ +	int reg; +	unsigned long flags; + +	snd_ad1816a_init(chip); +	spin_lock_irqsave(&chip->lock, flags); +	for (reg = 0; reg < 48; reg++) +		snd_ad1816a_write(chip, reg, chip->image[reg]); +	spin_unlock_irqrestore(&chip->lock, flags); +} +#endif + +static int snd_ad1816a_probe(struct snd_ad1816a *chip)  {  	unsigned long flags; @@ -548,7 +574,6 @@ static int snd_ad1816a_free(struct snd_ad1816a *chip)  		snd_dma_disable(chip->dma2);  		free_dma(chip->dma2);  	} -	kfree(chip);  	return 0;  } @@ -558,7 +583,7 @@ static int snd_ad1816a_dev_free(struct snd_device *device)  	return snd_ad1816a_free(chip);  } -static const char __devinit *snd_ad1816a_chip_id(struct snd_ad1816a *chip) +static const char *snd_ad1816a_chip_id(struct snd_ad1816a *chip)  {  	switch (chip->hardware) {  	case AD1816A_HW_AD1816A: return "AD1816A"; @@ -571,21 +596,15 @@ static const char __devinit *snd_ad1816a_chip_id(struct snd_ad1816a *chip)  	}  } -int __devinit snd_ad1816a_create(struct snd_card *card, -				 unsigned long port, int irq, int dma1, int dma2, -				 struct snd_ad1816a **rchip) +int snd_ad1816a_create(struct snd_card *card, +		       unsigned long port, int irq, int dma1, int dma2, +		       struct snd_ad1816a *chip)  {          static struct snd_device_ops ops = {  		.dev_free =	snd_ad1816a_dev_free,  	};  	int error; -	struct snd_ad1816a *chip; - -	*rchip = NULL; -	chip = kzalloc(sizeof(*chip), GFP_KERNEL); -	if (chip == NULL) -		return -ENOMEM;  	chip->irq = -1;  	chip->dma1 = -1;  	chip->dma2 = -1; @@ -595,7 +614,7 @@ int __devinit snd_ad1816a_create(struct snd_card *card,  		snd_ad1816a_free(chip);  		return -EBUSY;  	} -	if (request_irq(irq, snd_ad1816a_interrupt, IRQF_DISABLED, "AD1816A", (void *) chip)) { +	if (request_irq(irq, snd_ad1816a_interrupt, 0, "AD1816A", (void *) chip)) {  		snd_printk(KERN_ERR "ad1816a: can't grab IRQ %d\n", irq);  		snd_ad1816a_free(chip);  		return -EBUSY; @@ -631,7 +650,6 @@ int __devinit snd_ad1816a_create(struct snd_card *card,  		return error;  	} -	*rchip = chip;  	return 0;  } @@ -657,7 +675,7 @@ static struct snd_pcm_ops snd_ad1816a_capture_ops = {  	.pointer =	snd_ad1816a_capture_pointer,  }; -int __devinit snd_ad1816a_pcm(struct snd_ad1816a *chip, int device, struct snd_pcm **rpcm) +int snd_ad1816a_pcm(struct snd_ad1816a *chip, int device, struct snd_pcm **rpcm)  {  	int error;  	struct snd_pcm *pcm; @@ -684,7 +702,8 @@ int __devinit snd_ad1816a_pcm(struct snd_ad1816a *chip, int device, struct snd_p  	return 0;  } -int __devinit snd_ad1816a_timer(struct snd_ad1816a *chip, int device, struct snd_timer **rtimer) +int snd_ad1816a_timer(struct snd_ad1816a *chip, int device, +		      struct snd_timer **rtimer)  {  	struct snd_timer *timer;  	struct snd_timer_id tid; @@ -905,7 +924,7 @@ static const DECLARE_TLV_DB_SCALE(db_scale_6bit, -9450, 150, 0);  static const DECLARE_TLV_DB_SCALE(db_scale_5bit_12db_max, -3450, 150, 0);  static const DECLARE_TLV_DB_SCALE(db_scale_rec_gain, 0, 150, 0); -static struct snd_kcontrol_new snd_ad1816a_controls[] __devinitdata = { +static struct snd_kcontrol_new snd_ad1816a_controls[] = {  AD1816A_DOUBLE("Master Playback Switch", AD1816A_MASTER_ATT, 15, 7, 1, 1),  AD1816A_DOUBLE_TLV("Master Playback Volume", AD1816A_MASTER_ATT, 8, 0, 31, 1,  		   db_scale_5bit), @@ -951,7 +970,7 @@ AD1816A_SINGLE("3D Control - Switch", AD1816A_3D_PHAT_CTRL, 15, 1, 1),  AD1816A_SINGLE("3D Control - Level", AD1816A_3D_PHAT_CTRL, 0, 15, 0),  }; -int __devinit snd_ad1816a_mixer(struct snd_ad1816a *chip) +int snd_ad1816a_mixer(struct snd_ad1816a *chip)  {  	struct snd_card *card;  	unsigned int idx;  | 
