ALSA: Return proper error code at probe in sound/usb/*
authorTakashi Iwai <tiwai@alsa3.local>
Sun, 28 Dec 2008 15:55:08 +0000 (16:55 +0100)
committerTakashi Iwai <tiwai@suse.de>
Mon, 12 Jan 2009 14:21:55 +0000 (15:21 +0100)
Some drivers in soudn/usb/* don't handle the error code properly
from snd_card_create().  This patch fixes these places.

Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/usb/caiaq/caiaq-device.c
sound/usb/usx2y/us122l.c
sound/usb/usx2y/usbusx2y.c

index 63a2c1d5779b01cac88cac0e4b7ba679c6759866..55a9075cb097371e67a86fd3558e80047f128f1d 100644 (file)
@@ -336,7 +336,7 @@ static void __devinit setup_card(struct snd_usb_caiaqdev *dev)
                log("Unable to set up control system (ret=%d)\n", ret);
 }
 
-static struct snd_card* create_card(struct usb_device* usb_dev)
+static int create_card(struct usb_device* usb_dev, struct snd_card **cardp)
 {
        int devnum;
        int err;
@@ -348,12 +348,12 @@ static struct snd_card* create_card(struct usb_device* usb_dev)
                        break;
 
        if (devnum >= SNDRV_CARDS)
-               return NULL;
+               return -ENODEV;
 
        err = snd_card_create(index[devnum], id[devnum], THIS_MODULE, 
                              sizeof(struct snd_usb_caiaqdev), &card);
        if (err < 0)
-               return NULL;
+               return err;
 
        dev = caiaqdev(card);
        dev->chip.dev = usb_dev;
@@ -363,7 +363,8 @@ static struct snd_card* create_card(struct usb_device* usb_dev)
        spin_lock_init(&dev->spinlock);
        snd_card_set_dev(card, &usb_dev->dev);
 
-       return card;
+       *cardp = card;
+       return 0;
 }
 
 static int __devinit init_card(struct snd_usb_caiaqdev *dev)
@@ -442,10 +443,10 @@ static int __devinit snd_probe(struct usb_interface *intf,
        struct snd_card *card;
        struct usb_device *device = interface_to_usbdev(intf);
        
-       card = create_card(device);
+       ret = create_card(device, &card);
        
-       if (!card)
-               return -ENOMEM;
+       if (ret < 0)
+               return ret;
                        
        usb_set_intfdata(intf, card);
        ret = init_card(caiaqdev(card));
index b21bb475c0ffd7a4b46bc55f1732fa0d58ac220f..98276aafefe605040d7c18cd367fa4aa8096bd5a 100644 (file)
@@ -478,7 +478,7 @@ static bool us122l_create_card(struct snd_card *card)
        return true;
 }
 
-static struct snd_card *usx2y_create_card(struct usb_device *device)
+static int usx2y_create_card(struct usb_device *device, struct snd_card **cardp)
 {
        int             dev;
        struct snd_card *card;
@@ -488,11 +488,11 @@ static struct snd_card *usx2y_create_card(struct usb_device *device)
                if (enable[dev] && !snd_us122l_card_used[dev])
                        break;
        if (dev >= SNDRV_CARDS)
-               return NULL;
+               return -ENODEV;
        err = snd_card_create(index[dev], id[dev], THIS_MODULE,
                              sizeof(struct us122l), &card);
        if (err < 0)
-               return NULL;
+               return err;
        snd_us122l_card_used[US122L(card)->chip.index = dev] = 1;
 
        US122L(card)->chip.dev = device;
@@ -511,46 +511,57 @@ static struct snd_card *usx2y_create_card(struct usb_device *device)
                US122L(card)->chip.dev->devnum
                );
        snd_card_set_dev(card, &device->dev);
-       return card;
+       *cardp = card;
+       return 0;
 }
 
-static void *us122l_usb_probe(struct usb_interface *intf,
-                             const struct usb_device_id *device_id)
+static int us122l_usb_probe(struct usb_interface *intf,
+                           const struct usb_device_id *device_id,
+                           struct snd_card **cardp)
 {
        struct usb_device *device = interface_to_usbdev(intf);
-       struct snd_card *card = usx2y_create_card(device);
+       struct snd_card *card;
+       int err;
 
-       if (!card)
-               return NULL;
+       err = usx2y_create_card(device, &card);
+       if (err < 0)
+               return err;
 
-       if (!us122l_create_card(card) ||
-           snd_card_register(card) < 0) {
+       if (!us122l_create_card(card)) {
                snd_card_free(card);
-               return NULL;
+               return -EINVAL;
+       }
+
+       err = snd_card_register(card);
+       if (err < 0) {
+               snd_card_free(card);
+               return err;
        }
 
        usb_get_dev(device);
-       return card;
+       *cardp = card;
+       return 0;
 }
 
 static int snd_us122l_probe(struct usb_interface *intf,
                            const struct usb_device_id *id)
 {
        struct snd_card *card;
+       int err;
+
        snd_printdd(KERN_DEBUG"%p:%i\n",
                    intf, intf->cur_altsetting->desc.bInterfaceNumber);
        if (intf->cur_altsetting->desc.bInterfaceNumber != 1)
                return 0;
 
-       card = us122l_usb_probe(usb_get_intf(intf), id);
-
-       if (card) {
-               usb_set_intfdata(intf, card);
-               return 0;
+       err = us122l_usb_probe(usb_get_intf(intf), id, &card);
+       if (err < 0) {
+               usb_put_intf(intf);
+               return err;
        }
 
-       usb_put_intf(intf);
-       return -EIO;
+       usb_set_intfdata(intf, card);
+       return 0;
 }
 
 static void snd_us122l_disconnect(struct usb_interface *intf)
index b848a180638529fdb63175ba470a188f1532808b..af8b84954054a12aee12eb95c5732a99616544e1 100644 (file)
@@ -333,7 +333,7 @@ static struct usb_device_id snd_usX2Y_usb_id_table[] = {
        { /* terminator */ }
 };
 
-static struct snd_card *usX2Y_create_card(struct usb_device *device)
+static int usX2Y_create_card(struct usb_device *device, struct snd_card **cardp)
 {
        int             dev;
        struct snd_card *       card;
@@ -343,11 +343,11 @@ static struct snd_card *usX2Y_create_card(struct usb_device *device)
                if (enable[dev] && !snd_usX2Y_card_used[dev])
                        break;
        if (dev >= SNDRV_CARDS)
-               return NULL;
+               return -ENODEV;
        err = snd_card_create(index[dev], id[dev], THIS_MODULE,
                              sizeof(struct usX2Ydev), &card);
        if (err < 0)
-               return NULL;
+               return err;
        snd_usX2Y_card_used[usX2Y(card)->chip.index = dev] = 1;
        card->private_free = snd_usX2Y_card_private_free;
        usX2Y(card)->chip.dev = device;
@@ -365,26 +365,36 @@ static struct snd_card *usX2Y_create_card(struct usb_device *device)
                usX2Y(card)->chip.dev->bus->busnum, usX2Y(card)->chip.dev->devnum
                );
        snd_card_set_dev(card, &device->dev);
-       return card;
+       *cardp = card;
+       return 0;
 }
 
 
-static void *usX2Y_usb_probe(struct usb_device *device, struct usb_interface *intf, const struct usb_device_id *device_id)
+static int usX2Y_usb_probe(struct usb_device *device,
+                          struct usb_interface *intf,
+                          const struct usb_device_id *device_id,
+                          struct snd_card **cardp)
 {
        int             err;
        struct snd_card *       card;
+
+       *cardp = NULL;
        if (le16_to_cpu(device->descriptor.idVendor) != 0x1604 ||
            (le16_to_cpu(device->descriptor.idProduct) != USB_ID_US122 &&
             le16_to_cpu(device->descriptor.idProduct) != USB_ID_US224 &&
-            le16_to_cpu(device->descriptor.idProduct) != USB_ID_US428) ||
-           !(card = usX2Y_create_card(device)))
-               return NULL;
+            le16_to_cpu(device->descriptor.idProduct) != USB_ID_US428))
+               return -EINVAL;
+
+       err = usX2Y_create_card(device, &card);
+       if (err < 0)
+               return err;
        if ((err = usX2Y_hwdep_new(card, device)) < 0  ||
            (err = snd_card_register(card)) < 0) {
                snd_card_free(card);
-               return NULL;
+               return err;
        }
-       return card;
+       *cardp = card;
+       return 0;
 }
 
 /*
@@ -392,13 +402,14 @@ static void *usX2Y_usb_probe(struct usb_device *device, struct usb_interface *in
  */
 static int snd_usX2Y_probe(struct usb_interface *intf, const struct usb_device_id *id)
 {
-       void *chip;
-       chip = usX2Y_usb_probe(interface_to_usbdev(intf), intf, id);
-       if (chip) {
-               usb_set_intfdata(intf, chip);
-               return 0;
-       } else
-               return -EIO;
+       struct snd_card *card;
+       int err;
+
+       err = usX2Y_usb_probe(interface_to_usbdev(intf), intf, id, &card);
+       if (err < 0)
+               return err;
+       dev_set_drvdata(&intf->dev, card);
+       return 0;
 }
 
 static void snd_usX2Y_disconnect(struct usb_interface *intf)