cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

u_audio.c (34952B)


      1// SPDX-License-Identifier: GPL-2.0+
      2/*
      3 * u_audio.c -- interface to USB gadget "ALSA sound card" utilities
      4 *
      5 * Copyright (C) 2016
      6 * Author: Ruslan Bilovol <ruslan.bilovol@gmail.com>
      7 *
      8 * Sound card implementation was cut-and-pasted with changes
      9 * from f_uac2.c and has:
     10 *    Copyright (C) 2011
     11 *    Yadwinder Singh (yadi.brar01@gmail.com)
     12 *    Jaswinder Singh (jaswinder.singh@linaro.org)
     13 */
     14
     15#include <linux/kernel.h>
     16#include <linux/module.h>
     17#include <sound/core.h>
     18#include <sound/pcm.h>
     19#include <sound/pcm_params.h>
     20#include <sound/control.h>
     21#include <sound/tlv.h>
     22#include <linux/usb/audio.h>
     23
     24#include "u_audio.h"
     25
     26#define BUFF_SIZE_MAX	(PAGE_SIZE * 16)
     27#define PRD_SIZE_MAX	PAGE_SIZE
     28#define MIN_PERIODS	4
     29
     30enum {
     31	UAC_FBACK_CTRL,
     32	UAC_P_PITCH_CTRL,
     33	UAC_MUTE_CTRL,
     34	UAC_VOLUME_CTRL,
     35	UAC_RATE_CTRL,
     36};
     37
     38/* Runtime data params for one stream */
     39struct uac_rtd_params {
     40	struct snd_uac_chip *uac; /* parent chip */
     41	bool ep_enabled; /* if the ep is enabled */
     42
     43	struct snd_pcm_substream *ss;
     44
     45	/* Ring buffer */
     46	ssize_t hw_ptr;
     47
     48	void *rbuf;
     49
     50	unsigned int pitch;	/* Stream pitch ratio to 1000000 */
     51	unsigned int max_psize;	/* MaxPacketSize of endpoint */
     52
     53	struct usb_request **reqs;
     54
     55	struct usb_request *req_fback; /* Feedback endpoint request */
     56	bool fb_ep_enabled; /* if the ep is enabled */
     57
     58  /* Volume/Mute controls and their state */
     59  int fu_id; /* Feature Unit ID */
     60  struct snd_kcontrol *snd_kctl_volume;
     61  struct snd_kcontrol *snd_kctl_mute;
     62  s16 volume_min, volume_max, volume_res;
     63  s16 volume;
     64  int mute;
     65
     66	struct snd_kcontrol *snd_kctl_rate; /* read-only current rate */
     67	int srate; /* selected samplerate */
     68	int active; /* playback/capture running */
     69
     70  spinlock_t lock; /* lock for control transfers */
     71
     72};
     73
     74struct snd_uac_chip {
     75	struct g_audio *audio_dev;
     76
     77	struct uac_rtd_params p_prm;
     78	struct uac_rtd_params c_prm;
     79
     80	struct snd_card *card;
     81	struct snd_pcm *pcm;
     82
     83	/* pre-calculated values for playback iso completion */
     84	unsigned long long p_residue_mil;
     85	unsigned int p_interval;
     86	unsigned int p_framesize;
     87};
     88
     89static const struct snd_pcm_hardware uac_pcm_hardware = {
     90	.info = SNDRV_PCM_INFO_INTERLEAVED | SNDRV_PCM_INFO_BLOCK_TRANSFER
     91		 | SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_MMAP_VALID
     92		 | SNDRV_PCM_INFO_PAUSE | SNDRV_PCM_INFO_RESUME,
     93	.rates = SNDRV_PCM_RATE_CONTINUOUS,
     94	.periods_max = BUFF_SIZE_MAX / PRD_SIZE_MAX,
     95	.buffer_bytes_max = BUFF_SIZE_MAX,
     96	.period_bytes_max = PRD_SIZE_MAX,
     97	.periods_min = MIN_PERIODS,
     98};
     99
    100static void u_audio_set_fback_frequency(enum usb_device_speed speed,
    101					struct usb_ep *out_ep,
    102					unsigned long long freq,
    103					unsigned int pitch,
    104					void *buf)
    105{
    106	u32 ff = 0;
    107	const struct usb_endpoint_descriptor *ep_desc;
    108
    109	/*
    110	 * Because the pitch base is 1000000, the final divider here
    111	 * will be 1000 * 1000000 = 1953125 << 9
    112	 *
    113	 * Instead of dealing with big numbers lets fold this 9 left shift
    114	 */
    115
    116	if (speed == USB_SPEED_FULL) {
    117		/*
    118		 * Full-speed feedback endpoints report frequency
    119		 * in samples/frame
    120		 * Format is encoded in Q10.10 left-justified in the 24 bits,
    121		 * so that it has a Q10.14 format.
    122		 *
    123		 * ff = (freq << 14) / 1000
    124		 */
    125		freq <<= 5;
    126	} else {
    127		/*
    128		 * High-speed feedback endpoints report frequency
    129		 * in samples/microframe.
    130		 * Format is encoded in Q12.13 fitted into four bytes so that
    131		 * the binary point is located between the second and the third
    132		 * byte fromat (that is Q16.16)
    133		 *
    134		 * ff = (freq << 16) / 8000
    135		 *
    136		 * Win10 and OSX UAC2 drivers require number of samples per packet
    137		 * in order to honor the feedback value.
    138		 * Linux snd-usb-audio detects the applied bit-shift automatically.
    139		 */
    140		ep_desc = out_ep->desc;
    141		freq <<= 4 + (ep_desc->bInterval - 1);
    142	}
    143
    144	ff = DIV_ROUND_CLOSEST_ULL((freq * pitch), 1953125);
    145
    146	*(__le32 *)buf = cpu_to_le32(ff);
    147}
    148
    149static void u_audio_iso_complete(struct usb_ep *ep, struct usb_request *req)
    150{
    151	unsigned int pending;
    152	unsigned int hw_ptr;
    153	int status = req->status;
    154	struct snd_pcm_substream *substream;
    155	struct snd_pcm_runtime *runtime;
    156	struct uac_rtd_params *prm = req->context;
    157	struct snd_uac_chip *uac = prm->uac;
    158	unsigned int frames, p_pktsize;
    159	unsigned long long pitched_rate_mil, p_pktsize_residue_mil,
    160			residue_frames_mil, div_result;
    161
    162	/* i/f shutting down */
    163	if (!prm->ep_enabled) {
    164		usb_ep_free_request(ep, req);
    165		return;
    166	}
    167
    168	if (req->status == -ESHUTDOWN)
    169		return;
    170
    171	/*
    172	 * We can't really do much about bad xfers.
    173	 * Afterall, the ISOCH xfers could fail legitimately.
    174	 */
    175	if (status)
    176		pr_debug("%s: iso_complete status(%d) %d/%d\n",
    177			__func__, status, req->actual, req->length);
    178
    179	substream = prm->ss;
    180
    181	/* Do nothing if ALSA isn't active */
    182	if (!substream)
    183		goto exit;
    184
    185	snd_pcm_stream_lock(substream);
    186
    187	runtime = substream->runtime;
    188	if (!runtime || !snd_pcm_running(substream)) {
    189		snd_pcm_stream_unlock(substream);
    190		goto exit;
    191	}
    192
    193	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
    194		/*
    195		 * For each IN packet, take the quotient of the current data
    196		 * rate and the endpoint's interval as the base packet size.
    197		 * If there is a residue from this division, add it to the
    198		 * residue accumulator.
    199		 */
    200		unsigned long long p_interval_mil = uac->p_interval * 1000000ULL;
    201
    202		pitched_rate_mil = (unsigned long long) prm->srate * prm->pitch;
    203		div_result = pitched_rate_mil;
    204		do_div(div_result, uac->p_interval);
    205		do_div(div_result, 1000000);
    206		frames = (unsigned int) div_result;
    207
    208		pr_debug("p_srate %d, pitch %d, interval_mil %llu, frames %d\n",
    209				prm->srate, prm->pitch, p_interval_mil, frames);
    210
    211		p_pktsize = min_t(unsigned int,
    212					uac->p_framesize * frames,
    213					ep->maxpacket);
    214
    215		if (p_pktsize < ep->maxpacket) {
    216			residue_frames_mil = pitched_rate_mil - frames * p_interval_mil;
    217			p_pktsize_residue_mil = uac->p_framesize * residue_frames_mil;
    218		} else
    219			p_pktsize_residue_mil = 0;
    220
    221		req->length = p_pktsize;
    222		uac->p_residue_mil += p_pktsize_residue_mil;
    223
    224		/*
    225		 * Whenever there are more bytes in the accumulator p_residue_mil than we
    226		 * need to add one more sample frame, increase this packet's
    227		 * size and decrease the accumulator.
    228		 */
    229		div_result = uac->p_residue_mil;
    230		do_div(div_result, uac->p_interval);
    231		do_div(div_result, 1000000);
    232		if ((unsigned int) div_result >= uac->p_framesize) {
    233			req->length += uac->p_framesize;
    234			uac->p_residue_mil -= uac->p_framesize * p_interval_mil;
    235			pr_debug("increased req length to %d\n", req->length);
    236		}
    237		pr_debug("remains uac->p_residue_mil %llu\n", uac->p_residue_mil);
    238
    239		req->actual = req->length;
    240	}
    241
    242	hw_ptr = prm->hw_ptr;
    243
    244	/* Pack USB load in ALSA ring buffer */
    245	pending = runtime->dma_bytes - hw_ptr;
    246
    247	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
    248		if (unlikely(pending < req->actual)) {
    249			memcpy(req->buf, runtime->dma_area + hw_ptr, pending);
    250			memcpy(req->buf + pending, runtime->dma_area,
    251			       req->actual - pending);
    252		} else {
    253			memcpy(req->buf, runtime->dma_area + hw_ptr,
    254			       req->actual);
    255		}
    256	} else {
    257		if (unlikely(pending < req->actual)) {
    258			memcpy(runtime->dma_area + hw_ptr, req->buf, pending);
    259			memcpy(runtime->dma_area, req->buf + pending,
    260			       req->actual - pending);
    261		} else {
    262			memcpy(runtime->dma_area + hw_ptr, req->buf,
    263			       req->actual);
    264		}
    265	}
    266
    267	/* update hw_ptr after data is copied to memory */
    268	prm->hw_ptr = (hw_ptr + req->actual) % runtime->dma_bytes;
    269	hw_ptr = prm->hw_ptr;
    270	snd_pcm_stream_unlock(substream);
    271
    272	if ((hw_ptr % snd_pcm_lib_period_bytes(substream)) < req->actual)
    273		snd_pcm_period_elapsed(substream);
    274
    275exit:
    276	if (usb_ep_queue(ep, req, GFP_ATOMIC))
    277		dev_err(uac->card->dev, "%d Error!\n", __LINE__);
    278}
    279
    280static void u_audio_iso_fback_complete(struct usb_ep *ep,
    281				       struct usb_request *req)
    282{
    283	struct uac_rtd_params *prm = req->context;
    284	struct snd_uac_chip *uac = prm->uac;
    285	struct g_audio *audio_dev = uac->audio_dev;
    286	int status = req->status;
    287
    288	/* i/f shutting down */
    289	if (!prm->fb_ep_enabled) {
    290		kfree(req->buf);
    291		usb_ep_free_request(ep, req);
    292		return;
    293	}
    294
    295	if (req->status == -ESHUTDOWN)
    296		return;
    297
    298	/*
    299	 * We can't really do much about bad xfers.
    300	 * Afterall, the ISOCH xfers could fail legitimately.
    301	 */
    302	if (status)
    303		pr_debug("%s: iso_complete status(%d) %d/%d\n",
    304			__func__, status, req->actual, req->length);
    305
    306	u_audio_set_fback_frequency(audio_dev->gadget->speed, audio_dev->out_ep,
    307				    prm->srate, prm->pitch,
    308				    req->buf);
    309
    310	if (usb_ep_queue(ep, req, GFP_ATOMIC))
    311		dev_err(uac->card->dev, "%d Error!\n", __LINE__);
    312}
    313
    314static int uac_pcm_trigger(struct snd_pcm_substream *substream, int cmd)
    315{
    316	struct snd_uac_chip *uac = snd_pcm_substream_chip(substream);
    317	struct uac_rtd_params *prm;
    318	struct g_audio *audio_dev;
    319	struct uac_params *params;
    320	int err = 0;
    321
    322	audio_dev = uac->audio_dev;
    323	params = &audio_dev->params;
    324
    325	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
    326		prm = &uac->p_prm;
    327	else
    328		prm = &uac->c_prm;
    329
    330	/* Reset */
    331	prm->hw_ptr = 0;
    332
    333	switch (cmd) {
    334	case SNDRV_PCM_TRIGGER_START:
    335	case SNDRV_PCM_TRIGGER_RESUME:
    336		prm->ss = substream;
    337		break;
    338	case SNDRV_PCM_TRIGGER_STOP:
    339	case SNDRV_PCM_TRIGGER_SUSPEND:
    340		prm->ss = NULL;
    341		break;
    342	default:
    343		err = -EINVAL;
    344	}
    345
    346	/* Clear buffer after Play stops */
    347	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK && !prm->ss)
    348		memset(prm->rbuf, 0, prm->max_psize * params->req_number);
    349
    350	return err;
    351}
    352
    353static snd_pcm_uframes_t uac_pcm_pointer(struct snd_pcm_substream *substream)
    354{
    355	struct snd_uac_chip *uac = snd_pcm_substream_chip(substream);
    356	struct uac_rtd_params *prm;
    357
    358	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
    359		prm = &uac->p_prm;
    360	else
    361		prm = &uac->c_prm;
    362
    363	return bytes_to_frames(substream->runtime, prm->hw_ptr);
    364}
    365
    366static u64 uac_ssize_to_fmt(int ssize)
    367{
    368	u64 ret;
    369
    370	switch (ssize) {
    371	case 3:
    372		ret = SNDRV_PCM_FMTBIT_S24_3LE;
    373		break;
    374	case 4:
    375		ret = SNDRV_PCM_FMTBIT_S32_LE;
    376		break;
    377	default:
    378		ret = SNDRV_PCM_FMTBIT_S16_LE;
    379		break;
    380	}
    381
    382	return ret;
    383}
    384
    385static int uac_pcm_open(struct snd_pcm_substream *substream)
    386{
    387	struct snd_uac_chip *uac = snd_pcm_substream_chip(substream);
    388	struct snd_pcm_runtime *runtime = substream->runtime;
    389	struct g_audio *audio_dev;
    390	struct uac_params *params;
    391	struct uac_rtd_params *prm;
    392	int p_ssize, c_ssize;
    393	int p_chmask, c_chmask;
    394
    395	audio_dev = uac->audio_dev;
    396	params = &audio_dev->params;
    397	p_ssize = params->p_ssize;
    398	c_ssize = params->c_ssize;
    399	p_chmask = params->p_chmask;
    400	c_chmask = params->c_chmask;
    401	uac->p_residue_mil = 0;
    402
    403	runtime->hw = uac_pcm_hardware;
    404
    405	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
    406		runtime->hw.formats = uac_ssize_to_fmt(p_ssize);
    407		runtime->hw.channels_min = num_channels(p_chmask);
    408		prm = &uac->p_prm;
    409	} else {
    410		runtime->hw.formats = uac_ssize_to_fmt(c_ssize);
    411		runtime->hw.channels_min = num_channels(c_chmask);
    412		prm = &uac->c_prm;
    413	}
    414
    415	runtime->hw.period_bytes_min = 2 * prm->max_psize
    416					/ runtime->hw.periods_min;
    417	runtime->hw.rate_min = prm->srate;
    418	runtime->hw.rate_max = runtime->hw.rate_min;
    419	runtime->hw.channels_max = runtime->hw.channels_min;
    420
    421	snd_pcm_hw_constraint_integer(runtime, SNDRV_PCM_HW_PARAM_PERIODS);
    422
    423	return 0;
    424}
    425
    426/* ALSA cries without these function pointers */
    427static int uac_pcm_null(struct snd_pcm_substream *substream)
    428{
    429	return 0;
    430}
    431
    432static const struct snd_pcm_ops uac_pcm_ops = {
    433	.open = uac_pcm_open,
    434	.close = uac_pcm_null,
    435	.trigger = uac_pcm_trigger,
    436	.pointer = uac_pcm_pointer,
    437	.prepare = uac_pcm_null,
    438};
    439
    440static inline void free_ep(struct uac_rtd_params *prm, struct usb_ep *ep)
    441{
    442	struct snd_uac_chip *uac = prm->uac;
    443	struct g_audio *audio_dev;
    444	struct uac_params *params;
    445	int i;
    446
    447	if (!prm->ep_enabled)
    448		return;
    449
    450	audio_dev = uac->audio_dev;
    451	params = &audio_dev->params;
    452
    453	for (i = 0; i < params->req_number; i++) {
    454		if (prm->reqs[i]) {
    455			if (usb_ep_dequeue(ep, prm->reqs[i]))
    456				usb_ep_free_request(ep, prm->reqs[i]);
    457			/*
    458			 * If usb_ep_dequeue() cannot successfully dequeue the
    459			 * request, the request will be freed by the completion
    460			 * callback.
    461			 */
    462
    463			prm->reqs[i] = NULL;
    464		}
    465	}
    466
    467	prm->ep_enabled = false;
    468
    469	if (usb_ep_disable(ep))
    470		dev_err(uac->card->dev, "%s:%d Error!\n", __func__, __LINE__);
    471}
    472
    473static inline void free_ep_fback(struct uac_rtd_params *prm, struct usb_ep *ep)
    474{
    475	struct snd_uac_chip *uac = prm->uac;
    476
    477	if (!prm->fb_ep_enabled)
    478		return;
    479
    480	if (prm->req_fback) {
    481		if (usb_ep_dequeue(ep, prm->req_fback)) {
    482			kfree(prm->req_fback->buf);
    483			usb_ep_free_request(ep, prm->req_fback);
    484		}
    485		prm->req_fback = NULL;
    486	}
    487
    488	prm->fb_ep_enabled = false;
    489
    490	if (usb_ep_disable(ep))
    491		dev_err(uac->card->dev, "%s:%d Error!\n", __func__, __LINE__);
    492}
    493
    494static void set_active(struct uac_rtd_params *prm, bool active)
    495{
    496	// notifying through the Rate ctrl
    497	struct snd_kcontrol *kctl = prm->snd_kctl_rate;
    498	unsigned long flags;
    499
    500	spin_lock_irqsave(&prm->lock, flags);
    501	if (prm->active != active) {
    502		prm->active = active;
    503		snd_ctl_notify(prm->uac->card, SNDRV_CTL_EVENT_MASK_VALUE,
    504				&kctl->id);
    505	}
    506	spin_unlock_irqrestore(&prm->lock, flags);
    507}
    508
    509int u_audio_set_capture_srate(struct g_audio *audio_dev, int srate)
    510{
    511	struct uac_params *params = &audio_dev->params;
    512	struct snd_uac_chip *uac = audio_dev->uac;
    513	struct uac_rtd_params *prm;
    514	int i;
    515	unsigned long flags;
    516
    517	dev_dbg(&audio_dev->gadget->dev, "%s: srate %d\n", __func__, srate);
    518	prm = &uac->c_prm;
    519	for (i = 0; i < UAC_MAX_RATES; i++) {
    520		if (params->c_srates[i] == srate) {
    521			spin_lock_irqsave(&prm->lock, flags);
    522			prm->srate = srate;
    523			spin_unlock_irqrestore(&prm->lock, flags);
    524			return 0;
    525		}
    526		if (params->c_srates[i] == 0)
    527			break;
    528	}
    529
    530	return -EINVAL;
    531}
    532EXPORT_SYMBOL_GPL(u_audio_set_capture_srate);
    533
    534int u_audio_get_capture_srate(struct g_audio *audio_dev, u32 *val)
    535{
    536	struct snd_uac_chip *uac = audio_dev->uac;
    537	struct uac_rtd_params *prm;
    538	unsigned long flags;
    539
    540	prm = &uac->c_prm;
    541	spin_lock_irqsave(&prm->lock, flags);
    542	*val = prm->srate;
    543	spin_unlock_irqrestore(&prm->lock, flags);
    544	return 0;
    545}
    546EXPORT_SYMBOL_GPL(u_audio_get_capture_srate);
    547
    548int u_audio_set_playback_srate(struct g_audio *audio_dev, int srate)
    549{
    550	struct uac_params *params = &audio_dev->params;
    551	struct snd_uac_chip *uac = audio_dev->uac;
    552	struct uac_rtd_params *prm;
    553	int i;
    554	unsigned long flags;
    555
    556	dev_dbg(&audio_dev->gadget->dev, "%s: srate %d\n", __func__, srate);
    557	prm = &uac->p_prm;
    558	for (i = 0; i < UAC_MAX_RATES; i++) {
    559		if (params->p_srates[i] == srate) {
    560			spin_lock_irqsave(&prm->lock, flags);
    561			prm->srate = srate;
    562			spin_unlock_irqrestore(&prm->lock, flags);
    563			return 0;
    564		}
    565		if (params->p_srates[i] == 0)
    566			break;
    567	}
    568
    569	return -EINVAL;
    570}
    571EXPORT_SYMBOL_GPL(u_audio_set_playback_srate);
    572
    573int u_audio_get_playback_srate(struct g_audio *audio_dev, u32 *val)
    574{
    575	struct snd_uac_chip *uac = audio_dev->uac;
    576	struct uac_rtd_params *prm;
    577	unsigned long flags;
    578
    579	prm = &uac->p_prm;
    580	spin_lock_irqsave(&prm->lock, flags);
    581	*val = prm->srate;
    582	spin_unlock_irqrestore(&prm->lock, flags);
    583	return 0;
    584}
    585EXPORT_SYMBOL_GPL(u_audio_get_playback_srate);
    586
    587int u_audio_start_capture(struct g_audio *audio_dev)
    588{
    589	struct snd_uac_chip *uac = audio_dev->uac;
    590	struct usb_gadget *gadget = audio_dev->gadget;
    591	struct device *dev = &gadget->dev;
    592	struct usb_request *req, *req_fback;
    593	struct usb_ep *ep, *ep_fback;
    594	struct uac_rtd_params *prm;
    595	struct uac_params *params = &audio_dev->params;
    596	int req_len, i;
    597
    598	prm = &uac->c_prm;
    599	dev_dbg(dev, "start capture with rate %d\n", prm->srate);
    600	ep = audio_dev->out_ep;
    601	config_ep_by_speed(gadget, &audio_dev->func, ep);
    602	req_len = ep->maxpacket;
    603
    604	prm->ep_enabled = true;
    605	usb_ep_enable(ep);
    606
    607	for (i = 0; i < params->req_number; i++) {
    608		if (!prm->reqs[i]) {
    609			req = usb_ep_alloc_request(ep, GFP_ATOMIC);
    610			if (req == NULL)
    611				return -ENOMEM;
    612
    613			prm->reqs[i] = req;
    614
    615			req->zero = 0;
    616			req->context = prm;
    617			req->length = req_len;
    618			req->complete = u_audio_iso_complete;
    619			req->buf = prm->rbuf + i * ep->maxpacket;
    620		}
    621
    622		if (usb_ep_queue(ep, prm->reqs[i], GFP_ATOMIC))
    623			dev_err(dev, "%s:%d Error!\n", __func__, __LINE__);
    624	}
    625
    626	set_active(&uac->c_prm, true);
    627
    628	ep_fback = audio_dev->in_ep_fback;
    629	if (!ep_fback)
    630		return 0;
    631
    632	/* Setup feedback endpoint */
    633	config_ep_by_speed(gadget, &audio_dev->func, ep_fback);
    634	prm->fb_ep_enabled = true;
    635	usb_ep_enable(ep_fback);
    636	req_len = ep_fback->maxpacket;
    637
    638	req_fback = usb_ep_alloc_request(ep_fback, GFP_ATOMIC);
    639	if (req_fback == NULL)
    640		return -ENOMEM;
    641
    642	prm->req_fback = req_fback;
    643	req_fback->zero = 0;
    644	req_fback->context = prm;
    645	req_fback->length = req_len;
    646	req_fback->complete = u_audio_iso_fback_complete;
    647
    648	req_fback->buf = kzalloc(req_len, GFP_ATOMIC);
    649	if (!req_fback->buf)
    650		return -ENOMEM;
    651
    652	/*
    653	 * Configure the feedback endpoint's reported frequency.
    654	 * Always start with original frequency since its deviation can't
    655	 * be meauserd at start of playback
    656	 */
    657	prm->pitch = 1000000;
    658	u_audio_set_fback_frequency(audio_dev->gadget->speed, ep,
    659				    prm->srate, prm->pitch,
    660				    req_fback->buf);
    661
    662	if (usb_ep_queue(ep_fback, req_fback, GFP_ATOMIC))
    663		dev_err(dev, "%s:%d Error!\n", __func__, __LINE__);
    664
    665	return 0;
    666}
    667EXPORT_SYMBOL_GPL(u_audio_start_capture);
    668
    669void u_audio_stop_capture(struct g_audio *audio_dev)
    670{
    671	struct snd_uac_chip *uac = audio_dev->uac;
    672
    673	set_active(&uac->c_prm, false);
    674	if (audio_dev->in_ep_fback)
    675		free_ep_fback(&uac->c_prm, audio_dev->in_ep_fback);
    676	free_ep(&uac->c_prm, audio_dev->out_ep);
    677}
    678EXPORT_SYMBOL_GPL(u_audio_stop_capture);
    679
    680int u_audio_start_playback(struct g_audio *audio_dev)
    681{
    682	struct snd_uac_chip *uac = audio_dev->uac;
    683	struct usb_gadget *gadget = audio_dev->gadget;
    684	struct device *dev = &gadget->dev;
    685	struct usb_request *req;
    686	struct usb_ep *ep;
    687	struct uac_rtd_params *prm;
    688	struct uac_params *params = &audio_dev->params;
    689	unsigned int factor;
    690	const struct usb_endpoint_descriptor *ep_desc;
    691	int req_len, i;
    692	unsigned int p_pktsize;
    693
    694	prm = &uac->p_prm;
    695	dev_dbg(dev, "start playback with rate %d\n", prm->srate);
    696	ep = audio_dev->in_ep;
    697	config_ep_by_speed(gadget, &audio_dev->func, ep);
    698
    699	ep_desc = ep->desc;
    700	/*
    701	 * Always start with original frequency
    702	 */
    703	prm->pitch = 1000000;
    704
    705	/* pre-calculate the playback endpoint's interval */
    706	if (gadget->speed == USB_SPEED_FULL)
    707		factor = 1000;
    708	else
    709		factor = 8000;
    710
    711	/* pre-compute some values for iso_complete() */
    712	uac->p_framesize = params->p_ssize *
    713			    num_channels(params->p_chmask);
    714	uac->p_interval = factor / (1 << (ep_desc->bInterval - 1));
    715	p_pktsize = min_t(unsigned int,
    716				uac->p_framesize *
    717					(prm->srate / uac->p_interval),
    718				ep->maxpacket);
    719
    720	req_len = p_pktsize;
    721	uac->p_residue_mil = 0;
    722
    723	prm->ep_enabled = true;
    724	usb_ep_enable(ep);
    725
    726	for (i = 0; i < params->req_number; i++) {
    727		if (!prm->reqs[i]) {
    728			req = usb_ep_alloc_request(ep, GFP_ATOMIC);
    729			if (req == NULL)
    730				return -ENOMEM;
    731
    732			prm->reqs[i] = req;
    733
    734			req->zero = 0;
    735			req->context = prm;
    736			req->length = req_len;
    737			req->complete = u_audio_iso_complete;
    738			req->buf = prm->rbuf + i * ep->maxpacket;
    739		}
    740
    741		if (usb_ep_queue(ep, prm->reqs[i], GFP_ATOMIC))
    742			dev_err(dev, "%s:%d Error!\n", __func__, __LINE__);
    743	}
    744
    745	set_active(&uac->p_prm, true);
    746
    747	return 0;
    748}
    749EXPORT_SYMBOL_GPL(u_audio_start_playback);
    750
    751void u_audio_stop_playback(struct g_audio *audio_dev)
    752{
    753	struct snd_uac_chip *uac = audio_dev->uac;
    754
    755	set_active(&uac->p_prm, false);
    756	free_ep(&uac->p_prm, audio_dev->in_ep);
    757}
    758EXPORT_SYMBOL_GPL(u_audio_stop_playback);
    759
    760void u_audio_suspend(struct g_audio *audio_dev)
    761{
    762	struct snd_uac_chip *uac = audio_dev->uac;
    763
    764	set_active(&uac->p_prm, false);
    765	set_active(&uac->c_prm, false);
    766}
    767EXPORT_SYMBOL_GPL(u_audio_suspend);
    768
    769int u_audio_get_volume(struct g_audio *audio_dev, int playback, s16 *val)
    770{
    771	struct snd_uac_chip *uac = audio_dev->uac;
    772	struct uac_rtd_params *prm;
    773	unsigned long flags;
    774
    775	if (playback)
    776		prm = &uac->p_prm;
    777	else
    778		prm = &uac->c_prm;
    779
    780	spin_lock_irqsave(&prm->lock, flags);
    781	*val = prm->volume;
    782	spin_unlock_irqrestore(&prm->lock, flags);
    783
    784	return 0;
    785}
    786EXPORT_SYMBOL_GPL(u_audio_get_volume);
    787
    788int u_audio_set_volume(struct g_audio *audio_dev, int playback, s16 val)
    789{
    790	struct snd_uac_chip *uac = audio_dev->uac;
    791	struct uac_rtd_params *prm;
    792	unsigned long flags;
    793	int change = 0;
    794
    795	if (playback)
    796		prm = &uac->p_prm;
    797	else
    798		prm = &uac->c_prm;
    799
    800	spin_lock_irqsave(&prm->lock, flags);
    801	val = clamp(val, prm->volume_min, prm->volume_max);
    802	if (prm->volume != val) {
    803		prm->volume = val;
    804		change = 1;
    805	}
    806	spin_unlock_irqrestore(&prm->lock, flags);
    807
    808	if (change)
    809		snd_ctl_notify(uac->card, SNDRV_CTL_EVENT_MASK_VALUE,
    810				&prm->snd_kctl_volume->id);
    811
    812	return 0;
    813}
    814EXPORT_SYMBOL_GPL(u_audio_set_volume);
    815
    816int u_audio_get_mute(struct g_audio *audio_dev, int playback, int *val)
    817{
    818	struct snd_uac_chip *uac = audio_dev->uac;
    819	struct uac_rtd_params *prm;
    820	unsigned long flags;
    821
    822	if (playback)
    823		prm = &uac->p_prm;
    824	else
    825		prm = &uac->c_prm;
    826
    827	spin_lock_irqsave(&prm->lock, flags);
    828	*val = prm->mute;
    829	spin_unlock_irqrestore(&prm->lock, flags);
    830
    831	return 0;
    832}
    833EXPORT_SYMBOL_GPL(u_audio_get_mute);
    834
    835int u_audio_set_mute(struct g_audio *audio_dev, int playback, int val)
    836{
    837	struct snd_uac_chip *uac = audio_dev->uac;
    838	struct uac_rtd_params *prm;
    839	unsigned long flags;
    840	int change = 0;
    841	int mute;
    842
    843	if (playback)
    844		prm = &uac->p_prm;
    845	else
    846		prm = &uac->c_prm;
    847
    848	mute = val ? 1 : 0;
    849
    850	spin_lock_irqsave(&prm->lock, flags);
    851	if (prm->mute != mute) {
    852		prm->mute = mute;
    853		change = 1;
    854	}
    855	spin_unlock_irqrestore(&prm->lock, flags);
    856
    857	if (change)
    858		snd_ctl_notify(uac->card, SNDRV_CTL_EVENT_MASK_VALUE,
    859			       &prm->snd_kctl_mute->id);
    860
    861	return 0;
    862}
    863EXPORT_SYMBOL_GPL(u_audio_set_mute);
    864
    865
    866static int u_audio_pitch_info(struct snd_kcontrol *kcontrol,
    867				   struct snd_ctl_elem_info *uinfo)
    868{
    869	struct uac_rtd_params *prm = snd_kcontrol_chip(kcontrol);
    870	struct snd_uac_chip *uac = prm->uac;
    871	struct g_audio *audio_dev = uac->audio_dev;
    872	struct uac_params *params = &audio_dev->params;
    873	unsigned int pitch_min, pitch_max;
    874
    875	pitch_min = (1000 - FBACK_SLOW_MAX) * 1000;
    876	pitch_max = (1000 + params->fb_max) * 1000;
    877
    878	uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
    879	uinfo->count = 1;
    880	uinfo->value.integer.min = pitch_min;
    881	uinfo->value.integer.max = pitch_max;
    882	uinfo->value.integer.step = 1;
    883	return 0;
    884}
    885
    886static int u_audio_pitch_get(struct snd_kcontrol *kcontrol,
    887				   struct snd_ctl_elem_value *ucontrol)
    888{
    889	struct uac_rtd_params *prm = snd_kcontrol_chip(kcontrol);
    890
    891	ucontrol->value.integer.value[0] = prm->pitch;
    892
    893	return 0;
    894}
    895
    896static int u_audio_pitch_put(struct snd_kcontrol *kcontrol,
    897				  struct snd_ctl_elem_value *ucontrol)
    898{
    899	struct uac_rtd_params *prm = snd_kcontrol_chip(kcontrol);
    900	struct snd_uac_chip *uac = prm->uac;
    901	struct g_audio *audio_dev = uac->audio_dev;
    902	struct uac_params *params = &audio_dev->params;
    903	unsigned int val;
    904	unsigned int pitch_min, pitch_max;
    905	int change = 0;
    906
    907	pitch_min = (1000 - FBACK_SLOW_MAX) * 1000;
    908	pitch_max = (1000 + params->fb_max) * 1000;
    909
    910	val = ucontrol->value.integer.value[0];
    911
    912	if (val < pitch_min)
    913		val = pitch_min;
    914	if (val > pitch_max)
    915		val = pitch_max;
    916
    917	if (prm->pitch != val) {
    918		prm->pitch = val;
    919		change = 1;
    920	}
    921
    922	return change;
    923}
    924
    925static int u_audio_mute_info(struct snd_kcontrol *kcontrol,
    926				   struct snd_ctl_elem_info *uinfo)
    927{
    928	uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN;
    929	uinfo->count = 1;
    930	uinfo->value.integer.min = 0;
    931	uinfo->value.integer.max = 1;
    932	uinfo->value.integer.step = 1;
    933
    934	return 0;
    935}
    936
    937static int u_audio_mute_get(struct snd_kcontrol *kcontrol,
    938				   struct snd_ctl_elem_value *ucontrol)
    939{
    940	struct uac_rtd_params *prm = snd_kcontrol_chip(kcontrol);
    941	unsigned long flags;
    942
    943	spin_lock_irqsave(&prm->lock, flags);
    944	ucontrol->value.integer.value[0] = !prm->mute;
    945	spin_unlock_irqrestore(&prm->lock, flags);
    946
    947	return 0;
    948}
    949
    950static int u_audio_mute_put(struct snd_kcontrol *kcontrol,
    951				  struct snd_ctl_elem_value *ucontrol)
    952{
    953	struct uac_rtd_params *prm = snd_kcontrol_chip(kcontrol);
    954	struct snd_uac_chip *uac = prm->uac;
    955	struct g_audio *audio_dev = uac->audio_dev;
    956	unsigned int val;
    957	unsigned long flags;
    958	int change = 0;
    959
    960	val = !ucontrol->value.integer.value[0];
    961
    962	spin_lock_irqsave(&prm->lock, flags);
    963	if (val != prm->mute) {
    964		prm->mute = val;
    965		change = 1;
    966	}
    967	spin_unlock_irqrestore(&prm->lock, flags);
    968
    969	if (change && audio_dev->notify)
    970		audio_dev->notify(audio_dev, prm->fu_id, UAC_FU_MUTE);
    971
    972	return change;
    973}
    974
    975/*
    976 * TLV callback for mixer volume controls
    977 */
    978static int u_audio_volume_tlv(struct snd_kcontrol *kcontrol, int op_flag,
    979			 unsigned int size, unsigned int __user *_tlv)
    980{
    981	struct uac_rtd_params *prm = snd_kcontrol_chip(kcontrol);
    982	DECLARE_TLV_DB_MINMAX(scale, 0, 0);
    983
    984	if (size < sizeof(scale))
    985		return -ENOMEM;
    986
    987	/* UAC volume resolution is 1/256 dB, TLV is 1/100 dB */
    988	scale[2] = (prm->volume_min * 100) / 256;
    989	scale[3] = (prm->volume_max * 100) / 256;
    990	if (copy_to_user(_tlv, scale, sizeof(scale)))
    991		return -EFAULT;
    992
    993	return 0;
    994}
    995
    996static int u_audio_volume_info(struct snd_kcontrol *kcontrol,
    997				   struct snd_ctl_elem_info *uinfo)
    998{
    999	struct uac_rtd_params *prm = snd_kcontrol_chip(kcontrol);
   1000
   1001	uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
   1002	uinfo->count = 1;
   1003	uinfo->value.integer.min = 0;
   1004	uinfo->value.integer.max =
   1005		(prm->volume_max - prm->volume_min + prm->volume_res - 1)
   1006		/ prm->volume_res;
   1007	uinfo->value.integer.step = 1;
   1008
   1009	return 0;
   1010}
   1011
   1012static int u_audio_volume_get(struct snd_kcontrol *kcontrol,
   1013				   struct snd_ctl_elem_value *ucontrol)
   1014{
   1015	struct uac_rtd_params *prm = snd_kcontrol_chip(kcontrol);
   1016	unsigned long flags;
   1017
   1018	spin_lock_irqsave(&prm->lock, flags);
   1019	ucontrol->value.integer.value[0] =
   1020			(prm->volume - prm->volume_min) / prm->volume_res;
   1021	spin_unlock_irqrestore(&prm->lock, flags);
   1022
   1023	return 0;
   1024}
   1025
   1026static int u_audio_volume_put(struct snd_kcontrol *kcontrol,
   1027				  struct snd_ctl_elem_value *ucontrol)
   1028{
   1029	struct uac_rtd_params *prm = snd_kcontrol_chip(kcontrol);
   1030	struct snd_uac_chip *uac = prm->uac;
   1031	struct g_audio *audio_dev = uac->audio_dev;
   1032	unsigned int val;
   1033	s16 volume;
   1034	unsigned long flags;
   1035	int change = 0;
   1036
   1037	val = ucontrol->value.integer.value[0];
   1038
   1039	spin_lock_irqsave(&prm->lock, flags);
   1040	volume = (val * prm->volume_res) + prm->volume_min;
   1041	volume = clamp(volume, prm->volume_min, prm->volume_max);
   1042	if (volume != prm->volume) {
   1043		prm->volume = volume;
   1044		change = 1;
   1045	}
   1046	spin_unlock_irqrestore(&prm->lock, flags);
   1047
   1048	if (change && audio_dev->notify)
   1049		audio_dev->notify(audio_dev, prm->fu_id, UAC_FU_VOLUME);
   1050
   1051	return change;
   1052}
   1053
   1054static int get_max_srate(const int *srates)
   1055{
   1056	int i, max_srate = 0;
   1057
   1058	for (i = 0; i < UAC_MAX_RATES; i++) {
   1059		if (srates[i] == 0)
   1060			break;
   1061		if (srates[i] > max_srate)
   1062			max_srate = srates[i];
   1063	}
   1064	return max_srate;
   1065}
   1066
   1067static int get_min_srate(const int *srates)
   1068{
   1069	int i, min_srate = INT_MAX;
   1070
   1071	for (i = 0; i < UAC_MAX_RATES; i++) {
   1072		if (srates[i] == 0)
   1073			break;
   1074		if (srates[i] < min_srate)
   1075			min_srate = srates[i];
   1076	}
   1077	return min_srate;
   1078}
   1079
   1080static int u_audio_rate_info(struct snd_kcontrol *kcontrol,
   1081				struct snd_ctl_elem_info *uinfo)
   1082{
   1083	const int *srates;
   1084	struct uac_rtd_params *prm = snd_kcontrol_chip(kcontrol);
   1085	struct snd_uac_chip *uac = prm->uac;
   1086	struct g_audio *audio_dev = uac->audio_dev;
   1087	struct uac_params *params = &audio_dev->params;
   1088
   1089	uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
   1090	uinfo->count = 1;
   1091
   1092	if (prm == &uac->c_prm)
   1093		srates = params->c_srates;
   1094	else
   1095		srates = params->p_srates;
   1096	uinfo->value.integer.min = get_min_srate(srates);
   1097	uinfo->value.integer.max = get_max_srate(srates);
   1098	return 0;
   1099}
   1100
   1101static int u_audio_rate_get(struct snd_kcontrol *kcontrol,
   1102						 struct snd_ctl_elem_value *ucontrol)
   1103{
   1104	struct uac_rtd_params *prm = snd_kcontrol_chip(kcontrol);
   1105	unsigned long flags;
   1106
   1107	spin_lock_irqsave(&prm->lock, flags);
   1108	if (prm->active)
   1109		ucontrol->value.integer.value[0] = prm->srate;
   1110	else
   1111		/* not active: reporting zero rate */
   1112		ucontrol->value.integer.value[0] = 0;
   1113	spin_unlock_irqrestore(&prm->lock, flags);
   1114	return 0;
   1115}
   1116
   1117static struct snd_kcontrol_new u_audio_controls[]  = {
   1118  [UAC_FBACK_CTRL] {
   1119    .iface =        SNDRV_CTL_ELEM_IFACE_PCM,
   1120    .name =         "Capture Pitch 1000000",
   1121    .info =         u_audio_pitch_info,
   1122    .get =          u_audio_pitch_get,
   1123    .put =          u_audio_pitch_put,
   1124  },
   1125	[UAC_P_PITCH_CTRL] {
   1126		.iface =        SNDRV_CTL_ELEM_IFACE_PCM,
   1127		.name =         "Playback Pitch 1000000",
   1128		.info =         u_audio_pitch_info,
   1129		.get =          u_audio_pitch_get,
   1130		.put =          u_audio_pitch_put,
   1131	},
   1132  [UAC_MUTE_CTRL] {
   1133		.iface =	SNDRV_CTL_ELEM_IFACE_MIXER,
   1134		.name =		"", /* will be filled later */
   1135		.info =		u_audio_mute_info,
   1136		.get =		u_audio_mute_get,
   1137		.put =		u_audio_mute_put,
   1138	},
   1139	[UAC_VOLUME_CTRL] {
   1140		.iface =	SNDRV_CTL_ELEM_IFACE_MIXER,
   1141		.name =		"", /* will be filled later */
   1142		.info =		u_audio_volume_info,
   1143		.get =		u_audio_volume_get,
   1144		.put =		u_audio_volume_put,
   1145	},
   1146	[UAC_RATE_CTRL] {
   1147		.iface =	SNDRV_CTL_ELEM_IFACE_PCM,
   1148		.name =		"", /* will be filled later */
   1149		.access =	SNDRV_CTL_ELEM_ACCESS_READ | SNDRV_CTL_ELEM_ACCESS_VOLATILE,
   1150		.info =		u_audio_rate_info,
   1151		.get =		u_audio_rate_get,
   1152	},
   1153};
   1154
   1155int g_audio_setup(struct g_audio *g_audio, const char *pcm_name,
   1156					const char *card_name)
   1157{
   1158	struct snd_uac_chip *uac;
   1159	struct snd_card *card;
   1160	struct snd_pcm *pcm;
   1161	struct snd_kcontrol *kctl;
   1162	struct uac_params *params;
   1163	int p_chmask, c_chmask;
   1164	int i, err;
   1165
   1166	if (!g_audio)
   1167		return -EINVAL;
   1168
   1169	uac = kzalloc(sizeof(*uac), GFP_KERNEL);
   1170	if (!uac)
   1171		return -ENOMEM;
   1172	g_audio->uac = uac;
   1173	uac->audio_dev = g_audio;
   1174
   1175	params = &g_audio->params;
   1176	p_chmask = params->p_chmask;
   1177	c_chmask = params->c_chmask;
   1178
   1179	if (c_chmask) {
   1180		struct uac_rtd_params *prm = &uac->c_prm;
   1181
   1182		spin_lock_init(&prm->lock);
   1183		uac->c_prm.uac = uac;
   1184		prm->max_psize = g_audio->out_ep_maxpsize;
   1185		prm->srate = params->c_srates[0];
   1186
   1187		prm->reqs = kcalloc(params->req_number,
   1188				    sizeof(struct usb_request *),
   1189				    GFP_KERNEL);
   1190		if (!prm->reqs) {
   1191			err = -ENOMEM;
   1192			goto fail;
   1193		}
   1194
   1195		prm->rbuf = kcalloc(params->req_number, prm->max_psize,
   1196				GFP_KERNEL);
   1197		if (!prm->rbuf) {
   1198			prm->max_psize = 0;
   1199			err = -ENOMEM;
   1200			goto fail;
   1201		}
   1202	}
   1203
   1204	if (p_chmask) {
   1205		struct uac_rtd_params *prm = &uac->p_prm;
   1206
   1207		spin_lock_init(&prm->lock);
   1208		uac->p_prm.uac = uac;
   1209		prm->max_psize = g_audio->in_ep_maxpsize;
   1210		prm->srate = params->p_srates[0];
   1211
   1212		prm->reqs = kcalloc(params->req_number,
   1213				    sizeof(struct usb_request *),
   1214				    GFP_KERNEL);
   1215		if (!prm->reqs) {
   1216			err = -ENOMEM;
   1217			goto fail;
   1218		}
   1219
   1220		prm->rbuf = kcalloc(params->req_number, prm->max_psize,
   1221				GFP_KERNEL);
   1222		if (!prm->rbuf) {
   1223			prm->max_psize = 0;
   1224			err = -ENOMEM;
   1225			goto fail;
   1226		}
   1227	}
   1228
   1229	/* Choose any slot, with no id */
   1230	err = snd_card_new(&g_audio->gadget->dev,
   1231			-1, NULL, THIS_MODULE, 0, &card);
   1232	if (err < 0)
   1233		goto fail;
   1234
   1235	uac->card = card;
   1236
   1237	/*
   1238	 * Create first PCM device
   1239	 * Create a substream only for non-zero channel streams
   1240	 */
   1241	err = snd_pcm_new(uac->card, pcm_name, 0,
   1242			       p_chmask ? 1 : 0, c_chmask ? 1 : 0, &pcm);
   1243	if (err < 0)
   1244		goto snd_fail;
   1245
   1246	strscpy(pcm->name, pcm_name, sizeof(pcm->name));
   1247	pcm->private_data = uac;
   1248	uac->pcm = pcm;
   1249
   1250	snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &uac_pcm_ops);
   1251	snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &uac_pcm_ops);
   1252
   1253	/*
   1254	 * Create mixer and controls
   1255	 * Create only if it's required on USB side
   1256	 */
   1257	if ((c_chmask && g_audio->in_ep_fback)
   1258			|| (p_chmask && params->p_fu.id)
   1259			|| (c_chmask && params->c_fu.id))
   1260		strscpy(card->mixername, card_name, sizeof(card->driver));
   1261
   1262	if (c_chmask && g_audio->in_ep_fback) {
   1263		kctl = snd_ctl_new1(&u_audio_controls[UAC_FBACK_CTRL],
   1264				    &uac->c_prm);
   1265		if (!kctl) {
   1266			err = -ENOMEM;
   1267			goto snd_fail;
   1268		}
   1269
   1270		kctl->id.device = pcm->device;
   1271		kctl->id.subdevice = 0;
   1272
   1273		err = snd_ctl_add(card, kctl);
   1274		if (err < 0)
   1275			goto snd_fail;
   1276	}
   1277
   1278	if (p_chmask) {
   1279		kctl = snd_ctl_new1(&u_audio_controls[UAC_P_PITCH_CTRL],
   1280				    &uac->p_prm);
   1281		if (!kctl) {
   1282			err = -ENOMEM;
   1283			goto snd_fail;
   1284		}
   1285
   1286		kctl->id.device = pcm->device;
   1287		kctl->id.subdevice = 0;
   1288
   1289		err = snd_ctl_add(card, kctl);
   1290		if (err < 0)
   1291			goto snd_fail;
   1292	}
   1293
   1294	for (i = 0; i <= SNDRV_PCM_STREAM_LAST; i++) {
   1295		struct uac_rtd_params *prm;
   1296		struct uac_fu_params *fu;
   1297		char ctrl_name[24];
   1298		char *direction;
   1299
   1300		if (!pcm->streams[i].substream_count)
   1301			continue;
   1302
   1303		if (i == SNDRV_PCM_STREAM_PLAYBACK) {
   1304			prm = &uac->p_prm;
   1305			fu = &params->p_fu;
   1306			direction = "Playback";
   1307		} else {
   1308			prm = &uac->c_prm;
   1309			fu = &params->c_fu;
   1310			direction = "Capture";
   1311		}
   1312
   1313		prm->fu_id = fu->id;
   1314
   1315		if (fu->mute_present) {
   1316			snprintf(ctrl_name, sizeof(ctrl_name),
   1317					"PCM %s Switch", direction);
   1318
   1319			u_audio_controls[UAC_MUTE_CTRL].name = ctrl_name;
   1320
   1321			kctl = snd_ctl_new1(&u_audio_controls[UAC_MUTE_CTRL],
   1322					    prm);
   1323			if (!kctl) {
   1324				err = -ENOMEM;
   1325				goto snd_fail;
   1326			}
   1327
   1328			kctl->id.device = pcm->device;
   1329			kctl->id.subdevice = 0;
   1330
   1331			err = snd_ctl_add(card, kctl);
   1332			if (err < 0)
   1333				goto snd_fail;
   1334			prm->snd_kctl_mute = kctl;
   1335			prm->mute = 0;
   1336		}
   1337
   1338		if (fu->volume_present) {
   1339			snprintf(ctrl_name, sizeof(ctrl_name),
   1340					"PCM %s Volume", direction);
   1341
   1342			u_audio_controls[UAC_VOLUME_CTRL].name = ctrl_name;
   1343
   1344			kctl = snd_ctl_new1(&u_audio_controls[UAC_VOLUME_CTRL],
   1345					    prm);
   1346			if (!kctl) {
   1347				err = -ENOMEM;
   1348				goto snd_fail;
   1349			}
   1350
   1351			kctl->id.device = pcm->device;
   1352			kctl->id.subdevice = 0;
   1353
   1354
   1355			kctl->tlv.c = u_audio_volume_tlv;
   1356			kctl->vd[0].access |= SNDRV_CTL_ELEM_ACCESS_TLV_READ |
   1357					SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK;
   1358
   1359			err = snd_ctl_add(card, kctl);
   1360			if (err < 0)
   1361				goto snd_fail;
   1362			prm->snd_kctl_volume = kctl;
   1363			prm->volume = fu->volume_max;
   1364			prm->volume_max = fu->volume_max;
   1365			prm->volume_min = fu->volume_min;
   1366			prm->volume_res = fu->volume_res;
   1367		}
   1368
   1369		/* Add rate control */
   1370		snprintf(ctrl_name, sizeof(ctrl_name),
   1371				"%s Rate", direction);
   1372		u_audio_controls[UAC_RATE_CTRL].name = ctrl_name;
   1373
   1374		kctl = snd_ctl_new1(&u_audio_controls[UAC_RATE_CTRL], prm);
   1375		if (!kctl) {
   1376			err = -ENOMEM;
   1377			goto snd_fail;
   1378		}
   1379
   1380		kctl->id.device = pcm->device;
   1381		kctl->id.subdevice = 0;
   1382
   1383		err = snd_ctl_add(card, kctl);
   1384		if (err < 0)
   1385			goto snd_fail;
   1386		prm->snd_kctl_rate = kctl;
   1387	}
   1388
   1389	strscpy(card->driver, card_name, sizeof(card->driver));
   1390	strscpy(card->shortname, card_name, sizeof(card->shortname));
   1391	sprintf(card->longname, "%s %i", card_name, card->dev->id);
   1392
   1393	snd_pcm_set_managed_buffer_all(pcm, SNDRV_DMA_TYPE_CONTINUOUS,
   1394				       NULL, 0, BUFF_SIZE_MAX);
   1395
   1396	err = snd_card_register(card);
   1397
   1398	if (!err)
   1399		return 0;
   1400
   1401snd_fail:
   1402	snd_card_free(card);
   1403fail:
   1404	kfree(uac->p_prm.reqs);
   1405	kfree(uac->c_prm.reqs);
   1406	kfree(uac->p_prm.rbuf);
   1407	kfree(uac->c_prm.rbuf);
   1408	kfree(uac);
   1409
   1410	return err;
   1411}
   1412EXPORT_SYMBOL_GPL(g_audio_setup);
   1413
   1414void g_audio_cleanup(struct g_audio *g_audio)
   1415{
   1416	struct snd_uac_chip *uac;
   1417	struct snd_card *card;
   1418
   1419	if (!g_audio || !g_audio->uac)
   1420		return;
   1421
   1422	uac = g_audio->uac;
   1423	card = uac->card;
   1424	if (card)
   1425		snd_card_free(card);
   1426
   1427	kfree(uac->p_prm.reqs);
   1428	kfree(uac->c_prm.reqs);
   1429	kfree(uac->p_prm.rbuf);
   1430	kfree(uac->c_prm.rbuf);
   1431	kfree(uac);
   1432}
   1433EXPORT_SYMBOL_GPL(g_audio_cleanup);
   1434
   1435MODULE_LICENSE("GPL");
   1436MODULE_DESCRIPTION("USB gadget \"ALSA sound card\" utilities");
   1437MODULE_AUTHOR("Ruslan Bilovol");