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