brintos

brintos / linux-shallow public Read only

0
0
Text · 32.8 KiB · c1ea884 Raw
1273 lines · c
1// SPDX-License-Identifier: GPL-2.0-or-later2/*3 */4 5 6#include <linux/init.h>7#include <linux/slab.h>8#include <linux/usb.h>9#include <linux/usb/audio.h>10#include <linux/usb/audio-v2.h>11#include <linux/usb/audio-v3.h>12 13#include <sound/core.h>14#include <sound/pcm.h>15#include <sound/control.h>16#include <sound/tlv.h>17 18#include "usbaudio.h"19#include "card.h"20#include "proc.h"21#include "quirks.h"22#include "endpoint.h"23#include "pcm.h"24#include "helper.h"25#include "format.h"26#include "clock.h"27#include "stream.h"28#include "power.h"29#include "media.h"30 31static void audioformat_free(struct audioformat *fp)32{33	list_del(&fp->list); /* unlink for avoiding double-free */34	kfree(fp->rate_table);35	kfree(fp->chmap);36	kfree(fp);37}38 39/*40 * free a substream41 */42static void free_substream(struct snd_usb_substream *subs)43{44	struct audioformat *fp, *n;45 46	if (!subs->num_formats)47		return; /* not initialized */48	list_for_each_entry_safe(fp, n, &subs->fmt_list, list)49		audioformat_free(fp);50	kfree(subs->str_pd);51	snd_media_stream_delete(subs);52}53 54 55/*56 * free a usb stream instance57 */58static void snd_usb_audio_stream_free(struct snd_usb_stream *stream)59{60	free_substream(&stream->substream[0]);61	free_substream(&stream->substream[1]);62	list_del(&stream->list);63	kfree(stream);64}65 66static void snd_usb_audio_pcm_free(struct snd_pcm *pcm)67{68	struct snd_usb_stream *stream = pcm->private_data;69	if (stream) {70		stream->pcm = NULL;71		snd_usb_audio_stream_free(stream);72	}73}74 75/*76 * initialize the substream instance.77 */78 79static void snd_usb_init_substream(struct snd_usb_stream *as,80				   int stream,81				   struct audioformat *fp,82				   struct snd_usb_power_domain *pd)83{84	struct snd_usb_substream *subs = &as->substream[stream];85 86	INIT_LIST_HEAD(&subs->fmt_list);87	spin_lock_init(&subs->lock);88 89	subs->stream = as;90	subs->direction = stream;91	subs->dev = as->chip->dev;92	subs->txfr_quirk = !!(as->chip->quirk_flags & QUIRK_FLAG_ALIGN_TRANSFER);93	subs->tx_length_quirk = !!(as->chip->quirk_flags & QUIRK_FLAG_TX_LENGTH);94	subs->speed = snd_usb_get_speed(subs->dev);95	subs->pkt_offset_adj = 0;96	subs->stream_offset_adj = 0;97 98	snd_usb_set_pcm_ops(as->pcm, stream);99 100	list_add_tail(&fp->list, &subs->fmt_list);101	subs->formats |= fp->formats;102	subs->num_formats++;103	subs->fmt_type = fp->fmt_type;104	subs->ep_num = fp->endpoint;105	if (fp->channels > subs->channels_max)106		subs->channels_max = fp->channels;107 108	if (pd) {109		subs->str_pd = pd;110		/* Initialize Power Domain to idle status D1 */111		snd_usb_power_domain_set(subs->stream->chip, pd,112					 UAC3_PD_STATE_D1);113	}114 115	snd_usb_preallocate_buffer(subs);116}117 118/* kctl callbacks for usb-audio channel maps */119static int usb_chmap_ctl_info(struct snd_kcontrol *kcontrol,120			      struct snd_ctl_elem_info *uinfo)121{122	struct snd_pcm_chmap *info = snd_kcontrol_chip(kcontrol);123	struct snd_usb_substream *subs = info->private_data;124 125	uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;126	uinfo->count = subs->channels_max;127	uinfo->value.integer.min = 0;128	uinfo->value.integer.max = SNDRV_CHMAP_LAST;129	return 0;130}131 132/* check whether a duplicated entry exists in the audiofmt list */133static bool have_dup_chmap(struct snd_usb_substream *subs,134			   struct audioformat *fp)135{136	struct audioformat *prev = fp;137 138	list_for_each_entry_continue_reverse(prev, &subs->fmt_list, list) {139		if (prev->chmap &&140		    !memcmp(prev->chmap, fp->chmap, sizeof(*fp->chmap)))141			return true;142	}143	return false;144}145 146static int usb_chmap_ctl_tlv(struct snd_kcontrol *kcontrol, int op_flag,147			     unsigned int size, unsigned int __user *tlv)148{149	struct snd_pcm_chmap *info = snd_kcontrol_chip(kcontrol);150	struct snd_usb_substream *subs = info->private_data;151	struct audioformat *fp;152	unsigned int __user *dst;153	int count = 0;154 155	if (size < 8)156		return -ENOMEM;157	if (put_user(SNDRV_CTL_TLVT_CONTAINER, tlv))158		return -EFAULT;159	size -= 8;160	dst = tlv + 2;161	list_for_each_entry(fp, &subs->fmt_list, list) {162		int i, ch_bytes;163 164		if (!fp->chmap)165			continue;166		if (have_dup_chmap(subs, fp))167			continue;168		/* copy the entry */169		ch_bytes = fp->chmap->channels * 4;170		if (size < 8 + ch_bytes)171			return -ENOMEM;172		if (put_user(SNDRV_CTL_TLVT_CHMAP_FIXED, dst) ||173		    put_user(ch_bytes, dst + 1))174			return -EFAULT;175		dst += 2;176		for (i = 0; i < fp->chmap->channels; i++, dst++) {177			if (put_user(fp->chmap->map[i], dst))178				return -EFAULT;179		}180 181		count += 8 + ch_bytes;182		size -= 8 + ch_bytes;183	}184	if (put_user(count, tlv + 1))185		return -EFAULT;186	return 0;187}188 189static int usb_chmap_ctl_get(struct snd_kcontrol *kcontrol,190			     struct snd_ctl_elem_value *ucontrol)191{192	struct snd_pcm_chmap *info = snd_kcontrol_chip(kcontrol);193	struct snd_usb_substream *subs = info->private_data;194	struct snd_pcm_chmap_elem *chmap = NULL;195	int i = 0;196 197	if (subs->cur_audiofmt)198		chmap = subs->cur_audiofmt->chmap;199	if (chmap) {200		for (i = 0; i < chmap->channels; i++)201			ucontrol->value.integer.value[i] = chmap->map[i];202	}203	for (; i < subs->channels_max; i++)204		ucontrol->value.integer.value[i] = 0;205	return 0;206}207 208/* create a chmap kctl assigned to the given USB substream */209static int add_chmap(struct snd_pcm *pcm, int stream,210		     struct snd_usb_substream *subs)211{212	struct audioformat *fp;213	struct snd_pcm_chmap *chmap;214	struct snd_kcontrol *kctl;215	int err;216 217	list_for_each_entry(fp, &subs->fmt_list, list)218		if (fp->chmap)219			goto ok;220	/* no chmap is found */221	return 0;222 223 ok:224	err = snd_pcm_add_chmap_ctls(pcm, stream, NULL, 0, 0, &chmap);225	if (err < 0)226		return err;227 228	/* override handlers */229	chmap->private_data = subs;230	kctl = chmap->kctl;231	kctl->info = usb_chmap_ctl_info;232	kctl->get = usb_chmap_ctl_get;233	kctl->tlv.c = usb_chmap_ctl_tlv;234 235	return 0;236}237 238/* convert from USB ChannelConfig bits to ALSA chmap element */239static struct snd_pcm_chmap_elem *convert_chmap(int channels, unsigned int bits,240						int protocol)241{242	static const unsigned int uac1_maps[] = {243		SNDRV_CHMAP_FL,		/* left front */244		SNDRV_CHMAP_FR,		/* right front */245		SNDRV_CHMAP_FC,		/* center front */246		SNDRV_CHMAP_LFE,	/* LFE */247		SNDRV_CHMAP_RL,		/* left surround */248		SNDRV_CHMAP_RR,		/* right surround */249		SNDRV_CHMAP_FLC,	/* left of center */250		SNDRV_CHMAP_FRC,	/* right of center */251		SNDRV_CHMAP_RC,		/* surround */252		SNDRV_CHMAP_SL,		/* side left */253		SNDRV_CHMAP_SR,		/* side right */254		SNDRV_CHMAP_TC,		/* top */255		0 /* terminator */256	};257	static const unsigned int uac2_maps[] = {258		SNDRV_CHMAP_FL,		/* front left */259		SNDRV_CHMAP_FR,		/* front right */260		SNDRV_CHMAP_FC,		/* front center */261		SNDRV_CHMAP_LFE,	/* LFE */262		SNDRV_CHMAP_RL,		/* back left */263		SNDRV_CHMAP_RR,		/* back right */264		SNDRV_CHMAP_FLC,	/* front left of center */265		SNDRV_CHMAP_FRC,	/* front right of center */266		SNDRV_CHMAP_RC,		/* back center */267		SNDRV_CHMAP_SL,		/* side left */268		SNDRV_CHMAP_SR,		/* side right */269		SNDRV_CHMAP_TC,		/* top center */270		SNDRV_CHMAP_TFL,	/* top front left */271		SNDRV_CHMAP_TFC,	/* top front center */272		SNDRV_CHMAP_TFR,	/* top front right */273		SNDRV_CHMAP_TRL,	/* top back left */274		SNDRV_CHMAP_TRC,	/* top back center */275		SNDRV_CHMAP_TRR,	/* top back right */276		SNDRV_CHMAP_TFLC,	/* top front left of center */277		SNDRV_CHMAP_TFRC,	/* top front right of center */278		SNDRV_CHMAP_LLFE,	/* left LFE */279		SNDRV_CHMAP_RLFE,	/* right LFE */280		SNDRV_CHMAP_TSL,	/* top side left */281		SNDRV_CHMAP_TSR,	/* top side right */282		SNDRV_CHMAP_BC,		/* bottom center */283		SNDRV_CHMAP_RLC,	/* back left of center */284		SNDRV_CHMAP_RRC,	/* back right of center */285		0 /* terminator */286	};287	struct snd_pcm_chmap_elem *chmap;288	const unsigned int *maps;289	int c;290 291	if (channels > ARRAY_SIZE(chmap->map))292		return NULL;293 294	chmap = kzalloc(sizeof(*chmap), GFP_KERNEL);295	if (!chmap)296		return NULL;297 298	maps = protocol == UAC_VERSION_2 ? uac2_maps : uac1_maps;299	chmap->channels = channels;300	c = 0;301 302	if (bits) {303		for (; bits && *maps; maps++, bits >>= 1) {304			if (bits & 1)305				chmap->map[c++] = *maps;306			if (c == chmap->channels)307				break;308		}309	} else {310		/* If we're missing wChannelConfig, then guess something311		    to make sure the channel map is not skipped entirely */312		if (channels == 1)313			chmap->map[c++] = SNDRV_CHMAP_MONO;314		else315			for (; c < channels && *maps; maps++)316				chmap->map[c++] = *maps;317	}318 319	for (; c < channels; c++)320		chmap->map[c] = SNDRV_CHMAP_UNKNOWN;321 322	return chmap;323}324 325/* UAC3 device stores channels information in Cluster Descriptors */326static struct327snd_pcm_chmap_elem *convert_chmap_v3(struct uac3_cluster_header_descriptor328								*cluster)329{330	unsigned int channels = cluster->bNrChannels;331	struct snd_pcm_chmap_elem *chmap;332	void *p = cluster;333	int len, c;334 335	if (channels > ARRAY_SIZE(chmap->map))336		return NULL;337 338	chmap = kzalloc(sizeof(*chmap), GFP_KERNEL);339	if (!chmap)340		return NULL;341 342	len = le16_to_cpu(cluster->wLength);343	c = 0;344	p += sizeof(struct uac3_cluster_header_descriptor);345 346	while (((p - (void *)cluster) < len) && (c < channels)) {347		struct uac3_cluster_segment_descriptor *cs_desc = p;348		u16 cs_len;349		u8 cs_type;350 351		cs_len = le16_to_cpu(cs_desc->wLength);352		cs_type = cs_desc->bSegmentType;353 354		if (cs_type == UAC3_CHANNEL_INFORMATION) {355			struct uac3_cluster_information_segment_descriptor *is = p;356			unsigned char map;357 358			/*359			 * TODO: this conversion is not complete, update it360			 * after adding UAC3 values to asound.h361			 */362			switch (is->bChRelationship) {363			case UAC3_CH_MONO:364				map = SNDRV_CHMAP_MONO;365				break;366			case UAC3_CH_LEFT:367			case UAC3_CH_FRONT_LEFT:368			case UAC3_CH_HEADPHONE_LEFT:369				map = SNDRV_CHMAP_FL;370				break;371			case UAC3_CH_RIGHT:372			case UAC3_CH_FRONT_RIGHT:373			case UAC3_CH_HEADPHONE_RIGHT:374				map = SNDRV_CHMAP_FR;375				break;376			case UAC3_CH_FRONT_CENTER:377				map = SNDRV_CHMAP_FC;378				break;379			case UAC3_CH_FRONT_LEFT_OF_CENTER:380				map = SNDRV_CHMAP_FLC;381				break;382			case UAC3_CH_FRONT_RIGHT_OF_CENTER:383				map = SNDRV_CHMAP_FRC;384				break;385			case UAC3_CH_SIDE_LEFT:386				map = SNDRV_CHMAP_SL;387				break;388			case UAC3_CH_SIDE_RIGHT:389				map = SNDRV_CHMAP_SR;390				break;391			case UAC3_CH_BACK_LEFT:392				map = SNDRV_CHMAP_RL;393				break;394			case UAC3_CH_BACK_RIGHT:395				map = SNDRV_CHMAP_RR;396				break;397			case UAC3_CH_BACK_CENTER:398				map = SNDRV_CHMAP_RC;399				break;400			case UAC3_CH_BACK_LEFT_OF_CENTER:401				map = SNDRV_CHMAP_RLC;402				break;403			case UAC3_CH_BACK_RIGHT_OF_CENTER:404				map = SNDRV_CHMAP_RRC;405				break;406			case UAC3_CH_TOP_CENTER:407				map = SNDRV_CHMAP_TC;408				break;409			case UAC3_CH_TOP_FRONT_LEFT:410				map = SNDRV_CHMAP_TFL;411				break;412			case UAC3_CH_TOP_FRONT_RIGHT:413				map = SNDRV_CHMAP_TFR;414				break;415			case UAC3_CH_TOP_FRONT_CENTER:416				map = SNDRV_CHMAP_TFC;417				break;418			case UAC3_CH_TOP_FRONT_LOC:419				map = SNDRV_CHMAP_TFLC;420				break;421			case UAC3_CH_TOP_FRONT_ROC:422				map = SNDRV_CHMAP_TFRC;423				break;424			case UAC3_CH_TOP_SIDE_LEFT:425				map = SNDRV_CHMAP_TSL;426				break;427			case UAC3_CH_TOP_SIDE_RIGHT:428				map = SNDRV_CHMAP_TSR;429				break;430			case UAC3_CH_TOP_BACK_LEFT:431				map = SNDRV_CHMAP_TRL;432				break;433			case UAC3_CH_TOP_BACK_RIGHT:434				map = SNDRV_CHMAP_TRR;435				break;436			case UAC3_CH_TOP_BACK_CENTER:437				map = SNDRV_CHMAP_TRC;438				break;439			case UAC3_CH_BOTTOM_CENTER:440				map = SNDRV_CHMAP_BC;441				break;442			case UAC3_CH_LOW_FREQUENCY_EFFECTS:443				map = SNDRV_CHMAP_LFE;444				break;445			case UAC3_CH_LFE_LEFT:446				map = SNDRV_CHMAP_LLFE;447				break;448			case UAC3_CH_LFE_RIGHT:449				map = SNDRV_CHMAP_RLFE;450				break;451			case UAC3_CH_RELATIONSHIP_UNDEFINED:452			default:453				map = SNDRV_CHMAP_UNKNOWN;454				break;455			}456			chmap->map[c++] = map;457		}458		p += cs_len;459	}460 461	if (channels < c)462		pr_err("%s: channel number mismatch\n", __func__);463 464	chmap->channels = channels;465 466	for (; c < channels; c++)467		chmap->map[c] = SNDRV_CHMAP_UNKNOWN;468 469	return chmap;470}471 472/*473 * add this endpoint to the chip instance.474 * if a stream with the same endpoint already exists, append to it.475 * if not, create a new pcm stream. note, fp is added to the substream476 * fmt_list and will be freed on the chip instance release. do not free477 * fp or do remove it from the substream fmt_list to avoid double-free.478 */479static int __snd_usb_add_audio_stream(struct snd_usb_audio *chip,480				      int stream,481				      struct audioformat *fp,482				      struct snd_usb_power_domain *pd)483 484{485	struct snd_usb_stream *as;486	struct snd_usb_substream *subs;487	struct snd_pcm *pcm;488	int err;489 490	list_for_each_entry(as, &chip->pcm_list, list) {491		if (as->fmt_type != fp->fmt_type)492			continue;493		subs = &as->substream[stream];494		if (subs->ep_num == fp->endpoint) {495			list_add_tail(&fp->list, &subs->fmt_list);496			subs->num_formats++;497			subs->formats |= fp->formats;498			return 0;499		}500	}501 502	if (chip->card->registered)503		chip->need_delayed_register = true;504 505	/* look for an empty stream */506	list_for_each_entry(as, &chip->pcm_list, list) {507		if (as->fmt_type != fp->fmt_type)508			continue;509		subs = &as->substream[stream];510		if (subs->ep_num)511			continue;512		err = snd_pcm_new_stream(as->pcm, stream, 1);513		if (err < 0)514			return err;515		snd_usb_init_substream(as, stream, fp, pd);516		return add_chmap(as->pcm, stream, subs);517	}518 519	/* create a new pcm */520	as = kzalloc(sizeof(*as), GFP_KERNEL);521	if (!as)522		return -ENOMEM;523	as->pcm_index = chip->pcm_devs;524	as->chip = chip;525	as->fmt_type = fp->fmt_type;526	err = snd_pcm_new(chip->card, "USB Audio", chip->pcm_devs,527			  stream == SNDRV_PCM_STREAM_PLAYBACK ? 1 : 0,528			  stream == SNDRV_PCM_STREAM_PLAYBACK ? 0 : 1,529			  &pcm);530	if (err < 0) {531		kfree(as);532		return err;533	}534	as->pcm = pcm;535	pcm->private_data = as;536	pcm->private_free = snd_usb_audio_pcm_free;537	pcm->info_flags = 0;538	if (chip->pcm_devs > 0)539		sprintf(pcm->name, "USB Audio #%d", chip->pcm_devs);540	else541		strcpy(pcm->name, "USB Audio");542 543	snd_usb_init_substream(as, stream, fp, pd);544 545	/*546	 * Keep using head insertion for M-Audio Audiophile USB (tm) which has a547	 * fix to swap capture stream order in conf/cards/USB-audio.conf548	 */549	if (chip->usb_id == USB_ID(0x0763, 0x2003))550		list_add(&as->list, &chip->pcm_list);551	else552		list_add_tail(&as->list, &chip->pcm_list);553 554	chip->pcm_devs++;555 556	snd_usb_proc_pcm_format_add(as);557 558	return add_chmap(pcm, stream, &as->substream[stream]);559}560 561int snd_usb_add_audio_stream(struct snd_usb_audio *chip,562			     int stream,563			     struct audioformat *fp)564{565	return __snd_usb_add_audio_stream(chip, stream, fp, NULL);566}567 568static int snd_usb_add_audio_stream_v3(struct snd_usb_audio *chip,569				       int stream,570				       struct audioformat *fp,571				       struct snd_usb_power_domain *pd)572{573	return __snd_usb_add_audio_stream(chip, stream, fp, pd);574}575 576static int parse_uac_endpoint_attributes(struct snd_usb_audio *chip,577					 struct usb_host_interface *alts,578					 int protocol, int iface_no)579{580	/* parsed with a v1 header here. that's ok as we only look at the581	 * header first which is the same for both versions */582	struct uac_iso_endpoint_descriptor *csep;583	struct usb_interface_descriptor *altsd = get_iface_desc(alts);584	int attributes = 0;585 586	csep = snd_usb_find_desc(alts->endpoint[0].extra, alts->endpoint[0].extralen, NULL, USB_DT_CS_ENDPOINT);587 588	/* Creamware Noah has this descriptor after the 2nd endpoint */589	if (!csep && altsd->bNumEndpoints >= 2)590		csep = snd_usb_find_desc(alts->endpoint[1].extra, alts->endpoint[1].extralen, NULL, USB_DT_CS_ENDPOINT);591 592	/*593	 * If we can't locate the USB_DT_CS_ENDPOINT descriptor in the extra594	 * bytes after the first endpoint, go search the entire interface.595	 * Some devices have it directly *before* the standard endpoint.596	 */597	if (!csep)598		csep = snd_usb_find_desc(alts->extra, alts->extralen, NULL, USB_DT_CS_ENDPOINT);599 600	if (!csep || csep->bLength < 7 ||601	    csep->bDescriptorSubtype != UAC_EP_GENERAL)602		goto error;603 604	if (protocol == UAC_VERSION_1) {605		attributes = csep->bmAttributes;606	} else if (protocol == UAC_VERSION_2) {607		struct uac2_iso_endpoint_descriptor *csep2 =608			(struct uac2_iso_endpoint_descriptor *) csep;609 610		if (csep2->bLength < sizeof(*csep2))611			goto error;612		attributes = csep->bmAttributes & UAC_EP_CS_ATTR_FILL_MAX;613 614		/* emulate the endpoint attributes of a v1 device */615		if (csep2->bmControls & UAC2_CONTROL_PITCH)616			attributes |= UAC_EP_CS_ATTR_PITCH_CONTROL;617	} else { /* UAC_VERSION_3 */618		struct uac3_iso_endpoint_descriptor *csep3 =619			(struct uac3_iso_endpoint_descriptor *) csep;620 621		if (csep3->bLength < sizeof(*csep3))622			goto error;623		/* emulate the endpoint attributes of a v1 device */624		if (le32_to_cpu(csep3->bmControls) & UAC2_CONTROL_PITCH)625			attributes |= UAC_EP_CS_ATTR_PITCH_CONTROL;626	}627 628	return attributes;629 630 error:631	usb_audio_warn(chip,632		       "%u:%d : no or invalid class specific endpoint descriptor\n",633		       iface_no, altsd->bAlternateSetting);634	return 0;635}636 637/* find an input terminal descriptor (either UAC1 or UAC2) with the given638 * terminal id639 */640static void *641snd_usb_find_input_terminal_descriptor(struct usb_host_interface *ctrl_iface,642				       int terminal_id, int protocol)643{644	struct uac2_input_terminal_descriptor *term = NULL;645 646	while ((term = snd_usb_find_csint_desc(ctrl_iface->extra,647					       ctrl_iface->extralen,648					       term, UAC_INPUT_TERMINAL))) {649		if (!snd_usb_validate_audio_desc(term, protocol))650			continue;651		if (term->bTerminalID == terminal_id)652			return term;653	}654 655	return NULL;656}657 658static void *659snd_usb_find_output_terminal_descriptor(struct usb_host_interface *ctrl_iface,660					int terminal_id, int protocol)661{662	/* OK to use with both UAC2 and UAC3 */663	struct uac2_output_terminal_descriptor *term = NULL;664 665	while ((term = snd_usb_find_csint_desc(ctrl_iface->extra,666					       ctrl_iface->extralen,667					       term, UAC_OUTPUT_TERMINAL))) {668		if (!snd_usb_validate_audio_desc(term, protocol))669			continue;670		if (term->bTerminalID == terminal_id)671			return term;672	}673 674	return NULL;675}676 677static struct audioformat *678audio_format_alloc_init(struct snd_usb_audio *chip,679		       struct usb_host_interface *alts,680		       int protocol, int iface_no, int altset_idx,681		       int altno, int num_channels, int clock)682{683	struct audioformat *fp;684 685	fp = kzalloc(sizeof(*fp), GFP_KERNEL);686	if (!fp)687		return NULL;688 689	fp->iface = iface_no;690	fp->altsetting = altno;691	fp->altset_idx = altset_idx;692	fp->endpoint = get_endpoint(alts, 0)->bEndpointAddress;693	fp->ep_attr = get_endpoint(alts, 0)->bmAttributes;694	fp->datainterval = snd_usb_parse_datainterval(chip, alts);695	fp->protocol = protocol;696	fp->maxpacksize = le16_to_cpu(get_endpoint(alts, 0)->wMaxPacketSize);697	fp->channels = num_channels;698	if (snd_usb_get_speed(chip->dev) == USB_SPEED_HIGH)699		fp->maxpacksize = (((fp->maxpacksize >> 11) & 3) + 1)700				* (fp->maxpacksize & 0x7ff);701	fp->clock = clock;702	INIT_LIST_HEAD(&fp->list);703 704	return fp;705}706 707static struct audioformat *708snd_usb_get_audioformat_uac12(struct snd_usb_audio *chip,709			      struct usb_host_interface *alts,710			      int protocol, int iface_no, int altset_idx,711			      int altno, int stream, int bm_quirk)712{713	struct usb_device *dev = chip->dev;714	struct uac_format_type_i_continuous_descriptor *fmt;715	unsigned int num_channels = 0, chconfig = 0;716	struct usb_host_interface *ctrl_intf;717	struct audioformat *fp;718	int clock = 0;719	u64 format;720 721	ctrl_intf = snd_usb_find_ctrl_interface(chip, iface_no);722 723	/* get audio formats */724	if (protocol == UAC_VERSION_1) {725		struct uac1_as_header_descriptor *as =726			snd_usb_find_csint_desc(alts->extra, alts->extralen,727						NULL, UAC_AS_GENERAL);728		struct uac_input_terminal_descriptor *iterm;729 730		if (!as) {731			dev_err(&dev->dev,732				"%u:%d : UAC_AS_GENERAL descriptor not found\n",733				iface_no, altno);734			return NULL;735		}736 737		if (as->bLength < sizeof(*as)) {738			dev_err(&dev->dev,739				"%u:%d : invalid UAC_AS_GENERAL desc\n",740				iface_no, altno);741			return NULL;742		}743 744		format = le16_to_cpu(as->wFormatTag); /* remember the format value */745 746		iterm = snd_usb_find_input_terminal_descriptor(ctrl_intf,747							       as->bTerminalLink,748							       protocol);749		if (iterm) {750			num_channels = iterm->bNrChannels;751			chconfig = le16_to_cpu(iterm->wChannelConfig);752		}753	} else { /* UAC_VERSION_2 */754		struct uac2_input_terminal_descriptor *input_term;755		struct uac2_output_terminal_descriptor *output_term;756		struct uac2_as_header_descriptor *as =757			snd_usb_find_csint_desc(alts->extra, alts->extralen,758						NULL, UAC_AS_GENERAL);759 760		if (!as) {761			dev_err(&dev->dev,762				"%u:%d : UAC_AS_GENERAL descriptor not found\n",763				iface_no, altno);764			return NULL;765		}766 767		if (as->bLength < sizeof(*as)) {768			dev_err(&dev->dev,769				"%u:%d : invalid UAC_AS_GENERAL desc\n",770				iface_no, altno);771			return NULL;772		}773 774		num_channels = as->bNrChannels;775		format = le32_to_cpu(as->bmFormats);776		chconfig = le32_to_cpu(as->bmChannelConfig);777 778		/*779		 * lookup the terminal associated to this interface780		 * to extract the clock781		 */782		input_term = snd_usb_find_input_terminal_descriptor(ctrl_intf,783								    as->bTerminalLink,784								    protocol);785		if (input_term) {786			clock = input_term->bCSourceID;787			if (!chconfig && (num_channels == input_term->bNrChannels))788				chconfig = le32_to_cpu(input_term->bmChannelConfig);789			goto found_clock;790		}791 792		output_term = snd_usb_find_output_terminal_descriptor(ctrl_intf,793								      as->bTerminalLink,794								      protocol);795		if (output_term) {796			clock = output_term->bCSourceID;797			goto found_clock;798		}799 800		dev_err(&dev->dev,801			"%u:%d : bogus bTerminalLink %d\n",802			iface_no, altno, as->bTerminalLink);803		return NULL;804	}805 806found_clock:807	/* get format type */808	fmt = snd_usb_find_csint_desc(alts->extra, alts->extralen,809				      NULL, UAC_FORMAT_TYPE);810	if (!fmt) {811		dev_err(&dev->dev,812			"%u:%d : no UAC_FORMAT_TYPE desc\n",813			iface_no, altno);814		return NULL;815	}816	if (((protocol == UAC_VERSION_1) && (fmt->bLength < 8))817			|| ((protocol == UAC_VERSION_2) &&818					(fmt->bLength < 6))) {819		dev_err(&dev->dev,820			"%u:%d : invalid UAC_FORMAT_TYPE desc\n",821			iface_no, altno);822		return NULL;823	}824 825	/*826	 * Blue Microphones workaround: The last altsetting is827	 * identical with the previous one, except for a larger828	 * packet size, but is actually a mislabeled two-channel829	 * setting; ignore it.830	 *831	 * Part 2: analyze quirk flag and format832	 */833	if (bm_quirk && fmt->bNrChannels == 1 && fmt->bSubframeSize == 2)834		return NULL;835 836	fp = audio_format_alloc_init(chip, alts, protocol, iface_no,837				     altset_idx, altno, num_channels, clock);838	if (!fp)839		return ERR_PTR(-ENOMEM);840 841	fp->attributes = parse_uac_endpoint_attributes(chip, alts, protocol,842						       iface_no);843 844	/* some quirks for attributes here */845	snd_usb_audioformat_attributes_quirk(chip, fp, stream);846 847	/* ok, let's parse further... */848	if (snd_usb_parse_audio_format(chip, fp, format,849					fmt, stream) < 0) {850		audioformat_free(fp);851		return NULL;852	}853 854	/* Create chmap */855	if (fp->channels != num_channels)856		chconfig = 0;857 858	fp->chmap = convert_chmap(fp->channels, chconfig, protocol);859 860	return fp;861}862 863static struct audioformat *864snd_usb_get_audioformat_uac3(struct snd_usb_audio *chip,865			     struct usb_host_interface *alts,866			     struct snd_usb_power_domain **pd_out,867			     int iface_no, int altset_idx,868			     int altno, int stream)869{870	struct usb_device *dev = chip->dev;871	struct uac3_input_terminal_descriptor *input_term;872	struct uac3_output_terminal_descriptor *output_term;873	struct uac3_cluster_header_descriptor *cluster;874	struct uac3_as_header_descriptor *as = NULL;875	struct uac3_hc_descriptor_header hc_header;876	struct usb_host_interface *ctrl_intf;877	struct snd_pcm_chmap_elem *chmap;878	struct snd_usb_power_domain *pd;879	unsigned char badd_profile;880	u64 badd_formats = 0;881	unsigned int num_channels;882	struct audioformat *fp;883	u16 cluster_id, wLength;884	int clock = 0;885	int err;886 887	badd_profile = chip->badd_profile;888	ctrl_intf = snd_usb_find_ctrl_interface(chip, iface_no);889 890	if (badd_profile >= UAC3_FUNCTION_SUBCLASS_GENERIC_IO) {891		unsigned int maxpacksize =892			le16_to_cpu(get_endpoint(alts, 0)->wMaxPacketSize);893 894		switch (maxpacksize) {895		default:896			dev_err(&dev->dev,897				"%u:%d : incorrect wMaxPacketSize for BADD profile\n",898				iface_no, altno);899			return NULL;900		case UAC3_BADD_EP_MAXPSIZE_SYNC_MONO_16:901		case UAC3_BADD_EP_MAXPSIZE_ASYNC_MONO_16:902			badd_formats = SNDRV_PCM_FMTBIT_S16_LE;903			num_channels = 1;904			break;905		case UAC3_BADD_EP_MAXPSIZE_SYNC_MONO_24:906		case UAC3_BADD_EP_MAXPSIZE_ASYNC_MONO_24:907			badd_formats = SNDRV_PCM_FMTBIT_S24_3LE;908			num_channels = 1;909			break;910		case UAC3_BADD_EP_MAXPSIZE_SYNC_STEREO_16:911		case UAC3_BADD_EP_MAXPSIZE_ASYNC_STEREO_16:912			badd_formats = SNDRV_PCM_FMTBIT_S16_LE;913			num_channels = 2;914			break;915		case UAC3_BADD_EP_MAXPSIZE_SYNC_STEREO_24:916		case UAC3_BADD_EP_MAXPSIZE_ASYNC_STEREO_24:917			badd_formats = SNDRV_PCM_FMTBIT_S24_3LE;918			num_channels = 2;919			break;920		}921 922		chmap = kzalloc(sizeof(*chmap), GFP_KERNEL);923		if (!chmap)924			return ERR_PTR(-ENOMEM);925 926		if (num_channels == 1) {927			chmap->map[0] = SNDRV_CHMAP_MONO;928		} else {929			chmap->map[0] = SNDRV_CHMAP_FL;930			chmap->map[1] = SNDRV_CHMAP_FR;931		}932 933		chmap->channels = num_channels;934		clock = UAC3_BADD_CS_ID9;935		goto found_clock;936	}937 938	as = snd_usb_find_csint_desc(alts->extra, alts->extralen,939				     NULL, UAC_AS_GENERAL);940	if (!as) {941		dev_err(&dev->dev,942			"%u:%d : UAC_AS_GENERAL descriptor not found\n",943			iface_no, altno);944		return NULL;945	}946 947	if (as->bLength < sizeof(*as)) {948		dev_err(&dev->dev,949			"%u:%d : invalid UAC_AS_GENERAL desc\n",950			iface_no, altno);951		return NULL;952	}953 954	cluster_id = le16_to_cpu(as->wClusterDescrID);955	if (!cluster_id) {956		dev_err(&dev->dev,957			"%u:%d : no cluster descriptor\n",958			iface_no, altno);959		return NULL;960	}961 962	/*963	 * Get number of channels and channel map through964	 * High Capability Cluster Descriptor965	 *966	 * First step: get High Capability header and967	 * read size of Cluster Descriptor968	 */969	err = snd_usb_ctl_msg(chip->dev,970			usb_rcvctrlpipe(chip->dev, 0),971			UAC3_CS_REQ_HIGH_CAPABILITY_DESCRIPTOR,972			USB_RECIP_INTERFACE | USB_TYPE_CLASS | USB_DIR_IN,973			cluster_id,974			snd_usb_ctrl_intf(ctrl_intf),975			&hc_header, sizeof(hc_header));976	if (err < 0)977		return ERR_PTR(err);978	else if (err != sizeof(hc_header)) {979		dev_err(&dev->dev,980			"%u:%d : can't get High Capability descriptor\n",981			iface_no, altno);982		return ERR_PTR(-EIO);983	}984 985	/*986	 * Second step: allocate needed amount of memory987	 * and request Cluster Descriptor988	 */989	wLength = le16_to_cpu(hc_header.wLength);990	cluster = kzalloc(wLength, GFP_KERNEL);991	if (!cluster)992		return ERR_PTR(-ENOMEM);993	err = snd_usb_ctl_msg(chip->dev,994			usb_rcvctrlpipe(chip->dev, 0),995			UAC3_CS_REQ_HIGH_CAPABILITY_DESCRIPTOR,996			USB_RECIP_INTERFACE | USB_TYPE_CLASS | USB_DIR_IN,997			cluster_id,998			snd_usb_ctrl_intf(ctrl_intf),999			cluster, wLength);1000	if (err < 0) {1001		kfree(cluster);1002		return ERR_PTR(err);1003	} else if (err != wLength) {1004		dev_err(&dev->dev,1005			"%u:%d : can't get Cluster Descriptor\n",1006			iface_no, altno);1007		kfree(cluster);1008		return ERR_PTR(-EIO);1009	}1010 1011	num_channels = cluster->bNrChannels;1012	chmap = convert_chmap_v3(cluster);1013	kfree(cluster);1014 1015	/*1016	 * lookup the terminal associated to this interface1017	 * to extract the clock1018	 */1019	input_term = snd_usb_find_input_terminal_descriptor(ctrl_intf,1020							    as->bTerminalLink,1021							    UAC_VERSION_3);1022	if (input_term) {1023		clock = input_term->bCSourceID;1024		goto found_clock;1025	}1026 1027	output_term = snd_usb_find_output_terminal_descriptor(ctrl_intf,1028							      as->bTerminalLink,1029							      UAC_VERSION_3);1030	if (output_term) {1031		clock = output_term->bCSourceID;1032		goto found_clock;1033	}1034 1035	dev_err(&dev->dev, "%u:%d : bogus bTerminalLink %d\n",1036			iface_no, altno, as->bTerminalLink);1037	kfree(chmap);1038	return NULL;1039 1040found_clock:1041	fp = audio_format_alloc_init(chip, alts, UAC_VERSION_3, iface_no,1042				     altset_idx, altno, num_channels, clock);1043	if (!fp) {1044		kfree(chmap);1045		return ERR_PTR(-ENOMEM);1046	}1047 1048	fp->chmap = chmap;1049 1050	if (badd_profile >= UAC3_FUNCTION_SUBCLASS_GENERIC_IO) {1051		fp->attributes = 0; /* No attributes */1052 1053		fp->fmt_type = UAC_FORMAT_TYPE_I;1054		fp->formats = badd_formats;1055 1056		fp->nr_rates = 0;	/* SNDRV_PCM_RATE_CONTINUOUS */1057		fp->rate_min = UAC3_BADD_SAMPLING_RATE;1058		fp->rate_max = UAC3_BADD_SAMPLING_RATE;1059		fp->rates = SNDRV_PCM_RATE_CONTINUOUS;1060 1061		pd = kzalloc(sizeof(*pd), GFP_KERNEL);1062		if (!pd) {1063			audioformat_free(fp);1064			return NULL;1065		}1066		pd->pd_id = (stream == SNDRV_PCM_STREAM_PLAYBACK) ?1067					UAC3_BADD_PD_ID10 : UAC3_BADD_PD_ID11;1068		pd->pd_d1d0_rec = UAC3_BADD_PD_RECOVER_D1D0;1069		pd->pd_d2d0_rec = UAC3_BADD_PD_RECOVER_D2D0;1070		pd->ctrl_iface = ctrl_intf;1071 1072	} else {1073		fp->attributes = parse_uac_endpoint_attributes(chip, alts,1074							       UAC_VERSION_3,1075							       iface_no);1076 1077		pd = snd_usb_find_power_domain(ctrl_intf,1078					       as->bTerminalLink);1079 1080		/* ok, let's parse further... */1081		if (snd_usb_parse_audio_format_v3(chip, fp, as, stream) < 0) {1082			kfree(pd);1083			audioformat_free(fp);1084			return NULL;1085		}1086	}1087 1088	if (pd)1089		*pd_out = pd;1090 1091	return fp;1092}1093 1094static int __snd_usb_parse_audio_interface(struct snd_usb_audio *chip,1095					   int iface_no,1096					   bool *has_non_pcm, bool non_pcm)1097{1098	struct usb_device *dev;1099	struct usb_interface *iface;1100	struct usb_host_interface *alts;1101	struct usb_interface_descriptor *altsd;1102	int i, altno, err, stream;1103	struct audioformat *fp = NULL;1104	struct snd_usb_power_domain *pd = NULL;1105	bool set_iface_first;1106	int num, protocol;1107 1108	dev = chip->dev;1109 1110	/* parse the interface's altsettings */1111	iface = usb_ifnum_to_if(dev, iface_no);1112 1113	num = iface->num_altsetting;1114 1115	/*1116	 * Dallas DS4201 workaround: It presents 5 altsettings, but the last1117	 * one misses syncpipe, and does not produce any sound.1118	 */1119	if (chip->usb_id == USB_ID(0x04fa, 0x4201) && num >= 4)1120		num = 4;1121 1122	for (i = 0; i < num; i++) {1123		alts = &iface->altsetting[i];1124		altsd = get_iface_desc(alts);1125		protocol = altsd->bInterfaceProtocol;1126		/* skip invalid one */1127		if (((altsd->bInterfaceClass != USB_CLASS_AUDIO ||1128		      (altsd->bInterfaceSubClass != USB_SUBCLASS_AUDIOSTREAMING &&1129		       altsd->bInterfaceSubClass != USB_SUBCLASS_VENDOR_SPEC)) &&1130		     altsd->bInterfaceClass != USB_CLASS_VENDOR_SPEC) ||1131		    altsd->bNumEndpoints < 1 ||1132		    le16_to_cpu(get_endpoint(alts, 0)->wMaxPacketSize) == 0)1133			continue;1134		/* must be isochronous */1135		if ((get_endpoint(alts, 0)->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) !=1136		    USB_ENDPOINT_XFER_ISOC)1137			continue;1138		/* check direction */1139		stream = (get_endpoint(alts, 0)->bEndpointAddress & USB_DIR_IN) ?1140			SNDRV_PCM_STREAM_CAPTURE : SNDRV_PCM_STREAM_PLAYBACK;1141		altno = altsd->bAlternateSetting;1142 1143		if (snd_usb_apply_interface_quirk(chip, iface_no, altno))1144			continue;1145 1146		/*1147		 * Roland audio streaming interfaces are marked with protocols1148		 * 0/1/2, but are UAC 1 compatible.1149		 */1150		if (USB_ID_VENDOR(chip->usb_id) == 0x0582 &&1151		    altsd->bInterfaceClass == USB_CLASS_VENDOR_SPEC &&1152		    protocol <= 2)1153			protocol = UAC_VERSION_1;1154 1155		switch (protocol) {1156		default:1157			dev_dbg(&dev->dev, "%u:%d: unknown interface protocol %#02x, assuming v1\n",1158				iface_no, altno, protocol);1159			protocol = UAC_VERSION_1;1160			fallthrough;1161		case UAC_VERSION_1:1162		case UAC_VERSION_2: {1163			int bm_quirk = 0;1164 1165			/*1166			 * Blue Microphones workaround: The last altsetting is1167			 * identical with the previous one, except for a larger1168			 * packet size, but is actually a mislabeled two-channel1169			 * setting; ignore it.1170			 *1171			 * Part 1: prepare quirk flag1172			 */1173			if (altno == 2 && num == 3 &&1174			    fp && fp->altsetting == 1 && fp->channels == 1 &&1175			    fp->formats == SNDRV_PCM_FMTBIT_S16_LE &&1176			    protocol == UAC_VERSION_1 &&1177			    le16_to_cpu(get_endpoint(alts, 0)->wMaxPacketSize) ==1178							fp->maxpacksize * 2)1179				bm_quirk = 1;1180 1181			fp = snd_usb_get_audioformat_uac12(chip, alts, protocol,1182							   iface_no, i, altno,1183							   stream, bm_quirk);1184			break;1185		}1186		case UAC_VERSION_3:1187			fp = snd_usb_get_audioformat_uac3(chip, alts, &pd,1188						iface_no, i, altno, stream);1189			break;1190		}1191 1192		if (!fp)1193			continue;1194		else if (IS_ERR(fp))1195			return PTR_ERR(fp);1196 1197		if (fp->fmt_type != UAC_FORMAT_TYPE_I)1198			*has_non_pcm = true;1199		if ((fp->fmt_type == UAC_FORMAT_TYPE_I) == non_pcm) {1200			audioformat_free(fp);1201			kfree(pd);1202			fp = NULL;1203			pd = NULL;1204			continue;1205		}1206 1207		snd_usb_audioformat_set_sync_ep(chip, fp);1208 1209		dev_dbg(&dev->dev, "%u:%d: add audio endpoint %#x\n", iface_no, altno, fp->endpoint);1210		if (protocol == UAC_VERSION_3)1211			err = snd_usb_add_audio_stream_v3(chip, stream, fp, pd);1212		else1213			err = snd_usb_add_audio_stream(chip, stream, fp);1214 1215		if (err < 0) {1216			audioformat_free(fp);1217			kfree(pd);1218			return err;1219		}1220 1221		/* add endpoints */1222		err = snd_usb_add_endpoint(chip, fp->endpoint,1223					   SND_USB_ENDPOINT_TYPE_DATA);1224		if (err < 0)1225			return err;1226 1227		if (fp->sync_ep) {1228			err = snd_usb_add_endpoint(chip, fp->sync_ep,1229						   fp->implicit_fb ?1230						   SND_USB_ENDPOINT_TYPE_DATA :1231						   SND_USB_ENDPOINT_TYPE_SYNC);1232			if (err < 0)1233				return err;1234		}1235 1236		set_iface_first = false;1237		if (protocol == UAC_VERSION_1 ||1238		    (chip->quirk_flags & QUIRK_FLAG_SET_IFACE_FIRST))1239			set_iface_first = true;1240 1241		/* try to set the interface... */1242		usb_set_interface(chip->dev, iface_no, 0);1243		if (set_iface_first)1244			usb_set_interface(chip->dev, iface_no, altno);1245		snd_usb_init_pitch(chip, fp);1246		snd_usb_init_sample_rate(chip, fp, fp->rate_max);1247		if (!set_iface_first)1248			usb_set_interface(chip->dev, iface_no, altno);1249	}1250	return 0;1251}1252 1253int snd_usb_parse_audio_interface(struct snd_usb_audio *chip, int iface_no)1254{1255	int err;1256	bool has_non_pcm = false;1257 1258	/* parse PCM formats */1259	err = __snd_usb_parse_audio_interface(chip, iface_no, &has_non_pcm, false);1260	if (err < 0)1261		return err;1262 1263	if (has_non_pcm) {1264		/* parse non-PCM formats */1265		err = __snd_usb_parse_audio_interface(chip, iface_no, &has_non_pcm, true);1266		if (err < 0)1267			return err;1268	}1269 1270	return 0;1271}1272 1273