On Tue, Dec 05, 2017 at 04:14:24PM +0000, Michael Drake wrote: > UAC1 and UAC2 have different different meanings for the same subtype > value. This splits the subtype mapping out. > --- Minor nit, can you sign-off on your patches like kernel patches have? That way I know you are contributing this properly :) > lsusb.c | 100 ++++++++++++++++++++++++++++++++++++++++++++++++++-------------- > 1 file changed, 79 insertions(+), 21 deletions(-) > > diff --git a/lsusb.c b/lsusb.c > index f611f2e..c35d92e 100644 > --- a/lsusb.c > +++ b/lsusb.c > @@ -1000,8 +1000,85 @@ static const char * const chconfig_uac2[] = { > "Back Left of Center (BLC)", "Back Right of Center (BRC)" > }; > > +/* USB Audio Class subtypes */ > +enum uac_interface_subtype { > + UAC_INTERFACE_SUBTYPE_AC_DESCRIPTOR_UNDEFINED = 0x00, > + UAC_INTERFACE_SUBTYPE_HEADER = 0x01, > + UAC_INTERFACE_SUBTYPE_INPUT_TERMINAL = 0x02, > + UAC_INTERFACE_SUBTYPE_OUTPUT_TERMINAL = 0x03, > + UAC_INTERFACE_SUBTYPE_EXTENDED_TERMINAL = 0x04, > + UAC_INTERFACE_SUBTYPE_MIXER_UNIT = 0x05, > + UAC_INTERFACE_SUBTYPE_SELECTOR_UNIT = 0x06, > + UAC_INTERFACE_SUBTYPE_FEATURE_UNIT = 0x07, > + UAC_INTERFACE_SUBTYPE_EFFECT_UNIT = 0x08, > + UAC_INTERFACE_SUBTYPE_PROCESSING_UNIT = 0x09, > + UAC_INTERFACE_SUBTYPE_EXTENSION_UNIT = 0x0a, > + UAC_INTERFACE_SUBTYPE_CLOCK_SOURCE = 0x0b, > + UAC_INTERFACE_SUBTYPE_CLOCK_SELECTOR = 0x0c, > + UAC_INTERFACE_SUBTYPE_CLOCK_MULTIPLIER = 0x0d, > + UAC_INTERFACE_SUBTYPE_SAMPLE_RATE_CONVERTER = 0x0e, > + UAC_INTERFACE_SUBTYPE_CONNECTORS = 0x0f, > + UAC_INTERFACE_SUBTYPE_POWER_DOMAIN = 0x10, > +}; > + > + Only 1 blank line between functions/things please, otherwise it's just a lot of whitespace :) > +/* > + * UAC1, and UAC2 define bDescriptorSubtype differently for the > + * AudioControl interface, so we need to do some ugly remapping: > + * > + * val | UAC1 | UAC2 > + * -----|-----------------|---------------------- > + * 0x00 | AC UNDEFINED | AC UNDEFINED > + * 0x01 | HEADER | HEADER > + * 0x02 | INPUT_TERMINAL | INPUT_TERMINAL > + * 0x03 | OUTPUT_TERMINAL | OUTPUT_TERMINAL > + * 0x04 | MIXER_UNIT | MIXER_UNIT > + * 0x05 | SELECTOR_UNIT | SELECTOR_UNIT > + * 0x06 | FEATURE_UNIT | FEATURE_UNIT > + * 0x07 | PROCESSING_UNIT | EFFECT_UNIT > + * 0x08 | EXTENSION_UNIT | PROCESSING_UNIT > + * 0x09 | - | EXTENSION_UNIT > + * 0x0a | - | CLOCK_SOURCE > + * 0x0b | - | CLOCK_SELECTOR > + * 0x0c | - | CLOCK_MULTIPLIER > + * 0x0d | - | SAMPLE_RATE_CONVERTER > + */ > +static enum uac_interface_subtype get_uac_interface_subtype(unsigned char c, int protocol) > +{ > + switch (protocol) { > + case USB_AUDIO_CLASS_1: > + switch(c) { > + case 0x04: return UAC_INTERFACE_SUBTYPE_MIXER_UNIT; > + case 0x05: return UAC_INTERFACE_SUBTYPE_SELECTOR_UNIT; > + case 0x06: return UAC_INTERFACE_SUBTYPE_FEATURE_UNIT; > + case 0x07: return UAC_INTERFACE_SUBTYPE_PROCESSING_UNIT; > + case 0x08: return UAC_INTERFACE_SUBTYPE_EXTENSION_UNIT; > + } > + break; > + case USB_AUDIO_CLASS_2: > + switch(c) { > + case 0x04: return UAC_INTERFACE_SUBTYPE_MIXER_UNIT; > + case 0x05: return UAC_INTERFACE_SUBTYPE_SELECTOR_UNIT; > + case 0x06: return UAC_INTERFACE_SUBTYPE_FEATURE_UNIT; > + case 0x07: return UAC_INTERFACE_SUBTYPE_EFFECT_UNIT; > + case 0x08: return UAC_INTERFACE_SUBTYPE_PROCESSING_UNIT; > + case 0x09: return UAC_INTERFACE_SUBTYPE_EXTENSION_UNIT; > + case 0x0a: return UAC_INTERFACE_SUBTYPE_CLOCK_SOURCE; > + case 0x0b: return UAC_INTERFACE_SUBTYPE_CLOCK_SELECTOR; > + case 0x0c: return UAC_INTERFACE_SUBTYPE_CLOCK_MULTIPLIER; > + case 0x0d: return UAC_INTERFACE_SUBTYPE_SAMPLE_RATE_CONVERTER; > + } > + break; No "default" handler saying we don't know what the type is? Otherwise, looks great, thanks for this. greg k-h -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html