Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 396fa827 authored by Krzysztof Helt's avatar Krzysztof Helt Committed by Takashi Iwai
Browse files

ALSA: es1688: allocate snd_es1688 structure as a part of snd_card structure



Allocate the snd_es1688 during the snd_card allocation.
This allows to remove the card pointer from the snd_es1688 structure.

Signed-off-by: default avatarKrzysztof Helt <krzysztof.h1@wp.pl>
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent 02a2ad40
Loading
Loading
Loading
Loading
+5 −5
Original line number Original line Diff line number Diff line
@@ -44,7 +44,6 @@ struct snd_es1688 {
	unsigned char pad;
	unsigned char pad;
	unsigned int dma_size;
	unsigned int dma_size;


	struct snd_card *card;
	struct snd_pcm *pcm;
	struct snd_pcm *pcm;
	struct snd_pcm_substream *playback_substream;
	struct snd_pcm_substream *playback_substream;
	struct snd_pcm_substream *capture_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);
void snd_es1688_mixer_write(struct snd_es1688 *chip, unsigned char reg, unsigned char data);


int snd_es1688_create(struct snd_card *card,
int snd_es1688_create(struct snd_card *card,
		      struct snd_es1688 *chip,
		      unsigned long port,
		      unsigned long port,
		      unsigned long mpu_port,
		      unsigned long mpu_port,
		      int irq,
		      int irq,
		      int mpu_irq,
		      int mpu_irq,
		      int dma8,
		      int dma8,
		      unsigned short hardware,
		      unsigned short hardware);
		      struct snd_es1688 ** rchip);
int snd_es1688_pcm(struct snd_card *card, struct snd_es1688 *chip, int device,
int snd_es1688_pcm(struct snd_es1688 *chip, int device, struct snd_pcm ** rpcm);
		   struct snd_pcm **rpcm);
int snd_es1688_mixer(struct snd_es1688 *chip);
int snd_es1688_mixer(struct snd_card *card, struct snd_es1688 *chip);


#endif /* __SOUND_ES1688_H */
#endif /* __SOUND_ES1688_H */
+13 −10
Original line number Original line Diff line number Diff line
@@ -80,7 +80,7 @@ static int __devinit snd_es1688_match(struct device *dev, unsigned int n)
}
}


static int __devinit snd_es1688_legacy_create(struct snd_card *card,
static int __devinit snd_es1688_legacy_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 long possible_ports[] = {0x220, 0x240, 0x260};
	static int possible_irqs[] = {5, 9, 10, 7, -1};
	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)
	if (port[n] != SNDRV_AUTO_PORT)
		return snd_es1688_create(card, port[n], mpu_port[n], irq[n],
		return snd_es1688_create(card, chip, port[n], mpu_port[n],
				mpu_irq[n], dma8[n], ES1688_HW_AUTO, rchip);
				irq[n], mpu_irq[n], dma8[n], ES1688_HW_AUTO);


	i = 0;
	i = 0;
	do {
	do {
		port[n] = possible_ports[i];
		port[n] = possible_ports[i];
		error = snd_es1688_create(card, port[n], mpu_port[n], irq[n],
		error = snd_es1688_create(card, chip, port[n], mpu_port[n],
				mpu_irq[n], dma8[n], ES1688_HW_AUTO, rchip);
				irq[n], mpu_irq[n], dma8[n], ES1688_HW_AUTO);
	} while (error < 0 && ++i < ARRAY_SIZE(possible_ports));
	} while (error < 0 && ++i < ARRAY_SIZE(possible_ports));


	return error;
	return error;
@@ -125,19 +125,22 @@ static int __devinit snd_es1688_probe(struct device *dev, unsigned int n)
	struct snd_pcm *pcm;
	struct snd_pcm *pcm;
	int error;
	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)
	if (error < 0)
		return error;
		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)
	if (error < 0)
		goto out;
		goto out;


	error = snd_es1688_pcm(chip, 0, &pcm);
	error = snd_es1688_pcm(card, chip, 0, &pcm);
	if (error < 0)
	if (error < 0)
		goto out;
		goto out;


	error = snd_es1688_mixer(chip);
	error = snd_es1688_mixer(card, chip);
	if (error < 0)
	if (error < 0)
		goto out;
		goto out;


+14 −30
Original line number Original line Diff line number Diff line
@@ -620,7 +620,6 @@ static int snd_es1688_free(struct snd_es1688 *chip)
		disable_dma(chip->dma8);
		disable_dma(chip->dma8);
		free_dma(chip->dma8);
		free_dma(chip->dma8);
	}
	}
	kfree(chip);
	return 0;
	return 0;
}
}


@@ -638,23 +637,20 @@ static const char *snd_es1688_chip_id(struct snd_es1688 *chip)
}
}


int snd_es1688_create(struct snd_card *card,
int snd_es1688_create(struct snd_card *card,
		      struct snd_es1688 *chip,
		      unsigned long port,
		      unsigned long port,
		      unsigned long mpu_port,
		      unsigned long mpu_port,
		      int irq,
		      int irq,
		      int mpu_irq,
		      int mpu_irq,
		      int dma8,
		      int dma8,
		      unsigned short hardware,
		      unsigned short hardware)
		      struct snd_es1688 **rchip)
{
{
	static struct snd_device_ops ops = {
	static struct snd_device_ops ops = {
		.dev_free =	snd_es1688_dev_free,
		.dev_free =	snd_es1688_dev_free,
	};
	};
                                
                                
	struct snd_es1688 *chip;
	int err;
	int err;


	*rchip = NULL;
	chip = kzalloc(sizeof(*chip), GFP_KERNEL);
	if (chip == NULL)
	if (chip == NULL)
		return -ENOMEM;
		return -ENOMEM;
	chip->irq = -1;
	chip->irq = -1;
@@ -662,25 +658,21 @@ int snd_es1688_create(struct snd_card *card,
	
	
	if ((chip->res_port = request_region(port + 4, 12, "ES1688")) == NULL) {
	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_printk(KERN_ERR "es1688: can't grab port 0x%lx\n", port + 4);
		snd_es1688_free(chip);
		return -EBUSY;
		return -EBUSY;
	}
	}
	if (request_irq(irq, snd_es1688_interrupt, IRQF_DISABLED, "ES1688", (void *) chip)) {
	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_printk(KERN_ERR "es1688: can't grab IRQ %d\n", irq);
		snd_es1688_free(chip);
		return -EBUSY;
		return -EBUSY;
	}
	}
	chip->irq = irq;
	chip->irq = irq;
	if (request_dma(dma8, "ES1688")) {
	if (request_dma(dma8, "ES1688")) {
		snd_printk(KERN_ERR "es1688: can't grab DMA8 %d\n", dma8);
		snd_printk(KERN_ERR "es1688: can't grab DMA8 %d\n", dma8);
		snd_es1688_free(chip);
		return -EBUSY;
		return -EBUSY;
	}
	}
	chip->dma8 = dma8;
	chip->dma8 = dma8;


	spin_lock_init(&chip->reg_lock);
	spin_lock_init(&chip->reg_lock);
	spin_lock_init(&chip->mixer_lock);
	spin_lock_init(&chip->mixer_lock);
	chip->card = card;
	chip->port = port;
	chip->port = port;
	mpu_port &= ~0x000f;
	mpu_port &= ~0x000f;
	if (mpu_port < 0x300 || mpu_port > 0x330)
	if (mpu_port < 0x300 || mpu_port > 0x330)
@@ -689,23 +681,16 @@ int snd_es1688_create(struct snd_card *card,
	chip->mpu_irq = mpu_irq;
	chip->mpu_irq = mpu_irq;
	chip->hardware = hardware;
	chip->hardware = hardware;


	if ((err = snd_es1688_probe(chip)) < 0) {
	err = snd_es1688_probe(chip);
		snd_es1688_free(chip);
	if (err < 0)
		return err;
		return err;
	}
	if ((err = snd_es1688_init(chip, 1)) < 0) {
		snd_es1688_free(chip);
		return err;
	}


	/* Register device */
	err = snd_es1688_init(chip, 1);
	if ((err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops)) < 0) {
	if (err < 0)
		snd_es1688_free(chip);
		return err;
		return err;
	}


	*rchip = chip;
	/* Register device */
	return 0;
	return snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops);
}
}


static struct snd_pcm_ops snd_es1688_playback_ops = {
static struct snd_pcm_ops snd_es1688_playback_ops = {
@@ -730,12 +715,14 @@ static struct snd_pcm_ops snd_es1688_capture_ops = {
	.pointer =		snd_es1688_capture_pointer,
	.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;
	struct snd_pcm *pcm;
	int err;
	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;
		return err;


	snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &snd_es1688_playback_ops);
	snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &snd_es1688_playback_ops);
@@ -1009,18 +996,15 @@ static unsigned char snd_es1688_init_table[][2] = {
	{ ES1688_REC_DEV, 0x17 }
	{ 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;
	unsigned int idx;
	int err;
	int err;
	unsigned char reg, val;
	unsigned char reg, val;


	if (snd_BUG_ON(!chip || !chip->card))
	if (snd_BUG_ON(!chip || !card))
		return -EINVAL;
		return -EINVAL;


	card = chip->card;

	strcpy(card->mixername, snd_es1688_chip_id(chip));
	strcpy(card->mixername, snd_es1688_chip_id(chip));


	for (idx = 0; idx < ARRAY_SIZE(snd_es1688_controls); idx++) {
	for (idx = 0; idx < ARRAY_SIZE(snd_es1688_controls); idx++) {
+14 −12
Original line number Original line Diff line number Diff line
@@ -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,
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 long possible_ports[] = {0x220, 0x240, 0x260};
	static int possible_irqs[] = {5, 9, 10, 7, -1};
	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)
	if (port[n] != SNDRV_AUTO_PORT)
		return snd_es1688_create(card, port[n], mpu_port[n], irq[n],
		return snd_es1688_create(card, chip, port[n], mpu_port[n],
				mpu_irq[n], dma8[n], ES1688_HW_1688, rchip);
				irq[n], mpu_irq[n], dma8[n], ES1688_HW_1688);


	i = 0;
	i = 0;
	do {
	do {
		port[n] = possible_ports[i];
		port[n] = possible_ports[i];
		error = snd_es1688_create(card, port[n], mpu_port[n], irq[n],
		error = snd_es1688_create(card, chip, port[n], mpu_port[n],
				mpu_irq[n], dma8[n], ES1688_HW_1688, rchip);
				irq[n], mpu_irq[n], dma8[n], ES1688_HW_1688);
	} while (error < 0 && ++i < ARRAY_SIZE(possible_ports));
	} while (error < 0 && ++i < ARRAY_SIZE(possible_ports));


	return error;
	return error;
@@ -206,9 +206,8 @@ static int __devinit snd_gusextreme_detect(struct snd_gus_card *gus,
	return 0;
	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;
	struct snd_ctl_elem_id id1, id2;
	int error;
	int error;


@@ -241,17 +240,20 @@ static int __devinit snd_gusextreme_probe(struct device *dev, unsigned int n)
	struct snd_opl3 *opl3;
	struct snd_opl3 *opl3;
	int error;
	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)
	if (error < 0)
		return error;
		return error;


	es1688 = card->private_data;

	if (mpu_port[n] == SNDRV_AUTO_PORT)
	if (mpu_port[n] == SNDRV_AUTO_PORT)
		mpu_port[n] = 0;
		mpu_port[n] = 0;


	if (mpu_irq[n] > 15)
	if (mpu_irq[n] > 15)
		mpu_irq[n] = -1;
		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)
	if (error < 0)
		goto out;
		goto out;


@@ -280,11 +282,11 @@ static int __devinit snd_gusextreme_probe(struct device *dev, unsigned int n)
	}
	}
	gus->codec_flag = 1;
	gus->codec_flag = 1;


	error = snd_es1688_pcm(es1688, 0, NULL);
	error = snd_es1688_pcm(card, es1688, 0, NULL);
	if (error < 0)
	if (error < 0)
		goto out;
		goto out;


	error = snd_es1688_mixer(es1688);
	error = snd_es1688_mixer(card, es1688);
	if (error < 0)
	if (error < 0)
		goto out;
		goto out;


@@ -300,7 +302,7 @@ static int __devinit snd_gusextreme_probe(struct device *dev, unsigned int n)
	if (error < 0)
	if (error < 0)
		goto out;
		goto out;


	error = snd_gusextreme_mixer(es1688);
	error = snd_gusextreme_mixer(card);
	if (error < 0)
	if (error < 0)
		goto out;
		goto out;