Linux Audio

Check our new training course

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