root/drivers/usb/gadget/function/f_uac2.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. func_to_uac2
  2. g_audio_to_uac2_opts
  3. set_ep_max_packet_size
  4. setup_descriptor
  5. afunc_bind
  6. afunc_set_alt
  7. afunc_get_alt
  8. afunc_disable
  9. in_rq_cur
  10. in_rq_range
  11. ac_rq_in
  12. out_rq_cur
  13. setup_rq_inf
  14. afunc_setup
  15. to_f_uac2_opts
  16. f_uac2_attr_release
  17. afunc_free_inst
  18. afunc_alloc_inst
  19. afunc_free
  20. afunc_unbind
  21. afunc_alloc

   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 (yadi.brar01@gmail.com)
   7  *    Jaswinder Singh (jaswinder.singh@linaro.org)
   8  */
   9 
  10 #include <linux/usb/audio.h>
  11 #include <linux/usb/audio-v2.h>
  12 #include <linux/module.h>
  13 
  14 #include "u_audio.h"
  15 #include "u_uac2.h"
  16 
  17 /*
  18  * The driver implements a simple UAC_2 topology.
  19  * USB-OUT -> IT_1 -> OT_3 -> ALSA_Capture
  20  * ALSA_Playback -> IT_2 -> OT_4 -> USB-IN
  21  * Capture and Playback sampling rates are independently
  22  *  controlled by two clock sources :
  23  *    CLK_5 := c_srate, and CLK_6 := p_srate
  24  */
  25 #define USB_OUT_CLK_ID  (out_clk_src_desc.bClockID)
  26 #define USB_IN_CLK_ID   (in_clk_src_desc.bClockID)
  27 
  28 #define CONTROL_ABSENT  0
  29 #define CONTROL_RDONLY  1
  30 #define CONTROL_RDWR    3
  31 
  32 #define CLK_FREQ_CTRL   0
  33 #define CLK_VLD_CTRL    2
  34 
  35 #define COPY_CTRL       0
  36 #define CONN_CTRL       2
  37 #define OVRLD_CTRL      4
  38 #define CLSTR_CTRL      6
  39 #define UNFLW_CTRL      8
  40 #define OVFLW_CTRL      10
  41 
  42 #define EPIN_EN(_opts) ((_opts)->p_chmask != 0)
  43 #define EPOUT_EN(_opts) ((_opts)->c_chmask != 0)
  44 
  45 struct f_uac2 {
  46         struct g_audio g_audio;
  47         u8 ac_intf, as_in_intf, as_out_intf;
  48         u8 ac_alt, as_in_alt, as_out_alt;       /* needed for get_alt() */
  49 };
  50 
  51 static inline struct f_uac2 *func_to_uac2(struct usb_function *f)
  52 {
  53         return container_of(f, struct f_uac2, g_audio.func);
  54 }
  55 
  56 static inline
  57 struct f_uac2_opts *g_audio_to_uac2_opts(struct g_audio *agdev)
  58 {
  59         return container_of(agdev->func.fi, struct f_uac2_opts, func_inst);
  60 }
  61 
  62 /* --------- USB Function Interface ------------- */
  63 
  64 enum {
  65         STR_ASSOC,
  66         STR_IF_CTRL,
  67         STR_CLKSRC_IN,
  68         STR_CLKSRC_OUT,
  69         STR_USB_IT,
  70         STR_IO_IT,
  71         STR_USB_OT,
  72         STR_IO_OT,
  73         STR_AS_OUT_ALT0,
  74         STR_AS_OUT_ALT1,
  75         STR_AS_IN_ALT0,
  76         STR_AS_IN_ALT1,
  77 };
  78 
  79 static char clksrc_in[8];
  80 static char clksrc_out[8];
  81 
  82 static struct usb_string strings_fn[] = {
  83         [STR_ASSOC].s = "Source/Sink",
  84         [STR_IF_CTRL].s = "Topology Control",
  85         [STR_CLKSRC_IN].s = clksrc_in,
  86         [STR_CLKSRC_OUT].s = clksrc_out,
  87         [STR_USB_IT].s = "USBH Out",
  88         [STR_IO_IT].s = "USBD Out",
  89         [STR_USB_OT].s = "USBH In",
  90         [STR_IO_OT].s = "USBD In",
  91         [STR_AS_OUT_ALT0].s = "Playback Inactive",
  92         [STR_AS_OUT_ALT1].s = "Playback Active",
  93         [STR_AS_IN_ALT0].s = "Capture Inactive",
  94         [STR_AS_IN_ALT1].s = "Capture Active",
  95         { },
  96 };
  97 
  98 static struct usb_gadget_strings str_fn = {
  99         .language = 0x0409,     /* en-us */
 100         .strings = strings_fn,
 101 };
 102 
 103 static struct usb_gadget_strings *fn_strings[] = {
 104         &str_fn,
 105         NULL,
 106 };
 107 
 108 static struct usb_interface_assoc_descriptor iad_desc = {
 109         .bLength = sizeof iad_desc,
 110         .bDescriptorType = USB_DT_INTERFACE_ASSOCIATION,
 111 
 112         .bFirstInterface = 0,
 113         .bInterfaceCount = 3,
 114         .bFunctionClass = USB_CLASS_AUDIO,
 115         .bFunctionSubClass = UAC2_FUNCTION_SUBCLASS_UNDEFINED,
 116         .bFunctionProtocol = UAC_VERSION_2,
 117 };
 118 
 119 /* Audio Control Interface */
 120 static struct usb_interface_descriptor std_ac_if_desc = {
 121         .bLength = sizeof std_ac_if_desc,
 122         .bDescriptorType = USB_DT_INTERFACE,
 123 
 124         .bAlternateSetting = 0,
 125         .bNumEndpoints = 0,
 126         .bInterfaceClass = USB_CLASS_AUDIO,
 127         .bInterfaceSubClass = USB_SUBCLASS_AUDIOCONTROL,
 128         .bInterfaceProtocol = UAC_VERSION_2,
 129 };
 130 
 131 /* Clock source for IN traffic */
 132 static struct uac_clock_source_descriptor in_clk_src_desc = {
 133         .bLength = sizeof in_clk_src_desc,
 134         .bDescriptorType = USB_DT_CS_INTERFACE,
 135 
 136         .bDescriptorSubtype = UAC2_CLOCK_SOURCE,
 137         /* .bClockID = DYNAMIC */
 138         .bmAttributes = UAC_CLOCK_SOURCE_TYPE_INT_FIXED,
 139         .bmControls = (CONTROL_RDONLY << CLK_FREQ_CTRL),
 140         .bAssocTerminal = 0,
 141 };
 142 
 143 /* Clock source for OUT traffic */
 144 static struct uac_clock_source_descriptor out_clk_src_desc = {
 145         .bLength = sizeof out_clk_src_desc,
 146         .bDescriptorType = USB_DT_CS_INTERFACE,
 147 
 148         .bDescriptorSubtype = UAC2_CLOCK_SOURCE,
 149         /* .bClockID = DYNAMIC */
 150         .bmAttributes = UAC_CLOCK_SOURCE_TYPE_INT_FIXED,
 151         .bmControls = (CONTROL_RDONLY << CLK_FREQ_CTRL),
 152         .bAssocTerminal = 0,
 153 };
 154 
 155 /* Input Terminal for USB_OUT */
 156 static struct uac2_input_terminal_descriptor usb_out_it_desc = {
 157         .bLength = sizeof usb_out_it_desc,
 158         .bDescriptorType = USB_DT_CS_INTERFACE,
 159 
 160         .bDescriptorSubtype = UAC_INPUT_TERMINAL,
 161         /* .bTerminalID = DYNAMIC */
 162         .wTerminalType = cpu_to_le16(UAC_TERMINAL_STREAMING),
 163         .bAssocTerminal = 0,
 164         /* .bCSourceID = DYNAMIC */
 165         .iChannelNames = 0,
 166         .bmControls = cpu_to_le16(CONTROL_RDWR << COPY_CTRL),
 167 };
 168 
 169 /* Input Terminal for I/O-In */
 170 static struct uac2_input_terminal_descriptor io_in_it_desc = {
 171         .bLength = sizeof io_in_it_desc,
 172         .bDescriptorType = USB_DT_CS_INTERFACE,
 173 
 174         .bDescriptorSubtype = UAC_INPUT_TERMINAL,
 175         /* .bTerminalID = DYNAMIC */
 176         .wTerminalType = cpu_to_le16(UAC_INPUT_TERMINAL_UNDEFINED),
 177         .bAssocTerminal = 0,
 178         /* .bCSourceID = DYNAMIC */
 179         .iChannelNames = 0,
 180         .bmControls = cpu_to_le16(CONTROL_RDWR << COPY_CTRL),
 181 };
 182 
 183 /* Ouput Terminal for USB_IN */
 184 static struct uac2_output_terminal_descriptor usb_in_ot_desc = {
 185         .bLength = sizeof usb_in_ot_desc,
 186         .bDescriptorType = USB_DT_CS_INTERFACE,
 187 
 188         .bDescriptorSubtype = UAC_OUTPUT_TERMINAL,
 189         /* .bTerminalID = DYNAMIC */
 190         .wTerminalType = cpu_to_le16(UAC_TERMINAL_STREAMING),
 191         .bAssocTerminal = 0,
 192         /* .bSourceID = DYNAMIC */
 193         /* .bCSourceID = DYNAMIC */
 194         .bmControls = cpu_to_le16(CONTROL_RDWR << COPY_CTRL),
 195 };
 196 
 197 /* Ouput Terminal for I/O-Out */
 198 static struct uac2_output_terminal_descriptor io_out_ot_desc = {
 199         .bLength = sizeof io_out_ot_desc,
 200         .bDescriptorType = USB_DT_CS_INTERFACE,
 201 
 202         .bDescriptorSubtype = UAC_OUTPUT_TERMINAL,
 203         /* .bTerminalID = DYNAMIC */
 204         .wTerminalType = cpu_to_le16(UAC_OUTPUT_TERMINAL_UNDEFINED),
 205         .bAssocTerminal = 0,
 206         /* .bSourceID = DYNAMIC */
 207         /* .bCSourceID = DYNAMIC */
 208         .bmControls = cpu_to_le16(CONTROL_RDWR << COPY_CTRL),
 209 };
 210 
 211 static struct uac2_ac_header_descriptor ac_hdr_desc = {
 212         .bLength = sizeof ac_hdr_desc,
 213         .bDescriptorType = USB_DT_CS_INTERFACE,
 214 
 215         .bDescriptorSubtype = UAC_MS_HEADER,
 216         .bcdADC = cpu_to_le16(0x200),
 217         .bCategory = UAC2_FUNCTION_IO_BOX,
 218         .wTotalLength = cpu_to_le16(sizeof in_clk_src_desc
 219                         + sizeof out_clk_src_desc + sizeof usb_out_it_desc
 220                         + sizeof io_in_it_desc + sizeof usb_in_ot_desc
 221                         + sizeof io_out_ot_desc),
 222         .bmControls = 0,
 223 };
 224 
 225 /* Audio Streaming OUT Interface - Alt0 */
 226 static struct usb_interface_descriptor std_as_out_if0_desc = {
 227         .bLength = sizeof std_as_out_if0_desc,
 228         .bDescriptorType = USB_DT_INTERFACE,
 229 
 230         .bAlternateSetting = 0,
 231         .bNumEndpoints = 0,
 232         .bInterfaceClass = USB_CLASS_AUDIO,
 233         .bInterfaceSubClass = USB_SUBCLASS_AUDIOSTREAMING,
 234         .bInterfaceProtocol = UAC_VERSION_2,
 235 };
 236 
 237 /* Audio Streaming OUT Interface - Alt1 */
 238 static struct usb_interface_descriptor std_as_out_if1_desc = {
 239         .bLength = sizeof std_as_out_if1_desc,
 240         .bDescriptorType = USB_DT_INTERFACE,
 241 
 242         .bAlternateSetting = 1,
 243         .bNumEndpoints = 1,
 244         .bInterfaceClass = USB_CLASS_AUDIO,
 245         .bInterfaceSubClass = USB_SUBCLASS_AUDIOSTREAMING,
 246         .bInterfaceProtocol = UAC_VERSION_2,
 247 };
 248 
 249 /* Audio Stream OUT Intface Desc */
 250 static struct uac2_as_header_descriptor as_out_hdr_desc = {
 251         .bLength = sizeof as_out_hdr_desc,
 252         .bDescriptorType = USB_DT_CS_INTERFACE,
 253 
 254         .bDescriptorSubtype = UAC_AS_GENERAL,
 255         /* .bTerminalLink = DYNAMIC */
 256         .bmControls = 0,
 257         .bFormatType = UAC_FORMAT_TYPE_I,
 258         .bmFormats = cpu_to_le32(UAC_FORMAT_TYPE_I_PCM),
 259         .iChannelNames = 0,
 260 };
 261 
 262 /* Audio USB_OUT Format */
 263 static struct uac2_format_type_i_descriptor as_out_fmt1_desc = {
 264         .bLength = sizeof as_out_fmt1_desc,
 265         .bDescriptorType = USB_DT_CS_INTERFACE,
 266         .bDescriptorSubtype = UAC_FORMAT_TYPE,
 267         .bFormatType = UAC_FORMAT_TYPE_I,
 268 };
 269 
 270 /* STD AS ISO OUT Endpoint */
 271 static struct usb_endpoint_descriptor fs_epout_desc = {
 272         .bLength = USB_DT_ENDPOINT_SIZE,
 273         .bDescriptorType = USB_DT_ENDPOINT,
 274 
 275         .bEndpointAddress = USB_DIR_OUT,
 276         .bmAttributes = USB_ENDPOINT_XFER_ISOC | USB_ENDPOINT_SYNC_ASYNC,
 277         .wMaxPacketSize = cpu_to_le16(1023),
 278         .bInterval = 1,
 279 };
 280 
 281 static struct usb_endpoint_descriptor hs_epout_desc = {
 282         .bLength = USB_DT_ENDPOINT_SIZE,
 283         .bDescriptorType = USB_DT_ENDPOINT,
 284 
 285         .bmAttributes = USB_ENDPOINT_XFER_ISOC | USB_ENDPOINT_SYNC_ASYNC,
 286         .wMaxPacketSize = cpu_to_le16(1024),
 287         .bInterval = 4,
 288 };
 289 
 290 /* CS AS ISO OUT Endpoint */
 291 static struct uac2_iso_endpoint_descriptor as_iso_out_desc = {
 292         .bLength = sizeof as_iso_out_desc,
 293         .bDescriptorType = USB_DT_CS_ENDPOINT,
 294 
 295         .bDescriptorSubtype = UAC_EP_GENERAL,
 296         .bmAttributes = 0,
 297         .bmControls = 0,
 298         .bLockDelayUnits = 0,
 299         .wLockDelay = 0,
 300 };
 301 
 302 /* Audio Streaming IN Interface - Alt0 */
 303 static struct usb_interface_descriptor std_as_in_if0_desc = {
 304         .bLength = sizeof std_as_in_if0_desc,
 305         .bDescriptorType = USB_DT_INTERFACE,
 306 
 307         .bAlternateSetting = 0,
 308         .bNumEndpoints = 0,
 309         .bInterfaceClass = USB_CLASS_AUDIO,
 310         .bInterfaceSubClass = USB_SUBCLASS_AUDIOSTREAMING,
 311         .bInterfaceProtocol = UAC_VERSION_2,
 312 };
 313 
 314 /* Audio Streaming IN Interface - Alt1 */
 315 static struct usb_interface_descriptor std_as_in_if1_desc = {
 316         .bLength = sizeof std_as_in_if1_desc,
 317         .bDescriptorType = USB_DT_INTERFACE,
 318 
 319         .bAlternateSetting = 1,
 320         .bNumEndpoints = 1,
 321         .bInterfaceClass = USB_CLASS_AUDIO,
 322         .bInterfaceSubClass = USB_SUBCLASS_AUDIOSTREAMING,
 323         .bInterfaceProtocol = UAC_VERSION_2,
 324 };
 325 
 326 /* Audio Stream IN Intface Desc */
 327 static struct uac2_as_header_descriptor as_in_hdr_desc = {
 328         .bLength = sizeof as_in_hdr_desc,
 329         .bDescriptorType = USB_DT_CS_INTERFACE,
 330 
 331         .bDescriptorSubtype = UAC_AS_GENERAL,
 332         /* .bTerminalLink = DYNAMIC */
 333         .bmControls = 0,
 334         .bFormatType = UAC_FORMAT_TYPE_I,
 335         .bmFormats = cpu_to_le32(UAC_FORMAT_TYPE_I_PCM),
 336         .iChannelNames = 0,
 337 };
 338 
 339 /* Audio USB_IN Format */
 340 static struct uac2_format_type_i_descriptor as_in_fmt1_desc = {
 341         .bLength = sizeof as_in_fmt1_desc,
 342         .bDescriptorType = USB_DT_CS_INTERFACE,
 343         .bDescriptorSubtype = UAC_FORMAT_TYPE,
 344         .bFormatType = UAC_FORMAT_TYPE_I,
 345 };
 346 
 347 /* STD AS ISO IN Endpoint */
 348 static struct usb_endpoint_descriptor fs_epin_desc = {
 349         .bLength = USB_DT_ENDPOINT_SIZE,
 350         .bDescriptorType = USB_DT_ENDPOINT,
 351 
 352         .bEndpointAddress = USB_DIR_IN,
 353         .bmAttributes = USB_ENDPOINT_XFER_ISOC | USB_ENDPOINT_SYNC_ASYNC,
 354         .wMaxPacketSize = cpu_to_le16(1023),
 355         .bInterval = 1,
 356 };
 357 
 358 static struct usb_endpoint_descriptor hs_epin_desc = {
 359         .bLength = USB_DT_ENDPOINT_SIZE,
 360         .bDescriptorType = USB_DT_ENDPOINT,
 361 
 362         .bmAttributes = USB_ENDPOINT_XFER_ISOC | USB_ENDPOINT_SYNC_ASYNC,
 363         .wMaxPacketSize = cpu_to_le16(1024),
 364         .bInterval = 4,
 365 };
 366 
 367 /* CS AS ISO IN Endpoint */
 368 static struct uac2_iso_endpoint_descriptor as_iso_in_desc = {
 369         .bLength = sizeof as_iso_in_desc,
 370         .bDescriptorType = USB_DT_CS_ENDPOINT,
 371 
 372         .bDescriptorSubtype = UAC_EP_GENERAL,
 373         .bmAttributes = 0,
 374         .bmControls = 0,
 375         .bLockDelayUnits = 0,
 376         .wLockDelay = 0,
 377 };
 378 
 379 static struct usb_descriptor_header *fs_audio_desc[] = {
 380         (struct usb_descriptor_header *)&iad_desc,
 381         (struct usb_descriptor_header *)&std_ac_if_desc,
 382 
 383         (struct usb_descriptor_header *)&ac_hdr_desc,
 384         (struct usb_descriptor_header *)&in_clk_src_desc,
 385         (struct usb_descriptor_header *)&out_clk_src_desc,
 386         (struct usb_descriptor_header *)&usb_out_it_desc,
 387         (struct usb_descriptor_header *)&io_in_it_desc,
 388         (struct usb_descriptor_header *)&usb_in_ot_desc,
 389         (struct usb_descriptor_header *)&io_out_ot_desc,
 390 
 391         (struct usb_descriptor_header *)&std_as_out_if0_desc,
 392         (struct usb_descriptor_header *)&std_as_out_if1_desc,
 393 
 394         (struct usb_descriptor_header *)&as_out_hdr_desc,
 395         (struct usb_descriptor_header *)&as_out_fmt1_desc,
 396         (struct usb_descriptor_header *)&fs_epout_desc,
 397         (struct usb_descriptor_header *)&as_iso_out_desc,
 398 
 399         (struct usb_descriptor_header *)&std_as_in_if0_desc,
 400         (struct usb_descriptor_header *)&std_as_in_if1_desc,
 401 
 402         (struct usb_descriptor_header *)&as_in_hdr_desc,
 403         (struct usb_descriptor_header *)&as_in_fmt1_desc,
 404         (struct usb_descriptor_header *)&fs_epin_desc,
 405         (struct usb_descriptor_header *)&as_iso_in_desc,
 406         NULL,
 407 };
 408 
 409 static struct usb_descriptor_header *hs_audio_desc[] = {
 410         (struct usb_descriptor_header *)&iad_desc,
 411         (struct usb_descriptor_header *)&std_ac_if_desc,
 412 
 413         (struct usb_descriptor_header *)&ac_hdr_desc,
 414         (struct usb_descriptor_header *)&in_clk_src_desc,
 415         (struct usb_descriptor_header *)&out_clk_src_desc,
 416         (struct usb_descriptor_header *)&usb_out_it_desc,
 417         (struct usb_descriptor_header *)&io_in_it_desc,
 418         (struct usb_descriptor_header *)&usb_in_ot_desc,
 419         (struct usb_descriptor_header *)&io_out_ot_desc,
 420 
 421         (struct usb_descriptor_header *)&std_as_out_if0_desc,
 422         (struct usb_descriptor_header *)&std_as_out_if1_desc,
 423 
 424         (struct usb_descriptor_header *)&as_out_hdr_desc,
 425         (struct usb_descriptor_header *)&as_out_fmt1_desc,
 426         (struct usb_descriptor_header *)&hs_epout_desc,
 427         (struct usb_descriptor_header *)&as_iso_out_desc,
 428 
 429         (struct usb_descriptor_header *)&std_as_in_if0_desc,
 430         (struct usb_descriptor_header *)&std_as_in_if1_desc,
 431 
 432         (struct usb_descriptor_header *)&as_in_hdr_desc,
 433         (struct usb_descriptor_header *)&as_in_fmt1_desc,
 434         (struct usb_descriptor_header *)&hs_epin_desc,
 435         (struct usb_descriptor_header *)&as_iso_in_desc,
 436         NULL,
 437 };
 438 
 439 struct cntrl_cur_lay3 {
 440         __le32  dCUR;
 441 };
 442 
 443 struct cntrl_range_lay3 {
 444         __le16  wNumSubRanges;
 445         __le32  dMIN;
 446         __le32  dMAX;
 447         __le32  dRES;
 448 } __packed;
 449 
 450 static void set_ep_max_packet_size(const struct f_uac2_opts *uac2_opts,
 451         struct usb_endpoint_descriptor *ep_desc,
 452         unsigned int factor, bool is_playback)
 453 {
 454         int chmask, srate, ssize;
 455         u16 max_packet_size;
 456 
 457         if (is_playback) {
 458                 chmask = uac2_opts->p_chmask;
 459                 srate = uac2_opts->p_srate;
 460                 ssize = uac2_opts->p_ssize;
 461         } else {
 462                 chmask = uac2_opts->c_chmask;
 463                 srate = uac2_opts->c_srate;
 464                 ssize = uac2_opts->c_ssize;
 465         }
 466 
 467         max_packet_size = num_channels(chmask) * ssize *
 468                 DIV_ROUND_UP(srate, factor / (1 << (ep_desc->bInterval - 1)));
 469         ep_desc->wMaxPacketSize = cpu_to_le16(min_t(u16, max_packet_size,
 470                                 le16_to_cpu(ep_desc->wMaxPacketSize)));
 471 }
 472 
 473 /* Use macro to overcome line length limitation */
 474 #define USBDHDR(p) (struct usb_descriptor_header *)(p)
 475 
 476 static void setup_descriptor(struct f_uac2_opts *opts)
 477 {
 478         /* patch descriptors */
 479         int i = 1; /* ID's start with 1 */
 480 
 481         if (EPOUT_EN(opts))
 482                 usb_out_it_desc.bTerminalID = i++;
 483         if (EPIN_EN(opts))
 484                 io_in_it_desc.bTerminalID = i++;
 485         if (EPOUT_EN(opts))
 486                 io_out_ot_desc.bTerminalID = i++;
 487         if (EPIN_EN(opts))
 488                 usb_in_ot_desc.bTerminalID = i++;
 489         if (EPOUT_EN(opts))
 490                 out_clk_src_desc.bClockID = i++;
 491         if (EPIN_EN(opts))
 492                 in_clk_src_desc.bClockID = i++;
 493 
 494         usb_out_it_desc.bCSourceID = out_clk_src_desc.bClockID;
 495         usb_in_ot_desc.bSourceID = io_in_it_desc.bTerminalID;
 496         usb_in_ot_desc.bCSourceID = in_clk_src_desc.bClockID;
 497         io_in_it_desc.bCSourceID = in_clk_src_desc.bClockID;
 498         io_out_ot_desc.bCSourceID = out_clk_src_desc.bClockID;
 499         io_out_ot_desc.bSourceID = usb_out_it_desc.bTerminalID;
 500         as_out_hdr_desc.bTerminalLink = usb_out_it_desc.bTerminalID;
 501         as_in_hdr_desc.bTerminalLink = usb_in_ot_desc.bTerminalID;
 502 
 503         iad_desc.bInterfaceCount = 1;
 504         ac_hdr_desc.wTotalLength = 0;
 505 
 506         if (EPIN_EN(opts)) {
 507                 u16 len = le16_to_cpu(ac_hdr_desc.wTotalLength);
 508 
 509                 len += sizeof(in_clk_src_desc);
 510                 len += sizeof(usb_in_ot_desc);
 511                 len += sizeof(io_in_it_desc);
 512                 ac_hdr_desc.wTotalLength = cpu_to_le16(len);
 513                 iad_desc.bInterfaceCount++;
 514         }
 515         if (EPOUT_EN(opts)) {
 516                 u16 len = le16_to_cpu(ac_hdr_desc.wTotalLength);
 517 
 518                 len += sizeof(out_clk_src_desc);
 519                 len += sizeof(usb_out_it_desc);
 520                 len += sizeof(io_out_ot_desc);
 521                 ac_hdr_desc.wTotalLength = cpu_to_le16(len);
 522                 iad_desc.bInterfaceCount++;
 523         }
 524 
 525         i = 0;
 526         fs_audio_desc[i++] = USBDHDR(&iad_desc);
 527         fs_audio_desc[i++] = USBDHDR(&std_ac_if_desc);
 528         fs_audio_desc[i++] = USBDHDR(&ac_hdr_desc);
 529         if (EPIN_EN(opts))
 530                 fs_audio_desc[i++] = USBDHDR(&in_clk_src_desc);
 531         if (EPOUT_EN(opts)) {
 532                 fs_audio_desc[i++] = USBDHDR(&out_clk_src_desc);
 533                 fs_audio_desc[i++] = USBDHDR(&usb_out_it_desc);
 534         }
 535         if (EPIN_EN(opts)) {
 536                 fs_audio_desc[i++] = USBDHDR(&io_in_it_desc);
 537                 fs_audio_desc[i++] = USBDHDR(&usb_in_ot_desc);
 538         }
 539         if (EPOUT_EN(opts)) {
 540                 fs_audio_desc[i++] = USBDHDR(&io_out_ot_desc);
 541                 fs_audio_desc[i++] = USBDHDR(&std_as_out_if0_desc);
 542                 fs_audio_desc[i++] = USBDHDR(&std_as_out_if1_desc);
 543                 fs_audio_desc[i++] = USBDHDR(&as_out_hdr_desc);
 544                 fs_audio_desc[i++] = USBDHDR(&as_out_fmt1_desc);
 545                 fs_audio_desc[i++] = USBDHDR(&fs_epout_desc);
 546                 fs_audio_desc[i++] = USBDHDR(&as_iso_out_desc);
 547         }
 548         if (EPIN_EN(opts)) {
 549                 fs_audio_desc[i++] = USBDHDR(&std_as_in_if0_desc);
 550                 fs_audio_desc[i++] = USBDHDR(&std_as_in_if1_desc);
 551                 fs_audio_desc[i++] = USBDHDR(&as_in_hdr_desc);
 552                 fs_audio_desc[i++] = USBDHDR(&as_in_fmt1_desc);
 553                 fs_audio_desc[i++] = USBDHDR(&fs_epin_desc);
 554                 fs_audio_desc[i++] = USBDHDR(&as_iso_in_desc);
 555         }
 556         fs_audio_desc[i] = NULL;
 557 
 558         i = 0;
 559         hs_audio_desc[i++] = USBDHDR(&iad_desc);
 560         hs_audio_desc[i++] = USBDHDR(&std_ac_if_desc);
 561         hs_audio_desc[i++] = USBDHDR(&ac_hdr_desc);
 562         if (EPIN_EN(opts))
 563                 hs_audio_desc[i++] = USBDHDR(&in_clk_src_desc);
 564         if (EPOUT_EN(opts)) {
 565                 hs_audio_desc[i++] = USBDHDR(&out_clk_src_desc);
 566                 hs_audio_desc[i++] = USBDHDR(&usb_out_it_desc);
 567         }
 568         if (EPIN_EN(opts)) {
 569                 hs_audio_desc[i++] = USBDHDR(&io_in_it_desc);
 570                 hs_audio_desc[i++] = USBDHDR(&usb_in_ot_desc);
 571         }
 572         if (EPOUT_EN(opts)) {
 573                 hs_audio_desc[i++] = USBDHDR(&io_out_ot_desc);
 574                 hs_audio_desc[i++] = USBDHDR(&std_as_out_if0_desc);
 575                 hs_audio_desc[i++] = USBDHDR(&std_as_out_if1_desc);
 576                 hs_audio_desc[i++] = USBDHDR(&as_out_hdr_desc);
 577                 hs_audio_desc[i++] = USBDHDR(&as_out_fmt1_desc);
 578                 hs_audio_desc[i++] = USBDHDR(&hs_epout_desc);
 579                 hs_audio_desc[i++] = USBDHDR(&as_iso_out_desc);
 580         }
 581         if (EPIN_EN(opts)) {
 582                 hs_audio_desc[i++] = USBDHDR(&std_as_in_if0_desc);
 583                 hs_audio_desc[i++] = USBDHDR(&std_as_in_if1_desc);
 584                 hs_audio_desc[i++] = USBDHDR(&as_in_hdr_desc);
 585                 hs_audio_desc[i++] = USBDHDR(&as_in_fmt1_desc);
 586                 hs_audio_desc[i++] = USBDHDR(&hs_epin_desc);
 587                 hs_audio_desc[i++] = USBDHDR(&as_iso_in_desc);
 588         }
 589         hs_audio_desc[i] = NULL;
 590 }
 591 
 592 static int
 593 afunc_bind(struct usb_configuration *cfg, struct usb_function *fn)
 594 {
 595         struct f_uac2 *uac2 = func_to_uac2(fn);
 596         struct g_audio *agdev = func_to_g_audio(fn);
 597         struct usb_composite_dev *cdev = cfg->cdev;
 598         struct usb_gadget *gadget = cdev->gadget;
 599         struct device *dev = &gadget->dev;
 600         struct f_uac2_opts *uac2_opts;
 601         struct usb_string *us;
 602         int ret;
 603 
 604         uac2_opts = container_of(fn->fi, struct f_uac2_opts, func_inst);
 605 
 606         us = usb_gstrings_attach(cdev, fn_strings, ARRAY_SIZE(strings_fn));
 607         if (IS_ERR(us))
 608                 return PTR_ERR(us);
 609         iad_desc.iFunction = us[STR_ASSOC].id;
 610         std_ac_if_desc.iInterface = us[STR_IF_CTRL].id;
 611         in_clk_src_desc.iClockSource = us[STR_CLKSRC_IN].id;
 612         out_clk_src_desc.iClockSource = us[STR_CLKSRC_OUT].id;
 613         usb_out_it_desc.iTerminal = us[STR_USB_IT].id;
 614         io_in_it_desc.iTerminal = us[STR_IO_IT].id;
 615         usb_in_ot_desc.iTerminal = us[STR_USB_OT].id;
 616         io_out_ot_desc.iTerminal = us[STR_IO_OT].id;
 617         std_as_out_if0_desc.iInterface = us[STR_AS_OUT_ALT0].id;
 618         std_as_out_if1_desc.iInterface = us[STR_AS_OUT_ALT1].id;
 619         std_as_in_if0_desc.iInterface = us[STR_AS_IN_ALT0].id;
 620         std_as_in_if1_desc.iInterface = us[STR_AS_IN_ALT1].id;
 621 
 622 
 623         /* Initialize the configurable parameters */
 624         usb_out_it_desc.bNrChannels = num_channels(uac2_opts->c_chmask);
 625         usb_out_it_desc.bmChannelConfig = cpu_to_le32(uac2_opts->c_chmask);
 626         io_in_it_desc.bNrChannels = num_channels(uac2_opts->p_chmask);
 627         io_in_it_desc.bmChannelConfig = cpu_to_le32(uac2_opts->p_chmask);
 628         as_out_hdr_desc.bNrChannels = num_channels(uac2_opts->c_chmask);
 629         as_out_hdr_desc.bmChannelConfig = cpu_to_le32(uac2_opts->c_chmask);
 630         as_in_hdr_desc.bNrChannels = num_channels(uac2_opts->p_chmask);
 631         as_in_hdr_desc.bmChannelConfig = cpu_to_le32(uac2_opts->p_chmask);
 632         as_out_fmt1_desc.bSubslotSize = uac2_opts->c_ssize;
 633         as_out_fmt1_desc.bBitResolution = uac2_opts->c_ssize * 8;
 634         as_in_fmt1_desc.bSubslotSize = uac2_opts->p_ssize;
 635         as_in_fmt1_desc.bBitResolution = uac2_opts->p_ssize * 8;
 636 
 637         snprintf(clksrc_in, sizeof(clksrc_in), "%uHz", uac2_opts->p_srate);
 638         snprintf(clksrc_out, sizeof(clksrc_out), "%uHz", uac2_opts->c_srate);
 639 
 640         ret = usb_interface_id(cfg, fn);
 641         if (ret < 0) {
 642                 dev_err(dev, "%s:%d Error!\n", __func__, __LINE__);
 643                 return ret;
 644         }
 645         iad_desc.bFirstInterface = ret;
 646 
 647         std_ac_if_desc.bInterfaceNumber = ret;
 648         uac2->ac_intf = ret;
 649         uac2->ac_alt = 0;
 650 
 651         if (EPOUT_EN(uac2_opts)) {
 652                 ret = usb_interface_id(cfg, fn);
 653                 if (ret < 0) {
 654                         dev_err(dev, "%s:%d Error!\n", __func__, __LINE__);
 655                         return ret;
 656                 }
 657                 std_as_out_if0_desc.bInterfaceNumber = ret;
 658                 std_as_out_if1_desc.bInterfaceNumber = ret;
 659                 uac2->as_out_intf = ret;
 660                 uac2->as_out_alt = 0;
 661         }
 662 
 663         if (EPIN_EN(uac2_opts)) {
 664                 ret = usb_interface_id(cfg, fn);
 665                 if (ret < 0) {
 666                         dev_err(dev, "%s:%d Error!\n", __func__, __LINE__);
 667                         return ret;
 668                 }
 669                 std_as_in_if0_desc.bInterfaceNumber = ret;
 670                 std_as_in_if1_desc.bInterfaceNumber = ret;
 671                 uac2->as_in_intf = ret;
 672                 uac2->as_in_alt = 0;
 673         }
 674 
 675         /* Calculate wMaxPacketSize according to audio bandwidth */
 676         set_ep_max_packet_size(uac2_opts, &fs_epin_desc, 1000, true);
 677         set_ep_max_packet_size(uac2_opts, &fs_epout_desc, 1000, false);
 678         set_ep_max_packet_size(uac2_opts, &hs_epin_desc, 8000, true);
 679         set_ep_max_packet_size(uac2_opts, &hs_epout_desc, 8000, false);
 680 
 681         if (EPOUT_EN(uac2_opts)) {
 682                 agdev->out_ep = usb_ep_autoconfig(gadget, &fs_epout_desc);
 683                 if (!agdev->out_ep) {
 684                         dev_err(dev, "%s:%d Error!\n", __func__, __LINE__);
 685                         return -ENODEV;
 686                 }
 687         }
 688 
 689         if (EPIN_EN(uac2_opts)) {
 690                 agdev->in_ep = usb_ep_autoconfig(gadget, &fs_epin_desc);
 691                 if (!agdev->in_ep) {
 692                         dev_err(dev, "%s:%d Error!\n", __func__, __LINE__);
 693                         return -ENODEV;
 694                 }
 695         }
 696 
 697         agdev->in_ep_maxpsize = max_t(u16,
 698                                 le16_to_cpu(fs_epin_desc.wMaxPacketSize),
 699                                 le16_to_cpu(hs_epin_desc.wMaxPacketSize));
 700         agdev->out_ep_maxpsize = max_t(u16,
 701                                 le16_to_cpu(fs_epout_desc.wMaxPacketSize),
 702                                 le16_to_cpu(hs_epout_desc.wMaxPacketSize));
 703 
 704         hs_epout_desc.bEndpointAddress = fs_epout_desc.bEndpointAddress;
 705         hs_epin_desc.bEndpointAddress = fs_epin_desc.bEndpointAddress;
 706 
 707         setup_descriptor(uac2_opts);
 708 
 709         ret = usb_assign_descriptors(fn, fs_audio_desc, hs_audio_desc, NULL,
 710                                      NULL);
 711         if (ret)
 712                 return ret;
 713 
 714         agdev->gadget = gadget;
 715 
 716         agdev->params.p_chmask = uac2_opts->p_chmask;
 717         agdev->params.p_srate = uac2_opts->p_srate;
 718         agdev->params.p_ssize = uac2_opts->p_ssize;
 719         agdev->params.c_chmask = uac2_opts->c_chmask;
 720         agdev->params.c_srate = uac2_opts->c_srate;
 721         agdev->params.c_ssize = uac2_opts->c_ssize;
 722         agdev->params.req_number = uac2_opts->req_number;
 723         ret = g_audio_setup(agdev, "UAC2 PCM", "UAC2_Gadget");
 724         if (ret)
 725                 goto err_free_descs;
 726         return 0;
 727 
 728 err_free_descs:
 729         usb_free_all_descriptors(fn);
 730         agdev->gadget = NULL;
 731         return ret;
 732 }
 733 
 734 static int
 735 afunc_set_alt(struct usb_function *fn, unsigned intf, unsigned alt)
 736 {
 737         struct usb_composite_dev *cdev = fn->config->cdev;
 738         struct f_uac2 *uac2 = func_to_uac2(fn);
 739         struct usb_gadget *gadget = cdev->gadget;
 740         struct device *dev = &gadget->dev;
 741         int ret = 0;
 742 
 743         /* No i/f has more than 2 alt settings */
 744         if (alt > 1) {
 745                 dev_err(dev, "%s:%d Error!\n", __func__, __LINE__);
 746                 return -EINVAL;
 747         }
 748 
 749         if (intf == uac2->ac_intf) {
 750                 /* Control I/f has only 1 AltSetting - 0 */
 751                 if (alt) {
 752                         dev_err(dev, "%s:%d Error!\n", __func__, __LINE__);
 753                         return -EINVAL;
 754                 }
 755                 return 0;
 756         }
 757 
 758         if (intf == uac2->as_out_intf) {
 759                 uac2->as_out_alt = alt;
 760 
 761                 if (alt)
 762                         ret = u_audio_start_capture(&uac2->g_audio);
 763                 else
 764                         u_audio_stop_capture(&uac2->g_audio);
 765         } else if (intf == uac2->as_in_intf) {
 766                 uac2->as_in_alt = alt;
 767 
 768                 if (alt)
 769                         ret = u_audio_start_playback(&uac2->g_audio);
 770                 else
 771                         u_audio_stop_playback(&uac2->g_audio);
 772         } else {
 773                 dev_err(dev, "%s:%d Error!\n", __func__, __LINE__);
 774                 return -EINVAL;
 775         }
 776 
 777         return ret;
 778 }
 779 
 780 static int
 781 afunc_get_alt(struct usb_function *fn, unsigned intf)
 782 {
 783         struct f_uac2 *uac2 = func_to_uac2(fn);
 784         struct g_audio *agdev = func_to_g_audio(fn);
 785 
 786         if (intf == uac2->ac_intf)
 787                 return uac2->ac_alt;
 788         else if (intf == uac2->as_out_intf)
 789                 return uac2->as_out_alt;
 790         else if (intf == uac2->as_in_intf)
 791                 return uac2->as_in_alt;
 792         else
 793                 dev_err(&agdev->gadget->dev,
 794                         "%s:%d Invalid Interface %d!\n",
 795                         __func__, __LINE__, intf);
 796 
 797         return -EINVAL;
 798 }
 799 
 800 static void
 801 afunc_disable(struct usb_function *fn)
 802 {
 803         struct f_uac2 *uac2 = func_to_uac2(fn);
 804 
 805         uac2->as_in_alt = 0;
 806         uac2->as_out_alt = 0;
 807         u_audio_stop_capture(&uac2->g_audio);
 808         u_audio_stop_playback(&uac2->g_audio);
 809 }
 810 
 811 static int
 812 in_rq_cur(struct usb_function *fn, const struct usb_ctrlrequest *cr)
 813 {
 814         struct usb_request *req = fn->config->cdev->req;
 815         struct g_audio *agdev = func_to_g_audio(fn);
 816         struct f_uac2_opts *opts;
 817         u16 w_length = le16_to_cpu(cr->wLength);
 818         u16 w_index = le16_to_cpu(cr->wIndex);
 819         u16 w_value = le16_to_cpu(cr->wValue);
 820         u8 entity_id = (w_index >> 8) & 0xff;
 821         u8 control_selector = w_value >> 8;
 822         int value = -EOPNOTSUPP;
 823         int p_srate, c_srate;
 824 
 825         opts = g_audio_to_uac2_opts(agdev);
 826         p_srate = opts->p_srate;
 827         c_srate = opts->c_srate;
 828 
 829         if (control_selector == UAC2_CS_CONTROL_SAM_FREQ) {
 830                 struct cntrl_cur_lay3 c;
 831                 memset(&c, 0, sizeof(struct cntrl_cur_lay3));
 832 
 833                 if (entity_id == USB_IN_CLK_ID)
 834                         c.dCUR = cpu_to_le32(p_srate);
 835                 else if (entity_id == USB_OUT_CLK_ID)
 836                         c.dCUR = cpu_to_le32(c_srate);
 837 
 838                 value = min_t(unsigned, w_length, sizeof c);
 839                 memcpy(req->buf, &c, value);
 840         } else if (control_selector == UAC2_CS_CONTROL_CLOCK_VALID) {
 841                 *(u8 *)req->buf = 1;
 842                 value = min_t(unsigned, w_length, 1);
 843         } else {
 844                 dev_err(&agdev->gadget->dev,
 845                         "%s:%d control_selector=%d TODO!\n",
 846                         __func__, __LINE__, control_selector);
 847         }
 848 
 849         return value;
 850 }
 851 
 852 static int
 853 in_rq_range(struct usb_function *fn, const struct usb_ctrlrequest *cr)
 854 {
 855         struct usb_request *req = fn->config->cdev->req;
 856         struct g_audio *agdev = func_to_g_audio(fn);
 857         struct f_uac2_opts *opts;
 858         u16 w_length = le16_to_cpu(cr->wLength);
 859         u16 w_index = le16_to_cpu(cr->wIndex);
 860         u16 w_value = le16_to_cpu(cr->wValue);
 861         u8 entity_id = (w_index >> 8) & 0xff;
 862         u8 control_selector = w_value >> 8;
 863         struct cntrl_range_lay3 r;
 864         int value = -EOPNOTSUPP;
 865         int p_srate, c_srate;
 866 
 867         opts = g_audio_to_uac2_opts(agdev);
 868         p_srate = opts->p_srate;
 869         c_srate = opts->c_srate;
 870 
 871         if (control_selector == UAC2_CS_CONTROL_SAM_FREQ) {
 872                 if (entity_id == USB_IN_CLK_ID)
 873                         r.dMIN = cpu_to_le32(p_srate);
 874                 else if (entity_id == USB_OUT_CLK_ID)
 875                         r.dMIN = cpu_to_le32(c_srate);
 876                 else
 877                         return -EOPNOTSUPP;
 878 
 879                 r.dMAX = r.dMIN;
 880                 r.dRES = 0;
 881                 r.wNumSubRanges = cpu_to_le16(1);
 882 
 883                 value = min_t(unsigned, w_length, sizeof r);
 884                 memcpy(req->buf, &r, value);
 885         } else {
 886                 dev_err(&agdev->gadget->dev,
 887                         "%s:%d control_selector=%d TODO!\n",
 888                         __func__, __LINE__, control_selector);
 889         }
 890 
 891         return value;
 892 }
 893 
 894 static int
 895 ac_rq_in(struct usb_function *fn, const struct usb_ctrlrequest *cr)
 896 {
 897         if (cr->bRequest == UAC2_CS_CUR)
 898                 return in_rq_cur(fn, cr);
 899         else if (cr->bRequest == UAC2_CS_RANGE)
 900                 return in_rq_range(fn, cr);
 901         else
 902                 return -EOPNOTSUPP;
 903 }
 904 
 905 static int
 906 out_rq_cur(struct usb_function *fn, const struct usb_ctrlrequest *cr)
 907 {
 908         u16 w_length = le16_to_cpu(cr->wLength);
 909         u16 w_value = le16_to_cpu(cr->wValue);
 910         u8 control_selector = w_value >> 8;
 911 
 912         if (control_selector == UAC2_CS_CONTROL_SAM_FREQ)
 913                 return w_length;
 914 
 915         return -EOPNOTSUPP;
 916 }
 917 
 918 static int
 919 setup_rq_inf(struct usb_function *fn, const struct usb_ctrlrequest *cr)
 920 {
 921         struct f_uac2 *uac2 = func_to_uac2(fn);
 922         struct g_audio *agdev = func_to_g_audio(fn);
 923         u16 w_index = le16_to_cpu(cr->wIndex);
 924         u8 intf = w_index & 0xff;
 925 
 926         if (intf != uac2->ac_intf) {
 927                 dev_err(&agdev->gadget->dev,
 928                         "%s:%d Error!\n", __func__, __LINE__);
 929                 return -EOPNOTSUPP;
 930         }
 931 
 932         if (cr->bRequestType & USB_DIR_IN)
 933                 return ac_rq_in(fn, cr);
 934         else if (cr->bRequest == UAC2_CS_CUR)
 935                 return out_rq_cur(fn, cr);
 936 
 937         return -EOPNOTSUPP;
 938 }
 939 
 940 static int
 941 afunc_setup(struct usb_function *fn, const struct usb_ctrlrequest *cr)
 942 {
 943         struct usb_composite_dev *cdev = fn->config->cdev;
 944         struct g_audio *agdev = func_to_g_audio(fn);
 945         struct usb_request *req = cdev->req;
 946         u16 w_length = le16_to_cpu(cr->wLength);
 947         int value = -EOPNOTSUPP;
 948 
 949         /* Only Class specific requests are supposed to reach here */
 950         if ((cr->bRequestType & USB_TYPE_MASK) != USB_TYPE_CLASS)
 951                 return -EOPNOTSUPP;
 952 
 953         if ((cr->bRequestType & USB_RECIP_MASK) == USB_RECIP_INTERFACE)
 954                 value = setup_rq_inf(fn, cr);
 955         else
 956                 dev_err(&agdev->gadget->dev, "%s:%d Error!\n",
 957                                 __func__, __LINE__);
 958 
 959         if (value >= 0) {
 960                 req->length = value;
 961                 req->zero = value < w_length;
 962                 value = usb_ep_queue(cdev->gadget->ep0, req, GFP_ATOMIC);
 963                 if (value < 0) {
 964                         dev_err(&agdev->gadget->dev,
 965                                 "%s:%d Error!\n", __func__, __LINE__);
 966                         req->status = 0;
 967                 }
 968         }
 969 
 970         return value;
 971 }
 972 
 973 static inline struct f_uac2_opts *to_f_uac2_opts(struct config_item *item)
 974 {
 975         return container_of(to_config_group(item), struct f_uac2_opts,
 976                             func_inst.group);
 977 }
 978 
 979 static void f_uac2_attr_release(struct config_item *item)
 980 {
 981         struct f_uac2_opts *opts = to_f_uac2_opts(item);
 982 
 983         usb_put_function_instance(&opts->func_inst);
 984 }
 985 
 986 static struct configfs_item_operations f_uac2_item_ops = {
 987         .release        = f_uac2_attr_release,
 988 };
 989 
 990 #define UAC2_ATTRIBUTE(name)                                            \
 991 static ssize_t f_uac2_opts_##name##_show(struct config_item *item,      \
 992                                          char *page)                    \
 993 {                                                                       \
 994         struct f_uac2_opts *opts = to_f_uac2_opts(item);                \
 995         int result;                                                     \
 996                                                                         \
 997         mutex_lock(&opts->lock);                                        \
 998         result = sprintf(page, "%u\n", opts->name);                     \
 999         mutex_unlock(&opts->lock);                                      \
1000                                                                         \
1001         return result;                                                  \
1002 }                                                                       \
1003                                                                         \
1004 static ssize_t f_uac2_opts_##name##_store(struct config_item *item,     \
1005                                           const char *page, size_t len) \
1006 {                                                                       \
1007         struct f_uac2_opts *opts = to_f_uac2_opts(item);                \
1008         int ret;                                                        \
1009         u32 num;                                                        \
1010                                                                         \
1011         mutex_lock(&opts->lock);                                        \
1012         if (opts->refcnt) {                                             \
1013                 ret = -EBUSY;                                           \
1014                 goto end;                                               \
1015         }                                                               \
1016                                                                         \
1017         ret = kstrtou32(page, 0, &num);                                 \
1018         if (ret)                                                        \
1019                 goto end;                                               \
1020                                                                         \
1021         opts->name = num;                                               \
1022         ret = len;                                                      \
1023                                                                         \
1024 end:                                                                    \
1025         mutex_unlock(&opts->lock);                                      \
1026         return ret;                                                     \
1027 }                                                                       \
1028                                                                         \
1029 CONFIGFS_ATTR(f_uac2_opts_, name)
1030 
1031 UAC2_ATTRIBUTE(p_chmask);
1032 UAC2_ATTRIBUTE(p_srate);
1033 UAC2_ATTRIBUTE(p_ssize);
1034 UAC2_ATTRIBUTE(c_chmask);
1035 UAC2_ATTRIBUTE(c_srate);
1036 UAC2_ATTRIBUTE(c_ssize);
1037 UAC2_ATTRIBUTE(req_number);
1038 
1039 static struct configfs_attribute *f_uac2_attrs[] = {
1040         &f_uac2_opts_attr_p_chmask,
1041         &f_uac2_opts_attr_p_srate,
1042         &f_uac2_opts_attr_p_ssize,
1043         &f_uac2_opts_attr_c_chmask,
1044         &f_uac2_opts_attr_c_srate,
1045         &f_uac2_opts_attr_c_ssize,
1046         &f_uac2_opts_attr_req_number,
1047         NULL,
1048 };
1049 
1050 static const struct config_item_type f_uac2_func_type = {
1051         .ct_item_ops    = &f_uac2_item_ops,
1052         .ct_attrs       = f_uac2_attrs,
1053         .ct_owner       = THIS_MODULE,
1054 };
1055 
1056 static void afunc_free_inst(struct usb_function_instance *f)
1057 {
1058         struct f_uac2_opts *opts;
1059 
1060         opts = container_of(f, struct f_uac2_opts, func_inst);
1061         kfree(opts);
1062 }
1063 
1064 static struct usb_function_instance *afunc_alloc_inst(void)
1065 {
1066         struct f_uac2_opts *opts;
1067 
1068         opts = kzalloc(sizeof(*opts), GFP_KERNEL);
1069         if (!opts)
1070                 return ERR_PTR(-ENOMEM);
1071 
1072         mutex_init(&opts->lock);
1073         opts->func_inst.free_func_inst = afunc_free_inst;
1074 
1075         config_group_init_type_name(&opts->func_inst.group, "",
1076                                     &f_uac2_func_type);
1077 
1078         opts->p_chmask = UAC2_DEF_PCHMASK;
1079         opts->p_srate = UAC2_DEF_PSRATE;
1080         opts->p_ssize = UAC2_DEF_PSSIZE;
1081         opts->c_chmask = UAC2_DEF_CCHMASK;
1082         opts->c_srate = UAC2_DEF_CSRATE;
1083         opts->c_ssize = UAC2_DEF_CSSIZE;
1084         opts->req_number = UAC2_DEF_REQ_NUM;
1085         return &opts->func_inst;
1086 }
1087 
1088 static void afunc_free(struct usb_function *f)
1089 {
1090         struct g_audio *agdev;
1091         struct f_uac2_opts *opts;
1092 
1093         agdev = func_to_g_audio(f);
1094         opts = container_of(f->fi, struct f_uac2_opts, func_inst);
1095         kfree(agdev);
1096         mutex_lock(&opts->lock);
1097         --opts->refcnt;
1098         mutex_unlock(&opts->lock);
1099 }
1100 
1101 static void afunc_unbind(struct usb_configuration *c, struct usb_function *f)
1102 {
1103         struct g_audio *agdev = func_to_g_audio(f);
1104 
1105         g_audio_cleanup(agdev);
1106         usb_free_all_descriptors(f);
1107 
1108         agdev->gadget = NULL;
1109 }
1110 
1111 static struct usb_function *afunc_alloc(struct usb_function_instance *fi)
1112 {
1113         struct f_uac2   *uac2;
1114         struct f_uac2_opts *opts;
1115 
1116         uac2 = kzalloc(sizeof(*uac2), GFP_KERNEL);
1117         if (uac2 == NULL)
1118                 return ERR_PTR(-ENOMEM);
1119 
1120         opts = container_of(fi, struct f_uac2_opts, func_inst);
1121         mutex_lock(&opts->lock);
1122         ++opts->refcnt;
1123         mutex_unlock(&opts->lock);
1124 
1125         uac2->g_audio.func.name = "uac2_func";
1126         uac2->g_audio.func.bind = afunc_bind;
1127         uac2->g_audio.func.unbind = afunc_unbind;
1128         uac2->g_audio.func.set_alt = afunc_set_alt;
1129         uac2->g_audio.func.get_alt = afunc_get_alt;
1130         uac2->g_audio.func.disable = afunc_disable;
1131         uac2->g_audio.func.setup = afunc_setup;
1132         uac2->g_audio.func.free_func = afunc_free;
1133 
1134         return &uac2->g_audio.func;
1135 }
1136 
1137 DECLARE_USB_FUNCTION_INIT(uac2, afunc_alloc_inst, afunc_alloc);
1138 MODULE_LICENSE("GPL");
1139 MODULE_AUTHOR("Yadwinder Singh");
1140 MODULE_AUTHOR("Jaswinder Singh");

/* [<][>][^][v][top][bottom][index][help] */