Lines Matching +full:max +full:- +full:bit +full:- +full:rate

1 // SPDX-License-Identifier: GPL-2.0-or-later
9 #include <linux/usb/audio-v2.h>
10 #include <linux/usb/audio-v3.h>
38 switch (fp->protocol) { in parse_audio_format_i_type()
45 fp->iface, fp->altsetting, format); in parse_audio_format_i_type()
48 sample_width = fmt->bBitResolution; in parse_audio_format_i_type()
49 sample_bytes = fmt->bSubframeSize; in parse_audio_format_i_type()
56 sample_width = fmt->bBitResolution; in parse_audio_format_i_type()
57 sample_bytes = fmt->bSubslotSize; in parse_audio_format_i_type()
62 fp->dsd_raw = true; in parse_audio_format_i_type()
63 /* clear special format bit to avoid "unsupported format" msg below */ in parse_audio_format_i_type()
73 sample_width = as->bBitResolution; in parse_audio_format_i_type()
74 sample_bytes = as->bSubslotSize; in parse_audio_format_i_type()
78 /* clear special format bit to avoid "unsupported format" msg below */ in parse_audio_format_i_type()
87 fp->fmt_bits = sample_width; in parse_audio_format_i_type()
90 (format == 0 || format == BIT(UAC_FORMAT_TYPE_I_UNDEFINED))) { in parse_audio_format_i_type()
93 fp->iface, fp->altsetting); in parse_audio_format_i_type()
94 format = BIT(UAC_FORMAT_TYPE_I_PCM); in parse_audio_format_i_type()
96 if (format & BIT(UAC_FORMAT_TYPE_I_PCM)) { in parse_audio_format_i_type()
97 if (((chip->usb_id == USB_ID(0x0582, 0x0016)) || in parse_audio_format_i_type()
98 /* Edirol SD-90 */ in parse_audio_format_i_type()
99 (chip->usb_id == USB_ID(0x0582, 0x000c))) && in parse_audio_format_i_type()
100 /* Roland SC-D70 */ in parse_audio_format_i_type()
105 fp->iface, fp->altsetting, in parse_audio_format_i_type()
131 fp->iface, fp->altsetting, in parse_audio_format_i_type()
136 if (format & BIT(UAC_FORMAT_TYPE_I_PCM8)) { in parse_audio_format_i_type()
139 if (chip->usb_id == USB_ID(0x04fa, 0x4201)) in parse_audio_format_i_type()
144 if (format & BIT(UAC_FORMAT_TYPE_I_IEEE_FLOAT)) in parse_audio_format_i_type()
146 if (format & BIT(UAC_FORMAT_TYPE_I_ALAW)) in parse_audio_format_i_type()
148 if (format & BIT(UAC_FORMAT_TYPE_I_MULAW)) in parse_audio_format_i_type()
153 fp->iface, fp->altsetting, format); in parse_audio_format_i_type()
161 static int set_fixed_rate(struct audioformat *fp, int rate, int rate_bits) in set_fixed_rate() argument
163 kfree(fp->rate_table); in set_fixed_rate()
164 fp->rate_table = kmalloc(sizeof(int), GFP_KERNEL); in set_fixed_rate()
165 if (!fp->rate_table) in set_fixed_rate()
166 return -ENOMEM; in set_fixed_rate()
167 fp->nr_rates = 1; in set_fixed_rate()
168 fp->rate_min = rate; in set_fixed_rate()
169 fp->rate_max = rate; in set_fixed_rate()
170 fp->rates = rate_bits; in set_fixed_rate()
171 fp->rate_table[0] = rate; in set_fixed_rate()
175 /* set up rate_min, rate_max and rates from the rate table */
178 unsigned int rate; in set_rate_table_min_max() local
181 fp->rate_min = INT_MAX; in set_rate_table_min_max()
182 fp->rate_max = 0; in set_rate_table_min_max()
183 fp->rates = 0; in set_rate_table_min_max()
184 for (i = 0; i < fp->nr_rates; i++) { in set_rate_table_min_max()
185 rate = fp->rate_table[i]; in set_rate_table_min_max()
186 fp->rate_min = min(fp->rate_min, rate); in set_rate_table_min_max()
187 fp->rate_max = max(fp->rate_max, rate); in set_rate_table_min_max()
188 fp->rates |= snd_pcm_rate_to_rate_bit(rate); in set_rate_table_min_max()
199 * @offset: the start offset of descriptor pointing the rate type
210 fp->iface, fp->altsetting); in parse_audio_format_rates_v1()
211 return -EINVAL; in parse_audio_format_rates_v1()
216 * build the rate table and bitmap flags in parse_audio_format_rates_v1()
220 fp->rate_table = kmalloc_array(nr_rates, sizeof(int), in parse_audio_format_rates_v1()
222 if (fp->rate_table == NULL) in parse_audio_format_rates_v1()
223 return -ENOMEM; in parse_audio_format_rates_v1()
225 fp->nr_rates = 0; in parse_audio_format_rates_v1()
227 unsigned int rate = combine_triple(&fmt[idx]); in parse_audio_format_rates_v1() local
228 if (!rate) in parse_audio_format_rates_v1()
230 /* C-Media CM6501 mislabels its 96 kHz altsetting */ in parse_audio_format_rates_v1()
231 /* Terratec Aureon 7.1 USB C-Media 6206, too */ in parse_audio_format_rates_v1()
232 /* Ozone Z90 USB C-Media, too */ in parse_audio_format_rates_v1()
233 if (rate == 48000 && nr_rates == 1 && in parse_audio_format_rates_v1()
234 (chip->usb_id == USB_ID(0x0d8c, 0x0201) || in parse_audio_format_rates_v1()
235 chip->usb_id == USB_ID(0x0d8c, 0x0102) || in parse_audio_format_rates_v1()
236 chip->usb_id == USB_ID(0x0d8c, 0x0078) || in parse_audio_format_rates_v1()
237 chip->usb_id == USB_ID(0x0ccd, 0x00b1)) && in parse_audio_format_rates_v1()
238 fp->altsetting == 5 && fp->maxpacksize == 392) in parse_audio_format_rates_v1()
239 rate = 96000; in parse_audio_format_rates_v1()
241 if (rate == 16000 && in parse_audio_format_rates_v1()
242 (chip->usb_id == USB_ID(0x041e, 0x4064) || in parse_audio_format_rates_v1()
243 chip->usb_id == USB_ID(0x041e, 0x4068))) in parse_audio_format_rates_v1()
244 rate = 8000; in parse_audio_format_rates_v1()
246 fp->rate_table[fp->nr_rates++] = rate; in parse_audio_format_rates_v1()
248 if (!fp->nr_rates) { in parse_audio_format_rates_v1()
251 fp->iface, fp->altsetting); in parse_audio_format_rates_v1()
252 return -EINVAL; in parse_audio_format_rates_v1()
257 fp->rates = SNDRV_PCM_RATE_CONTINUOUS; in parse_audio_format_rates_v1()
258 fp->rate_min = combine_triple(&fmt[offset + 1]); in parse_audio_format_rates_v1()
259 fp->rate_max = combine_triple(&fmt[offset + 4]); in parse_audio_format_rates_v1()
263 if (chip->usb_id == USB_ID(0x0b0e, 0x030b)) { in parse_audio_format_rates_v1()
265 if (fp->nr_rates != 1) in parse_audio_format_rates_v1()
284 unsigned int rate) in s1810c_valid_sample_rate() argument
286 switch (fp->altsetting) { in s1810c_valid_sample_rate()
289 return rate <= 48000; in s1810c_valid_sample_rate()
292 return (rate == 88200 || rate == 96000); in s1810c_valid_sample_rate()
295 return rate >= 176400; in s1810c_valid_sample_rate()
304 * altsetting. Maximum rate is exposed in the last 4 bytes of Format Type
305 * descriptor which has a non-standard bLength = 10.
309 unsigned int rate) in focusrite_valid_sample_rate() argument
316 iface = usb_ifnum_to_if(chip->dev, fp->iface); in focusrite_valid_sample_rate()
320 alts = &iface->altsetting[fp->altset_idx]; in focusrite_valid_sample_rate()
321 fmt = snd_usb_find_csint_desc(alts->extra, alts->extralen, in focusrite_valid_sample_rate()
329 /* Validate max rate */ in focusrite_valid_sample_rate()
336 "%u:%d : unexpected max rate: %u\n", in focusrite_valid_sample_rate()
337 fp->iface, fp->altsetting, max_rate); in focusrite_valid_sample_rate()
342 return rate <= max_rate; in focusrite_valid_sample_rate()
349 * Helper function to walk the array of sample rate triplets reported by
352 * Then fp->rate_table can be allocated and filled.
362 int max = combine_quad(&data[6 + 12 * i]); in parse_uac2_sample_rate_range() local
364 unsigned int rate; in parse_uac2_sample_rate_range() local
366 if ((max < 0) || (min < 0) || (res < 0) || (max < min)) in parse_uac2_sample_rate_range()
371 * rate range, and this function should return 0 for no further in parse_uac2_sample_rate_range()
375 fp->rate_min = min; in parse_uac2_sample_rate_range()
376 fp->rate_max = max; in parse_uac2_sample_rate_range()
377 fp->rates = SNDRV_PCM_RATE_CONTINUOUS; in parse_uac2_sample_rate_range()
381 for (rate = min; rate <= max; rate += res) { in parse_uac2_sample_rate_range()
384 if (chip->usb_id == USB_ID(0x194f, 0x010c) && in parse_uac2_sample_rate_range()
385 !s1810c_valid_sample_rate(fp, rate)) in parse_uac2_sample_rate_range()
389 if (USB_ID_VENDOR(chip->usb_id) == 0x1235 && in parse_uac2_sample_rate_range()
390 !focusrite_valid_sample_rate(chip, fp, rate)) in parse_uac2_sample_rate_range()
393 if (fp->rate_table) in parse_uac2_sample_rate_range()
394 fp->rate_table[nr_rates] = rate; in parse_uac2_sample_rate_range()
418 switch (chip->usb_id) { in line6_parse_audio_format_rates_quirk()
422 case USB_ID(0x0e41, 0x4246): /* Line6 HX-Stomp */ in line6_parse_audio_format_rates_quirk()
423 case USB_ID(0x0e41, 0x4253): /* Line6 HX-Stomp XL */ in line6_parse_audio_format_rates_quirk()
433 return -ENODEV; in line6_parse_audio_format_rates_quirk()
436 /* check whether the given altsetting is supported for the already set rate */
440 struct usb_device *dev = chip->dev; in check_valid_altsetting_v2v3()
445 /* we assume 64bit is enough for any altsettings */ in check_valid_altsetting_v2v3()
446 if (snd_BUG_ON(altsetting >= 64 - 8)) in check_valid_altsetting_v2v3()
467 * Validate each sample rate with the altsetting
468 * Rebuild the rate table if only partial values are valid
474 struct usb_device *dev = chip->dev; in validate_sample_rate_table_v2v3()
481 /* performing the rate verification may lead to unexpected USB bus in validate_sample_rate_table_v2v3()
485 if (!(chip->quirk_flags & QUIRK_FLAG_VALIDATE_RATES)) in validate_sample_rate_table_v2v3()
488 alts = snd_usb_get_host_interface(chip, fp->iface, fp->altsetting); in validate_sample_rate_table_v2v3()
492 if (fp->protocol == UAC_VERSION_3) { in validate_sample_rate_table_v2v3()
494 alts->extra, alts->extralen, NULL, UAC_AS_GENERAL); in validate_sample_rate_table_v2v3()
495 bmControls = le32_to_cpu(as->bmControls); in validate_sample_rate_table_v2v3()
498 alts->extra, alts->extralen, NULL, UAC_AS_GENERAL); in validate_sample_rate_table_v2v3()
499 bmControls = as->bmControls; in validate_sample_rate_table_v2v3()
506 table = kcalloc(fp->nr_rates, sizeof(*table), GFP_KERNEL); in validate_sample_rate_table_v2v3()
508 return -ENOMEM; in validate_sample_rate_table_v2v3()
511 usb_set_interface(dev, fp->iface, 0); in validate_sample_rate_table_v2v3()
514 for (i = 0; i < fp->nr_rates; i++) { in validate_sample_rate_table_v2v3()
516 fp->rate_table[i]); in validate_sample_rate_table_v2v3()
520 if (check_valid_altsetting_v2v3(chip, fp->iface, fp->altsetting)) in validate_sample_rate_table_v2v3()
521 table[nr_rates++] = fp->rate_table[i]; in validate_sample_rate_table_v2v3()
526 "No valid sample rate available for %d:%d, assuming a firmware bug\n", in validate_sample_rate_table_v2v3()
527 fp->iface, fp->altsetting); in validate_sample_rate_table_v2v3()
528 nr_rates = fp->nr_rates; /* continue as is */ in validate_sample_rate_table_v2v3()
531 if (fp->nr_rates == nr_rates) { in validate_sample_rate_table_v2v3()
536 kfree(fp->rate_table); in validate_sample_rate_table_v2v3()
537 fp->rate_table = table; in validate_sample_rate_table_v2v3()
538 fp->nr_rates = nr_rates; in validate_sample_rate_table_v2v3()
549 struct usb_device *dev = chip->dev; in parse_audio_format_rates_v2v3()
555 ctrl_intf = snd_usb_find_ctrl_interface(chip, fp->iface); in parse_audio_format_rates_v2v3()
557 dev_err(&dev->dev, in parse_audio_format_rates_v2v3()
573 if (ret_l6 == -ENODEV) { in parse_audio_format_rates_v2v3()
575 dev_err(&dev->dev, in parse_audio_format_rates_v2v3()
581 dev_info(&dev->dev, in parse_audio_format_rates_v2v3()
594 ret = -ENOMEM; in parse_audio_format_rates_v2v3()
606 dev_err(&dev->dev, in parse_audio_format_rates_v2v3()
607 "%s(): unable to retrieve sample rate range (clock %d)\n", in parse_audio_format_rates_v2v3()
609 ret = -EINVAL; in parse_audio_format_rates_v2v3()
613 /* Call the triplet parser, and make sure fp->rate_table is NULL. in parse_audio_format_rates_v2v3()
616 kfree(fp->rate_table); in parse_audio_format_rates_v2v3()
617 fp->rate_table = NULL; in parse_audio_format_rates_v2v3()
618 fp->nr_rates = parse_uac2_sample_rate_range(chip, fp, nr_triplets, data); in parse_audio_format_rates_v2v3()
620 if (fp->nr_rates == 0) { in parse_audio_format_rates_v2v3()
626 fp->rate_table = kmalloc_array(fp->nr_rates, sizeof(int), GFP_KERNEL); in parse_audio_format_rates_v2v3()
627 if (!fp->rate_table) { in parse_audio_format_rates_v2v3()
628 ret = -ENOMEM; in parse_audio_format_rates_v2v3()
632 /* Call the triplet parser again, but this time, fp->rate_table is in parse_audio_format_rates_v2v3()
659 switch (fp->protocol) { in parse_audio_format_i()
665 fmt_type = fmt->bFormatType; in parse_audio_format_i()
669 /* fp->fmt_type is already set in this case */ in parse_audio_format_i()
670 fmt_type = fp->fmt_type; in parse_audio_format_i()
680 switch (chip->usb_id) { in parse_audio_format_i()
682 case USB_ID(0x0763, 0x2003): /* M-Audio Audiophile USB */ in parse_audio_format_i()
683 if (chip->setup == 0x00 && in parse_audio_format_i()
684 fp->altsetting == 6) in parse_audio_format_i()
692 fp->formats = pcm_format_to_bits(pcm_format); in parse_audio_format_i()
694 fp->formats = parse_audio_format_i_type(chip, fp, format, _fmt); in parse_audio_format_i()
695 if (!fp->formats) in parse_audio_format_i()
696 return -EINVAL; in parse_audio_format_i()
704 switch (fp->protocol) { in parse_audio_format_i()
709 fp->channels = fmt->bNrChannels; in parse_audio_format_i()
715 /* fp->channels is already set in this case */ in parse_audio_format_i()
721 if (fp->channels < 1) { in parse_audio_format_i()
724 fp->iface, fp->altsetting, fp->channels); in parse_audio_format_i()
725 return -EINVAL; in parse_audio_format_i()
743 // fp->formats = SNDRV_PCM_FMTBIT_AC3; in parse_audio_format_ii()
744 fp->formats = SNDRV_PCM_FMTBIT_U8; /* temporary hack to receive byte streams */ in parse_audio_format_ii()
747 fp->formats = SNDRV_PCM_FMTBIT_MPEG; in parse_audio_format_ii()
752 fp->iface, fp->altsetting, format); in parse_audio_format_ii()
753 fp->formats = SNDRV_PCM_FMTBIT_MPEG; in parse_audio_format_ii()
757 fp->channels = 1; in parse_audio_format_ii()
759 switch (fp->protocol) { in parse_audio_format_ii()
763 brate = le16_to_cpu(fmt->wMaxBitRate); in parse_audio_format_ii()
764 framesize = le16_to_cpu(fmt->wSamplesPerFrame); in parse_audio_format_ii()
765 usb_audio_info(chip, "found format II with max.bitrate = %d, frame size=%d\n", brate, framesize); in parse_audio_format_ii()
766 fp->frame_size = framesize; in parse_audio_format_ii()
772 brate = le16_to_cpu(fmt->wMaxBitRate); in parse_audio_format_ii()
773 framesize = le16_to_cpu(fmt->wSamplesPerFrame); in parse_audio_format_ii()
774 usb_audio_info(chip, "found format II with max.bitrate = %d, frame size=%d\n", brate, framesize); in parse_audio_format_ii()
775 fp->frame_size = framesize; in parse_audio_format_ii()
791 switch (fmt->bFormatType) { in snd_usb_parse_audio_format()
802 fp->iface, fp->altsetting, in snd_usb_parse_audio_format()
803 fmt->bFormatType); in snd_usb_parse_audio_format()
804 return -ENOTSUPP; in snd_usb_parse_audio_format()
806 fp->fmt_type = fmt->bFormatType; in snd_usb_parse_audio_format()
814 if (chip->usb_id == USB_ID(0x041e, 0x3000) || in snd_usb_parse_audio_format()
815 chip->usb_id == USB_ID(0x041e, 0x3020) || in snd_usb_parse_audio_format()
816 chip->usb_id == USB_ID(0x041e, 0x3061)) { in snd_usb_parse_audio_format()
817 if (fmt->bFormatType == UAC_FORMAT_TYPE_I && in snd_usb_parse_audio_format()
818 fp->rates != SNDRV_PCM_RATE_48000 && in snd_usb_parse_audio_format()
819 fp->rates != SNDRV_PCM_RATE_96000) in snd_usb_parse_audio_format()
820 return -ENOTSUPP; in snd_usb_parse_audio_format()
831 u64 format = le64_to_cpu(as->bmFormats); in snd_usb_parse_audio_format_v3()
839 fp->fmt_type = UAC_FORMAT_TYPE_I; in snd_usb_parse_audio_format_v3()
841 fp->fmt_type = UAC_FORMAT_TYPE_III; in snd_usb_parse_audio_format_v3()