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