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