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