ALSA: usb-audio: Add snd_usb_get_endpoint() helper
authorTakashi Iwai <tiwai@suse.de>
Mon, 23 Nov 2020 08:53:11 +0000 (09:53 +0100)
committerTakashi Iwai <tiwai@suse.de>
Mon, 23 Nov 2020 14:11:56 +0000 (15:11 +0100)
Factor out the code to obtain snd_usb_endpoint object matching with
the given endpoint.  It'll be used in the later patch to add the
implicit feedback hw-constraint.

No functional change by this patch itself.

Tested-by: Keith Milner <kamilner@superlative.org>
Tested-by: Dylan Robinson <dylan_robinson@motu.com>
Link: https://lore.kernel.org/r/20201123085347.19667-6-tiwai@suse.de
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/usb/endpoint.c
sound/usb/endpoint.h

index e2f9ce2..cf00871 100644 (file)
@@ -439,6 +439,26 @@ exit_clear:
        clear_bit(ctx->index, &ep->active_mask);
 }
 
+/*
+ * Get the existing endpoint object corresponding EP, iface and alt numbers
+ * Returns NULL if not present.
+ * Call inside chip->mutex locking for avoiding the race.
+ */
+struct snd_usb_endpoint *
+snd_usb_get_endpoint(struct snd_usb_audio *chip,
+                    int ep_num, int iface, int altsetting)
+{
+       struct snd_usb_endpoint *ep;
+
+       list_for_each_entry(ep, &chip->ep_list, list) {
+               if (ep->ep_num == ep_num &&
+                   ep->iface == iface &&
+                   ep->altsetting == altsetting)
+                       return ep;
+       }
+       return NULL;
+}
+
 /**
  * snd_usb_add_endpoint: Add an endpoint to an USB audio chip
  *
@@ -470,15 +490,13 @@ struct snd_usb_endpoint *snd_usb_add_endpoint(struct snd_usb_audio *chip,
 
        mutex_lock(&chip->mutex);
 
-       list_for_each_entry(ep, &chip->ep_list, list) {
-               if (ep->ep_num == ep_num &&
-                   ep->iface == alts->desc.bInterfaceNumber &&
-                   ep->altsetting == alts->desc.bAlternateSetting) {
-                       usb_audio_dbg(ep->chip,
-                                     "Re-using EP %x in iface %d,%d @%p\n",
-                                       ep_num, ep->iface, ep->altsetting, ep);
-                       goto __exit_unlock;
-               }
+       ep = snd_usb_get_endpoint(chip, ep_num,
+                                 alts->desc.bInterfaceNumber,
+                                 alts->desc.bAlternateSetting);
+       if (ep) {
+               usb_audio_dbg(ep->chip, "Re-using EP %x in iface %d,%d @%p\n",
+                             ep_num, ep->iface, ep->altsetting, ep);
+               goto __exit_unlock;
        }
 
        usb_audio_dbg(chip, "Creating new %s %s endpoint #%x\n",
index d23fa0a..6148709 100644 (file)
@@ -5,6 +5,10 @@
 #define SND_USB_ENDPOINT_TYPE_DATA     0
 #define SND_USB_ENDPOINT_TYPE_SYNC     1
 
+struct snd_usb_endpoint *snd_usb_get_endpoint(struct snd_usb_audio *chip,
+                                             int ep_num, int iface,
+                                             int altsetting);
+
 struct snd_usb_endpoint *snd_usb_add_endpoint(struct snd_usb_audio *chip,
                                              struct usb_host_interface *alts,
                                              int ep_num, int direction, int type);