2018-11-28 02:21:30 +08:00
|
|
|
From b2c8be8829bba3b065dfa634d9822430db97d16f Mon Sep 17 00:00:00 2001
|
2018-11-01 18:02:22 +08:00
|
|
|
From: Saranya Gopal <saranya.gopal@intel.com>
|
|
|
|
Date: Wed, 12 Sep 2018 01:03:57 +0530
|
2018-11-28 02:21:30 +08:00
|
|
|
Subject: [PATCH 072/743] usbcore: Select UAC3 configuration for audio if
|
2018-11-01 18:02:22 +08:00
|
|
|
present
|
|
|
|
|
|
|
|
USB audio class 3.0 specification introduced many significant
|
|
|
|
changes like
|
|
|
|
- new power domains, support for LPM/L1
|
|
|
|
- new cluster descriptor
|
|
|
|
- new high capability and class-specific string descriptors
|
|
|
|
- BADD profiles
|
|
|
|
- ... and many other things (check spec from link below:
|
|
|
|
http://www.usb.org/developers/docs/devclass_docs/USB_Audio_v3.0.zip)
|
|
|
|
|
|
|
|
Now that UAC3 is supported in linux, choose UAC3
|
|
|
|
configuration for audio if the device supports it.
|
|
|
|
Selecting this configuration will enable the system to
|
|
|
|
save power by leveraging the new power domains and LPM L1
|
|
|
|
capability and also support new codec types and data formats
|
|
|
|
for consumer audio applications.
|
|
|
|
|
|
|
|
Signed-off-by: Saranya Gopal <saranya.gopal@intel.com>
|
|
|
|
Reviewed-by: Felipe Balbi <felipe.balbi@linux.intel.com>
|
|
|
|
---
|
|
|
|
drivers/usb/core/generic.c | 27 +++++++++++++++++++++++++++
|
|
|
|
1 file changed, 27 insertions(+)
|
|
|
|
|
|
|
|
diff --git a/drivers/usb/core/generic.c b/drivers/usb/core/generic.c
|
|
|
|
index bc8242bc4564..df38d5a32e95 100644
|
|
|
|
--- a/drivers/usb/core/generic.c
|
|
|
|
+++ b/drivers/usb/core/generic.c
|
|
|
|
@@ -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 int is_audio(struct usb_interface_descriptor *desc)
|
|
|
|
+{
|
|
|
|
+ return desc->bInterfaceClass == USB_CLASS_AUDIO;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static int 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
|
|
|
|
--
|
2018-11-24 06:33:07 +08:00
|
|
|
2.19.2
|
2018-11-01 18:02:22 +08:00
|
|
|
|