|
@@ -21,6 +21,7 @@
|
|
|
|
|
|
#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)
|
|
@@ -42,6 +43,16 @@ static int is_activesync(struct usb_interface_descriptor *desc)
|
|
|
&& 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;
|
|
@@ -121,6 +132,22 @@ int usb_choose_configuration(struct usb_device *udev)
|
|
|
#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
|