[ALSA] Add snd_card_set_generic_dev() call to ISA drivers
ISA,CMI8330 driver,ES18xx driver,OPL3SA2 driver,Sound Galaxy driver Sound Scape driver,AD1848 driver,CS4231 driver,CS4236+ driver ES1688 driver,GUS Classic driver,GUS Extreme driver,GUS MAX driver AMD InterWave driver,Opti9xx drivers,SB16/AWE driver,SB8 driver Wavefront drivers - Added snd_card_set_generic_dev() call. - Added SND_GENERIC_DRIVER to Kconfig. - Clean up the error path in probe if necessary. Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
parent
16dab54b8c
commit
43bcd973d6
@ -6,12 +6,12 @@ menu "ISA devices"
|
|||||||
config SND_AD1848_LIB
|
config SND_AD1848_LIB
|
||||||
tristate
|
tristate
|
||||||
select SND_PCM
|
select SND_PCM
|
||||||
select SND_GENERIC_PM
|
select SND_GENERIC_DRIVER
|
||||||
|
|
||||||
config SND_CS4231_LIB
|
config SND_CS4231_LIB
|
||||||
tristate
|
tristate
|
||||||
select SND_PCM
|
select SND_PCM
|
||||||
select SND_GENERIC_PM
|
select SND_GENERIC_DRIVER
|
||||||
|
|
||||||
config SND_AD1816A
|
config SND_AD1816A
|
||||||
tristate "Analog Devices SoundPort AD1816A"
|
tristate "Analog Devices SoundPort AD1816A"
|
||||||
@ -97,6 +97,7 @@ config SND_ES1688
|
|||||||
select SND_OPL3_LIB
|
select SND_OPL3_LIB
|
||||||
select SND_MPU401_UART
|
select SND_MPU401_UART
|
||||||
select SND_PCM
|
select SND_PCM
|
||||||
|
select SND_GENERIC_DRIVER
|
||||||
help
|
help
|
||||||
Say Y here to include support for ESS AudioDrive ES688 or
|
Say Y here to include support for ESS AudioDrive ES688 or
|
||||||
ES1688 chips.
|
ES1688 chips.
|
||||||
@ -110,7 +111,7 @@ config SND_ES18XX
|
|||||||
select SND_OPL3_LIB
|
select SND_OPL3_LIB
|
||||||
select SND_MPU401_UART
|
select SND_MPU401_UART
|
||||||
select SND_PCM
|
select SND_PCM
|
||||||
select SND_GENERIC_PM
|
select SND_GENERIC_DRIVER
|
||||||
help
|
help
|
||||||
Say Y here to include support for ESS AudioDrive ES18xx chips.
|
Say Y here to include support for ESS AudioDrive ES18xx chips.
|
||||||
|
|
||||||
@ -126,6 +127,7 @@ config SND_GUSCLASSIC
|
|||||||
select SND_RAWMIDI
|
select SND_RAWMIDI
|
||||||
select SND_PCM
|
select SND_PCM
|
||||||
select SND_GUS_SYNTH
|
select SND_GUS_SYNTH
|
||||||
|
select SND_GENERIC_DRIVER
|
||||||
help
|
help
|
||||||
Say Y here to include support for Gravis UltraSound Classic
|
Say Y here to include support for Gravis UltraSound Classic
|
||||||
soundcards.
|
soundcards.
|
||||||
@ -140,6 +142,7 @@ config SND_GUSEXTREME
|
|||||||
select SND_MPU401_UART
|
select SND_MPU401_UART
|
||||||
select SND_PCM
|
select SND_PCM
|
||||||
select SND_GUS_SYNTH
|
select SND_GUS_SYNTH
|
||||||
|
select SND_GENERIC_DRIVER
|
||||||
help
|
help
|
||||||
Say Y here to include support for Gravis UltraSound Extreme
|
Say Y here to include support for Gravis UltraSound Extreme
|
||||||
soundcards.
|
soundcards.
|
||||||
@ -153,6 +156,7 @@ config SND_GUSMAX
|
|||||||
select SND_RAWMIDI
|
select SND_RAWMIDI
|
||||||
select SND_CS4231_LIB
|
select SND_CS4231_LIB
|
||||||
select SND_GUS_SYNTH
|
select SND_GUS_SYNTH
|
||||||
|
select SND_GENERIC_DRIVER
|
||||||
help
|
help
|
||||||
Say Y here to include support for Gravis UltraSound MAX
|
Say Y here to include support for Gravis UltraSound MAX
|
||||||
soundcards.
|
soundcards.
|
||||||
@ -166,7 +170,7 @@ config SND_INTERWAVE
|
|||||||
select SND_RAWMIDI
|
select SND_RAWMIDI
|
||||||
select SND_CS4231_LIB
|
select SND_CS4231_LIB
|
||||||
select SND_GUS_SYNTH
|
select SND_GUS_SYNTH
|
||||||
select ISAPNP
|
select SND_GENERIC_DRIVER
|
||||||
help
|
help
|
||||||
Say Y here to include support for AMD InterWave based
|
Say Y here to include support for AMD InterWave based
|
||||||
soundcards (Gravis UltraSound Plug & Play, STB SoundRage32,
|
soundcards (Gravis UltraSound Plug & Play, STB SoundRage32,
|
||||||
@ -181,7 +185,7 @@ config SND_INTERWAVE_STB
|
|||||||
select SND_RAWMIDI
|
select SND_RAWMIDI
|
||||||
select SND_CS4231_LIB
|
select SND_CS4231_LIB
|
||||||
select SND_GUS_SYNTH
|
select SND_GUS_SYNTH
|
||||||
select ISAPNP
|
select SND_GENERIC_DRIVER
|
||||||
help
|
help
|
||||||
Say Y here to include support for AMD InterWave based
|
Say Y here to include support for AMD InterWave based
|
||||||
soundcards with a TEA6330T bass and treble regulator
|
soundcards with a TEA6330T bass and treble regulator
|
||||||
@ -224,6 +228,7 @@ config SND_OPTI93X
|
|||||||
select SND_OPL3_LIB
|
select SND_OPL3_LIB
|
||||||
select SND_MPU401_UART
|
select SND_MPU401_UART
|
||||||
select SND_PCM
|
select SND_PCM
|
||||||
|
select SND_GENERIC_DRIVER
|
||||||
help
|
help
|
||||||
Say Y here to include support for soundcards based on Opti
|
Say Y here to include support for soundcards based on Opti
|
||||||
82C93x chips.
|
82C93x chips.
|
||||||
@ -237,6 +242,7 @@ config SND_SB8
|
|||||||
select SND_OPL3_LIB
|
select SND_OPL3_LIB
|
||||||
select SND_RAWMIDI
|
select SND_RAWMIDI
|
||||||
select SND_PCM
|
select SND_PCM
|
||||||
|
select SND_GENERIC_DRIVER
|
||||||
help
|
help
|
||||||
Say Y here to include support for Creative Sound Blaster 1.0/
|
Say Y here to include support for Creative Sound Blaster 1.0/
|
||||||
2.0/Pro (8-bit) or 100% compatible soundcards.
|
2.0/Pro (8-bit) or 100% compatible soundcards.
|
||||||
@ -250,6 +256,7 @@ config SND_SB16
|
|||||||
select SND_OPL3_LIB
|
select SND_OPL3_LIB
|
||||||
select SND_MPU401_UART
|
select SND_MPU401_UART
|
||||||
select SND_PCM
|
select SND_PCM
|
||||||
|
select SND_GENERIC_DRIVER
|
||||||
help
|
help
|
||||||
Say Y here to include support for Sound Blaster 16 soundcards
|
Say Y here to include support for Sound Blaster 16 soundcards
|
||||||
(including the Plug and Play version).
|
(including the Plug and Play version).
|
||||||
@ -263,6 +270,7 @@ config SND_SBAWE
|
|||||||
select SND_OPL3_LIB
|
select SND_OPL3_LIB
|
||||||
select SND_MPU401_UART
|
select SND_MPU401_UART
|
||||||
select SND_PCM
|
select SND_PCM
|
||||||
|
select SND_GENERIC_DRIVER
|
||||||
help
|
help
|
||||||
Say Y here to include support for Sound Blaster AWE soundcards
|
Say Y here to include support for Sound Blaster AWE soundcards
|
||||||
(including the Plug and Play version).
|
(including the Plug and Play version).
|
||||||
|
@ -91,35 +91,36 @@ static int __init snd_card_ad1848_probe(int dev)
|
|||||||
irq[dev],
|
irq[dev],
|
||||||
dma1[dev],
|
dma1[dev],
|
||||||
thinkpad[dev] ? AD1848_HW_THINKPAD : AD1848_HW_DETECT,
|
thinkpad[dev] ? AD1848_HW_THINKPAD : AD1848_HW_DETECT,
|
||||||
&chip)) < 0) {
|
&chip)) < 0)
|
||||||
snd_card_free(card);
|
goto _err;
|
||||||
return err;
|
|
||||||
}
|
if ((err = snd_ad1848_pcm(chip, 0, &pcm)) < 0)
|
||||||
|
goto _err;
|
||||||
|
|
||||||
|
if ((err = snd_ad1848_mixer(chip)) < 0)
|
||||||
|
goto _err;
|
||||||
|
|
||||||
if ((err = snd_ad1848_pcm(chip, 0, &pcm)) < 0) {
|
|
||||||
snd_card_free(card);
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
if ((err = snd_ad1848_mixer(chip)) < 0) {
|
|
||||||
snd_card_free(card);
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
strcpy(card->driver, "AD1848");
|
strcpy(card->driver, "AD1848");
|
||||||
strcpy(card->shortname, pcm->name);
|
strcpy(card->shortname, pcm->name);
|
||||||
|
|
||||||
sprintf(card->longname, "%s at 0x%lx, irq %d, dma %d",
|
sprintf(card->longname, "%s at 0x%lx, irq %d, dma %d",
|
||||||
pcm->name, chip->port, irq[dev], dma1[dev]);
|
pcm->name, chip->port, irq[dev], dma1[dev]);
|
||||||
|
|
||||||
if (thinkpad[dev]) {
|
if (thinkpad[dev])
|
||||||
strcat(card->longname, " [Thinkpad]");
|
strcat(card->longname, " [Thinkpad]");
|
||||||
}
|
|
||||||
|
|
||||||
if ((err = snd_card_register(card)) < 0) {
|
if ((err = snd_card_set_generic_dev(card)) < 0)
|
||||||
snd_card_free(card);
|
goto _err;
|
||||||
return err;
|
|
||||||
}
|
if ((err = snd_card_register(card)) < 0)
|
||||||
|
goto _err;
|
||||||
|
|
||||||
snd_ad1848_cards[dev] = card;
|
snd_ad1848_cards[dev] = card;
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
_err:
|
||||||
|
snd_card_free(card);
|
||||||
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int __init alsa_card_ad1848_init(void)
|
static int __init alsa_card_ad1848_init(void)
|
||||||
|
@ -438,33 +438,37 @@ static int __devinit snd_cmi8330_pcm(snd_card_t *card, struct snd_cmi8330 *chip)
|
|||||||
/*
|
/*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#ifdef CONFIG_PNP
|
||||||
|
#define is_isapnp_selected(dev) isapnp[dev]
|
||||||
|
#else
|
||||||
|
#define is_isapnp_selected(dev) 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define PFX "cmi8330: "
|
||||||
|
|
||||||
static int __devinit snd_cmi8330_probe(int dev,
|
static int __devinit snd_cmi8330_probe(int dev,
|
||||||
struct pnp_card_link *pcard,
|
struct pnp_card_link *pcard,
|
||||||
const struct pnp_card_device_id *pid)
|
const struct pnp_card_device_id *pid)
|
||||||
{
|
{
|
||||||
snd_card_t *card;
|
snd_card_t *card;
|
||||||
struct snd_cmi8330 *acard;
|
struct snd_cmi8330 *acard;
|
||||||
unsigned long flags;
|
|
||||||
int i, err;
|
int i, err;
|
||||||
|
|
||||||
#ifdef CONFIG_PNP
|
if (! is_isapnp_selected(dev)) {
|
||||||
if (!isapnp[dev]) {
|
|
||||||
#endif
|
|
||||||
if (wssport[dev] == SNDRV_AUTO_PORT) {
|
if (wssport[dev] == SNDRV_AUTO_PORT) {
|
||||||
snd_printk("specify wssport\n");
|
snd_printk(KERN_ERR PFX "specify wssport\n");
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
if (sbport[dev] == SNDRV_AUTO_PORT) {
|
if (sbport[dev] == SNDRV_AUTO_PORT) {
|
||||||
snd_printk("specify sbport\n");
|
snd_printk(KERN_ERR PFX "specify sbport\n");
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
#ifdef CONFIG_PNP
|
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
card = snd_card_new(index[dev], id[dev], THIS_MODULE,
|
card = snd_card_new(index[dev], id[dev], THIS_MODULE,
|
||||||
sizeof(struct snd_cmi8330));
|
sizeof(struct snd_cmi8330));
|
||||||
if (card == NULL) {
|
if (card == NULL) {
|
||||||
snd_printk("could not get a new card\n");
|
snd_printk(KERN_ERR PFX "could not get a new card\n");
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
acard = (struct snd_cmi8330 *)card->private_data;
|
acard = (struct snd_cmi8330 *)card->private_data;
|
||||||
@ -473,9 +477,8 @@ static int __devinit snd_cmi8330_probe(int dev,
|
|||||||
#ifdef CONFIG_PNP
|
#ifdef CONFIG_PNP
|
||||||
if (isapnp[dev]) {
|
if (isapnp[dev]) {
|
||||||
if ((err = snd_cmi8330_pnp(dev, acard, pcard, pid)) < 0) {
|
if ((err = snd_cmi8330_pnp(dev, acard, pcard, pid)) < 0) {
|
||||||
snd_printk("PnP detection failed\n");
|
snd_printk(KERN_ERR PFX "PnP detection failed\n");
|
||||||
snd_card_free(card);
|
goto _err;
|
||||||
return err;
|
|
||||||
}
|
}
|
||||||
snd_card_set_dev(card, &pcard->card->dev);
|
snd_card_set_dev(card, &pcard->card->dev);
|
||||||
}
|
}
|
||||||
@ -487,14 +490,13 @@ static int __devinit snd_cmi8330_probe(int dev,
|
|||||||
wssdma[dev],
|
wssdma[dev],
|
||||||
AD1848_HW_DETECT,
|
AD1848_HW_DETECT,
|
||||||
&acard->wss)) < 0) {
|
&acard->wss)) < 0) {
|
||||||
snd_printk("(AD1848) device busy??\n");
|
snd_printk(KERN_ERR PFX "(AD1848) device busy??\n");
|
||||||
snd_card_free(card);
|
goto _err;
|
||||||
return err;
|
|
||||||
}
|
}
|
||||||
if (acard->wss->hardware != AD1848_HW_CMI8330) {
|
if (acard->wss->hardware != AD1848_HW_CMI8330) {
|
||||||
snd_printk("(AD1848) not found during probe\n");
|
snd_printk(KERN_ERR PFX "(AD1848) not found during probe\n");
|
||||||
snd_card_free(card);
|
err = -ENODEV;
|
||||||
return -ENODEV;
|
goto _err;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((err = snd_sbdsp_create(card, sbport[dev],
|
if ((err = snd_sbdsp_create(card, sbport[dev],
|
||||||
@ -503,32 +505,26 @@ static int __devinit snd_cmi8330_probe(int dev,
|
|||||||
sbdma8[dev],
|
sbdma8[dev],
|
||||||
sbdma16[dev],
|
sbdma16[dev],
|
||||||
SB_HW_AUTO, &acard->sb)) < 0) {
|
SB_HW_AUTO, &acard->sb)) < 0) {
|
||||||
snd_printk("(SB16) device busy??\n");
|
snd_printk(KERN_ERR PFX "(SB16) device busy??\n");
|
||||||
snd_card_free(card);
|
goto _err;
|
||||||
return err;
|
|
||||||
}
|
}
|
||||||
if (acard->sb->hardware != SB_HW_16) {
|
if (acard->sb->hardware != SB_HW_16) {
|
||||||
snd_printk("(SB16) not found during probe\n");
|
snd_printk(KERN_ERR PFX "(SB16) not found during probe\n");
|
||||||
snd_card_free(card);
|
goto _err;
|
||||||
return -ENODEV;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
spin_lock_irqsave(&acard->wss->reg_lock, flags);
|
|
||||||
snd_ad1848_out(acard->wss, AD1848_MISC_INFO, 0x40); /* switch on MODE2 */
|
snd_ad1848_out(acard->wss, AD1848_MISC_INFO, 0x40); /* switch on MODE2 */
|
||||||
for (i = CMI8330_RMUX3D; i <= CMI8330_CDINGAIN; i++)
|
for (i = CMI8330_RMUX3D; i <= CMI8330_CDINGAIN; i++)
|
||||||
snd_ad1848_out(acard->wss, i, snd_cmi8330_image[i - CMI8330_RMUX3D]);
|
snd_ad1848_out(acard->wss, i, snd_cmi8330_image[i - CMI8330_RMUX3D]);
|
||||||
spin_unlock_irqrestore(&acard->wss->reg_lock, flags);
|
|
||||||
|
|
||||||
if ((err = snd_cmi8330_mixer(card, acard)) < 0) {
|
if ((err = snd_cmi8330_mixer(card, acard)) < 0) {
|
||||||
snd_printk("failed to create mixers\n");
|
snd_printk(KERN_ERR PFX "failed to create mixers\n");
|
||||||
snd_card_free(card);
|
goto _err;
|
||||||
return err;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((err = snd_cmi8330_pcm(card, acard)) < 0) {
|
if ((err = snd_cmi8330_pcm(card, acard)) < 0) {
|
||||||
snd_printk("failed to create pcms\n");
|
snd_printk(KERN_ERR PFX "failed to create pcms\n");
|
||||||
snd_card_free(card);
|
goto _err;
|
||||||
return err;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
strcpy(card->driver, "CMI8330/C3D");
|
strcpy(card->driver, "CMI8330/C3D");
|
||||||
@ -539,16 +535,21 @@ static int __devinit snd_cmi8330_probe(int dev,
|
|||||||
wssirq[dev],
|
wssirq[dev],
|
||||||
wssdma[dev]);
|
wssdma[dev]);
|
||||||
|
|
||||||
if ((err = snd_card_register(card)) < 0) {
|
if ((err = snd_card_set_generic_dev(card)) < 0)
|
||||||
snd_card_free(card);
|
goto _err;
|
||||||
return err;
|
|
||||||
}
|
if ((err = snd_card_register(card)) < 0)
|
||||||
|
goto _err;
|
||||||
|
|
||||||
if (pcard)
|
if (pcard)
|
||||||
pnp_set_card_drvdata(pcard, card);
|
pnp_set_card_drvdata(pcard, card);
|
||||||
else
|
else
|
||||||
snd_cmi8330_legacy[dev] = card;
|
snd_cmi8330_legacy[dev] = card;
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
_err:
|
||||||
|
snd_card_free(card);
|
||||||
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_PNP
|
#ifdef CONFIG_PNP
|
||||||
@ -594,10 +595,8 @@ static int __init alsa_card_cmi8330_init(void)
|
|||||||
for (dev = 0; dev < SNDRV_CARDS; dev++) {
|
for (dev = 0; dev < SNDRV_CARDS; dev++) {
|
||||||
if (!enable[dev])
|
if (!enable[dev])
|
||||||
continue;
|
continue;
|
||||||
#ifdef CONFIG_PNP
|
if (is_isapnp_selected(dev))
|
||||||
if (isapnp[dev])
|
|
||||||
continue;
|
continue;
|
||||||
#endif
|
|
||||||
if (snd_cmi8330_probe(dev, NULL, NULL) >= 0)
|
if (snd_cmi8330_probe(dev, NULL, NULL) >= 0)
|
||||||
cards++;
|
cards++;
|
||||||
}
|
}
|
||||||
|
@ -76,15 +76,15 @@ static int __init snd_card_cs4231_probe(int dev)
|
|||||||
int err;
|
int err;
|
||||||
|
|
||||||
if (port[dev] == SNDRV_AUTO_PORT) {
|
if (port[dev] == SNDRV_AUTO_PORT) {
|
||||||
snd_printk("specify port\n");
|
snd_printk(KERN_ERR "specify port\n");
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
if (irq[dev] == SNDRV_AUTO_IRQ) {
|
if (irq[dev] == SNDRV_AUTO_IRQ) {
|
||||||
snd_printk("specify irq\n");
|
snd_printk(KERN_ERR "specify irq\n");
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
if (dma1[dev] == SNDRV_AUTO_DMA) {
|
if (dma1[dev] == SNDRV_AUTO_DMA) {
|
||||||
snd_printk("specify dma1\n");
|
snd_printk(KERN_ERR "specify dma1\n");
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
card = snd_card_new(index[dev], id[dev], THIS_MODULE, 0);
|
card = snd_card_new(index[dev], id[dev], THIS_MODULE, 0);
|
||||||
@ -96,15 +96,11 @@ static int __init snd_card_cs4231_probe(int dev)
|
|||||||
dma1[dev],
|
dma1[dev],
|
||||||
dma2[dev],
|
dma2[dev],
|
||||||
CS4231_HW_DETECT,
|
CS4231_HW_DETECT,
|
||||||
0, &chip)) < 0) {
|
0, &chip)) < 0)
|
||||||
snd_card_free(card);
|
goto _err;
|
||||||
return err;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((err = snd_cs4231_pcm(chip, 0, &pcm)) < 0) {
|
if ((err = snd_cs4231_pcm(chip, 0, &pcm)) < 0)
|
||||||
snd_card_free(card);
|
goto _err;
|
||||||
return err;
|
|
||||||
}
|
|
||||||
|
|
||||||
strcpy(card->driver, "CS4231");
|
strcpy(card->driver, "CS4231");
|
||||||
strcpy(card->shortname, pcm->name);
|
strcpy(card->shortname, pcm->name);
|
||||||
@ -113,14 +109,10 @@ static int __init snd_card_cs4231_probe(int dev)
|
|||||||
if (dma2[dev] >= 0)
|
if (dma2[dev] >= 0)
|
||||||
sprintf(card->longname + strlen(card->longname), "&%d", dma2[dev]);
|
sprintf(card->longname + strlen(card->longname), "&%d", dma2[dev]);
|
||||||
|
|
||||||
if ((err = snd_cs4231_mixer(chip)) < 0) {
|
if ((err = snd_cs4231_mixer(chip)) < 0)
|
||||||
snd_card_free(card);
|
goto _err;
|
||||||
return err;
|
if ((err = snd_cs4231_timer(chip, 0, NULL)) < 0)
|
||||||
}
|
goto _err;
|
||||||
if ((err = snd_cs4231_timer(chip, 0, NULL)) < 0) {
|
|
||||||
snd_card_free(card);
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (mpu_port[dev] > 0 && mpu_port[dev] != SNDRV_AUTO_PORT) {
|
if (mpu_port[dev] > 0 && mpu_port[dev] != SNDRV_AUTO_PORT) {
|
||||||
if (mpu_irq[dev] == SNDRV_AUTO_IRQ)
|
if (mpu_irq[dev] == SNDRV_AUTO_IRQ)
|
||||||
@ -130,14 +122,20 @@ static int __init snd_card_cs4231_probe(int dev)
|
|||||||
mpu_irq[dev],
|
mpu_irq[dev],
|
||||||
mpu_irq[dev] >= 0 ? SA_INTERRUPT : 0,
|
mpu_irq[dev] >= 0 ? SA_INTERRUPT : 0,
|
||||||
NULL) < 0)
|
NULL) < 0)
|
||||||
printk(KERN_ERR "cs4231: MPU401 not detected\n");
|
printk(KERN_WARNING "cs4231: MPU401 not detected\n");
|
||||||
}
|
|
||||||
if ((err = snd_card_register(card)) < 0) {
|
|
||||||
snd_card_free(card);
|
|
||||||
return err;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ((err = snd_card_set_generic_dev(card)) < 0)
|
||||||
|
goto _err;
|
||||||
|
|
||||||
|
if ((err = snd_card_register(card)) < 0)
|
||||||
|
goto _err;
|
||||||
snd_cs4231_cards[dev] = card;
|
snd_cs4231_cards[dev] = card;
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
_err:
|
||||||
|
snd_card_free(card);
|
||||||
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int __init alsa_card_cs4231_init(void)
|
static int __init alsa_card_cs4231_init(void)
|
||||||
|
@ -387,6 +387,12 @@ static void snd_card_cs4236_free(snd_card_t *card)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_PNP
|
||||||
|
#define is_isapnp_selected(dev) isapnp[dev]
|
||||||
|
#else
|
||||||
|
#define is_isapnp_selected(dev) 0
|
||||||
|
#endif
|
||||||
|
|
||||||
static int __devinit snd_card_cs423x_probe(int dev, struct pnp_card_link *pcard,
|
static int __devinit snd_card_cs423x_probe(int dev, struct pnp_card_link *pcard,
|
||||||
const struct pnp_card_device_id *pid)
|
const struct pnp_card_device_id *pid)
|
||||||
{
|
{
|
||||||
@ -397,20 +403,16 @@ static int __devinit snd_card_cs423x_probe(int dev, struct pnp_card_link *pcard,
|
|||||||
opl3_t *opl3;
|
opl3_t *opl3;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
#ifdef CONFIG_PNP
|
if (! is_isapnp_selected(dev)) {
|
||||||
if (!isapnp[dev]) {
|
|
||||||
#endif
|
|
||||||
if (port[dev] == SNDRV_AUTO_PORT) {
|
if (port[dev] == SNDRV_AUTO_PORT) {
|
||||||
snd_printk("specify port\n");
|
snd_printk(KERN_ERR "specify port\n");
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
if (cport[dev] == SNDRV_AUTO_PORT) {
|
if (cport[dev] == SNDRV_AUTO_PORT) {
|
||||||
snd_printk("specify cport\n");
|
snd_printk(KERN_ERR "specify cport\n");
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
#ifdef CONFIG_PNP
|
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
card = snd_card_new(index[dev], id[dev], THIS_MODULE,
|
card = snd_card_new(index[dev], id[dev], THIS_MODULE,
|
||||||
sizeof(struct snd_card_cs4236));
|
sizeof(struct snd_card_cs4236));
|
||||||
if (card == NULL)
|
if (card == NULL)
|
||||||
@ -421,8 +423,7 @@ static int __devinit snd_card_cs423x_probe(int dev, struct pnp_card_link *pcard,
|
|||||||
if (isapnp[dev]) {
|
if (isapnp[dev]) {
|
||||||
if ((err = snd_card_cs4236_pnp(dev, acard, pcard, pid))<0) {
|
if ((err = snd_card_cs4236_pnp(dev, acard, pcard, pid))<0) {
|
||||||
printk(KERN_ERR "isapnp detection failed and probing for " IDENT " is not supported\n");
|
printk(KERN_ERR "isapnp detection failed and probing for " IDENT " is not supported\n");
|
||||||
snd_card_free(card);
|
goto _err;
|
||||||
return -ENXIO;
|
|
||||||
}
|
}
|
||||||
snd_card_set_dev(card, &pcard->card->dev);
|
snd_card_set_dev(card, &pcard->card->dev);
|
||||||
}
|
}
|
||||||
@ -430,8 +431,8 @@ static int __devinit snd_card_cs423x_probe(int dev, struct pnp_card_link *pcard,
|
|||||||
if (sb_port[dev] > 0 && sb_port[dev] != SNDRV_AUTO_PORT)
|
if (sb_port[dev] > 0 && sb_port[dev] != SNDRV_AUTO_PORT)
|
||||||
if ((acard->res_sb_port = request_region(sb_port[dev], 16, IDENT " SB")) == NULL) {
|
if ((acard->res_sb_port = request_region(sb_port[dev], 16, IDENT " SB")) == NULL) {
|
||||||
printk(KERN_ERR IDENT ": unable to register SB port at 0x%lx\n", sb_port[dev]);
|
printk(KERN_ERR IDENT ": unable to register SB port at 0x%lx\n", sb_port[dev]);
|
||||||
snd_card_free(card);
|
err = -EBUSY;
|
||||||
return -ENOMEM;
|
goto _err;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CS4232
|
#ifdef CS4232
|
||||||
@ -443,18 +444,14 @@ static int __devinit snd_card_cs423x_probe(int dev, struct pnp_card_link *pcard,
|
|||||||
dma2[dev],
|
dma2[dev],
|
||||||
CS4231_HW_DETECT,
|
CS4231_HW_DETECT,
|
||||||
0,
|
0,
|
||||||
&chip)) < 0) {
|
&chip)) < 0)
|
||||||
snd_card_free(card);
|
goto _err;
|
||||||
return err;
|
|
||||||
}
|
if ((err = snd_cs4231_pcm(chip, 0, &pcm)) < 0)
|
||||||
if ((err = snd_cs4231_pcm(chip, 0, &pcm)) < 0) {
|
goto _err;
|
||||||
snd_card_free(card);
|
|
||||||
return err;
|
if ((err = snd_cs4231_mixer(chip)) < 0)
|
||||||
}
|
goto _err;
|
||||||
if ((err = snd_cs4231_mixer(chip)) < 0) {
|
|
||||||
snd_card_free(card);
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
|
|
||||||
#else /* CS4236 */
|
#else /* CS4236 */
|
||||||
if ((err = snd_cs4236_create(card,
|
if ((err = snd_cs4236_create(card,
|
||||||
@ -465,18 +462,14 @@ static int __devinit snd_card_cs423x_probe(int dev, struct pnp_card_link *pcard,
|
|||||||
dma2[dev],
|
dma2[dev],
|
||||||
CS4231_HW_DETECT,
|
CS4231_HW_DETECT,
|
||||||
0,
|
0,
|
||||||
&chip)) < 0) {
|
&chip)) < 0)
|
||||||
snd_card_free(card);
|
goto _err;
|
||||||
return err;
|
|
||||||
}
|
if ((err = snd_cs4236_pcm(chip, 0, &pcm)) < 0)
|
||||||
if ((err = snd_cs4236_pcm(chip, 0, &pcm)) < 0) {
|
goto _err;
|
||||||
snd_card_free(card);
|
|
||||||
return err;
|
if ((err = snd_cs4236_mixer(chip)) < 0)
|
||||||
}
|
goto _err;
|
||||||
if ((err = snd_cs4236_mixer(chip)) < 0) {
|
|
||||||
snd_card_free(card);
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
strcpy(card->driver, pcm->name);
|
strcpy(card->driver, pcm->name);
|
||||||
strcpy(card->shortname, pcm->name);
|
strcpy(card->shortname, pcm->name);
|
||||||
@ -488,21 +481,17 @@ static int __devinit snd_card_cs423x_probe(int dev, struct pnp_card_link *pcard,
|
|||||||
if (dma2[dev] >= 0)
|
if (dma2[dev] >= 0)
|
||||||
sprintf(card->longname + strlen(card->longname), "&%d", dma2[dev]);
|
sprintf(card->longname + strlen(card->longname), "&%d", dma2[dev]);
|
||||||
|
|
||||||
if ((err = snd_cs4231_timer(chip, 0, NULL)) < 0) {
|
if ((err = snd_cs4231_timer(chip, 0, NULL)) < 0)
|
||||||
snd_card_free(card);
|
goto _err;
|
||||||
return err;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (fm_port[dev] > 0 && fm_port[dev] != SNDRV_AUTO_PORT) {
|
if (fm_port[dev] > 0 && fm_port[dev] != SNDRV_AUTO_PORT) {
|
||||||
if (snd_opl3_create(card,
|
if (snd_opl3_create(card,
|
||||||
fm_port[dev], fm_port[dev] + 2,
|
fm_port[dev], fm_port[dev] + 2,
|
||||||
OPL3_HW_OPL3_CS, 0, &opl3) < 0) {
|
OPL3_HW_OPL3_CS, 0, &opl3) < 0) {
|
||||||
printk(KERN_ERR IDENT ": OPL3 not detected\n");
|
printk(KERN_WARNING IDENT ": OPL3 not detected\n");
|
||||||
} else {
|
} else {
|
||||||
if ((err = snd_opl3_hwdep_new(opl3, 0, 1, NULL)) < 0) {
|
if ((err = snd_opl3_hwdep_new(opl3, 0, 1, NULL)) < 0)
|
||||||
snd_card_free(card);
|
goto _err;
|
||||||
return err;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -513,17 +502,23 @@ static int __devinit snd_card_cs423x_probe(int dev, struct pnp_card_link *pcard,
|
|||||||
mpu_port[dev], 0,
|
mpu_port[dev], 0,
|
||||||
mpu_irq[dev],
|
mpu_irq[dev],
|
||||||
mpu_irq[dev] >= 0 ? SA_INTERRUPT : 0, NULL) < 0)
|
mpu_irq[dev] >= 0 ? SA_INTERRUPT : 0, NULL) < 0)
|
||||||
printk(KERN_ERR IDENT ": MPU401 not detected\n");
|
printk(KERN_WARNING IDENT ": MPU401 not detected\n");
|
||||||
}
|
|
||||||
if ((err = snd_card_register(card)) < 0) {
|
|
||||||
snd_card_free(card);
|
|
||||||
return err;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ((err = snd_card_set_generic_dev(card)) < 0)
|
||||||
|
goto _err;
|
||||||
|
|
||||||
|
if ((err = snd_card_register(card)) < 0)
|
||||||
|
goto _err;
|
||||||
if (pcard)
|
if (pcard)
|
||||||
pnp_set_card_drvdata(pcard, card);
|
pnp_set_card_drvdata(pcard, card);
|
||||||
else
|
else
|
||||||
snd_cs4236_legacy[dev] = card;
|
snd_cs4236_legacy[dev] = card;
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
_err:
|
||||||
|
snd_card_free(card);
|
||||||
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_PNP
|
#ifdef CONFIG_PNP
|
||||||
@ -569,10 +564,8 @@ static int __init alsa_card_cs423x_init(void)
|
|||||||
for (dev = 0; dev < SNDRV_CARDS; dev++) {
|
for (dev = 0; dev < SNDRV_CARDS; dev++) {
|
||||||
if (!enable[dev])
|
if (!enable[dev])
|
||||||
continue;
|
continue;
|
||||||
#ifdef CONFIG_PNP
|
if (is_isapnp_selected(dev))
|
||||||
if (isapnp[dev])
|
|
||||||
continue;
|
continue;
|
||||||
#endif
|
|
||||||
if (snd_card_cs423x_probe(dev, NULL, NULL) >= 0)
|
if (snd_card_cs423x_probe(dev, NULL, NULL) >= 0)
|
||||||
cards++;
|
cards++;
|
||||||
}
|
}
|
||||||
|
@ -70,6 +70,7 @@ MODULE_PARM_DESC(dma8, "8-bit DMA # for ESx688 driver.");
|
|||||||
|
|
||||||
static snd_card_t *snd_audiodrive_cards[SNDRV_CARDS] = SNDRV_DEFAULT_PTR;
|
static snd_card_t *snd_audiodrive_cards[SNDRV_CARDS] = SNDRV_DEFAULT_PTR;
|
||||||
|
|
||||||
|
#define PFX "es1688: "
|
||||||
|
|
||||||
static int __init snd_audiodrive_probe(int dev)
|
static int __init snd_audiodrive_probe(int dev)
|
||||||
{
|
{
|
||||||
@ -89,47 +90,41 @@ static int __init snd_audiodrive_probe(int dev)
|
|||||||
xirq = irq[dev];
|
xirq = irq[dev];
|
||||||
if (xirq == SNDRV_AUTO_IRQ) {
|
if (xirq == SNDRV_AUTO_IRQ) {
|
||||||
if ((xirq = snd_legacy_find_free_irq(possible_irqs)) < 0) {
|
if ((xirq = snd_legacy_find_free_irq(possible_irqs)) < 0) {
|
||||||
snd_card_free(card);
|
snd_printk(KERN_ERR PFX "unable to find a free IRQ\n");
|
||||||
snd_printk("unable to find a free IRQ\n");
|
err = -EBUSY;
|
||||||
return -EBUSY;
|
goto _err;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
xmpu_irq = mpu_irq[dev];
|
xmpu_irq = mpu_irq[dev];
|
||||||
xdma = dma8[dev];
|
xdma = dma8[dev];
|
||||||
if (xdma == SNDRV_AUTO_DMA) {
|
if (xdma == SNDRV_AUTO_DMA) {
|
||||||
if ((xdma = snd_legacy_find_free_dma(possible_dmas)) < 0) {
|
if ((xdma = snd_legacy_find_free_dma(possible_dmas)) < 0) {
|
||||||
snd_card_free(card);
|
snd_printk(KERN_ERR PFX "unable to find a free DMA\n");
|
||||||
snd_printk("unable to find a free DMA\n");
|
err = -EBUSY;
|
||||||
return -EBUSY;
|
goto _err;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((err = snd_es1688_create(card, port[dev], mpu_port[dev],
|
if ((err = snd_es1688_create(card, port[dev], mpu_port[dev],
|
||||||
xirq, xmpu_irq, xdma,
|
xirq, xmpu_irq, xdma,
|
||||||
ES1688_HW_AUTO, &chip)) < 0) {
|
ES1688_HW_AUTO, &chip)) < 0)
|
||||||
snd_card_free(card);
|
goto _err;
|
||||||
return err;
|
|
||||||
}
|
if ((err = snd_es1688_pcm(chip, 0, &pcm)) < 0)
|
||||||
if ((err = snd_es1688_pcm(chip, 0, &pcm)) < 0) {
|
goto _err;
|
||||||
snd_card_free(card);
|
|
||||||
return err;
|
if ((err = snd_es1688_mixer(chip)) < 0)
|
||||||
}
|
goto _err;
|
||||||
if ((err = snd_es1688_mixer(chip)) < 0) {
|
|
||||||
snd_card_free(card);
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
|
|
||||||
strcpy(card->driver, "ES1688");
|
strcpy(card->driver, "ES1688");
|
||||||
strcpy(card->shortname, pcm->name);
|
strcpy(card->shortname, pcm->name);
|
||||||
sprintf(card->longname, "%s at 0x%lx, irq %i, dma %i", pcm->name, chip->port, xirq, xdma);
|
sprintf(card->longname, "%s at 0x%lx, irq %i, dma %i", pcm->name, chip->port, xirq, xdma);
|
||||||
|
|
||||||
if ((snd_opl3_create(card, chip->port, chip->port + 2, OPL3_HW_OPL3, 0, &opl3)) < 0) {
|
if ((snd_opl3_create(card, chip->port, chip->port + 2, OPL3_HW_OPL3, 0, &opl3)) < 0) {
|
||||||
printk(KERN_ERR "es1688: opl3 not detected at 0x%lx\n", chip->port);
|
printk(KERN_WARNING PFX "opl3 not detected at 0x%lx\n", chip->port);
|
||||||
} else {
|
} else {
|
||||||
if ((err = snd_opl3_hwdep_new(opl3, 0, 1, NULL)) < 0) {
|
if ((err = snd_opl3_hwdep_new(opl3, 0, 1, NULL)) < 0)
|
||||||
snd_card_free(card);
|
goto _err;
|
||||||
return err;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (xmpu_irq >= 0 && xmpu_irq != SNDRV_AUTO_IRQ && chip->mpu_port > 0) {
|
if (xmpu_irq >= 0 && xmpu_irq != SNDRV_AUTO_IRQ && chip->mpu_port > 0) {
|
||||||
@ -137,18 +132,22 @@ static int __init snd_audiodrive_probe(int dev)
|
|||||||
chip->mpu_port, 0,
|
chip->mpu_port, 0,
|
||||||
xmpu_irq,
|
xmpu_irq,
|
||||||
SA_INTERRUPT,
|
SA_INTERRUPT,
|
||||||
NULL)) < 0) {
|
NULL)) < 0)
|
||||||
snd_card_free(card);
|
goto _err;
|
||||||
return err;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ((err = snd_card_register(card)) < 0) {
|
|
||||||
snd_card_free(card);
|
|
||||||
return err;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ((err = snd_card_set_generic_dev(card)) < 0)
|
||||||
|
goto _err;
|
||||||
|
|
||||||
|
if ((err = snd_card_register(card)) < 0)
|
||||||
|
goto _err;
|
||||||
|
|
||||||
snd_audiodrive_cards[dev] = card;
|
snd_audiodrive_cards[dev] = card;
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
_err:
|
||||||
|
snd_card_free(card);
|
||||||
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int __init snd_audiodrive_legacy_auto_probe(unsigned long xport)
|
static int __init snd_audiodrive_legacy_auto_probe(unsigned long xport)
|
||||||
|
@ -1988,6 +1988,12 @@ static int __devinit snd_audiodrive_pnp(int dev, struct snd_audiodrive *acard,
|
|||||||
}
|
}
|
||||||
#endif /* CONFIG_PNP */
|
#endif /* CONFIG_PNP */
|
||||||
|
|
||||||
|
#ifdef CONFIG_PNP
|
||||||
|
#define is_isapnp_selected(dev) isapnp[dev]
|
||||||
|
#else
|
||||||
|
#define is_isapnp_selected(dev) 0
|
||||||
|
#endif
|
||||||
|
|
||||||
static int __devinit snd_audiodrive_probe(int dev, struct pnp_card_link *pcard,
|
static int __devinit snd_audiodrive_probe(int dev, struct pnp_card_link *pcard,
|
||||||
const struct pnp_card_device_id *pid)
|
const struct pnp_card_device_id *pid)
|
||||||
{
|
{
|
||||||
@ -1996,7 +2002,6 @@ static int __devinit snd_audiodrive_probe(int dev, struct pnp_card_link *pcard,
|
|||||||
int xirq, xdma1, xdma2;
|
int xirq, xdma1, xdma2;
|
||||||
snd_card_t *card;
|
snd_card_t *card;
|
||||||
struct snd_audiodrive *acard;
|
struct snd_audiodrive *acard;
|
||||||
snd_rawmidi_t *rmidi = NULL;
|
|
||||||
es18xx_t *chip;
|
es18xx_t *chip;
|
||||||
opl3_t *opl3;
|
opl3_t *opl3;
|
||||||
int err;
|
int err;
|
||||||
@ -2019,25 +2024,25 @@ static int __devinit snd_audiodrive_probe(int dev, struct pnp_card_link *pcard,
|
|||||||
xirq = irq[dev];
|
xirq = irq[dev];
|
||||||
if (xirq == SNDRV_AUTO_IRQ) {
|
if (xirq == SNDRV_AUTO_IRQ) {
|
||||||
if ((xirq = snd_legacy_find_free_irq(possible_irqs)) < 0) {
|
if ((xirq = snd_legacy_find_free_irq(possible_irqs)) < 0) {
|
||||||
snd_card_free(card);
|
snd_printk(KERN_ERR PFX "unable to find a free IRQ\n");
|
||||||
snd_printk("unable to find a free IRQ\n");
|
err = -EBUSY;
|
||||||
return -EBUSY;
|
goto _err;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
xdma1 = dma1[dev];
|
xdma1 = dma1[dev];
|
||||||
if (xdma1 == SNDRV_AUTO_DMA) {
|
if (xdma1 == SNDRV_AUTO_DMA) {
|
||||||
if ((xdma1 = snd_legacy_find_free_dma(possible_dmas)) < 0) {
|
if ((xdma1 = snd_legacy_find_free_dma(possible_dmas)) < 0) {
|
||||||
snd_card_free(card);
|
snd_printk(KERN_ERR PFX "unable to find a free DMA1\n");
|
||||||
snd_printk("unable to find a free DMA1\n");
|
err = -EBUSY;
|
||||||
return -EBUSY;
|
goto _err;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
xdma2 = dma2[dev];
|
xdma2 = dma2[dev];
|
||||||
if (xdma2 == SNDRV_AUTO_DMA) {
|
if (xdma2 == SNDRV_AUTO_DMA) {
|
||||||
if ((xdma2 = snd_legacy_find_free_dma(possible_dmas)) < 0) {
|
if ((xdma2 = snd_legacy_find_free_dma(possible_dmas)) < 0) {
|
||||||
snd_card_free(card);
|
snd_printk(KERN_ERR PFX "unable to find a free DMA2\n");
|
||||||
snd_printk("unable to find a free DMA2\n");
|
err = -EBUSY;
|
||||||
return -EBUSY;
|
goto _err;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2046,10 +2051,8 @@ static int __devinit snd_audiodrive_probe(int dev, struct pnp_card_link *pcard,
|
|||||||
mpu_port[dev],
|
mpu_port[dev],
|
||||||
fm_port[dev],
|
fm_port[dev],
|
||||||
xirq, xdma1, xdma2,
|
xirq, xdma1, xdma2,
|
||||||
&chip)) < 0) {
|
&chip)) < 0)
|
||||||
snd_card_free(card);
|
goto _err;
|
||||||
return err;
|
|
||||||
}
|
|
||||||
|
|
||||||
sprintf(card->driver, "ES%x", chip->version);
|
sprintf(card->driver, "ES%x", chip->version);
|
||||||
sprintf(card->shortname, "ESS AudioDrive ES%x", chip->version);
|
sprintf(card->shortname, "ESS AudioDrive ES%x", chip->version);
|
||||||
@ -2064,23 +2067,18 @@ static int __devinit snd_audiodrive_probe(int dev, struct pnp_card_link *pcard,
|
|||||||
chip->port,
|
chip->port,
|
||||||
xirq, xdma1);
|
xirq, xdma1);
|
||||||
|
|
||||||
if ((err = snd_es18xx_pcm(chip, 0, NULL)) < 0) {
|
if ((err = snd_es18xx_pcm(chip, 0, NULL)) < 0)
|
||||||
snd_card_free(card);
|
goto _err;
|
||||||
return err;
|
|
||||||
}
|
if ((err = snd_es18xx_mixer(chip)) < 0)
|
||||||
if ((err = snd_es18xx_mixer(chip)) < 0) {
|
goto _err;
|
||||||
snd_card_free(card);
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (fm_port[dev] > 0 && fm_port[dev] != SNDRV_AUTO_PORT) {
|
if (fm_port[dev] > 0 && fm_port[dev] != SNDRV_AUTO_PORT) {
|
||||||
if (snd_opl3_create(card, chip->fm_port, chip->fm_port + 2, OPL3_HW_OPL3, 0, &opl3) < 0) {
|
if (snd_opl3_create(card, chip->fm_port, chip->fm_port + 2, OPL3_HW_OPL3, 0, &opl3) < 0) {
|
||||||
snd_printk(KERN_ERR PFX "opl3 not detected at 0x%lx\n", chip->fm_port);
|
snd_printk(KERN_WARNING PFX "opl3 not detected at 0x%lx\n", chip->fm_port);
|
||||||
} else {
|
} else {
|
||||||
if ((err = snd_opl3_hwdep_new(opl3, 0, 1, NULL)) < 0) {
|
if ((err = snd_opl3_hwdep_new(opl3, 0, 1, NULL)) < 0)
|
||||||
snd_card_free(card);
|
goto _err;
|
||||||
return err;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2088,25 +2086,28 @@ static int __devinit snd_audiodrive_probe(int dev, struct pnp_card_link *pcard,
|
|||||||
if ((err = snd_mpu401_uart_new(card, 0, MPU401_HW_ES18XX,
|
if ((err = snd_mpu401_uart_new(card, 0, MPU401_HW_ES18XX,
|
||||||
chip->mpu_port, 0,
|
chip->mpu_port, 0,
|
||||||
xirq, 0,
|
xirq, 0,
|
||||||
&rmidi)) < 0) {
|
&chip->rmidi)) < 0)
|
||||||
snd_card_free(card);
|
goto _err;
|
||||||
return err;
|
|
||||||
}
|
|
||||||
chip->rmidi = rmidi;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ((err = snd_card_set_generic_dev(card)) < 0)
|
||||||
|
goto _err;
|
||||||
|
|
||||||
/* Power Management */
|
/* Power Management */
|
||||||
snd_card_set_isa_pm_callback(card, snd_es18xx_suspend, snd_es18xx_resume, chip);
|
snd_card_set_isa_pm_callback(card, snd_es18xx_suspend, snd_es18xx_resume, chip);
|
||||||
|
|
||||||
if ((err = snd_card_register(card)) < 0) {
|
if ((err = snd_card_register(card)) < 0)
|
||||||
snd_card_free(card);
|
goto _err;
|
||||||
return err;
|
|
||||||
}
|
|
||||||
if (pcard)
|
if (pcard)
|
||||||
pnp_set_card_drvdata(pcard, card);
|
pnp_set_card_drvdata(pcard, card);
|
||||||
else
|
else
|
||||||
snd_audiodrive_legacy[dev] = card;
|
snd_audiodrive_legacy[dev] = card;
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
_err:
|
||||||
|
snd_card_free(card);
|
||||||
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int __devinit snd_audiodrive_probe_legacy_port(unsigned long xport)
|
static int __devinit snd_audiodrive_probe_legacy_port(unsigned long xport)
|
||||||
@ -2117,10 +2118,8 @@ static int __devinit snd_audiodrive_probe_legacy_port(unsigned long xport)
|
|||||||
for ( ; dev < SNDRV_CARDS; dev++) {
|
for ( ; dev < SNDRV_CARDS; dev++) {
|
||||||
if (!enable[dev] || port[dev] != SNDRV_AUTO_PORT)
|
if (!enable[dev] || port[dev] != SNDRV_AUTO_PORT)
|
||||||
continue;
|
continue;
|
||||||
#ifdef CONFIG_PNP
|
if (is_isapnp_selected(dev))
|
||||||
if (isapnp[dev])
|
|
||||||
continue;
|
continue;
|
||||||
#endif
|
|
||||||
port[dev] = xport;
|
port[dev] = xport;
|
||||||
res = snd_audiodrive_probe(dev, NULL, NULL);
|
res = snd_audiodrive_probe(dev, NULL, NULL);
|
||||||
if (res < 0)
|
if (res < 0)
|
||||||
@ -2177,10 +2176,8 @@ static int __init alsa_card_es18xx_init(void)
|
|||||||
for (dev = 0; dev < SNDRV_CARDS; dev++) {
|
for (dev = 0; dev < SNDRV_CARDS; dev++) {
|
||||||
if (!enable[dev] || port[dev] == SNDRV_AUTO_PORT)
|
if (!enable[dev] || port[dev] == SNDRV_AUTO_PORT)
|
||||||
continue;
|
continue;
|
||||||
#ifdef CONFIG_PNP
|
if (is_isapnp_selected(dev))
|
||||||
if (isapnp[dev])
|
|
||||||
continue;
|
continue;
|
||||||
#endif
|
|
||||||
if (snd_audiodrive_probe(dev, NULL, NULL) >= 0)
|
if (snd_audiodrive_probe(dev, NULL, NULL) >= 0)
|
||||||
cards++;
|
cards++;
|
||||||
}
|
}
|
||||||
|
@ -72,40 +72,24 @@ MODULE_PARM_DESC(pcm_channels, "Reserved PCM channels for GUS Classic driver.");
|
|||||||
|
|
||||||
static snd_card_t *snd_gusclassic_cards[SNDRV_CARDS] = SNDRV_DEFAULT_PTR;
|
static snd_card_t *snd_gusclassic_cards[SNDRV_CARDS] = SNDRV_DEFAULT_PTR;
|
||||||
|
|
||||||
|
#define PFX "gusclassic: "
|
||||||
|
|
||||||
static int __init snd_gusclassic_detect(snd_gus_card_t * gus)
|
static int __init snd_gusclassic_detect(snd_gus_card_t * gus)
|
||||||
{
|
|
||||||
snd_gf1_i_write8(gus, SNDRV_GF1_GB_RESET, 0); /* reset GF1 */
|
|
||||||
#ifdef CONFIG_SND_DEBUG_DETECT
|
|
||||||
{
|
{
|
||||||
unsigned char d;
|
unsigned char d;
|
||||||
|
|
||||||
|
snd_gf1_i_write8(gus, SNDRV_GF1_GB_RESET, 0); /* reset GF1 */
|
||||||
if (((d = snd_gf1_i_look8(gus, SNDRV_GF1_GB_RESET)) & 0x07) != 0) {
|
if (((d = snd_gf1_i_look8(gus, SNDRV_GF1_GB_RESET)) & 0x07) != 0) {
|
||||||
snd_printk("[0x%lx] check 1 failed - 0x%x\n", gus->gf1.port, d);
|
snd_printdd("[0x%lx] check 1 failed - 0x%x\n", gus->gf1.port, d);
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
#else
|
|
||||||
if ((snd_gf1_i_look8(gus, SNDRV_GF1_GB_RESET) & 0x07) != 0)
|
|
||||||
return -ENODEV;
|
|
||||||
#endif
|
|
||||||
udelay(160);
|
udelay(160);
|
||||||
snd_gf1_i_write8(gus, SNDRV_GF1_GB_RESET, 1); /* release reset */
|
snd_gf1_i_write8(gus, SNDRV_GF1_GB_RESET, 1); /* release reset */
|
||||||
udelay(160);
|
udelay(160);
|
||||||
#ifdef CONFIG_SND_DEBUG_DETECT
|
|
||||||
{
|
|
||||||
unsigned char d;
|
|
||||||
|
|
||||||
if (((d = snd_gf1_i_look8(gus, SNDRV_GF1_GB_RESET)) & 0x07) != 1) {
|
if (((d = snd_gf1_i_look8(gus, SNDRV_GF1_GB_RESET)) & 0x07) != 1) {
|
||||||
snd_printk("[0x%lx] check 2 failed - 0x%x\n", gus->gf1.port, d);
|
snd_printdd("[0x%lx] check 2 failed - 0x%x\n", gus->gf1.port, d);
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
#else
|
|
||||||
if ((snd_gf1_i_look8(gus, SNDRV_GF1_GB_RESET) & 0x07) != 1)
|
|
||||||
return -ENODEV;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -137,25 +121,25 @@ static int __init snd_gusclassic_probe(int dev)
|
|||||||
xirq = irq[dev];
|
xirq = irq[dev];
|
||||||
if (xirq == SNDRV_AUTO_IRQ) {
|
if (xirq == SNDRV_AUTO_IRQ) {
|
||||||
if ((xirq = snd_legacy_find_free_irq(possible_irqs)) < 0) {
|
if ((xirq = snd_legacy_find_free_irq(possible_irqs)) < 0) {
|
||||||
snd_card_free(card);
|
snd_printk(KERN_ERR PFX "unable to find a free IRQ\n");
|
||||||
snd_printk("unable to find a free IRQ\n");
|
err = -EBUSY;
|
||||||
return -EBUSY;
|
goto _err;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
xdma1 = dma1[dev];
|
xdma1 = dma1[dev];
|
||||||
if (xdma1 == SNDRV_AUTO_DMA) {
|
if (xdma1 == SNDRV_AUTO_DMA) {
|
||||||
if ((xdma1 = snd_legacy_find_free_dma(possible_dmas)) < 0) {
|
if ((xdma1 = snd_legacy_find_free_dma(possible_dmas)) < 0) {
|
||||||
snd_card_free(card);
|
snd_printk(KERN_ERR PFX "unable to find a free DMA1\n");
|
||||||
snd_printk("unable to find a free DMA1\n");
|
err = -EBUSY;
|
||||||
return -EBUSY;
|
goto _err;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
xdma2 = dma2[dev];
|
xdma2 = dma2[dev];
|
||||||
if (xdma2 == SNDRV_AUTO_DMA) {
|
if (xdma2 == SNDRV_AUTO_DMA) {
|
||||||
if ((xdma2 = snd_legacy_find_free_dma(possible_dmas)) < 0) {
|
if ((xdma2 = snd_legacy_find_free_dma(possible_dmas)) < 0) {
|
||||||
snd_card_free(card);
|
snd_printk(KERN_ERR PFX "unable to find a free DMA2\n");
|
||||||
snd_printk("unable to find a free DMA2\n");
|
err = -EBUSY;
|
||||||
return -EBUSY;
|
goto _err;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -164,47 +148,48 @@ static int __init snd_gusclassic_probe(int dev)
|
|||||||
port[dev],
|
port[dev],
|
||||||
xirq, xdma1, xdma2,
|
xirq, xdma1, xdma2,
|
||||||
0, channels[dev], pcm_channels[dev],
|
0, channels[dev], pcm_channels[dev],
|
||||||
0, &gus)) < 0) {
|
0, &gus)) < 0)
|
||||||
snd_card_free(card);
|
goto _err;
|
||||||
return err;
|
|
||||||
}
|
if ((err = snd_gusclassic_detect(gus)) < 0)
|
||||||
if ((err = snd_gusclassic_detect(gus)) < 0) {
|
goto _err;
|
||||||
snd_card_free(card);
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
snd_gusclassic_init(dev, gus);
|
snd_gusclassic_init(dev, gus);
|
||||||
if ((err = snd_gus_initialize(gus)) < 0) {
|
if ((err = snd_gus_initialize(gus)) < 0)
|
||||||
snd_card_free(card);
|
goto _err;
|
||||||
return err;
|
|
||||||
}
|
|
||||||
if (gus->max_flag || gus->ess_flag) {
|
if (gus->max_flag || gus->ess_flag) {
|
||||||
snd_printdd("GUS Classic or ACE soundcard was not detected at 0x%lx\n", gus->gf1.port);
|
snd_printk(KERN_ERR PFX "GUS Classic or ACE soundcard was not detected at 0x%lx\n", gus->gf1.port);
|
||||||
snd_card_free(card);
|
err = -ENODEV;
|
||||||
return -ENODEV;
|
goto _err;
|
||||||
}
|
|
||||||
if ((err = snd_gf1_new_mixer(gus)) < 0) {
|
|
||||||
snd_card_free(card);
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
if ((err = snd_gf1_pcm_new(gus, 0, 0, NULL)) < 0) {
|
|
||||||
snd_card_free(card);
|
|
||||||
return err;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ((err = snd_gf1_new_mixer(gus)) < 0)
|
||||||
|
goto _err;
|
||||||
|
|
||||||
|
if ((err = snd_gf1_pcm_new(gus, 0, 0, NULL)) < 0)
|
||||||
|
goto _err;
|
||||||
|
|
||||||
if (!gus->ace_flag) {
|
if (!gus->ace_flag) {
|
||||||
if ((err = snd_gf1_rawmidi_new(gus, 0, NULL)) < 0) {
|
if ((err = snd_gf1_rawmidi_new(gus, 0, NULL)) < 0)
|
||||||
snd_card_free(card);
|
goto _err;
|
||||||
return err;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
sprintf(card->longname + strlen(card->longname), " at 0x%lx, irq %d, dma %d", gus->gf1.port, xirq, xdma1);
|
sprintf(card->longname + strlen(card->longname), " at 0x%lx, irq %d, dma %d", gus->gf1.port, xirq, xdma1);
|
||||||
if (dma2 >= 0)
|
if (dma2 >= 0)
|
||||||
sprintf(card->longname + strlen(card->longname), "&%d", xdma2);
|
sprintf(card->longname + strlen(card->longname), "&%d", xdma2);
|
||||||
if ((err = snd_card_register(card)) < 0) {
|
|
||||||
snd_card_free(card);
|
if ((err = snd_card_set_generic_dev(card)) < 0)
|
||||||
return err;
|
goto _err;
|
||||||
}
|
|
||||||
|
if ((err = snd_card_register(card)) < 0)
|
||||||
|
goto _err;
|
||||||
|
|
||||||
snd_gusclassic_cards[dev] = card;
|
snd_gusclassic_cards[dev] = card;
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
_err:
|
||||||
|
snd_card_free(card);
|
||||||
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int __init snd_gusclassic_legacy_auto_probe(unsigned long xport)
|
static int __init snd_gusclassic_legacy_auto_probe(unsigned long xport)
|
||||||
|
@ -87,6 +87,7 @@ MODULE_PARM_DESC(pcm_channels, "Reserved PCM channels for GUS Extreme driver.");
|
|||||||
|
|
||||||
static snd_card_t *snd_gusextreme_cards[SNDRV_CARDS] = SNDRV_DEFAULT_PTR;
|
static snd_card_t *snd_gusextreme_cards[SNDRV_CARDS] = SNDRV_DEFAULT_PTR;
|
||||||
|
|
||||||
|
#define PFX "gusextreme: "
|
||||||
|
|
||||||
static int __init snd_gusextreme_detect(int dev,
|
static int __init snd_gusextreme_detect(int dev,
|
||||||
snd_card_t * card,
|
snd_card_t * card,
|
||||||
@ -94,6 +95,7 @@ static int __init snd_gusextreme_detect(int dev,
|
|||||||
es1688_t *es1688)
|
es1688_t *es1688)
|
||||||
{
|
{
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
unsigned char d;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This is main stuff - enable access to GF1 chip...
|
* This is main stuff - enable access to GF1 chip...
|
||||||
@ -123,36 +125,17 @@ static int __init snd_gusextreme_detect(int dev,
|
|||||||
udelay(100);
|
udelay(100);
|
||||||
|
|
||||||
snd_gf1_i_write8(gus, SNDRV_GF1_GB_RESET, 0); /* reset GF1 */
|
snd_gf1_i_write8(gus, SNDRV_GF1_GB_RESET, 0); /* reset GF1 */
|
||||||
#ifdef CONFIG_SND_DEBUG_DETECT
|
|
||||||
{
|
|
||||||
unsigned char d;
|
|
||||||
|
|
||||||
if (((d = snd_gf1_i_look8(gus, SNDRV_GF1_GB_RESET)) & 0x07) != 0) {
|
if (((d = snd_gf1_i_look8(gus, SNDRV_GF1_GB_RESET)) & 0x07) != 0) {
|
||||||
snd_printk("[0x%lx] check 1 failed - 0x%x\n", gus->gf1.port, d);
|
snd_printdd("[0x%lx] check 1 failed - 0x%x\n", gus->gf1.port, d);
|
||||||
return -EIO;
|
return -EIO;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
#else
|
|
||||||
if ((snd_gf1_i_look8(gus, SNDRV_GF1_GB_RESET) & 0x07) != 0)
|
|
||||||
return -EIO;
|
|
||||||
#endif
|
|
||||||
udelay(160);
|
udelay(160);
|
||||||
snd_gf1_i_write8(gus, SNDRV_GF1_GB_RESET, 1); /* release reset */
|
snd_gf1_i_write8(gus, SNDRV_GF1_GB_RESET, 1); /* release reset */
|
||||||
udelay(160);
|
udelay(160);
|
||||||
#ifdef CONFIG_SND_DEBUG_DETECT
|
|
||||||
{
|
|
||||||
unsigned char d;
|
|
||||||
|
|
||||||
if (((d = snd_gf1_i_look8(gus, SNDRV_GF1_GB_RESET)) & 0x07) != 1) {
|
if (((d = snd_gf1_i_look8(gus, SNDRV_GF1_GB_RESET)) & 0x07) != 1) {
|
||||||
snd_printk("[0x%lx] check 2 failed - 0x%x\n", gus->gf1.port, d);
|
snd_printdd("[0x%lx] check 2 failed - 0x%x\n", gus->gf1.port, d);
|
||||||
return -EIO;
|
return -EIO;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
#else
|
|
||||||
if ((snd_gf1_i_look8(gus, SNDRV_GF1_GB_RESET) & 0x07) != 1)
|
|
||||||
return -EIO;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -205,7 +188,7 @@ static int __init snd_gusextreme_probe(int dev)
|
|||||||
xgf1_irq = gf1_irq[dev];
|
xgf1_irq = gf1_irq[dev];
|
||||||
if (xgf1_irq == SNDRV_AUTO_IRQ) {
|
if (xgf1_irq == SNDRV_AUTO_IRQ) {
|
||||||
if ((xgf1_irq = snd_legacy_find_free_irq(possible_gf1_irqs)) < 0) {
|
if ((xgf1_irq = snd_legacy_find_free_irq(possible_gf1_irqs)) < 0) {
|
||||||
snd_printk("unable to find a free IRQ for GF1\n");
|
snd_printk(KERN_ERR PFX "unable to find a free IRQ for GF1\n");
|
||||||
err = -EBUSY;
|
err = -EBUSY;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
@ -213,7 +196,7 @@ static int __init snd_gusextreme_probe(int dev)
|
|||||||
xess_irq = irq[dev];
|
xess_irq = irq[dev];
|
||||||
if (xess_irq == SNDRV_AUTO_IRQ) {
|
if (xess_irq == SNDRV_AUTO_IRQ) {
|
||||||
if ((xess_irq = snd_legacy_find_free_irq(possible_ess_irqs)) < 0) {
|
if ((xess_irq = snd_legacy_find_free_irq(possible_ess_irqs)) < 0) {
|
||||||
snd_printk("unable to find a free IRQ for ES1688\n");
|
snd_printk(KERN_ERR PFX "unable to find a free IRQ for ES1688\n");
|
||||||
err = -EBUSY;
|
err = -EBUSY;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
@ -226,7 +209,7 @@ static int __init snd_gusextreme_probe(int dev)
|
|||||||
xgf1_dma = dma1[dev];
|
xgf1_dma = dma1[dev];
|
||||||
if (xgf1_dma == SNDRV_AUTO_DMA) {
|
if (xgf1_dma == SNDRV_AUTO_DMA) {
|
||||||
if ((xgf1_dma = snd_legacy_find_free_dma(possible_gf1_dmas)) < 0) {
|
if ((xgf1_dma = snd_legacy_find_free_dma(possible_gf1_dmas)) < 0) {
|
||||||
snd_printk("unable to find a free DMA for GF1\n");
|
snd_printk(KERN_ERR PFX "unable to find a free DMA for GF1\n");
|
||||||
err = -EBUSY;
|
err = -EBUSY;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
@ -234,7 +217,7 @@ static int __init snd_gusextreme_probe(int dev)
|
|||||||
xess_dma = dma8[dev];
|
xess_dma = dma8[dev];
|
||||||
if (xess_dma == SNDRV_AUTO_DMA) {
|
if (xess_dma == SNDRV_AUTO_DMA) {
|
||||||
if ((xess_dma = snd_legacy_find_free_dma(possible_ess_dmas)) < 0) {
|
if ((xess_dma = snd_legacy_find_free_dma(possible_ess_dmas)) < 0) {
|
||||||
snd_printk("unable to find a free DMA for ES1688\n");
|
snd_printk(KERN_ERR PFX "unable to find a free DMA for ES1688\n");
|
||||||
err = -EBUSY;
|
err = -EBUSY;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
@ -264,7 +247,7 @@ static int __init snd_gusextreme_probe(int dev)
|
|||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
if (!gus->ess_flag) {
|
if (!gus->ess_flag) {
|
||||||
snd_printdd("GUS Extreme soundcard was not detected at 0x%lx\n", gus->gf1.port);
|
snd_printk(KERN_ERR PFX "GUS Extreme soundcard was not detected at 0x%lx\n", gus->gf1.port);
|
||||||
err = -ENODEV;
|
err = -ENODEV;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
@ -287,7 +270,7 @@ static int __init snd_gusextreme_probe(int dev)
|
|||||||
|
|
||||||
if (snd_opl3_create(card, es1688->port, es1688->port + 2,
|
if (snd_opl3_create(card, es1688->port, es1688->port + 2,
|
||||||
OPL3_HW_OPL3, 0, &opl3) < 0) {
|
OPL3_HW_OPL3, 0, &opl3) < 0) {
|
||||||
printk(KERN_ERR "gusextreme: opl3 not detected at 0x%lx\n", es1688->port);
|
printk(KERN_ERR PFX "gusextreme: opl3 not detected at 0x%lx\n", es1688->port);
|
||||||
} else {
|
} else {
|
||||||
if ((err = snd_opl3_hwdep_new(opl3, 0, 2, NULL)) < 0)
|
if ((err = snd_opl3_hwdep_new(opl3, 0, 2, NULL)) < 0)
|
||||||
goto out;
|
goto out;
|
||||||
@ -303,6 +286,10 @@ static int __init snd_gusextreme_probe(int dev)
|
|||||||
|
|
||||||
sprintf(card->longname, "Gravis UltraSound Extreme at 0x%lx, irq %i&%i, dma %i&%i",
|
sprintf(card->longname, "Gravis UltraSound Extreme at 0x%lx, irq %i&%i, dma %i&%i",
|
||||||
es1688->port, xgf1_irq, xess_irq, xgf1_dma, xess_dma);
|
es1688->port, xgf1_irq, xess_irq, xgf1_dma, xess_dma);
|
||||||
|
|
||||||
|
if ((err = snd_card_set_generic_dev(card)) < 0)
|
||||||
|
goto out;
|
||||||
|
|
||||||
if ((err = snd_card_register(card)) < 0)
|
if ((err = snd_card_register(card)) < 0)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
|
@ -82,39 +82,25 @@ struct snd_gusmax {
|
|||||||
|
|
||||||
static snd_card_t *snd_gusmax_cards[SNDRV_CARDS] = SNDRV_DEFAULT_PTR;
|
static snd_card_t *snd_gusmax_cards[SNDRV_CARDS] = SNDRV_DEFAULT_PTR;
|
||||||
|
|
||||||
|
#define PFX "gusmax: "
|
||||||
|
|
||||||
static int __init snd_gusmax_detect(snd_gus_card_t * gus)
|
static int __init snd_gusmax_detect(snd_gus_card_t * gus)
|
||||||
{
|
|
||||||
snd_gf1_i_write8(gus, SNDRV_GF1_GB_RESET, 0); /* reset GF1 */
|
|
||||||
#ifdef CONFIG_SND_DEBUG_DETECT
|
|
||||||
{
|
{
|
||||||
unsigned char d;
|
unsigned char d;
|
||||||
|
|
||||||
|
snd_gf1_i_write8(gus, SNDRV_GF1_GB_RESET, 0); /* reset GF1 */
|
||||||
if (((d = snd_gf1_i_look8(gus, SNDRV_GF1_GB_RESET)) & 0x07) != 0) {
|
if (((d = snd_gf1_i_look8(gus, SNDRV_GF1_GB_RESET)) & 0x07) != 0) {
|
||||||
snd_printk("[0x%lx] check 1 failed - 0x%x\n", gus->gf1.port, d);
|
snd_printdd("[0x%lx] check 1 failed - 0x%x\n", gus->gf1.port, d);
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
#else
|
|
||||||
if ((snd_gf1_i_look8(gus, SNDRV_GF1_GB_RESET) & 0x07) != 0)
|
|
||||||
return -ENODEV;
|
|
||||||
#endif
|
|
||||||
udelay(160);
|
udelay(160);
|
||||||
snd_gf1_i_write8(gus, SNDRV_GF1_GB_RESET, 1); /* release reset */
|
snd_gf1_i_write8(gus, SNDRV_GF1_GB_RESET, 1); /* release reset */
|
||||||
udelay(160);
|
udelay(160);
|
||||||
#ifdef CONFIG_SND_DEBUG_DETECT
|
|
||||||
{
|
|
||||||
unsigned char d;
|
|
||||||
|
|
||||||
if (((d = snd_gf1_i_look8(gus, SNDRV_GF1_GB_RESET)) & 0x07) != 1) {
|
if (((d = snd_gf1_i_look8(gus, SNDRV_GF1_GB_RESET)) & 0x07) != 1) {
|
||||||
snd_printk("[0x%lx] check 2 failed - 0x%x\n", gus->gf1.port, d);
|
snd_printdd("[0x%lx] check 2 failed - 0x%x\n", gus->gf1.port, d);
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
#else
|
|
||||||
if ((snd_gf1_i_look8(gus, SNDRV_GF1_GB_RESET) & 0x07) != 1)
|
|
||||||
return -ENODEV;
|
|
||||||
#endif
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -239,25 +225,25 @@ static int __init snd_gusmax_probe(int dev)
|
|||||||
xirq = irq[dev];
|
xirq = irq[dev];
|
||||||
if (xirq == SNDRV_AUTO_IRQ) {
|
if (xirq == SNDRV_AUTO_IRQ) {
|
||||||
if ((xirq = snd_legacy_find_free_irq(possible_irqs)) < 0) {
|
if ((xirq = snd_legacy_find_free_irq(possible_irqs)) < 0) {
|
||||||
snd_card_free(card);
|
snd_printk(KERN_ERR PFX "unable to find a free IRQ\n");
|
||||||
snd_printk("unable to find a free IRQ\n");
|
err = -EBUSY;
|
||||||
return -EBUSY;
|
goto _err;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
xdma1 = dma1[dev];
|
xdma1 = dma1[dev];
|
||||||
if (xdma1 == SNDRV_AUTO_DMA) {
|
if (xdma1 == SNDRV_AUTO_DMA) {
|
||||||
if ((xdma1 = snd_legacy_find_free_dma(possible_dmas)) < 0) {
|
if ((xdma1 = snd_legacy_find_free_dma(possible_dmas)) < 0) {
|
||||||
snd_card_free(card);
|
snd_printk(KERN_ERR PFX "unable to find a free DMA1\n");
|
||||||
snd_printk("unable to find a free DMA1\n");
|
err = -EBUSY;
|
||||||
return -EBUSY;
|
goto _err;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
xdma2 = dma2[dev];
|
xdma2 = dma2[dev];
|
||||||
if (xdma2 == SNDRV_AUTO_DMA) {
|
if (xdma2 == SNDRV_AUTO_DMA) {
|
||||||
if ((xdma2 = snd_legacy_find_free_dma(possible_dmas)) < 0) {
|
if ((xdma2 = snd_legacy_find_free_dma(possible_dmas)) < 0) {
|
||||||
snd_card_free(card);
|
snd_printk(KERN_ERR PFX "unable to find a free DMA2\n");
|
||||||
snd_printk("unable to find a free DMA2\n");
|
err = -EBUSY;
|
||||||
return -EBUSY;
|
goto _err;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -266,31 +252,28 @@ static int __init snd_gusmax_probe(int dev)
|
|||||||
-xirq, xdma1, xdma2,
|
-xirq, xdma1, xdma2,
|
||||||
0, channels[dev],
|
0, channels[dev],
|
||||||
pcm_channels[dev],
|
pcm_channels[dev],
|
||||||
0, &gus)) < 0) {
|
0, &gus)) < 0)
|
||||||
snd_card_free(card);
|
goto _err;
|
||||||
return err;
|
|
||||||
}
|
if ((err = snd_gusmax_detect(gus)) < 0)
|
||||||
if ((err = snd_gusmax_detect(gus)) < 0) {
|
goto _err;
|
||||||
snd_card_free(card);
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
maxcard->gus_status_reg = gus->gf1.reg_irqstat;
|
maxcard->gus_status_reg = gus->gf1.reg_irqstat;
|
||||||
maxcard->pcm_status_reg = gus->gf1.port + 0x10c + 2;
|
maxcard->pcm_status_reg = gus->gf1.port + 0x10c + 2;
|
||||||
snd_gusmax_init(dev, card, gus);
|
snd_gusmax_init(dev, card, gus);
|
||||||
if ((err = snd_gus_initialize(gus)) < 0) {
|
if ((err = snd_gus_initialize(gus)) < 0)
|
||||||
snd_card_free(card);
|
goto _err;
|
||||||
return err;
|
|
||||||
}
|
|
||||||
if (!gus->max_flag) {
|
if (!gus->max_flag) {
|
||||||
printk(KERN_ERR "GUS MAX soundcard was not detected at 0x%lx\n", gus->gf1.port);
|
snd_printk(KERN_ERR PFX "GUS MAX soundcard was not detected at 0x%lx\n", gus->gf1.port);
|
||||||
snd_card_free(card);
|
err = -ENODEV;
|
||||||
return -ENODEV;
|
goto _err;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (request_irq(xirq, snd_gusmax_interrupt, SA_INTERRUPT, "GUS MAX", (void *)maxcard)) {
|
if (request_irq(xirq, snd_gusmax_interrupt, SA_INTERRUPT, "GUS MAX", (void *)maxcard)) {
|
||||||
snd_card_free(card);
|
snd_printk(KERN_ERR PFX "unable to grab IRQ %d\n", xirq);
|
||||||
printk(KERN_ERR "gusmax: unable to grab IRQ %d\n", xirq);
|
err = -EBUSY;
|
||||||
return -EBUSY;
|
goto _err;
|
||||||
}
|
}
|
||||||
maxcard->irq = xirq;
|
maxcard->irq = xirq;
|
||||||
|
|
||||||
@ -301,50 +284,46 @@ static int __init snd_gusmax_probe(int dev)
|
|||||||
CS4231_HWSHARE_IRQ |
|
CS4231_HWSHARE_IRQ |
|
||||||
CS4231_HWSHARE_DMA1 |
|
CS4231_HWSHARE_DMA1 |
|
||||||
CS4231_HWSHARE_DMA2,
|
CS4231_HWSHARE_DMA2,
|
||||||
&cs4231)) < 0) {
|
&cs4231)) < 0)
|
||||||
snd_card_free(card);
|
goto _err;
|
||||||
return err;
|
|
||||||
}
|
|
||||||
if ((err = snd_cs4231_pcm(cs4231, 0, NULL)) < 0) {
|
|
||||||
snd_card_free(card);
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
if ((err = snd_cs4231_mixer(cs4231)) < 0) {
|
|
||||||
snd_card_free(card);
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
if ((err = snd_cs4231_timer(cs4231, 2, NULL)) < 0) {
|
|
||||||
snd_card_free(card);
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
if (pcm_channels[dev] > 0) {
|
|
||||||
if ((err = snd_gf1_pcm_new(gus, 1, 1, NULL)) < 0) {
|
|
||||||
snd_card_free(card);
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ((err = snd_gusmax_mixer(cs4231)) < 0) {
|
|
||||||
snd_card_free(card);
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((err = snd_gf1_rawmidi_new(gus, 0, NULL)) < 0) {
|
if ((err = snd_cs4231_pcm(cs4231, 0, NULL)) < 0)
|
||||||
snd_card_free(card);
|
goto _err;
|
||||||
return err;
|
|
||||||
|
if ((err = snd_cs4231_mixer(cs4231)) < 0)
|
||||||
|
goto _err;
|
||||||
|
|
||||||
|
if ((err = snd_cs4231_timer(cs4231, 2, NULL)) < 0)
|
||||||
|
goto _err;
|
||||||
|
|
||||||
|
if (pcm_channels[dev] > 0) {
|
||||||
|
if ((err = snd_gf1_pcm_new(gus, 1, 1, NULL)) < 0)
|
||||||
|
goto _err;
|
||||||
}
|
}
|
||||||
|
if ((err = snd_gusmax_mixer(cs4231)) < 0)
|
||||||
|
goto _err;
|
||||||
|
|
||||||
|
if ((err = snd_gf1_rawmidi_new(gus, 0, NULL)) < 0)
|
||||||
|
goto _err;
|
||||||
|
|
||||||
sprintf(card->longname + strlen(card->longname), " at 0x%lx, irq %i, dma %i", gus->gf1.port, xirq, xdma1);
|
sprintf(card->longname + strlen(card->longname), " at 0x%lx, irq %i, dma %i", gus->gf1.port, xirq, xdma1);
|
||||||
if (xdma2 >= 0)
|
if (xdma2 >= 0)
|
||||||
sprintf(card->longname + strlen(card->longname), "&%i", xdma2);
|
sprintf(card->longname + strlen(card->longname), "&%i", xdma2);
|
||||||
if ((err = snd_card_register(card)) < 0) {
|
|
||||||
snd_card_free(card);
|
if ((err = snd_card_set_generic_dev(card)) < 0)
|
||||||
return err;
|
goto _err;
|
||||||
}
|
|
||||||
|
if ((err = snd_card_register(card)) < 0)
|
||||||
|
goto _err;
|
||||||
|
|
||||||
maxcard->gus = gus;
|
maxcard->gus = gus;
|
||||||
maxcard->cs4231 = cs4231;
|
maxcard->cs4231 = cs4231;
|
||||||
snd_gusmax_cards[dev] = card;
|
snd_gusmax_cards[dev] = card;
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
_err:
|
||||||
|
snd_card_free(card);
|
||||||
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int __init snd_gusmax_legacy_auto_probe(unsigned long xport)
|
static int __init snd_gusmax_legacy_auto_probe(unsigned long xport)
|
||||||
|
@ -73,6 +73,12 @@ static int midi[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 0};
|
|||||||
static int pcm_channels[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 2};
|
static int pcm_channels[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 2};
|
||||||
static int effect[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 0};
|
static int effect[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 0};
|
||||||
|
|
||||||
|
#ifdef SNDRV_STB
|
||||||
|
#define PFX "interwave-stb: "
|
||||||
|
#else
|
||||||
|
#define PFX "interwave: "
|
||||||
|
#endif
|
||||||
|
|
||||||
module_param_array(index, int, NULL, 0444);
|
module_param_array(index, int, NULL, 0444);
|
||||||
MODULE_PARM_DESC(index, "Index value for InterWave soundcard.");
|
MODULE_PARM_DESC(index, "Index value for InterWave soundcard.");
|
||||||
module_param_array(id, charp, NULL, 0444);
|
module_param_array(id, charp, NULL, 0444);
|
||||||
@ -249,38 +255,20 @@ static int __devinit snd_interwave_detect(struct snd_interwave *iwcard,
|
|||||||
{
|
{
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
unsigned char rev1, rev2;
|
unsigned char rev1, rev2;
|
||||||
|
|
||||||
snd_gf1_i_write8(gus, SNDRV_GF1_GB_RESET, 0); /* reset GF1 */
|
|
||||||
#ifdef CONFIG_SND_DEBUG_DETECT
|
|
||||||
{
|
|
||||||
int d;
|
int d;
|
||||||
|
|
||||||
|
snd_gf1_i_write8(gus, SNDRV_GF1_GB_RESET, 0); /* reset GF1 */
|
||||||
if (((d = snd_gf1_i_look8(gus, SNDRV_GF1_GB_RESET)) & 0x07) != 0) {
|
if (((d = snd_gf1_i_look8(gus, SNDRV_GF1_GB_RESET)) & 0x07) != 0) {
|
||||||
snd_printk("[0x%lx] check 1 failed - 0x%x\n", gus->gf1.port, d);
|
snd_printdd("[0x%lx] check 1 failed - 0x%x\n", gus->gf1.port, d);
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
#else
|
|
||||||
if ((snd_gf1_i_look8(gus, SNDRV_GF1_GB_RESET) & 0x07) != 0)
|
|
||||||
return -ENODEV;
|
|
||||||
#endif
|
|
||||||
udelay(160);
|
udelay(160);
|
||||||
snd_gf1_i_write8(gus, SNDRV_GF1_GB_RESET, 1); /* release reset */
|
snd_gf1_i_write8(gus, SNDRV_GF1_GB_RESET, 1); /* release reset */
|
||||||
udelay(160);
|
udelay(160);
|
||||||
#ifdef CONFIG_SND_DEBUG_DETECT
|
|
||||||
{
|
|
||||||
int d;
|
|
||||||
|
|
||||||
if (((d = snd_gf1_i_look8(gus, SNDRV_GF1_GB_RESET)) & 0x07) != 1) {
|
if (((d = snd_gf1_i_look8(gus, SNDRV_GF1_GB_RESET)) & 0x07) != 1) {
|
||||||
snd_printk("[0x%lx] check 2 failed - 0x%x\n", gus->gf1.port, d);
|
snd_printdd("[0x%lx] check 2 failed - 0x%x\n", gus->gf1.port, d);
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
#else
|
|
||||||
if ((snd_gf1_i_look8(gus, SNDRV_GF1_GB_RESET) & 0x07) != 1)
|
|
||||||
return -ENODEV;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
spin_lock_irqsave(&gus->reg_lock, flags);
|
spin_lock_irqsave(&gus->reg_lock, flags);
|
||||||
rev1 = snd_gf1_look8(gus, SNDRV_GF1_GB_VERSION_NUMBER);
|
rev1 = snd_gf1_look8(gus, SNDRV_GF1_GB_VERSION_NUMBER);
|
||||||
snd_gf1_write8(gus, SNDRV_GF1_GB_VERSION_NUMBER, ~rev1);
|
snd_gf1_write8(gus, SNDRV_GF1_GB_VERSION_NUMBER, ~rev1);
|
||||||
@ -686,35 +674,33 @@ static int __devinit snd_interwave_probe(int dev, struct pnp_card_link *pcard,
|
|||||||
card->private_free = snd_interwave_free;
|
card->private_free = snd_interwave_free;
|
||||||
#ifdef CONFIG_PNP
|
#ifdef CONFIG_PNP
|
||||||
if (isapnp[dev]) {
|
if (isapnp[dev]) {
|
||||||
if (snd_interwave_pnp(dev, iwcard, pcard, pid)) {
|
if ((err = snd_interwave_pnp(dev, iwcard, pcard, pid)) < 0)
|
||||||
snd_card_free(card);
|
goto _err;
|
||||||
return -ENODEV;
|
|
||||||
}
|
|
||||||
snd_card_set_dev(card, &pcard->card->dev);
|
snd_card_set_dev(card, &pcard->card->dev);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
xirq = irq[dev];
|
xirq = irq[dev];
|
||||||
if (xirq == SNDRV_AUTO_IRQ) {
|
if (xirq == SNDRV_AUTO_IRQ) {
|
||||||
if ((xirq = snd_legacy_find_free_irq(possible_irqs)) < 0) {
|
if ((xirq = snd_legacy_find_free_irq(possible_irqs)) < 0) {
|
||||||
snd_card_free(card);
|
snd_printk(KERN_ERR PFX "unable to find a free IRQ\n");
|
||||||
snd_printk("unable to find a free IRQ\n");
|
err = -EBUSY;
|
||||||
return -EBUSY;
|
goto _err;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
xdma1 = dma1[dev];
|
xdma1 = dma1[dev];
|
||||||
if (xdma1 == SNDRV_AUTO_DMA) {
|
if (xdma1 == SNDRV_AUTO_DMA) {
|
||||||
if ((xdma1 = snd_legacy_find_free_dma(possible_dmas)) < 0) {
|
if ((xdma1 = snd_legacy_find_free_dma(possible_dmas)) < 0) {
|
||||||
snd_card_free(card);
|
snd_printk(KERN_ERR PFX "unable to find a free DMA1\n");
|
||||||
snd_printk("unable to find a free DMA1\n");
|
err = -EBUSY;
|
||||||
return -EBUSY;
|
goto _err;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
xdma2 = dma2[dev];
|
xdma2 = dma2[dev];
|
||||||
if (xdma2 == SNDRV_AUTO_DMA) {
|
if (xdma2 == SNDRV_AUTO_DMA) {
|
||||||
if ((xdma2 = snd_legacy_find_free_dma(possible_dmas)) < 0) {
|
if ((xdma2 = snd_legacy_find_free_dma(possible_dmas)) < 0) {
|
||||||
snd_card_free(card);
|
snd_printk(KERN_ERR PFX "unable to find a free DMA2\n");
|
||||||
snd_printk("unable to find a free DMA2\n");
|
err = -EBUSY;
|
||||||
return -EBUSY;
|
goto _err;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -722,32 +708,28 @@ static int __devinit snd_interwave_probe(int dev, struct pnp_card_link *pcard,
|
|||||||
port[dev],
|
port[dev],
|
||||||
-xirq, xdma1, xdma2,
|
-xirq, xdma1, xdma2,
|
||||||
0, 32,
|
0, 32,
|
||||||
pcm_channels[dev], effect[dev], &gus)) < 0) {
|
pcm_channels[dev], effect[dev], &gus)) < 0)
|
||||||
snd_card_free(card);
|
goto _err;
|
||||||
return err;
|
|
||||||
}
|
|
||||||
if ((err = snd_interwave_detect(iwcard, gus, dev
|
if ((err = snd_interwave_detect(iwcard, gus, dev
|
||||||
#ifdef SNDRV_STB
|
#ifdef SNDRV_STB
|
||||||
, &i2c_bus
|
, &i2c_bus
|
||||||
#endif
|
#endif
|
||||||
)) < 0) {
|
)) < 0)
|
||||||
snd_card_free(card);
|
goto _err;
|
||||||
return err;
|
|
||||||
}
|
|
||||||
iwcard->gus_status_reg = gus->gf1.reg_irqstat;
|
iwcard->gus_status_reg = gus->gf1.reg_irqstat;
|
||||||
iwcard->pcm_status_reg = gus->gf1.port + 0x10c + 2;
|
iwcard->pcm_status_reg = gus->gf1.port + 0x10c + 2;
|
||||||
|
|
||||||
snd_interwave_init(dev, gus);
|
snd_interwave_init(dev, gus);
|
||||||
snd_interwave_detect_memory(gus);
|
snd_interwave_detect_memory(gus);
|
||||||
if ((err = snd_gus_initialize(gus)) < 0) {
|
if ((err = snd_gus_initialize(gus)) < 0)
|
||||||
snd_card_free(card);
|
goto _err;
|
||||||
return err;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (request_irq(xirq, snd_interwave_interrupt, SA_INTERRUPT, "InterWave", (void *)iwcard)) {
|
if (request_irq(xirq, snd_interwave_interrupt, SA_INTERRUPT, "InterWave", (void *)iwcard)) {
|
||||||
snd_card_free(card);
|
snd_printk(KERN_ERR PFX "unable to grab IRQ %d\n", xirq);
|
||||||
snd_printk("unable to grab IRQ %d\n", xirq);
|
err = -EBUSY;
|
||||||
return -EBUSY;
|
goto _err;
|
||||||
}
|
}
|
||||||
iwcard->irq = xirq;
|
iwcard->irq = xirq;
|
||||||
|
|
||||||
@ -758,34 +740,28 @@ static int __devinit snd_interwave_probe(int dev, struct pnp_card_link *pcard,
|
|||||||
CS4231_HWSHARE_IRQ |
|
CS4231_HWSHARE_IRQ |
|
||||||
CS4231_HWSHARE_DMA1 |
|
CS4231_HWSHARE_DMA1 |
|
||||||
CS4231_HWSHARE_DMA2,
|
CS4231_HWSHARE_DMA2,
|
||||||
&cs4231)) < 0) {
|
&cs4231)) < 0)
|
||||||
snd_card_free(card);
|
goto _err;
|
||||||
return err;
|
|
||||||
}
|
if ((err = snd_cs4231_pcm(cs4231, 0, &pcm)) < 0)
|
||||||
if ((err = snd_cs4231_pcm(cs4231, 0, &pcm)) < 0) {
|
goto _err;
|
||||||
snd_card_free(card);
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
sprintf(pcm->name + strlen(pcm->name), " rev %c", gus->revision + 'A');
|
sprintf(pcm->name + strlen(pcm->name), " rev %c", gus->revision + 'A');
|
||||||
strcat(pcm->name, " (codec)");
|
strcat(pcm->name, " (codec)");
|
||||||
if ((err = snd_cs4231_timer(cs4231, 2, NULL)) < 0) {
|
|
||||||
snd_card_free(card);
|
if ((err = snd_cs4231_timer(cs4231, 2, NULL)) < 0)
|
||||||
return err;
|
goto _err;
|
||||||
}
|
|
||||||
if ((err = snd_cs4231_mixer(cs4231)) < 0) {
|
if ((err = snd_cs4231_mixer(cs4231)) < 0)
|
||||||
snd_card_free(card);
|
goto _err;
|
||||||
return err;
|
|
||||||
}
|
|
||||||
if (pcm_channels[dev] > 0) {
|
if (pcm_channels[dev] > 0) {
|
||||||
if ((err = snd_gf1_pcm_new(gus, 1, 1, NULL)) < 0) {
|
if ((err = snd_gf1_pcm_new(gus, 1, 1, NULL)) < 0)
|
||||||
snd_card_free(card);
|
goto _err;
|
||||||
return err;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ((err = snd_interwave_mixer(cs4231)) < 0) {
|
|
||||||
snd_card_free(card);
|
|
||||||
return err;
|
|
||||||
}
|
}
|
||||||
|
if ((err = snd_interwave_mixer(cs4231)) < 0)
|
||||||
|
goto _err;
|
||||||
|
|
||||||
#ifdef SNDRV_STB
|
#ifdef SNDRV_STB
|
||||||
{
|
{
|
||||||
snd_ctl_elem_id_t id1, id2;
|
snd_ctl_elem_id_t id1, id2;
|
||||||
@ -795,28 +771,20 @@ static int __devinit snd_interwave_probe(int dev, struct pnp_card_link *pcard,
|
|||||||
strcpy(id1.name, "Master Playback Switch");
|
strcpy(id1.name, "Master Playback Switch");
|
||||||
strcpy(id2.name, id1.name);
|
strcpy(id2.name, id1.name);
|
||||||
id2.index = 1;
|
id2.index = 1;
|
||||||
if ((err = snd_ctl_rename_id(card, &id1, &id2)) < 0) {
|
if ((err = snd_ctl_rename_id(card, &id1, &id2)) < 0)
|
||||||
snd_card_free(card);
|
goto _err;
|
||||||
return err;
|
|
||||||
}
|
|
||||||
strcpy(id1.name, "Master Playback Volume");
|
strcpy(id1.name, "Master Playback Volume");
|
||||||
strcpy(id2.name, id1.name);
|
strcpy(id2.name, id1.name);
|
||||||
if ((err = snd_ctl_rename_id(card, &id1, &id2)) < 0) {
|
if ((err = snd_ctl_rename_id(card, &id1, &id2)) < 0)
|
||||||
snd_card_free(card);
|
goto _err;
|
||||||
return err;
|
if ((err = snd_tea6330t_update_mixer(card, i2c_bus, 0, 1)) < 0)
|
||||||
}
|
goto _err;
|
||||||
if ((err = snd_tea6330t_update_mixer(card, i2c_bus, 0, 1)) < 0) {
|
|
||||||
snd_card_free(card);
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
gus->uart_enable = midi[dev];
|
gus->uart_enable = midi[dev];
|
||||||
if ((err = snd_gf1_rawmidi_new(gus, 0, NULL)) < 0) {
|
if ((err = snd_gf1_rawmidi_new(gus, 0, NULL)) < 0)
|
||||||
snd_card_free(card);
|
goto _err;
|
||||||
return err;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifndef SNDRV_STB
|
#ifndef SNDRV_STB
|
||||||
str = "AMD InterWave";
|
str = "AMD InterWave";
|
||||||
@ -835,10 +803,11 @@ static int __devinit snd_interwave_probe(int dev, struct pnp_card_link *pcard,
|
|||||||
if (xdma2 >= 0)
|
if (xdma2 >= 0)
|
||||||
sprintf(card->longname + strlen(card->longname), "&%d", xdma2);
|
sprintf(card->longname + strlen(card->longname), "&%d", xdma2);
|
||||||
|
|
||||||
if ((err = snd_card_register(card)) < 0) {
|
if ((err = snd_card_set_generic_dev(card)) < 0)
|
||||||
snd_card_free(card);
|
goto _err;
|
||||||
return err;
|
|
||||||
}
|
if ((err = snd_card_register(card)) < 0)
|
||||||
|
goto _err;
|
||||||
|
|
||||||
iwcard->cs4231 = cs4231;
|
iwcard->cs4231 = cs4231;
|
||||||
iwcard->gus = gus;
|
iwcard->gus = gus;
|
||||||
@ -847,6 +816,10 @@ static int __devinit snd_interwave_probe(int dev, struct pnp_card_link *pcard,
|
|||||||
else
|
else
|
||||||
snd_interwave_legacy[dev++] = card;
|
snd_interwave_legacy[dev++] = card;
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
_err:
|
||||||
|
snd_card_free(card);
|
||||||
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int __devinit snd_interwave_probe_legacy_port(unsigned long xport)
|
static int __devinit snd_interwave_probe_legacy_port(unsigned long xport)
|
||||||
|
@ -143,6 +143,8 @@ struct snd_opl3sa2 {
|
|||||||
|
|
||||||
static snd_card_t *snd_opl3sa2_legacy[SNDRV_CARDS] = SNDRV_DEFAULT_PTR;
|
static snd_card_t *snd_opl3sa2_legacy[SNDRV_CARDS] = SNDRV_DEFAULT_PTR;
|
||||||
|
|
||||||
|
#define PFX "opl3sa2: "
|
||||||
|
|
||||||
#ifdef CONFIG_PNP
|
#ifdef CONFIG_PNP
|
||||||
|
|
||||||
static struct pnp_device_id snd_opl3sa2_pnpbiosids[] = {
|
static struct pnp_device_id snd_opl3sa2_pnpbiosids[] = {
|
||||||
@ -231,7 +233,7 @@ static int __init snd_opl3sa2_detect(opl3sa2_t *chip)
|
|||||||
card = chip->card;
|
card = chip->card;
|
||||||
port = chip->port;
|
port = chip->port;
|
||||||
if ((chip->res_port = request_region(port, 2, "OPL3-SA control")) == NULL) {
|
if ((chip->res_port = request_region(port, 2, "OPL3-SA control")) == NULL) {
|
||||||
snd_printk(KERN_ERR "opl3sa2: can't grab port 0x%lx\n", port);
|
snd_printk(KERN_ERR PFX "can't grab port 0x%lx\n", port);
|
||||||
return -EBUSY;
|
return -EBUSY;
|
||||||
}
|
}
|
||||||
// snd_printk("REG 0A = 0x%x\n", snd_opl3sa2_read(chip, 0x0a));
|
// snd_printk("REG 0A = 0x%x\n", snd_opl3sa2_read(chip, 0x0a));
|
||||||
@ -668,6 +670,12 @@ static int snd_opl3sa2_dev_free(snd_device_t *device)
|
|||||||
return snd_opl3sa2_free(chip);
|
return snd_opl3sa2_free(chip);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_PNP
|
||||||
|
#define is_isapnp_selected(dev) isapnp[dev]
|
||||||
|
#else
|
||||||
|
#define is_isapnp_selected(dev) 0
|
||||||
|
#endif
|
||||||
|
|
||||||
static int __devinit snd_opl3sa2_probe(int dev,
|
static int __devinit snd_opl3sa2_probe(int dev,
|
||||||
struct pnp_dev *pdev,
|
struct pnp_dev *pdev,
|
||||||
struct pnp_card_link *pcard,
|
struct pnp_card_link *pcard,
|
||||||
@ -683,28 +691,25 @@ static int __devinit snd_opl3sa2_probe(int dev,
|
|||||||
};
|
};
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
#ifdef CONFIG_PNP
|
if (! is_isapnp_selected(dev)) {
|
||||||
if (!isapnp[dev]) {
|
|
||||||
#endif
|
|
||||||
if (port[dev] == SNDRV_AUTO_PORT) {
|
if (port[dev] == SNDRV_AUTO_PORT) {
|
||||||
snd_printk("specify port\n");
|
snd_printk(KERN_ERR PFX "specify port\n");
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
if (wss_port[dev] == SNDRV_AUTO_PORT) {
|
if (wss_port[dev] == SNDRV_AUTO_PORT) {
|
||||||
snd_printk("specify wss_port\n");
|
snd_printk(KERN_ERR PFX "specify wss_port\n");
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
if (fm_port[dev] == SNDRV_AUTO_PORT) {
|
if (fm_port[dev] == SNDRV_AUTO_PORT) {
|
||||||
snd_printk("specify fm_port\n");
|
snd_printk(KERN_ERR PFX "specify fm_port\n");
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
if (midi_port[dev] == SNDRV_AUTO_PORT) {
|
if (midi_port[dev] == SNDRV_AUTO_PORT) {
|
||||||
snd_printk("specify midi_port\n");
|
snd_printk(KERN_ERR PFX "specify midi_port\n");
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
#ifdef CONFIG_PNP
|
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
card = snd_card_new(index[dev], id[dev], THIS_MODULE, 0);
|
card = snd_card_new(index[dev], id[dev], THIS_MODULE, 0);
|
||||||
if (card == NULL)
|
if (card == NULL)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
@ -742,7 +747,7 @@ static int __devinit snd_opl3sa2_probe(int dev,
|
|||||||
if ((err = snd_opl3sa2_detect(chip)) < 0)
|
if ((err = snd_opl3sa2_detect(chip)) < 0)
|
||||||
goto __error;
|
goto __error;
|
||||||
if (request_irq(xirq, snd_opl3sa2_interrupt, SA_INTERRUPT, "OPL3-SA2", (void *)chip)) {
|
if (request_irq(xirq, snd_opl3sa2_interrupt, SA_INTERRUPT, "OPL3-SA2", (void *)chip)) {
|
||||||
snd_printk(KERN_ERR "opl3sa2: can't grab IRQ %d\n", xirq);
|
snd_printk(KERN_ERR PFX "can't grab IRQ %d\n", xirq);
|
||||||
err = -ENODEV;
|
err = -ENODEV;
|
||||||
goto __error;
|
goto __error;
|
||||||
}
|
}
|
||||||
@ -795,6 +800,9 @@ static int __devinit snd_opl3sa2_probe(int dev,
|
|||||||
if (dma2 >= 0)
|
if (dma2 >= 0)
|
||||||
sprintf(card->longname + strlen(card->longname), "&%d", xdma2);
|
sprintf(card->longname + strlen(card->longname), "&%d", xdma2);
|
||||||
|
|
||||||
|
if ((err = snd_card_set_generic_dev(card)) < 0)
|
||||||
|
goto __error;
|
||||||
|
|
||||||
if ((err = snd_card_register(card)) < 0)
|
if ((err = snd_card_register(card)) < 0)
|
||||||
goto __error;
|
goto __error;
|
||||||
|
|
||||||
@ -852,7 +860,9 @@ static int __devinit snd_opl3sa2_pnp_cdetect(struct pnp_card_link *card,
|
|||||||
int res;
|
int res;
|
||||||
|
|
||||||
for ( ; dev < SNDRV_CARDS; dev++) {
|
for ( ; dev < SNDRV_CARDS; dev++) {
|
||||||
if (!enable[dev] || !isapnp[dev])
|
if (!enable[dev])
|
||||||
|
continue;
|
||||||
|
if (is_isapnp_selected(dev))
|
||||||
continue;
|
continue;
|
||||||
res = snd_opl3sa2_probe(dev, NULL, card, id);
|
res = snd_opl3sa2_probe(dev, NULL, card, id);
|
||||||
if (res < 0)
|
if (res < 0)
|
||||||
|
@ -1894,7 +1894,7 @@ static void snd_card_opti9xx_free(snd_card_t *card)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int __devinit snd_card_opti9xx_probe(struct pnp_card_link *pcard,
|
static int snd_card_opti9xx_probe(struct pnp_card_link *pcard,
|
||||||
const struct pnp_card_device_id *pid)
|
const struct pnp_card_device_id *pid)
|
||||||
{
|
{
|
||||||
static long possible_ports[] = {0x530, 0xe80, 0xf40, 0x604, -1};
|
static long possible_ports[] = {0x530, 0xe80, 0xf40, 0x604, -1};
|
||||||
@ -1965,6 +1965,10 @@ static int __devinit snd_card_opti9xx_probe(struct pnp_card_link *pcard,
|
|||||||
snd_card_free(card);
|
snd_card_free(card);
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
if ((error = snd_card_set_generic_dev(card)) < 0) {
|
||||||
|
snd_card_free(card);
|
||||||
|
return error;
|
||||||
|
}
|
||||||
#ifdef CONFIG_PNP
|
#ifdef CONFIG_PNP
|
||||||
}
|
}
|
||||||
#endif /* CONFIG_PNP */
|
#endif /* CONFIG_PNP */
|
||||||
|
@ -351,6 +351,12 @@ static void snd_sb16_free(snd_card_t *card)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_PNP
|
||||||
|
#define is_isapnp_selected(dev) isapnp[dev]
|
||||||
|
#else
|
||||||
|
#define is_isapnp_selected(dev) 0
|
||||||
|
#endif
|
||||||
|
|
||||||
static int __init snd_sb16_probe(int dev,
|
static int __init snd_sb16_probe(int dev,
|
||||||
struct pnp_card_link *pcard,
|
struct pnp_card_link *pcard,
|
||||||
const struct pnp_card_device_id *pid)
|
const struct pnp_card_device_id *pid)
|
||||||
@ -378,10 +384,8 @@ static int __init snd_sb16_probe(int dev,
|
|||||||
card->private_free = snd_sb16_free;
|
card->private_free = snd_sb16_free;
|
||||||
#ifdef CONFIG_PNP
|
#ifdef CONFIG_PNP
|
||||||
if (isapnp[dev]) {
|
if (isapnp[dev]) {
|
||||||
if ((err = snd_card_sb16_pnp(dev, acard, pcard, pid))) {
|
if ((err = snd_card_sb16_pnp(dev, acard, pcard, pid)))
|
||||||
snd_card_free(card);
|
goto _err;
|
||||||
return err;
|
|
||||||
}
|
|
||||||
snd_card_set_dev(card, &pcard->card->dev);
|
snd_card_set_dev(card, &pcard->card->dev);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@ -389,28 +393,26 @@ static int __init snd_sb16_probe(int dev,
|
|||||||
xirq = irq[dev];
|
xirq = irq[dev];
|
||||||
xdma8 = dma8[dev];
|
xdma8 = dma8[dev];
|
||||||
xdma16 = dma16[dev];
|
xdma16 = dma16[dev];
|
||||||
#ifdef CONFIG_PNP
|
if (! is_isapnp_selected(dev)) {
|
||||||
if (!isapnp[dev]) {
|
|
||||||
#endif
|
|
||||||
if (xirq == SNDRV_AUTO_IRQ) {
|
if (xirq == SNDRV_AUTO_IRQ) {
|
||||||
if ((xirq = snd_legacy_find_free_irq(possible_irqs)) < 0) {
|
if ((xirq = snd_legacy_find_free_irq(possible_irqs)) < 0) {
|
||||||
snd_card_free(card);
|
|
||||||
snd_printk(KERN_ERR PFX "unable to find a free IRQ\n");
|
snd_printk(KERN_ERR PFX "unable to find a free IRQ\n");
|
||||||
return -EBUSY;
|
err = -EBUSY;
|
||||||
|
goto _err;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (xdma8 == SNDRV_AUTO_DMA) {
|
if (xdma8 == SNDRV_AUTO_DMA) {
|
||||||
if ((xdma8 = snd_legacy_find_free_dma(possible_dmas8)) < 0) {
|
if ((xdma8 = snd_legacy_find_free_dma(possible_dmas8)) < 0) {
|
||||||
snd_card_free(card);
|
|
||||||
snd_printk(KERN_ERR PFX "unable to find a free 8-bit DMA\n");
|
snd_printk(KERN_ERR PFX "unable to find a free 8-bit DMA\n");
|
||||||
return -EBUSY;
|
err = -EBUSY;
|
||||||
|
goto _err;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (xdma16 == SNDRV_AUTO_DMA) {
|
if (xdma16 == SNDRV_AUTO_DMA) {
|
||||||
if ((xdma16 = snd_legacy_find_free_dma(possible_dmas16)) < 0) {
|
if ((xdma16 = snd_legacy_find_free_dma(possible_dmas16)) < 0) {
|
||||||
snd_card_free(card);
|
|
||||||
snd_printk(KERN_ERR PFX "unable to find a free 16-bit DMA\n");
|
snd_printk(KERN_ERR PFX "unable to find a free 16-bit DMA\n");
|
||||||
return -EBUSY;
|
err = -EBUSY;
|
||||||
|
goto _err;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* non-PnP FM port address is hardwired with base port address */
|
/* non-PnP FM port address is hardwired with base port address */
|
||||||
@ -421,9 +423,7 @@ static int __init snd_sb16_probe(int dev,
|
|||||||
/* non-PnP AWE port address is hardwired with base port address */
|
/* non-PnP AWE port address is hardwired with base port address */
|
||||||
awe_port[dev] = port[dev] + 0x400;
|
awe_port[dev] = port[dev] + 0x400;
|
||||||
#endif
|
#endif
|
||||||
#ifdef CONFIG_PNP
|
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
if ((err = snd_sbdsp_create(card,
|
if ((err = snd_sbdsp_create(card,
|
||||||
port[dev],
|
port[dev],
|
||||||
@ -432,28 +432,20 @@ static int __init snd_sb16_probe(int dev,
|
|||||||
xdma8,
|
xdma8,
|
||||||
xdma16,
|
xdma16,
|
||||||
SB_HW_AUTO,
|
SB_HW_AUTO,
|
||||||
&chip)) < 0) {
|
&chip)) < 0)
|
||||||
snd_card_free(card);
|
goto _err;
|
||||||
return err;
|
|
||||||
}
|
|
||||||
if (chip->hardware != SB_HW_16) {
|
if (chip->hardware != SB_HW_16) {
|
||||||
snd_card_free(card);
|
snd_printk(KERN_ERR PFX "SB 16 chip was not detected at 0x%lx\n", port[dev]);
|
||||||
snd_printdd("SB 16 chip was not detected at 0x%lx\n", port[dev]);
|
err = -ENODEV;
|
||||||
return -ENODEV;
|
goto _err;
|
||||||
}
|
}
|
||||||
chip->mpu_port = mpu_port[dev];
|
chip->mpu_port = mpu_port[dev];
|
||||||
#ifdef CONFIG_PNP
|
if (! is_isapnp_selected(dev) && (err = snd_sb16dsp_configure(chip)) < 0)
|
||||||
if (!isapnp[dev] && (err = snd_sb16dsp_configure(chip)) < 0) {
|
goto _err;
|
||||||
#else
|
|
||||||
if ((err = snd_sb16dsp_configure(chip)) < 0) {
|
if ((err = snd_sb16dsp_pcm(chip, 0, NULL)) < 0)
|
||||||
#endif
|
goto _err;
|
||||||
snd_card_free(card);
|
|
||||||
return -ENXIO;
|
|
||||||
}
|
|
||||||
if ((err = snd_sb16dsp_pcm(chip, 0, NULL)) < 0) {
|
|
||||||
snd_card_free(card);
|
|
||||||
return -ENXIO;
|
|
||||||
}
|
|
||||||
|
|
||||||
strcpy(card->driver,
|
strcpy(card->driver,
|
||||||
#ifdef SNDRV_SBAWE_EMU8000
|
#ifdef SNDRV_SBAWE_EMU8000
|
||||||
@ -474,10 +466,8 @@ static int __init snd_sb16_probe(int dev,
|
|||||||
if (chip->mpu_port > 0 && chip->mpu_port != SNDRV_AUTO_PORT) {
|
if (chip->mpu_port > 0 && chip->mpu_port != SNDRV_AUTO_PORT) {
|
||||||
if ((err = snd_mpu401_uart_new(card, 0, MPU401_HW_SB,
|
if ((err = snd_mpu401_uart_new(card, 0, MPU401_HW_SB,
|
||||||
chip->mpu_port, 0,
|
chip->mpu_port, 0,
|
||||||
xirq, 0, &chip->rmidi)) < 0) {
|
xirq, 0, &chip->rmidi)) < 0)
|
||||||
snd_card_free(card);
|
goto _err;
|
||||||
return -ENXIO;
|
|
||||||
}
|
|
||||||
chip->rmidi_callback = snd_mpu401_uart_interrupt;
|
chip->rmidi_callback = snd_mpu401_uart_interrupt;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -499,17 +489,13 @@ static int __init snd_sb16_probe(int dev,
|
|||||||
#else
|
#else
|
||||||
int seqdev = 1;
|
int seqdev = 1;
|
||||||
#endif
|
#endif
|
||||||
if ((err = snd_opl3_hwdep_new(opl3, 0, seqdev, &synth)) < 0) {
|
if ((err = snd_opl3_hwdep_new(opl3, 0, seqdev, &synth)) < 0)
|
||||||
snd_card_free(card);
|
goto _err;
|
||||||
return -ENXIO;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((err = snd_sbmixer_new(chip)) < 0) {
|
if ((err = snd_sbmixer_new(chip)) < 0)
|
||||||
snd_card_free(card);
|
goto _err;
|
||||||
return -ENXIO;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef CONFIG_SND_SB16_CSP
|
#ifdef CONFIG_SND_SB16_CSP
|
||||||
/* CSP chip on SB16ASP/AWE32 */
|
/* CSP chip on SB16ASP/AWE32 */
|
||||||
@ -525,11 +511,11 @@ static int __init snd_sb16_probe(int dev,
|
|||||||
#endif
|
#endif
|
||||||
#ifdef SNDRV_SBAWE_EMU8000
|
#ifdef SNDRV_SBAWE_EMU8000
|
||||||
if (awe_port[dev] > 0) {
|
if (awe_port[dev] > 0) {
|
||||||
if (snd_emu8000_new(card, 1, awe_port[dev],
|
if ((err = snd_emu8000_new(card, 1, awe_port[dev],
|
||||||
seq_ports[dev], NULL) < 0) {
|
seq_ports[dev], NULL)) < 0) {
|
||||||
snd_printk(KERN_ERR PFX "fatal error - EMU-8000 synthesizer not detected at 0x%lx\n", awe_port[dev]);
|
snd_printk(KERN_ERR PFX "fatal error - EMU-8000 synthesizer not detected at 0x%lx\n", awe_port[dev]);
|
||||||
snd_card_free(card);
|
|
||||||
return -ENXIO;
|
goto _err;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@ -541,15 +527,21 @@ static int __init snd_sb16_probe(int dev,
|
|||||||
(mic_agc[dev] ? 0x00 : 0x01));
|
(mic_agc[dev] ? 0x00 : 0x01));
|
||||||
spin_unlock_irqrestore(&chip->mixer_lock, flags);
|
spin_unlock_irqrestore(&chip->mixer_lock, flags);
|
||||||
|
|
||||||
if ((err = snd_card_register(card)) < 0) {
|
if ((err = snd_card_set_generic_dev(card)) < 0)
|
||||||
snd_card_free(card);
|
goto _err;
|
||||||
return err;
|
|
||||||
}
|
if ((err = snd_card_register(card)) < 0)
|
||||||
|
goto _err;
|
||||||
|
|
||||||
if (pcard)
|
if (pcard)
|
||||||
pnp_set_card_drvdata(pcard, card);
|
pnp_set_card_drvdata(pcard, card);
|
||||||
else
|
else
|
||||||
snd_sb16_legacy[dev] = card;
|
snd_sb16_legacy[dev] = card;
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
_err:
|
||||||
|
snd_card_free(card);
|
||||||
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int __init snd_sb16_probe_legacy_port(unsigned long xport)
|
static int __init snd_sb16_probe_legacy_port(unsigned long xport)
|
||||||
@ -560,10 +552,8 @@ static int __init snd_sb16_probe_legacy_port(unsigned long xport)
|
|||||||
for ( ; dev < SNDRV_CARDS; dev++) {
|
for ( ; dev < SNDRV_CARDS; dev++) {
|
||||||
if (!enable[dev] || port[dev] != SNDRV_AUTO_PORT)
|
if (!enable[dev] || port[dev] != SNDRV_AUTO_PORT)
|
||||||
continue;
|
continue;
|
||||||
#ifdef CONFIG_PNP
|
if (is_isapnp_selected(dev))
|
||||||
if (isapnp[dev])
|
|
||||||
continue;
|
continue;
|
||||||
#endif
|
|
||||||
port[dev] = xport;
|
port[dev] = xport;
|
||||||
res = snd_sb16_probe(dev, NULL, NULL);
|
res = snd_sb16_probe(dev, NULL, NULL);
|
||||||
if (res < 0)
|
if (res < 0)
|
||||||
@ -621,10 +611,8 @@ static int __init alsa_card_sb16_init(void)
|
|||||||
for (dev = 0; dev < SNDRV_CARDS; dev++) {
|
for (dev = 0; dev < SNDRV_CARDS; dev++) {
|
||||||
if (!enable[dev] || port[dev] == SNDRV_AUTO_PORT)
|
if (!enable[dev] || port[dev] == SNDRV_AUTO_PORT)
|
||||||
continue;
|
continue;
|
||||||
#ifdef CONFIG_PNP
|
if (is_isapnp_selected(dev))
|
||||||
if (isapnp[dev])
|
|
||||||
continue;
|
continue;
|
||||||
#endif
|
|
||||||
if (!snd_sb16_probe(dev, NULL, NULL)) {
|
if (!snd_sb16_probe(dev, NULL, NULL)) {
|
||||||
cards++;
|
cards++;
|
||||||
continue;
|
continue;
|
||||||
|
@ -107,54 +107,47 @@ static int __init snd_sb8_probe(int dev)
|
|||||||
dma8[dev],
|
dma8[dev],
|
||||||
-1,
|
-1,
|
||||||
SB_HW_AUTO,
|
SB_HW_AUTO,
|
||||||
&chip)) < 0) {
|
&chip)) < 0)
|
||||||
snd_card_free(card);
|
goto _err;
|
||||||
return err;
|
|
||||||
}
|
|
||||||
if (chip->hardware >= SB_HW_16) {
|
if (chip->hardware >= SB_HW_16) {
|
||||||
snd_card_free(card);
|
|
||||||
if (chip->hardware == SB_HW_ALS100)
|
if (chip->hardware == SB_HW_ALS100)
|
||||||
snd_printdd("ALS100 chip detected at 0x%lx, try snd-als100 module\n",
|
snd_printk(KERN_WARNING "ALS100 chip detected at 0x%lx, try snd-als100 module\n",
|
||||||
port[dev]);
|
port[dev]);
|
||||||
else
|
else
|
||||||
snd_printdd("SB 16 chip detected at 0x%lx, try snd-sb16 module\n",
|
snd_printk(KERN_WARNING "SB 16 chip detected at 0x%lx, try snd-sb16 module\n",
|
||||||
port[dev]);
|
port[dev]);
|
||||||
return -ENODEV;
|
err = -ENODEV;
|
||||||
|
goto _err;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((err = snd_sb8dsp_pcm(chip, 0, NULL)) < 0) {
|
if ((err = snd_sb8dsp_pcm(chip, 0, NULL)) < 0)
|
||||||
snd_card_free(card);
|
goto _err;
|
||||||
return err;
|
|
||||||
}
|
if ((err = snd_sbmixer_new(chip)) < 0)
|
||||||
if ((err = snd_sbmixer_new(chip)) < 0) {
|
goto _err;
|
||||||
snd_card_free(card);
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
if (chip->hardware == SB_HW_10 || chip->hardware == SB_HW_20) {
|
if (chip->hardware == SB_HW_10 || chip->hardware == SB_HW_20) {
|
||||||
if ((err = snd_opl3_create(card, chip->port + 8, 0,
|
if ((err = snd_opl3_create(card, chip->port + 8, 0,
|
||||||
OPL3_HW_AUTO, 1,
|
OPL3_HW_AUTO, 1,
|
||||||
&opl3)) < 0) {
|
&opl3)) < 0) {
|
||||||
snd_printk(KERN_ERR "sb8: no OPL device at 0x%lx\n", chip->port + 8);
|
snd_printk(KERN_WARNING "sb8: no OPL device at 0x%lx\n", chip->port + 8);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if ((err = snd_opl3_create(card, chip->port, chip->port + 2,
|
if ((err = snd_opl3_create(card, chip->port, chip->port + 2,
|
||||||
OPL3_HW_AUTO, 1,
|
OPL3_HW_AUTO, 1,
|
||||||
&opl3)) < 0) {
|
&opl3)) < 0) {
|
||||||
snd_printk(KERN_ERR "sb8: no OPL device at 0x%lx-0x%lx\n",
|
snd_printk(KERN_WARNING "sb8: no OPL device at 0x%lx-0x%lx\n",
|
||||||
chip->port, chip->port + 2);
|
chip->port, chip->port + 2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (err >= 0) {
|
if (err >= 0) {
|
||||||
if ((err = snd_opl3_hwdep_new(opl3, 0, 1, NULL)) < 0) {
|
if ((err = snd_opl3_hwdep_new(opl3, 0, 1, NULL)) < 0)
|
||||||
snd_card_free(card);
|
goto _err;
|
||||||
return err;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((err = snd_sb8dsp_midi(chip, 0, NULL)) < 0) {
|
if ((err = snd_sb8dsp_midi(chip, 0, NULL)) < 0)
|
||||||
snd_card_free(card);
|
goto _err;
|
||||||
return err;
|
|
||||||
}
|
|
||||||
|
|
||||||
strcpy(card->driver, chip->hardware == SB_HW_PRO ? "SB Pro" : "SB8");
|
strcpy(card->driver, chip->hardware == SB_HW_PRO ? "SB Pro" : "SB8");
|
||||||
strcpy(card->shortname, chip->name);
|
strcpy(card->shortname, chip->name);
|
||||||
@ -162,12 +155,19 @@ static int __init snd_sb8_probe(int dev)
|
|||||||
chip->name,
|
chip->name,
|
||||||
chip->port,
|
chip->port,
|
||||||
irq[dev], dma8[dev]);
|
irq[dev], dma8[dev]);
|
||||||
if ((err = snd_card_register(card)) < 0) {
|
|
||||||
snd_card_free(card);
|
if ((err = snd_card_set_generic_dev(card)) < 0)
|
||||||
return err;
|
goto _err;
|
||||||
}
|
|
||||||
|
if ((err = snd_card_register(card)) < 0)
|
||||||
|
goto _err;
|
||||||
|
|
||||||
snd_sb8_cards[dev] = card;
|
snd_sb8_cards[dev] = card;
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
_err:
|
||||||
|
snd_card_free(card);
|
||||||
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int __init snd_card_sb8_legacy_auto_probe(unsigned long xport)
|
static int __init snd_card_sb8_legacy_auto_probe(unsigned long xport)
|
||||||
|
@ -67,6 +67,8 @@ MODULE_PARM_DESC(dma1, "DMA1 # for Sound Galaxy driver.");
|
|||||||
|
|
||||||
static snd_card_t *snd_sgalaxy_cards[SNDRV_CARDS] = SNDRV_DEFAULT_PTR;
|
static snd_card_t *snd_sgalaxy_cards[SNDRV_CARDS] = SNDRV_DEFAULT_PTR;
|
||||||
|
|
||||||
|
#define PFX "sgalaxy: "
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
||||||
*/
|
*/
|
||||||
@ -135,7 +137,7 @@ static int __init snd_sgalaxy_setup_wss(unsigned long port, int irq, int dma)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
snd_printdd("sgalaxy - setting up IRQ/DMA for WSS\n");
|
snd_printdd(PFX "setting up IRQ/DMA for WSS\n");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* initialize IRQ for WSS codec */
|
/* initialize IRQ for WSS codec */
|
||||||
@ -160,7 +162,7 @@ static int __init snd_sgalaxy_setup_wss(unsigned long port, int irq, int dma)
|
|||||||
static int __init snd_sgalaxy_detect(int dev, int irq, int dma)
|
static int __init snd_sgalaxy_detect(int dev, int irq, int dma)
|
||||||
{
|
{
|
||||||
#if 0
|
#if 0
|
||||||
snd_printdd("sgalaxy - switching to WSS mode\n");
|
snd_printdd(PFX "switching to WSS mode\n");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* switch to WSS mode */
|
/* switch to WSS mode */
|
||||||
@ -223,11 +225,11 @@ static int __init snd_sgalaxy_probe(int dev)
|
|||||||
ad1848_t *chip;
|
ad1848_t *chip;
|
||||||
|
|
||||||
if (sbport[dev] == SNDRV_AUTO_PORT) {
|
if (sbport[dev] == SNDRV_AUTO_PORT) {
|
||||||
snd_printk("specify SB port\n");
|
snd_printk(KERN_ERR PFX "specify SB port\n");
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
if (wssport[dev] == SNDRV_AUTO_PORT) {
|
if (wssport[dev] == SNDRV_AUTO_PORT) {
|
||||||
snd_printk("specify WSS port\n");
|
snd_printk(KERN_ERR PFX "specify WSS port\n");
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
card = snd_card_new(index[dev], id[dev], THIS_MODULE, 0);
|
card = snd_card_new(index[dev], id[dev], THIS_MODULE, 0);
|
||||||
@ -237,46 +239,39 @@ static int __init snd_sgalaxy_probe(int dev)
|
|||||||
xirq = irq[dev];
|
xirq = irq[dev];
|
||||||
if (xirq == SNDRV_AUTO_IRQ) {
|
if (xirq == SNDRV_AUTO_IRQ) {
|
||||||
if ((xirq = snd_legacy_find_free_irq(possible_irqs)) < 0) {
|
if ((xirq = snd_legacy_find_free_irq(possible_irqs)) < 0) {
|
||||||
snd_card_free(card);
|
snd_printk(KERN_ERR PFX "unable to find a free IRQ\n");
|
||||||
snd_printk("unable to find a free IRQ\n");
|
err = -EBUSY;
|
||||||
return -EBUSY;
|
goto _err;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
xdma1 = dma1[dev];
|
xdma1 = dma1[dev];
|
||||||
if (xdma1 == SNDRV_AUTO_DMA) {
|
if (xdma1 == SNDRV_AUTO_DMA) {
|
||||||
if ((xdma1 = snd_legacy_find_free_dma(possible_dmas)) < 0) {
|
if ((xdma1 = snd_legacy_find_free_dma(possible_dmas)) < 0) {
|
||||||
snd_card_free(card);
|
snd_printk(KERN_ERR PFX "unable to find a free DMA\n");
|
||||||
snd_printk("unable to find a free DMA\n");
|
err = -EBUSY;
|
||||||
return -EBUSY;
|
goto _err;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((err = snd_sgalaxy_detect(dev, xirq, xdma1)) < 0) {
|
if ((err = snd_sgalaxy_detect(dev, xirq, xdma1)) < 0)
|
||||||
snd_card_free(card);
|
goto _err;
|
||||||
return err;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((err = snd_ad1848_create(card, wssport[dev] + 4,
|
if ((err = snd_ad1848_create(card, wssport[dev] + 4,
|
||||||
xirq, xdma1,
|
xirq, xdma1,
|
||||||
AD1848_HW_DETECT, &chip)) < 0) {
|
AD1848_HW_DETECT, &chip)) < 0)
|
||||||
snd_card_free(card);
|
goto _err;
|
||||||
return err;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((err = snd_ad1848_pcm(chip, 0, NULL)) < 0) {
|
if ((err = snd_ad1848_pcm(chip, 0, NULL)) < 0) {
|
||||||
snd_printdd("sgalaxy - error creating new ad1848 PCM device\n");
|
snd_printdd(PFX "error creating new ad1848 PCM device\n");
|
||||||
snd_card_free(card);
|
goto _err;
|
||||||
return err;
|
|
||||||
}
|
}
|
||||||
if ((err = snd_ad1848_mixer(chip)) < 0) {
|
if ((err = snd_ad1848_mixer(chip)) < 0) {
|
||||||
snd_printdd("sgalaxy - error creating new ad1848 mixer\n");
|
snd_printdd(PFX "error creating new ad1848 mixer\n");
|
||||||
snd_card_free(card);
|
goto _err;
|
||||||
return err;
|
|
||||||
}
|
}
|
||||||
if (snd_sgalaxy_mixer(chip) < 0) {
|
if ((err = snd_sgalaxy_mixer(chip)) < 0) {
|
||||||
snd_printdd("sgalaxy - the mixer rewrite failed\n");
|
snd_printdd(PFX "the mixer rewrite failed\n");
|
||||||
snd_card_free(card);
|
goto _err;
|
||||||
return err;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
strcpy(card->driver, "Sound Galaxy");
|
strcpy(card->driver, "Sound Galaxy");
|
||||||
@ -284,12 +279,18 @@ static int __init snd_sgalaxy_probe(int dev)
|
|||||||
sprintf(card->longname, "Sound Galaxy at 0x%lx, irq %d, dma %d",
|
sprintf(card->longname, "Sound Galaxy at 0x%lx, irq %d, dma %d",
|
||||||
wssport[dev], xirq, xdma1);
|
wssport[dev], xirq, xdma1);
|
||||||
|
|
||||||
if ((err = snd_card_register(card)) < 0) {
|
if ((err = snd_card_set_generic_dev(card)) < 0)
|
||||||
snd_card_free(card);
|
goto _err;
|
||||||
return err;
|
|
||||||
}
|
if ((err = snd_card_register(card)) < 0)
|
||||||
|
goto _err;
|
||||||
|
|
||||||
snd_sgalaxy_cards[dev] = card;
|
snd_sgalaxy_cards[dev] = card;
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
_err:
|
||||||
|
snd_card_free(card);
|
||||||
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int __init alsa_card_sgalaxy_init(void)
|
static int __init alsa_card_sgalaxy_init(void)
|
||||||
|
@ -1262,11 +1262,6 @@ static int __devinit create_sscape(const struct params *params, snd_card_t **rca
|
|||||||
*/
|
*/
|
||||||
sscape_write(sscape, GA_INTENA_REG, 0x80);
|
sscape_write(sscape, GA_INTENA_REG, 0x80);
|
||||||
|
|
||||||
if ((err = snd_card_register(card)) < 0) {
|
|
||||||
printk(KERN_ERR "sscape: Failed to register sound card\n");
|
|
||||||
goto _release_card;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Initialize mixer
|
* Initialize mixer
|
||||||
*/
|
*/
|
||||||
@ -1396,6 +1391,13 @@ static int __devinit sscape_pnp_detect(struct pnp_card_link *pcard,
|
|||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
snd_card_set_dev(card, &pcard->card->dev);
|
snd_card_set_dev(card, &pcard->card->dev);
|
||||||
|
|
||||||
|
if ((ret = snd_card_register(card)) < 0) {
|
||||||
|
printk(KERN_ERR "sscape: Failed to register sound card\n");
|
||||||
|
snd_card_free(card);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
pnp_set_card_drvdata(pcard, card);
|
pnp_set_card_drvdata(pcard, card);
|
||||||
++sscape_cards;
|
++sscape_cards;
|
||||||
++idx;
|
++idx;
|
||||||
@ -1460,6 +1462,16 @@ static int __init sscape_manual_probe(struct params *params)
|
|||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
|
if ((ret = snd_card_set_generic_dev(card)) < 0) {
|
||||||
|
snd_card_free(card);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
if ((ret = snd_card_register(card)) < 0) {
|
||||||
|
printk(KERN_ERR "sscape: Failed to register sound card\n");
|
||||||
|
snd_card_free(card);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
sscape_card[sscape_cards] = card;
|
sscape_card[sscape_cards] = card;
|
||||||
params++;
|
params++;
|
||||||
sscape_cards++;
|
sscape_cards++;
|
||||||
|
@ -622,6 +622,11 @@ snd_wavefront_probe (int dev, struct pnp_card_link *pcard,
|
|||||||
ics2115_port[dev],
|
ics2115_port[dev],
|
||||||
ics2115_irq[dev]);
|
ics2115_irq[dev]);
|
||||||
|
|
||||||
|
if ((err = snd_card_set_generic_dev(card)) < 0) {
|
||||||
|
snd_card_free(card);
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
if ((err = snd_card_register(card)) < 0) {
|
if ((err = snd_card_register(card)) < 0) {
|
||||||
snd_card_free(card);
|
snd_card_free(card);
|
||||||
return err;
|
return err;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user