Message ID | 1536694437-25385-1-git-send-email-saranya.gopal@intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [V2] usbcore: Select UAC3 configuration for audio if present | expand |
On Wed, Sep 12, 2018 at 01:03:57AM +0530, saranya.gopal@intel.com wrote: > From: Saranya Gopal <saranya.gopal@intel.com> Any reason you forgot to cc: the usb maintainer? :) > > 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> > --- > Changes from V1: Deleted nested if check for is_uac3_config > > 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 bc8242b..df38d5a 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) bool? > +{ > + return desc->bInterfaceClass == USB_CLASS_AUDIO; > +} > + > +static int is_uac3_config(struct usb_interface_descriptor *desc) bool? thanks, greg k-h
diff --git a/drivers/usb/core/generic.c b/drivers/usb/core/generic.c index bc8242b..df38d5a 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