2 * f_uac2.c -- USB Audio Class 2.0 Function
5 * Yadwinder Singh (yadi.brar01@gmail.com)
6 * Jaswinder Singh (jaswinder.singh@linaro.org)
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.
14 #include <linux/usb/audio.h>
15 #include <linux/usb/audio-v2.h>
16 #include <linux/platform_device.h>
17 #include <linux/module.h>
19 #include <sound/core.h>
20 #include <sound/pcm.h>
21 #include <sound/pcm_params.h>
25 /* Keep everyone on toes */
29 * The driver implements a simple UAC_2 topology.
30 * USB-OUT -> IT_1 -> OT_3 -> ALSA_Capture
31 * ALSA_Playback -> IT_2 -> OT_4 -> USB-IN
32 * Capture and Playback sampling rates are independently
33 * controlled by two clock sources :
34 * CLK_5 := c_srate, and CLK_6 := p_srate
36 #define USB_OUT_IT_ID 1
38 #define IO_OUT_OT_ID 3
39 #define USB_IN_OT_ID 4
40 #define USB_OUT_CLK_ID 5
41 #define USB_IN_CLK_ID 6
43 #define CONTROL_ABSENT 0
44 #define CONTROL_RDONLY 1
45 #define CONTROL_RDWR 3
47 #define CLK_FREQ_CTRL 0
48 #define CLK_VLD_CTRL 2
57 static const char *uac2_name
= "snd_uac2";
60 struct uac2_rtd_params
*pp
; /* parent param */
61 struct usb_request
*req
;
64 struct uac2_rtd_params
{
65 struct snd_uac2_chip
*uac2
; /* parent chip */
66 bool ep_enabled
; /* if the ep is enabled */
67 /* Size of the ring buffer */
69 unsigned char *dma_area
;
71 struct snd_pcm_substream
*ss
;
81 struct uac2_req ureq
[USB_XFERS
];
86 struct snd_uac2_chip
{
87 struct platform_device pdev
;
88 struct platform_driver pdrv
;
90 struct uac2_rtd_params p_prm
;
91 struct uac2_rtd_params c_prm
;
93 struct snd_card
*card
;
96 /* timekeeping for the playback endpoint */
97 unsigned int p_interval
;
98 unsigned int p_residue
;
100 /* pre-calculated values for playback iso completion */
101 unsigned int p_pktsize
;
102 unsigned int p_pktsize_residue
;
103 unsigned int p_framesize
;
106 #define BUFF_SIZE_MAX (PAGE_SIZE * 16)
107 #define PRD_SIZE_MAX PAGE_SIZE
108 #define MIN_PERIODS 4
110 static struct snd_pcm_hardware uac2_pcm_hardware
= {
111 .info
= SNDRV_PCM_INFO_INTERLEAVED
| SNDRV_PCM_INFO_BLOCK_TRANSFER
112 | SNDRV_PCM_INFO_MMAP
| SNDRV_PCM_INFO_MMAP_VALID
113 | SNDRV_PCM_INFO_PAUSE
| SNDRV_PCM_INFO_RESUME
,
114 .rates
= SNDRV_PCM_RATE_CONTINUOUS
,
115 .periods_max
= BUFF_SIZE_MAX
/ PRD_SIZE_MAX
,
116 .buffer_bytes_max
= BUFF_SIZE_MAX
,
117 .period_bytes_max
= PRD_SIZE_MAX
,
118 .periods_min
= MIN_PERIODS
,
123 u8 as_out_intf
, as_out_alt
;
124 u8 as_in_intf
, as_in_alt
;
126 struct usb_ep
*in_ep
, *out_ep
;
127 struct usb_function func
;
129 /* The ALSA Sound Card it represents on the USB-Client side */
130 struct snd_uac2_chip uac2
;
134 struct audio_dev
*func_to_agdev(struct usb_function
*f
)
136 return container_of(f
, struct audio_dev
, func
);
140 struct audio_dev
*uac2_to_agdev(struct snd_uac2_chip
*u
)
142 return container_of(u
, struct audio_dev
, uac2
);
146 struct snd_uac2_chip
*pdev_to_uac2(struct platform_device
*p
)
148 return container_of(p
, struct snd_uac2_chip
, pdev
);
152 struct f_uac2_opts
*agdev_to_uac2_opts(struct audio_dev
*agdev
)
154 return container_of(agdev
->func
.fi
, struct f_uac2_opts
, func_inst
);
158 uint
num_channels(uint chanmask
)
163 num
+= (chanmask
& 1);
171 agdev_iso_complete(struct usb_ep
*ep
, struct usb_request
*req
)
176 bool update_alsa
= false;
177 int status
= req
->status
;
178 struct uac2_req
*ur
= req
->context
;
179 struct snd_pcm_substream
*substream
;
180 struct uac2_rtd_params
*prm
= ur
->pp
;
181 struct snd_uac2_chip
*uac2
= prm
->uac2
;
183 /* i/f shutting down */
184 if (!prm
->ep_enabled
|| req
->status
== -ESHUTDOWN
)
188 * We can't really do much about bad xfers.
189 * Afterall, the ISOCH xfers could fail legitimately.
192 pr_debug("%s: iso_complete status(%d) %d/%d\n",
193 __func__
, status
, req
->actual
, req
->length
);
197 /* Do nothing if ALSA isn't active */
201 spin_lock_irqsave(&prm
->lock
, flags
);
203 if (substream
->stream
== SNDRV_PCM_STREAM_PLAYBACK
) {
205 * For each IN packet, take the quotient of the current data
206 * rate and the endpoint's interval as the base packet size.
207 * If there is a residue from this division, add it to the
208 * residue accumulator.
210 req
->length
= uac2
->p_pktsize
;
211 uac2
->p_residue
+= uac2
->p_pktsize_residue
;
214 * Whenever there are more bytes in the accumulator than we
215 * need to add one more sample frame, increase this packet's
216 * size and decrease the accumulator.
218 if (uac2
->p_residue
/ uac2
->p_interval
>= uac2
->p_framesize
) {
219 req
->length
+= uac2
->p_framesize
;
220 uac2
->p_residue
-= uac2
->p_framesize
*
224 req
->actual
= req
->length
;
227 pending
= prm
->hw_ptr
% prm
->period_size
;
228 pending
+= req
->actual
;
229 if (pending
>= prm
->period_size
)
232 hw_ptr
= prm
->hw_ptr
;
233 prm
->hw_ptr
= (prm
->hw_ptr
+ req
->actual
) % prm
->dma_bytes
;
235 spin_unlock_irqrestore(&prm
->lock
, flags
);
237 /* Pack USB load in ALSA ring buffer */
238 pending
= prm
->dma_bytes
- hw_ptr
;
240 if (substream
->stream
== SNDRV_PCM_STREAM_PLAYBACK
) {
241 if (unlikely(pending
< req
->actual
)) {
242 memcpy(req
->buf
, prm
->dma_area
+ hw_ptr
, pending
);
243 memcpy(req
->buf
+ pending
, prm
->dma_area
,
244 req
->actual
- pending
);
246 memcpy(req
->buf
, prm
->dma_area
+ hw_ptr
, req
->actual
);
249 if (unlikely(pending
< req
->actual
)) {
250 memcpy(prm
->dma_area
+ hw_ptr
, req
->buf
, pending
);
251 memcpy(prm
->dma_area
, req
->buf
+ pending
,
252 req
->actual
- pending
);
254 memcpy(prm
->dma_area
+ hw_ptr
, req
->buf
, req
->actual
);
259 if (usb_ep_queue(ep
, req
, GFP_ATOMIC
))
260 dev_err(&uac2
->pdev
.dev
, "%d Error!\n", __LINE__
);
263 snd_pcm_period_elapsed(substream
);
269 uac2_pcm_trigger(struct snd_pcm_substream
*substream
, int cmd
)
271 struct snd_uac2_chip
*uac2
= snd_pcm_substream_chip(substream
);
272 struct uac2_rtd_params
*prm
;
276 if (substream
->stream
== SNDRV_PCM_STREAM_PLAYBACK
)
281 spin_lock_irqsave(&prm
->lock
, flags
);
287 case SNDRV_PCM_TRIGGER_START
:
288 case SNDRV_PCM_TRIGGER_RESUME
:
291 case SNDRV_PCM_TRIGGER_STOP
:
292 case SNDRV_PCM_TRIGGER_SUSPEND
:
299 spin_unlock_irqrestore(&prm
->lock
, flags
);
301 /* Clear buffer after Play stops */
302 if (substream
->stream
== SNDRV_PCM_STREAM_PLAYBACK
&& !prm
->ss
)
303 memset(prm
->rbuf
, 0, prm
->max_psize
* USB_XFERS
);
308 static snd_pcm_uframes_t
uac2_pcm_pointer(struct snd_pcm_substream
*substream
)
310 struct snd_uac2_chip
*uac2
= snd_pcm_substream_chip(substream
);
311 struct uac2_rtd_params
*prm
;
313 if (substream
->stream
== SNDRV_PCM_STREAM_PLAYBACK
)
318 return bytes_to_frames(substream
->runtime
, prm
->hw_ptr
);
321 static int uac2_pcm_hw_params(struct snd_pcm_substream
*substream
,
322 struct snd_pcm_hw_params
*hw_params
)
324 struct snd_uac2_chip
*uac2
= snd_pcm_substream_chip(substream
);
325 struct uac2_rtd_params
*prm
;
328 if (substream
->stream
== SNDRV_PCM_STREAM_PLAYBACK
)
333 err
= snd_pcm_lib_malloc_pages(substream
,
334 params_buffer_bytes(hw_params
));
336 prm
->dma_bytes
= substream
->runtime
->dma_bytes
;
337 prm
->dma_area
= substream
->runtime
->dma_area
;
338 prm
->period_size
= params_period_bytes(hw_params
);
344 static int uac2_pcm_hw_free(struct snd_pcm_substream
*substream
)
346 struct snd_uac2_chip
*uac2
= snd_pcm_substream_chip(substream
);
347 struct uac2_rtd_params
*prm
;
349 if (substream
->stream
== SNDRV_PCM_STREAM_PLAYBACK
)
354 prm
->dma_area
= NULL
;
356 prm
->period_size
= 0;
358 return snd_pcm_lib_free_pages(substream
);
361 static int uac2_pcm_open(struct snd_pcm_substream
*substream
)
363 struct snd_uac2_chip
*uac2
= snd_pcm_substream_chip(substream
);
364 struct snd_pcm_runtime
*runtime
= substream
->runtime
;
365 struct audio_dev
*audio_dev
;
366 struct f_uac2_opts
*opts
;
367 int p_ssize
, c_ssize
;
368 int p_srate
, c_srate
;
369 int p_chmask
, c_chmask
;
371 audio_dev
= uac2_to_agdev(uac2
);
372 opts
= container_of(audio_dev
->func
.fi
, struct f_uac2_opts
, func_inst
);
373 p_ssize
= opts
->p_ssize
;
374 c_ssize
= opts
->c_ssize
;
375 p_srate
= opts
->p_srate
;
376 c_srate
= opts
->c_srate
;
377 p_chmask
= opts
->p_chmask
;
378 c_chmask
= opts
->c_chmask
;
381 runtime
->hw
= uac2_pcm_hardware
;
383 if (substream
->stream
== SNDRV_PCM_STREAM_PLAYBACK
) {
384 spin_lock_init(&uac2
->p_prm
.lock
);
385 runtime
->hw
.rate_min
= p_srate
;
388 runtime
->hw
.formats
= SNDRV_PCM_FMTBIT_S24_3LE
;
391 runtime
->hw
.formats
= SNDRV_PCM_FMTBIT_S32_LE
;
394 runtime
->hw
.formats
= SNDRV_PCM_FMTBIT_S16_LE
;
397 runtime
->hw
.channels_min
= num_channels(p_chmask
);
398 runtime
->hw
.period_bytes_min
= 2 * uac2
->p_prm
.max_psize
399 / runtime
->hw
.periods_min
;
401 spin_lock_init(&uac2
->c_prm
.lock
);
402 runtime
->hw
.rate_min
= c_srate
;
405 runtime
->hw
.formats
= SNDRV_PCM_FMTBIT_S24_3LE
;
408 runtime
->hw
.formats
= SNDRV_PCM_FMTBIT_S32_LE
;
411 runtime
->hw
.formats
= SNDRV_PCM_FMTBIT_S16_LE
;
414 runtime
->hw
.channels_min
= num_channels(c_chmask
);
415 runtime
->hw
.period_bytes_min
= 2 * uac2
->c_prm
.max_psize
416 / runtime
->hw
.periods_min
;
419 runtime
->hw
.rate_max
= runtime
->hw
.rate_min
;
420 runtime
->hw
.channels_max
= runtime
->hw
.channels_min
;
422 snd_pcm_hw_constraint_integer(runtime
, SNDRV_PCM_HW_PARAM_PERIODS
);
427 /* ALSA cries without these function pointers */
428 static int uac2_pcm_null(struct snd_pcm_substream
*substream
)
433 static struct snd_pcm_ops uac2_pcm_ops
= {
434 .open
= uac2_pcm_open
,
435 .close
= uac2_pcm_null
,
436 .ioctl
= snd_pcm_lib_ioctl
,
437 .hw_params
= uac2_pcm_hw_params
,
438 .hw_free
= uac2_pcm_hw_free
,
439 .trigger
= uac2_pcm_trigger
,
440 .pointer
= uac2_pcm_pointer
,
441 .prepare
= uac2_pcm_null
,
444 static int snd_uac2_probe(struct platform_device
*pdev
)
446 struct snd_uac2_chip
*uac2
= pdev_to_uac2(pdev
);
447 struct snd_card
*card
;
449 struct audio_dev
*audio_dev
;
450 struct f_uac2_opts
*opts
;
452 int p_chmask
, c_chmask
;
454 audio_dev
= uac2_to_agdev(uac2
);
455 opts
= container_of(audio_dev
->func
.fi
, struct f_uac2_opts
, func_inst
);
456 p_chmask
= opts
->p_chmask
;
457 c_chmask
= opts
->c_chmask
;
459 /* Choose any slot, with no id */
460 err
= snd_card_new(&pdev
->dev
, -1, NULL
, THIS_MODULE
, 0, &card
);
467 * Create first PCM device
468 * Create a substream only for non-zero channel streams
470 err
= snd_pcm_new(uac2
->card
, "UAC2 PCM", 0,
471 p_chmask
? 1 : 0, c_chmask
? 1 : 0, &pcm
);
475 strcpy(pcm
->name
, "UAC2 PCM");
476 pcm
->private_data
= uac2
;
480 snd_pcm_set_ops(pcm
, SNDRV_PCM_STREAM_PLAYBACK
, &uac2_pcm_ops
);
481 snd_pcm_set_ops(pcm
, SNDRV_PCM_STREAM_CAPTURE
, &uac2_pcm_ops
);
483 strcpy(card
->driver
, "UAC2_Gadget");
484 strcpy(card
->shortname
, "UAC2_Gadget");
485 sprintf(card
->longname
, "UAC2_Gadget %i", pdev
->id
);
487 snd_pcm_lib_preallocate_pages_for_all(pcm
, SNDRV_DMA_TYPE_CONTINUOUS
,
488 snd_dma_continuous_data(GFP_KERNEL
), 0, BUFF_SIZE_MAX
);
490 err
= snd_card_register(card
);
492 platform_set_drvdata(pdev
, card
);
505 static int snd_uac2_remove(struct platform_device
*pdev
)
507 struct snd_card
*card
= platform_get_drvdata(pdev
);
510 return snd_card_free(card
);
515 static void snd_uac2_release(struct device
*dev
)
517 dev_dbg(dev
, "releasing '%s'\n", dev_name(dev
));
520 static int alsa_uac2_init(struct audio_dev
*agdev
)
522 struct snd_uac2_chip
*uac2
= &agdev
->uac2
;
525 uac2
->pdrv
.probe
= snd_uac2_probe
;
526 uac2
->pdrv
.remove
= snd_uac2_remove
;
527 uac2
->pdrv
.driver
.name
= uac2_name
;
530 uac2
->pdev
.name
= uac2_name
;
531 uac2
->pdev
.dev
.release
= snd_uac2_release
;
533 /* Register snd_uac2 driver */
534 err
= platform_driver_register(&uac2
->pdrv
);
538 /* Register snd_uac2 device */
539 err
= platform_device_register(&uac2
->pdev
);
541 platform_driver_unregister(&uac2
->pdrv
);
546 static void alsa_uac2_exit(struct audio_dev
*agdev
)
548 struct snd_uac2_chip
*uac2
= &agdev
->uac2
;
550 platform_driver_unregister(&uac2
->pdrv
);
551 platform_device_unregister(&uac2
->pdev
);
555 /* --------- USB Function Interface ------------- */
572 static char clksrc_in
[8];
573 static char clksrc_out
[8];
575 static struct usb_string strings_fn
[] = {
576 [STR_ASSOC
].s
= "Source/Sink",
577 [STR_IF_CTRL
].s
= "Topology Control",
578 [STR_CLKSRC_IN
].s
= clksrc_in
,
579 [STR_CLKSRC_OUT
].s
= clksrc_out
,
580 [STR_USB_IT
].s
= "USBH Out",
581 [STR_IO_IT
].s
= "USBD Out",
582 [STR_USB_OT
].s
= "USBH In",
583 [STR_IO_OT
].s
= "USBD In",
584 [STR_AS_OUT_ALT0
].s
= "Playback Inactive",
585 [STR_AS_OUT_ALT1
].s
= "Playback Active",
586 [STR_AS_IN_ALT0
].s
= "Capture Inactive",
587 [STR_AS_IN_ALT1
].s
= "Capture Active",
591 static struct usb_gadget_strings str_fn
= {
592 .language
= 0x0409, /* en-us */
593 .strings
= strings_fn
,
596 static struct usb_gadget_strings
*fn_strings
[] = {
601 static struct usb_interface_assoc_descriptor iad_desc
= {
602 .bLength
= sizeof iad_desc
,
603 .bDescriptorType
= USB_DT_INTERFACE_ASSOCIATION
,
605 .bFirstInterface
= 0,
606 .bInterfaceCount
= 3,
607 .bFunctionClass
= USB_CLASS_AUDIO
,
608 .bFunctionSubClass
= UAC2_FUNCTION_SUBCLASS_UNDEFINED
,
609 .bFunctionProtocol
= UAC_VERSION_2
,
612 /* Audio Control Interface */
613 static struct usb_interface_descriptor std_ac_if_desc
= {
614 .bLength
= sizeof std_ac_if_desc
,
615 .bDescriptorType
= USB_DT_INTERFACE
,
617 .bAlternateSetting
= 0,
619 .bInterfaceClass
= USB_CLASS_AUDIO
,
620 .bInterfaceSubClass
= USB_SUBCLASS_AUDIOCONTROL
,
621 .bInterfaceProtocol
= UAC_VERSION_2
,
624 /* Clock source for IN traffic */
625 static struct uac_clock_source_descriptor in_clk_src_desc
= {
626 .bLength
= sizeof in_clk_src_desc
,
627 .bDescriptorType
= USB_DT_CS_INTERFACE
,
629 .bDescriptorSubtype
= UAC2_CLOCK_SOURCE
,
630 .bClockID
= USB_IN_CLK_ID
,
631 .bmAttributes
= UAC_CLOCK_SOURCE_TYPE_INT_FIXED
,
632 .bmControls
= (CONTROL_RDONLY
<< CLK_FREQ_CTRL
),
636 /* Clock source for OUT traffic */
637 static struct uac_clock_source_descriptor out_clk_src_desc
= {
638 .bLength
= sizeof out_clk_src_desc
,
639 .bDescriptorType
= USB_DT_CS_INTERFACE
,
641 .bDescriptorSubtype
= UAC2_CLOCK_SOURCE
,
642 .bClockID
= USB_OUT_CLK_ID
,
643 .bmAttributes
= UAC_CLOCK_SOURCE_TYPE_INT_FIXED
,
644 .bmControls
= (CONTROL_RDONLY
<< CLK_FREQ_CTRL
),
648 /* Input Terminal for USB_OUT */
649 static struct uac2_input_terminal_descriptor usb_out_it_desc
= {
650 .bLength
= sizeof usb_out_it_desc
,
651 .bDescriptorType
= USB_DT_CS_INTERFACE
,
653 .bDescriptorSubtype
= UAC_INPUT_TERMINAL
,
654 .bTerminalID
= USB_OUT_IT_ID
,
655 .wTerminalType
= cpu_to_le16(UAC_TERMINAL_STREAMING
),
657 .bCSourceID
= USB_OUT_CLK_ID
,
659 .bmControls
= (CONTROL_RDWR
<< COPY_CTRL
),
662 /* Input Terminal for I/O-In */
663 static struct uac2_input_terminal_descriptor io_in_it_desc
= {
664 .bLength
= sizeof io_in_it_desc
,
665 .bDescriptorType
= USB_DT_CS_INTERFACE
,
667 .bDescriptorSubtype
= UAC_INPUT_TERMINAL
,
668 .bTerminalID
= IO_IN_IT_ID
,
669 .wTerminalType
= cpu_to_le16(UAC_INPUT_TERMINAL_UNDEFINED
),
671 .bCSourceID
= USB_IN_CLK_ID
,
673 .bmControls
= (CONTROL_RDWR
<< COPY_CTRL
),
676 /* Ouput Terminal for USB_IN */
677 static struct uac2_output_terminal_descriptor usb_in_ot_desc
= {
678 .bLength
= sizeof usb_in_ot_desc
,
679 .bDescriptorType
= USB_DT_CS_INTERFACE
,
681 .bDescriptorSubtype
= UAC_OUTPUT_TERMINAL
,
682 .bTerminalID
= USB_IN_OT_ID
,
683 .wTerminalType
= cpu_to_le16(UAC_TERMINAL_STREAMING
),
685 .bSourceID
= IO_IN_IT_ID
,
686 .bCSourceID
= USB_IN_CLK_ID
,
687 .bmControls
= (CONTROL_RDWR
<< COPY_CTRL
),
690 /* Ouput Terminal for I/O-Out */
691 static struct uac2_output_terminal_descriptor io_out_ot_desc
= {
692 .bLength
= sizeof io_out_ot_desc
,
693 .bDescriptorType
= USB_DT_CS_INTERFACE
,
695 .bDescriptorSubtype
= UAC_OUTPUT_TERMINAL
,
696 .bTerminalID
= IO_OUT_OT_ID
,
697 .wTerminalType
= cpu_to_le16(UAC_OUTPUT_TERMINAL_UNDEFINED
),
699 .bSourceID
= USB_OUT_IT_ID
,
700 .bCSourceID
= USB_OUT_CLK_ID
,
701 .bmControls
= (CONTROL_RDWR
<< COPY_CTRL
),
704 static struct uac2_ac_header_descriptor ac_hdr_desc
= {
705 .bLength
= sizeof ac_hdr_desc
,
706 .bDescriptorType
= USB_DT_CS_INTERFACE
,
708 .bDescriptorSubtype
= UAC_MS_HEADER
,
709 .bcdADC
= cpu_to_le16(0x200),
710 .bCategory
= UAC2_FUNCTION_IO_BOX
,
711 .wTotalLength
= sizeof in_clk_src_desc
+ sizeof out_clk_src_desc
712 + sizeof usb_out_it_desc
+ sizeof io_in_it_desc
713 + sizeof usb_in_ot_desc
+ sizeof io_out_ot_desc
,
717 /* Audio Streaming OUT Interface - Alt0 */
718 static struct usb_interface_descriptor std_as_out_if0_desc
= {
719 .bLength
= sizeof std_as_out_if0_desc
,
720 .bDescriptorType
= USB_DT_INTERFACE
,
722 .bAlternateSetting
= 0,
724 .bInterfaceClass
= USB_CLASS_AUDIO
,
725 .bInterfaceSubClass
= USB_SUBCLASS_AUDIOSTREAMING
,
726 .bInterfaceProtocol
= UAC_VERSION_2
,
729 /* Audio Streaming OUT Interface - Alt1 */
730 static struct usb_interface_descriptor std_as_out_if1_desc
= {
731 .bLength
= sizeof std_as_out_if1_desc
,
732 .bDescriptorType
= USB_DT_INTERFACE
,
734 .bAlternateSetting
= 1,
736 .bInterfaceClass
= USB_CLASS_AUDIO
,
737 .bInterfaceSubClass
= USB_SUBCLASS_AUDIOSTREAMING
,
738 .bInterfaceProtocol
= UAC_VERSION_2
,
741 /* Audio Stream OUT Intface Desc */
742 static struct uac2_as_header_descriptor as_out_hdr_desc
= {
743 .bLength
= sizeof as_out_hdr_desc
,
744 .bDescriptorType
= USB_DT_CS_INTERFACE
,
746 .bDescriptorSubtype
= UAC_AS_GENERAL
,
747 .bTerminalLink
= USB_OUT_IT_ID
,
749 .bFormatType
= UAC_FORMAT_TYPE_I
,
750 .bmFormats
= cpu_to_le32(UAC_FORMAT_TYPE_I_PCM
),
754 /* Audio USB_OUT Format */
755 static struct uac2_format_type_i_descriptor as_out_fmt1_desc
= {
756 .bLength
= sizeof as_out_fmt1_desc
,
757 .bDescriptorType
= USB_DT_CS_INTERFACE
,
758 .bDescriptorSubtype
= UAC_FORMAT_TYPE
,
759 .bFormatType
= UAC_FORMAT_TYPE_I
,
762 /* STD AS ISO OUT Endpoint */
763 static struct usb_endpoint_descriptor fs_epout_desc
= {
764 .bLength
= USB_DT_ENDPOINT_SIZE
,
765 .bDescriptorType
= USB_DT_ENDPOINT
,
767 .bEndpointAddress
= USB_DIR_OUT
,
768 .bmAttributes
= USB_ENDPOINT_XFER_ISOC
| USB_ENDPOINT_SYNC_ASYNC
,
769 .wMaxPacketSize
= cpu_to_le16(1023),
773 static struct usb_endpoint_descriptor hs_epout_desc
= {
774 .bLength
= USB_DT_ENDPOINT_SIZE
,
775 .bDescriptorType
= USB_DT_ENDPOINT
,
777 .bmAttributes
= USB_ENDPOINT_XFER_ISOC
| USB_ENDPOINT_SYNC_ASYNC
,
778 .wMaxPacketSize
= cpu_to_le16(1024),
782 /* CS AS ISO OUT Endpoint */
783 static struct uac2_iso_endpoint_descriptor as_iso_out_desc
= {
784 .bLength
= sizeof as_iso_out_desc
,
785 .bDescriptorType
= USB_DT_CS_ENDPOINT
,
787 .bDescriptorSubtype
= UAC_EP_GENERAL
,
790 .bLockDelayUnits
= 0,
794 /* Audio Streaming IN Interface - Alt0 */
795 static struct usb_interface_descriptor std_as_in_if0_desc
= {
796 .bLength
= sizeof std_as_in_if0_desc
,
797 .bDescriptorType
= USB_DT_INTERFACE
,
799 .bAlternateSetting
= 0,
801 .bInterfaceClass
= USB_CLASS_AUDIO
,
802 .bInterfaceSubClass
= USB_SUBCLASS_AUDIOSTREAMING
,
803 .bInterfaceProtocol
= UAC_VERSION_2
,
806 /* Audio Streaming IN Interface - Alt1 */
807 static struct usb_interface_descriptor std_as_in_if1_desc
= {
808 .bLength
= sizeof std_as_in_if1_desc
,
809 .bDescriptorType
= USB_DT_INTERFACE
,
811 .bAlternateSetting
= 1,
813 .bInterfaceClass
= USB_CLASS_AUDIO
,
814 .bInterfaceSubClass
= USB_SUBCLASS_AUDIOSTREAMING
,
815 .bInterfaceProtocol
= UAC_VERSION_2
,
818 /* Audio Stream IN Intface Desc */
819 static struct uac2_as_header_descriptor as_in_hdr_desc
= {
820 .bLength
= sizeof as_in_hdr_desc
,
821 .bDescriptorType
= USB_DT_CS_INTERFACE
,
823 .bDescriptorSubtype
= UAC_AS_GENERAL
,
824 .bTerminalLink
= USB_IN_OT_ID
,
826 .bFormatType
= UAC_FORMAT_TYPE_I
,
827 .bmFormats
= cpu_to_le32(UAC_FORMAT_TYPE_I_PCM
),
831 /* Audio USB_IN Format */
832 static struct uac2_format_type_i_descriptor as_in_fmt1_desc
= {
833 .bLength
= sizeof as_in_fmt1_desc
,
834 .bDescriptorType
= USB_DT_CS_INTERFACE
,
835 .bDescriptorSubtype
= UAC_FORMAT_TYPE
,
836 .bFormatType
= UAC_FORMAT_TYPE_I
,
839 /* STD AS ISO IN Endpoint */
840 static struct usb_endpoint_descriptor fs_epin_desc
= {
841 .bLength
= USB_DT_ENDPOINT_SIZE
,
842 .bDescriptorType
= USB_DT_ENDPOINT
,
844 .bEndpointAddress
= USB_DIR_IN
,
845 .bmAttributes
= USB_ENDPOINT_XFER_ISOC
| USB_ENDPOINT_SYNC_ASYNC
,
846 .wMaxPacketSize
= cpu_to_le16(1023),
850 static struct usb_endpoint_descriptor hs_epin_desc
= {
851 .bLength
= USB_DT_ENDPOINT_SIZE
,
852 .bDescriptorType
= USB_DT_ENDPOINT
,
854 .bmAttributes
= USB_ENDPOINT_XFER_ISOC
| USB_ENDPOINT_SYNC_ASYNC
,
855 .wMaxPacketSize
= cpu_to_le16(1024),
859 /* CS AS ISO IN Endpoint */
860 static struct uac2_iso_endpoint_descriptor as_iso_in_desc
= {
861 .bLength
= sizeof as_iso_in_desc
,
862 .bDescriptorType
= USB_DT_CS_ENDPOINT
,
864 .bDescriptorSubtype
= UAC_EP_GENERAL
,
867 .bLockDelayUnits
= 0,
871 static struct usb_descriptor_header
*fs_audio_desc
[] = {
872 (struct usb_descriptor_header
*)&iad_desc
,
873 (struct usb_descriptor_header
*)&std_ac_if_desc
,
875 (struct usb_descriptor_header
*)&ac_hdr_desc
,
876 (struct usb_descriptor_header
*)&in_clk_src_desc
,
877 (struct usb_descriptor_header
*)&out_clk_src_desc
,
878 (struct usb_descriptor_header
*)&usb_out_it_desc
,
879 (struct usb_descriptor_header
*)&io_in_it_desc
,
880 (struct usb_descriptor_header
*)&usb_in_ot_desc
,
881 (struct usb_descriptor_header
*)&io_out_ot_desc
,
883 (struct usb_descriptor_header
*)&std_as_out_if0_desc
,
884 (struct usb_descriptor_header
*)&std_as_out_if1_desc
,
886 (struct usb_descriptor_header
*)&as_out_hdr_desc
,
887 (struct usb_descriptor_header
*)&as_out_fmt1_desc
,
888 (struct usb_descriptor_header
*)&fs_epout_desc
,
889 (struct usb_descriptor_header
*)&as_iso_out_desc
,
891 (struct usb_descriptor_header
*)&std_as_in_if0_desc
,
892 (struct usb_descriptor_header
*)&std_as_in_if1_desc
,
894 (struct usb_descriptor_header
*)&as_in_hdr_desc
,
895 (struct usb_descriptor_header
*)&as_in_fmt1_desc
,
896 (struct usb_descriptor_header
*)&fs_epin_desc
,
897 (struct usb_descriptor_header
*)&as_iso_in_desc
,
901 static struct usb_descriptor_header
*hs_audio_desc
[] = {
902 (struct usb_descriptor_header
*)&iad_desc
,
903 (struct usb_descriptor_header
*)&std_ac_if_desc
,
905 (struct usb_descriptor_header
*)&ac_hdr_desc
,
906 (struct usb_descriptor_header
*)&in_clk_src_desc
,
907 (struct usb_descriptor_header
*)&out_clk_src_desc
,
908 (struct usb_descriptor_header
*)&usb_out_it_desc
,
909 (struct usb_descriptor_header
*)&io_in_it_desc
,
910 (struct usb_descriptor_header
*)&usb_in_ot_desc
,
911 (struct usb_descriptor_header
*)&io_out_ot_desc
,
913 (struct usb_descriptor_header
*)&std_as_out_if0_desc
,
914 (struct usb_descriptor_header
*)&std_as_out_if1_desc
,
916 (struct usb_descriptor_header
*)&as_out_hdr_desc
,
917 (struct usb_descriptor_header
*)&as_out_fmt1_desc
,
918 (struct usb_descriptor_header
*)&hs_epout_desc
,
919 (struct usb_descriptor_header
*)&as_iso_out_desc
,
921 (struct usb_descriptor_header
*)&std_as_in_if0_desc
,
922 (struct usb_descriptor_header
*)&std_as_in_if1_desc
,
924 (struct usb_descriptor_header
*)&as_in_hdr_desc
,
925 (struct usb_descriptor_header
*)&as_in_fmt1_desc
,
926 (struct usb_descriptor_header
*)&hs_epin_desc
,
927 (struct usb_descriptor_header
*)&as_iso_in_desc
,
931 struct cntrl_cur_lay3
{
935 struct cntrl_range_lay3
{
943 free_ep(struct uac2_rtd_params
*prm
, struct usb_ep
*ep
)
945 struct snd_uac2_chip
*uac2
= prm
->uac2
;
948 if (!prm
->ep_enabled
)
951 prm
->ep_enabled
= false;
953 for (i
= 0; i
< USB_XFERS
; i
++) {
954 if (prm
->ureq
[i
].req
) {
955 usb_ep_dequeue(ep
, prm
->ureq
[i
].req
);
956 usb_ep_free_request(ep
, prm
->ureq
[i
].req
);
957 prm
->ureq
[i
].req
= NULL
;
961 if (usb_ep_disable(ep
))
962 dev_err(&uac2
->pdev
.dev
,
963 "%s:%d Error!\n", __func__
, __LINE__
);
966 static void set_ep_max_packet_size(const struct f_uac2_opts
*uac2_opts
,
967 struct usb_endpoint_descriptor
*ep_desc
,
968 unsigned int factor
, bool is_playback
)
970 int chmask
, srate
, ssize
;
974 chmask
= uac2_opts
->p_chmask
;
975 srate
= uac2_opts
->p_srate
;
976 ssize
= uac2_opts
->p_ssize
;
978 chmask
= uac2_opts
->c_chmask
;
979 srate
= uac2_opts
->c_srate
;
980 ssize
= uac2_opts
->c_ssize
;
983 max_packet_size
= num_channels(chmask
) * ssize
*
984 DIV_ROUND_UP(srate
, factor
/ (1 << (ep_desc
->bInterval
- 1)));
985 ep_desc
->wMaxPacketSize
= cpu_to_le16(min_t(u16
, max_packet_size
,
986 le16_to_cpu(ep_desc
->wMaxPacketSize
)));
990 afunc_bind(struct usb_configuration
*cfg
, struct usb_function
*fn
)
992 struct audio_dev
*agdev
= func_to_agdev(fn
);
993 struct snd_uac2_chip
*uac2
= &agdev
->uac2
;
994 struct usb_composite_dev
*cdev
= cfg
->cdev
;
995 struct usb_gadget
*gadget
= cdev
->gadget
;
996 struct device
*dev
= &uac2
->pdev
.dev
;
997 struct uac2_rtd_params
*prm
;
998 struct f_uac2_opts
*uac2_opts
;
999 struct usb_string
*us
;
1002 uac2_opts
= container_of(fn
->fi
, struct f_uac2_opts
, func_inst
);
1004 us
= usb_gstrings_attach(cdev
, fn_strings
, ARRAY_SIZE(strings_fn
));
1007 iad_desc
.iFunction
= us
[STR_ASSOC
].id
;
1008 std_ac_if_desc
.iInterface
= us
[STR_IF_CTRL
].id
;
1009 in_clk_src_desc
.iClockSource
= us
[STR_CLKSRC_IN
].id
;
1010 out_clk_src_desc
.iClockSource
= us
[STR_CLKSRC_OUT
].id
;
1011 usb_out_it_desc
.iTerminal
= us
[STR_USB_IT
].id
;
1012 io_in_it_desc
.iTerminal
= us
[STR_IO_IT
].id
;
1013 usb_in_ot_desc
.iTerminal
= us
[STR_USB_OT
].id
;
1014 io_out_ot_desc
.iTerminal
= us
[STR_IO_OT
].id
;
1015 std_as_out_if0_desc
.iInterface
= us
[STR_AS_OUT_ALT0
].id
;
1016 std_as_out_if1_desc
.iInterface
= us
[STR_AS_OUT_ALT1
].id
;
1017 std_as_in_if0_desc
.iInterface
= us
[STR_AS_IN_ALT0
].id
;
1018 std_as_in_if1_desc
.iInterface
= us
[STR_AS_IN_ALT1
].id
;
1021 /* Initialize the configurable parameters */
1022 usb_out_it_desc
.bNrChannels
= num_channels(uac2_opts
->c_chmask
);
1023 usb_out_it_desc
.bmChannelConfig
= cpu_to_le32(uac2_opts
->c_chmask
);
1024 io_in_it_desc
.bNrChannels
= num_channels(uac2_opts
->p_chmask
);
1025 io_in_it_desc
.bmChannelConfig
= cpu_to_le32(uac2_opts
->p_chmask
);
1026 as_out_hdr_desc
.bNrChannels
= num_channels(uac2_opts
->c_chmask
);
1027 as_out_hdr_desc
.bmChannelConfig
= cpu_to_le32(uac2_opts
->c_chmask
);
1028 as_in_hdr_desc
.bNrChannels
= num_channels(uac2_opts
->p_chmask
);
1029 as_in_hdr_desc
.bmChannelConfig
= cpu_to_le32(uac2_opts
->p_chmask
);
1030 as_out_fmt1_desc
.bSubslotSize
= uac2_opts
->c_ssize
;
1031 as_out_fmt1_desc
.bBitResolution
= uac2_opts
->c_ssize
* 8;
1032 as_in_fmt1_desc
.bSubslotSize
= uac2_opts
->p_ssize
;
1033 as_in_fmt1_desc
.bBitResolution
= uac2_opts
->p_ssize
* 8;
1035 snprintf(clksrc_in
, sizeof(clksrc_in
), "%uHz", uac2_opts
->p_srate
);
1036 snprintf(clksrc_out
, sizeof(clksrc_out
), "%uHz", uac2_opts
->c_srate
);
1038 ret
= usb_interface_id(cfg
, fn
);
1040 dev_err(dev
, "%s:%d Error!\n", __func__
, __LINE__
);
1043 std_ac_if_desc
.bInterfaceNumber
= ret
;
1044 agdev
->ac_intf
= ret
;
1047 ret
= usb_interface_id(cfg
, fn
);
1049 dev_err(dev
, "%s:%d Error!\n", __func__
, __LINE__
);
1052 std_as_out_if0_desc
.bInterfaceNumber
= ret
;
1053 std_as_out_if1_desc
.bInterfaceNumber
= ret
;
1054 agdev
->as_out_intf
= ret
;
1055 agdev
->as_out_alt
= 0;
1057 ret
= usb_interface_id(cfg
, fn
);
1059 dev_err(dev
, "%s:%d Error!\n", __func__
, __LINE__
);
1062 std_as_in_if0_desc
.bInterfaceNumber
= ret
;
1063 std_as_in_if1_desc
.bInterfaceNumber
= ret
;
1064 agdev
->as_in_intf
= ret
;
1065 agdev
->as_in_alt
= 0;
1067 agdev
->out_ep
= usb_ep_autoconfig(gadget
, &fs_epout_desc
);
1068 if (!agdev
->out_ep
) {
1069 dev_err(dev
, "%s:%d Error!\n", __func__
, __LINE__
);
1073 agdev
->in_ep
= usb_ep_autoconfig(gadget
, &fs_epin_desc
);
1074 if (!agdev
->in_ep
) {
1075 dev_err(dev
, "%s:%d Error!\n", __func__
, __LINE__
);
1079 uac2
->p_prm
.uac2
= uac2
;
1080 uac2
->c_prm
.uac2
= uac2
;
1082 /* Calculate wMaxPacketSize according to audio bandwidth */
1083 set_ep_max_packet_size(uac2_opts
, &fs_epin_desc
, 1000, true);
1084 set_ep_max_packet_size(uac2_opts
, &fs_epout_desc
, 1000, false);
1085 set_ep_max_packet_size(uac2_opts
, &hs_epin_desc
, 8000, true);
1086 set_ep_max_packet_size(uac2_opts
, &hs_epout_desc
, 8000, false);
1088 hs_epout_desc
.bEndpointAddress
= fs_epout_desc
.bEndpointAddress
;
1089 hs_epin_desc
.bEndpointAddress
= fs_epin_desc
.bEndpointAddress
;
1091 ret
= usb_assign_descriptors(fn
, fs_audio_desc
, hs_audio_desc
, NULL
,
1096 prm
= &agdev
->uac2
.c_prm
;
1097 prm
->max_psize
= hs_epout_desc
.wMaxPacketSize
;
1098 prm
->rbuf
= kzalloc(prm
->max_psize
* USB_XFERS
, GFP_KERNEL
);
1101 goto err_free_descs
;
1104 prm
= &agdev
->uac2
.p_prm
;
1105 prm
->max_psize
= hs_epin_desc
.wMaxPacketSize
;
1106 prm
->rbuf
= kzalloc(prm
->max_psize
* USB_XFERS
, GFP_KERNEL
);
1109 goto err_free_descs
;
1112 ret
= alsa_uac2_init(agdev
);
1114 goto err_free_descs
;
1118 usb_free_all_descriptors(fn
);
1120 kfree(agdev
->uac2
.p_prm
.rbuf
);
1121 kfree(agdev
->uac2
.c_prm
.rbuf
);
1126 afunc_set_alt(struct usb_function
*fn
, unsigned intf
, unsigned alt
)
1128 struct usb_composite_dev
*cdev
= fn
->config
->cdev
;
1129 struct audio_dev
*agdev
= func_to_agdev(fn
);
1130 struct snd_uac2_chip
*uac2
= &agdev
->uac2
;
1131 struct usb_gadget
*gadget
= cdev
->gadget
;
1132 struct device
*dev
= &uac2
->pdev
.dev
;
1133 struct usb_request
*req
;
1135 struct uac2_rtd_params
*prm
;
1138 /* No i/f has more than 2 alt settings */
1140 dev_err(dev
, "%s:%d Error!\n", __func__
, __LINE__
);
1144 if (intf
== agdev
->ac_intf
) {
1145 /* Control I/f has only 1 AltSetting - 0 */
1147 dev_err(dev
, "%s:%d Error!\n", __func__
, __LINE__
);
1153 if (intf
== agdev
->as_out_intf
) {
1156 config_ep_by_speed(gadget
, fn
, ep
);
1157 agdev
->as_out_alt
= alt
;
1158 req_len
= prm
->max_psize
;
1159 } else if (intf
== agdev
->as_in_intf
) {
1160 struct f_uac2_opts
*opts
= agdev_to_uac2_opts(agdev
);
1161 unsigned int factor
, rate
;
1162 struct usb_endpoint_descriptor
*ep_desc
;
1166 config_ep_by_speed(gadget
, fn
, ep
);
1167 agdev
->as_in_alt
= alt
;
1169 /* pre-calculate the playback endpoint's interval */
1170 if (gadget
->speed
== USB_SPEED_FULL
) {
1171 ep_desc
= &fs_epin_desc
;
1174 ep_desc
= &hs_epin_desc
;
1178 /* pre-compute some values for iso_complete() */
1179 uac2
->p_framesize
= opts
->p_ssize
*
1180 num_channels(opts
->p_chmask
);
1181 rate
= opts
->p_srate
* uac2
->p_framesize
;
1182 uac2
->p_interval
= factor
/ (1 << (ep_desc
->bInterval
- 1));
1183 uac2
->p_pktsize
= min_t(unsigned int, rate
/ uac2
->p_interval
,
1186 if (uac2
->p_pktsize
< prm
->max_psize
)
1187 uac2
->p_pktsize_residue
= rate
% uac2
->p_interval
;
1189 uac2
->p_pktsize_residue
= 0;
1191 req_len
= uac2
->p_pktsize
;
1192 uac2
->p_residue
= 0;
1194 dev_err(dev
, "%s:%d Error!\n", __func__
, __LINE__
);
1203 prm
->ep_enabled
= true;
1206 for (i
= 0; i
< USB_XFERS
; i
++) {
1207 if (!prm
->ureq
[i
].req
) {
1208 req
= usb_ep_alloc_request(ep
, GFP_ATOMIC
);
1212 prm
->ureq
[i
].req
= req
;
1213 prm
->ureq
[i
].pp
= prm
;
1216 req
->context
= &prm
->ureq
[i
];
1217 req
->length
= req_len
;
1218 req
->complete
= agdev_iso_complete
;
1219 req
->buf
= prm
->rbuf
+ i
* prm
->max_psize
;
1222 if (usb_ep_queue(ep
, prm
->ureq
[i
].req
, GFP_ATOMIC
))
1223 dev_err(dev
, "%s:%d Error!\n", __func__
, __LINE__
);
1230 afunc_get_alt(struct usb_function
*fn
, unsigned intf
)
1232 struct audio_dev
*agdev
= func_to_agdev(fn
);
1233 struct snd_uac2_chip
*uac2
= &agdev
->uac2
;
1235 if (intf
== agdev
->ac_intf
)
1236 return agdev
->ac_alt
;
1237 else if (intf
== agdev
->as_out_intf
)
1238 return agdev
->as_out_alt
;
1239 else if (intf
== agdev
->as_in_intf
)
1240 return agdev
->as_in_alt
;
1242 dev_err(&uac2
->pdev
.dev
,
1243 "%s:%d Invalid Interface %d!\n",
1244 __func__
, __LINE__
, intf
);
1250 afunc_disable(struct usb_function
*fn
)
1252 struct audio_dev
*agdev
= func_to_agdev(fn
);
1253 struct snd_uac2_chip
*uac2
= &agdev
->uac2
;
1255 free_ep(&uac2
->p_prm
, agdev
->in_ep
);
1256 agdev
->as_in_alt
= 0;
1258 free_ep(&uac2
->c_prm
, agdev
->out_ep
);
1259 agdev
->as_out_alt
= 0;
1263 in_rq_cur(struct usb_function
*fn
, const struct usb_ctrlrequest
*cr
)
1265 struct usb_request
*req
= fn
->config
->cdev
->req
;
1266 struct audio_dev
*agdev
= func_to_agdev(fn
);
1267 struct snd_uac2_chip
*uac2
= &agdev
->uac2
;
1268 struct f_uac2_opts
*opts
;
1269 u16 w_length
= le16_to_cpu(cr
->wLength
);
1270 u16 w_index
= le16_to_cpu(cr
->wIndex
);
1271 u16 w_value
= le16_to_cpu(cr
->wValue
);
1272 u8 entity_id
= (w_index
>> 8) & 0xff;
1273 u8 control_selector
= w_value
>> 8;
1274 int value
= -EOPNOTSUPP
;
1275 int p_srate
, c_srate
;
1277 opts
= agdev_to_uac2_opts(agdev
);
1278 p_srate
= opts
->p_srate
;
1279 c_srate
= opts
->c_srate
;
1281 if (control_selector
== UAC2_CS_CONTROL_SAM_FREQ
) {
1282 struct cntrl_cur_lay3 c
;
1283 memset(&c
, 0, sizeof(struct cntrl_cur_lay3
));
1285 if (entity_id
== USB_IN_CLK_ID
)
1287 else if (entity_id
== USB_OUT_CLK_ID
)
1290 value
= min_t(unsigned, w_length
, sizeof c
);
1291 memcpy(req
->buf
, &c
, value
);
1292 } else if (control_selector
== UAC2_CS_CONTROL_CLOCK_VALID
) {
1293 *(u8
*)req
->buf
= 1;
1294 value
= min_t(unsigned, w_length
, 1);
1296 dev_err(&uac2
->pdev
.dev
,
1297 "%s:%d control_selector=%d TODO!\n",
1298 __func__
, __LINE__
, control_selector
);
1305 in_rq_range(struct usb_function
*fn
, const struct usb_ctrlrequest
*cr
)
1307 struct usb_request
*req
= fn
->config
->cdev
->req
;
1308 struct audio_dev
*agdev
= func_to_agdev(fn
);
1309 struct snd_uac2_chip
*uac2
= &agdev
->uac2
;
1310 struct f_uac2_opts
*opts
;
1311 u16 w_length
= le16_to_cpu(cr
->wLength
);
1312 u16 w_index
= le16_to_cpu(cr
->wIndex
);
1313 u16 w_value
= le16_to_cpu(cr
->wValue
);
1314 u8 entity_id
= (w_index
>> 8) & 0xff;
1315 u8 control_selector
= w_value
>> 8;
1316 struct cntrl_range_lay3 r
;
1317 int value
= -EOPNOTSUPP
;
1318 int p_srate
, c_srate
;
1320 opts
= agdev_to_uac2_opts(agdev
);
1321 p_srate
= opts
->p_srate
;
1322 c_srate
= opts
->c_srate
;
1324 if (control_selector
== UAC2_CS_CONTROL_SAM_FREQ
) {
1325 if (entity_id
== USB_IN_CLK_ID
)
1327 else if (entity_id
== USB_OUT_CLK_ID
)
1334 r
.wNumSubRanges
= 1;
1336 value
= min_t(unsigned, w_length
, sizeof r
);
1337 memcpy(req
->buf
, &r
, value
);
1339 dev_err(&uac2
->pdev
.dev
,
1340 "%s:%d control_selector=%d TODO!\n",
1341 __func__
, __LINE__
, control_selector
);
1348 ac_rq_in(struct usb_function
*fn
, const struct usb_ctrlrequest
*cr
)
1350 if (cr
->bRequest
== UAC2_CS_CUR
)
1351 return in_rq_cur(fn
, cr
);
1352 else if (cr
->bRequest
== UAC2_CS_RANGE
)
1353 return in_rq_range(fn
, cr
);
1359 out_rq_cur(struct usb_function
*fn
, const struct usb_ctrlrequest
*cr
)
1361 u16 w_length
= le16_to_cpu(cr
->wLength
);
1362 u16 w_value
= le16_to_cpu(cr
->wValue
);
1363 u8 control_selector
= w_value
>> 8;
1365 if (control_selector
== UAC2_CS_CONTROL_SAM_FREQ
)
1372 setup_rq_inf(struct usb_function
*fn
, const struct usb_ctrlrequest
*cr
)
1374 struct audio_dev
*agdev
= func_to_agdev(fn
);
1375 struct snd_uac2_chip
*uac2
= &agdev
->uac2
;
1376 u16 w_index
= le16_to_cpu(cr
->wIndex
);
1377 u8 intf
= w_index
& 0xff;
1379 if (intf
!= agdev
->ac_intf
) {
1380 dev_err(&uac2
->pdev
.dev
,
1381 "%s:%d Error!\n", __func__
, __LINE__
);
1385 if (cr
->bRequestType
& USB_DIR_IN
)
1386 return ac_rq_in(fn
, cr
);
1387 else if (cr
->bRequest
== UAC2_CS_CUR
)
1388 return out_rq_cur(fn
, cr
);
1394 afunc_setup(struct usb_function
*fn
, const struct usb_ctrlrequest
*cr
)
1396 struct usb_composite_dev
*cdev
= fn
->config
->cdev
;
1397 struct audio_dev
*agdev
= func_to_agdev(fn
);
1398 struct snd_uac2_chip
*uac2
= &agdev
->uac2
;
1399 struct usb_request
*req
= cdev
->req
;
1400 u16 w_length
= le16_to_cpu(cr
->wLength
);
1401 int value
= -EOPNOTSUPP
;
1403 /* Only Class specific requests are supposed to reach here */
1404 if ((cr
->bRequestType
& USB_TYPE_MASK
) != USB_TYPE_CLASS
)
1407 if ((cr
->bRequestType
& USB_RECIP_MASK
) == USB_RECIP_INTERFACE
)
1408 value
= setup_rq_inf(fn
, cr
);
1410 dev_err(&uac2
->pdev
.dev
, "%s:%d Error!\n", __func__
, __LINE__
);
1413 req
->length
= value
;
1414 req
->zero
= value
< w_length
;
1415 value
= usb_ep_queue(cdev
->gadget
->ep0
, req
, GFP_ATOMIC
);
1417 dev_err(&uac2
->pdev
.dev
,
1418 "%s:%d Error!\n", __func__
, __LINE__
);
1426 static inline struct f_uac2_opts
*to_f_uac2_opts(struct config_item
*item
)
1428 return container_of(to_config_group(item
), struct f_uac2_opts
,
1432 static void f_uac2_attr_release(struct config_item
*item
)
1434 struct f_uac2_opts
*opts
= to_f_uac2_opts(item
);
1436 usb_put_function_instance(&opts
->func_inst
);
1439 static struct configfs_item_operations f_uac2_item_ops
= {
1440 .release
= f_uac2_attr_release
,
1443 #define UAC2_ATTRIBUTE(name) \
1444 static ssize_t f_uac2_opts_##name##_show(struct config_item *item, \
1447 struct f_uac2_opts *opts = to_f_uac2_opts(item); \
1450 mutex_lock(&opts->lock); \
1451 result = sprintf(page, "%u\n", opts->name); \
1452 mutex_unlock(&opts->lock); \
1457 static ssize_t f_uac2_opts_##name##_store(struct config_item *item, \
1458 const char *page, size_t len) \
1460 struct f_uac2_opts *opts = to_f_uac2_opts(item); \
1464 mutex_lock(&opts->lock); \
1465 if (opts->refcnt) { \
1470 ret = kstrtou32(page, 0, &num); \
1478 mutex_unlock(&opts->lock); \
1482 CONFIGFS_ATTR(f_uac2_opts_, name)
1484 UAC2_ATTRIBUTE(p_chmask
);
1485 UAC2_ATTRIBUTE(p_srate
);
1486 UAC2_ATTRIBUTE(p_ssize
);
1487 UAC2_ATTRIBUTE(c_chmask
);
1488 UAC2_ATTRIBUTE(c_srate
);
1489 UAC2_ATTRIBUTE(c_ssize
);
1491 static struct configfs_attribute
*f_uac2_attrs
[] = {
1492 &f_uac2_opts_attr_p_chmask
,
1493 &f_uac2_opts_attr_p_srate
,
1494 &f_uac2_opts_attr_p_ssize
,
1495 &f_uac2_opts_attr_c_chmask
,
1496 &f_uac2_opts_attr_c_srate
,
1497 &f_uac2_opts_attr_c_ssize
,
1501 static struct config_item_type f_uac2_func_type
= {
1502 .ct_item_ops
= &f_uac2_item_ops
,
1503 .ct_attrs
= f_uac2_attrs
,
1504 .ct_owner
= THIS_MODULE
,
1507 static void afunc_free_inst(struct usb_function_instance
*f
)
1509 struct f_uac2_opts
*opts
;
1511 opts
= container_of(f
, struct f_uac2_opts
, func_inst
);
1515 static struct usb_function_instance
*afunc_alloc_inst(void)
1517 struct f_uac2_opts
*opts
;
1519 opts
= kzalloc(sizeof(*opts
), GFP_KERNEL
);
1521 return ERR_PTR(-ENOMEM
);
1523 mutex_init(&opts
->lock
);
1524 opts
->func_inst
.free_func_inst
= afunc_free_inst
;
1526 config_group_init_type_name(&opts
->func_inst
.group
, "",
1529 opts
->p_chmask
= UAC2_DEF_PCHMASK
;
1530 opts
->p_srate
= UAC2_DEF_PSRATE
;
1531 opts
->p_ssize
= UAC2_DEF_PSSIZE
;
1532 opts
->c_chmask
= UAC2_DEF_CCHMASK
;
1533 opts
->c_srate
= UAC2_DEF_CSRATE
;
1534 opts
->c_ssize
= UAC2_DEF_CSSIZE
;
1535 return &opts
->func_inst
;
1538 static void afunc_free(struct usb_function
*f
)
1540 struct audio_dev
*agdev
;
1541 struct f_uac2_opts
*opts
;
1543 agdev
= func_to_agdev(f
);
1544 opts
= container_of(f
->fi
, struct f_uac2_opts
, func_inst
);
1546 mutex_lock(&opts
->lock
);
1548 mutex_unlock(&opts
->lock
);
1551 static void afunc_unbind(struct usb_configuration
*c
, struct usb_function
*f
)
1553 struct audio_dev
*agdev
= func_to_agdev(f
);
1554 struct uac2_rtd_params
*prm
;
1556 alsa_uac2_exit(agdev
);
1558 prm
= &agdev
->uac2
.p_prm
;
1561 prm
= &agdev
->uac2
.c_prm
;
1563 usb_free_all_descriptors(f
);
1566 static struct usb_function
*afunc_alloc(struct usb_function_instance
*fi
)
1568 struct audio_dev
*agdev
;
1569 struct f_uac2_opts
*opts
;
1571 agdev
= kzalloc(sizeof(*agdev
), GFP_KERNEL
);
1573 return ERR_PTR(-ENOMEM
);
1575 opts
= container_of(fi
, struct f_uac2_opts
, func_inst
);
1576 mutex_lock(&opts
->lock
);
1578 mutex_unlock(&opts
->lock
);
1580 agdev
->func
.name
= "uac2_func";
1581 agdev
->func
.bind
= afunc_bind
;
1582 agdev
->func
.unbind
= afunc_unbind
;
1583 agdev
->func
.set_alt
= afunc_set_alt
;
1584 agdev
->func
.get_alt
= afunc_get_alt
;
1585 agdev
->func
.disable
= afunc_disable
;
1586 agdev
->func
.setup
= afunc_setup
;
1587 agdev
->func
.free_func
= afunc_free
;
1589 return &agdev
->func
;
1592 DECLARE_USB_FUNCTION_INIT(uac2
, afunc_alloc_inst
, afunc_alloc
);
1593 MODULE_LICENSE("GPL");
1594 MODULE_AUTHOR("Yadwinder Singh");
1595 MODULE_AUTHOR("Jaswinder Singh");