1 // SPDX-License-Identifier: GPL-2.0+
3 * f_uac2.c -- USB Audio Class 2.0 Function
13 #include <linux/usb/audio.h>
14 #include <linux/usb/audio-v2.h>
15 #include <linux/module.h>
21 /* UAC2 spec: 4.1 Audio Channel Cluster Descriptor */
22 #define UAC2_CHANNEL_MASK 0x07FFFFFF
25 * The driver implements a simple UAC_2 topology.
26 * USB-OUT -> IT_1 -> FU -> OT_3 -> ALSA_Capture
27 * ALSA_Playback -> IT_2 -> FU -> OT_4 -> USB-IN
28 * Capture and Playback sampling rates are independently
29 * controlled by two clock sources :
30 * CLK_5 := c_srate, and CLK_6 := p_srate
32 #define USB_OUT_CLK_ID (out_clk_src_desc.bClockID)
33 #define USB_IN_CLK_ID (in_clk_src_desc.bClockID)
34 #define USB_OUT_FU_ID (out_feature_unit_desc->bUnitID)
35 #define USB_IN_FU_ID (in_feature_unit_desc->bUnitID)
37 #define CONTROL_ABSENT 0
38 #define CONTROL_RDONLY 1
39 #define CONTROL_RDWR 3
41 #define CLK_FREQ_CTRL 0
42 #define CLK_VLD_CTRL 2
43 #define FU_MUTE_CTRL 0
53 #define EPIN_EN(_opts) ((_opts)->p_chmask != 0)
54 #define EPOUT_EN(_opts) ((_opts)->c_chmask != 0)
55 #define FUIN_EN(_opts) (EPIN_EN(_opts) \
56 && ((_opts)->p_mute_present \
57 || (_opts)->p_volume_present))
58 #define FUOUT_EN(_opts) (EPOUT_EN(_opts) \
59 && ((_opts)->c_mute_present \
60 || (_opts)->c_volume_present))
61 #define EPOUT_FBACK_IN_EN(_opts) ((_opts)->c_sync == USB_ENDPOINT_SYNC_ASYNC)
64 struct g_audio g_audio;
65 u8 ac_intf, as_in_intf, as_out_intf;
66 u8 ac_alt, as_in_alt, as_out_alt; /* needed for get_alt() */
68 struct usb_ctrlrequest setup_cr; /* will be used in data stage */
70 /* Interrupt IN endpoint of AC interface */
71 struct usb_ep *int_ep;
73 /* transient state, only valid during handling of a single control request */
77 static inline struct f_uac2 *func_to_uac2(struct usb_function *f)
79 return container_of(f, struct f_uac2, g_audio.func);
83 struct f_uac2_opts *g_audio_to_uac2_opts(struct g_audio *agdev)
85 return container_of(agdev->func.fi, struct f_uac2_opts, func_inst);
88 static int afunc_notify(struct g_audio *agdev, int unit_id, int cs);
90 /* --------- USB Function Interface ------------- */
109 static struct usb_string strings_fn[] = {
110 /* [STR_ASSOC].s = DYNAMIC, */
111 [STR_IF_CTRL].s = "Topology Control",
112 [STR_CLKSRC_IN].s = "Input Clock",
113 [STR_CLKSRC_OUT].s = "Output Clock",
114 [STR_USB_IT].s = "USBH Out",
115 [STR_IO_IT].s = "USBD Out",
116 [STR_USB_OT].s = "USBH In",
117 [STR_IO_OT].s = "USBD In",
118 [STR_FU_IN].s = "Capture Volume",
119 [STR_FU_OUT].s = "Playback Volume",
120 [STR_AS_OUT_ALT0].s = "Playback Inactive",
121 [STR_AS_OUT_ALT1].s = "Playback Active",
122 [STR_AS_IN_ALT0].s = "Capture Inactive",
123 [STR_AS_IN_ALT1].s = "Capture Active",
127 static const char *const speed_names[] = {
128 [USB_SPEED_UNKNOWN] = "UNKNOWN",
129 [USB_SPEED_LOW] = "LS",
130 [USB_SPEED_FULL] = "FS",
131 [USB_SPEED_HIGH] = "HS",
132 [USB_SPEED_WIRELESS] = "W",
133 [USB_SPEED_SUPER] = "SS",
134 [USB_SPEED_SUPER_PLUS] = "SS+",
137 static struct usb_gadget_strings str_fn = {
138 .language = 0x0409, /* en-us */
139 .strings = strings_fn,
142 static struct usb_gadget_strings *fn_strings[] = {
147 static struct usb_interface_assoc_descriptor iad_desc = {
148 .bLength = sizeof iad_desc,
149 .bDescriptorType = USB_DT_INTERFACE_ASSOCIATION,
151 .bFirstInterface = 0,
152 .bInterfaceCount = 3,
153 .bFunctionClass = USB_CLASS_AUDIO,
154 .bFunctionSubClass = UAC2_FUNCTION_SUBCLASS_UNDEFINED,
155 .bFunctionProtocol = UAC_VERSION_2,
158 /* Audio Control Interface */
159 static struct usb_interface_descriptor std_ac_if_desc = {
160 .bLength = sizeof std_ac_if_desc,
161 .bDescriptorType = USB_DT_INTERFACE,
163 .bAlternateSetting = 0,
164 /* .bNumEndpoints = DYNAMIC */
165 .bInterfaceClass = USB_CLASS_AUDIO,
166 .bInterfaceSubClass = USB_SUBCLASS_AUDIOCONTROL,
167 .bInterfaceProtocol = UAC_VERSION_2,
170 /* Clock source for IN traffic */
171 static struct uac_clock_source_descriptor in_clk_src_desc = {
172 .bLength = sizeof in_clk_src_desc,
173 .bDescriptorType = USB_DT_CS_INTERFACE,
175 .bDescriptorSubtype = UAC2_CLOCK_SOURCE,
176 /* .bClockID = DYNAMIC */
177 .bmAttributes = UAC_CLOCK_SOURCE_TYPE_INT_FIXED,
178 .bmControls = (CONTROL_RDWR << CLK_FREQ_CTRL),
182 /* Clock source for OUT traffic */
183 static struct uac_clock_source_descriptor out_clk_src_desc = {
184 .bLength = sizeof out_clk_src_desc,
185 .bDescriptorType = USB_DT_CS_INTERFACE,
187 .bDescriptorSubtype = UAC2_CLOCK_SOURCE,
188 /* .bClockID = DYNAMIC */
189 .bmAttributes = UAC_CLOCK_SOURCE_TYPE_INT_FIXED,
190 .bmControls = (CONTROL_RDWR << CLK_FREQ_CTRL),
194 /* Input Terminal for USB_OUT */
195 static struct uac2_input_terminal_descriptor usb_out_it_desc = {
196 .bLength = sizeof usb_out_it_desc,
197 .bDescriptorType = USB_DT_CS_INTERFACE,
199 .bDescriptorSubtype = UAC_INPUT_TERMINAL,
200 /* .bTerminalID = DYNAMIC */
201 .wTerminalType = cpu_to_le16(UAC_TERMINAL_STREAMING),
203 /* .bCSourceID = DYNAMIC */
205 .bmControls = cpu_to_le16(CONTROL_RDWR << COPY_CTRL),
208 /* Input Terminal for I/O-In */
209 static struct uac2_input_terminal_descriptor io_in_it_desc = {
210 .bLength = sizeof io_in_it_desc,
211 .bDescriptorType = USB_DT_CS_INTERFACE,
213 .bDescriptorSubtype = UAC_INPUT_TERMINAL,
214 /* .bTerminalID = DYNAMIC */
215 .wTerminalType = cpu_to_le16(UAC_INPUT_TERMINAL_MICROPHONE),
217 /* .bCSourceID = DYNAMIC */
219 .bmControls = cpu_to_le16(CONTROL_RDWR << COPY_CTRL),
222 /* Ouput Terminal for USB_IN */
223 static struct uac2_output_terminal_descriptor usb_in_ot_desc = {
224 .bLength = sizeof usb_in_ot_desc,
225 .bDescriptorType = USB_DT_CS_INTERFACE,
227 .bDescriptorSubtype = UAC_OUTPUT_TERMINAL,
228 /* .bTerminalID = DYNAMIC */
229 .wTerminalType = cpu_to_le16(UAC_TERMINAL_STREAMING),
231 /* .bSourceID = DYNAMIC */
232 /* .bCSourceID = DYNAMIC */
233 .bmControls = cpu_to_le16(CONTROL_RDWR << COPY_CTRL),
236 /* Ouput Terminal for I/O-Out */
237 static struct uac2_output_terminal_descriptor io_out_ot_desc = {
238 .bLength = sizeof io_out_ot_desc,
239 .bDescriptorType = USB_DT_CS_INTERFACE,
241 .bDescriptorSubtype = UAC_OUTPUT_TERMINAL,
242 /* .bTerminalID = DYNAMIC */
243 .wTerminalType = cpu_to_le16(UAC_OUTPUT_TERMINAL_SPEAKER),
245 /* .bSourceID = DYNAMIC */
246 /* .bCSourceID = DYNAMIC */
247 .bmControls = cpu_to_le16(CONTROL_RDWR << COPY_CTRL),
250 static struct uac2_feature_unit_descriptor *in_feature_unit_desc;
251 static struct uac2_feature_unit_descriptor *out_feature_unit_desc;
253 static struct uac2_ac_header_descriptor ac_hdr_desc = {
254 .bLength = sizeof ac_hdr_desc,
255 .bDescriptorType = USB_DT_CS_INTERFACE,
257 .bDescriptorSubtype = UAC_MS_HEADER,
258 .bcdADC = cpu_to_le16(0x200),
259 .bCategory = UAC2_FUNCTION_IO_BOX,
260 /* .wTotalLength = DYNAMIC */
264 /* AC IN Interrupt Endpoint */
265 static struct usb_endpoint_descriptor fs_ep_int_desc = {
266 .bLength = USB_DT_ENDPOINT_SIZE,
267 .bDescriptorType = USB_DT_ENDPOINT,
269 .bEndpointAddress = USB_DIR_IN,
270 .bmAttributes = USB_ENDPOINT_XFER_INT,
271 .wMaxPacketSize = cpu_to_le16(6),
275 static struct usb_endpoint_descriptor hs_ep_int_desc = {
276 .bLength = USB_DT_ENDPOINT_SIZE,
277 .bDescriptorType = USB_DT_ENDPOINT,
279 .bmAttributes = USB_ENDPOINT_XFER_INT,
280 .wMaxPacketSize = cpu_to_le16(6),
284 static struct usb_endpoint_descriptor ss_ep_int_desc = {
285 .bLength = USB_DT_ENDPOINT_SIZE,
286 .bDescriptorType = USB_DT_ENDPOINT,
288 .bEndpointAddress = USB_DIR_IN,
289 .bmAttributes = USB_ENDPOINT_XFER_INT,
290 .wMaxPacketSize = cpu_to_le16(6),
294 /* Audio Streaming OUT Interface - Alt0 */
295 static struct usb_interface_descriptor std_as_out_if0_desc = {
296 .bLength = sizeof std_as_out_if0_desc,
297 .bDescriptorType = USB_DT_INTERFACE,
299 .bAlternateSetting = 0,
301 .bInterfaceClass = USB_CLASS_AUDIO,
302 .bInterfaceSubClass = USB_SUBCLASS_AUDIOSTREAMING,
303 .bInterfaceProtocol = UAC_VERSION_2,
306 /* Audio Streaming OUT Interface - Alt1 */
307 static struct usb_interface_descriptor std_as_out_if1_desc = {
308 .bLength = sizeof std_as_out_if1_desc,
309 .bDescriptorType = USB_DT_INTERFACE,
311 .bAlternateSetting = 1,
313 .bInterfaceClass = USB_CLASS_AUDIO,
314 .bInterfaceSubClass = USB_SUBCLASS_AUDIOSTREAMING,
315 .bInterfaceProtocol = UAC_VERSION_2,
318 /* Audio Stream OUT Intface Desc */
319 static struct uac2_as_header_descriptor as_out_hdr_desc = {
320 .bLength = sizeof as_out_hdr_desc,
321 .bDescriptorType = USB_DT_CS_INTERFACE,
323 .bDescriptorSubtype = UAC_AS_GENERAL,
324 /* .bTerminalLink = DYNAMIC */
326 .bFormatType = UAC_FORMAT_TYPE_I,
327 .bmFormats = cpu_to_le32(UAC_FORMAT_TYPE_I_PCM),
331 /* Audio USB_OUT Format */
332 static struct uac2_format_type_i_descriptor as_out_fmt1_desc = {
333 .bLength = sizeof as_out_fmt1_desc,
334 .bDescriptorType = USB_DT_CS_INTERFACE,
335 .bDescriptorSubtype = UAC_FORMAT_TYPE,
336 .bFormatType = UAC_FORMAT_TYPE_I,
339 /* STD AS ISO OUT Endpoint */
340 static struct usb_endpoint_descriptor fs_epout_desc = {
341 .bLength = USB_DT_ENDPOINT_SIZE,
342 .bDescriptorType = USB_DT_ENDPOINT,
344 .bEndpointAddress = USB_DIR_OUT,
345 /* .bmAttributes = DYNAMIC */
346 /* .wMaxPacketSize = DYNAMIC */
350 static struct usb_endpoint_descriptor hs_epout_desc = {
351 .bLength = USB_DT_ENDPOINT_SIZE,
352 .bDescriptorType = USB_DT_ENDPOINT,
354 /* .bmAttributes = DYNAMIC */
355 /* .wMaxPacketSize = DYNAMIC */
356 /* .bInterval = DYNAMIC */
359 static struct usb_endpoint_descriptor ss_epout_desc = {
360 .bLength = USB_DT_ENDPOINT_SIZE,
361 .bDescriptorType = USB_DT_ENDPOINT,
363 .bEndpointAddress = USB_DIR_OUT,
364 /* .bmAttributes = DYNAMIC */
365 /* .wMaxPacketSize = DYNAMIC */
366 /* .bInterval = DYNAMIC */
369 static struct usb_ss_ep_comp_descriptor ss_epout_desc_comp = {
370 .bLength = sizeof(ss_epout_desc_comp),
371 .bDescriptorType = USB_DT_SS_ENDPOINT_COMP,
374 /* wBytesPerInterval = DYNAMIC */
377 /* CS AS ISO OUT Endpoint */
378 static struct uac2_iso_endpoint_descriptor as_iso_out_desc = {
379 .bLength = sizeof as_iso_out_desc,
380 .bDescriptorType = USB_DT_CS_ENDPOINT,
382 .bDescriptorSubtype = UAC_EP_GENERAL,
385 .bLockDelayUnits = 0,
389 /* STD AS ISO IN Feedback Endpoint */
390 static struct usb_endpoint_descriptor fs_epin_fback_desc = {
391 .bLength = USB_DT_ENDPOINT_SIZE,
392 .bDescriptorType = USB_DT_ENDPOINT,
394 .bEndpointAddress = USB_DIR_IN,
395 .bmAttributes = USB_ENDPOINT_XFER_ISOC | USB_ENDPOINT_USAGE_FEEDBACK,
396 .wMaxPacketSize = cpu_to_le16(3),
400 static struct usb_endpoint_descriptor hs_epin_fback_desc = {
401 .bLength = USB_DT_ENDPOINT_SIZE,
402 .bDescriptorType = USB_DT_ENDPOINT,
404 .bmAttributes = USB_ENDPOINT_XFER_ISOC | USB_ENDPOINT_USAGE_FEEDBACK,
405 .wMaxPacketSize = cpu_to_le16(4),
409 static struct usb_endpoint_descriptor ss_epin_fback_desc = {
410 .bLength = USB_DT_ENDPOINT_SIZE,
411 .bDescriptorType = USB_DT_ENDPOINT,
413 .bEndpointAddress = USB_DIR_IN,
414 .bmAttributes = USB_ENDPOINT_XFER_ISOC | USB_ENDPOINT_USAGE_FEEDBACK,
415 .wMaxPacketSize = cpu_to_le16(4),
419 static struct usb_ss_ep_comp_descriptor ss_epin_fback_desc_comp = {
420 .bLength = sizeof(ss_epin_fback_desc_comp),
421 .bDescriptorType = USB_DT_SS_ENDPOINT_COMP,
424 .wBytesPerInterval = cpu_to_le16(4),
428 /* Audio Streaming IN Interface - Alt0 */
429 static struct usb_interface_descriptor std_as_in_if0_desc = {
430 .bLength = sizeof std_as_in_if0_desc,
431 .bDescriptorType = USB_DT_INTERFACE,
433 .bAlternateSetting = 0,
435 .bInterfaceClass = USB_CLASS_AUDIO,
436 .bInterfaceSubClass = USB_SUBCLASS_AUDIOSTREAMING,
437 .bInterfaceProtocol = UAC_VERSION_2,
440 /* Audio Streaming IN Interface - Alt1 */
441 static struct usb_interface_descriptor std_as_in_if1_desc = {
442 .bLength = sizeof std_as_in_if1_desc,
443 .bDescriptorType = USB_DT_INTERFACE,
445 .bAlternateSetting = 1,
447 .bInterfaceClass = USB_CLASS_AUDIO,
448 .bInterfaceSubClass = USB_SUBCLASS_AUDIOSTREAMING,
449 .bInterfaceProtocol = UAC_VERSION_2,
452 /* Audio Stream IN Intface Desc */
453 static struct uac2_as_header_descriptor as_in_hdr_desc = {
454 .bLength = sizeof as_in_hdr_desc,
455 .bDescriptorType = USB_DT_CS_INTERFACE,
457 .bDescriptorSubtype = UAC_AS_GENERAL,
458 /* .bTerminalLink = DYNAMIC */
460 .bFormatType = UAC_FORMAT_TYPE_I,
461 .bmFormats = cpu_to_le32(UAC_FORMAT_TYPE_I_PCM),
465 /* Audio USB_IN Format */
466 static struct uac2_format_type_i_descriptor as_in_fmt1_desc = {
467 .bLength = sizeof as_in_fmt1_desc,
468 .bDescriptorType = USB_DT_CS_INTERFACE,
469 .bDescriptorSubtype = UAC_FORMAT_TYPE,
470 .bFormatType = UAC_FORMAT_TYPE_I,
473 /* STD AS ISO IN Endpoint */
474 static struct usb_endpoint_descriptor fs_epin_desc = {
475 .bLength = USB_DT_ENDPOINT_SIZE,
476 .bDescriptorType = USB_DT_ENDPOINT,
478 .bEndpointAddress = USB_DIR_IN,
479 .bmAttributes = USB_ENDPOINT_XFER_ISOC | USB_ENDPOINT_SYNC_ASYNC,
480 /* .wMaxPacketSize = DYNAMIC */
484 static struct usb_endpoint_descriptor hs_epin_desc = {
485 .bLength = USB_DT_ENDPOINT_SIZE,
486 .bDescriptorType = USB_DT_ENDPOINT,
488 .bmAttributes = USB_ENDPOINT_XFER_ISOC | USB_ENDPOINT_SYNC_ASYNC,
489 /* .wMaxPacketSize = DYNAMIC */
490 /* .bInterval = DYNAMIC */
493 static struct usb_endpoint_descriptor ss_epin_desc = {
494 .bLength = USB_DT_ENDPOINT_SIZE,
495 .bDescriptorType = USB_DT_ENDPOINT,
497 .bEndpointAddress = USB_DIR_IN,
498 .bmAttributes = USB_ENDPOINT_XFER_ISOC | USB_ENDPOINT_SYNC_ASYNC,
499 /* .wMaxPacketSize = DYNAMIC */
500 /* .bInterval = DYNAMIC */
503 static struct usb_ss_ep_comp_descriptor ss_epin_desc_comp = {
504 .bLength = sizeof(ss_epin_desc_comp),
505 .bDescriptorType = USB_DT_SS_ENDPOINT_COMP,
508 /* wBytesPerInterval = DYNAMIC */
511 /* CS AS ISO IN Endpoint */
512 static struct uac2_iso_endpoint_descriptor as_iso_in_desc = {
513 .bLength = sizeof as_iso_in_desc,
514 .bDescriptorType = USB_DT_CS_ENDPOINT,
516 .bDescriptorSubtype = UAC_EP_GENERAL,
519 .bLockDelayUnits = 0,
523 static struct usb_descriptor_header *fs_audio_desc[] = {
524 (struct usb_descriptor_header *)&iad_desc,
525 (struct usb_descriptor_header *)&std_ac_if_desc,
527 (struct usb_descriptor_header *)&ac_hdr_desc,
528 (struct usb_descriptor_header *)&in_clk_src_desc,
529 (struct usb_descriptor_header *)&out_clk_src_desc,
530 (struct usb_descriptor_header *)&usb_out_it_desc,
531 (struct usb_descriptor_header *)&out_feature_unit_desc,
532 (struct usb_descriptor_header *)&io_in_it_desc,
533 (struct usb_descriptor_header *)&usb_in_ot_desc,
534 (struct usb_descriptor_header *)&in_feature_unit_desc,
535 (struct usb_descriptor_header *)&io_out_ot_desc,
537 (struct usb_descriptor_header *)&fs_ep_int_desc,
539 (struct usb_descriptor_header *)&std_as_out_if0_desc,
540 (struct usb_descriptor_header *)&std_as_out_if1_desc,
542 (struct usb_descriptor_header *)&as_out_hdr_desc,
543 (struct usb_descriptor_header *)&as_out_fmt1_desc,
544 (struct usb_descriptor_header *)&fs_epout_desc,
545 (struct usb_descriptor_header *)&as_iso_out_desc,
546 (struct usb_descriptor_header *)&fs_epin_fback_desc,
548 (struct usb_descriptor_header *)&std_as_in_if0_desc,
549 (struct usb_descriptor_header *)&std_as_in_if1_desc,
551 (struct usb_descriptor_header *)&as_in_hdr_desc,
552 (struct usb_descriptor_header *)&as_in_fmt1_desc,
553 (struct usb_descriptor_header *)&fs_epin_desc,
554 (struct usb_descriptor_header *)&as_iso_in_desc,
558 static struct usb_descriptor_header *hs_audio_desc[] = {
559 (struct usb_descriptor_header *)&iad_desc,
560 (struct usb_descriptor_header *)&std_ac_if_desc,
562 (struct usb_descriptor_header *)&ac_hdr_desc,
563 (struct usb_descriptor_header *)&in_clk_src_desc,
564 (struct usb_descriptor_header *)&out_clk_src_desc,
565 (struct usb_descriptor_header *)&usb_out_it_desc,
566 (struct usb_descriptor_header *)&out_feature_unit_desc,
567 (struct usb_descriptor_header *)&io_in_it_desc,
568 (struct usb_descriptor_header *)&usb_in_ot_desc,
569 (struct usb_descriptor_header *)&in_feature_unit_desc,
570 (struct usb_descriptor_header *)&io_out_ot_desc,
572 (struct usb_descriptor_header *)&hs_ep_int_desc,
574 (struct usb_descriptor_header *)&std_as_out_if0_desc,
575 (struct usb_descriptor_header *)&std_as_out_if1_desc,
577 (struct usb_descriptor_header *)&as_out_hdr_desc,
578 (struct usb_descriptor_header *)&as_out_fmt1_desc,
579 (struct usb_descriptor_header *)&hs_epout_desc,
580 (struct usb_descriptor_header *)&as_iso_out_desc,
581 (struct usb_descriptor_header *)&hs_epin_fback_desc,
583 (struct usb_descriptor_header *)&std_as_in_if0_desc,
584 (struct usb_descriptor_header *)&std_as_in_if1_desc,
586 (struct usb_descriptor_header *)&as_in_hdr_desc,
587 (struct usb_descriptor_header *)&as_in_fmt1_desc,
588 (struct usb_descriptor_header *)&hs_epin_desc,
589 (struct usb_descriptor_header *)&as_iso_in_desc,
593 static struct usb_descriptor_header *ss_audio_desc[] = {
594 (struct usb_descriptor_header *)&iad_desc,
595 (struct usb_descriptor_header *)&std_ac_if_desc,
597 (struct usb_descriptor_header *)&ac_hdr_desc,
598 (struct usb_descriptor_header *)&in_clk_src_desc,
599 (struct usb_descriptor_header *)&out_clk_src_desc,
600 (struct usb_descriptor_header *)&usb_out_it_desc,
601 (struct usb_descriptor_header *)&out_feature_unit_desc,
602 (struct usb_descriptor_header *)&io_in_it_desc,
603 (struct usb_descriptor_header *)&usb_in_ot_desc,
604 (struct usb_descriptor_header *)&in_feature_unit_desc,
605 (struct usb_descriptor_header *)&io_out_ot_desc,
607 (struct usb_descriptor_header *)&ss_ep_int_desc,
609 (struct usb_descriptor_header *)&std_as_out_if0_desc,
610 (struct usb_descriptor_header *)&std_as_out_if1_desc,
612 (struct usb_descriptor_header *)&as_out_hdr_desc,
613 (struct usb_descriptor_header *)&as_out_fmt1_desc,
614 (struct usb_descriptor_header *)&ss_epout_desc,
615 (struct usb_descriptor_header *)&ss_epout_desc_comp,
616 (struct usb_descriptor_header *)&as_iso_out_desc,
617 (struct usb_descriptor_header *)&ss_epin_fback_desc,
618 (struct usb_descriptor_header *)&ss_epin_fback_desc_comp,
620 (struct usb_descriptor_header *)&std_as_in_if0_desc,
621 (struct usb_descriptor_header *)&std_as_in_if1_desc,
623 (struct usb_descriptor_header *)&as_in_hdr_desc,
624 (struct usb_descriptor_header *)&as_in_fmt1_desc,
625 (struct usb_descriptor_header *)&ss_epin_desc,
626 (struct usb_descriptor_header *)&ss_epin_desc_comp,
627 (struct usb_descriptor_header *)&as_iso_in_desc,
631 struct cntrl_cur_lay2 {
635 struct cntrl_range_lay2 {
636 __le16 wNumSubRanges;
642 struct cntrl_cur_lay3 {
646 struct cntrl_subrange_lay3 {
652 #define ranges_lay3_size(c) (sizeof(c.wNumSubRanges) \
653 + le16_to_cpu(c.wNumSubRanges) \
654 * sizeof(struct cntrl_subrange_lay3))
656 #define DECLARE_UAC2_CNTRL_RANGES_LAY3(k, n) \
657 struct cntrl_ranges_lay3_##k { \
658 __le16 wNumSubRanges; \
659 struct cntrl_subrange_lay3 r[n]; \
662 DECLARE_UAC2_CNTRL_RANGES_LAY3(srates, UAC_MAX_RATES);
664 static int get_max_srate(const int *srates)
666 int i, max_srate = 0;
668 for (i = 0; i < UAC_MAX_RATES; i++) {
671 if (srates[i] > max_srate)
672 max_srate = srates[i];
677 static int get_max_bw_for_bint(const struct f_uac2_opts *uac2_opts,
678 u8 bint, unsigned int factor, bool is_playback)
680 int chmask, srate, ssize;
684 chmask = uac2_opts->p_chmask;
685 srate = get_max_srate(uac2_opts->p_srates);
686 ssize = uac2_opts->p_ssize;
688 chmask = uac2_opts->c_chmask;
689 srate = get_max_srate(uac2_opts->c_srates);
690 ssize = uac2_opts->c_ssize;
693 if (is_playback || (uac2_opts->c_sync == USB_ENDPOINT_SYNC_ASYNC)) {
694 // playback is always async, capture only when configured
695 // Win10 requires max packet size + 1 frame
696 srate = srate * (1000 + uac2_opts->fb_max) / 1000;
697 // updated srate is always bigger, therefore DIV_ROUND_UP always yields +1
698 max_size_bw = num_channels(chmask) * ssize *
699 (DIV_ROUND_UP(srate, factor / (1 << (bint - 1))));
701 // adding 1 frame provision for Win10
702 max_size_bw = num_channels(chmask) * ssize *
703 (DIV_ROUND_UP(srate, factor / (1 << (bint - 1))) + 1);
708 static int set_ep_max_packet_size_bint(struct device *dev, const struct f_uac2_opts *uac2_opts,
709 struct usb_endpoint_descriptor *ep_desc,
710 enum usb_device_speed speed, bool is_playback)
712 u16 max_size_bw, max_size_ep;
720 bint = ep_desc->bInterval;
721 max_size_bw = get_max_bw_for_bint(uac2_opts, bint, 1000, is_playback);
725 case USB_SPEED_SUPER:
728 opts_bint = uac2_opts->p_hs_bint;
730 opts_bint = uac2_opts->c_hs_bint;
735 max_size_bw = get_max_bw_for_bint(uac2_opts, bint, 8000, is_playback);
737 /* checking bInterval from 4 to 1 whether the required bandwidth fits */
738 for (bint = 4; bint > 0; --bint) {
739 max_size_bw = get_max_bw_for_bint(
740 uac2_opts, bint, 8000, is_playback);
741 if (max_size_bw <= max_size_ep)
756 if (max_size_bw <= max_size_ep)
758 "%s %s: Would use wMaxPacketSize %d and bInterval %d\n",
759 speed_names[speed], dir, max_size_bw, bint);
762 "%s %s: Req. wMaxPacketSize %d at bInterval %d > max ISOC %d, may drop data!\n",
763 speed_names[speed], dir, max_size_bw, bint, max_size_ep);
764 max_size_bw = max_size_ep;
767 ep_desc->wMaxPacketSize = cpu_to_le16(max_size_bw);
768 ep_desc->bInterval = bint;
773 static struct uac2_feature_unit_descriptor *build_fu_desc(int chmask)
775 struct uac2_feature_unit_descriptor *fu_desc;
776 int channels = num_channels(chmask);
777 int fu_desc_size = UAC2_DT_FEATURE_UNIT_SIZE(channels);
779 fu_desc = kzalloc(fu_desc_size, GFP_KERNEL);
783 fu_desc->bLength = fu_desc_size;
784 fu_desc->bDescriptorType = USB_DT_CS_INTERFACE;
786 fu_desc->bDescriptorSubtype = UAC_FEATURE_UNIT;
788 /* bUnitID, bSourceID and bmaControls will be defined later */
793 /* Use macro to overcome line length limitation */
794 #define USBDHDR(p) (struct usb_descriptor_header *)(p)
796 static void setup_headers(struct f_uac2_opts *opts,
797 struct usb_descriptor_header **headers,
798 enum usb_device_speed speed)
800 struct usb_ss_ep_comp_descriptor *epout_desc_comp = NULL;
801 struct usb_ss_ep_comp_descriptor *epin_desc_comp = NULL;
802 struct usb_ss_ep_comp_descriptor *epin_fback_desc_comp = NULL;
803 struct usb_endpoint_descriptor *epout_desc;
804 struct usb_endpoint_descriptor *epin_desc;
805 struct usb_endpoint_descriptor *epin_fback_desc;
806 struct usb_endpoint_descriptor *ep_int_desc;
811 epout_desc = &fs_epout_desc;
812 epin_desc = &fs_epin_desc;
813 epin_fback_desc = &fs_epin_fback_desc;
814 ep_int_desc = &fs_ep_int_desc;
817 epout_desc = &hs_epout_desc;
818 epin_desc = &hs_epin_desc;
819 epin_fback_desc = &hs_epin_fback_desc;
820 ep_int_desc = &hs_ep_int_desc;
823 epout_desc = &ss_epout_desc;
824 epin_desc = &ss_epin_desc;
825 epout_desc_comp = &ss_epout_desc_comp;
826 epin_desc_comp = &ss_epin_desc_comp;
827 epin_fback_desc = &ss_epin_fback_desc;
828 epin_fback_desc_comp = &ss_epin_fback_desc_comp;
829 ep_int_desc = &ss_ep_int_desc;
833 headers[i++] = USBDHDR(&iad_desc);
834 headers[i++] = USBDHDR(&std_ac_if_desc);
835 headers[i++] = USBDHDR(&ac_hdr_desc);
837 headers[i++] = USBDHDR(&in_clk_src_desc);
838 if (EPOUT_EN(opts)) {
839 headers[i++] = USBDHDR(&out_clk_src_desc);
840 headers[i++] = USBDHDR(&usb_out_it_desc);
843 headers[i++] = USBDHDR(out_feature_unit_desc);
847 headers[i++] = USBDHDR(&io_in_it_desc);
850 headers[i++] = USBDHDR(in_feature_unit_desc);
852 headers[i++] = USBDHDR(&usb_in_ot_desc);
856 headers[i++] = USBDHDR(&io_out_ot_desc);
858 if (FUOUT_EN(opts) || FUIN_EN(opts))
859 headers[i++] = USBDHDR(ep_int_desc);
861 if (EPOUT_EN(opts)) {
862 headers[i++] = USBDHDR(&std_as_out_if0_desc);
863 headers[i++] = USBDHDR(&std_as_out_if1_desc);
864 headers[i++] = USBDHDR(&as_out_hdr_desc);
865 headers[i++] = USBDHDR(&as_out_fmt1_desc);
866 headers[i++] = USBDHDR(epout_desc);
868 headers[i++] = USBDHDR(epout_desc_comp);
870 headers[i++] = USBDHDR(&as_iso_out_desc);
872 if (EPOUT_FBACK_IN_EN(opts)) {
873 headers[i++] = USBDHDR(epin_fback_desc);
874 if (epin_fback_desc_comp)
875 headers[i++] = USBDHDR(epin_fback_desc_comp);
880 headers[i++] = USBDHDR(&std_as_in_if0_desc);
881 headers[i++] = USBDHDR(&std_as_in_if1_desc);
882 headers[i++] = USBDHDR(&as_in_hdr_desc);
883 headers[i++] = USBDHDR(&as_in_fmt1_desc);
884 headers[i++] = USBDHDR(epin_desc);
886 headers[i++] = USBDHDR(epin_desc_comp);
888 headers[i++] = USBDHDR(&as_iso_in_desc);
893 static void setup_descriptor(struct f_uac2_opts *opts)
895 /* patch descriptors */
896 int i = 1; /* ID's start with 1 */
899 usb_out_it_desc.bTerminalID = i++;
901 io_in_it_desc.bTerminalID = i++;
903 io_out_ot_desc.bTerminalID = i++;
905 usb_in_ot_desc.bTerminalID = i++;
907 out_feature_unit_desc->bUnitID = i++;
909 in_feature_unit_desc->bUnitID = i++;
911 out_clk_src_desc.bClockID = i++;
913 in_clk_src_desc.bClockID = i++;
915 usb_out_it_desc.bCSourceID = out_clk_src_desc.bClockID;
918 usb_in_ot_desc.bSourceID = in_feature_unit_desc->bUnitID;
919 in_feature_unit_desc->bSourceID = io_in_it_desc.bTerminalID;
921 usb_in_ot_desc.bSourceID = io_in_it_desc.bTerminalID;
924 usb_in_ot_desc.bCSourceID = in_clk_src_desc.bClockID;
925 io_in_it_desc.bCSourceID = in_clk_src_desc.bClockID;
926 io_out_ot_desc.bCSourceID = out_clk_src_desc.bClockID;
928 if (FUOUT_EN(opts)) {
929 io_out_ot_desc.bSourceID = out_feature_unit_desc->bUnitID;
930 out_feature_unit_desc->bSourceID = usb_out_it_desc.bTerminalID;
932 io_out_ot_desc.bSourceID = usb_out_it_desc.bTerminalID;
935 as_out_hdr_desc.bTerminalLink = usb_out_it_desc.bTerminalID;
936 as_in_hdr_desc.bTerminalLink = usb_in_ot_desc.bTerminalID;
938 iad_desc.bInterfaceCount = 1;
939 ac_hdr_desc.wTotalLength = cpu_to_le16(sizeof(ac_hdr_desc));
942 u16 len = le16_to_cpu(ac_hdr_desc.wTotalLength);
944 len += sizeof(in_clk_src_desc);
945 len += sizeof(usb_in_ot_desc);
948 len += in_feature_unit_desc->bLength;
950 len += sizeof(io_in_it_desc);
951 ac_hdr_desc.wTotalLength = cpu_to_le16(len);
952 iad_desc.bInterfaceCount++;
954 if (EPOUT_EN(opts)) {
955 u16 len = le16_to_cpu(ac_hdr_desc.wTotalLength);
957 len += sizeof(out_clk_src_desc);
958 len += sizeof(usb_out_it_desc);
961 len += out_feature_unit_desc->bLength;
963 len += sizeof(io_out_ot_desc);
964 ac_hdr_desc.wTotalLength = cpu_to_le16(len);
965 iad_desc.bInterfaceCount++;
968 setup_headers(opts, fs_audio_desc, USB_SPEED_FULL);
969 setup_headers(opts, hs_audio_desc, USB_SPEED_HIGH);
970 setup_headers(opts, ss_audio_desc, USB_SPEED_SUPER);
973 static int afunc_validate_opts(struct g_audio *agdev, struct device *dev)
975 struct f_uac2_opts *opts = g_audio_to_uac2_opts(agdev);
976 const char *msg = NULL;
978 if (!opts->p_chmask && !opts->c_chmask)
979 msg = "no playback and capture channels";
980 else if (opts->p_chmask & ~UAC2_CHANNEL_MASK)
981 msg = "unsupported playback channels mask";
982 else if (opts->c_chmask & ~UAC2_CHANNEL_MASK)
983 msg = "unsupported capture channels mask";
984 else if ((opts->p_ssize < 1) || (opts->p_ssize > 4))
985 msg = "incorrect playback sample size";
986 else if ((opts->c_ssize < 1) || (opts->c_ssize > 4))
987 msg = "incorrect capture sample size";
988 else if (!opts->p_srates[0])
989 msg = "incorrect playback sampling rate";
990 else if (!opts->c_srates[0])
991 msg = "incorrect capture sampling rate";
993 else if (opts->p_volume_max <= opts->p_volume_min)
994 msg = "incorrect playback volume max/min";
995 else if (opts->c_volume_max <= opts->c_volume_min)
996 msg = "incorrect capture volume max/min";
997 else if (opts->p_volume_res <= 0)
998 msg = "negative/zero playback volume resolution";
999 else if (opts->c_volume_res <= 0)
1000 msg = "negative/zero capture volume resolution";
1002 else if ((opts->p_volume_max - opts->p_volume_min) % opts->p_volume_res)
1003 msg = "incorrect playback volume resolution";
1004 else if ((opts->c_volume_max - opts->c_volume_min) % opts->c_volume_res)
1005 msg = "incorrect capture volume resolution";
1007 else if ((opts->p_hs_bint < 0) || (opts->p_hs_bint > 4))
1008 msg = "incorrect playback HS/SS bInterval (1-4: fixed, 0: auto)";
1009 else if ((opts->c_hs_bint < 0) || (opts->c_hs_bint > 4))
1010 msg = "incorrect capture HS/SS bInterval (1-4: fixed, 0: auto)";
1013 dev_err(dev, "Error: %s\n", msg);
1021 afunc_bind(struct usb_configuration *cfg, struct usb_function *fn)
1023 struct f_uac2 *uac2 = func_to_uac2(fn);
1024 struct g_audio *agdev = func_to_g_audio(fn);
1025 struct usb_composite_dev *cdev = cfg->cdev;
1026 struct usb_gadget *gadget = cdev->gadget;
1027 struct device *dev = &gadget->dev;
1028 struct f_uac2_opts *uac2_opts = g_audio_to_uac2_opts(agdev);
1029 struct usb_string *us;
1032 ret = afunc_validate_opts(agdev, dev);
1036 strings_fn[STR_ASSOC].s = uac2_opts->function_name;
1038 us = usb_gstrings_attach(cdev, fn_strings, ARRAY_SIZE(strings_fn));
1042 if (FUOUT_EN(uac2_opts)) {
1043 out_feature_unit_desc = build_fu_desc(uac2_opts->c_chmask);
1044 if (!out_feature_unit_desc)
1047 if (FUIN_EN(uac2_opts)) {
1048 in_feature_unit_desc = build_fu_desc(uac2_opts->p_chmask);
1049 if (!in_feature_unit_desc) {
1055 iad_desc.iFunction = us[STR_ASSOC].id;
1056 std_ac_if_desc.iInterface = us[STR_IF_CTRL].id;
1057 in_clk_src_desc.iClockSource = us[STR_CLKSRC_IN].id;
1058 out_clk_src_desc.iClockSource = us[STR_CLKSRC_OUT].id;
1059 usb_out_it_desc.iTerminal = us[STR_USB_IT].id;
1060 io_in_it_desc.iTerminal = us[STR_IO_IT].id;
1061 usb_in_ot_desc.iTerminal = us[STR_USB_OT].id;
1062 io_out_ot_desc.iTerminal = us[STR_IO_OT].id;
1063 std_as_out_if0_desc.iInterface = us[STR_AS_OUT_ALT0].id;
1064 std_as_out_if1_desc.iInterface = us[STR_AS_OUT_ALT1].id;
1065 std_as_in_if0_desc.iInterface = us[STR_AS_IN_ALT0].id;
1066 std_as_in_if1_desc.iInterface = us[STR_AS_IN_ALT1].id;
1068 if (FUOUT_EN(uac2_opts)) {
1069 u8 *i_feature = (u8 *)out_feature_unit_desc +
1070 out_feature_unit_desc->bLength - 1;
1071 *i_feature = us[STR_FU_OUT].id;
1073 if (FUIN_EN(uac2_opts)) {
1074 u8 *i_feature = (u8 *)in_feature_unit_desc +
1075 in_feature_unit_desc->bLength - 1;
1076 *i_feature = us[STR_FU_IN].id;
1080 /* Initialize the configurable parameters */
1081 usb_out_it_desc.bNrChannels = num_channels(uac2_opts->c_chmask);
1082 usb_out_it_desc.bmChannelConfig = cpu_to_le32(uac2_opts->c_chmask);
1083 io_in_it_desc.bNrChannels = num_channels(uac2_opts->p_chmask);
1084 io_in_it_desc.bmChannelConfig = cpu_to_le32(uac2_opts->p_chmask);
1085 as_out_hdr_desc.bNrChannels = num_channels(uac2_opts->c_chmask);
1086 as_out_hdr_desc.bmChannelConfig = cpu_to_le32(uac2_opts->c_chmask);
1087 as_in_hdr_desc.bNrChannels = num_channels(uac2_opts->p_chmask);
1088 as_in_hdr_desc.bmChannelConfig = cpu_to_le32(uac2_opts->p_chmask);
1089 as_out_fmt1_desc.bSubslotSize = uac2_opts->c_ssize;
1090 as_out_fmt1_desc.bBitResolution = uac2_opts->c_ssize * 8;
1091 as_in_fmt1_desc.bSubslotSize = uac2_opts->p_ssize;
1092 as_in_fmt1_desc.bBitResolution = uac2_opts->p_ssize * 8;
1093 if (FUOUT_EN(uac2_opts)) {
1094 __le32 *bma = (__le32 *)&out_feature_unit_desc->bmaControls[0];
1097 if (uac2_opts->c_mute_present)
1098 control |= CONTROL_RDWR << FU_MUTE_CTRL;
1099 if (uac2_opts->c_volume_present)
1100 control |= CONTROL_RDWR << FU_VOL_CTRL;
1101 *bma = cpu_to_le32(control);
1103 if (FUIN_EN(uac2_opts)) {
1104 __le32 *bma = (__le32 *)&in_feature_unit_desc->bmaControls[0];
1107 if (uac2_opts->p_mute_present)
1108 control |= CONTROL_RDWR << FU_MUTE_CTRL;
1109 if (uac2_opts->p_volume_present)
1110 control |= CONTROL_RDWR << FU_VOL_CTRL;
1111 *bma = cpu_to_le32(control);
1114 ret = usb_interface_id(cfg, fn);
1116 dev_err(dev, "%s:%d Error!\n", __func__, __LINE__);
1119 iad_desc.bFirstInterface = ret;
1121 std_ac_if_desc.bInterfaceNumber = ret;
1122 uac2->ac_intf = ret;
1125 if (EPOUT_EN(uac2_opts)) {
1126 ret = usb_interface_id(cfg, fn);
1128 dev_err(dev, "%s:%d Error!\n", __func__, __LINE__);
1131 std_as_out_if0_desc.bInterfaceNumber = ret;
1132 std_as_out_if1_desc.bInterfaceNumber = ret;
1133 uac2->as_out_intf = ret;
1134 uac2->as_out_alt = 0;
1136 if (EPOUT_FBACK_IN_EN(uac2_opts)) {
1137 fs_epout_desc.bmAttributes =
1138 USB_ENDPOINT_XFER_ISOC | USB_ENDPOINT_SYNC_ASYNC;
1139 hs_epout_desc.bmAttributes =
1140 USB_ENDPOINT_XFER_ISOC | USB_ENDPOINT_SYNC_ASYNC;
1141 ss_epout_desc.bmAttributes =
1142 USB_ENDPOINT_XFER_ISOC | USB_ENDPOINT_SYNC_ASYNC;
1143 std_as_out_if1_desc.bNumEndpoints++;
1145 fs_epout_desc.bmAttributes =
1146 USB_ENDPOINT_XFER_ISOC | USB_ENDPOINT_SYNC_ADAPTIVE;
1147 hs_epout_desc.bmAttributes =
1148 USB_ENDPOINT_XFER_ISOC | USB_ENDPOINT_SYNC_ADAPTIVE;
1149 ss_epout_desc.bmAttributes =
1150 USB_ENDPOINT_XFER_ISOC | USB_ENDPOINT_SYNC_ADAPTIVE;
1154 if (EPIN_EN(uac2_opts)) {
1155 ret = usb_interface_id(cfg, fn);
1157 dev_err(dev, "%s:%d Error!\n", __func__, __LINE__);
1160 std_as_in_if0_desc.bInterfaceNumber = ret;
1161 std_as_in_if1_desc.bInterfaceNumber = ret;
1162 uac2->as_in_intf = ret;
1163 uac2->as_in_alt = 0;
1166 if (FUOUT_EN(uac2_opts) || FUIN_EN(uac2_opts)) {
1167 uac2->int_ep = usb_ep_autoconfig(gadget, &fs_ep_int_desc);
1168 if (!uac2->int_ep) {
1169 dev_err(dev, "%s:%d Error!\n", __func__, __LINE__);
1174 std_ac_if_desc.bNumEndpoints = 1;
1177 hs_epin_desc.bInterval = uac2_opts->p_hs_bint;
1178 ss_epin_desc.bInterval = uac2_opts->p_hs_bint;
1179 hs_epout_desc.bInterval = uac2_opts->c_hs_bint;
1180 ss_epout_desc.bInterval = uac2_opts->c_hs_bint;
1182 /* Calculate wMaxPacketSize according to audio bandwidth */
1183 ret = set_ep_max_packet_size_bint(dev, uac2_opts, &fs_epin_desc,
1184 USB_SPEED_FULL, true);
1186 dev_err(dev, "%s:%d Error!\n", __func__, __LINE__);
1190 ret = set_ep_max_packet_size_bint(dev, uac2_opts, &fs_epout_desc,
1191 USB_SPEED_FULL, false);
1193 dev_err(dev, "%s:%d Error!\n", __func__, __LINE__);
1197 ret = set_ep_max_packet_size_bint(dev, uac2_opts, &hs_epin_desc,
1198 USB_SPEED_HIGH, true);
1200 dev_err(dev, "%s:%d Error!\n", __func__, __LINE__);
1204 ret = set_ep_max_packet_size_bint(dev, uac2_opts, &hs_epout_desc,
1205 USB_SPEED_HIGH, false);
1207 dev_err(dev, "%s:%d Error!\n", __func__, __LINE__);
1211 ret = set_ep_max_packet_size_bint(dev, uac2_opts, &ss_epin_desc,
1212 USB_SPEED_SUPER, true);
1214 dev_err(dev, "%s:%d Error!\n", __func__, __LINE__);
1218 ret = set_ep_max_packet_size_bint(dev, uac2_opts, &ss_epout_desc,
1219 USB_SPEED_SUPER, false);
1221 dev_err(dev, "%s:%d Error!\n", __func__, __LINE__);
1225 if (EPOUT_EN(uac2_opts)) {
1226 agdev->out_ep = usb_ep_autoconfig(gadget, &fs_epout_desc);
1227 if (!agdev->out_ep) {
1228 dev_err(dev, "%s:%d Error!\n", __func__, __LINE__);
1232 if (EPOUT_FBACK_IN_EN(uac2_opts)) {
1233 agdev->in_ep_fback = usb_ep_autoconfig(gadget,
1234 &fs_epin_fback_desc);
1235 if (!agdev->in_ep_fback) {
1236 dev_err(dev, "%s:%d Error!\n",
1237 __func__, __LINE__);
1244 if (EPIN_EN(uac2_opts)) {
1245 agdev->in_ep = usb_ep_autoconfig(gadget, &fs_epin_desc);
1246 if (!agdev->in_ep) {
1247 dev_err(dev, "%s:%d Error!\n", __func__, __LINE__);
1253 agdev->in_ep_maxpsize = max_t(u16,
1254 le16_to_cpu(fs_epin_desc.wMaxPacketSize),
1255 le16_to_cpu(hs_epin_desc.wMaxPacketSize));
1256 agdev->out_ep_maxpsize = max_t(u16,
1257 le16_to_cpu(fs_epout_desc.wMaxPacketSize),
1258 le16_to_cpu(hs_epout_desc.wMaxPacketSize));
1260 agdev->in_ep_maxpsize = max_t(u16, agdev->in_ep_maxpsize,
1261 le16_to_cpu(ss_epin_desc.wMaxPacketSize));
1262 agdev->out_ep_maxpsize = max_t(u16, agdev->out_ep_maxpsize,
1263 le16_to_cpu(ss_epout_desc.wMaxPacketSize));
1265 ss_epin_desc_comp.wBytesPerInterval = ss_epin_desc.wMaxPacketSize;
1266 ss_epout_desc_comp.wBytesPerInterval = ss_epout_desc.wMaxPacketSize;
1268 // HS and SS endpoint addresses are copied from autoconfigured FS descriptors
1269 hs_ep_int_desc.bEndpointAddress = fs_ep_int_desc.bEndpointAddress;
1270 hs_epout_desc.bEndpointAddress = fs_epout_desc.bEndpointAddress;
1271 hs_epin_fback_desc.bEndpointAddress = fs_epin_fback_desc.bEndpointAddress;
1272 hs_epin_desc.bEndpointAddress = fs_epin_desc.bEndpointAddress;
1273 ss_epout_desc.bEndpointAddress = fs_epout_desc.bEndpointAddress;
1274 ss_epin_fback_desc.bEndpointAddress = fs_epin_fback_desc.bEndpointAddress;
1275 ss_epin_desc.bEndpointAddress = fs_epin_desc.bEndpointAddress;
1276 ss_ep_int_desc.bEndpointAddress = fs_ep_int_desc.bEndpointAddress;
1278 setup_descriptor(uac2_opts);
1280 ret = usb_assign_descriptors(fn, fs_audio_desc, hs_audio_desc, ss_audio_desc,
1285 agdev->gadget = gadget;
1287 agdev->params.p_chmask = uac2_opts->p_chmask;
1288 memcpy(agdev->params.p_srates, uac2_opts->p_srates,
1289 sizeof(agdev->params.p_srates));
1290 agdev->params.p_ssize = uac2_opts->p_ssize;
1291 if (FUIN_EN(uac2_opts)) {
1292 agdev->params.p_fu.id = USB_IN_FU_ID;
1293 agdev->params.p_fu.mute_present = uac2_opts->p_mute_present;
1294 agdev->params.p_fu.volume_present = uac2_opts->p_volume_present;
1295 agdev->params.p_fu.volume_min = uac2_opts->p_volume_min;
1296 agdev->params.p_fu.volume_max = uac2_opts->p_volume_max;
1297 agdev->params.p_fu.volume_res = uac2_opts->p_volume_res;
1299 agdev->params.c_chmask = uac2_opts->c_chmask;
1300 memcpy(agdev->params.c_srates, uac2_opts->c_srates,
1301 sizeof(agdev->params.c_srates));
1302 agdev->params.c_ssize = uac2_opts->c_ssize;
1303 if (FUOUT_EN(uac2_opts)) {
1304 agdev->params.c_fu.id = USB_OUT_FU_ID;
1305 agdev->params.c_fu.mute_present = uac2_opts->c_mute_present;
1306 agdev->params.c_fu.volume_present = uac2_opts->c_volume_present;
1307 agdev->params.c_fu.volume_min = uac2_opts->c_volume_min;
1308 agdev->params.c_fu.volume_max = uac2_opts->c_volume_max;
1309 agdev->params.c_fu.volume_res = uac2_opts->c_volume_res;
1311 agdev->params.req_number = uac2_opts->req_number;
1312 agdev->params.fb_max = uac2_opts->fb_max;
1314 if (FUOUT_EN(uac2_opts) || FUIN_EN(uac2_opts))
1315 agdev->notify = afunc_notify;
1317 ret = g_audio_setup(agdev, "UAC2 PCM", "UAC2_Gadget");
1319 goto err_free_descs;
1324 usb_free_all_descriptors(fn);
1325 agdev->gadget = NULL;
1327 kfree(out_feature_unit_desc);
1328 out_feature_unit_desc = NULL;
1329 kfree(in_feature_unit_desc);
1330 in_feature_unit_desc = NULL;
1335 afunc_notify_complete(struct usb_ep *_ep, struct usb_request *req)
1337 struct g_audio *agdev = req->context;
1338 struct f_uac2 *uac2 = func_to_uac2(&agdev->func);
1340 atomic_dec(&uac2->int_count);
1342 usb_ep_free_request(_ep, req);
1346 afunc_notify(struct g_audio *agdev, int unit_id, int cs)
1348 struct f_uac2 *uac2 = func_to_uac2(&agdev->func);
1349 struct usb_request *req;
1350 struct uac2_interrupt_data_msg *msg;
1351 u16 w_index, w_value;
1354 if (!uac2->int_ep->enabled)
1357 if (atomic_inc_return(&uac2->int_count) > UAC2_DEF_INT_REQ_NUM) {
1358 atomic_dec(&uac2->int_count);
1362 req = usb_ep_alloc_request(uac2->int_ep, GFP_ATOMIC);
1365 goto err_dec_int_count;
1368 msg = kzalloc(sizeof(*msg), GFP_ATOMIC);
1371 goto err_free_request;
1374 w_index = unit_id << 8 | uac2->ac_intf;
1377 msg->bInfo = 0; /* Non-vendor, interface interrupt */
1378 msg->bAttribute = UAC2_CS_CUR;
1379 msg->wIndex = cpu_to_le16(w_index);
1380 msg->wValue = cpu_to_le16(w_value);
1382 req->length = sizeof(*msg);
1384 req->context = agdev;
1385 req->complete = afunc_notify_complete;
1387 ret = usb_ep_queue(uac2->int_ep, req, GFP_ATOMIC);
1397 usb_ep_free_request(uac2->int_ep, req);
1399 atomic_dec(&uac2->int_count);
1405 afunc_set_alt(struct usb_function *fn, unsigned intf, unsigned alt)
1407 struct usb_composite_dev *cdev = fn->config->cdev;
1408 struct f_uac2 *uac2 = func_to_uac2(fn);
1409 struct g_audio *agdev = func_to_g_audio(fn);
1410 struct usb_gadget *gadget = cdev->gadget;
1411 struct device *dev = &gadget->dev;
1414 /* No i/f has more than 2 alt settings */
1416 dev_err(dev, "%s:%d Error!\n", __func__, __LINE__);
1420 if (intf == uac2->ac_intf) {
1421 /* Control I/f has only 1 AltSetting - 0 */
1423 dev_err(dev, "%s:%d Error!\n", __func__, __LINE__);
1427 /* restart interrupt endpoint */
1429 usb_ep_disable(uac2->int_ep);
1430 config_ep_by_speed(gadget, &agdev->func, uac2->int_ep);
1431 usb_ep_enable(uac2->int_ep);
1437 if (intf == uac2->as_out_intf) {
1438 uac2->as_out_alt = alt;
1441 ret = u_audio_start_capture(&uac2->g_audio);
1443 u_audio_stop_capture(&uac2->g_audio);
1444 } else if (intf == uac2->as_in_intf) {
1445 uac2->as_in_alt = alt;
1448 ret = u_audio_start_playback(&uac2->g_audio);
1450 u_audio_stop_playback(&uac2->g_audio);
1452 dev_err(dev, "%s:%d Error!\n", __func__, __LINE__);
1460 afunc_get_alt(struct usb_function *fn, unsigned intf)
1462 struct f_uac2 *uac2 = func_to_uac2(fn);
1463 struct g_audio *agdev = func_to_g_audio(fn);
1465 if (intf == uac2->ac_intf)
1466 return uac2->ac_alt;
1467 else if (intf == uac2->as_out_intf)
1468 return uac2->as_out_alt;
1469 else if (intf == uac2->as_in_intf)
1470 return uac2->as_in_alt;
1472 dev_err(&agdev->gadget->dev,
1473 "%s:%d Invalid Interface %d!\n",
1474 __func__, __LINE__, intf);
1480 afunc_disable(struct usb_function *fn)
1482 struct f_uac2 *uac2 = func_to_uac2(fn);
1484 uac2->as_in_alt = 0;
1485 uac2->as_out_alt = 0;
1486 u_audio_stop_capture(&uac2->g_audio);
1487 u_audio_stop_playback(&uac2->g_audio);
1489 usb_ep_disable(uac2->int_ep);
1493 afunc_suspend(struct usb_function *fn)
1495 struct f_uac2 *uac2 = func_to_uac2(fn);
1497 u_audio_suspend(&uac2->g_audio);
1501 in_rq_cur(struct usb_function *fn, const struct usb_ctrlrequest *cr)
1503 struct usb_request *req = fn->config->cdev->req;
1504 struct g_audio *agdev = func_to_g_audio(fn);
1505 struct f_uac2_opts *opts = g_audio_to_uac2_opts(agdev);
1506 u16 w_length = le16_to_cpu(cr->wLength);
1507 u16 w_index = le16_to_cpu(cr->wIndex);
1508 u16 w_value = le16_to_cpu(cr->wValue);
1509 u8 entity_id = (w_index >> 8) & 0xff;
1510 u8 control_selector = w_value >> 8;
1511 int value = -EOPNOTSUPP;
1512 u32 p_srate, c_srate;
1514 u_audio_get_playback_srate(agdev, &p_srate);
1515 u_audio_get_capture_srate(agdev, &c_srate);
1517 if ((entity_id == USB_IN_CLK_ID) || (entity_id == USB_OUT_CLK_ID)) {
1518 if (control_selector == UAC2_CS_CONTROL_SAM_FREQ) {
1519 struct cntrl_cur_lay3 c;
1521 memset(&c, 0, sizeof(struct cntrl_cur_lay3));
1523 if (entity_id == USB_IN_CLK_ID)
1524 c.dCUR = cpu_to_le32(p_srate);
1525 else if (entity_id == USB_OUT_CLK_ID)
1526 c.dCUR = cpu_to_le32(c_srate);
1528 value = min_t(unsigned int, w_length, sizeof(c));
1529 memcpy(req->buf, &c, value);
1530 } else if (control_selector == UAC2_CS_CONTROL_CLOCK_VALID) {
1531 *(u8 *)req->buf = 1;
1532 value = min_t(unsigned int, w_length, 1);
1534 dev_err(&agdev->gadget->dev,
1535 "%s:%d control_selector=%d TODO!\n",
1536 __func__, __LINE__, control_selector);
1538 } else if ((FUIN_EN(opts) && (entity_id == USB_IN_FU_ID)) ||
1539 (FUOUT_EN(opts) && (entity_id == USB_OUT_FU_ID))) {
1540 unsigned int is_playback = 0;
1542 if (FUIN_EN(opts) && (entity_id == USB_IN_FU_ID))
1545 if (control_selector == UAC_FU_MUTE) {
1548 u_audio_get_mute(agdev, is_playback, &mute);
1550 *(u8 *)req->buf = mute;
1551 value = min_t(unsigned int, w_length, 1);
1552 } else if (control_selector == UAC_FU_VOLUME) {
1553 struct cntrl_cur_lay2 c;
1556 memset(&c, 0, sizeof(struct cntrl_cur_lay2));
1558 u_audio_get_volume(agdev, is_playback, &volume);
1559 c.wCUR = cpu_to_le16(volume);
1561 value = min_t(unsigned int, w_length, sizeof(c));
1562 memcpy(req->buf, &c, value);
1564 dev_err(&agdev->gadget->dev,
1565 "%s:%d control_selector=%d TODO!\n",
1566 __func__, __LINE__, control_selector);
1569 dev_err(&agdev->gadget->dev,
1570 "%s:%d entity_id=%d control_selector=%d TODO!\n",
1571 __func__, __LINE__, entity_id, control_selector);
1578 in_rq_range(struct usb_function *fn, const struct usb_ctrlrequest *cr)
1580 struct usb_request *req = fn->config->cdev->req;
1581 struct g_audio *agdev = func_to_g_audio(fn);
1582 struct f_uac2_opts *opts = g_audio_to_uac2_opts(agdev);
1583 u16 w_length = le16_to_cpu(cr->wLength);
1584 u16 w_index = le16_to_cpu(cr->wIndex);
1585 u16 w_value = le16_to_cpu(cr->wValue);
1586 u8 entity_id = (w_index >> 8) & 0xff;
1587 u8 control_selector = w_value >> 8;
1588 int value = -EOPNOTSUPP;
1590 if ((entity_id == USB_IN_CLK_ID) || (entity_id == USB_OUT_CLK_ID)) {
1591 if (control_selector == UAC2_CS_CONTROL_SAM_FREQ) {
1592 struct cntrl_ranges_lay3_srates rs;
1594 int wNumSubRanges = 0;
1598 if (entity_id == USB_IN_CLK_ID)
1599 srates = opts->p_srates;
1600 else if (entity_id == USB_OUT_CLK_ID)
1601 srates = opts->c_srates;
1604 for (i = 0; i < UAC_MAX_RATES; i++) {
1609 rs.r[wNumSubRanges].dMIN = cpu_to_le32(srate);
1610 rs.r[wNumSubRanges].dMAX = cpu_to_le32(srate);
1611 rs.r[wNumSubRanges].dRES = 0;
1613 dev_dbg(&agdev->gadget->dev,
1614 "%s(): clk %d: rate ID %d: %d\n",
1615 __func__, entity_id, wNumSubRanges, srate);
1617 rs.wNumSubRanges = cpu_to_le16(wNumSubRanges);
1618 value = min_t(unsigned int, w_length, ranges_lay3_size(rs));
1619 dev_dbg(&agdev->gadget->dev, "%s(): sending %d rates, size %d\n",
1620 __func__, rs.wNumSubRanges, value);
1621 memcpy(req->buf, &rs, value);
1623 dev_err(&agdev->gadget->dev,
1624 "%s:%d control_selector=%d TODO!\n",
1625 __func__, __LINE__, control_selector);
1627 } else if ((FUIN_EN(opts) && (entity_id == USB_IN_FU_ID)) ||
1628 (FUOUT_EN(opts) && (entity_id == USB_OUT_FU_ID))) {
1629 unsigned int is_playback = 0;
1631 if (FUIN_EN(opts) && (entity_id == USB_IN_FU_ID))
1634 if (control_selector == UAC_FU_VOLUME) {
1635 struct cntrl_range_lay2 r;
1636 s16 max_db, min_db, res_db;
1639 max_db = opts->p_volume_max;
1640 min_db = opts->p_volume_min;
1641 res_db = opts->p_volume_res;
1643 max_db = opts->c_volume_max;
1644 min_db = opts->c_volume_min;
1645 res_db = opts->c_volume_res;
1648 r.wMAX = cpu_to_le16(max_db);
1649 r.wMIN = cpu_to_le16(min_db);
1650 r.wRES = cpu_to_le16(res_db);
1651 r.wNumSubRanges = cpu_to_le16(1);
1653 value = min_t(unsigned int, w_length, sizeof(r));
1654 memcpy(req->buf, &r, value);
1656 dev_err(&agdev->gadget->dev,
1657 "%s:%d control_selector=%d TODO!\n",
1658 __func__, __LINE__, control_selector);
1661 dev_err(&agdev->gadget->dev,
1662 "%s:%d entity_id=%d control_selector=%d TODO!\n",
1663 __func__, __LINE__, entity_id, control_selector);
1670 ac_rq_in(struct usb_function *fn, const struct usb_ctrlrequest *cr)
1672 if (cr->bRequest == UAC2_CS_CUR)
1673 return in_rq_cur(fn, cr);
1674 else if (cr->bRequest == UAC2_CS_RANGE)
1675 return in_rq_range(fn, cr);
1680 static void uac2_cs_control_sam_freq(struct usb_ep *ep, struct usb_request *req)
1682 struct usb_function *fn = ep->driver_data;
1683 struct g_audio *agdev = func_to_g_audio(fn);
1684 struct f_uac2 *uac2 = func_to_uac2(fn);
1687 if (req->actual != 4)
1690 val = le32_to_cpu(*((__le32 *)req->buf));
1691 dev_dbg(&agdev->gadget->dev, "%s val: %d.\n", __func__, val);
1692 if (uac2->clock_id == USB_IN_CLK_ID) {
1693 u_audio_set_playback_srate(agdev, val);
1694 } else if (uac2->clock_id == USB_OUT_CLK_ID) {
1695 u_audio_set_capture_srate(agdev, val);
1700 out_rq_cur_complete(struct usb_ep *ep, struct usb_request *req)
1702 struct g_audio *agdev = req->context;
1703 struct usb_composite_dev *cdev = agdev->func.config->cdev;
1704 struct f_uac2_opts *opts = g_audio_to_uac2_opts(agdev);
1705 struct f_uac2 *uac2 = func_to_uac2(&agdev->func);
1706 struct usb_ctrlrequest *cr = &uac2->setup_cr;
1707 u16 w_index = le16_to_cpu(cr->wIndex);
1708 u16 w_value = le16_to_cpu(cr->wValue);
1709 u8 entity_id = (w_index >> 8) & 0xff;
1710 u8 control_selector = w_value >> 8;
1712 if (req->status != 0) {
1713 dev_dbg(&cdev->gadget->dev, "completion err %d\n", req->status);
1717 if ((FUIN_EN(opts) && (entity_id == USB_IN_FU_ID)) ||
1718 (FUOUT_EN(opts) && (entity_id == USB_OUT_FU_ID))) {
1719 unsigned int is_playback = 0;
1721 if (FUIN_EN(opts) && (entity_id == USB_IN_FU_ID))
1724 if (control_selector == UAC_FU_MUTE) {
1725 u8 mute = *(u8 *)req->buf;
1727 u_audio_set_mute(agdev, is_playback, mute);
1730 } else if (control_selector == UAC_FU_VOLUME) {
1731 struct cntrl_cur_lay2 *c = req->buf;
1734 volume = le16_to_cpu(c->wCUR);
1735 u_audio_set_volume(agdev, is_playback, volume);
1739 dev_err(&agdev->gadget->dev,
1740 "%s:%d control_selector=%d TODO!\n",
1741 __func__, __LINE__, control_selector);
1742 usb_ep_set_halt(ep);
1748 out_rq_cur(struct usb_function *fn, const struct usb_ctrlrequest *cr)
1750 struct usb_composite_dev *cdev = fn->config->cdev;
1751 struct usb_request *req = fn->config->cdev->req;
1752 struct g_audio *agdev = func_to_g_audio(fn);
1753 struct f_uac2_opts *opts = g_audio_to_uac2_opts(agdev);
1754 struct f_uac2 *uac2 = func_to_uac2(fn);
1755 u16 w_length = le16_to_cpu(cr->wLength);
1756 u16 w_index = le16_to_cpu(cr->wIndex);
1757 u16 w_value = le16_to_cpu(cr->wValue);
1758 u8 entity_id = (w_index >> 8) & 0xff;
1759 u8 control_selector = w_value >> 8;
1760 u8 clock_id = w_index >> 8;
1762 if ((entity_id == USB_IN_CLK_ID) || (entity_id == USB_OUT_CLK_ID)) {
1763 if (control_selector == UAC2_CS_CONTROL_SAM_FREQ) {
1764 dev_dbg(&agdev->gadget->dev,
1765 "control_selector UAC2_CS_CONTROL_SAM_FREQ, clock: %d\n", clock_id);
1766 cdev->gadget->ep0->driver_data = fn;
1767 uac2->clock_id = clock_id;
1768 req->complete = uac2_cs_control_sam_freq;
1771 } else if ((FUIN_EN(opts) && (entity_id == USB_IN_FU_ID)) ||
1772 (FUOUT_EN(opts) && (entity_id == USB_OUT_FU_ID))) {
1773 memcpy(&uac2->setup_cr, cr, sizeof(*cr));
1774 req->context = agdev;
1775 req->complete = out_rq_cur_complete;
1779 dev_err(&agdev->gadget->dev,
1780 "%s:%d entity_id=%d control_selector=%d TODO!\n",
1781 __func__, __LINE__, entity_id, control_selector);
1787 setup_rq_inf(struct usb_function *fn, const struct usb_ctrlrequest *cr)
1789 struct f_uac2 *uac2 = func_to_uac2(fn);
1790 struct g_audio *agdev = func_to_g_audio(fn);
1791 u16 w_index = le16_to_cpu(cr->wIndex);
1792 u8 intf = w_index & 0xff;
1794 if (intf != uac2->ac_intf) {
1795 dev_err(&agdev->gadget->dev,
1796 "%s:%d Error!\n", __func__, __LINE__);
1800 if (cr->bRequestType & USB_DIR_IN)
1801 return ac_rq_in(fn, cr);
1802 else if (cr->bRequest == UAC2_CS_CUR)
1803 return out_rq_cur(fn, cr);
1809 afunc_setup(struct usb_function *fn, const struct usb_ctrlrequest *cr)
1811 struct usb_composite_dev *cdev = fn->config->cdev;
1812 struct g_audio *agdev = func_to_g_audio(fn);
1813 struct usb_request *req = cdev->req;
1814 u16 w_length = le16_to_cpu(cr->wLength);
1815 int value = -EOPNOTSUPP;
1817 /* Only Class specific requests are supposed to reach here */
1818 if ((cr->bRequestType & USB_TYPE_MASK) != USB_TYPE_CLASS)
1821 if ((cr->bRequestType & USB_RECIP_MASK) == USB_RECIP_INTERFACE)
1822 value = setup_rq_inf(fn, cr);
1824 dev_err(&agdev->gadget->dev, "%s:%d Error!\n",
1825 __func__, __LINE__);
1828 req->length = value;
1829 req->zero = value < w_length;
1830 value = usb_ep_queue(cdev->gadget->ep0, req, GFP_ATOMIC);
1832 dev_err(&agdev->gadget->dev,
1833 "%s:%d Error!\n", __func__, __LINE__);
1841 static inline struct f_uac2_opts *to_f_uac2_opts(struct config_item *item)
1843 return container_of(to_config_group(item), struct f_uac2_opts,
1847 static void f_uac2_attr_release(struct config_item *item)
1849 struct f_uac2_opts *opts = to_f_uac2_opts(item);
1851 usb_put_function_instance(&opts->func_inst);
1854 static struct configfs_item_operations f_uac2_item_ops = {
1855 .release = f_uac2_attr_release,
1858 #define uac2_kstrtou8 kstrtou8
1859 #define uac2_kstrtou32 kstrtou32
1860 #define uac2_kstrtos16 kstrtos16
1861 #define uac2_kstrtobool(s, base, res) kstrtobool((s), (res))
1863 static const char *u8_fmt = "%u\n";
1864 static const char *u32_fmt = "%u\n";
1865 static const char *s16_fmt = "%hd\n";
1866 static const char *bool_fmt = "%u\n";
1868 #define UAC2_ATTRIBUTE(type, name) \
1869 static ssize_t f_uac2_opts_##name##_show(struct config_item *item, \
1872 struct f_uac2_opts *opts = to_f_uac2_opts(item); \
1875 mutex_lock(&opts->lock); \
1876 result = sprintf(page, type##_fmt, opts->name); \
1877 mutex_unlock(&opts->lock); \
1882 static ssize_t f_uac2_opts_##name##_store(struct config_item *item, \
1883 const char *page, size_t len) \
1885 struct f_uac2_opts *opts = to_f_uac2_opts(item); \
1889 mutex_lock(&opts->lock); \
1890 if (opts->refcnt) { \
1895 ret = uac2_kstrto##type(page, 0, &num); \
1903 mutex_unlock(&opts->lock); \
1907 CONFIGFS_ATTR(f_uac2_opts_, name)
1909 #define UAC2_ATTRIBUTE_SYNC(name) \
1910 static ssize_t f_uac2_opts_##name##_show(struct config_item *item, \
1913 struct f_uac2_opts *opts = to_f_uac2_opts(item); \
1917 mutex_lock(&opts->lock); \
1918 switch (opts->name) { \
1919 case USB_ENDPOINT_SYNC_ASYNC: \
1922 case USB_ENDPOINT_SYNC_ADAPTIVE: \
1929 result = sprintf(page, "%s\n", str); \
1930 mutex_unlock(&opts->lock); \
1935 static ssize_t f_uac2_opts_##name##_store(struct config_item *item, \
1936 const char *page, size_t len) \
1938 struct f_uac2_opts *opts = to_f_uac2_opts(item); \
1941 mutex_lock(&opts->lock); \
1942 if (opts->refcnt) { \
1947 if (!strncmp(page, "async", 5)) \
1948 opts->name = USB_ENDPOINT_SYNC_ASYNC; \
1949 else if (!strncmp(page, "adaptive", 8)) \
1950 opts->name = USB_ENDPOINT_SYNC_ADAPTIVE; \
1959 mutex_unlock(&opts->lock); \
1963 CONFIGFS_ATTR(f_uac2_opts_, name)
1965 #define UAC2_RATE_ATTRIBUTE(name) \
1966 static ssize_t f_uac2_opts_##name##_show(struct config_item *item, \
1969 struct f_uac2_opts *opts = to_f_uac2_opts(item); \
1973 mutex_lock(&opts->lock); \
1975 for (i = 0; i < UAC_MAX_RATES; i++) { \
1976 if (opts->name##s[i] == 0) \
1978 result += sprintf(page + strlen(page), "%u,", \
1979 opts->name##s[i]); \
1981 if (strlen(page) > 0) \
1982 page[strlen(page) - 1] = '\n'; \
1983 mutex_unlock(&opts->lock); \
1988 static ssize_t f_uac2_opts_##name##_store(struct config_item *item, \
1989 const char *page, size_t len) \
1991 struct f_uac2_opts *opts = to_f_uac2_opts(item); \
1992 char *split_page = NULL; \
1993 int ret = -EINVAL; \
1998 mutex_lock(&opts->lock); \
1999 if (opts->refcnt) { \
2005 memset(opts->name##s, 0x00, sizeof(opts->name##s)); \
2006 split_page = kstrdup(page, GFP_KERNEL); \
2007 while ((token = strsep(&split_page, ",")) != NULL) { \
2008 ret = kstrtou32(token, 0, &num); \
2012 opts->name##s[i++] = num; \
2017 kfree(split_page); \
2018 mutex_unlock(&opts->lock); \
2022 CONFIGFS_ATTR(f_uac2_opts_, name)
2024 #define UAC2_ATTRIBUTE_STRING(name) \
2025 static ssize_t f_uac2_opts_##name##_show(struct config_item *item, \
2028 struct f_uac2_opts *opts = to_f_uac2_opts(item); \
2031 mutex_lock(&opts->lock); \
2032 result = snprintf(page, sizeof(opts->name), "%s", opts->name); \
2033 mutex_unlock(&opts->lock); \
2038 static ssize_t f_uac2_opts_##name##_store(struct config_item *item, \
2039 const char *page, size_t len) \
2041 struct f_uac2_opts *opts = to_f_uac2_opts(item); \
2044 mutex_lock(&opts->lock); \
2045 if (opts->refcnt) { \
2050 ret = snprintf(opts->name, min(sizeof(opts->name), len), \
2054 mutex_unlock(&opts->lock); \
2058 CONFIGFS_ATTR(f_uac2_opts_, name)
2060 UAC2_ATTRIBUTE(u32, p_chmask);
2061 UAC2_RATE_ATTRIBUTE(p_srate);
2062 UAC2_ATTRIBUTE(u32, p_ssize);
2063 UAC2_ATTRIBUTE(u8, p_hs_bint);
2064 UAC2_ATTRIBUTE(u32, c_chmask);
2065 UAC2_RATE_ATTRIBUTE(c_srate);
2066 UAC2_ATTRIBUTE_SYNC(c_sync);
2067 UAC2_ATTRIBUTE(u32, c_ssize);
2068 UAC2_ATTRIBUTE(u8, c_hs_bint);
2069 UAC2_ATTRIBUTE(u32, req_number);
2071 UAC2_ATTRIBUTE(bool, p_mute_present);
2072 UAC2_ATTRIBUTE(bool, p_volume_present);
2073 UAC2_ATTRIBUTE(s16, p_volume_min);
2074 UAC2_ATTRIBUTE(s16, p_volume_max);
2075 UAC2_ATTRIBUTE(s16, p_volume_res);
2077 UAC2_ATTRIBUTE(bool, c_mute_present);
2078 UAC2_ATTRIBUTE(bool, c_volume_present);
2079 UAC2_ATTRIBUTE(s16, c_volume_min);
2080 UAC2_ATTRIBUTE(s16, c_volume_max);
2081 UAC2_ATTRIBUTE(s16, c_volume_res);
2082 UAC2_ATTRIBUTE(u32, fb_max);
2083 UAC2_ATTRIBUTE_STRING(function_name);
2085 static struct configfs_attribute *f_uac2_attrs[] = {
2086 &f_uac2_opts_attr_p_chmask,
2087 &f_uac2_opts_attr_p_srate,
2088 &f_uac2_opts_attr_p_ssize,
2089 &f_uac2_opts_attr_p_hs_bint,
2090 &f_uac2_opts_attr_c_chmask,
2091 &f_uac2_opts_attr_c_srate,
2092 &f_uac2_opts_attr_c_ssize,
2093 &f_uac2_opts_attr_c_hs_bint,
2094 &f_uac2_opts_attr_c_sync,
2095 &f_uac2_opts_attr_req_number,
2096 &f_uac2_opts_attr_fb_max,
2098 &f_uac2_opts_attr_p_mute_present,
2099 &f_uac2_opts_attr_p_volume_present,
2100 &f_uac2_opts_attr_p_volume_min,
2101 &f_uac2_opts_attr_p_volume_max,
2102 &f_uac2_opts_attr_p_volume_res,
2104 &f_uac2_opts_attr_c_mute_present,
2105 &f_uac2_opts_attr_c_volume_present,
2106 &f_uac2_opts_attr_c_volume_min,
2107 &f_uac2_opts_attr_c_volume_max,
2108 &f_uac2_opts_attr_c_volume_res,
2110 &f_uac2_opts_attr_function_name,
2115 static const struct config_item_type f_uac2_func_type = {
2116 .ct_item_ops = &f_uac2_item_ops,
2117 .ct_attrs = f_uac2_attrs,
2118 .ct_owner = THIS_MODULE,
2121 static void afunc_free_inst(struct usb_function_instance *f)
2123 struct f_uac2_opts *opts;
2125 opts = container_of(f, struct f_uac2_opts, func_inst);
2129 static struct usb_function_instance *afunc_alloc_inst(void)
2131 struct f_uac2_opts *opts;
2133 opts = kzalloc(sizeof(*opts), GFP_KERNEL);
2135 return ERR_PTR(-ENOMEM);
2137 mutex_init(&opts->lock);
2138 opts->func_inst.free_func_inst = afunc_free_inst;
2140 config_group_init_type_name(&opts->func_inst.group, "",
2143 opts->p_chmask = UAC2_DEF_PCHMASK;
2144 opts->p_srates[0] = UAC2_DEF_PSRATE;
2145 opts->p_ssize = UAC2_DEF_PSSIZE;
2146 opts->p_hs_bint = UAC2_DEF_PHSBINT;
2147 opts->c_chmask = UAC2_DEF_CCHMASK;
2148 opts->c_srates[0] = UAC2_DEF_CSRATE;
2149 opts->c_ssize = UAC2_DEF_CSSIZE;
2150 opts->c_hs_bint = UAC2_DEF_CHSBINT;
2151 opts->c_sync = UAC2_DEF_CSYNC;
2153 opts->p_mute_present = UAC2_DEF_MUTE_PRESENT;
2154 opts->p_volume_present = UAC2_DEF_VOLUME_PRESENT;
2155 opts->p_volume_min = UAC2_DEF_MIN_DB;
2156 opts->p_volume_max = UAC2_DEF_MAX_DB;
2157 opts->p_volume_res = UAC2_DEF_RES_DB;
2159 opts->c_mute_present = UAC2_DEF_MUTE_PRESENT;
2160 opts->c_volume_present = UAC2_DEF_VOLUME_PRESENT;
2161 opts->c_volume_min = UAC2_DEF_MIN_DB;
2162 opts->c_volume_max = UAC2_DEF_MAX_DB;
2163 opts->c_volume_res = UAC2_DEF_RES_DB;
2165 opts->req_number = UAC2_DEF_REQ_NUM;
2166 opts->fb_max = FBACK_FAST_MAX;
2168 snprintf(opts->function_name, sizeof(opts->function_name), "Source/Sink");
2170 return &opts->func_inst;
2173 static void afunc_free(struct usb_function *f)
2175 struct g_audio *agdev;
2176 struct f_uac2_opts *opts;
2178 agdev = func_to_g_audio(f);
2179 opts = container_of(f->fi, struct f_uac2_opts, func_inst);
2181 mutex_lock(&opts->lock);
2183 mutex_unlock(&opts->lock);
2186 static void afunc_unbind(struct usb_configuration *c, struct usb_function *f)
2188 struct g_audio *agdev = func_to_g_audio(f);
2190 g_audio_cleanup(agdev);
2191 usb_free_all_descriptors(f);
2193 agdev->gadget = NULL;
2195 kfree(out_feature_unit_desc);
2196 out_feature_unit_desc = NULL;
2197 kfree(in_feature_unit_desc);
2198 in_feature_unit_desc = NULL;
2201 static struct usb_function *afunc_alloc(struct usb_function_instance *fi)
2203 struct f_uac2 *uac2;
2204 struct f_uac2_opts *opts;
2206 uac2 = kzalloc(sizeof(*uac2), GFP_KERNEL);
2208 return ERR_PTR(-ENOMEM);
2210 opts = container_of(fi, struct f_uac2_opts, func_inst);
2211 mutex_lock(&opts->lock);
2213 mutex_unlock(&opts->lock);
2215 uac2->g_audio.func.name = "uac2_func";
2216 uac2->g_audio.func.bind = afunc_bind;
2217 uac2->g_audio.func.unbind = afunc_unbind;
2218 uac2->g_audio.func.set_alt = afunc_set_alt;
2219 uac2->g_audio.func.get_alt = afunc_get_alt;
2220 uac2->g_audio.func.disable = afunc_disable;
2221 uac2->g_audio.func.suspend = afunc_suspend;
2222 uac2->g_audio.func.setup = afunc_setup;
2223 uac2->g_audio.func.free_func = afunc_free;
2225 return &uac2->g_audio.func;
2228 DECLARE_USB_FUNCTION_INIT(uac2, afunc_alloc_inst, afunc_alloc);
2229 MODULE_LICENSE("GPL");
2230 MODULE_AUTHOR("Yadwinder Singh");
2231 MODULE_AUTHOR("Jaswinder Singh");
2232 MODULE_AUTHOR("Ruslan Bilovol");