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
57const 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 */
637struct 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 */
649struct 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 */
661struct 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 */
675struct 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 */
689struct 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 */
703struct 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
716struct 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 */
754struct 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 */
767struct 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 */
775struct 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
785struct 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 */
831struct 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 */
844struct 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 */
852struct 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
862struct 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 int
979afunc_bind(struct usb_configuration *cfg, struct usb_function *fn)
980{
981	struct audio_dev *agdev = func_to_agdev(fn);
982	struct snd_uac2_chip *uac2 = &agdev->uac2;
983	struct usb_composite_dev *cdev = cfg->cdev;
984	struct usb_gadget *gadget = cdev->gadget;
985	struct device *dev = &uac2->pdev.dev;
986	struct uac2_rtd_params *prm;
987	struct f_uac2_opts *uac2_opts;
988	struct usb_string *us;
989	int ret;
990
991	uac2_opts = container_of(fn->fi, struct f_uac2_opts, func_inst);
992
993	us = usb_gstrings_attach(cdev, fn_strings, ARRAY_SIZE(strings_fn));
994	if (IS_ERR(us))
995		return PTR_ERR(us);
996	iad_desc.iFunction = us[STR_ASSOC].id;
997	std_ac_if_desc.iInterface = us[STR_IF_CTRL].id;
998	in_clk_src_desc.iClockSource = us[STR_CLKSRC_IN].id;
999	out_clk_src_desc.iClockSource = us[STR_CLKSRC_OUT].id;
1000	usb_out_it_desc.iTerminal = us[STR_USB_IT].id;
1001	io_in_it_desc.iTerminal = us[STR_IO_IT].id;
1002	usb_in_ot_desc.iTerminal = us[STR_USB_OT].id;
1003	io_out_ot_desc.iTerminal = us[STR_IO_OT].id;
1004	std_as_out_if0_desc.iInterface = us[STR_AS_OUT_ALT0].id;
1005	std_as_out_if1_desc.iInterface = us[STR_AS_OUT_ALT1].id;
1006	std_as_in_if0_desc.iInterface = us[STR_AS_IN_ALT0].id;
1007	std_as_in_if1_desc.iInterface = us[STR_AS_IN_ALT1].id;
1008
1009
1010	/* Initialize the configurable parameters */
1011	usb_out_it_desc.bNrChannels = num_channels(uac2_opts->c_chmask);
1012	usb_out_it_desc.bmChannelConfig = cpu_to_le32(uac2_opts->c_chmask);
1013	io_in_it_desc.bNrChannels = num_channels(uac2_opts->p_chmask);
1014	io_in_it_desc.bmChannelConfig = cpu_to_le32(uac2_opts->p_chmask);
1015	as_out_hdr_desc.bNrChannels = num_channels(uac2_opts->c_chmask);
1016	as_out_hdr_desc.bmChannelConfig = cpu_to_le32(uac2_opts->c_chmask);
1017	as_in_hdr_desc.bNrChannels = num_channels(uac2_opts->p_chmask);
1018	as_in_hdr_desc.bmChannelConfig = cpu_to_le32(uac2_opts->p_chmask);
1019	as_out_fmt1_desc.bSubslotSize = uac2_opts->c_ssize;
1020	as_out_fmt1_desc.bBitResolution = uac2_opts->c_ssize * 8;
1021	as_in_fmt1_desc.bSubslotSize = uac2_opts->p_ssize;
1022	as_in_fmt1_desc.bBitResolution = uac2_opts->p_ssize * 8;
1023
1024	snprintf(clksrc_in, sizeof(clksrc_in), "%uHz", uac2_opts->p_srate);
1025	snprintf(clksrc_out, sizeof(clksrc_out), "%uHz", uac2_opts->c_srate);
1026
1027	ret = usb_interface_id(cfg, fn);
1028	if (ret < 0) {
1029		dev_err(dev, "%s:%d Error!\n", __func__, __LINE__);
1030		return ret;
1031	}
1032	std_ac_if_desc.bInterfaceNumber = ret;
1033	agdev->ac_intf = ret;
1034	agdev->ac_alt = 0;
1035
1036	ret = usb_interface_id(cfg, fn);
1037	if (ret < 0) {
1038		dev_err(dev, "%s:%d Error!\n", __func__, __LINE__);
1039		return ret;
1040	}
1041	std_as_out_if0_desc.bInterfaceNumber = ret;
1042	std_as_out_if1_desc.bInterfaceNumber = ret;
1043	agdev->as_out_intf = ret;
1044	agdev->as_out_alt = 0;
1045
1046	ret = usb_interface_id(cfg, fn);
1047	if (ret < 0) {
1048		dev_err(dev, "%s:%d Error!\n", __func__, __LINE__);
1049		return ret;
1050	}
1051	std_as_in_if0_desc.bInterfaceNumber = ret;
1052	std_as_in_if1_desc.bInterfaceNumber = ret;
1053	agdev->as_in_intf = ret;
1054	agdev->as_in_alt = 0;
1055
1056	agdev->out_ep = usb_ep_autoconfig(gadget, &fs_epout_desc);
1057	if (!agdev->out_ep) {
1058		dev_err(dev, "%s:%d Error!\n", __func__, __LINE__);
1059		goto err;
1060	}
1061	agdev->out_ep->driver_data = agdev;
1062
1063	agdev->in_ep = usb_ep_autoconfig(gadget, &fs_epin_desc);
1064	if (!agdev->in_ep) {
1065		dev_err(dev, "%s:%d Error!\n", __func__, __LINE__);
1066		goto err;
1067	}
1068	agdev->in_ep->driver_data = agdev;
1069
1070	uac2->p_prm.uac2 = uac2;
1071	uac2->c_prm.uac2 = uac2;
1072
1073	hs_epout_desc.bEndpointAddress = fs_epout_desc.bEndpointAddress;
1074	hs_epout_desc.wMaxPacketSize = fs_epout_desc.wMaxPacketSize;
1075	hs_epin_desc.bEndpointAddress = fs_epin_desc.bEndpointAddress;
1076	hs_epin_desc.wMaxPacketSize = fs_epin_desc.wMaxPacketSize;
1077
1078	ret = usb_assign_descriptors(fn, fs_audio_desc, hs_audio_desc, NULL);
1079	if (ret)
1080		goto err;
1081
1082	prm = &agdev->uac2.c_prm;
1083	prm->max_psize = hs_epout_desc.wMaxPacketSize;
1084	prm->rbuf = kzalloc(prm->max_psize * USB_XFERS, GFP_KERNEL);
1085	if (!prm->rbuf) {
1086		prm->max_psize = 0;
1087		goto err_free_descs;
1088	}
1089
1090	prm = &agdev->uac2.p_prm;
1091	prm->max_psize = hs_epin_desc.wMaxPacketSize;
1092	prm->rbuf = kzalloc(prm->max_psize * USB_XFERS, GFP_KERNEL);
1093	if (!prm->rbuf) {
1094		prm->max_psize = 0;
1095		goto err_free_descs;
1096	}
1097
1098	ret = alsa_uac2_init(agdev);
1099	if (ret)
1100		goto err_free_descs;
1101	return 0;
1102
1103err_free_descs:
1104	usb_free_all_descriptors(fn);
1105err:
1106	kfree(agdev->uac2.p_prm.rbuf);
1107	kfree(agdev->uac2.c_prm.rbuf);
1108	if (agdev->in_ep)
1109		agdev->in_ep->driver_data = NULL;
1110	if (agdev->out_ep)
1111		agdev->out_ep->driver_data = NULL;
1112	return -EINVAL;
1113}
1114
1115static int
1116afunc_set_alt(struct usb_function *fn, unsigned intf, unsigned alt)
1117{
1118	struct usb_composite_dev *cdev = fn->config->cdev;
1119	struct audio_dev *agdev = func_to_agdev(fn);
1120	struct snd_uac2_chip *uac2 = &agdev->uac2;
1121	struct usb_gadget *gadget = cdev->gadget;
1122	struct device *dev = &uac2->pdev.dev;
1123	struct usb_request *req;
1124	struct usb_ep *ep;
1125	struct uac2_rtd_params *prm;
1126	int req_len, i;
1127
1128	/* No i/f has more than 2 alt settings */
1129	if (alt > 1) {
1130		dev_err(dev, "%s:%d Error!\n", __func__, __LINE__);
1131		return -EINVAL;
1132	}
1133
1134	if (intf == agdev->ac_intf) {
1135		/* Control I/f has only 1 AltSetting - 0 */
1136		if (alt) {
1137			dev_err(dev, "%s:%d Error!\n", __func__, __LINE__);
1138			return -EINVAL;
1139		}
1140		return 0;
1141	}
1142
1143	if (intf == agdev->as_out_intf) {
1144		ep = agdev->out_ep;
1145		prm = &uac2->c_prm;
1146		config_ep_by_speed(gadget, fn, ep);
1147		agdev->as_out_alt = alt;
1148		req_len = prm->max_psize;
1149	} else if (intf == agdev->as_in_intf) {
1150		struct f_uac2_opts *opts = agdev_to_uac2_opts(agdev);
1151		unsigned int factor, rate;
1152		struct usb_endpoint_descriptor *ep_desc;
1153
1154		ep = agdev->in_ep;
1155		prm = &uac2->p_prm;
1156		config_ep_by_speed(gadget, fn, ep);
1157		agdev->as_in_alt = alt;
1158
1159		/* pre-calculate the playback endpoint's interval */
1160		if (gadget->speed == USB_SPEED_FULL) {
1161			ep_desc = &fs_epin_desc;
1162			factor = 1000;
1163		} else {
1164			ep_desc = &hs_epin_desc;
1165			factor = 125;
1166		}
1167
1168		/* pre-compute some values for iso_complete() */
1169		uac2->p_framesize = opts->p_ssize *
1170				    num_channels(opts->p_chmask);
1171		rate = opts->p_srate * uac2->p_framesize;
1172		uac2->p_interval = (1 << (ep_desc->bInterval - 1)) * factor;
1173		uac2->p_pktsize = min_t(unsigned int, rate / uac2->p_interval,
1174					prm->max_psize);
1175
1176		if (uac2->p_pktsize < prm->max_psize)
1177			uac2->p_pktsize_residue = rate % uac2->p_interval;
1178		else
1179			uac2->p_pktsize_residue = 0;
1180
1181		req_len = uac2->p_pktsize;
1182		uac2->p_residue = 0;
1183	} else {
1184		dev_err(dev, "%s:%d Error!\n", __func__, __LINE__);
1185		return -EINVAL;
1186	}
1187
1188	if (alt == 0) {
1189		free_ep(prm, ep);
1190		return 0;
1191	}
1192
1193	prm->ep_enabled = true;
1194	usb_ep_enable(ep);
1195
1196	for (i = 0; i < USB_XFERS; i++) {
1197		if (!prm->ureq[i].req) {
1198			req = usb_ep_alloc_request(ep, GFP_ATOMIC);
1199			if (req == NULL)
1200				return -ENOMEM;
1201
1202			prm->ureq[i].req = req;
1203			prm->ureq[i].pp = prm;
1204
1205			req->zero = 0;
1206			req->context = &prm->ureq[i];
1207			req->length = req_len;
1208			req->complete = agdev_iso_complete;
1209			req->buf = prm->rbuf + i * prm->max_psize;
1210		}
1211
1212		if (usb_ep_queue(ep, prm->ureq[i].req, GFP_ATOMIC))
1213			dev_err(dev, "%s:%d Error!\n", __func__, __LINE__);
1214	}
1215
1216	return 0;
1217}
1218
1219static int
1220afunc_get_alt(struct usb_function *fn, unsigned intf)
1221{
1222	struct audio_dev *agdev = func_to_agdev(fn);
1223	struct snd_uac2_chip *uac2 = &agdev->uac2;
1224
1225	if (intf == agdev->ac_intf)
1226		return agdev->ac_alt;
1227	else if (intf == agdev->as_out_intf)
1228		return agdev->as_out_alt;
1229	else if (intf == agdev->as_in_intf)
1230		return agdev->as_in_alt;
1231	else
1232		dev_err(&uac2->pdev.dev,
1233			"%s:%d Invalid Interface %d!\n",
1234			__func__, __LINE__, intf);
1235
1236	return -EINVAL;
1237}
1238
1239static void
1240afunc_disable(struct usb_function *fn)
1241{
1242	struct audio_dev *agdev = func_to_agdev(fn);
1243	struct snd_uac2_chip *uac2 = &agdev->uac2;
1244
1245	free_ep(&uac2->p_prm, agdev->in_ep);
1246	agdev->as_in_alt = 0;
1247
1248	free_ep(&uac2->c_prm, agdev->out_ep);
1249	agdev->as_out_alt = 0;
1250}
1251
1252static int
1253in_rq_cur(struct usb_function *fn, const struct usb_ctrlrequest *cr)
1254{
1255	struct usb_request *req = fn->config->cdev->req;
1256	struct audio_dev *agdev = func_to_agdev(fn);
1257	struct snd_uac2_chip *uac2 = &agdev->uac2;
1258	struct f_uac2_opts *opts;
1259	u16 w_length = le16_to_cpu(cr->wLength);
1260	u16 w_index = le16_to_cpu(cr->wIndex);
1261	u16 w_value = le16_to_cpu(cr->wValue);
1262	u8 entity_id = (w_index >> 8) & 0xff;
1263	u8 control_selector = w_value >> 8;
1264	int value = -EOPNOTSUPP;
1265	int p_srate, c_srate;
1266
1267	opts = agdev_to_uac2_opts(agdev);
1268	p_srate = opts->p_srate;
1269	c_srate = opts->c_srate;
1270
1271	if (control_selector == UAC2_CS_CONTROL_SAM_FREQ) {
1272		struct cntrl_cur_lay3 c;
1273
1274		if (entity_id == USB_IN_CLK_ID)
1275			c.dCUR = p_srate;
1276		else if (entity_id == USB_OUT_CLK_ID)
1277			c.dCUR = c_srate;
1278
1279		value = min_t(unsigned, w_length, sizeof c);
1280		memcpy(req->buf, &c, value);
1281	} else if (control_selector == UAC2_CS_CONTROL_CLOCK_VALID) {
1282		*(u8 *)req->buf = 1;
1283		value = min_t(unsigned, w_length, 1);
1284	} else {
1285		dev_err(&uac2->pdev.dev,
1286			"%s:%d control_selector=%d TODO!\n",
1287			__func__, __LINE__, control_selector);
1288	}
1289
1290	return value;
1291}
1292
1293static int
1294in_rq_range(struct usb_function *fn, const struct usb_ctrlrequest *cr)
1295{
1296	struct usb_request *req = fn->config->cdev->req;
1297	struct audio_dev *agdev = func_to_agdev(fn);
1298	struct snd_uac2_chip *uac2 = &agdev->uac2;
1299	struct f_uac2_opts *opts;
1300	u16 w_length = le16_to_cpu(cr->wLength);
1301	u16 w_index = le16_to_cpu(cr->wIndex);
1302	u16 w_value = le16_to_cpu(cr->wValue);
1303	u8 entity_id = (w_index >> 8) & 0xff;
1304	u8 control_selector = w_value >> 8;
1305	struct cntrl_range_lay3 r;
1306	int value = -EOPNOTSUPP;
1307	int p_srate, c_srate;
1308
1309	opts = agdev_to_uac2_opts(agdev);
1310	p_srate = opts->p_srate;
1311	c_srate = opts->c_srate;
1312
1313	if (control_selector == UAC2_CS_CONTROL_SAM_FREQ) {
1314		if (entity_id == USB_IN_CLK_ID)
1315			r.dMIN = p_srate;
1316		else if (entity_id == USB_OUT_CLK_ID)
1317			r.dMIN = c_srate;
1318		else
1319			return -EOPNOTSUPP;
1320
1321		r.dMAX = r.dMIN;
1322		r.dRES = 0;
1323		r.wNumSubRanges = 1;
1324
1325		value = min_t(unsigned, w_length, sizeof r);
1326		memcpy(req->buf, &r, value);
1327	} else {
1328		dev_err(&uac2->pdev.dev,
1329			"%s:%d control_selector=%d TODO!\n",
1330			__func__, __LINE__, control_selector);
1331	}
1332
1333	return value;
1334}
1335
1336static int
1337ac_rq_in(struct usb_function *fn, const struct usb_ctrlrequest *cr)
1338{
1339	if (cr->bRequest == UAC2_CS_CUR)
1340		return in_rq_cur(fn, cr);
1341	else if (cr->bRequest == UAC2_CS_RANGE)
1342		return in_rq_range(fn, cr);
1343	else
1344		return -EOPNOTSUPP;
1345}
1346
1347static int
1348out_rq_cur(struct usb_function *fn, const struct usb_ctrlrequest *cr)
1349{
1350	u16 w_length = le16_to_cpu(cr->wLength);
1351	u16 w_value = le16_to_cpu(cr->wValue);
1352	u8 control_selector = w_value >> 8;
1353
1354	if (control_selector == UAC2_CS_CONTROL_SAM_FREQ)
1355		return w_length;
1356
1357	return -EOPNOTSUPP;
1358}
1359
1360static int
1361setup_rq_inf(struct usb_function *fn, const struct usb_ctrlrequest *cr)
1362{
1363	struct audio_dev *agdev = func_to_agdev(fn);
1364	struct snd_uac2_chip *uac2 = &agdev->uac2;
1365	u16 w_index = le16_to_cpu(cr->wIndex);
1366	u8 intf = w_index & 0xff;
1367
1368	if (intf != agdev->ac_intf) {
1369		dev_err(&uac2->pdev.dev,
1370			"%s:%d Error!\n", __func__, __LINE__);
1371		return -EOPNOTSUPP;
1372	}
1373
1374	if (cr->bRequestType & USB_DIR_IN)
1375		return ac_rq_in(fn, cr);
1376	else if (cr->bRequest == UAC2_CS_CUR)
1377		return out_rq_cur(fn, cr);
1378
1379	return -EOPNOTSUPP;
1380}
1381
1382static int
1383afunc_setup(struct usb_function *fn, const struct usb_ctrlrequest *cr)
1384{
1385	struct usb_composite_dev *cdev = fn->config->cdev;
1386	struct audio_dev *agdev = func_to_agdev(fn);
1387	struct snd_uac2_chip *uac2 = &agdev->uac2;
1388	struct usb_request *req = cdev->req;
1389	u16 w_length = le16_to_cpu(cr->wLength);
1390	int value = -EOPNOTSUPP;
1391
1392	/* Only Class specific requests are supposed to reach here */
1393	if ((cr->bRequestType & USB_TYPE_MASK) != USB_TYPE_CLASS)
1394		return -EOPNOTSUPP;
1395
1396	if ((cr->bRequestType & USB_RECIP_MASK) == USB_RECIP_INTERFACE)
1397		value = setup_rq_inf(fn, cr);
1398	else
1399		dev_err(&uac2->pdev.dev, "%s:%d Error!\n", __func__, __LINE__);
1400
1401	if (value >= 0) {
1402		req->length = value;
1403		req->zero = value < w_length;
1404		value = usb_ep_queue(cdev->gadget->ep0, req, GFP_ATOMIC);
1405		if (value < 0) {
1406			dev_err(&uac2->pdev.dev,
1407				"%s:%d Error!\n", __func__, __LINE__);
1408			req->status = 0;
1409		}
1410	}
1411
1412	return value;
1413}
1414
1415static inline struct f_uac2_opts *to_f_uac2_opts(struct config_item *item)
1416{
1417	return container_of(to_config_group(item), struct f_uac2_opts,
1418			    func_inst.group);
1419}
1420
1421CONFIGFS_ATTR_STRUCT(f_uac2_opts);
1422CONFIGFS_ATTR_OPS(f_uac2_opts);
1423
1424static void f_uac2_attr_release(struct config_item *item)
1425{
1426	struct f_uac2_opts *opts = to_f_uac2_opts(item);
1427
1428	usb_put_function_instance(&opts->func_inst);
1429}
1430
1431static struct configfs_item_operations f_uac2_item_ops = {
1432	.release	= f_uac2_attr_release,
1433	.show_attribute	= f_uac2_opts_attr_show,
1434	.store_attribute = f_uac2_opts_attr_store,
1435};
1436
1437#define UAC2_ATTRIBUTE(name)						\
1438static ssize_t f_uac2_opts_##name##_show(struct f_uac2_opts *opts,	\
1439					 char *page)			\
1440{									\
1441	int result;							\
1442									\
1443	mutex_lock(&opts->lock);					\
1444	result = sprintf(page, "%u\n", opts->name);			\
1445	mutex_unlock(&opts->lock);					\
1446									\
1447	return result;							\
1448}									\
1449									\
1450static ssize_t f_uac2_opts_##name##_store(struct f_uac2_opts *opts,	\
1451					  const char *page, size_t len)	\
1452{									\
1453	int ret;							\
1454	u32 num;							\
1455									\
1456	mutex_lock(&opts->lock);					\
1457	if (opts->refcnt) {						\
1458		ret = -EBUSY;						\
1459		goto end;						\
1460	}								\
1461									\
1462	ret = kstrtou32(page, 0, &num);					\
1463	if (ret)							\
1464		goto end;						\
1465									\
1466	opts->name = num;						\
1467	ret = len;							\
1468									\
1469end:									\
1470	mutex_unlock(&opts->lock);					\
1471	return ret;							\
1472}									\
1473									\
1474static struct f_uac2_opts_attribute f_uac2_opts_##name =		\
1475	__CONFIGFS_ATTR(name, S_IRUGO | S_IWUSR,			\
1476			f_uac2_opts_##name##_show,			\
1477			f_uac2_opts_##name##_store)
1478
1479UAC2_ATTRIBUTE(p_chmask);
1480UAC2_ATTRIBUTE(p_srate);
1481UAC2_ATTRIBUTE(p_ssize);
1482UAC2_ATTRIBUTE(c_chmask);
1483UAC2_ATTRIBUTE(c_srate);
1484UAC2_ATTRIBUTE(c_ssize);
1485
1486static struct configfs_attribute *f_uac2_attrs[] = {
1487	&f_uac2_opts_p_chmask.attr,
1488	&f_uac2_opts_p_srate.attr,
1489	&f_uac2_opts_p_ssize.attr,
1490	&f_uac2_opts_c_chmask.attr,
1491	&f_uac2_opts_c_srate.attr,
1492	&f_uac2_opts_c_ssize.attr,
1493	NULL,
1494};
1495
1496static struct config_item_type f_uac2_func_type = {
1497	.ct_item_ops	= &f_uac2_item_ops,
1498	.ct_attrs	= f_uac2_attrs,
1499	.ct_owner	= THIS_MODULE,
1500};
1501
1502static void afunc_free_inst(struct usb_function_instance *f)
1503{
1504	struct f_uac2_opts *opts;
1505
1506	opts = container_of(f, struct f_uac2_opts, func_inst);
1507	kfree(opts);
1508}
1509
1510static struct usb_function_instance *afunc_alloc_inst(void)
1511{
1512	struct f_uac2_opts *opts;
1513
1514	opts = kzalloc(sizeof(*opts), GFP_KERNEL);
1515	if (!opts)
1516		return ERR_PTR(-ENOMEM);
1517
1518	mutex_init(&opts->lock);
1519	opts->func_inst.free_func_inst = afunc_free_inst;
1520
1521	config_group_init_type_name(&opts->func_inst.group, "",
1522				    &f_uac2_func_type);
1523
1524	opts->p_chmask = UAC2_DEF_PCHMASK;
1525	opts->p_srate = UAC2_DEF_PSRATE;
1526	opts->p_ssize = UAC2_DEF_PSSIZE;
1527	opts->c_chmask = UAC2_DEF_CCHMASK;
1528	opts->c_srate = UAC2_DEF_CSRATE;
1529	opts->c_ssize = UAC2_DEF_CSSIZE;
1530	return &opts->func_inst;
1531}
1532
1533static void afunc_free(struct usb_function *f)
1534{
1535	struct audio_dev *agdev;
1536	struct f_uac2_opts *opts;
1537
1538	agdev = func_to_agdev(f);
1539	opts = container_of(f->fi, struct f_uac2_opts, func_inst);
1540	kfree(agdev);
1541	mutex_lock(&opts->lock);
1542	--opts->refcnt;
1543	mutex_unlock(&opts->lock);
1544}
1545
1546static void afunc_unbind(struct usb_configuration *c, struct usb_function *f)
1547{
1548	struct audio_dev *agdev = func_to_agdev(f);
1549	struct uac2_rtd_params *prm;
1550
1551	alsa_uac2_exit(agdev);
1552
1553	prm = &agdev->uac2.p_prm;
1554	kfree(prm->rbuf);
1555
1556	prm = &agdev->uac2.c_prm;
1557	kfree(prm->rbuf);
1558	usb_free_all_descriptors(f);
1559
1560	if (agdev->in_ep)
1561		agdev->in_ep->driver_data = NULL;
1562	if (agdev->out_ep)
1563		agdev->out_ep->driver_data = NULL;
1564}
1565
1566struct 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");
1596