Merge tag 'v3.18' into for_next
[cascardo/linux.git] / sound / usb / mixer_quirks.c
1 /*
2  *   USB Audio Driver for ALSA
3  *
4  *   Quirks and vendor-specific extensions for mixer interfaces
5  *
6  *   Copyright (c) 2002 by Takashi Iwai <tiwai@suse.de>
7  *
8  *   Many codes borrowed from audio.c by
9  *          Alan Cox (alan@lxorguk.ukuu.org.uk)
10  *          Thomas Sailer (sailer@ife.ee.ethz.ch)
11  *
12  *   Audio Advantage Micro II support added by:
13  *          Przemek Rudy (prudy1@o2.pl)
14  *
15  *   This program is free software; you can redistribute it and/or modify
16  *   it under the terms of the GNU General Public License as published by
17  *   the Free Software Foundation; either version 2 of the License, or
18  *   (at your option) any later version.
19  *
20  *   This program is distributed in the hope that it will be useful,
21  *   but WITHOUT ANY WARRANTY; without even the implied warranty of
22  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
23  *   GNU General Public License for more details.
24  *
25  *   You should have received a copy of the GNU General Public License
26  *   along with this program; if not, write to the Free Software
27  *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
28  */
29
30 #include <linux/init.h>
31 #include <linux/slab.h>
32 #include <linux/usb.h>
33 #include <linux/usb/audio.h>
34
35 #include <sound/asoundef.h>
36 #include <sound/core.h>
37 #include <sound/control.h>
38 #include <sound/hwdep.h>
39 #include <sound/info.h>
40
41 #include "usbaudio.h"
42 #include "mixer.h"
43 #include "mixer_quirks.h"
44 #include "helper.h"
45
46 extern struct snd_kcontrol_new *snd_usb_feature_unit_ctl;
47
48 struct std_mono_table {
49         unsigned int unitid, control, cmask;
50         int val_type;
51         const char *name;
52         snd_kcontrol_tlv_rw_t *tlv_callback;
53 };
54
55 /* private_free callback */
56 static void usb_mixer_elem_free(struct snd_kcontrol *kctl)
57 {
58         kfree(kctl->private_data);
59         kctl->private_data = NULL;
60 }
61
62 /* This function allows for the creation of standard UAC controls.
63  * See the quirks for M-Audio FTUs or Ebox-44.
64  * If you don't want to set a TLV callback pass NULL.
65  *
66  * Since there doesn't seem to be a devices that needs a multichannel
67  * version, we keep it mono for simplicity.
68  */
69 static int snd_create_std_mono_ctl_offset(struct usb_mixer_interface *mixer,
70                                 unsigned int unitid,
71                                 unsigned int control,
72                                 unsigned int cmask,
73                                 int val_type,
74                                 unsigned int idx_off,
75                                 const char *name,
76                                 snd_kcontrol_tlv_rw_t *tlv_callback)
77 {
78         int err;
79         struct usb_mixer_elem_info *cval;
80         struct snd_kcontrol *kctl;
81
82         cval = kzalloc(sizeof(*cval), GFP_KERNEL);
83         if (!cval)
84                 return -ENOMEM;
85
86         cval->id = unitid;
87         cval->mixer = mixer;
88         cval->val_type = val_type;
89         cval->channels = 1;
90         cval->control = control;
91         cval->cmask = cmask;
92         cval->idx_off = idx_off;
93
94         /* get_min_max() is called only for integer volumes later,
95          * so provide a short-cut for booleans */
96         cval->min = 0;
97         cval->max = 1;
98         cval->res = 0;
99         cval->dBmin = 0;
100         cval->dBmax = 0;
101
102         /* Create control */
103         kctl = snd_ctl_new1(snd_usb_feature_unit_ctl, cval);
104         if (!kctl) {
105                 kfree(cval);
106                 return -ENOMEM;
107         }
108
109         /* Set name */
110         snprintf(kctl->id.name, sizeof(kctl->id.name), name);
111         kctl->private_free = usb_mixer_elem_free;
112
113         /* set TLV */
114         if (tlv_callback) {
115                 kctl->tlv.c = tlv_callback;
116                 kctl->vd[0].access |=
117                         SNDRV_CTL_ELEM_ACCESS_TLV_READ |
118                         SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK;
119         }
120         /* Add control to mixer */
121         err = snd_usb_mixer_add_control(mixer, kctl);
122         if (err < 0)
123                 return err;
124
125         return 0;
126 }
127
128 static int snd_create_std_mono_ctl(struct usb_mixer_interface *mixer,
129                                 unsigned int unitid,
130                                 unsigned int control,
131                                 unsigned int cmask,
132                                 int val_type,
133                                 const char *name,
134                                 snd_kcontrol_tlv_rw_t *tlv_callback)
135 {
136         return snd_create_std_mono_ctl_offset(mixer, unitid, control, cmask,
137                 val_type, 0 /* Offset */, name, tlv_callback);
138 }
139
140 /*
141  * Create a set of standard UAC controls from a table
142  */
143 static int snd_create_std_mono_table(struct usb_mixer_interface *mixer,
144                                 struct std_mono_table *t)
145 {
146         int err;
147
148         while (t->name != NULL) {
149                 err = snd_create_std_mono_ctl(mixer, t->unitid, t->control,
150                                 t->cmask, t->val_type, t->name, t->tlv_callback);
151                 if (err < 0)
152                         return err;
153                 t++;
154         }
155
156         return 0;
157 }
158
159 /*
160  * Sound Blaster remote control configuration
161  *
162  * format of remote control data:
163  * Extigy:       xx 00
164  * Audigy 2 NX:  06 80 xx 00 00 00
165  * Live! 24-bit: 06 80 xx yy 22 83
166  */
167 static const struct rc_config {
168         u32 usb_id;
169         u8  offset;
170         u8  length;
171         u8  packet_length;
172         u8  min_packet_length; /* minimum accepted length of the URB result */
173         u8  mute_mixer_id;
174         u32 mute_code;
175 } rc_configs[] = {
176         { USB_ID(0x041e, 0x3000), 0, 1, 2, 1,  18, 0x0013 }, /* Extigy       */
177         { USB_ID(0x041e, 0x3020), 2, 1, 6, 6,  18, 0x0013 }, /* Audigy 2 NX  */
178         { USB_ID(0x041e, 0x3040), 2, 2, 6, 6,  2,  0x6e91 }, /* Live! 24-bit */
179         { USB_ID(0x041e, 0x3042), 0, 1, 1, 1,  1,  0x000d }, /* Usb X-Fi S51 */
180         { USB_ID(0x041e, 0x30df), 0, 1, 1, 1,  1,  0x000d }, /* Usb X-Fi S51 Pro */
181         { USB_ID(0x041e, 0x3048), 2, 2, 6, 6,  2,  0x6e91 }, /* Toshiba SB0500 */
182 };
183
184 static void snd_usb_soundblaster_remote_complete(struct urb *urb)
185 {
186         struct usb_mixer_interface *mixer = urb->context;
187         const struct rc_config *rc = mixer->rc_cfg;
188         u32 code;
189
190         if (urb->status < 0 || urb->actual_length < rc->min_packet_length)
191                 return;
192
193         code = mixer->rc_buffer[rc->offset];
194         if (rc->length == 2)
195                 code |= mixer->rc_buffer[rc->offset + 1] << 8;
196
197         /* the Mute button actually changes the mixer control */
198         if (code == rc->mute_code)
199                 snd_usb_mixer_notify_id(mixer, rc->mute_mixer_id);
200         mixer->rc_code = code;
201         wmb();
202         wake_up(&mixer->rc_waitq);
203 }
204
205 static long snd_usb_sbrc_hwdep_read(struct snd_hwdep *hw, char __user *buf,
206                                      long count, loff_t *offset)
207 {
208         struct usb_mixer_interface *mixer = hw->private_data;
209         int err;
210         u32 rc_code;
211
212         if (count != 1 && count != 4)
213                 return -EINVAL;
214         err = wait_event_interruptible(mixer->rc_waitq,
215                                        (rc_code = xchg(&mixer->rc_code, 0)) != 0);
216         if (err == 0) {
217                 if (count == 1)
218                         err = put_user(rc_code, buf);
219                 else
220                         err = put_user(rc_code, (u32 __user *)buf);
221         }
222         return err < 0 ? err : count;
223 }
224
225 static unsigned int snd_usb_sbrc_hwdep_poll(struct snd_hwdep *hw, struct file *file,
226                                             poll_table *wait)
227 {
228         struct usb_mixer_interface *mixer = hw->private_data;
229
230         poll_wait(file, &mixer->rc_waitq, wait);
231         return mixer->rc_code ? POLLIN | POLLRDNORM : 0;
232 }
233
234 static int snd_usb_soundblaster_remote_init(struct usb_mixer_interface *mixer)
235 {
236         struct snd_hwdep *hwdep;
237         int err, len, i;
238
239         for (i = 0; i < ARRAY_SIZE(rc_configs); ++i)
240                 if (rc_configs[i].usb_id == mixer->chip->usb_id)
241                         break;
242         if (i >= ARRAY_SIZE(rc_configs))
243                 return 0;
244         mixer->rc_cfg = &rc_configs[i];
245
246         len = mixer->rc_cfg->packet_length;
247
248         init_waitqueue_head(&mixer->rc_waitq);
249         err = snd_hwdep_new(mixer->chip->card, "SB remote control", 0, &hwdep);
250         if (err < 0)
251                 return err;
252         snprintf(hwdep->name, sizeof(hwdep->name),
253                  "%s remote control", mixer->chip->card->shortname);
254         hwdep->iface = SNDRV_HWDEP_IFACE_SB_RC;
255         hwdep->private_data = mixer;
256         hwdep->ops.read = snd_usb_sbrc_hwdep_read;
257         hwdep->ops.poll = snd_usb_sbrc_hwdep_poll;
258         hwdep->exclusive = 1;
259
260         mixer->rc_urb = usb_alloc_urb(0, GFP_KERNEL);
261         if (!mixer->rc_urb)
262                 return -ENOMEM;
263         mixer->rc_setup_packet = kmalloc(sizeof(*mixer->rc_setup_packet), GFP_KERNEL);
264         if (!mixer->rc_setup_packet) {
265                 usb_free_urb(mixer->rc_urb);
266                 mixer->rc_urb = NULL;
267                 return -ENOMEM;
268         }
269         mixer->rc_setup_packet->bRequestType =
270                 USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_INTERFACE;
271         mixer->rc_setup_packet->bRequest = UAC_GET_MEM;
272         mixer->rc_setup_packet->wValue = cpu_to_le16(0);
273         mixer->rc_setup_packet->wIndex = cpu_to_le16(0);
274         mixer->rc_setup_packet->wLength = cpu_to_le16(len);
275         usb_fill_control_urb(mixer->rc_urb, mixer->chip->dev,
276                              usb_rcvctrlpipe(mixer->chip->dev, 0),
277                              (u8*)mixer->rc_setup_packet, mixer->rc_buffer, len,
278                              snd_usb_soundblaster_remote_complete, mixer);
279         return 0;
280 }
281
282 #define snd_audigy2nx_led_info          snd_ctl_boolean_mono_info
283
284 static int snd_audigy2nx_led_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
285 {
286         struct usb_mixer_interface *mixer = snd_kcontrol_chip(kcontrol);
287         int index = kcontrol->private_value;
288
289         ucontrol->value.integer.value[0] = mixer->audigy2nx_leds[index];
290         return 0;
291 }
292
293 static int snd_audigy2nx_led_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
294 {
295         struct usb_mixer_interface *mixer = snd_kcontrol_chip(kcontrol);
296         int index = kcontrol->private_value;
297         int value = ucontrol->value.integer.value[0];
298         int err, changed;
299
300         if (value > 1)
301                 return -EINVAL;
302         changed = value != mixer->audigy2nx_leds[index];
303         down_read(&mixer->chip->shutdown_rwsem);
304         if (mixer->chip->shutdown) {
305                 err = -ENODEV;
306                 goto out;
307         }
308         if (mixer->chip->usb_id == USB_ID(0x041e, 0x3042))
309                 err = snd_usb_ctl_msg(mixer->chip->dev,
310                               usb_sndctrlpipe(mixer->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 (mixer->chip->usb_id == USB_ID(0x041e, 0x30df))
315                 err = snd_usb_ctl_msg(mixer->chip->dev,
316                               usb_sndctrlpipe(mixer->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(mixer->chip->dev,
321                               usb_sndctrlpipe(mixer->chip->dev, 0), 0x24,
322                               USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_OTHER,
323                               value, index + 2, NULL, 0);
324  out:
325         up_read(&mixer->chip->shutdown_rwsem);
326         if (err < 0)
327                 return err;
328         mixer->audigy2nx_leds[index] = value;
329         return changed;
330 }
331
332 static struct snd_kcontrol_new snd_audigy2nx_controls[] = {
333         {
334                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
335                 .name = "CMSS LED Switch",
336                 .info = snd_audigy2nx_led_info,
337                 .get = snd_audigy2nx_led_get,
338                 .put = snd_audigy2nx_led_put,
339                 .private_value = 0,
340         },
341         {
342                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
343                 .name = "Power LED Switch",
344                 .info = snd_audigy2nx_led_info,
345                 .get = snd_audigy2nx_led_get,
346                 .put = snd_audigy2nx_led_put,
347                 .private_value = 1,
348         },
349         {
350                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
351                 .name = "Dolby Digital LED Switch",
352                 .info = snd_audigy2nx_led_info,
353                 .get = snd_audigy2nx_led_get,
354                 .put = snd_audigy2nx_led_put,
355                 .private_value = 2,
356         },
357 };
358
359 static int snd_audigy2nx_controls_create(struct usb_mixer_interface *mixer)
360 {
361         int i, err;
362
363         for (i = 0; i < ARRAY_SIZE(snd_audigy2nx_controls); ++i) {
364                 /* USB X-Fi S51 doesn't have a CMSS LED */
365                 if ((mixer->chip->usb_id == USB_ID(0x041e, 0x3042)) && i == 0)
366                         continue;
367                 /* USB X-Fi S51 Pro doesn't have one either */
368                 if ((mixer->chip->usb_id == USB_ID(0x041e, 0x30df)) && i == 0)
369                         continue;
370                 if (i > 1 && /* Live24ext has 2 LEDs only */
371                         (mixer->chip->usb_id == USB_ID(0x041e, 0x3040) ||
372                          mixer->chip->usb_id == USB_ID(0x041e, 0x3042) ||
373                          mixer->chip->usb_id == USB_ID(0x041e, 0x30df) ||
374                          mixer->chip->usb_id == USB_ID(0x041e, 0x3048)))
375                         break; 
376                 err = snd_ctl_add(mixer->chip->card,
377                                   snd_ctl_new1(&snd_audigy2nx_controls[i], mixer));
378                 if (err < 0)
379                         return err;
380         }
381         mixer->audigy2nx_leds[1] = 1; /* Power LED is on by default */
382         return 0;
383 }
384
385 static void snd_audigy2nx_proc_read(struct snd_info_entry *entry,
386                                     struct snd_info_buffer *buffer)
387 {
388         static const struct sb_jack {
389                 int unitid;
390                 const char *name;
391         }  jacks_audigy2nx[] = {
392                 {4,  "dig in "},
393                 {7,  "line in"},
394                 {19, "spk out"},
395                 {20, "hph out"},
396                 {-1, NULL}
397         }, jacks_live24ext[] = {
398                 {4,  "line in"}, /* &1=Line, &2=Mic*/
399                 {3,  "hph out"}, /* headphones */
400                 {0,  "RC     "}, /* last command, 6 bytes see rc_config above */
401                 {-1, NULL}
402         };
403         const struct sb_jack *jacks;
404         struct usb_mixer_interface *mixer = entry->private_data;
405         int i, err;
406         u8 buf[3];
407
408         snd_iprintf(buffer, "%s jacks\n\n", mixer->chip->card->shortname);
409         if (mixer->chip->usb_id == USB_ID(0x041e, 0x3020))
410                 jacks = jacks_audigy2nx;
411         else if (mixer->chip->usb_id == USB_ID(0x041e, 0x3040) ||
412                  mixer->chip->usb_id == USB_ID(0x041e, 0x3048))
413                 jacks = jacks_live24ext;
414         else
415                 return;
416
417         for (i = 0; jacks[i].name; ++i) {
418                 snd_iprintf(buffer, "%s: ", jacks[i].name);
419                 down_read(&mixer->chip->shutdown_rwsem);
420                 if (mixer->chip->shutdown)
421                         err = 0;
422                 else
423                         err = snd_usb_ctl_msg(mixer->chip->dev,
424                                       usb_rcvctrlpipe(mixer->chip->dev, 0),
425                                       UAC_GET_MEM, USB_DIR_IN | USB_TYPE_CLASS |
426                                       USB_RECIP_INTERFACE, 0,
427                                       jacks[i].unitid << 8, buf, 3);
428                 up_read(&mixer->chip->shutdown_rwsem);
429                 if (err == 3 && (buf[0] == 3 || buf[0] == 6))
430                         snd_iprintf(buffer, "%02x %02x\n", buf[1], buf[2]);
431                 else
432                         snd_iprintf(buffer, "?\n");
433         }
434 }
435
436 /* EMU0204 */
437 static int snd_emu0204_ch_switch_info(struct snd_kcontrol *kcontrol,
438                                       struct snd_ctl_elem_info *uinfo)
439 {
440         static const char *texts[2] = {"1/2",
441                                        "3/4"
442         };
443
444         uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
445         uinfo->count = 1;
446         uinfo->value.enumerated.items = 2;
447         if (uinfo->value.enumerated.item > 1)
448                 uinfo->value.enumerated.item = 1;
449         strcpy(uinfo->value.enumerated.name,
450                 texts[uinfo->value.enumerated.item]);
451
452         return 0;
453 }
454
455 static int snd_emu0204_ch_switch_get(struct snd_kcontrol *kcontrol,
456                                      struct snd_ctl_elem_value *ucontrol)
457 {
458         ucontrol->value.enumerated.item[0] = kcontrol->private_value;
459         return 0;
460 }
461
462 static int snd_emu0204_ch_switch_put(struct snd_kcontrol *kcontrol,
463                                      struct snd_ctl_elem_value *ucontrol)
464 {
465         struct usb_mixer_interface *mixer = snd_kcontrol_chip(kcontrol);
466         unsigned int value = ucontrol->value.enumerated.item[0];
467         int err, changed;
468         unsigned char buf[2];
469
470         if (value > 1)
471                 return -EINVAL;
472
473         buf[0] = 0x01;
474         buf[1] = value ? 0x02 : 0x01;
475
476         changed = value != kcontrol->private_value;
477         down_read(&mixer->chip->shutdown_rwsem);
478         if (mixer->chip->shutdown) {
479                 err = -ENODEV;
480                 goto out;
481         }
482         err = snd_usb_ctl_msg(mixer->chip->dev,
483                       usb_sndctrlpipe(mixer->chip->dev, 0), UAC_SET_CUR,
484                       USB_RECIP_INTERFACE | USB_TYPE_CLASS | USB_DIR_OUT,
485                       0x0400, 0x0e00, buf, 2);
486  out:
487         up_read(&mixer->chip->shutdown_rwsem);
488         if (err < 0)
489                 return err;
490         kcontrol->private_value = value;
491         return changed;
492 }
493
494
495 static struct snd_kcontrol_new snd_emu0204_controls[] = {
496         {
497                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
498                 .name = "Front Jack Channels",
499                 .info = snd_emu0204_ch_switch_info,
500                 .get = snd_emu0204_ch_switch_get,
501                 .put = snd_emu0204_ch_switch_put,
502                 .private_value = 0,
503         },
504 };
505
506 static int snd_emu0204_controls_create(struct usb_mixer_interface *mixer)
507 {
508         int i, err;
509
510         for (i = 0; i < ARRAY_SIZE(snd_emu0204_controls); ++i) {
511                 err = snd_ctl_add(mixer->chip->card,
512                         snd_ctl_new1(&snd_emu0204_controls[i], mixer));
513                 if (err < 0)
514                         return err;
515         }
516
517         return 0;
518 }
519 /* ASUS Xonar U1 / U3 controls */
520
521 static int snd_xonar_u1_switch_get(struct snd_kcontrol *kcontrol,
522                                    struct snd_ctl_elem_value *ucontrol)
523 {
524         struct usb_mixer_interface *mixer = snd_kcontrol_chip(kcontrol);
525
526         ucontrol->value.integer.value[0] = !!(mixer->xonar_u1_status & 0x02);
527         return 0;
528 }
529
530 static int snd_xonar_u1_switch_put(struct snd_kcontrol *kcontrol,
531                                    struct snd_ctl_elem_value *ucontrol)
532 {
533         struct usb_mixer_interface *mixer = snd_kcontrol_chip(kcontrol);
534         u8 old_status, new_status;
535         int err, changed;
536
537         old_status = mixer->xonar_u1_status;
538         if (ucontrol->value.integer.value[0])
539                 new_status = old_status | 0x02;
540         else
541                 new_status = old_status & ~0x02;
542         changed = new_status != old_status;
543         down_read(&mixer->chip->shutdown_rwsem);
544         if (mixer->chip->shutdown)
545                 err = -ENODEV;
546         else
547                 err = snd_usb_ctl_msg(mixer->chip->dev,
548                               usb_sndctrlpipe(mixer->chip->dev, 0), 0x08,
549                               USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_OTHER,
550                               50, 0, &new_status, 1);
551         up_read(&mixer->chip->shutdown_rwsem);
552         if (err < 0)
553                 return err;
554         mixer->xonar_u1_status = new_status;
555         return changed;
556 }
557
558 static struct snd_kcontrol_new snd_xonar_u1_output_switch = {
559         .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
560         .name = "Digital Playback Switch",
561         .info = snd_ctl_boolean_mono_info,
562         .get = snd_xonar_u1_switch_get,
563         .put = snd_xonar_u1_switch_put,
564 };
565
566 static int snd_xonar_u1_controls_create(struct usb_mixer_interface *mixer)
567 {
568         int err;
569
570         err = snd_ctl_add(mixer->chip->card,
571                           snd_ctl_new1(&snd_xonar_u1_output_switch, mixer));
572         if (err < 0)
573                 return err;
574         mixer->xonar_u1_status = 0x05;
575         return 0;
576 }
577
578 /* Native Instruments device quirks */
579
580 #define _MAKE_NI_CONTROL(bRequest,wIndex) ((bRequest) << 16 | (wIndex))
581
582 static int snd_nativeinstruments_control_get(struct snd_kcontrol *kcontrol,
583                                              struct snd_ctl_elem_value *ucontrol)
584 {
585         struct usb_mixer_interface *mixer = snd_kcontrol_chip(kcontrol);
586         struct usb_device *dev = mixer->chip->dev;
587         u8 bRequest = (kcontrol->private_value >> 16) & 0xff;
588         u16 wIndex = kcontrol->private_value & 0xffff;
589         u8 tmp;
590         int ret;
591
592         down_read(&mixer->chip->shutdown_rwsem);
593         if (mixer->chip->shutdown)
594                 ret = -ENODEV;
595         else
596                 ret = snd_usb_ctl_msg(dev, usb_rcvctrlpipe(dev, 0), bRequest,
597                                   USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_IN,
598                                   0, wIndex,
599                                   &tmp, sizeof(tmp));
600         up_read(&mixer->chip->shutdown_rwsem);
601
602         if (ret < 0) {
603                 dev_err(&dev->dev,
604                         "unable to issue vendor read request (ret = %d)", ret);
605                 return ret;
606         }
607
608         ucontrol->value.integer.value[0] = tmp;
609
610         return 0;
611 }
612
613 static int snd_nativeinstruments_control_put(struct snd_kcontrol *kcontrol,
614                                              struct snd_ctl_elem_value *ucontrol)
615 {
616         struct usb_mixer_interface *mixer = snd_kcontrol_chip(kcontrol);
617         struct usb_device *dev = mixer->chip->dev;
618         u8 bRequest = (kcontrol->private_value >> 16) & 0xff;
619         u16 wIndex = kcontrol->private_value & 0xffff;
620         u16 wValue = ucontrol->value.integer.value[0];
621         int ret;
622
623         down_read(&mixer->chip->shutdown_rwsem);
624         if (mixer->chip->shutdown)
625                 ret = -ENODEV;
626         else
627                 ret = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), bRequest,
628                                   USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_OUT,
629                                   wValue, wIndex,
630                                   NULL, 0, 1000);
631         up_read(&mixer->chip->shutdown_rwsem);
632
633         if (ret < 0) {
634                 dev_err(&dev->dev,
635                         "unable to issue vendor write request (ret = %d)", ret);
636                 return ret;
637         }
638
639         return 0;
640 }
641
642 static struct snd_kcontrol_new snd_nativeinstruments_ta6_mixers[] = {
643         {
644                 .name = "Direct Thru Channel A",
645                 .private_value = _MAKE_NI_CONTROL(0x01, 0x03),
646         },
647         {
648                 .name = "Direct Thru Channel B",
649                 .private_value = _MAKE_NI_CONTROL(0x01, 0x05),
650         },
651         {
652                 .name = "Phono Input Channel A",
653                 .private_value = _MAKE_NI_CONTROL(0x02, 0x03),
654         },
655         {
656                 .name = "Phono Input Channel B",
657                 .private_value = _MAKE_NI_CONTROL(0x02, 0x05),
658         },
659 };
660
661 static struct snd_kcontrol_new snd_nativeinstruments_ta10_mixers[] = {
662         {
663                 .name = "Direct Thru Channel A",
664                 .private_value = _MAKE_NI_CONTROL(0x01, 0x03),
665         },
666         {
667                 .name = "Direct Thru Channel B",
668                 .private_value = _MAKE_NI_CONTROL(0x01, 0x05),
669         },
670         {
671                 .name = "Direct Thru Channel C",
672                 .private_value = _MAKE_NI_CONTROL(0x01, 0x07),
673         },
674         {
675                 .name = "Direct Thru Channel D",
676                 .private_value = _MAKE_NI_CONTROL(0x01, 0x09),
677         },
678         {
679                 .name = "Phono Input Channel A",
680                 .private_value = _MAKE_NI_CONTROL(0x02, 0x03),
681         },
682         {
683                 .name = "Phono Input Channel B",
684                 .private_value = _MAKE_NI_CONTROL(0x02, 0x05),
685         },
686         {
687                 .name = "Phono Input Channel C",
688                 .private_value = _MAKE_NI_CONTROL(0x02, 0x07),
689         },
690         {
691                 .name = "Phono Input Channel D",
692                 .private_value = _MAKE_NI_CONTROL(0x02, 0x09),
693         },
694 };
695
696 static int snd_nativeinstruments_create_mixer(struct usb_mixer_interface *mixer,
697                                               const struct snd_kcontrol_new *kc,
698                                               unsigned int count)
699 {
700         int i, err = 0;
701         struct snd_kcontrol_new template = {
702                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
703                 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
704                 .get = snd_nativeinstruments_control_get,
705                 .put = snd_nativeinstruments_control_put,
706                 .info = snd_ctl_boolean_mono_info,
707         };
708
709         for (i = 0; i < count; i++) {
710                 struct snd_kcontrol *c;
711
712                 template.name = kc[i].name;
713                 template.private_value = kc[i].private_value;
714
715                 c = snd_ctl_new1(&template, mixer);
716                 err = snd_ctl_add(mixer->chip->card, c);
717
718                 if (err < 0)
719                         break;
720         }
721
722         return err;
723 }
724
725 /* M-Audio FastTrack Ultra quirks */
726 /* FTU Effect switch (also used by C400/C600) */
727 struct snd_ftu_eff_switch_priv_val {
728         struct usb_mixer_interface *mixer;
729         int cached_value;
730         int is_cached;
731         int bUnitID;
732         int validx;
733 };
734
735 static int snd_ftu_eff_switch_info(struct snd_kcontrol *kcontrol,
736                                         struct snd_ctl_elem_info *uinfo)
737 {
738         static const char *texts[8] = {"Room 1",
739                                        "Room 2",
740                                        "Room 3",
741                                        "Hall 1",
742                                        "Hall 2",
743                                        "Plate",
744                                        "Delay",
745                                        "Echo"
746         };
747
748         uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
749         uinfo->count = 1;
750         uinfo->value.enumerated.items = 8;
751         if (uinfo->value.enumerated.item > 7)
752                 uinfo->value.enumerated.item = 7;
753         strcpy(uinfo->value.enumerated.name,
754                 texts[uinfo->value.enumerated.item]);
755
756         return 0;
757 }
758
759 static int snd_ftu_eff_switch_get(struct snd_kcontrol *kctl,
760                                         struct snd_ctl_elem_value *ucontrol)
761 {
762         struct snd_usb_audio *chip;
763         struct usb_mixer_interface *mixer;
764         struct snd_ftu_eff_switch_priv_val *pval;
765         int err;
766         unsigned char value[2];
767         int id, validx;
768
769         const int val_len = 2;
770
771         value[0] = 0x00;
772         value[1] = 0x00;
773
774         pval = (struct snd_ftu_eff_switch_priv_val *)
775                 kctl->private_value;
776
777         if (pval->is_cached) {
778                 ucontrol->value.enumerated.item[0] = pval->cached_value;
779                 return 0;
780         }
781
782         mixer = (struct usb_mixer_interface *) pval->mixer;
783         if (snd_BUG_ON(!mixer))
784                 return -EINVAL;
785
786         chip = (struct snd_usb_audio *) mixer->chip;
787         if (snd_BUG_ON(!chip))
788                 return -EINVAL;
789
790         id = pval->bUnitID;
791         validx = pval->validx;
792
793         down_read(&mixer->chip->shutdown_rwsem);
794         if (mixer->chip->shutdown)
795                 err = -ENODEV;
796         else
797                 err = snd_usb_ctl_msg(chip->dev,
798                         usb_rcvctrlpipe(chip->dev, 0), UAC_GET_CUR,
799                         USB_RECIP_INTERFACE | USB_TYPE_CLASS | USB_DIR_IN,
800                         validx << 8, snd_usb_ctrl_intf(chip) | (id << 8),
801                         value, val_len);
802         up_read(&mixer->chip->shutdown_rwsem);
803         if (err < 0)
804                 return err;
805
806         ucontrol->value.enumerated.item[0] = value[0];
807         pval->cached_value = value[0];
808         pval->is_cached = 1;
809
810         return 0;
811 }
812
813 static int snd_ftu_eff_switch_put(struct snd_kcontrol *kctl,
814                                         struct snd_ctl_elem_value *ucontrol)
815 {
816         struct snd_usb_audio *chip;
817         struct snd_ftu_eff_switch_priv_val *pval;
818
819         struct usb_mixer_interface *mixer;
820         int changed, cur_val, err, new_val;
821         unsigned char value[2];
822         int id, validx;
823
824         const int val_len = 2;
825
826         changed = 0;
827
828         pval = (struct snd_ftu_eff_switch_priv_val *)
829                 kctl->private_value;
830         cur_val = pval->cached_value;
831         new_val = ucontrol->value.enumerated.item[0];
832
833         mixer = (struct usb_mixer_interface *) pval->mixer;
834         if (snd_BUG_ON(!mixer))
835                 return -EINVAL;
836
837         chip = (struct snd_usb_audio *) mixer->chip;
838         if (snd_BUG_ON(!chip))
839                 return -EINVAL;
840
841         id = pval->bUnitID;
842         validx = pval->validx;
843
844         if (!pval->is_cached) {
845                 /* Read current value */
846                 down_read(&mixer->chip->shutdown_rwsem);
847                 if (mixer->chip->shutdown)
848                         err = -ENODEV;
849                 else
850                         err = snd_usb_ctl_msg(chip->dev,
851                                 usb_rcvctrlpipe(chip->dev, 0), UAC_GET_CUR,
852                                 USB_RECIP_INTERFACE | USB_TYPE_CLASS | USB_DIR_IN,
853                                 validx << 8, snd_usb_ctrl_intf(chip) | (id << 8),
854                                 value, val_len);
855                 up_read(&mixer->chip->shutdown_rwsem);
856                 if (err < 0)
857                         return err;
858
859                 cur_val = value[0];
860                 pval->cached_value = cur_val;
861                 pval->is_cached = 1;
862         }
863         /* update value if needed */
864         if (cur_val != new_val) {
865                 value[0] = new_val;
866                 value[1] = 0;
867                 down_read(&mixer->chip->shutdown_rwsem);
868                 if (mixer->chip->shutdown)
869                         err = -ENODEV;
870                 else
871                         err = snd_usb_ctl_msg(chip->dev,
872                                 usb_sndctrlpipe(chip->dev, 0), UAC_SET_CUR,
873                                 USB_RECIP_INTERFACE | USB_TYPE_CLASS | USB_DIR_OUT,
874                                 validx << 8, snd_usb_ctrl_intf(chip) | (id << 8),
875                                 value, val_len);
876                 up_read(&mixer->chip->shutdown_rwsem);
877                 if (err < 0)
878                         return err;
879
880                 pval->cached_value = new_val;
881                 pval->is_cached = 1;
882                 changed = 1;
883         }
884
885         return changed;
886 }
887
888 static void kctl_private_value_free(struct snd_kcontrol *kctl)
889 {
890         kfree((void *)kctl->private_value);
891 }
892
893 static int snd_ftu_create_effect_switch(struct usb_mixer_interface *mixer,
894         int validx, int bUnitID)
895 {
896         static struct snd_kcontrol_new template = {
897                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
898                 .name = "Effect Program Switch",
899                 .index = 0,
900                 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
901                 .info = snd_ftu_eff_switch_info,
902                 .get = snd_ftu_eff_switch_get,
903                 .put = snd_ftu_eff_switch_put
904         };
905
906         int err;
907         struct snd_kcontrol *kctl;
908         struct snd_ftu_eff_switch_priv_val *pval;
909
910         pval = kzalloc(sizeof(*pval), GFP_KERNEL);
911         if (!pval)
912                 return -ENOMEM;
913
914         pval->cached_value = 0;
915         pval->is_cached = 0;
916         pval->mixer = mixer;
917         pval->bUnitID = bUnitID;
918         pval->validx = validx;
919
920         template.private_value = (unsigned long) pval;
921         kctl = snd_ctl_new1(&template, mixer->chip);
922         if (!kctl) {
923                 kfree(pval);
924                 return -ENOMEM;
925         }
926
927         kctl->private_free = kctl_private_value_free;
928         err = snd_ctl_add(mixer->chip->card, kctl);
929         if (err < 0)
930                 return err;
931
932         return 0;
933 }
934
935 /* Create volume controls for FTU devices*/
936 static int snd_ftu_create_volume_ctls(struct usb_mixer_interface *mixer)
937 {
938         char name[64];
939         unsigned int control, cmask;
940         int in, out, err;
941
942         const unsigned int id = 5;
943         const int val_type = USB_MIXER_S16;
944
945         for (out = 0; out < 8; out++) {
946                 control = out + 1;
947                 for (in = 0; in < 8; in++) {
948                         cmask = 1 << in;
949                         snprintf(name, sizeof(name),
950                                 "AIn%d - Out%d Capture Volume",
951                                 in  + 1, out + 1);
952                         err = snd_create_std_mono_ctl(mixer, id, control,
953                                                         cmask, val_type, name,
954                                                         &snd_usb_mixer_vol_tlv);
955                         if (err < 0)
956                                 return err;
957                 }
958                 for (in = 8; in < 16; in++) {
959                         cmask = 1 << in;
960                         snprintf(name, sizeof(name),
961                                 "DIn%d - Out%d Playback Volume",
962                                 in - 7, out + 1);
963                         err = snd_create_std_mono_ctl(mixer, id, control,
964                                                         cmask, val_type, name,
965                                                         &snd_usb_mixer_vol_tlv);
966                         if (err < 0)
967                                 return err;
968                 }
969         }
970
971         return 0;
972 }
973
974 /* This control needs a volume quirk, see mixer.c */
975 static int snd_ftu_create_effect_volume_ctl(struct usb_mixer_interface *mixer)
976 {
977         static const char name[] = "Effect Volume";
978         const unsigned int id = 6;
979         const int val_type = USB_MIXER_U8;
980         const unsigned int control = 2;
981         const unsigned int cmask = 0;
982
983         return snd_create_std_mono_ctl(mixer, id, control, cmask, val_type,
984                                         name, snd_usb_mixer_vol_tlv);
985 }
986
987 /* This control needs a volume quirk, see mixer.c */
988 static int snd_ftu_create_effect_duration_ctl(struct usb_mixer_interface *mixer)
989 {
990         static const char name[] = "Effect Duration";
991         const unsigned int id = 6;
992         const int val_type = USB_MIXER_S16;
993         const unsigned int control = 3;
994         const unsigned int cmask = 0;
995
996         return snd_create_std_mono_ctl(mixer, id, control, cmask, val_type,
997                                         name, snd_usb_mixer_vol_tlv);
998 }
999
1000 /* This control needs a volume quirk, see mixer.c */
1001 static int snd_ftu_create_effect_feedback_ctl(struct usb_mixer_interface *mixer)
1002 {
1003         static const char name[] = "Effect Feedback Volume";
1004         const unsigned int id = 6;
1005         const int val_type = USB_MIXER_U8;
1006         const unsigned int control = 4;
1007         const unsigned int cmask = 0;
1008
1009         return snd_create_std_mono_ctl(mixer, id, control, cmask, val_type,
1010                                         name, NULL);
1011 }
1012
1013 static int snd_ftu_create_effect_return_ctls(struct usb_mixer_interface *mixer)
1014 {
1015         unsigned int cmask;
1016         int err, ch;
1017         char name[48];
1018
1019         const unsigned int id = 7;
1020         const int val_type = USB_MIXER_S16;
1021         const unsigned int control = 7;
1022
1023         for (ch = 0; ch < 4; ++ch) {
1024                 cmask = 1 << ch;
1025                 snprintf(name, sizeof(name),
1026                         "Effect Return %d Volume", ch + 1);
1027                 err = snd_create_std_mono_ctl(mixer, id, control,
1028                                                 cmask, val_type, name,
1029                                                 snd_usb_mixer_vol_tlv);
1030                 if (err < 0)
1031                         return err;
1032         }
1033
1034         return 0;
1035 }
1036
1037 static int snd_ftu_create_effect_send_ctls(struct usb_mixer_interface *mixer)
1038 {
1039         unsigned int  cmask;
1040         int err, ch;
1041         char name[48];
1042
1043         const unsigned int id = 5;
1044         const int val_type = USB_MIXER_S16;
1045         const unsigned int control = 9;
1046
1047         for (ch = 0; ch < 8; ++ch) {
1048                 cmask = 1 << ch;
1049                 snprintf(name, sizeof(name),
1050                         "Effect Send AIn%d Volume", ch + 1);
1051                 err = snd_create_std_mono_ctl(mixer, id, control, cmask,
1052                                                 val_type, name,
1053                                                 snd_usb_mixer_vol_tlv);
1054                 if (err < 0)
1055                         return err;
1056         }
1057         for (ch = 8; ch < 16; ++ch) {
1058                 cmask = 1 << ch;
1059                 snprintf(name, sizeof(name),
1060                         "Effect Send DIn%d Volume", ch - 7);
1061                 err = snd_create_std_mono_ctl(mixer, id, control, cmask,
1062                                                 val_type, name,
1063                                                 snd_usb_mixer_vol_tlv);
1064                 if (err < 0)
1065                         return err;
1066         }
1067         return 0;
1068 }
1069
1070 static int snd_ftu_create_mixer(struct usb_mixer_interface *mixer)
1071 {
1072         int err;
1073
1074         err = snd_ftu_create_volume_ctls(mixer);
1075         if (err < 0)
1076                 return err;
1077
1078         err = snd_ftu_create_effect_switch(mixer, 1, 6);
1079         if (err < 0)
1080                 return err;
1081
1082         err = snd_ftu_create_effect_volume_ctl(mixer);
1083         if (err < 0)
1084                 return err;
1085
1086         err = snd_ftu_create_effect_duration_ctl(mixer);
1087         if (err < 0)
1088                 return err;
1089
1090         err = snd_ftu_create_effect_feedback_ctl(mixer);
1091         if (err < 0)
1092                 return err;
1093
1094         err = snd_ftu_create_effect_return_ctls(mixer);
1095         if (err < 0)
1096                 return err;
1097
1098         err = snd_ftu_create_effect_send_ctls(mixer);
1099         if (err < 0)
1100                 return err;
1101
1102         return 0;
1103 }
1104
1105 void snd_emuusb_set_samplerate(struct snd_usb_audio *chip,
1106                                unsigned char samplerate_id)
1107 {
1108         struct usb_mixer_interface *mixer;
1109         struct usb_mixer_elem_info *cval;
1110         int unitid = 12; /* SamleRate ExtensionUnit ID */
1111
1112         list_for_each_entry(mixer, &chip->mixer_list, list) {
1113                 cval = mixer->id_elems[unitid];
1114                 if (cval) {
1115                         snd_usb_mixer_set_ctl_value(cval, UAC_SET_CUR,
1116                                                     cval->control << 8,
1117                                                     samplerate_id);
1118                         snd_usb_mixer_notify_id(mixer, unitid);
1119                 }
1120                 break;
1121         }
1122 }
1123
1124 /* M-Audio Fast Track C400/C600 */
1125 /* C400/C600 volume controls, this control needs a volume quirk, see mixer.c */
1126 static int snd_c400_create_vol_ctls(struct usb_mixer_interface *mixer)
1127 {
1128         char name[64];
1129         unsigned int cmask, offset;
1130         int out, chan, err;
1131         int num_outs = 0;
1132         int num_ins = 0;
1133
1134         const unsigned int id = 0x40;
1135         const int val_type = USB_MIXER_S16;
1136         const int control = 1;
1137
1138         switch (mixer->chip->usb_id) {
1139         case USB_ID(0x0763, 0x2030):
1140                 num_outs = 6;
1141                 num_ins = 4;
1142                 break;
1143         case USB_ID(0x0763, 0x2031):
1144                 num_outs = 8;
1145                 num_ins = 6;
1146                 break;
1147         }
1148
1149         for (chan = 0; chan < num_outs + num_ins; chan++) {
1150                 for (out = 0; out < num_outs; out++) {
1151                         if (chan < num_outs) {
1152                                 snprintf(name, sizeof(name),
1153                                         "PCM%d-Out%d Playback Volume",
1154                                         chan + 1, out + 1);
1155                         } else {
1156                                 snprintf(name, sizeof(name),
1157                                         "In%d-Out%d Playback Volume",
1158                                         chan - num_outs + 1, out + 1);
1159                         }
1160
1161                         cmask = (out == 0) ? 0 : 1 << (out - 1);
1162                         offset = chan * num_outs;
1163                         err = snd_create_std_mono_ctl_offset(mixer, id, control,
1164                                                 cmask, val_type, offset, name,
1165                                                 &snd_usb_mixer_vol_tlv);
1166                         if (err < 0)
1167                                 return err;
1168                 }
1169         }
1170
1171         return 0;
1172 }
1173
1174 /* This control needs a volume quirk, see mixer.c */
1175 static int snd_c400_create_effect_volume_ctl(struct usb_mixer_interface *mixer)
1176 {
1177         static const char name[] = "Effect Volume";
1178         const unsigned int id = 0x43;
1179         const int val_type = USB_MIXER_U8;
1180         const unsigned int control = 3;
1181         const unsigned int cmask = 0;
1182
1183         return snd_create_std_mono_ctl(mixer, id, control, cmask, val_type,
1184                                         name, snd_usb_mixer_vol_tlv);
1185 }
1186
1187 /* This control needs a volume quirk, see mixer.c */
1188 static int snd_c400_create_effect_duration_ctl(struct usb_mixer_interface *mixer)
1189 {
1190         static const char name[] = "Effect Duration";
1191         const unsigned int id = 0x43;
1192         const int val_type = USB_MIXER_S16;
1193         const unsigned int control = 4;
1194         const unsigned int cmask = 0;
1195
1196         return snd_create_std_mono_ctl(mixer, id, control, cmask, val_type,
1197                                         name, snd_usb_mixer_vol_tlv);
1198 }
1199
1200 /* This control needs a volume quirk, see mixer.c */
1201 static int snd_c400_create_effect_feedback_ctl(struct usb_mixer_interface *mixer)
1202 {
1203         static const char name[] = "Effect Feedback Volume";
1204         const unsigned int id = 0x43;
1205         const int val_type = USB_MIXER_U8;
1206         const unsigned int control = 5;
1207         const unsigned int cmask = 0;
1208
1209         return snd_create_std_mono_ctl(mixer, id, control, cmask, val_type,
1210                                         name, NULL);
1211 }
1212
1213 static int snd_c400_create_effect_vol_ctls(struct usb_mixer_interface *mixer)
1214 {
1215         char name[64];
1216         unsigned int cmask;
1217         int chan, err;
1218         int num_outs = 0;
1219         int num_ins = 0;
1220
1221         const unsigned int id = 0x42;
1222         const int val_type = USB_MIXER_S16;
1223         const int control = 1;
1224
1225         switch (mixer->chip->usb_id) {
1226         case USB_ID(0x0763, 0x2030):
1227                 num_outs = 6;
1228                 num_ins = 4;
1229                 break;
1230         case USB_ID(0x0763, 0x2031):
1231                 num_outs = 8;
1232                 num_ins = 6;
1233                 break;
1234         }
1235
1236         for (chan = 0; chan < num_outs + num_ins; chan++) {
1237                 if (chan < num_outs) {
1238                         snprintf(name, sizeof(name),
1239                                 "Effect Send DOut%d",
1240                                 chan + 1);
1241                 } else {
1242                         snprintf(name, sizeof(name),
1243                                 "Effect Send AIn%d",
1244                                 chan - num_outs + 1);
1245                 }
1246
1247                 cmask = (chan == 0) ? 0 : 1 << (chan - 1);
1248                 err = snd_create_std_mono_ctl(mixer, id, control,
1249                                                 cmask, val_type, name,
1250                                                 &snd_usb_mixer_vol_tlv);
1251                 if (err < 0)
1252                         return err;
1253         }
1254
1255         return 0;
1256 }
1257
1258 static int snd_c400_create_effect_ret_vol_ctls(struct usb_mixer_interface *mixer)
1259 {
1260         char name[64];
1261         unsigned int cmask;
1262         int chan, err;
1263         int num_outs = 0;
1264         int offset = 0;
1265
1266         const unsigned int id = 0x40;
1267         const int val_type = USB_MIXER_S16;
1268         const int control = 1;
1269
1270         switch (mixer->chip->usb_id) {
1271         case USB_ID(0x0763, 0x2030):
1272                 num_outs = 6;
1273                 offset = 0x3c;
1274                 /* { 0x3c, 0x43, 0x3e, 0x45, 0x40, 0x47 } */
1275                 break;
1276         case USB_ID(0x0763, 0x2031):
1277                 num_outs = 8;
1278                 offset = 0x70;
1279                 /* { 0x70, 0x79, 0x72, 0x7b, 0x74, 0x7d, 0x76, 0x7f } */
1280                 break;
1281         }
1282
1283         for (chan = 0; chan < num_outs; chan++) {
1284                 snprintf(name, sizeof(name),
1285                         "Effect Return %d",
1286                         chan + 1);
1287
1288                 cmask = (chan == 0) ? 0 :
1289                         1 << (chan + (chan % 2) * num_outs - 1);
1290                 err = snd_create_std_mono_ctl_offset(mixer, id, control,
1291                                                 cmask, val_type, offset, name,
1292                                                 &snd_usb_mixer_vol_tlv);
1293                 if (err < 0)
1294                         return err;
1295         }
1296
1297         return 0;
1298 }
1299
1300 static int snd_c400_create_mixer(struct usb_mixer_interface *mixer)
1301 {
1302         int err;
1303
1304         err = snd_c400_create_vol_ctls(mixer);
1305         if (err < 0)
1306                 return err;
1307
1308         err = snd_c400_create_effect_vol_ctls(mixer);
1309         if (err < 0)
1310                 return err;
1311
1312         err = snd_c400_create_effect_ret_vol_ctls(mixer);
1313         if (err < 0)
1314                 return err;
1315
1316         err = snd_ftu_create_effect_switch(mixer, 2, 0x43);
1317         if (err < 0)
1318                 return err;
1319
1320         err = snd_c400_create_effect_volume_ctl(mixer);
1321         if (err < 0)
1322                 return err;
1323
1324         err = snd_c400_create_effect_duration_ctl(mixer);
1325         if (err < 0)
1326                 return err;
1327
1328         err = snd_c400_create_effect_feedback_ctl(mixer);
1329         if (err < 0)
1330                 return err;
1331
1332         return 0;
1333 }
1334
1335 /*
1336  * The mixer units for Ebox-44 are corrupt, and even where they
1337  * are valid they presents mono controls as L and R channels of
1338  * stereo. So we provide a good mixer here.
1339  */
1340 static struct std_mono_table ebox44_table[] = {
1341         {
1342                 .unitid = 4,
1343                 .control = 1,
1344                 .cmask = 0x0,
1345                 .val_type = USB_MIXER_INV_BOOLEAN,
1346                 .name = "Headphone Playback Switch"
1347         },
1348         {
1349                 .unitid = 4,
1350                 .control = 2,
1351                 .cmask = 0x1,
1352                 .val_type = USB_MIXER_S16,
1353                 .name = "Headphone A Mix Playback Volume"
1354         },
1355         {
1356                 .unitid = 4,
1357                 .control = 2,
1358                 .cmask = 0x2,
1359                 .val_type = USB_MIXER_S16,
1360                 .name = "Headphone B Mix Playback Volume"
1361         },
1362
1363         {
1364                 .unitid = 7,
1365                 .control = 1,
1366                 .cmask = 0x0,
1367                 .val_type = USB_MIXER_INV_BOOLEAN,
1368                 .name = "Output Playback Switch"
1369         },
1370         {
1371                 .unitid = 7,
1372                 .control = 2,
1373                 .cmask = 0x1,
1374                 .val_type = USB_MIXER_S16,
1375                 .name = "Output A Playback Volume"
1376         },
1377         {
1378                 .unitid = 7,
1379                 .control = 2,
1380                 .cmask = 0x2,
1381                 .val_type = USB_MIXER_S16,
1382                 .name = "Output B Playback Volume"
1383         },
1384
1385         {
1386                 .unitid = 10,
1387                 .control = 1,
1388                 .cmask = 0x0,
1389                 .val_type = USB_MIXER_INV_BOOLEAN,
1390                 .name = "Input Capture Switch"
1391         },
1392         {
1393                 .unitid = 10,
1394                 .control = 2,
1395                 .cmask = 0x1,
1396                 .val_type = USB_MIXER_S16,
1397                 .name = "Input A Capture Volume"
1398         },
1399         {
1400                 .unitid = 10,
1401                 .control = 2,
1402                 .cmask = 0x2,
1403                 .val_type = USB_MIXER_S16,
1404                 .name = "Input B Capture Volume"
1405         },
1406
1407         {}
1408 };
1409
1410 /* Audio Advantage Micro II findings:
1411  *
1412  * Mapping spdif AES bits to vendor register.bit:
1413  * AES0: [0 0 0 0 2.3 2.2 2.1 2.0] - default 0x00
1414  * AES1: [3.3 3.2.3.1.3.0 2.7 2.6 2.5 2.4] - default: 0x01
1415  * AES2: [0 0 0 0 0 0 0 0]
1416  * AES3: [0 0 0 0 0 0 x 0] - 'x' bit is set basing on standard usb request
1417  *                           (UAC_EP_CS_ATTR_SAMPLE_RATE) for Audio Devices
1418  *
1419  * power on values:
1420  * r2: 0x10
1421  * r3: 0x20 (b7 is zeroed just before playback (except IEC61937) and set
1422  *           just after it to 0xa0, presumably it disables/mutes some analog
1423  *           parts when there is no audio.)
1424  * r9: 0x28
1425  *
1426  * Optical transmitter on/off:
1427  * vendor register.bit: 9.1
1428  * 0 - on (0x28 register value)
1429  * 1 - off (0x2a register value)
1430  *
1431  */
1432 static int snd_microii_spdif_info(struct snd_kcontrol *kcontrol,
1433         struct snd_ctl_elem_info *uinfo)
1434 {
1435         uinfo->type = SNDRV_CTL_ELEM_TYPE_IEC958;
1436         uinfo->count = 1;
1437         return 0;
1438 }
1439
1440 static int snd_microii_spdif_default_get(struct snd_kcontrol *kcontrol,
1441         struct snd_ctl_elem_value *ucontrol)
1442 {
1443         struct usb_mixer_interface *mixer = snd_kcontrol_chip(kcontrol);
1444         int err;
1445         struct usb_interface *iface;
1446         struct usb_host_interface *alts;
1447         unsigned int ep;
1448         unsigned char data[3];
1449         int rate;
1450
1451         ucontrol->value.iec958.status[0] = kcontrol->private_value & 0xff;
1452         ucontrol->value.iec958.status[1] = (kcontrol->private_value >> 8) & 0xff;
1453         ucontrol->value.iec958.status[2] = 0x00;
1454
1455         /* use known values for that card: interface#1 altsetting#1 */
1456         iface = usb_ifnum_to_if(mixer->chip->dev, 1);
1457         alts = &iface->altsetting[1];
1458         ep = get_endpoint(alts, 0)->bEndpointAddress;
1459
1460         err = snd_usb_ctl_msg(mixer->chip->dev,
1461                         usb_rcvctrlpipe(mixer->chip->dev, 0),
1462                         UAC_GET_CUR,
1463                         USB_TYPE_CLASS | USB_RECIP_ENDPOINT | USB_DIR_IN,
1464                         UAC_EP_CS_ATTR_SAMPLE_RATE << 8,
1465                         ep,
1466                         data,
1467                         sizeof(data));
1468         if (err < 0)
1469                 goto end;
1470
1471         rate = data[0] | (data[1] << 8) | (data[2] << 16);
1472         ucontrol->value.iec958.status[3] = (rate == 48000) ?
1473                         IEC958_AES3_CON_FS_48000 : IEC958_AES3_CON_FS_44100;
1474
1475         err = 0;
1476 end:
1477         return err;
1478 }
1479
1480 static int snd_microii_spdif_default_put(struct snd_kcontrol *kcontrol,
1481         struct snd_ctl_elem_value *ucontrol)
1482 {
1483         struct usb_mixer_interface *mixer = snd_kcontrol_chip(kcontrol);
1484         int err;
1485         u8 reg;
1486         unsigned long priv_backup = kcontrol->private_value;
1487
1488         reg = ((ucontrol->value.iec958.status[1] & 0x0f) << 4) |
1489                         (ucontrol->value.iec958.status[0] & 0x0f);
1490         err = snd_usb_ctl_msg(mixer->chip->dev,
1491                         usb_sndctrlpipe(mixer->chip->dev, 0),
1492                         UAC_SET_CUR,
1493                         USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_OTHER,
1494                         reg,
1495                         2,
1496                         NULL,
1497                         0);
1498         if (err < 0)
1499                 goto end;
1500
1501         kcontrol->private_value &= 0xfffff0f0;
1502         kcontrol->private_value |= (ucontrol->value.iec958.status[1] & 0x0f) << 8;
1503         kcontrol->private_value |= (ucontrol->value.iec958.status[0] & 0x0f);
1504
1505         reg = (ucontrol->value.iec958.status[0] & IEC958_AES0_NONAUDIO) ?
1506                         0xa0 : 0x20;
1507         reg |= (ucontrol->value.iec958.status[1] >> 4) & 0x0f;
1508         err = snd_usb_ctl_msg(mixer->chip->dev,
1509                         usb_sndctrlpipe(mixer->chip->dev, 0),
1510                         UAC_SET_CUR,
1511                         USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_OTHER,
1512                         reg,
1513                         3,
1514                         NULL,
1515                         0);
1516         if (err < 0)
1517                 goto end;
1518
1519         kcontrol->private_value &= 0xffff0fff;
1520         kcontrol->private_value |= (ucontrol->value.iec958.status[1] & 0xf0) << 8;
1521
1522         /* The frequency bits in AES3 cannot be set via register access. */
1523
1524         /* Silently ignore any bits from the request that cannot be set. */
1525
1526         err = (priv_backup != kcontrol->private_value);
1527 end:
1528         return err;
1529 }
1530
1531 static int snd_microii_spdif_mask_get(struct snd_kcontrol *kcontrol,
1532         struct snd_ctl_elem_value *ucontrol)
1533 {
1534         ucontrol->value.iec958.status[0] = 0x0f;
1535         ucontrol->value.iec958.status[1] = 0xff;
1536         ucontrol->value.iec958.status[2] = 0x00;
1537         ucontrol->value.iec958.status[3] = 0x00;
1538
1539         return 0;
1540 }
1541
1542 static int snd_microii_spdif_switch_get(struct snd_kcontrol *kcontrol,
1543         struct snd_ctl_elem_value *ucontrol)
1544 {
1545         ucontrol->value.integer.value[0] = !(kcontrol->private_value & 0x02);
1546
1547         return 0;
1548 }
1549
1550 static int snd_microii_spdif_switch_put(struct snd_kcontrol *kcontrol,
1551         struct snd_ctl_elem_value *ucontrol)
1552 {
1553         struct usb_mixer_interface *mixer = snd_kcontrol_chip(kcontrol);
1554         int err;
1555         u8 reg = ucontrol->value.integer.value[0] ? 0x28 : 0x2a;
1556
1557         err = snd_usb_ctl_msg(mixer->chip->dev,
1558                         usb_sndctrlpipe(mixer->chip->dev, 0),
1559                         UAC_SET_CUR,
1560                         USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_OTHER,
1561                         reg,
1562                         9,
1563                         NULL,
1564                         0);
1565
1566         if (!err) {
1567                 err = (reg != (kcontrol->private_value & 0x0ff));
1568                 if (err)
1569                         kcontrol->private_value = reg;
1570         }
1571
1572         return err;
1573 }
1574
1575 static struct snd_kcontrol_new snd_microii_mixer_spdif[] = {
1576         {
1577                 .iface =    SNDRV_CTL_ELEM_IFACE_PCM,
1578                 .name =     SNDRV_CTL_NAME_IEC958("", PLAYBACK, DEFAULT),
1579                 .info =     snd_microii_spdif_info,
1580                 .get =      snd_microii_spdif_default_get,
1581                 .put =      snd_microii_spdif_default_put,
1582                 .private_value = 0x00000100UL,/* reset value */
1583         },
1584         {
1585                 .access =   SNDRV_CTL_ELEM_ACCESS_READ,
1586                 .iface =    SNDRV_CTL_ELEM_IFACE_PCM,
1587                 .name =     SNDRV_CTL_NAME_IEC958("", PLAYBACK, MASK),
1588                 .info =     snd_microii_spdif_info,
1589                 .get =      snd_microii_spdif_mask_get,
1590         },
1591         {
1592                 .iface =    SNDRV_CTL_ELEM_IFACE_MIXER,
1593                 .name =     SNDRV_CTL_NAME_IEC958("", PLAYBACK, SWITCH),
1594                 .info =     snd_ctl_boolean_mono_info,
1595                 .get =      snd_microii_spdif_switch_get,
1596                 .put =      snd_microii_spdif_switch_put,
1597                 .private_value = 0x00000028UL,/* reset value */
1598         }
1599 };
1600
1601 static int snd_microii_controls_create(struct usb_mixer_interface *mixer)
1602 {
1603         int err, i;
1604
1605         for (i = 0; i < ARRAY_SIZE(snd_microii_mixer_spdif); ++i) {
1606                 err = snd_ctl_add(mixer->chip->card,
1607                         snd_ctl_new1(&snd_microii_mixer_spdif[i], mixer));
1608                 if (err < 0)
1609                         return err;
1610         }
1611
1612         return 0;
1613 }
1614
1615 int snd_usb_mixer_apply_create_quirk(struct usb_mixer_interface *mixer)
1616 {
1617         int err = 0;
1618         struct snd_info_entry *entry;
1619
1620         if ((err = snd_usb_soundblaster_remote_init(mixer)) < 0)
1621                 return err;
1622
1623         switch (mixer->chip->usb_id) {
1624         case USB_ID(0x041e, 0x3020):
1625         case USB_ID(0x041e, 0x3040):
1626         case USB_ID(0x041e, 0x3042):
1627         case USB_ID(0x041e, 0x30df):
1628         case USB_ID(0x041e, 0x3048):
1629                 err = snd_audigy2nx_controls_create(mixer);
1630                 if (err < 0)
1631                         break;
1632                 if (!snd_card_proc_new(mixer->chip->card, "audigy2nx", &entry))
1633                         snd_info_set_text_ops(entry, mixer,
1634                                               snd_audigy2nx_proc_read);
1635                 break;
1636
1637         /* EMU0204 */
1638         case USB_ID(0x041e, 0x3f19):
1639                 err = snd_emu0204_controls_create(mixer);
1640                 if (err < 0)
1641                         break;
1642                 break;
1643
1644         case USB_ID(0x0763, 0x2030): /* M-Audio Fast Track C400 */
1645         case USB_ID(0x0763, 0x2031): /* M-Audio Fast Track C400 */
1646                 err = snd_c400_create_mixer(mixer);
1647                 break;
1648
1649         case USB_ID(0x0763, 0x2080): /* M-Audio Fast Track Ultra */
1650         case USB_ID(0x0763, 0x2081): /* M-Audio Fast Track Ultra 8R */
1651                 err = snd_ftu_create_mixer(mixer);
1652                 break;
1653
1654         case USB_ID(0x0b05, 0x1739): /* ASUS Xonar U1 */
1655         case USB_ID(0x0b05, 0x1743): /* ASUS Xonar U1 (2) */
1656         case USB_ID(0x0b05, 0x17a0): /* ASUS Xonar U3 */
1657                 err = snd_xonar_u1_controls_create(mixer);
1658                 break;
1659
1660         case USB_ID(0x0d8c, 0x0103): /* Audio Advantage Micro II */
1661                 err = snd_microii_controls_create(mixer);
1662                 break;
1663
1664         case USB_ID(0x17cc, 0x1011): /* Traktor Audio 6 */
1665                 err = snd_nativeinstruments_create_mixer(mixer,
1666                                 snd_nativeinstruments_ta6_mixers,
1667                                 ARRAY_SIZE(snd_nativeinstruments_ta6_mixers));
1668                 break;
1669
1670         case USB_ID(0x17cc, 0x1021): /* Traktor Audio 10 */
1671                 err = snd_nativeinstruments_create_mixer(mixer,
1672                                 snd_nativeinstruments_ta10_mixers,
1673                                 ARRAY_SIZE(snd_nativeinstruments_ta10_mixers));
1674                 break;
1675
1676         case USB_ID(0x200c, 0x1018): /* Electrix Ebox-44 */
1677                 /* detection is disabled in mixer_maps.c */
1678                 err = snd_create_std_mono_table(mixer, ebox44_table);
1679                 break;
1680         }
1681
1682         return err;
1683 }
1684
1685 void snd_usb_mixer_rc_memory_change(struct usb_mixer_interface *mixer,
1686                                     int unitid)
1687 {
1688         if (!mixer->rc_cfg)
1689                 return;
1690         /* unit ids specific to Extigy/Audigy 2 NX: */
1691         switch (unitid) {
1692         case 0: /* remote control */
1693                 mixer->rc_urb->dev = mixer->chip->dev;
1694                 usb_submit_urb(mixer->rc_urb, GFP_ATOMIC);
1695                 break;
1696         case 4: /* digital in jack */
1697         case 7: /* line in jacks */
1698         case 19: /* speaker out jacks */
1699         case 20: /* headphones out jack */
1700                 break;
1701         /* live24ext: 4 = line-in jack */
1702         case 3: /* hp-out jack (may actuate Mute) */
1703                 if (mixer->chip->usb_id == USB_ID(0x041e, 0x3040) ||
1704                     mixer->chip->usb_id == USB_ID(0x041e, 0x3048))
1705                         snd_usb_mixer_notify_id(mixer, mixer->rc_cfg->mute_mixer_id);
1706                 break;
1707         default:
1708                 usb_audio_dbg(mixer->chip, "memory change in unknown unit %d\n", unitid);
1709                 break;
1710         }
1711 }
1712