#include <linux/usb.h>
 #include <linux/usb/hcd.h>
+#include <uapi/linux/usb/audio.h>
 #include "usb.h"
 
 static inline const char *plural(int n)
                && desc->bInterfaceProtocol == 1;
 }
 
+static bool is_audio(struct usb_interface_descriptor *desc)
+{
+       return desc->bInterfaceClass == USB_CLASS_AUDIO;
+}
+
+static bool is_uac3_config(struct usb_interface_descriptor *desc)
+{
+       return desc->bInterfaceProtocol == UAC_VERSION_3;
+}
+
 int usb_choose_configuration(struct usb_device *udev)
 {
        int i;
 #endif
                }
 
+               /*
+                * Select first configuration as default for audio so that
+                * devices that don't comply with UAC3 protocol are supported.
+                * But, still iterate through other configurations and
+                * select UAC3 compliant config if present.
+                */
+               if (i == 0 && num_configs > 1 && desc && is_audio(desc)) {
+                       best = c;
+                       continue;
+               }
+
+               if (i > 0 && desc && is_audio(desc) && is_uac3_config(desc)) {
+                       best = c;
+                       break;
+               }
+
                /* From the remaining configs, choose the first one whose
                 * first interface is for a non-vendor-specific class.
                 * Reason: Linux is more likely to have a class driver