• Home
  • Raw
  • Download

Lines Matching +full:data +full:- +full:rates

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()
71 sample_width = as->bBitResolution; in parse_audio_format_i_type()
72 sample_bytes = as->bSubslotSize; in parse_audio_format_i_type()
82 fp->fmt_bits = sample_width; in parse_audio_format_i_type()
88 fp->iface, fp->altsetting); in parse_audio_format_i_type()
92 if (((chip->usb_id == USB_ID(0x0582, 0x0016)) || in parse_audio_format_i_type()
93 /* Edirol SD-90 */ in parse_audio_format_i_type()
94 (chip->usb_id == USB_ID(0x0582, 0x000c))) && in parse_audio_format_i_type()
95 /* Roland SC-D70 */ in parse_audio_format_i_type()
100 fp->iface, fp->altsetting, in parse_audio_format_i_type()
126 fp->iface, fp->altsetting, in parse_audio_format_i_type()
134 if (chip->usb_id == USB_ID(0x04fa, 0x4201)) in parse_audio_format_i_type()
151 fp->iface, fp->altsetting, format); in parse_audio_format_i_type()
161 kfree(fp->rate_table); in set_fixed_rate()
162 fp->rate_table = kmalloc(sizeof(int), GFP_KERNEL); in set_fixed_rate()
163 if (!fp->rate_table) in set_fixed_rate()
164 return -ENOMEM; in set_fixed_rate()
165 fp->nr_rates = 1; in set_fixed_rate()
166 fp->rate_min = rate; in set_fixed_rate()
167 fp->rate_max = rate; in set_fixed_rate()
168 fp->rates = rate_bits; in set_fixed_rate()
169 fp->rate_table[0] = rate; in set_fixed_rate()
173 /* set up rate_min, rate_max and rates from the rate table */
179 fp->rate_min = INT_MAX; in set_rate_table_min_max()
180 fp->rate_max = 0; in set_rate_table_min_max()
181 fp->rates = 0; in set_rate_table_min_max()
182 for (i = 0; i < fp->nr_rates; i++) { in set_rate_table_min_max()
183 rate = fp->rate_table[i]; in set_rate_table_min_max()
184 fp->rate_min = min(fp->rate_min, rate); in set_rate_table_min_max()
185 fp->rate_max = max(fp->rate_max, rate); in set_rate_table_min_max()
186 fp->rates |= snd_pcm_rate_to_rate_bit(rate); in set_rate_table_min_max()
191 * parse the format descriptor and stores the possible sample rates
208 fp->iface, fp->altsetting); in parse_audio_format_rates_v1()
209 return -EINVAL; in parse_audio_format_rates_v1()
218 fp->rate_table = kmalloc_array(nr_rates, sizeof(int), in parse_audio_format_rates_v1()
220 if (fp->rate_table == NULL) in parse_audio_format_rates_v1()
221 return -ENOMEM; in parse_audio_format_rates_v1()
223 fp->nr_rates = 0; in parse_audio_format_rates_v1()
228 /* C-Media CM6501 mislabels its 96 kHz altsetting */ in parse_audio_format_rates_v1()
229 /* Terratec Aureon 7.1 USB C-Media 6206, too */ in parse_audio_format_rates_v1()
230 /* Ozone Z90 USB C-Media, too */ in parse_audio_format_rates_v1()
232 (chip->usb_id == USB_ID(0x0d8c, 0x0201) || in parse_audio_format_rates_v1()
233 chip->usb_id == USB_ID(0x0d8c, 0x0102) || in parse_audio_format_rates_v1()
234 chip->usb_id == USB_ID(0x0d8c, 0x0078) || in parse_audio_format_rates_v1()
235 chip->usb_id == USB_ID(0x0ccd, 0x00b1)) && in parse_audio_format_rates_v1()
236 fp->altsetting == 5 && fp->maxpacksize == 392) in parse_audio_format_rates_v1()
240 (chip->usb_id == USB_ID(0x041e, 0x4064) || in parse_audio_format_rates_v1()
241 chip->usb_id == USB_ID(0x041e, 0x4068))) in parse_audio_format_rates_v1()
244 fp->rate_table[fp->nr_rates++] = rate; in parse_audio_format_rates_v1()
246 if (!fp->nr_rates) { in parse_audio_format_rates_v1()
248 "%u:%d: All rates were zero\n", in parse_audio_format_rates_v1()
249 fp->iface, fp->altsetting); in parse_audio_format_rates_v1()
250 return -EINVAL; in parse_audio_format_rates_v1()
254 /* continuous rates */ in parse_audio_format_rates_v1()
255 fp->rates = SNDRV_PCM_RATE_CONTINUOUS; in parse_audio_format_rates_v1()
256 fp->rate_min = combine_triple(&fmt[offset + 1]); in parse_audio_format_rates_v1()
257 fp->rate_max = combine_triple(&fmt[offset + 4]); in parse_audio_format_rates_v1()
261 if (chip->usb_id == USB_ID(0x0b0e, 0x030b)) { in parse_audio_format_rates_v1()
263 if (fp->nr_rates != 1) in parse_audio_format_rates_v1()
273 * rates per altsetting but reports the full set each time.
274 * If we don't filter out the unsupported rates and attempt
278 * The list of supported rates per altsetting (set of available
284 switch (fp->altsetting) { in s1810c_valid_sample_rate()
301 * Many Focusrite devices supports a limited set of sampling rates per
303 * descriptor which has a non-standard bLength = 10.
314 iface = usb_ifnum_to_if(chip->dev, fp->iface); in focusrite_valid_sample_rate()
318 alts = &iface->altsetting[fp->altset_idx]; in focusrite_valid_sample_rate()
319 fmt = snd_usb_find_csint_desc(alts->extra, alts->extralen, in focusrite_valid_sample_rate()
335 fp->iface, fp->altsetting, max_rate); in focusrite_valid_sample_rate()
349 * get to know how many sample rates we have to expect.
350 * Then fp->rate_table can be allocated and filled.
354 const unsigned char *data) in parse_uac2_sample_rate_range() argument
359 int min = combine_quad(&data[2 + 12 * i]); in parse_uac2_sample_rate_range()
360 int max = combine_quad(&data[6 + 12 * i]); in parse_uac2_sample_rate_range()
361 int res = combine_quad(&data[10 + 12 * i]); in parse_uac2_sample_rate_range()
373 fp->rate_min = min; in parse_uac2_sample_rate_range()
374 fp->rate_max = max; in parse_uac2_sample_rate_range()
375 fp->rates = SNDRV_PCM_RATE_CONTINUOUS; in parse_uac2_sample_rate_range()
381 /* Filter out invalid rates on Presonus Studio 1810c */ in parse_uac2_sample_rate_range()
382 if (chip->usb_id == USB_ID(0x194f, 0x010c) && in parse_uac2_sample_rate_range()
386 /* Filter out invalid rates on Focusrite devices */ in parse_uac2_sample_rate_range()
387 if (USB_ID_VENDOR(chip->usb_id) == 0x1235 && in parse_uac2_sample_rate_range()
391 if (fp->rate_table) in parse_uac2_sample_rate_range()
392 fp->rate_table[nr_rates] = rate; in parse_uac2_sample_rate_range()
395 usb_audio_err(chip, "invalid uac2 rates\n"); in parse_uac2_sample_rate_range()
411 * clock rates.
416 switch (chip->usb_id) { in line6_parse_audio_format_rates_quirk()
420 case USB_ID(0x0e41, 0x4246): /* Line6 HX-Stomp */ in line6_parse_audio_format_rates_quirk()
421 case USB_ID(0x0e41, 0x4253): /* Line6 HX-Stomp XL */ in line6_parse_audio_format_rates_quirk()
431 return -ENODEV; in line6_parse_audio_format_rates_quirk()
438 struct usb_device *dev = chip->dev; in check_valid_altsetting_v2v3()
440 u64 data; in check_valid_altsetting_v2v3() local
444 if (snd_BUG_ON(altsetting >= 64 - 8)) in check_valid_altsetting_v2v3()
454 data = le64_to_cpu(raw_data); in check_valid_altsetting_v2v3()
456 if ((data & 0xff) * 8 < altsetting) in check_valid_altsetting_v2v3()
458 if (data & (1ULL << (altsetting + 8))) in check_valid_altsetting_v2v3()
472 struct usb_device *dev = chip->dev; in validate_sample_rate_table_v2v3()
483 if (!(chip->quirk_flags & QUIRK_FLAG_VALIDATE_RATES)) in validate_sample_rate_table_v2v3()
486 alts = snd_usb_get_host_interface(chip, fp->iface, fp->altsetting); in validate_sample_rate_table_v2v3()
490 if (fp->protocol == UAC_VERSION_3) { in validate_sample_rate_table_v2v3()
492 alts->extra, alts->extralen, NULL, UAC_AS_GENERAL); in validate_sample_rate_table_v2v3()
493 bmControls = le32_to_cpu(as->bmControls); in validate_sample_rate_table_v2v3()
496 alts->extra, alts->extralen, NULL, UAC_AS_GENERAL); in validate_sample_rate_table_v2v3()
497 bmControls = as->bmControls; in validate_sample_rate_table_v2v3()
504 table = kcalloc(fp->nr_rates, sizeof(*table), GFP_KERNEL); in validate_sample_rate_table_v2v3()
506 return -ENOMEM; in validate_sample_rate_table_v2v3()
509 usb_set_interface(dev, fp->iface, 0); in validate_sample_rate_table_v2v3()
512 for (i = 0; i < fp->nr_rates; i++) { in validate_sample_rate_table_v2v3()
514 fp->rate_table[i]); in validate_sample_rate_table_v2v3()
518 if (check_valid_altsetting_v2v3(chip, fp->iface, fp->altsetting)) in validate_sample_rate_table_v2v3()
519 table[nr_rates++] = fp->rate_table[i]; in validate_sample_rate_table_v2v3()
525 fp->iface, fp->altsetting); in validate_sample_rate_table_v2v3()
526 nr_rates = fp->nr_rates; /* continue as is */ in validate_sample_rate_table_v2v3()
529 if (fp->nr_rates == nr_rates) { in validate_sample_rate_table_v2v3()
534 kfree(fp->rate_table); in validate_sample_rate_table_v2v3()
535 fp->rate_table = table; in validate_sample_rate_table_v2v3()
536 fp->nr_rates = nr_rates; in validate_sample_rate_table_v2v3()
541 * parse the format descriptor and stores the possible sample rates
547 struct usb_device *dev = chip->dev; in parse_audio_format_rates_v2v3()
548 unsigned char tmp[2], *data; in parse_audio_format_rates_v2v3() local
553 dev_err(&dev->dev, in parse_audio_format_rates_v2v3()
559 /* get the number of sample rates first by only fetching 2 bytes */ in parse_audio_format_rates_v2v3()
569 if (ret_l6 == -ENODEV) { in parse_audio_format_rates_v2v3()
571 dev_err(&dev->dev, in parse_audio_format_rates_v2v3()
572 "%s(): unable to retrieve number of sample rates (clock %d)\n", in parse_audio_format_rates_v2v3()
577 dev_info(&dev->dev, in parse_audio_format_rates_v2v3()
578 "%s(): unable to retrieve number of sample rates: set it to a predefined value (clock %d).\n", in parse_audio_format_rates_v2v3()
588 data = kzalloc(data_size, GFP_KERNEL); in parse_audio_format_rates_v2v3()
589 if (!data) { in parse_audio_format_rates_v2v3()
590 ret = -ENOMEM; in parse_audio_format_rates_v2v3()
599 data, data_size); in parse_audio_format_rates_v2v3()
602 dev_err(&dev->dev, in parse_audio_format_rates_v2v3()
605 ret = -EINVAL; in parse_audio_format_rates_v2v3()
609 /* Call the triplet parser, and make sure fp->rate_table is NULL. in parse_audio_format_rates_v2v3()
610 * We just use the return value to know how many sample rates we in parse_audio_format_rates_v2v3()
612 kfree(fp->rate_table); in parse_audio_format_rates_v2v3()
613 fp->rate_table = NULL; in parse_audio_format_rates_v2v3()
614 fp->nr_rates = parse_uac2_sample_rate_range(chip, fp, nr_triplets, data); in parse_audio_format_rates_v2v3()
616 if (fp->nr_rates == 0) { in parse_audio_format_rates_v2v3()
622 fp->rate_table = kmalloc_array(fp->nr_rates, sizeof(int), GFP_KERNEL); in parse_audio_format_rates_v2v3()
623 if (!fp->rate_table) { in parse_audio_format_rates_v2v3()
624 ret = -ENOMEM; in parse_audio_format_rates_v2v3()
628 /* Call the triplet parser again, but this time, fp->rate_table is in parse_audio_format_rates_v2v3()
629 * allocated, so the rates will be stored */ in parse_audio_format_rates_v2v3()
630 parse_uac2_sample_rate_range(chip, fp, nr_triplets, data); in parse_audio_format_rates_v2v3()
639 kfree(data); in parse_audio_format_rates_v2v3()
655 switch (fp->protocol) { in parse_audio_format_i()
661 fmt_type = fmt->bFormatType; in parse_audio_format_i()
665 /* fp->fmt_type is already set in this case */ in parse_audio_format_i()
666 fmt_type = fp->fmt_type; in parse_audio_format_i()
676 switch (chip->usb_id) { in parse_audio_format_i()
678 case USB_ID(0x0763, 0x2003): /* M-Audio Audiophile USB */ in parse_audio_format_i()
679 if (chip->setup == 0x00 && in parse_audio_format_i()
680 fp->altsetting == 6) in parse_audio_format_i()
688 fp->formats = pcm_format_to_bits(pcm_format); in parse_audio_format_i()
690 fp->formats = parse_audio_format_i_type(chip, fp, format, _fmt); in parse_audio_format_i()
691 if (!fp->formats) in parse_audio_format_i()
692 return -EINVAL; in parse_audio_format_i()
695 /* gather possible sample rates */ in parse_audio_format_i()
696 /* audio class v1 reports possible sample rates as part of the in parse_audio_format_i()
700 switch (fp->protocol) { in parse_audio_format_i()
705 fp->channels = fmt->bNrChannels; in parse_audio_format_i()
711 /* fp->channels is already set in this case */ in parse_audio_format_i()
717 if (fp->channels < 1) { in parse_audio_format_i()
720 fp->iface, fp->altsetting, fp->channels); in parse_audio_format_i()
721 return -EINVAL; in parse_audio_format_i()
739 // fp->formats = SNDRV_PCM_FMTBIT_AC3; in parse_audio_format_ii()
740 fp->formats = SNDRV_PCM_FMTBIT_U8; /* temporary hack to receive byte streams */ in parse_audio_format_ii()
743 fp->formats = SNDRV_PCM_FMTBIT_MPEG; in parse_audio_format_ii()
748 fp->iface, fp->altsetting, format); in parse_audio_format_ii()
749 fp->formats = SNDRV_PCM_FMTBIT_MPEG; in parse_audio_format_ii()
753 fp->channels = 1; in parse_audio_format_ii()
755 switch (fp->protocol) { in parse_audio_format_ii()
759 brate = le16_to_cpu(fmt->wMaxBitRate); in parse_audio_format_ii()
760 framesize = le16_to_cpu(fmt->wSamplesPerFrame); in parse_audio_format_ii()
762 fp->frame_size = framesize; in parse_audio_format_ii()
763 ret = parse_audio_format_rates_v1(chip, fp, _fmt, 8); /* fmt[8..] sample rates */ in parse_audio_format_ii()
768 brate = le16_to_cpu(fmt->wMaxBitRate); in parse_audio_format_ii()
769 framesize = le16_to_cpu(fmt->wSamplesPerFrame); in parse_audio_format_ii()
771 fp->frame_size = framesize; in parse_audio_format_ii()
787 switch (fmt->bFormatType) { in snd_usb_parse_audio_format()
798 fp->iface, fp->altsetting, in snd_usb_parse_audio_format()
799 fmt->bFormatType); in snd_usb_parse_audio_format()
800 return -ENOTSUPP; in snd_usb_parse_audio_format()
802 fp->fmt_type = fmt->bFormatType; in snd_usb_parse_audio_format()
807 /* extigy apparently supports sample rates other than 48k in snd_usb_parse_audio_format()
810 if (chip->usb_id == USB_ID(0x041e, 0x3000) || in snd_usb_parse_audio_format()
811 chip->usb_id == USB_ID(0x041e, 0x3020) || in snd_usb_parse_audio_format()
812 chip->usb_id == USB_ID(0x041e, 0x3061)) { in snd_usb_parse_audio_format()
813 if (fmt->bFormatType == UAC_FORMAT_TYPE_I && in snd_usb_parse_audio_format()
814 fp->rates != SNDRV_PCM_RATE_48000 && in snd_usb_parse_audio_format()
815 fp->rates != SNDRV_PCM_RATE_96000) in snd_usb_parse_audio_format()
816 return -ENOTSUPP; in snd_usb_parse_audio_format()
827 u64 format = le64_to_cpu(as->bmFormats); in snd_usb_parse_audio_format_v3()
835 fp->fmt_type = UAC_FORMAT_TYPE_I; in snd_usb_parse_audio_format_v3()
837 fp->fmt_type = UAC_FORMAT_TYPE_III; in snd_usb_parse_audio_format_v3()