Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v3.13-rc8 1362 lines 35 kB view raw
1/* 2 * f_uac2.c -- USB Audio Class 2.0 Function 3 * 4 * Copyright (C) 2011 5 * Yadwinder Singh (yadi.brar01@gmail.com) 6 * Jaswinder Singh (jaswinder.singh@linaro.org) 7 * 8 * This program is free software; you can redistribute it and/or modify 9 * it under the terms of the GNU General Public License as published by 10 * the Free Software Foundation; either version 2 of the License, or 11 * (at your option) any later version. 12 */ 13 14#include <linux/usb/audio.h> 15#include <linux/usb/audio-v2.h> 16#include <linux/platform_device.h> 17#include <linux/module.h> 18 19#include <sound/core.h> 20#include <sound/pcm.h> 21#include <sound/pcm_params.h> 22 23/* Playback(USB-IN) Default Stereo - Fl/Fr */ 24static int p_chmask = 0x3; 25module_param(p_chmask, uint, S_IRUGO); 26MODULE_PARM_DESC(p_chmask, "Playback Channel Mask"); 27 28/* Playback Default 48 KHz */ 29static int p_srate = 48000; 30module_param(p_srate, uint, S_IRUGO); 31MODULE_PARM_DESC(p_srate, "Playback Sampling Rate"); 32 33/* Playback Default 16bits/sample */ 34static int p_ssize = 2; 35module_param(p_ssize, uint, S_IRUGO); 36MODULE_PARM_DESC(p_ssize, "Playback Sample Size(bytes)"); 37 38/* Capture(USB-OUT) Default Stereo - Fl/Fr */ 39static int c_chmask = 0x3; 40module_param(c_chmask, uint, S_IRUGO); 41MODULE_PARM_DESC(c_chmask, "Capture Channel Mask"); 42 43/* Capture Default 64 KHz */ 44static int c_srate = 64000; 45module_param(c_srate, uint, S_IRUGO); 46MODULE_PARM_DESC(c_srate, "Capture Sampling Rate"); 47 48/* Capture Default 16bits/sample */ 49static int c_ssize = 2; 50module_param(c_ssize, uint, S_IRUGO); 51MODULE_PARM_DESC(c_ssize, "Capture Sample Size(bytes)"); 52 53/* Keep everyone on toes */ 54#define USB_XFERS 2 55 56/* 57 * The driver implements a simple UAC_2 topology. 58 * USB-OUT -> IT_1 -> OT_3 -> ALSA_Capture 59 * ALSA_Playback -> IT_2 -> OT_4 -> USB-IN 60 * Capture and Playback sampling rates are independently 61 * controlled by two clock sources : 62 * CLK_5 := c_srate, and CLK_6 := p_srate 63 */ 64#define USB_OUT_IT_ID 1 65#define IO_IN_IT_ID 2 66#define IO_OUT_OT_ID 3 67#define USB_IN_OT_ID 4 68#define USB_OUT_CLK_ID 5 69#define USB_IN_CLK_ID 6 70 71#define CONTROL_ABSENT 0 72#define CONTROL_RDONLY 1 73#define CONTROL_RDWR 3 74 75#define CLK_FREQ_CTRL 0 76#define CLK_VLD_CTRL 2 77 78#define COPY_CTRL 0 79#define CONN_CTRL 2 80#define OVRLD_CTRL 4 81#define CLSTR_CTRL 6 82#define UNFLW_CTRL 8 83#define OVFLW_CTRL 10 84 85const char *uac2_name = "snd_uac2"; 86 87struct uac2_req { 88 struct uac2_rtd_params *pp; /* parent param */ 89 struct usb_request *req; 90}; 91 92struct uac2_rtd_params { 93 struct snd_uac2_chip *uac2; /* parent chip */ 94 bool ep_enabled; /* if the ep is enabled */ 95 /* Size of the ring buffer */ 96 size_t dma_bytes; 97 unsigned char *dma_area; 98 99 struct snd_pcm_substream *ss; 100 101 /* Ring buffer */ 102 ssize_t hw_ptr; 103 104 void *rbuf; 105 106 size_t period_size; 107 108 unsigned max_psize; 109 struct uac2_req ureq[USB_XFERS]; 110 111 spinlock_t lock; 112}; 113 114struct snd_uac2_chip { 115 struct platform_device pdev; 116 struct platform_driver pdrv; 117 118 struct uac2_rtd_params p_prm; 119 struct uac2_rtd_params c_prm; 120 121 struct snd_card *card; 122 struct snd_pcm *pcm; 123}; 124 125#define BUFF_SIZE_MAX (PAGE_SIZE * 16) 126#define PRD_SIZE_MAX PAGE_SIZE 127#define MIN_PERIODS 4 128 129static struct snd_pcm_hardware uac2_pcm_hardware = { 130 .info = SNDRV_PCM_INFO_INTERLEAVED | SNDRV_PCM_INFO_BLOCK_TRANSFER 131 | SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_MMAP_VALID 132 | SNDRV_PCM_INFO_PAUSE | SNDRV_PCM_INFO_RESUME, 133 .rates = SNDRV_PCM_RATE_CONTINUOUS, 134 .periods_max = BUFF_SIZE_MAX / PRD_SIZE_MAX, 135 .buffer_bytes_max = BUFF_SIZE_MAX, 136 .period_bytes_max = PRD_SIZE_MAX, 137 .periods_min = MIN_PERIODS, 138}; 139 140struct audio_dev { 141 u8 ac_intf, ac_alt; 142 u8 as_out_intf, as_out_alt; 143 u8 as_in_intf, as_in_alt; 144 145 struct usb_ep *in_ep, *out_ep; 146 struct usb_function func; 147 148 /* The ALSA Sound Card it represents on the USB-Client side */ 149 struct snd_uac2_chip uac2; 150}; 151 152static struct audio_dev *agdev_g; 153 154static inline 155struct audio_dev *func_to_agdev(struct usb_function *f) 156{ 157 return container_of(f, struct audio_dev, func); 158} 159 160static inline 161struct audio_dev *uac2_to_agdev(struct snd_uac2_chip *u) 162{ 163 return container_of(u, struct audio_dev, uac2); 164} 165 166static inline 167struct snd_uac2_chip *pdev_to_uac2(struct platform_device *p) 168{ 169 return container_of(p, struct snd_uac2_chip, pdev); 170} 171 172static inline 173uint num_channels(uint chanmask) 174{ 175 uint num = 0; 176 177 while (chanmask) { 178 num += (chanmask & 1); 179 chanmask >>= 1; 180 } 181 182 return num; 183} 184 185static void 186agdev_iso_complete(struct usb_ep *ep, struct usb_request *req) 187{ 188 unsigned pending; 189 unsigned long flags; 190 bool update_alsa = false; 191 unsigned char *src, *dst; 192 int status = req->status; 193 struct uac2_req *ur = req->context; 194 struct snd_pcm_substream *substream; 195 struct uac2_rtd_params *prm = ur->pp; 196 struct snd_uac2_chip *uac2 = prm->uac2; 197 198 /* i/f shutting down */ 199 if (!prm->ep_enabled) 200 return; 201 202 /* 203 * We can't really do much about bad xfers. 204 * Afterall, the ISOCH xfers could fail legitimately. 205 */ 206 if (status) 207 pr_debug("%s: iso_complete status(%d) %d/%d\n", 208 __func__, status, req->actual, req->length); 209 210 substream = prm->ss; 211 212 /* Do nothing if ALSA isn't active */ 213 if (!substream) 214 goto exit; 215 216 spin_lock_irqsave(&prm->lock, flags); 217 218 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { 219 src = prm->dma_area + prm->hw_ptr; 220 req->actual = req->length; 221 dst = req->buf; 222 } else { 223 dst = prm->dma_area + prm->hw_ptr; 224 src = req->buf; 225 } 226 227 pending = prm->hw_ptr % prm->period_size; 228 pending += req->actual; 229 if (pending >= prm->period_size) 230 update_alsa = true; 231 232 prm->hw_ptr = (prm->hw_ptr + req->actual) % prm->dma_bytes; 233 234 spin_unlock_irqrestore(&prm->lock, flags); 235 236 /* Pack USB load in ALSA ring buffer */ 237 memcpy(dst, src, req->actual); 238exit: 239 if (usb_ep_queue(ep, req, GFP_ATOMIC)) 240 dev_err(&uac2->pdev.dev, "%d Error!\n", __LINE__); 241 242 if (update_alsa) 243 snd_pcm_period_elapsed(substream); 244 245 return; 246} 247 248static int 249uac2_pcm_trigger(struct snd_pcm_substream *substream, int cmd) 250{ 251 struct snd_uac2_chip *uac2 = snd_pcm_substream_chip(substream); 252 struct uac2_rtd_params *prm; 253 unsigned long flags; 254 int err = 0; 255 256 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) 257 prm = &uac2->p_prm; 258 else 259 prm = &uac2->c_prm; 260 261 spin_lock_irqsave(&prm->lock, flags); 262 263 /* Reset */ 264 prm->hw_ptr = 0; 265 266 switch (cmd) { 267 case SNDRV_PCM_TRIGGER_START: 268 case SNDRV_PCM_TRIGGER_RESUME: 269 prm->ss = substream; 270 break; 271 case SNDRV_PCM_TRIGGER_STOP: 272 case SNDRV_PCM_TRIGGER_SUSPEND: 273 prm->ss = NULL; 274 break; 275 default: 276 err = -EINVAL; 277 } 278 279 spin_unlock_irqrestore(&prm->lock, flags); 280 281 /* Clear buffer after Play stops */ 282 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK && !prm->ss) 283 memset(prm->rbuf, 0, prm->max_psize * USB_XFERS); 284 285 return err; 286} 287 288static snd_pcm_uframes_t uac2_pcm_pointer(struct snd_pcm_substream *substream) 289{ 290 struct snd_uac2_chip *uac2 = snd_pcm_substream_chip(substream); 291 struct uac2_rtd_params *prm; 292 293 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) 294 prm = &uac2->p_prm; 295 else 296 prm = &uac2->c_prm; 297 298 return bytes_to_frames(substream->runtime, prm->hw_ptr); 299} 300 301static int uac2_pcm_hw_params(struct snd_pcm_substream *substream, 302 struct snd_pcm_hw_params *hw_params) 303{ 304 struct snd_uac2_chip *uac2 = snd_pcm_substream_chip(substream); 305 struct uac2_rtd_params *prm; 306 int err; 307 308 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) 309 prm = &uac2->p_prm; 310 else 311 prm = &uac2->c_prm; 312 313 err = snd_pcm_lib_malloc_pages(substream, 314 params_buffer_bytes(hw_params)); 315 if (err >= 0) { 316 prm->dma_bytes = substream->runtime->dma_bytes; 317 prm->dma_area = substream->runtime->dma_area; 318 prm->period_size = params_period_bytes(hw_params); 319 } 320 321 return err; 322} 323 324static int uac2_pcm_hw_free(struct snd_pcm_substream *substream) 325{ 326 struct snd_uac2_chip *uac2 = snd_pcm_substream_chip(substream); 327 struct uac2_rtd_params *prm; 328 329 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) 330 prm = &uac2->p_prm; 331 else 332 prm = &uac2->c_prm; 333 334 prm->dma_area = NULL; 335 prm->dma_bytes = 0; 336 prm->period_size = 0; 337 338 return snd_pcm_lib_free_pages(substream); 339} 340 341static int uac2_pcm_open(struct snd_pcm_substream *substream) 342{ 343 struct snd_uac2_chip *uac2 = snd_pcm_substream_chip(substream); 344 struct snd_pcm_runtime *runtime = substream->runtime; 345 346 runtime->hw = uac2_pcm_hardware; 347 348 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { 349 spin_lock_init(&uac2->p_prm.lock); 350 runtime->hw.rate_min = p_srate; 351 runtime->hw.formats = SNDRV_PCM_FMTBIT_S16_LE; /* ! p_ssize ! */ 352 runtime->hw.channels_min = num_channels(p_chmask); 353 runtime->hw.period_bytes_min = 2 * uac2->p_prm.max_psize 354 / runtime->hw.periods_min; 355 } else { 356 spin_lock_init(&uac2->c_prm.lock); 357 runtime->hw.rate_min = c_srate; 358 runtime->hw.formats = SNDRV_PCM_FMTBIT_S16_LE; /* ! c_ssize ! */ 359 runtime->hw.channels_min = num_channels(c_chmask); 360 runtime->hw.period_bytes_min = 2 * uac2->c_prm.max_psize 361 / runtime->hw.periods_min; 362 } 363 364 runtime->hw.rate_max = runtime->hw.rate_min; 365 runtime->hw.channels_max = runtime->hw.channels_min; 366 367 snd_pcm_hw_constraint_integer(runtime, SNDRV_PCM_HW_PARAM_PERIODS); 368 369 return 0; 370} 371 372/* ALSA cries without these function pointers */ 373static int uac2_pcm_null(struct snd_pcm_substream *substream) 374{ 375 return 0; 376} 377 378static struct snd_pcm_ops uac2_pcm_ops = { 379 .open = uac2_pcm_open, 380 .close = uac2_pcm_null, 381 .ioctl = snd_pcm_lib_ioctl, 382 .hw_params = uac2_pcm_hw_params, 383 .hw_free = uac2_pcm_hw_free, 384 .trigger = uac2_pcm_trigger, 385 .pointer = uac2_pcm_pointer, 386 .prepare = uac2_pcm_null, 387}; 388 389static int snd_uac2_probe(struct platform_device *pdev) 390{ 391 struct snd_uac2_chip *uac2 = pdev_to_uac2(pdev); 392 struct snd_card *card; 393 struct snd_pcm *pcm; 394 int err; 395 396 /* Choose any slot, with no id */ 397 err = snd_card_create(-1, NULL, THIS_MODULE, 0, &card); 398 if (err < 0) 399 return err; 400 401 uac2->card = card; 402 403 /* 404 * Create first PCM device 405 * Create a substream only for non-zero channel streams 406 */ 407 err = snd_pcm_new(uac2->card, "UAC2 PCM", 0, 408 p_chmask ? 1 : 0, c_chmask ? 1 : 0, &pcm); 409 if (err < 0) 410 goto snd_fail; 411 412 strcpy(pcm->name, "UAC2 PCM"); 413 pcm->private_data = uac2; 414 415 uac2->pcm = pcm; 416 417 snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &uac2_pcm_ops); 418 snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &uac2_pcm_ops); 419 420 strcpy(card->driver, "UAC2_Gadget"); 421 strcpy(card->shortname, "UAC2_Gadget"); 422 sprintf(card->longname, "UAC2_Gadget %i", pdev->id); 423 424 snd_card_set_dev(card, &pdev->dev); 425 426 snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_CONTINUOUS, 427 snd_dma_continuous_data(GFP_KERNEL), 0, BUFF_SIZE_MAX); 428 429 err = snd_card_register(card); 430 if (!err) { 431 platform_set_drvdata(pdev, card); 432 return 0; 433 } 434 435snd_fail: 436 snd_card_free(card); 437 438 uac2->pcm = NULL; 439 uac2->card = NULL; 440 441 return err; 442} 443 444static int snd_uac2_remove(struct platform_device *pdev) 445{ 446 struct snd_card *card = platform_get_drvdata(pdev); 447 448 if (card) 449 return snd_card_free(card); 450 451 return 0; 452} 453 454static int alsa_uac2_init(struct audio_dev *agdev) 455{ 456 struct snd_uac2_chip *uac2 = &agdev->uac2; 457 int err; 458 459 uac2->pdrv.probe = snd_uac2_probe; 460 uac2->pdrv.remove = snd_uac2_remove; 461 uac2->pdrv.driver.name = uac2_name; 462 463 uac2->pdev.id = 0; 464 uac2->pdev.name = uac2_name; 465 466 /* Register snd_uac2 driver */ 467 err = platform_driver_register(&uac2->pdrv); 468 if (err) 469 return err; 470 471 /* Register snd_uac2 device */ 472 err = platform_device_register(&uac2->pdev); 473 if (err) 474 platform_driver_unregister(&uac2->pdrv); 475 476 return err; 477} 478 479static void alsa_uac2_exit(struct audio_dev *agdev) 480{ 481 struct snd_uac2_chip *uac2 = &agdev->uac2; 482 483 platform_driver_unregister(&uac2->pdrv); 484 platform_device_unregister(&uac2->pdev); 485} 486 487 488/* --------- USB Function Interface ------------- */ 489 490enum { 491 STR_ASSOC, 492 STR_IF_CTRL, 493 STR_CLKSRC_IN, 494 STR_CLKSRC_OUT, 495 STR_USB_IT, 496 STR_IO_IT, 497 STR_USB_OT, 498 STR_IO_OT, 499 STR_AS_OUT_ALT0, 500 STR_AS_OUT_ALT1, 501 STR_AS_IN_ALT0, 502 STR_AS_IN_ALT1, 503}; 504 505static char clksrc_in[8]; 506static char clksrc_out[8]; 507 508static struct usb_string strings_fn[] = { 509 [STR_ASSOC].s = "Source/Sink", 510 [STR_IF_CTRL].s = "Topology Control", 511 [STR_CLKSRC_IN].s = clksrc_in, 512 [STR_CLKSRC_OUT].s = clksrc_out, 513 [STR_USB_IT].s = "USBH Out", 514 [STR_IO_IT].s = "USBD Out", 515 [STR_USB_OT].s = "USBH In", 516 [STR_IO_OT].s = "USBD In", 517 [STR_AS_OUT_ALT0].s = "Playback Inactive", 518 [STR_AS_OUT_ALT1].s = "Playback Active", 519 [STR_AS_IN_ALT0].s = "Capture Inactive", 520 [STR_AS_IN_ALT1].s = "Capture Active", 521 { }, 522}; 523 524static struct usb_gadget_strings str_fn = { 525 .language = 0x0409, /* en-us */ 526 .strings = strings_fn, 527}; 528 529static struct usb_gadget_strings *fn_strings[] = { 530 &str_fn, 531 NULL, 532}; 533 534static struct usb_qualifier_descriptor devqual_desc = { 535 .bLength = sizeof devqual_desc, 536 .bDescriptorType = USB_DT_DEVICE_QUALIFIER, 537 538 .bcdUSB = cpu_to_le16(0x200), 539 .bDeviceClass = USB_CLASS_MISC, 540 .bDeviceSubClass = 0x02, 541 .bDeviceProtocol = 0x01, 542 .bNumConfigurations = 1, 543 .bRESERVED = 0, 544}; 545 546static struct usb_interface_assoc_descriptor iad_desc = { 547 .bLength = sizeof iad_desc, 548 .bDescriptorType = USB_DT_INTERFACE_ASSOCIATION, 549 550 .bFirstInterface = 0, 551 .bInterfaceCount = 3, 552 .bFunctionClass = USB_CLASS_AUDIO, 553 .bFunctionSubClass = UAC2_FUNCTION_SUBCLASS_UNDEFINED, 554 .bFunctionProtocol = UAC_VERSION_2, 555}; 556 557/* Audio Control Interface */ 558static struct usb_interface_descriptor std_ac_if_desc = { 559 .bLength = sizeof std_ac_if_desc, 560 .bDescriptorType = USB_DT_INTERFACE, 561 562 .bAlternateSetting = 0, 563 .bNumEndpoints = 0, 564 .bInterfaceClass = USB_CLASS_AUDIO, 565 .bInterfaceSubClass = USB_SUBCLASS_AUDIOCONTROL, 566 .bInterfaceProtocol = UAC_VERSION_2, 567}; 568 569/* Clock source for IN traffic */ 570struct uac_clock_source_descriptor in_clk_src_desc = { 571 .bLength = sizeof in_clk_src_desc, 572 .bDescriptorType = USB_DT_CS_INTERFACE, 573 574 .bDescriptorSubtype = UAC2_CLOCK_SOURCE, 575 .bClockID = USB_IN_CLK_ID, 576 .bmAttributes = UAC_CLOCK_SOURCE_TYPE_INT_FIXED, 577 .bmControls = (CONTROL_RDONLY << CLK_FREQ_CTRL), 578 .bAssocTerminal = 0, 579}; 580 581/* Clock source for OUT traffic */ 582struct uac_clock_source_descriptor out_clk_src_desc = { 583 .bLength = sizeof out_clk_src_desc, 584 .bDescriptorType = USB_DT_CS_INTERFACE, 585 586 .bDescriptorSubtype = UAC2_CLOCK_SOURCE, 587 .bClockID = USB_OUT_CLK_ID, 588 .bmAttributes = UAC_CLOCK_SOURCE_TYPE_INT_FIXED, 589 .bmControls = (CONTROL_RDONLY << CLK_FREQ_CTRL), 590 .bAssocTerminal = 0, 591}; 592 593/* Input Terminal for USB_OUT */ 594struct uac2_input_terminal_descriptor usb_out_it_desc = { 595 .bLength = sizeof usb_out_it_desc, 596 .bDescriptorType = USB_DT_CS_INTERFACE, 597 598 .bDescriptorSubtype = UAC_INPUT_TERMINAL, 599 .bTerminalID = USB_OUT_IT_ID, 600 .wTerminalType = cpu_to_le16(UAC_TERMINAL_STREAMING), 601 .bAssocTerminal = 0, 602 .bCSourceID = USB_OUT_CLK_ID, 603 .iChannelNames = 0, 604 .bmControls = (CONTROL_RDWR << COPY_CTRL), 605}; 606 607/* Input Terminal for I/O-In */ 608struct uac2_input_terminal_descriptor io_in_it_desc = { 609 .bLength = sizeof io_in_it_desc, 610 .bDescriptorType = USB_DT_CS_INTERFACE, 611 612 .bDescriptorSubtype = UAC_INPUT_TERMINAL, 613 .bTerminalID = IO_IN_IT_ID, 614 .wTerminalType = cpu_to_le16(UAC_INPUT_TERMINAL_UNDEFINED), 615 .bAssocTerminal = 0, 616 .bCSourceID = USB_IN_CLK_ID, 617 .iChannelNames = 0, 618 .bmControls = (CONTROL_RDWR << COPY_CTRL), 619}; 620 621/* Ouput Terminal for USB_IN */ 622struct uac2_output_terminal_descriptor usb_in_ot_desc = { 623 .bLength = sizeof usb_in_ot_desc, 624 .bDescriptorType = USB_DT_CS_INTERFACE, 625 626 .bDescriptorSubtype = UAC_OUTPUT_TERMINAL, 627 .bTerminalID = USB_IN_OT_ID, 628 .wTerminalType = cpu_to_le16(UAC_TERMINAL_STREAMING), 629 .bAssocTerminal = 0, 630 .bSourceID = IO_IN_IT_ID, 631 .bCSourceID = USB_IN_CLK_ID, 632 .bmControls = (CONTROL_RDWR << COPY_CTRL), 633}; 634 635/* Ouput Terminal for I/O-Out */ 636struct uac2_output_terminal_descriptor io_out_ot_desc = { 637 .bLength = sizeof io_out_ot_desc, 638 .bDescriptorType = USB_DT_CS_INTERFACE, 639 640 .bDescriptorSubtype = UAC_OUTPUT_TERMINAL, 641 .bTerminalID = IO_OUT_OT_ID, 642 .wTerminalType = cpu_to_le16(UAC_OUTPUT_TERMINAL_UNDEFINED), 643 .bAssocTerminal = 0, 644 .bSourceID = USB_OUT_IT_ID, 645 .bCSourceID = USB_OUT_CLK_ID, 646 .bmControls = (CONTROL_RDWR << COPY_CTRL), 647}; 648 649struct uac2_ac_header_descriptor ac_hdr_desc = { 650 .bLength = sizeof ac_hdr_desc, 651 .bDescriptorType = USB_DT_CS_INTERFACE, 652 653 .bDescriptorSubtype = UAC_MS_HEADER, 654 .bcdADC = cpu_to_le16(0x200), 655 .bCategory = UAC2_FUNCTION_IO_BOX, 656 .wTotalLength = sizeof in_clk_src_desc + sizeof out_clk_src_desc 657 + sizeof usb_out_it_desc + sizeof io_in_it_desc 658 + sizeof usb_in_ot_desc + sizeof io_out_ot_desc, 659 .bmControls = 0, 660}; 661 662/* Audio Streaming OUT Interface - Alt0 */ 663static struct usb_interface_descriptor std_as_out_if0_desc = { 664 .bLength = sizeof std_as_out_if0_desc, 665 .bDescriptorType = USB_DT_INTERFACE, 666 667 .bAlternateSetting = 0, 668 .bNumEndpoints = 0, 669 .bInterfaceClass = USB_CLASS_AUDIO, 670 .bInterfaceSubClass = USB_SUBCLASS_AUDIOSTREAMING, 671 .bInterfaceProtocol = UAC_VERSION_2, 672}; 673 674/* Audio Streaming OUT Interface - Alt1 */ 675static struct usb_interface_descriptor std_as_out_if1_desc = { 676 .bLength = sizeof std_as_out_if1_desc, 677 .bDescriptorType = USB_DT_INTERFACE, 678 679 .bAlternateSetting = 1, 680 .bNumEndpoints = 1, 681 .bInterfaceClass = USB_CLASS_AUDIO, 682 .bInterfaceSubClass = USB_SUBCLASS_AUDIOSTREAMING, 683 .bInterfaceProtocol = UAC_VERSION_2, 684}; 685 686/* Audio Stream OUT Intface Desc */ 687struct uac2_as_header_descriptor as_out_hdr_desc = { 688 .bLength = sizeof as_out_hdr_desc, 689 .bDescriptorType = USB_DT_CS_INTERFACE, 690 691 .bDescriptorSubtype = UAC_AS_GENERAL, 692 .bTerminalLink = USB_OUT_IT_ID, 693 .bmControls = 0, 694 .bFormatType = UAC_FORMAT_TYPE_I, 695 .bmFormats = cpu_to_le32(UAC_FORMAT_TYPE_I_PCM), 696 .iChannelNames = 0, 697}; 698 699/* Audio USB_OUT Format */ 700struct uac2_format_type_i_descriptor as_out_fmt1_desc = { 701 .bLength = sizeof as_out_fmt1_desc, 702 .bDescriptorType = USB_DT_CS_INTERFACE, 703 .bDescriptorSubtype = UAC_FORMAT_TYPE, 704 .bFormatType = UAC_FORMAT_TYPE_I, 705}; 706 707/* STD AS ISO OUT Endpoint */ 708struct usb_endpoint_descriptor fs_epout_desc = { 709 .bLength = USB_DT_ENDPOINT_SIZE, 710 .bDescriptorType = USB_DT_ENDPOINT, 711 712 .bEndpointAddress = USB_DIR_OUT, 713 .bmAttributes = USB_ENDPOINT_XFER_ISOC | USB_ENDPOINT_SYNC_ASYNC, 714 .bInterval = 1, 715}; 716 717struct usb_endpoint_descriptor hs_epout_desc = { 718 .bLength = USB_DT_ENDPOINT_SIZE, 719 .bDescriptorType = USB_DT_ENDPOINT, 720 721 .bmAttributes = USB_ENDPOINT_XFER_ISOC | USB_ENDPOINT_SYNC_ASYNC, 722 .bInterval = 4, 723}; 724 725/* CS AS ISO OUT Endpoint */ 726static struct uac2_iso_endpoint_descriptor as_iso_out_desc = { 727 .bLength = sizeof as_iso_out_desc, 728 .bDescriptorType = USB_DT_CS_ENDPOINT, 729 730 .bDescriptorSubtype = UAC_EP_GENERAL, 731 .bmAttributes = 0, 732 .bmControls = 0, 733 .bLockDelayUnits = 0, 734 .wLockDelay = 0, 735}; 736 737/* Audio Streaming IN Interface - Alt0 */ 738static struct usb_interface_descriptor std_as_in_if0_desc = { 739 .bLength = sizeof std_as_in_if0_desc, 740 .bDescriptorType = USB_DT_INTERFACE, 741 742 .bAlternateSetting = 0, 743 .bNumEndpoints = 0, 744 .bInterfaceClass = USB_CLASS_AUDIO, 745 .bInterfaceSubClass = USB_SUBCLASS_AUDIOSTREAMING, 746 .bInterfaceProtocol = UAC_VERSION_2, 747}; 748 749/* Audio Streaming IN Interface - Alt1 */ 750static struct usb_interface_descriptor std_as_in_if1_desc = { 751 .bLength = sizeof std_as_in_if1_desc, 752 .bDescriptorType = USB_DT_INTERFACE, 753 754 .bAlternateSetting = 1, 755 .bNumEndpoints = 1, 756 .bInterfaceClass = USB_CLASS_AUDIO, 757 .bInterfaceSubClass = USB_SUBCLASS_AUDIOSTREAMING, 758 .bInterfaceProtocol = UAC_VERSION_2, 759}; 760 761/* Audio Stream IN Intface Desc */ 762struct uac2_as_header_descriptor as_in_hdr_desc = { 763 .bLength = sizeof as_in_hdr_desc, 764 .bDescriptorType = USB_DT_CS_INTERFACE, 765 766 .bDescriptorSubtype = UAC_AS_GENERAL, 767 .bTerminalLink = USB_IN_OT_ID, 768 .bmControls = 0, 769 .bFormatType = UAC_FORMAT_TYPE_I, 770 .bmFormats = cpu_to_le32(UAC_FORMAT_TYPE_I_PCM), 771 .iChannelNames = 0, 772}; 773 774/* Audio USB_IN Format */ 775struct uac2_format_type_i_descriptor as_in_fmt1_desc = { 776 .bLength = sizeof as_in_fmt1_desc, 777 .bDescriptorType = USB_DT_CS_INTERFACE, 778 .bDescriptorSubtype = UAC_FORMAT_TYPE, 779 .bFormatType = UAC_FORMAT_TYPE_I, 780}; 781 782/* STD AS ISO IN Endpoint */ 783struct usb_endpoint_descriptor fs_epin_desc = { 784 .bLength = USB_DT_ENDPOINT_SIZE, 785 .bDescriptorType = USB_DT_ENDPOINT, 786 787 .bEndpointAddress = USB_DIR_IN, 788 .bmAttributes = USB_ENDPOINT_XFER_ISOC | USB_ENDPOINT_SYNC_ASYNC, 789 .bInterval = 1, 790}; 791 792struct usb_endpoint_descriptor hs_epin_desc = { 793 .bLength = USB_DT_ENDPOINT_SIZE, 794 .bDescriptorType = USB_DT_ENDPOINT, 795 796 .bmAttributes = USB_ENDPOINT_XFER_ISOC | USB_ENDPOINT_SYNC_ASYNC, 797 .bInterval = 4, 798}; 799 800/* CS AS ISO IN Endpoint */ 801static struct uac2_iso_endpoint_descriptor as_iso_in_desc = { 802 .bLength = sizeof as_iso_in_desc, 803 .bDescriptorType = USB_DT_CS_ENDPOINT, 804 805 .bDescriptorSubtype = UAC_EP_GENERAL, 806 .bmAttributes = 0, 807 .bmControls = 0, 808 .bLockDelayUnits = 0, 809 .wLockDelay = 0, 810}; 811 812static struct usb_descriptor_header *fs_audio_desc[] = { 813 (struct usb_descriptor_header *)&iad_desc, 814 (struct usb_descriptor_header *)&std_ac_if_desc, 815 816 (struct usb_descriptor_header *)&ac_hdr_desc, 817 (struct usb_descriptor_header *)&in_clk_src_desc, 818 (struct usb_descriptor_header *)&out_clk_src_desc, 819 (struct usb_descriptor_header *)&usb_out_it_desc, 820 (struct usb_descriptor_header *)&io_in_it_desc, 821 (struct usb_descriptor_header *)&usb_in_ot_desc, 822 (struct usb_descriptor_header *)&io_out_ot_desc, 823 824 (struct usb_descriptor_header *)&std_as_out_if0_desc, 825 (struct usb_descriptor_header *)&std_as_out_if1_desc, 826 827 (struct usb_descriptor_header *)&as_out_hdr_desc, 828 (struct usb_descriptor_header *)&as_out_fmt1_desc, 829 (struct usb_descriptor_header *)&fs_epout_desc, 830 (struct usb_descriptor_header *)&as_iso_out_desc, 831 832 (struct usb_descriptor_header *)&std_as_in_if0_desc, 833 (struct usb_descriptor_header *)&std_as_in_if1_desc, 834 835 (struct usb_descriptor_header *)&as_in_hdr_desc, 836 (struct usb_descriptor_header *)&as_in_fmt1_desc, 837 (struct usb_descriptor_header *)&fs_epin_desc, 838 (struct usb_descriptor_header *)&as_iso_in_desc, 839 NULL, 840}; 841 842static struct usb_descriptor_header *hs_audio_desc[] = { 843 (struct usb_descriptor_header *)&iad_desc, 844 (struct usb_descriptor_header *)&std_ac_if_desc, 845 846 (struct usb_descriptor_header *)&ac_hdr_desc, 847 (struct usb_descriptor_header *)&in_clk_src_desc, 848 (struct usb_descriptor_header *)&out_clk_src_desc, 849 (struct usb_descriptor_header *)&usb_out_it_desc, 850 (struct usb_descriptor_header *)&io_in_it_desc, 851 (struct usb_descriptor_header *)&usb_in_ot_desc, 852 (struct usb_descriptor_header *)&io_out_ot_desc, 853 854 (struct usb_descriptor_header *)&std_as_out_if0_desc, 855 (struct usb_descriptor_header *)&std_as_out_if1_desc, 856 857 (struct usb_descriptor_header *)&as_out_hdr_desc, 858 (struct usb_descriptor_header *)&as_out_fmt1_desc, 859 (struct usb_descriptor_header *)&hs_epout_desc, 860 (struct usb_descriptor_header *)&as_iso_out_desc, 861 862 (struct usb_descriptor_header *)&std_as_in_if0_desc, 863 (struct usb_descriptor_header *)&std_as_in_if1_desc, 864 865 (struct usb_descriptor_header *)&as_in_hdr_desc, 866 (struct usb_descriptor_header *)&as_in_fmt1_desc, 867 (struct usb_descriptor_header *)&hs_epin_desc, 868 (struct usb_descriptor_header *)&as_iso_in_desc, 869 NULL, 870}; 871 872struct cntrl_cur_lay3 { 873 __u32 dCUR; 874}; 875 876struct cntrl_range_lay3 { 877 __u16 wNumSubRanges; 878 __u32 dMIN; 879 __u32 dMAX; 880 __u32 dRES; 881} __packed; 882 883static inline void 884free_ep(struct uac2_rtd_params *prm, struct usb_ep *ep) 885{ 886 struct snd_uac2_chip *uac2 = prm->uac2; 887 int i; 888 889 prm->ep_enabled = false; 890 891 for (i = 0; i < USB_XFERS; i++) { 892 if (prm->ureq[i].req) { 893 usb_ep_dequeue(ep, prm->ureq[i].req); 894 usb_ep_free_request(ep, prm->ureq[i].req); 895 prm->ureq[i].req = NULL; 896 } 897 } 898 899 if (usb_ep_disable(ep)) 900 dev_err(&uac2->pdev.dev, 901 "%s:%d Error!\n", __func__, __LINE__); 902} 903 904static int __init 905afunc_bind(struct usb_configuration *cfg, struct usb_function *fn) 906{ 907 struct audio_dev *agdev = func_to_agdev(fn); 908 struct snd_uac2_chip *uac2 = &agdev->uac2; 909 struct usb_composite_dev *cdev = cfg->cdev; 910 struct usb_gadget *gadget = cdev->gadget; 911 struct uac2_rtd_params *prm; 912 int ret; 913 914 ret = usb_interface_id(cfg, fn); 915 if (ret < 0) { 916 dev_err(&uac2->pdev.dev, 917 "%s:%d Error!\n", __func__, __LINE__); 918 return ret; 919 } 920 std_ac_if_desc.bInterfaceNumber = ret; 921 agdev->ac_intf = ret; 922 agdev->ac_alt = 0; 923 924 ret = usb_interface_id(cfg, fn); 925 if (ret < 0) { 926 dev_err(&uac2->pdev.dev, 927 "%s:%d Error!\n", __func__, __LINE__); 928 return ret; 929 } 930 std_as_out_if0_desc.bInterfaceNumber = ret; 931 std_as_out_if1_desc.bInterfaceNumber = ret; 932 agdev->as_out_intf = ret; 933 agdev->as_out_alt = 0; 934 935 ret = usb_interface_id(cfg, fn); 936 if (ret < 0) { 937 dev_err(&uac2->pdev.dev, 938 "%s:%d Error!\n", __func__, __LINE__); 939 return ret; 940 } 941 std_as_in_if0_desc.bInterfaceNumber = ret; 942 std_as_in_if1_desc.bInterfaceNumber = ret; 943 agdev->as_in_intf = ret; 944 agdev->as_in_alt = 0; 945 946 agdev->out_ep = usb_ep_autoconfig(gadget, &fs_epout_desc); 947 if (!agdev->out_ep) { 948 dev_err(&uac2->pdev.dev, 949 "%s:%d Error!\n", __func__, __LINE__); 950 goto err; 951 } 952 agdev->out_ep->driver_data = agdev; 953 954 agdev->in_ep = usb_ep_autoconfig(gadget, &fs_epin_desc); 955 if (!agdev->in_ep) { 956 dev_err(&uac2->pdev.dev, 957 "%s:%d Error!\n", __func__, __LINE__); 958 goto err; 959 } 960 agdev->in_ep->driver_data = agdev; 961 962 uac2->p_prm.uac2 = uac2; 963 uac2->c_prm.uac2 = uac2; 964 965 hs_epout_desc.bEndpointAddress = fs_epout_desc.bEndpointAddress; 966 hs_epout_desc.wMaxPacketSize = fs_epout_desc.wMaxPacketSize; 967 hs_epin_desc.bEndpointAddress = fs_epin_desc.bEndpointAddress; 968 hs_epin_desc.wMaxPacketSize = fs_epin_desc.wMaxPacketSize; 969 970 ret = usb_assign_descriptors(fn, fs_audio_desc, hs_audio_desc, NULL); 971 if (ret) 972 goto err; 973 974 prm = &agdev->uac2.c_prm; 975 prm->max_psize = hs_epout_desc.wMaxPacketSize; 976 prm->rbuf = kzalloc(prm->max_psize * USB_XFERS, GFP_KERNEL); 977 if (!prm->rbuf) { 978 prm->max_psize = 0; 979 dev_err(&uac2->pdev.dev, 980 "%s:%d Error!\n", __func__, __LINE__); 981 goto err; 982 } 983 984 prm = &agdev->uac2.p_prm; 985 prm->max_psize = hs_epin_desc.wMaxPacketSize; 986 prm->rbuf = kzalloc(prm->max_psize * USB_XFERS, GFP_KERNEL); 987 if (!prm->rbuf) { 988 prm->max_psize = 0; 989 dev_err(&uac2->pdev.dev, 990 "%s:%d Error!\n", __func__, __LINE__); 991 goto err; 992 } 993 994 ret = alsa_uac2_init(agdev); 995 if (ret) 996 goto err; 997 return 0; 998err: 999 kfree(agdev->uac2.p_prm.rbuf); 1000 kfree(agdev->uac2.c_prm.rbuf); 1001 usb_free_all_descriptors(fn); 1002 if (agdev->in_ep) 1003 agdev->in_ep->driver_data = NULL; 1004 if (agdev->out_ep) 1005 agdev->out_ep->driver_data = NULL; 1006 return -EINVAL; 1007} 1008 1009static void 1010afunc_unbind(struct usb_configuration *cfg, struct usb_function *fn) 1011{ 1012 struct audio_dev *agdev = func_to_agdev(fn); 1013 struct uac2_rtd_params *prm; 1014 1015 alsa_uac2_exit(agdev); 1016 1017 prm = &agdev->uac2.p_prm; 1018 kfree(prm->rbuf); 1019 1020 prm = &agdev->uac2.c_prm; 1021 kfree(prm->rbuf); 1022 usb_free_all_descriptors(fn); 1023 1024 if (agdev->in_ep) 1025 agdev->in_ep->driver_data = NULL; 1026 if (agdev->out_ep) 1027 agdev->out_ep->driver_data = NULL; 1028} 1029 1030static int 1031afunc_set_alt(struct usb_function *fn, unsigned intf, unsigned alt) 1032{ 1033 struct usb_composite_dev *cdev = fn->config->cdev; 1034 struct audio_dev *agdev = func_to_agdev(fn); 1035 struct snd_uac2_chip *uac2 = &agdev->uac2; 1036 struct usb_gadget *gadget = cdev->gadget; 1037 struct usb_request *req; 1038 struct usb_ep *ep; 1039 struct uac2_rtd_params *prm; 1040 int i; 1041 1042 /* No i/f has more than 2 alt settings */ 1043 if (alt > 1) { 1044 dev_err(&uac2->pdev.dev, 1045 "%s:%d Error!\n", __func__, __LINE__); 1046 return -EINVAL; 1047 } 1048 1049 if (intf == agdev->ac_intf) { 1050 /* Control I/f has only 1 AltSetting - 0 */ 1051 if (alt) { 1052 dev_err(&uac2->pdev.dev, 1053 "%s:%d Error!\n", __func__, __LINE__); 1054 return -EINVAL; 1055 } 1056 return 0; 1057 } 1058 1059 if (intf == agdev->as_out_intf) { 1060 ep = agdev->out_ep; 1061 prm = &uac2->c_prm; 1062 config_ep_by_speed(gadget, fn, ep); 1063 agdev->as_out_alt = alt; 1064 } else if (intf == agdev->as_in_intf) { 1065 ep = agdev->in_ep; 1066 prm = &uac2->p_prm; 1067 config_ep_by_speed(gadget, fn, ep); 1068 agdev->as_in_alt = alt; 1069 } else { 1070 dev_err(&uac2->pdev.dev, 1071 "%s:%d Error!\n", __func__, __LINE__); 1072 return -EINVAL; 1073 } 1074 1075 if (alt == 0) { 1076 free_ep(prm, ep); 1077 return 0; 1078 } 1079 1080 prm->ep_enabled = true; 1081 usb_ep_enable(ep); 1082 1083 for (i = 0; i < USB_XFERS; i++) { 1084 if (prm->ureq[i].req) { 1085 if (usb_ep_queue(ep, prm->ureq[i].req, GFP_ATOMIC)) 1086 dev_err(&uac2->pdev.dev, "%d Error!\n", 1087 __LINE__); 1088 continue; 1089 } 1090 1091 req = usb_ep_alloc_request(ep, GFP_ATOMIC); 1092 if (req == NULL) { 1093 dev_err(&uac2->pdev.dev, 1094 "%s:%d Error!\n", __func__, __LINE__); 1095 return -EINVAL; 1096 } 1097 1098 prm->ureq[i].req = req; 1099 prm->ureq[i].pp = prm; 1100 1101 req->zero = 0; 1102 req->context = &prm->ureq[i]; 1103 req->length = prm->max_psize; 1104 req->complete = agdev_iso_complete; 1105 req->buf = prm->rbuf + i * req->length; 1106 1107 if (usb_ep_queue(ep, req, GFP_ATOMIC)) 1108 dev_err(&uac2->pdev.dev, "%d Error!\n", __LINE__); 1109 } 1110 1111 return 0; 1112} 1113 1114static int 1115afunc_get_alt(struct usb_function *fn, unsigned intf) 1116{ 1117 struct audio_dev *agdev = func_to_agdev(fn); 1118 struct snd_uac2_chip *uac2 = &agdev->uac2; 1119 1120 if (intf == agdev->ac_intf) 1121 return agdev->ac_alt; 1122 else if (intf == agdev->as_out_intf) 1123 return agdev->as_out_alt; 1124 else if (intf == agdev->as_in_intf) 1125 return agdev->as_in_alt; 1126 else 1127 dev_err(&uac2->pdev.dev, 1128 "%s:%d Invalid Interface %d!\n", 1129 __func__, __LINE__, intf); 1130 1131 return -EINVAL; 1132} 1133 1134static void 1135afunc_disable(struct usb_function *fn) 1136{ 1137 struct audio_dev *agdev = func_to_agdev(fn); 1138 struct snd_uac2_chip *uac2 = &agdev->uac2; 1139 1140 free_ep(&uac2->p_prm, agdev->in_ep); 1141 agdev->as_in_alt = 0; 1142 1143 free_ep(&uac2->c_prm, agdev->out_ep); 1144 agdev->as_out_alt = 0; 1145} 1146 1147static int 1148in_rq_cur(struct usb_function *fn, const struct usb_ctrlrequest *cr) 1149{ 1150 struct usb_request *req = fn->config->cdev->req; 1151 struct audio_dev *agdev = func_to_agdev(fn); 1152 struct snd_uac2_chip *uac2 = &agdev->uac2; 1153 u16 w_length = le16_to_cpu(cr->wLength); 1154 u16 w_index = le16_to_cpu(cr->wIndex); 1155 u16 w_value = le16_to_cpu(cr->wValue); 1156 u8 entity_id = (w_index >> 8) & 0xff; 1157 u8 control_selector = w_value >> 8; 1158 int value = -EOPNOTSUPP; 1159 1160 if (control_selector == UAC2_CS_CONTROL_SAM_FREQ) { 1161 struct cntrl_cur_lay3 c; 1162 1163 if (entity_id == USB_IN_CLK_ID) 1164 c.dCUR = p_srate; 1165 else if (entity_id == USB_OUT_CLK_ID) 1166 c.dCUR = c_srate; 1167 1168 value = min_t(unsigned, w_length, sizeof c); 1169 memcpy(req->buf, &c, value); 1170 } else if (control_selector == UAC2_CS_CONTROL_CLOCK_VALID) { 1171 *(u8 *)req->buf = 1; 1172 value = min_t(unsigned, w_length, 1); 1173 } else { 1174 dev_err(&uac2->pdev.dev, 1175 "%s:%d control_selector=%d TODO!\n", 1176 __func__, __LINE__, control_selector); 1177 } 1178 1179 return value; 1180} 1181 1182static int 1183in_rq_range(struct usb_function *fn, const struct usb_ctrlrequest *cr) 1184{ 1185 struct usb_request *req = fn->config->cdev->req; 1186 struct audio_dev *agdev = func_to_agdev(fn); 1187 struct snd_uac2_chip *uac2 = &agdev->uac2; 1188 u16 w_length = le16_to_cpu(cr->wLength); 1189 u16 w_index = le16_to_cpu(cr->wIndex); 1190 u16 w_value = le16_to_cpu(cr->wValue); 1191 u8 entity_id = (w_index >> 8) & 0xff; 1192 u8 control_selector = w_value >> 8; 1193 struct cntrl_range_lay3 r; 1194 int value = -EOPNOTSUPP; 1195 1196 if (control_selector == UAC2_CS_CONTROL_SAM_FREQ) { 1197 if (entity_id == USB_IN_CLK_ID) 1198 r.dMIN = p_srate; 1199 else if (entity_id == USB_OUT_CLK_ID) 1200 r.dMIN = c_srate; 1201 else 1202 return -EOPNOTSUPP; 1203 1204 r.dMAX = r.dMIN; 1205 r.dRES = 0; 1206 r.wNumSubRanges = 1; 1207 1208 value = min_t(unsigned, w_length, sizeof r); 1209 memcpy(req->buf, &r, value); 1210 } else { 1211 dev_err(&uac2->pdev.dev, 1212 "%s:%d control_selector=%d TODO!\n", 1213 __func__, __LINE__, control_selector); 1214 } 1215 1216 return value; 1217} 1218 1219static int 1220ac_rq_in(struct usb_function *fn, const struct usb_ctrlrequest *cr) 1221{ 1222 if (cr->bRequest == UAC2_CS_CUR) 1223 return in_rq_cur(fn, cr); 1224 else if (cr->bRequest == UAC2_CS_RANGE) 1225 return in_rq_range(fn, cr); 1226 else 1227 return -EOPNOTSUPP; 1228} 1229 1230static int 1231out_rq_cur(struct usb_function *fn, const struct usb_ctrlrequest *cr) 1232{ 1233 u16 w_length = le16_to_cpu(cr->wLength); 1234 u16 w_value = le16_to_cpu(cr->wValue); 1235 u8 control_selector = w_value >> 8; 1236 1237 if (control_selector == UAC2_CS_CONTROL_SAM_FREQ) 1238 return w_length; 1239 1240 return -EOPNOTSUPP; 1241} 1242 1243static int 1244setup_rq_inf(struct usb_function *fn, const struct usb_ctrlrequest *cr) 1245{ 1246 struct audio_dev *agdev = func_to_agdev(fn); 1247 struct snd_uac2_chip *uac2 = &agdev->uac2; 1248 u16 w_index = le16_to_cpu(cr->wIndex); 1249 u8 intf = w_index & 0xff; 1250 1251 if (intf != agdev->ac_intf) { 1252 dev_err(&uac2->pdev.dev, 1253 "%s:%d Error!\n", __func__, __LINE__); 1254 return -EOPNOTSUPP; 1255 } 1256 1257 if (cr->bRequestType & USB_DIR_IN) 1258 return ac_rq_in(fn, cr); 1259 else if (cr->bRequest == UAC2_CS_CUR) 1260 return out_rq_cur(fn, cr); 1261 1262 return -EOPNOTSUPP; 1263} 1264 1265static int 1266afunc_setup(struct usb_function *fn, const struct usb_ctrlrequest *cr) 1267{ 1268 struct usb_composite_dev *cdev = fn->config->cdev; 1269 struct audio_dev *agdev = func_to_agdev(fn); 1270 struct snd_uac2_chip *uac2 = &agdev->uac2; 1271 struct usb_request *req = cdev->req; 1272 u16 w_length = le16_to_cpu(cr->wLength); 1273 int value = -EOPNOTSUPP; 1274 1275 /* Only Class specific requests are supposed to reach here */ 1276 if ((cr->bRequestType & USB_TYPE_MASK) != USB_TYPE_CLASS) 1277 return -EOPNOTSUPP; 1278 1279 if ((cr->bRequestType & USB_RECIP_MASK) == USB_RECIP_INTERFACE) 1280 value = setup_rq_inf(fn, cr); 1281 else 1282 dev_err(&uac2->pdev.dev, "%s:%d Error!\n", __func__, __LINE__); 1283 1284 if (value >= 0) { 1285 req->length = value; 1286 req->zero = value < w_length; 1287 value = usb_ep_queue(cdev->gadget->ep0, req, GFP_ATOMIC); 1288 if (value < 0) { 1289 dev_err(&uac2->pdev.dev, 1290 "%s:%d Error!\n", __func__, __LINE__); 1291 req->status = 0; 1292 } 1293 } 1294 1295 return value; 1296} 1297 1298static int audio_bind_config(struct usb_configuration *cfg) 1299{ 1300 int res; 1301 1302 agdev_g = kzalloc(sizeof *agdev_g, GFP_KERNEL); 1303 if (agdev_g == NULL) { 1304 printk(KERN_ERR "Unable to allocate audio gadget\n"); 1305 return -ENOMEM; 1306 } 1307 1308 res = usb_string_ids_tab(cfg->cdev, strings_fn); 1309 if (res) 1310 return res; 1311 iad_desc.iFunction = strings_fn[STR_ASSOC].id; 1312 std_ac_if_desc.iInterface = strings_fn[STR_IF_CTRL].id; 1313 in_clk_src_desc.iClockSource = strings_fn[STR_CLKSRC_IN].id; 1314 out_clk_src_desc.iClockSource = strings_fn[STR_CLKSRC_OUT].id; 1315 usb_out_it_desc.iTerminal = strings_fn[STR_USB_IT].id; 1316 io_in_it_desc.iTerminal = strings_fn[STR_IO_IT].id; 1317 usb_in_ot_desc.iTerminal = strings_fn[STR_USB_OT].id; 1318 io_out_ot_desc.iTerminal = strings_fn[STR_IO_OT].id; 1319 std_as_out_if0_desc.iInterface = strings_fn[STR_AS_OUT_ALT0].id; 1320 std_as_out_if1_desc.iInterface = strings_fn[STR_AS_OUT_ALT1].id; 1321 std_as_in_if0_desc.iInterface = strings_fn[STR_AS_IN_ALT0].id; 1322 std_as_in_if1_desc.iInterface = strings_fn[STR_AS_IN_ALT1].id; 1323 1324 agdev_g->func.name = "uac2_func"; 1325 agdev_g->func.strings = fn_strings; 1326 agdev_g->func.bind = afunc_bind; 1327 agdev_g->func.unbind = afunc_unbind; 1328 agdev_g->func.set_alt = afunc_set_alt; 1329 agdev_g->func.get_alt = afunc_get_alt; 1330 agdev_g->func.disable = afunc_disable; 1331 agdev_g->func.setup = afunc_setup; 1332 1333 /* Initialize the configurable parameters */ 1334 usb_out_it_desc.bNrChannels = num_channels(c_chmask); 1335 usb_out_it_desc.bmChannelConfig = cpu_to_le32(c_chmask); 1336 io_in_it_desc.bNrChannels = num_channels(p_chmask); 1337 io_in_it_desc.bmChannelConfig = cpu_to_le32(p_chmask); 1338 as_out_hdr_desc.bNrChannels = num_channels(c_chmask); 1339 as_out_hdr_desc.bmChannelConfig = cpu_to_le32(c_chmask); 1340 as_in_hdr_desc.bNrChannels = num_channels(p_chmask); 1341 as_in_hdr_desc.bmChannelConfig = cpu_to_le32(p_chmask); 1342 as_out_fmt1_desc.bSubslotSize = c_ssize; 1343 as_out_fmt1_desc.bBitResolution = c_ssize * 8; 1344 as_in_fmt1_desc.bSubslotSize = p_ssize; 1345 as_in_fmt1_desc.bBitResolution = p_ssize * 8; 1346 1347 snprintf(clksrc_in, sizeof(clksrc_in), "%uHz", p_srate); 1348 snprintf(clksrc_out, sizeof(clksrc_out), "%uHz", c_srate); 1349 1350 res = usb_add_function(cfg, &agdev_g->func); 1351 if (res < 0) 1352 kfree(agdev_g); 1353 1354 return res; 1355} 1356 1357static void 1358uac2_unbind_config(struct usb_configuration *cfg) 1359{ 1360 kfree(agdev_g); 1361 agdev_g = NULL; 1362}