[alsa-devel] [PATCH] es1688: allocate snd_es1688 structure as a part of snd_card structure

Takashi Iwai tiwai at suse.de
Thu May 6 09:21:38 CEST 2010


At Sun, 2 May 2010 09:45:45 +0200,
Krzysztof Helt wrote:
> 
> From: Krzysztof Helt <krzysztof.h1 at wp.pl>
> 
> Allocate the snd_es1688 during the snd_card allocation.
> This allows to remove the card pointer from the snd_es1688 structure.

Any other merit?

> Signed-off-by: Krzysztof Helt <krzysztof.h1 at wp.pl>
> ---
> This is the first part of changes to merge the es968 and the es1688 drivers.

OK, I'm pending this until other parts appear.

Anyway, you still call kfree() in the free callback.  This must be
removed, too.


thanks,

Takashi


>  include/sound/es1688.h        |   10 ++++----
>  sound/isa/es1688/es1688.c     |   23 ++++++++++++---------
>  sound/isa/es1688/es1688_lib.c |   43 +++++++++++++---------------------------
>  sound/isa/gus/gusextreme.c    |   26 +++++++++++++-----------
>  4 files changed, 46 insertions(+), 56 deletions(-)
> 
> diff --git a/include/sound/es1688.h b/include/sound/es1688.h
> index 10fcf14..4c29572 100644
> --- a/include/sound/es1688.h
> +++ b/include/sound/es1688.h
> @@ -44,7 +44,6 @@ struct snd_es1688 {
>  	unsigned char pad;
>  	unsigned int dma_size;
>  
> -	struct snd_card *card;
>  	struct snd_pcm *pcm;
>  	struct snd_pcm_substream *playback_substream;
>  	struct snd_pcm_substream *capture_substream;
> @@ -108,14 +107,15 @@ struct snd_es1688 {
>  void snd_es1688_mixer_write(struct snd_es1688 *chip, unsigned char reg, unsigned char data);
>  
>  int snd_es1688_create(struct snd_card *card,
> +		      struct snd_es1688 *chip,
>  		      unsigned long port,
>  		      unsigned long mpu_port,
>  		      int irq,
>  		      int mpu_irq,
>  		      int dma8,
> -		      unsigned short hardware,
> -		      struct snd_es1688 ** rchip);
> -int snd_es1688_pcm(struct snd_es1688 *chip, int device, struct snd_pcm ** rpcm);
> -int snd_es1688_mixer(struct snd_es1688 *chip);
> +		      unsigned short hardware);
> +int snd_es1688_pcm(struct snd_card *card, struct snd_es1688 *chip, int device,
> +		   struct snd_pcm **rpcm);
> +int snd_es1688_mixer(struct snd_card *card, struct snd_es1688 *chip);
>  
>  #endif /* __SOUND_ES1688_H */
> diff --git a/sound/isa/es1688/es1688.c b/sound/isa/es1688/es1688.c
> index 07df201..2816794 100644
> --- a/sound/isa/es1688/es1688.c
> +++ b/sound/isa/es1688/es1688.c
> @@ -79,8 +79,8 @@ static int __devinit snd_es1688_match(struct device *dev, unsigned int n)
>  	return enable[n];
>  }
>  
> -static int __devinit snd_es1688_legacy_create(struct snd_card *card, 
> -		struct device *dev, unsigned int n, struct snd_es1688 **rchip)
> +static int __devinit snd_es1688_legacy_create(struct snd_card *card,
> +		struct snd_es1688 *chip, struct device *dev, unsigned int n)
>  {
>  	static long possible_ports[] = {0x220, 0x240, 0x260};
>  	static int possible_irqs[] = {5, 9, 10, 7, -1};
> @@ -104,14 +104,14 @@ static int __devinit snd_es1688_legacy_create(struct snd_card *card,
>  	}
>  
>  	if (port[n] != SNDRV_AUTO_PORT)
> -		return snd_es1688_create(card, port[n], mpu_port[n], irq[n],
> -				mpu_irq[n], dma8[n], ES1688_HW_AUTO, rchip);
> +		return snd_es1688_create(card, chip, port[n], mpu_port[n],
> +				irq[n], mpu_irq[n], dma8[n], ES1688_HW_AUTO);
>  
>  	i = 0;
>  	do {
>  		port[n] = possible_ports[i];
> -		error = snd_es1688_create(card, port[n], mpu_port[n], irq[n],
> -				mpu_irq[n], dma8[n], ES1688_HW_AUTO, rchip);
> +		error = snd_es1688_create(card, chip, port[n], mpu_port[n],
> +				irq[n], mpu_irq[n], dma8[n], ES1688_HW_AUTO);
>  	} while (error < 0 && ++i < ARRAY_SIZE(possible_ports));
>  
>  	return error;
> @@ -125,19 +125,22 @@ static int __devinit snd_es1688_probe(struct device *dev, unsigned int n)
>  	struct snd_pcm *pcm;
>  	int error;
>  
> -	error = snd_card_create(index[n], id[n], THIS_MODULE, 0, &card);
> +	error = snd_card_create(index[n], id[n], THIS_MODULE,
> +				sizeof(struct snd_es1688), &card);
>  	if (error < 0)
>  		return error;
>  
> -	error = snd_es1688_legacy_create(card, dev, n, &chip);
> +	chip = card->private_data;
> +
> +	error = snd_es1688_legacy_create(card, chip, dev, n);
>  	if (error < 0)
>  		goto out;
>  
> -	error = snd_es1688_pcm(chip, 0, &pcm);
> +	error = snd_es1688_pcm(card, chip, 0, &pcm);
>  	if (error < 0)
>  		goto out;
>  
> -	error = snd_es1688_mixer(chip);
> +	error = snd_es1688_mixer(card, chip);
>  	if (error < 0)
>  		goto out;
>  
> diff --git a/sound/isa/es1688/es1688_lib.c b/sound/isa/es1688/es1688_lib.c
> index c76bb00..80c11fd 100644
> --- a/sound/isa/es1688/es1688_lib.c
> +++ b/sound/isa/es1688/es1688_lib.c
> @@ -638,23 +638,20 @@ static const char *snd_es1688_chip_id(struct snd_es1688 *chip)
>  }
>  
>  int snd_es1688_create(struct snd_card *card,
> +		      struct snd_es1688 *chip,
>  		      unsigned long port,
>  		      unsigned long mpu_port,
>  		      int irq,
>  		      int mpu_irq,
>  		      int dma8,
> -		      unsigned short hardware,
> -		      struct snd_es1688 **rchip)
> +		      unsigned short hardware)
>  {
>  	static struct snd_device_ops ops = {
>  		.dev_free =	snd_es1688_dev_free,
>  	};
>                                  
> -	struct snd_es1688 *chip;
>  	int err;
>  
> -	*rchip = NULL;
> -	chip = kzalloc(sizeof(*chip), GFP_KERNEL);
>  	if (chip == NULL)
>  		return -ENOMEM;
>  	chip->irq = -1;
> @@ -662,25 +659,21 @@ int snd_es1688_create(struct snd_card *card,
>  	
>  	if ((chip->res_port = request_region(port + 4, 12, "ES1688")) == NULL) {
>  		snd_printk(KERN_ERR "es1688: can't grab port 0x%lx\n", port + 4);
> -		snd_es1688_free(chip);
>  		return -EBUSY;
>  	}
>  	if (request_irq(irq, snd_es1688_interrupt, IRQF_DISABLED, "ES1688", (void *) chip)) {
>  		snd_printk(KERN_ERR "es1688: can't grab IRQ %d\n", irq);
> -		snd_es1688_free(chip);
>  		return -EBUSY;
>  	}
>  	chip->irq = irq;
>  	if (request_dma(dma8, "ES1688")) {
>  		snd_printk(KERN_ERR "es1688: can't grab DMA8 %d\n", dma8);
> -		snd_es1688_free(chip);
>  		return -EBUSY;
>  	}
>  	chip->dma8 = dma8;
>  
>  	spin_lock_init(&chip->reg_lock);
>  	spin_lock_init(&chip->mixer_lock);
> -	chip->card = card;
>  	chip->port = port;
>  	mpu_port &= ~0x000f;
>  	if (mpu_port < 0x300 || mpu_port > 0x330)
> @@ -689,23 +682,16 @@ int snd_es1688_create(struct snd_card *card,
>  	chip->mpu_irq = mpu_irq;
>  	chip->hardware = hardware;
>  
> -	if ((err = snd_es1688_probe(chip)) < 0) {
> -		snd_es1688_free(chip);
> +	err = snd_es1688_probe(chip);
> +	if (err < 0)
>  		return err;
> -	}
> -	if ((err = snd_es1688_init(chip, 1)) < 0) {
> -		snd_es1688_free(chip);
> -		return err;
> -	}
>  
> -	/* Register device */
> -	if ((err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops)) < 0) {
> -		snd_es1688_free(chip);
> +	err = snd_es1688_init(chip, 1);
> +	if (err < 0)
>  		return err;
> -	}
>  
> -	*rchip = chip;
> -	return 0;
> +	/* Register device */
> +	return snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops);
>  }
>  
>  static struct snd_pcm_ops snd_es1688_playback_ops = {
> @@ -730,12 +716,14 @@ static struct snd_pcm_ops snd_es1688_capture_ops = {
>  	.pointer =		snd_es1688_capture_pointer,
>  };
>  
> -int snd_es1688_pcm(struct snd_es1688 * chip, int device, struct snd_pcm ** rpcm)
> +int snd_es1688_pcm(struct snd_card *card, struct snd_es1688 *chip,
> +		   int device, struct snd_pcm **rpcm)
>  {
>  	struct snd_pcm *pcm;
>  	int err;
>  
> -	if ((err = snd_pcm_new(chip->card, "ESx688", device, 1, 1, &pcm)) < 0)
> +	err = snd_pcm_new(card, "ESx688", device, 1, 1, &pcm);
> +	if (err < 0)
>  		return err;
>  
>  	snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &snd_es1688_playback_ops);
> @@ -1009,18 +997,15 @@ static unsigned char snd_es1688_init_table[][2] = {
>  	{ ES1688_REC_DEV, 0x17 }
>  };
>                                          
> -int snd_es1688_mixer(struct snd_es1688 *chip)
> +int snd_es1688_mixer(struct snd_card *card, struct snd_es1688 *chip)
>  {
> -	struct snd_card *card;
>  	unsigned int idx;
>  	int err;
>  	unsigned char reg, val;
>  
> -	if (snd_BUG_ON(!chip || !chip->card))
> +	if (snd_BUG_ON(!chip || !card))
>  		return -EINVAL;
>  
> -	card = chip->card;
> -
>  	strcpy(card->mixername, snd_es1688_chip_id(chip));
>  
>  	for (idx = 0; idx < ARRAY_SIZE(snd_es1688_controls); idx++) {
> diff --git a/sound/isa/gus/gusextreme.c b/sound/isa/gus/gusextreme.c
> index 65e4b18..008e8e5 100644
> --- a/sound/isa/gus/gusextreme.c
> +++ b/sound/isa/gus/gusextreme.c
> @@ -95,7 +95,7 @@ static int __devinit snd_gusextreme_match(struct device *dev, unsigned int n)
>  }
>  
>  static int __devinit snd_gusextreme_es1688_create(struct snd_card *card,
> -		struct device *dev, unsigned int n, struct snd_es1688 **rchip)
> +		struct snd_es1688 *chip, struct device *dev, unsigned int n)
>  {
>  	static long possible_ports[] = {0x220, 0x240, 0x260};
>  	static int possible_irqs[] = {5, 9, 10, 7, -1};
> @@ -119,14 +119,14 @@ static int __devinit snd_gusextreme_es1688_create(struct snd_card *card,
>  	}
>  
>  	if (port[n] != SNDRV_AUTO_PORT)
> -		return snd_es1688_create(card, port[n], mpu_port[n], irq[n],
> -				mpu_irq[n], dma8[n], ES1688_HW_1688, rchip);
> +		return snd_es1688_create(card, chip, port[n], mpu_port[n],
> +				irq[n], mpu_irq[n], dma8[n], ES1688_HW_1688);
>  
>  	i = 0;
>  	do {
>  		port[n] = possible_ports[i];
> -		error = snd_es1688_create(card, port[n], mpu_port[n], irq[n],
> -				mpu_irq[n], dma8[n], ES1688_HW_1688, rchip);
> +		error = snd_es1688_create(card, chip, port[n], mpu_port[n],
> +				irq[n], mpu_irq[n], dma8[n], ES1688_HW_1688);
>  	} while (error < 0 && ++i < ARRAY_SIZE(possible_ports));
>  
>  	return error;
> @@ -206,9 +206,8 @@ static int __devinit snd_gusextreme_detect(struct snd_gus_card *gus,
>  	return 0;
>  }
>  
> -static int __devinit snd_gusextreme_mixer(struct snd_es1688 *chip)
> +static int __devinit snd_gusextreme_mixer(struct snd_card *card)
>  {
> -	struct snd_card *card = chip->card;
>  	struct snd_ctl_elem_id id1, id2;
>  	int error;
>  
> @@ -241,17 +240,20 @@ static int __devinit snd_gusextreme_probe(struct device *dev, unsigned int n)
>  	struct snd_opl3 *opl3;
>  	int error;
>  
> -	error = snd_card_create(index[n], id[n], THIS_MODULE, 0, &card);
> +	error = snd_card_create(index[n], id[n], THIS_MODULE,
> +				sizeof(struct snd_es1688), &card);
>  	if (error < 0)
>  		return error;
>  
> +	es1688 = card->private_data;
> +
>  	if (mpu_port[n] == SNDRV_AUTO_PORT)
>  		mpu_port[n] = 0;
>  
>  	if (mpu_irq[n] > 15)
>  		mpu_irq[n] = -1;
>  
> -	error = snd_gusextreme_es1688_create(card, dev, n, &es1688);
> +	error = snd_gusextreme_es1688_create(card, es1688, dev, n);
>  	if (error < 0)
>  		goto out;
>  
> @@ -280,11 +282,11 @@ static int __devinit snd_gusextreme_probe(struct device *dev, unsigned int n)
>  	}
>  	gus->codec_flag = 1;
>  
> -	error = snd_es1688_pcm(es1688, 0, NULL);
> +	error = snd_es1688_pcm(card, es1688, 0, NULL);
>  	if (error < 0)
>  		goto out;
>  
> -	error = snd_es1688_mixer(es1688);
> +	error = snd_es1688_mixer(card, es1688);
>  	if (error < 0)
>  		goto out;
>  
> @@ -300,7 +302,7 @@ static int __devinit snd_gusextreme_probe(struct device *dev, unsigned int n)
>  	if (error < 0)
>  		goto out;
>  
> -	error = snd_gusextreme_mixer(es1688);
> +	error = snd_gusextreme_mixer(card);
>  	if (error < 0)
>  		goto out;
>  
> -- 
> 1.6.4
> 
> 
> --------------------------------------------------
> Odkryj tajemnice TAROTA!
> Sprawdz >> http://link.interia.pl/f2695
> 


More information about the Alsa-devel mailing list