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