brintos

brintos / linux-shallow public Read only

0
0
Text · 21.6 KiB · 772c0ec Raw
872 lines · c
1// SPDX-License-Identifier: GPL-2.0-or-later2/*3 *   Copyright (c) 2006-2008 Daniel Mack, Karsten Wiese4*/5 6#include <linux/device.h>7#include <linux/spinlock.h>8#include <linux/slab.h>9#include <linux/init.h>10#include <linux/usb.h>11#include <sound/core.h>12#include <sound/pcm.h>13 14#include "device.h"15#include "audio.h"16 17#define N_URBS			3218#define CLOCK_DRIFT_TOLERANCE	519#define FRAMES_PER_URB		820#define BYTES_PER_FRAME		51221#define CHANNELS_PER_STREAM	222#define BYTES_PER_SAMPLE	323#define BYTES_PER_SAMPLE_USB	424#define MAX_BUFFER_SIZE		(128*1024)25#define MAX_ENDPOINT_SIZE	51226 27#define ENDPOINT_CAPTURE	228#define ENDPOINT_PLAYBACK	629 30#define MAKE_CHECKBYTE(cdev,stream,i) \31	(stream << 1) | (~(i / (cdev->n_streams * BYTES_PER_SAMPLE_USB)) & 1)32 33static const struct snd_pcm_hardware snd_usb_caiaq_pcm_hardware = {34	.info 		= (SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_INTERLEAVED |35			   SNDRV_PCM_INFO_BLOCK_TRANSFER),36	.formats 	= SNDRV_PCM_FMTBIT_S24_3BE,37	.rates 		= (SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000 |38			   SNDRV_PCM_RATE_96000),39	.rate_min	= 44100,40	.rate_max	= 0, /* will overwrite later */41	.channels_min	= CHANNELS_PER_STREAM,42	.channels_max	= CHANNELS_PER_STREAM,43	.buffer_bytes_max = MAX_BUFFER_SIZE,44	.period_bytes_min = 128,45	.period_bytes_max = MAX_BUFFER_SIZE,46	.periods_min	= 1,47	.periods_max	= 1024,48};49 50static void51activate_substream(struct snd_usb_caiaqdev *cdev,52	           struct snd_pcm_substream *sub)53{54	spin_lock(&cdev->spinlock);55 56	if (sub->stream == SNDRV_PCM_STREAM_PLAYBACK)57		cdev->sub_playback[sub->number] = sub;58	else59		cdev->sub_capture[sub->number] = sub;60 61	spin_unlock(&cdev->spinlock);62}63 64static void65deactivate_substream(struct snd_usb_caiaqdev *cdev,66		     struct snd_pcm_substream *sub)67{68	unsigned long flags;69	spin_lock_irqsave(&cdev->spinlock, flags);70 71	if (sub->stream == SNDRV_PCM_STREAM_PLAYBACK)72		cdev->sub_playback[sub->number] = NULL;73	else74		cdev->sub_capture[sub->number] = NULL;75 76	spin_unlock_irqrestore(&cdev->spinlock, flags);77}78 79static int80all_substreams_zero(struct snd_pcm_substream **subs)81{82	int i;83	for (i = 0; i < MAX_STREAMS; i++)84		if (subs[i] != NULL)85			return 0;86	return 1;87}88 89static int stream_start(struct snd_usb_caiaqdev *cdev)90{91	int i, ret;92	struct device *dev = caiaqdev_to_dev(cdev);93 94	dev_dbg(dev, "%s(%p)\n", __func__, cdev);95 96	if (cdev->streaming)97		return -EINVAL;98 99	memset(cdev->sub_playback, 0, sizeof(cdev->sub_playback));100	memset(cdev->sub_capture, 0, sizeof(cdev->sub_capture));101	cdev->input_panic = 0;102	cdev->output_panic = 0;103	cdev->first_packet = 4;104	cdev->streaming = 1;105	cdev->warned = 0;106 107	for (i = 0; i < N_URBS; i++) {108		ret = usb_submit_urb(cdev->data_urbs_in[i], GFP_ATOMIC);109		if (ret) {110			dev_err(dev, "unable to trigger read #%d! (ret %d)\n",111				i, ret);112			cdev->streaming = 0;113			return -EPIPE;114		}115	}116 117	return 0;118}119 120static void stream_stop(struct snd_usb_caiaqdev *cdev)121{122	int i;123	struct device *dev = caiaqdev_to_dev(cdev);124 125	dev_dbg(dev, "%s(%p)\n", __func__, cdev);126	if (!cdev->streaming)127		return;128 129	cdev->streaming = 0;130 131	for (i = 0; i < N_URBS; i++) {132		usb_kill_urb(cdev->data_urbs_in[i]);133 134		if (test_bit(i, &cdev->outurb_active_mask))135			usb_kill_urb(cdev->data_urbs_out[i]);136	}137 138	cdev->outurb_active_mask = 0;139}140 141static int snd_usb_caiaq_substream_open(struct snd_pcm_substream *substream)142{143	struct snd_usb_caiaqdev *cdev = snd_pcm_substream_chip(substream);144	struct device *dev = caiaqdev_to_dev(cdev);145 146	dev_dbg(dev, "%s(%p)\n", __func__, substream);147	substream->runtime->hw = cdev->pcm_info;148	snd_pcm_limit_hw_rates(substream->runtime);149 150	return 0;151}152 153static int snd_usb_caiaq_substream_close(struct snd_pcm_substream *substream)154{155	struct snd_usb_caiaqdev *cdev = snd_pcm_substream_chip(substream);156	struct device *dev = caiaqdev_to_dev(cdev);157 158	dev_dbg(dev, "%s(%p)\n", __func__, substream);159	if (all_substreams_zero(cdev->sub_playback) &&160	    all_substreams_zero(cdev->sub_capture)) {161		/* when the last client has stopped streaming,162		 * all sample rates are allowed again */163		stream_stop(cdev);164		cdev->pcm_info.rates = cdev->samplerates;165	}166 167	return 0;168}169 170static int snd_usb_caiaq_pcm_hw_free(struct snd_pcm_substream *sub)171{172	struct snd_usb_caiaqdev *cdev = snd_pcm_substream_chip(sub);173	deactivate_substream(cdev, sub);174	return 0;175}176 177static int snd_usb_caiaq_pcm_prepare(struct snd_pcm_substream *substream)178{179	int bytes_per_sample, bpp, ret;180	int index = substream->number;181	struct snd_usb_caiaqdev *cdev = snd_pcm_substream_chip(substream);182	struct snd_pcm_runtime *runtime = substream->runtime;183	struct device *dev = caiaqdev_to_dev(cdev);184 185	dev_dbg(dev, "%s(%p)\n", __func__, substream);186 187	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {188		int out_pos;189 190		switch (cdev->spec.data_alignment) {191		case 0:192		case 2:193			out_pos = BYTES_PER_SAMPLE + 1;194			break;195		case 3:196		default:197			out_pos = 0;198			break;199		}200 201		cdev->period_out_count[index] = out_pos;202		cdev->audio_out_buf_pos[index] = out_pos;203	} else {204		int in_pos;205 206		switch (cdev->spec.data_alignment) {207		case 0:208			in_pos = BYTES_PER_SAMPLE + 2;209			break;210		case 2:211			in_pos = BYTES_PER_SAMPLE;212			break;213		case 3:214		default:215			in_pos = 0;216			break;217		}218 219		cdev->period_in_count[index] = in_pos;220		cdev->audio_in_buf_pos[index] = in_pos;221	}222 223	if (cdev->streaming)224		return 0;225 226	/* the first client that opens a stream defines the sample rate227	 * setting for all subsequent calls, until the last client closed. */228	cdev->pcm_info.rates = snd_pcm_rate_to_rate_bit(runtime->rate);229	snd_pcm_limit_hw_rates(runtime);230 231	bytes_per_sample = BYTES_PER_SAMPLE;232	if (cdev->spec.data_alignment >= 2)233		bytes_per_sample++;234 235	bpp = ((runtime->rate / 8000) + CLOCK_DRIFT_TOLERANCE)236		* bytes_per_sample * CHANNELS_PER_STREAM * cdev->n_streams;237 238	if (bpp > MAX_ENDPOINT_SIZE)239		bpp = MAX_ENDPOINT_SIZE;240 241	ret = snd_usb_caiaq_set_audio_params(cdev, runtime->rate,242					     runtime->sample_bits, bpp);243	if (ret)244		return ret;245 246	ret = stream_start(cdev);247	if (ret)248		return ret;249 250	cdev->output_running = 0;251	wait_event_timeout(cdev->prepare_wait_queue, cdev->output_running, HZ);252	if (!cdev->output_running) {253		stream_stop(cdev);254		return -EPIPE;255	}256 257	return 0;258}259 260static int snd_usb_caiaq_pcm_trigger(struct snd_pcm_substream *sub, int cmd)261{262	struct snd_usb_caiaqdev *cdev = snd_pcm_substream_chip(sub);263	struct device *dev = caiaqdev_to_dev(cdev);264 265	dev_dbg(dev, "%s(%p) cmd %d\n", __func__, sub, cmd);266 267	switch (cmd) {268	case SNDRV_PCM_TRIGGER_START:269	case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:270		activate_substream(cdev, sub);271		break;272	case SNDRV_PCM_TRIGGER_STOP:273	case SNDRV_PCM_TRIGGER_PAUSE_PUSH:274		deactivate_substream(cdev, sub);275		break;276	default:277		return -EINVAL;278	}279 280	return 0;281}282 283static snd_pcm_uframes_t284snd_usb_caiaq_pcm_pointer(struct snd_pcm_substream *sub)285{286	int index = sub->number;287	struct snd_usb_caiaqdev *cdev = snd_pcm_substream_chip(sub);288	snd_pcm_uframes_t ptr;289 290	spin_lock(&cdev->spinlock);291 292	if (cdev->input_panic || cdev->output_panic) {293		ptr = SNDRV_PCM_POS_XRUN;294		goto unlock;295	}296 297	if (sub->stream == SNDRV_PCM_STREAM_PLAYBACK)298		ptr = bytes_to_frames(sub->runtime,299					cdev->audio_out_buf_pos[index]);300	else301		ptr = bytes_to_frames(sub->runtime,302					cdev->audio_in_buf_pos[index]);303 304unlock:305	spin_unlock(&cdev->spinlock);306	return ptr;307}308 309/* operators for both playback and capture */310static const struct snd_pcm_ops snd_usb_caiaq_ops = {311	.open =		snd_usb_caiaq_substream_open,312	.close =	snd_usb_caiaq_substream_close,313	.hw_free =	snd_usb_caiaq_pcm_hw_free,314	.prepare =	snd_usb_caiaq_pcm_prepare,315	.trigger =	snd_usb_caiaq_pcm_trigger,316	.pointer =	snd_usb_caiaq_pcm_pointer,317};318 319static void check_for_elapsed_periods(struct snd_usb_caiaqdev *cdev,320				      struct snd_pcm_substream **subs)321{322	int stream, pb, *cnt;323	struct snd_pcm_substream *sub;324 325	for (stream = 0; stream < cdev->n_streams; stream++) {326		sub = subs[stream];327		if (!sub)328			continue;329 330		pb = snd_pcm_lib_period_bytes(sub);331		cnt = (sub->stream == SNDRV_PCM_STREAM_PLAYBACK) ?332					&cdev->period_out_count[stream] :333					&cdev->period_in_count[stream];334 335		if (*cnt >= pb) {336			snd_pcm_period_elapsed(sub);337			*cnt %= pb;338		}339	}340}341 342static void read_in_urb_mode0(struct snd_usb_caiaqdev *cdev,343			      const struct urb *urb,344			      const struct usb_iso_packet_descriptor *iso)345{346	unsigned char *usb_buf = urb->transfer_buffer + iso->offset;347	struct snd_pcm_substream *sub;348	int stream, i;349 350	if (all_substreams_zero(cdev->sub_capture))351		return;352 353	for (i = 0; i < iso->actual_length;) {354		for (stream = 0; stream < cdev->n_streams; stream++, i++) {355			sub = cdev->sub_capture[stream];356			if (sub) {357				struct snd_pcm_runtime *rt = sub->runtime;358				char *audio_buf = rt->dma_area;359				int sz = frames_to_bytes(rt, rt->buffer_size);360				audio_buf[cdev->audio_in_buf_pos[stream]++]361					= usb_buf[i];362				cdev->period_in_count[stream]++;363				if (cdev->audio_in_buf_pos[stream] == sz)364					cdev->audio_in_buf_pos[stream] = 0;365			}366		}367	}368}369 370static void read_in_urb_mode2(struct snd_usb_caiaqdev *cdev,371			      const struct urb *urb,372			      const struct usb_iso_packet_descriptor *iso)373{374	unsigned char *usb_buf = urb->transfer_buffer + iso->offset;375	unsigned char check_byte;376	struct snd_pcm_substream *sub;377	int stream, i;378 379	for (i = 0; i < iso->actual_length;) {380		if (i % (cdev->n_streams * BYTES_PER_SAMPLE_USB) == 0) {381			for (stream = 0;382			     stream < cdev->n_streams;383			     stream++, i++) {384				if (cdev->first_packet)385					continue;386 387				check_byte = MAKE_CHECKBYTE(cdev, stream, i);388 389				if ((usb_buf[i] & 0x3f) != check_byte)390					cdev->input_panic = 1;391 392				if (usb_buf[i] & 0x80)393					cdev->output_panic = 1;394			}395		}396		cdev->first_packet = 0;397 398		for (stream = 0; stream < cdev->n_streams; stream++, i++) {399			sub = cdev->sub_capture[stream];400			if (cdev->input_panic)401				usb_buf[i] = 0;402 403			if (sub) {404				struct snd_pcm_runtime *rt = sub->runtime;405				char *audio_buf = rt->dma_area;406				int sz = frames_to_bytes(rt, rt->buffer_size);407				audio_buf[cdev->audio_in_buf_pos[stream]++] =408					usb_buf[i];409				cdev->period_in_count[stream]++;410				if (cdev->audio_in_buf_pos[stream] == sz)411					cdev->audio_in_buf_pos[stream] = 0;412			}413		}414	}415}416 417static void read_in_urb_mode3(struct snd_usb_caiaqdev *cdev,418			      const struct urb *urb,419			      const struct usb_iso_packet_descriptor *iso)420{421	unsigned char *usb_buf = urb->transfer_buffer + iso->offset;422	struct device *dev = caiaqdev_to_dev(cdev);423	int stream, i;424 425	/* paranoia check */426	if (iso->actual_length % (BYTES_PER_SAMPLE_USB * CHANNELS_PER_STREAM))427		return;428 429	for (i = 0; i < iso->actual_length;) {430		for (stream = 0; stream < cdev->n_streams; stream++) {431			struct snd_pcm_substream *sub = cdev->sub_capture[stream];432			char *audio_buf = NULL;433			int c, n, sz = 0;434 435			if (sub && !cdev->input_panic) {436				struct snd_pcm_runtime *rt = sub->runtime;437				audio_buf = rt->dma_area;438				sz = frames_to_bytes(rt, rt->buffer_size);439			}440 441			for (c = 0; c < CHANNELS_PER_STREAM; c++) {442				/* 3 audio data bytes, followed by 1 check byte */443				if (audio_buf) {444					for (n = 0; n < BYTES_PER_SAMPLE; n++) {445						audio_buf[cdev->audio_in_buf_pos[stream]++] = usb_buf[i+n];446 447						if (cdev->audio_in_buf_pos[stream] == sz)448							cdev->audio_in_buf_pos[stream] = 0;449					}450 451					cdev->period_in_count[stream] += BYTES_PER_SAMPLE;452				}453 454				i += BYTES_PER_SAMPLE;455 456				if (usb_buf[i] != ((stream << 1) | c) &&457				    !cdev->first_packet) {458					if (!cdev->input_panic)459						dev_warn(dev, " EXPECTED: %02x got %02x, c %d, stream %d, i %d\n",460							 ((stream << 1) | c), usb_buf[i], c, stream, i);461					cdev->input_panic = 1;462				}463 464				i++;465			}466		}467	}468 469	if (cdev->first_packet > 0)470		cdev->first_packet--;471}472 473static void read_in_urb(struct snd_usb_caiaqdev *cdev,474			const struct urb *urb,475			const struct usb_iso_packet_descriptor *iso)476{477	struct device *dev = caiaqdev_to_dev(cdev);478 479	if (!cdev->streaming)480		return;481 482	if (iso->actual_length < cdev->bpp)483		return;484 485	switch (cdev->spec.data_alignment) {486	case 0:487		read_in_urb_mode0(cdev, urb, iso);488		break;489	case 2:490		read_in_urb_mode2(cdev, urb, iso);491		break;492	case 3:493		read_in_urb_mode3(cdev, urb, iso);494		break;495	}496 497	if ((cdev->input_panic || cdev->output_panic) && !cdev->warned) {498		dev_warn(dev, "streaming error detected %s %s\n",499				cdev->input_panic ? "(input)" : "",500				cdev->output_panic ? "(output)" : "");501		cdev->warned = 1;502	}503}504 505static void fill_out_urb_mode_0(struct snd_usb_caiaqdev *cdev,506				struct urb *urb,507				const struct usb_iso_packet_descriptor *iso)508{509	unsigned char *usb_buf = urb->transfer_buffer + iso->offset;510	struct snd_pcm_substream *sub;511	int stream, i;512 513	for (i = 0; i < iso->length;) {514		for (stream = 0; stream < cdev->n_streams; stream++, i++) {515			sub = cdev->sub_playback[stream];516			if (sub) {517				struct snd_pcm_runtime *rt = sub->runtime;518				char *audio_buf = rt->dma_area;519				int sz = frames_to_bytes(rt, rt->buffer_size);520				usb_buf[i] =521					audio_buf[cdev->audio_out_buf_pos[stream]];522				cdev->period_out_count[stream]++;523				cdev->audio_out_buf_pos[stream]++;524				if (cdev->audio_out_buf_pos[stream] == sz)525					cdev->audio_out_buf_pos[stream] = 0;526			} else527				usb_buf[i] = 0;528		}529 530		/* fill in the check bytes */531		if (cdev->spec.data_alignment == 2 &&532		    i % (cdev->n_streams * BYTES_PER_SAMPLE_USB) ==533		        (cdev->n_streams * CHANNELS_PER_STREAM))534			for (stream = 0; stream < cdev->n_streams; stream++, i++)535				usb_buf[i] = MAKE_CHECKBYTE(cdev, stream, i);536	}537}538 539static void fill_out_urb_mode_3(struct snd_usb_caiaqdev *cdev,540				struct urb *urb,541				const struct usb_iso_packet_descriptor *iso)542{543	unsigned char *usb_buf = urb->transfer_buffer + iso->offset;544	int stream, i;545 546	for (i = 0; i < iso->length;) {547		for (stream = 0; stream < cdev->n_streams; stream++) {548			struct snd_pcm_substream *sub = cdev->sub_playback[stream];549			char *audio_buf = NULL;550			int c, n, sz = 0;551 552			if (sub) {553				struct snd_pcm_runtime *rt = sub->runtime;554				audio_buf = rt->dma_area;555				sz = frames_to_bytes(rt, rt->buffer_size);556			}557 558			for (c = 0; c < CHANNELS_PER_STREAM; c++) {559				for (n = 0; n < BYTES_PER_SAMPLE; n++) {560					if (audio_buf) {561						usb_buf[i+n] = audio_buf[cdev->audio_out_buf_pos[stream]++];562 563						if (cdev->audio_out_buf_pos[stream] == sz)564							cdev->audio_out_buf_pos[stream] = 0;565					} else {566						usb_buf[i+n] = 0;567					}568				}569 570				if (audio_buf)571					cdev->period_out_count[stream] += BYTES_PER_SAMPLE;572 573				i += BYTES_PER_SAMPLE;574 575				/* fill in the check byte pattern */576				usb_buf[i++] = (stream << 1) | c;577			}578		}579	}580}581 582static inline void fill_out_urb(struct snd_usb_caiaqdev *cdev,583				struct urb *urb,584				const struct usb_iso_packet_descriptor *iso)585{586	switch (cdev->spec.data_alignment) {587	case 0:588	case 2:589		fill_out_urb_mode_0(cdev, urb, iso);590		break;591	case 3:592		fill_out_urb_mode_3(cdev, urb, iso);593		break;594	}595}596 597static void read_completed(struct urb *urb)598{599	struct snd_usb_caiaq_cb_info *info = urb->context;600	struct snd_usb_caiaqdev *cdev;601	struct device *dev;602	struct urb *out = NULL;603	int i, frame, len, send_it = 0, outframe = 0;604	unsigned long flags;605	size_t offset = 0;606 607	if (urb->status || !info)608		return;609 610	cdev = info->cdev;611	dev = caiaqdev_to_dev(cdev);612 613	if (!cdev->streaming)614		return;615 616	/* find an unused output urb that is unused */617	for (i = 0; i < N_URBS; i++)618		if (test_and_set_bit(i, &cdev->outurb_active_mask) == 0) {619			out = cdev->data_urbs_out[i];620			break;621		}622 623	if (!out) {624		dev_err(dev, "Unable to find an output urb to use\n");625		goto requeue;626	}627 628	/* read the recently received packet and send back one which has629	 * the same layout */630	for (frame = 0; frame < FRAMES_PER_URB; frame++) {631		if (urb->iso_frame_desc[frame].status)632			continue;633 634		len = urb->iso_frame_desc[outframe].actual_length;635		out->iso_frame_desc[outframe].length = len;636		out->iso_frame_desc[outframe].actual_length = 0;637		out->iso_frame_desc[outframe].offset = offset;638		offset += len;639 640		if (len > 0) {641			spin_lock_irqsave(&cdev->spinlock, flags);642			fill_out_urb(cdev, out, &out->iso_frame_desc[outframe]);643			read_in_urb(cdev, urb, &urb->iso_frame_desc[frame]);644			spin_unlock_irqrestore(&cdev->spinlock, flags);645			check_for_elapsed_periods(cdev, cdev->sub_playback);646			check_for_elapsed_periods(cdev, cdev->sub_capture);647			send_it = 1;648		}649 650		outframe++;651	}652 653	if (send_it) {654		out->number_of_packets = outframe;655		usb_submit_urb(out, GFP_ATOMIC);656	} else {657		struct snd_usb_caiaq_cb_info *oinfo = out->context;658		clear_bit(oinfo->index, &cdev->outurb_active_mask);659	}660 661requeue:662	/* re-submit inbound urb */663	for (frame = 0; frame < FRAMES_PER_URB; frame++) {664		urb->iso_frame_desc[frame].offset = BYTES_PER_FRAME * frame;665		urb->iso_frame_desc[frame].length = BYTES_PER_FRAME;666		urb->iso_frame_desc[frame].actual_length = 0;667	}668 669	urb->number_of_packets = FRAMES_PER_URB;670	usb_submit_urb(urb, GFP_ATOMIC);671}672 673static void write_completed(struct urb *urb)674{675	struct snd_usb_caiaq_cb_info *info = urb->context;676	struct snd_usb_caiaqdev *cdev = info->cdev;677 678	if (!cdev->output_running) {679		cdev->output_running = 1;680		wake_up(&cdev->prepare_wait_queue);681	}682 683	clear_bit(info->index, &cdev->outurb_active_mask);684}685 686static struct urb **alloc_urbs(struct snd_usb_caiaqdev *cdev, int dir, int *ret)687{688	int i, frame;689	struct urb **urbs;690	struct usb_device *usb_dev = cdev->chip.dev;691	unsigned int pipe;692 693	pipe = (dir == SNDRV_PCM_STREAM_PLAYBACK) ?694		usb_sndisocpipe(usb_dev, ENDPOINT_PLAYBACK) :695		usb_rcvisocpipe(usb_dev, ENDPOINT_CAPTURE);696 697	urbs = kmalloc_array(N_URBS, sizeof(*urbs), GFP_KERNEL);698	if (!urbs) {699		*ret = -ENOMEM;700		return NULL;701	}702 703	for (i = 0; i < N_URBS; i++) {704		urbs[i] = usb_alloc_urb(FRAMES_PER_URB, GFP_KERNEL);705		if (!urbs[i]) {706			*ret = -ENOMEM;707			return urbs;708		}709 710		urbs[i]->transfer_buffer =711			kmalloc_array(BYTES_PER_FRAME, FRAMES_PER_URB,712				      GFP_KERNEL);713		if (!urbs[i]->transfer_buffer) {714			*ret = -ENOMEM;715			return urbs;716		}717 718		for (frame = 0; frame < FRAMES_PER_URB; frame++) {719			struct usb_iso_packet_descriptor *iso =720				&urbs[i]->iso_frame_desc[frame];721 722			iso->offset = BYTES_PER_FRAME * frame;723			iso->length = BYTES_PER_FRAME;724		}725 726		urbs[i]->dev = usb_dev;727		urbs[i]->pipe = pipe;728		urbs[i]->transfer_buffer_length = FRAMES_PER_URB729						* BYTES_PER_FRAME;730		urbs[i]->context = &cdev->data_cb_info[i];731		urbs[i]->interval = 1;732		urbs[i]->number_of_packets = FRAMES_PER_URB;733		urbs[i]->complete = (dir == SNDRV_PCM_STREAM_CAPTURE) ?734					read_completed : write_completed;735	}736 737	*ret = 0;738	return urbs;739}740 741static void free_urbs(struct urb **urbs)742{743	int i;744 745	if (!urbs)746		return;747 748	for (i = 0; i < N_URBS; i++) {749		if (!urbs[i])750			continue;751 752		usb_kill_urb(urbs[i]);753		kfree(urbs[i]->transfer_buffer);754		usb_free_urb(urbs[i]);755	}756 757	kfree(urbs);758}759 760int snd_usb_caiaq_audio_init(struct snd_usb_caiaqdev *cdev)761{762	int i, ret;763	struct device *dev = caiaqdev_to_dev(cdev);764 765	cdev->n_audio_in  = max(cdev->spec.num_analog_audio_in,766			       cdev->spec.num_digital_audio_in) /767				CHANNELS_PER_STREAM;768	cdev->n_audio_out = max(cdev->spec.num_analog_audio_out,769			       cdev->spec.num_digital_audio_out) /770				CHANNELS_PER_STREAM;771	cdev->n_streams = max(cdev->n_audio_in, cdev->n_audio_out);772 773	dev_dbg(dev, "cdev->n_audio_in = %d\n", cdev->n_audio_in);774	dev_dbg(dev, "cdev->n_audio_out = %d\n", cdev->n_audio_out);775	dev_dbg(dev, "cdev->n_streams = %d\n", cdev->n_streams);776 777	if (cdev->n_streams > MAX_STREAMS) {778		dev_err(dev, "unable to initialize device, too many streams.\n");779		return -EINVAL;780	}781 782	if (cdev->n_streams < 1) {783		dev_err(dev, "bogus number of streams: %d\n", cdev->n_streams);784		return -EINVAL;785	}786 787	ret = snd_pcm_new(cdev->chip.card, cdev->product_name, 0,788			cdev->n_audio_out, cdev->n_audio_in, &cdev->pcm);789 790	if (ret < 0) {791		dev_err(dev, "snd_pcm_new() returned %d\n", ret);792		return ret;793	}794 795	cdev->pcm->private_data = cdev;796	strscpy(cdev->pcm->name, cdev->product_name, sizeof(cdev->pcm->name));797 798	memset(cdev->sub_playback, 0, sizeof(cdev->sub_playback));799	memset(cdev->sub_capture, 0, sizeof(cdev->sub_capture));800 801	memcpy(&cdev->pcm_info, &snd_usb_caiaq_pcm_hardware,802			sizeof(snd_usb_caiaq_pcm_hardware));803 804	/* setup samplerates */805	cdev->samplerates = cdev->pcm_info.rates;806	switch (cdev->chip.usb_id) {807	case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_AK1):808	case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_RIGKONTROL3):809	case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_SESSIONIO):810	case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_GUITARRIGMOBILE):811		cdev->samplerates |= SNDRV_PCM_RATE_192000;812		fallthrough;813	case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_AUDIO2DJ):814	case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_AUDIO4DJ):815	case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_AUDIO8DJ):816	case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_TRAKTORAUDIO2):817		cdev->samplerates |= SNDRV_PCM_RATE_88200;818		break;819	}820 821	snd_pcm_set_ops(cdev->pcm, SNDRV_PCM_STREAM_PLAYBACK,822				&snd_usb_caiaq_ops);823	snd_pcm_set_ops(cdev->pcm, SNDRV_PCM_STREAM_CAPTURE,824				&snd_usb_caiaq_ops);825	snd_pcm_set_managed_buffer_all(cdev->pcm, SNDRV_DMA_TYPE_VMALLOC,826				       NULL, 0, 0);827 828	cdev->data_cb_info =829		kmalloc_array(N_URBS, sizeof(struct snd_usb_caiaq_cb_info),830					GFP_KERNEL);831 832	if (!cdev->data_cb_info)833		return -ENOMEM;834 835	cdev->outurb_active_mask = 0;836	BUILD_BUG_ON(N_URBS > (sizeof(cdev->outurb_active_mask) * 8));837 838	for (i = 0; i < N_URBS; i++) {839		cdev->data_cb_info[i].cdev = cdev;840		cdev->data_cb_info[i].index = i;841	}842 843	cdev->data_urbs_in = alloc_urbs(cdev, SNDRV_PCM_STREAM_CAPTURE, &ret);844	if (ret < 0) {845		kfree(cdev->data_cb_info);846		free_urbs(cdev->data_urbs_in);847		return ret;848	}849 850	cdev->data_urbs_out = alloc_urbs(cdev, SNDRV_PCM_STREAM_PLAYBACK, &ret);851	if (ret < 0) {852		kfree(cdev->data_cb_info);853		free_urbs(cdev->data_urbs_in);854		free_urbs(cdev->data_urbs_out);855		return ret;856	}857 858	return 0;859}860 861void snd_usb_caiaq_audio_free(struct snd_usb_caiaqdev *cdev)862{863	struct device *dev = caiaqdev_to_dev(cdev);864 865	dev_dbg(dev, "%s(%p)\n", __func__, cdev);866	stream_stop(cdev);867	free_urbs(cdev->data_urbs_in);868	free_urbs(cdev->data_urbs_out);869	kfree(cdev->data_cb_info);870}871 872