return size & 0x7ff;
 }
 
-static int em28xx_audio_init(struct em28xx *dev)
+static int em28xx_audio_urb_init(struct em28xx *dev)
 {
-       struct em28xx_audio *adev = &dev->adev;
-       struct snd_pcm      *pcm;
-       struct snd_card     *card;
        struct usb_interface *intf;
        struct usb_endpoint_descriptor *e, *ep = NULL;
-       static int          devnr;
-       int                 err, i, ep_size, interval, num_urb, npackets;
+       int                 i, ep_size, interval, num_urb, npackets;
        int                 urb_size, bytes_per_transfer;
        u8 alt;
 
-       if (!dev->has_alsa_audio || dev->audio_ifnum < 0) {
-               /* This device does not support the extension (in this case
-                  the device is expecting the snd-usb-audio module or
-                  doesn't have analog audio support at all) */
-               return 0;
-       }
-
-       em28xx_info("Binding audio extension\n");
-
-       printk(KERN_INFO "em28xx-audio.c: Copyright (C) 2006 Markus "
-                        "Rechberger\n");
-       printk(KERN_INFO
-              "em28xx-audio.c: Copyright (C) 2007-2014 Mauro Carvalho Chehab\n");
-
-       err = snd_card_create(index[devnr], "Em28xx Audio", THIS_MODULE, 0,
-                             &card);
-       if (err < 0)
-               return err;
-
-       spin_lock_init(&adev->slock);
-       adev->sndcard = card;
-       adev->udev = dev->udev;
-
-       err = snd_pcm_new(card, "Em28xx Audio", 0, 0, 1, &pcm);
-       if (err < 0) {
-               snd_card_free(card);
-               return err;
-       }
-
-       snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &snd_em28xx_pcm_capture);
-       pcm->info_flags = 0;
-       pcm->private_data = dev;
-       strcpy(pcm->name, "Empia 28xx Capture");
-
-       snd_card_set_dev(card, &dev->udev->dev);
-       strcpy(card->driver, "Em28xx-Audio");
-       strcpy(card->shortname, "Em28xx Audio");
-       strcpy(card->longname, "Empia Em28xx Audio");
-
-       INIT_WORK(&dev->wq_trigger, audio_trigger);
-
-       if (dev->audio_mode.ac97 != EM28XX_NO_AC97) {
-               em28xx_cvol_new(card, dev, "Video", AC97_VIDEO);
-               em28xx_cvol_new(card, dev, "Line In", AC97_LINE);
-               em28xx_cvol_new(card, dev, "Phone", AC97_PHONE);
-               em28xx_cvol_new(card, dev, "Microphone", AC97_MIC);
-               em28xx_cvol_new(card, dev, "CD", AC97_CD);
-               em28xx_cvol_new(card, dev, "AUX", AC97_AUX);
-               em28xx_cvol_new(card, dev, "PCM", AC97_PCM);
-
-               em28xx_cvol_new(card, dev, "Master", AC97_MASTER);
-               em28xx_cvol_new(card, dev, "Line", AC97_HEADPHONE);
-               em28xx_cvol_new(card, dev, "Mono", AC97_MASTER_MONO);
-               em28xx_cvol_new(card, dev, "LFE", AC97_CENTER_LFE_MASTER);
-               em28xx_cvol_new(card, dev, "Surround", AC97_SURROUND_MASTER);
-       }
-
        if (dev->audio_ifnum)
                alt = 1;
        else
        if (intf->num_altsetting <= alt) {
                em28xx_errdev("alt %d doesn't exist on interface %d\n",
                              dev->audio_ifnum, alt);
-               snd_card_free(card);
                return -ENODEV;
        }
 
 
        if (!ep) {
                em28xx_errdev("Couldn't find an audio endpoint");
-               snd_card_free(card);
                return -ENODEV;
        }
 
                                            sizeof(*dev->adev.transfer_buffer),
                                            GFP_ATOMIC);
        if (!dev->adev.transfer_buffer) {
-               snd_card_free(card);
                return -ENOMEM;
        }
 
        dev->adev.urb = kcalloc(num_urb, sizeof(*dev->adev.urb), GFP_ATOMIC);
        if (!dev->adev.urb) {
-               snd_card_free(card);
                kfree(dev->adev.transfer_buffer);
                return -ENOMEM;
        }
                if (!urb) {
                        em28xx_errdev("usb_alloc_urb failed!\n");
                        em28xx_audio_free_urb(dev);
-                       snd_card_free(card);
                        return -ENOMEM;
                }
                dev->adev.urb[i] = urb;
                if (!buf) {
                        em28xx_errdev("usb_alloc_coherent failed!\n");
                        em28xx_audio_free_urb(dev);
-                       snd_card_free(card);
                        return -ENOMEM;
                }
                dev->adev.transfer_buffer[i] = buf;
                }
        }
 
+       return 0;
+}
+
+static int em28xx_audio_init(struct em28xx *dev)
+{
+       struct em28xx_audio *adev = &dev->adev;
+       struct snd_pcm      *pcm;
+       struct snd_card     *card;
+       static int          devnr;
+       int                 err;
+
+       if (!dev->has_alsa_audio || dev->audio_ifnum < 0) {
+               /* This device does not support the extension (in this case
+                  the device is expecting the snd-usb-audio module or
+                  doesn't have analog audio support at all) */
+               return 0;
+       }
+
+       em28xx_info("Binding audio extension\n");
+
+       printk(KERN_INFO "em28xx-audio.c: Copyright (C) 2006 Markus "
+                        "Rechberger\n");
+       printk(KERN_INFO
+              "em28xx-audio.c: Copyright (C) 2007-2014 Mauro Carvalho Chehab\n");
+
+       err = snd_card_create(index[devnr], "Em28xx Audio", THIS_MODULE, 0,
+                             &card);
+       if (err < 0)
+               return err;
+
+       spin_lock_init(&adev->slock);
+       adev->sndcard = card;
+       adev->udev = dev->udev;
+
+       err = snd_pcm_new(card, "Em28xx Audio", 0, 0, 1, &pcm);
+       if (err < 0) {
+               snd_card_free(card);
+               return err;
+       }
+
+       snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &snd_em28xx_pcm_capture);
+       pcm->info_flags = 0;
+       pcm->private_data = dev;
+       strcpy(pcm->name, "Empia 28xx Capture");
+
+       snd_card_set_dev(card, &dev->udev->dev);
+       strcpy(card->driver, "Em28xx-Audio");
+       strcpy(card->shortname, "Em28xx Audio");
+       strcpy(card->longname, "Empia Em28xx Audio");
+
+       INIT_WORK(&dev->wq_trigger, audio_trigger);
+
+       if (dev->audio_mode.ac97 != EM28XX_NO_AC97) {
+               em28xx_cvol_new(card, dev, "Video", AC97_VIDEO);
+               em28xx_cvol_new(card, dev, "Line In", AC97_LINE);
+               em28xx_cvol_new(card, dev, "Phone", AC97_PHONE);
+               em28xx_cvol_new(card, dev, "Microphone", AC97_MIC);
+               em28xx_cvol_new(card, dev, "CD", AC97_CD);
+               em28xx_cvol_new(card, dev, "AUX", AC97_AUX);
+               em28xx_cvol_new(card, dev, "PCM", AC97_PCM);
+
+               em28xx_cvol_new(card, dev, "Master", AC97_MASTER);
+               em28xx_cvol_new(card, dev, "Line", AC97_HEADPHONE);
+               em28xx_cvol_new(card, dev, "Mono", AC97_MASTER_MONO);
+               em28xx_cvol_new(card, dev, "LFE", AC97_CENTER_LFE_MASTER);
+               em28xx_cvol_new(card, dev, "Surround", AC97_SURROUND_MASTER);
+       }
+
+       err = em28xx_audio_urb_init(dev);
+       if (err) {
+               snd_card_free(card);
+               return -ENODEV;
+       }
+
        err = snd_card_register(card);
        if (err < 0) {
                em28xx_audio_free_urb(dev);