1 // SPDX-License-Identifier: GPL-2.0+
3 * f_uac2.c -- USB Audio Class 2.0 Function
6 * Yadwinder Singh (yadi.brar01@gmail.com)
7 * Jaswinder Singh (jaswinder.singh@linaro.org)
10 #include <linux/usb/audio.h>
11 #include <linux/usb/audio-v2.h>
12 #include <linux/module.h>
18 * The driver implements a simple UAC_2 topology.
19 * USB-OUT -> IT_1 -> OT_3 -> ALSA_Capture
20 * ALSA_Playback -> IT_2 -> OT_4 -> USB-IN
21 * Capture and Playback sampling rates are independently
22 * controlled by two clock sources :
23 * CLK_5 := c_srate, and CLK_6 := p_srate
25 #define USB_OUT_CLK_ID (out_clk_src_desc.bClockID)
26 #define USB_IN_CLK_ID (in_clk_src_desc.bClockID)
28 #define CONTROL_ABSENT 0
29 #define CONTROL_RDONLY 1
30 #define CONTROL_RDWR 3
32 #define CLK_FREQ_CTRL 0
33 #define CLK_VLD_CTRL 2
42 #define EPIN_EN(_opts) ((_opts)->p_chmask != 0)
43 #define EPOUT_EN(_opts) ((_opts)->c_chmask != 0)
46 struct g_audio g_audio
;
47 u8 ac_intf
, as_in_intf
, as_out_intf
;
48 u8 ac_alt
, as_in_alt
, as_out_alt
; /* needed for get_alt() */
51 static inline struct f_uac2
*func_to_uac2(struct usb_function
*f
)
53 return container_of(f
, struct f_uac2
, g_audio
.func
);
57 struct f_uac2_opts
*g_audio_to_uac2_opts(struct g_audio
*agdev
)
59 return container_of(agdev
->func
.fi
, struct f_uac2_opts
, func_inst
);
62 /* --------- USB Function Interface ------------- */
79 static char clksrc_in
[8];
80 static char clksrc_out
[8];
82 static struct usb_string strings_fn
[] = {
83 [STR_ASSOC
].s
= "Source/Sink",
84 [STR_IF_CTRL
].s
= "Topology Control",
85 [STR_CLKSRC_IN
].s
= clksrc_in
,
86 [STR_CLKSRC_OUT
].s
= clksrc_out
,
87 [STR_USB_IT
].s
= "USBH Out",
88 [STR_IO_IT
].s
= "USBD Out",
89 [STR_USB_OT
].s
= "USBH In",
90 [STR_IO_OT
].s
= "USBD In",
91 [STR_AS_OUT_ALT0
].s
= "Playback Inactive",
92 [STR_AS_OUT_ALT1
].s
= "Playback Active",
93 [STR_AS_IN_ALT0
].s
= "Capture Inactive",
94 [STR_AS_IN_ALT1
].s
= "Capture Active",
98 static struct usb_gadget_strings str_fn
= {
99 .language
= 0x0409, /* en-us */
100 .strings
= strings_fn
,
103 static struct usb_gadget_strings
*fn_strings
[] = {
108 static struct usb_interface_assoc_descriptor iad_desc
= {
109 .bLength
= sizeof iad_desc
,
110 .bDescriptorType
= USB_DT_INTERFACE_ASSOCIATION
,
112 .bFirstInterface
= 0,
113 .bInterfaceCount
= 3,
114 .bFunctionClass
= USB_CLASS_AUDIO
,
115 .bFunctionSubClass
= UAC2_FUNCTION_SUBCLASS_UNDEFINED
,
116 .bFunctionProtocol
= UAC_VERSION_2
,
119 /* Audio Control Interface */
120 static struct usb_interface_descriptor std_ac_if_desc
= {
121 .bLength
= sizeof std_ac_if_desc
,
122 .bDescriptorType
= USB_DT_INTERFACE
,
124 .bAlternateSetting
= 0,
126 .bInterfaceClass
= USB_CLASS_AUDIO
,
127 .bInterfaceSubClass
= USB_SUBCLASS_AUDIOCONTROL
,
128 .bInterfaceProtocol
= UAC_VERSION_2
,
131 /* Clock source for IN traffic */
132 static struct uac_clock_source_descriptor in_clk_src_desc
= {
133 .bLength
= sizeof in_clk_src_desc
,
134 .bDescriptorType
= USB_DT_CS_INTERFACE
,
136 .bDescriptorSubtype
= UAC2_CLOCK_SOURCE
,
137 /* .bClockID = DYNAMIC */
138 .bmAttributes
= UAC_CLOCK_SOURCE_TYPE_INT_FIXED
,
139 .bmControls
= (CONTROL_RDONLY
<< CLK_FREQ_CTRL
),
143 /* Clock source for OUT traffic */
144 static struct uac_clock_source_descriptor out_clk_src_desc
= {
145 .bLength
= sizeof out_clk_src_desc
,
146 .bDescriptorType
= USB_DT_CS_INTERFACE
,
148 .bDescriptorSubtype
= UAC2_CLOCK_SOURCE
,
149 /* .bClockID = DYNAMIC */
150 .bmAttributes
= UAC_CLOCK_SOURCE_TYPE_INT_FIXED
,
151 .bmControls
= (CONTROL_RDONLY
<< CLK_FREQ_CTRL
),
155 /* Input Terminal for USB_OUT */
156 static struct uac2_input_terminal_descriptor usb_out_it_desc
= {
157 .bLength
= sizeof usb_out_it_desc
,
158 .bDescriptorType
= USB_DT_CS_INTERFACE
,
160 .bDescriptorSubtype
= UAC_INPUT_TERMINAL
,
161 /* .bTerminalID = DYNAMIC */
162 .wTerminalType
= cpu_to_le16(UAC_TERMINAL_STREAMING
),
164 /* .bCSourceID = DYNAMIC */
166 .bmControls
= cpu_to_le16(CONTROL_RDWR
<< COPY_CTRL
),
169 /* Input Terminal for I/O-In */
170 static struct uac2_input_terminal_descriptor io_in_it_desc
= {
171 .bLength
= sizeof io_in_it_desc
,
172 .bDescriptorType
= USB_DT_CS_INTERFACE
,
174 .bDescriptorSubtype
= UAC_INPUT_TERMINAL
,
175 /* .bTerminalID = DYNAMIC */
176 .wTerminalType
= cpu_to_le16(UAC_INPUT_TERMINAL_UNDEFINED
),
178 /* .bCSourceID = DYNAMIC */
180 .bmControls
= cpu_to_le16(CONTROL_RDWR
<< COPY_CTRL
),
183 /* Ouput Terminal for USB_IN */
184 static struct uac2_output_terminal_descriptor usb_in_ot_desc
= {
185 .bLength
= sizeof usb_in_ot_desc
,
186 .bDescriptorType
= USB_DT_CS_INTERFACE
,
188 .bDescriptorSubtype
= UAC_OUTPUT_TERMINAL
,
189 /* .bTerminalID = DYNAMIC */
190 .wTerminalType
= cpu_to_le16(UAC_TERMINAL_STREAMING
),
192 /* .bSourceID = DYNAMIC */
193 /* .bCSourceID = DYNAMIC */
194 .bmControls
= cpu_to_le16(CONTROL_RDWR
<< COPY_CTRL
),
197 /* Ouput Terminal for I/O-Out */
198 static struct uac2_output_terminal_descriptor io_out_ot_desc
= {
199 .bLength
= sizeof io_out_ot_desc
,
200 .bDescriptorType
= USB_DT_CS_INTERFACE
,
202 .bDescriptorSubtype
= UAC_OUTPUT_TERMINAL
,
203 /* .bTerminalID = DYNAMIC */
204 .wTerminalType
= cpu_to_le16(UAC_OUTPUT_TERMINAL_UNDEFINED
),
206 /* .bSourceID = DYNAMIC */
207 /* .bCSourceID = DYNAMIC */
208 .bmControls
= cpu_to_le16(CONTROL_RDWR
<< COPY_CTRL
),
211 static struct uac2_ac_header_descriptor ac_hdr_desc
= {
212 .bLength
= sizeof ac_hdr_desc
,
213 .bDescriptorType
= USB_DT_CS_INTERFACE
,
215 .bDescriptorSubtype
= UAC_MS_HEADER
,
216 .bcdADC
= cpu_to_le16(0x200),
217 .bCategory
= UAC2_FUNCTION_IO_BOX
,
218 .wTotalLength
= cpu_to_le16(sizeof in_clk_src_desc
219 + sizeof out_clk_src_desc
+ sizeof usb_out_it_desc
220 + sizeof io_in_it_desc
+ sizeof usb_in_ot_desc
221 + sizeof io_out_ot_desc
),
225 /* Audio Streaming OUT Interface - Alt0 */
226 static struct usb_interface_descriptor std_as_out_if0_desc
= {
227 .bLength
= sizeof std_as_out_if0_desc
,
228 .bDescriptorType
= USB_DT_INTERFACE
,
230 .bAlternateSetting
= 0,
232 .bInterfaceClass
= USB_CLASS_AUDIO
,
233 .bInterfaceSubClass
= USB_SUBCLASS_AUDIOSTREAMING
,
234 .bInterfaceProtocol
= UAC_VERSION_2
,
237 /* Audio Streaming OUT Interface - Alt1 */
238 static struct usb_interface_descriptor std_as_out_if1_desc
= {
239 .bLength
= sizeof std_as_out_if1_desc
,
240 .bDescriptorType
= USB_DT_INTERFACE
,
242 .bAlternateSetting
= 1,
244 .bInterfaceClass
= USB_CLASS_AUDIO
,
245 .bInterfaceSubClass
= USB_SUBCLASS_AUDIOSTREAMING
,
246 .bInterfaceProtocol
= UAC_VERSION_2
,
249 /* Audio Stream OUT Intface Desc */
250 static struct uac2_as_header_descriptor as_out_hdr_desc
= {
251 .bLength
= sizeof as_out_hdr_desc
,
252 .bDescriptorType
= USB_DT_CS_INTERFACE
,
254 .bDescriptorSubtype
= UAC_AS_GENERAL
,
255 /* .bTerminalLink = DYNAMIC */
257 .bFormatType
= UAC_FORMAT_TYPE_I
,
258 .bmFormats
= cpu_to_le32(UAC_FORMAT_TYPE_I_PCM
),
262 /* Audio USB_OUT Format */
263 static struct uac2_format_type_i_descriptor as_out_fmt1_desc
= {
264 .bLength
= sizeof as_out_fmt1_desc
,
265 .bDescriptorType
= USB_DT_CS_INTERFACE
,
266 .bDescriptorSubtype
= UAC_FORMAT_TYPE
,
267 .bFormatType
= UAC_FORMAT_TYPE_I
,
270 /* STD AS ISO OUT Endpoint */
271 static struct usb_endpoint_descriptor fs_epout_desc
= {
272 .bLength
= USB_DT_ENDPOINT_SIZE
,
273 .bDescriptorType
= USB_DT_ENDPOINT
,
275 .bEndpointAddress
= USB_DIR_OUT
,
276 .bmAttributes
= USB_ENDPOINT_XFER_ISOC
| USB_ENDPOINT_SYNC_ASYNC
,
277 .wMaxPacketSize
= cpu_to_le16(1023),
281 static struct usb_endpoint_descriptor hs_epout_desc
= {
282 .bLength
= USB_DT_ENDPOINT_SIZE
,
283 .bDescriptorType
= USB_DT_ENDPOINT
,
285 .bmAttributes
= USB_ENDPOINT_XFER_ISOC
| USB_ENDPOINT_SYNC_ASYNC
,
286 .wMaxPacketSize
= cpu_to_le16(1024),
290 /* CS AS ISO OUT Endpoint */
291 static struct uac2_iso_endpoint_descriptor as_iso_out_desc
= {
292 .bLength
= sizeof as_iso_out_desc
,
293 .bDescriptorType
= USB_DT_CS_ENDPOINT
,
295 .bDescriptorSubtype
= UAC_EP_GENERAL
,
298 .bLockDelayUnits
= 0,
302 /* Audio Streaming IN Interface - Alt0 */
303 static struct usb_interface_descriptor std_as_in_if0_desc
= {
304 .bLength
= sizeof std_as_in_if0_desc
,
305 .bDescriptorType
= USB_DT_INTERFACE
,
307 .bAlternateSetting
= 0,
309 .bInterfaceClass
= USB_CLASS_AUDIO
,
310 .bInterfaceSubClass
= USB_SUBCLASS_AUDIOSTREAMING
,
311 .bInterfaceProtocol
= UAC_VERSION_2
,
314 /* Audio Streaming IN Interface - Alt1 */
315 static struct usb_interface_descriptor std_as_in_if1_desc
= {
316 .bLength
= sizeof std_as_in_if1_desc
,
317 .bDescriptorType
= USB_DT_INTERFACE
,
319 .bAlternateSetting
= 1,
321 .bInterfaceClass
= USB_CLASS_AUDIO
,
322 .bInterfaceSubClass
= USB_SUBCLASS_AUDIOSTREAMING
,
323 .bInterfaceProtocol
= UAC_VERSION_2
,
326 /* Audio Stream IN Intface Desc */
327 static struct uac2_as_header_descriptor as_in_hdr_desc
= {
328 .bLength
= sizeof as_in_hdr_desc
,
329 .bDescriptorType
= USB_DT_CS_INTERFACE
,
331 .bDescriptorSubtype
= UAC_AS_GENERAL
,
332 /* .bTerminalLink = DYNAMIC */
334 .bFormatType
= UAC_FORMAT_TYPE_I
,
335 .bmFormats
= cpu_to_le32(UAC_FORMAT_TYPE_I_PCM
),
339 /* Audio USB_IN Format */
340 static struct uac2_format_type_i_descriptor as_in_fmt1_desc
= {
341 .bLength
= sizeof as_in_fmt1_desc
,
342 .bDescriptorType
= USB_DT_CS_INTERFACE
,
343 .bDescriptorSubtype
= UAC_FORMAT_TYPE
,
344 .bFormatType
= UAC_FORMAT_TYPE_I
,
347 /* STD AS ISO IN Endpoint */
348 static struct usb_endpoint_descriptor fs_epin_desc
= {
349 .bLength
= USB_DT_ENDPOINT_SIZE
,
350 .bDescriptorType
= USB_DT_ENDPOINT
,
352 .bEndpointAddress
= USB_DIR_IN
,
353 .bmAttributes
= USB_ENDPOINT_XFER_ISOC
| USB_ENDPOINT_SYNC_ASYNC
,
354 .wMaxPacketSize
= cpu_to_le16(1023),
358 static struct usb_endpoint_descriptor hs_epin_desc
= {
359 .bLength
= USB_DT_ENDPOINT_SIZE
,
360 .bDescriptorType
= USB_DT_ENDPOINT
,
362 .bmAttributes
= USB_ENDPOINT_XFER_ISOC
| USB_ENDPOINT_SYNC_ASYNC
,
363 .wMaxPacketSize
= cpu_to_le16(1024),
367 /* CS AS ISO IN Endpoint */
368 static struct uac2_iso_endpoint_descriptor as_iso_in_desc
= {
369 .bLength
= sizeof as_iso_in_desc
,
370 .bDescriptorType
= USB_DT_CS_ENDPOINT
,
372 .bDescriptorSubtype
= UAC_EP_GENERAL
,
375 .bLockDelayUnits
= 0,
379 static struct usb_descriptor_header
*fs_audio_desc
[] = {
380 (struct usb_descriptor_header
*)&iad_desc
,
381 (struct usb_descriptor_header
*)&std_ac_if_desc
,
383 (struct usb_descriptor_header
*)&ac_hdr_desc
,
384 (struct usb_descriptor_header
*)&in_clk_src_desc
,
385 (struct usb_descriptor_header
*)&out_clk_src_desc
,
386 (struct usb_descriptor_header
*)&usb_out_it_desc
,
387 (struct usb_descriptor_header
*)&io_in_it_desc
,
388 (struct usb_descriptor_header
*)&usb_in_ot_desc
,
389 (struct usb_descriptor_header
*)&io_out_ot_desc
,
391 (struct usb_descriptor_header
*)&std_as_out_if0_desc
,
392 (struct usb_descriptor_header
*)&std_as_out_if1_desc
,
394 (struct usb_descriptor_header
*)&as_out_hdr_desc
,
395 (struct usb_descriptor_header
*)&as_out_fmt1_desc
,
396 (struct usb_descriptor_header
*)&fs_epout_desc
,
397 (struct usb_descriptor_header
*)&as_iso_out_desc
,
399 (struct usb_descriptor_header
*)&std_as_in_if0_desc
,
400 (struct usb_descriptor_header
*)&std_as_in_if1_desc
,
402 (struct usb_descriptor_header
*)&as_in_hdr_desc
,
403 (struct usb_descriptor_header
*)&as_in_fmt1_desc
,
404 (struct usb_descriptor_header
*)&fs_epin_desc
,
405 (struct usb_descriptor_header
*)&as_iso_in_desc
,
409 static struct usb_descriptor_header
*hs_audio_desc
[] = {
410 (struct usb_descriptor_header
*)&iad_desc
,
411 (struct usb_descriptor_header
*)&std_ac_if_desc
,
413 (struct usb_descriptor_header
*)&ac_hdr_desc
,
414 (struct usb_descriptor_header
*)&in_clk_src_desc
,
415 (struct usb_descriptor_header
*)&out_clk_src_desc
,
416 (struct usb_descriptor_header
*)&usb_out_it_desc
,
417 (struct usb_descriptor_header
*)&io_in_it_desc
,
418 (struct usb_descriptor_header
*)&usb_in_ot_desc
,
419 (struct usb_descriptor_header
*)&io_out_ot_desc
,
421 (struct usb_descriptor_header
*)&std_as_out_if0_desc
,
422 (struct usb_descriptor_header
*)&std_as_out_if1_desc
,
424 (struct usb_descriptor_header
*)&as_out_hdr_desc
,
425 (struct usb_descriptor_header
*)&as_out_fmt1_desc
,
426 (struct usb_descriptor_header
*)&hs_epout_desc
,
427 (struct usb_descriptor_header
*)&as_iso_out_desc
,
429 (struct usb_descriptor_header
*)&std_as_in_if0_desc
,
430 (struct usb_descriptor_header
*)&std_as_in_if1_desc
,
432 (struct usb_descriptor_header
*)&as_in_hdr_desc
,
433 (struct usb_descriptor_header
*)&as_in_fmt1_desc
,
434 (struct usb_descriptor_header
*)&hs_epin_desc
,
435 (struct usb_descriptor_header
*)&as_iso_in_desc
,
439 struct cntrl_cur_lay3
{
443 struct cntrl_range_lay3
{
444 __le16 wNumSubRanges
;
450 static void set_ep_max_packet_size(const struct f_uac2_opts
*uac2_opts
,
451 struct usb_endpoint_descriptor
*ep_desc
,
452 unsigned int factor
, bool is_playback
)
454 int chmask
, srate
, ssize
;
458 chmask
= uac2_opts
->p_chmask
;
459 srate
= uac2_opts
->p_srate
;
460 ssize
= uac2_opts
->p_ssize
;
462 chmask
= uac2_opts
->c_chmask
;
463 srate
= uac2_opts
->c_srate
;
464 ssize
= uac2_opts
->c_ssize
;
467 max_packet_size
= num_channels(chmask
) * ssize
*
468 DIV_ROUND_UP(srate
, factor
/ (1 << (ep_desc
->bInterval
- 1)));
469 ep_desc
->wMaxPacketSize
= cpu_to_le16(min_t(u16
, max_packet_size
,
470 le16_to_cpu(ep_desc
->wMaxPacketSize
)));
473 /* Use macro to overcome line length limitation */
474 #define USBDHDR(p) (struct usb_descriptor_header *)(p)
476 static void setup_descriptor(struct f_uac2_opts
*opts
)
478 /* patch descriptors */
479 int i
= 1; /* ID's start with 1 */
482 usb_out_it_desc
.bTerminalID
= i
++;
484 io_in_it_desc
.bTerminalID
= i
++;
486 io_out_ot_desc
.bTerminalID
= i
++;
488 usb_in_ot_desc
.bTerminalID
= i
++;
490 out_clk_src_desc
.bClockID
= i
++;
492 in_clk_src_desc
.bClockID
= i
++;
494 usb_out_it_desc
.bCSourceID
= out_clk_src_desc
.bClockID
;
495 usb_in_ot_desc
.bSourceID
= io_in_it_desc
.bTerminalID
;
496 usb_in_ot_desc
.bCSourceID
= in_clk_src_desc
.bClockID
;
497 io_in_it_desc
.bCSourceID
= in_clk_src_desc
.bClockID
;
498 io_out_ot_desc
.bCSourceID
= out_clk_src_desc
.bClockID
;
499 io_out_ot_desc
.bSourceID
= usb_out_it_desc
.bTerminalID
;
500 as_out_hdr_desc
.bTerminalLink
= usb_out_it_desc
.bTerminalID
;
501 as_in_hdr_desc
.bTerminalLink
= usb_in_ot_desc
.bTerminalID
;
503 iad_desc
.bInterfaceCount
= 1;
504 ac_hdr_desc
.wTotalLength
= 0;
507 u16 len
= le16_to_cpu(ac_hdr_desc
.wTotalLength
);
509 len
+= sizeof(in_clk_src_desc
);
510 len
+= sizeof(usb_in_ot_desc
);
511 len
+= sizeof(io_in_it_desc
);
512 ac_hdr_desc
.wTotalLength
= cpu_to_le16(len
);
513 iad_desc
.bInterfaceCount
++;
515 if (EPOUT_EN(opts
)) {
516 u16 len
= le16_to_cpu(ac_hdr_desc
.wTotalLength
);
518 len
+= sizeof(out_clk_src_desc
);
519 len
+= sizeof(usb_out_it_desc
);
520 len
+= sizeof(io_out_ot_desc
);
521 ac_hdr_desc
.wTotalLength
= cpu_to_le16(len
);
522 iad_desc
.bInterfaceCount
++;
526 fs_audio_desc
[i
++] = USBDHDR(&iad_desc
);
527 fs_audio_desc
[i
++] = USBDHDR(&std_ac_if_desc
);
528 fs_audio_desc
[i
++] = USBDHDR(&ac_hdr_desc
);
530 fs_audio_desc
[i
++] = USBDHDR(&in_clk_src_desc
);
531 if (EPOUT_EN(opts
)) {
532 fs_audio_desc
[i
++] = USBDHDR(&out_clk_src_desc
);
533 fs_audio_desc
[i
++] = USBDHDR(&usb_out_it_desc
);
536 fs_audio_desc
[i
++] = USBDHDR(&io_in_it_desc
);
537 fs_audio_desc
[i
++] = USBDHDR(&usb_in_ot_desc
);
539 if (EPOUT_EN(opts
)) {
540 fs_audio_desc
[i
++] = USBDHDR(&io_out_ot_desc
);
541 fs_audio_desc
[i
++] = USBDHDR(&std_as_out_if0_desc
);
542 fs_audio_desc
[i
++] = USBDHDR(&std_as_out_if1_desc
);
543 fs_audio_desc
[i
++] = USBDHDR(&as_out_hdr_desc
);
544 fs_audio_desc
[i
++] = USBDHDR(&as_out_fmt1_desc
);
545 fs_audio_desc
[i
++] = USBDHDR(&fs_epout_desc
);
546 fs_audio_desc
[i
++] = USBDHDR(&as_iso_out_desc
);
549 fs_audio_desc
[i
++] = USBDHDR(&std_as_in_if0_desc
);
550 fs_audio_desc
[i
++] = USBDHDR(&std_as_in_if1_desc
);
551 fs_audio_desc
[i
++] = USBDHDR(&as_in_hdr_desc
);
552 fs_audio_desc
[i
++] = USBDHDR(&as_in_fmt1_desc
);
553 fs_audio_desc
[i
++] = USBDHDR(&fs_epin_desc
);
554 fs_audio_desc
[i
++] = USBDHDR(&as_iso_in_desc
);
556 fs_audio_desc
[i
] = NULL
;
559 hs_audio_desc
[i
++] = USBDHDR(&iad_desc
);
560 hs_audio_desc
[i
++] = USBDHDR(&std_ac_if_desc
);
561 hs_audio_desc
[i
++] = USBDHDR(&ac_hdr_desc
);
563 hs_audio_desc
[i
++] = USBDHDR(&in_clk_src_desc
);
564 if (EPOUT_EN(opts
)) {
565 hs_audio_desc
[i
++] = USBDHDR(&out_clk_src_desc
);
566 hs_audio_desc
[i
++] = USBDHDR(&usb_out_it_desc
);
569 hs_audio_desc
[i
++] = USBDHDR(&io_in_it_desc
);
570 hs_audio_desc
[i
++] = USBDHDR(&usb_in_ot_desc
);
572 if (EPOUT_EN(opts
)) {
573 hs_audio_desc
[i
++] = USBDHDR(&io_out_ot_desc
);
574 hs_audio_desc
[i
++] = USBDHDR(&std_as_out_if0_desc
);
575 hs_audio_desc
[i
++] = USBDHDR(&std_as_out_if1_desc
);
576 hs_audio_desc
[i
++] = USBDHDR(&as_out_hdr_desc
);
577 hs_audio_desc
[i
++] = USBDHDR(&as_out_fmt1_desc
);
578 hs_audio_desc
[i
++] = USBDHDR(&hs_epout_desc
);
579 hs_audio_desc
[i
++] = USBDHDR(&as_iso_out_desc
);
582 hs_audio_desc
[i
++] = USBDHDR(&std_as_in_if0_desc
);
583 hs_audio_desc
[i
++] = USBDHDR(&std_as_in_if1_desc
);
584 hs_audio_desc
[i
++] = USBDHDR(&as_in_hdr_desc
);
585 hs_audio_desc
[i
++] = USBDHDR(&as_in_fmt1_desc
);
586 hs_audio_desc
[i
++] = USBDHDR(&hs_epin_desc
);
587 hs_audio_desc
[i
++] = USBDHDR(&as_iso_in_desc
);
589 hs_audio_desc
[i
] = NULL
;
593 afunc_bind(struct usb_configuration
*cfg
, struct usb_function
*fn
)
595 struct f_uac2
*uac2
= func_to_uac2(fn
);
596 struct g_audio
*agdev
= func_to_g_audio(fn
);
597 struct usb_composite_dev
*cdev
= cfg
->cdev
;
598 struct usb_gadget
*gadget
= cdev
->gadget
;
599 struct device
*dev
= &gadget
->dev
;
600 struct f_uac2_opts
*uac2_opts
;
601 struct usb_string
*us
;
604 uac2_opts
= container_of(fn
->fi
, struct f_uac2_opts
, func_inst
);
606 us
= usb_gstrings_attach(cdev
, fn_strings
, ARRAY_SIZE(strings_fn
));
609 iad_desc
.iFunction
= us
[STR_ASSOC
].id
;
610 std_ac_if_desc
.iInterface
= us
[STR_IF_CTRL
].id
;
611 in_clk_src_desc
.iClockSource
= us
[STR_CLKSRC_IN
].id
;
612 out_clk_src_desc
.iClockSource
= us
[STR_CLKSRC_OUT
].id
;
613 usb_out_it_desc
.iTerminal
= us
[STR_USB_IT
].id
;
614 io_in_it_desc
.iTerminal
= us
[STR_IO_IT
].id
;
615 usb_in_ot_desc
.iTerminal
= us
[STR_USB_OT
].id
;
616 io_out_ot_desc
.iTerminal
= us
[STR_IO_OT
].id
;
617 std_as_out_if0_desc
.iInterface
= us
[STR_AS_OUT_ALT0
].id
;
618 std_as_out_if1_desc
.iInterface
= us
[STR_AS_OUT_ALT1
].id
;
619 std_as_in_if0_desc
.iInterface
= us
[STR_AS_IN_ALT0
].id
;
620 std_as_in_if1_desc
.iInterface
= us
[STR_AS_IN_ALT1
].id
;
623 /* Initialize the configurable parameters */
624 usb_out_it_desc
.bNrChannels
= num_channels(uac2_opts
->c_chmask
);
625 usb_out_it_desc
.bmChannelConfig
= cpu_to_le32(uac2_opts
->c_chmask
);
626 io_in_it_desc
.bNrChannels
= num_channels(uac2_opts
->p_chmask
);
627 io_in_it_desc
.bmChannelConfig
= cpu_to_le32(uac2_opts
->p_chmask
);
628 as_out_hdr_desc
.bNrChannels
= num_channels(uac2_opts
->c_chmask
);
629 as_out_hdr_desc
.bmChannelConfig
= cpu_to_le32(uac2_opts
->c_chmask
);
630 as_in_hdr_desc
.bNrChannels
= num_channels(uac2_opts
->p_chmask
);
631 as_in_hdr_desc
.bmChannelConfig
= cpu_to_le32(uac2_opts
->p_chmask
);
632 as_out_fmt1_desc
.bSubslotSize
= uac2_opts
->c_ssize
;
633 as_out_fmt1_desc
.bBitResolution
= uac2_opts
->c_ssize
* 8;
634 as_in_fmt1_desc
.bSubslotSize
= uac2_opts
->p_ssize
;
635 as_in_fmt1_desc
.bBitResolution
= uac2_opts
->p_ssize
* 8;
637 snprintf(clksrc_in
, sizeof(clksrc_in
), "%uHz", uac2_opts
->p_srate
);
638 snprintf(clksrc_out
, sizeof(clksrc_out
), "%uHz", uac2_opts
->c_srate
);
640 ret
= usb_interface_id(cfg
, fn
);
642 dev_err(dev
, "%s:%d Error!\n", __func__
, __LINE__
);
645 iad_desc
.bFirstInterface
= ret
;
647 std_ac_if_desc
.bInterfaceNumber
= ret
;
651 if (EPOUT_EN(uac2_opts
)) {
652 ret
= usb_interface_id(cfg
, fn
);
654 dev_err(dev
, "%s:%d Error!\n", __func__
, __LINE__
);
657 std_as_out_if0_desc
.bInterfaceNumber
= ret
;
658 std_as_out_if1_desc
.bInterfaceNumber
= ret
;
659 uac2
->as_out_intf
= ret
;
660 uac2
->as_out_alt
= 0;
663 if (EPIN_EN(uac2_opts
)) {
664 ret
= usb_interface_id(cfg
, fn
);
666 dev_err(dev
, "%s:%d Error!\n", __func__
, __LINE__
);
669 std_as_in_if0_desc
.bInterfaceNumber
= ret
;
670 std_as_in_if1_desc
.bInterfaceNumber
= ret
;
671 uac2
->as_in_intf
= ret
;
675 /* Calculate wMaxPacketSize according to audio bandwidth */
676 set_ep_max_packet_size(uac2_opts
, &fs_epin_desc
, 1000, true);
677 set_ep_max_packet_size(uac2_opts
, &fs_epout_desc
, 1000, false);
678 set_ep_max_packet_size(uac2_opts
, &hs_epin_desc
, 8000, true);
679 set_ep_max_packet_size(uac2_opts
, &hs_epout_desc
, 8000, false);
681 if (EPOUT_EN(uac2_opts
)) {
682 agdev
->out_ep
= usb_ep_autoconfig(gadget
, &fs_epout_desc
);
683 if (!agdev
->out_ep
) {
684 dev_err(dev
, "%s:%d Error!\n", __func__
, __LINE__
);
689 if (EPIN_EN(uac2_opts
)) {
690 agdev
->in_ep
= usb_ep_autoconfig(gadget
, &fs_epin_desc
);
692 dev_err(dev
, "%s:%d Error!\n", __func__
, __LINE__
);
697 agdev
->in_ep_maxpsize
= max_t(u16
,
698 le16_to_cpu(fs_epin_desc
.wMaxPacketSize
),
699 le16_to_cpu(hs_epin_desc
.wMaxPacketSize
));
700 agdev
->out_ep_maxpsize
= max_t(u16
,
701 le16_to_cpu(fs_epout_desc
.wMaxPacketSize
),
702 le16_to_cpu(hs_epout_desc
.wMaxPacketSize
));
704 hs_epout_desc
.bEndpointAddress
= fs_epout_desc
.bEndpointAddress
;
705 hs_epin_desc
.bEndpointAddress
= fs_epin_desc
.bEndpointAddress
;
707 setup_descriptor(uac2_opts
);
709 ret
= usb_assign_descriptors(fn
, fs_audio_desc
, hs_audio_desc
, NULL
,
714 agdev
->gadget
= gadget
;
716 agdev
->params
.p_chmask
= uac2_opts
->p_chmask
;
717 agdev
->params
.p_srate
= uac2_opts
->p_srate
;
718 agdev
->params
.p_ssize
= uac2_opts
->p_ssize
;
719 agdev
->params
.c_chmask
= uac2_opts
->c_chmask
;
720 agdev
->params
.c_srate
= uac2_opts
->c_srate
;
721 agdev
->params
.c_ssize
= uac2_opts
->c_ssize
;
722 agdev
->params
.req_number
= uac2_opts
->req_number
;
723 ret
= g_audio_setup(agdev
, "UAC2 PCM", "UAC2_Gadget");
729 usb_free_all_descriptors(fn
);
730 agdev
->gadget
= NULL
;
735 afunc_set_alt(struct usb_function
*fn
, unsigned intf
, unsigned alt
)
737 struct usb_composite_dev
*cdev
= fn
->config
->cdev
;
738 struct f_uac2
*uac2
= func_to_uac2(fn
);
739 struct usb_gadget
*gadget
= cdev
->gadget
;
740 struct device
*dev
= &gadget
->dev
;
743 /* No i/f has more than 2 alt settings */
745 dev_err(dev
, "%s:%d Error!\n", __func__
, __LINE__
);
749 if (intf
== uac2
->ac_intf
) {
750 /* Control I/f has only 1 AltSetting - 0 */
752 dev_err(dev
, "%s:%d Error!\n", __func__
, __LINE__
);
758 if (intf
== uac2
->as_out_intf
) {
759 uac2
->as_out_alt
= alt
;
762 ret
= u_audio_start_capture(&uac2
->g_audio
);
764 u_audio_stop_capture(&uac2
->g_audio
);
765 } else if (intf
== uac2
->as_in_intf
) {
766 uac2
->as_in_alt
= alt
;
769 ret
= u_audio_start_playback(&uac2
->g_audio
);
771 u_audio_stop_playback(&uac2
->g_audio
);
773 dev_err(dev
, "%s:%d Error!\n", __func__
, __LINE__
);
781 afunc_get_alt(struct usb_function
*fn
, unsigned intf
)
783 struct f_uac2
*uac2
= func_to_uac2(fn
);
784 struct g_audio
*agdev
= func_to_g_audio(fn
);
786 if (intf
== uac2
->ac_intf
)
788 else if (intf
== uac2
->as_out_intf
)
789 return uac2
->as_out_alt
;
790 else if (intf
== uac2
->as_in_intf
)
791 return uac2
->as_in_alt
;
793 dev_err(&agdev
->gadget
->dev
,
794 "%s:%d Invalid Interface %d!\n",
795 __func__
, __LINE__
, intf
);
801 afunc_disable(struct usb_function
*fn
)
803 struct f_uac2
*uac2
= func_to_uac2(fn
);
806 uac2
->as_out_alt
= 0;
807 u_audio_stop_capture(&uac2
->g_audio
);
808 u_audio_stop_playback(&uac2
->g_audio
);
812 in_rq_cur(struct usb_function
*fn
, const struct usb_ctrlrequest
*cr
)
814 struct usb_request
*req
= fn
->config
->cdev
->req
;
815 struct g_audio
*agdev
= func_to_g_audio(fn
);
816 struct f_uac2_opts
*opts
;
817 u16 w_length
= le16_to_cpu(cr
->wLength
);
818 u16 w_index
= le16_to_cpu(cr
->wIndex
);
819 u16 w_value
= le16_to_cpu(cr
->wValue
);
820 u8 entity_id
= (w_index
>> 8) & 0xff;
821 u8 control_selector
= w_value
>> 8;
822 int value
= -EOPNOTSUPP
;
823 int p_srate
, c_srate
;
825 opts
= g_audio_to_uac2_opts(agdev
);
826 p_srate
= opts
->p_srate
;
827 c_srate
= opts
->c_srate
;
829 if (control_selector
== UAC2_CS_CONTROL_SAM_FREQ
) {
830 struct cntrl_cur_lay3 c
;
831 memset(&c
, 0, sizeof(struct cntrl_cur_lay3
));
833 if (entity_id
== USB_IN_CLK_ID
)
834 c
.dCUR
= cpu_to_le32(p_srate
);
835 else if (entity_id
== USB_OUT_CLK_ID
)
836 c
.dCUR
= cpu_to_le32(c_srate
);
838 value
= min_t(unsigned, w_length
, sizeof c
);
839 memcpy(req
->buf
, &c
, value
);
840 } else if (control_selector
== UAC2_CS_CONTROL_CLOCK_VALID
) {
842 value
= min_t(unsigned, w_length
, 1);
844 dev_err(&agdev
->gadget
->dev
,
845 "%s:%d control_selector=%d TODO!\n",
846 __func__
, __LINE__
, control_selector
);
853 in_rq_range(struct usb_function
*fn
, const struct usb_ctrlrequest
*cr
)
855 struct usb_request
*req
= fn
->config
->cdev
->req
;
856 struct g_audio
*agdev
= func_to_g_audio(fn
);
857 struct f_uac2_opts
*opts
;
858 u16 w_length
= le16_to_cpu(cr
->wLength
);
859 u16 w_index
= le16_to_cpu(cr
->wIndex
);
860 u16 w_value
= le16_to_cpu(cr
->wValue
);
861 u8 entity_id
= (w_index
>> 8) & 0xff;
862 u8 control_selector
= w_value
>> 8;
863 struct cntrl_range_lay3 r
;
864 int value
= -EOPNOTSUPP
;
865 int p_srate
, c_srate
;
867 opts
= g_audio_to_uac2_opts(agdev
);
868 p_srate
= opts
->p_srate
;
869 c_srate
= opts
->c_srate
;
871 if (control_selector
== UAC2_CS_CONTROL_SAM_FREQ
) {
872 if (entity_id
== USB_IN_CLK_ID
)
873 r
.dMIN
= cpu_to_le32(p_srate
);
874 else if (entity_id
== USB_OUT_CLK_ID
)
875 r
.dMIN
= cpu_to_le32(c_srate
);
881 r
.wNumSubRanges
= cpu_to_le16(1);
883 value
= min_t(unsigned, w_length
, sizeof r
);
884 memcpy(req
->buf
, &r
, value
);
886 dev_err(&agdev
->gadget
->dev
,
887 "%s:%d control_selector=%d TODO!\n",
888 __func__
, __LINE__
, control_selector
);
895 ac_rq_in(struct usb_function
*fn
, const struct usb_ctrlrequest
*cr
)
897 if (cr
->bRequest
== UAC2_CS_CUR
)
898 return in_rq_cur(fn
, cr
);
899 else if (cr
->bRequest
== UAC2_CS_RANGE
)
900 return in_rq_range(fn
, cr
);
906 out_rq_cur(struct usb_function
*fn
, const struct usb_ctrlrequest
*cr
)
908 u16 w_length
= le16_to_cpu(cr
->wLength
);
909 u16 w_value
= le16_to_cpu(cr
->wValue
);
910 u8 control_selector
= w_value
>> 8;
912 if (control_selector
== UAC2_CS_CONTROL_SAM_FREQ
)
919 setup_rq_inf(struct usb_function
*fn
, const struct usb_ctrlrequest
*cr
)
921 struct f_uac2
*uac2
= func_to_uac2(fn
);
922 struct g_audio
*agdev
= func_to_g_audio(fn
);
923 u16 w_index
= le16_to_cpu(cr
->wIndex
);
924 u8 intf
= w_index
& 0xff;
926 if (intf
!= uac2
->ac_intf
) {
927 dev_err(&agdev
->gadget
->dev
,
928 "%s:%d Error!\n", __func__
, __LINE__
);
932 if (cr
->bRequestType
& USB_DIR_IN
)
933 return ac_rq_in(fn
, cr
);
934 else if (cr
->bRequest
== UAC2_CS_CUR
)
935 return out_rq_cur(fn
, cr
);
941 afunc_setup(struct usb_function
*fn
, const struct usb_ctrlrequest
*cr
)
943 struct usb_composite_dev
*cdev
= fn
->config
->cdev
;
944 struct g_audio
*agdev
= func_to_g_audio(fn
);
945 struct usb_request
*req
= cdev
->req
;
946 u16 w_length
= le16_to_cpu(cr
->wLength
);
947 int value
= -EOPNOTSUPP
;
949 /* Only Class specific requests are supposed to reach here */
950 if ((cr
->bRequestType
& USB_TYPE_MASK
) != USB_TYPE_CLASS
)
953 if ((cr
->bRequestType
& USB_RECIP_MASK
) == USB_RECIP_INTERFACE
)
954 value
= setup_rq_inf(fn
, cr
);
956 dev_err(&agdev
->gadget
->dev
, "%s:%d Error!\n",
961 req
->zero
= value
< w_length
;
962 value
= usb_ep_queue(cdev
->gadget
->ep0
, req
, GFP_ATOMIC
);
964 dev_err(&agdev
->gadget
->dev
,
965 "%s:%d Error!\n", __func__
, __LINE__
);
973 static inline struct f_uac2_opts
*to_f_uac2_opts(struct config_item
*item
)
975 return container_of(to_config_group(item
), struct f_uac2_opts
,
979 static void f_uac2_attr_release(struct config_item
*item
)
981 struct f_uac2_opts
*opts
= to_f_uac2_opts(item
);
983 usb_put_function_instance(&opts
->func_inst
);
986 static struct configfs_item_operations f_uac2_item_ops
= {
987 .release
= f_uac2_attr_release
,
990 #define UAC2_ATTRIBUTE(name) \
991 static ssize_t f_uac2_opts_##name##_show(struct config_item *item, \
994 struct f_uac2_opts *opts = to_f_uac2_opts(item); \
997 mutex_lock(&opts->lock); \
998 result = sprintf(page, "%u\n", opts->name); \
999 mutex_unlock(&opts->lock); \
1004 static ssize_t f_uac2_opts_##name##_store(struct config_item *item, \
1005 const char *page, size_t len) \
1007 struct f_uac2_opts *opts = to_f_uac2_opts(item); \
1011 mutex_lock(&opts->lock); \
1012 if (opts->refcnt) { \
1017 ret = kstrtou32(page, 0, &num); \
1025 mutex_unlock(&opts->lock); \
1029 CONFIGFS_ATTR(f_uac2_opts_, name)
1031 UAC2_ATTRIBUTE(p_chmask
);
1032 UAC2_ATTRIBUTE(p_srate
);
1033 UAC2_ATTRIBUTE(p_ssize
);
1034 UAC2_ATTRIBUTE(c_chmask
);
1035 UAC2_ATTRIBUTE(c_srate
);
1036 UAC2_ATTRIBUTE(c_ssize
);
1037 UAC2_ATTRIBUTE(req_number
);
1039 static struct configfs_attribute
*f_uac2_attrs
[] = {
1040 &f_uac2_opts_attr_p_chmask
,
1041 &f_uac2_opts_attr_p_srate
,
1042 &f_uac2_opts_attr_p_ssize
,
1043 &f_uac2_opts_attr_c_chmask
,
1044 &f_uac2_opts_attr_c_srate
,
1045 &f_uac2_opts_attr_c_ssize
,
1046 &f_uac2_opts_attr_req_number
,
1050 static const struct config_item_type f_uac2_func_type
= {
1051 .ct_item_ops
= &f_uac2_item_ops
,
1052 .ct_attrs
= f_uac2_attrs
,
1053 .ct_owner
= THIS_MODULE
,
1056 static void afunc_free_inst(struct usb_function_instance
*f
)
1058 struct f_uac2_opts
*opts
;
1060 opts
= container_of(f
, struct f_uac2_opts
, func_inst
);
1064 static struct usb_function_instance
*afunc_alloc_inst(void)
1066 struct f_uac2_opts
*opts
;
1068 opts
= kzalloc(sizeof(*opts
), GFP_KERNEL
);
1070 return ERR_PTR(-ENOMEM
);
1072 mutex_init(&opts
->lock
);
1073 opts
->func_inst
.free_func_inst
= afunc_free_inst
;
1075 config_group_init_type_name(&opts
->func_inst
.group
, "",
1078 opts
->p_chmask
= UAC2_DEF_PCHMASK
;
1079 opts
->p_srate
= UAC2_DEF_PSRATE
;
1080 opts
->p_ssize
= UAC2_DEF_PSSIZE
;
1081 opts
->c_chmask
= UAC2_DEF_CCHMASK
;
1082 opts
->c_srate
= UAC2_DEF_CSRATE
;
1083 opts
->c_ssize
= UAC2_DEF_CSSIZE
;
1084 opts
->req_number
= UAC2_DEF_REQ_NUM
;
1085 return &opts
->func_inst
;
1088 static void afunc_free(struct usb_function
*f
)
1090 struct g_audio
*agdev
;
1091 struct f_uac2_opts
*opts
;
1093 agdev
= func_to_g_audio(f
);
1094 opts
= container_of(f
->fi
, struct f_uac2_opts
, func_inst
);
1096 mutex_lock(&opts
->lock
);
1098 mutex_unlock(&opts
->lock
);
1101 static void afunc_unbind(struct usb_configuration
*c
, struct usb_function
*f
)
1103 struct g_audio
*agdev
= func_to_g_audio(f
);
1105 g_audio_cleanup(agdev
);
1106 usb_free_all_descriptors(f
);
1108 agdev
->gadget
= NULL
;
1111 static struct usb_function
*afunc_alloc(struct usb_function_instance
*fi
)
1113 struct f_uac2
*uac2
;
1114 struct f_uac2_opts
*opts
;
1116 uac2
= kzalloc(sizeof(*uac2
), GFP_KERNEL
);
1118 return ERR_PTR(-ENOMEM
);
1120 opts
= container_of(fi
, struct f_uac2_opts
, func_inst
);
1121 mutex_lock(&opts
->lock
);
1123 mutex_unlock(&opts
->lock
);
1125 uac2
->g_audio
.func
.name
= "uac2_func";
1126 uac2
->g_audio
.func
.bind
= afunc_bind
;
1127 uac2
->g_audio
.func
.unbind
= afunc_unbind
;
1128 uac2
->g_audio
.func
.set_alt
= afunc_set_alt
;
1129 uac2
->g_audio
.func
.get_alt
= afunc_get_alt
;
1130 uac2
->g_audio
.func
.disable
= afunc_disable
;
1131 uac2
->g_audio
.func
.setup
= afunc_setup
;
1132 uac2
->g_audio
.func
.free_func
= afunc_free
;
1134 return &uac2
->g_audio
.func
;
1137 DECLARE_USB_FUNCTION_INIT(uac2
, afunc_alloc_inst
, afunc_alloc
);
1138 MODULE_LICENSE("GPL");
1139 MODULE_AUTHOR("Yadwinder Singh");
1140 MODULE_AUTHOR("Jaswinder Singh");