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

Commit 43bcd973 authored by Takashi Iwai's avatar Takashi Iwai Committed by Jaroslav Kysela
Browse files

[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: default avatarTakashi Iwai <tiwai@suse.de>
parent 16dab54b
Loading
Loading
Loading
Loading
+13 −5
Original line number Diff line number Diff line
@@ -6,12 +6,12 @@ menu "ISA devices"
config SND_AD1848_LIB
        tristate
        select SND_PCM
	select SND_GENERIC_PM
	select SND_GENERIC_DRIVER

config SND_CS4231_LIB
        tristate
        select SND_PCM
	select SND_GENERIC_PM
	select SND_GENERIC_DRIVER

config SND_AD1816A
	tristate "Analog Devices SoundPort AD1816A"
@@ -97,6 +97,7 @@ config SND_ES1688
	select SND_OPL3_LIB
	select SND_MPU401_UART
	select SND_PCM
	select SND_GENERIC_DRIVER
	help
	  Say Y here to include support for ESS AudioDrive ES688 or
	  ES1688 chips.
@@ -110,7 +111,7 @@ config SND_ES18XX
	select SND_OPL3_LIB
	select SND_MPU401_UART
	select SND_PCM
	select SND_GENERIC_PM
	select SND_GENERIC_DRIVER
	help
	  Say Y here to include support for ESS AudioDrive ES18xx chips.

@@ -126,6 +127,7 @@ config SND_GUSCLASSIC
	select SND_RAWMIDI
	select SND_PCM
	select SND_GUS_SYNTH
	select SND_GENERIC_DRIVER
	help
	  Say Y here to include support for Gravis UltraSound Classic
	  soundcards.
@@ -140,6 +142,7 @@ config SND_GUSEXTREME
	select SND_MPU401_UART
	select SND_PCM
	select SND_GUS_SYNTH
	select SND_GENERIC_DRIVER
	help
	  Say Y here to include support for Gravis UltraSound Extreme
	  soundcards.
@@ -153,6 +156,7 @@ config SND_GUSMAX
	select SND_RAWMIDI
	select SND_CS4231_LIB
	select SND_GUS_SYNTH
	select SND_GENERIC_DRIVER
	help
	  Say Y here to include support for Gravis UltraSound MAX
	  soundcards.
@@ -166,7 +170,7 @@ config SND_INTERWAVE
	select SND_RAWMIDI
	select SND_CS4231_LIB
	select SND_GUS_SYNTH
	select ISAPNP
	select SND_GENERIC_DRIVER
	help
	  Say Y here to include support for AMD InterWave based
	  soundcards (Gravis UltraSound Plug & Play, STB SoundRage32,
@@ -181,7 +185,7 @@ config SND_INTERWAVE_STB
	select SND_RAWMIDI
	select SND_CS4231_LIB
	select SND_GUS_SYNTH
	select ISAPNP
	select SND_GENERIC_DRIVER
	help
	  Say Y here to include support for AMD InterWave based
	  soundcards with a TEA6330T bass and treble regulator
@@ -224,6 +228,7 @@ config SND_OPTI93X
	select SND_OPL3_LIB
	select SND_MPU401_UART
	select SND_PCM
	select SND_GENERIC_DRIVER
	help
	  Say Y here to include support for soundcards based on Opti
	  82C93x chips.
@@ -237,6 +242,7 @@ config SND_SB8
	select SND_OPL3_LIB
	select SND_RAWMIDI
	select SND_PCM
	select SND_GENERIC_DRIVER
	help
	  Say Y here to include support for Creative Sound Blaster 1.0/
	  2.0/Pro (8-bit) or 100% compatible soundcards.
@@ -250,6 +256,7 @@ config SND_SB16
	select SND_OPL3_LIB
	select SND_MPU401_UART
	select SND_PCM
	select SND_GENERIC_DRIVER
	help
	  Say Y here to include support for Sound Blaster 16 soundcards
	  (including the Plug and Play version).
@@ -263,6 +270,7 @@ config SND_SBAWE
	select SND_OPL3_LIB
	select SND_MPU401_UART
	select SND_PCM
	select SND_GENERIC_DRIVER
	help
	  Say Y here to include support for Sound Blaster AWE soundcards
	  (including the Plug and Play version).
+19 −18
Original line number Diff line number Diff line
@@ -91,35 +91,36 @@ static int __init snd_card_ad1848_probe(int dev)
				     irq[dev],
				     dma1[dev],
				     thinkpad[dev] ? AD1848_HW_THINKPAD : AD1848_HW_DETECT,
				     &chip)) < 0) {
		snd_card_free(card);
		return err;
	}
				     &chip)) < 0)
		goto _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->shortname, pcm->name);

	sprintf(card->longname, "%s at 0x%lx, irq %d, dma %d",
		pcm->name, chip->port, irq[dev], dma1[dev]);

	if (thinkpad[dev]) {
	if (thinkpad[dev])
		strcat(card->longname, " [Thinkpad]");
	}

	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_ad1848_cards[dev] = card;
	return 0;

 _err:
	snd_card_free(card);
	return err;
}

static int __init alsa_card_ad1848_init(void)
+38 −39
Original line number Diff line number Diff line
@@ -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,
				       struct pnp_card_link *pcard,
				       const struct pnp_card_device_id *pid)
{
	snd_card_t *card;
	struct snd_cmi8330 *acard;
	unsigned long flags;
	int i, err;

#ifdef CONFIG_PNP
	if (!isapnp[dev]) {
#endif
	if (! is_isapnp_selected(dev)) {
		if (wssport[dev] == SNDRV_AUTO_PORT) {
			snd_printk("specify wssport\n");
			snd_printk(KERN_ERR PFX "specify wssport\n");
			return -EINVAL;
		}
		if (sbport[dev] == SNDRV_AUTO_PORT) {
			snd_printk("specify sbport\n");
			snd_printk(KERN_ERR PFX "specify sbport\n");
			return -EINVAL;
		}
#ifdef CONFIG_PNP
	}
#endif

	card = snd_card_new(index[dev], id[dev], THIS_MODULE,
			    sizeof(struct snd_cmi8330));
	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;
	}
	acard = (struct snd_cmi8330 *)card->private_data;
@@ -473,9 +477,8 @@ static int __devinit snd_cmi8330_probe(int dev,
#ifdef CONFIG_PNP
	if (isapnp[dev]) {
		if ((err = snd_cmi8330_pnp(dev, acard, pcard, pid)) < 0) {
			snd_printk("PnP detection failed\n");
			snd_card_free(card);
			return err;
			snd_printk(KERN_ERR PFX "PnP detection failed\n");
			goto _err;
		}
		snd_card_set_dev(card, &pcard->card->dev);
	}
@@ -487,14 +490,13 @@ static int __devinit snd_cmi8330_probe(int dev,
				     wssdma[dev],
				     AD1848_HW_DETECT,
				     &acard->wss)) < 0) {
		snd_printk("(AD1848) device busy??\n");
		snd_card_free(card);
		return err;
		snd_printk(KERN_ERR PFX "(AD1848) device busy??\n");
		goto _err;
	}
	if (acard->wss->hardware != AD1848_HW_CMI8330) {
		snd_printk("(AD1848) not found during probe\n");
		snd_card_free(card);
		return -ENODEV;
		snd_printk(KERN_ERR PFX "(AD1848) not found during probe\n");
		err = -ENODEV;
		goto _err;
	}

	if ((err = snd_sbdsp_create(card, sbport[dev],
@@ -503,32 +505,26 @@ static int __devinit snd_cmi8330_probe(int dev,
				    sbdma8[dev],
				    sbdma16[dev],
				    SB_HW_AUTO, &acard->sb)) < 0) {
		snd_printk("(SB16) device busy??\n");
		snd_card_free(card);
		return err;
		snd_printk(KERN_ERR PFX "(SB16) device busy??\n");
		goto _err;
	}
	if (acard->sb->hardware != SB_HW_16) {
		snd_printk("(SB16) not found during probe\n");
		snd_card_free(card);
		return -ENODEV;
		snd_printk(KERN_ERR PFX "(SB16) not found during probe\n");
		goto _err;
	}

	spin_lock_irqsave(&acard->wss->reg_lock, flags);
	snd_ad1848_out(acard->wss, AD1848_MISC_INFO, 0x40); /* switch on MODE2 */
	for (i = CMI8330_RMUX3D; i <= CMI8330_CDINGAIN; i++)
		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) {
		snd_printk("failed to create mixers\n");
		snd_card_free(card);
		return err;
		snd_printk(KERN_ERR PFX "failed to create mixers\n");
		goto _err;
	}

	if ((err = snd_cmi8330_pcm(card, acard)) < 0) {
		snd_printk("failed to create pcms\n");
		snd_card_free(card);
		return err;
		snd_printk(KERN_ERR PFX "failed to create pcms\n");
		goto _err;
	}

	strcpy(card->driver, "CMI8330/C3D");
@@ -539,16 +535,21 @@ static int __devinit snd_cmi8330_probe(int dev,
		wssirq[dev],
		wssdma[dev]);

	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)
		pnp_set_card_drvdata(pcard, card);
	else
		snd_cmi8330_legacy[dev] = card;
	return 0;

 _err:
	snd_card_free(card);
	return err;
}

#ifdef CONFIG_PNP
@@ -594,10 +595,8 @@ static int __init alsa_card_cmi8330_init(void)
	for (dev = 0; dev < SNDRV_CARDS; dev++) {
		if (!enable[dev])
			continue;
#ifdef CONFIG_PNP
		if (isapnp[dev])
		if (is_isapnp_selected(dev))
			continue;
#endif
		if (snd_cmi8330_probe(dev, NULL, NULL) >= 0)
			cards++;
	}
+22 −24
Original line number Diff line number Diff line
@@ -76,15 +76,15 @@ static int __init snd_card_cs4231_probe(int dev)
	int err;

	if (port[dev] == SNDRV_AUTO_PORT) {
		snd_printk("specify port\n");
		snd_printk(KERN_ERR "specify port\n");
		return -EINVAL;
	}
	if (irq[dev] == SNDRV_AUTO_IRQ) {
		snd_printk("specify irq\n");
		snd_printk(KERN_ERR "specify irq\n");
		return -EINVAL;
	}
	if (dma1[dev] == SNDRV_AUTO_DMA) {
		snd_printk("specify dma1\n");
		snd_printk(KERN_ERR "specify dma1\n");
		return -EINVAL;
	}
	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],
				     dma2[dev],
				     CS4231_HW_DETECT,
				     0, &chip)) < 0) {
		snd_card_free(card);
		return err;
	}
				     0, &chip)) < 0)
		goto _err;

	if ((err = snd_cs4231_pcm(chip, 0, &pcm)) < 0) {
		snd_card_free(card);
		return err;
	}
	if ((err = snd_cs4231_pcm(chip, 0, &pcm)) < 0)
		goto _err;

	strcpy(card->driver, "CS4231");
	strcpy(card->shortname, pcm->name);
@@ -113,14 +109,10 @@ static int __init snd_card_cs4231_probe(int dev)
	if (dma2[dev] >= 0)
		sprintf(card->longname + strlen(card->longname), "&%d", dma2[dev]);

	if ((err = snd_cs4231_mixer(chip)) < 0) {
		snd_card_free(card);
		return err;
	}
	if ((err = snd_cs4231_timer(chip, 0, NULL)) < 0) {
		snd_card_free(card);
		return err;
	}
	if ((err = snd_cs4231_mixer(chip)) < 0)
		goto _err;
	if ((err = snd_cs4231_timer(chip, 0, NULL)) < 0)
		goto _err;

	if (mpu_port[dev] > 0 && mpu_port[dev] != SNDRV_AUTO_PORT) {
		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] >= 0 ? SA_INTERRUPT : 0,
					NULL) < 0)
			printk(KERN_ERR "cs4231: MPU401 not detected\n");
	}
	if ((err = snd_card_register(card)) < 0) {
		snd_card_free(card);
		return err;
			printk(KERN_WARNING "cs4231: MPU401 not detected\n");
	}

	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;
	return 0;

 _err:
	snd_card_free(card);
	return err;
}

static int __init alsa_card_cs4231_init(void)
+45 −52
Original line number Diff line number Diff line
@@ -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,
					   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;
	int err;

#ifdef CONFIG_PNP
	if (!isapnp[dev]) {
#endif
	if (! is_isapnp_selected(dev)) {
		if (port[dev] == SNDRV_AUTO_PORT) {
			snd_printk("specify port\n");
			snd_printk(KERN_ERR "specify port\n");
			return -EINVAL;
		}
		if (cport[dev] == SNDRV_AUTO_PORT) {
			snd_printk("specify cport\n");
			snd_printk(KERN_ERR "specify cport\n");
			return -EINVAL;
		}
#ifdef CONFIG_PNP
	}
#endif
	card = snd_card_new(index[dev], id[dev], THIS_MODULE,
			    sizeof(struct snd_card_cs4236));
	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 ((err = snd_card_cs4236_pnp(dev, acard, pcard, pid))<0) {
			printk(KERN_ERR "isapnp detection failed and probing for " IDENT " is not supported\n");
			snd_card_free(card);
			return -ENXIO;
			goto _err;
		}
		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 ((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]);
			snd_card_free(card);
			return -ENOMEM;
			err = -EBUSY;
			goto _err;
		}

#ifdef CS4232
@@ -443,18 +444,14 @@ static int __devinit snd_card_cs423x_probe(int dev, struct pnp_card_link *pcard,
				     dma2[dev],
				     CS4231_HW_DETECT,
				     0,
				     &chip)) < 0) {
		snd_card_free(card);
		return err;
	}
	if ((err = snd_cs4231_pcm(chip, 0, &pcm)) < 0) {
		snd_card_free(card);
		return err;
	}
	if ((err = snd_cs4231_mixer(chip)) < 0) {
		snd_card_free(card);
		return err;
	}
				     &chip)) < 0)
		goto _err;

	if ((err = snd_cs4231_pcm(chip, 0, &pcm)) < 0)
		goto _err;

	if ((err = snd_cs4231_mixer(chip)) < 0)
		goto _err;

#else /* CS4236 */
	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],
				     CS4231_HW_DETECT,
				     0,
				     &chip)) < 0) {
		snd_card_free(card);
		return err;
	}
	if ((err = snd_cs4236_pcm(chip, 0, &pcm)) < 0) {
		snd_card_free(card);
		return err;
	}
	if ((err = snd_cs4236_mixer(chip)) < 0) {
		snd_card_free(card);
		return err;
	}
				     &chip)) < 0)
		goto _err;

	if ((err = snd_cs4236_pcm(chip, 0, &pcm)) < 0)
		goto _err;

	if ((err = snd_cs4236_mixer(chip)) < 0)
		goto _err;
#endif
	strcpy(card->driver, 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)
		sprintf(card->longname + strlen(card->longname), "&%d", dma2[dev]);

	if ((err = snd_cs4231_timer(chip, 0, NULL)) < 0) {
		snd_card_free(card);
		return err;
	}
	if ((err = snd_cs4231_timer(chip, 0, NULL)) < 0)
		goto _err;

	if (fm_port[dev] > 0 && fm_port[dev] != SNDRV_AUTO_PORT) {
		if (snd_opl3_create(card,
				    fm_port[dev], fm_port[dev] + 2,
				    OPL3_HW_OPL3_CS, 0, &opl3) < 0) {
			printk(KERN_ERR IDENT ": OPL3 not detected\n");
			printk(KERN_WARNING IDENT ": OPL3 not detected\n");
		} else {
			if ((err = snd_opl3_hwdep_new(opl3, 0, 1, NULL)) < 0) {
				snd_card_free(card);
				return err;
			}
			if ((err = snd_opl3_hwdep_new(opl3, 0, 1, NULL)) < 0)
				goto _err;
		}
	}

@@ -513,17 +502,23 @@ static int __devinit snd_card_cs423x_probe(int dev, struct pnp_card_link *pcard,
					mpu_port[dev], 0,
					mpu_irq[dev],
					mpu_irq[dev] >= 0 ? SA_INTERRUPT : 0, NULL) < 0)
			printk(KERN_ERR IDENT ": MPU401 not detected\n");
	}
	if ((err = snd_card_register(card)) < 0) {
		snd_card_free(card);
		return err;
			printk(KERN_WARNING IDENT ": MPU401 not detected\n");
	}

	if ((err = snd_card_set_generic_dev(card)) < 0)
		goto _err;

	if ((err = snd_card_register(card)) < 0)
		goto _err;
	if (pcard)
		pnp_set_card_drvdata(pcard, card);
	else
		snd_cs4236_legacy[dev] = card;
	return 0;

 _err:
	snd_card_free(card);
	return err;
}

#ifdef CONFIG_PNP
@@ -569,10 +564,8 @@ static int __init alsa_card_cs423x_init(void)
	for (dev = 0; dev < SNDRV_CARDS; dev++) {
		if (!enable[dev])
			continue;
#ifdef CONFIG_PNP
		if (isapnp[dev])
		if (is_isapnp_selected(dev))
			continue;
#endif
		if (snd_card_cs423x_probe(dev, NULL, NULL) >= 0)
			cards++;
	}
Loading