]> Git Repo - J-linux.git/blob - drivers/usb/gadget/function/f_uac2.c
Merge 5.17-rc4 into usb-next
[J-linux.git] / drivers / usb / gadget / function / f_uac2.c
1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * f_uac2.c -- USB Audio Class 2.0 Function
4  *
5  * Copyright (C) 2011
6  *    Yadwinder Singh ([email protected])
7  *    Jaswinder Singh ([email protected])
8  *
9  * Copyright (C) 2020
10  *    Ruslan Bilovol ([email protected])
11  */
12
13 #include <linux/usb/audio.h>
14 #include <linux/usb/audio-v2.h>
15 #include <linux/module.h>
16
17 #include "u_audio.h"
18
19 #include "u_uac2.h"
20
21 /* UAC2 spec: 4.1 Audio Channel Cluster Descriptor */
22 #define UAC2_CHANNEL_MASK 0x07FFFFFF
23
24 /*
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
31  */
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)
36
37 #define CONTROL_ABSENT  0
38 #define CONTROL_RDONLY  1
39 #define CONTROL_RDWR    3
40
41 #define CLK_FREQ_CTRL   0
42 #define CLK_VLD_CTRL    2
43 #define FU_MUTE_CTRL    0
44 #define FU_VOL_CTRL     2
45
46 #define COPY_CTRL       0
47 #define CONN_CTRL       2
48 #define OVRLD_CTRL      4
49 #define CLSTR_CTRL      6
50 #define UNFLW_CTRL      8
51 #define OVFLW_CTRL      10
52
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)
62
63 struct f_uac2 {
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() */
67
68         struct usb_ctrlrequest setup_cr;        /* will be used in data stage */
69
70         /* Interrupt IN endpoint of AC interface */
71         struct usb_ep   *int_ep;
72         atomic_t        int_count;
73         /* transient state, only valid during handling of a single control request */
74         int clock_id;
75 };
76
77 static inline struct f_uac2 *func_to_uac2(struct usb_function *f)
78 {
79         return container_of(f, struct f_uac2, g_audio.func);
80 }
81
82 static inline
83 struct f_uac2_opts *g_audio_to_uac2_opts(struct g_audio *agdev)
84 {
85         return container_of(agdev->func.fi, struct f_uac2_opts, func_inst);
86 }
87
88 static int afunc_notify(struct g_audio *agdev, int unit_id, int cs);
89
90 /* --------- USB Function Interface ------------- */
91
92 enum {
93         STR_ASSOC,
94         STR_IF_CTRL,
95         STR_CLKSRC_IN,
96         STR_CLKSRC_OUT,
97         STR_USB_IT,
98         STR_IO_IT,
99         STR_USB_OT,
100         STR_IO_OT,
101         STR_FU_IN,
102         STR_FU_OUT,
103         STR_AS_OUT_ALT0,
104         STR_AS_OUT_ALT1,
105         STR_AS_IN_ALT0,
106         STR_AS_IN_ALT1,
107 };
108
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",
124         { },
125 };
126
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+",
135 };
136
137 static struct usb_gadget_strings str_fn = {
138         .language = 0x0409,     /* en-us */
139         .strings = strings_fn,
140 };
141
142 static struct usb_gadget_strings *fn_strings[] = {
143         &str_fn,
144         NULL,
145 };
146
147 static struct usb_interface_assoc_descriptor iad_desc = {
148         .bLength = sizeof iad_desc,
149         .bDescriptorType = USB_DT_INTERFACE_ASSOCIATION,
150
151         .bFirstInterface = 0,
152         .bInterfaceCount = 3,
153         .bFunctionClass = USB_CLASS_AUDIO,
154         .bFunctionSubClass = UAC2_FUNCTION_SUBCLASS_UNDEFINED,
155         .bFunctionProtocol = UAC_VERSION_2,
156 };
157
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,
162
163         .bAlternateSetting = 0,
164         /* .bNumEndpoints = DYNAMIC */
165         .bInterfaceClass = USB_CLASS_AUDIO,
166         .bInterfaceSubClass = USB_SUBCLASS_AUDIOCONTROL,
167         .bInterfaceProtocol = UAC_VERSION_2,
168 };
169
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,
174
175         .bDescriptorSubtype = UAC2_CLOCK_SOURCE,
176         /* .bClockID = DYNAMIC */
177         .bmAttributes = UAC_CLOCK_SOURCE_TYPE_INT_FIXED,
178         .bmControls = (CONTROL_RDWR << CLK_FREQ_CTRL),
179         .bAssocTerminal = 0,
180 };
181
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,
186
187         .bDescriptorSubtype = UAC2_CLOCK_SOURCE,
188         /* .bClockID = DYNAMIC */
189         .bmAttributes = UAC_CLOCK_SOURCE_TYPE_INT_FIXED,
190         .bmControls = (CONTROL_RDWR << CLK_FREQ_CTRL),
191         .bAssocTerminal = 0,
192 };
193
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,
198
199         .bDescriptorSubtype = UAC_INPUT_TERMINAL,
200         /* .bTerminalID = DYNAMIC */
201         .wTerminalType = cpu_to_le16(UAC_TERMINAL_STREAMING),
202         .bAssocTerminal = 0,
203         /* .bCSourceID = DYNAMIC */
204         .iChannelNames = 0,
205         .bmControls = cpu_to_le16(CONTROL_RDWR << COPY_CTRL),
206 };
207
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,
212
213         .bDescriptorSubtype = UAC_INPUT_TERMINAL,
214         /* .bTerminalID = DYNAMIC */
215         .wTerminalType = cpu_to_le16(UAC_INPUT_TERMINAL_MICROPHONE),
216         .bAssocTerminal = 0,
217         /* .bCSourceID = DYNAMIC */
218         .iChannelNames = 0,
219         .bmControls = cpu_to_le16(CONTROL_RDWR << COPY_CTRL),
220 };
221
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,
226
227         .bDescriptorSubtype = UAC_OUTPUT_TERMINAL,
228         /* .bTerminalID = DYNAMIC */
229         .wTerminalType = cpu_to_le16(UAC_TERMINAL_STREAMING),
230         .bAssocTerminal = 0,
231         /* .bSourceID = DYNAMIC */
232         /* .bCSourceID = DYNAMIC */
233         .bmControls = cpu_to_le16(CONTROL_RDWR << COPY_CTRL),
234 };
235
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,
240
241         .bDescriptorSubtype = UAC_OUTPUT_TERMINAL,
242         /* .bTerminalID = DYNAMIC */
243         .wTerminalType = cpu_to_le16(UAC_OUTPUT_TERMINAL_SPEAKER),
244         .bAssocTerminal = 0,
245         /* .bSourceID = DYNAMIC */
246         /* .bCSourceID = DYNAMIC */
247         .bmControls = cpu_to_le16(CONTROL_RDWR << COPY_CTRL),
248 };
249
250 static struct uac2_feature_unit_descriptor *in_feature_unit_desc;
251 static struct uac2_feature_unit_descriptor *out_feature_unit_desc;
252
253 static struct uac2_ac_header_descriptor ac_hdr_desc = {
254         .bLength = sizeof ac_hdr_desc,
255         .bDescriptorType = USB_DT_CS_INTERFACE,
256
257         .bDescriptorSubtype = UAC_MS_HEADER,
258         .bcdADC = cpu_to_le16(0x200),
259         .bCategory = UAC2_FUNCTION_IO_BOX,
260         /* .wTotalLength = DYNAMIC */
261         .bmControls = 0,
262 };
263
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,
268
269         .bEndpointAddress = USB_DIR_IN,
270         .bmAttributes = USB_ENDPOINT_XFER_INT,
271         .wMaxPacketSize = cpu_to_le16(6),
272         .bInterval = 1,
273 };
274
275 static struct usb_endpoint_descriptor hs_ep_int_desc = {
276         .bLength = USB_DT_ENDPOINT_SIZE,
277         .bDescriptorType = USB_DT_ENDPOINT,
278
279         .bmAttributes = USB_ENDPOINT_XFER_INT,
280         .wMaxPacketSize = cpu_to_le16(6),
281         .bInterval = 4,
282 };
283
284 static struct usb_endpoint_descriptor ss_ep_int_desc = {
285         .bLength = USB_DT_ENDPOINT_SIZE,
286         .bDescriptorType = USB_DT_ENDPOINT,
287
288         .bEndpointAddress = USB_DIR_IN,
289         .bmAttributes = USB_ENDPOINT_XFER_INT,
290         .wMaxPacketSize = cpu_to_le16(6),
291         .bInterval = 4,
292 };
293
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,
298
299         .bAlternateSetting = 0,
300         .bNumEndpoints = 0,
301         .bInterfaceClass = USB_CLASS_AUDIO,
302         .bInterfaceSubClass = USB_SUBCLASS_AUDIOSTREAMING,
303         .bInterfaceProtocol = UAC_VERSION_2,
304 };
305
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,
310
311         .bAlternateSetting = 1,
312         .bNumEndpoints = 1,
313         .bInterfaceClass = USB_CLASS_AUDIO,
314         .bInterfaceSubClass = USB_SUBCLASS_AUDIOSTREAMING,
315         .bInterfaceProtocol = UAC_VERSION_2,
316 };
317
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,
322
323         .bDescriptorSubtype = UAC_AS_GENERAL,
324         /* .bTerminalLink = DYNAMIC */
325         .bmControls = 0,
326         .bFormatType = UAC_FORMAT_TYPE_I,
327         .bmFormats = cpu_to_le32(UAC_FORMAT_TYPE_I_PCM),
328         .iChannelNames = 0,
329 };
330
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,
337 };
338
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,
343
344         .bEndpointAddress = USB_DIR_OUT,
345         /* .bmAttributes = DYNAMIC */
346         /* .wMaxPacketSize = DYNAMIC */
347         .bInterval = 1,
348 };
349
350 static struct usb_endpoint_descriptor hs_epout_desc = {
351         .bLength = USB_DT_ENDPOINT_SIZE,
352         .bDescriptorType = USB_DT_ENDPOINT,
353
354         /* .bmAttributes = DYNAMIC */
355         /* .wMaxPacketSize = DYNAMIC */
356         /* .bInterval = DYNAMIC */
357 };
358
359 static struct usb_endpoint_descriptor ss_epout_desc = {
360         .bLength = USB_DT_ENDPOINT_SIZE,
361         .bDescriptorType = USB_DT_ENDPOINT,
362
363         .bEndpointAddress = USB_DIR_OUT,
364         /* .bmAttributes = DYNAMIC */
365         /* .wMaxPacketSize = DYNAMIC */
366         /* .bInterval = DYNAMIC */
367 };
368
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,
372         .bMaxBurst              = 0,
373         .bmAttributes           = 0,
374         /* wBytesPerInterval = DYNAMIC */
375 };
376
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,
381
382         .bDescriptorSubtype = UAC_EP_GENERAL,
383         .bmAttributes = 0,
384         .bmControls = 0,
385         .bLockDelayUnits = 0,
386         .wLockDelay = 0,
387 };
388
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,
393
394         .bEndpointAddress = USB_DIR_IN,
395         .bmAttributes = USB_ENDPOINT_XFER_ISOC | USB_ENDPOINT_USAGE_FEEDBACK,
396         .wMaxPacketSize = cpu_to_le16(3),
397         .bInterval = 1,
398 };
399
400 static struct usb_endpoint_descriptor hs_epin_fback_desc = {
401         .bLength = USB_DT_ENDPOINT_SIZE,
402         .bDescriptorType = USB_DT_ENDPOINT,
403
404         .bmAttributes = USB_ENDPOINT_XFER_ISOC | USB_ENDPOINT_USAGE_FEEDBACK,
405         .wMaxPacketSize = cpu_to_le16(4),
406         .bInterval = 4,
407 };
408
409 static struct usb_endpoint_descriptor ss_epin_fback_desc = {
410         .bLength = USB_DT_ENDPOINT_SIZE,
411         .bDescriptorType = USB_DT_ENDPOINT,
412
413         .bEndpointAddress = USB_DIR_IN,
414         .bmAttributes = USB_ENDPOINT_XFER_ISOC | USB_ENDPOINT_USAGE_FEEDBACK,
415         .wMaxPacketSize = cpu_to_le16(4),
416         .bInterval = 4,
417 };
418
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,
422         .bMaxBurst              = 0,
423         .bmAttributes           = 0,
424         .wBytesPerInterval      = cpu_to_le16(4),
425 };
426
427
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,
432
433         .bAlternateSetting = 0,
434         .bNumEndpoints = 0,
435         .bInterfaceClass = USB_CLASS_AUDIO,
436         .bInterfaceSubClass = USB_SUBCLASS_AUDIOSTREAMING,
437         .bInterfaceProtocol = UAC_VERSION_2,
438 };
439
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,
444
445         .bAlternateSetting = 1,
446         .bNumEndpoints = 1,
447         .bInterfaceClass = USB_CLASS_AUDIO,
448         .bInterfaceSubClass = USB_SUBCLASS_AUDIOSTREAMING,
449         .bInterfaceProtocol = UAC_VERSION_2,
450 };
451
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,
456
457         .bDescriptorSubtype = UAC_AS_GENERAL,
458         /* .bTerminalLink = DYNAMIC */
459         .bmControls = 0,
460         .bFormatType = UAC_FORMAT_TYPE_I,
461         .bmFormats = cpu_to_le32(UAC_FORMAT_TYPE_I_PCM),
462         .iChannelNames = 0,
463 };
464
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,
471 };
472
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,
477
478         .bEndpointAddress = USB_DIR_IN,
479         .bmAttributes = USB_ENDPOINT_XFER_ISOC | USB_ENDPOINT_SYNC_ASYNC,
480         /* .wMaxPacketSize = DYNAMIC */
481         .bInterval = 1,
482 };
483
484 static struct usb_endpoint_descriptor hs_epin_desc = {
485         .bLength = USB_DT_ENDPOINT_SIZE,
486         .bDescriptorType = USB_DT_ENDPOINT,
487
488         .bmAttributes = USB_ENDPOINT_XFER_ISOC | USB_ENDPOINT_SYNC_ASYNC,
489         /* .wMaxPacketSize = DYNAMIC */
490         /* .bInterval = DYNAMIC */
491 };
492
493 static struct usb_endpoint_descriptor ss_epin_desc = {
494         .bLength = USB_DT_ENDPOINT_SIZE,
495         .bDescriptorType = USB_DT_ENDPOINT,
496
497         .bEndpointAddress = USB_DIR_IN,
498         .bmAttributes = USB_ENDPOINT_XFER_ISOC | USB_ENDPOINT_SYNC_ASYNC,
499         /* .wMaxPacketSize = DYNAMIC */
500         /* .bInterval = DYNAMIC */
501 };
502
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,
506         .bMaxBurst              = 0,
507         .bmAttributes           = 0,
508         /* wBytesPerInterval = DYNAMIC */
509 };
510
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,
515
516         .bDescriptorSubtype = UAC_EP_GENERAL,
517         .bmAttributes = 0,
518         .bmControls = 0,
519         .bLockDelayUnits = 0,
520         .wLockDelay = 0,
521 };
522
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,
526
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,
536
537         (struct usb_descriptor_header *)&fs_ep_int_desc,
538
539         (struct usb_descriptor_header *)&std_as_out_if0_desc,
540         (struct usb_descriptor_header *)&std_as_out_if1_desc,
541
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,
547
548         (struct usb_descriptor_header *)&std_as_in_if0_desc,
549         (struct usb_descriptor_header *)&std_as_in_if1_desc,
550
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,
555         NULL,
556 };
557
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,
561
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,
571
572         (struct usb_descriptor_header *)&hs_ep_int_desc,
573
574         (struct usb_descriptor_header *)&std_as_out_if0_desc,
575         (struct usb_descriptor_header *)&std_as_out_if1_desc,
576
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,
582
583         (struct usb_descriptor_header *)&std_as_in_if0_desc,
584         (struct usb_descriptor_header *)&std_as_in_if1_desc,
585
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,
590         NULL,
591 };
592
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,
596
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,
606
607   (struct usb_descriptor_header *)&ss_ep_int_desc,
608
609         (struct usb_descriptor_header *)&std_as_out_if0_desc,
610         (struct usb_descriptor_header *)&std_as_out_if1_desc,
611
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,
619
620         (struct usb_descriptor_header *)&std_as_in_if0_desc,
621         (struct usb_descriptor_header *)&std_as_in_if1_desc,
622
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,
628         NULL,
629 };
630
631 struct cntrl_cur_lay2 {
632         __le16  wCUR;
633 };
634
635 struct cntrl_range_lay2 {
636         __le16  wNumSubRanges;
637         __le16  wMIN;
638         __le16  wMAX;
639         __le16  wRES;
640 } __packed;
641
642 struct cntrl_cur_lay3 {
643         __le32  dCUR;
644 };
645
646 struct cntrl_subrange_lay3 {
647         __le32  dMIN;
648         __le32  dMAX;
649         __le32  dRES;
650 } __packed;
651
652 #define ranges_lay3_size(c) (sizeof(c.wNumSubRanges)    \
653                 + le16_to_cpu(c.wNumSubRanges)          \
654                 * sizeof(struct cntrl_subrange_lay3))
655
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];                \
660 } __packed
661
662 DECLARE_UAC2_CNTRL_RANGES_LAY3(srates, UAC_MAX_RATES);
663
664 static int get_max_srate(const int *srates)
665 {
666         int i, max_srate = 0;
667
668         for (i = 0; i < UAC_MAX_RATES; i++) {
669                 if (srates[i] == 0)
670                         break;
671                 if (srates[i] > max_srate)
672                         max_srate = srates[i];
673         }
674         return max_srate;
675 }
676
677 static int get_max_bw_for_bint(const struct f_uac2_opts *uac2_opts,
678         u8 bint, unsigned int factor, bool is_playback)
679 {
680         int chmask, srate, ssize;
681         u16 max_size_bw;
682
683         if (is_playback) {
684                 chmask = uac2_opts->p_chmask;
685                 srate = get_max_srate(uac2_opts->p_srates);
686                 ssize = uac2_opts->p_ssize;
687         } else {
688                 chmask = uac2_opts->c_chmask;
689                 srate = get_max_srate(uac2_opts->c_srates);
690                 ssize = uac2_opts->c_ssize;
691         }
692
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))));
700         } else {
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);
704         }
705         return max_size_bw;
706 }
707
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)
711 {
712         u16 max_size_bw, max_size_ep;
713         u8 bint, opts_bint;
714         char *dir;
715
716         switch (speed) {
717         case USB_SPEED_FULL:
718                 max_size_ep = 1023;
719                 // fixed
720                 bint = ep_desc->bInterval;
721                 max_size_bw = get_max_bw_for_bint(uac2_opts, bint, 1000, is_playback);
722                 break;
723
724         case USB_SPEED_HIGH:
725         case USB_SPEED_SUPER:
726                 max_size_ep = 1024;
727                 if (is_playback)
728                         opts_bint = uac2_opts->p_hs_bint;
729                 else
730                         opts_bint = uac2_opts->c_hs_bint;
731
732                 if (opts_bint > 0) {
733                         /* fixed bint */
734                         bint = opts_bint;
735                         max_size_bw = get_max_bw_for_bint(uac2_opts, bint, 8000, is_playback);
736                 } else {
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)
742                                         break;
743                         }
744                 }
745                 break;
746
747         default:
748                 return -EINVAL;
749         }
750
751         if (is_playback)
752                 dir = "Playback";
753         else
754                 dir = "Capture";
755
756         if (max_size_bw <= max_size_ep)
757                 dev_dbg(dev,
758                         "%s %s: Would use wMaxPacketSize %d and bInterval %d\n",
759                         speed_names[speed], dir, max_size_bw, bint);
760         else {
761                 dev_warn(dev,
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;
765         }
766
767         ep_desc->wMaxPacketSize = cpu_to_le16(max_size_bw);
768         ep_desc->bInterval = bint;
769
770         return 0;
771 }
772
773 static struct uac2_feature_unit_descriptor *build_fu_desc(int chmask)
774 {
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);
778
779         fu_desc = kzalloc(fu_desc_size, GFP_KERNEL);
780         if (!fu_desc)
781                 return NULL;
782
783         fu_desc->bLength = fu_desc_size;
784         fu_desc->bDescriptorType = USB_DT_CS_INTERFACE;
785
786         fu_desc->bDescriptorSubtype = UAC_FEATURE_UNIT;
787
788         /* bUnitID, bSourceID and bmaControls will be defined later */
789
790         return fu_desc;
791 }
792
793 /* Use macro to overcome line length limitation */
794 #define USBDHDR(p) (struct usb_descriptor_header *)(p)
795
796 static void setup_headers(struct f_uac2_opts *opts,
797                           struct usb_descriptor_header **headers,
798                           enum usb_device_speed speed)
799 {
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;
807         int i;
808
809         switch (speed) {
810         case USB_SPEED_FULL:
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;
815                 break;
816         case USB_SPEED_HIGH:
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;
821                 break;
822         default:
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;
830         }
831
832         i = 0;
833         headers[i++] = USBDHDR(&iad_desc);
834         headers[i++] = USBDHDR(&std_ac_if_desc);
835         headers[i++] = USBDHDR(&ac_hdr_desc);
836         if (EPIN_EN(opts))
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);
841
842                 if (FUOUT_EN(opts))
843                         headers[i++] = USBDHDR(out_feature_unit_desc);
844         }
845
846         if (EPIN_EN(opts)) {
847                 headers[i++] = USBDHDR(&io_in_it_desc);
848
849                 if (FUIN_EN(opts))
850                         headers[i++] = USBDHDR(in_feature_unit_desc);
851
852                 headers[i++] = USBDHDR(&usb_in_ot_desc);
853         }
854
855         if (EPOUT_EN(opts))
856                 headers[i++] = USBDHDR(&io_out_ot_desc);
857
858         if (FUOUT_EN(opts) || FUIN_EN(opts))
859                 headers[i++] = USBDHDR(ep_int_desc);
860
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);
867                 if (epout_desc_comp)
868                         headers[i++] = USBDHDR(epout_desc_comp);
869
870                 headers[i++] = USBDHDR(&as_iso_out_desc);
871
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);
876                 }
877         }
878
879         if (EPIN_EN(opts)) {
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);
885                 if (epin_desc_comp)
886                         headers[i++] = USBDHDR(epin_desc_comp);
887
888                 headers[i++] = USBDHDR(&as_iso_in_desc);
889         }
890         headers[i] = NULL;
891 }
892
893 static void setup_descriptor(struct f_uac2_opts *opts)
894 {
895         /* patch descriptors */
896         int i = 1; /* ID's start with 1 */
897
898         if (EPOUT_EN(opts))
899                 usb_out_it_desc.bTerminalID = i++;
900         if (EPIN_EN(opts))
901                 io_in_it_desc.bTerminalID = i++;
902         if (EPOUT_EN(opts))
903                 io_out_ot_desc.bTerminalID = i++;
904         if (EPIN_EN(opts))
905                 usb_in_ot_desc.bTerminalID = i++;
906         if (FUOUT_EN(opts))
907                 out_feature_unit_desc->bUnitID = i++;
908         if (FUIN_EN(opts))
909                 in_feature_unit_desc->bUnitID = i++;
910         if (EPOUT_EN(opts))
911                 out_clk_src_desc.bClockID = i++;
912         if (EPIN_EN(opts))
913                 in_clk_src_desc.bClockID = i++;
914
915         usb_out_it_desc.bCSourceID = out_clk_src_desc.bClockID;
916
917         if (FUIN_EN(opts)) {
918                 usb_in_ot_desc.bSourceID = in_feature_unit_desc->bUnitID;
919                 in_feature_unit_desc->bSourceID = io_in_it_desc.bTerminalID;
920         } else {
921                 usb_in_ot_desc.bSourceID = io_in_it_desc.bTerminalID;
922         }
923
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;
927
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;
931         } else {
932                 io_out_ot_desc.bSourceID = usb_out_it_desc.bTerminalID;
933         }
934
935         as_out_hdr_desc.bTerminalLink = usb_out_it_desc.bTerminalID;
936         as_in_hdr_desc.bTerminalLink = usb_in_ot_desc.bTerminalID;
937
938         iad_desc.bInterfaceCount = 1;
939         ac_hdr_desc.wTotalLength = cpu_to_le16(sizeof(ac_hdr_desc));
940
941         if (EPIN_EN(opts)) {
942                 u16 len = le16_to_cpu(ac_hdr_desc.wTotalLength);
943
944                 len += sizeof(in_clk_src_desc);
945                 len += sizeof(usb_in_ot_desc);
946
947                 if (FUIN_EN(opts))
948                         len += in_feature_unit_desc->bLength;
949
950                 len += sizeof(io_in_it_desc);
951                 ac_hdr_desc.wTotalLength = cpu_to_le16(len);
952                 iad_desc.bInterfaceCount++;
953         }
954         if (EPOUT_EN(opts)) {
955                 u16 len = le16_to_cpu(ac_hdr_desc.wTotalLength);
956
957                 len += sizeof(out_clk_src_desc);
958                 len += sizeof(usb_out_it_desc);
959
960                 if (FUOUT_EN(opts))
961                         len += out_feature_unit_desc->bLength;
962
963                 len += sizeof(io_out_ot_desc);
964                 ac_hdr_desc.wTotalLength = cpu_to_le16(len);
965                 iad_desc.bInterfaceCount++;
966         }
967
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);
971 }
972
973 static int afunc_validate_opts(struct g_audio *agdev, struct device *dev)
974 {
975         struct f_uac2_opts *opts = g_audio_to_uac2_opts(agdev);
976         const char *msg = NULL;
977
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";
992
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";
1001
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";
1006
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)";
1011
1012         if (msg) {
1013                 dev_err(dev, "Error: %s\n", msg);
1014                 return -EINVAL;
1015         }
1016
1017         return 0;
1018 }
1019
1020 static int
1021 afunc_bind(struct usb_configuration *cfg, struct usb_function *fn)
1022 {
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;
1030         int ret;
1031
1032         ret = afunc_validate_opts(agdev, dev);
1033         if (ret)
1034                 return ret;
1035
1036         strings_fn[STR_ASSOC].s = uac2_opts->function_name;
1037
1038         us = usb_gstrings_attach(cdev, fn_strings, ARRAY_SIZE(strings_fn));
1039         if (IS_ERR(us))
1040                 return PTR_ERR(us);
1041
1042         if (FUOUT_EN(uac2_opts)) {
1043                 out_feature_unit_desc = build_fu_desc(uac2_opts->c_chmask);
1044                 if (!out_feature_unit_desc)
1045                         return -ENOMEM;
1046         }
1047         if (FUIN_EN(uac2_opts)) {
1048                 in_feature_unit_desc = build_fu_desc(uac2_opts->p_chmask);
1049                 if (!in_feature_unit_desc) {
1050                         ret = -ENOMEM;
1051                         goto err_free_fu;
1052                 }
1053         }
1054
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;
1067
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;
1072         }
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;
1077         }
1078
1079
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];
1095                 u32 control = 0;
1096
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);
1102         }
1103         if (FUIN_EN(uac2_opts)) {
1104                 __le32 *bma = (__le32 *)&in_feature_unit_desc->bmaControls[0];
1105                 u32 control = 0;
1106
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);
1112         }
1113
1114         ret = usb_interface_id(cfg, fn);
1115         if (ret < 0) {
1116                 dev_err(dev, "%s:%d Error!\n", __func__, __LINE__);
1117                 goto err_free_fu;
1118         }
1119         iad_desc.bFirstInterface = ret;
1120
1121         std_ac_if_desc.bInterfaceNumber = ret;
1122         uac2->ac_intf = ret;
1123         uac2->ac_alt = 0;
1124
1125         if (EPOUT_EN(uac2_opts)) {
1126                 ret = usb_interface_id(cfg, fn);
1127                 if (ret < 0) {
1128                         dev_err(dev, "%s:%d Error!\n", __func__, __LINE__);
1129                         goto err_free_fu;
1130                 }
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;
1135
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++;
1144                 } else {
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;
1151                 }
1152         }
1153
1154         if (EPIN_EN(uac2_opts)) {
1155                 ret = usb_interface_id(cfg, fn);
1156                 if (ret < 0) {
1157                         dev_err(dev, "%s:%d Error!\n", __func__, __LINE__);
1158                         goto err_free_fu;
1159                 }
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;
1164         }
1165
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__);
1170                         ret = -ENODEV;
1171                         goto err_free_fu;
1172                 }
1173
1174                 std_ac_if_desc.bNumEndpoints = 1;
1175         }
1176
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;
1181
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);
1185         if (ret < 0) {
1186                 dev_err(dev, "%s:%d Error!\n", __func__, __LINE__);
1187                 return ret;
1188         }
1189
1190         ret = set_ep_max_packet_size_bint(dev, uac2_opts, &fs_epout_desc,
1191                                         USB_SPEED_FULL, false);
1192         if (ret < 0) {
1193                 dev_err(dev, "%s:%d Error!\n", __func__, __LINE__);
1194                 return ret;
1195         }
1196
1197         ret = set_ep_max_packet_size_bint(dev, uac2_opts, &hs_epin_desc,
1198                                         USB_SPEED_HIGH, true);
1199         if (ret < 0) {
1200                 dev_err(dev, "%s:%d Error!\n", __func__, __LINE__);
1201                 return ret;
1202         }
1203
1204         ret = set_ep_max_packet_size_bint(dev, uac2_opts, &hs_epout_desc,
1205                                         USB_SPEED_HIGH, false);
1206         if (ret < 0) {
1207                 dev_err(dev, "%s:%d Error!\n", __func__, __LINE__);
1208                 return ret;
1209         }
1210
1211         ret = set_ep_max_packet_size_bint(dev, uac2_opts, &ss_epin_desc,
1212                                         USB_SPEED_SUPER, true);
1213         if (ret < 0) {
1214                 dev_err(dev, "%s:%d Error!\n", __func__, __LINE__);
1215                 return ret;
1216         }
1217
1218         ret = set_ep_max_packet_size_bint(dev, uac2_opts, &ss_epout_desc,
1219                                         USB_SPEED_SUPER, false);
1220         if (ret < 0) {
1221                 dev_err(dev, "%s:%d Error!\n", __func__, __LINE__);
1222                 return ret;
1223         }
1224
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__);
1229                         ret = -ENODEV;
1230                         goto err_free_fu;
1231                 }
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__);
1238                                 ret = -ENODEV;
1239                                 goto err_free_fu;
1240                         }
1241                 }
1242         }
1243
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__);
1248                         ret = -ENODEV;
1249                         goto err_free_fu;
1250                 }
1251         }
1252
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));
1259
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));
1264
1265         ss_epin_desc_comp.wBytesPerInterval = ss_epin_desc.wMaxPacketSize;
1266         ss_epout_desc_comp.wBytesPerInterval = ss_epout_desc.wMaxPacketSize;
1267
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;
1277
1278         setup_descriptor(uac2_opts);
1279
1280         ret = usb_assign_descriptors(fn, fs_audio_desc, hs_audio_desc, ss_audio_desc,
1281                                      ss_audio_desc);
1282         if (ret)
1283                 goto err_free_fu;
1284
1285         agdev->gadget = gadget;
1286
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;
1298         }
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;
1310         }
1311         agdev->params.req_number = uac2_opts->req_number;
1312         agdev->params.fb_max = uac2_opts->fb_max;
1313
1314         if (FUOUT_EN(uac2_opts) || FUIN_EN(uac2_opts))
1315     agdev->notify = afunc_notify;
1316
1317         ret = g_audio_setup(agdev, "UAC2 PCM", "UAC2_Gadget");
1318         if (ret)
1319                 goto err_free_descs;
1320
1321         return 0;
1322
1323 err_free_descs:
1324         usb_free_all_descriptors(fn);
1325         agdev->gadget = NULL;
1326 err_free_fu:
1327         kfree(out_feature_unit_desc);
1328         out_feature_unit_desc = NULL;
1329         kfree(in_feature_unit_desc);
1330         in_feature_unit_desc = NULL;
1331         return ret;
1332 }
1333
1334 static void
1335 afunc_notify_complete(struct usb_ep *_ep, struct usb_request *req)
1336 {
1337         struct g_audio *agdev = req->context;
1338         struct f_uac2 *uac2 = func_to_uac2(&agdev->func);
1339
1340         atomic_dec(&uac2->int_count);
1341         kfree(req->buf);
1342         usb_ep_free_request(_ep, req);
1343 }
1344
1345 static int
1346 afunc_notify(struct g_audio *agdev, int unit_id, int cs)
1347 {
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;
1352         int ret;
1353
1354         if (!uac2->int_ep->enabled)
1355                 return 0;
1356
1357         if (atomic_inc_return(&uac2->int_count) > UAC2_DEF_INT_REQ_NUM) {
1358                 atomic_dec(&uac2->int_count);
1359                 return 0;
1360         }
1361
1362         req = usb_ep_alloc_request(uac2->int_ep, GFP_ATOMIC);
1363         if (req == NULL) {
1364                 ret = -ENOMEM;
1365                 goto err_dec_int_count;
1366         }
1367
1368         msg = kzalloc(sizeof(*msg), GFP_ATOMIC);
1369         if (msg == NULL) {
1370                 ret = -ENOMEM;
1371                 goto err_free_request;
1372         }
1373
1374         w_index = unit_id << 8 | uac2->ac_intf;
1375         w_value = cs << 8;
1376
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);
1381
1382         req->length = sizeof(*msg);
1383         req->buf = msg;
1384         req->context = agdev;
1385         req->complete = afunc_notify_complete;
1386
1387         ret = usb_ep_queue(uac2->int_ep, req, GFP_ATOMIC);
1388
1389         if (ret)
1390                 goto err_free_msg;
1391
1392         return 0;
1393
1394 err_free_msg:
1395         kfree(msg);
1396 err_free_request:
1397         usb_ep_free_request(uac2->int_ep, req);
1398 err_dec_int_count:
1399         atomic_dec(&uac2->int_count);
1400
1401         return ret;
1402 }
1403
1404 static int
1405 afunc_set_alt(struct usb_function *fn, unsigned intf, unsigned alt)
1406 {
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;
1412         int ret = 0;
1413
1414         /* No i/f has more than 2 alt settings */
1415         if (alt > 1) {
1416                 dev_err(dev, "%s:%d Error!\n", __func__, __LINE__);
1417                 return -EINVAL;
1418         }
1419
1420         if (intf == uac2->ac_intf) {
1421                 /* Control I/f has only 1 AltSetting - 0 */
1422                 if (alt) {
1423                         dev_err(dev, "%s:%d Error!\n", __func__, __LINE__);
1424                         return -EINVAL;
1425                 }
1426
1427                 /* restart interrupt endpoint */
1428                 if (uac2->int_ep) {
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);
1432                 }
1433
1434                 return 0;
1435         }
1436
1437         if (intf == uac2->as_out_intf) {
1438                 uac2->as_out_alt = alt;
1439
1440                 if (alt)
1441                         ret = u_audio_start_capture(&uac2->g_audio);
1442                 else
1443                         u_audio_stop_capture(&uac2->g_audio);
1444         } else if (intf == uac2->as_in_intf) {
1445                 uac2->as_in_alt = alt;
1446
1447                 if (alt)
1448                         ret = u_audio_start_playback(&uac2->g_audio);
1449                 else
1450                         u_audio_stop_playback(&uac2->g_audio);
1451         } else {
1452                 dev_err(dev, "%s:%d Error!\n", __func__, __LINE__);
1453                 return -EINVAL;
1454         }
1455
1456         return ret;
1457 }
1458
1459 static int
1460 afunc_get_alt(struct usb_function *fn, unsigned intf)
1461 {
1462         struct f_uac2 *uac2 = func_to_uac2(fn);
1463         struct g_audio *agdev = func_to_g_audio(fn);
1464
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;
1471         else
1472                 dev_err(&agdev->gadget->dev,
1473                         "%s:%d Invalid Interface %d!\n",
1474                         __func__, __LINE__, intf);
1475
1476         return -EINVAL;
1477 }
1478
1479 static void
1480 afunc_disable(struct usb_function *fn)
1481 {
1482         struct f_uac2 *uac2 = func_to_uac2(fn);
1483
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);
1488         if (uac2->int_ep)
1489                 usb_ep_disable(uac2->int_ep);
1490 }
1491
1492 static void
1493 afunc_suspend(struct usb_function *fn)
1494 {
1495         struct f_uac2 *uac2 = func_to_uac2(fn);
1496
1497         u_audio_suspend(&uac2->g_audio);
1498 }
1499
1500 static int
1501 in_rq_cur(struct usb_function *fn, const struct usb_ctrlrequest *cr)
1502 {
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;
1513
1514         u_audio_get_playback_srate(agdev, &p_srate);
1515         u_audio_get_capture_srate(agdev, &c_srate);
1516
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;
1520
1521                         memset(&c, 0, sizeof(struct cntrl_cur_lay3));
1522
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);
1527
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);
1533                 } else {
1534                         dev_err(&agdev->gadget->dev,
1535                                 "%s:%d control_selector=%d TODO!\n",
1536                                 __func__, __LINE__, control_selector);
1537                 }
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;
1541
1542                 if (FUIN_EN(opts) && (entity_id == USB_IN_FU_ID))
1543                         is_playback = 1;
1544
1545                 if (control_selector == UAC_FU_MUTE) {
1546                         unsigned int mute;
1547
1548                         u_audio_get_mute(agdev, is_playback, &mute);
1549
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;
1554                         s16 volume;
1555
1556                         memset(&c, 0, sizeof(struct cntrl_cur_lay2));
1557
1558                         u_audio_get_volume(agdev, is_playback, &volume);
1559                         c.wCUR = cpu_to_le16(volume);
1560
1561                         value = min_t(unsigned int, w_length, sizeof(c));
1562                         memcpy(req->buf, &c, value);
1563                 } else {
1564                         dev_err(&agdev->gadget->dev,
1565                                 "%s:%d control_selector=%d TODO!\n",
1566                                 __func__, __LINE__, control_selector);
1567                 }
1568         } else {
1569                 dev_err(&agdev->gadget->dev,
1570                         "%s:%d entity_id=%d control_selector=%d TODO!\n",
1571                         __func__, __LINE__, entity_id, control_selector);
1572         }
1573
1574         return value;
1575 }
1576
1577 static int
1578 in_rq_range(struct usb_function *fn, const struct usb_ctrlrequest *cr)
1579 {
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;
1589
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;
1593                         int i;
1594                         int wNumSubRanges = 0;
1595                         int srate;
1596                         int *srates;
1597
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;
1602                         else
1603                                 return -EOPNOTSUPP;
1604                         for (i = 0; i < UAC_MAX_RATES; i++) {
1605                                 srate = srates[i];
1606                                 if (srate == 0)
1607                                         break;
1608
1609                                 rs.r[wNumSubRanges].dMIN = cpu_to_le32(srate);
1610                                 rs.r[wNumSubRanges].dMAX = cpu_to_le32(srate);
1611                                 rs.r[wNumSubRanges].dRES = 0;
1612                                 wNumSubRanges++;
1613                                 dev_dbg(&agdev->gadget->dev,
1614                                         "%s(): clk %d: rate ID %d: %d\n",
1615                                         __func__, entity_id, wNumSubRanges, srate);
1616                         }
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);
1622                 } else {
1623                         dev_err(&agdev->gadget->dev,
1624                                 "%s:%d control_selector=%d TODO!\n",
1625                                 __func__, __LINE__, control_selector);
1626                 }
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;
1630
1631                 if (FUIN_EN(opts) && (entity_id == USB_IN_FU_ID))
1632                         is_playback = 1;
1633
1634                 if (control_selector == UAC_FU_VOLUME) {
1635                         struct cntrl_range_lay2 r;
1636                         s16 max_db, min_db, res_db;
1637
1638                         if (is_playback) {
1639                                 max_db = opts->p_volume_max;
1640                                 min_db = opts->p_volume_min;
1641                                 res_db = opts->p_volume_res;
1642                         } else {
1643                                 max_db = opts->c_volume_max;
1644                                 min_db = opts->c_volume_min;
1645                                 res_db = opts->c_volume_res;
1646                         }
1647
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);
1652
1653                         value = min_t(unsigned int, w_length, sizeof(r));
1654                         memcpy(req->buf, &r, value);
1655                 } else {
1656                         dev_err(&agdev->gadget->dev,
1657                                 "%s:%d control_selector=%d TODO!\n",
1658                                 __func__, __LINE__, control_selector);
1659                 }
1660         } else {
1661                 dev_err(&agdev->gadget->dev,
1662                         "%s:%d entity_id=%d control_selector=%d TODO!\n",
1663                         __func__, __LINE__, entity_id, control_selector);
1664         }
1665
1666         return value;
1667 }
1668
1669 static int
1670 ac_rq_in(struct usb_function *fn, const struct usb_ctrlrequest *cr)
1671 {
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);
1676         else
1677                 return -EOPNOTSUPP;
1678 }
1679
1680 static void uac2_cs_control_sam_freq(struct usb_ep *ep, struct usb_request *req)
1681 {
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);
1685         u32 val;
1686
1687         if (req->actual != 4)
1688                 return;
1689
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);
1696         }
1697 }
1698
1699 static void
1700 out_rq_cur_complete(struct usb_ep *ep, struct usb_request *req)
1701 {
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;
1711
1712         if (req->status != 0) {
1713                 dev_dbg(&cdev->gadget->dev, "completion err %d\n", req->status);
1714                 return;
1715         }
1716
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;
1720
1721                 if (FUIN_EN(opts) && (entity_id == USB_IN_FU_ID))
1722                         is_playback = 1;
1723
1724                 if (control_selector == UAC_FU_MUTE) {
1725                         u8 mute = *(u8 *)req->buf;
1726
1727                         u_audio_set_mute(agdev, is_playback, mute);
1728
1729                         return;
1730                 } else if (control_selector == UAC_FU_VOLUME) {
1731                         struct cntrl_cur_lay2 *c = req->buf;
1732                         s16 volume;
1733
1734                         volume = le16_to_cpu(c->wCUR);
1735                         u_audio_set_volume(agdev, is_playback, volume);
1736
1737                         return;
1738                 } else {
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);
1743                 }
1744         }
1745 }
1746
1747 static int
1748 out_rq_cur(struct usb_function *fn, const struct usb_ctrlrequest *cr)
1749 {
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;
1761
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;
1769                         return w_length;
1770                 }
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;
1776
1777                 return w_length;
1778         } else {
1779                 dev_err(&agdev->gadget->dev,
1780                         "%s:%d entity_id=%d control_selector=%d TODO!\n",
1781                         __func__, __LINE__, entity_id, control_selector);
1782         }
1783         return -EOPNOTSUPP;
1784 }
1785
1786 static int
1787 setup_rq_inf(struct usb_function *fn, const struct usb_ctrlrequest *cr)
1788 {
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;
1793
1794         if (intf != uac2->ac_intf) {
1795                 dev_err(&agdev->gadget->dev,
1796                         "%s:%d Error!\n", __func__, __LINE__);
1797                 return -EOPNOTSUPP;
1798         }
1799
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);
1804
1805         return -EOPNOTSUPP;
1806 }
1807
1808 static int
1809 afunc_setup(struct usb_function *fn, const struct usb_ctrlrequest *cr)
1810 {
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;
1816
1817         /* Only Class specific requests are supposed to reach here */
1818         if ((cr->bRequestType & USB_TYPE_MASK) != USB_TYPE_CLASS)
1819                 return -EOPNOTSUPP;
1820
1821         if ((cr->bRequestType & USB_RECIP_MASK) == USB_RECIP_INTERFACE)
1822                 value = setup_rq_inf(fn, cr);
1823         else
1824                 dev_err(&agdev->gadget->dev, "%s:%d Error!\n",
1825                                 __func__, __LINE__);
1826
1827         if (value >= 0) {
1828                 req->length = value;
1829                 req->zero = value < w_length;
1830                 value = usb_ep_queue(cdev->gadget->ep0, req, GFP_ATOMIC);
1831                 if (value < 0) {
1832                         dev_err(&agdev->gadget->dev,
1833                                 "%s:%d Error!\n", __func__, __LINE__);
1834                         req->status = 0;
1835                 }
1836         }
1837
1838         return value;
1839 }
1840
1841 static inline struct f_uac2_opts *to_f_uac2_opts(struct config_item *item)
1842 {
1843         return container_of(to_config_group(item), struct f_uac2_opts,
1844                             func_inst.group);
1845 }
1846
1847 static void f_uac2_attr_release(struct config_item *item)
1848 {
1849         struct f_uac2_opts *opts = to_f_uac2_opts(item);
1850
1851         usb_put_function_instance(&opts->func_inst);
1852 }
1853
1854 static struct configfs_item_operations f_uac2_item_ops = {
1855         .release        = f_uac2_attr_release,
1856 };
1857
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))
1862
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";
1867
1868 #define UAC2_ATTRIBUTE(type, name)                                      \
1869 static ssize_t f_uac2_opts_##name##_show(struct config_item *item,      \
1870                                          char *page)                    \
1871 {                                                                       \
1872         struct f_uac2_opts *opts = to_f_uac2_opts(item);                \
1873         int result;                                                     \
1874                                                                         \
1875         mutex_lock(&opts->lock);                                        \
1876         result = sprintf(page, type##_fmt, opts->name);                 \
1877         mutex_unlock(&opts->lock);                                      \
1878                                                                         \
1879         return result;                                                  \
1880 }                                                                       \
1881                                                                         \
1882 static ssize_t f_uac2_opts_##name##_store(struct config_item *item,     \
1883                                           const char *page, size_t len) \
1884 {                                                                       \
1885         struct f_uac2_opts *opts = to_f_uac2_opts(item);                \
1886         int ret;                                                        \
1887         type num;                                                       \
1888                                                                         \
1889         mutex_lock(&opts->lock);                                        \
1890         if (opts->refcnt) {                                             \
1891                 ret = -EBUSY;                                           \
1892                 goto end;                                               \
1893         }                                                               \
1894                                                                         \
1895         ret = uac2_kstrto##type(page, 0, &num);                         \
1896         if (ret)                                                        \
1897                 goto end;                                               \
1898                                                                         \
1899         opts->name = num;                                               \
1900         ret = len;                                                      \
1901                                                                         \
1902 end:                                                                    \
1903         mutex_unlock(&opts->lock);                                      \
1904         return ret;                                                     \
1905 }                                                                       \
1906                                                                         \
1907 CONFIGFS_ATTR(f_uac2_opts_, name)
1908
1909 #define UAC2_ATTRIBUTE_SYNC(name)                                       \
1910 static ssize_t f_uac2_opts_##name##_show(struct config_item *item,      \
1911                                          char *page)                    \
1912 {                                                                       \
1913         struct f_uac2_opts *opts = to_f_uac2_opts(item);                \
1914         int result;                                                     \
1915         char *str;                                                      \
1916                                                                         \
1917         mutex_lock(&opts->lock);                                        \
1918         switch (opts->name) {                                           \
1919         case USB_ENDPOINT_SYNC_ASYNC:                                   \
1920                 str = "async";                                          \
1921                 break;                                                  \
1922         case USB_ENDPOINT_SYNC_ADAPTIVE:                                \
1923                 str = "adaptive";                                       \
1924                 break;                                                  \
1925         default:                                                        \
1926                 str = "unknown";                                        \
1927                 break;                                                  \
1928         }                                                               \
1929         result = sprintf(page, "%s\n", str);                            \
1930         mutex_unlock(&opts->lock);                                      \
1931                                                                         \
1932         return result;                                                  \
1933 }                                                                       \
1934                                                                         \
1935 static ssize_t f_uac2_opts_##name##_store(struct config_item *item,     \
1936                                           const char *page, size_t len) \
1937 {                                                                       \
1938         struct f_uac2_opts *opts = to_f_uac2_opts(item);                \
1939         int ret = 0;                                                    \
1940                                                                         \
1941         mutex_lock(&opts->lock);                                        \
1942         if (opts->refcnt) {                                             \
1943                 ret = -EBUSY;                                           \
1944                 goto end;                                               \
1945         }                                                               \
1946                                                                         \
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;                \
1951         else {                                                          \
1952                 ret = -EINVAL;                                          \
1953                 goto end;                                               \
1954         }                                                               \
1955                                                                         \
1956         ret = len;                                                      \
1957                                                                         \
1958 end:                                                                    \
1959         mutex_unlock(&opts->lock);                                      \
1960         return ret;                                                     \
1961 }                                                                       \
1962                                                                         \
1963 CONFIGFS_ATTR(f_uac2_opts_, name)
1964
1965 #define UAC2_RATE_ATTRIBUTE(name)                                       \
1966 static ssize_t f_uac2_opts_##name##_show(struct config_item *item,      \
1967                                          char *page)                    \
1968 {                                                                       \
1969         struct f_uac2_opts *opts = to_f_uac2_opts(item);                \
1970         int result = 0;                                                 \
1971         int i;                                                          \
1972                                                                         \
1973         mutex_lock(&opts->lock);                                        \
1974         page[0] = '\0';                                                 \
1975         for (i = 0; i < UAC_MAX_RATES; i++) {                           \
1976                 if (opts->name##s[i] == 0)                              \
1977                         break;                                          \
1978                 result += sprintf(page + strlen(page), "%u,",           \
1979                                 opts->name##s[i]);                      \
1980         }                                                               \
1981         if (strlen(page) > 0)                                           \
1982                 page[strlen(page) - 1] = '\n';                          \
1983         mutex_unlock(&opts->lock);                                      \
1984                                                                         \
1985         return result;                                                  \
1986 }                                                                       \
1987                                                                         \
1988 static ssize_t f_uac2_opts_##name##_store(struct config_item *item,     \
1989                                           const char *page, size_t len) \
1990 {                                                                       \
1991         struct f_uac2_opts *opts = to_f_uac2_opts(item);                \
1992         char *split_page = NULL;                                        \
1993         int ret = -EINVAL;                                              \
1994         char *token;                                                    \
1995         u32 num;                                                        \
1996         int i;                                                          \
1997                                                                         \
1998         mutex_lock(&opts->lock);                                        \
1999         if (opts->refcnt) {                                             \
2000                 ret = -EBUSY;                                           \
2001                 goto end;                                               \
2002         }                                                               \
2003                                                                         \
2004         i = 0;                                                          \
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);                        \
2009                 if (ret)                                                \
2010                         goto end;                                       \
2011                                                                         \
2012                 opts->name##s[i++] = num;                               \
2013                 ret = len;                                              \
2014         };                                                              \
2015                                                                         \
2016 end:                                                                    \
2017         kfree(split_page);                                              \
2018         mutex_unlock(&opts->lock);                                      \
2019         return ret;                                                     \
2020 }                                                                       \
2021                                                                         \
2022 CONFIGFS_ATTR(f_uac2_opts_, name)
2023
2024 #define UAC2_ATTRIBUTE_STRING(name)                                     \
2025 static ssize_t f_uac2_opts_##name##_show(struct config_item *item,      \
2026                                          char *page)                    \
2027 {                                                                       \
2028         struct f_uac2_opts *opts = to_f_uac2_opts(item);                \
2029         int result;                                                     \
2030                                                                         \
2031         mutex_lock(&opts->lock);                                        \
2032         result = snprintf(page, sizeof(opts->name), "%s", opts->name);  \
2033         mutex_unlock(&opts->lock);                                      \
2034                                                                         \
2035         return result;                                                  \
2036 }                                                                       \
2037                                                                         \
2038 static ssize_t f_uac2_opts_##name##_store(struct config_item *item,     \
2039                                           const char *page, size_t len) \
2040 {                                                                       \
2041         struct f_uac2_opts *opts = to_f_uac2_opts(item);                \
2042         int ret = 0;                                                    \
2043                                                                         \
2044         mutex_lock(&opts->lock);                                        \
2045         if (opts->refcnt) {                                             \
2046                 ret = -EBUSY;                                           \
2047                 goto end;                                               \
2048         }                                                               \
2049                                                                         \
2050         ret = snprintf(opts->name, min(sizeof(opts->name), len),        \
2051                         "%s", page);                                    \
2052                                                                         \
2053 end:                                                                    \
2054         mutex_unlock(&opts->lock);                                      \
2055         return ret;                                                     \
2056 }                                                                       \
2057                                                                         \
2058 CONFIGFS_ATTR(f_uac2_opts_, name)
2059
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);
2070
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);
2076
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);
2084
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,
2097
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,
2103
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,
2109
2110         &f_uac2_opts_attr_function_name,
2111
2112         NULL,
2113 };
2114
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,
2119 };
2120
2121 static void afunc_free_inst(struct usb_function_instance *f)
2122 {
2123         struct f_uac2_opts *opts;
2124
2125         opts = container_of(f, struct f_uac2_opts, func_inst);
2126         kfree(opts);
2127 }
2128
2129 static struct usb_function_instance *afunc_alloc_inst(void)
2130 {
2131         struct f_uac2_opts *opts;
2132
2133         opts = kzalloc(sizeof(*opts), GFP_KERNEL);
2134         if (!opts)
2135                 return ERR_PTR(-ENOMEM);
2136
2137         mutex_init(&opts->lock);
2138         opts->func_inst.free_func_inst = afunc_free_inst;
2139
2140         config_group_init_type_name(&opts->func_inst.group, "",
2141                                     &f_uac2_func_type);
2142
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;
2152
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;
2158
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;
2164
2165         opts->req_number = UAC2_DEF_REQ_NUM;
2166         opts->fb_max = FBACK_FAST_MAX;
2167
2168         snprintf(opts->function_name, sizeof(opts->function_name), "Source/Sink");
2169
2170         return &opts->func_inst;
2171 }
2172
2173 static void afunc_free(struct usb_function *f)
2174 {
2175         struct g_audio *agdev;
2176         struct f_uac2_opts *opts;
2177
2178         agdev = func_to_g_audio(f);
2179         opts = container_of(f->fi, struct f_uac2_opts, func_inst);
2180         kfree(agdev);
2181         mutex_lock(&opts->lock);
2182         --opts->refcnt;
2183         mutex_unlock(&opts->lock);
2184 }
2185
2186 static void afunc_unbind(struct usb_configuration *c, struct usb_function *f)
2187 {
2188         struct g_audio *agdev = func_to_g_audio(f);
2189
2190         g_audio_cleanup(agdev);
2191         usb_free_all_descriptors(f);
2192
2193         agdev->gadget = NULL;
2194
2195         kfree(out_feature_unit_desc);
2196         out_feature_unit_desc = NULL;
2197         kfree(in_feature_unit_desc);
2198         in_feature_unit_desc = NULL;
2199 }
2200
2201 static struct usb_function *afunc_alloc(struct usb_function_instance *fi)
2202 {
2203         struct f_uac2   *uac2;
2204         struct f_uac2_opts *opts;
2205
2206         uac2 = kzalloc(sizeof(*uac2), GFP_KERNEL);
2207         if (uac2 == NULL)
2208                 return ERR_PTR(-ENOMEM);
2209
2210         opts = container_of(fi, struct f_uac2_opts, func_inst);
2211         mutex_lock(&opts->lock);
2212         ++opts->refcnt;
2213         mutex_unlock(&opts->lock);
2214
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;
2224
2225         return &uac2->g_audio.func;
2226 }
2227
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");
This page took 0.168575 seconds and 4 git commands to generate.