linux/sound/usb/mixer_quirks.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-or-later
   2/*
   3 *   USB Audio Driver for ALSA
   4 *
   5 *   Quirks and vendor-specific extensions for mixer interfaces
   6 *
   7 *   Copyright (c) 2002 by Takashi Iwai <tiwai@suse.de>
   8 *
   9 *   Many codes borrowed from audio.c by
  10 *          Alan Cox (alan@lxorguk.ukuu.org.uk)
  11 *          Thomas Sailer (sailer@ife.ee.ethz.ch)
  12 *
  13 *   Audio Advantage Micro II support added by:
  14 *          Przemek Rudy (prudy1@o2.pl)
  15 */
  16
  17#include <linux/hid.h>
  18#include <linux/init.h>
  19#include <linux/math64.h>
  20#include <linux/slab.h>
  21#include <linux/usb.h>
  22#include <linux/usb/audio.h>
  23
  24#include <sound/asoundef.h>
  25#include <sound/core.h>
  26#include <sound/control.h>
  27#include <sound/hwdep.h>
  28#include <sound/info.h>
  29#include <sound/tlv.h>
  30
  31#include "usbaudio.h"
  32#include "mixer.h"
  33#include "mixer_quirks.h"
  34#include "mixer_scarlett.h"
  35#include "mixer_scarlett_gen2.h"
  36#include "mixer_us16x08.h"
  37#include "mixer_s1810c.h"
  38#include "helper.h"
  39
  40struct std_mono_table {
  41        unsigned int unitid, control, cmask;
  42        int val_type;
  43        const char *name;
  44        snd_kcontrol_tlv_rw_t *tlv_callback;
  45};
  46
  47/* This function allows for the creation of standard UAC controls.
  48 * See the quirks for M-Audio FTUs or Ebox-44.
  49 * If you don't want to set a TLV callback pass NULL.
  50 *
  51 * Since there doesn't seem to be a devices that needs a multichannel
  52 * version, we keep it mono for simplicity.
  53 */
  54static int snd_create_std_mono_ctl_offset(struct usb_mixer_interface *mixer,
  55                                unsigned int unitid,
  56                                unsigned int control,
  57                                unsigned int cmask,
  58                                int val_type,
  59                                unsigned int idx_off,
  60                                const char *name,
  61                                snd_kcontrol_tlv_rw_t *tlv_callback)
  62{
  63        struct usb_mixer_elem_info *cval;
  64        struct snd_kcontrol *kctl;
  65
  66        cval = kzalloc(sizeof(*cval), GFP_KERNEL);
  67        if (!cval)
  68                return -ENOMEM;
  69
  70        snd_usb_mixer_elem_init_std(&cval->head, mixer, unitid);
  71        cval->val_type = val_type;
  72        cval->channels = 1;
  73        cval->control = control;
  74        cval->cmask = cmask;
  75        cval->idx_off = idx_off;
  76
  77        /* get_min_max() is called only for integer volumes later,
  78         * so provide a short-cut for booleans */
  79        cval->min = 0;
  80        cval->max = 1;
  81        cval->res = 0;
  82        cval->dBmin = 0;
  83        cval->dBmax = 0;
  84
  85        /* Create control */
  86        kctl = snd_ctl_new1(snd_usb_feature_unit_ctl, cval);
  87        if (!kctl) {
  88                kfree(cval);
  89                return -ENOMEM;
  90        }
  91
  92        /* Set name */
  93        snprintf(kctl->id.name, sizeof(kctl->id.name), name);
  94        kctl->private_free = snd_usb_mixer_elem_free;
  95
  96        /* set TLV */
  97        if (tlv_callback) {
  98                kctl->tlv.c = tlv_callback;
  99                kctl->vd[0].access |=
 100                        SNDRV_CTL_ELEM_ACCESS_TLV_READ |
 101                        SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK;
 102        }
 103        /* Add control to mixer */
 104        return snd_usb_mixer_add_control(&cval->head, kctl);
 105}
 106
 107static int snd_create_std_mono_ctl(struct usb_mixer_interface *mixer,
 108                                unsigned int unitid,
 109                                unsigned int control,
 110                                unsigned int cmask,
 111                                int val_type,
 112                                const char *name,
 113                                snd_kcontrol_tlv_rw_t *tlv_callback)
 114{
 115        return snd_create_std_mono_ctl_offset(mixer, unitid, control, cmask,
 116                val_type, 0 /* Offset */, name, tlv_callback);
 117}
 118
 119/*
 120 * Create a set of standard UAC controls from a table
 121 */
 122static int snd_create_std_mono_table(struct usb_mixer_interface *mixer,
 123                                     const struct std_mono_table *t)
 124{
 125        int err;
 126
 127        while (t->name != NULL) {
 128                err = snd_create_std_mono_ctl(mixer, t->unitid, t->control,
 129                                t->cmask, t->val_type, t->name, t->tlv_callback);
 130                if (err < 0)
 131                        return err;
 132                t++;
 133        }
 134
 135        return 0;
 136}
 137
 138static int add_single_ctl_with_resume(struct usb_mixer_interface *mixer,
 139                                      int id,
 140                                      usb_mixer_elem_resume_func_t resume,
 141                                      const struct snd_kcontrol_new *knew,
 142                                      struct usb_mixer_elem_list **listp)
 143{
 144        struct usb_mixer_elem_list *list;
 145        struct snd_kcontrol *kctl;
 146
 147        list = kzalloc(sizeof(*list), GFP_KERNEL);
 148        if (!list)
 149                return -ENOMEM;
 150        if (listp)
 151                *listp = list;
 152        list->mixer = mixer;
 153        list->id = id;
 154        list->resume = resume;
 155        kctl = snd_ctl_new1(knew, list);
 156        if (!kctl) {
 157                kfree(list);
 158                return -ENOMEM;
 159        }
 160        kctl->private_free = snd_usb_mixer_elem_free;
 161        /* don't use snd_usb_mixer_add_control() here, this is a special list element */
 162        return snd_usb_mixer_add_list(list, kctl, false);
 163}
 164
 165/*
 166 * Sound Blaster remote control configuration
 167 *
 168 * format of remote control data:
 169 * Extigy:       xx 00
 170 * Audigy 2 NX:  06 80 xx 00 00 00
 171 * Live! 24-bit: 06 80 xx yy 22 83
 172 */
 173static const struct rc_config {
 174        u32 usb_id;
 175        u8  offset;
 176        u8  length;
 177        u8  packet_length;
 178        u8  min_packet_length; /* minimum accepted length of the URB result */
 179        u8  mute_mixer_id;
 180        u32 mute_code;
 181} rc_configs[] = {
 182        { USB_ID(0x041e, 0x3000), 0, 1, 2, 1,  18, 0x0013 }, /* Extigy       */
 183        { USB_ID(0x041e, 0x3020), 2, 1, 6, 6,  18, 0x0013 }, /* Audigy 2 NX  */
 184        { USB_ID(0x041e, 0x3040), 2, 2, 6, 6,  2,  0x6e91 }, /* Live! 24-bit */
 185        { USB_ID(0x041e, 0x3042), 0, 1, 1, 1,  1,  0x000d }, /* Usb X-Fi S51 */
 186        { USB_ID(0x041e, 0x30df), 0, 1, 1, 1,  1,  0x000d }, /* Usb X-Fi S51 Pro */
 187        { USB_ID(0x041e, 0x3237), 0, 1, 1, 1,  1,  0x000d }, /* Usb X-Fi S51 Pro */
 188        { USB_ID(0x041e, 0x3263), 0, 1, 1, 1,  1,  0x000d }, /* Usb X-Fi S51 Pro */
 189        { USB_ID(0x041e, 0x3048), 2, 2, 6, 6,  2,  0x6e91 }, /* Toshiba SB0500 */
 190};
 191
 192static void snd_usb_soundblaster_remote_complete(struct urb *urb)
 193{
 194        struct usb_mixer_interface *mixer = urb->context;
 195        const struct rc_config *rc = mixer->rc_cfg;
 196        u32 code;
 197
 198        if (urb->status < 0 || urb->actual_length < rc->min_packet_length)
 199                return;
 200
 201        code = mixer->rc_buffer[rc->offset];
 202        if (rc->length == 2)
 203                code |= mixer->rc_buffer[rc->offset + 1] << 8;
 204
 205        /* the Mute button actually changes the mixer control */
 206        if (code == rc->mute_code)
 207                snd_usb_mixer_notify_id(mixer, rc->mute_mixer_id);
 208        mixer->rc_code = code;
 209        wmb();
 210        wake_up(&mixer->rc_waitq);
 211}
 212
 213static long snd_usb_sbrc_hwdep_read(struct snd_hwdep *hw, char __user *buf,
 214                                     long count, loff_t *offset)
 215{
 216        struct usb_mixer_interface *mixer = hw->private_data;
 217        int err;
 218        u32 rc_code;
 219
 220        if (count != 1 && count != 4)
 221                return -EINVAL;
 222        err = wait_event_interruptible(mixer->rc_waitq,
 223                                       (rc_code = xchg(&mixer->rc_code, 0)) != 0);
 224        if (err == 0) {
 225                if (count == 1)
 226                        err = put_user(rc_code, buf);
 227                else
 228                        err = put_user(rc_code, (u32 __user *)buf);
 229        }
 230        return err < 0 ? err : count;
 231}
 232
 233static __poll_t snd_usb_sbrc_hwdep_poll(struct snd_hwdep *hw, struct file *file,
 234                                            poll_table *wait)
 235{
 236        struct usb_mixer_interface *mixer = hw->private_data;
 237
 238        poll_wait(file, &mixer->rc_waitq, wait);
 239        return mixer->rc_code ? EPOLLIN | EPOLLRDNORM : 0;
 240}
 241
 242static int snd_usb_soundblaster_remote_init(struct usb_mixer_interface *mixer)
 243{
 244        struct snd_hwdep *hwdep;
 245        int err, len, i;
 246
 247        for (i = 0; i < ARRAY_SIZE(rc_configs); ++i)
 248                if (rc_configs[i].usb_id == mixer->chip->usb_id)
 249                        break;
 250        if (i >= ARRAY_SIZE(rc_configs))
 251                return 0;
 252        mixer->rc_cfg = &rc_configs[i];
 253
 254        len = mixer->rc_cfg->packet_length;
 255
 256        init_waitqueue_head(&mixer->rc_waitq);
 257        err = snd_hwdep_new(mixer->chip->card, "SB remote control", 0, &hwdep);
 258        if (err < 0)
 259                return err;
 260        snprintf(hwdep->name, sizeof(hwdep->name),
 261                 "%s remote control", mixer->chip->card->shortname);
 262        hwdep->iface = SNDRV_HWDEP_IFACE_SB_RC;
 263        hwdep->private_data = mixer;
 264        hwdep->ops.read = snd_usb_sbrc_hwdep_read;
 265        hwdep->ops.poll = snd_usb_sbrc_hwdep_poll;
 266        hwdep->exclusive = 1;
 267
 268        mixer->rc_urb = usb_alloc_urb(0, GFP_KERNEL);
 269        if (!mixer->rc_urb)
 270                return -ENOMEM;
 271        mixer->rc_setup_packet = kmalloc(sizeof(*mixer->rc_setup_packet), GFP_KERNEL);
 272        if (!mixer->rc_setup_packet) {
 273                usb_free_urb(mixer->rc_urb);
 274                mixer->rc_urb = NULL;
 275                return -ENOMEM;
 276        }
 277        mixer->rc_setup_packet->bRequestType =
 278                USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_INTERFACE;
 279        mixer->rc_setup_packet->bRequest = UAC_GET_MEM;
 280        mixer->rc_setup_packet->wValue = cpu_to_le16(0);
 281        mixer->rc_setup_packet->wIndex = cpu_to_le16(0);
 282        mixer->rc_setup_packet->wLength = cpu_to_le16(len);
 283        usb_fill_control_urb(mixer->rc_urb, mixer->chip->dev,
 284                             usb_rcvctrlpipe(mixer->chip->dev, 0),
 285                             (u8*)mixer->rc_setup_packet, mixer->rc_buffer, len,
 286                             snd_usb_soundblaster_remote_complete, mixer);
 287        return 0;
 288}
 289
 290#define snd_audigy2nx_led_info          snd_ctl_boolean_mono_info
 291
 292static int snd_audigy2nx_led_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
 293{
 294        ucontrol->value.integer.value[0] = kcontrol->private_value >> 8;
 295        return 0;
 296}
 297
 298static int snd_audigy2nx_led_update(struct usb_mixer_interface *mixer,
 299                                    int value, int index)
 300{
 301        struct snd_usb_audio *chip = mixer->chip;
 302        int err;
 303
 304        err = snd_usb_lock_shutdown(chip);
 305        if (err < 0)
 306                return err;
 307
 308        if (chip->usb_id == USB_ID(0x041e, 0x3042))
 309                err = snd_usb_ctl_msg(chip->dev,
 310                              usb_sndctrlpipe(chip->dev, 0), 0x24,
 311                              USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_OTHER,
 312                              !value, 0, NULL, 0);
 313        /* USB X-Fi S51 Pro */
 314        if (chip->usb_id == USB_ID(0x041e, 0x30df))
 315                err = snd_usb_ctl_msg(chip->dev,
 316                              usb_sndctrlpipe(chip->dev, 0), 0x24,
 317                              USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_OTHER,
 318                              !value, 0, NULL, 0);
 319        else
 320                err = snd_usb_ctl_msg(chip->dev,
 321                              usb_sndctrlpipe(chip->dev, 0), 0x24,
 322                              USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_OTHER,
 323                              value, index + 2, NULL, 0);
 324        snd_usb_unlock_shutdown(chip);
 325        return err;
 326}
 327
 328static int snd_audigy2nx_led_put(struct snd_kcontrol *kcontrol,
 329                                 struct snd_ctl_elem_value *ucontrol)
 330{
 331        struct usb_mixer_elem_list *list = snd_kcontrol_chip(kcontrol);
 332        struct usb_mixer_interface *mixer = list->mixer;
 333        int index = kcontrol->private_value & 0xff;
 334        unsigned int value = ucontrol->value.integer.value[0];
 335        int old_value = kcontrol->private_value >> 8;
 336        int err;
 337
 338        if (value > 1)
 339                return -EINVAL;
 340        if (value == old_value)
 341                return 0;
 342        kcontrol->private_value = (value << 8) | index;
 343        err = snd_audigy2nx_led_update(mixer, value, index);
 344        return err < 0 ? err : 1;
 345}
 346
 347static int snd_audigy2nx_led_resume(struct usb_mixer_elem_list *list)
 348{
 349        int priv_value = list->kctl->private_value;
 350
 351        return snd_audigy2nx_led_update(list->mixer, priv_value >> 8,
 352                                        priv_value & 0xff);
 353}
 354
 355/* name and private_value are set dynamically */
 356static const struct snd_kcontrol_new snd_audigy2nx_control = {
 357        .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
 358        .info = snd_audigy2nx_led_info,
 359        .get = snd_audigy2nx_led_get,
 360        .put = snd_audigy2nx_led_put,
 361};
 362
 363static const char * const snd_audigy2nx_led_names[] = {
 364        "CMSS LED Switch",
 365        "Power LED Switch",
 366        "Dolby Digital LED Switch",
 367};
 368
 369static int snd_audigy2nx_controls_create(struct usb_mixer_interface *mixer)
 370{
 371        int i, err;
 372
 373        for (i = 0; i < ARRAY_SIZE(snd_audigy2nx_led_names); ++i) {
 374                struct snd_kcontrol_new knew;
 375
 376                /* USB X-Fi S51 doesn't have a CMSS LED */
 377                if ((mixer->chip->usb_id == USB_ID(0x041e, 0x3042)) && i == 0)
 378                        continue;
 379                /* USB X-Fi S51 Pro doesn't have one either */
 380                if ((mixer->chip->usb_id == USB_ID(0x041e, 0x30df)) && i == 0)
 381                        continue;
 382                if (i > 1 && /* Live24ext has 2 LEDs only */
 383                        (mixer->chip->usb_id == USB_ID(0x041e, 0x3040) ||
 384                         mixer->chip->usb_id == USB_ID(0x041e, 0x3042) ||
 385                         mixer->chip->usb_id == USB_ID(0x041e, 0x30df) ||
 386                         mixer->chip->usb_id == USB_ID(0x041e, 0x3048)))
 387                        break; 
 388
 389                knew = snd_audigy2nx_control;
 390                knew.name = snd_audigy2nx_led_names[i];
 391                knew.private_value = (1 << 8) | i; /* LED on as default */
 392                err = add_single_ctl_with_resume(mixer, 0,
 393                                                 snd_audigy2nx_led_resume,
 394                                                 &knew, NULL);
 395                if (err < 0)
 396                        return err;
 397        }
 398        return 0;
 399}
 400
 401static void snd_audigy2nx_proc_read(struct snd_info_entry *entry,
 402                                    struct snd_info_buffer *buffer)
 403{
 404        static const struct sb_jack {
 405                int unitid;
 406                const char *name;
 407        }  jacks_audigy2nx[] = {
 408                {4,  "dig in "},
 409                {7,  "line in"},
 410                {19, "spk out"},
 411                {20, "hph out"},
 412                {-1, NULL}
 413        }, jacks_live24ext[] = {
 414                {4,  "line in"}, /* &1=Line, &2=Mic*/
 415                {3,  "hph out"}, /* headphones */
 416                {0,  "RC     "}, /* last command, 6 bytes see rc_config above */
 417                {-1, NULL}
 418        };
 419        const struct sb_jack *jacks;
 420        struct usb_mixer_interface *mixer = entry->private_data;
 421        int i, err;
 422        u8 buf[3];
 423
 424        snd_iprintf(buffer, "%s jacks\n\n", mixer->chip->card->shortname);
 425        if (mixer->chip->usb_id == USB_ID(0x041e, 0x3020))
 426                jacks = jacks_audigy2nx;
 427        else if (mixer->chip->usb_id == USB_ID(0x041e, 0x3040) ||
 428                 mixer->chip->usb_id == USB_ID(0x041e, 0x3048))
 429                jacks = jacks_live24ext;
 430        else
 431                return;
 432
 433        for (i = 0; jacks[i].name; ++i) {
 434                snd_iprintf(buffer, "%s: ", jacks[i].name);
 435                err = snd_usb_lock_shutdown(mixer->chip);
 436                if (err < 0)
 437                        return;
 438                err = snd_usb_ctl_msg(mixer->chip->dev,
 439                                      usb_rcvctrlpipe(mixer->chip->dev, 0),
 440                                      UAC_GET_MEM, USB_DIR_IN | USB_TYPE_CLASS |
 441                                      USB_RECIP_INTERFACE, 0,
 442                                      jacks[i].unitid << 8, buf, 3);
 443                snd_usb_unlock_shutdown(mixer->chip);
 444                if (err == 3 && (buf[0] == 3 || buf[0] == 6))
 445                        snd_iprintf(buffer, "%02x %02x\n", buf[1], buf[2]);
 446                else
 447                        snd_iprintf(buffer, "?\n");
 448        }
 449}
 450
 451/* EMU0204 */
 452static int snd_emu0204_ch_switch_info(struct snd_kcontrol *kcontrol,
 453                                      struct snd_ctl_elem_info *uinfo)
 454{
 455        static const char * const texts[2] = {"1/2", "3/4"};
 456
 457        return snd_ctl_enum_info(uinfo, 1, ARRAY_SIZE(texts), texts);
 458}
 459
 460static int snd_emu0204_ch_switch_get(struct snd_kcontrol *kcontrol,
 461                                     struct snd_ctl_elem_value *ucontrol)
 462{
 463        ucontrol->value.enumerated.item[0] = kcontrol->private_value;
 464        return 0;
 465}
 466
 467static int snd_emu0204_ch_switch_update(struct usb_mixer_interface *mixer,
 468                                        int value)
 469{
 470        struct snd_usb_audio *chip = mixer->chip;
 471        int err;
 472        unsigned char buf[2];
 473
 474        err = snd_usb_lock_shutdown(chip);
 475        if (err < 0)
 476                return err;
 477
 478        buf[0] = 0x01;
 479        buf[1] = value ? 0x02 : 0x01;
 480        err = snd_usb_ctl_msg(chip->dev,
 481                      usb_sndctrlpipe(chip->dev, 0), UAC_SET_CUR,
 482                      USB_RECIP_INTERFACE | USB_TYPE_CLASS | USB_DIR_OUT,
 483                      0x0400, 0x0e00, buf, 2);
 484        snd_usb_unlock_shutdown(chip);
 485        return err;
 486}
 487
 488static int snd_emu0204_ch_switch_put(struct snd_kcontrol *kcontrol,
 489                                     struct snd_ctl_elem_value *ucontrol)
 490{
 491        struct usb_mixer_elem_list *list = snd_kcontrol_chip(kcontrol);
 492        struct usb_mixer_interface *mixer = list->mixer;
 493        unsigned int value = ucontrol->value.enumerated.item[0];
 494        int err;
 495
 496        if (value > 1)
 497                return -EINVAL;
 498
 499        if (value == kcontrol->private_value)
 500                return 0;
 501
 502        kcontrol->private_value = value;
 503        err = snd_emu0204_ch_switch_update(mixer, value);
 504        return err < 0 ? err : 1;
 505}
 506
 507static int snd_emu0204_ch_switch_resume(struct usb_mixer_elem_list *list)
 508{
 509        return snd_emu0204_ch_switch_update(list->mixer,
 510                                            list->kctl->private_value);
 511}
 512
 513static const struct snd_kcontrol_new snd_emu0204_control = {
 514        .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
 515        .name = "Front Jack Channels",
 516        .info = snd_emu0204_ch_switch_info,
 517        .get = snd_emu0204_ch_switch_get,
 518        .put = snd_emu0204_ch_switch_put,
 519        .private_value = 0,
 520};
 521
 522static int snd_emu0204_controls_create(struct usb_mixer_interface *mixer)
 523{
 524        return add_single_ctl_with_resume(mixer, 0,
 525                                          snd_emu0204_ch_switch_resume,
 526                                          &snd_emu0204_control, NULL);
 527}
 528
 529/* ASUS Xonar U1 / U3 controls */
 530
 531static int snd_xonar_u1_switch_get(struct snd_kcontrol *kcontrol,
 532                                   struct snd_ctl_elem_value *ucontrol)
 533{
 534        ucontrol->value.integer.value[0] = !!(kcontrol->private_value & 0x02);
 535        return 0;
 536}
 537
 538static int snd_xonar_u1_switch_update(struct usb_mixer_interface *mixer,
 539                                      unsigned char status)
 540{
 541        struct snd_usb_audio *chip = mixer->chip;
 542        int err;
 543
 544        err = snd_usb_lock_shutdown(chip);
 545        if (err < 0)
 546                return err;
 547        err = snd_usb_ctl_msg(chip->dev,
 548                              usb_sndctrlpipe(chip->dev, 0), 0x08,
 549                              USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_OTHER,
 550                              50, 0, &status, 1);
 551        snd_usb_unlock_shutdown(chip);
 552        return err;
 553}
 554
 555static int snd_xonar_u1_switch_put(struct snd_kcontrol *kcontrol,
 556                                   struct snd_ctl_elem_value *ucontrol)
 557{
 558        struct usb_mixer_elem_list *list = snd_kcontrol_chip(kcontrol);
 559        u8 old_status, new_status;
 560        int err;
 561
 562        old_status = kcontrol->private_value;
 563        if (ucontrol->value.integer.value[0])
 564                new_status = old_status | 0x02;
 565        else
 566                new_status = old_status & ~0x02;
 567        if (new_status == old_status)
 568                return 0;
 569
 570        kcontrol->private_value = new_status;
 571        err = snd_xonar_u1_switch_update(list->mixer, new_status);
 572        return err < 0 ? err : 1;
 573}
 574
 575static int snd_xonar_u1_switch_resume(struct usb_mixer_elem_list *list)
 576{
 577        return snd_xonar_u1_switch_update(list->mixer,
 578                                          list->kctl->private_value);
 579}
 580
 581static const struct snd_kcontrol_new snd_xonar_u1_output_switch = {
 582        .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
 583        .name = "Digital Playback Switch",
 584        .info = snd_ctl_boolean_mono_info,
 585        .get = snd_xonar_u1_switch_get,
 586        .put = snd_xonar_u1_switch_put,
 587        .private_value = 0x05,
 588};
 589
 590static int snd_xonar_u1_controls_create(struct usb_mixer_interface *mixer)
 591{
 592        return add_single_ctl_with_resume(mixer, 0,
 593                                          snd_xonar_u1_switch_resume,
 594                                          &snd_xonar_u1_output_switch, NULL);
 595}
 596
 597/* Digidesign Mbox 1 helper functions */
 598
 599static int snd_mbox1_is_spdif_synced(struct snd_usb_audio *chip)
 600{
 601        unsigned char buff[3];
 602        int err;
 603        int is_spdif_synced;
 604
 605        /* Read clock source */
 606        err = snd_usb_ctl_msg(chip->dev,
 607                              usb_rcvctrlpipe(chip->dev, 0), 0x81,
 608                              USB_DIR_IN |
 609                              USB_TYPE_CLASS |
 610                              USB_RECIP_ENDPOINT, 0x100, 0x81, buff, 3);
 611        if (err < 0)
 612                return err;
 613
 614        /* spdif sync: buff is all zeroes */
 615        is_spdif_synced = !(buff[0] | buff[1] | buff[2]);
 616        return is_spdif_synced;
 617}
 618
 619static int snd_mbox1_set_clk_source(struct snd_usb_audio *chip, int rate_or_zero)
 620{
 621        /* 2 possibilities:     Internal    -> expects sample rate
 622         *                      S/PDIF sync -> expects rate = 0
 623         */
 624        unsigned char buff[3];
 625
 626        buff[0] = (rate_or_zero >>  0) & 0xff;
 627        buff[1] = (rate_or_zero >>  8) & 0xff;
 628        buff[2] = (rate_or_zero >> 16) & 0xff;
 629
 630        /* Set clock source */
 631        return snd_usb_ctl_msg(chip->dev,
 632                               usb_sndctrlpipe(chip->dev, 0), 0x1,
 633                               USB_TYPE_CLASS |
 634                               USB_RECIP_ENDPOINT, 0x100, 0x81, buff, 3);
 635}
 636
 637static int snd_mbox1_is_spdif_input(struct snd_usb_audio *chip)
 638{
 639        /* Hardware gives 2 possibilities:      ANALOG Source  -> 0x01
 640         *                                      S/PDIF Source  -> 0x02
 641         */
 642        int err;
 643        unsigned char source[1];
 644
 645        /* Read input source */
 646        err = snd_usb_ctl_msg(chip->dev,
 647                              usb_rcvctrlpipe(chip->dev, 0), 0x81,
 648                              USB_DIR_IN |
 649                              USB_TYPE_CLASS |
 650                              USB_RECIP_INTERFACE, 0x00, 0x500, source, 1);
 651        if (err < 0)
 652                return err;
 653
 654        return (source[0] == 2);
 655}
 656
 657static int snd_mbox1_set_input_source(struct snd_usb_audio *chip, int is_spdif)
 658{
 659        /* NB: Setting the input source to S/PDIF resets the clock source to S/PDIF
 660         * Hardware expects 2 possibilities:    ANALOG Source  -> 0x01
 661         *                                      S/PDIF Source  -> 0x02
 662         */
 663        unsigned char buff[1];
 664
 665        buff[0] = (is_spdif & 1) + 1;
 666
 667        /* Set input source */
 668        return snd_usb_ctl_msg(chip->dev,
 669                               usb_sndctrlpipe(chip->dev, 0), 0x1,
 670                               USB_TYPE_CLASS |
 671                               USB_RECIP_INTERFACE, 0x00, 0x500, buff, 1);
 672}
 673
 674/* Digidesign Mbox 1 clock source switch (internal/spdif) */
 675
 676static int snd_mbox1_clk_switch_get(struct snd_kcontrol *kctl,
 677                                    struct snd_ctl_elem_value *ucontrol)
 678{
 679        struct usb_mixer_elem_list *list = snd_kcontrol_chip(kctl);
 680        struct snd_usb_audio *chip = list->mixer->chip;
 681        int err;
 682
 683        err = snd_usb_lock_shutdown(chip);
 684        if (err < 0)
 685                goto err;
 686
 687        err = snd_mbox1_is_spdif_synced(chip);
 688        if (err < 0)
 689                goto err;
 690
 691        kctl->private_value = err;
 692        err = 0;
 693        ucontrol->value.enumerated.item[0] = kctl->private_value;
 694err:
 695        snd_usb_unlock_shutdown(chip);
 696        return err;
 697}
 698
 699static int snd_mbox1_clk_switch_update(struct usb_mixer_interface *mixer, int is_spdif_sync)
 700{
 701        struct snd_usb_audio *chip = mixer->chip;
 702        int err;
 703
 704        err = snd_usb_lock_shutdown(chip);
 705        if (err < 0)
 706                return err;
 707
 708        err = snd_mbox1_is_spdif_input(chip);
 709        if (err < 0)
 710                goto err;
 711
 712        err = snd_mbox1_is_spdif_synced(chip);
 713        if (err < 0)
 714                goto err;
 715
 716        /* FIXME: hardcoded sample rate */
 717        err = snd_mbox1_set_clk_source(chip, is_spdif_sync ? 0 : 48000);
 718        if (err < 0)
 719                goto err;
 720
 721        err = snd_mbox1_is_spdif_synced(chip);
 722err:
 723        snd_usb_unlock_shutdown(chip);
 724        return err;
 725}
 726
 727static int snd_mbox1_clk_switch_put(struct snd_kcontrol *kctl,
 728                                    struct snd_ctl_elem_value *ucontrol)
 729{
 730        struct usb_mixer_elem_list *list = snd_kcontrol_chip(kctl);
 731        struct usb_mixer_interface *mixer = list->mixer;
 732        int err;
 733        bool cur_val, new_val;
 734
 735        cur_val = kctl->private_value;
 736        new_val = ucontrol->value.enumerated.item[0];
 737        if (cur_val == new_val)
 738                return 0;
 739
 740        kctl->private_value = new_val;
 741        err = snd_mbox1_clk_switch_update(mixer, new_val);
 742        return err < 0 ? err : 1;
 743}
 744
 745static int snd_mbox1_clk_switch_info(struct snd_kcontrol *kcontrol,
 746                                     struct snd_ctl_elem_info *uinfo)
 747{
 748        static const char *const texts[2] = {
 749                "Internal",
 750                "S/PDIF"
 751        };
 752
 753        return snd_ctl_enum_info(uinfo, 1, ARRAY_SIZE(texts), texts);
 754}
 755
 756static int snd_mbox1_clk_switch_resume(struct usb_mixer_elem_list *list)
 757{
 758        return snd_mbox1_clk_switch_update(list->mixer, list->kctl->private_value);
 759}
 760
 761/* Digidesign Mbox 1 input source switch (analog/spdif) */
 762
 763static int snd_mbox1_src_switch_get(struct snd_kcontrol *kctl,
 764                                    struct snd_ctl_elem_value *ucontrol)
 765{
 766        ucontrol->value.enumerated.item[0] = kctl->private_value;
 767        return 0;
 768}
 769
 770static int snd_mbox1_src_switch_update(struct usb_mixer_interface *mixer, int is_spdif_input)
 771{
 772        struct snd_usb_audio *chip = mixer->chip;
 773        int err;
 774
 775        err = snd_usb_lock_shutdown(chip);
 776        if (err < 0)
 777                return err;
 778
 779        err = snd_mbox1_is_spdif_input(chip);
 780        if (err < 0)
 781                goto err;
 782
 783        err = snd_mbox1_set_input_source(chip, is_spdif_input);
 784        if (err < 0)
 785                goto err;
 786
 787        err = snd_mbox1_is_spdif_input(chip);
 788        if (err < 0)
 789                goto err;
 790
 791        err = snd_mbox1_is_spdif_synced(chip);
 792err:
 793        snd_usb_unlock_shutdown(chip);
 794        return err;
 795}
 796
 797static int snd_mbox1_src_switch_put(struct snd_kcontrol *kctl,
 798                                    struct snd_ctl_elem_value *ucontrol)
 799{
 800        struct usb_mixer_elem_list *list = snd_kcontrol_chip(kctl);
 801        struct usb_mixer_interface *mixer = list->mixer;
 802        int err;
 803        bool cur_val, new_val;
 804
 805        cur_val = kctl->private_value;
 806        new_val = ucontrol->value.enumerated.item[0];
 807        if (cur_val == new_val)
 808                return 0;
 809
 810        kctl->private_value = new_val;
 811        err = snd_mbox1_src_switch_update(mixer, new_val);
 812        return err < 0 ? err : 1;
 813}
 814
 815static int snd_mbox1_src_switch_info(struct snd_kcontrol *kcontrol,
 816                                     struct snd_ctl_elem_info *uinfo)
 817{
 818        static const char *const texts[2] = {
 819                "Analog",
 820                "S/PDIF"
 821        };
 822
 823        return snd_ctl_enum_info(uinfo, 1, ARRAY_SIZE(texts), texts);
 824}
 825
 826static int snd_mbox1_src_switch_resume(struct usb_mixer_elem_list *list)
 827{
 828        return snd_mbox1_src_switch_update(list->mixer, list->kctl->private_value);
 829}
 830
 831static const struct snd_kcontrol_new snd_mbox1_clk_switch = {
 832        .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
 833        .name = "Clock Source",
 834        .index = 0,
 835        .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
 836        .info = snd_mbox1_clk_switch_info,
 837        .get = snd_mbox1_clk_switch_get,
 838        .put = snd_mbox1_clk_switch_put,
 839        .private_value = 0
 840};
 841
 842static const struct snd_kcontrol_new snd_mbox1_src_switch = {
 843        .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
 844        .name = "Input Source",
 845        .index = 1,
 846        .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
 847        .info = snd_mbox1_src_switch_info,
 848        .get = snd_mbox1_src_switch_get,
 849        .put = snd_mbox1_src_switch_put,
 850        .private_value = 0
 851};
 852
 853static int snd_mbox1_controls_create(struct usb_mixer_interface *mixer)
 854{
 855        int err;
 856        err = add_single_ctl_with_resume(mixer, 0,
 857                                         snd_mbox1_clk_switch_resume,
 858                                         &snd_mbox1_clk_switch, NULL);
 859        if (err < 0)
 860                return err;
 861
 862        return add_single_ctl_with_resume(mixer, 1,
 863                                          snd_mbox1_src_switch_resume,
 864                                          &snd_mbox1_src_switch, NULL);
 865}
 866
 867/* Native Instruments device quirks */
 868
 869#define _MAKE_NI_CONTROL(bRequest,wIndex) ((bRequest) << 16 | (wIndex))
 870
 871static int snd_ni_control_init_val(struct usb_mixer_interface *mixer,
 872                                   struct snd_kcontrol *kctl)
 873{
 874        struct usb_device *dev = mixer->chip->dev;
 875        unsigned int pval = kctl->private_value;
 876        u8 value;
 877        int err;
 878
 879        err = snd_usb_ctl_msg(dev, usb_rcvctrlpipe(dev, 0),
 880                              (pval >> 16) & 0xff,
 881                              USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_IN,
 882                              0, pval & 0xffff, &value, 1);
 883        if (err < 0) {
 884                dev_err(&dev->dev,
 885                        "unable to issue vendor read request (ret = %d)", err);
 886                return err;
 887        }
 888
 889        kctl->private_value |= ((unsigned int)value << 24);
 890        return 0;
 891}
 892
 893static int snd_nativeinstruments_control_get(struct snd_kcontrol *kcontrol,
 894                                             struct snd_ctl_elem_value *ucontrol)
 895{
 896        ucontrol->value.integer.value[0] = kcontrol->private_value >> 24;
 897        return 0;
 898}
 899
 900static int snd_ni_update_cur_val(struct usb_mixer_elem_list *list)
 901{
 902        struct snd_usb_audio *chip = list->mixer->chip;
 903        unsigned int pval = list->kctl->private_value;
 904        int err;
 905
 906        err = snd_usb_lock_shutdown(chip);
 907        if (err < 0)
 908                return err;
 909        err = usb_control_msg(chip->dev, usb_sndctrlpipe(chip->dev, 0),
 910                              (pval >> 16) & 0xff,
 911                              USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_OUT,
 912                              pval >> 24, pval & 0xffff, NULL, 0, 1000);
 913        snd_usb_unlock_shutdown(chip);
 914        return err;
 915}
 916
 917static int snd_nativeinstruments_control_put(struct snd_kcontrol *kcontrol,
 918                                             struct snd_ctl_elem_value *ucontrol)
 919{
 920        struct usb_mixer_elem_list *list = snd_kcontrol_chip(kcontrol);
 921        u8 oldval = (kcontrol->private_value >> 24) & 0xff;
 922        u8 newval = ucontrol->value.integer.value[0];
 923        int err;
 924
 925        if (oldval == newval)
 926                return 0;
 927
 928        kcontrol->private_value &= ~(0xff << 24);
 929        kcontrol->private_value |= (unsigned int)newval << 24;
 930        err = snd_ni_update_cur_val(list);
 931        return err < 0 ? err : 1;
 932}
 933
 934static const struct snd_kcontrol_new snd_nativeinstruments_ta6_mixers[] = {
 935        {
 936                .name = "Direct Thru Channel A",
 937                .private_value = _MAKE_NI_CONTROL(0x01, 0x03),
 938        },
 939        {
 940                .name = "Direct Thru Channel B",
 941                .private_value = _MAKE_NI_CONTROL(0x01, 0x05),
 942        },
 943        {
 944                .name = "Phono Input Channel A",
 945                .private_value = _MAKE_NI_CONTROL(0x02, 0x03),
 946        },
 947        {
 948                .name = "Phono Input Channel B",
 949                .private_value = _MAKE_NI_CONTROL(0x02, 0x05),
 950        },
 951};
 952
 953static const struct snd_kcontrol_new snd_nativeinstruments_ta10_mixers[] = {
 954        {
 955                .name = "Direct Thru Channel A",
 956                .private_value = _MAKE_NI_CONTROL(0x01, 0x03),
 957        },
 958        {
 959                .name = "Direct Thru Channel B",
 960                .private_value = _MAKE_NI_CONTROL(0x01, 0x05),
 961        },
 962        {
 963                .name = "Direct Thru Channel C",
 964                .private_value = _MAKE_NI_CONTROL(0x01, 0x07),
 965        },
 966        {
 967                .name = "Direct Thru Channel D",
 968                .private_value = _MAKE_NI_CONTROL(0x01, 0x09),
 969        },
 970        {
 971                .name = "Phono Input Channel A",
 972                .private_value = _MAKE_NI_CONTROL(0x02, 0x03),
 973        },
 974        {
 975                .name = "Phono Input Channel B",
 976                .private_value = _MAKE_NI_CONTROL(0x02, 0x05),
 977        },
 978        {
 979                .name = "Phono Input Channel C",
 980                .private_value = _MAKE_NI_CONTROL(0x02, 0x07),
 981        },
 982        {
 983                .name = "Phono Input Channel D",
 984                .private_value = _MAKE_NI_CONTROL(0x02, 0x09),
 985        },
 986};
 987
 988static int snd_nativeinstruments_create_mixer(struct usb_mixer_interface *mixer,
 989                                              const struct snd_kcontrol_new *kc,
 990                                              unsigned int count)
 991{
 992        int i, err = 0;
 993        struct snd_kcontrol_new template = {
 994                .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
 995                .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
 996                .get = snd_nativeinstruments_control_get,
 997                .put = snd_nativeinstruments_control_put,
 998                .info = snd_ctl_boolean_mono_info,
 999        };
1000
1001        for (i = 0; i < count; i++) {
1002                struct usb_mixer_elem_list *list;
1003
1004                template.name = kc[i].name;
1005                template.private_value = kc[i].private_value;
1006
1007                err = add_single_ctl_with_resume(mixer, 0,
1008                                                 snd_ni_update_cur_val,
1009                                                 &template, &list);
1010                if (err < 0)
1011                        break;
1012                snd_ni_control_init_val(mixer, list->kctl);
1013        }
1014
1015        return err;
1016}
1017
1018/* M-Audio FastTrack Ultra quirks */
1019/* FTU Effect switch (also used by C400/C600) */
1020static int snd_ftu_eff_switch_info(struct snd_kcontrol *kcontrol,
1021                                        struct snd_ctl_elem_info *uinfo)
1022{
1023        static const char *const texts[8] = {
1024                "Room 1", "Room 2", "Room 3", "Hall 1",
1025                "Hall 2", "Plate", "Delay", "Echo"
1026        };
1027
1028        return snd_ctl_enum_info(uinfo, 1, ARRAY_SIZE(texts), texts);
1029}
1030
1031static int snd_ftu_eff_switch_init(struct usb_mixer_interface *mixer,
1032                                   struct snd_kcontrol *kctl)
1033{
1034        struct usb_device *dev = mixer->chip->dev;
1035        unsigned int pval = kctl->private_value;
1036        int err;
1037        unsigned char value[2];
1038
1039        value[0] = 0x00;
1040        value[1] = 0x00;
1041
1042        err = snd_usb_ctl_msg(dev, usb_rcvctrlpipe(dev, 0), UAC_GET_CUR,
1043                              USB_RECIP_INTERFACE | USB_TYPE_CLASS | USB_DIR_IN,
1044                              pval & 0xff00,
1045                              snd_usb_ctrl_intf(mixer->chip) | ((pval & 0xff) << 8),
1046                              value, 2);
1047        if (err < 0)
1048                return err;
1049
1050        kctl->private_value |= (unsigned int)value[0] << 24;
1051        return 0;
1052}
1053
1054static int snd_ftu_eff_switch_get(struct snd_kcontrol *kctl,
1055                                        struct snd_ctl_elem_value *ucontrol)
1056{
1057        ucontrol->value.enumerated.item[0] = kctl->private_value >> 24;
1058        return 0;
1059}
1060
1061static int snd_ftu_eff_switch_update(struct usb_mixer_elem_list *list)
1062{
1063        struct snd_usb_audio *chip = list->mixer->chip;
1064        unsigned int pval = list->kctl->private_value;
1065        unsigned char value[2];
1066        int err;
1067
1068        value[0] = pval >> 24;
1069        value[1] = 0;
1070
1071        err = snd_usb_lock_shutdown(chip);
1072        if (err < 0)
1073                return err;
1074        err = snd_usb_ctl_msg(chip->dev,
1075                              usb_sndctrlpipe(chip->dev, 0),
1076                              UAC_SET_CUR,
1077                              USB_RECIP_INTERFACE | USB_TYPE_CLASS | USB_DIR_OUT,
1078                              pval & 0xff00,
1079                              snd_usb_ctrl_intf(chip) | ((pval & 0xff) << 8),
1080                              value, 2);
1081        snd_usb_unlock_shutdown(chip);
1082        return err;
1083}
1084
1085static int snd_ftu_eff_switch_put(struct snd_kcontrol *kctl,
1086                                        struct snd_ctl_elem_value *ucontrol)
1087{
1088        struct usb_mixer_elem_list *list = snd_kcontrol_chip(kctl);
1089        unsigned int pval = list->kctl->private_value;
1090        int cur_val, err, new_val;
1091
1092        cur_val = pval >> 24;
1093        new_val = ucontrol->value.enumerated.item[0];
1094        if (cur_val == new_val)
1095                return 0;
1096
1097        kctl->private_value &= ~(0xff << 24);
1098        kctl->private_value |= new_val << 24;
1099        err = snd_ftu_eff_switch_update(list);
1100        return err < 0 ? err : 1;
1101}
1102
1103static int snd_ftu_create_effect_switch(struct usb_mixer_interface *mixer,
1104        int validx, int bUnitID)
1105{
1106        static struct snd_kcontrol_new template = {
1107                .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1108                .name = "Effect Program Switch",
1109                .index = 0,
1110                .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
1111                .info = snd_ftu_eff_switch_info,
1112                .get = snd_ftu_eff_switch_get,
1113                .put = snd_ftu_eff_switch_put
1114        };
1115        struct usb_mixer_elem_list *list;
1116        int err;
1117
1118        err = add_single_ctl_with_resume(mixer, bUnitID,
1119                                         snd_ftu_eff_switch_update,
1120                                         &template, &list);
1121        if (err < 0)
1122                return err;
1123        list->kctl->private_value = (validx << 8) | bUnitID;
1124        snd_ftu_eff_switch_init(mixer, list->kctl);
1125        return 0;
1126}
1127
1128/* Create volume controls for FTU devices*/
1129static int snd_ftu_create_volume_ctls(struct usb_mixer_interface *mixer)
1130{
1131        char name[64];
1132        unsigned int control, cmask;
1133        int in, out, err;
1134
1135        const unsigned int id = 5;
1136        const int val_type = USB_MIXER_S16;
1137
1138        for (out = 0; out < 8; out++) {
1139                control = out + 1;
1140                for (in = 0; in < 8; in++) {
1141                        cmask = 1 << in;
1142                        snprintf(name, sizeof(name),
1143                                "AIn%d - Out%d Capture Volume",
1144                                in  + 1, out + 1);
1145                        err = snd_create_std_mono_ctl(mixer, id, control,
1146                                                        cmask, val_type, name,
1147                                                        &snd_usb_mixer_vol_tlv);
1148                        if (err < 0)
1149                                return err;
1150                }
1151                for (in = 8; in < 16; in++) {
1152                        cmask = 1 << in;
1153                        snprintf(name, sizeof(name),
1154                                "DIn%d - Out%d Playback Volume",
1155                                in - 7, out + 1);
1156                        err = snd_create_std_mono_ctl(mixer, id, control,
1157                                                        cmask, val_type, name,
1158                                                        &snd_usb_mixer_vol_tlv);
1159                        if (err < 0)
1160                                return err;
1161                }
1162        }
1163
1164        return 0;
1165}
1166
1167/* This control needs a volume quirk, see mixer.c */
1168static int snd_ftu_create_effect_volume_ctl(struct usb_mixer_interface *mixer)
1169{
1170        static const char name[] = "Effect Volume";
1171        const unsigned int id = 6;
1172        const int val_type = USB_MIXER_U8;
1173        const unsigned int control = 2;
1174        const unsigned int cmask = 0;
1175
1176        return snd_create_std_mono_ctl(mixer, id, control, cmask, val_type,
1177                                        name, snd_usb_mixer_vol_tlv);
1178}
1179
1180/* This control needs a volume quirk, see mixer.c */
1181static int snd_ftu_create_effect_duration_ctl(struct usb_mixer_interface *mixer)
1182{
1183        static const char name[] = "Effect Duration";
1184        const unsigned int id = 6;
1185        const int val_type = USB_MIXER_S16;
1186        const unsigned int control = 3;
1187        const unsigned int cmask = 0;
1188
1189        return snd_create_std_mono_ctl(mixer, id, control, cmask, val_type,
1190                                        name, snd_usb_mixer_vol_tlv);
1191}
1192
1193/* This control needs a volume quirk, see mixer.c */
1194static int snd_ftu_create_effect_feedback_ctl(struct usb_mixer_interface *mixer)
1195{
1196        static const char name[] = "Effect Feedback Volume";
1197        const unsigned int id = 6;
1198        const int val_type = USB_MIXER_U8;
1199        const unsigned int control = 4;
1200        const unsigned int cmask = 0;
1201
1202        return snd_create_std_mono_ctl(mixer, id, control, cmask, val_type,
1203                                        name, NULL);
1204}
1205
1206static int snd_ftu_create_effect_return_ctls(struct usb_mixer_interface *mixer)
1207{
1208        unsigned int cmask;
1209        int err, ch;
1210        char name[48];
1211
1212        const unsigned int id = 7;
1213        const int val_type = USB_MIXER_S16;
1214        const unsigned int control = 7;
1215
1216        for (ch = 0; ch < 4; ++ch) {
1217                cmask = 1 << ch;
1218                snprintf(name, sizeof(name),
1219                        "Effect Return %d Volume", ch + 1);
1220                err = snd_create_std_mono_ctl(mixer, id, control,
1221                                                cmask, val_type, name,
1222                                                snd_usb_mixer_vol_tlv);
1223                if (err < 0)
1224                        return err;
1225        }
1226
1227        return 0;
1228}
1229
1230static int snd_ftu_create_effect_send_ctls(struct usb_mixer_interface *mixer)
1231{
1232        unsigned int  cmask;
1233        int err, ch;
1234        char name[48];
1235
1236        const unsigned int id = 5;
1237        const int val_type = USB_MIXER_S16;
1238        const unsigned int control = 9;
1239
1240        for (ch = 0; ch < 8; ++ch) {
1241                cmask = 1 << ch;
1242                snprintf(name, sizeof(name),
1243                        "Effect Send AIn%d Volume", ch + 1);
1244                err = snd_create_std_mono_ctl(mixer, id, control, cmask,
1245                                                val_type, name,
1246                                                snd_usb_mixer_vol_tlv);
1247                if (err < 0)
1248                        return err;
1249        }
1250        for (ch = 8; ch < 16; ++ch) {
1251                cmask = 1 << ch;
1252                snprintf(name, sizeof(name),
1253                        "Effect Send DIn%d Volume", ch - 7);
1254                err = snd_create_std_mono_ctl(mixer, id, control, cmask,
1255                                                val_type, name,
1256                                                snd_usb_mixer_vol_tlv);
1257                if (err < 0)
1258                        return err;
1259        }
1260        return 0;
1261}
1262
1263static int snd_ftu_create_mixer(struct usb_mixer_interface *mixer)
1264{
1265        int err;
1266
1267        err = snd_ftu_create_volume_ctls(mixer);
1268        if (err < 0)
1269                return err;
1270
1271        err = snd_ftu_create_effect_switch(mixer, 1, 6);
1272        if (err < 0)
1273                return err;
1274
1275        err = snd_ftu_create_effect_volume_ctl(mixer);
1276        if (err < 0)
1277                return err;
1278
1279        err = snd_ftu_create_effect_duration_ctl(mixer);
1280        if (err < 0)
1281                return err;
1282
1283        err = snd_ftu_create_effect_feedback_ctl(mixer);
1284        if (err < 0)
1285                return err;
1286
1287        err = snd_ftu_create_effect_return_ctls(mixer);
1288        if (err < 0)
1289                return err;
1290
1291        err = snd_ftu_create_effect_send_ctls(mixer);
1292        if (err < 0)
1293                return err;
1294
1295        return 0;
1296}
1297
1298void snd_emuusb_set_samplerate(struct snd_usb_audio *chip,
1299                               unsigned char samplerate_id)
1300{
1301        struct usb_mixer_interface *mixer;
1302        struct usb_mixer_elem_info *cval;
1303        int unitid = 12; /* SampleRate ExtensionUnit ID */
1304
1305        list_for_each_entry(mixer, &chip->mixer_list, list) {
1306                if (mixer->id_elems[unitid]) {
1307                        cval = mixer_elem_list_to_info(mixer->id_elems[unitid]);
1308                        snd_usb_mixer_set_ctl_value(cval, UAC_SET_CUR,
1309                                                    cval->control << 8,
1310                                                    samplerate_id);
1311                        snd_usb_mixer_notify_id(mixer, unitid);
1312                        break;
1313                }
1314        }
1315}
1316
1317/* M-Audio Fast Track C400/C600 */
1318/* C400/C600 volume controls, this control needs a volume quirk, see mixer.c */
1319static int snd_c400_create_vol_ctls(struct usb_mixer_interface *mixer)
1320{
1321        char name[64];
1322        unsigned int cmask, offset;
1323        int out, chan, err;
1324        int num_outs = 0;
1325        int num_ins = 0;
1326
1327        const unsigned int id = 0x40;
1328        const int val_type = USB_MIXER_S16;
1329        const int control = 1;
1330
1331        switch (mixer->chip->usb_id) {
1332        case USB_ID(0x0763, 0x2030):
1333                num_outs = 6;
1334                num_ins = 4;
1335                break;
1336        case USB_ID(0x0763, 0x2031):
1337                num_outs = 8;
1338                num_ins = 6;
1339                break;
1340        }
1341
1342        for (chan = 0; chan < num_outs + num_ins; chan++) {
1343                for (out = 0; out < num_outs; out++) {
1344                        if (chan < num_outs) {
1345                                snprintf(name, sizeof(name),
1346                                        "PCM%d-Out%d Playback Volume",
1347                                        chan + 1, out + 1);
1348                        } else {
1349                                snprintf(name, sizeof(name),
1350                                        "In%d-Out%d Playback Volume",
1351                                        chan - num_outs + 1, out + 1);
1352                        }
1353
1354                        cmask = (out == 0) ? 0 : 1 << (out - 1);
1355                        offset = chan * num_outs;
1356                        err = snd_create_std_mono_ctl_offset(mixer, id, control,
1357                                                cmask, val_type, offset, name,
1358                                                &snd_usb_mixer_vol_tlv);
1359                        if (err < 0)
1360                                return err;
1361                }
1362        }
1363
1364        return 0;
1365}
1366
1367/* This control needs a volume quirk, see mixer.c */
1368static int snd_c400_create_effect_volume_ctl(struct usb_mixer_interface *mixer)
1369{
1370        static const char name[] = "Effect Volume";
1371        const unsigned int id = 0x43;
1372        const int val_type = USB_MIXER_U8;
1373        const unsigned int control = 3;
1374        const unsigned int cmask = 0;
1375
1376        return snd_create_std_mono_ctl(mixer, id, control, cmask, val_type,
1377                                        name, snd_usb_mixer_vol_tlv);
1378}
1379
1380/* This control needs a volume quirk, see mixer.c */
1381static int snd_c400_create_effect_duration_ctl(struct usb_mixer_interface *mixer)
1382{
1383        static const char name[] = "Effect Duration";
1384        const unsigned int id = 0x43;
1385        const int val_type = USB_MIXER_S16;
1386        const unsigned int control = 4;
1387        const unsigned int cmask = 0;
1388
1389        return snd_create_std_mono_ctl(mixer, id, control, cmask, val_type,
1390                                        name, snd_usb_mixer_vol_tlv);
1391}
1392
1393/* This control needs a volume quirk, see mixer.c */
1394static int snd_c400_create_effect_feedback_ctl(struct usb_mixer_interface *mixer)
1395{
1396        static const char name[] = "Effect Feedback Volume";
1397        const unsigned int id = 0x43;
1398        const int val_type = USB_MIXER_U8;
1399        const unsigned int control = 5;
1400        const unsigned int cmask = 0;
1401
1402        return snd_create_std_mono_ctl(mixer, id, control, cmask, val_type,
1403                                        name, NULL);
1404}
1405
1406static int snd_c400_create_effect_vol_ctls(struct usb_mixer_interface *mixer)
1407{
1408        char name[64];
1409        unsigned int cmask;
1410        int chan, err;
1411        int num_outs = 0;
1412        int num_ins = 0;
1413
1414        const unsigned int id = 0x42;
1415        const int val_type = USB_MIXER_S16;
1416        const int control = 1;
1417
1418        switch (mixer->chip->usb_id) {
1419        case USB_ID(0x0763, 0x2030):
1420                num_outs = 6;
1421                num_ins = 4;
1422                break;
1423        case USB_ID(0x0763, 0x2031):
1424                num_outs = 8;
1425                num_ins = 6;
1426                break;
1427        }
1428
1429        for (chan = 0; chan < num_outs + num_ins; chan++) {
1430                if (chan < num_outs) {
1431                        snprintf(name, sizeof(name),
1432                                "Effect Send DOut%d",
1433                                chan + 1);
1434                } else {
1435                        snprintf(name, sizeof(name),
1436                                "Effect Send AIn%d",
1437                                chan - num_outs + 1);
1438                }
1439
1440                cmask = (chan == 0) ? 0 : 1 << (chan - 1);
1441                err = snd_create_std_mono_ctl(mixer, id, control,
1442                                                cmask, val_type, name,
1443                                                &snd_usb_mixer_vol_tlv);
1444                if (err < 0)
1445                        return err;
1446        }
1447
1448        return 0;
1449}
1450
1451static int snd_c400_create_effect_ret_vol_ctls(struct usb_mixer_interface *mixer)
1452{
1453        char name[64];
1454        unsigned int cmask;
1455        int chan, err;
1456        int num_outs = 0;
1457        int offset = 0;
1458
1459        const unsigned int id = 0x40;
1460        const int val_type = USB_MIXER_S16;
1461        const int control = 1;
1462
1463        switch (mixer->chip->usb_id) {
1464        case USB_ID(0x0763, 0x2030):
1465                num_outs = 6;
1466                offset = 0x3c;
1467                /* { 0x3c, 0x43, 0x3e, 0x45, 0x40, 0x47 } */
1468                break;
1469        case USB_ID(0x0763, 0x2031):
1470                num_outs = 8;
1471                offset = 0x70;
1472                /* { 0x70, 0x79, 0x72, 0x7b, 0x74, 0x7d, 0x76, 0x7f } */
1473                break;
1474        }
1475
1476        for (chan = 0; chan < num_outs; chan++) {
1477                snprintf(name, sizeof(name),
1478                        "Effect Return %d",
1479                        chan + 1);
1480
1481                cmask = (chan == 0) ? 0 :
1482                        1 << (chan + (chan % 2) * num_outs - 1);
1483                err = snd_create_std_mono_ctl_offset(mixer, id, control,
1484                                                cmask, val_type, offset, name,
1485                                                &snd_usb_mixer_vol_tlv);
1486                if (err < 0)
1487                        return err;
1488        }
1489
1490        return 0;
1491}
1492
1493static int snd_c400_create_mixer(struct usb_mixer_interface *mixer)
1494{
1495        int err;
1496
1497        err = snd_c400_create_vol_ctls(mixer);
1498        if (err < 0)
1499                return err;
1500
1501        err = snd_c400_create_effect_vol_ctls(mixer);
1502        if (err < 0)
1503                return err;
1504
1505        err = snd_c400_create_effect_ret_vol_ctls(mixer);
1506        if (err < 0)
1507                return err;
1508
1509        err = snd_ftu_create_effect_switch(mixer, 2, 0x43);
1510        if (err < 0)
1511                return err;
1512
1513        err = snd_c400_create_effect_volume_ctl(mixer);
1514        if (err < 0)
1515                return err;
1516
1517        err = snd_c400_create_effect_duration_ctl(mixer);
1518        if (err < 0)
1519                return err;
1520
1521        err = snd_c400_create_effect_feedback_ctl(mixer);
1522        if (err < 0)
1523                return err;
1524
1525        return 0;
1526}
1527
1528/*
1529 * The mixer units for Ebox-44 are corrupt, and even where they
1530 * are valid they presents mono controls as L and R channels of
1531 * stereo. So we provide a good mixer here.
1532 */
1533static const struct std_mono_table ebox44_table[] = {
1534        {
1535                .unitid = 4,
1536                .control = 1,
1537                .cmask = 0x0,
1538                .val_type = USB_MIXER_INV_BOOLEAN,
1539                .name = "Headphone Playback Switch"
1540        },
1541        {
1542                .unitid = 4,
1543                .control = 2,
1544                .cmask = 0x1,
1545                .val_type = USB_MIXER_S16,
1546                .name = "Headphone A Mix Playback Volume"
1547        },
1548        {
1549                .unitid = 4,
1550                .control = 2,
1551                .cmask = 0x2,
1552                .val_type = USB_MIXER_S16,
1553                .name = "Headphone B Mix Playback Volume"
1554        },
1555
1556        {
1557                .unitid = 7,
1558                .control = 1,
1559                .cmask = 0x0,
1560                .val_type = USB_MIXER_INV_BOOLEAN,
1561                .name = "Output Playback Switch"
1562        },
1563        {
1564                .unitid = 7,
1565                .control = 2,
1566                .cmask = 0x1,
1567                .val_type = USB_MIXER_S16,
1568                .name = "Output A Playback Volume"
1569        },
1570        {
1571                .unitid = 7,
1572                .control = 2,
1573                .cmask = 0x2,
1574                .val_type = USB_MIXER_S16,
1575                .name = "Output B Playback Volume"
1576        },
1577
1578        {
1579                .unitid = 10,
1580                .control = 1,
1581                .cmask = 0x0,
1582                .val_type = USB_MIXER_INV_BOOLEAN,
1583                .name = "Input Capture Switch"
1584        },
1585        {
1586                .unitid = 10,
1587                .control = 2,
1588                .cmask = 0x1,
1589                .val_type = USB_MIXER_S16,
1590                .name = "Input A Capture Volume"
1591        },
1592        {
1593                .unitid = 10,
1594                .control = 2,
1595                .cmask = 0x2,
1596                .val_type = USB_MIXER_S16,
1597                .name = "Input B Capture Volume"
1598        },
1599
1600        {}
1601};
1602
1603/* Audio Advantage Micro II findings:
1604 *
1605 * Mapping spdif AES bits to vendor register.bit:
1606 * AES0: [0 0 0 0 2.3 2.2 2.1 2.0] - default 0x00
1607 * AES1: [3.3 3.2.3.1.3.0 2.7 2.6 2.5 2.4] - default: 0x01
1608 * AES2: [0 0 0 0 0 0 0 0]
1609 * AES3: [0 0 0 0 0 0 x 0] - 'x' bit is set basing on standard usb request
1610 *                           (UAC_EP_CS_ATTR_SAMPLE_RATE) for Audio Devices
1611 *
1612 * power on values:
1613 * r2: 0x10
1614 * r3: 0x20 (b7 is zeroed just before playback (except IEC61937) and set
1615 *           just after it to 0xa0, presumably it disables/mutes some analog
1616 *           parts when there is no audio.)
1617 * r9: 0x28
1618 *
1619 * Optical transmitter on/off:
1620 * vendor register.bit: 9.1
1621 * 0 - on (0x28 register value)
1622 * 1 - off (0x2a register value)
1623 *
1624 */
1625static int snd_microii_spdif_info(struct snd_kcontrol *kcontrol,
1626        struct snd_ctl_elem_info *uinfo)
1627{
1628        uinfo->type = SNDRV_CTL_ELEM_TYPE_IEC958;
1629        uinfo->count = 1;
1630        return 0;
1631}
1632
1633static int snd_microii_spdif_default_get(struct snd_kcontrol *kcontrol,
1634        struct snd_ctl_elem_value *ucontrol)
1635{
1636        struct usb_mixer_elem_list *list = snd_kcontrol_chip(kcontrol);
1637        struct snd_usb_audio *chip = list->mixer->chip;
1638        int err;
1639        struct usb_interface *iface;
1640        struct usb_host_interface *alts;
1641        unsigned int ep;
1642        unsigned char data[3];
1643        int rate;
1644
1645        err = snd_usb_lock_shutdown(chip);
1646        if (err < 0)
1647                return err;
1648
1649        ucontrol->value.iec958.status[0] = kcontrol->private_value & 0xff;
1650        ucontrol->value.iec958.status[1] = (kcontrol->private_value >> 8) & 0xff;
1651        ucontrol->value.iec958.status[2] = 0x00;
1652
1653        /* use known values for that card: interface#1 altsetting#1 */
1654        iface = usb_ifnum_to_if(chip->dev, 1);
1655        if (!iface || iface->num_altsetting < 2) {
1656                err = -EINVAL;
1657                goto end;
1658        }
1659        alts = &iface->altsetting[1];
1660        if (get_iface_desc(alts)->bNumEndpoints < 1) {
1661                err = -EINVAL;
1662                goto end;
1663        }
1664        ep = get_endpoint(alts, 0)->bEndpointAddress;
1665
1666        err = snd_usb_ctl_msg(chip->dev,
1667                        usb_rcvctrlpipe(chip->dev, 0),
1668                        UAC_GET_CUR,
1669                        USB_TYPE_CLASS | USB_RECIP_ENDPOINT | USB_DIR_IN,
1670                        UAC_EP_CS_ATTR_SAMPLE_RATE << 8,
1671                        ep,
1672                        data,
1673                        sizeof(data));
1674        if (err < 0)
1675                goto end;
1676
1677        rate = data[0] | (data[1] << 8) | (data[2] << 16);
1678        ucontrol->value.iec958.status[3] = (rate == 48000) ?
1679                        IEC958_AES3_CON_FS_48000 : IEC958_AES3_CON_FS_44100;
1680
1681        err = 0;
1682 end:
1683        snd_usb_unlock_shutdown(chip);
1684        return err;
1685}
1686
1687static int snd_microii_spdif_default_update(struct usb_mixer_elem_list *list)
1688{
1689        struct snd_usb_audio *chip = list->mixer->chip;
1690        unsigned int pval = list->kctl->private_value;
1691        u8 reg;
1692        int err;
1693
1694        err = snd_usb_lock_shutdown(chip);
1695        if (err < 0)
1696                return err;
1697
1698        reg = ((pval >> 4) & 0xf0) | (pval & 0x0f);
1699        err = snd_usb_ctl_msg(chip->dev,
1700                        usb_sndctrlpipe(chip->dev, 0),
1701                        UAC_SET_CUR,
1702                        USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_OTHER,
1703                        reg,
1704                        2,
1705                        NULL,
1706                        0);
1707        if (err < 0)
1708                goto end;
1709
1710        reg = (pval & IEC958_AES0_NONAUDIO) ? 0xa0 : 0x20;
1711        reg |= (pval >> 12) & 0x0f;
1712        err = snd_usb_ctl_msg(chip->dev,
1713                        usb_sndctrlpipe(chip->dev, 0),
1714                        UAC_SET_CUR,
1715                        USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_OTHER,
1716                        reg,
1717                        3,
1718                        NULL,
1719                        0);
1720        if (err < 0)
1721                goto end;
1722
1723 end:
1724        snd_usb_unlock_shutdown(chip);
1725        return err;
1726}
1727
1728static int snd_microii_spdif_default_put(struct snd_kcontrol *kcontrol,
1729        struct snd_ctl_elem_value *ucontrol)
1730{
1731        struct usb_mixer_elem_list *list = snd_kcontrol_chip(kcontrol);
1732        unsigned int pval, pval_old;
1733        int err;
1734
1735        pval = pval_old = kcontrol->private_value;
1736        pval &= 0xfffff0f0;
1737        pval |= (ucontrol->value.iec958.status[1] & 0x0f) << 8;
1738        pval |= (ucontrol->value.iec958.status[0] & 0x0f);
1739
1740        pval &= 0xffff0fff;
1741        pval |= (ucontrol->value.iec958.status[1] & 0xf0) << 8;
1742
1743        /* The frequency bits in AES3 cannot be set via register access. */
1744
1745        /* Silently ignore any bits from the request that cannot be set. */
1746
1747        if (pval == pval_old)
1748                return 0;
1749
1750        kcontrol->private_value = pval;
1751        err = snd_microii_spdif_default_update(list);
1752        return err < 0 ? err : 1;
1753}
1754
1755static int snd_microii_spdif_mask_get(struct snd_kcontrol *kcontrol,
1756        struct snd_ctl_elem_value *ucontrol)
1757{
1758        ucontrol->value.iec958.status[0] = 0x0f;
1759        ucontrol->value.iec958.status[1] = 0xff;
1760        ucontrol->value.iec958.status[2] = 0x00;
1761        ucontrol->value.iec958.status[3] = 0x00;
1762
1763        return 0;
1764}
1765
1766static int snd_microii_spdif_switch_get(struct snd_kcontrol *kcontrol,
1767        struct snd_ctl_elem_value *ucontrol)
1768{
1769        ucontrol->value.integer.value[0] = !(kcontrol->private_value & 0x02);
1770
1771        return 0;
1772}
1773
1774static int snd_microii_spdif_switch_update(struct usb_mixer_elem_list *list)
1775{
1776        struct snd_usb_audio *chip = list->mixer->chip;
1777        u8 reg = list->kctl->private_value;
1778        int err;
1779
1780        err = snd_usb_lock_shutdown(chip);
1781        if (err < 0)
1782                return err;
1783
1784        err = snd_usb_ctl_msg(chip->dev,
1785                        usb_sndctrlpipe(chip->dev, 0),
1786                        UAC_SET_CUR,
1787                        USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_OTHER,
1788                        reg,
1789                        9,
1790                        NULL,
1791                        0);
1792
1793        snd_usb_unlock_shutdown(chip);
1794        return err;
1795}
1796
1797static int snd_microii_spdif_switch_put(struct snd_kcontrol *kcontrol,
1798        struct snd_ctl_elem_value *ucontrol)
1799{
1800        struct usb_mixer_elem_list *list = snd_kcontrol_chip(kcontrol);
1801        u8 reg;
1802        int err;
1803
1804        reg = ucontrol->value.integer.value[0] ? 0x28 : 0x2a;
1805        if (reg != list->kctl->private_value)
1806                return 0;
1807
1808        kcontrol->private_value = reg;
1809        err = snd_microii_spdif_switch_update(list);
1810        return err < 0 ? err : 1;
1811}
1812
1813static const struct snd_kcontrol_new snd_microii_mixer_spdif[] = {
1814        {
1815                .iface =    SNDRV_CTL_ELEM_IFACE_PCM,
1816                .name =     SNDRV_CTL_NAME_IEC958("", PLAYBACK, DEFAULT),
1817                .info =     snd_microii_spdif_info,
1818                .get =      snd_microii_spdif_default_get,
1819                .put =      snd_microii_spdif_default_put,
1820                .private_value = 0x00000100UL,/* reset value */
1821        },
1822        {
1823                .access =   SNDRV_CTL_ELEM_ACCESS_READ,
1824                .iface =    SNDRV_CTL_ELEM_IFACE_PCM,
1825                .name =     SNDRV_CTL_NAME_IEC958("", PLAYBACK, MASK),
1826                .info =     snd_microii_spdif_info,
1827                .get =      snd_microii_spdif_mask_get,
1828        },
1829        {
1830                .iface =    SNDRV_CTL_ELEM_IFACE_MIXER,
1831                .name =     SNDRV_CTL_NAME_IEC958("", PLAYBACK, SWITCH),
1832                .info =     snd_ctl_boolean_mono_info,
1833                .get =      snd_microii_spdif_switch_get,
1834                .put =      snd_microii_spdif_switch_put,
1835                .private_value = 0x00000028UL,/* reset value */
1836        }
1837};
1838
1839static int snd_microii_controls_create(struct usb_mixer_interface *mixer)
1840{
1841        int err, i;
1842        static const usb_mixer_elem_resume_func_t resume_funcs[] = {
1843                snd_microii_spdif_default_update,
1844                NULL,
1845                snd_microii_spdif_switch_update
1846        };
1847
1848        for (i = 0; i < ARRAY_SIZE(snd_microii_mixer_spdif); ++i) {
1849                err = add_single_ctl_with_resume(mixer, 0,
1850                                                 resume_funcs[i],
1851                                                 &snd_microii_mixer_spdif[i],
1852                                                 NULL);
1853                if (err < 0)
1854                        return err;
1855        }
1856
1857        return 0;
1858}
1859
1860/* Creative Sound Blaster E1 */
1861
1862static int snd_soundblaster_e1_switch_get(struct snd_kcontrol *kcontrol,
1863                                          struct snd_ctl_elem_value *ucontrol)
1864{
1865        ucontrol->value.integer.value[0] = kcontrol->private_value;
1866        return 0;
1867}
1868
1869static int snd_soundblaster_e1_switch_update(struct usb_mixer_interface *mixer,
1870                                             unsigned char state)
1871{
1872        struct snd_usb_audio *chip = mixer->chip;
1873        int err;
1874        unsigned char buff[2];
1875
1876        buff[0] = 0x02;
1877        buff[1] = state ? 0x02 : 0x00;
1878
1879        err = snd_usb_lock_shutdown(chip);
1880        if (err < 0)
1881                return err;
1882        err = snd_usb_ctl_msg(chip->dev,
1883                        usb_sndctrlpipe(chip->dev, 0), HID_REQ_SET_REPORT,
1884                        USB_TYPE_CLASS | USB_RECIP_INTERFACE | USB_DIR_OUT,
1885                        0x0202, 3, buff, 2);
1886        snd_usb_unlock_shutdown(chip);
1887        return err;
1888}
1889
1890static int snd_soundblaster_e1_switch_put(struct snd_kcontrol *kcontrol,
1891                                          struct snd_ctl_elem_value *ucontrol)
1892{
1893        struct usb_mixer_elem_list *list = snd_kcontrol_chip(kcontrol);
1894        unsigned char value = !!ucontrol->value.integer.value[0];
1895        int err;
1896
1897        if (kcontrol->private_value == value)
1898                return 0;
1899        kcontrol->private_value = value;
1900        err = snd_soundblaster_e1_switch_update(list->mixer, value);
1901        return err < 0 ? err : 1;
1902}
1903
1904static int snd_soundblaster_e1_switch_resume(struct usb_mixer_elem_list *list)
1905{
1906        return snd_soundblaster_e1_switch_update(list->mixer,
1907                                                 list->kctl->private_value);
1908}
1909
1910static int snd_soundblaster_e1_switch_info(struct snd_kcontrol *kcontrol,
1911                                           struct snd_ctl_elem_info *uinfo)
1912{
1913        static const char *const texts[2] = {
1914                "Mic", "Aux"
1915        };
1916
1917        return snd_ctl_enum_info(uinfo, 1, ARRAY_SIZE(texts), texts);
1918}
1919
1920static const struct snd_kcontrol_new snd_soundblaster_e1_input_switch = {
1921        .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1922        .name = "Input Source",
1923        .info = snd_soundblaster_e1_switch_info,
1924        .get = snd_soundblaster_e1_switch_get,
1925        .put = snd_soundblaster_e1_switch_put,
1926        .private_value = 0,
1927};
1928
1929static int snd_soundblaster_e1_switch_create(struct usb_mixer_interface *mixer)
1930{
1931        return add_single_ctl_with_resume(mixer, 0,
1932                                          snd_soundblaster_e1_switch_resume,
1933                                          &snd_soundblaster_e1_input_switch,
1934                                          NULL);
1935}
1936
1937static void dell_dock_init_vol(struct snd_usb_audio *chip, int ch, int id)
1938{
1939        u16 buf = 0;
1940
1941        snd_usb_ctl_msg(chip->dev, usb_sndctrlpipe(chip->dev, 0), UAC_SET_CUR,
1942                        USB_RECIP_INTERFACE | USB_TYPE_CLASS | USB_DIR_OUT,
1943                        ch, snd_usb_ctrl_intf(chip) | (id << 8),
1944                        &buf, 2);
1945}
1946
1947static int dell_dock_mixer_init(struct usb_mixer_interface *mixer)
1948{
1949        /* fix to 0dB playback volumes */
1950        dell_dock_init_vol(mixer->chip, 1, 16);
1951        dell_dock_init_vol(mixer->chip, 2, 16);
1952        dell_dock_init_vol(mixer->chip, 1, 19);
1953        dell_dock_init_vol(mixer->chip, 2, 19);
1954        return 0;
1955}
1956
1957/* RME Class Compliant device quirks */
1958
1959#define SND_RME_GET_STATUS1                     23
1960#define SND_RME_GET_CURRENT_FREQ                17
1961#define SND_RME_CLK_SYSTEM_SHIFT                16
1962#define SND_RME_CLK_SYSTEM_MASK                 0x1f
1963#define SND_RME_CLK_AES_SHIFT                   8
1964#define SND_RME_CLK_SPDIF_SHIFT                 12
1965#define SND_RME_CLK_AES_SPDIF_MASK              0xf
1966#define SND_RME_CLK_SYNC_SHIFT                  6
1967#define SND_RME_CLK_SYNC_MASK                   0x3
1968#define SND_RME_CLK_FREQMUL_SHIFT               18
1969#define SND_RME_CLK_FREQMUL_MASK                0x7
1970#define SND_RME_CLK_SYSTEM(x) \
1971        ((x >> SND_RME_CLK_SYSTEM_SHIFT) & SND_RME_CLK_SYSTEM_MASK)
1972#define SND_RME_CLK_AES(x) \
1973        ((x >> SND_RME_CLK_AES_SHIFT) & SND_RME_CLK_AES_SPDIF_MASK)
1974#define SND_RME_CLK_SPDIF(x) \
1975        ((x >> SND_RME_CLK_SPDIF_SHIFT) & SND_RME_CLK_AES_SPDIF_MASK)
1976#define SND_RME_CLK_SYNC(x) \
1977        ((x >> SND_RME_CLK_SYNC_SHIFT) & SND_RME_CLK_SYNC_MASK)
1978#define SND_RME_CLK_FREQMUL(x) \
1979        ((x >> SND_RME_CLK_FREQMUL_SHIFT) & SND_RME_CLK_FREQMUL_MASK)
1980#define SND_RME_CLK_AES_LOCK                    0x1
1981#define SND_RME_CLK_AES_SYNC                    0x4
1982#define SND_RME_CLK_SPDIF_LOCK                  0x2
1983#define SND_RME_CLK_SPDIF_SYNC                  0x8
1984#define SND_RME_SPDIF_IF_SHIFT                  4
1985#define SND_RME_SPDIF_FORMAT_SHIFT              5
1986#define SND_RME_BINARY_MASK                     0x1
1987#define SND_RME_SPDIF_IF(x) \
1988        ((x >> SND_RME_SPDIF_IF_SHIFT) & SND_RME_BINARY_MASK)
1989#define SND_RME_SPDIF_FORMAT(x) \
1990        ((x >> SND_RME_SPDIF_FORMAT_SHIFT) & SND_RME_BINARY_MASK)
1991
1992static const u32 snd_rme_rate_table[] = {
1993        32000, 44100, 48000, 50000,
1994        64000, 88200, 96000, 100000,
1995        128000, 176400, 192000, 200000,
1996        256000, 352800, 384000, 400000,
1997        512000, 705600, 768000, 800000
1998};
1999/* maximum number of items for AES and S/PDIF rates for above table */
2000#define SND_RME_RATE_IDX_AES_SPDIF_NUM          12
2001
2002enum snd_rme_domain {
2003        SND_RME_DOMAIN_SYSTEM,
2004        SND_RME_DOMAIN_AES,
2005        SND_RME_DOMAIN_SPDIF
2006};
2007
2008enum snd_rme_clock_status {
2009        SND_RME_CLOCK_NOLOCK,
2010        SND_RME_CLOCK_LOCK,
2011        SND_RME_CLOCK_SYNC
2012};
2013
2014static int snd_rme_read_value(struct snd_usb_audio *chip,
2015                              unsigned int item,
2016                              u32 *value)
2017{
2018        struct usb_device *dev = chip->dev;
2019        int err;
2020
2021        err = snd_usb_ctl_msg(dev, usb_rcvctrlpipe(dev, 0),
2022                              item,
2023                              USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
2024                              0, 0,
2025                              value, sizeof(*value));
2026        if (err < 0)
2027                dev_err(&dev->dev,
2028                        "unable to issue vendor read request %d (ret = %d)",
2029                        item, err);
2030        return err;
2031}
2032
2033static int snd_rme_get_status1(struct snd_kcontrol *kcontrol,
2034                               u32 *status1)
2035{
2036        struct usb_mixer_elem_list *list = snd_kcontrol_chip(kcontrol);
2037        struct snd_usb_audio *chip = list->mixer->chip;
2038        int err;
2039
2040        err = snd_usb_lock_shutdown(chip);
2041        if (err < 0)
2042                return err;
2043        err = snd_rme_read_value(chip, SND_RME_GET_STATUS1, status1);
2044        snd_usb_unlock_shutdown(chip);
2045        return err;
2046}
2047
2048static int snd_rme_rate_get(struct snd_kcontrol *kcontrol,
2049                            struct snd_ctl_elem_value *ucontrol)
2050{
2051        u32 status1;
2052        u32 rate = 0;
2053        int idx;
2054        int err;
2055
2056        err = snd_rme_get_status1(kcontrol, &status1);
2057        if (err < 0)
2058                return err;
2059        switch (kcontrol->private_value) {
2060        case SND_RME_DOMAIN_SYSTEM:
2061                idx = SND_RME_CLK_SYSTEM(status1);
2062                if (idx < ARRAY_SIZE(snd_rme_rate_table))
2063                        rate = snd_rme_rate_table[idx];
2064                break;
2065        case SND_RME_DOMAIN_AES:
2066                idx = SND_RME_CLK_AES(status1);
2067                if (idx < SND_RME_RATE_IDX_AES_SPDIF_NUM)
2068                        rate = snd_rme_rate_table[idx];
2069                break;
2070        case SND_RME_DOMAIN_SPDIF:
2071                idx = SND_RME_CLK_SPDIF(status1);
2072                if (idx < SND_RME_RATE_IDX_AES_SPDIF_NUM)
2073                        rate = snd_rme_rate_table[idx];
2074                break;
2075        default:
2076                return -EINVAL;
2077        }
2078        ucontrol->value.integer.value[0] = rate;
2079        return 0;
2080}
2081
2082static int snd_rme_sync_state_get(struct snd_kcontrol *kcontrol,
2083                                  struct snd_ctl_elem_value *ucontrol)
2084{
2085        u32 status1;
2086        int idx = SND_RME_CLOCK_NOLOCK;
2087        int err;
2088
2089        err = snd_rme_get_status1(kcontrol, &status1);
2090        if (err < 0)
2091                return err;
2092        switch (kcontrol->private_value) {
2093        case SND_RME_DOMAIN_AES:  /* AES */
2094                if (status1 & SND_RME_CLK_AES_SYNC)
2095                        idx = SND_RME_CLOCK_SYNC;
2096                else if (status1 & SND_RME_CLK_AES_LOCK)
2097                        idx = SND_RME_CLOCK_LOCK;
2098                break;
2099        case SND_RME_DOMAIN_SPDIF:  /* SPDIF */
2100                if (status1 & SND_RME_CLK_SPDIF_SYNC)
2101                        idx = SND_RME_CLOCK_SYNC;
2102                else if (status1 & SND_RME_CLK_SPDIF_LOCK)
2103                        idx = SND_RME_CLOCK_LOCK;
2104                break;
2105        default:
2106                return -EINVAL;
2107        }
2108        ucontrol->value.enumerated.item[0] = idx;
2109        return 0;
2110}
2111
2112static int snd_rme_spdif_if_get(struct snd_kcontrol *kcontrol,
2113                                struct snd_ctl_elem_value *ucontrol)
2114{
2115        u32 status1;
2116        int err;
2117
2118        err = snd_rme_get_status1(kcontrol, &status1);
2119        if (err < 0)
2120                return err;
2121        ucontrol->value.enumerated.item[0] = SND_RME_SPDIF_IF(status1);
2122        return 0;
2123}
2124
2125static int snd_rme_spdif_format_get(struct snd_kcontrol *kcontrol,
2126                                    struct snd_ctl_elem_value *ucontrol)
2127{
2128        u32 status1;
2129        int err;
2130
2131        err = snd_rme_get_status1(kcontrol, &status1);
2132        if (err < 0)
2133                return err;
2134        ucontrol->value.enumerated.item[0] = SND_RME_SPDIF_FORMAT(status1);
2135        return 0;
2136}
2137
2138static int snd_rme_sync_source_get(struct snd_kcontrol *kcontrol,
2139                                   struct snd_ctl_elem_value *ucontrol)
2140{
2141        u32 status1;
2142        int err;
2143
2144        err = snd_rme_get_status1(kcontrol, &status1);
2145        if (err < 0)
2146                return err;
2147        ucontrol->value.enumerated.item[0] = SND_RME_CLK_SYNC(status1);
2148        return 0;
2149}
2150
2151static int snd_rme_current_freq_get(struct snd_kcontrol *kcontrol,
2152                                    struct snd_ctl_elem_value *ucontrol)
2153{
2154        struct usb_mixer_elem_list *list = snd_kcontrol_chip(kcontrol);
2155        struct snd_usb_audio *chip = list->mixer->chip;
2156        u32 status1;
2157        const u64 num = 104857600000000ULL;
2158        u32 den;
2159        unsigned int freq;
2160        int err;
2161
2162        err = snd_usb_lock_shutdown(chip);
2163        if (err < 0)
2164                return err;
2165        err = snd_rme_read_value(chip, SND_RME_GET_STATUS1, &status1);
2166        if (err < 0)
2167                goto end;
2168        err = snd_rme_read_value(chip, SND_RME_GET_CURRENT_FREQ, &den);
2169        if (err < 0)
2170                goto end;
2171        freq = (den == 0) ? 0 : div64_u64(num, den);
2172        freq <<= SND_RME_CLK_FREQMUL(status1);
2173        ucontrol->value.integer.value[0] = freq;
2174
2175end:
2176        snd_usb_unlock_shutdown(chip);
2177        return err;
2178}
2179
2180static int snd_rme_rate_info(struct snd_kcontrol *kcontrol,
2181                             struct snd_ctl_elem_info *uinfo)
2182{
2183        uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
2184        uinfo->count = 1;
2185        switch (kcontrol->private_value) {
2186        case SND_RME_DOMAIN_SYSTEM:
2187                uinfo->value.integer.min = 32000;
2188                uinfo->value.integer.max = 800000;
2189                break;
2190        case SND_RME_DOMAIN_AES:
2191        case SND_RME_DOMAIN_SPDIF:
2192        default:
2193                uinfo->value.integer.min = 0;
2194                uinfo->value.integer.max = 200000;
2195        }
2196        uinfo->value.integer.step = 0;
2197        return 0;
2198}
2199
2200static int snd_rme_sync_state_info(struct snd_kcontrol *kcontrol,
2201                                   struct snd_ctl_elem_info *uinfo)
2202{
2203        static const char *const sync_states[] = {
2204                "No Lock", "Lock", "Sync"
2205        };
2206
2207        return snd_ctl_enum_info(uinfo, 1,
2208                                 ARRAY_SIZE(sync_states), sync_states);
2209}
2210
2211static int snd_rme_spdif_if_info(struct snd_kcontrol *kcontrol,
2212                                 struct snd_ctl_elem_info *uinfo)
2213{
2214        static const char *const spdif_if[] = {
2215                "Coaxial", "Optical"
2216        };
2217
2218        return snd_ctl_enum_info(uinfo, 1,
2219                                 ARRAY_SIZE(spdif_if), spdif_if);
2220}
2221
2222static int snd_rme_spdif_format_info(struct snd_kcontrol *kcontrol,
2223                                     struct snd_ctl_elem_info *uinfo)
2224{
2225        static const char *const optical_type[] = {
2226                "Consumer", "Professional"
2227        };
2228
2229        return snd_ctl_enum_info(uinfo, 1,
2230                                 ARRAY_SIZE(optical_type), optical_type);
2231}
2232
2233static int snd_rme_sync_source_info(struct snd_kcontrol *kcontrol,
2234                                    struct snd_ctl_elem_info *uinfo)
2235{
2236        static const char *const sync_sources[] = {
2237                "Internal", "AES", "SPDIF", "Internal"
2238        };
2239
2240        return snd_ctl_enum_info(uinfo, 1,
2241                                 ARRAY_SIZE(sync_sources), sync_sources);
2242}
2243
2244static const struct snd_kcontrol_new snd_rme_controls[] = {
2245        {
2246                .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2247                .name = "AES Rate",
2248                .access = SNDRV_CTL_ELEM_ACCESS_READ | SNDRV_CTL_ELEM_ACCESS_VOLATILE,
2249                .info = snd_rme_rate_info,
2250                .get = snd_rme_rate_get,
2251                .private_value = SND_RME_DOMAIN_AES
2252        },
2253        {
2254                .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2255                .name = "AES Sync",
2256                .access = SNDRV_CTL_ELEM_ACCESS_READ | SNDRV_CTL_ELEM_ACCESS_VOLATILE,
2257                .info = snd_rme_sync_state_info,
2258                .get = snd_rme_sync_state_get,
2259                .private_value = SND_RME_DOMAIN_AES
2260        },
2261        {
2262                .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2263                .name = "SPDIF Rate",
2264                .access = SNDRV_CTL_ELEM_ACCESS_READ | SNDRV_CTL_ELEM_ACCESS_VOLATILE,
2265                .info = snd_rme_rate_info,
2266                .get = snd_rme_rate_get,
2267                .private_value = SND_RME_DOMAIN_SPDIF
2268        },
2269        {
2270                .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2271                .name = "SPDIF Sync",
2272                .access = SNDRV_CTL_ELEM_ACCESS_READ | SNDRV_CTL_ELEM_ACCESS_VOLATILE,
2273                .info = snd_rme_sync_state_info,
2274                .get = snd_rme_sync_state_get,
2275                .private_value = SND_RME_DOMAIN_SPDIF
2276        },
2277        {
2278                .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2279                .name = "SPDIF Interface",
2280                .access = SNDRV_CTL_ELEM_ACCESS_READ | SNDRV_CTL_ELEM_ACCESS_VOLATILE,
2281                .info = snd_rme_spdif_if_info,
2282                .get = snd_rme_spdif_if_get,
2283        },
2284        {
2285                .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2286                .name = "SPDIF Format",
2287                .access = SNDRV_CTL_ELEM_ACCESS_READ | SNDRV_CTL_ELEM_ACCESS_VOLATILE,
2288                .info = snd_rme_spdif_format_info,
2289                .get = snd_rme_spdif_format_get,
2290        },
2291        {
2292                .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2293                .name = "Sync Source",
2294                .access = SNDRV_CTL_ELEM_ACCESS_READ | SNDRV_CTL_ELEM_ACCESS_VOLATILE,
2295                .info = snd_rme_sync_source_info,
2296                .get = snd_rme_sync_source_get
2297        },
2298        {
2299                .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2300                .name = "System Rate",
2301                .access = SNDRV_CTL_ELEM_ACCESS_READ | SNDRV_CTL_ELEM_ACCESS_VOLATILE,
2302                .info = snd_rme_rate_info,
2303                .get = snd_rme_rate_get,
2304                .private_value = SND_RME_DOMAIN_SYSTEM
2305        },
2306        {
2307                .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2308                .name = "Current Frequency",
2309                .access = SNDRV_CTL_ELEM_ACCESS_READ | SNDRV_CTL_ELEM_ACCESS_VOLATILE,
2310                .info = snd_rme_rate_info,
2311                .get = snd_rme_current_freq_get
2312        }
2313};
2314
2315static int snd_rme_controls_create(struct usb_mixer_interface *mixer)
2316{
2317        int err, i;
2318
2319        for (i = 0; i < ARRAY_SIZE(snd_rme_controls); ++i) {
2320                err = add_single_ctl_with_resume(mixer, 0,
2321                                                 NULL,
2322                                                 &snd_rme_controls[i],
2323                                                 NULL);
2324                if (err < 0)
2325                        return err;
2326        }
2327
2328        return 0;
2329}
2330
2331/*
2332 * RME Babyface Pro (FS)
2333 *
2334 * These devices exposes a couple of DSP functions via request to EP0.
2335 * Switches are available via control registers, while routing is controlled
2336 * by controlling the volume on each possible crossing point.
2337 * Volume control is linear, from -inf (dec. 0) to +6dB (dec. 65536) with
2338 * 0dB being at dec. 32768.
2339 */
2340enum {
2341        SND_BBFPRO_CTL_REG1 = 0,
2342        SND_BBFPRO_CTL_REG2
2343};
2344
2345#define SND_BBFPRO_CTL_REG_MASK 1
2346#define SND_BBFPRO_CTL_IDX_MASK 0xff
2347#define SND_BBFPRO_CTL_IDX_SHIFT 1
2348#define SND_BBFPRO_CTL_VAL_MASK 1
2349#define SND_BBFPRO_CTL_VAL_SHIFT 9
2350#define SND_BBFPRO_CTL_REG1_CLK_MASTER 0
2351#define SND_BBFPRO_CTL_REG1_CLK_OPTICAL 1
2352#define SND_BBFPRO_CTL_REG1_SPDIF_PRO 7
2353#define SND_BBFPRO_CTL_REG1_SPDIF_EMPH 8
2354#define SND_BBFPRO_CTL_REG1_SPDIF_OPTICAL 10
2355#define SND_BBFPRO_CTL_REG2_48V_AN1 0
2356#define SND_BBFPRO_CTL_REG2_48V_AN2 1
2357#define SND_BBFPRO_CTL_REG2_SENS_IN3 2
2358#define SND_BBFPRO_CTL_REG2_SENS_IN4 3
2359#define SND_BBFPRO_CTL_REG2_PAD_AN1 4
2360#define SND_BBFPRO_CTL_REG2_PAD_AN2 5
2361
2362#define SND_BBFPRO_MIXER_IDX_MASK 0x1ff
2363#define SND_BBFPRO_MIXER_VAL_MASK 0x3ffff
2364#define SND_BBFPRO_MIXER_VAL_SHIFT 9
2365#define SND_BBFPRO_MIXER_VAL_MIN 0 // -inf
2366#define SND_BBFPRO_MIXER_VAL_MAX 65536 // +6dB
2367
2368#define SND_BBFPRO_USBREQ_CTL_REG1 0x10
2369#define SND_BBFPRO_USBREQ_CTL_REG2 0x17
2370#define SND_BBFPRO_USBREQ_MIXER 0x12
2371
2372static int snd_bbfpro_ctl_update(struct usb_mixer_interface *mixer, u8 reg,
2373                                 u8 index, u8 value)
2374{
2375        int err;
2376        u16 usb_req, usb_idx, usb_val;
2377        struct snd_usb_audio *chip = mixer->chip;
2378
2379        err = snd_usb_lock_shutdown(chip);
2380        if (err < 0)
2381                return err;
2382
2383        if (reg == SND_BBFPRO_CTL_REG1) {
2384                usb_req = SND_BBFPRO_USBREQ_CTL_REG1;
2385                if (index == SND_BBFPRO_CTL_REG1_CLK_OPTICAL) {
2386                        usb_idx = 3;
2387                        usb_val = value ? 3 : 0;
2388                } else {
2389                        usb_idx = 1 << index;
2390                        usb_val = value ? usb_idx : 0;
2391                }
2392        } else {
2393                usb_req = SND_BBFPRO_USBREQ_CTL_REG2;
2394                usb_idx = 1 << index;
2395                usb_val = value ? usb_idx : 0;
2396        }
2397
2398        err = snd_usb_ctl_msg(chip->dev,
2399                              usb_sndctrlpipe(chip->dev, 0), usb_req,
2400                              USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
2401                              usb_val, usb_idx, NULL, 0);
2402
2403        snd_usb_unlock_shutdown(chip);
2404        return err;
2405}
2406
2407static int snd_bbfpro_ctl_get(struct snd_kcontrol *kcontrol,
2408                              struct snd_ctl_elem_value *ucontrol)
2409{
2410        u8 reg, idx, val;
2411        int pv;
2412
2413        pv = kcontrol->private_value;
2414        reg = pv & SND_BBFPRO_CTL_REG_MASK;
2415        idx = (pv >> SND_BBFPRO_CTL_IDX_SHIFT) & SND_BBFPRO_CTL_IDX_MASK;
2416        val = kcontrol->private_value >> SND_BBFPRO_CTL_VAL_SHIFT;
2417
2418        if ((reg == SND_BBFPRO_CTL_REG1 &&
2419             idx == SND_BBFPRO_CTL_REG1_CLK_OPTICAL) ||
2420            (reg == SND_BBFPRO_CTL_REG2 &&
2421            (idx == SND_BBFPRO_CTL_REG2_SENS_IN3 ||
2422             idx == SND_BBFPRO_CTL_REG2_SENS_IN4))) {
2423                ucontrol->value.enumerated.item[0] = val;
2424        } else {
2425                ucontrol->value.integer.value[0] = val;
2426        }
2427        return 0;
2428}
2429
2430static int snd_bbfpro_ctl_info(struct snd_kcontrol *kcontrol,
2431                               struct snd_ctl_elem_info *uinfo)
2432{
2433        u8 reg, idx;
2434        int pv;
2435
2436        pv = kcontrol->private_value;
2437        reg = pv & SND_BBFPRO_CTL_REG_MASK;
2438        idx = (pv >> SND_BBFPRO_CTL_IDX_SHIFT) & SND_BBFPRO_CTL_IDX_MASK;
2439
2440        if (reg == SND_BBFPRO_CTL_REG1 &&
2441            idx == SND_BBFPRO_CTL_REG1_CLK_OPTICAL) {
2442                static const char * const texts[2] = {
2443                        "AutoSync",
2444                        "Internal"
2445                };
2446                return snd_ctl_enum_info(uinfo, 1, 2, texts);
2447        } else if (reg == SND_BBFPRO_CTL_REG2 &&
2448                   (idx == SND_BBFPRO_CTL_REG2_SENS_IN3 ||
2449                    idx == SND_BBFPRO_CTL_REG2_SENS_IN4)) {
2450                static const char * const texts[2] = {
2451                        "-10dBV",
2452                        "+4dBu"
2453                };
2454                return snd_ctl_enum_info(uinfo, 1, 2, texts);
2455        }
2456
2457        uinfo->count = 1;
2458        uinfo->value.integer.min = 0;
2459        uinfo->value.integer.max = 1;
2460        uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN;
2461        return 0;
2462}
2463
2464static int snd_bbfpro_ctl_put(struct snd_kcontrol *kcontrol,
2465                              struct snd_ctl_elem_value *ucontrol)
2466{
2467        int err;
2468        u8 reg, idx;
2469        int old_value, pv, val;
2470
2471        struct usb_mixer_elem_list *list = snd_kcontrol_chip(kcontrol);
2472        struct usb_mixer_interface *mixer = list->mixer;
2473
2474        pv = kcontrol->private_value;
2475        reg = pv & SND_BBFPRO_CTL_REG_MASK;
2476        idx = (pv >> SND_BBFPRO_CTL_IDX_SHIFT) & SND_BBFPRO_CTL_IDX_MASK;
2477        old_value = (pv >> SND_BBFPRO_CTL_VAL_SHIFT) & SND_BBFPRO_CTL_VAL_MASK;
2478
2479        if ((reg == SND_BBFPRO_CTL_REG1 &&
2480             idx == SND_BBFPRO_CTL_REG1_CLK_OPTICAL) ||
2481            (reg == SND_BBFPRO_CTL_REG2 &&
2482            (idx == SND_BBFPRO_CTL_REG2_SENS_IN3 ||
2483             idx == SND_BBFPRO_CTL_REG2_SENS_IN4))) {
2484                val = ucontrol->value.enumerated.item[0];
2485        } else {
2486                val = ucontrol->value.integer.value[0];
2487        }
2488
2489        if (val > 1)
2490                return -EINVAL;
2491
2492        if (val == old_value)
2493                return 0;
2494
2495        kcontrol->private_value = reg
2496                | ((idx & SND_BBFPRO_CTL_IDX_MASK) << SND_BBFPRO_CTL_IDX_SHIFT)
2497                | ((val & SND_BBFPRO_CTL_VAL_MASK) << SND_BBFPRO_CTL_VAL_SHIFT);
2498
2499        err = snd_bbfpro_ctl_update(mixer, reg, idx, val);
2500        return err < 0 ? err : 1;
2501}
2502
2503static int snd_bbfpro_ctl_resume(struct usb_mixer_elem_list *list)
2504{
2505        u8 reg, idx;
2506        int value, pv;
2507
2508        pv = list->kctl->private_value;
2509        reg = pv & SND_BBFPRO_CTL_REG_MASK;
2510        idx = (pv >> SND_BBFPRO_CTL_IDX_SHIFT) & SND_BBFPRO_CTL_IDX_MASK;
2511        value = (pv >> SND_BBFPRO_CTL_VAL_SHIFT) & SND_BBFPRO_CTL_VAL_MASK;
2512
2513        return snd_bbfpro_ctl_update(list->mixer, reg, idx, value);
2514}
2515
2516static int snd_bbfpro_vol_update(struct usb_mixer_interface *mixer, u16 index,
2517                                 u32 value)
2518{
2519        struct snd_usb_audio *chip = mixer->chip;
2520        int err;
2521        u16 idx;
2522        u16 usb_idx, usb_val;
2523        u32 v;
2524
2525        err = snd_usb_lock_shutdown(chip);
2526        if (err < 0)
2527                return err;
2528
2529        idx = index & SND_BBFPRO_MIXER_IDX_MASK;
2530        // 18 bit linear volume, split so 2 bits end up in index.
2531        v = value & SND_BBFPRO_MIXER_VAL_MASK;
2532        usb_idx = idx | (v & 0x3) << 14;
2533        usb_val = (v >> 2) & 0xffff;
2534
2535        err = snd_usb_ctl_msg(chip->dev,
2536                              usb_sndctrlpipe(chip->dev, 0),
2537                              SND_BBFPRO_USBREQ_MIXER,
2538                              USB_DIR_OUT | USB_TYPE_VENDOR |
2539                              USB_RECIP_DEVICE,
2540                              usb_val, usb_idx, NULL, 0);
2541
2542        snd_usb_unlock_shutdown(chip);
2543        return err;
2544}
2545
2546static int snd_bbfpro_vol_get(struct snd_kcontrol *kcontrol,
2547                              struct snd_ctl_elem_value *ucontrol)
2548{
2549        ucontrol->value.integer.value[0] =
2550                kcontrol->private_value >> SND_BBFPRO_MIXER_VAL_SHIFT;
2551        return 0;
2552}
2553
2554static int snd_bbfpro_vol_info(struct snd_kcontrol *kcontrol,
2555                               struct snd_ctl_elem_info *uinfo)
2556{
2557        uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
2558        uinfo->count = 1;
2559        uinfo->value.integer.min = SND_BBFPRO_MIXER_VAL_MIN;
2560        uinfo->value.integer.max = SND_BBFPRO_MIXER_VAL_MAX;
2561        return 0;
2562}
2563
2564static int snd_bbfpro_vol_put(struct snd_kcontrol *kcontrol,
2565                              struct snd_ctl_elem_value *ucontrol)
2566{
2567        int err;
2568        u16 idx;
2569        u32 new_val, old_value, uvalue;
2570        struct usb_mixer_elem_list *list = snd_kcontrol_chip(kcontrol);
2571        struct usb_mixer_interface *mixer = list->mixer;
2572
2573        uvalue = ucontrol->value.integer.value[0];
2574        idx = kcontrol->private_value & SND_BBFPRO_MIXER_IDX_MASK;
2575        old_value = kcontrol->private_value >> SND_BBFPRO_MIXER_VAL_SHIFT;
2576
2577        if (uvalue > SND_BBFPRO_MIXER_VAL_MAX)
2578                return -EINVAL;
2579
2580        if (uvalue == old_value)
2581                return 0;
2582
2583        new_val = uvalue & SND_BBFPRO_MIXER_VAL_MASK;
2584
2585        kcontrol->private_value = idx
2586                | (new_val << SND_BBFPRO_MIXER_VAL_SHIFT);
2587
2588        err = snd_bbfpro_vol_update(mixer, idx, new_val);
2589        return err < 0 ? err : 1;
2590}
2591
2592static int snd_bbfpro_vol_resume(struct usb_mixer_elem_list *list)
2593{
2594        int pv = list->kctl->private_value;
2595        u16 idx = pv & SND_BBFPRO_MIXER_IDX_MASK;
2596        u32 val = (pv >> SND_BBFPRO_MIXER_VAL_SHIFT)
2597                & SND_BBFPRO_MIXER_VAL_MASK;
2598        return snd_bbfpro_vol_update(list->mixer, idx, val);
2599}
2600
2601// Predfine elements
2602static const struct snd_kcontrol_new snd_bbfpro_ctl_control = {
2603        .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2604        .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
2605        .index = 0,
2606        .info = snd_bbfpro_ctl_info,
2607        .get = snd_bbfpro_ctl_get,
2608        .put = snd_bbfpro_ctl_put
2609};
2610
2611static const struct snd_kcontrol_new snd_bbfpro_vol_control = {
2612        .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2613        .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
2614        .index = 0,
2615        .info = snd_bbfpro_vol_info,
2616        .get = snd_bbfpro_vol_get,
2617        .put = snd_bbfpro_vol_put
2618};
2619
2620static int snd_bbfpro_ctl_add(struct usb_mixer_interface *mixer, u8 reg,
2621                              u8 index, char *name)
2622{
2623        struct snd_kcontrol_new knew = snd_bbfpro_ctl_control;
2624
2625        knew.name = name;
2626        knew.private_value = (reg & SND_BBFPRO_CTL_REG_MASK)
2627                | ((index & SND_BBFPRO_CTL_IDX_MASK)
2628                        << SND_BBFPRO_CTL_IDX_SHIFT);
2629
2630        return add_single_ctl_with_resume(mixer, 0, snd_bbfpro_ctl_resume,
2631                &knew, NULL);
2632}
2633
2634static int snd_bbfpro_vol_add(struct usb_mixer_interface *mixer, u16 index,
2635                              char *name)
2636{
2637        struct snd_kcontrol_new knew = snd_bbfpro_vol_control;
2638
2639        knew.name = name;
2640        knew.private_value = index & SND_BBFPRO_MIXER_IDX_MASK;
2641
2642        return add_single_ctl_with_resume(mixer, 0, snd_bbfpro_vol_resume,
2643                &knew, NULL);
2644}
2645
2646static int snd_bbfpro_controls_create(struct usb_mixer_interface *mixer)
2647{
2648        int err, i, o;
2649        char name[48];
2650
2651        static const char * const input[] = {
2652                "AN1", "AN2", "IN3", "IN4", "AS1", "AS2", "ADAT3",
2653                "ADAT4", "ADAT5", "ADAT6", "ADAT7", "ADAT8"};
2654
2655        static const char * const output[] = {
2656                "AN1", "AN2", "PH3", "PH4", "AS1", "AS2", "ADAT3", "ADAT4",
2657                "ADAT5", "ADAT6", "ADAT7", "ADAT8"};
2658
2659        for (o = 0 ; o < 12 ; ++o) {
2660                for (i = 0 ; i < 12 ; ++i) {
2661                        // Line routing
2662                        snprintf(name, sizeof(name),
2663                                 "%s-%s-%s Playback Volume",
2664                                 (i < 2 ? "Mic" : "Line"),
2665                                 input[i], output[o]);
2666                        err = snd_bbfpro_vol_add(mixer, (26 * o + i), name);
2667                        if (err < 0)
2668                                return err;
2669
2670                        // PCM routing... yes, it is output remapping
2671                        snprintf(name, sizeof(name),
2672                                 "PCM-%s-%s Playback Volume",
2673                                 output[i], output[o]);
2674                        err = snd_bbfpro_vol_add(mixer, (26 * o + 12 + i),
2675                                                 name);
2676                        if (err < 0)
2677                                return err;
2678                }
2679        }
2680
2681        // Control Reg 1
2682        err = snd_bbfpro_ctl_add(mixer, SND_BBFPRO_CTL_REG1,
2683                                 SND_BBFPRO_CTL_REG1_CLK_OPTICAL,
2684                                 "Sample Clock Source");
2685        if (err < 0)
2686                return err;
2687
2688        err = snd_bbfpro_ctl_add(mixer, SND_BBFPRO_CTL_REG1,
2689                                 SND_BBFPRO_CTL_REG1_SPDIF_PRO,
2690                                 "IEC958 Pro Mask");
2691        if (err < 0)
2692                return err;
2693
2694        err = snd_bbfpro_ctl_add(mixer, SND_BBFPRO_CTL_REG1,
2695                                 SND_BBFPRO_CTL_REG1_SPDIF_EMPH,
2696                                 "IEC958 Emphasis");
2697        if (err < 0)
2698                return err;
2699
2700        err = snd_bbfpro_ctl_add(mixer, SND_BBFPRO_CTL_REG1,
2701                                 SND_BBFPRO_CTL_REG1_SPDIF_OPTICAL,
2702                                 "IEC958 Switch");
2703        if (err < 0)
2704                return err;
2705
2706        // Control Reg 2
2707        err = snd_bbfpro_ctl_add(mixer, SND_BBFPRO_CTL_REG2,
2708                                 SND_BBFPRO_CTL_REG2_48V_AN1,
2709                                 "Mic-AN1 48V");
2710        if (err < 0)
2711                return err;
2712
2713        err = snd_bbfpro_ctl_add(mixer, SND_BBFPRO_CTL_REG2,
2714                                 SND_BBFPRO_CTL_REG2_48V_AN2,
2715                                 "Mic-AN2 48V");
2716        if (err < 0)
2717                return err;
2718
2719        err = snd_bbfpro_ctl_add(mixer, SND_BBFPRO_CTL_REG2,
2720                                 SND_BBFPRO_CTL_REG2_SENS_IN3,
2721                                 "Line-IN3 Sens.");
2722        if (err < 0)
2723                return err;
2724
2725        err = snd_bbfpro_ctl_add(mixer, SND_BBFPRO_CTL_REG2,
2726                                 SND_BBFPRO_CTL_REG2_SENS_IN4,
2727                                 "Line-IN4 Sens.");
2728        if (err < 0)
2729                return err;
2730
2731        err = snd_bbfpro_ctl_add(mixer, SND_BBFPRO_CTL_REG2,
2732                                 SND_BBFPRO_CTL_REG2_PAD_AN1,
2733                                 "Mic-AN1 PAD");
2734        if (err < 0)
2735                return err;
2736
2737        err = snd_bbfpro_ctl_add(mixer, SND_BBFPRO_CTL_REG2,
2738                                 SND_BBFPRO_CTL_REG2_PAD_AN2,
2739                                 "Mic-AN2 PAD");
2740        if (err < 0)
2741                return err;
2742
2743        return 0;
2744}
2745
2746/*
2747 * Pioneer DJ DJM Mixers
2748 *
2749 * These devices generally have options for soft-switching the playback and
2750 * capture sources in addition to the recording level. Although different
2751 * devices have different configurations, there seems to be canonical values
2752 * for specific capture/playback types:  See the definitions of these below.
2753 *
2754 * The wValue is masked with the stereo channel number. e.g. Setting Ch2 to
2755 * capture phono would be 0x0203. Capture, playback and capture level have
2756 * different wIndexes.
2757 */
2758
2759// Capture types
2760#define SND_DJM_CAP_LINE        0x00
2761#define SND_DJM_CAP_CDLINE      0x01
2762#define SND_DJM_CAP_DIGITAL     0x02
2763#define SND_DJM_CAP_PHONO       0x03
2764#define SND_DJM_CAP_PFADER      0x06
2765#define SND_DJM_CAP_XFADERA     0x07
2766#define SND_DJM_CAP_XFADERB     0x08
2767#define SND_DJM_CAP_MIC         0x09
2768#define SND_DJM_CAP_AUX         0x0d
2769#define SND_DJM_CAP_RECOUT      0x0a
2770#define SND_DJM_CAP_NONE        0x0f
2771#define SND_DJM_CAP_CH1PFADER   0x11
2772#define SND_DJM_CAP_CH2PFADER   0x12
2773#define SND_DJM_CAP_CH3PFADER   0x13
2774#define SND_DJM_CAP_CH4PFADER   0x14
2775
2776// Playback types
2777#define SND_DJM_PB_CH1          0x00
2778#define SND_DJM_PB_CH2          0x01
2779#define SND_DJM_PB_AUX          0x04
2780
2781#define SND_DJM_WINDEX_CAP      0x8002
2782#define SND_DJM_WINDEX_CAPLVL   0x8003
2783#define SND_DJM_WINDEX_PB       0x8016
2784
2785// kcontrol->private_value layout
2786#define SND_DJM_VALUE_MASK      0x0000ffff
2787#define SND_DJM_GROUP_MASK      0x00ff0000
2788#define SND_DJM_DEVICE_MASK     0xff000000
2789#define SND_DJM_GROUP_SHIFT     16
2790#define SND_DJM_DEVICE_SHIFT    24
2791
2792// device table index
2793// used for the snd_djm_devices table, so please update accordingly
2794#define SND_DJM_250MK2_IDX      0x0
2795#define SND_DJM_750_IDX         0x1
2796#define SND_DJM_850_IDX         0x2
2797#define SND_DJM_900NXS2_IDX     0x3
2798
2799
2800#define SND_DJM_CTL(_name, suffix, _default_value, _windex) { \
2801        .name = _name, \
2802        .options = snd_djm_opts_##suffix, \
2803        .noptions = ARRAY_SIZE(snd_djm_opts_##suffix), \
2804        .default_value = _default_value, \
2805        .wIndex = _windex }
2806
2807#define SND_DJM_DEVICE(suffix) { \
2808        .controls = snd_djm_ctls_##suffix, \
2809        .ncontrols = ARRAY_SIZE(snd_djm_ctls_##suffix) }
2810
2811
2812struct snd_djm_device {
2813        const char *name;
2814        const struct snd_djm_ctl *controls;
2815        size_t ncontrols;
2816};
2817
2818struct snd_djm_ctl {
2819        const char *name;
2820        const u16 *options;
2821        size_t noptions;
2822        u16 default_value;
2823        u16 wIndex;
2824};
2825
2826static const char *snd_djm_get_label_caplevel(u16 wvalue)
2827{
2828        switch (wvalue) {
2829        case 0x0000:    return "-19dB";
2830        case 0x0100:    return "-15dB";
2831        case 0x0200:    return "-10dB";
2832        case 0x0300:    return "-5dB";
2833        default:        return NULL;
2834        }
2835};
2836
2837static const char *snd_djm_get_label_cap_common(u16 wvalue)
2838{
2839        switch (wvalue & 0x00ff) {
2840        case SND_DJM_CAP_LINE:          return "Control Tone LINE";
2841        case SND_DJM_CAP_CDLINE:        return "Control Tone CD/LINE";
2842        case SND_DJM_CAP_DIGITAL:       return "Control Tone DIGITAL";
2843        case SND_DJM_CAP_PHONO:         return "Control Tone PHONO";
2844        case SND_DJM_CAP_PFADER:        return "Post Fader";
2845        case SND_DJM_CAP_XFADERA:       return "Cross Fader A";
2846        case SND_DJM_CAP_XFADERB:       return "Cross Fader B";
2847        case SND_DJM_CAP_MIC:           return "Mic";
2848        case SND_DJM_CAP_RECOUT:        return "Rec Out";
2849        case SND_DJM_CAP_AUX:           return "Aux";
2850        case SND_DJM_CAP_NONE:          return "None";
2851        case SND_DJM_CAP_CH1PFADER:     return "Post Fader Ch1";
2852        case SND_DJM_CAP_CH2PFADER:     return "Post Fader Ch2";
2853        case SND_DJM_CAP_CH3PFADER:     return "Post Fader Ch3";
2854        case SND_DJM_CAP_CH4PFADER:     return "Post Fader Ch4";
2855        default:                        return NULL;
2856        }
2857};
2858
2859// The DJM-850 has different values for CD/LINE and LINE capture
2860// control options than the other DJM declared in this file.
2861static const char *snd_djm_get_label_cap_850(u16 wvalue)
2862{
2863        switch (wvalue & 0x00ff) {
2864        case 0x00:              return "Control Tone CD/LINE";
2865        case 0x01:              return "Control Tone LINE";
2866        default:                return snd_djm_get_label_cap_common(wvalue);
2867        }
2868};
2869
2870static const char *snd_djm_get_label_cap(u8 device_idx, u16 wvalue)
2871{
2872        switch (device_idx) {
2873        case SND_DJM_850_IDX:           return snd_djm_get_label_cap_850(wvalue);
2874        default:                        return snd_djm_get_label_cap_common(wvalue);
2875        }
2876};
2877
2878static const char *snd_djm_get_label_pb(u16 wvalue)
2879{
2880        switch (wvalue & 0x00ff) {
2881        case SND_DJM_PB_CH1:    return "Ch1";
2882        case SND_DJM_PB_CH2:    return "Ch2";
2883        case SND_DJM_PB_AUX:    return "Aux";
2884        default:                return NULL;
2885        }
2886};
2887
2888static const char *snd_djm_get_label(u8 device_idx, u16 wvalue, u16 windex)
2889{
2890        switch (windex) {
2891        case SND_DJM_WINDEX_CAPLVL:     return snd_djm_get_label_caplevel(wvalue);
2892        case SND_DJM_WINDEX_CAP:        return snd_djm_get_label_cap(device_idx, wvalue);
2893        case SND_DJM_WINDEX_PB:         return snd_djm_get_label_pb(wvalue);
2894        default:                        return NULL;
2895        }
2896};
2897
2898// common DJM capture level option values
2899static const u16 snd_djm_opts_cap_level[] = {
2900        0x0000, 0x0100, 0x0200, 0x0300 };
2901
2902
2903// DJM-250MK2
2904static const u16 snd_djm_opts_250mk2_cap1[] = {
2905        0x0103, 0x0100, 0x0106, 0x0107, 0x0108, 0x0109, 0x010d, 0x010a };
2906
2907static const u16 snd_djm_opts_250mk2_cap2[] = {
2908        0x0203, 0x0200, 0x0206, 0x0207, 0x0208, 0x0209, 0x020d, 0x020a };
2909
2910static const u16 snd_djm_opts_250mk2_cap3[] = {
2911        0x030a, 0x0311, 0x0312, 0x0307, 0x0308, 0x0309, 0x030d };
2912
2913static const u16 snd_djm_opts_250mk2_pb1[] = { 0x0100, 0x0101, 0x0104 };
2914static const u16 snd_djm_opts_250mk2_pb2[] = { 0x0200, 0x0201, 0x0204 };
2915static const u16 snd_djm_opts_250mk2_pb3[] = { 0x0300, 0x0301, 0x0304 };
2916
2917static const struct snd_djm_ctl snd_djm_ctls_250mk2[] = {
2918        SND_DJM_CTL("Capture Level", cap_level, 0, SND_DJM_WINDEX_CAPLVL),
2919        SND_DJM_CTL("Ch1 Input",   250mk2_cap1, 2, SND_DJM_WINDEX_CAP),
2920        SND_DJM_CTL("Ch2 Input",   250mk2_cap2, 2, SND_DJM_WINDEX_CAP),
2921        SND_DJM_CTL("Ch3 Input",   250mk2_cap3, 0, SND_DJM_WINDEX_CAP),
2922        SND_DJM_CTL("Ch1 Output",   250mk2_pb1, 0, SND_DJM_WINDEX_PB),
2923        SND_DJM_CTL("Ch2 Output",   250mk2_pb2, 1, SND_DJM_WINDEX_PB),
2924        SND_DJM_CTL("Ch3 Output",   250mk2_pb3, 2, SND_DJM_WINDEX_PB)
2925};
2926
2927
2928// DJM-750
2929static const u16 snd_djm_opts_750_cap1[] = {
2930        0x0101, 0x0103, 0x0106, 0x0107, 0x0108, 0x0109, 0x010a, 0x010f };
2931static const u16 snd_djm_opts_750_cap2[] = {
2932        0x0200, 0x0201, 0x0206, 0x0207, 0x0208, 0x0209, 0x020a, 0x020f };
2933static const u16 snd_djm_opts_750_cap3[] = {
2934        0x0300, 0x0301, 0x0306, 0x0307, 0x0308, 0x0309, 0x030a, 0x030f };
2935static const u16 snd_djm_opts_750_cap4[] = {
2936        0x0401, 0x0403, 0x0406, 0x0407, 0x0408, 0x0409, 0x040a, 0x040f };
2937
2938static const struct snd_djm_ctl snd_djm_ctls_750[] = {
2939        SND_DJM_CTL("Capture Level", cap_level, 0, SND_DJM_WINDEX_CAPLVL),
2940        SND_DJM_CTL("Ch1 Input",   750_cap1, 2, SND_DJM_WINDEX_CAP),
2941        SND_DJM_CTL("Ch2 Input",   750_cap2, 2, SND_DJM_WINDEX_CAP),
2942        SND_DJM_CTL("Ch3 Input",   750_cap3, 0, SND_DJM_WINDEX_CAP),
2943        SND_DJM_CTL("Ch4 Input",   750_cap4, 0, SND_DJM_WINDEX_CAP)
2944};
2945
2946
2947// DJM-850
2948static const u16 snd_djm_opts_850_cap1[] = {
2949        0x0100, 0x0103, 0x0106, 0x0107, 0x0108, 0x0109, 0x010a, 0x010f };
2950static const u16 snd_djm_opts_850_cap2[] = {
2951        0x0200, 0x0201, 0x0206, 0x0207, 0x0208, 0x0209, 0x020a, 0x020f };
2952static const u16 snd_djm_opts_850_cap3[] = {
2953        0x0300, 0x0301, 0x0306, 0x0307, 0x0308, 0x0309, 0x030a, 0x030f };
2954static const u16 snd_djm_opts_850_cap4[] = {
2955        0x0400, 0x0403, 0x0406, 0x0407, 0x0408, 0x0409, 0x040a, 0x040f };
2956
2957static const struct snd_djm_ctl snd_djm_ctls_850[] = {
2958        SND_DJM_CTL("Capture Level", cap_level, 0, SND_DJM_WINDEX_CAPLVL),
2959        SND_DJM_CTL("Ch1 Input",   850_cap1, 1, SND_DJM_WINDEX_CAP),
2960        SND_DJM_CTL("Ch2 Input",   850_cap2, 0, SND_DJM_WINDEX_CAP),
2961        SND_DJM_CTL("Ch3 Input",   850_cap3, 0, SND_DJM_WINDEX_CAP),
2962        SND_DJM_CTL("Ch4 Input",   850_cap4, 1, SND_DJM_WINDEX_CAP)
2963};
2964
2965
2966// DJM-900NXS2
2967static const u16 snd_djm_opts_900nxs2_cap1[] = {
2968        0x0100, 0x0102, 0x0103, 0x0106, 0x0107, 0x0108, 0x0109, 0x010a };
2969static const u16 snd_djm_opts_900nxs2_cap2[] = {
2970        0x0200, 0x0202, 0x0203, 0x0206, 0x0207, 0x0208, 0x0209, 0x020a };
2971static const u16 snd_djm_opts_900nxs2_cap3[] = {
2972        0x0300, 0x0302, 0x0303, 0x0306, 0x0307, 0x0308, 0x0309, 0x030a };
2973static const u16 snd_djm_opts_900nxs2_cap4[] = {
2974        0x0400, 0x0402, 0x0403, 0x0406, 0x0407, 0x0408, 0x0409, 0x040a };
2975static const u16 snd_djm_opts_900nxs2_cap5[] = {
2976        0x0507, 0x0508, 0x0509, 0x050a, 0x0511, 0x0512, 0x0513, 0x0514 };
2977
2978static const struct snd_djm_ctl snd_djm_ctls_900nxs2[] = {
2979        SND_DJM_CTL("Capture Level", cap_level, 0, SND_DJM_WINDEX_CAPLVL),
2980        SND_DJM_CTL("Ch1 Input",   900nxs2_cap1, 2, SND_DJM_WINDEX_CAP),
2981        SND_DJM_CTL("Ch2 Input",   900nxs2_cap2, 2, SND_DJM_WINDEX_CAP),
2982        SND_DJM_CTL("Ch3 Input",   900nxs2_cap3, 2, SND_DJM_WINDEX_CAP),
2983        SND_DJM_CTL("Ch4 Input",   900nxs2_cap4, 2, SND_DJM_WINDEX_CAP),
2984        SND_DJM_CTL("Ch5 Input",   900nxs2_cap5, 3, SND_DJM_WINDEX_CAP)
2985};
2986
2987
2988static const struct snd_djm_device snd_djm_devices[] = {
2989        SND_DJM_DEVICE(250mk2),
2990        SND_DJM_DEVICE(750),
2991        SND_DJM_DEVICE(850),
2992        SND_DJM_DEVICE(900nxs2)
2993};
2994
2995
2996static int snd_djm_controls_info(struct snd_kcontrol *kctl,
2997                                struct snd_ctl_elem_info *info)
2998{
2999        unsigned long private_value = kctl->private_value;
3000        u8 device_idx = (private_value & SND_DJM_DEVICE_MASK) >> SND_DJM_DEVICE_SHIFT;
3001        u8 ctl_idx = (private_value & SND_DJM_GROUP_MASK) >> SND_DJM_GROUP_SHIFT;
3002        const struct snd_djm_device *device = &snd_djm_devices[device_idx];
3003        const char *name;
3004        const struct snd_djm_ctl *ctl;
3005        size_t noptions;
3006
3007        if (ctl_idx >= device->ncontrols)
3008                return -EINVAL;
3009
3010        ctl = &device->controls[ctl_idx];
3011        noptions = ctl->noptions;
3012        if (info->value.enumerated.item >= noptions)
3013                info->value.enumerated.item = noptions - 1;
3014
3015        name = snd_djm_get_label(device_idx,
3016                                ctl->options[info->value.enumerated.item],
3017                                ctl->wIndex);
3018        if (!name)
3019                return -EINVAL;
3020
3021        strscpy(info->value.enumerated.name, name, sizeof(info->value.enumerated.name));
3022        info->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
3023        info->count = 1;
3024        info->value.enumerated.items = noptions;
3025        return 0;
3026}
3027
3028static int snd_djm_controls_update(struct usb_mixer_interface *mixer,
3029                                u8 device_idx, u8 group, u16 value)
3030{
3031        int err;
3032        const struct snd_djm_device *device = &snd_djm_devices[device_idx];
3033
3034        if ((group >= device->ncontrols) || value >= device->controls[group].noptions)
3035                return -EINVAL;
3036
3037        err = snd_usb_lock_shutdown(mixer->chip);
3038        if (err)
3039                return err;
3040
3041        err = snd_usb_ctl_msg(
3042                mixer->chip->dev, usb_sndctrlpipe(mixer->chip->dev, 0),
3043                USB_REQ_SET_FEATURE,
3044                USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
3045                device->controls[group].options[value],
3046                device->controls[group].wIndex,
3047                NULL, 0);
3048
3049        snd_usb_unlock_shutdown(mixer->chip);
3050        return err;
3051}
3052
3053static int snd_djm_controls_get(struct snd_kcontrol *kctl,
3054                                struct snd_ctl_elem_value *elem)
3055{
3056        elem->value.enumerated.item[0] = kctl->private_value & SND_DJM_VALUE_MASK;
3057        return 0;
3058}
3059
3060static int snd_djm_controls_put(struct snd_kcontrol *kctl, struct snd_ctl_elem_value *elem)
3061{
3062        struct usb_mixer_elem_list *list = snd_kcontrol_chip(kctl);
3063        struct usb_mixer_interface *mixer = list->mixer;
3064        unsigned long private_value = kctl->private_value;
3065
3066        u8 device = (private_value & SND_DJM_DEVICE_MASK) >> SND_DJM_DEVICE_SHIFT;
3067        u8 group = (private_value & SND_DJM_GROUP_MASK) >> SND_DJM_GROUP_SHIFT;
3068        u16 value = elem->value.enumerated.item[0];
3069
3070        kctl->private_value = (((unsigned long)device << SND_DJM_DEVICE_SHIFT) |
3071                              (group << SND_DJM_GROUP_SHIFT) |
3072                              value);
3073
3074        return snd_djm_controls_update(mixer, device, group, value);
3075}
3076
3077static int snd_djm_controls_resume(struct usb_mixer_elem_list *list)
3078{
3079        unsigned long private_value = list->kctl->private_value;
3080        u8 device = (private_value & SND_DJM_DEVICE_MASK) >> SND_DJM_DEVICE_SHIFT;
3081        u8 group = (private_value & SND_DJM_GROUP_MASK) >> SND_DJM_GROUP_SHIFT;
3082        u16 value = (private_value & SND_DJM_VALUE_MASK);
3083
3084        return snd_djm_controls_update(list->mixer, device, group, value);
3085}
3086
3087static int snd_djm_controls_create(struct usb_mixer_interface *mixer,
3088                const u8 device_idx)
3089{
3090        int err, i;
3091        u16 value;
3092
3093        const struct snd_djm_device *device = &snd_djm_devices[device_idx];
3094
3095        struct snd_kcontrol_new knew = {
3096                .iface  = SNDRV_CTL_ELEM_IFACE_MIXER,
3097                .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
3098                .index = 0,
3099                .info = snd_djm_controls_info,
3100                .get  = snd_djm_controls_get,
3101                .put  = snd_djm_controls_put
3102        };
3103
3104        for (i = 0; i < device->ncontrols; i++) {
3105                value = device->controls[i].default_value;
3106                knew.name = device->controls[i].name;
3107                knew.private_value = (
3108                        ((unsigned long)device_idx << SND_DJM_DEVICE_SHIFT) |
3109                        (i << SND_DJM_GROUP_SHIFT) |
3110                        value);
3111                err = snd_djm_controls_update(mixer, device_idx, i, value);
3112                if (err)
3113                        return err;
3114                err = add_single_ctl_with_resume(mixer, 0, snd_djm_controls_resume,
3115                                                 &knew, NULL);
3116                if (err)
3117                        return err;
3118        }
3119        return 0;
3120}
3121
3122int snd_usb_mixer_apply_create_quirk(struct usb_mixer_interface *mixer)
3123{
3124        int err = 0;
3125
3126        err = snd_usb_soundblaster_remote_init(mixer);
3127        if (err < 0)
3128                return err;
3129
3130        switch (mixer->chip->usb_id) {
3131        /* Tascam US-16x08 */
3132        case USB_ID(0x0644, 0x8047):
3133                err = snd_us16x08_controls_create(mixer);
3134                break;
3135        case USB_ID(0x041e, 0x3020):
3136        case USB_ID(0x041e, 0x3040):
3137        case USB_ID(0x041e, 0x3042):
3138        case USB_ID(0x041e, 0x30df):
3139        case USB_ID(0x041e, 0x3048):
3140                err = snd_audigy2nx_controls_create(mixer);
3141                if (err < 0)
3142                        break;
3143                snd_card_ro_proc_new(mixer->chip->card, "audigy2nx",
3144                                     mixer, snd_audigy2nx_proc_read);
3145                break;
3146
3147        /* EMU0204 */
3148        case USB_ID(0x041e, 0x3f19):
3149                err = snd_emu0204_controls_create(mixer);
3150                break;
3151
3152        case USB_ID(0x0763, 0x2030): /* M-Audio Fast Track C400 */
3153        case USB_ID(0x0763, 0x2031): /* M-Audio Fast Track C400 */
3154                err = snd_c400_create_mixer(mixer);
3155                break;
3156
3157        case USB_ID(0x0763, 0x2080): /* M-Audio Fast Track Ultra */
3158        case USB_ID(0x0763, 0x2081): /* M-Audio Fast Track Ultra 8R */
3159                err = snd_ftu_create_mixer(mixer);
3160                break;
3161
3162        case USB_ID(0x0b05, 0x1739): /* ASUS Xonar U1 */
3163        case USB_ID(0x0b05, 0x1743): /* ASUS Xonar U1 (2) */
3164        case USB_ID(0x0b05, 0x17a0): /* ASUS Xonar U3 */
3165                err = snd_xonar_u1_controls_create(mixer);
3166                break;
3167
3168        case USB_ID(0x0d8c, 0x0103): /* Audio Advantage Micro II */
3169                err = snd_microii_controls_create(mixer);
3170                break;
3171
3172        case USB_ID(0x0dba, 0x1000): /* Digidesign Mbox 1 */
3173                err = snd_mbox1_controls_create(mixer);
3174                break;
3175
3176        case USB_ID(0x17cc, 0x1011): /* Traktor Audio 6 */
3177                err = snd_nativeinstruments_create_mixer(mixer,
3178                                snd_nativeinstruments_ta6_mixers,
3179                                ARRAY_SIZE(snd_nativeinstruments_ta6_mixers));
3180                break;
3181
3182        case USB_ID(0x17cc, 0x1021): /* Traktor Audio 10 */
3183                err = snd_nativeinstruments_create_mixer(mixer,
3184                                snd_nativeinstruments_ta10_mixers,
3185                                ARRAY_SIZE(snd_nativeinstruments_ta10_mixers));
3186                break;
3187
3188        case USB_ID(0x200c, 0x1018): /* Electrix Ebox-44 */
3189                /* detection is disabled in mixer_maps.c */
3190                err = snd_create_std_mono_table(mixer, ebox44_table);
3191                break;
3192
3193        case USB_ID(0x1235, 0x8012): /* Focusrite Scarlett 6i6 */
3194        case USB_ID(0x1235, 0x8002): /* Focusrite Scarlett 8i6 */
3195        case USB_ID(0x1235, 0x8004): /* Focusrite Scarlett 18i6 */
3196        case USB_ID(0x1235, 0x8014): /* Focusrite Scarlett 18i8 */
3197        case USB_ID(0x1235, 0x800c): /* Focusrite Scarlett 18i20 */
3198                err = snd_scarlett_controls_create(mixer);
3199                break;
3200
3201        case USB_ID(0x1235, 0x8203): /* Focusrite Scarlett 6i6 2nd Gen */
3202        case USB_ID(0x1235, 0x8204): /* Focusrite Scarlett 18i8 2nd Gen */
3203        case USB_ID(0x1235, 0x8201): /* Focusrite Scarlett 18i20 2nd Gen */
3204        case USB_ID(0x1235, 0x8211): /* Focusrite Scarlett Solo 3rd Gen */
3205        case USB_ID(0x1235, 0x8210): /* Focusrite Scarlett 2i2 3rd Gen */
3206        case USB_ID(0x1235, 0x8212): /* Focusrite Scarlett 4i4 3rd Gen */
3207        case USB_ID(0x1235, 0x8213): /* Focusrite Scarlett 8i6 3rd Gen */
3208        case USB_ID(0x1235, 0x8214): /* Focusrite Scarlett 18i8 3rd Gen */
3209        case USB_ID(0x1235, 0x8215): /* Focusrite Scarlett 18i20 3rd Gen */
3210                err = snd_scarlett_gen2_init(mixer);
3211                break;
3212
3213        case USB_ID(0x041e, 0x323b): /* Creative Sound Blaster E1 */
3214                err = snd_soundblaster_e1_switch_create(mixer);
3215                break;
3216        case USB_ID(0x0bda, 0x4014): /* Dell WD15 dock */
3217                err = dell_dock_mixer_init(mixer);
3218                break;
3219
3220        case USB_ID(0x2a39, 0x3fd2): /* RME ADI-2 Pro */
3221        case USB_ID(0x2a39, 0x3fd3): /* RME ADI-2 DAC */
3222        case USB_ID(0x2a39, 0x3fd4): /* RME */
3223                err = snd_rme_controls_create(mixer);
3224                break;
3225
3226        case USB_ID(0x0194f, 0x010c): /* Presonus Studio 1810c */
3227                err = snd_sc1810_init_mixer(mixer);
3228                break;
3229        case USB_ID(0x2a39, 0x3fb0): /* RME Babyface Pro FS */
3230                err = snd_bbfpro_controls_create(mixer);
3231                break;
3232        case USB_ID(0x2b73, 0x0017): /* Pioneer DJ DJM-250MK2 */
3233                err = snd_djm_controls_create(mixer, SND_DJM_250MK2_IDX);
3234                break;
3235        case USB_ID(0x08e4, 0x017f): /* Pioneer DJ DJM-750 */
3236                err = snd_djm_controls_create(mixer, SND_DJM_750_IDX);
3237                break;
3238        case USB_ID(0x08e4, 0x0163): /* Pioneer DJ DJM-850 */
3239                err = snd_djm_controls_create(mixer, SND_DJM_850_IDX);
3240                break;
3241        case USB_ID(0x2b73, 0x000a): /* Pioneer DJ DJM-900NXS2 */
3242                err = snd_djm_controls_create(mixer, SND_DJM_900NXS2_IDX);
3243                break;
3244        }
3245
3246        return err;
3247}
3248
3249#ifdef CONFIG_PM
3250void snd_usb_mixer_resume_quirk(struct usb_mixer_interface *mixer)
3251{
3252        switch (mixer->chip->usb_id) {
3253        case USB_ID(0x0bda, 0x4014): /* Dell WD15 dock */
3254                dell_dock_mixer_init(mixer);
3255                break;
3256        }
3257}
3258#endif
3259
3260void snd_usb_mixer_rc_memory_change(struct usb_mixer_interface *mixer,
3261                                    int unitid)
3262{
3263        if (!mixer->rc_cfg)
3264                return;
3265        /* unit ids specific to Extigy/Audigy 2 NX: */
3266        switch (unitid) {
3267        case 0: /* remote control */
3268                mixer->rc_urb->dev = mixer->chip->dev;
3269                usb_submit_urb(mixer->rc_urb, GFP_ATOMIC);
3270                break;
3271        case 4: /* digital in jack */
3272        case 7: /* line in jacks */
3273        case 19: /* speaker out jacks */
3274        case 20: /* headphones out jack */
3275                break;
3276        /* live24ext: 4 = line-in jack */
3277        case 3: /* hp-out jack (may actuate Mute) */
3278                if (mixer->chip->usb_id == USB_ID(0x041e, 0x3040) ||
3279                    mixer->chip->usb_id == USB_ID(0x041e, 0x3048))
3280                        snd_usb_mixer_notify_id(mixer, mixer->rc_cfg->mute_mixer_id);
3281                break;
3282        default:
3283                usb_audio_dbg(mixer->chip, "memory change in unknown unit %d\n", unitid);
3284                break;
3285        }
3286}
3287
3288static void snd_dragonfly_quirk_db_scale(struct usb_mixer_interface *mixer,
3289                                         struct usb_mixer_elem_info *cval,
3290                                         struct snd_kcontrol *kctl)
3291{
3292        /* Approximation using 10 ranges based on output measurement on hw v1.2.
3293         * This seems close to the cubic mapping e.g. alsamixer uses. */
3294        static const DECLARE_TLV_DB_RANGE(scale,
3295                 0,  1, TLV_DB_MINMAX_ITEM(-5300, -4970),
3296                 2,  5, TLV_DB_MINMAX_ITEM(-4710, -4160),
3297                 6,  7, TLV_DB_MINMAX_ITEM(-3884, -3710),
3298                 8, 14, TLV_DB_MINMAX_ITEM(-3443, -2560),
3299                15, 16, TLV_DB_MINMAX_ITEM(-2475, -2324),
3300                17, 19, TLV_DB_MINMAX_ITEM(-2228, -2031),
3301                20, 26, TLV_DB_MINMAX_ITEM(-1910, -1393),
3302                27, 31, TLV_DB_MINMAX_ITEM(-1322, -1032),
3303                32, 40, TLV_DB_MINMAX_ITEM(-968, -490),
3304                41, 50, TLV_DB_MINMAX_ITEM(-441, 0),
3305        );
3306
3307        if (cval->min == 0 && cval->max == 50) {
3308                usb_audio_info(mixer->chip, "applying DragonFly dB scale quirk (0-50 variant)\n");
3309                kctl->tlv.p = scale;
3310                kctl->vd[0].access |= SNDRV_CTL_ELEM_ACCESS_TLV_READ;
3311                kctl->vd[0].access &= ~SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK;
3312
3313        } else if (cval->min == 0 && cval->max <= 1000) {
3314                /* Some other clearly broken DragonFly variant.
3315                 * At least a 0..53 variant (hw v1.0) exists.
3316                 */
3317                usb_audio_info(mixer->chip, "ignoring too narrow dB range on a DragonFly device");
3318                kctl->vd[0].access &= ~SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK;
3319        }
3320}
3321
3322void snd_usb_mixer_fu_apply_quirk(struct usb_mixer_interface *mixer,
3323                                  struct usb_mixer_elem_info *cval, int unitid,
3324                                  struct snd_kcontrol *kctl)
3325{
3326        switch (mixer->chip->usb_id) {
3327        case USB_ID(0x21b4, 0x0081): /* AudioQuest DragonFly */
3328                if (unitid == 7 && cval->control == UAC_FU_VOLUME)
3329                        snd_dragonfly_quirk_db_scale(mixer, cval, kctl);
3330                break;
3331        /* lowest playback value is muted on C-Media devices */
3332        case USB_ID(0x0d8c, 0x000c):
3333        case USB_ID(0x0d8c, 0x0014):
3334                if (strstr(kctl->id.name, "Playback"))
3335                        cval->min_mute = 1;
3336                break;
3337        }
3338}
3339
3340