static int __devinit snd_ad1848_probe(struct device *dev, unsigned int n) { struct snd_card *card; struct snd_ad1848 *chip; struct snd_pcm *pcm; int error; card = snd_card_new(index[n], id[n], THIS_MODULE, 0); if (!card) return -EINVAL; error = snd_ad1848_create(card, port[n], irq[n], dma1[n], thinkpad[n] ? AD1848_HW_THINKPAD : AD1848_HW_DETECT, &chip); if (error < 0) goto out; card->private_data = chip; error = snd_ad1848_pcm(chip, 0, &pcm); if (error < 0) goto out; error = snd_ad1848_mixer(chip); if (error < 0) goto out; 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[n], dma1[n]); if (thinkpad[n]) strcat(card->longname, " [Thinkpad]"); snd_card_set_dev(card, dev); error = snd_card_register(card); if (error < 0) goto out; dev_set_drvdata(dev, card); return 0; out: snd_card_free(card); return error; }
static int __devinit snd_sc6000_probe(struct device *devptr, unsigned int dev) { static int possible_irqs[] = { 5, 7, 9, 10, 11, -1 }; static int possible_dmas[] = { 1, 3, 0, -1 }; int err; int xirq = irq[dev]; int xdma = dma[dev]; struct snd_card *card; struct snd_ad1848 *chip; struct snd_opl3 *opl3; char __iomem *vport; char __iomem *vmss_port; card = snd_card_new(index[dev], id[dev], THIS_MODULE, 0); if (!card) return -ENOMEM; if (xirq == SNDRV_AUTO_IRQ) { xirq = snd_legacy_find_free_irq(possible_irqs); if (xirq < 0) { snd_printk(KERN_ERR PFX "unable to find a free IRQ\n"); err = -EBUSY; goto err_exit; } } if (xdma == SNDRV_AUTO_DMA) { xdma = snd_legacy_find_free_dma(possible_dmas); if (xdma < 0) { snd_printk(KERN_ERR PFX "unable to find a free DMA\n"); err = -EBUSY; goto err_exit; } } if (!request_region(port[dev], 0x10, DRV_NAME)) { snd_printk(KERN_ERR PFX "I/O port region is already in use.\n"); err = -EBUSY; goto err_exit; } vport = devm_ioport_map(devptr, port[dev], 0x10); if (!vport) { snd_printk(KERN_ERR PFX "I/O port cannot be iomaped.\n"); err = -EBUSY; goto err_unmap1; } /* to make it marked as used */ if (!request_region(mss_port[dev], 4, DRV_NAME)) { snd_printk(KERN_ERR PFX "SC-6000 port I/O port region is already in use.\n"); err = -EBUSY; goto err_unmap1; } vmss_port = devm_ioport_map(devptr, mss_port[dev], 4); if (!vport) { snd_printk(KERN_ERR PFX "MSS port I/O cannot be iomaped.\n"); err = -EBUSY; goto err_unmap2; } snd_printd("Initializing BASE[0x%lx] IRQ[%d] DMA[%d] MIRQ[%d]\n", port[dev], xirq, xdma, mpu_irq[dev] == SNDRV_AUTO_IRQ ? 0 : mpu_irq[dev]); err = sc6000_init_board(vport, xirq, xdma, vmss_port, mpu_irq[dev]); if (err < 0) goto err_unmap2; err = snd_ad1848_create(card, mss_port[dev] + 4, xirq, xdma, AD1848_HW_DETECT, &chip); if (err < 0) goto err_unmap2; card->private_data = chip; err = snd_ad1848_pcm(chip, 0, NULL); if (err < 0) { snd_printk(KERN_ERR PFX "error creating new ad1848 PCM device\n"); goto err_unmap2; } err = snd_ad1848_mixer(chip); if (err < 0) { snd_printk(KERN_ERR PFX "error creating new ad1848 mixer\n"); goto err_unmap2; } err = snd_sc6000_mixer(chip); if (err < 0) { snd_printk(KERN_ERR PFX "the mixer rewrite failed\n"); goto err_unmap2; } if (snd_opl3_create(card, 0x388, 0x388 + 2, OPL3_HW_AUTO, 0, &opl3) < 0) { snd_printk(KERN_ERR PFX "no OPL device at 0x%x-0x%x ?\n", 0x388, 0x388 + 2); } else { err = snd_opl3_timer_new(opl3, 0, 1); if (err < 0) goto err_unmap2; err = snd_opl3_hwdep_new(opl3, 0, 1, NULL); if (err < 0) goto err_unmap2; } if (mpu_port[dev] != SNDRV_AUTO_PORT) { if (mpu_irq[dev] == SNDRV_AUTO_IRQ) mpu_irq[dev] = -1; if (snd_mpu401_uart_new(card, 0, MPU401_HW_MPU401, mpu_port[dev], 0, mpu_irq[dev], IRQF_DISABLED, NULL) < 0) snd_printk(KERN_ERR "no MPU-401 device at 0x%lx ?\n", mpu_port[dev]); } strcpy(card->driver, DRV_NAME); strcpy(card->shortname, "SC-6000"); sprintf(card->longname, "Gallant SC-6000 at 0x%lx, irq %d, dma %d", mss_port[dev], xirq, xdma); snd_card_set_dev(card, devptr); err = snd_card_register(card); if (err < 0) goto err_unmap2; dev_set_drvdata(devptr, card); return 0; err_unmap2: release_region(mss_port[dev], 4); err_unmap1: release_region(port[dev], 0x10); err_exit: snd_card_free(card); return err; }
static int __init snd_sgalaxy_probe(int dev) { static int possible_irqs[] = {7, 9, 10, 11, -1}; static int possible_dmas[] = {1, 3, 0, -1}; int err, xirq, xdma1; snd_card_t *card; ad1848_t *chip; if (sbport[dev] == SNDRV_AUTO_PORT) { snd_printk("specify SB port\n"); return -EINVAL; } if (wssport[dev] == SNDRV_AUTO_PORT) { snd_printk("specify WSS port\n"); return -EINVAL; } card = snd_card_new(index[dev], id[dev], THIS_MODULE, 0); if (card == NULL) return -ENOMEM; xirq = irq[dev]; if (xirq == SNDRV_AUTO_IRQ) { if ((xirq = snd_legacy_find_free_irq(possible_irqs)) < 0) { snd_card_free(card); snd_printk("unable to find a free IRQ\n"); return -EBUSY; } } xdma1 = dma1[dev]; if (xdma1 == SNDRV_AUTO_DMA) { if ((xdma1 = snd_legacy_find_free_dma(possible_dmas)) < 0) { snd_card_free(card); snd_printk("unable to find a free DMA\n"); return -EBUSY; } } if ((err = snd_sgalaxy_detect(dev, xirq, xdma1)) < 0) { snd_card_free(card); return err; } if ((err = snd_ad1848_create(card, wssport[dev] + 4, xirq, xdma1, AD1848_HW_DETECT, &chip)) < 0) { snd_card_free(card); return err; } if ((err = snd_ad1848_pcm(chip, 0, NULL)) < 0) { snd_printdd("sgalaxy - error creating new ad1848 PCM device\n"); snd_card_free(card); return err; } if ((err = snd_ad1848_mixer(chip)) < 0) { snd_printdd("sgalaxy - error creating new ad1848 mixer\n"); snd_card_free(card); return err; } if (snd_sgalaxy_mixer(chip) < 0) { snd_printdd("sgalaxy - the mixer rewrite failed\n"); snd_card_free(card); return err; } strcpy(card->driver, "Sound Galaxy"); strcpy(card->shortname, "Sound Galaxy"); sprintf(card->longname, "Sound Galaxy at 0x%lx, irq %d, dma %d", wssport[dev], xirq, xdma1); if ((err = snd_card_register(card)) < 0) { snd_card_free(card); return err; } snd_sgalaxy_cards[dev] = card; return 0; }
static int __init snd_sgalaxy_probe(struct platform_device *devptr) { int dev = devptr->id; static int possible_irqs[] = {7, 9, 10, 11, -1}; static int possible_dmas[] = {1, 3, 0, -1}; int err, xirq, xdma1; struct snd_card *card; struct snd_ad1848 *chip; if (sbport[dev] == SNDRV_AUTO_PORT) { snd_printk(KERN_ERR PFX "specify SB port\n"); return -EINVAL; } if (wssport[dev] == SNDRV_AUTO_PORT) { snd_printk(KERN_ERR PFX "specify WSS port\n"); return -EINVAL; } card = snd_card_new(index[dev], id[dev], THIS_MODULE, 0); if (card == NULL) return -ENOMEM; xirq = irq[dev]; if (xirq == SNDRV_AUTO_IRQ) { if ((xirq = snd_legacy_find_free_irq(possible_irqs)) < 0) { snd_printk(KERN_ERR PFX "unable to find a free IRQ\n"); err = -EBUSY; goto _err; } } xdma1 = dma1[dev]; if (xdma1 == SNDRV_AUTO_DMA) { if ((xdma1 = snd_legacy_find_free_dma(possible_dmas)) < 0) { snd_printk(KERN_ERR PFX "unable to find a free DMA\n"); err = -EBUSY; goto _err; } } if ((err = snd_sgalaxy_detect(dev, xirq, xdma1)) < 0) goto _err; if ((err = snd_ad1848_create(card, wssport[dev] + 4, xirq, xdma1, AD1848_HW_DETECT, &chip)) < 0) goto _err; card->private_data = chip; if ((err = snd_ad1848_pcm(chip, 0, NULL)) < 0) { snd_printdd(PFX "error creating new ad1848 PCM device\n"); goto _err; } if ((err = snd_ad1848_mixer(chip)) < 0) { snd_printdd(PFX "error creating new ad1848 mixer\n"); goto _err; } if ((err = snd_sgalaxy_mixer(chip)) < 0) { snd_printdd(PFX "the mixer rewrite failed\n"); goto _err; } strcpy(card->driver, "Sound Galaxy"); strcpy(card->shortname, "Sound Galaxy"); sprintf(card->longname, "Sound Galaxy at 0x%lx, irq %d, dma %d", wssport[dev], xirq, xdma1); snd_card_set_dev(card, &devptr->dev); if ((err = snd_card_register(card)) < 0) goto _err; platform_set_drvdata(devptr, card); return 0; _err: snd_card_free(card); return err; }