Merge branch 'topic/snd_card_new-err' into for-linus
[pandora-kernel.git] / sound / isa / opti9xx / opti92x-ad1848.c
index 0797ca4..cd6e60a 100644 (file)
 #include <asm/io.h>
 #include <asm/dma.h>
 #include <sound/core.h>
-#if defined(CS4231) || defined(OPTi93X)
-#include <sound/cs4231.h>
-#else
-#include <sound/ad1848.h>
-#endif /* CS4231 */
+#include <sound/wss.h>
 #include <sound/mpu401.h>
 #include <sound/opl3.h>
 #ifndef OPTi93X
@@ -139,7 +135,7 @@ struct snd_opti9xx {
        unsigned long mc_base_size;
 #ifdef OPTi93X
        unsigned long mc_indir_index;
-       struct snd_cs4231 *codec;
+       struct snd_wss *codec;
 #endif /* OPTi93X */
        unsigned long pwd_reg;
 
@@ -148,9 +144,7 @@ struct snd_opti9xx {
        long wss_base;
        int irq;
        int dma1;
-#if defined(CS4231) || defined(OPTi93X)
        int dma2;
-#endif /* CS4231 || OPTi93X */
 
        long fm_port;
 
@@ -225,9 +219,7 @@ static int __devinit snd_opti9xx_init(struct snd_opti9xx *chip,
        chip->wss_base = -1;
        chip->irq = -1;
        chip->dma1 = -1;
-#if defined(CS4231) || defined (OPTi93X)
        chip->dma2 = -1;
-#endif         /* CS4231 || OPTi93X */
        chip->fm_port = -1;
        chip->mpu_port = -1;
        chip->mpu_irq = -1;
@@ -562,7 +554,7 @@ __skip_mpu:
 
 static irqreturn_t snd_opti93x_interrupt(int irq, void *dev_id)
 {
-       struct snd_cs4231 *codec = dev_id;
+       struct snd_wss *codec = dev_id;
        struct snd_opti9xx *chip = codec->card->private_data;
        unsigned char status;
 
@@ -570,7 +562,7 @@ static irqreturn_t snd_opti93x_interrupt(int irq, void *dev_id)
        if ((status & OPTi93X_IRQ_PLAYBACK) && codec->playback_substream)
                snd_pcm_period_elapsed(codec->playback_substream);
        if ((status & OPTi93X_IRQ_CAPTURE) && codec->capture_substream) {
-               snd_cs4231_overrange(codec);
+               snd_wss_overrange(codec);
                snd_pcm_period_elapsed(codec->capture_substream);
        }
        outb(0x00, OPTi93X_PORT(codec, STATUS));
@@ -691,7 +683,7 @@ static void snd_card_opti9xx_free(struct snd_card *card)
         
        if (chip) {
 #ifdef OPTi93X
-               struct snd_cs4231 *codec = chip->codec;
+               struct snd_wss *codec = chip->codec;
                if (codec && codec->irq > 0) {
                        disable_irq(codec->irq);
                        free_irq(codec->irq, codec);
@@ -706,13 +698,9 @@ static int __devinit snd_opti9xx_probe(struct snd_card *card)
        static long possible_ports[] = {0x530, 0xe80, 0xf40, 0x604, -1};
        int error;
        struct snd_opti9xx *chip = card->private_data;
-#if defined(CS4231) || defined(OPTi93X)
-       struct snd_cs4231 *codec;
+       struct snd_wss *codec;
 #ifdef CS4231
        struct snd_timer *timer;
-#endif
-#else
-       struct snd_ad1848 *codec;
 #endif
        struct snd_pcm *pcm;
        struct snd_rawmidi *rmidi;
@@ -731,54 +719,52 @@ static int __devinit snd_opti9xx_probe(struct snd_card *card)
        chip->dma1 = dma1;
 #if defined(CS4231) || defined(OPTi93X)
        chip->dma2 = dma2;
+#else
+       chip->dma2 = -1;
 #endif
 
        if (chip->wss_base == SNDRV_AUTO_PORT) {
-               if ((chip->wss_base = snd_legacy_find_free_ioport(possible_ports, 4)) < 0) {
+               chip->wss_base = snd_legacy_find_free_ioport(possible_ports, 4);
+               if (chip->wss_base < 0) {
                        snd_printk("unable to find a free WSS port\n");
                        return -EBUSY;
                }
        }
-       if ((error = snd_opti9xx_configure(chip)))
+       error = snd_opti9xx_configure(chip);
+       if (error)
                return error;
 
-#if defined(CS4231) || defined(OPTi93X)
-       if ((error = snd_cs4231_create(card, chip->wss_base + 4, -1,
-                                      chip->irq, chip->dma1, chip->dma2,
-#ifdef CS4231
-                                      CS4231_HW_DETECT, 0,
-#else /* OPTi93x */
-                                      CS4231_HW_OPTI93X, CS4231_HWSHARE_IRQ,
+       error = snd_wss_create(card, chip->wss_base + 4, -1,
+                              chip->irq, chip->dma1, chip->dma2,
+#ifdef OPTi93X
+                              WSS_HW_OPTI93X, WSS_HWSHARE_IRQ,
+#else
+                              WSS_HW_DETECT, 0,
 #endif
-                                      &codec)) < 0)
+                              &codec);
+       if (error < 0)
                return error;
 #ifdef OPTi93X
        chip->codec = codec;
 #endif
-       if ((error = snd_cs4231_pcm(codec, 0, &pcm)) < 0)
+       error = snd_wss_pcm(codec, 0, &pcm);
+       if (error < 0)
                return error;
-       if ((error = snd_cs4231_mixer(codec)) < 0)
+       error = snd_wss_mixer(codec);
+       if (error < 0)
                return error;
 #ifdef CS4231
-       if ((error = snd_cs4231_timer(codec, 0, &timer)) < 0)
+       error = snd_wss_timer(codec, 0, &timer);
+       if (error < 0)
                return error;
-#else /* OPTI93X */
+#endif
+#ifdef OPTi93X
        error = request_irq(chip->irq, snd_opti93x_interrupt,
                            IRQF_DISABLED, DEV_NAME" - WSS", codec);
        if (error < 0) {
                snd_printk(KERN_ERR "opti9xx: can't grab IRQ %d\n", chip->irq);
                return error;
        }
-#endif
-#else
-       if ((error = snd_ad1848_create(card, chip->wss_base + 4,
-                                      chip->irq, chip->dma1,
-                                      AD1848_HW_DETECT, &codec)) < 0)
-               return error;
-       if ((error = snd_ad1848_pcm(codec, 0, &pcm)) < 0)
-               return error;
-       if ((error = snd_ad1848_mixer(codec)) < 0)
-               return error;
 #endif
        strcpy(card->driver, chip->name);
        sprintf(card->shortname, "OPTi %s", card->driver);
@@ -844,15 +830,18 @@ static int __devinit snd_opti9xx_probe(struct snd_card *card)
        return snd_card_register(card);
 }
 
-static struct snd_card *snd_opti9xx_card_new(void)
+static int snd_opti9xx_card_new(struct snd_card **cardp)
 {
        struct snd_card *card;
+       int err;
 
-       card = snd_card_new(index, id, THIS_MODULE, sizeof(struct snd_opti9xx));
-       if (! card)
-               return NULL;
+       err = snd_card_create(index, id, THIS_MODULE,
+                             sizeof(struct snd_opti9xx), &card);
+       if (err < 0)
+               return err;
        card->private_free = snd_card_opti9xx_free;
-       return card;
+       *cardp = card;
+       return 0;
 }
 
 static int __devinit snd_opti9xx_isa_match(struct device *devptr,
@@ -917,9 +906,9 @@ static int __devinit snd_opti9xx_isa_probe(struct device *devptr,
        }
 #endif
 
-       card = snd_opti9xx_card_new();
-       if (! card)
-               return -ENOMEM;
+       error = snd_opti9xx_card_new(&card);
+       if (error < 0)
+               return error;
 
        if ((error = snd_card_opti9xx_detect(card, card->private_data)) < 0) {
                snd_card_free(card);
@@ -964,9 +953,9 @@ static int __devinit snd_opti9xx_pnp_probe(struct pnp_card_link *pcard,
                return -EBUSY;
        if (! isapnp)
                return -ENODEV;
-       card = snd_opti9xx_card_new();
-       if (! card)
-               return -ENOMEM;
+       error = snd_opti9xx_card_new(&card);
+       if (error < 0)
+               return error;
        chip = card->private_data;
 
        hw = snd_card_opti9xx_pnp(chip, pcard, pid);