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_qualifier_descriptor devqual_desc = {
 602	.bLength = sizeof devqual_desc,
 603	.bDescriptorType = USB_DT_DEVICE_QUALIFIER,
 604
 605	.bcdUSB = cpu_to_le16(0x200),
 606	.bDeviceClass = USB_CLASS_MISC,
 607	.bDeviceSubClass = 0x02,
 608	.bDeviceProtocol = 0x01,
 609	.bNumConfigurations = 1,
 610	.bRESERVED = 0,
 611};
 612
 613static struct usb_interface_assoc_descriptor iad_desc = {
 614	.bLength = sizeof iad_desc,
 615	.bDescriptorType = USB_DT_INTERFACE_ASSOCIATION,
 616
 617	.bFirstInterface = 0,
 618	.bInterfaceCount = 3,
 619	.bFunctionClass = USB_CLASS_AUDIO,
 620	.bFunctionSubClass = UAC2_FUNCTION_SUBCLASS_UNDEFINED,
 621	.bFunctionProtocol = UAC_VERSION_2,
 622};
 623
 624/* Audio Control Interface */
 625static struct usb_interface_descriptor std_ac_if_desc = {
 626	.bLength = sizeof std_ac_if_desc,
 627	.bDescriptorType = USB_DT_INTERFACE,
 628
 629	.bAlternateSetting = 0,
 630	.bNumEndpoints = 0,
 631	.bInterfaceClass = USB_CLASS_AUDIO,
 632	.bInterfaceSubClass = USB_SUBCLASS_AUDIOCONTROL,
 633	.bInterfaceProtocol = UAC_VERSION_2,
 634};
 635
 636/* Clock source for IN traffic */
 637static struct uac_clock_source_descriptor in_clk_src_desc = {
 638	.bLength = sizeof in_clk_src_desc,
 639	.bDescriptorType = USB_DT_CS_INTERFACE,
 640
 641	.bDescriptorSubtype = UAC2_CLOCK_SOURCE,
 642	.bClockID = USB_IN_CLK_ID,
 643	.bmAttributes = UAC_CLOCK_SOURCE_TYPE_INT_FIXED,
 644	.bmControls = (CONTROL_RDONLY << CLK_FREQ_CTRL),
 645	.bAssocTerminal = 0,
 646};
 647
 648/* Clock source for OUT traffic */
 649static struct uac_clock_source_descriptor out_clk_src_desc = {
 650	.bLength = sizeof out_clk_src_desc,
 651	.bDescriptorType = USB_DT_CS_INTERFACE,
 652
 653	.bDescriptorSubtype = UAC2_CLOCK_SOURCE,
 654	.bClockID = USB_OUT_CLK_ID,
 655	.bmAttributes = UAC_CLOCK_SOURCE_TYPE_INT_FIXED,
 656	.bmControls = (CONTROL_RDONLY << CLK_FREQ_CTRL),
 657	.bAssocTerminal = 0,
 658};
 659
 660/* Input Terminal for USB_OUT */
 661static struct uac2_input_terminal_descriptor usb_out_it_desc = {
 662	.bLength = sizeof usb_out_it_desc,
 663	.bDescriptorType = USB_DT_CS_INTERFACE,
 664
 665	.bDescriptorSubtype = UAC_INPUT_TERMINAL,
 666	.bTerminalID = USB_OUT_IT_ID,
 667	.wTerminalType = cpu_to_le16(UAC_TERMINAL_STREAMING),
 668	.bAssocTerminal = 0,
 669	.bCSourceID = USB_OUT_CLK_ID,
 670	.iChannelNames = 0,
 671	.bmControls = (CONTROL_RDWR << COPY_CTRL),
 672};
 673
 674/* Input Terminal for I/O-In */
 675static struct uac2_input_terminal_descriptor io_in_it_desc = {
 676	.bLength = sizeof io_in_it_desc,
 677	.bDescriptorType = USB_DT_CS_INTERFACE,
 678
 679	.bDescriptorSubtype = UAC_INPUT_TERMINAL,
 680	.bTerminalID = IO_IN_IT_ID,
 681	.wTerminalType = cpu_to_le16(UAC_INPUT_TERMINAL_UNDEFINED),
 682	.bAssocTerminal = 0,
 683	.bCSourceID = USB_IN_CLK_ID,
 684	.iChannelNames = 0,
 685	.bmControls = (CONTROL_RDWR << COPY_CTRL),
 686};
 687
 688/* Ouput Terminal for USB_IN */
 689static struct uac2_output_terminal_descriptor usb_in_ot_desc = {
 690	.bLength = sizeof usb_in_ot_desc,
 691	.bDescriptorType = USB_DT_CS_INTERFACE,
 692
 693	.bDescriptorSubtype = UAC_OUTPUT_TERMINAL,
 694	.bTerminalID = USB_IN_OT_ID,
 695	.wTerminalType = cpu_to_le16(UAC_TERMINAL_STREAMING),
 696	.bAssocTerminal = 0,
 697	.bSourceID = IO_IN_IT_ID,
 698	.bCSourceID = USB_IN_CLK_ID,
 699	.bmControls = (CONTROL_RDWR << COPY_CTRL),
 700};
 701
 702/* Ouput Terminal for I/O-Out */
 703static struct uac2_output_terminal_descriptor io_out_ot_desc = {
 704	.bLength = sizeof io_out_ot_desc,
 705	.bDescriptorType = USB_DT_CS_INTERFACE,
 706
 707	.bDescriptorSubtype = UAC_OUTPUT_TERMINAL,
 708	.bTerminalID = IO_OUT_OT_ID,
 709	.wTerminalType = cpu_to_le16(UAC_OUTPUT_TERMINAL_UNDEFINED),
 710	.bAssocTerminal = 0,
 711	.bSourceID = USB_OUT_IT_ID,
 712	.bCSourceID = USB_OUT_CLK_ID,
 713	.bmControls = (CONTROL_RDWR << COPY_CTRL),
 714};
 715
 716static struct uac2_ac_header_descriptor ac_hdr_desc = {
 717	.bLength = sizeof ac_hdr_desc,
 718	.bDescriptorType = USB_DT_CS_INTERFACE,
 719
 720	.bDescriptorSubtype = UAC_MS_HEADER,
 721	.bcdADC = cpu_to_le16(0x200),
 722	.bCategory = UAC2_FUNCTION_IO_BOX,
 723	.wTotalLength = sizeof in_clk_src_desc + sizeof out_clk_src_desc
 724			 + sizeof usb_out_it_desc + sizeof io_in_it_desc
 725			+ sizeof usb_in_ot_desc + sizeof io_out_ot_desc,
 726	.bmControls = 0,
 727};
 728
 729/* Audio Streaming OUT Interface - Alt0 */
 730static struct usb_interface_descriptor std_as_out_if0_desc = {
 731	.bLength = sizeof std_as_out_if0_desc,
 732	.bDescriptorType = USB_DT_INTERFACE,
 733
 734	.bAlternateSetting = 0,
 735	.bNumEndpoints = 0,
 736	.bInterfaceClass = USB_CLASS_AUDIO,
 737	.bInterfaceSubClass = USB_SUBCLASS_AUDIOSTREAMING,
 738	.bInterfaceProtocol = UAC_VERSION_2,
 739};
 740
 741/* Audio Streaming OUT Interface - Alt1 */
 742static struct usb_interface_descriptor std_as_out_if1_desc = {
 743	.bLength = sizeof std_as_out_if1_desc,
 744	.bDescriptorType = USB_DT_INTERFACE,
 745
 746	.bAlternateSetting = 1,
 747	.bNumEndpoints = 1,
 748	.bInterfaceClass = USB_CLASS_AUDIO,
 749	.bInterfaceSubClass = USB_SUBCLASS_AUDIOSTREAMING,
 750	.bInterfaceProtocol = UAC_VERSION_2,
 751};
 752
 753/* Audio Stream OUT Intface Desc */
 754static struct uac2_as_header_descriptor as_out_hdr_desc = {
 755	.bLength = sizeof as_out_hdr_desc,
 756	.bDescriptorType = USB_DT_CS_INTERFACE,
 757
 758	.bDescriptorSubtype = UAC_AS_GENERAL,
 759	.bTerminalLink = USB_OUT_IT_ID,
 760	.bmControls = 0,
 761	.bFormatType = UAC_FORMAT_TYPE_I,
 762	.bmFormats = cpu_to_le32(UAC_FORMAT_TYPE_I_PCM),
 763	.iChannelNames = 0,
 764};
 765
 766/* Audio USB_OUT Format */
 767static struct uac2_format_type_i_descriptor as_out_fmt1_desc = {
 768	.bLength = sizeof as_out_fmt1_desc,
 769	.bDescriptorType = USB_DT_CS_INTERFACE,
 770	.bDescriptorSubtype = UAC_FORMAT_TYPE,
 771	.bFormatType = UAC_FORMAT_TYPE_I,
 772};
 773
 774/* STD AS ISO OUT Endpoint */
 775static struct usb_endpoint_descriptor fs_epout_desc = {
 776	.bLength = USB_DT_ENDPOINT_SIZE,
 777	.bDescriptorType = USB_DT_ENDPOINT,
 778
 779	.bEndpointAddress = USB_DIR_OUT,
 780	.bmAttributes = USB_ENDPOINT_XFER_ISOC | USB_ENDPOINT_SYNC_ASYNC,
 781	.wMaxPacketSize = cpu_to_le16(1023),
 782	.bInterval = 1,
 783};
 784
 785static struct usb_endpoint_descriptor hs_epout_desc = {
 786	.bLength = USB_DT_ENDPOINT_SIZE,
 787	.bDescriptorType = USB_DT_ENDPOINT,
 788
 789	.bmAttributes = USB_ENDPOINT_XFER_ISOC | USB_ENDPOINT_SYNC_ASYNC,
 790	.wMaxPacketSize = cpu_to_le16(1024),
 791	.bInterval = 4,
 792};
 793
 794/* CS AS ISO OUT Endpoint */
 795static struct uac2_iso_endpoint_descriptor as_iso_out_desc = {
 796	.bLength = sizeof as_iso_out_desc,
 797	.bDescriptorType = USB_DT_CS_ENDPOINT,
 798
 799	.bDescriptorSubtype = UAC_EP_GENERAL,
 800	.bmAttributes = 0,
 801	.bmControls = 0,
 802	.bLockDelayUnits = 0,
 803	.wLockDelay = 0,
 804};
 805
 806/* Audio Streaming IN Interface - Alt0 */
 807static struct usb_interface_descriptor std_as_in_if0_desc = {
 808	.bLength = sizeof std_as_in_if0_desc,
 809	.bDescriptorType = USB_DT_INTERFACE,
 810
 811	.bAlternateSetting = 0,
 812	.bNumEndpoints = 0,
 813	.bInterfaceClass = USB_CLASS_AUDIO,
 814	.bInterfaceSubClass = USB_SUBCLASS_AUDIOSTREAMING,
 815	.bInterfaceProtocol = UAC_VERSION_2,
 816};
 817
 818/* Audio Streaming IN Interface - Alt1 */
 819static struct usb_interface_descriptor std_as_in_if1_desc = {
 820	.bLength = sizeof std_as_in_if1_desc,
 821	.bDescriptorType = USB_DT_INTERFACE,
 822
 823	.bAlternateSetting = 1,
 824	.bNumEndpoints = 1,
 825	.bInterfaceClass = USB_CLASS_AUDIO,
 826	.bInterfaceSubClass = USB_SUBCLASS_AUDIOSTREAMING,
 827	.bInterfaceProtocol = UAC_VERSION_2,
 828};
 829
 830/* Audio Stream IN Intface Desc */
 831static struct uac2_as_header_descriptor as_in_hdr_desc = {
 832	.bLength = sizeof as_in_hdr_desc,
 833	.bDescriptorType = USB_DT_CS_INTERFACE,
 834
 835	.bDescriptorSubtype = UAC_AS_GENERAL,
 836	.bTerminalLink = USB_IN_OT_ID,
 837	.bmControls = 0,
 838	.bFormatType = UAC_FORMAT_TYPE_I,
 839	.bmFormats = cpu_to_le32(UAC_FORMAT_TYPE_I_PCM),
 840	.iChannelNames = 0,
 841};
 842
 843/* Audio USB_IN Format */
 844static struct uac2_format_type_i_descriptor as_in_fmt1_desc = {
 845	.bLength = sizeof as_in_fmt1_desc,
 846	.bDescriptorType = USB_DT_CS_INTERFACE,
 847	.bDescriptorSubtype = UAC_FORMAT_TYPE,
 848	.bFormatType = UAC_FORMAT_TYPE_I,
 849};
 850
 851/* STD AS ISO IN Endpoint */
 852static struct usb_endpoint_descriptor fs_epin_desc = {
 853	.bLength = USB_DT_ENDPOINT_SIZE,
 854	.bDescriptorType = USB_DT_ENDPOINT,
 855
 856	.bEndpointAddress = USB_DIR_IN,
 857	.bmAttributes = USB_ENDPOINT_XFER_ISOC | USB_ENDPOINT_SYNC_ASYNC,
 858	.wMaxPacketSize = cpu_to_le16(1023),
 859	.bInterval = 1,
 860};
 861
 862static struct usb_endpoint_descriptor hs_epin_desc = {
 863	.bLength = USB_DT_ENDPOINT_SIZE,
 864	.bDescriptorType = USB_DT_ENDPOINT,
 865
 866	.bmAttributes = USB_ENDPOINT_XFER_ISOC | USB_ENDPOINT_SYNC_ASYNC,
 867	.wMaxPacketSize = cpu_to_le16(1024),
 868	.bInterval = 4,
 869};
 870
 871/* CS AS ISO IN Endpoint */
 872static struct uac2_iso_endpoint_descriptor as_iso_in_desc = {
 873	.bLength = sizeof as_iso_in_desc,
 874	.bDescriptorType = USB_DT_CS_ENDPOINT,
 875
 876	.bDescriptorSubtype = UAC_EP_GENERAL,
 877	.bmAttributes = 0,
 878	.bmControls = 0,
 879	.bLockDelayUnits = 0,
 880	.wLockDelay = 0,
 881};
 882
 883static struct usb_descriptor_header *fs_audio_desc[] = {
 884	(struct usb_descriptor_header *)&iad_desc,
 885	(struct usb_descriptor_header *)&std_ac_if_desc,
 886
 887	(struct usb_descriptor_header *)&ac_hdr_desc,
 888	(struct usb_descriptor_header *)&in_clk_src_desc,
 889	(struct usb_descriptor_header *)&out_clk_src_desc,
 890	(struct usb_descriptor_header *)&usb_out_it_desc,
 891	(struct usb_descriptor_header *)&io_in_it_desc,
 892	(struct usb_descriptor_header *)&usb_in_ot_desc,
 893	(struct usb_descriptor_header *)&io_out_ot_desc,
 894
 895	(struct usb_descriptor_header *)&std_as_out_if0_desc,
 896	(struct usb_descriptor_header *)&std_as_out_if1_desc,
 897
 898	(struct usb_descriptor_header *)&as_out_hdr_desc,
 899	(struct usb_descriptor_header *)&as_out_fmt1_desc,
 900	(struct usb_descriptor_header *)&fs_epout_desc,
 901	(struct usb_descriptor_header *)&as_iso_out_desc,
 902
 903	(struct usb_descriptor_header *)&std_as_in_if0_desc,
 904	(struct usb_descriptor_header *)&std_as_in_if1_desc,
 905
 906	(struct usb_descriptor_header *)&as_in_hdr_desc,
 907	(struct usb_descriptor_header *)&as_in_fmt1_desc,
 908	(struct usb_descriptor_header *)&fs_epin_desc,
 909	(struct usb_descriptor_header *)&as_iso_in_desc,
 910	NULL,
 911};
 912
 913static struct usb_descriptor_header *hs_audio_desc[] = {
 914	(struct usb_descriptor_header *)&iad_desc,
 915	(struct usb_descriptor_header *)&std_ac_if_desc,
 916
 917	(struct usb_descriptor_header *)&ac_hdr_desc,
 918	(struct usb_descriptor_header *)&in_clk_src_desc,
 919	(struct usb_descriptor_header *)&out_clk_src_desc,
 920	(struct usb_descriptor_header *)&usb_out_it_desc,
 921	(struct usb_descriptor_header *)&io_in_it_desc,
 922	(struct usb_descriptor_header *)&usb_in_ot_desc,
 923	(struct usb_descriptor_header *)&io_out_ot_desc,
 924
 925	(struct usb_descriptor_header *)&std_as_out_if0_desc,
 926	(struct usb_descriptor_header *)&std_as_out_if1_desc,
 927
 928	(struct usb_descriptor_header *)&as_out_hdr_desc,
 929	(struct usb_descriptor_header *)&as_out_fmt1_desc,
 930	(struct usb_descriptor_header *)&hs_epout_desc,
 931	(struct usb_descriptor_header *)&as_iso_out_desc,
 932
 933	(struct usb_descriptor_header *)&std_as_in_if0_desc,
 934	(struct usb_descriptor_header *)&std_as_in_if1_desc,
 935
 936	(struct usb_descriptor_header *)&as_in_hdr_desc,
 937	(struct usb_descriptor_header *)&as_in_fmt1_desc,
 938	(struct usb_descriptor_header *)&hs_epin_desc,
 939	(struct usb_descriptor_header *)&as_iso_in_desc,
 940	NULL,
 941};
 942
 943struct cntrl_cur_lay3 {
 944	__u32	dCUR;
 945};
 946
 947struct cntrl_range_lay3 {
 948	__u16	wNumSubRanges;
 949	__u32	dMIN;
 950	__u32	dMAX;
 951	__u32	dRES;
 952} __packed;
 953
 954static inline void
 955free_ep(struct uac2_rtd_params *prm, struct usb_ep *ep)
 956{
 957	struct snd_uac2_chip *uac2 = prm->uac2;
 958	int i;
 959
 960	if (!prm->ep_enabled)
 961		return;
 962
 963	prm->ep_enabled = false;
 964
 965	for (i = 0; i < USB_XFERS; i++) {
 966		if (prm->ureq[i].req) {
 967			usb_ep_dequeue(ep, prm->ureq[i].req);
 968			usb_ep_free_request(ep, prm->ureq[i].req);
 969			prm->ureq[i].req = NULL;
 970		}
 971	}
 972
 973	if (usb_ep_disable(ep))
 974		dev_err(&uac2->pdev.dev,
 975			"%s:%d Error!\n", __func__, __LINE__);
 976}
 977
 978static void set_ep_max_packet_size(const struct f_uac2_opts *uac2_opts,
 979	struct usb_endpoint_descriptor *ep_desc,
 980	unsigned int factor, bool is_playback)
 981{
 982	int chmask, srate, ssize;
 983	u16 max_packet_size;
 984
 985	if (is_playback) {
 986		chmask = uac2_opts->p_chmask;
 987		srate = uac2_opts->p_srate;
 988		ssize = uac2_opts->p_ssize;
 989	} else {
 990		chmask = uac2_opts->c_chmask;
 991		srate = uac2_opts->c_srate;
 992		ssize = uac2_opts->c_ssize;
 993	}
 994
 995	max_packet_size = num_channels(chmask) * ssize *
 996		DIV_ROUND_UP(srate, factor / (1 << (ep_desc->bInterval - 1)));
 997	ep_desc->wMaxPacketSize = cpu_to_le16(min_t(u16, max_packet_size,
 998				le16_to_cpu(ep_desc->wMaxPacketSize)));
 999}
1000
1001static int
1002afunc_bind(struct usb_configuration *cfg, struct usb_function *fn)
1003{
1004	struct audio_dev *agdev = func_to_agdev(fn);
1005	struct snd_uac2_chip *uac2 = &agdev->uac2;
1006	struct usb_composite_dev *cdev = cfg->cdev;
1007	struct usb_gadget *gadget = cdev->gadget;
1008	struct device *dev = &uac2->pdev.dev;
1009	struct uac2_rtd_params *prm;
1010	struct f_uac2_opts *uac2_opts;
1011	struct usb_string *us;
1012	int ret;
1013
1014	uac2_opts = container_of(fn->fi, struct f_uac2_opts, func_inst);
1015
1016	us = usb_gstrings_attach(cdev, fn_strings, ARRAY_SIZE(strings_fn));
1017	if (IS_ERR(us))
1018		return PTR_ERR(us);
1019	iad_desc.iFunction = us[STR_ASSOC].id;
1020	std_ac_if_desc.iInterface = us[STR_IF_CTRL].id;
1021	in_clk_src_desc.iClockSource = us[STR_CLKSRC_IN].id;
1022	out_clk_src_desc.iClockSource = us[STR_CLKSRC_OUT].id;
1023	usb_out_it_desc.iTerminal = us[STR_USB_IT].id;
1024	io_in_it_desc.iTerminal = us[STR_IO_IT].id;
1025	usb_in_ot_desc.iTerminal = us[STR_USB_OT].id;
1026	io_out_ot_desc.iTerminal = us[STR_IO_OT].id;
1027	std_as_out_if0_desc.iInterface = us[STR_AS_OUT_ALT0].id;
1028	std_as_out_if1_desc.iInterface = us[STR_AS_OUT_ALT1].id;
1029	std_as_in_if0_desc.iInterface = us[STR_AS_IN_ALT0].id;
1030	std_as_in_if1_desc.iInterface = us[STR_AS_IN_ALT1].id;
1031
1032
1033	/* Initialize the configurable parameters */
1034	usb_out_it_desc.bNrChannels = num_channels(uac2_opts->c_chmask);
1035	usb_out_it_desc.bmChannelConfig = cpu_to_le32(uac2_opts->c_chmask);
1036	io_in_it_desc.bNrChannels = num_channels(uac2_opts->p_chmask);
1037	io_in_it_desc.bmChannelConfig = cpu_to_le32(uac2_opts->p_chmask);
1038	as_out_hdr_desc.bNrChannels = num_channels(uac2_opts->c_chmask);
1039	as_out_hdr_desc.bmChannelConfig = cpu_to_le32(uac2_opts->c_chmask);
1040	as_in_hdr_desc.bNrChannels = num_channels(uac2_opts->p_chmask);
1041	as_in_hdr_desc.bmChannelConfig = cpu_to_le32(uac2_opts->p_chmask);
1042	as_out_fmt1_desc.bSubslotSize = uac2_opts->c_ssize;
1043	as_out_fmt1_desc.bBitResolution = uac2_opts->c_ssize * 8;
1044	as_in_fmt1_desc.bSubslotSize = uac2_opts->p_ssize;
1045	as_in_fmt1_desc.bBitResolution = uac2_opts->p_ssize * 8;
1046
1047	snprintf(clksrc_in, sizeof(clksrc_in), "%uHz", uac2_opts->p_srate);
1048	snprintf(clksrc_out, sizeof(clksrc_out), "%uHz", uac2_opts->c_srate);
1049
1050	ret = usb_interface_id(cfg, fn);
1051	if (ret < 0) {
1052		dev_err(dev, "%s:%d Error!\n", __func__, __LINE__);
1053		return ret;
1054	}
1055	std_ac_if_desc.bInterfaceNumber = ret;
1056	agdev->ac_intf = ret;
1057	agdev->ac_alt = 0;
1058
1059	ret = usb_interface_id(cfg, fn);
1060	if (ret < 0) {
1061		dev_err(dev, "%s:%d Error!\n", __func__, __LINE__);
1062		return ret;
1063	}
1064	std_as_out_if0_desc.bInterfaceNumber = ret;
1065	std_as_out_if1_desc.bInterfaceNumber = ret;
1066	agdev->as_out_intf = ret;
1067	agdev->as_out_alt = 0;
1068
1069	ret = usb_interface_id(cfg, fn);
1070	if (ret < 0) {
1071		dev_err(dev, "%s:%d Error!\n", __func__, __LINE__);
1072		return ret;
1073	}
1074	std_as_in_if0_desc.bInterfaceNumber = ret;
1075	std_as_in_if1_desc.bInterfaceNumber = ret;
1076	agdev->as_in_intf = ret;
1077	agdev->as_in_alt = 0;
1078
1079	agdev->out_ep = usb_ep_autoconfig(gadget, &fs_epout_desc);
1080	if (!agdev->out_ep) {
1081		dev_err(dev, "%s:%d Error!\n", __func__, __LINE__);
1082		goto err;
1083	}
1084
1085	agdev->in_ep = usb_ep_autoconfig(gadget, &fs_epin_desc);
1086	if (!agdev->in_ep) {
1087		dev_err(dev, "%s:%d Error!\n", __func__, __LINE__);
1088		goto err;
1089	}
1090
1091	uac2->p_prm.uac2 = uac2;
1092	uac2->c_prm.uac2 = uac2;
1093
1094	/* Calculate wMaxPacketSize according to audio bandwidth */
1095	set_ep_max_packet_size(uac2_opts, &fs_epin_desc, 1000, true);
1096	set_ep_max_packet_size(uac2_opts, &fs_epout_desc, 1000, false);
1097	set_ep_max_packet_size(uac2_opts, &hs_epin_desc, 8000, true);
1098	set_ep_max_packet_size(uac2_opts, &hs_epout_desc, 8000, false);
1099
1100	hs_epout_desc.bEndpointAddress = fs_epout_desc.bEndpointAddress;
1101	hs_epin_desc.bEndpointAddress = fs_epin_desc.bEndpointAddress;
1102
1103	ret = usb_assign_descriptors(fn, fs_audio_desc, hs_audio_desc, NULL,
1104				     NULL);
1105	if (ret)
1106		goto err;
1107
1108	prm = &agdev->uac2.c_prm;
1109	prm->max_psize = hs_epout_desc.wMaxPacketSize;
1110	prm->rbuf = kzalloc(prm->max_psize * USB_XFERS, GFP_KERNEL);
1111	if (!prm->rbuf) {
1112		prm->max_psize = 0;
1113		goto err_free_descs;
1114	}
1115
1116	prm = &agdev->uac2.p_prm;
1117	prm->max_psize = hs_epin_desc.wMaxPacketSize;
1118	prm->rbuf = kzalloc(prm->max_psize * USB_XFERS, GFP_KERNEL);
1119	if (!prm->rbuf) {
1120		prm->max_psize = 0;
1121		goto err_free_descs;
1122	}
1123
1124	ret = alsa_uac2_init(agdev);
1125	if (ret)
1126		goto err_free_descs;
1127	return 0;
1128
1129err_free_descs:
1130	usb_free_all_descriptors(fn);
1131err:
1132	kfree(agdev->uac2.p_prm.rbuf);
1133	kfree(agdev->uac2.c_prm.rbuf);
1134	return -EINVAL;
1135}
1136
1137static int
1138afunc_set_alt(struct usb_function *fn, unsigned intf, unsigned alt)
1139{
1140	struct usb_composite_dev *cdev = fn->config->cdev;
1141	struct audio_dev *agdev = func_to_agdev(fn);
1142	struct snd_uac2_chip *uac2 = &agdev->uac2;
1143	struct usb_gadget *gadget = cdev->gadget;
1144	struct device *dev = &uac2->pdev.dev;
1145	struct usb_request *req;
1146	struct usb_ep *ep;
1147	struct uac2_rtd_params *prm;
1148	int req_len, i;
1149
1150	/* No i/f has more than 2 alt settings */
1151	if (alt > 1) {
1152		dev_err(dev, "%s:%d Error!\n", __func__, __LINE__);
1153		return -EINVAL;
1154	}
1155
1156	if (intf == agdev->ac_intf) {
1157		/* Control I/f has only 1 AltSetting - 0 */
1158		if (alt) {
1159			dev_err(dev, "%s:%d Error!\n", __func__, __LINE__);
1160			return -EINVAL;
1161		}
1162		return 0;
1163	}
1164
1165	if (intf == agdev->as_out_intf) {
1166		ep = agdev->out_ep;
1167		prm = &uac2->c_prm;
1168		config_ep_by_speed(gadget, fn, ep);
1169		agdev->as_out_alt = alt;
1170		req_len = prm->max_psize;
1171	} else if (intf == agdev->as_in_intf) {
1172		struct f_uac2_opts *opts = agdev_to_uac2_opts(agdev);
1173		unsigned int factor, rate;
1174		struct usb_endpoint_descriptor *ep_desc;
1175
1176		ep = agdev->in_ep;
1177		prm = &uac2->p_prm;
1178		config_ep_by_speed(gadget, fn, ep);
1179		agdev->as_in_alt = alt;
1180
1181		/* pre-calculate the playback endpoint's interval */
1182		if (gadget->speed == USB_SPEED_FULL) {
1183			ep_desc = &fs_epin_desc;
1184			factor = 1000;
1185		} else {
1186			ep_desc = &hs_epin_desc;
1187			factor = 8000;
1188		}
1189
1190		/* pre-compute some values for iso_complete() */
1191		uac2->p_framesize = opts->p_ssize *
1192				    num_channels(opts->p_chmask);
1193		rate = opts->p_srate * uac2->p_framesize;
1194		uac2->p_interval = factor / (1 << (ep_desc->bInterval - 1));
1195		uac2->p_pktsize = min_t(unsigned int, rate / uac2->p_interval,
1196					prm->max_psize);
1197
1198		if (uac2->p_pktsize < prm->max_psize)
1199			uac2->p_pktsize_residue = rate % uac2->p_interval;
1200		else
1201			uac2->p_pktsize_residue = 0;
1202
1203		req_len = uac2->p_pktsize;
1204		uac2->p_residue = 0;
1205	} else {
1206		dev_err(dev, "%s:%d Error!\n", __func__, __LINE__);
1207		return -EINVAL;
1208	}
1209
1210	if (alt == 0) {
1211		free_ep(prm, ep);
1212		return 0;
1213	}
1214
1215	prm->ep_enabled = true;
1216	usb_ep_enable(ep);
1217
1218	for (i = 0; i < USB_XFERS; i++) {
1219		if (!prm->ureq[i].req) {
1220			req = usb_ep_alloc_request(ep, GFP_ATOMIC);
1221			if (req == NULL)
1222				return -ENOMEM;
1223
1224			prm->ureq[i].req = req;
1225			prm->ureq[i].pp = prm;
1226
1227			req->zero = 0;
1228			req->context = &prm->ureq[i];
1229			req->length = req_len;
1230			req->complete = agdev_iso_complete;
1231			req->buf = prm->rbuf + i * prm->max_psize;
1232		}
1233
1234		if (usb_ep_queue(ep, prm->ureq[i].req, GFP_ATOMIC))
1235			dev_err(dev, "%s:%d Error!\n", __func__, __LINE__);
1236	}
1237
1238	return 0;
1239}
1240
1241static int
1242afunc_get_alt(struct usb_function *fn, unsigned intf)
1243{
1244	struct audio_dev *agdev = func_to_agdev(fn);
1245	struct snd_uac2_chip *uac2 = &agdev->uac2;
1246
1247	if (intf == agdev->ac_intf)
1248		return agdev->ac_alt;
1249	else if (intf == agdev->as_out_intf)
1250		return agdev->as_out_alt;
1251	else if (intf == agdev->as_in_intf)
1252		return agdev->as_in_alt;
1253	else
1254		dev_err(&uac2->pdev.dev,
1255			"%s:%d Invalid Interface %d!\n",
1256			__func__, __LINE__, intf);
1257
1258	return -EINVAL;
1259}
1260
1261static void
1262afunc_disable(struct usb_function *fn)
1263{
1264	struct audio_dev *agdev = func_to_agdev(fn);
1265	struct snd_uac2_chip *uac2 = &agdev->uac2;
1266
1267	free_ep(&uac2->p_prm, agdev->in_ep);
1268	agdev->as_in_alt = 0;
1269
1270	free_ep(&uac2->c_prm, agdev->out_ep);
1271	agdev->as_out_alt = 0;
1272}
1273
1274static int
1275in_rq_cur(struct usb_function *fn, const struct usb_ctrlrequest *cr)
1276{
1277	struct usb_request *req = fn->config->cdev->req;
1278	struct audio_dev *agdev = func_to_agdev(fn);
1279	struct snd_uac2_chip *uac2 = &agdev->uac2;
1280	struct f_uac2_opts *opts;
1281	u16 w_length = le16_to_cpu(cr->wLength);
1282	u16 w_index = le16_to_cpu(cr->wIndex);
1283	u16 w_value = le16_to_cpu(cr->wValue);
1284	u8 entity_id = (w_index >> 8) & 0xff;
1285	u8 control_selector = w_value >> 8;
1286	int value = -EOPNOTSUPP;
1287	int p_srate, c_srate;
1288
1289	opts = agdev_to_uac2_opts(agdev);
1290	p_srate = opts->p_srate;
1291	c_srate = opts->c_srate;
1292
1293	if (control_selector == UAC2_CS_CONTROL_SAM_FREQ) {
1294		struct cntrl_cur_lay3 c;
1295
1296		if (entity_id == USB_IN_CLK_ID)
1297			c.dCUR = p_srate;
1298		else if (entity_id == USB_OUT_CLK_ID)
1299			c.dCUR = c_srate;
1300
1301		value = min_t(unsigned, w_length, sizeof c);
1302		memcpy(req->buf, &c, value);
1303	} else if (control_selector == UAC2_CS_CONTROL_CLOCK_VALID) {
1304		*(u8 *)req->buf = 1;
1305		value = min_t(unsigned, w_length, 1);
1306	} else {
1307		dev_err(&uac2->pdev.dev,
1308			"%s:%d control_selector=%d TODO!\n",
1309			__func__, __LINE__, control_selector);
1310	}
1311
1312	return value;
1313}
1314
1315static int
1316in_rq_range(struct usb_function *fn, const struct usb_ctrlrequest *cr)
1317{
1318	struct usb_request *req = fn->config->cdev->req;
1319	struct audio_dev *agdev = func_to_agdev(fn);
1320	struct snd_uac2_chip *uac2 = &agdev->uac2;
1321	struct f_uac2_opts *opts;
1322	u16 w_length = le16_to_cpu(cr->wLength);
1323	u16 w_index = le16_to_cpu(cr->wIndex);
1324	u16 w_value = le16_to_cpu(cr->wValue);
1325	u8 entity_id = (w_index >> 8) & 0xff;
1326	u8 control_selector = w_value >> 8;
1327	struct cntrl_range_lay3 r;
1328	int value = -EOPNOTSUPP;
1329	int p_srate, c_srate;
1330
1331	opts = agdev_to_uac2_opts(agdev);
1332	p_srate = opts->p_srate;
1333	c_srate = opts->c_srate;
1334
1335	if (control_selector == UAC2_CS_CONTROL_SAM_FREQ) {
1336		if (entity_id == USB_IN_CLK_ID)
1337			r.dMIN = p_srate;
1338		else if (entity_id == USB_OUT_CLK_ID)
1339			r.dMIN = c_srate;
1340		else
1341			return -EOPNOTSUPP;
1342
1343		r.dMAX = r.dMIN;
1344		r.dRES = 0;
1345		r.wNumSubRanges = 1;
1346
1347		value = min_t(unsigned, w_length, sizeof r);
1348		memcpy(req->buf, &r, value);
1349	} else {
1350		dev_err(&uac2->pdev.dev,
1351			"%s:%d control_selector=%d TODO!\n",
1352			__func__, __LINE__, control_selector);
1353	}
1354
1355	return value;
1356}
1357
1358static int
1359ac_rq_in(struct usb_function *fn, const struct usb_ctrlrequest *cr)
1360{
1361	if (cr->bRequest == UAC2_CS_CUR)
1362		return in_rq_cur(fn, cr);
1363	else if (cr->bRequest == UAC2_CS_RANGE)
1364		return in_rq_range(fn, cr);
1365	else
1366		return -EOPNOTSUPP;
1367}
1368
1369static int
1370out_rq_cur(struct usb_function *fn, const struct usb_ctrlrequest *cr)
1371{
1372	u16 w_length = le16_to_cpu(cr->wLength);
1373	u16 w_value = le16_to_cpu(cr->wValue);
1374	u8 control_selector = w_value >> 8;
1375
1376	if (control_selector == UAC2_CS_CONTROL_SAM_FREQ)
1377		return w_length;
1378
1379	return -EOPNOTSUPP;
1380}
1381
1382static int
1383setup_rq_inf(struct usb_function *fn, const struct usb_ctrlrequest *cr)
1384{
1385	struct audio_dev *agdev = func_to_agdev(fn);
1386	struct snd_uac2_chip *uac2 = &agdev->uac2;
1387	u16 w_index = le16_to_cpu(cr->wIndex);
1388	u8 intf = w_index & 0xff;
1389
1390	if (intf != agdev->ac_intf) {
1391		dev_err(&uac2->pdev.dev,
1392			"%s:%d Error!\n", __func__, __LINE__);
1393		return -EOPNOTSUPP;
1394	}
1395
1396	if (cr->bRequestType & USB_DIR_IN)
1397		return ac_rq_in(fn, cr);
1398	else if (cr->bRequest == UAC2_CS_CUR)
1399		return out_rq_cur(fn, cr);
1400
1401	return -EOPNOTSUPP;
1402}
1403
1404static int
1405afunc_setup(struct usb_function *fn, const struct usb_ctrlrequest *cr)
1406{
1407	struct usb_composite_dev *cdev = fn->config->cdev;
1408	struct audio_dev *agdev = func_to_agdev(fn);
1409	struct snd_uac2_chip *uac2 = &agdev->uac2;
1410	struct usb_request *req = cdev->req;
1411	u16 w_length = le16_to_cpu(cr->wLength);
1412	int value = -EOPNOTSUPP;
1413
1414	/* Only Class specific requests are supposed to reach here */
1415	if ((cr->bRequestType & USB_TYPE_MASK) != USB_TYPE_CLASS)
1416		return -EOPNOTSUPP;
1417
1418	if ((cr->bRequestType & USB_RECIP_MASK) == USB_RECIP_INTERFACE)
1419		value = setup_rq_inf(fn, cr);
1420	else
1421		dev_err(&uac2->pdev.dev, "%s:%d Error!\n", __func__, __LINE__);
1422
1423	if (value >= 0) {
1424		req->length = value;
1425		req->zero = value < w_length;
1426		value = usb_ep_queue(cdev->gadget->ep0, req, GFP_ATOMIC);
1427		if (value < 0) {
1428			dev_err(&uac2->pdev.dev,
1429				"%s:%d Error!\n", __func__, __LINE__);
1430			req->status = 0;
1431		}
1432	}
1433
1434	return value;
1435}
1436
1437static inline struct f_uac2_opts *to_f_uac2_opts(struct config_item *item)
1438{
1439	return container_of(to_config_group(item), struct f_uac2_opts,
1440			    func_inst.group);
1441}
1442
1443static void f_uac2_attr_release(struct config_item *item)
1444{
1445	struct f_uac2_opts *opts = to_f_uac2_opts(item);
1446
1447	usb_put_function_instance(&opts->func_inst);
1448}
1449
1450static struct configfs_item_operations f_uac2_item_ops = {
1451	.release	= f_uac2_attr_release,
1452};
1453
1454#define UAC2_ATTRIBUTE(name)						\
1455static ssize_t f_uac2_opts_##name##_show(struct config_item *item,	\
1456					 char *page)			\
1457{									\
1458	struct f_uac2_opts *opts = to_f_uac2_opts(item);		\
1459	int result;							\
1460									\
1461	mutex_lock(&opts->lock);					\
1462	result = sprintf(page, "%u\n", opts->name);			\
1463	mutex_unlock(&opts->lock);					\
1464									\
1465	return result;							\
1466}									\
1467									\
1468static ssize_t f_uac2_opts_##name##_store(struct config_item *item,	\
1469					  const char *page, size_t len)	\
1470{									\
1471	struct f_uac2_opts *opts = to_f_uac2_opts(item);		\
1472	int ret;							\
1473	u32 num;							\
1474									\
1475	mutex_lock(&opts->lock);					\
1476	if (opts->refcnt) {						\
1477		ret = -EBUSY;						\
1478		goto end;						\
1479	}								\
1480									\
1481	ret = kstrtou32(page, 0, &num);					\
1482	if (ret)							\
1483		goto end;						\
1484									\
1485	opts->name = num;						\
1486	ret = len;							\
1487									\
1488end:									\
1489	mutex_unlock(&opts->lock);					\
1490	return ret;							\
1491}									\
1492									\
1493CONFIGFS_ATTR(f_uac2_opts_, name)
1494
1495UAC2_ATTRIBUTE(p_chmask);
1496UAC2_ATTRIBUTE(p_srate);
1497UAC2_ATTRIBUTE(p_ssize);
1498UAC2_ATTRIBUTE(c_chmask);
1499UAC2_ATTRIBUTE(c_srate);
1500UAC2_ATTRIBUTE(c_ssize);
1501
1502static struct configfs_attribute *f_uac2_attrs[] = {
1503	&f_uac2_opts_attr_p_chmask,
1504	&f_uac2_opts_attr_p_srate,
1505	&f_uac2_opts_attr_p_ssize,
1506	&f_uac2_opts_attr_c_chmask,
1507	&f_uac2_opts_attr_c_srate,
1508	&f_uac2_opts_attr_c_ssize,
1509	NULL,
1510};
1511
1512static struct config_item_type f_uac2_func_type = {
1513	.ct_item_ops	= &f_uac2_item_ops,
1514	.ct_attrs	= f_uac2_attrs,
1515	.ct_owner	= THIS_MODULE,
1516};
1517
1518static void afunc_free_inst(struct usb_function_instance *f)
1519{
1520	struct f_uac2_opts *opts;
1521
1522	opts = container_of(f, struct f_uac2_opts, func_inst);
1523	kfree(opts);
1524}
1525
1526static struct usb_function_instance *afunc_alloc_inst(void)
1527{
1528	struct f_uac2_opts *opts;
1529
1530	opts = kzalloc(sizeof(*opts), GFP_KERNEL);
1531	if (!opts)
1532		return ERR_PTR(-ENOMEM);
1533
1534	mutex_init(&opts->lock);
1535	opts->func_inst.free_func_inst = afunc_free_inst;
1536
1537	config_group_init_type_name(&opts->func_inst.group, "",
1538				    &f_uac2_func_type);
1539
1540	opts->p_chmask = UAC2_DEF_PCHMASK;
1541	opts->p_srate = UAC2_DEF_PSRATE;
1542	opts->p_ssize = UAC2_DEF_PSSIZE;
1543	opts->c_chmask = UAC2_DEF_CCHMASK;
1544	opts->c_srate = UAC2_DEF_CSRATE;
1545	opts->c_ssize = UAC2_DEF_CSSIZE;
1546	return &opts->func_inst;
1547}
1548
1549static void afunc_free(struct usb_function *f)
1550{
1551	struct audio_dev *agdev;
1552	struct f_uac2_opts *opts;
1553
1554	agdev = func_to_agdev(f);
1555	opts = container_of(f->fi, struct f_uac2_opts, func_inst);
1556	kfree(agdev);
1557	mutex_lock(&opts->lock);
1558	--opts->refcnt;
1559	mutex_unlock(&opts->lock);
1560}
1561
1562static void afunc_unbind(struct usb_configuration *c, struct usb_function *f)
1563{
1564	struct audio_dev *agdev = func_to_agdev(f);
1565	struct uac2_rtd_params *prm;
1566
1567	alsa_uac2_exit(agdev);
1568
1569	prm = &agdev->uac2.p_prm;
1570	kfree(prm->rbuf);
1571
1572	prm = &agdev->uac2.c_prm;
1573	kfree(prm->rbuf);
1574	usb_free_all_descriptors(f);
1575}
1576
1577static struct usb_function *afunc_alloc(struct usb_function_instance *fi)
1578{
1579	struct audio_dev *agdev;
1580	struct f_uac2_opts *opts;
1581
1582	agdev = kzalloc(sizeof(*agdev), GFP_KERNEL);
1583	if (agdev == NULL)
1584		return ERR_PTR(-ENOMEM);
1585
1586	opts = container_of(fi, struct f_uac2_opts, func_inst);
1587	mutex_lock(&opts->lock);
1588	++opts->refcnt;
1589	mutex_unlock(&opts->lock);
1590
1591	agdev->func.name = "uac2_func";
1592	agdev->func.bind = afunc_bind;
1593	agdev->func.unbind = afunc_unbind;
1594	agdev->func.set_alt = afunc_set_alt;
1595	agdev->func.get_alt = afunc_get_alt;
1596	agdev->func.disable = afunc_disable;
1597	agdev->func.setup = afunc_setup;
1598	agdev->func.free_func = afunc_free;
1599
1600	return &agdev->func;
1601}
1602
1603DECLARE_USB_FUNCTION_INIT(uac2, afunc_alloc_inst, afunc_alloc);
1604MODULE_LICENSE("GPL");
1605MODULE_AUTHOR("Yadwinder Singh");
1606MODULE_AUTHOR("Jaswinder Singh");