ALSA: usb-audio: separate sync endpoint setting from set_format
authorEldad Zack <eldad@fogrefinery.com>
Sat, 3 Aug 2013 08:50:17 +0000 (10:50 +0200)
committerTakashi Iwai <tiwai@suse.de>
Tue, 6 Aug 2013 08:48:34 +0000 (10:48 +0200)
Setting the sync endpoint currently takes up about half of set_format().
Move it to a dedicated function.
No functional change.

Signed-off-by: Eldad Zack <eldad@fogrefinery.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/usb/pcm.c

index be5c7c2..e24ce7d 100644 (file)
@@ -327,64 +327,17 @@ static int search_roland_implicit_fb(struct usb_device *dev, int ifnum,
        return 0;
 }
 
-/*
- * find a matching format and set up the interface
- */
-static int set_format(struct snd_usb_substream *subs, struct audioformat *fmt)
+
+static int set_sync_endpoint(struct snd_usb_substream *subs,
+                            struct audioformat *fmt,
+                            struct usb_device *dev,
+                            struct usb_host_interface *alts,
+                            struct usb_interface_descriptor *altsd)
 {
-       struct usb_device *dev = subs->dev;
-       struct usb_host_interface *alts;
-       struct usb_interface_descriptor *altsd;
        struct usb_interface *iface;
-       unsigned int ep, attr;
        int is_playback = subs->direction == SNDRV_PCM_STREAM_PLAYBACK;
-       int err, implicit_fb = 0;
-
-       iface = usb_ifnum_to_if(dev, fmt->iface);
-       if (WARN_ON(!iface))
-               return -EINVAL;
-       alts = &iface->altsetting[fmt->altset_idx];
-       altsd = get_iface_desc(alts);
-       if (WARN_ON(altsd->bAlternateSetting != fmt->altsetting))
-               return -EINVAL;
-
-       if (fmt == subs->cur_audiofmt)
-               return 0;
-
-       /* close the old interface */
-       if (subs->interface >= 0 && subs->interface != fmt->iface) {
-               err = usb_set_interface(subs->dev, subs->interface, 0);
-               if (err < 0) {
-                       snd_printk(KERN_ERR "%d:%d:%d: return to setting 0 failed (%d)\n",
-                               dev->devnum, fmt->iface, fmt->altsetting, err);
-                       return -EIO;
-               }
-               subs->interface = -1;
-               subs->altset_idx = 0;
-       }
-
-       /* set interface */
-       if (subs->interface != fmt->iface ||
-           subs->altset_idx != fmt->altset_idx) {
-               err = usb_set_interface(dev, fmt->iface, fmt->altsetting);
-               if (err < 0) {
-                       snd_printk(KERN_ERR "%d:%d:%d: usb_set_interface failed (%d)\n",
-                                  dev->devnum, fmt->iface, fmt->altsetting, err);
-                       return -EIO;
-               }
-               snd_printdd(KERN_INFO "setting usb interface %d:%d\n",
-                               fmt->iface, fmt->altsetting);
-               subs->interface = fmt->iface;
-               subs->altset_idx = fmt->altset_idx;
-
-               snd_usb_set_interface_quirk(dev);
-       }
-
-       subs->data_endpoint = snd_usb_add_endpoint(subs->stream->chip,
-                                                  alts, fmt->endpoint, subs->direction,
-                                                  SND_USB_ENDPOINT_TYPE_DATA);
-       if (!subs->data_endpoint)
-               return -EINVAL;
+       unsigned int ep, attr;
+       int implicit_fb = 0;
 
        /* we need a sync pipe in async OUT or adaptive IN mode */
        /* check the number of EP, since some devices have broken
@@ -479,6 +432,71 @@ add_sync_ep:
                subs->data_endpoint->sync_master = subs->sync_endpoint;
        }
 
+       return 0;
+}
+
+/*
+ * find a matching format and set up the interface
+ */
+static int set_format(struct snd_usb_substream *subs, struct audioformat *fmt)
+{
+       struct usb_device *dev = subs->dev;
+       struct usb_host_interface *alts;
+       struct usb_interface_descriptor *altsd;
+       struct usb_interface *iface;
+       int err;
+
+       iface = usb_ifnum_to_if(dev, fmt->iface);
+       if (WARN_ON(!iface))
+               return -EINVAL;
+       alts = &iface->altsetting[fmt->altset_idx];
+       altsd = get_iface_desc(alts);
+       if (WARN_ON(altsd->bAlternateSetting != fmt->altsetting))
+               return -EINVAL;
+
+       if (fmt == subs->cur_audiofmt)
+               return 0;
+
+       /* close the old interface */
+       if (subs->interface >= 0 && subs->interface != fmt->iface) {
+               err = usb_set_interface(subs->dev, subs->interface, 0);
+               if (err < 0) {
+                       snd_printk(KERN_ERR "%d:%d:%d: return to setting 0 failed (%d)\n",
+                               dev->devnum, fmt->iface, fmt->altsetting, err);
+                       return -EIO;
+               }
+               subs->interface = -1;
+               subs->altset_idx = 0;
+       }
+
+       /* set interface */
+       if (subs->interface != fmt->iface ||
+           subs->altset_idx != fmt->altset_idx) {
+               err = usb_set_interface(dev, fmt->iface, fmt->altsetting);
+               if (err < 0) {
+                       snd_printk(KERN_ERR "%d:%d:%d: usb_set_interface failed (%d)\n",
+                                  dev->devnum, fmt->iface, fmt->altsetting, err);
+                       return -EIO;
+               }
+               snd_printdd(KERN_INFO "setting usb interface %d:%d\n",
+                               fmt->iface, fmt->altsetting);
+               subs->interface = fmt->iface;
+               subs->altset_idx = fmt->altset_idx;
+
+               snd_usb_set_interface_quirk(dev);
+       }
+
+       subs->data_endpoint = snd_usb_add_endpoint(subs->stream->chip,
+                                                  alts, fmt->endpoint, subs->direction,
+                                                  SND_USB_ENDPOINT_TYPE_DATA);
+
+       if (!subs->data_endpoint)
+               return -EINVAL;
+
+       err = set_sync_endpoint(subs, fmt, dev, alts, altsd);
+       if (err < 0)
+               return err;
+
        err = snd_usb_init_pitch(subs->stream->chip, fmt->iface, alts, fmt);
        if (err < 0)
                return err;