linux/drivers/usb/gadget/function/f_uac2.c
<<
>>
Prefs
   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        if (ret)
1105                goto err;
1106
1107        prm = &agdev->uac2.c_prm;
1108        prm->max_psize = hs_epout_desc.wMaxPacketSize;
1109        prm->rbuf = kzalloc(prm->max_psize * USB_XFERS, GFP_KERNEL);
1110        if (!prm->rbuf) {
1111                prm->max_psize = 0;
1112                goto err_free_descs;
1113        }
1114
1115        prm = &agdev->uac2.p_prm;
1116        prm->max_psize = hs_epin_desc.wMaxPacketSize;
1117        prm->rbuf = kzalloc(prm->max_psize * USB_XFERS, GFP_KERNEL);
1118        if (!prm->rbuf) {
1119                prm->max_psize = 0;
1120                goto err_free_descs;
1121        }
1122
1123        ret = alsa_uac2_init(agdev);
1124        if (ret)
1125                goto err_free_descs;
1126        return 0;
1127
1128err_free_descs:
1129        usb_free_all_descriptors(fn);
1130err:
1131        kfree(agdev->uac2.p_prm.rbuf);
1132        kfree(agdev->uac2.c_prm.rbuf);
1133        return -EINVAL;
1134}
1135
1136static int
1137afunc_set_alt(struct usb_function *fn, unsigned intf, unsigned alt)
1138{
1139        struct usb_composite_dev *cdev = fn->config->cdev;
1140        struct audio_dev *agdev = func_to_agdev(fn);
1141        struct snd_uac2_chip *uac2 = &agdev->uac2;
1142        struct usb_gadget *gadget = cdev->gadget;
1143        struct device *dev = &uac2->pdev.dev;
1144        struct usb_request *req;
1145        struct usb_ep *ep;
1146        struct uac2_rtd_params *prm;
1147        int req_len, i;
1148
1149        /* No i/f has more than 2 alt settings */
1150        if (alt > 1) {
1151                dev_err(dev, "%s:%d Error!\n", __func__, __LINE__);
1152                return -EINVAL;
1153        }
1154
1155        if (intf == agdev->ac_intf) {
1156                /* Control I/f has only 1 AltSetting - 0 */
1157                if (alt) {
1158                        dev_err(dev, "%s:%d Error!\n", __func__, __LINE__);
1159                        return -EINVAL;
1160                }
1161                return 0;
1162        }
1163
1164        if (intf == agdev->as_out_intf) {
1165                ep = agdev->out_ep;
1166                prm = &uac2->c_prm;
1167                config_ep_by_speed(gadget, fn, ep);
1168                agdev->as_out_alt = alt;
1169                req_len = prm->max_psize;
1170        } else if (intf == agdev->as_in_intf) {
1171                struct f_uac2_opts *opts = agdev_to_uac2_opts(agdev);
1172                unsigned int factor, rate;
1173                struct usb_endpoint_descriptor *ep_desc;
1174
1175                ep = agdev->in_ep;
1176                prm = &uac2->p_prm;
1177                config_ep_by_speed(gadget, fn, ep);
1178                agdev->as_in_alt = alt;
1179
1180                /* pre-calculate the playback endpoint's interval */
1181                if (gadget->speed == USB_SPEED_FULL) {
1182                        ep_desc = &fs_epin_desc;
1183                        factor = 1000;
1184                } else {
1185                        ep_desc = &hs_epin_desc;
1186                        factor = 8000;
1187                }
1188
1189                /* pre-compute some values for iso_complete() */
1190                uac2->p_framesize = opts->p_ssize *
1191                                    num_channels(opts->p_chmask);
1192                rate = opts->p_srate * uac2->p_framesize;
1193                uac2->p_interval = factor / (1 << (ep_desc->bInterval - 1));
1194                uac2->p_pktsize = min_t(unsigned int, rate / uac2->p_interval,
1195                                        prm->max_psize);
1196
1197                if (uac2->p_pktsize < prm->max_psize)
1198                        uac2->p_pktsize_residue = rate % uac2->p_interval;
1199                else
1200                        uac2->p_pktsize_residue = 0;
1201
1202                req_len = uac2->p_pktsize;
1203                uac2->p_residue = 0;
1204        } else {
1205                dev_err(dev, "%s:%d Error!\n", __func__, __LINE__);
1206                return -EINVAL;
1207        }
1208
1209        if (alt == 0) {
1210                free_ep(prm, ep);
1211                return 0;
1212        }
1213
1214        prm->ep_enabled = true;
1215        usb_ep_enable(ep);
1216
1217        for (i = 0; i < USB_XFERS; i++) {
1218                if (!prm->ureq[i].req) {
1219                        req = usb_ep_alloc_request(ep, GFP_ATOMIC);
1220                        if (req == NULL)
1221                                return -ENOMEM;
1222
1223                        prm->ureq[i].req = req;
1224                        prm->ureq[i].pp = prm;
1225
1226                        req->zero = 0;
1227                        req->context = &prm->ureq[i];
1228                        req->length = req_len;
1229                        req->complete = agdev_iso_complete;
1230                        req->buf = prm->rbuf + i * prm->max_psize;
1231                }
1232
1233                if (usb_ep_queue(ep, prm->ureq[i].req, GFP_ATOMIC))
1234                        dev_err(dev, "%s:%d Error!\n", __func__, __LINE__);
1235        }
1236
1237        return 0;
1238}
1239
1240static int
1241afunc_get_alt(struct usb_function *fn, unsigned intf)
1242{
1243        struct audio_dev *agdev = func_to_agdev(fn);
1244        struct snd_uac2_chip *uac2 = &agdev->uac2;
1245
1246        if (intf == agdev->ac_intf)
1247                return agdev->ac_alt;
1248        else if (intf == agdev->as_out_intf)
1249                return agdev->as_out_alt;
1250        else if (intf == agdev->as_in_intf)
1251                return agdev->as_in_alt;
1252        else
1253                dev_err(&uac2->pdev.dev,
1254                        "%s:%d Invalid Interface %d!\n",
1255                        __func__, __LINE__, intf);
1256
1257        return -EINVAL;
1258}
1259
1260static void
1261afunc_disable(struct usb_function *fn)
1262{
1263        struct audio_dev *agdev = func_to_agdev(fn);
1264        struct snd_uac2_chip *uac2 = &agdev->uac2;
1265
1266        free_ep(&uac2->p_prm, agdev->in_ep);
1267        agdev->as_in_alt = 0;
1268
1269        free_ep(&uac2->c_prm, agdev->out_ep);
1270        agdev->as_out_alt = 0;
1271}
1272
1273static int
1274in_rq_cur(struct usb_function *fn, const struct usb_ctrlrequest *cr)
1275{
1276        struct usb_request *req = fn->config->cdev->req;
1277        struct audio_dev *agdev = func_to_agdev(fn);
1278        struct snd_uac2_chip *uac2 = &agdev->uac2;
1279        struct f_uac2_opts *opts;
1280        u16 w_length = le16_to_cpu(cr->wLength);
1281        u16 w_index = le16_to_cpu(cr->wIndex);
1282        u16 w_value = le16_to_cpu(cr->wValue);
1283        u8 entity_id = (w_index >> 8) & 0xff;
1284        u8 control_selector = w_value >> 8;
1285        int value = -EOPNOTSUPP;
1286        int p_srate, c_srate;
1287
1288        opts = agdev_to_uac2_opts(agdev);
1289        p_srate = opts->p_srate;
1290        c_srate = opts->c_srate;
1291
1292        if (control_selector == UAC2_CS_CONTROL_SAM_FREQ) {
1293                struct cntrl_cur_lay3 c;
1294
1295                if (entity_id == USB_IN_CLK_ID)
1296                        c.dCUR = p_srate;
1297                else if (entity_id == USB_OUT_CLK_ID)
1298                        c.dCUR = c_srate;
1299
1300                value = min_t(unsigned, w_length, sizeof c);
1301                memcpy(req->buf, &c, value);
1302        } else if (control_selector == UAC2_CS_CONTROL_CLOCK_VALID) {
1303                *(u8 *)req->buf = 1;
1304                value = min_t(unsigned, w_length, 1);
1305        } else {
1306                dev_err(&uac2->pdev.dev,
1307                        "%s:%d control_selector=%d TODO!\n",
1308                        __func__, __LINE__, control_selector);
1309        }
1310
1311        return value;
1312}
1313
1314static int
1315in_rq_range(struct usb_function *fn, const struct usb_ctrlrequest *cr)
1316{
1317        struct usb_request *req = fn->config->cdev->req;
1318        struct audio_dev *agdev = func_to_agdev(fn);
1319        struct snd_uac2_chip *uac2 = &agdev->uac2;
1320        struct f_uac2_opts *opts;
1321        u16 w_length = le16_to_cpu(cr->wLength);
1322        u16 w_index = le16_to_cpu(cr->wIndex);
1323        u16 w_value = le16_to_cpu(cr->wValue);
1324        u8 entity_id = (w_index >> 8) & 0xff;
1325        u8 control_selector = w_value >> 8;
1326        struct cntrl_range_lay3 r;
1327        int value = -EOPNOTSUPP;
1328        int p_srate, c_srate;
1329
1330        opts = agdev_to_uac2_opts(agdev);
1331        p_srate = opts->p_srate;
1332        c_srate = opts->c_srate;
1333
1334        if (control_selector == UAC2_CS_CONTROL_SAM_FREQ) {
1335                if (entity_id == USB_IN_CLK_ID)
1336                        r.dMIN = p_srate;
1337                else if (entity_id == USB_OUT_CLK_ID)
1338                        r.dMIN = c_srate;
1339                else
1340                        return -EOPNOTSUPP;
1341
1342                r.dMAX = r.dMIN;
1343                r.dRES = 0;
1344                r.wNumSubRanges = 1;
1345
1346                value = min_t(unsigned, w_length, sizeof r);
1347                memcpy(req->buf, &r, value);
1348        } else {
1349                dev_err(&uac2->pdev.dev,
1350                        "%s:%d control_selector=%d TODO!\n",
1351                        __func__, __LINE__, control_selector);
1352        }
1353
1354        return value;
1355}
1356
1357static int
1358ac_rq_in(struct usb_function *fn, const struct usb_ctrlrequest *cr)
1359{
1360        if (cr->bRequest == UAC2_CS_CUR)
1361                return in_rq_cur(fn, cr);
1362        else if (cr->bRequest == UAC2_CS_RANGE)
1363                return in_rq_range(fn, cr);
1364        else
1365                return -EOPNOTSUPP;
1366}
1367
1368static int
1369out_rq_cur(struct usb_function *fn, const struct usb_ctrlrequest *cr)
1370{
1371        u16 w_length = le16_to_cpu(cr->wLength);
1372        u16 w_value = le16_to_cpu(cr->wValue);
1373        u8 control_selector = w_value >> 8;
1374
1375        if (control_selector == UAC2_CS_CONTROL_SAM_FREQ)
1376                return w_length;
1377
1378        return -EOPNOTSUPP;
1379}
1380
1381static int
1382setup_rq_inf(struct usb_function *fn, const struct usb_ctrlrequest *cr)
1383{
1384        struct audio_dev *agdev = func_to_agdev(fn);
1385        struct snd_uac2_chip *uac2 = &agdev->uac2;
1386        u16 w_index = le16_to_cpu(cr->wIndex);
1387        u8 intf = w_index & 0xff;
1388
1389        if (intf != agdev->ac_intf) {
1390                dev_err(&uac2->pdev.dev,
1391                        "%s:%d Error!\n", __func__, __LINE__);
1392                return -EOPNOTSUPP;
1393        }
1394
1395        if (cr->bRequestType & USB_DIR_IN)
1396                return ac_rq_in(fn, cr);
1397        else if (cr->bRequest == UAC2_CS_CUR)
1398                return out_rq_cur(fn, cr);
1399
1400        return -EOPNOTSUPP;
1401}
1402
1403static int
1404afunc_setup(struct usb_function *fn, const struct usb_ctrlrequest *cr)
1405{
1406        struct usb_composite_dev *cdev = fn->config->cdev;
1407        struct audio_dev *agdev = func_to_agdev(fn);
1408        struct snd_uac2_chip *uac2 = &agdev->uac2;
1409        struct usb_request *req = cdev->req;
1410        u16 w_length = le16_to_cpu(cr->wLength);
1411        int value = -EOPNOTSUPP;
1412
1413        /* Only Class specific requests are supposed to reach here */
1414        if ((cr->bRequestType & USB_TYPE_MASK) != USB_TYPE_CLASS)
1415                return -EOPNOTSUPP;
1416
1417        if ((cr->bRequestType & USB_RECIP_MASK) == USB_RECIP_INTERFACE)
1418                value = setup_rq_inf(fn, cr);
1419        else
1420                dev_err(&uac2->pdev.dev, "%s:%d Error!\n", __func__, __LINE__);
1421
1422        if (value >= 0) {
1423                req->length = value;
1424                req->zero = value < w_length;
1425                value = usb_ep_queue(cdev->gadget->ep0, req, GFP_ATOMIC);
1426                if (value < 0) {
1427                        dev_err(&uac2->pdev.dev,
1428                                "%s:%d Error!\n", __func__, __LINE__);
1429                        req->status = 0;
1430                }
1431        }
1432
1433        return value;
1434}
1435
1436static inline struct f_uac2_opts *to_f_uac2_opts(struct config_item *item)
1437{
1438        return container_of(to_config_group(item), struct f_uac2_opts,
1439                            func_inst.group);
1440}
1441
1442static void f_uac2_attr_release(struct config_item *item)
1443{
1444        struct f_uac2_opts *opts = to_f_uac2_opts(item);
1445
1446        usb_put_function_instance(&opts->func_inst);
1447}
1448
1449static struct configfs_item_operations f_uac2_item_ops = {
1450        .release        = f_uac2_attr_release,
1451};
1452
1453#define UAC2_ATTRIBUTE(name)                                            \
1454static ssize_t f_uac2_opts_##name##_show(struct config_item *item,      \
1455                                         char *page)                    \
1456{                                                                       \
1457        struct f_uac2_opts *opts = to_f_uac2_opts(item);                \
1458        int result;                                                     \
1459                                                                        \
1460        mutex_lock(&opts->lock);                                        \
1461        result = sprintf(page, "%u\n", opts->name);                     \
1462        mutex_unlock(&opts->lock);                                      \
1463                                                                        \
1464        return result;                                                  \
1465}                                                                       \
1466                                                                        \
1467static ssize_t f_uac2_opts_##name##_store(struct config_item *item,     \
1468                                          const char *page, size_t len) \
1469{                                                                       \
1470        struct f_uac2_opts *opts = to_f_uac2_opts(item);                \
1471        int ret;                                                        \
1472        u32 num;                                                        \
1473                                                                        \
1474        mutex_lock(&opts->lock);                                        \
1475        if (opts->refcnt) {                                             \
1476                ret = -EBUSY;                                           \
1477                goto end;                                               \
1478        }                                                               \
1479                                                                        \
1480        ret = kstrtou32(page, 0, &num);                                 \
1481        if (ret)                                                        \
1482                goto end;                                               \
1483                                                                        \
1484        opts->name = num;                                               \
1485        ret = len;                                                      \
1486                                                                        \
1487end:                                                                    \
1488        mutex_unlock(&opts->lock);                                      \
1489        return ret;                                                     \
1490}                                                                       \
1491                                                                        \
1492CONFIGFS_ATTR(f_uac2_opts_, name)
1493
1494UAC2_ATTRIBUTE(p_chmask);
1495UAC2_ATTRIBUTE(p_srate);
1496UAC2_ATTRIBUTE(p_ssize);
1497UAC2_ATTRIBUTE(c_chmask);
1498UAC2_ATTRIBUTE(c_srate);
1499UAC2_ATTRIBUTE(c_ssize);
1500
1501static struct configfs_attribute *f_uac2_attrs[] = {
1502        &f_uac2_opts_attr_p_chmask,
1503        &f_uac2_opts_attr_p_srate,
1504        &f_uac2_opts_attr_p_ssize,
1505        &f_uac2_opts_attr_c_chmask,
1506        &f_uac2_opts_attr_c_srate,
1507        &f_uac2_opts_attr_c_ssize,
1508        NULL,
1509};
1510
1511static struct config_item_type f_uac2_func_type = {
1512        .ct_item_ops    = &f_uac2_item_ops,
1513        .ct_attrs       = f_uac2_attrs,
1514        .ct_owner       = THIS_MODULE,
1515};
1516
1517static void afunc_free_inst(struct usb_function_instance *f)
1518{
1519        struct f_uac2_opts *opts;
1520
1521        opts = container_of(f, struct f_uac2_opts, func_inst);
1522        kfree(opts);
1523}
1524
1525static struct usb_function_instance *afunc_alloc_inst(void)
1526{
1527        struct f_uac2_opts *opts;
1528
1529        opts = kzalloc(sizeof(*opts), GFP_KERNEL);
1530        if (!opts)
1531                return ERR_PTR(-ENOMEM);
1532
1533        mutex_init(&opts->lock);
1534        opts->func_inst.free_func_inst = afunc_free_inst;
1535
1536        config_group_init_type_name(&opts->func_inst.group, "",
1537                                    &f_uac2_func_type);
1538
1539        opts->p_chmask = UAC2_DEF_PCHMASK;
1540        opts->p_srate = UAC2_DEF_PSRATE;
1541        opts->p_ssize = UAC2_DEF_PSSIZE;
1542        opts->c_chmask = UAC2_DEF_CCHMASK;
1543        opts->c_srate = UAC2_DEF_CSRATE;
1544        opts->c_ssize = UAC2_DEF_CSSIZE;
1545        return &opts->func_inst;
1546}
1547
1548static void afunc_free(struct usb_function *f)
1549{
1550        struct audio_dev *agdev;
1551        struct f_uac2_opts *opts;
1552
1553        agdev = func_to_agdev(f);
1554        opts = container_of(f->fi, struct f_uac2_opts, func_inst);
1555        kfree(agdev);
1556        mutex_lock(&opts->lock);
1557        --opts->refcnt;
1558        mutex_unlock(&opts->lock);
1559}
1560
1561static void afunc_unbind(struct usb_configuration *c, struct usb_function *f)
1562{
1563        struct audio_dev *agdev = func_to_agdev(f);
1564        struct uac2_rtd_params *prm;
1565
1566        alsa_uac2_exit(agdev);
1567
1568        prm = &agdev->uac2.p_prm;
1569        kfree(prm->rbuf);
1570
1571        prm = &agdev->uac2.c_prm;
1572        kfree(prm->rbuf);
1573        usb_free_all_descriptors(f);
1574}
1575
1576static struct usb_function *afunc_alloc(struct usb_function_instance *fi)
1577{
1578        struct audio_dev *agdev;
1579        struct f_uac2_opts *opts;
1580
1581        agdev = kzalloc(sizeof(*agdev), GFP_KERNEL);
1582        if (agdev == NULL)
1583                return ERR_PTR(-ENOMEM);
1584
1585        opts = container_of(fi, struct f_uac2_opts, func_inst);
1586        mutex_lock(&opts->lock);
1587        ++opts->refcnt;
1588        mutex_unlock(&opts->lock);
1589
1590        agdev->func.name = "uac2_func";
1591        agdev->func.bind = afunc_bind;
1592        agdev->func.unbind = afunc_unbind;
1593        agdev->func.set_alt = afunc_set_alt;
1594        agdev->func.get_alt = afunc_get_alt;
1595        agdev->func.disable = afunc_disable;
1596        agdev->func.setup = afunc_setup;
1597        agdev->func.free_func = afunc_free;
1598
1599        return &agdev->func;
1600}
1601
1602DECLARE_USB_FUNCTION_INIT(uac2, afunc_alloc_inst, afunc_alloc);
1603MODULE_LICENSE("GPL");
1604MODULE_AUTHOR("Yadwinder Singh");
1605MODULE_AUTHOR("Jaswinder Singh");
1606