diff options
| -rw-r--r-- | include/linux/usb/audio-v2.h | 2 | ||||
| -rw-r--r-- | sound/usb/format.c | 11 |
2 files changed, 9 insertions, 4 deletions
diff --git a/include/linux/usb/audio-v2.h b/include/linux/usb/audio-v2.h index ed13053153f4..c5f2158ab00e 100644 --- a/include/linux/usb/audio-v2.h +++ b/include/linux/usb/audio-v2.h | |||
| @@ -170,6 +170,8 @@ struct uac2_as_header_descriptor { | |||
| 170 | __u8 iChannelNames; | 170 | __u8 iChannelNames; |
| 171 | } __attribute__((packed)); | 171 | } __attribute__((packed)); |
| 172 | 172 | ||
| 173 | #define UAC2_FORMAT_TYPE_I_RAW_DATA (1 << 31) | ||
| 174 | |||
| 173 | /* 4.10.1.2 Class-Specific AS Isochronous Audio Data Endpoint Descriptor */ | 175 | /* 4.10.1.2 Class-Specific AS Isochronous Audio Data Endpoint Descriptor */ |
| 174 | 176 | ||
| 175 | struct uac2_iso_endpoint_descriptor { | 177 | struct uac2_iso_endpoint_descriptor { |
diff --git a/sound/usb/format.c b/sound/usb/format.c index b30d6fb89b40..a695cafc0599 100644 --- a/sound/usb/format.c +++ b/sound/usb/format.c | |||
| @@ -47,7 +47,7 @@ static u64 parse_audio_format_i_type(struct snd_usb_audio *chip, | |||
| 47 | int protocol) | 47 | int protocol) |
| 48 | { | 48 | { |
| 49 | int sample_width, sample_bytes; | 49 | int sample_width, sample_bytes; |
| 50 | u64 pcm_formats; | 50 | u64 pcm_formats = 0; |
| 51 | 51 | ||
| 52 | switch (protocol) { | 52 | switch (protocol) { |
| 53 | case UAC_VERSION_1: | 53 | case UAC_VERSION_1: |
| @@ -63,14 +63,17 @@ static u64 parse_audio_format_i_type(struct snd_usb_audio *chip, | |||
| 63 | struct uac_format_type_i_ext_descriptor *fmt = _fmt; | 63 | struct uac_format_type_i_ext_descriptor *fmt = _fmt; |
| 64 | sample_width = fmt->bBitResolution; | 64 | sample_width = fmt->bBitResolution; |
| 65 | sample_bytes = fmt->bSubslotSize; | 65 | sample_bytes = fmt->bSubslotSize; |
| 66 | |||
| 67 | if (format & UAC2_FORMAT_TYPE_I_RAW_DATA) | ||
| 68 | pcm_formats |= SNDRV_PCM_FMTBIT_SPECIAL; | ||
| 69 | |||
| 66 | format <<= 1; | 70 | format <<= 1; |
| 67 | break; | 71 | break; |
| 68 | } | 72 | } |
| 69 | } | 73 | } |
| 70 | 74 | ||
| 71 | pcm_formats = 0; | 75 | if ((pcm_formats == 0) && |
| 72 | 76 | (format == 0 || format == (1 << UAC_FORMAT_TYPE_I_UNDEFINED))) { | |
| 73 | if (format == 0 || format == (1 << UAC_FORMAT_TYPE_I_UNDEFINED)) { | ||
| 74 | /* some devices don't define this correctly... */ | 77 | /* some devices don't define this correctly... */ |
| 75 | snd_printdd(KERN_INFO "%d:%u:%d : format type 0 is detected, processed as PCM\n", | 78 | snd_printdd(KERN_INFO "%d:%u:%d : format type 0 is detected, processed as PCM\n", |
| 76 | chip->dev->devnum, fp->iface, fp->altsetting); | 79 | chip->dev->devnum, fp->iface, fp->altsetting); |
