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