Commit f13912d3 authored by Saranya Gopal's avatar Saranya Gopal Committed by Greg Kroah-Hartman

usbcore: Select UAC3 configuration for audio if 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: default avatarSaranya Gopal <saranya.gopal@intel.com>
Reviewed-by: default avatarFelipe Balbi <felipe.balbi@linux.intel.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 28da90f1
...@@ -21,6 +21,7 @@ ...@@ -21,6 +21,7 @@
#include <linux/usb.h> #include <linux/usb.h>
#include <linux/usb/hcd.h> #include <linux/usb/hcd.h>
#include <uapi/linux/usb/audio.h>
#include "usb.h" #include "usb.h"
static inline const char *plural(int n) static inline const char *plural(int n)
...@@ -42,6 +43,16 @@ static int is_activesync(struct usb_interface_descriptor *desc) ...@@ -42,6 +43,16 @@ static int is_activesync(struct usb_interface_descriptor *desc)
&& desc->bInterfaceProtocol == 1; && 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 usb_choose_configuration(struct usb_device *udev)
{ {
int i; int i;
...@@ -121,6 +132,22 @@ int usb_choose_configuration(struct usb_device *udev) ...@@ -121,6 +132,22 @@ int usb_choose_configuration(struct usb_device *udev)
#endif #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 /* From the remaining configs, choose the first one whose
* first interface is for a non-vendor-specific class. * first interface is for a non-vendor-specific class.
* Reason: Linux is more likely to have a class driver * Reason: Linux is more likely to have a class driver
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment