diff options
author | Ruslan Bilovol <ruslan.bilovol@gmail.com> | 2018-05-04 03:24:04 +0200 |
---|---|---|
committer | Takashi Iwai <tiwai@suse.de> | 2018-05-13 08:54:35 +0200 |
commit | 17156f23e93c0f59e06dd2aaffd06221341caaee (patch) | |
tree | f7eac9dcff74c160bc43f1a032b5d15647fbe1d8 /sound/usb/card.c | |
parent | ALSA: pcm: Hide local_irq_disable/enable() and local_irqsave/restore() (diff) | |
download | linux-17156f23e93c0f59e06dd2aaffd06221341caaee.tar.xz linux-17156f23e93c0f59e06dd2aaffd06221341caaee.zip |
ALSA: usb: add UAC3 BADD profiles support
Recently released USB Audio Class 3.0 specification
contains BADD (Basic Audio Device Definition) document
which describes pre-defined UAC3 configurations.
BADD support is mandatory for UAC3 devices, it should be
implemented as a separate USB device configuration.
As per BADD document, class-specific descriptors
shall not be included in the Device’s Configuration
descriptor ("inferred"), but host can guess them
from BADD profile number, number of endpoints and
their max packed sizes.
This patch adds support of all BADD profiles from the spec
Signed-off-by: Ruslan Bilovol <ruslan.bilovol@gmail.com>
Tested-by: Jorge Sanjuan <jorge.sanjuan@codethink.co.uk>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to 'sound/usb/card.c')
-rw-r--r-- | sound/usb/card.c | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/sound/usb/card.c b/sound/usb/card.c index 0d7a5d70634e..f6c3c1cd591e 100644 --- a/sound/usb/card.c +++ b/sound/usb/card.c @@ -307,6 +307,20 @@ static int snd_usb_create_streams(struct snd_usb_audio *chip, int ctrlif) return -EINVAL; } + if (protocol == UAC_VERSION_3) { + int badd = assoc->bFunctionSubClass; + + if (badd != UAC3_FUNCTION_SUBCLASS_FULL_ADC_3_0 && + (badd < UAC3_FUNCTION_SUBCLASS_GENERIC_IO || + badd > UAC3_FUNCTION_SUBCLASS_SPEAKERPHONE)) { + dev_err(&dev->dev, + "Unsupported UAC3 BADD profile\n"); + return -EINVAL; + } + + chip->badd_profile = badd; + } + for (i = 0; i < assoc->bInterfaceCount; i++) { int intf = assoc->bFirstInterface + i; |