cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

format.c (21948B)


      1// SPDX-License-Identifier: GPL-2.0-or-later
      2/*
      3 */
      4
      5#include <linux/init.h>
      6#include <linux/slab.h>
      7#include <linux/usb.h>
      8#include <linux/usb/audio.h>
      9#include <linux/usb/audio-v2.h>
     10#include <linux/usb/audio-v3.h>
     11
     12#include <sound/core.h>
     13#include <sound/pcm.h>
     14
     15#include "usbaudio.h"
     16#include "card.h"
     17#include "quirks.h"
     18#include "helper.h"
     19#include "clock.h"
     20#include "format.h"
     21
     22/*
     23 * parse the audio format type I descriptor
     24 * and returns the corresponding pcm format
     25 *
     26 * @dev: usb device
     27 * @fp: audioformat record
     28 * @format: the format tag (wFormatTag)
     29 * @fmt: the format type descriptor (v1/v2) or AudioStreaming descriptor (v3)
     30 */
     31static u64 parse_audio_format_i_type(struct snd_usb_audio *chip,
     32				     struct audioformat *fp,
     33				     u64 format, void *_fmt)
     34{
     35	int sample_width, sample_bytes;
     36	u64 pcm_formats = 0;
     37
     38	switch (fp->protocol) {
     39	case UAC_VERSION_1:
     40	default: {
     41		struct uac_format_type_i_discrete_descriptor *fmt = _fmt;
     42		if (format >= 64)
     43			return 0; /* invalid format */
     44		sample_width = fmt->bBitResolution;
     45		sample_bytes = fmt->bSubframeSize;
     46		format = 1ULL << format;
     47		break;
     48	}
     49
     50	case UAC_VERSION_2: {
     51		struct uac_format_type_i_ext_descriptor *fmt = _fmt;
     52		sample_width = fmt->bBitResolution;
     53		sample_bytes = fmt->bSubslotSize;
     54
     55		if (format & UAC2_FORMAT_TYPE_I_RAW_DATA) {
     56			pcm_formats |= SNDRV_PCM_FMTBIT_SPECIAL;
     57			/* flag potentially raw DSD capable altsettings */
     58			fp->dsd_raw = true;
     59		}
     60
     61		format <<= 1;
     62		break;
     63	}
     64	case UAC_VERSION_3: {
     65		struct uac3_as_header_descriptor *as = _fmt;
     66
     67		sample_width = as->bBitResolution;
     68		sample_bytes = as->bSubslotSize;
     69
     70		if (format & UAC3_FORMAT_TYPE_I_RAW_DATA)
     71			pcm_formats |= SNDRV_PCM_FMTBIT_SPECIAL;
     72
     73		format <<= 1;
     74		break;
     75	}
     76	}
     77
     78	fp->fmt_bits = sample_width;
     79
     80	if ((pcm_formats == 0) &&
     81	    (format == 0 || format == (1 << UAC_FORMAT_TYPE_I_UNDEFINED))) {
     82		/* some devices don't define this correctly... */
     83		usb_audio_info(chip, "%u:%d : format type 0 is detected, processed as PCM\n",
     84			fp->iface, fp->altsetting);
     85		format = 1 << UAC_FORMAT_TYPE_I_PCM;
     86	}
     87	if (format & (1 << UAC_FORMAT_TYPE_I_PCM)) {
     88		if (((chip->usb_id == USB_ID(0x0582, 0x0016)) ||
     89		     /* Edirol SD-90 */
     90		     (chip->usb_id == USB_ID(0x0582, 0x000c))) &&
     91		     /* Roland SC-D70 */
     92		    sample_width == 24 && sample_bytes == 2)
     93			sample_bytes = 3;
     94		else if (sample_width > sample_bytes * 8) {
     95			usb_audio_info(chip, "%u:%d : sample bitwidth %d in over sample bytes %d\n",
     96				 fp->iface, fp->altsetting,
     97				 sample_width, sample_bytes);
     98		}
     99		/* check the format byte size */
    100		switch (sample_bytes) {
    101		case 1:
    102			pcm_formats |= SNDRV_PCM_FMTBIT_S8;
    103			break;
    104		case 2:
    105			if (snd_usb_is_big_endian_format(chip, fp))
    106				pcm_formats |= SNDRV_PCM_FMTBIT_S16_BE; /* grrr, big endian!! */
    107			else
    108				pcm_formats |= SNDRV_PCM_FMTBIT_S16_LE;
    109			break;
    110		case 3:
    111			if (snd_usb_is_big_endian_format(chip, fp))
    112				pcm_formats |= SNDRV_PCM_FMTBIT_S24_3BE; /* grrr, big endian!! */
    113			else
    114				pcm_formats |= SNDRV_PCM_FMTBIT_S24_3LE;
    115			break;
    116		case 4:
    117			pcm_formats |= SNDRV_PCM_FMTBIT_S32_LE;
    118			break;
    119		default:
    120			usb_audio_info(chip,
    121				 "%u:%d : unsupported sample bitwidth %d in %d bytes\n",
    122				 fp->iface, fp->altsetting,
    123				 sample_width, sample_bytes);
    124			break;
    125		}
    126	}
    127	if (format & (1 << UAC_FORMAT_TYPE_I_PCM8)) {
    128		/* Dallas DS4201 workaround: it advertises U8 format, but really
    129		   supports S8. */
    130		if (chip->usb_id == USB_ID(0x04fa, 0x4201))
    131			pcm_formats |= SNDRV_PCM_FMTBIT_S8;
    132		else
    133			pcm_formats |= SNDRV_PCM_FMTBIT_U8;
    134	}
    135	if (format & (1 << UAC_FORMAT_TYPE_I_IEEE_FLOAT)) {
    136		pcm_formats |= SNDRV_PCM_FMTBIT_FLOAT_LE;
    137	}
    138	if (format & (1 << UAC_FORMAT_TYPE_I_ALAW)) {
    139		pcm_formats |= SNDRV_PCM_FMTBIT_A_LAW;
    140	}
    141	if (format & (1 << UAC_FORMAT_TYPE_I_MULAW)) {
    142		pcm_formats |= SNDRV_PCM_FMTBIT_MU_LAW;
    143	}
    144	if (format & ~0x3f) {
    145		usb_audio_info(chip,
    146			 "%u:%d : unsupported format bits %#llx\n",
    147			 fp->iface, fp->altsetting, format);
    148	}
    149
    150	pcm_formats |= snd_usb_interface_dsd_format_quirks(chip, fp, sample_bytes);
    151
    152	return pcm_formats;
    153}
    154
    155static int set_fixed_rate(struct audioformat *fp, int rate, int rate_bits)
    156{
    157	kfree(fp->rate_table);
    158	fp->rate_table = kmalloc(sizeof(int), GFP_KERNEL);
    159	if (!fp->rate_table)
    160		return -ENOMEM;
    161	fp->nr_rates = 1;
    162	fp->rate_min = rate;
    163	fp->rate_max = rate;
    164	fp->rates = rate_bits;
    165	fp->rate_table[0] = rate;
    166	return 0;
    167}
    168
    169/* set up rate_min, rate_max and rates from the rate table */
    170static void set_rate_table_min_max(struct audioformat *fp)
    171{
    172	unsigned int rate;
    173	int i;
    174
    175	fp->rate_min = INT_MAX;
    176	fp->rate_max = 0;
    177	fp->rates = 0;
    178	for (i = 0; i < fp->nr_rates; i++) {
    179		rate = fp->rate_table[i];
    180		fp->rate_min = min(fp->rate_min, rate);
    181		fp->rate_max = max(fp->rate_max, rate);
    182		fp->rates |= snd_pcm_rate_to_rate_bit(rate);
    183	}
    184}
    185
    186/*
    187 * parse the format descriptor and stores the possible sample rates
    188 * on the audioformat table (audio class v1).
    189 *
    190 * @dev: usb device
    191 * @fp: audioformat record
    192 * @fmt: the format descriptor
    193 * @offset: the start offset of descriptor pointing the rate type
    194 *          (7 for type I and II, 8 for type II)
    195 */
    196static int parse_audio_format_rates_v1(struct snd_usb_audio *chip, struct audioformat *fp,
    197				       unsigned char *fmt, int offset)
    198{
    199	int nr_rates = fmt[offset];
    200
    201	if (fmt[0] < offset + 1 + 3 * (nr_rates ? nr_rates : 2)) {
    202		usb_audio_err(chip,
    203			"%u:%d : invalid UAC_FORMAT_TYPE desc\n",
    204			fp->iface, fp->altsetting);
    205		return -EINVAL;
    206	}
    207
    208	if (nr_rates) {
    209		/*
    210		 * build the rate table and bitmap flags
    211		 */
    212		int r, idx;
    213
    214		fp->rate_table = kmalloc_array(nr_rates, sizeof(int),
    215					       GFP_KERNEL);
    216		if (fp->rate_table == NULL)
    217			return -ENOMEM;
    218
    219		fp->nr_rates = 0;
    220		for (r = 0, idx = offset + 1; r < nr_rates; r++, idx += 3) {
    221			unsigned int rate = combine_triple(&fmt[idx]);
    222			if (!rate)
    223				continue;
    224			/* C-Media CM6501 mislabels its 96 kHz altsetting */
    225			/* Terratec Aureon 7.1 USB C-Media 6206, too */
    226			/* Ozone Z90 USB C-Media, too */
    227			if (rate == 48000 && nr_rates == 1 &&
    228			    (chip->usb_id == USB_ID(0x0d8c, 0x0201) ||
    229			     chip->usb_id == USB_ID(0x0d8c, 0x0102) ||
    230			     chip->usb_id == USB_ID(0x0d8c, 0x0078) ||
    231			     chip->usb_id == USB_ID(0x0ccd, 0x00b1)) &&
    232			    fp->altsetting == 5 && fp->maxpacksize == 392)
    233				rate = 96000;
    234			/* Creative VF0420/VF0470 Live Cams report 16 kHz instead of 8kHz */
    235			if (rate == 16000 &&
    236			    (chip->usb_id == USB_ID(0x041e, 0x4064) ||
    237			     chip->usb_id == USB_ID(0x041e, 0x4068)))
    238				rate = 8000;
    239
    240			fp->rate_table[fp->nr_rates++] = rate;
    241		}
    242		if (!fp->nr_rates) {
    243			usb_audio_info(chip,
    244				       "%u:%d: All rates were zero\n",
    245				       fp->iface, fp->altsetting);
    246			return -EINVAL;
    247		}
    248		set_rate_table_min_max(fp);
    249	} else {
    250		/* continuous rates */
    251		fp->rates = SNDRV_PCM_RATE_CONTINUOUS;
    252		fp->rate_min = combine_triple(&fmt[offset + 1]);
    253		fp->rate_max = combine_triple(&fmt[offset + 4]);
    254	}
    255
    256	/* Jabra Evolve 65 headset */
    257	if (chip->usb_id == USB_ID(0x0b0e, 0x030b)) {
    258		/* only 48kHz for playback while keeping 16kHz for capture */
    259		if (fp->nr_rates != 1)
    260			return set_fixed_rate(fp, 48000, SNDRV_PCM_RATE_48000);
    261	}
    262
    263	return 0;
    264}
    265
    266
    267/*
    268 * Presonus Studio 1810c supports a limited set of sampling
    269 * rates per altsetting but reports the full set each time.
    270 * If we don't filter out the unsupported rates and attempt
    271 * to configure the card, it will hang refusing to do any
    272 * further audio I/O until a hard reset is performed.
    273 *
    274 * The list of supported rates per altsetting (set of available
    275 * I/O channels) is described in the owner's manual, section 2.2.
    276 */
    277static bool s1810c_valid_sample_rate(struct audioformat *fp,
    278				     unsigned int rate)
    279{
    280	switch (fp->altsetting) {
    281	case 1:
    282		/* All ADAT ports available */
    283		return rate <= 48000;
    284	case 2:
    285		/* Half of ADAT ports available */
    286		return (rate == 88200 || rate == 96000);
    287	case 3:
    288		/* Analog I/O only (no S/PDIF nor ADAT) */
    289		return rate >= 176400;
    290	default:
    291		return false;
    292	}
    293	return false;
    294}
    295
    296/*
    297 * Many Focusrite devices supports a limited set of sampling rates per
    298 * altsetting. Maximum rate is exposed in the last 4 bytes of Format Type
    299 * descriptor which has a non-standard bLength = 10.
    300 */
    301static bool focusrite_valid_sample_rate(struct snd_usb_audio *chip,
    302					struct audioformat *fp,
    303					unsigned int rate)
    304{
    305	struct usb_interface *iface;
    306	struct usb_host_interface *alts;
    307	unsigned char *fmt;
    308	unsigned int max_rate;
    309
    310	iface = usb_ifnum_to_if(chip->dev, fp->iface);
    311	if (!iface)
    312		return true;
    313
    314	alts = &iface->altsetting[fp->altset_idx];
    315	fmt = snd_usb_find_csint_desc(alts->extra, alts->extralen,
    316				      NULL, UAC_FORMAT_TYPE);
    317	if (!fmt)
    318		return true;
    319
    320	if (fmt[0] == 10) { /* bLength */
    321		max_rate = combine_quad(&fmt[6]);
    322
    323		/* Validate max rate */
    324		if (max_rate != 48000 &&
    325		    max_rate != 96000 &&
    326		    max_rate != 192000 &&
    327		    max_rate != 384000) {
    328
    329			usb_audio_info(chip,
    330				"%u:%d : unexpected max rate: %u\n",
    331				fp->iface, fp->altsetting, max_rate);
    332
    333			return true;
    334		}
    335
    336		return rate <= max_rate;
    337	}
    338
    339	return true;
    340}
    341
    342/*
    343 * Helper function to walk the array of sample rate triplets reported by
    344 * the device. The problem is that we need to parse whole array first to
    345 * get to know how many sample rates we have to expect.
    346 * Then fp->rate_table can be allocated and filled.
    347 */
    348static int parse_uac2_sample_rate_range(struct snd_usb_audio *chip,
    349					struct audioformat *fp, int nr_triplets,
    350					const unsigned char *data)
    351{
    352	int i, nr_rates = 0;
    353
    354	for (i = 0; i < nr_triplets; i++) {
    355		int min = combine_quad(&data[2 + 12 * i]);
    356		int max = combine_quad(&data[6 + 12 * i]);
    357		int res = combine_quad(&data[10 + 12 * i]);
    358		unsigned int rate;
    359
    360		if ((max < 0) || (min < 0) || (res < 0) || (max < min))
    361			continue;
    362
    363		/*
    364		 * for ranges with res == 1, we announce a continuous sample
    365		 * rate range, and this function should return 0 for no further
    366		 * parsing.
    367		 */
    368		if (res == 1) {
    369			fp->rate_min = min;
    370			fp->rate_max = max;
    371			fp->rates = SNDRV_PCM_RATE_CONTINUOUS;
    372			return 0;
    373		}
    374
    375		for (rate = min; rate <= max; rate += res) {
    376
    377			/* Filter out invalid rates on Presonus Studio 1810c */
    378			if (chip->usb_id == USB_ID(0x194f, 0x010c) &&
    379			    !s1810c_valid_sample_rate(fp, rate))
    380				goto skip_rate;
    381
    382			/* Filter out invalid rates on Focusrite devices */
    383			if (USB_ID_VENDOR(chip->usb_id) == 0x1235 &&
    384			    !focusrite_valid_sample_rate(chip, fp, rate))
    385				goto skip_rate;
    386
    387			if (fp->rate_table)
    388				fp->rate_table[nr_rates] = rate;
    389			nr_rates++;
    390			if (nr_rates >= MAX_NR_RATES) {
    391				usb_audio_err(chip, "invalid uac2 rates\n");
    392				break;
    393			}
    394
    395skip_rate:
    396			/* avoid endless loop */
    397			if (res == 0)
    398				break;
    399		}
    400	}
    401
    402	return nr_rates;
    403}
    404
    405/* Line6 Helix series and the Rode Rodecaster Pro don't support the
    406 * UAC2_CS_RANGE usb function call. Return a static table of known
    407 * clock rates.
    408 */
    409static int line6_parse_audio_format_rates_quirk(struct snd_usb_audio *chip,
    410						struct audioformat *fp)
    411{
    412	switch (chip->usb_id) {
    413	case USB_ID(0x0e41, 0x4241): /* Line6 Helix */
    414	case USB_ID(0x0e41, 0x4242): /* Line6 Helix Rack */
    415	case USB_ID(0x0e41, 0x4244): /* Line6 Helix LT */
    416	case USB_ID(0x0e41, 0x4246): /* Line6 HX-Stomp */
    417	case USB_ID(0x0e41, 0x4253): /* Line6 HX-Stomp XL */
    418	case USB_ID(0x0e41, 0x4247): /* Line6 Pod Go */
    419	case USB_ID(0x0e41, 0x4248): /* Line6 Helix >= fw 2.82 */
    420	case USB_ID(0x0e41, 0x4249): /* Line6 Helix Rack >= fw 2.82 */
    421	case USB_ID(0x0e41, 0x424a): /* Line6 Helix LT >= fw 2.82 */
    422	case USB_ID(0x19f7, 0x0011): /* Rode Rodecaster Pro */
    423		return set_fixed_rate(fp, 48000, SNDRV_PCM_RATE_48000);
    424	}
    425
    426	return -ENODEV;
    427}
    428
    429/* check whether the given altsetting is supported for the already set rate */
    430static bool check_valid_altsetting_v2v3(struct snd_usb_audio *chip, int iface,
    431					int altsetting)
    432{
    433	struct usb_device *dev = chip->dev;
    434	__le64 raw_data = 0;
    435	u64 data;
    436	int err;
    437
    438	/* we assume 64bit is enough for any altsettings */
    439	if (snd_BUG_ON(altsetting >= 64 - 8))
    440		return false;
    441
    442	err = snd_usb_ctl_msg(dev, usb_rcvctrlpipe(dev, 0), UAC2_CS_CUR,
    443			      USB_TYPE_CLASS | USB_RECIP_INTERFACE | USB_DIR_IN,
    444			      UAC2_AS_VAL_ALT_SETTINGS << 8,
    445			      iface, &raw_data, sizeof(raw_data));
    446	if (err < 0)
    447		return false;
    448
    449	data = le64_to_cpu(raw_data);
    450	/* first byte contains the bitmap size */
    451	if ((data & 0xff) * 8 < altsetting)
    452		return false;
    453	if (data & (1ULL << (altsetting + 8)))
    454		return true;
    455
    456	return false;
    457}
    458
    459/*
    460 * Validate each sample rate with the altsetting
    461 * Rebuild the rate table if only partial values are valid
    462 */
    463static int validate_sample_rate_table_v2v3(struct snd_usb_audio *chip,
    464					   struct audioformat *fp,
    465					   int clock)
    466{
    467	struct usb_device *dev = chip->dev;
    468	unsigned int *table;
    469	unsigned int nr_rates;
    470	int i, err;
    471
    472	/* performing the rate verification may lead to unexpected USB bus
    473	 * behavior afterwards by some unknown reason.  Do this only for the
    474	 * known devices.
    475	 */
    476	if (!(chip->quirk_flags & QUIRK_FLAG_VALIDATE_RATES))
    477		return 0; /* don't perform the validation as default */
    478
    479	table = kcalloc(fp->nr_rates, sizeof(*table), GFP_KERNEL);
    480	if (!table)
    481		return -ENOMEM;
    482
    483	/* clear the interface altsetting at first */
    484	usb_set_interface(dev, fp->iface, 0);
    485
    486	nr_rates = 0;
    487	for (i = 0; i < fp->nr_rates; i++) {
    488		err = snd_usb_set_sample_rate_v2v3(chip, fp, clock,
    489						   fp->rate_table[i]);
    490		if (err < 0)
    491			continue;
    492
    493		if (check_valid_altsetting_v2v3(chip, fp->iface, fp->altsetting))
    494			table[nr_rates++] = fp->rate_table[i];
    495	}
    496
    497	if (!nr_rates) {
    498		usb_audio_dbg(chip,
    499			      "No valid sample rate available for %d:%d, assuming a firmware bug\n",
    500			      fp->iface, fp->altsetting);
    501		nr_rates = fp->nr_rates; /* continue as is */
    502	}
    503
    504	if (fp->nr_rates == nr_rates) {
    505		kfree(table);
    506		return 0;
    507	}
    508
    509	kfree(fp->rate_table);
    510	fp->rate_table = table;
    511	fp->nr_rates = nr_rates;
    512	return 0;
    513}
    514
    515/*
    516 * parse the format descriptor and stores the possible sample rates
    517 * on the audioformat table (audio class v2 and v3).
    518 */
    519static int parse_audio_format_rates_v2v3(struct snd_usb_audio *chip,
    520				       struct audioformat *fp)
    521{
    522	struct usb_device *dev = chip->dev;
    523	unsigned char tmp[2], *data;
    524	int nr_triplets, data_size, ret = 0, ret_l6;
    525	int clock = snd_usb_clock_find_source(chip, fp, false);
    526
    527	if (clock < 0) {
    528		dev_err(&dev->dev,
    529			"%s(): unable to find clock source (clock %d)\n",
    530				__func__, clock);
    531		goto err;
    532	}
    533
    534	/* get the number of sample rates first by only fetching 2 bytes */
    535	ret = snd_usb_ctl_msg(dev, usb_rcvctrlpipe(dev, 0), UAC2_CS_RANGE,
    536			      USB_TYPE_CLASS | USB_RECIP_INTERFACE | USB_DIR_IN,
    537			      UAC2_CS_CONTROL_SAM_FREQ << 8,
    538			      snd_usb_ctrl_intf(chip) | (clock << 8),
    539			      tmp, sizeof(tmp));
    540
    541	if (ret < 0) {
    542		/* line6 helix devices don't support UAC2_CS_CONTROL_SAM_FREQ call */
    543		ret_l6 = line6_parse_audio_format_rates_quirk(chip, fp);
    544		if (ret_l6 == -ENODEV) {
    545			/* no line6 device found continue showing the error */
    546			dev_err(&dev->dev,
    547				"%s(): unable to retrieve number of sample rates (clock %d)\n",
    548				__func__, clock);
    549			goto err;
    550		}
    551		if (ret_l6 == 0) {
    552			dev_info(&dev->dev,
    553				"%s(): unable to retrieve number of sample rates: set it to a predefined value (clock %d).\n",
    554				__func__, clock);
    555			return 0;
    556		}
    557		ret = ret_l6;
    558		goto err;
    559	}
    560
    561	nr_triplets = (tmp[1] << 8) | tmp[0];
    562	data_size = 2 + 12 * nr_triplets;
    563	data = kzalloc(data_size, GFP_KERNEL);
    564	if (!data) {
    565		ret = -ENOMEM;
    566		goto err;
    567	}
    568
    569	/* now get the full information */
    570	ret = snd_usb_ctl_msg(dev, usb_rcvctrlpipe(dev, 0), UAC2_CS_RANGE,
    571			      USB_TYPE_CLASS | USB_RECIP_INTERFACE | USB_DIR_IN,
    572			      UAC2_CS_CONTROL_SAM_FREQ << 8,
    573			      snd_usb_ctrl_intf(chip) | (clock << 8),
    574			      data, data_size);
    575
    576	if (ret < 0) {
    577		dev_err(&dev->dev,
    578			"%s(): unable to retrieve sample rate range (clock %d)\n",
    579				__func__, clock);
    580		ret = -EINVAL;
    581		goto err_free;
    582	}
    583
    584	/* Call the triplet parser, and make sure fp->rate_table is NULL.
    585	 * We just use the return value to know how many sample rates we
    586	 * will have to deal with. */
    587	kfree(fp->rate_table);
    588	fp->rate_table = NULL;
    589	fp->nr_rates = parse_uac2_sample_rate_range(chip, fp, nr_triplets, data);
    590
    591	if (fp->nr_rates == 0) {
    592		/* SNDRV_PCM_RATE_CONTINUOUS */
    593		ret = 0;
    594		goto err_free;
    595	}
    596
    597	fp->rate_table = kmalloc_array(fp->nr_rates, sizeof(int), GFP_KERNEL);
    598	if (!fp->rate_table) {
    599		ret = -ENOMEM;
    600		goto err_free;
    601	}
    602
    603	/* Call the triplet parser again, but this time, fp->rate_table is
    604	 * allocated, so the rates will be stored */
    605	parse_uac2_sample_rate_range(chip, fp, nr_triplets, data);
    606
    607	ret = validate_sample_rate_table_v2v3(chip, fp, clock);
    608	if (ret < 0)
    609		goto err_free;
    610
    611	set_rate_table_min_max(fp);
    612
    613err_free:
    614	kfree(data);
    615err:
    616	return ret;
    617}
    618
    619/*
    620 * parse the format type I and III descriptors
    621 */
    622static int parse_audio_format_i(struct snd_usb_audio *chip,
    623				struct audioformat *fp, u64 format,
    624				void *_fmt)
    625{
    626	snd_pcm_format_t pcm_format;
    627	unsigned int fmt_type;
    628	int ret;
    629
    630	switch (fp->protocol) {
    631	default:
    632	case UAC_VERSION_1:
    633	case UAC_VERSION_2: {
    634		struct uac_format_type_i_continuous_descriptor *fmt = _fmt;
    635
    636		fmt_type = fmt->bFormatType;
    637		break;
    638	}
    639	case UAC_VERSION_3: {
    640		/* fp->fmt_type is already set in this case */
    641		fmt_type = fp->fmt_type;
    642		break;
    643	}
    644	}
    645
    646	if (fmt_type == UAC_FORMAT_TYPE_III) {
    647		/* FIXME: the format type is really IECxxx
    648		 *        but we give normal PCM format to get the existing
    649		 *        apps working...
    650		 */
    651		switch (chip->usb_id) {
    652
    653		case USB_ID(0x0763, 0x2003): /* M-Audio Audiophile USB */
    654			if (chip->setup == 0x00 && 
    655			    fp->altsetting == 6)
    656				pcm_format = SNDRV_PCM_FORMAT_S16_BE;
    657			else
    658				pcm_format = SNDRV_PCM_FORMAT_S16_LE;
    659			break;
    660		default:
    661			pcm_format = SNDRV_PCM_FORMAT_S16_LE;
    662		}
    663		fp->formats = pcm_format_to_bits(pcm_format);
    664	} else {
    665		fp->formats = parse_audio_format_i_type(chip, fp, format, _fmt);
    666		if (!fp->formats)
    667			return -EINVAL;
    668	}
    669
    670	/* gather possible sample rates */
    671	/* audio class v1 reports possible sample rates as part of the
    672	 * proprietary class specific descriptor.
    673	 * audio class v2 uses class specific EP0 range requests for that.
    674	 */
    675	switch (fp->protocol) {
    676	default:
    677	case UAC_VERSION_1: {
    678		struct uac_format_type_i_continuous_descriptor *fmt = _fmt;
    679
    680		fp->channels = fmt->bNrChannels;
    681		ret = parse_audio_format_rates_v1(chip, fp, (unsigned char *) fmt, 7);
    682		break;
    683	}
    684	case UAC_VERSION_2:
    685	case UAC_VERSION_3: {
    686		/* fp->channels is already set in this case */
    687		ret = parse_audio_format_rates_v2v3(chip, fp);
    688		break;
    689	}
    690	}
    691
    692	if (fp->channels < 1) {
    693		usb_audio_err(chip,
    694			"%u:%d : invalid channels %d\n",
    695			fp->iface, fp->altsetting, fp->channels);
    696		return -EINVAL;
    697	}
    698
    699	return ret;
    700}
    701
    702/*
    703 * parse the format type II descriptor
    704 */
    705static int parse_audio_format_ii(struct snd_usb_audio *chip,
    706				 struct audioformat *fp,
    707				 u64 format, void *_fmt)
    708{
    709	int brate, framesize, ret;
    710
    711	switch (format) {
    712	case UAC_FORMAT_TYPE_II_AC3:
    713		/* FIXME: there is no AC3 format defined yet */
    714		// fp->formats = SNDRV_PCM_FMTBIT_AC3;
    715		fp->formats = SNDRV_PCM_FMTBIT_U8; /* temporary hack to receive byte streams */
    716		break;
    717	case UAC_FORMAT_TYPE_II_MPEG:
    718		fp->formats = SNDRV_PCM_FMTBIT_MPEG;
    719		break;
    720	default:
    721		usb_audio_info(chip,
    722			 "%u:%d : unknown format tag %#llx is detected.  processed as MPEG.\n",
    723			 fp->iface, fp->altsetting, format);
    724		fp->formats = SNDRV_PCM_FMTBIT_MPEG;
    725		break;
    726	}
    727
    728	fp->channels = 1;
    729
    730	switch (fp->protocol) {
    731	default:
    732	case UAC_VERSION_1: {
    733		struct uac_format_type_ii_discrete_descriptor *fmt = _fmt;
    734		brate = le16_to_cpu(fmt->wMaxBitRate);
    735		framesize = le16_to_cpu(fmt->wSamplesPerFrame);
    736		usb_audio_info(chip, "found format II with max.bitrate = %d, frame size=%d\n", brate, framesize);
    737		fp->frame_size = framesize;
    738		ret = parse_audio_format_rates_v1(chip, fp, _fmt, 8); /* fmt[8..] sample rates */
    739		break;
    740	}
    741	case UAC_VERSION_2: {
    742		struct uac_format_type_ii_ext_descriptor *fmt = _fmt;
    743		brate = le16_to_cpu(fmt->wMaxBitRate);
    744		framesize = le16_to_cpu(fmt->wSamplesPerFrame);
    745		usb_audio_info(chip, "found format II with max.bitrate = %d, frame size=%d\n", brate, framesize);
    746		fp->frame_size = framesize;
    747		ret = parse_audio_format_rates_v2v3(chip, fp);
    748		break;
    749	}
    750	}
    751
    752	return ret;
    753}
    754
    755int snd_usb_parse_audio_format(struct snd_usb_audio *chip,
    756			       struct audioformat *fp, u64 format,
    757			       struct uac_format_type_i_continuous_descriptor *fmt,
    758			       int stream)
    759{
    760	int err;
    761
    762	switch (fmt->bFormatType) {
    763	case UAC_FORMAT_TYPE_I:
    764	case UAC_FORMAT_TYPE_III:
    765		err = parse_audio_format_i(chip, fp, format, fmt);
    766		break;
    767	case UAC_FORMAT_TYPE_II:
    768		err = parse_audio_format_ii(chip, fp, format, fmt);
    769		break;
    770	default:
    771		usb_audio_info(chip,
    772			 "%u:%d : format type %d is not supported yet\n",
    773			 fp->iface, fp->altsetting,
    774			 fmt->bFormatType);
    775		return -ENOTSUPP;
    776	}
    777	fp->fmt_type = fmt->bFormatType;
    778	if (err < 0)
    779		return err;
    780#if 1
    781	/* FIXME: temporary hack for extigy/audigy 2 nx/zs */
    782	/* extigy apparently supports sample rates other than 48k
    783	 * but not in ordinary way.  so we enable only 48k atm.
    784	 */
    785	if (chip->usb_id == USB_ID(0x041e, 0x3000) ||
    786	    chip->usb_id == USB_ID(0x041e, 0x3020) ||
    787	    chip->usb_id == USB_ID(0x041e, 0x3061)) {
    788		if (fmt->bFormatType == UAC_FORMAT_TYPE_I &&
    789		    fp->rates != SNDRV_PCM_RATE_48000 &&
    790		    fp->rates != SNDRV_PCM_RATE_96000)
    791			return -ENOTSUPP;
    792	}
    793#endif
    794	return 0;
    795}
    796
    797int snd_usb_parse_audio_format_v3(struct snd_usb_audio *chip,
    798			       struct audioformat *fp,
    799			       struct uac3_as_header_descriptor *as,
    800			       int stream)
    801{
    802	u64 format = le64_to_cpu(as->bmFormats);
    803	int err;
    804
    805	/*
    806	 * Type I format bits are D0..D6
    807	 * This test works because type IV is not supported
    808	 */
    809	if (format & 0x7f)
    810		fp->fmt_type = UAC_FORMAT_TYPE_I;
    811	else
    812		fp->fmt_type = UAC_FORMAT_TYPE_III;
    813
    814	err = parse_audio_format_i(chip, fp, format, as);
    815	if (err < 0)
    816		return err;
    817
    818	return 0;
    819}