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

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
...@@ -44,7 +44,6 @@ struct snd_es1688 { ...@@ -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 { ...@@ -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 */
...@@ -80,7 +80,7 @@ static int __devinit snd_es1688_match(struct device *dev, unsigned int n) ...@@ -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, ...@@ -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) ...@@ -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;
......
...@@ -620,7 +620,6 @@ static int snd_es1688_free(struct snd_es1688 *chip) ...@@ -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) ...@@ -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, ...@@ -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, ...@@ -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 = { ...@@ -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] = { ...@@ -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++) {
......
...@@ -95,7 +95,7 @@ static int __devinit snd_gusextreme_match(struct device *dev, unsigned int n) ...@@ -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, ...@@ -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, ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment