• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /asuswrt-rt-n18u-9.0.0.4.380.2695/release/src-rt-6.x.4708/linux/linux-2.6.36/sound/pci/emu10k1/
1/*
2 *  Copyright (c) by Jaroslav Kysela <perex@perex.cz>,
3 *                   Takashi Iwai <tiwai@suse.de>
4 *                   Creative Labs, Inc.
5 *  Routines for control of EMU10K1 chips / mixer routines
6 *  Multichannel PCM support Copyright (c) Lee Revell <rlrevell@joe-job.com>
7 *
8 *  Copyright (c) by James Courtier-Dutton <James@superbug.co.uk>
9 *  	Added EMU 1010 support.
10 *
11 *  BUGS:
12 *    --
13 *
14 *  TODO:
15 *    --
16 *
17 *   This program is free software; you can redistribute it and/or modify
18 *   it under the terms of the GNU General Public License as published by
19 *   the Free Software Foundation; either version 2 of the License, or
20 *   (at your option) any later version.
21 *
22 *   This program is distributed in the hope that it will be useful,
23 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
24 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
25 *   GNU General Public License for more details.
26 *
27 *   You should have received a copy of the GNU General Public License
28 *   along with this program; if not, write to the Free Software
29 *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
30 *
31 */
32
33#include <linux/time.h>
34#include <linux/init.h>
35#include <sound/core.h>
36#include <sound/emu10k1.h>
37#include <linux/delay.h>
38#include <sound/tlv.h>
39
40#include "p17v.h"
41
42#define AC97_ID_STAC9758	0x83847658
43
44static const DECLARE_TLV_DB_SCALE(snd_audigy_db_scale2, -10350, 50, 1); /* WM8775 gain scale */
45
46static int snd_emu10k1_spdif_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
47{
48	uinfo->type = SNDRV_CTL_ELEM_TYPE_IEC958;
49	uinfo->count = 1;
50	return 0;
51}
52
53static int snd_emu10k1_spdif_get(struct snd_kcontrol *kcontrol,
54                                 struct snd_ctl_elem_value *ucontrol)
55{
56	struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
57	unsigned int idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
58	unsigned long flags;
59
60	/* Limit: emu->spdif_bits */
61	if (idx >= 3)
62		return -EINVAL;
63	spin_lock_irqsave(&emu->reg_lock, flags);
64	ucontrol->value.iec958.status[0] = (emu->spdif_bits[idx] >> 0) & 0xff;
65	ucontrol->value.iec958.status[1] = (emu->spdif_bits[idx] >> 8) & 0xff;
66	ucontrol->value.iec958.status[2] = (emu->spdif_bits[idx] >> 16) & 0xff;
67	ucontrol->value.iec958.status[3] = (emu->spdif_bits[idx] >> 24) & 0xff;
68	spin_unlock_irqrestore(&emu->reg_lock, flags);
69	return 0;
70}
71
72static int snd_emu10k1_spdif_get_mask(struct snd_kcontrol *kcontrol,
73				      struct snd_ctl_elem_value *ucontrol)
74{
75	ucontrol->value.iec958.status[0] = 0xff;
76	ucontrol->value.iec958.status[1] = 0xff;
77	ucontrol->value.iec958.status[2] = 0xff;
78	ucontrol->value.iec958.status[3] = 0xff;
79	return 0;
80}
81
82/*
83 * Items labels in enum mixer controls assigning source data to
84 * each destination
85 */
86static char *emu1010_src_texts[] = {
87	"Silence",
88	"Dock Mic A",
89	"Dock Mic B",
90	"Dock ADC1 Left",
91	"Dock ADC1 Right",
92	"Dock ADC2 Left",
93	"Dock ADC2 Right",
94	"Dock ADC3 Left",
95	"Dock ADC3 Right",
96	"0202 ADC Left",
97	"0202 ADC Right",
98	"0202 SPDIF Left",
99	"0202 SPDIF Right",
100	"ADAT 0",
101	"ADAT 1",
102	"ADAT 2",
103	"ADAT 3",
104	"ADAT 4",
105	"ADAT 5",
106	"ADAT 6",
107	"ADAT 7",
108	"DSP 0",
109	"DSP 1",
110	"DSP 2",
111	"DSP 3",
112	"DSP 4",
113	"DSP 5",
114	"DSP 6",
115	"DSP 7",
116	"DSP 8",
117	"DSP 9",
118	"DSP 10",
119	"DSP 11",
120	"DSP 12",
121	"DSP 13",
122	"DSP 14",
123	"DSP 15",
124	"DSP 16",
125	"DSP 17",
126	"DSP 18",
127	"DSP 19",
128	"DSP 20",
129	"DSP 21",
130	"DSP 22",
131	"DSP 23",
132	"DSP 24",
133	"DSP 25",
134	"DSP 26",
135	"DSP 27",
136	"DSP 28",
137	"DSP 29",
138	"DSP 30",
139	"DSP 31",
140};
141
142/* 1616(m) cardbus */
143
144static char *emu1616_src_texts[] = {
145	"Silence",
146	"Dock Mic A",
147	"Dock Mic B",
148	"Dock ADC1 Left",
149	"Dock ADC1 Right",
150	"Dock ADC2 Left",
151	"Dock ADC2 Right",
152	"Dock SPDIF Left",
153	"Dock SPDIF Right",
154	"ADAT 0",
155	"ADAT 1",
156	"ADAT 2",
157	"ADAT 3",
158	"ADAT 4",
159	"ADAT 5",
160	"ADAT 6",
161	"ADAT 7",
162	"DSP 0",
163	"DSP 1",
164	"DSP 2",
165	"DSP 3",
166	"DSP 4",
167	"DSP 5",
168	"DSP 6",
169	"DSP 7",
170	"DSP 8",
171	"DSP 9",
172	"DSP 10",
173	"DSP 11",
174	"DSP 12",
175	"DSP 13",
176	"DSP 14",
177	"DSP 15",
178	"DSP 16",
179	"DSP 17",
180	"DSP 18",
181	"DSP 19",
182	"DSP 20",
183	"DSP 21",
184	"DSP 22",
185	"DSP 23",
186	"DSP 24",
187	"DSP 25",
188	"DSP 26",
189	"DSP 27",
190	"DSP 28",
191	"DSP 29",
192	"DSP 30",
193	"DSP 31",
194};
195
196
197/*
198 * List of data sources available for each destination
199 */
200static unsigned int emu1010_src_regs[] = {
201	EMU_SRC_SILENCE,/* 0 */
202	EMU_SRC_DOCK_MIC_A1, /* 1 */
203	EMU_SRC_DOCK_MIC_B1, /* 2 */
204	EMU_SRC_DOCK_ADC1_LEFT1, /* 3 */
205	EMU_SRC_DOCK_ADC1_RIGHT1, /* 4 */
206	EMU_SRC_DOCK_ADC2_LEFT1, /* 5 */
207	EMU_SRC_DOCK_ADC2_RIGHT1, /* 6 */
208	EMU_SRC_DOCK_ADC3_LEFT1, /* 7 */
209	EMU_SRC_DOCK_ADC3_RIGHT1, /* 8 */
210	EMU_SRC_HAMOA_ADC_LEFT1, /* 9 */
211	EMU_SRC_HAMOA_ADC_RIGHT1, /* 10 */
212	EMU_SRC_HANA_SPDIF_LEFT1, /* 11 */
213	EMU_SRC_HANA_SPDIF_RIGHT1, /* 12 */
214	EMU_SRC_HANA_ADAT, /* 13 */
215	EMU_SRC_HANA_ADAT+1, /* 14 */
216	EMU_SRC_HANA_ADAT+2, /* 15 */
217	EMU_SRC_HANA_ADAT+3, /* 16 */
218	EMU_SRC_HANA_ADAT+4, /* 17 */
219	EMU_SRC_HANA_ADAT+5, /* 18 */
220	EMU_SRC_HANA_ADAT+6, /* 19 */
221	EMU_SRC_HANA_ADAT+7, /* 20 */
222	EMU_SRC_ALICE_EMU32A, /* 21 */
223	EMU_SRC_ALICE_EMU32A+1, /* 22 */
224	EMU_SRC_ALICE_EMU32A+2, /* 23 */
225	EMU_SRC_ALICE_EMU32A+3, /* 24 */
226	EMU_SRC_ALICE_EMU32A+4, /* 25 */
227	EMU_SRC_ALICE_EMU32A+5, /* 26 */
228	EMU_SRC_ALICE_EMU32A+6, /* 27 */
229	EMU_SRC_ALICE_EMU32A+7, /* 28 */
230	EMU_SRC_ALICE_EMU32A+8, /* 29 */
231	EMU_SRC_ALICE_EMU32A+9, /* 30 */
232	EMU_SRC_ALICE_EMU32A+0xa, /* 31 */
233	EMU_SRC_ALICE_EMU32A+0xb, /* 32 */
234	EMU_SRC_ALICE_EMU32A+0xc, /* 33 */
235	EMU_SRC_ALICE_EMU32A+0xd, /* 34 */
236	EMU_SRC_ALICE_EMU32A+0xe, /* 35 */
237	EMU_SRC_ALICE_EMU32A+0xf, /* 36 */
238	EMU_SRC_ALICE_EMU32B, /* 37 */
239	EMU_SRC_ALICE_EMU32B+1, /* 38 */
240	EMU_SRC_ALICE_EMU32B+2, /* 39 */
241	EMU_SRC_ALICE_EMU32B+3, /* 40 */
242	EMU_SRC_ALICE_EMU32B+4, /* 41 */
243	EMU_SRC_ALICE_EMU32B+5, /* 42 */
244	EMU_SRC_ALICE_EMU32B+6, /* 43 */
245	EMU_SRC_ALICE_EMU32B+7, /* 44 */
246	EMU_SRC_ALICE_EMU32B+8, /* 45 */
247	EMU_SRC_ALICE_EMU32B+9, /* 46 */
248	EMU_SRC_ALICE_EMU32B+0xa, /* 47 */
249	EMU_SRC_ALICE_EMU32B+0xb, /* 48 */
250	EMU_SRC_ALICE_EMU32B+0xc, /* 49 */
251	EMU_SRC_ALICE_EMU32B+0xd, /* 50 */
252	EMU_SRC_ALICE_EMU32B+0xe, /* 51 */
253	EMU_SRC_ALICE_EMU32B+0xf, /* 52 */
254};
255
256/* 1616(m) cardbus */
257static unsigned int emu1616_src_regs[] = {
258	EMU_SRC_SILENCE,
259	EMU_SRC_DOCK_MIC_A1,
260	EMU_SRC_DOCK_MIC_B1,
261	EMU_SRC_DOCK_ADC1_LEFT1,
262	EMU_SRC_DOCK_ADC1_RIGHT1,
263	EMU_SRC_DOCK_ADC2_LEFT1,
264	EMU_SRC_DOCK_ADC2_RIGHT1,
265	EMU_SRC_MDOCK_SPDIF_LEFT1,
266	EMU_SRC_MDOCK_SPDIF_RIGHT1,
267	EMU_SRC_MDOCK_ADAT,
268	EMU_SRC_MDOCK_ADAT+1,
269	EMU_SRC_MDOCK_ADAT+2,
270	EMU_SRC_MDOCK_ADAT+3,
271	EMU_SRC_MDOCK_ADAT+4,
272	EMU_SRC_MDOCK_ADAT+5,
273	EMU_SRC_MDOCK_ADAT+6,
274	EMU_SRC_MDOCK_ADAT+7,
275	EMU_SRC_ALICE_EMU32A,
276	EMU_SRC_ALICE_EMU32A+1,
277	EMU_SRC_ALICE_EMU32A+2,
278	EMU_SRC_ALICE_EMU32A+3,
279	EMU_SRC_ALICE_EMU32A+4,
280	EMU_SRC_ALICE_EMU32A+5,
281	EMU_SRC_ALICE_EMU32A+6,
282	EMU_SRC_ALICE_EMU32A+7,
283	EMU_SRC_ALICE_EMU32A+8,
284	EMU_SRC_ALICE_EMU32A+9,
285	EMU_SRC_ALICE_EMU32A+0xa,
286	EMU_SRC_ALICE_EMU32A+0xb,
287	EMU_SRC_ALICE_EMU32A+0xc,
288	EMU_SRC_ALICE_EMU32A+0xd,
289	EMU_SRC_ALICE_EMU32A+0xe,
290	EMU_SRC_ALICE_EMU32A+0xf,
291	EMU_SRC_ALICE_EMU32B,
292	EMU_SRC_ALICE_EMU32B+1,
293	EMU_SRC_ALICE_EMU32B+2,
294	EMU_SRC_ALICE_EMU32B+3,
295	EMU_SRC_ALICE_EMU32B+4,
296	EMU_SRC_ALICE_EMU32B+5,
297	EMU_SRC_ALICE_EMU32B+6,
298	EMU_SRC_ALICE_EMU32B+7,
299	EMU_SRC_ALICE_EMU32B+8,
300	EMU_SRC_ALICE_EMU32B+9,
301	EMU_SRC_ALICE_EMU32B+0xa,
302	EMU_SRC_ALICE_EMU32B+0xb,
303	EMU_SRC_ALICE_EMU32B+0xc,
304	EMU_SRC_ALICE_EMU32B+0xd,
305	EMU_SRC_ALICE_EMU32B+0xe,
306	EMU_SRC_ALICE_EMU32B+0xf,
307};
308
309/*
310 * Data destinations - physical EMU outputs.
311 * Each destination has an enum mixer control to choose a data source
312 */
313static unsigned int emu1010_output_dst[] = {
314	EMU_DST_DOCK_DAC1_LEFT1, /* 0 */
315	EMU_DST_DOCK_DAC1_RIGHT1, /* 1 */
316	EMU_DST_DOCK_DAC2_LEFT1, /* 2 */
317	EMU_DST_DOCK_DAC2_RIGHT1, /* 3 */
318	EMU_DST_DOCK_DAC3_LEFT1, /* 4 */
319	EMU_DST_DOCK_DAC3_RIGHT1, /* 5 */
320	EMU_DST_DOCK_DAC4_LEFT1, /* 6 */
321	EMU_DST_DOCK_DAC4_RIGHT1, /* 7 */
322	EMU_DST_DOCK_PHONES_LEFT1, /* 8 */
323	EMU_DST_DOCK_PHONES_RIGHT1, /* 9 */
324	EMU_DST_DOCK_SPDIF_LEFT1, /* 10 */
325	EMU_DST_DOCK_SPDIF_RIGHT1, /* 11 */
326	EMU_DST_HANA_SPDIF_LEFT1, /* 12 */
327	EMU_DST_HANA_SPDIF_RIGHT1, /* 13 */
328	EMU_DST_HAMOA_DAC_LEFT1, /* 14 */
329	EMU_DST_HAMOA_DAC_RIGHT1, /* 15 */
330	EMU_DST_HANA_ADAT, /* 16 */
331	EMU_DST_HANA_ADAT+1, /* 17 */
332	EMU_DST_HANA_ADAT+2, /* 18 */
333	EMU_DST_HANA_ADAT+3, /* 19 */
334	EMU_DST_HANA_ADAT+4, /* 20 */
335	EMU_DST_HANA_ADAT+5, /* 21 */
336	EMU_DST_HANA_ADAT+6, /* 22 */
337	EMU_DST_HANA_ADAT+7, /* 23 */
338};
339
340/* 1616(m) cardbus */
341static unsigned int emu1616_output_dst[] = {
342	EMU_DST_DOCK_DAC1_LEFT1,
343	EMU_DST_DOCK_DAC1_RIGHT1,
344	EMU_DST_DOCK_DAC2_LEFT1,
345	EMU_DST_DOCK_DAC2_RIGHT1,
346	EMU_DST_DOCK_DAC3_LEFT1,
347	EMU_DST_DOCK_DAC3_RIGHT1,
348	EMU_DST_MDOCK_SPDIF_LEFT1,
349	EMU_DST_MDOCK_SPDIF_RIGHT1,
350	EMU_DST_MDOCK_ADAT,
351	EMU_DST_MDOCK_ADAT+1,
352	EMU_DST_MDOCK_ADAT+2,
353	EMU_DST_MDOCK_ADAT+3,
354	EMU_DST_MDOCK_ADAT+4,
355	EMU_DST_MDOCK_ADAT+5,
356	EMU_DST_MDOCK_ADAT+6,
357	EMU_DST_MDOCK_ADAT+7,
358	EMU_DST_MANA_DAC_LEFT,
359	EMU_DST_MANA_DAC_RIGHT,
360};
361
362/*
363 * Data destinations - HANA outputs going to Alice2 (audigy) for
364 *   capture (EMU32 + I2S links)
365 * Each destination has an enum mixer control to choose a data source
366 */
367static unsigned int emu1010_input_dst[] = {
368	EMU_DST_ALICE2_EMU32_0,
369	EMU_DST_ALICE2_EMU32_1,
370	EMU_DST_ALICE2_EMU32_2,
371	EMU_DST_ALICE2_EMU32_3,
372	EMU_DST_ALICE2_EMU32_4,
373	EMU_DST_ALICE2_EMU32_5,
374	EMU_DST_ALICE2_EMU32_6,
375	EMU_DST_ALICE2_EMU32_7,
376	EMU_DST_ALICE2_EMU32_8,
377	EMU_DST_ALICE2_EMU32_9,
378	EMU_DST_ALICE2_EMU32_A,
379	EMU_DST_ALICE2_EMU32_B,
380	EMU_DST_ALICE2_EMU32_C,
381	EMU_DST_ALICE2_EMU32_D,
382	EMU_DST_ALICE2_EMU32_E,
383	EMU_DST_ALICE2_EMU32_F,
384	EMU_DST_ALICE_I2S0_LEFT,
385	EMU_DST_ALICE_I2S0_RIGHT,
386	EMU_DST_ALICE_I2S1_LEFT,
387	EMU_DST_ALICE_I2S1_RIGHT,
388	EMU_DST_ALICE_I2S2_LEFT,
389	EMU_DST_ALICE_I2S2_RIGHT,
390};
391
392static int snd_emu1010_input_output_source_info(struct snd_kcontrol *kcontrol,
393						struct snd_ctl_elem_info *uinfo)
394{
395	struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
396	char **items;
397
398	uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
399	uinfo->count = 1;
400	if (emu->card_capabilities->emu_model == EMU_MODEL_EMU1616) {
401		uinfo->value.enumerated.items = 49;
402		items = emu1616_src_texts;
403	} else {
404		uinfo->value.enumerated.items = 53;
405		items = emu1010_src_texts;
406	}
407	if (uinfo->value.enumerated.item >= uinfo->value.enumerated.items)
408		uinfo->value.enumerated.item =
409			uinfo->value.enumerated.items - 1;
410	strcpy(uinfo->value.enumerated.name,
411	       items[uinfo->value.enumerated.item]);
412	return 0;
413}
414
415static int snd_emu1010_output_source_get(struct snd_kcontrol *kcontrol,
416                                 struct snd_ctl_elem_value *ucontrol)
417{
418	struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
419	unsigned int channel;
420
421	channel = (kcontrol->private_value) & 0xff;
422	/* Limit: emu1010_output_dst, emu->emu1010.output_source */
423	if (channel >= 24 ||
424	    (emu->card_capabilities->emu_model == EMU_MODEL_EMU1616 &&
425	     channel >= 18))
426		return -EINVAL;
427	ucontrol->value.enumerated.item[0] = emu->emu1010.output_source[channel];
428	return 0;
429}
430
431static int snd_emu1010_output_source_put(struct snd_kcontrol *kcontrol,
432                                 struct snd_ctl_elem_value *ucontrol)
433{
434	struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
435	unsigned int val;
436	unsigned int channel;
437
438	val = ucontrol->value.enumerated.item[0];
439	if (val >= 53 ||
440	    (emu->card_capabilities->emu_model == EMU_MODEL_EMU1616 &&
441	     val >= 49))
442		return -EINVAL;
443	channel = (kcontrol->private_value) & 0xff;
444	/* Limit: emu1010_output_dst, emu->emu1010.output_source */
445	if (channel >= 24 ||
446	    (emu->card_capabilities->emu_model == EMU_MODEL_EMU1616 &&
447	     channel >= 18))
448		return -EINVAL;
449	if (emu->emu1010.output_source[channel] == val)
450		return 0;
451	emu->emu1010.output_source[channel] = val;
452	if (emu->card_capabilities->emu_model == EMU_MODEL_EMU1616)
453		snd_emu1010_fpga_link_dst_src_write(emu,
454			emu1616_output_dst[channel], emu1616_src_regs[val]);
455	else
456		snd_emu1010_fpga_link_dst_src_write(emu,
457			emu1010_output_dst[channel], emu1010_src_regs[val]);
458	return 1;
459}
460
461static int snd_emu1010_input_source_get(struct snd_kcontrol *kcontrol,
462                                 struct snd_ctl_elem_value *ucontrol)
463{
464	struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
465	unsigned int channel;
466
467	channel = (kcontrol->private_value) & 0xff;
468	/* Limit: emu1010_input_dst, emu->emu1010.input_source */
469	if (channel >= 22)
470		return -EINVAL;
471	ucontrol->value.enumerated.item[0] = emu->emu1010.input_source[channel];
472	return 0;
473}
474
475static int snd_emu1010_input_source_put(struct snd_kcontrol *kcontrol,
476                                 struct snd_ctl_elem_value *ucontrol)
477{
478	struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
479	unsigned int val;
480	unsigned int channel;
481
482	val = ucontrol->value.enumerated.item[0];
483	if (val >= 53 ||
484	    (emu->card_capabilities->emu_model == EMU_MODEL_EMU1616 &&
485	     val >= 49))
486		return -EINVAL;
487	channel = (kcontrol->private_value) & 0xff;
488	/* Limit: emu1010_input_dst, emu->emu1010.input_source */
489	if (channel >= 22)
490		return -EINVAL;
491	if (emu->emu1010.input_source[channel] == val)
492		return 0;
493	emu->emu1010.input_source[channel] = val;
494	if (emu->card_capabilities->emu_model == EMU_MODEL_EMU1616)
495		snd_emu1010_fpga_link_dst_src_write(emu,
496			emu1010_input_dst[channel], emu1616_src_regs[val]);
497	else
498		snd_emu1010_fpga_link_dst_src_write(emu,
499			emu1010_input_dst[channel], emu1010_src_regs[val]);
500	return 1;
501}
502
503#define EMU1010_SOURCE_OUTPUT(xname,chid) \
504{								\
505	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname,	\
506	.access = SNDRV_CTL_ELEM_ACCESS_READWRITE,		\
507	.info =  snd_emu1010_input_output_source_info,		\
508	.get =   snd_emu1010_output_source_get,			\
509	.put =   snd_emu1010_output_source_put,			\
510	.private_value = chid					\
511}
512
513static struct snd_kcontrol_new snd_emu1010_output_enum_ctls[] __devinitdata = {
514	EMU1010_SOURCE_OUTPUT("Dock DAC1 Left Playback Enum", 0),
515	EMU1010_SOURCE_OUTPUT("Dock DAC1 Right Playback Enum", 1),
516	EMU1010_SOURCE_OUTPUT("Dock DAC2 Left Playback Enum", 2),
517	EMU1010_SOURCE_OUTPUT("Dock DAC2 Right Playback Enum", 3),
518	EMU1010_SOURCE_OUTPUT("Dock DAC3 Left Playback Enum", 4),
519	EMU1010_SOURCE_OUTPUT("Dock DAC3 Right Playback Enum", 5),
520	EMU1010_SOURCE_OUTPUT("Dock DAC4 Left Playback Enum", 6),
521	EMU1010_SOURCE_OUTPUT("Dock DAC4 Right Playback Enum", 7),
522	EMU1010_SOURCE_OUTPUT("Dock Phones Left Playback Enum", 8),
523	EMU1010_SOURCE_OUTPUT("Dock Phones Right Playback Enum", 9),
524	EMU1010_SOURCE_OUTPUT("Dock SPDIF Left Playback Enum", 0xa),
525	EMU1010_SOURCE_OUTPUT("Dock SPDIF Right Playback Enum", 0xb),
526	EMU1010_SOURCE_OUTPUT("1010 SPDIF Left Playback Enum", 0xc),
527	EMU1010_SOURCE_OUTPUT("1010 SPDIF Right Playback Enum", 0xd),
528	EMU1010_SOURCE_OUTPUT("0202 DAC Left Playback Enum", 0xe),
529	EMU1010_SOURCE_OUTPUT("0202 DAC Right Playback Enum", 0xf),
530	EMU1010_SOURCE_OUTPUT("1010 ADAT 0 Playback Enum", 0x10),
531	EMU1010_SOURCE_OUTPUT("1010 ADAT 1 Playback Enum", 0x11),
532	EMU1010_SOURCE_OUTPUT("1010 ADAT 2 Playback Enum", 0x12),
533	EMU1010_SOURCE_OUTPUT("1010 ADAT 3 Playback Enum", 0x13),
534	EMU1010_SOURCE_OUTPUT("1010 ADAT 4 Playback Enum", 0x14),
535	EMU1010_SOURCE_OUTPUT("1010 ADAT 5 Playback Enum", 0x15),
536	EMU1010_SOURCE_OUTPUT("1010 ADAT 6 Playback Enum", 0x16),
537	EMU1010_SOURCE_OUTPUT("1010 ADAT 7 Playback Enum", 0x17),
538};
539
540
541/* 1616(m) cardbus */
542static struct snd_kcontrol_new snd_emu1616_output_enum_ctls[] __devinitdata = {
543	EMU1010_SOURCE_OUTPUT("Dock DAC1 Left Playback Enum", 0),
544	EMU1010_SOURCE_OUTPUT("Dock DAC1 Right Playback Enum", 1),
545	EMU1010_SOURCE_OUTPUT("Dock DAC2 Left Playback Enum", 2),
546	EMU1010_SOURCE_OUTPUT("Dock DAC2 Right Playback Enum", 3),
547	EMU1010_SOURCE_OUTPUT("Dock DAC3 Left Playback Enum", 4),
548	EMU1010_SOURCE_OUTPUT("Dock DAC3 Right Playback Enum", 5),
549	EMU1010_SOURCE_OUTPUT("Dock SPDIF Left Playback Enum", 6),
550	EMU1010_SOURCE_OUTPUT("Dock SPDIF Right Playback Enum", 7),
551	EMU1010_SOURCE_OUTPUT("Dock ADAT 0 Playback Enum", 8),
552	EMU1010_SOURCE_OUTPUT("Dock ADAT 1 Playback Enum", 9),
553	EMU1010_SOURCE_OUTPUT("Dock ADAT 2 Playback Enum", 0xa),
554	EMU1010_SOURCE_OUTPUT("Dock ADAT 3 Playback Enum", 0xb),
555	EMU1010_SOURCE_OUTPUT("Dock ADAT 4 Playback Enum", 0xc),
556	EMU1010_SOURCE_OUTPUT("Dock ADAT 5 Playback Enum", 0xd),
557	EMU1010_SOURCE_OUTPUT("Dock ADAT 6 Playback Enum", 0xe),
558	EMU1010_SOURCE_OUTPUT("Dock ADAT 7 Playback Enum", 0xf),
559	EMU1010_SOURCE_OUTPUT("Mana DAC Left Playback Enum", 0x10),
560	EMU1010_SOURCE_OUTPUT("Mana DAC Right Playback Enum", 0x11),
561};
562
563
564#define EMU1010_SOURCE_INPUT(xname,chid) \
565{								\
566	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname,	\
567	.access = SNDRV_CTL_ELEM_ACCESS_READWRITE,		\
568	.info =  snd_emu1010_input_output_source_info,		\
569	.get =   snd_emu1010_input_source_get,			\
570	.put =   snd_emu1010_input_source_put,			\
571	.private_value = chid					\
572}
573
574static struct snd_kcontrol_new snd_emu1010_input_enum_ctls[] __devinitdata = {
575	EMU1010_SOURCE_INPUT("DSP 0 Capture Enum", 0),
576	EMU1010_SOURCE_INPUT("DSP 1 Capture Enum", 1),
577	EMU1010_SOURCE_INPUT("DSP 2 Capture Enum", 2),
578	EMU1010_SOURCE_INPUT("DSP 3 Capture Enum", 3),
579	EMU1010_SOURCE_INPUT("DSP 4 Capture Enum", 4),
580	EMU1010_SOURCE_INPUT("DSP 5 Capture Enum", 5),
581	EMU1010_SOURCE_INPUT("DSP 6 Capture Enum", 6),
582	EMU1010_SOURCE_INPUT("DSP 7 Capture Enum", 7),
583	EMU1010_SOURCE_INPUT("DSP 8 Capture Enum", 8),
584	EMU1010_SOURCE_INPUT("DSP 9 Capture Enum", 9),
585	EMU1010_SOURCE_INPUT("DSP A Capture Enum", 0xa),
586	EMU1010_SOURCE_INPUT("DSP B Capture Enum", 0xb),
587	EMU1010_SOURCE_INPUT("DSP C Capture Enum", 0xc),
588	EMU1010_SOURCE_INPUT("DSP D Capture Enum", 0xd),
589	EMU1010_SOURCE_INPUT("DSP E Capture Enum", 0xe),
590	EMU1010_SOURCE_INPUT("DSP F Capture Enum", 0xf),
591	EMU1010_SOURCE_INPUT("DSP 10 Capture Enum", 0x10),
592	EMU1010_SOURCE_INPUT("DSP 11 Capture Enum", 0x11),
593	EMU1010_SOURCE_INPUT("DSP 12 Capture Enum", 0x12),
594	EMU1010_SOURCE_INPUT("DSP 13 Capture Enum", 0x13),
595	EMU1010_SOURCE_INPUT("DSP 14 Capture Enum", 0x14),
596	EMU1010_SOURCE_INPUT("DSP 15 Capture Enum", 0x15),
597};
598
599
600
601#define snd_emu1010_adc_pads_info	snd_ctl_boolean_mono_info
602
603static int snd_emu1010_adc_pads_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
604{
605	struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
606	unsigned int mask = kcontrol->private_value & 0xff;
607	ucontrol->value.integer.value[0] = (emu->emu1010.adc_pads & mask) ? 1 : 0;
608	return 0;
609}
610
611static int snd_emu1010_adc_pads_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
612{
613	struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
614	unsigned int mask = kcontrol->private_value & 0xff;
615	unsigned int val, cache;
616	val = ucontrol->value.integer.value[0];
617	cache = emu->emu1010.adc_pads;
618	if (val == 1)
619		cache = cache | mask;
620	else
621		cache = cache & ~mask;
622	if (cache != emu->emu1010.adc_pads) {
623		snd_emu1010_fpga_write(emu, EMU_HANA_ADC_PADS, cache );
624	        emu->emu1010.adc_pads = cache;
625	}
626
627	return 0;
628}
629
630
631
632#define EMU1010_ADC_PADS(xname,chid) \
633{								\
634	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname,	\
635	.access = SNDRV_CTL_ELEM_ACCESS_READWRITE,		\
636	.info =  snd_emu1010_adc_pads_info,			\
637	.get =   snd_emu1010_adc_pads_get,			\
638	.put =   snd_emu1010_adc_pads_put,			\
639	.private_value = chid					\
640}
641
642static struct snd_kcontrol_new snd_emu1010_adc_pads[] __devinitdata = {
643	EMU1010_ADC_PADS("ADC1 14dB PAD Audio Dock Capture Switch", EMU_HANA_DOCK_ADC_PAD1),
644	EMU1010_ADC_PADS("ADC2 14dB PAD Audio Dock Capture Switch", EMU_HANA_DOCK_ADC_PAD2),
645	EMU1010_ADC_PADS("ADC3 14dB PAD Audio Dock Capture Switch", EMU_HANA_DOCK_ADC_PAD3),
646	EMU1010_ADC_PADS("ADC1 14dB PAD 0202 Capture Switch", EMU_HANA_0202_ADC_PAD1),
647};
648
649#define snd_emu1010_dac_pads_info	snd_ctl_boolean_mono_info
650
651static int snd_emu1010_dac_pads_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
652{
653	struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
654	unsigned int mask = kcontrol->private_value & 0xff;
655	ucontrol->value.integer.value[0] = (emu->emu1010.dac_pads & mask) ? 1 : 0;
656	return 0;
657}
658
659static int snd_emu1010_dac_pads_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
660{
661	struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
662	unsigned int mask = kcontrol->private_value & 0xff;
663	unsigned int val, cache;
664	val = ucontrol->value.integer.value[0];
665	cache = emu->emu1010.dac_pads;
666	if (val == 1)
667		cache = cache | mask;
668	else
669		cache = cache & ~mask;
670	if (cache != emu->emu1010.dac_pads) {
671		snd_emu1010_fpga_write(emu, EMU_HANA_DAC_PADS, cache );
672	        emu->emu1010.dac_pads = cache;
673	}
674
675	return 0;
676}
677
678
679
680#define EMU1010_DAC_PADS(xname,chid) \
681{								\
682	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname,	\
683	.access = SNDRV_CTL_ELEM_ACCESS_READWRITE,		\
684	.info =  snd_emu1010_dac_pads_info,			\
685	.get =   snd_emu1010_dac_pads_get,			\
686	.put =   snd_emu1010_dac_pads_put,			\
687	.private_value = chid					\
688}
689
690static struct snd_kcontrol_new snd_emu1010_dac_pads[] __devinitdata = {
691	EMU1010_DAC_PADS("DAC1 Audio Dock 14dB PAD Playback Switch", EMU_HANA_DOCK_DAC_PAD1),
692	EMU1010_DAC_PADS("DAC2 Audio Dock 14dB PAD Playback Switch", EMU_HANA_DOCK_DAC_PAD2),
693	EMU1010_DAC_PADS("DAC3 Audio Dock 14dB PAD Playback Switch", EMU_HANA_DOCK_DAC_PAD3),
694	EMU1010_DAC_PADS("DAC4 Audio Dock 14dB PAD Playback Switch", EMU_HANA_DOCK_DAC_PAD4),
695	EMU1010_DAC_PADS("DAC1 0202 14dB PAD Playback Switch", EMU_HANA_0202_DAC_PAD1),
696};
697
698
699static int snd_emu1010_internal_clock_info(struct snd_kcontrol *kcontrol,
700					  struct snd_ctl_elem_info *uinfo)
701{
702	static char *texts[4] = {
703		"44100", "48000", "SPDIF", "ADAT"
704	};
705
706	uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
707	uinfo->count = 1;
708	uinfo->value.enumerated.items = 4;
709	if (uinfo->value.enumerated.item >= uinfo->value.enumerated.items)
710		uinfo->value.enumerated.item = uinfo->value.enumerated.items - 1;
711	strcpy(uinfo->value.enumerated.name, texts[uinfo->value.enumerated.item]);
712	return 0;
713
714
715}
716
717static int snd_emu1010_internal_clock_get(struct snd_kcontrol *kcontrol,
718					struct snd_ctl_elem_value *ucontrol)
719{
720	struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
721
722	ucontrol->value.enumerated.item[0] = emu->emu1010.internal_clock;
723	return 0;
724}
725
726static int snd_emu1010_internal_clock_put(struct snd_kcontrol *kcontrol,
727					struct snd_ctl_elem_value *ucontrol)
728{
729	struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
730	unsigned int val;
731	int change = 0;
732
733	val = ucontrol->value.enumerated.item[0] ;
734	/* Limit: uinfo->value.enumerated.items = 4; */
735	if (val >= 4)
736		return -EINVAL;
737	change = (emu->emu1010.internal_clock != val);
738	if (change) {
739		emu->emu1010.internal_clock = val;
740		switch (val) {
741		case 0:
742			/* 44100 */
743			/* Mute all */
744			snd_emu1010_fpga_write(emu, EMU_HANA_UNMUTE, EMU_MUTE );
745			/* Default fallback clock 48kHz */
746			snd_emu1010_fpga_write(emu, EMU_HANA_DEFCLOCK, EMU_HANA_DEFCLOCK_44_1K );
747			/* Word Clock source, Internal 44.1kHz x1 */
748			snd_emu1010_fpga_write(emu, EMU_HANA_WCLOCK,
749			EMU_HANA_WCLOCK_INT_44_1K | EMU_HANA_WCLOCK_1X );
750			/* Set LEDs on Audio Dock */
751			snd_emu1010_fpga_write(emu, EMU_HANA_DOCK_LEDS_2,
752				EMU_HANA_DOCK_LEDS_2_44K | EMU_HANA_DOCK_LEDS_2_LOCK );
753			/* Allow DLL to settle */
754			msleep(10);
755			/* Unmute all */
756			snd_emu1010_fpga_write(emu, EMU_HANA_UNMUTE, EMU_UNMUTE );
757			break;
758		case 1:
759			/* 48000 */
760			/* Mute all */
761			snd_emu1010_fpga_write(emu, EMU_HANA_UNMUTE, EMU_MUTE );
762			/* Default fallback clock 48kHz */
763			snd_emu1010_fpga_write(emu, EMU_HANA_DEFCLOCK, EMU_HANA_DEFCLOCK_48K );
764			/* Word Clock source, Internal 48kHz x1 */
765			snd_emu1010_fpga_write(emu, EMU_HANA_WCLOCK,
766				EMU_HANA_WCLOCK_INT_48K | EMU_HANA_WCLOCK_1X );
767			/* Set LEDs on Audio Dock */
768			snd_emu1010_fpga_write(emu, EMU_HANA_DOCK_LEDS_2,
769				EMU_HANA_DOCK_LEDS_2_48K | EMU_HANA_DOCK_LEDS_2_LOCK );
770			/* Allow DLL to settle */
771			msleep(10);
772			/* Unmute all */
773			snd_emu1010_fpga_write(emu, EMU_HANA_UNMUTE, EMU_UNMUTE );
774			break;
775
776		case 2: /* Take clock from S/PDIF IN */
777			/* Mute all */
778			snd_emu1010_fpga_write(emu, EMU_HANA_UNMUTE, EMU_MUTE );
779			/* Default fallback clock 48kHz */
780			snd_emu1010_fpga_write(emu, EMU_HANA_DEFCLOCK, EMU_HANA_DEFCLOCK_48K );
781			/* Word Clock source, sync to S/PDIF input */
782			snd_emu1010_fpga_write(emu, EMU_HANA_WCLOCK,
783				EMU_HANA_WCLOCK_HANA_SPDIF_IN | EMU_HANA_WCLOCK_1X );
784			/* Set LEDs on Audio Dock */
785			snd_emu1010_fpga_write(emu, EMU_HANA_DOCK_LEDS_2,
786				EMU_HANA_DOCK_LEDS_2_EXT | EMU_HANA_DOCK_LEDS_2_LOCK );
787			/* Allow DLL to settle */
788			msleep(10);
789			/* Unmute all */
790			snd_emu1010_fpga_write(emu, EMU_HANA_UNMUTE, EMU_UNMUTE );
791			break;
792
793		case 3:
794			/* Take clock from ADAT IN */
795			/* Mute all */
796			snd_emu1010_fpga_write(emu, EMU_HANA_UNMUTE, EMU_MUTE );
797			/* Default fallback clock 48kHz */
798			snd_emu1010_fpga_write(emu, EMU_HANA_DEFCLOCK, EMU_HANA_DEFCLOCK_48K );
799			/* Word Clock source, sync to ADAT input */
800			snd_emu1010_fpga_write(emu, EMU_HANA_WCLOCK,
801				EMU_HANA_WCLOCK_HANA_ADAT_IN | EMU_HANA_WCLOCK_1X );
802			/* Set LEDs on Audio Dock */
803			snd_emu1010_fpga_write(emu, EMU_HANA_DOCK_LEDS_2, EMU_HANA_DOCK_LEDS_2_EXT | EMU_HANA_DOCK_LEDS_2_LOCK );
804			/* Allow DLL to settle */
805			msleep(10);
806			/*   Unmute all */
807			snd_emu1010_fpga_write(emu, EMU_HANA_UNMUTE, EMU_UNMUTE );
808
809
810			break;
811		}
812	}
813        return change;
814}
815
816static struct snd_kcontrol_new snd_emu1010_internal_clock =
817{
818	.access =	SNDRV_CTL_ELEM_ACCESS_READWRITE,
819	.iface =        SNDRV_CTL_ELEM_IFACE_MIXER,
820	.name =         "Clock Internal Rate",
821	.count =	1,
822	.info =         snd_emu1010_internal_clock_info,
823	.get =          snd_emu1010_internal_clock_get,
824	.put =          snd_emu1010_internal_clock_put
825};
826
827static int snd_audigy_i2c_capture_source_info(struct snd_kcontrol *kcontrol,
828					  struct snd_ctl_elem_info *uinfo)
829{
830	static char *texts[2] = {
831		"Mic", "Line"
832	};
833
834	uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
835	uinfo->count = 1;
836	uinfo->value.enumerated.items = 2;
837	if (uinfo->value.enumerated.item > 1)
838                uinfo->value.enumerated.item = 1;
839	strcpy(uinfo->value.enumerated.name, texts[uinfo->value.enumerated.item]);
840	return 0;
841}
842
843static int snd_audigy_i2c_capture_source_get(struct snd_kcontrol *kcontrol,
844					struct snd_ctl_elem_value *ucontrol)
845{
846	struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
847
848	ucontrol->value.enumerated.item[0] = emu->i2c_capture_source;
849	return 0;
850}
851
852static int snd_audigy_i2c_capture_source_put(struct snd_kcontrol *kcontrol,
853					struct snd_ctl_elem_value *ucontrol)
854{
855	struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
856	unsigned int source_id;
857	unsigned int ngain, ogain;
858	u32 gpio;
859	int change = 0;
860	unsigned long flags;
861	u32 source;
862	/* If the capture source has changed,
863	 * update the capture volume from the cached value
864	 * for the particular source.
865	 */
866	source_id = ucontrol->value.enumerated.item[0];
867	/* Limit: uinfo->value.enumerated.items = 2; */
868	/*        emu->i2c_capture_volume */
869	if (source_id >= 2)
870		return -EINVAL;
871	change = (emu->i2c_capture_source != source_id);
872	if (change) {
873		snd_emu10k1_i2c_write(emu, ADC_MUX, 0); /* Mute input */
874		spin_lock_irqsave(&emu->emu_lock, flags);
875		gpio = inl(emu->port + A_IOCFG);
876		if (source_id==0)
877			outl(gpio | 0x4, emu->port + A_IOCFG);
878		else
879			outl(gpio & ~0x4, emu->port + A_IOCFG);
880		spin_unlock_irqrestore(&emu->emu_lock, flags);
881
882		ngain = emu->i2c_capture_volume[source_id][0]; /* Left */
883		ogain = emu->i2c_capture_volume[emu->i2c_capture_source][0]; /* Left */
884		if (ngain != ogain)
885			snd_emu10k1_i2c_write(emu, ADC_ATTEN_ADCL, ((ngain) & 0xff));
886		ngain = emu->i2c_capture_volume[source_id][1]; /* Right */
887		ogain = emu->i2c_capture_volume[emu->i2c_capture_source][1]; /* Right */
888		if (ngain != ogain)
889			snd_emu10k1_i2c_write(emu, ADC_ATTEN_ADCR, ((ngain) & 0xff));
890
891		source = 1 << (source_id + 2);
892		snd_emu10k1_i2c_write(emu, ADC_MUX, source); /* Set source */
893		emu->i2c_capture_source = source_id;
894	}
895        return change;
896}
897
898static struct snd_kcontrol_new snd_audigy_i2c_capture_source =
899{
900		.iface =	SNDRV_CTL_ELEM_IFACE_MIXER,
901		.name =		"Capture Source",
902		.info =		snd_audigy_i2c_capture_source_info,
903		.get =		snd_audigy_i2c_capture_source_get,
904		.put =		snd_audigy_i2c_capture_source_put
905};
906
907static int snd_audigy_i2c_volume_info(struct snd_kcontrol *kcontrol,
908				  struct snd_ctl_elem_info *uinfo)
909{
910	uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
911	uinfo->count = 2;
912	uinfo->value.integer.min = 0;
913	uinfo->value.integer.max = 255;
914	return 0;
915}
916
917static int snd_audigy_i2c_volume_get(struct snd_kcontrol *kcontrol,
918				 struct snd_ctl_elem_value *ucontrol)
919{
920	struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
921	unsigned int source_id;
922
923	source_id = kcontrol->private_value;
924	/* Limit: emu->i2c_capture_volume */
925        /*        capture_source: uinfo->value.enumerated.items = 2 */
926	if (source_id >= 2)
927		return -EINVAL;
928
929	ucontrol->value.integer.value[0] = emu->i2c_capture_volume[source_id][0];
930	ucontrol->value.integer.value[1] = emu->i2c_capture_volume[source_id][1];
931	return 0;
932}
933
934static int snd_audigy_i2c_volume_put(struct snd_kcontrol *kcontrol,
935				 struct snd_ctl_elem_value *ucontrol)
936{
937	struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
938	unsigned int ogain;
939	unsigned int ngain;
940	unsigned int source_id;
941	int change = 0;
942
943	source_id = kcontrol->private_value;
944	/* Limit: emu->i2c_capture_volume */
945        /*        capture_source: uinfo->value.enumerated.items = 2 */
946	if (source_id >= 2)
947		return -EINVAL;
948	ogain = emu->i2c_capture_volume[source_id][0]; /* Left */
949	ngain = ucontrol->value.integer.value[0];
950	if (ngain > 0xff)
951		return 0;
952	if (ogain != ngain) {
953		if (emu->i2c_capture_source == source_id)
954			snd_emu10k1_i2c_write(emu, ADC_ATTEN_ADCL, ((ngain) & 0xff) );
955		emu->i2c_capture_volume[source_id][0] = ngain;
956		change = 1;
957	}
958	ogain = emu->i2c_capture_volume[source_id][1]; /* Right */
959	ngain = ucontrol->value.integer.value[1];
960	if (ngain > 0xff)
961		return 0;
962	if (ogain != ngain) {
963		if (emu->i2c_capture_source == source_id)
964			snd_emu10k1_i2c_write(emu, ADC_ATTEN_ADCR, ((ngain) & 0xff));
965		emu->i2c_capture_volume[source_id][1] = ngain;
966		change = 1;
967	}
968
969	return change;
970}
971
972#define I2C_VOLUME(xname,chid) \
973{								\
974	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname,	\
975	.access = SNDRV_CTL_ELEM_ACCESS_READWRITE |		\
976	          SNDRV_CTL_ELEM_ACCESS_TLV_READ,		\
977	.info =  snd_audigy_i2c_volume_info,			\
978	.get =   snd_audigy_i2c_volume_get,			\
979	.put =   snd_audigy_i2c_volume_put,			\
980	.tlv = { .p = snd_audigy_db_scale2 },			\
981	.private_value = chid					\
982}
983
984
985static struct snd_kcontrol_new snd_audigy_i2c_volume_ctls[] __devinitdata = {
986	I2C_VOLUME("Mic Capture Volume", 0),
987	I2C_VOLUME("Line Capture Volume", 0)
988};
989
990
991static int snd_emu10k1_spdif_put(struct snd_kcontrol *kcontrol,
992                                 struct snd_ctl_elem_value *ucontrol)
993{
994	struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
995	unsigned int idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
996	int change;
997	unsigned int val;
998	unsigned long flags;
999
1000	/* Limit: emu->spdif_bits */
1001	if (idx >= 3)
1002		return -EINVAL;
1003	val = (ucontrol->value.iec958.status[0] << 0) |
1004	      (ucontrol->value.iec958.status[1] << 8) |
1005	      (ucontrol->value.iec958.status[2] << 16) |
1006	      (ucontrol->value.iec958.status[3] << 24);
1007	spin_lock_irqsave(&emu->reg_lock, flags);
1008	change = val != emu->spdif_bits[idx];
1009	if (change) {
1010		snd_emu10k1_ptr_write(emu, SPCS0 + idx, 0, val);
1011		emu->spdif_bits[idx] = val;
1012	}
1013	spin_unlock_irqrestore(&emu->reg_lock, flags);
1014	return change;
1015}
1016
1017static struct snd_kcontrol_new snd_emu10k1_spdif_mask_control =
1018{
1019	.access =	SNDRV_CTL_ELEM_ACCESS_READ,
1020	.iface =        SNDRV_CTL_ELEM_IFACE_PCM,
1021	.name =         SNDRV_CTL_NAME_IEC958("",PLAYBACK,MASK),
1022	.count =	3,
1023	.info =         snd_emu10k1_spdif_info,
1024	.get =          snd_emu10k1_spdif_get_mask
1025};
1026
1027static struct snd_kcontrol_new snd_emu10k1_spdif_control =
1028{
1029	.iface =	SNDRV_CTL_ELEM_IFACE_PCM,
1030	.name =         SNDRV_CTL_NAME_IEC958("",PLAYBACK,DEFAULT),
1031	.count =	3,
1032	.info =         snd_emu10k1_spdif_info,
1033	.get =          snd_emu10k1_spdif_get,
1034	.put =          snd_emu10k1_spdif_put
1035};
1036
1037
1038static void update_emu10k1_fxrt(struct snd_emu10k1 *emu, int voice, unsigned char *route)
1039{
1040	if (emu->audigy) {
1041		snd_emu10k1_ptr_write(emu, A_FXRT1, voice,
1042				      snd_emu10k1_compose_audigy_fxrt1(route));
1043		snd_emu10k1_ptr_write(emu, A_FXRT2, voice,
1044				      snd_emu10k1_compose_audigy_fxrt2(route));
1045	} else {
1046		snd_emu10k1_ptr_write(emu, FXRT, voice,
1047				      snd_emu10k1_compose_send_routing(route));
1048	}
1049}
1050
1051static void update_emu10k1_send_volume(struct snd_emu10k1 *emu, int voice, unsigned char *volume)
1052{
1053	snd_emu10k1_ptr_write(emu, PTRX_FXSENDAMOUNT_A, voice, volume[0]);
1054	snd_emu10k1_ptr_write(emu, PTRX_FXSENDAMOUNT_B, voice, volume[1]);
1055	snd_emu10k1_ptr_write(emu, PSST_FXSENDAMOUNT_C, voice, volume[2]);
1056	snd_emu10k1_ptr_write(emu, DSL_FXSENDAMOUNT_D, voice, volume[3]);
1057	if (emu->audigy) {
1058		unsigned int val = ((unsigned int)volume[4] << 24) |
1059			((unsigned int)volume[5] << 16) |
1060			((unsigned int)volume[6] << 8) |
1061			(unsigned int)volume[7];
1062		snd_emu10k1_ptr_write(emu, A_SENDAMOUNTS, voice, val);
1063	}
1064}
1065
1066/* PCM stream controls */
1067
1068static int snd_emu10k1_send_routing_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
1069{
1070	struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1071	uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
1072	uinfo->count = emu->audigy ? 3*8 : 3*4;
1073	uinfo->value.integer.min = 0;
1074	uinfo->value.integer.max = emu->audigy ? 0x3f : 0x0f;
1075	return 0;
1076}
1077
1078static int snd_emu10k1_send_routing_get(struct snd_kcontrol *kcontrol,
1079                                        struct snd_ctl_elem_value *ucontrol)
1080{
1081	unsigned long flags;
1082	struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1083	struct snd_emu10k1_pcm_mixer *mix =
1084		&emu->pcm_mixer[snd_ctl_get_ioffidx(kcontrol, &ucontrol->id)];
1085	int voice, idx;
1086	int num_efx = emu->audigy ? 8 : 4;
1087	int mask = emu->audigy ? 0x3f : 0x0f;
1088
1089	spin_lock_irqsave(&emu->reg_lock, flags);
1090	for (voice = 0; voice < 3; voice++)
1091		for (idx = 0; idx < num_efx; idx++)
1092			ucontrol->value.integer.value[(voice * num_efx) + idx] =
1093				mix->send_routing[voice][idx] & mask;
1094	spin_unlock_irqrestore(&emu->reg_lock, flags);
1095	return 0;
1096}
1097
1098static int snd_emu10k1_send_routing_put(struct snd_kcontrol *kcontrol,
1099                                        struct snd_ctl_elem_value *ucontrol)
1100{
1101	unsigned long flags;
1102	struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1103	struct snd_emu10k1_pcm_mixer *mix =
1104		&emu->pcm_mixer[snd_ctl_get_ioffidx(kcontrol, &ucontrol->id)];
1105	int change = 0, voice, idx, val;
1106	int num_efx = emu->audigy ? 8 : 4;
1107	int mask = emu->audigy ? 0x3f : 0x0f;
1108
1109	spin_lock_irqsave(&emu->reg_lock, flags);
1110	for (voice = 0; voice < 3; voice++)
1111		for (idx = 0; idx < num_efx; idx++) {
1112			val = ucontrol->value.integer.value[(voice * num_efx) + idx] & mask;
1113			if (mix->send_routing[voice][idx] != val) {
1114				mix->send_routing[voice][idx] = val;
1115				change = 1;
1116			}
1117		}
1118	if (change && mix->epcm) {
1119		if (mix->epcm->voices[0] && mix->epcm->voices[1]) {
1120			update_emu10k1_fxrt(emu, mix->epcm->voices[0]->number,
1121					    &mix->send_routing[1][0]);
1122			update_emu10k1_fxrt(emu, mix->epcm->voices[1]->number,
1123					    &mix->send_routing[2][0]);
1124		} else if (mix->epcm->voices[0]) {
1125			update_emu10k1_fxrt(emu, mix->epcm->voices[0]->number,
1126					    &mix->send_routing[0][0]);
1127		}
1128	}
1129	spin_unlock_irqrestore(&emu->reg_lock, flags);
1130	return change;
1131}
1132
1133static struct snd_kcontrol_new snd_emu10k1_send_routing_control =
1134{
1135	.access =	SNDRV_CTL_ELEM_ACCESS_READWRITE | SNDRV_CTL_ELEM_ACCESS_INACTIVE,
1136	.iface =        SNDRV_CTL_ELEM_IFACE_PCM,
1137	.name =         "EMU10K1 PCM Send Routing",
1138	.count =	32,
1139	.info =         snd_emu10k1_send_routing_info,
1140	.get =          snd_emu10k1_send_routing_get,
1141	.put =          snd_emu10k1_send_routing_put
1142};
1143
1144static int snd_emu10k1_send_volume_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
1145{
1146	struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1147	uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
1148	uinfo->count = emu->audigy ? 3*8 : 3*4;
1149	uinfo->value.integer.min = 0;
1150	uinfo->value.integer.max = 255;
1151	return 0;
1152}
1153
1154static int snd_emu10k1_send_volume_get(struct snd_kcontrol *kcontrol,
1155                                       struct snd_ctl_elem_value *ucontrol)
1156{
1157	unsigned long flags;
1158	struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1159	struct snd_emu10k1_pcm_mixer *mix =
1160		&emu->pcm_mixer[snd_ctl_get_ioffidx(kcontrol, &ucontrol->id)];
1161	int idx;
1162	int num_efx = emu->audigy ? 8 : 4;
1163
1164	spin_lock_irqsave(&emu->reg_lock, flags);
1165	for (idx = 0; idx < 3*num_efx; idx++)
1166		ucontrol->value.integer.value[idx] = mix->send_volume[idx/num_efx][idx%num_efx];
1167	spin_unlock_irqrestore(&emu->reg_lock, flags);
1168	return 0;
1169}
1170
1171static int snd_emu10k1_send_volume_put(struct snd_kcontrol *kcontrol,
1172                                       struct snd_ctl_elem_value *ucontrol)
1173{
1174	unsigned long flags;
1175	struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1176	struct snd_emu10k1_pcm_mixer *mix =
1177		&emu->pcm_mixer[snd_ctl_get_ioffidx(kcontrol, &ucontrol->id)];
1178	int change = 0, idx, val;
1179	int num_efx = emu->audigy ? 8 : 4;
1180
1181	spin_lock_irqsave(&emu->reg_lock, flags);
1182	for (idx = 0; idx < 3*num_efx; idx++) {
1183		val = ucontrol->value.integer.value[idx] & 255;
1184		if (mix->send_volume[idx/num_efx][idx%num_efx] != val) {
1185			mix->send_volume[idx/num_efx][idx%num_efx] = val;
1186			change = 1;
1187		}
1188	}
1189	if (change && mix->epcm) {
1190		if (mix->epcm->voices[0] && mix->epcm->voices[1]) {
1191			update_emu10k1_send_volume(emu, mix->epcm->voices[0]->number,
1192						   &mix->send_volume[1][0]);
1193			update_emu10k1_send_volume(emu, mix->epcm->voices[1]->number,
1194						   &mix->send_volume[2][0]);
1195		} else if (mix->epcm->voices[0]) {
1196			update_emu10k1_send_volume(emu, mix->epcm->voices[0]->number,
1197						   &mix->send_volume[0][0]);
1198		}
1199	}
1200	spin_unlock_irqrestore(&emu->reg_lock, flags);
1201	return change;
1202}
1203
1204static struct snd_kcontrol_new snd_emu10k1_send_volume_control =
1205{
1206	.access =	SNDRV_CTL_ELEM_ACCESS_READWRITE | SNDRV_CTL_ELEM_ACCESS_INACTIVE,
1207	.iface =        SNDRV_CTL_ELEM_IFACE_PCM,
1208	.name =         "EMU10K1 PCM Send Volume",
1209	.count =	32,
1210	.info =         snd_emu10k1_send_volume_info,
1211	.get =          snd_emu10k1_send_volume_get,
1212	.put =          snd_emu10k1_send_volume_put
1213};
1214
1215static int snd_emu10k1_attn_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
1216{
1217	uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
1218	uinfo->count = 3;
1219	uinfo->value.integer.min = 0;
1220	uinfo->value.integer.max = 0xffff;
1221	return 0;
1222}
1223
1224static int snd_emu10k1_attn_get(struct snd_kcontrol *kcontrol,
1225                                struct snd_ctl_elem_value *ucontrol)
1226{
1227	struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1228	struct snd_emu10k1_pcm_mixer *mix =
1229		&emu->pcm_mixer[snd_ctl_get_ioffidx(kcontrol, &ucontrol->id)];
1230	unsigned long flags;
1231	int idx;
1232
1233	spin_lock_irqsave(&emu->reg_lock, flags);
1234	for (idx = 0; idx < 3; idx++)
1235		ucontrol->value.integer.value[idx] = mix->attn[idx];
1236	spin_unlock_irqrestore(&emu->reg_lock, flags);
1237	return 0;
1238}
1239
1240static int snd_emu10k1_attn_put(struct snd_kcontrol *kcontrol,
1241				struct snd_ctl_elem_value *ucontrol)
1242{
1243	unsigned long flags;
1244	struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1245	struct snd_emu10k1_pcm_mixer *mix =
1246		&emu->pcm_mixer[snd_ctl_get_ioffidx(kcontrol, &ucontrol->id)];
1247	int change = 0, idx, val;
1248
1249	spin_lock_irqsave(&emu->reg_lock, flags);
1250	for (idx = 0; idx < 3; idx++) {
1251		val = ucontrol->value.integer.value[idx] & 0xffff;
1252		if (mix->attn[idx] != val) {
1253			mix->attn[idx] = val;
1254			change = 1;
1255		}
1256	}
1257	if (change && mix->epcm) {
1258		if (mix->epcm->voices[0] && mix->epcm->voices[1]) {
1259			snd_emu10k1_ptr_write(emu, VTFT_VOLUMETARGET, mix->epcm->voices[0]->number, mix->attn[1]);
1260			snd_emu10k1_ptr_write(emu, VTFT_VOLUMETARGET, mix->epcm->voices[1]->number, mix->attn[2]);
1261		} else if (mix->epcm->voices[0]) {
1262			snd_emu10k1_ptr_write(emu, VTFT_VOLUMETARGET, mix->epcm->voices[0]->number, mix->attn[0]);
1263		}
1264	}
1265	spin_unlock_irqrestore(&emu->reg_lock, flags);
1266	return change;
1267}
1268
1269static struct snd_kcontrol_new snd_emu10k1_attn_control =
1270{
1271	.access =	SNDRV_CTL_ELEM_ACCESS_READWRITE | SNDRV_CTL_ELEM_ACCESS_INACTIVE,
1272	.iface =        SNDRV_CTL_ELEM_IFACE_PCM,
1273	.name =         "EMU10K1 PCM Volume",
1274	.count =	32,
1275	.info =         snd_emu10k1_attn_info,
1276	.get =          snd_emu10k1_attn_get,
1277	.put =          snd_emu10k1_attn_put
1278};
1279
1280/* Mutichannel PCM stream controls */
1281
1282static int snd_emu10k1_efx_send_routing_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
1283{
1284	struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1285	uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
1286	uinfo->count = emu->audigy ? 8 : 4;
1287	uinfo->value.integer.min = 0;
1288	uinfo->value.integer.max = emu->audigy ? 0x3f : 0x0f;
1289	return 0;
1290}
1291
1292static int snd_emu10k1_efx_send_routing_get(struct snd_kcontrol *kcontrol,
1293                                        struct snd_ctl_elem_value *ucontrol)
1294{
1295	unsigned long flags;
1296	struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1297	struct snd_emu10k1_pcm_mixer *mix =
1298		&emu->efx_pcm_mixer[snd_ctl_get_ioffidx(kcontrol, &ucontrol->id)];
1299	int idx;
1300	int num_efx = emu->audigy ? 8 : 4;
1301	int mask = emu->audigy ? 0x3f : 0x0f;
1302
1303	spin_lock_irqsave(&emu->reg_lock, flags);
1304	for (idx = 0; idx < num_efx; idx++)
1305		ucontrol->value.integer.value[idx] =
1306			mix->send_routing[0][idx] & mask;
1307	spin_unlock_irqrestore(&emu->reg_lock, flags);
1308	return 0;
1309}
1310
1311static int snd_emu10k1_efx_send_routing_put(struct snd_kcontrol *kcontrol,
1312                                        struct snd_ctl_elem_value *ucontrol)
1313{
1314	unsigned long flags;
1315	struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1316	int ch = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
1317	struct snd_emu10k1_pcm_mixer *mix = &emu->efx_pcm_mixer[ch];
1318	int change = 0, idx, val;
1319	int num_efx = emu->audigy ? 8 : 4;
1320	int mask = emu->audigy ? 0x3f : 0x0f;
1321
1322	spin_lock_irqsave(&emu->reg_lock, flags);
1323	for (idx = 0; idx < num_efx; idx++) {
1324		val = ucontrol->value.integer.value[idx] & mask;
1325		if (mix->send_routing[0][idx] != val) {
1326			mix->send_routing[0][idx] = val;
1327			change = 1;
1328		}
1329	}
1330
1331	if (change && mix->epcm) {
1332		if (mix->epcm->voices[ch]) {
1333			update_emu10k1_fxrt(emu, mix->epcm->voices[ch]->number,
1334					&mix->send_routing[0][0]);
1335		}
1336	}
1337	spin_unlock_irqrestore(&emu->reg_lock, flags);
1338	return change;
1339}
1340
1341static struct snd_kcontrol_new snd_emu10k1_efx_send_routing_control =
1342{
1343	.access =	SNDRV_CTL_ELEM_ACCESS_READWRITE | SNDRV_CTL_ELEM_ACCESS_INACTIVE,
1344	.iface =        SNDRV_CTL_ELEM_IFACE_PCM,
1345	.name =         "Multichannel PCM Send Routing",
1346	.count =	16,
1347	.info =         snd_emu10k1_efx_send_routing_info,
1348	.get =          snd_emu10k1_efx_send_routing_get,
1349	.put =          snd_emu10k1_efx_send_routing_put
1350};
1351
1352static int snd_emu10k1_efx_send_volume_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
1353{
1354	struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1355	uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
1356	uinfo->count = emu->audigy ? 8 : 4;
1357	uinfo->value.integer.min = 0;
1358	uinfo->value.integer.max = 255;
1359	return 0;
1360}
1361
1362static int snd_emu10k1_efx_send_volume_get(struct snd_kcontrol *kcontrol,
1363                                       struct snd_ctl_elem_value *ucontrol)
1364{
1365	unsigned long flags;
1366	struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1367	struct snd_emu10k1_pcm_mixer *mix =
1368		&emu->efx_pcm_mixer[snd_ctl_get_ioffidx(kcontrol, &ucontrol->id)];
1369	int idx;
1370	int num_efx = emu->audigy ? 8 : 4;
1371
1372	spin_lock_irqsave(&emu->reg_lock, flags);
1373	for (idx = 0; idx < num_efx; idx++)
1374		ucontrol->value.integer.value[idx] = mix->send_volume[0][idx];
1375	spin_unlock_irqrestore(&emu->reg_lock, flags);
1376	return 0;
1377}
1378
1379static int snd_emu10k1_efx_send_volume_put(struct snd_kcontrol *kcontrol,
1380                                       struct snd_ctl_elem_value *ucontrol)
1381{
1382	unsigned long flags;
1383	struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1384	int ch = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
1385	struct snd_emu10k1_pcm_mixer *mix = &emu->efx_pcm_mixer[ch];
1386	int change = 0, idx, val;
1387	int num_efx = emu->audigy ? 8 : 4;
1388
1389	spin_lock_irqsave(&emu->reg_lock, flags);
1390	for (idx = 0; idx < num_efx; idx++) {
1391		val = ucontrol->value.integer.value[idx] & 255;
1392		if (mix->send_volume[0][idx] != val) {
1393			mix->send_volume[0][idx] = val;
1394			change = 1;
1395		}
1396	}
1397	if (change && mix->epcm) {
1398		if (mix->epcm->voices[ch]) {
1399			update_emu10k1_send_volume(emu, mix->epcm->voices[ch]->number,
1400						   &mix->send_volume[0][0]);
1401		}
1402	}
1403	spin_unlock_irqrestore(&emu->reg_lock, flags);
1404	return change;
1405}
1406
1407
1408static struct snd_kcontrol_new snd_emu10k1_efx_send_volume_control =
1409{
1410	.access =	SNDRV_CTL_ELEM_ACCESS_READWRITE | SNDRV_CTL_ELEM_ACCESS_INACTIVE,
1411	.iface =        SNDRV_CTL_ELEM_IFACE_PCM,
1412	.name =         "Multichannel PCM Send Volume",
1413	.count =	16,
1414	.info =         snd_emu10k1_efx_send_volume_info,
1415	.get =          snd_emu10k1_efx_send_volume_get,
1416	.put =          snd_emu10k1_efx_send_volume_put
1417};
1418
1419static int snd_emu10k1_efx_attn_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
1420{
1421	uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
1422	uinfo->count = 1;
1423	uinfo->value.integer.min = 0;
1424	uinfo->value.integer.max = 0xffff;
1425	return 0;
1426}
1427
1428static int snd_emu10k1_efx_attn_get(struct snd_kcontrol *kcontrol,
1429                                struct snd_ctl_elem_value *ucontrol)
1430{
1431	struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1432	struct snd_emu10k1_pcm_mixer *mix =
1433		&emu->efx_pcm_mixer[snd_ctl_get_ioffidx(kcontrol, &ucontrol->id)];
1434	unsigned long flags;
1435
1436	spin_lock_irqsave(&emu->reg_lock, flags);
1437	ucontrol->value.integer.value[0] = mix->attn[0];
1438	spin_unlock_irqrestore(&emu->reg_lock, flags);
1439	return 0;
1440}
1441
1442static int snd_emu10k1_efx_attn_put(struct snd_kcontrol *kcontrol,
1443				struct snd_ctl_elem_value *ucontrol)
1444{
1445	unsigned long flags;
1446	struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1447	int ch = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
1448	struct snd_emu10k1_pcm_mixer *mix = &emu->efx_pcm_mixer[ch];
1449	int change = 0, val;
1450
1451	spin_lock_irqsave(&emu->reg_lock, flags);
1452	val = ucontrol->value.integer.value[0] & 0xffff;
1453	if (mix->attn[0] != val) {
1454		mix->attn[0] = val;
1455		change = 1;
1456	}
1457	if (change && mix->epcm) {
1458		if (mix->epcm->voices[ch]) {
1459			snd_emu10k1_ptr_write(emu, VTFT_VOLUMETARGET, mix->epcm->voices[ch]->number, mix->attn[0]);
1460		}
1461	}
1462	spin_unlock_irqrestore(&emu->reg_lock, flags);
1463	return change;
1464}
1465
1466static struct snd_kcontrol_new snd_emu10k1_efx_attn_control =
1467{
1468	.access =	SNDRV_CTL_ELEM_ACCESS_READWRITE | SNDRV_CTL_ELEM_ACCESS_INACTIVE,
1469	.iface =        SNDRV_CTL_ELEM_IFACE_PCM,
1470	.name =         "Multichannel PCM Volume",
1471	.count =	16,
1472	.info =         snd_emu10k1_efx_attn_info,
1473	.get =          snd_emu10k1_efx_attn_get,
1474	.put =          snd_emu10k1_efx_attn_put
1475};
1476
1477#define snd_emu10k1_shared_spdif_info	snd_ctl_boolean_mono_info
1478
1479static int snd_emu10k1_shared_spdif_get(struct snd_kcontrol *kcontrol,
1480					struct snd_ctl_elem_value *ucontrol)
1481{
1482	struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1483
1484	if (emu->audigy)
1485		ucontrol->value.integer.value[0] = inl(emu->port + A_IOCFG) & A_IOCFG_GPOUT0 ? 1 : 0;
1486	else
1487		ucontrol->value.integer.value[0] = inl(emu->port + HCFG) & HCFG_GPOUT0 ? 1 : 0;
1488	if (emu->card_capabilities->invert_shared_spdif)
1489		ucontrol->value.integer.value[0] =
1490			!ucontrol->value.integer.value[0];
1491
1492	return 0;
1493}
1494
1495static int snd_emu10k1_shared_spdif_put(struct snd_kcontrol *kcontrol,
1496					struct snd_ctl_elem_value *ucontrol)
1497{
1498	unsigned long flags;
1499	struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1500	unsigned int reg, val, sw;
1501	int change = 0;
1502
1503	sw = ucontrol->value.integer.value[0];
1504	if (emu->card_capabilities->invert_shared_spdif)
1505		sw = !sw;
1506	spin_lock_irqsave(&emu->reg_lock, flags);
1507	if ( emu->card_capabilities->i2c_adc) {
1508		/* Do nothing for Audigy 2 ZS Notebook */
1509	} else if (emu->audigy) {
1510		reg = inl(emu->port + A_IOCFG);
1511		val = sw ? A_IOCFG_GPOUT0 : 0;
1512		change = (reg & A_IOCFG_GPOUT0) != val;
1513		if (change) {
1514			reg &= ~A_IOCFG_GPOUT0;
1515			reg |= val;
1516			outl(reg | val, emu->port + A_IOCFG);
1517		}
1518	}
1519	reg = inl(emu->port + HCFG);
1520	val = sw ? HCFG_GPOUT0 : 0;
1521	change |= (reg & HCFG_GPOUT0) != val;
1522	if (change) {
1523		reg &= ~HCFG_GPOUT0;
1524		reg |= val;
1525		outl(reg | val, emu->port + HCFG);
1526	}
1527	spin_unlock_irqrestore(&emu->reg_lock, flags);
1528	return change;
1529}
1530
1531static struct snd_kcontrol_new snd_emu10k1_shared_spdif __devinitdata =
1532{
1533	.iface =	SNDRV_CTL_ELEM_IFACE_MIXER,
1534	.name =		"SB Live Analog/Digital Output Jack",
1535	.info =		snd_emu10k1_shared_spdif_info,
1536	.get =		snd_emu10k1_shared_spdif_get,
1537	.put =		snd_emu10k1_shared_spdif_put
1538};
1539
1540static struct snd_kcontrol_new snd_audigy_shared_spdif __devinitdata =
1541{
1542	.iface =	SNDRV_CTL_ELEM_IFACE_MIXER,
1543	.name =		"Audigy Analog/Digital Output Jack",
1544	.info =		snd_emu10k1_shared_spdif_info,
1545	.get =		snd_emu10k1_shared_spdif_get,
1546	.put =		snd_emu10k1_shared_spdif_put
1547};
1548
1549
1550#define snd_audigy_capture_boost_info	snd_ctl_boolean_mono_info
1551
1552static int snd_audigy_capture_boost_get(struct snd_kcontrol *kcontrol,
1553					struct snd_ctl_elem_value *ucontrol)
1554{
1555	struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1556	unsigned int val;
1557
1558	val = snd_ac97_read(emu->ac97, AC97_REC_GAIN);
1559	ucontrol->value.integer.value[0] = !!val;
1560	return 0;
1561}
1562
1563static int snd_audigy_capture_boost_put(struct snd_kcontrol *kcontrol,
1564					struct snd_ctl_elem_value *ucontrol)
1565{
1566	struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1567	unsigned int val;
1568
1569	if (ucontrol->value.integer.value[0])
1570		val = 0x0f0f;
1571	else
1572		val = 0;
1573	return snd_ac97_update(emu->ac97, AC97_REC_GAIN, val);
1574}
1575
1576static struct snd_kcontrol_new snd_audigy_capture_boost __devinitdata =
1577{
1578	.iface =	SNDRV_CTL_ELEM_IFACE_MIXER,
1579	.name =		"Analog Capture Boost",
1580	.info =		snd_audigy_capture_boost_info,
1581	.get =		snd_audigy_capture_boost_get,
1582	.put =		snd_audigy_capture_boost_put
1583};
1584
1585
1586/*
1587 */
1588static void snd_emu10k1_mixer_free_ac97(struct snd_ac97 *ac97)
1589{
1590	struct snd_emu10k1 *emu = ac97->private_data;
1591	emu->ac97 = NULL;
1592}
1593
1594/*
1595 */
1596static int remove_ctl(struct snd_card *card, const char *name)
1597{
1598	struct snd_ctl_elem_id id;
1599	memset(&id, 0, sizeof(id));
1600	strcpy(id.name, name);
1601	id.iface = SNDRV_CTL_ELEM_IFACE_MIXER;
1602	return snd_ctl_remove_id(card, &id);
1603}
1604
1605static struct snd_kcontrol *ctl_find(struct snd_card *card, const char *name)
1606{
1607	struct snd_ctl_elem_id sid;
1608	memset(&sid, 0, sizeof(sid));
1609	strcpy(sid.name, name);
1610	sid.iface = SNDRV_CTL_ELEM_IFACE_MIXER;
1611	return snd_ctl_find_id(card, &sid);
1612}
1613
1614static int rename_ctl(struct snd_card *card, const char *src, const char *dst)
1615{
1616	struct snd_kcontrol *kctl = ctl_find(card, src);
1617	if (kctl) {
1618		strcpy(kctl->id.name, dst);
1619		return 0;
1620	}
1621	return -ENOENT;
1622}
1623
1624int __devinit snd_emu10k1_mixer(struct snd_emu10k1 *emu,
1625				int pcm_device, int multi_device)
1626{
1627	int err, pcm;
1628	struct snd_kcontrol *kctl;
1629	struct snd_card *card = emu->card;
1630	char **c;
1631	static char *emu10k1_remove_ctls[] = {
1632		/* no AC97 mono, surround, center/lfe */
1633		"Master Mono Playback Switch",
1634		"Master Mono Playback Volume",
1635		"PCM Out Path & Mute",
1636		"Mono Output Select",
1637		"Front Playback Switch",
1638		"Front Playback Volume",
1639		"Surround Playback Switch",
1640		"Surround Playback Volume",
1641		"Center Playback Switch",
1642		"Center Playback Volume",
1643		"LFE Playback Switch",
1644		"LFE Playback Volume",
1645		NULL
1646	};
1647	static char *emu10k1_rename_ctls[] = {
1648		"Surround Digital Playback Volume", "Surround Playback Volume",
1649		"Center Digital Playback Volume", "Center Playback Volume",
1650		"LFE Digital Playback Volume", "LFE Playback Volume",
1651		NULL
1652	};
1653	static char *audigy_remove_ctls[] = {
1654		/* Master/PCM controls on ac97 of Audigy has no effect */
1655		/* On the Audigy2 the AC97 playback is piped into
1656		 * the Philips ADC for 24bit capture */
1657		"PCM Playback Switch",
1658		"PCM Playback Volume",
1659		"Master Mono Playback Switch",
1660		"Master Mono Playback Volume",
1661		"Master Playback Switch",
1662		"Master Playback Volume",
1663		"PCM Out Path & Mute",
1664		"Mono Output Select",
1665		/* remove unused AC97 capture controls */
1666		"Capture Source",
1667		"Capture Switch",
1668		"Capture Volume",
1669		"Mic Select",
1670		"Video Playback Switch",
1671		"Video Playback Volume",
1672		"Mic Playback Switch",
1673		"Mic Playback Volume",
1674		NULL
1675	};
1676	static char *audigy_rename_ctls[] = {
1677		/* use conventional names */
1678		"Wave Playback Volume", "PCM Playback Volume",
1679		/* "Wave Capture Volume", "PCM Capture Volume", */
1680		"Wave Master Playback Volume", "Master Playback Volume",
1681		"AMic Playback Volume", "Mic Playback Volume",
1682		NULL
1683	};
1684	static char *audigy_rename_ctls_i2c_adc[] = {
1685		//"Analog Mix Capture Volume","OLD Analog Mix Capture Volume",
1686		"Line Capture Volume", "Analog Mix Capture Volume",
1687		"Wave Playback Volume", "OLD PCM Playback Volume",
1688		"Wave Master Playback Volume", "Master Playback Volume",
1689		"AMic Playback Volume", "Old Mic Playback Volume",
1690		"CD Capture Volume", "IEC958 Optical Capture Volume",
1691		NULL
1692	};
1693	static char *audigy_remove_ctls_i2c_adc[] = {
1694		/* On the Audigy2 ZS Notebook
1695		 * Capture via WM8775  */
1696		"Mic Capture Volume",
1697		"Analog Mix Capture Volume",
1698		"Aux Capture Volume",
1699		"IEC958 Optical Capture Volume",
1700		NULL
1701	};
1702	static char *audigy_remove_ctls_1361t_adc[] = {
1703		/* On the Audigy2 the AC97 playback is piped into
1704		 * the Philips ADC for 24bit capture */
1705		"PCM Playback Switch",
1706		"PCM Playback Volume",
1707		"Master Mono Playback Switch",
1708		"Master Mono Playback Volume",
1709		"Capture Source",
1710		"Capture Switch",
1711		"Capture Volume",
1712		"Mic Capture Volume",
1713		"Headphone Playback Switch",
1714		"Headphone Playback Volume",
1715		"3D Control - Center",
1716		"3D Control - Depth",
1717		"3D Control - Switch",
1718		"Line2 Playback Volume",
1719		"Line2 Capture Volume",
1720		NULL
1721	};
1722	static char *audigy_rename_ctls_1361t_adc[] = {
1723		"Master Playback Switch", "Master Capture Switch",
1724		"Master Playback Volume", "Master Capture Volume",
1725		"Wave Master Playback Volume", "Master Playback Volume",
1726		"Beep Playback Switch", "Beep Capture Switch",
1727		"Beep Playback Volume", "Beep Capture Volume",
1728		"Phone Playback Switch", "Phone Capture Switch",
1729		"Phone Playback Volume", "Phone Capture Volume",
1730		"Mic Playback Switch", "Mic Capture Switch",
1731		"Mic Playback Volume", "Mic Capture Volume",
1732		"Line Playback Switch", "Line Capture Switch",
1733		"Line Playback Volume", "Line Capture Volume",
1734		"CD Playback Switch", "CD Capture Switch",
1735		"CD Playback Volume", "CD Capture Volume",
1736		"Aux Playback Switch", "Aux Capture Switch",
1737		"Aux Playback Volume", "Aux Capture Volume",
1738		"Video Playback Switch", "Video Capture Switch",
1739		"Video Playback Volume", "Video Capture Volume",
1740
1741		NULL
1742	};
1743
1744	if (emu->card_capabilities->ac97_chip) {
1745		struct snd_ac97_bus *pbus;
1746		struct snd_ac97_template ac97;
1747		static struct snd_ac97_bus_ops ops = {
1748			.write = snd_emu10k1_ac97_write,
1749			.read = snd_emu10k1_ac97_read,
1750		};
1751
1752		if ((err = snd_ac97_bus(emu->card, 0, &ops, NULL, &pbus)) < 0)
1753			return err;
1754		pbus->no_vra = 1; /* we don't need VRA */
1755
1756		memset(&ac97, 0, sizeof(ac97));
1757		ac97.private_data = emu;
1758		ac97.private_free = snd_emu10k1_mixer_free_ac97;
1759		ac97.scaps = AC97_SCAP_NO_SPDIF;
1760		if ((err = snd_ac97_mixer(pbus, &ac97, &emu->ac97)) < 0) {
1761			if (emu->card_capabilities->ac97_chip == 1)
1762				return err;
1763			snd_printd(KERN_INFO "emu10k1: AC97 is optional on this board\n");
1764			snd_printd(KERN_INFO"          Proceeding without ac97 mixers...\n");
1765			snd_device_free(emu->card, pbus);
1766			goto no_ac97;
1767		}
1768		if (emu->audigy) {
1769			/* set master volume to 0 dB */
1770			snd_ac97_write_cache(emu->ac97, AC97_MASTER, 0x0000);
1771			/* set capture source to mic */
1772			snd_ac97_write_cache(emu->ac97, AC97_REC_SEL, 0x0000);
1773			if (emu->card_capabilities->adc_1361t)
1774				c = audigy_remove_ctls_1361t_adc;
1775			else
1776				c = audigy_remove_ctls;
1777		} else {
1778			/*
1779			 * Credits for cards based on STAC9758:
1780			 *   James Courtier-Dutton <James@superbug.demon.co.uk>
1781			 *   Voluspa <voluspa@comhem.se>
1782			 */
1783			if (emu->ac97->id == AC97_ID_STAC9758) {
1784				emu->rear_ac97 = 1;
1785				snd_emu10k1_ptr_write(emu, AC97SLOT, 0, AC97SLOT_CNTR|AC97SLOT_LFE|AC97SLOT_REAR_LEFT|AC97SLOT_REAR_RIGHT);
1786				snd_ac97_write_cache(emu->ac97, AC97_HEADPHONE, 0x0202);
1787			}
1788			/* remove unused AC97 controls */
1789			snd_ac97_write_cache(emu->ac97, AC97_SURROUND_MASTER, 0x0202);
1790			snd_ac97_write_cache(emu->ac97, AC97_CENTER_LFE_MASTER, 0x0202);
1791			c = emu10k1_remove_ctls;
1792		}
1793		for (; *c; c++)
1794			remove_ctl(card, *c);
1795	} else if (emu->card_capabilities->i2c_adc) {
1796		c = audigy_remove_ctls_i2c_adc;
1797		for (; *c; c++)
1798			remove_ctl(card, *c);
1799	} else {
1800	no_ac97:
1801		if (emu->card_capabilities->ecard)
1802			strcpy(emu->card->mixername, "EMU APS");
1803		else if (emu->audigy)
1804			strcpy(emu->card->mixername, "SB Audigy");
1805		else
1806			strcpy(emu->card->mixername, "Emu10k1");
1807	}
1808
1809	if (emu->audigy)
1810		if (emu->card_capabilities->adc_1361t)
1811			c = audigy_rename_ctls_1361t_adc;
1812		else if (emu->card_capabilities->i2c_adc)
1813			c = audigy_rename_ctls_i2c_adc;
1814		else
1815			c = audigy_rename_ctls;
1816	else
1817		c = emu10k1_rename_ctls;
1818	for (; *c; c += 2)
1819		rename_ctl(card, c[0], c[1]);
1820
1821	if (emu->card_capabilities->subsystem == 0x20071102) {  /* Audigy 4 Pro */
1822		rename_ctl(card, "Line2 Capture Volume", "Line1/Mic Capture Volume");
1823		rename_ctl(card, "Analog Mix Capture Volume", "Line2 Capture Volume");
1824		rename_ctl(card, "Aux2 Capture Volume", "Line3 Capture Volume");
1825		rename_ctl(card, "Mic Capture Volume", "Unknown1 Capture Volume");
1826		remove_ctl(card, "Headphone Playback Switch");
1827		remove_ctl(card, "Headphone Playback Volume");
1828		remove_ctl(card, "3D Control - Center");
1829		remove_ctl(card, "3D Control - Depth");
1830		remove_ctl(card, "3D Control - Switch");
1831	}
1832	if ((kctl = emu->ctl_send_routing = snd_ctl_new1(&snd_emu10k1_send_routing_control, emu)) == NULL)
1833		return -ENOMEM;
1834	kctl->id.device = pcm_device;
1835	if ((err = snd_ctl_add(card, kctl)))
1836		return err;
1837	if ((kctl = emu->ctl_send_volume = snd_ctl_new1(&snd_emu10k1_send_volume_control, emu)) == NULL)
1838		return -ENOMEM;
1839	kctl->id.device = pcm_device;
1840	if ((err = snd_ctl_add(card, kctl)))
1841		return err;
1842	if ((kctl = emu->ctl_attn = snd_ctl_new1(&snd_emu10k1_attn_control, emu)) == NULL)
1843		return -ENOMEM;
1844	kctl->id.device = pcm_device;
1845	if ((err = snd_ctl_add(card, kctl)))
1846		return err;
1847
1848	if ((kctl = emu->ctl_efx_send_routing = snd_ctl_new1(&snd_emu10k1_efx_send_routing_control, emu)) == NULL)
1849		return -ENOMEM;
1850	kctl->id.device = multi_device;
1851	if ((err = snd_ctl_add(card, kctl)))
1852		return err;
1853
1854	if ((kctl = emu->ctl_efx_send_volume = snd_ctl_new1(&snd_emu10k1_efx_send_volume_control, emu)) == NULL)
1855		return -ENOMEM;
1856	kctl->id.device = multi_device;
1857	if ((err = snd_ctl_add(card, kctl)))
1858		return err;
1859
1860	if ((kctl = emu->ctl_efx_attn = snd_ctl_new1(&snd_emu10k1_efx_attn_control, emu)) == NULL)
1861		return -ENOMEM;
1862	kctl->id.device = multi_device;
1863	if ((err = snd_ctl_add(card, kctl)))
1864		return err;
1865
1866	/* initialize the routing and volume table for each pcm playback stream */
1867	for (pcm = 0; pcm < 32; pcm++) {
1868		struct snd_emu10k1_pcm_mixer *mix;
1869		int v;
1870
1871		mix = &emu->pcm_mixer[pcm];
1872		mix->epcm = NULL;
1873
1874		for (v = 0; v < 4; v++)
1875			mix->send_routing[0][v] =
1876				mix->send_routing[1][v] =
1877				mix->send_routing[2][v] = v;
1878
1879		memset(&mix->send_volume, 0, sizeof(mix->send_volume));
1880		mix->send_volume[0][0] = mix->send_volume[0][1] =
1881		mix->send_volume[1][0] = mix->send_volume[2][1] = 255;
1882
1883		mix->attn[0] = mix->attn[1] = mix->attn[2] = 0xffff;
1884	}
1885
1886	/* initialize the routing and volume table for the multichannel playback stream */
1887	for (pcm = 0; pcm < NUM_EFX_PLAYBACK; pcm++) {
1888		struct snd_emu10k1_pcm_mixer *mix;
1889		int v;
1890
1891		mix = &emu->efx_pcm_mixer[pcm];
1892		mix->epcm = NULL;
1893
1894		mix->send_routing[0][0] = pcm;
1895		mix->send_routing[0][1] = (pcm == 0) ? 1 : 0;
1896		for (v = 0; v < 2; v++)
1897			mix->send_routing[0][2+v] = 13+v;
1898		if (emu->audigy)
1899			for (v = 0; v < 4; v++)
1900				mix->send_routing[0][4+v] = 60+v;
1901
1902		memset(&mix->send_volume, 0, sizeof(mix->send_volume));
1903		mix->send_volume[0][0]  = 255;
1904
1905		mix->attn[0] = 0xffff;
1906	}
1907
1908	if (! emu->card_capabilities->ecard) {
1909		/* sb live! and audigy */
1910		if ((kctl = snd_ctl_new1(&snd_emu10k1_spdif_mask_control, emu)) == NULL)
1911			return -ENOMEM;
1912		if (!emu->audigy)
1913			kctl->id.device = emu->pcm_efx->device;
1914		if ((err = snd_ctl_add(card, kctl)))
1915			return err;
1916		if ((kctl = snd_ctl_new1(&snd_emu10k1_spdif_control, emu)) == NULL)
1917			return -ENOMEM;
1918		if (!emu->audigy)
1919			kctl->id.device = emu->pcm_efx->device;
1920		if ((err = snd_ctl_add(card, kctl)))
1921			return err;
1922	}
1923
1924	if (emu->card_capabilities->emu_model) {
1925		;  /* Disable the snd_audigy_spdif_shared_spdif */
1926	} else if (emu->audigy) {
1927		if ((kctl = snd_ctl_new1(&snd_audigy_shared_spdif, emu)) == NULL)
1928			return -ENOMEM;
1929		if ((err = snd_ctl_add(card, kctl)))
1930			return err;
1931	} else if (! emu->card_capabilities->ecard) {
1932		/* sb live! */
1933		if ((kctl = snd_ctl_new1(&snd_emu10k1_shared_spdif, emu)) == NULL)
1934			return -ENOMEM;
1935		if ((err = snd_ctl_add(card, kctl)))
1936			return err;
1937	}
1938	if (emu->card_capabilities->ca0151_chip) { /* P16V */
1939		if ((err = snd_p16v_mixer(emu)))
1940			return err;
1941	}
1942
1943	if (emu->card_capabilities->emu_model == EMU_MODEL_EMU1616) {
1944		/* 1616(m) cardbus */
1945		int i;
1946
1947		for (i = 0; i < ARRAY_SIZE(snd_emu1616_output_enum_ctls); i++) {
1948			err = snd_ctl_add(card,
1949				snd_ctl_new1(&snd_emu1616_output_enum_ctls[i],
1950					     emu));
1951			if (err < 0)
1952				return err;
1953		}
1954		for (i = 0; i < ARRAY_SIZE(snd_emu1010_input_enum_ctls); i++) {
1955			err = snd_ctl_add(card,
1956				snd_ctl_new1(&snd_emu1010_input_enum_ctls[i],
1957					     emu));
1958			if (err < 0)
1959				return err;
1960		}
1961		for (i = 0; i < ARRAY_SIZE(snd_emu1010_adc_pads) - 2; i++) {
1962			err = snd_ctl_add(card,
1963				snd_ctl_new1(&snd_emu1010_adc_pads[i], emu));
1964			if (err < 0)
1965				return err;
1966		}
1967		for (i = 0; i < ARRAY_SIZE(snd_emu1010_dac_pads) - 2; i++) {
1968			err = snd_ctl_add(card,
1969				snd_ctl_new1(&snd_emu1010_dac_pads[i], emu));
1970			if (err < 0)
1971				return err;
1972		}
1973		err = snd_ctl_add(card,
1974			snd_ctl_new1(&snd_emu1010_internal_clock, emu));
1975		if (err < 0)
1976			return err;
1977
1978	} else if (emu->card_capabilities->emu_model) {
1979		/* all other e-mu cards for now */
1980		int i;
1981
1982		for (i = 0; i < ARRAY_SIZE(snd_emu1010_output_enum_ctls); i++) {
1983			err = snd_ctl_add(card,
1984				snd_ctl_new1(&snd_emu1010_output_enum_ctls[i],
1985					     emu));
1986			if (err < 0)
1987				return err;
1988		}
1989		for (i = 0; i < ARRAY_SIZE(snd_emu1010_input_enum_ctls); i++) {
1990			err = snd_ctl_add(card,
1991				snd_ctl_new1(&snd_emu1010_input_enum_ctls[i],
1992					     emu));
1993			if (err < 0)
1994				return err;
1995		}
1996		for (i = 0; i < ARRAY_SIZE(snd_emu1010_adc_pads); i++) {
1997			err = snd_ctl_add(card,
1998				snd_ctl_new1(&snd_emu1010_adc_pads[i], emu));
1999			if (err < 0)
2000				return err;
2001		}
2002		for (i = 0; i < ARRAY_SIZE(snd_emu1010_dac_pads); i++) {
2003			err = snd_ctl_add(card,
2004				snd_ctl_new1(&snd_emu1010_dac_pads[i], emu));
2005			if (err < 0)
2006				return err;
2007		}
2008		err = snd_ctl_add(card,
2009			snd_ctl_new1(&snd_emu1010_internal_clock, emu));
2010		if (err < 0)
2011			return err;
2012	}
2013
2014	if ( emu->card_capabilities->i2c_adc) {
2015		int i;
2016
2017		err = snd_ctl_add(card, snd_ctl_new1(&snd_audigy_i2c_capture_source, emu));
2018		if (err < 0)
2019			return err;
2020
2021		for (i = 0; i < ARRAY_SIZE(snd_audigy_i2c_volume_ctls); i++) {
2022			err = snd_ctl_add(card, snd_ctl_new1(&snd_audigy_i2c_volume_ctls[i], emu));
2023			if (err < 0)
2024				return err;
2025		}
2026	}
2027
2028	if (emu->card_capabilities->ac97_chip && emu->audigy) {
2029		err = snd_ctl_add(card, snd_ctl_new1(&snd_audigy_capture_boost,
2030						     emu));
2031		if (err < 0)
2032			return err;
2033	}
2034
2035	return 0;
2036}
2037