Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
f_uac2.c
Go to the documentation of this file.
1 /*
2  * f_uac2.c -- USB Audio Class 2.0 Function
3  *
4  * Copyright (C) 2011
5  * Yadwinder Singh ([email protected])
6  * Jaswinder Singh ([email protected])
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; either version 2 of the License, or
11  * (at your option) any later version.
12  */
13 
14 #include <linux/usb/audio.h>
15 #include <linux/usb/audio-v2.h>
16 #include <linux/platform_device.h>
17 #include <linux/module.h>
18 
19 #include <sound/core.h>
20 #include <sound/pcm.h>
21 #include <sound/pcm_params.h>
22 
23 /* Playback(USB-IN) Default Stereo - Fl/Fr */
24 static int p_chmask = 0x3;
25 module_param(p_chmask, uint, S_IRUGO);
26 MODULE_PARM_DESC(p_chmask, "Playback Channel Mask");
27 
28 /* Playback Default 48 KHz */
29 static int p_srate = 48000;
30 module_param(p_srate, uint, S_IRUGO);
31 MODULE_PARM_DESC(p_srate, "Playback Sampling Rate");
32 
33 /* Playback Default 16bits/sample */
34 static int p_ssize = 2;
35 module_param(p_ssize, uint, S_IRUGO);
36 MODULE_PARM_DESC(p_ssize, "Playback Sample Size(bytes)");
37 
38 /* Capture(USB-OUT) Default Stereo - Fl/Fr */
39 static int c_chmask = 0x3;
40 module_param(c_chmask, uint, S_IRUGO);
41 MODULE_PARM_DESC(c_chmask, "Capture Channel Mask");
42 
43 /* Capture Default 64 KHz */
44 static int c_srate = 64000;
45 module_param(c_srate, uint, S_IRUGO);
46 MODULE_PARM_DESC(c_srate, "Capture Sampling Rate");
47 
48 /* Capture Default 16bits/sample */
49 static int c_ssize = 2;
50 module_param(c_ssize, uint, S_IRUGO);
51 MODULE_PARM_DESC(c_ssize, "Capture Sample Size(bytes)");
52 
53 #define DMA_ADDR_INVALID (~(dma_addr_t)0)
54 
55 #define ALT_SET(x, a) do {(x) &= ~0xff; (x) |= (a); } while (0)
56 #define ALT_GET(x) ((x) & 0xff)
57 #define INTF_SET(x, i) do {(x) &= 0xff; (x) |= ((i) << 8); } while (0)
58 #define INTF_GET(x) ((x >> 8) & 0xff)
59 
60 /* Keep everyone on toes */
61 #define USB_XFERS 2
62 
63 /*
64  * The driver implements a simple UAC_2 topology.
65  * USB-OUT -> IT_1 -> OT_3 -> ALSA_Capture
66  * ALSA_Playback -> IT_2 -> OT_4 -> USB-IN
67  * Capture and Playback sampling rates are independently
68  * controlled by two clock sources :
69  * CLK_5 := c_srate, and CLK_6 := p_srate
70  */
71 #define USB_OUT_IT_ID 1
72 #define IO_IN_IT_ID 2
73 #define IO_OUT_OT_ID 3
74 #define USB_IN_OT_ID 4
75 #define USB_OUT_CLK_ID 5
76 #define USB_IN_CLK_ID 6
77 
78 #define CONTROL_ABSENT 0
79 #define CONTROL_RDONLY 1
80 #define CONTROL_RDWR 3
81 
82 #define CLK_FREQ_CTRL 0
83 #define CLK_VLD_CTRL 2
84 
85 #define COPY_CTRL 0
86 #define CONN_CTRL 2
87 #define OVRLD_CTRL 4
88 #define CLSTR_CTRL 6
89 #define UNFLW_CTRL 8
90 #define OVFLW_CTRL 10
91 
92 const char *uac2_name = "snd_uac2";
93 
94 struct uac2_req {
95  struct uac2_rtd_params *pp; /* parent param */
96  struct usb_request *req;
97 };
98 
100  bool ep_enabled; /* if the ep is enabled */
101  /* Size of the ring buffer */
102  size_t dma_bytes;
103  unsigned char *dma_area;
104 
106 
107  /* Ring buffer */
109 
110  void *rbuf;
111 
112  size_t period_size;
113 
114  unsigned max_psize;
116 
118 };
119 
123 
126 
127  struct snd_card *card;
128  struct snd_pcm *pcm;
129 };
130 
131 #define BUFF_SIZE_MAX (PAGE_SIZE * 16)
132 #define PRD_SIZE_MAX PAGE_SIZE
133 #define MIN_PERIODS 4
134 
135 static struct snd_pcm_hardware uac2_pcm_hardware = {
139  .rates = SNDRV_PCM_RATE_CONTINUOUS,
140  .periods_max = BUFF_SIZE_MAX / PRD_SIZE_MAX,
141  .buffer_bytes_max = BUFF_SIZE_MAX,
142  .period_bytes_max = PRD_SIZE_MAX,
143  .periods_min = MIN_PERIODS,
144 };
145 
146 struct audio_dev {
147  /* Currently active {Interface[15:8] | AltSettings[7:0]} */
149 
150  struct usb_ep *in_ep, *out_ep;
152 
153  /* The ALSA Sound Card it represents on the USB-Client side */
155 };
156 
157 static struct audio_dev *agdev_g;
158 
159 static inline
160 struct audio_dev *func_to_agdev(struct usb_function *f)
161 {
162  return container_of(f, struct audio_dev, func);
163 }
164 
165 static inline
166 struct audio_dev *uac2_to_agdev(struct snd_uac2_chip *u)
167 {
168  return container_of(u, struct audio_dev, uac2);
169 }
170 
171 static inline
172 struct snd_uac2_chip *pdev_to_uac2(struct platform_device *p)
173 {
174  return container_of(p, struct snd_uac2_chip, pdev);
175 }
176 
177 static inline
178 struct snd_uac2_chip *prm_to_uac2(struct uac2_rtd_params *r)
179 {
180  struct snd_uac2_chip *uac2 = container_of(r,
181  struct snd_uac2_chip, c_prm);
182 
183  if (&uac2->c_prm != r)
184  uac2 = container_of(r, struct snd_uac2_chip, p_prm);
185 
186  return uac2;
187 }
188 
189 static inline
190 uint num_channels(uint chanmask)
191 {
192  uint num = 0;
193 
194  while (chanmask) {
195  num += (chanmask & 1);
196  chanmask >>= 1;
197  }
198 
199  return num;
200 }
201 
202 static void
203 agdev_iso_complete(struct usb_ep *ep, struct usb_request *req)
204 {
205  unsigned pending;
206  unsigned long flags;
207  bool update_alsa = false;
208  unsigned char *src, *dst;
209  int status = req->status;
210  struct uac2_req *ur = req->context;
211  struct snd_pcm_substream *substream;
212  struct uac2_rtd_params *prm = ur->pp;
213  struct snd_uac2_chip *uac2 = prm_to_uac2(prm);
214 
215  /* i/f shutting down */
216  if (!prm->ep_enabled)
217  return;
218 
219  /*
220  * We can't really do much about bad xfers.
221  * Afterall, the ISOCH xfers could fail legitimately.
222  */
223  if (status)
224  pr_debug("%s: iso_complete status(%d) %d/%d\n",
225  __func__, status, req->actual, req->length);
226 
227  substream = prm->ss;
228 
229  /* Do nothing if ALSA isn't active */
230  if (!substream)
231  goto exit;
232 
233  spin_lock_irqsave(&prm->lock, flags);
234 
235  if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
236  src = prm->dma_area + prm->hw_ptr;
237  req->actual = req->length;
238  dst = req->buf;
239  } else {
240  dst = prm->dma_area + prm->hw_ptr;
241  src = req->buf;
242  }
243 
244  pending = prm->hw_ptr % prm->period_size;
245  pending += req->actual;
246  if (pending >= prm->period_size)
247  update_alsa = true;
248 
249  prm->hw_ptr = (prm->hw_ptr + req->actual) % prm->dma_bytes;
250 
251  spin_unlock_irqrestore(&prm->lock, flags);
252 
253  /* Pack USB load in ALSA ring buffer */
254  memcpy(dst, src, req->actual);
255 exit:
256  if (usb_ep_queue(ep, req, GFP_ATOMIC))
257  dev_err(&uac2->pdev.dev, "%d Error!\n", __LINE__);
258 
259  if (update_alsa)
260  snd_pcm_period_elapsed(substream);
261 
262  return;
263 }
264 
265 static int
266 uac2_pcm_trigger(struct snd_pcm_substream *substream, int cmd)
267 {
268  struct snd_uac2_chip *uac2 = snd_pcm_substream_chip(substream);
269  struct audio_dev *agdev = uac2_to_agdev(uac2);
270  struct uac2_rtd_params *prm;
271  unsigned long flags;
272  struct usb_ep *ep;
273  int err = 0;
274 
275  if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
276  ep = agdev->in_ep;
277  prm = &uac2->p_prm;
278  } else {
279  ep = agdev->out_ep;
280  prm = &uac2->c_prm;
281  }
282 
283  spin_lock_irqsave(&prm->lock, flags);
284 
285  /* Reset */
286  prm->hw_ptr = 0;
287 
288  switch (cmd) {
291  prm->ss = substream;
292  break;
295  prm->ss = NULL;
296  break;
297  default:
298  err = -EINVAL;
299  }
300 
301  spin_unlock_irqrestore(&prm->lock, flags);
302 
303  /* Clear buffer after Play stops */
304  if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK && !prm->ss)
305  memset(prm->rbuf, 0, prm->max_psize * USB_XFERS);
306 
307  return err;
308 }
309 
310 static snd_pcm_uframes_t uac2_pcm_pointer(struct snd_pcm_substream *substream)
311 {
312  struct snd_uac2_chip *uac2 = snd_pcm_substream_chip(substream);
313  struct uac2_rtd_params *prm;
314 
315  if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
316  prm = &uac2->p_prm;
317  else
318  prm = &uac2->c_prm;
319 
320  return bytes_to_frames(substream->runtime, prm->hw_ptr);
321 }
322 
323 static int uac2_pcm_hw_params(struct snd_pcm_substream *substream,
324  struct snd_pcm_hw_params *hw_params)
325 {
326  struct snd_uac2_chip *uac2 = snd_pcm_substream_chip(substream);
327  struct uac2_rtd_params *prm;
328  int err;
329 
330  if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
331  prm = &uac2->p_prm;
332  else
333  prm = &uac2->c_prm;
334 
335  err = snd_pcm_lib_malloc_pages(substream,
336  params_buffer_bytes(hw_params));
337  if (err >= 0) {
338  prm->dma_bytes = substream->runtime->dma_bytes;
339  prm->dma_area = substream->runtime->dma_area;
340  prm->period_size = params_period_bytes(hw_params);
341  }
342 
343  return err;
344 }
345 
346 static int uac2_pcm_hw_free(struct snd_pcm_substream *substream)
347 {
348  struct snd_uac2_chip *uac2 = snd_pcm_substream_chip(substream);
349  struct uac2_rtd_params *prm;
350 
351  if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
352  prm = &uac2->p_prm;
353  else
354  prm = &uac2->c_prm;
355 
356  prm->dma_area = NULL;
357  prm->dma_bytes = 0;
358  prm->period_size = 0;
359 
360  return snd_pcm_lib_free_pages(substream);
361 }
362 
363 static int uac2_pcm_open(struct snd_pcm_substream *substream)
364 {
365  struct snd_uac2_chip *uac2 = snd_pcm_substream_chip(substream);
366  struct snd_pcm_runtime *runtime = substream->runtime;
367 
368  runtime->hw = uac2_pcm_hardware;
369 
370  if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
371  spin_lock_init(&uac2->p_prm.lock);
372  runtime->hw.rate_min = p_srate;
373  runtime->hw.formats = SNDRV_PCM_FMTBIT_S16_LE; /* ! p_ssize ! */
374  runtime->hw.channels_min = num_channels(p_chmask);
375  runtime->hw.period_bytes_min = 2 * uac2->p_prm.max_psize
376  / runtime->hw.periods_min;
377  } else {
378  spin_lock_init(&uac2->c_prm.lock);
379  runtime->hw.rate_min = c_srate;
380  runtime->hw.formats = SNDRV_PCM_FMTBIT_S16_LE; /* ! c_ssize ! */
381  runtime->hw.channels_min = num_channels(c_chmask);
382  runtime->hw.period_bytes_min = 2 * uac2->c_prm.max_psize
383  / runtime->hw.periods_min;
384  }
385 
386  runtime->hw.rate_max = runtime->hw.rate_min;
387  runtime->hw.channels_max = runtime->hw.channels_min;
388 
390 
391  return 0;
392 }
393 
394 /* ALSA cries without these function pointers */
395 static int uac2_pcm_null(struct snd_pcm_substream *substream)
396 {
397  return 0;
398 }
399 
400 static struct snd_pcm_ops uac2_pcm_ops = {
401  .open = uac2_pcm_open,
402  .close = uac2_pcm_null,
403  .ioctl = snd_pcm_lib_ioctl,
404  .hw_params = uac2_pcm_hw_params,
405  .hw_free = uac2_pcm_hw_free,
406  .trigger = uac2_pcm_trigger,
407  .pointer = uac2_pcm_pointer,
408  .prepare = uac2_pcm_null,
409 };
410 
411 static int __devinit snd_uac2_probe(struct platform_device *pdev)
412 {
413  struct snd_uac2_chip *uac2 = pdev_to_uac2(pdev);
414  struct snd_card *card;
415  struct snd_pcm *pcm;
416  int err;
417 
418  /* Choose any slot, with no id */
419  err = snd_card_create(-1, NULL, THIS_MODULE, 0, &card);
420  if (err < 0)
421  return err;
422 
423  uac2->card = card;
424 
425  /*
426  * Create first PCM device
427  * Create a substream only for non-zero channel streams
428  */
429  err = snd_pcm_new(uac2->card, "UAC2 PCM", 0,
430  p_chmask ? 1 : 0, c_chmask ? 1 : 0, &pcm);
431  if (err < 0)
432  goto snd_fail;
433 
434  strcpy(pcm->name, "UAC2 PCM");
435  pcm->private_data = uac2;
436 
437  uac2->pcm = pcm;
438 
439  snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &uac2_pcm_ops);
440  snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &uac2_pcm_ops);
441 
442  strcpy(card->driver, "UAC2_Gadget");
443  strcpy(card->shortname, "UAC2_Gadget");
444  sprintf(card->longname, "UAC2_Gadget %i", pdev->id);
445 
446  snd_card_set_dev(card, &pdev->dev);
447 
450 
451  err = snd_card_register(card);
452  if (!err) {
453  platform_set_drvdata(pdev, card);
454  return 0;
455  }
456 
457 snd_fail:
458  snd_card_free(card);
459 
460  uac2->pcm = NULL;
461  uac2->card = NULL;
462 
463  return err;
464 }
465 
466 static int snd_uac2_remove(struct platform_device *pdev)
467 {
468  struct snd_card *card = platform_get_drvdata(pdev);
469 
470  platform_set_drvdata(pdev, NULL);
471 
472  if (card)
473  return snd_card_free(card);
474 
475  return 0;
476 }
477 
478 static int alsa_uac2_init(struct audio_dev *agdev)
479 {
480  struct snd_uac2_chip *uac2 = &agdev->uac2;
481  int err;
482 
483  uac2->pdrv.probe = snd_uac2_probe;
484  uac2->pdrv.remove = snd_uac2_remove;
485  uac2->pdrv.driver.name = uac2_name;
486 
487  uac2->pdev.id = 0;
488  uac2->pdev.name = uac2_name;
489 
490  /* Register snd_uac2 driver */
491  err = platform_driver_register(&uac2->pdrv);
492  if (err)
493  return err;
494 
495  /* Register snd_uac2 device */
496  err = platform_device_register(&uac2->pdev);
497  if (err)
499 
500  return err;
501 }
502 
503 static void alsa_uac2_exit(struct audio_dev *agdev)
504 {
505  struct snd_uac2_chip *uac2 = &agdev->uac2;
506 
509 }
510 
511 
512 /* --------- USB Function Interface ------------- */
513 
514 enum {
527 };
528 
529 static const char ifassoc[] = "Source/Sink";
530 static const char ifctrl[] = "Topology Control";
531 static char clksrc_in[8];
532 static char clksrc_out[8];
533 static const char usb_it[] = "USBH Out";
534 static const char io_it[] = "USBD Out";
535 static const char usb_ot[] = "USBH In";
536 static const char io_ot[] = "USBD In";
537 static const char out_alt0[] = "Playback Inactive";
538 static const char out_alt1[] = "Playback Active";
539 static const char in_alt0[] = "Capture Inactive";
540 static const char in_alt1[] = "Capture Active";
541 
542 static struct usb_string strings_fn[] = {
543  [STR_ASSOC].s = ifassoc,
544  [STR_IF_CTRL].s = ifctrl,
545  [STR_CLKSRC_IN].s = clksrc_in,
546  [STR_CLKSRC_OUT].s = clksrc_out,
547  [STR_USB_IT].s = usb_it,
548  [STR_IO_IT].s = io_it,
549  [STR_USB_OT].s = usb_ot,
550  [STR_IO_OT].s = io_ot,
551  [STR_AS_OUT_ALT0].s = out_alt0,
552  [STR_AS_OUT_ALT1].s = out_alt1,
553  [STR_AS_IN_ALT0].s = in_alt0,
554  [STR_AS_IN_ALT1].s = in_alt1,
555  { },
556 };
557 
558 static struct usb_gadget_strings str_fn = {
559  .language = 0x0409, /* en-us */
560  .strings = strings_fn,
561 };
562 
563 static struct usb_gadget_strings *fn_strings[] = {
564  &str_fn,
565  NULL,
566 };
567 
568 static struct usb_qualifier_descriptor devqual_desc = {
569  .bLength = sizeof devqual_desc,
571 
572  .bcdUSB = cpu_to_le16(0x200),
573  .bDeviceClass = USB_CLASS_MISC,
574  .bDeviceSubClass = 0x02,
575  .bDeviceProtocol = 0x01,
576  .bNumConfigurations = 1,
577  .bRESERVED = 0,
578 };
579 
580 static struct usb_interface_assoc_descriptor iad_desc = {
581  .bLength = sizeof iad_desc,
583 
584  .bFirstInterface = 0,
585  .bInterfaceCount = 3,
586  .bFunctionClass = USB_CLASS_AUDIO,
587  .bFunctionSubClass = UAC2_FUNCTION_SUBCLASS_UNDEFINED,
588  .bFunctionProtocol = UAC_VERSION_2,
589 };
590 
591 /* Audio Control Interface */
592 static struct usb_interface_descriptor std_ac_if_desc = {
593  .bLength = sizeof std_ac_if_desc,
595 
596  .bAlternateSetting = 0,
597  .bNumEndpoints = 0,
598  .bInterfaceClass = USB_CLASS_AUDIO,
599  .bInterfaceSubClass = USB_SUBCLASS_AUDIOCONTROL,
600  .bInterfaceProtocol = UAC_VERSION_2,
601 };
602 
603 /* Clock source for IN traffic */
605  .bLength = sizeof in_clk_src_desc,
606  .bDescriptorType = USB_DT_CS_INTERFACE,
607 
608  .bDescriptorSubtype = UAC2_CLOCK_SOURCE,
609  .bClockID = USB_IN_CLK_ID,
610  .bmAttributes = UAC_CLOCK_SOURCE_TYPE_INT_FIXED,
611  .bmControls = (CONTROL_RDONLY << CLK_FREQ_CTRL),
612  .bAssocTerminal = 0,
613 };
614 
615 /* Clock source for OUT traffic */
617  .bLength = sizeof out_clk_src_desc,
618  .bDescriptorType = USB_DT_CS_INTERFACE,
619 
620  .bDescriptorSubtype = UAC2_CLOCK_SOURCE,
621  .bClockID = USB_OUT_CLK_ID,
622  .bmAttributes = UAC_CLOCK_SOURCE_TYPE_INT_FIXED,
623  .bmControls = (CONTROL_RDONLY << CLK_FREQ_CTRL),
624  .bAssocTerminal = 0,
625 };
626 
627 /* Input Terminal for USB_OUT */
629  .bLength = sizeof usb_out_it_desc,
630  .bDescriptorType = USB_DT_CS_INTERFACE,
631 
632  .bDescriptorSubtype = UAC_INPUT_TERMINAL,
633  .bTerminalID = USB_OUT_IT_ID,
634  .wTerminalType = cpu_to_le16(UAC_TERMINAL_STREAMING),
635  .bAssocTerminal = 0,
636  .bCSourceID = USB_OUT_CLK_ID,
637  .iChannelNames = 0,
638  .bmControls = (CONTROL_RDWR << COPY_CTRL),
639 };
640 
641 /* Input Terminal for I/O-In */
643  .bLength = sizeof io_in_it_desc,
644  .bDescriptorType = USB_DT_CS_INTERFACE,
645 
646  .bDescriptorSubtype = UAC_INPUT_TERMINAL,
647  .bTerminalID = IO_IN_IT_ID,
648  .wTerminalType = cpu_to_le16(UAC_INPUT_TERMINAL_UNDEFINED),
649  .bAssocTerminal = 0,
650  .bCSourceID = USB_IN_CLK_ID,
651  .iChannelNames = 0,
652  .bmControls = (CONTROL_RDWR << COPY_CTRL),
653 };
654 
655 /* Ouput Terminal for USB_IN */
657  .bLength = sizeof usb_in_ot_desc,
658  .bDescriptorType = USB_DT_CS_INTERFACE,
659 
660  .bDescriptorSubtype = UAC_OUTPUT_TERMINAL,
661  .bTerminalID = USB_IN_OT_ID,
662  .wTerminalType = cpu_to_le16(UAC_TERMINAL_STREAMING),
663  .bAssocTerminal = 0,
664  .bSourceID = IO_IN_IT_ID,
665  .bCSourceID = USB_IN_CLK_ID,
666  .bmControls = (CONTROL_RDWR << COPY_CTRL),
667 };
668 
669 /* Ouput Terminal for I/O-Out */
671  .bLength = sizeof io_out_ot_desc,
672  .bDescriptorType = USB_DT_CS_INTERFACE,
673 
674  .bDescriptorSubtype = UAC_OUTPUT_TERMINAL,
675  .bTerminalID = IO_OUT_OT_ID,
676  .wTerminalType = cpu_to_le16(UAC_OUTPUT_TERMINAL_UNDEFINED),
677  .bAssocTerminal = 0,
678  .bSourceID = USB_OUT_IT_ID,
679  .bCSourceID = USB_OUT_CLK_ID,
680  .bmControls = (CONTROL_RDWR << COPY_CTRL),
681 };
682 
684  .bLength = sizeof ac_hdr_desc,
685  .bDescriptorType = USB_DT_CS_INTERFACE,
686 
687  .bDescriptorSubtype = UAC_MS_HEADER,
688  .bcdADC = cpu_to_le16(0x200),
689  .bCategory = UAC2_FUNCTION_IO_BOX,
690  .wTotalLength = sizeof in_clk_src_desc + sizeof out_clk_src_desc
691  + sizeof usb_out_it_desc + sizeof io_in_it_desc
692  + sizeof usb_in_ot_desc + sizeof io_out_ot_desc,
693  .bmControls = 0,
694 };
695 
696 /* Audio Streaming OUT Interface - Alt0 */
697 static struct usb_interface_descriptor std_as_out_if0_desc = {
698  .bLength = sizeof std_as_out_if0_desc,
700 
701  .bAlternateSetting = 0,
702  .bNumEndpoints = 0,
703  .bInterfaceClass = USB_CLASS_AUDIO,
704  .bInterfaceSubClass = USB_SUBCLASS_AUDIOSTREAMING,
705  .bInterfaceProtocol = UAC_VERSION_2,
706 };
707 
708 /* Audio Streaming OUT Interface - Alt1 */
709 static struct usb_interface_descriptor std_as_out_if1_desc = {
710  .bLength = sizeof std_as_out_if1_desc,
712 
713  .bAlternateSetting = 1,
714  .bNumEndpoints = 1,
715  .bInterfaceClass = USB_CLASS_AUDIO,
716  .bInterfaceSubClass = USB_SUBCLASS_AUDIOSTREAMING,
717  .bInterfaceProtocol = UAC_VERSION_2,
718 };
719 
720 /* Audio Stream OUT Intface Desc */
722  .bLength = sizeof as_out_hdr_desc,
723  .bDescriptorType = USB_DT_CS_INTERFACE,
724 
725  .bDescriptorSubtype = UAC_AS_GENERAL,
726  .bTerminalLink = USB_OUT_IT_ID,
727  .bmControls = 0,
728  .bFormatType = UAC_FORMAT_TYPE_I,
729  .bmFormats = cpu_to_le32(UAC_FORMAT_TYPE_I_PCM),
730  .iChannelNames = 0,
731 };
732 
733 /* Audio USB_OUT Format */
735  .bLength = sizeof as_out_fmt1_desc,
736  .bDescriptorType = USB_DT_CS_INTERFACE,
737  .bDescriptorSubtype = UAC_FORMAT_TYPE,
738  .bFormatType = UAC_FORMAT_TYPE_I,
739 };
740 
741 /* STD AS ISO OUT Endpoint */
743  .bLength = USB_DT_ENDPOINT_SIZE,
744  .bDescriptorType = USB_DT_ENDPOINT,
745 
746  .bEndpointAddress = USB_DIR_OUT,
748  .bInterval = 1,
749 };
750 
752  .bLength = USB_DT_ENDPOINT_SIZE,
753  .bDescriptorType = USB_DT_ENDPOINT,
754 
756  .bInterval = 4,
757 };
758 
759 /* CS AS ISO OUT Endpoint */
760 static struct uac2_iso_endpoint_descriptor as_iso_out_desc = {
761  .bLength = sizeof as_iso_out_desc,
763 
764  .bDescriptorSubtype = UAC_EP_GENERAL,
765  .bmAttributes = 0,
766  .bmControls = 0,
767  .bLockDelayUnits = 0,
768  .wLockDelay = 0,
769 };
770 
771 /* Audio Streaming IN Interface - Alt0 */
772 static struct usb_interface_descriptor std_as_in_if0_desc = {
773  .bLength = sizeof std_as_in_if0_desc,
775 
776  .bAlternateSetting = 0,
777  .bNumEndpoints = 0,
778  .bInterfaceClass = USB_CLASS_AUDIO,
779  .bInterfaceSubClass = USB_SUBCLASS_AUDIOSTREAMING,
780  .bInterfaceProtocol = UAC_VERSION_2,
781 };
782 
783 /* Audio Streaming IN Interface - Alt1 */
784 static struct usb_interface_descriptor std_as_in_if1_desc = {
785  .bLength = sizeof std_as_in_if1_desc,
787 
788  .bAlternateSetting = 1,
789  .bNumEndpoints = 1,
790  .bInterfaceClass = USB_CLASS_AUDIO,
791  .bInterfaceSubClass = USB_SUBCLASS_AUDIOSTREAMING,
792  .bInterfaceProtocol = UAC_VERSION_2,
793 };
794 
795 /* Audio Stream IN Intface Desc */
797  .bLength = sizeof as_in_hdr_desc,
798  .bDescriptorType = USB_DT_CS_INTERFACE,
799 
800  .bDescriptorSubtype = UAC_AS_GENERAL,
801  .bTerminalLink = USB_IN_OT_ID,
802  .bmControls = 0,
803  .bFormatType = UAC_FORMAT_TYPE_I,
804  .bmFormats = cpu_to_le32(UAC_FORMAT_TYPE_I_PCM),
805  .iChannelNames = 0,
806 };
807 
808 /* Audio USB_IN Format */
810  .bLength = sizeof as_in_fmt1_desc,
811  .bDescriptorType = USB_DT_CS_INTERFACE,
812  .bDescriptorSubtype = UAC_FORMAT_TYPE,
813  .bFormatType = UAC_FORMAT_TYPE_I,
814 };
815 
816 /* STD AS ISO IN Endpoint */
818  .bLength = USB_DT_ENDPOINT_SIZE,
819  .bDescriptorType = USB_DT_ENDPOINT,
820 
821  .bEndpointAddress = USB_DIR_IN,
823  .bInterval = 1,
824 };
825 
827  .bLength = USB_DT_ENDPOINT_SIZE,
828  .bDescriptorType = USB_DT_ENDPOINT,
829 
831  .bInterval = 4,
832 };
833 
834 /* CS AS ISO IN Endpoint */
835 static struct uac2_iso_endpoint_descriptor as_iso_in_desc = {
836  .bLength = sizeof as_iso_in_desc,
838 
839  .bDescriptorSubtype = UAC_EP_GENERAL,
840  .bmAttributes = 0,
841  .bmControls = 0,
842  .bLockDelayUnits = 0,
843  .wLockDelay = 0,
844 };
845 
846 static struct usb_descriptor_header *fs_audio_desc[] = {
847  (struct usb_descriptor_header *)&iad_desc,
848  (struct usb_descriptor_header *)&std_ac_if_desc,
849 
850  (struct usb_descriptor_header *)&ac_hdr_desc,
852  (struct usb_descriptor_header *)&out_clk_src_desc,
854  (struct usb_descriptor_header *)&io_in_it_desc,
856  (struct usb_descriptor_header *)&io_out_ot_desc,
857 
858  (struct usb_descriptor_header *)&std_as_out_if0_desc,
859  (struct usb_descriptor_header *)&std_as_out_if1_desc,
860 
862  (struct usb_descriptor_header *)&as_out_fmt1_desc,
864  (struct usb_descriptor_header *)&as_iso_out_desc,
865 
866  (struct usb_descriptor_header *)&std_as_in_if0_desc,
867  (struct usb_descriptor_header *)&std_as_in_if1_desc,
868 
870  (struct usb_descriptor_header *)&as_in_fmt1_desc,
872  (struct usb_descriptor_header *)&as_iso_in_desc,
873  NULL,
874 };
875 
876 static struct usb_descriptor_header *hs_audio_desc[] = {
877  (struct usb_descriptor_header *)&iad_desc,
878  (struct usb_descriptor_header *)&std_ac_if_desc,
879 
880  (struct usb_descriptor_header *)&ac_hdr_desc,
882  (struct usb_descriptor_header *)&out_clk_src_desc,
884  (struct usb_descriptor_header *)&io_in_it_desc,
886  (struct usb_descriptor_header *)&io_out_ot_desc,
887 
888  (struct usb_descriptor_header *)&std_as_out_if0_desc,
889  (struct usb_descriptor_header *)&std_as_out_if1_desc,
890 
892  (struct usb_descriptor_header *)&as_out_fmt1_desc,
894  (struct usb_descriptor_header *)&as_iso_out_desc,
895 
896  (struct usb_descriptor_header *)&std_as_in_if0_desc,
897  (struct usb_descriptor_header *)&std_as_in_if1_desc,
898 
900  (struct usb_descriptor_header *)&as_in_fmt1_desc,
902  (struct usb_descriptor_header *)&as_iso_in_desc,
903  NULL,
904 };
905 
908 };
909 
915 } __packed;
916 
917 static inline void
918 free_ep(struct uac2_rtd_params *prm, struct usb_ep *ep)
919 {
920  struct snd_uac2_chip *uac2 = prm_to_uac2(prm);
921  int i;
922 
923  prm->ep_enabled = false;
924 
925  for (i = 0; i < USB_XFERS; i++) {
926  if (prm->ureq[i].req) {
927  usb_ep_dequeue(ep, prm->ureq[i].req);
928  usb_ep_free_request(ep, prm->ureq[i].req);
929  prm->ureq[i].req = NULL;
930  }
931  }
932 
933  if (usb_ep_disable(ep))
934  dev_err(&uac2->pdev.dev,
935  "%s:%d Error!\n", __func__, __LINE__);
936 }
937 
938 static int __init
939 afunc_bind(struct usb_configuration *cfg, struct usb_function *fn)
940 {
941  struct audio_dev *agdev = func_to_agdev(fn);
942  struct snd_uac2_chip *uac2 = &agdev->uac2;
943  struct usb_composite_dev *cdev = cfg->cdev;
944  struct usb_gadget *gadget = cdev->gadget;
945  struct uac2_rtd_params *prm;
946  int ret;
947 
948  ret = usb_interface_id(cfg, fn);
949  if (ret < 0) {
950  dev_err(&uac2->pdev.dev,
951  "%s:%d Error!\n", __func__, __LINE__);
952  return ret;
953  }
954  std_ac_if_desc.bInterfaceNumber = ret;
955  ALT_SET(agdev->ac_alt, 0);
956  INTF_SET(agdev->ac_alt, ret);
957 
958  ret = usb_interface_id(cfg, fn);
959  if (ret < 0) {
960  dev_err(&uac2->pdev.dev,
961  "%s:%d Error!\n", __func__, __LINE__);
962  return ret;
963  }
964  std_as_out_if0_desc.bInterfaceNumber = ret;
965  std_as_out_if1_desc.bInterfaceNumber = ret;
966  ALT_SET(agdev->as_out_alt, 0);
967  INTF_SET(agdev->as_out_alt, ret);
968 
969  ret = usb_interface_id(cfg, fn);
970  if (ret < 0) {
971  dev_err(&uac2->pdev.dev,
972  "%s:%d Error!\n", __func__, __LINE__);
973  return ret;
974  }
975  std_as_in_if0_desc.bInterfaceNumber = ret;
976  std_as_in_if1_desc.bInterfaceNumber = ret;
977  ALT_SET(agdev->as_in_alt, 0);
978  INTF_SET(agdev->as_in_alt, ret);
979 
980  agdev->out_ep = usb_ep_autoconfig(gadget, &fs_epout_desc);
981  if (!agdev->out_ep)
982  dev_err(&uac2->pdev.dev,
983  "%s:%d Error!\n", __func__, __LINE__);
984  agdev->out_ep->driver_data = agdev;
985 
986  agdev->in_ep = usb_ep_autoconfig(gadget, &fs_epin_desc);
987  if (!agdev->in_ep)
988  dev_err(&uac2->pdev.dev,
989  "%s:%d Error!\n", __func__, __LINE__);
990  agdev->in_ep->driver_data = agdev;
991 
992  hs_epout_desc.bEndpointAddress = fs_epout_desc.bEndpointAddress;
993  hs_epout_desc.wMaxPacketSize = fs_epout_desc.wMaxPacketSize;
994  hs_epin_desc.bEndpointAddress = fs_epin_desc.bEndpointAddress;
995  hs_epin_desc.wMaxPacketSize = fs_epin_desc.wMaxPacketSize;
996 
997  fn->descriptors = usb_copy_descriptors(fs_audio_desc);
998  if (gadget_is_dualspeed(gadget))
999  fn->hs_descriptors = usb_copy_descriptors(hs_audio_desc);
1000 
1001  prm = &agdev->uac2.c_prm;
1002  prm->max_psize = hs_epout_desc.wMaxPacketSize;
1003  prm->rbuf = kzalloc(prm->max_psize * USB_XFERS, GFP_KERNEL);
1004  if (!prm->rbuf) {
1005  prm->max_psize = 0;
1006  dev_err(&uac2->pdev.dev,
1007  "%s:%d Error!\n", __func__, __LINE__);
1008  }
1009 
1010  prm = &agdev->uac2.p_prm;
1011  prm->max_psize = hs_epin_desc.wMaxPacketSize;
1012  prm->rbuf = kzalloc(prm->max_psize * USB_XFERS, GFP_KERNEL);
1013  if (!prm->rbuf) {
1014  prm->max_psize = 0;
1015  dev_err(&uac2->pdev.dev,
1016  "%s:%d Error!\n", __func__, __LINE__);
1017  }
1018 
1019  return alsa_uac2_init(agdev);
1020 }
1021 
1022 static void
1023 afunc_unbind(struct usb_configuration *cfg, struct usb_function *fn)
1024 {
1025  struct audio_dev *agdev = func_to_agdev(fn);
1026  struct usb_composite_dev *cdev = cfg->cdev;
1027  struct usb_gadget *gadget = cdev->gadget;
1028  struct uac2_rtd_params *prm;
1029 
1030  alsa_uac2_exit(agdev);
1031 
1032  prm = &agdev->uac2.p_prm;
1033  kfree(prm->rbuf);
1034 
1035  prm = &agdev->uac2.c_prm;
1036  kfree(prm->rbuf);
1037 
1038  if (gadget_is_dualspeed(gadget))
1039  usb_free_descriptors(fn->hs_descriptors);
1040  usb_free_descriptors(fn->descriptors);
1041 
1042  if (agdev->in_ep)
1043  agdev->in_ep->driver_data = NULL;
1044  if (agdev->out_ep)
1045  agdev->out_ep->driver_data = NULL;
1046 }
1047 
1048 static int
1049 afunc_set_alt(struct usb_function *fn, unsigned intf, unsigned alt)
1050 {
1051  struct usb_composite_dev *cdev = fn->config->cdev;
1052  struct audio_dev *agdev = func_to_agdev(fn);
1053  struct snd_uac2_chip *uac2 = &agdev->uac2;
1054  struct usb_gadget *gadget = cdev->gadget;
1055  struct usb_request *req;
1056  struct usb_ep *ep;
1057  struct uac2_rtd_params *prm;
1058  int i;
1059 
1060  /* No i/f has more than 2 alt settings */
1061  if (alt > 1) {
1062  dev_err(&uac2->pdev.dev,
1063  "%s:%d Error!\n", __func__, __LINE__);
1064  return -EINVAL;
1065  }
1066 
1067  if (intf == INTF_GET(agdev->ac_alt)) {
1068  /* Control I/f has only 1 AltSetting - 0 */
1069  if (alt) {
1070  dev_err(&uac2->pdev.dev,
1071  "%s:%d Error!\n", __func__, __LINE__);
1072  return -EINVAL;
1073  }
1074  return 0;
1075  }
1076 
1077  if (intf == INTF_GET(agdev->as_out_alt)) {
1078  ep = agdev->out_ep;
1079  prm = &uac2->c_prm;
1080  config_ep_by_speed(gadget, fn, ep);
1081  ALT_SET(agdev->as_out_alt, alt);
1082  } else if (intf == INTF_GET(agdev->as_in_alt)) {
1083  ep = agdev->in_ep;
1084  prm = &uac2->p_prm;
1085  config_ep_by_speed(gadget, fn, ep);
1086  ALT_SET(agdev->as_in_alt, alt);
1087  } else {
1088  dev_err(&uac2->pdev.dev,
1089  "%s:%d Error!\n", __func__, __LINE__);
1090  return -EINVAL;
1091  }
1092 
1093  if (alt == 0) {
1094  free_ep(prm, ep);
1095  return 0;
1096  }
1097 
1098  prm->ep_enabled = true;
1099  usb_ep_enable(ep);
1100 
1101  for (i = 0; i < USB_XFERS; i++) {
1102  if (prm->ureq[i].req) {
1103  if (usb_ep_queue(ep, prm->ureq[i].req, GFP_ATOMIC))
1104  dev_err(&uac2->pdev.dev, "%d Error!\n",
1105  __LINE__);
1106  continue;
1107  }
1108 
1109  req = usb_ep_alloc_request(ep, GFP_ATOMIC);
1110  if (req == NULL) {
1111  dev_err(&uac2->pdev.dev,
1112  "%s:%d Error!\n", __func__, __LINE__);
1113  return -EINVAL;
1114  }
1115 
1116  prm->ureq[i].req = req;
1117  prm->ureq[i].pp = prm;
1118 
1119  req->zero = 0;
1120  req->dma = DMA_ADDR_INVALID;
1121  req->context = &prm->ureq[i];
1122  req->length = prm->max_psize;
1123  req->complete = agdev_iso_complete;
1124  req->buf = prm->rbuf + i * req->length;
1125 
1126  if (usb_ep_queue(ep, req, GFP_ATOMIC))
1127  dev_err(&uac2->pdev.dev, "%d Error!\n", __LINE__);
1128  }
1129 
1130  return 0;
1131 }
1132 
1133 static int
1134 afunc_get_alt(struct usb_function *fn, unsigned intf)
1135 {
1136  struct audio_dev *agdev = func_to_agdev(fn);
1137  struct snd_uac2_chip *uac2 = &agdev->uac2;
1138 
1139  if (intf == INTF_GET(agdev->ac_alt))
1140  return ALT_GET(agdev->ac_alt);
1141  else if (intf == INTF_GET(agdev->as_out_alt))
1142  return ALT_GET(agdev->as_out_alt);
1143  else if (intf == INTF_GET(agdev->as_in_alt))
1144  return ALT_GET(agdev->as_in_alt);
1145  else
1146  dev_err(&uac2->pdev.dev,
1147  "%s:%d Invalid Interface %d!\n",
1148  __func__, __LINE__, intf);
1149 
1150  return -EINVAL;
1151 }
1152 
1153 static void
1154 afunc_disable(struct usb_function *fn)
1155 {
1156  struct audio_dev *agdev = func_to_agdev(fn);
1157  struct snd_uac2_chip *uac2 = &agdev->uac2;
1158 
1159  free_ep(&uac2->p_prm, agdev->in_ep);
1160  ALT_SET(agdev->as_in_alt, 0);
1161 
1162  free_ep(&uac2->c_prm, agdev->out_ep);
1163  ALT_SET(agdev->as_out_alt, 0);
1164 }
1165 
1166 static int
1167 in_rq_cur(struct usb_function *fn, const struct usb_ctrlrequest *cr)
1168 {
1169  struct usb_request *req = fn->config->cdev->req;
1170  struct audio_dev *agdev = func_to_agdev(fn);
1171  struct snd_uac2_chip *uac2 = &agdev->uac2;
1173  u16 w_index = le16_to_cpu(cr->wIndex);
1174  u16 w_value = le16_to_cpu(cr->wValue);
1175  u8 entity_id = (w_index >> 8) & 0xff;
1176  u8 control_selector = w_value >> 8;
1177  int value = -EOPNOTSUPP;
1178 
1179  if (control_selector == UAC2_CS_CONTROL_SAM_FREQ) {
1180  struct cntrl_cur_lay3 c;
1181 
1182  if (entity_id == USB_IN_CLK_ID)
1183  c.dCUR = p_srate;
1184  else if (entity_id == USB_OUT_CLK_ID)
1185  c.dCUR = c_srate;
1186 
1187  value = min_t(unsigned, w_length, sizeof c);
1188  memcpy(req->buf, &c, value);
1189  } else if (control_selector == UAC2_CS_CONTROL_CLOCK_VALID) {
1190  *(u8 *)req->buf = 1;
1191  value = min_t(unsigned, w_length, 1);
1192  } else {
1193  dev_err(&uac2->pdev.dev,
1194  "%s:%d control_selector=%d TODO!\n",
1195  __func__, __LINE__, control_selector);
1196  }
1197 
1198  return value;
1199 }
1200 
1201 static int
1202 in_rq_range(struct usb_function *fn, const struct usb_ctrlrequest *cr)
1203 {
1204  struct usb_request *req = fn->config->cdev->req;
1205  struct audio_dev *agdev = func_to_agdev(fn);
1206  struct snd_uac2_chip *uac2 = &agdev->uac2;
1207  u16 w_length = le16_to_cpu(cr->wLength);
1208  u16 w_index = le16_to_cpu(cr->wIndex);
1209  u16 w_value = le16_to_cpu(cr->wValue);
1210  u8 entity_id = (w_index >> 8) & 0xff;
1211  u8 control_selector = w_value >> 8;
1212  struct cntrl_range_lay3 r;
1213  int value = -EOPNOTSUPP;
1214 
1215  if (control_selector == UAC2_CS_CONTROL_SAM_FREQ) {
1216  if (entity_id == USB_IN_CLK_ID)
1217  r.dMIN = p_srate;
1218  else if (entity_id == USB_OUT_CLK_ID)
1219  r.dMIN = c_srate;
1220  else
1221  return -EOPNOTSUPP;
1222 
1223  r.dMAX = r.dMIN;
1224  r.dRES = 0;
1225  r.wNumSubRanges = 1;
1226 
1227  value = min_t(unsigned, w_length, sizeof r);
1228  memcpy(req->buf, &r, value);
1229  } else {
1230  dev_err(&uac2->pdev.dev,
1231  "%s:%d control_selector=%d TODO!\n",
1232  __func__, __LINE__, control_selector);
1233  }
1234 
1235  return value;
1236 }
1237 
1238 static int
1239 ac_rq_in(struct usb_function *fn, const struct usb_ctrlrequest *cr)
1240 {
1241  if (cr->bRequest == UAC2_CS_CUR)
1242  return in_rq_cur(fn, cr);
1243  else if (cr->bRequest == UAC2_CS_RANGE)
1244  return in_rq_range(fn, cr);
1245  else
1246  return -EOPNOTSUPP;
1247 }
1248 
1249 static int
1250 out_rq_cur(struct usb_function *fn, const struct usb_ctrlrequest *cr)
1251 {
1252  u16 w_length = le16_to_cpu(cr->wLength);
1253  u16 w_value = le16_to_cpu(cr->wValue);
1254  u8 control_selector = w_value >> 8;
1255 
1256  if (control_selector == UAC2_CS_CONTROL_SAM_FREQ)
1257  return w_length;
1258 
1259  return -EOPNOTSUPP;
1260 }
1261 
1262 static int
1263 setup_rq_inf(struct usb_function *fn, const struct usb_ctrlrequest *cr)
1264 {
1265  struct audio_dev *agdev = func_to_agdev(fn);
1266  struct snd_uac2_chip *uac2 = &agdev->uac2;
1267  u16 w_index = le16_to_cpu(cr->wIndex);
1268  u8 intf = w_index & 0xff;
1269 
1270  if (intf != INTF_GET(agdev->ac_alt)) {
1271  dev_err(&uac2->pdev.dev,
1272  "%s:%d Error!\n", __func__, __LINE__);
1273  return -EOPNOTSUPP;
1274  }
1275 
1276  if (cr->bRequestType & USB_DIR_IN)
1277  return ac_rq_in(fn, cr);
1278  else if (cr->bRequest == UAC2_CS_CUR)
1279  return out_rq_cur(fn, cr);
1280 
1281  return -EOPNOTSUPP;
1282 }
1283 
1284 static int
1285 afunc_setup(struct usb_function *fn, const struct usb_ctrlrequest *cr)
1286 {
1287  struct usb_composite_dev *cdev = fn->config->cdev;
1288  struct audio_dev *agdev = func_to_agdev(fn);
1289  struct snd_uac2_chip *uac2 = &agdev->uac2;
1290  struct usb_request *req = cdev->req;
1291  u16 w_length = le16_to_cpu(cr->wLength);
1292  int value = -EOPNOTSUPP;
1293 
1294  /* Only Class specific requests are supposed to reach here */
1295  if ((cr->bRequestType & USB_TYPE_MASK) != USB_TYPE_CLASS)
1296  return -EOPNOTSUPP;
1297 
1299  value = setup_rq_inf(fn, cr);
1300  else
1301  dev_err(&uac2->pdev.dev, "%s:%d Error!\n", __func__, __LINE__);
1302 
1303  if (value >= 0) {
1304  req->length = value;
1305  req->zero = value < w_length;
1306  value = usb_ep_queue(cdev->gadget->ep0, req, GFP_ATOMIC);
1307  if (value < 0) {
1308  dev_err(&uac2->pdev.dev,
1309  "%s:%d Error!\n", __func__, __LINE__);
1310  req->status = 0;
1311  }
1312  }
1313 
1314  return value;
1315 }
1316 
1317 static int audio_bind_config(struct usb_configuration *cfg)
1318 {
1319  int id, res;
1320 
1321  agdev_g = kzalloc(sizeof *agdev_g, GFP_KERNEL);
1322  if (agdev_g == NULL) {
1323  printk(KERN_ERR "Unable to allocate audio gadget\n");
1324  return -ENOMEM;
1325  }
1326 
1327  id = usb_string_id(cfg->cdev);
1328  if (id < 0)
1329  return id;
1330 
1331  strings_fn[STR_ASSOC].id = id;
1332  iad_desc.iFunction = id,
1333 
1334  id = usb_string_id(cfg->cdev);
1335  if (id < 0)
1336  return id;
1337 
1338  strings_fn[STR_IF_CTRL].id = id;
1339  std_ac_if_desc.iInterface = id,
1340 
1341  id = usb_string_id(cfg->cdev);
1342  if (id < 0)
1343  return id;
1344 
1345  strings_fn[STR_CLKSRC_IN].id = id;
1346  in_clk_src_desc.iClockSource = id,
1347 
1348  id = usb_string_id(cfg->cdev);
1349  if (id < 0)
1350  return id;
1351 
1352  strings_fn[STR_CLKSRC_OUT].id = id;
1353  out_clk_src_desc.iClockSource = id,
1354 
1355  id = usb_string_id(cfg->cdev);
1356  if (id < 0)
1357  return id;
1358 
1359  strings_fn[STR_USB_IT].id = id;
1360  usb_out_it_desc.iTerminal = id,
1361 
1362  id = usb_string_id(cfg->cdev);
1363  if (id < 0)
1364  return id;
1365 
1366  strings_fn[STR_IO_IT].id = id;
1367  io_in_it_desc.iTerminal = id;
1368 
1369  id = usb_string_id(cfg->cdev);
1370  if (id < 0)
1371  return id;
1372 
1373  strings_fn[STR_USB_OT].id = id;
1374  usb_in_ot_desc.iTerminal = id;
1375 
1376  id = usb_string_id(cfg->cdev);
1377  if (id < 0)
1378  return id;
1379 
1380  strings_fn[STR_IO_OT].id = id;
1381  io_out_ot_desc.iTerminal = id;
1382 
1383  id = usb_string_id(cfg->cdev);
1384  if (id < 0)
1385  return id;
1386 
1387  strings_fn[STR_AS_OUT_ALT0].id = id;
1388  std_as_out_if0_desc.iInterface = id;
1389 
1390  id = usb_string_id(cfg->cdev);
1391  if (id < 0)
1392  return id;
1393 
1394  strings_fn[STR_AS_OUT_ALT1].id = id;
1395  std_as_out_if1_desc.iInterface = id;
1396 
1397  id = usb_string_id(cfg->cdev);
1398  if (id < 0)
1399  return id;
1400 
1401  strings_fn[STR_AS_IN_ALT0].id = id;
1402  std_as_in_if0_desc.iInterface = id;
1403 
1404  id = usb_string_id(cfg->cdev);
1405  if (id < 0)
1406  return id;
1407 
1408  strings_fn[STR_AS_IN_ALT1].id = id;
1409  std_as_in_if1_desc.iInterface = id;
1410 
1411  agdev_g->func.name = "uac2_func";
1412  agdev_g->func.strings = fn_strings;
1413  agdev_g->func.bind = afunc_bind;
1414  agdev_g->func.unbind = afunc_unbind;
1415  agdev_g->func.set_alt = afunc_set_alt;
1416  agdev_g->func.get_alt = afunc_get_alt;
1417  agdev_g->func.disable = afunc_disable;
1418  agdev_g->func.setup = afunc_setup;
1419 
1420  /* Initialize the configurable parameters */
1421  usb_out_it_desc.bNrChannels = num_channels(c_chmask);
1422  usb_out_it_desc.bmChannelConfig = cpu_to_le32(c_chmask);
1423  io_in_it_desc.bNrChannels = num_channels(p_chmask);
1424  io_in_it_desc.bmChannelConfig = cpu_to_le32(p_chmask);
1425  as_out_hdr_desc.bNrChannels = num_channels(c_chmask);
1426  as_out_hdr_desc.bmChannelConfig = cpu_to_le32(c_chmask);
1427  as_in_hdr_desc.bNrChannels = num_channels(p_chmask);
1428  as_in_hdr_desc.bmChannelConfig = cpu_to_le32(p_chmask);
1429  as_out_fmt1_desc.bSubslotSize = c_ssize;
1430  as_out_fmt1_desc.bBitResolution = c_ssize * 8;
1431  as_in_fmt1_desc.bSubslotSize = p_ssize;
1432  as_in_fmt1_desc.bBitResolution = p_ssize * 8;
1433 
1434  snprintf(clksrc_in, sizeof(clksrc_in), "%uHz", p_srate);
1435  snprintf(clksrc_out, sizeof(clksrc_out), "%uHz", c_srate);
1436 
1437  res = usb_add_function(cfg, &agdev_g->func);
1438  if (res < 0)
1439  kfree(agdev_g);
1440 
1441  return res;
1442 }
1443 
1444 static void
1445 uac2_unbind_config(struct usb_configuration *cfg)
1446 {
1447  kfree(agdev_g);
1448  agdev_g = NULL;
1449 }