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 const char * const 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 const char * const 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
397	if (emu->card_capabilities->emu_model == EMU_MODEL_EMU1616)
398		return snd_ctl_enum_info(uinfo, 1, 49, emu1616_src_texts);
399	else
400		return snd_ctl_enum_info(uinfo, 1, 53, emu1010_src_texts);
401}
402
403static int snd_emu1010_output_source_get(struct snd_kcontrol *kcontrol,
404                                 struct snd_ctl_elem_value *ucontrol)
405{
406	struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
407	unsigned int channel;
408
409	channel = (kcontrol->private_value) & 0xff;
410	/* Limit: emu1010_output_dst, emu->emu1010.output_source */
411	if (channel >= 24 ||
412	    (emu->card_capabilities->emu_model == EMU_MODEL_EMU1616 &&
413	     channel >= 18))
414		return -EINVAL;
415	ucontrol->value.enumerated.item[0] = emu->emu1010.output_source[channel];
416	return 0;
417}
418
419static int snd_emu1010_output_source_put(struct snd_kcontrol *kcontrol,
420                                 struct snd_ctl_elem_value *ucontrol)
421{
422	struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
423	unsigned int val;
424	unsigned int channel;
425
426	val = ucontrol->value.enumerated.item[0];
427	if (val >= 53 ||
428	    (emu->card_capabilities->emu_model == EMU_MODEL_EMU1616 &&
429	     val >= 49))
430		return -EINVAL;
431	channel = (kcontrol->private_value) & 0xff;
432	/* Limit: emu1010_output_dst, emu->emu1010.output_source */
433	if (channel >= 24 ||
434	    (emu->card_capabilities->emu_model == EMU_MODEL_EMU1616 &&
435	     channel >= 18))
436		return -EINVAL;
437	if (emu->emu1010.output_source[channel] == val)
438		return 0;
439	emu->emu1010.output_source[channel] = val;
440	if (emu->card_capabilities->emu_model == EMU_MODEL_EMU1616)
441		snd_emu1010_fpga_link_dst_src_write(emu,
442			emu1616_output_dst[channel], emu1616_src_regs[val]);
443	else
444		snd_emu1010_fpga_link_dst_src_write(emu,
445			emu1010_output_dst[channel], emu1010_src_regs[val]);
446	return 1;
447}
448
449static int snd_emu1010_input_source_get(struct snd_kcontrol *kcontrol,
450                                 struct snd_ctl_elem_value *ucontrol)
451{
452	struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
453	unsigned int channel;
454
455	channel = (kcontrol->private_value) & 0xff;
456	/* Limit: emu1010_input_dst, emu->emu1010.input_source */
457	if (channel >= 22)
458		return -EINVAL;
459	ucontrol->value.enumerated.item[0] = emu->emu1010.input_source[channel];
460	return 0;
461}
462
463static int snd_emu1010_input_source_put(struct snd_kcontrol *kcontrol,
464                                 struct snd_ctl_elem_value *ucontrol)
465{
466	struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
467	unsigned int val;
468	unsigned int channel;
469
470	val = ucontrol->value.enumerated.item[0];
471	if (val >= 53 ||
472	    (emu->card_capabilities->emu_model == EMU_MODEL_EMU1616 &&
473	     val >= 49))
474		return -EINVAL;
475	channel = (kcontrol->private_value) & 0xff;
476	/* Limit: emu1010_input_dst, emu->emu1010.input_source */
477	if (channel >= 22)
478		return -EINVAL;
479	if (emu->emu1010.input_source[channel] == val)
480		return 0;
481	emu->emu1010.input_source[channel] = val;
482	if (emu->card_capabilities->emu_model == EMU_MODEL_EMU1616)
483		snd_emu1010_fpga_link_dst_src_write(emu,
484			emu1010_input_dst[channel], emu1616_src_regs[val]);
485	else
486		snd_emu1010_fpga_link_dst_src_write(emu,
487			emu1010_input_dst[channel], emu1010_src_regs[val]);
488	return 1;
489}
490
491#define EMU1010_SOURCE_OUTPUT(xname,chid) \
492{								\
493	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname,	\
494	.access = SNDRV_CTL_ELEM_ACCESS_READWRITE,		\
495	.info =  snd_emu1010_input_output_source_info,		\
496	.get =   snd_emu1010_output_source_get,			\
497	.put =   snd_emu1010_output_source_put,			\
498	.private_value = chid					\
499}
500
501static struct snd_kcontrol_new snd_emu1010_output_enum_ctls[] = {
502	EMU1010_SOURCE_OUTPUT("Dock DAC1 Left Playback Enum", 0),
503	EMU1010_SOURCE_OUTPUT("Dock DAC1 Right Playback Enum", 1),
504	EMU1010_SOURCE_OUTPUT("Dock DAC2 Left Playback Enum", 2),
505	EMU1010_SOURCE_OUTPUT("Dock DAC2 Right Playback Enum", 3),
506	EMU1010_SOURCE_OUTPUT("Dock DAC3 Left Playback Enum", 4),
507	EMU1010_SOURCE_OUTPUT("Dock DAC3 Right Playback Enum", 5),
508	EMU1010_SOURCE_OUTPUT("Dock DAC4 Left Playback Enum", 6),
509	EMU1010_SOURCE_OUTPUT("Dock DAC4 Right Playback Enum", 7),
510	EMU1010_SOURCE_OUTPUT("Dock Phones Left Playback Enum", 8),
511	EMU1010_SOURCE_OUTPUT("Dock Phones Right Playback Enum", 9),
512	EMU1010_SOURCE_OUTPUT("Dock SPDIF Left Playback Enum", 0xa),
513	EMU1010_SOURCE_OUTPUT("Dock SPDIF Right Playback Enum", 0xb),
514	EMU1010_SOURCE_OUTPUT("1010 SPDIF Left Playback Enum", 0xc),
515	EMU1010_SOURCE_OUTPUT("1010 SPDIF Right Playback Enum", 0xd),
516	EMU1010_SOURCE_OUTPUT("0202 DAC Left Playback Enum", 0xe),
517	EMU1010_SOURCE_OUTPUT("0202 DAC Right Playback Enum", 0xf),
518	EMU1010_SOURCE_OUTPUT("1010 ADAT 0 Playback Enum", 0x10),
519	EMU1010_SOURCE_OUTPUT("1010 ADAT 1 Playback Enum", 0x11),
520	EMU1010_SOURCE_OUTPUT("1010 ADAT 2 Playback Enum", 0x12),
521	EMU1010_SOURCE_OUTPUT("1010 ADAT 3 Playback Enum", 0x13),
522	EMU1010_SOURCE_OUTPUT("1010 ADAT 4 Playback Enum", 0x14),
523	EMU1010_SOURCE_OUTPUT("1010 ADAT 5 Playback Enum", 0x15),
524	EMU1010_SOURCE_OUTPUT("1010 ADAT 6 Playback Enum", 0x16),
525	EMU1010_SOURCE_OUTPUT("1010 ADAT 7 Playback Enum", 0x17),
526};
527
528
529/* 1616(m) cardbus */
530static struct snd_kcontrol_new snd_emu1616_output_enum_ctls[] = {
531	EMU1010_SOURCE_OUTPUT("Dock DAC1 Left Playback Enum", 0),
532	EMU1010_SOURCE_OUTPUT("Dock DAC1 Right Playback Enum", 1),
533	EMU1010_SOURCE_OUTPUT("Dock DAC2 Left Playback Enum", 2),
534	EMU1010_SOURCE_OUTPUT("Dock DAC2 Right Playback Enum", 3),
535	EMU1010_SOURCE_OUTPUT("Dock DAC3 Left Playback Enum", 4),
536	EMU1010_SOURCE_OUTPUT("Dock DAC3 Right Playback Enum", 5),
537	EMU1010_SOURCE_OUTPUT("Dock SPDIF Left Playback Enum", 6),
538	EMU1010_SOURCE_OUTPUT("Dock SPDIF Right Playback Enum", 7),
539	EMU1010_SOURCE_OUTPUT("Dock ADAT 0 Playback Enum", 8),
540	EMU1010_SOURCE_OUTPUT("Dock ADAT 1 Playback Enum", 9),
541	EMU1010_SOURCE_OUTPUT("Dock ADAT 2 Playback Enum", 0xa),
542	EMU1010_SOURCE_OUTPUT("Dock ADAT 3 Playback Enum", 0xb),
543	EMU1010_SOURCE_OUTPUT("Dock ADAT 4 Playback Enum", 0xc),
544	EMU1010_SOURCE_OUTPUT("Dock ADAT 5 Playback Enum", 0xd),
545	EMU1010_SOURCE_OUTPUT("Dock ADAT 6 Playback Enum", 0xe),
546	EMU1010_SOURCE_OUTPUT("Dock ADAT 7 Playback Enum", 0xf),
547	EMU1010_SOURCE_OUTPUT("Mana DAC Left Playback Enum", 0x10),
548	EMU1010_SOURCE_OUTPUT("Mana DAC Right Playback Enum", 0x11),
549};
550
551
552#define EMU1010_SOURCE_INPUT(xname,chid) \
553{								\
554	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname,	\
555	.access = SNDRV_CTL_ELEM_ACCESS_READWRITE,		\
556	.info =  snd_emu1010_input_output_source_info,		\
557	.get =   snd_emu1010_input_source_get,			\
558	.put =   snd_emu1010_input_source_put,			\
559	.private_value = chid					\
560}
561
562static struct snd_kcontrol_new snd_emu1010_input_enum_ctls[] = {
563	EMU1010_SOURCE_INPUT("DSP 0 Capture Enum", 0),
564	EMU1010_SOURCE_INPUT("DSP 1 Capture Enum", 1),
565	EMU1010_SOURCE_INPUT("DSP 2 Capture Enum", 2),
566	EMU1010_SOURCE_INPUT("DSP 3 Capture Enum", 3),
567	EMU1010_SOURCE_INPUT("DSP 4 Capture Enum", 4),
568	EMU1010_SOURCE_INPUT("DSP 5 Capture Enum", 5),
569	EMU1010_SOURCE_INPUT("DSP 6 Capture Enum", 6),
570	EMU1010_SOURCE_INPUT("DSP 7 Capture Enum", 7),
571	EMU1010_SOURCE_INPUT("DSP 8 Capture Enum", 8),
572	EMU1010_SOURCE_INPUT("DSP 9 Capture Enum", 9),
573	EMU1010_SOURCE_INPUT("DSP A Capture Enum", 0xa),
574	EMU1010_SOURCE_INPUT("DSP B Capture Enum", 0xb),
575	EMU1010_SOURCE_INPUT("DSP C Capture Enum", 0xc),
576	EMU1010_SOURCE_INPUT("DSP D Capture Enum", 0xd),
577	EMU1010_SOURCE_INPUT("DSP E Capture Enum", 0xe),
578	EMU1010_SOURCE_INPUT("DSP F Capture Enum", 0xf),
579	EMU1010_SOURCE_INPUT("DSP 10 Capture Enum", 0x10),
580	EMU1010_SOURCE_INPUT("DSP 11 Capture Enum", 0x11),
581	EMU1010_SOURCE_INPUT("DSP 12 Capture Enum", 0x12),
582	EMU1010_SOURCE_INPUT("DSP 13 Capture Enum", 0x13),
583	EMU1010_SOURCE_INPUT("DSP 14 Capture Enum", 0x14),
584	EMU1010_SOURCE_INPUT("DSP 15 Capture Enum", 0x15),
585};
586
587
588
589#define snd_emu1010_adc_pads_info	snd_ctl_boolean_mono_info
590
591static int snd_emu1010_adc_pads_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
592{
593	struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
594	unsigned int mask = kcontrol->private_value & 0xff;
595	ucontrol->value.integer.value[0] = (emu->emu1010.adc_pads & mask) ? 1 : 0;
596	return 0;
597}
598
599static int snd_emu1010_adc_pads_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
600{
601	struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
602	unsigned int mask = kcontrol->private_value & 0xff;
603	unsigned int val, cache;
604	val = ucontrol->value.integer.value[0];
605	cache = emu->emu1010.adc_pads;
606	if (val == 1)
607		cache = cache | mask;
608	else
609		cache = cache & ~mask;
610	if (cache != emu->emu1010.adc_pads) {
611		snd_emu1010_fpga_write(emu, EMU_HANA_ADC_PADS, cache );
612	        emu->emu1010.adc_pads = cache;
613	}
614
615	return 0;
616}
617
618
619
620#define EMU1010_ADC_PADS(xname,chid) \
621{								\
622	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname,	\
623	.access = SNDRV_CTL_ELEM_ACCESS_READWRITE,		\
624	.info =  snd_emu1010_adc_pads_info,			\
625	.get =   snd_emu1010_adc_pads_get,			\
626	.put =   snd_emu1010_adc_pads_put,			\
627	.private_value = chid					\
628}
629
630static struct snd_kcontrol_new snd_emu1010_adc_pads[] = {
631	EMU1010_ADC_PADS("ADC1 14dB PAD Audio Dock Capture Switch", EMU_HANA_DOCK_ADC_PAD1),
632	EMU1010_ADC_PADS("ADC2 14dB PAD Audio Dock Capture Switch", EMU_HANA_DOCK_ADC_PAD2),
633	EMU1010_ADC_PADS("ADC3 14dB PAD Audio Dock Capture Switch", EMU_HANA_DOCK_ADC_PAD3),
634	EMU1010_ADC_PADS("ADC1 14dB PAD 0202 Capture Switch", EMU_HANA_0202_ADC_PAD1),
635};
636
637#define snd_emu1010_dac_pads_info	snd_ctl_boolean_mono_info
638
639static int snd_emu1010_dac_pads_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
640{
641	struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
642	unsigned int mask = kcontrol->private_value & 0xff;
643	ucontrol->value.integer.value[0] = (emu->emu1010.dac_pads & mask) ? 1 : 0;
644	return 0;
645}
646
647static int snd_emu1010_dac_pads_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
648{
649	struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
650	unsigned int mask = kcontrol->private_value & 0xff;
651	unsigned int val, cache;
652	val = ucontrol->value.integer.value[0];
653	cache = emu->emu1010.dac_pads;
654	if (val == 1)
655		cache = cache | mask;
656	else
657		cache = cache & ~mask;
658	if (cache != emu->emu1010.dac_pads) {
659		snd_emu1010_fpga_write(emu, EMU_HANA_DAC_PADS, cache );
660	        emu->emu1010.dac_pads = cache;
661	}
662
663	return 0;
664}
665
666
667
668#define EMU1010_DAC_PADS(xname,chid) \
669{								\
670	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname,	\
671	.access = SNDRV_CTL_ELEM_ACCESS_READWRITE,		\
672	.info =  snd_emu1010_dac_pads_info,			\
673	.get =   snd_emu1010_dac_pads_get,			\
674	.put =   snd_emu1010_dac_pads_put,			\
675	.private_value = chid					\
676}
677
678static struct snd_kcontrol_new snd_emu1010_dac_pads[] = {
679	EMU1010_DAC_PADS("DAC1 Audio Dock 14dB PAD Playback Switch", EMU_HANA_DOCK_DAC_PAD1),
680	EMU1010_DAC_PADS("DAC2 Audio Dock 14dB PAD Playback Switch", EMU_HANA_DOCK_DAC_PAD2),
681	EMU1010_DAC_PADS("DAC3 Audio Dock 14dB PAD Playback Switch", EMU_HANA_DOCK_DAC_PAD3),
682	EMU1010_DAC_PADS("DAC4 Audio Dock 14dB PAD Playback Switch", EMU_HANA_DOCK_DAC_PAD4),
683	EMU1010_DAC_PADS("DAC1 0202 14dB PAD Playback Switch", EMU_HANA_0202_DAC_PAD1),
684};
685
686
687static int snd_emu1010_internal_clock_info(struct snd_kcontrol *kcontrol,
688					  struct snd_ctl_elem_info *uinfo)
689{
690	static const char * const texts[4] = {
691		"44100", "48000", "SPDIF", "ADAT"
692	};
693
694	return snd_ctl_enum_info(uinfo, 1, 4, texts);
695}
696
697static int snd_emu1010_internal_clock_get(struct snd_kcontrol *kcontrol,
698					struct snd_ctl_elem_value *ucontrol)
699{
700	struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
701
702	ucontrol->value.enumerated.item[0] = emu->emu1010.internal_clock;
703	return 0;
704}
705
706static int snd_emu1010_internal_clock_put(struct snd_kcontrol *kcontrol,
707					struct snd_ctl_elem_value *ucontrol)
708{
709	struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
710	unsigned int val;
711	int change = 0;
712
713	val = ucontrol->value.enumerated.item[0] ;
714	/* Limit: uinfo->value.enumerated.items = 4; */
715	if (val >= 4)
716		return -EINVAL;
717	change = (emu->emu1010.internal_clock != val);
718	if (change) {
719		emu->emu1010.internal_clock = val;
720		switch (val) {
721		case 0:
722			/* 44100 */
723			/* Mute all */
724			snd_emu1010_fpga_write(emu, EMU_HANA_UNMUTE, EMU_MUTE );
725			/* Default fallback clock 48kHz */
726			snd_emu1010_fpga_write(emu, EMU_HANA_DEFCLOCK, EMU_HANA_DEFCLOCK_44_1K );
727			/* Word Clock source, Internal 44.1kHz x1 */
728			snd_emu1010_fpga_write(emu, EMU_HANA_WCLOCK,
729			EMU_HANA_WCLOCK_INT_44_1K | EMU_HANA_WCLOCK_1X );
730			/* Set LEDs on Audio Dock */
731			snd_emu1010_fpga_write(emu, EMU_HANA_DOCK_LEDS_2,
732				EMU_HANA_DOCK_LEDS_2_44K | EMU_HANA_DOCK_LEDS_2_LOCK );
733			/* Allow DLL to settle */
734			msleep(10);
735			/* Unmute all */
736			snd_emu1010_fpga_write(emu, EMU_HANA_UNMUTE, EMU_UNMUTE );
737			break;
738		case 1:
739			/* 48000 */
740			/* Mute all */
741			snd_emu1010_fpga_write(emu, EMU_HANA_UNMUTE, EMU_MUTE );
742			/* Default fallback clock 48kHz */
743			snd_emu1010_fpga_write(emu, EMU_HANA_DEFCLOCK, EMU_HANA_DEFCLOCK_48K );
744			/* Word Clock source, Internal 48kHz x1 */
745			snd_emu1010_fpga_write(emu, EMU_HANA_WCLOCK,
746				EMU_HANA_WCLOCK_INT_48K | EMU_HANA_WCLOCK_1X );
747			/* Set LEDs on Audio Dock */
748			snd_emu1010_fpga_write(emu, EMU_HANA_DOCK_LEDS_2,
749				EMU_HANA_DOCK_LEDS_2_48K | EMU_HANA_DOCK_LEDS_2_LOCK );
750			/* Allow DLL to settle */
751			msleep(10);
752			/* Unmute all */
753			snd_emu1010_fpga_write(emu, EMU_HANA_UNMUTE, EMU_UNMUTE );
754			break;
755
756		case 2: /* Take clock from S/PDIF IN */
757			/* Mute all */
758			snd_emu1010_fpga_write(emu, EMU_HANA_UNMUTE, EMU_MUTE );
759			/* Default fallback clock 48kHz */
760			snd_emu1010_fpga_write(emu, EMU_HANA_DEFCLOCK, EMU_HANA_DEFCLOCK_48K );
761			/* Word Clock source, sync to S/PDIF input */
762			snd_emu1010_fpga_write(emu, EMU_HANA_WCLOCK,
763				EMU_HANA_WCLOCK_HANA_SPDIF_IN | EMU_HANA_WCLOCK_1X );
764			/* Set LEDs on Audio Dock */
765			snd_emu1010_fpga_write(emu, EMU_HANA_DOCK_LEDS_2,
766				EMU_HANA_DOCK_LEDS_2_EXT | EMU_HANA_DOCK_LEDS_2_LOCK );
767			/* FIXME: We should set EMU_HANA_DOCK_LEDS_2_LOCK only when clock signal is present and valid */
768			/* Allow DLL to settle */
769			msleep(10);
770			/* Unmute all */
771			snd_emu1010_fpga_write(emu, EMU_HANA_UNMUTE, EMU_UNMUTE );
772			break;
773
774		case 3:
775			/* Take clock from ADAT IN */
776			/* Mute all */
777			snd_emu1010_fpga_write(emu, EMU_HANA_UNMUTE, EMU_MUTE );
778			/* Default fallback clock 48kHz */
779			snd_emu1010_fpga_write(emu, EMU_HANA_DEFCLOCK, EMU_HANA_DEFCLOCK_48K );
780			/* Word Clock source, sync to ADAT input */
781			snd_emu1010_fpga_write(emu, EMU_HANA_WCLOCK,
782				EMU_HANA_WCLOCK_HANA_ADAT_IN | EMU_HANA_WCLOCK_1X );
783			/* Set LEDs on Audio Dock */
784			snd_emu1010_fpga_write(emu, EMU_HANA_DOCK_LEDS_2, EMU_HANA_DOCK_LEDS_2_EXT | EMU_HANA_DOCK_LEDS_2_LOCK );
785			/* FIXME: We should set EMU_HANA_DOCK_LEDS_2_LOCK only when clock signal is present and valid */
786			/* Allow DLL to settle */
787			msleep(10);
788			/*   Unmute all */
789			snd_emu1010_fpga_write(emu, EMU_HANA_UNMUTE, EMU_UNMUTE );
790
791
792			break;
793		}
794	}
795        return change;
796}
797
798static struct snd_kcontrol_new snd_emu1010_internal_clock =
799{
800	.access =	SNDRV_CTL_ELEM_ACCESS_READWRITE,
801	.iface =        SNDRV_CTL_ELEM_IFACE_MIXER,
802	.name =         "Clock Internal Rate",
803	.count =	1,
804	.info =         snd_emu1010_internal_clock_info,
805	.get =          snd_emu1010_internal_clock_get,
806	.put =          snd_emu1010_internal_clock_put
807};
808
809static int snd_emu1010_optical_out_info(struct snd_kcontrol *kcontrol,
810					  struct snd_ctl_elem_info *uinfo)
811{
812	static const char * const texts[2] = {
813		"SPDIF", "ADAT"
814	};
815
816	return snd_ctl_enum_info(uinfo, 1, 2, texts);
817}
818
819static int snd_emu1010_optical_out_get(struct snd_kcontrol *kcontrol,
820					struct snd_ctl_elem_value *ucontrol)
821{
822	struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
823
824	ucontrol->value.enumerated.item[0] = emu->emu1010.optical_out;
825	return 0;
826}
827
828static int snd_emu1010_optical_out_put(struct snd_kcontrol *kcontrol,
829					struct snd_ctl_elem_value *ucontrol)
830{
831	struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
832	unsigned int val;
833	u32 tmp;
834	int change = 0;
835
836	val = ucontrol->value.enumerated.item[0];
837	/* Limit: uinfo->value.enumerated.items = 2; */
838	if (val >= 2)
839		return -EINVAL;
840	change = (emu->emu1010.optical_out != val);
841	if (change) {
842		emu->emu1010.optical_out = val;
843		tmp = (emu->emu1010.optical_in ? EMU_HANA_OPTICAL_IN_ADAT : 0) |
844			(emu->emu1010.optical_out ? EMU_HANA_OPTICAL_OUT_ADAT : 0);
845		snd_emu1010_fpga_write(emu, EMU_HANA_OPTICAL_TYPE, tmp);
846	}
847	return change;
848}
849
850static struct snd_kcontrol_new snd_emu1010_optical_out = {
851	.access =	SNDRV_CTL_ELEM_ACCESS_READWRITE,
852	.iface =        SNDRV_CTL_ELEM_IFACE_MIXER,
853	.name =         "Optical Output Mode",
854	.count =	1,
855	.info =         snd_emu1010_optical_out_info,
856	.get =          snd_emu1010_optical_out_get,
857	.put =          snd_emu1010_optical_out_put
858};
859
860static int snd_emu1010_optical_in_info(struct snd_kcontrol *kcontrol,
861					  struct snd_ctl_elem_info *uinfo)
862{
863	static const char * const texts[2] = {
864		"SPDIF", "ADAT"
865	};
866
867	return snd_ctl_enum_info(uinfo, 1, 2, texts);
868}
869
870static int snd_emu1010_optical_in_get(struct snd_kcontrol *kcontrol,
871					struct snd_ctl_elem_value *ucontrol)
872{
873	struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
874
875	ucontrol->value.enumerated.item[0] = emu->emu1010.optical_in;
876	return 0;
877}
878
879static int snd_emu1010_optical_in_put(struct snd_kcontrol *kcontrol,
880					struct snd_ctl_elem_value *ucontrol)
881{
882	struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
883	unsigned int val;
884	u32 tmp;
885	int change = 0;
886
887	val = ucontrol->value.enumerated.item[0];
888	/* Limit: uinfo->value.enumerated.items = 2; */
889	if (val >= 2)
890		return -EINVAL;
891	change = (emu->emu1010.optical_in != val);
892	if (change) {
893		emu->emu1010.optical_in = val;
894		tmp = (emu->emu1010.optical_in ? EMU_HANA_OPTICAL_IN_ADAT : 0) |
895			(emu->emu1010.optical_out ? EMU_HANA_OPTICAL_OUT_ADAT : 0);
896		snd_emu1010_fpga_write(emu, EMU_HANA_OPTICAL_TYPE, tmp);
897	}
898	return change;
899}
900
901static struct snd_kcontrol_new snd_emu1010_optical_in = {
902	.access =	SNDRV_CTL_ELEM_ACCESS_READWRITE,
903	.iface =        SNDRV_CTL_ELEM_IFACE_MIXER,
904	.name =         "Optical Input Mode",
905	.count =	1,
906	.info =         snd_emu1010_optical_in_info,
907	.get =          snd_emu1010_optical_in_get,
908	.put =          snd_emu1010_optical_in_put
909};
910
911static int snd_audigy_i2c_capture_source_info(struct snd_kcontrol *kcontrol,
912					  struct snd_ctl_elem_info *uinfo)
913{
914#if 0
915	static const char * const texts[4] = {
916		"Unknown1", "Unknown2", "Mic", "Line"
917	};
918#endif
919	static const char * const texts[2] = {
920		"Mic", "Line"
921	};
922
923	return snd_ctl_enum_info(uinfo, 1, 2, texts);
924}
925
926static int snd_audigy_i2c_capture_source_get(struct snd_kcontrol *kcontrol,
927					struct snd_ctl_elem_value *ucontrol)
928{
929	struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
930
931	ucontrol->value.enumerated.item[0] = emu->i2c_capture_source;
932	return 0;
933}
934
935static int snd_audigy_i2c_capture_source_put(struct snd_kcontrol *kcontrol,
936					struct snd_ctl_elem_value *ucontrol)
937{
938	struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
939	unsigned int source_id;
940	unsigned int ngain, ogain;
941	u32 gpio;
942	int change = 0;
943	unsigned long flags;
944	u32 source;
945	/* If the capture source has changed,
946	 * update the capture volume from the cached value
947	 * for the particular source.
948	 */
949	source_id = ucontrol->value.enumerated.item[0];
950	/* Limit: uinfo->value.enumerated.items = 2; */
951	/*        emu->i2c_capture_volume */
952	if (source_id >= 2)
953		return -EINVAL;
954	change = (emu->i2c_capture_source != source_id);
955	if (change) {
956		snd_emu10k1_i2c_write(emu, ADC_MUX, 0); /* Mute input */
957		spin_lock_irqsave(&emu->emu_lock, flags);
958		gpio = inl(emu->port + A_IOCFG);
959		if (source_id==0)
960			outl(gpio | 0x4, emu->port + A_IOCFG);
961		else
962			outl(gpio & ~0x4, emu->port + A_IOCFG);
963		spin_unlock_irqrestore(&emu->emu_lock, flags);
964
965		ngain = emu->i2c_capture_volume[source_id][0]; /* Left */
966		ogain = emu->i2c_capture_volume[emu->i2c_capture_source][0]; /* Left */
967		if (ngain != ogain)
968			snd_emu10k1_i2c_write(emu, ADC_ATTEN_ADCL, ((ngain) & 0xff));
969		ngain = emu->i2c_capture_volume[source_id][1]; /* Right */
970		ogain = emu->i2c_capture_volume[emu->i2c_capture_source][1]; /* Right */
971		if (ngain != ogain)
972			snd_emu10k1_i2c_write(emu, ADC_ATTEN_ADCR, ((ngain) & 0xff));
973
974		source = 1 << (source_id + 2);
975		snd_emu10k1_i2c_write(emu, ADC_MUX, source); /* Set source */
976		emu->i2c_capture_source = source_id;
977	}
978        return change;
979}
980
981static struct snd_kcontrol_new snd_audigy_i2c_capture_source =
982{
983		.iface =	SNDRV_CTL_ELEM_IFACE_MIXER,
984		.name =		"Capture Source",
985		.info =		snd_audigy_i2c_capture_source_info,
986		.get =		snd_audigy_i2c_capture_source_get,
987		.put =		snd_audigy_i2c_capture_source_put
988};
989
990static int snd_audigy_i2c_volume_info(struct snd_kcontrol *kcontrol,
991				  struct snd_ctl_elem_info *uinfo)
992{
993	uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
994	uinfo->count = 2;
995	uinfo->value.integer.min = 0;
996	uinfo->value.integer.max = 255;
997	return 0;
998}
999
1000static int snd_audigy_i2c_volume_get(struct snd_kcontrol *kcontrol,
1001				 struct snd_ctl_elem_value *ucontrol)
1002{
1003	struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1004	unsigned int source_id;
1005
1006	source_id = kcontrol->private_value;
1007	/* Limit: emu->i2c_capture_volume */
1008        /*        capture_source: uinfo->value.enumerated.items = 2 */
1009	if (source_id >= 2)
1010		return -EINVAL;
1011
1012	ucontrol->value.integer.value[0] = emu->i2c_capture_volume[source_id][0];
1013	ucontrol->value.integer.value[1] = emu->i2c_capture_volume[source_id][1];
1014	return 0;
1015}
1016
1017static int snd_audigy_i2c_volume_put(struct snd_kcontrol *kcontrol,
1018				 struct snd_ctl_elem_value *ucontrol)
1019{
1020	struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1021	unsigned int ogain;
1022	unsigned int ngain;
1023	unsigned int source_id;
1024	int change = 0;
1025
1026	source_id = kcontrol->private_value;
1027	/* Limit: emu->i2c_capture_volume */
1028        /*        capture_source: uinfo->value.enumerated.items = 2 */
1029	if (source_id >= 2)
1030		return -EINVAL;
1031	ogain = emu->i2c_capture_volume[source_id][0]; /* Left */
1032	ngain = ucontrol->value.integer.value[0];
1033	if (ngain > 0xff)
1034		return 0;
1035	if (ogain != ngain) {
1036		if (emu->i2c_capture_source == source_id)
1037			snd_emu10k1_i2c_write(emu, ADC_ATTEN_ADCL, ((ngain) & 0xff) );
1038		emu->i2c_capture_volume[source_id][0] = ngain;
1039		change = 1;
1040	}
1041	ogain = emu->i2c_capture_volume[source_id][1]; /* Right */
1042	ngain = ucontrol->value.integer.value[1];
1043	if (ngain > 0xff)
1044		return 0;
1045	if (ogain != ngain) {
1046		if (emu->i2c_capture_source == source_id)
1047			snd_emu10k1_i2c_write(emu, ADC_ATTEN_ADCR, ((ngain) & 0xff));
1048		emu->i2c_capture_volume[source_id][1] = ngain;
1049		change = 1;
1050	}
1051
1052	return change;
1053}
1054
1055#define I2C_VOLUME(xname,chid) \
1056{								\
1057	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname,	\
1058	.access = SNDRV_CTL_ELEM_ACCESS_READWRITE |		\
1059	          SNDRV_CTL_ELEM_ACCESS_TLV_READ,		\
1060	.info =  snd_audigy_i2c_volume_info,			\
1061	.get =   snd_audigy_i2c_volume_get,			\
1062	.put =   snd_audigy_i2c_volume_put,			\
1063	.tlv = { .p = snd_audigy_db_scale2 },			\
1064	.private_value = chid					\
1065}
1066
1067
1068static struct snd_kcontrol_new snd_audigy_i2c_volume_ctls[] = {
1069	I2C_VOLUME("Mic Capture Volume", 0),
1070	I2C_VOLUME("Line Capture Volume", 0)
1071};
1072
1073#if 0
1074static int snd_audigy_spdif_output_rate_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
1075{
1076	static const char * const texts[] = {"44100", "48000", "96000"};
1077
1078	return snd_ctl_enum_info(uinfo, 1, 3, texts);
1079}
1080
1081static int snd_audigy_spdif_output_rate_get(struct snd_kcontrol *kcontrol,
1082                                 struct snd_ctl_elem_value *ucontrol)
1083{
1084	struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1085	unsigned int tmp;
1086	unsigned long flags;
1087
1088
1089	spin_lock_irqsave(&emu->reg_lock, flags);
1090	tmp = snd_emu10k1_ptr_read(emu, A_SPDIF_SAMPLERATE, 0);
1091	switch (tmp & A_SPDIF_RATE_MASK) {
1092	case A_SPDIF_44100:
1093		ucontrol->value.enumerated.item[0] = 0;
1094		break;
1095	case A_SPDIF_48000:
1096		ucontrol->value.enumerated.item[0] = 1;
1097		break;
1098	case A_SPDIF_96000:
1099		ucontrol->value.enumerated.item[0] = 2;
1100		break;
1101	default:
1102		ucontrol->value.enumerated.item[0] = 1;
1103	}
1104	spin_unlock_irqrestore(&emu->reg_lock, flags);
1105	return 0;
1106}
1107
1108static int snd_audigy_spdif_output_rate_put(struct snd_kcontrol *kcontrol,
1109                                 struct snd_ctl_elem_value *ucontrol)
1110{
1111	struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1112	int change;
1113	unsigned int reg, val, tmp;
1114	unsigned long flags;
1115
1116	switch(ucontrol->value.enumerated.item[0]) {
1117	case 0:
1118		val = A_SPDIF_44100;
1119		break;
1120	case 1:
1121		val = A_SPDIF_48000;
1122		break;
1123	case 2:
1124		val = A_SPDIF_96000;
1125		break;
1126	default:
1127		val = A_SPDIF_48000;
1128		break;
1129	}
1130
1131
1132	spin_lock_irqsave(&emu->reg_lock, flags);
1133	reg = snd_emu10k1_ptr_read(emu, A_SPDIF_SAMPLERATE, 0);
1134	tmp = reg & ~A_SPDIF_RATE_MASK;
1135	tmp |= val;
1136	if ((change = (tmp != reg)))
1137		snd_emu10k1_ptr_write(emu, A_SPDIF_SAMPLERATE, 0, tmp);
1138	spin_unlock_irqrestore(&emu->reg_lock, flags);
1139	return change;
1140}
1141
1142static struct snd_kcontrol_new snd_audigy_spdif_output_rate =
1143{
1144	.access =	SNDRV_CTL_ELEM_ACCESS_READWRITE,
1145	.iface =        SNDRV_CTL_ELEM_IFACE_MIXER,
1146	.name =         "Audigy SPDIF Output Sample Rate",
1147	.count =	1,
1148	.info =         snd_audigy_spdif_output_rate_info,
1149	.get =          snd_audigy_spdif_output_rate_get,
1150	.put =          snd_audigy_spdif_output_rate_put
1151};
1152#endif
1153
1154static int snd_emu10k1_spdif_put(struct snd_kcontrol *kcontrol,
1155                                 struct snd_ctl_elem_value *ucontrol)
1156{
1157	struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1158	unsigned int idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
1159	int change;
1160	unsigned int val;
1161	unsigned long flags;
1162
1163	/* Limit: emu->spdif_bits */
1164	if (idx >= 3)
1165		return -EINVAL;
1166	val = (ucontrol->value.iec958.status[0] << 0) |
1167	      (ucontrol->value.iec958.status[1] << 8) |
1168	      (ucontrol->value.iec958.status[2] << 16) |
1169	      (ucontrol->value.iec958.status[3] << 24);
1170	spin_lock_irqsave(&emu->reg_lock, flags);
1171	change = val != emu->spdif_bits[idx];
1172	if (change) {
1173		snd_emu10k1_ptr_write(emu, SPCS0 + idx, 0, val);
1174		emu->spdif_bits[idx] = val;
1175	}
1176	spin_unlock_irqrestore(&emu->reg_lock, flags);
1177	return change;
1178}
1179
1180static struct snd_kcontrol_new snd_emu10k1_spdif_mask_control =
1181{
1182	.access =	SNDRV_CTL_ELEM_ACCESS_READ,
1183	.iface =        SNDRV_CTL_ELEM_IFACE_PCM,
1184	.name =         SNDRV_CTL_NAME_IEC958("",PLAYBACK,MASK),
1185	.count =	3,
1186	.info =         snd_emu10k1_spdif_info,
1187	.get =          snd_emu10k1_spdif_get_mask
1188};
1189
1190static struct snd_kcontrol_new snd_emu10k1_spdif_control =
1191{
1192	.iface =	SNDRV_CTL_ELEM_IFACE_PCM,
1193	.name =         SNDRV_CTL_NAME_IEC958("",PLAYBACK,DEFAULT),
1194	.count =	3,
1195	.info =         snd_emu10k1_spdif_info,
1196	.get =          snd_emu10k1_spdif_get,
1197	.put =          snd_emu10k1_spdif_put
1198};
1199
1200
1201static void update_emu10k1_fxrt(struct snd_emu10k1 *emu, int voice, unsigned char *route)
1202{
1203	if (emu->audigy) {
1204		snd_emu10k1_ptr_write(emu, A_FXRT1, voice,
1205				      snd_emu10k1_compose_audigy_fxrt1(route));
1206		snd_emu10k1_ptr_write(emu, A_FXRT2, voice,
1207				      snd_emu10k1_compose_audigy_fxrt2(route));
1208	} else {
1209		snd_emu10k1_ptr_write(emu, FXRT, voice,
1210				      snd_emu10k1_compose_send_routing(route));
1211	}
1212}
1213
1214static void update_emu10k1_send_volume(struct snd_emu10k1 *emu, int voice, unsigned char *volume)
1215{
1216	snd_emu10k1_ptr_write(emu, PTRX_FXSENDAMOUNT_A, voice, volume[0]);
1217	snd_emu10k1_ptr_write(emu, PTRX_FXSENDAMOUNT_B, voice, volume[1]);
1218	snd_emu10k1_ptr_write(emu, PSST_FXSENDAMOUNT_C, voice, volume[2]);
1219	snd_emu10k1_ptr_write(emu, DSL_FXSENDAMOUNT_D, voice, volume[3]);
1220	if (emu->audigy) {
1221		unsigned int val = ((unsigned int)volume[4] << 24) |
1222			((unsigned int)volume[5] << 16) |
1223			((unsigned int)volume[6] << 8) |
1224			(unsigned int)volume[7];
1225		snd_emu10k1_ptr_write(emu, A_SENDAMOUNTS, voice, val);
1226	}
1227}
1228
1229/* PCM stream controls */
1230
1231static int snd_emu10k1_send_routing_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
1232{
1233	struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1234	uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
1235	uinfo->count = emu->audigy ? 3*8 : 3*4;
1236	uinfo->value.integer.min = 0;
1237	uinfo->value.integer.max = emu->audigy ? 0x3f : 0x0f;
1238	return 0;
1239}
1240
1241static int snd_emu10k1_send_routing_get(struct snd_kcontrol *kcontrol,
1242                                        struct snd_ctl_elem_value *ucontrol)
1243{
1244	unsigned long flags;
1245	struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1246	struct snd_emu10k1_pcm_mixer *mix =
1247		&emu->pcm_mixer[snd_ctl_get_ioffidx(kcontrol, &ucontrol->id)];
1248	int voice, idx;
1249	int num_efx = emu->audigy ? 8 : 4;
1250	int mask = emu->audigy ? 0x3f : 0x0f;
1251
1252	spin_lock_irqsave(&emu->reg_lock, flags);
1253	for (voice = 0; voice < 3; voice++)
1254		for (idx = 0; idx < num_efx; idx++)
1255			ucontrol->value.integer.value[(voice * num_efx) + idx] =
1256				mix->send_routing[voice][idx] & mask;
1257	spin_unlock_irqrestore(&emu->reg_lock, flags);
1258	return 0;
1259}
1260
1261static int snd_emu10k1_send_routing_put(struct snd_kcontrol *kcontrol,
1262                                        struct snd_ctl_elem_value *ucontrol)
1263{
1264	unsigned long flags;
1265	struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1266	struct snd_emu10k1_pcm_mixer *mix =
1267		&emu->pcm_mixer[snd_ctl_get_ioffidx(kcontrol, &ucontrol->id)];
1268	int change = 0, voice, idx, val;
1269	int num_efx = emu->audigy ? 8 : 4;
1270	int mask = emu->audigy ? 0x3f : 0x0f;
1271
1272	spin_lock_irqsave(&emu->reg_lock, flags);
1273	for (voice = 0; voice < 3; voice++)
1274		for (idx = 0; idx < num_efx; idx++) {
1275			val = ucontrol->value.integer.value[(voice * num_efx) + idx] & mask;
1276			if (mix->send_routing[voice][idx] != val) {
1277				mix->send_routing[voice][idx] = val;
1278				change = 1;
1279			}
1280		}
1281	if (change && mix->epcm) {
1282		if (mix->epcm->voices[0] && mix->epcm->voices[1]) {
1283			update_emu10k1_fxrt(emu, mix->epcm->voices[0]->number,
1284					    &mix->send_routing[1][0]);
1285			update_emu10k1_fxrt(emu, mix->epcm->voices[1]->number,
1286					    &mix->send_routing[2][0]);
1287		} else if (mix->epcm->voices[0]) {
1288			update_emu10k1_fxrt(emu, mix->epcm->voices[0]->number,
1289					    &mix->send_routing[0][0]);
1290		}
1291	}
1292	spin_unlock_irqrestore(&emu->reg_lock, flags);
1293	return change;
1294}
1295
1296static struct snd_kcontrol_new snd_emu10k1_send_routing_control =
1297{
1298	.access =	SNDRV_CTL_ELEM_ACCESS_READWRITE | SNDRV_CTL_ELEM_ACCESS_INACTIVE,
1299	.iface =        SNDRV_CTL_ELEM_IFACE_PCM,
1300	.name =         "EMU10K1 PCM Send Routing",
1301	.count =	32,
1302	.info =         snd_emu10k1_send_routing_info,
1303	.get =          snd_emu10k1_send_routing_get,
1304	.put =          snd_emu10k1_send_routing_put
1305};
1306
1307static int snd_emu10k1_send_volume_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
1308{
1309	struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1310	uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
1311	uinfo->count = emu->audigy ? 3*8 : 3*4;
1312	uinfo->value.integer.min = 0;
1313	uinfo->value.integer.max = 255;
1314	return 0;
1315}
1316
1317static int snd_emu10k1_send_volume_get(struct snd_kcontrol *kcontrol,
1318                                       struct snd_ctl_elem_value *ucontrol)
1319{
1320	unsigned long flags;
1321	struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1322	struct snd_emu10k1_pcm_mixer *mix =
1323		&emu->pcm_mixer[snd_ctl_get_ioffidx(kcontrol, &ucontrol->id)];
1324	int idx;
1325	int num_efx = emu->audigy ? 8 : 4;
1326
1327	spin_lock_irqsave(&emu->reg_lock, flags);
1328	for (idx = 0; idx < 3*num_efx; idx++)
1329		ucontrol->value.integer.value[idx] = mix->send_volume[idx/num_efx][idx%num_efx];
1330	spin_unlock_irqrestore(&emu->reg_lock, flags);
1331	return 0;
1332}
1333
1334static int snd_emu10k1_send_volume_put(struct snd_kcontrol *kcontrol,
1335                                       struct snd_ctl_elem_value *ucontrol)
1336{
1337	unsigned long flags;
1338	struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1339	struct snd_emu10k1_pcm_mixer *mix =
1340		&emu->pcm_mixer[snd_ctl_get_ioffidx(kcontrol, &ucontrol->id)];
1341	int change = 0, idx, val;
1342	int num_efx = emu->audigy ? 8 : 4;
1343
1344	spin_lock_irqsave(&emu->reg_lock, flags);
1345	for (idx = 0; idx < 3*num_efx; idx++) {
1346		val = ucontrol->value.integer.value[idx] & 255;
1347		if (mix->send_volume[idx/num_efx][idx%num_efx] != val) {
1348			mix->send_volume[idx/num_efx][idx%num_efx] = val;
1349			change = 1;
1350		}
1351	}
1352	if (change && mix->epcm) {
1353		if (mix->epcm->voices[0] && mix->epcm->voices[1]) {
1354			update_emu10k1_send_volume(emu, mix->epcm->voices[0]->number,
1355						   &mix->send_volume[1][0]);
1356			update_emu10k1_send_volume(emu, mix->epcm->voices[1]->number,
1357						   &mix->send_volume[2][0]);
1358		} else if (mix->epcm->voices[0]) {
1359			update_emu10k1_send_volume(emu, mix->epcm->voices[0]->number,
1360						   &mix->send_volume[0][0]);
1361		}
1362	}
1363	spin_unlock_irqrestore(&emu->reg_lock, flags);
1364	return change;
1365}
1366
1367static struct snd_kcontrol_new snd_emu10k1_send_volume_control =
1368{
1369	.access =	SNDRV_CTL_ELEM_ACCESS_READWRITE | SNDRV_CTL_ELEM_ACCESS_INACTIVE,
1370	.iface =        SNDRV_CTL_ELEM_IFACE_PCM,
1371	.name =         "EMU10K1 PCM Send Volume",
1372	.count =	32,
1373	.info =         snd_emu10k1_send_volume_info,
1374	.get =          snd_emu10k1_send_volume_get,
1375	.put =          snd_emu10k1_send_volume_put
1376};
1377
1378static int snd_emu10k1_attn_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
1379{
1380	uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
1381	uinfo->count = 3;
1382	uinfo->value.integer.min = 0;
1383	uinfo->value.integer.max = 0xffff;
1384	return 0;
1385}
1386
1387static int snd_emu10k1_attn_get(struct snd_kcontrol *kcontrol,
1388                                struct snd_ctl_elem_value *ucontrol)
1389{
1390	struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1391	struct snd_emu10k1_pcm_mixer *mix =
1392		&emu->pcm_mixer[snd_ctl_get_ioffidx(kcontrol, &ucontrol->id)];
1393	unsigned long flags;
1394	int idx;
1395
1396	spin_lock_irqsave(&emu->reg_lock, flags);
1397	for (idx = 0; idx < 3; idx++)
1398		ucontrol->value.integer.value[idx] = mix->attn[idx];
1399	spin_unlock_irqrestore(&emu->reg_lock, flags);
1400	return 0;
1401}
1402
1403static int snd_emu10k1_attn_put(struct snd_kcontrol *kcontrol,
1404				struct snd_ctl_elem_value *ucontrol)
1405{
1406	unsigned long flags;
1407	struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1408	struct snd_emu10k1_pcm_mixer *mix =
1409		&emu->pcm_mixer[snd_ctl_get_ioffidx(kcontrol, &ucontrol->id)];
1410	int change = 0, idx, val;
1411
1412	spin_lock_irqsave(&emu->reg_lock, flags);
1413	for (idx = 0; idx < 3; idx++) {
1414		val = ucontrol->value.integer.value[idx] & 0xffff;
1415		if (mix->attn[idx] != val) {
1416			mix->attn[idx] = val;
1417			change = 1;
1418		}
1419	}
1420	if (change && mix->epcm) {
1421		if (mix->epcm->voices[0] && mix->epcm->voices[1]) {
1422			snd_emu10k1_ptr_write(emu, VTFT_VOLUMETARGET, mix->epcm->voices[0]->number, mix->attn[1]);
1423			snd_emu10k1_ptr_write(emu, VTFT_VOLUMETARGET, mix->epcm->voices[1]->number, mix->attn[2]);
1424		} else if (mix->epcm->voices[0]) {
1425			snd_emu10k1_ptr_write(emu, VTFT_VOLUMETARGET, mix->epcm->voices[0]->number, mix->attn[0]);
1426		}
1427	}
1428	spin_unlock_irqrestore(&emu->reg_lock, flags);
1429	return change;
1430}
1431
1432static struct snd_kcontrol_new snd_emu10k1_attn_control =
1433{
1434	.access =	SNDRV_CTL_ELEM_ACCESS_READWRITE | SNDRV_CTL_ELEM_ACCESS_INACTIVE,
1435	.iface =        SNDRV_CTL_ELEM_IFACE_PCM,
1436	.name =         "EMU10K1 PCM Volume",
1437	.count =	32,
1438	.info =         snd_emu10k1_attn_info,
1439	.get =          snd_emu10k1_attn_get,
1440	.put =          snd_emu10k1_attn_put
1441};
1442
1443/* Mutichannel PCM stream controls */
1444
1445static int snd_emu10k1_efx_send_routing_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
1446{
1447	struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1448	uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
1449	uinfo->count = emu->audigy ? 8 : 4;
1450	uinfo->value.integer.min = 0;
1451	uinfo->value.integer.max = emu->audigy ? 0x3f : 0x0f;
1452	return 0;
1453}
1454
1455static int snd_emu10k1_efx_send_routing_get(struct snd_kcontrol *kcontrol,
1456                                        struct snd_ctl_elem_value *ucontrol)
1457{
1458	unsigned long flags;
1459	struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1460	struct snd_emu10k1_pcm_mixer *mix =
1461		&emu->efx_pcm_mixer[snd_ctl_get_ioffidx(kcontrol, &ucontrol->id)];
1462	int idx;
1463	int num_efx = emu->audigy ? 8 : 4;
1464	int mask = emu->audigy ? 0x3f : 0x0f;
1465
1466	spin_lock_irqsave(&emu->reg_lock, flags);
1467	for (idx = 0; idx < num_efx; idx++)
1468		ucontrol->value.integer.value[idx] =
1469			mix->send_routing[0][idx] & mask;
1470	spin_unlock_irqrestore(&emu->reg_lock, flags);
1471	return 0;
1472}
1473
1474static int snd_emu10k1_efx_send_routing_put(struct snd_kcontrol *kcontrol,
1475                                        struct snd_ctl_elem_value *ucontrol)
1476{
1477	unsigned long flags;
1478	struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1479	int ch = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
1480	struct snd_emu10k1_pcm_mixer *mix = &emu->efx_pcm_mixer[ch];
1481	int change = 0, idx, val;
1482	int num_efx = emu->audigy ? 8 : 4;
1483	int mask = emu->audigy ? 0x3f : 0x0f;
1484
1485	spin_lock_irqsave(&emu->reg_lock, flags);
1486	for (idx = 0; idx < num_efx; idx++) {
1487		val = ucontrol->value.integer.value[idx] & mask;
1488		if (mix->send_routing[0][idx] != val) {
1489			mix->send_routing[0][idx] = val;
1490			change = 1;
1491		}
1492	}
1493
1494	if (change && mix->epcm) {
1495		if (mix->epcm->voices[ch]) {
1496			update_emu10k1_fxrt(emu, mix->epcm->voices[ch]->number,
1497					&mix->send_routing[0][0]);
1498		}
1499	}
1500	spin_unlock_irqrestore(&emu->reg_lock, flags);
1501	return change;
1502}
1503
1504static struct snd_kcontrol_new snd_emu10k1_efx_send_routing_control =
1505{
1506	.access =	SNDRV_CTL_ELEM_ACCESS_READWRITE | SNDRV_CTL_ELEM_ACCESS_INACTIVE,
1507	.iface =        SNDRV_CTL_ELEM_IFACE_PCM,
1508	.name =         "Multichannel PCM Send Routing",
1509	.count =	16,
1510	.info =         snd_emu10k1_efx_send_routing_info,
1511	.get =          snd_emu10k1_efx_send_routing_get,
1512	.put =          snd_emu10k1_efx_send_routing_put
1513};
1514
1515static int snd_emu10k1_efx_send_volume_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
1516{
1517	struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1518	uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
1519	uinfo->count = emu->audigy ? 8 : 4;
1520	uinfo->value.integer.min = 0;
1521	uinfo->value.integer.max = 255;
1522	return 0;
1523}
1524
1525static int snd_emu10k1_efx_send_volume_get(struct snd_kcontrol *kcontrol,
1526                                       struct snd_ctl_elem_value *ucontrol)
1527{
1528	unsigned long flags;
1529	struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1530	struct snd_emu10k1_pcm_mixer *mix =
1531		&emu->efx_pcm_mixer[snd_ctl_get_ioffidx(kcontrol, &ucontrol->id)];
1532	int idx;
1533	int num_efx = emu->audigy ? 8 : 4;
1534
1535	spin_lock_irqsave(&emu->reg_lock, flags);
1536	for (idx = 0; idx < num_efx; idx++)
1537		ucontrol->value.integer.value[idx] = mix->send_volume[0][idx];
1538	spin_unlock_irqrestore(&emu->reg_lock, flags);
1539	return 0;
1540}
1541
1542static int snd_emu10k1_efx_send_volume_put(struct snd_kcontrol *kcontrol,
1543                                       struct snd_ctl_elem_value *ucontrol)
1544{
1545	unsigned long flags;
1546	struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1547	int ch = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
1548	struct snd_emu10k1_pcm_mixer *mix = &emu->efx_pcm_mixer[ch];
1549	int change = 0, idx, val;
1550	int num_efx = emu->audigy ? 8 : 4;
1551
1552	spin_lock_irqsave(&emu->reg_lock, flags);
1553	for (idx = 0; idx < num_efx; idx++) {
1554		val = ucontrol->value.integer.value[idx] & 255;
1555		if (mix->send_volume[0][idx] != val) {
1556			mix->send_volume[0][idx] = val;
1557			change = 1;
1558		}
1559	}
1560	if (change && mix->epcm) {
1561		if (mix->epcm->voices[ch]) {
1562			update_emu10k1_send_volume(emu, mix->epcm->voices[ch]->number,
1563						   &mix->send_volume[0][0]);
1564		}
1565	}
1566	spin_unlock_irqrestore(&emu->reg_lock, flags);
1567	return change;
1568}
1569
1570
1571static struct snd_kcontrol_new snd_emu10k1_efx_send_volume_control =
1572{
1573	.access =	SNDRV_CTL_ELEM_ACCESS_READWRITE | SNDRV_CTL_ELEM_ACCESS_INACTIVE,
1574	.iface =        SNDRV_CTL_ELEM_IFACE_PCM,
1575	.name =         "Multichannel PCM Send Volume",
1576	.count =	16,
1577	.info =         snd_emu10k1_efx_send_volume_info,
1578	.get =          snd_emu10k1_efx_send_volume_get,
1579	.put =          snd_emu10k1_efx_send_volume_put
1580};
1581
1582static int snd_emu10k1_efx_attn_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
1583{
1584	uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
1585	uinfo->count = 1;
1586	uinfo->value.integer.min = 0;
1587	uinfo->value.integer.max = 0xffff;
1588	return 0;
1589}
1590
1591static int snd_emu10k1_efx_attn_get(struct snd_kcontrol *kcontrol,
1592                                struct snd_ctl_elem_value *ucontrol)
1593{
1594	struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1595	struct snd_emu10k1_pcm_mixer *mix =
1596		&emu->efx_pcm_mixer[snd_ctl_get_ioffidx(kcontrol, &ucontrol->id)];
1597	unsigned long flags;
1598
1599	spin_lock_irqsave(&emu->reg_lock, flags);
1600	ucontrol->value.integer.value[0] = mix->attn[0];
1601	spin_unlock_irqrestore(&emu->reg_lock, flags);
1602	return 0;
1603}
1604
1605static int snd_emu10k1_efx_attn_put(struct snd_kcontrol *kcontrol,
1606				struct snd_ctl_elem_value *ucontrol)
1607{
1608	unsigned long flags;
1609	struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1610	int ch = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
1611	struct snd_emu10k1_pcm_mixer *mix = &emu->efx_pcm_mixer[ch];
1612	int change = 0, val;
1613
1614	spin_lock_irqsave(&emu->reg_lock, flags);
1615	val = ucontrol->value.integer.value[0] & 0xffff;
1616	if (mix->attn[0] != val) {
1617		mix->attn[0] = val;
1618		change = 1;
1619	}
1620	if (change && mix->epcm) {
1621		if (mix->epcm->voices[ch]) {
1622			snd_emu10k1_ptr_write(emu, VTFT_VOLUMETARGET, mix->epcm->voices[ch]->number, mix->attn[0]);
1623		}
1624	}
1625	spin_unlock_irqrestore(&emu->reg_lock, flags);
1626	return change;
1627}
1628
1629static struct snd_kcontrol_new snd_emu10k1_efx_attn_control =
1630{
1631	.access =	SNDRV_CTL_ELEM_ACCESS_READWRITE | SNDRV_CTL_ELEM_ACCESS_INACTIVE,
1632	.iface =        SNDRV_CTL_ELEM_IFACE_PCM,
1633	.name =         "Multichannel PCM Volume",
1634	.count =	16,
1635	.info =         snd_emu10k1_efx_attn_info,
1636	.get =          snd_emu10k1_efx_attn_get,
1637	.put =          snd_emu10k1_efx_attn_put
1638};
1639
1640#define snd_emu10k1_shared_spdif_info	snd_ctl_boolean_mono_info
1641
1642static int snd_emu10k1_shared_spdif_get(struct snd_kcontrol *kcontrol,
1643					struct snd_ctl_elem_value *ucontrol)
1644{
1645	struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1646
1647	if (emu->audigy)
1648		ucontrol->value.integer.value[0] = inl(emu->port + A_IOCFG) & A_IOCFG_GPOUT0 ? 1 : 0;
1649	else
1650		ucontrol->value.integer.value[0] = inl(emu->port + HCFG) & HCFG_GPOUT0 ? 1 : 0;
1651	if (emu->card_capabilities->invert_shared_spdif)
1652		ucontrol->value.integer.value[0] =
1653			!ucontrol->value.integer.value[0];
1654
1655	return 0;
1656}
1657
1658static int snd_emu10k1_shared_spdif_put(struct snd_kcontrol *kcontrol,
1659					struct snd_ctl_elem_value *ucontrol)
1660{
1661	unsigned long flags;
1662	struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1663	unsigned int reg, val, sw;
1664	int change = 0;
1665
1666	sw = ucontrol->value.integer.value[0];
1667	if (emu->card_capabilities->invert_shared_spdif)
1668		sw = !sw;
1669	spin_lock_irqsave(&emu->reg_lock, flags);
1670	if ( emu->card_capabilities->i2c_adc) {
1671		/* Do nothing for Audigy 2 ZS Notebook */
1672	} else if (emu->audigy) {
1673		reg = inl(emu->port + A_IOCFG);
1674		val = sw ? A_IOCFG_GPOUT0 : 0;
1675		change = (reg & A_IOCFG_GPOUT0) != val;
1676		if (change) {
1677			reg &= ~A_IOCFG_GPOUT0;
1678			reg |= val;
1679			outl(reg | val, emu->port + A_IOCFG);
1680		}
1681	}
1682	reg = inl(emu->port + HCFG);
1683	val = sw ? HCFG_GPOUT0 : 0;
1684	change |= (reg & HCFG_GPOUT0) != val;
1685	if (change) {
1686		reg &= ~HCFG_GPOUT0;
1687		reg |= val;
1688		outl(reg | val, emu->port + HCFG);
1689	}
1690	spin_unlock_irqrestore(&emu->reg_lock, flags);
1691	return change;
1692}
1693
1694static struct snd_kcontrol_new snd_emu10k1_shared_spdif =
1695{
1696	.iface =	SNDRV_CTL_ELEM_IFACE_MIXER,
1697	.name =		"SB Live Analog/Digital Output Jack",
1698	.info =		snd_emu10k1_shared_spdif_info,
1699	.get =		snd_emu10k1_shared_spdif_get,
1700	.put =		snd_emu10k1_shared_spdif_put
1701};
1702
1703static struct snd_kcontrol_new snd_audigy_shared_spdif =
1704{
1705	.iface =	SNDRV_CTL_ELEM_IFACE_MIXER,
1706	.name =		"Audigy Analog/Digital Output Jack",
1707	.info =		snd_emu10k1_shared_spdif_info,
1708	.get =		snd_emu10k1_shared_spdif_get,
1709	.put =		snd_emu10k1_shared_spdif_put
1710};
1711
1712/* workaround for too low volume on Audigy due to 16bit/24bit conversion */
1713
1714#define snd_audigy_capture_boost_info	snd_ctl_boolean_mono_info
1715
1716static int snd_audigy_capture_boost_get(struct snd_kcontrol *kcontrol,
1717					struct snd_ctl_elem_value *ucontrol)
1718{
1719	struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1720	unsigned int val;
1721
1722	/* FIXME: better to use a cached version */
1723	val = snd_ac97_read(emu->ac97, AC97_REC_GAIN);
1724	ucontrol->value.integer.value[0] = !!val;
1725	return 0;
1726}
1727
1728static int snd_audigy_capture_boost_put(struct snd_kcontrol *kcontrol,
1729					struct snd_ctl_elem_value *ucontrol)
1730{
1731	struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1732	unsigned int val;
1733
1734	if (ucontrol->value.integer.value[0])
1735		val = 0x0f0f;
1736	else
1737		val = 0;
1738	return snd_ac97_update(emu->ac97, AC97_REC_GAIN, val);
1739}
1740
1741static struct snd_kcontrol_new snd_audigy_capture_boost =
1742{
1743	.iface =	SNDRV_CTL_ELEM_IFACE_MIXER,
1744	.name =		"Analog Capture Boost",
1745	.info =		snd_audigy_capture_boost_info,
1746	.get =		snd_audigy_capture_boost_get,
1747	.put =		snd_audigy_capture_boost_put
1748};
1749
1750
1751/*
1752 */
1753static void snd_emu10k1_mixer_free_ac97(struct snd_ac97 *ac97)
1754{
1755	struct snd_emu10k1 *emu = ac97->private_data;
1756	emu->ac97 = NULL;
1757}
1758
1759/*
1760 */
1761static int remove_ctl(struct snd_card *card, const char *name)
1762{
1763	struct snd_ctl_elem_id id;
1764	memset(&id, 0, sizeof(id));
1765	strcpy(id.name, name);
1766	id.iface = SNDRV_CTL_ELEM_IFACE_MIXER;
1767	return snd_ctl_remove_id(card, &id);
1768}
1769
1770static struct snd_kcontrol *ctl_find(struct snd_card *card, const char *name)
1771{
1772	struct snd_ctl_elem_id sid;
1773	memset(&sid, 0, sizeof(sid));
1774	strcpy(sid.name, name);
1775	sid.iface = SNDRV_CTL_ELEM_IFACE_MIXER;
1776	return snd_ctl_find_id(card, &sid);
1777}
1778
1779static int rename_ctl(struct snd_card *card, const char *src, const char *dst)
1780{
1781	struct snd_kcontrol *kctl = ctl_find(card, src);
1782	if (kctl) {
1783		strcpy(kctl->id.name, dst);
1784		return 0;
1785	}
1786	return -ENOENT;
1787}
1788
1789int snd_emu10k1_mixer(struct snd_emu10k1 *emu,
1790		      int pcm_device, int multi_device)
1791{
1792	int err, pcm;
1793	struct snd_kcontrol *kctl;
1794	struct snd_card *card = emu->card;
1795	char **c;
1796	static char *emu10k1_remove_ctls[] = {
1797		/* no AC97 mono, surround, center/lfe */
1798		"Master Mono Playback Switch",
1799		"Master Mono Playback Volume",
1800		"PCM Out Path & Mute",
1801		"Mono Output Select",
1802		"Surround Playback Switch",
1803		"Surround Playback Volume",
1804		"Center Playback Switch",
1805		"Center Playback Volume",
1806		"LFE Playback Switch",
1807		"LFE Playback Volume",
1808		NULL
1809	};
1810	static char *emu10k1_rename_ctls[] = {
1811		"Surround Digital Playback Volume", "Surround Playback Volume",
1812		"Center Digital Playback Volume", "Center Playback Volume",
1813		"LFE Digital Playback Volume", "LFE Playback Volume",
1814		NULL
1815	};
1816	static char *audigy_remove_ctls[] = {
1817		/* Master/PCM controls on ac97 of Audigy has no effect */
1818		/* On the Audigy2 the AC97 playback is piped into
1819		 * the Philips ADC for 24bit capture */
1820		"PCM Playback Switch",
1821		"PCM Playback Volume",
1822		"Master Mono Playback Switch",
1823		"Master Mono Playback Volume",
1824		"Master Playback Switch",
1825		"Master Playback Volume",
1826		"PCM Out Path & Mute",
1827		"Mono Output Select",
1828		/* remove unused AC97 capture controls */
1829		"Capture Source",
1830		"Capture Switch",
1831		"Capture Volume",
1832		"Mic Select",
1833		"Video Playback Switch",
1834		"Video Playback Volume",
1835		"Mic Playback Switch",
1836		"Mic Playback Volume",
1837		NULL
1838	};
1839	static char *audigy_rename_ctls[] = {
1840		/* use conventional names */
1841		"Wave Playback Volume", "PCM Playback Volume",
1842		/* "Wave Capture Volume", "PCM Capture Volume", */
1843		"Wave Master Playback Volume", "Master Playback Volume",
1844		"AMic Playback Volume", "Mic Playback Volume",
1845		NULL
1846	};
1847	static char *audigy_rename_ctls_i2c_adc[] = {
1848		//"Analog Mix Capture Volume","OLD Analog Mix Capture Volume",
1849		"Line Capture Volume", "Analog Mix Capture Volume",
1850		"Wave Playback Volume", "OLD PCM Playback Volume",
1851		"Wave Master Playback Volume", "Master Playback Volume",
1852		"AMic Playback Volume", "Old Mic Playback Volume",
1853		"CD Capture Volume", "IEC958 Optical Capture Volume",
1854		NULL
1855	};
1856	static char *audigy_remove_ctls_i2c_adc[] = {
1857		/* On the Audigy2 ZS Notebook
1858		 * Capture via WM8775  */
1859		"Mic Capture Volume",
1860		"Analog Mix Capture Volume",
1861		"Aux Capture Volume",
1862		"IEC958 Optical Capture Volume",
1863		NULL
1864	};
1865	static char *audigy_remove_ctls_1361t_adc[] = {
1866		/* On the Audigy2 the AC97 playback is piped into
1867		 * the Philips ADC for 24bit capture */
1868		"PCM Playback Switch",
1869		"PCM Playback Volume",
1870		"Master Mono Playback Switch",
1871		"Master Mono Playback Volume",
1872		"Capture Source",
1873		"Capture Switch",
1874		"Capture Volume",
1875		"Mic Capture Volume",
1876		"Headphone Playback Switch",
1877		"Headphone Playback Volume",
1878		"3D Control - Center",
1879		"3D Control - Depth",
1880		"3D Control - Switch",
1881		"Line2 Playback Volume",
1882		"Line2 Capture Volume",
1883		NULL
1884	};
1885	static char *audigy_rename_ctls_1361t_adc[] = {
1886		"Master Playback Switch", "Master Capture Switch",
1887		"Master Playback Volume", "Master Capture Volume",
1888		"Wave Master Playback Volume", "Master Playback Volume",
1889		"Beep Playback Switch", "Beep Capture Switch",
1890		"Beep Playback Volume", "Beep Capture Volume",
1891		"Phone Playback Switch", "Phone Capture Switch",
1892		"Phone Playback Volume", "Phone Capture Volume",
1893		"Mic Playback Switch", "Mic Capture Switch",
1894		"Mic Playback Volume", "Mic Capture Volume",
1895		"Line Playback Switch", "Line Capture Switch",
1896		"Line Playback Volume", "Line Capture Volume",
1897		"CD Playback Switch", "CD Capture Switch",
1898		"CD Playback Volume", "CD Capture Volume",
1899		"Aux Playback Switch", "Aux Capture Switch",
1900		"Aux Playback Volume", "Aux Capture Volume",
1901		"Video Playback Switch", "Video Capture Switch",
1902		"Video Playback Volume", "Video Capture Volume",
1903
1904		NULL
1905	};
1906
1907	if (emu->card_capabilities->ac97_chip) {
1908		struct snd_ac97_bus *pbus;
1909		struct snd_ac97_template ac97;
1910		static struct snd_ac97_bus_ops ops = {
1911			.write = snd_emu10k1_ac97_write,
1912			.read = snd_emu10k1_ac97_read,
1913		};
1914
1915		if ((err = snd_ac97_bus(emu->card, 0, &ops, NULL, &pbus)) < 0)
1916			return err;
1917		pbus->no_vra = 1; /* we don't need VRA */
1918
1919		memset(&ac97, 0, sizeof(ac97));
1920		ac97.private_data = emu;
1921		ac97.private_free = snd_emu10k1_mixer_free_ac97;
1922		ac97.scaps = AC97_SCAP_NO_SPDIF;
1923		if ((err = snd_ac97_mixer(pbus, &ac97, &emu->ac97)) < 0) {
1924			if (emu->card_capabilities->ac97_chip == 1)
1925				return err;
1926			dev_info(emu->card->dev,
1927				 "AC97 is optional on this board\n");
1928			dev_info(emu->card->dev,
1929				 "Proceeding without ac97 mixers...\n");
1930			snd_device_free(emu->card, pbus);
1931			goto no_ac97; /* FIXME: get rid of ugly gotos.. */
1932		}
1933		if (emu->audigy) {
1934			/* set master volume to 0 dB */
1935			snd_ac97_write_cache(emu->ac97, AC97_MASTER, 0x0000);
1936			/* set capture source to mic */
1937			snd_ac97_write_cache(emu->ac97, AC97_REC_SEL, 0x0000);
1938			if (emu->card_capabilities->adc_1361t)
1939				c = audigy_remove_ctls_1361t_adc;
1940			else
1941				c = audigy_remove_ctls;
1942		} else {
1943			/*
1944			 * Credits for cards based on STAC9758:
1945			 *   James Courtier-Dutton <James@superbug.demon.co.uk>
1946			 *   Voluspa <voluspa@comhem.se>
1947			 */
1948			if (emu->ac97->id == AC97_ID_STAC9758) {
1949				emu->rear_ac97 = 1;
1950				snd_emu10k1_ptr_write(emu, AC97SLOT, 0, AC97SLOT_CNTR|AC97SLOT_LFE|AC97SLOT_REAR_LEFT|AC97SLOT_REAR_RIGHT);
1951				snd_ac97_write_cache(emu->ac97, AC97_HEADPHONE, 0x0202);
1952				remove_ctl(card,"Front Playback Volume");
1953				remove_ctl(card,"Front Playback Switch");
1954			}
1955			/* remove unused AC97 controls */
1956			snd_ac97_write_cache(emu->ac97, AC97_SURROUND_MASTER, 0x0202);
1957			snd_ac97_write_cache(emu->ac97, AC97_CENTER_LFE_MASTER, 0x0202);
1958			c = emu10k1_remove_ctls;
1959		}
1960		for (; *c; c++)
1961			remove_ctl(card, *c);
1962	} else if (emu->card_capabilities->i2c_adc) {
1963		c = audigy_remove_ctls_i2c_adc;
1964		for (; *c; c++)
1965			remove_ctl(card, *c);
1966	} else {
1967	no_ac97:
1968		if (emu->card_capabilities->ecard)
1969			strcpy(emu->card->mixername, "EMU APS");
1970		else if (emu->audigy)
1971			strcpy(emu->card->mixername, "SB Audigy");
1972		else
1973			strcpy(emu->card->mixername, "Emu10k1");
1974	}
1975
1976	if (emu->audigy)
1977		if (emu->card_capabilities->adc_1361t)
1978			c = audigy_rename_ctls_1361t_adc;
1979		else if (emu->card_capabilities->i2c_adc)
1980			c = audigy_rename_ctls_i2c_adc;
1981		else
1982			c = audigy_rename_ctls;
1983	else
1984		c = emu10k1_rename_ctls;
1985	for (; *c; c += 2)
1986		rename_ctl(card, c[0], c[1]);
1987
1988	if (emu->card_capabilities->subsystem == 0x80401102) { /* SB Live! Platinum CT4760P */
1989		remove_ctl(card, "Center Playback Volume");
1990		remove_ctl(card, "LFE Playback Volume");
1991		remove_ctl(card, "Wave Center Playback Volume");
1992		remove_ctl(card, "Wave LFE Playback Volume");
1993	}
1994	if (emu->card_capabilities->subsystem == 0x20071102) {  /* Audigy 4 Pro */
1995		rename_ctl(card, "Line2 Capture Volume", "Line1/Mic Capture Volume");
1996		rename_ctl(card, "Analog Mix Capture Volume", "Line2 Capture Volume");
1997		rename_ctl(card, "Aux2 Capture Volume", "Line3 Capture Volume");
1998		rename_ctl(card, "Mic Capture Volume", "Unknown1 Capture Volume");
1999		remove_ctl(card, "Headphone Playback Switch");
2000		remove_ctl(card, "Headphone Playback Volume");
2001		remove_ctl(card, "3D Control - Center");
2002		remove_ctl(card, "3D Control - Depth");
2003		remove_ctl(card, "3D Control - Switch");
2004	}
2005	if ((kctl = emu->ctl_send_routing = snd_ctl_new1(&snd_emu10k1_send_routing_control, emu)) == NULL)
2006		return -ENOMEM;
2007	kctl->id.device = pcm_device;
2008	if ((err = snd_ctl_add(card, kctl)))
2009		return err;
2010	if ((kctl = emu->ctl_send_volume = snd_ctl_new1(&snd_emu10k1_send_volume_control, emu)) == NULL)
2011		return -ENOMEM;
2012	kctl->id.device = pcm_device;
2013	if ((err = snd_ctl_add(card, kctl)))
2014		return err;
2015	if ((kctl = emu->ctl_attn = snd_ctl_new1(&snd_emu10k1_attn_control, emu)) == NULL)
2016		return -ENOMEM;
2017	kctl->id.device = pcm_device;
2018	if ((err = snd_ctl_add(card, kctl)))
2019		return err;
2020
2021	if ((kctl = emu->ctl_efx_send_routing = snd_ctl_new1(&snd_emu10k1_efx_send_routing_control, emu)) == NULL)
2022		return -ENOMEM;
2023	kctl->id.device = multi_device;
2024	if ((err = snd_ctl_add(card, kctl)))
2025		return err;
2026
2027	if ((kctl = emu->ctl_efx_send_volume = snd_ctl_new1(&snd_emu10k1_efx_send_volume_control, emu)) == NULL)
2028		return -ENOMEM;
2029	kctl->id.device = multi_device;
2030	if ((err = snd_ctl_add(card, kctl)))
2031		return err;
2032
2033	if ((kctl = emu->ctl_efx_attn = snd_ctl_new1(&snd_emu10k1_efx_attn_control, emu)) == NULL)
2034		return -ENOMEM;
2035	kctl->id.device = multi_device;
2036	if ((err = snd_ctl_add(card, kctl)))
2037		return err;
2038
2039	/* initialize the routing and volume table for each pcm playback stream */
2040	for (pcm = 0; pcm < 32; pcm++) {
2041		struct snd_emu10k1_pcm_mixer *mix;
2042		int v;
2043
2044		mix = &emu->pcm_mixer[pcm];
2045		mix->epcm = NULL;
2046
2047		for (v = 0; v < 4; v++)
2048			mix->send_routing[0][v] =
2049				mix->send_routing[1][v] =
2050				mix->send_routing[2][v] = v;
2051
2052		memset(&mix->send_volume, 0, sizeof(mix->send_volume));
2053		mix->send_volume[0][0] = mix->send_volume[0][1] =
2054		mix->send_volume[1][0] = mix->send_volume[2][1] = 255;
2055
2056		mix->attn[0] = mix->attn[1] = mix->attn[2] = 0xffff;
2057	}
2058
2059	/* initialize the routing and volume table for the multichannel playback stream */
2060	for (pcm = 0; pcm < NUM_EFX_PLAYBACK; pcm++) {
2061		struct snd_emu10k1_pcm_mixer *mix;
2062		int v;
2063
2064		mix = &emu->efx_pcm_mixer[pcm];
2065		mix->epcm = NULL;
2066
2067		mix->send_routing[0][0] = pcm;
2068		mix->send_routing[0][1] = (pcm == 0) ? 1 : 0;
2069		for (v = 0; v < 2; v++)
2070			mix->send_routing[0][2+v] = 13+v;
2071		if (emu->audigy)
2072			for (v = 0; v < 4; v++)
2073				mix->send_routing[0][4+v] = 60+v;
2074
2075		memset(&mix->send_volume, 0, sizeof(mix->send_volume));
2076		mix->send_volume[0][0]  = 255;
2077
2078		mix->attn[0] = 0xffff;
2079	}
2080
2081	if (! emu->card_capabilities->ecard) { /* FIXME: APS has these controls? */
2082		/* sb live! and audigy */
2083		if ((kctl = snd_ctl_new1(&snd_emu10k1_spdif_mask_control, emu)) == NULL)
2084			return -ENOMEM;
2085		if (!emu->audigy)
2086			kctl->id.device = emu->pcm_efx->device;
2087		if ((err = snd_ctl_add(card, kctl)))
2088			return err;
2089		if ((kctl = snd_ctl_new1(&snd_emu10k1_spdif_control, emu)) == NULL)
2090			return -ENOMEM;
2091		if (!emu->audigy)
2092			kctl->id.device = emu->pcm_efx->device;
2093		if ((err = snd_ctl_add(card, kctl)))
2094			return err;
2095	}
2096
2097	if (emu->card_capabilities->emu_model) {
2098		;  /* Disable the snd_audigy_spdif_shared_spdif */
2099	} else if (emu->audigy) {
2100		if ((kctl = snd_ctl_new1(&snd_audigy_shared_spdif, emu)) == NULL)
2101			return -ENOMEM;
2102		if ((err = snd_ctl_add(card, kctl)))
2103			return err;
2104#if 0
2105		if ((kctl = snd_ctl_new1(&snd_audigy_spdif_output_rate, emu)) == NULL)
2106			return -ENOMEM;
2107		if ((err = snd_ctl_add(card, kctl)))
2108			return err;
2109#endif
2110	} else if (! emu->card_capabilities->ecard) {
2111		/* sb live! */
2112		if ((kctl = snd_ctl_new1(&snd_emu10k1_shared_spdif, emu)) == NULL)
2113			return -ENOMEM;
2114		if ((err = snd_ctl_add(card, kctl)))
2115			return err;
2116	}
2117	if (emu->card_capabilities->ca0151_chip) { /* P16V */
2118		if ((err = snd_p16v_mixer(emu)))
2119			return err;
2120	}
2121
2122	if (emu->card_capabilities->emu_model == EMU_MODEL_EMU1616) {
2123		/* 1616(m) cardbus */
2124		int i;
2125
2126		for (i = 0; i < ARRAY_SIZE(snd_emu1616_output_enum_ctls); i++) {
2127			err = snd_ctl_add(card,
2128				snd_ctl_new1(&snd_emu1616_output_enum_ctls[i],
2129					     emu));
2130			if (err < 0)
2131				return err;
2132		}
2133		for (i = 0; i < ARRAY_SIZE(snd_emu1010_input_enum_ctls); i++) {
2134			err = snd_ctl_add(card,
2135				snd_ctl_new1(&snd_emu1010_input_enum_ctls[i],
2136					     emu));
2137			if (err < 0)
2138				return err;
2139		}
2140		for (i = 0; i < ARRAY_SIZE(snd_emu1010_adc_pads) - 2; i++) {
2141			err = snd_ctl_add(card,
2142				snd_ctl_new1(&snd_emu1010_adc_pads[i], emu));
2143			if (err < 0)
2144				return err;
2145		}
2146		for (i = 0; i < ARRAY_SIZE(snd_emu1010_dac_pads) - 2; i++) {
2147			err = snd_ctl_add(card,
2148				snd_ctl_new1(&snd_emu1010_dac_pads[i], emu));
2149			if (err < 0)
2150				return err;
2151		}
2152		err = snd_ctl_add(card,
2153			snd_ctl_new1(&snd_emu1010_internal_clock, emu));
2154		if (err < 0)
2155			return err;
2156		err = snd_ctl_add(card,
2157			snd_ctl_new1(&snd_emu1010_optical_out, emu));
2158		if (err < 0)
2159			return err;
2160		err = snd_ctl_add(card,
2161			snd_ctl_new1(&snd_emu1010_optical_in, emu));
2162		if (err < 0)
2163			return err;
2164
2165	} else if (emu->card_capabilities->emu_model) {
2166		/* all other e-mu cards for now */
2167		int i;
2168
2169		for (i = 0; i < ARRAY_SIZE(snd_emu1010_output_enum_ctls); i++) {
2170			err = snd_ctl_add(card,
2171				snd_ctl_new1(&snd_emu1010_output_enum_ctls[i],
2172					     emu));
2173			if (err < 0)
2174				return err;
2175		}
2176		for (i = 0; i < ARRAY_SIZE(snd_emu1010_input_enum_ctls); i++) {
2177			err = snd_ctl_add(card,
2178				snd_ctl_new1(&snd_emu1010_input_enum_ctls[i],
2179					     emu));
2180			if (err < 0)
2181				return err;
2182		}
2183		for (i = 0; i < ARRAY_SIZE(snd_emu1010_adc_pads); i++) {
2184			err = snd_ctl_add(card,
2185				snd_ctl_new1(&snd_emu1010_adc_pads[i], emu));
2186			if (err < 0)
2187				return err;
2188		}
2189		for (i = 0; i < ARRAY_SIZE(snd_emu1010_dac_pads); i++) {
2190			err = snd_ctl_add(card,
2191				snd_ctl_new1(&snd_emu1010_dac_pads[i], emu));
2192			if (err < 0)
2193				return err;
2194		}
2195		err = snd_ctl_add(card,
2196			snd_ctl_new1(&snd_emu1010_internal_clock, emu));
2197		if (err < 0)
2198			return err;
2199		err = snd_ctl_add(card,
2200			snd_ctl_new1(&snd_emu1010_optical_out, emu));
2201		if (err < 0)
2202			return err;
2203		err = snd_ctl_add(card,
2204			snd_ctl_new1(&snd_emu1010_optical_in, emu));
2205		if (err < 0)
2206			return err;
2207	}
2208
2209	if ( emu->card_capabilities->i2c_adc) {
2210		int i;
2211
2212		err = snd_ctl_add(card, snd_ctl_new1(&snd_audigy_i2c_capture_source, emu));
2213		if (err < 0)
2214			return err;
2215
2216		for (i = 0; i < ARRAY_SIZE(snd_audigy_i2c_volume_ctls); i++) {
2217			err = snd_ctl_add(card, snd_ctl_new1(&snd_audigy_i2c_volume_ctls[i], emu));
2218			if (err < 0)
2219				return err;
2220		}
2221	}
2222
2223	if (emu->card_capabilities->ac97_chip && emu->audigy) {
2224		err = snd_ctl_add(card, snd_ctl_new1(&snd_audigy_capture_boost,
2225						     emu));
2226		if (err < 0)
2227			return err;
2228	}
2229
2230	return 0;
2231}
2232