2 * Copyright (c) by Jaroslav Kysela <perex@perex.cz>,
3 * Takashi Iwai <tiwai@suse.de>
5 * Routines for control of EMU10K1 chips / mixer routines
6 * Multichannel PCM support Copyright (c) Lee Revell <rlrevell@joe-job.com>
8 * Copyright (c) by James Courtier-Dutton <James@superbug.co.uk>
9 * Added EMU 1010 support.
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.
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.
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
33 #include <sound/driver.h>
34 #include <linux/time.h>
35 #include <linux/init.h>
36 #include <sound/core.h>
37 #include <sound/emu10k1.h>
38 #include <linux/delay.h>
39 #include <sound/tlv.h>
43 #define AC97_ID_STAC9758 0x83847658
45 static const DECLARE_TLV_DB_SCALE(snd_audigy_db_scale2, -10350, 50, 1); /* WM8775 gain scale */
47 static int snd_emu10k1_spdif_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
49 uinfo->type = SNDRV_CTL_ELEM_TYPE_IEC958;
54 static int snd_emu10k1_spdif_get(struct snd_kcontrol *kcontrol,
55 struct snd_ctl_elem_value *ucontrol)
57 struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
58 unsigned int idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
61 /* Limit: emu->spdif_bits */
64 spin_lock_irqsave(&emu->reg_lock, flags);
65 ucontrol->value.iec958.status[0] = (emu->spdif_bits[idx] >> 0) & 0xff;
66 ucontrol->value.iec958.status[1] = (emu->spdif_bits[idx] >> 8) & 0xff;
67 ucontrol->value.iec958.status[2] = (emu->spdif_bits[idx] >> 16) & 0xff;
68 ucontrol->value.iec958.status[3] = (emu->spdif_bits[idx] >> 24) & 0xff;
69 spin_unlock_irqrestore(&emu->reg_lock, flags);
73 static int snd_emu10k1_spdif_get_mask(struct snd_kcontrol *kcontrol,
74 struct snd_ctl_elem_value *ucontrol)
76 ucontrol->value.iec958.status[0] = 0xff;
77 ucontrol->value.iec958.status[1] = 0xff;
78 ucontrol->value.iec958.status[2] = 0xff;
79 ucontrol->value.iec958.status[3] = 0xff;
84 * Items labels in enum mixer controls assigning source data to
87 static char *emu1010_src_texts[] = {
144 * List of data sources available for each destination
146 static unsigned int emu1010_src_regs[] = {
147 EMU_SRC_SILENCE,/* 0 */
148 EMU_SRC_DOCK_MIC_A1, /* 1 */
149 EMU_SRC_DOCK_MIC_B1, /* 2 */
150 EMU_SRC_DOCK_ADC1_LEFT1, /* 3 */
151 EMU_SRC_DOCK_ADC1_RIGHT1, /* 4 */
152 EMU_SRC_DOCK_ADC2_LEFT1, /* 5 */
153 EMU_SRC_DOCK_ADC2_RIGHT1, /* 6 */
154 EMU_SRC_DOCK_ADC3_LEFT1, /* 7 */
155 EMU_SRC_DOCK_ADC3_RIGHT1, /* 8 */
156 EMU_SRC_HAMOA_ADC_LEFT1, /* 9 */
157 EMU_SRC_HAMOA_ADC_RIGHT1, /* 10 */
158 EMU_SRC_HANA_SPDIF_LEFT1, /* 11 */
159 EMU_SRC_HANA_SPDIF_RIGHT1, /* 12 */
160 EMU_SRC_HANA_ADAT, /* 13 */
161 EMU_SRC_HANA_ADAT+1, /* 14 */
162 EMU_SRC_HANA_ADAT+2, /* 15 */
163 EMU_SRC_HANA_ADAT+3, /* 16 */
164 EMU_SRC_HANA_ADAT+4, /* 17 */
165 EMU_SRC_HANA_ADAT+5, /* 18 */
166 EMU_SRC_HANA_ADAT+6, /* 19 */
167 EMU_SRC_HANA_ADAT+7, /* 20 */
168 EMU_SRC_ALICE_EMU32A, /* 21 */
169 EMU_SRC_ALICE_EMU32A+1, /* 22 */
170 EMU_SRC_ALICE_EMU32A+2, /* 23 */
171 EMU_SRC_ALICE_EMU32A+3, /* 24 */
172 EMU_SRC_ALICE_EMU32A+4, /* 25 */
173 EMU_SRC_ALICE_EMU32A+5, /* 26 */
174 EMU_SRC_ALICE_EMU32A+6, /* 27 */
175 EMU_SRC_ALICE_EMU32A+7, /* 28 */
176 EMU_SRC_ALICE_EMU32A+8, /* 29 */
177 EMU_SRC_ALICE_EMU32A+9, /* 30 */
178 EMU_SRC_ALICE_EMU32A+0xa, /* 31 */
179 EMU_SRC_ALICE_EMU32A+0xb, /* 32 */
180 EMU_SRC_ALICE_EMU32A+0xc, /* 33 */
181 EMU_SRC_ALICE_EMU32A+0xd, /* 34 */
182 EMU_SRC_ALICE_EMU32A+0xe, /* 35 */
183 EMU_SRC_ALICE_EMU32A+0xf, /* 36 */
184 EMU_SRC_ALICE_EMU32B, /* 37 */
185 EMU_SRC_ALICE_EMU32B+1, /* 38 */
186 EMU_SRC_ALICE_EMU32B+2, /* 39 */
187 EMU_SRC_ALICE_EMU32B+3, /* 40 */
188 EMU_SRC_ALICE_EMU32B+4, /* 41 */
189 EMU_SRC_ALICE_EMU32B+5, /* 42 */
190 EMU_SRC_ALICE_EMU32B+6, /* 43 */
191 EMU_SRC_ALICE_EMU32B+7, /* 44 */
192 EMU_SRC_ALICE_EMU32B+8, /* 45 */
193 EMU_SRC_ALICE_EMU32B+9, /* 46 */
194 EMU_SRC_ALICE_EMU32B+0xa, /* 47 */
195 EMU_SRC_ALICE_EMU32B+0xb, /* 48 */
196 EMU_SRC_ALICE_EMU32B+0xc, /* 49 */
197 EMU_SRC_ALICE_EMU32B+0xd, /* 50 */
198 EMU_SRC_ALICE_EMU32B+0xe, /* 51 */
199 EMU_SRC_ALICE_EMU32B+0xf, /* 52 */
203 * Data destinations - physical EMU outputs.
204 * Each destination has an enum mixer control to choose a data source
206 static unsigned int emu1010_output_dst[] = {
207 EMU_DST_DOCK_DAC1_LEFT1, /* 0 */
208 EMU_DST_DOCK_DAC1_RIGHT1, /* 1 */
209 EMU_DST_DOCK_DAC2_LEFT1, /* 2 */
210 EMU_DST_DOCK_DAC2_RIGHT1, /* 3 */
211 EMU_DST_DOCK_DAC3_LEFT1, /* 4 */
212 EMU_DST_DOCK_DAC3_RIGHT1, /* 5 */
213 EMU_DST_DOCK_DAC4_LEFT1, /* 6 */
214 EMU_DST_DOCK_DAC4_RIGHT1, /* 7 */
215 EMU_DST_DOCK_PHONES_LEFT1, /* 8 */
216 EMU_DST_DOCK_PHONES_RIGHT1, /* 9 */
217 EMU_DST_DOCK_SPDIF_LEFT1, /* 10 */
218 EMU_DST_DOCK_SPDIF_RIGHT1, /* 11 */
219 EMU_DST_HANA_SPDIF_LEFT1, /* 12 */
220 EMU_DST_HANA_SPDIF_RIGHT1, /* 13 */
221 EMU_DST_HAMOA_DAC_LEFT1, /* 14 */
222 EMU_DST_HAMOA_DAC_RIGHT1, /* 15 */
223 EMU_DST_HANA_ADAT, /* 16 */
224 EMU_DST_HANA_ADAT+1, /* 17 */
225 EMU_DST_HANA_ADAT+2, /* 18 */
226 EMU_DST_HANA_ADAT+3, /* 19 */
227 EMU_DST_HANA_ADAT+4, /* 20 */
228 EMU_DST_HANA_ADAT+5, /* 21 */
229 EMU_DST_HANA_ADAT+6, /* 22 */
230 EMU_DST_HANA_ADAT+7, /* 23 */
234 * Data destinations - HANA outputs going to Alice2 (audigy) for
235 * capture (EMU32 + I2S links)
236 * Each destination has an enum mixer control to choose a data source
238 static unsigned int emu1010_input_dst[] = {
239 EMU_DST_ALICE2_EMU32_0,
240 EMU_DST_ALICE2_EMU32_1,
241 EMU_DST_ALICE2_EMU32_2,
242 EMU_DST_ALICE2_EMU32_3,
243 EMU_DST_ALICE2_EMU32_4,
244 EMU_DST_ALICE2_EMU32_5,
245 EMU_DST_ALICE2_EMU32_6,
246 EMU_DST_ALICE2_EMU32_7,
247 EMU_DST_ALICE2_EMU32_8,
248 EMU_DST_ALICE2_EMU32_9,
249 EMU_DST_ALICE2_EMU32_A,
250 EMU_DST_ALICE2_EMU32_B,
251 EMU_DST_ALICE2_EMU32_C,
252 EMU_DST_ALICE2_EMU32_D,
253 EMU_DST_ALICE2_EMU32_E,
254 EMU_DST_ALICE2_EMU32_F,
255 EMU_DST_ALICE_I2S0_LEFT,
256 EMU_DST_ALICE_I2S0_RIGHT,
257 EMU_DST_ALICE_I2S1_LEFT,
258 EMU_DST_ALICE_I2S1_RIGHT,
259 EMU_DST_ALICE_I2S2_LEFT,
260 EMU_DST_ALICE_I2S2_RIGHT,
263 static int snd_emu1010_input_output_source_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
265 uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
267 uinfo->value.enumerated.items = 53;
268 if (uinfo->value.enumerated.item >= uinfo->value.enumerated.items)
269 uinfo->value.enumerated.item = uinfo->value.enumerated.items - 1;
270 strcpy(uinfo->value.enumerated.name, emu1010_src_texts[uinfo->value.enumerated.item]);
274 static int snd_emu1010_output_source_get(struct snd_kcontrol *kcontrol,
275 struct snd_ctl_elem_value *ucontrol)
277 struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
278 unsigned int channel;
280 channel = (kcontrol->private_value) & 0xff;
281 /* Limit: emu1010_output_dst, emu->emu1010.output_source */
284 ucontrol->value.enumerated.item[0] = emu->emu1010.output_source[channel];
288 static int snd_emu1010_output_source_put(struct snd_kcontrol *kcontrol,
289 struct snd_ctl_elem_value *ucontrol)
291 struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
294 unsigned int channel;
296 val = ucontrol->value.enumerated.item[0];
299 channel = (kcontrol->private_value) & 0xff;
300 /* Limit: emu1010_output_dst, emu->emu1010.output_source */
303 if (emu->emu1010.output_source[channel] != val) {
304 emu->emu1010.output_source[channel] = val;
306 snd_emu1010_fpga_link_dst_src_write(emu,
307 emu1010_output_dst[channel], emu1010_src_regs[val]);
312 static int snd_emu1010_input_source_get(struct snd_kcontrol *kcontrol,
313 struct snd_ctl_elem_value *ucontrol)
315 struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
316 unsigned int channel;
318 channel = (kcontrol->private_value) & 0xff;
319 /* Limit: emu1010_input_dst, emu->emu1010.input_source */
322 ucontrol->value.enumerated.item[0] = emu->emu1010.input_source[channel];
326 static int snd_emu1010_input_source_put(struct snd_kcontrol *kcontrol,
327 struct snd_ctl_elem_value *ucontrol)
329 struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
332 unsigned int channel;
334 val = ucontrol->value.enumerated.item[0];
337 channel = (kcontrol->private_value) & 0xff;
338 /* Limit: emu1010_input_dst, emu->emu1010.input_source */
341 if (emu->emu1010.input_source[channel] != val) {
342 emu->emu1010.input_source[channel] = val;
344 snd_emu1010_fpga_link_dst_src_write(emu,
345 emu1010_input_dst[channel], emu1010_src_regs[val]);
350 #define EMU1010_SOURCE_OUTPUT(xname,chid) \
352 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
353 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, \
354 .info = snd_emu1010_input_output_source_info, \
355 .get = snd_emu1010_output_source_get, \
356 .put = snd_emu1010_output_source_put, \
357 .private_value = chid \
360 static struct snd_kcontrol_new snd_emu1010_output_enum_ctls[] __devinitdata = {
361 EMU1010_SOURCE_OUTPUT("Dock DAC1 Left Playback Enum", 0),
362 EMU1010_SOURCE_OUTPUT("Dock DAC1 Right Playback Enum", 1),
363 EMU1010_SOURCE_OUTPUT("Dock DAC2 Left Playback Enum", 2),
364 EMU1010_SOURCE_OUTPUT("Dock DAC2 Right Playback Enum", 3),
365 EMU1010_SOURCE_OUTPUT("Dock DAC3 Left Playback Enum", 4),
366 EMU1010_SOURCE_OUTPUT("Dock DAC3 Right Playback Enum", 5),
367 EMU1010_SOURCE_OUTPUT("Dock DAC4 Left Playback Enum", 6),
368 EMU1010_SOURCE_OUTPUT("Dock DAC4 Right Playback Enum", 7),
369 EMU1010_SOURCE_OUTPUT("Dock Phones Left Playback Enum", 8),
370 EMU1010_SOURCE_OUTPUT("Dock Phones Right Playback Enum", 9),
371 EMU1010_SOURCE_OUTPUT("Dock SPDIF Left Playback Enum", 0xa),
372 EMU1010_SOURCE_OUTPUT("Dock SPDIF Right Playback Enum", 0xb),
373 EMU1010_SOURCE_OUTPUT("1010 SPDIF Left Playback Enum", 0xc),
374 EMU1010_SOURCE_OUTPUT("1010 SPDIF Right Playback Enum", 0xd),
375 EMU1010_SOURCE_OUTPUT("0202 DAC Left Playback Enum", 0xe),
376 EMU1010_SOURCE_OUTPUT("0202 DAC Right Playback Enum", 0xf),
377 EMU1010_SOURCE_OUTPUT("1010 ADAT 0 Playback Enum", 0x10),
378 EMU1010_SOURCE_OUTPUT("1010 ADAT 1 Playback Enum", 0x11),
379 EMU1010_SOURCE_OUTPUT("1010 ADAT 2 Playback Enum", 0x12),
380 EMU1010_SOURCE_OUTPUT("1010 ADAT 3 Playback Enum", 0x13),
381 EMU1010_SOURCE_OUTPUT("1010 ADAT 4 Playback Enum", 0x14),
382 EMU1010_SOURCE_OUTPUT("1010 ADAT 5 Playback Enum", 0x15),
383 EMU1010_SOURCE_OUTPUT("1010 ADAT 6 Playback Enum", 0x16),
384 EMU1010_SOURCE_OUTPUT("1010 ADAT 7 Playback Enum", 0x17),
387 #define EMU1010_SOURCE_INPUT(xname,chid) \
389 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
390 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, \
391 .info = snd_emu1010_input_output_source_info, \
392 .get = snd_emu1010_input_source_get, \
393 .put = snd_emu1010_input_source_put, \
394 .private_value = chid \
397 static struct snd_kcontrol_new snd_emu1010_input_enum_ctls[] __devinitdata = {
398 EMU1010_SOURCE_INPUT("DSP 0 Capture Enum", 0),
399 EMU1010_SOURCE_INPUT("DSP 1 Capture Enum", 1),
400 EMU1010_SOURCE_INPUT("DSP 2 Capture Enum", 2),
401 EMU1010_SOURCE_INPUT("DSP 3 Capture Enum", 3),
402 EMU1010_SOURCE_INPUT("DSP 4 Capture Enum", 4),
403 EMU1010_SOURCE_INPUT("DSP 5 Capture Enum", 5),
404 EMU1010_SOURCE_INPUT("DSP 6 Capture Enum", 6),
405 EMU1010_SOURCE_INPUT("DSP 7 Capture Enum", 7),
406 EMU1010_SOURCE_INPUT("DSP 8 Capture Enum", 8),
407 EMU1010_SOURCE_INPUT("DSP 9 Capture Enum", 9),
408 EMU1010_SOURCE_INPUT("DSP A Capture Enum", 0xa),
409 EMU1010_SOURCE_INPUT("DSP B Capture Enum", 0xb),
410 EMU1010_SOURCE_INPUT("DSP C Capture Enum", 0xc),
411 EMU1010_SOURCE_INPUT("DSP D Capture Enum", 0xd),
412 EMU1010_SOURCE_INPUT("DSP E Capture Enum", 0xe),
413 EMU1010_SOURCE_INPUT("DSP F Capture Enum", 0xf),
414 EMU1010_SOURCE_INPUT("DSP 10 Capture Enum", 0x10),
415 EMU1010_SOURCE_INPUT("DSP 11 Capture Enum", 0x11),
416 EMU1010_SOURCE_INPUT("DSP 12 Capture Enum", 0x12),
417 EMU1010_SOURCE_INPUT("DSP 13 Capture Enum", 0x13),
418 EMU1010_SOURCE_INPUT("DSP 14 Capture Enum", 0x14),
419 EMU1010_SOURCE_INPUT("DSP 15 Capture Enum", 0x15),
424 #define snd_emu1010_adc_pads_info snd_ctl_boolean_mono_info
426 static int snd_emu1010_adc_pads_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
428 struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
429 unsigned int mask = kcontrol->private_value & 0xff;
430 ucontrol->value.integer.value[0] = (emu->emu1010.adc_pads & mask) ? 1 : 0;
434 static int snd_emu1010_adc_pads_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
436 struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
437 unsigned int mask = kcontrol->private_value & 0xff;
438 unsigned int val, cache;
439 val = ucontrol->value.integer.value[0];
440 cache = emu->emu1010.adc_pads;
442 cache = cache | mask;
444 cache = cache & ~mask;
445 if (cache != emu->emu1010.adc_pads) {
446 snd_emu1010_fpga_write(emu, EMU_HANA_ADC_PADS, cache );
447 emu->emu1010.adc_pads = cache;
455 #define EMU1010_ADC_PADS(xname,chid) \
457 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
458 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, \
459 .info = snd_emu1010_adc_pads_info, \
460 .get = snd_emu1010_adc_pads_get, \
461 .put = snd_emu1010_adc_pads_put, \
462 .private_value = chid \
465 static struct snd_kcontrol_new snd_emu1010_adc_pads[] __devinitdata = {
466 EMU1010_ADC_PADS("ADC1 14dB PAD Audio Dock Capture Switch", EMU_HANA_DOCK_ADC_PAD1),
467 EMU1010_ADC_PADS("ADC2 14dB PAD Audio Dock Capture Switch", EMU_HANA_DOCK_ADC_PAD2),
468 EMU1010_ADC_PADS("ADC3 14dB PAD Audio Dock Capture Switch", EMU_HANA_DOCK_ADC_PAD3),
469 EMU1010_ADC_PADS("ADC1 14dB PAD 0202 Capture Switch", EMU_HANA_0202_ADC_PAD1),
472 #define snd_emu1010_dac_pads_info snd_ctl_boolean_mono_info
474 static int snd_emu1010_dac_pads_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
476 struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
477 unsigned int mask = kcontrol->private_value & 0xff;
478 ucontrol->value.integer.value[0] = (emu->emu1010.dac_pads & mask) ? 1 : 0;
482 static int snd_emu1010_dac_pads_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
484 struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
485 unsigned int mask = kcontrol->private_value & 0xff;
486 unsigned int val, cache;
487 val = ucontrol->value.integer.value[0];
488 cache = emu->emu1010.dac_pads;
490 cache = cache | mask;
492 cache = cache & ~mask;
493 if (cache != emu->emu1010.dac_pads) {
494 snd_emu1010_fpga_write(emu, EMU_HANA_DAC_PADS, cache );
495 emu->emu1010.dac_pads = cache;
503 #define EMU1010_DAC_PADS(xname,chid) \
505 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
506 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, \
507 .info = snd_emu1010_dac_pads_info, \
508 .get = snd_emu1010_dac_pads_get, \
509 .put = snd_emu1010_dac_pads_put, \
510 .private_value = chid \
513 static struct snd_kcontrol_new snd_emu1010_dac_pads[] __devinitdata = {
514 EMU1010_DAC_PADS("DAC1 Audio Dock 14dB PAD Playback Switch", EMU_HANA_DOCK_DAC_PAD1),
515 EMU1010_DAC_PADS("DAC2 Audio Dock 14dB PAD Playback Switch", EMU_HANA_DOCK_DAC_PAD2),
516 EMU1010_DAC_PADS("DAC3 Audio Dock 14dB PAD Playback Switch", EMU_HANA_DOCK_DAC_PAD3),
517 EMU1010_DAC_PADS("DAC4 Audio Dock 14dB PAD Playback Switch", EMU_HANA_DOCK_DAC_PAD4),
518 EMU1010_DAC_PADS("DAC1 0202 14dB PAD Playback Switch", EMU_HANA_0202_DAC_PAD1),
522 static int snd_emu1010_internal_clock_info(struct snd_kcontrol *kcontrol,
523 struct snd_ctl_elem_info *uinfo)
525 static char *texts[4] = {
526 "44100", "48000", "SPDIF", "ADAT"
529 uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
531 uinfo->value.enumerated.items = 4;
532 if (uinfo->value.enumerated.item >= uinfo->value.enumerated.items)
533 uinfo->value.enumerated.item = uinfo->value.enumerated.items - 1;
534 strcpy(uinfo->value.enumerated.name, texts[uinfo->value.enumerated.item]);
540 static int snd_emu1010_internal_clock_get(struct snd_kcontrol *kcontrol,
541 struct snd_ctl_elem_value *ucontrol)
543 struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
545 ucontrol->value.enumerated.item[0] = emu->emu1010.internal_clock;
549 static int snd_emu1010_internal_clock_put(struct snd_kcontrol *kcontrol,
550 struct snd_ctl_elem_value *ucontrol)
552 struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
556 val = ucontrol->value.enumerated.item[0] ;
557 /* Limit: uinfo->value.enumerated.items = 4; */
560 change = (emu->emu1010.internal_clock != val);
562 emu->emu1010.internal_clock = val;
567 snd_emu1010_fpga_write(emu, EMU_HANA_UNMUTE, EMU_MUTE );
568 /* Default fallback clock 48kHz */
569 snd_emu1010_fpga_write(emu, EMU_HANA_DEFCLOCK, EMU_HANA_DEFCLOCK_44_1K );
570 /* Word Clock source, Internal 44.1kHz x1 */
571 snd_emu1010_fpga_write(emu, EMU_HANA_WCLOCK,
572 EMU_HANA_WCLOCK_INT_44_1K | EMU_HANA_WCLOCK_1X );
573 /* Set LEDs on Audio Dock */
574 snd_emu1010_fpga_write(emu, EMU_HANA_DOCK_LEDS_2,
575 EMU_HANA_DOCK_LEDS_2_44K | EMU_HANA_DOCK_LEDS_2_LOCK );
576 /* Allow DLL to settle */
579 snd_emu1010_fpga_write(emu, EMU_HANA_UNMUTE, EMU_UNMUTE );
584 snd_emu1010_fpga_write(emu, EMU_HANA_UNMUTE, EMU_MUTE );
585 /* Default fallback clock 48kHz */
586 snd_emu1010_fpga_write(emu, EMU_HANA_DEFCLOCK, EMU_HANA_DEFCLOCK_48K );
587 /* Word Clock source, Internal 48kHz x1 */
588 snd_emu1010_fpga_write(emu, EMU_HANA_WCLOCK,
589 EMU_HANA_WCLOCK_INT_48K | EMU_HANA_WCLOCK_1X );
590 /* Set LEDs on Audio Dock */
591 snd_emu1010_fpga_write(emu, EMU_HANA_DOCK_LEDS_2,
592 EMU_HANA_DOCK_LEDS_2_48K | EMU_HANA_DOCK_LEDS_2_LOCK );
593 /* Allow DLL to settle */
596 snd_emu1010_fpga_write(emu, EMU_HANA_UNMUTE, EMU_UNMUTE );
599 case 2: /* Take clock from S/PDIF IN */
601 snd_emu1010_fpga_write(emu, EMU_HANA_UNMUTE, EMU_MUTE );
602 /* Default fallback clock 48kHz */
603 snd_emu1010_fpga_write(emu, EMU_HANA_DEFCLOCK, EMU_HANA_DEFCLOCK_48K );
604 /* Word Clock source, sync to S/PDIF input */
605 snd_emu1010_fpga_write(emu, EMU_HANA_WCLOCK,
606 EMU_HANA_WCLOCK_HANA_SPDIF_IN | EMU_HANA_WCLOCK_1X );
607 /* Set LEDs on Audio Dock */
608 snd_emu1010_fpga_write(emu, EMU_HANA_DOCK_LEDS_2,
609 EMU_HANA_DOCK_LEDS_2_EXT | EMU_HANA_DOCK_LEDS_2_LOCK );
610 /* FIXME: We should set EMU_HANA_DOCK_LEDS_2_LOCK only when clock signal is present and valid */
611 /* Allow DLL to settle */
614 snd_emu1010_fpga_write(emu, EMU_HANA_UNMUTE, EMU_UNMUTE );
618 /* Take clock from ADAT IN */
620 snd_emu1010_fpga_write(emu, EMU_HANA_UNMUTE, EMU_MUTE );
621 /* Default fallback clock 48kHz */
622 snd_emu1010_fpga_write(emu, EMU_HANA_DEFCLOCK, EMU_HANA_DEFCLOCK_48K );
623 /* Word Clock source, sync to ADAT input */
624 snd_emu1010_fpga_write(emu, EMU_HANA_WCLOCK,
625 EMU_HANA_WCLOCK_HANA_ADAT_IN | EMU_HANA_WCLOCK_1X );
626 /* Set LEDs on Audio Dock */
627 snd_emu1010_fpga_write(emu, EMU_HANA_DOCK_LEDS_2, EMU_HANA_DOCK_LEDS_2_EXT | EMU_HANA_DOCK_LEDS_2_LOCK );
628 /* FIXME: We should set EMU_HANA_DOCK_LEDS_2_LOCK only when clock signal is present and valid */
629 /* Allow DLL to settle */
632 snd_emu1010_fpga_write(emu, EMU_HANA_UNMUTE, EMU_UNMUTE );
641 static struct snd_kcontrol_new snd_emu1010_internal_clock =
643 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
644 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
645 .name = "Clock Internal Rate",
647 .info = snd_emu1010_internal_clock_info,
648 .get = snd_emu1010_internal_clock_get,
649 .put = snd_emu1010_internal_clock_put
652 static int snd_audigy_i2c_capture_source_info(struct snd_kcontrol *kcontrol,
653 struct snd_ctl_elem_info *uinfo)
656 static char *texts[4] = {
657 "Unknown1", "Unknown2", "Mic", "Line"
660 static char *texts[2] = {
664 uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
666 uinfo->value.enumerated.items = 2;
667 if (uinfo->value.enumerated.item > 1)
668 uinfo->value.enumerated.item = 1;
669 strcpy(uinfo->value.enumerated.name, texts[uinfo->value.enumerated.item]);
673 static int snd_audigy_i2c_capture_source_get(struct snd_kcontrol *kcontrol,
674 struct snd_ctl_elem_value *ucontrol)
676 struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
678 ucontrol->value.enumerated.item[0] = emu->i2c_capture_source;
682 static int snd_audigy_i2c_capture_source_put(struct snd_kcontrol *kcontrol,
683 struct snd_ctl_elem_value *ucontrol)
685 struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
686 unsigned int source_id;
687 unsigned int ngain, ogain;
692 /* If the capture source has changed,
693 * update the capture volume from the cached value
694 * for the particular source.
696 source_id = ucontrol->value.enumerated.item[0];
697 /* Limit: uinfo->value.enumerated.items = 2; */
698 /* emu->i2c_capture_volume */
701 change = (emu->i2c_capture_source != source_id);
703 snd_emu10k1_i2c_write(emu, ADC_MUX, 0); /* Mute input */
704 spin_lock_irqsave(&emu->emu_lock, flags);
705 gpio = inl(emu->port + A_IOCFG);
707 outl(gpio | 0x4, emu->port + A_IOCFG);
709 outl(gpio & ~0x4, emu->port + A_IOCFG);
710 spin_unlock_irqrestore(&emu->emu_lock, flags);
712 ngain = emu->i2c_capture_volume[source_id][0]; /* Left */
713 ogain = emu->i2c_capture_volume[emu->i2c_capture_source][0]; /* Left */
715 snd_emu10k1_i2c_write(emu, ADC_ATTEN_ADCL, ((ngain) & 0xff));
716 ngain = emu->i2c_capture_volume[source_id][1]; /* Right */
717 ogain = emu->i2c_capture_volume[emu->i2c_capture_source][1]; /* Right */
719 snd_emu10k1_i2c_write(emu, ADC_ATTEN_ADCR, ((ngain) & 0xff));
721 source = 1 << (source_id + 2);
722 snd_emu10k1_i2c_write(emu, ADC_MUX, source); /* Set source */
723 emu->i2c_capture_source = source_id;
728 static struct snd_kcontrol_new snd_audigy_i2c_capture_source =
730 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
731 .name = "Capture Source",
732 .info = snd_audigy_i2c_capture_source_info,
733 .get = snd_audigy_i2c_capture_source_get,
734 .put = snd_audigy_i2c_capture_source_put
737 static int snd_audigy_i2c_volume_info(struct snd_kcontrol *kcontrol,
738 struct snd_ctl_elem_info *uinfo)
740 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
742 uinfo->value.integer.min = 0;
743 uinfo->value.integer.max = 255;
747 static int snd_audigy_i2c_volume_get(struct snd_kcontrol *kcontrol,
748 struct snd_ctl_elem_value *ucontrol)
750 struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
751 unsigned int source_id;
753 source_id = kcontrol->private_value;
754 /* Limit: emu->i2c_capture_volume */
755 /* capture_source: uinfo->value.enumerated.items = 2 */
759 ucontrol->value.integer.value[0] = emu->i2c_capture_volume[source_id][0];
760 ucontrol->value.integer.value[1] = emu->i2c_capture_volume[source_id][1];
764 static int snd_audigy_i2c_volume_put(struct snd_kcontrol *kcontrol,
765 struct snd_ctl_elem_value *ucontrol)
767 struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
770 unsigned int source_id;
773 source_id = kcontrol->private_value;
774 /* Limit: emu->i2c_capture_volume */
775 /* capture_source: uinfo->value.enumerated.items = 2 */
778 ogain = emu->i2c_capture_volume[source_id][0]; /* Left */
779 ngain = ucontrol->value.integer.value[0];
782 if (ogain != ngain) {
783 if (emu->i2c_capture_source == source_id)
784 snd_emu10k1_i2c_write(emu, ADC_ATTEN_ADCL, ((ngain) & 0xff) );
785 emu->i2c_capture_volume[source_id][0] = ngain;
788 ogain = emu->i2c_capture_volume[source_id][1]; /* Right */
789 ngain = ucontrol->value.integer.value[1];
792 if (ogain != ngain) {
793 if (emu->i2c_capture_source == source_id)
794 snd_emu10k1_i2c_write(emu, ADC_ATTEN_ADCR, ((ngain) & 0xff));
795 emu->i2c_capture_volume[source_id][1] = ngain;
802 #define I2C_VOLUME(xname,chid) \
804 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
805 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE | \
806 SNDRV_CTL_ELEM_ACCESS_TLV_READ, \
807 .info = snd_audigy_i2c_volume_info, \
808 .get = snd_audigy_i2c_volume_get, \
809 .put = snd_audigy_i2c_volume_put, \
810 .tlv = { .p = snd_audigy_db_scale2 }, \
811 .private_value = chid \
815 static struct snd_kcontrol_new snd_audigy_i2c_volume_ctls[] __devinitdata = {
816 I2C_VOLUME("Mic Capture Volume", 0),
817 I2C_VOLUME("Line Capture Volume", 0)
821 static int snd_audigy_spdif_output_rate_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
823 static char *texts[] = {"44100", "48000", "96000"};
825 uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
827 uinfo->value.enumerated.items = 3;
828 if (uinfo->value.enumerated.item >= uinfo->value.enumerated.items)
829 uinfo->value.enumerated.item = uinfo->value.enumerated.items - 1;
830 strcpy(uinfo->value.enumerated.name, texts[uinfo->value.enumerated.item]);
834 static int snd_audigy_spdif_output_rate_get(struct snd_kcontrol *kcontrol,
835 struct snd_ctl_elem_value *ucontrol)
837 struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
842 spin_lock_irqsave(&emu->reg_lock, flags);
843 tmp = snd_emu10k1_ptr_read(emu, A_SPDIF_SAMPLERATE, 0);
844 switch (tmp & A_SPDIF_RATE_MASK) {
846 ucontrol->value.enumerated.item[0] = 0;
849 ucontrol->value.enumerated.item[0] = 1;
852 ucontrol->value.enumerated.item[0] = 2;
855 ucontrol->value.enumerated.item[0] = 1;
857 spin_unlock_irqrestore(&emu->reg_lock, flags);
861 static int snd_audigy_spdif_output_rate_put(struct snd_kcontrol *kcontrol,
862 struct snd_ctl_elem_value *ucontrol)
864 struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
866 unsigned int reg, val, tmp;
869 switch(ucontrol->value.enumerated.item[0]) {
885 spin_lock_irqsave(&emu->reg_lock, flags);
886 reg = snd_emu10k1_ptr_read(emu, A_SPDIF_SAMPLERATE, 0);
887 tmp = reg & ~A_SPDIF_RATE_MASK;
889 if ((change = (tmp != reg)))
890 snd_emu10k1_ptr_write(emu, A_SPDIF_SAMPLERATE, 0, tmp);
891 spin_unlock_irqrestore(&emu->reg_lock, flags);
895 static struct snd_kcontrol_new snd_audigy_spdif_output_rate =
897 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
898 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
899 .name = "Audigy SPDIF Output Sample Rate",
901 .info = snd_audigy_spdif_output_rate_info,
902 .get = snd_audigy_spdif_output_rate_get,
903 .put = snd_audigy_spdif_output_rate_put
907 static int snd_emu10k1_spdif_put(struct snd_kcontrol *kcontrol,
908 struct snd_ctl_elem_value *ucontrol)
910 struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
911 unsigned int idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
916 /* Limit: emu->spdif_bits */
919 val = (ucontrol->value.iec958.status[0] << 0) |
920 (ucontrol->value.iec958.status[1] << 8) |
921 (ucontrol->value.iec958.status[2] << 16) |
922 (ucontrol->value.iec958.status[3] << 24);
923 spin_lock_irqsave(&emu->reg_lock, flags);
924 change = val != emu->spdif_bits[idx];
926 snd_emu10k1_ptr_write(emu, SPCS0 + idx, 0, val);
927 emu->spdif_bits[idx] = val;
929 spin_unlock_irqrestore(&emu->reg_lock, flags);
933 static struct snd_kcontrol_new snd_emu10k1_spdif_mask_control =
935 .access = SNDRV_CTL_ELEM_ACCESS_READ,
936 .iface = SNDRV_CTL_ELEM_IFACE_PCM,
937 .name = SNDRV_CTL_NAME_IEC958("",PLAYBACK,MASK),
939 .info = snd_emu10k1_spdif_info,
940 .get = snd_emu10k1_spdif_get_mask
943 static struct snd_kcontrol_new snd_emu10k1_spdif_control =
945 .iface = SNDRV_CTL_ELEM_IFACE_PCM,
946 .name = SNDRV_CTL_NAME_IEC958("",PLAYBACK,DEFAULT),
948 .info = snd_emu10k1_spdif_info,
949 .get = snd_emu10k1_spdif_get,
950 .put = snd_emu10k1_spdif_put
954 static void update_emu10k1_fxrt(struct snd_emu10k1 *emu, int voice, unsigned char *route)
957 snd_emu10k1_ptr_write(emu, A_FXRT1, voice,
958 snd_emu10k1_compose_audigy_fxrt1(route));
959 snd_emu10k1_ptr_write(emu, A_FXRT2, voice,
960 snd_emu10k1_compose_audigy_fxrt2(route));
962 snd_emu10k1_ptr_write(emu, FXRT, voice,
963 snd_emu10k1_compose_send_routing(route));
967 static void update_emu10k1_send_volume(struct snd_emu10k1 *emu, int voice, unsigned char *volume)
969 snd_emu10k1_ptr_write(emu, PTRX_FXSENDAMOUNT_A, voice, volume[0]);
970 snd_emu10k1_ptr_write(emu, PTRX_FXSENDAMOUNT_B, voice, volume[1]);
971 snd_emu10k1_ptr_write(emu, PSST_FXSENDAMOUNT_C, voice, volume[2]);
972 snd_emu10k1_ptr_write(emu, DSL_FXSENDAMOUNT_D, voice, volume[3]);
974 unsigned int val = ((unsigned int)volume[4] << 24) |
975 ((unsigned int)volume[5] << 16) |
976 ((unsigned int)volume[6] << 8) |
977 (unsigned int)volume[7];
978 snd_emu10k1_ptr_write(emu, A_SENDAMOUNTS, voice, val);
982 /* PCM stream controls */
984 static int snd_emu10k1_send_routing_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
986 struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
987 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
988 uinfo->count = emu->audigy ? 3*8 : 3*4;
989 uinfo->value.integer.min = 0;
990 uinfo->value.integer.max = emu->audigy ? 0x3f : 0x0f;
994 static int snd_emu10k1_send_routing_get(struct snd_kcontrol *kcontrol,
995 struct snd_ctl_elem_value *ucontrol)
998 struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
999 struct snd_emu10k1_pcm_mixer *mix =
1000 &emu->pcm_mixer[snd_ctl_get_ioffidx(kcontrol, &ucontrol->id)];
1002 int num_efx = emu->audigy ? 8 : 4;
1003 int mask = emu->audigy ? 0x3f : 0x0f;
1005 spin_lock_irqsave(&emu->reg_lock, flags);
1006 for (voice = 0; voice < 3; voice++)
1007 for (idx = 0; idx < num_efx; idx++)
1008 ucontrol->value.integer.value[(voice * num_efx) + idx] =
1009 mix->send_routing[voice][idx] & mask;
1010 spin_unlock_irqrestore(&emu->reg_lock, flags);
1014 static int snd_emu10k1_send_routing_put(struct snd_kcontrol *kcontrol,
1015 struct snd_ctl_elem_value *ucontrol)
1017 unsigned long flags;
1018 struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1019 struct snd_emu10k1_pcm_mixer *mix =
1020 &emu->pcm_mixer[snd_ctl_get_ioffidx(kcontrol, &ucontrol->id)];
1021 int change = 0, voice, idx, val;
1022 int num_efx = emu->audigy ? 8 : 4;
1023 int mask = emu->audigy ? 0x3f : 0x0f;
1025 spin_lock_irqsave(&emu->reg_lock, flags);
1026 for (voice = 0; voice < 3; voice++)
1027 for (idx = 0; idx < num_efx; idx++) {
1028 val = ucontrol->value.integer.value[(voice * num_efx) + idx] & mask;
1029 if (mix->send_routing[voice][idx] != val) {
1030 mix->send_routing[voice][idx] = val;
1034 if (change && mix->epcm) {
1035 if (mix->epcm->voices[0] && mix->epcm->voices[1]) {
1036 update_emu10k1_fxrt(emu, mix->epcm->voices[0]->number,
1037 &mix->send_routing[1][0]);
1038 update_emu10k1_fxrt(emu, mix->epcm->voices[1]->number,
1039 &mix->send_routing[2][0]);
1040 } else if (mix->epcm->voices[0]) {
1041 update_emu10k1_fxrt(emu, mix->epcm->voices[0]->number,
1042 &mix->send_routing[0][0]);
1045 spin_unlock_irqrestore(&emu->reg_lock, flags);
1049 static struct snd_kcontrol_new snd_emu10k1_send_routing_control =
1051 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE | SNDRV_CTL_ELEM_ACCESS_INACTIVE,
1052 .iface = SNDRV_CTL_ELEM_IFACE_PCM,
1053 .name = "EMU10K1 PCM Send Routing",
1055 .info = snd_emu10k1_send_routing_info,
1056 .get = snd_emu10k1_send_routing_get,
1057 .put = snd_emu10k1_send_routing_put
1060 static int snd_emu10k1_send_volume_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
1062 struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1063 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
1064 uinfo->count = emu->audigy ? 3*8 : 3*4;
1065 uinfo->value.integer.min = 0;
1066 uinfo->value.integer.max = 255;
1070 static int snd_emu10k1_send_volume_get(struct snd_kcontrol *kcontrol,
1071 struct snd_ctl_elem_value *ucontrol)
1073 unsigned long flags;
1074 struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1075 struct snd_emu10k1_pcm_mixer *mix =
1076 &emu->pcm_mixer[snd_ctl_get_ioffidx(kcontrol, &ucontrol->id)];
1078 int num_efx = emu->audigy ? 8 : 4;
1080 spin_lock_irqsave(&emu->reg_lock, flags);
1081 for (idx = 0; idx < 3*num_efx; idx++)
1082 ucontrol->value.integer.value[idx] = mix->send_volume[idx/num_efx][idx%num_efx];
1083 spin_unlock_irqrestore(&emu->reg_lock, flags);
1087 static int snd_emu10k1_send_volume_put(struct snd_kcontrol *kcontrol,
1088 struct snd_ctl_elem_value *ucontrol)
1090 unsigned long flags;
1091 struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1092 struct snd_emu10k1_pcm_mixer *mix =
1093 &emu->pcm_mixer[snd_ctl_get_ioffidx(kcontrol, &ucontrol->id)];
1094 int change = 0, idx, val;
1095 int num_efx = emu->audigy ? 8 : 4;
1097 spin_lock_irqsave(&emu->reg_lock, flags);
1098 for (idx = 0; idx < 3*num_efx; idx++) {
1099 val = ucontrol->value.integer.value[idx] & 255;
1100 if (mix->send_volume[idx/num_efx][idx%num_efx] != val) {
1101 mix->send_volume[idx/num_efx][idx%num_efx] = val;
1105 if (change && mix->epcm) {
1106 if (mix->epcm->voices[0] && mix->epcm->voices[1]) {
1107 update_emu10k1_send_volume(emu, mix->epcm->voices[0]->number,
1108 &mix->send_volume[1][0]);
1109 update_emu10k1_send_volume(emu, mix->epcm->voices[1]->number,
1110 &mix->send_volume[2][0]);
1111 } else if (mix->epcm->voices[0]) {
1112 update_emu10k1_send_volume(emu, mix->epcm->voices[0]->number,
1113 &mix->send_volume[0][0]);
1116 spin_unlock_irqrestore(&emu->reg_lock, flags);
1120 static struct snd_kcontrol_new snd_emu10k1_send_volume_control =
1122 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE | SNDRV_CTL_ELEM_ACCESS_INACTIVE,
1123 .iface = SNDRV_CTL_ELEM_IFACE_PCM,
1124 .name = "EMU10K1 PCM Send Volume",
1126 .info = snd_emu10k1_send_volume_info,
1127 .get = snd_emu10k1_send_volume_get,
1128 .put = snd_emu10k1_send_volume_put
1131 static int snd_emu10k1_attn_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
1133 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
1135 uinfo->value.integer.min = 0;
1136 uinfo->value.integer.max = 0xffff;
1140 static int snd_emu10k1_attn_get(struct snd_kcontrol *kcontrol,
1141 struct snd_ctl_elem_value *ucontrol)
1143 struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1144 struct snd_emu10k1_pcm_mixer *mix =
1145 &emu->pcm_mixer[snd_ctl_get_ioffidx(kcontrol, &ucontrol->id)];
1146 unsigned long flags;
1149 spin_lock_irqsave(&emu->reg_lock, flags);
1150 for (idx = 0; idx < 3; idx++)
1151 ucontrol->value.integer.value[idx] = mix->attn[idx];
1152 spin_unlock_irqrestore(&emu->reg_lock, flags);
1156 static int snd_emu10k1_attn_put(struct snd_kcontrol *kcontrol,
1157 struct snd_ctl_elem_value *ucontrol)
1159 unsigned long flags;
1160 struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1161 struct snd_emu10k1_pcm_mixer *mix =
1162 &emu->pcm_mixer[snd_ctl_get_ioffidx(kcontrol, &ucontrol->id)];
1163 int change = 0, idx, val;
1165 spin_lock_irqsave(&emu->reg_lock, flags);
1166 for (idx = 0; idx < 3; idx++) {
1167 val = ucontrol->value.integer.value[idx] & 0xffff;
1168 if (mix->attn[idx] != val) {
1169 mix->attn[idx] = val;
1173 if (change && mix->epcm) {
1174 if (mix->epcm->voices[0] && mix->epcm->voices[1]) {
1175 snd_emu10k1_ptr_write(emu, VTFT_VOLUMETARGET, mix->epcm->voices[0]->number, mix->attn[1]);
1176 snd_emu10k1_ptr_write(emu, VTFT_VOLUMETARGET, mix->epcm->voices[1]->number, mix->attn[2]);
1177 } else if (mix->epcm->voices[0]) {
1178 snd_emu10k1_ptr_write(emu, VTFT_VOLUMETARGET, mix->epcm->voices[0]->number, mix->attn[0]);
1181 spin_unlock_irqrestore(&emu->reg_lock, flags);
1185 static struct snd_kcontrol_new snd_emu10k1_attn_control =
1187 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE | SNDRV_CTL_ELEM_ACCESS_INACTIVE,
1188 .iface = SNDRV_CTL_ELEM_IFACE_PCM,
1189 .name = "EMU10K1 PCM Volume",
1191 .info = snd_emu10k1_attn_info,
1192 .get = snd_emu10k1_attn_get,
1193 .put = snd_emu10k1_attn_put
1196 /* Mutichannel PCM stream controls */
1198 static int snd_emu10k1_efx_send_routing_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
1200 struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1201 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
1202 uinfo->count = emu->audigy ? 8 : 4;
1203 uinfo->value.integer.min = 0;
1204 uinfo->value.integer.max = emu->audigy ? 0x3f : 0x0f;
1208 static int snd_emu10k1_efx_send_routing_get(struct snd_kcontrol *kcontrol,
1209 struct snd_ctl_elem_value *ucontrol)
1211 unsigned long flags;
1212 struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1213 struct snd_emu10k1_pcm_mixer *mix =
1214 &emu->efx_pcm_mixer[snd_ctl_get_ioffidx(kcontrol, &ucontrol->id)];
1216 int num_efx = emu->audigy ? 8 : 4;
1217 int mask = emu->audigy ? 0x3f : 0x0f;
1219 spin_lock_irqsave(&emu->reg_lock, flags);
1220 for (idx = 0; idx < num_efx; idx++)
1221 ucontrol->value.integer.value[idx] =
1222 mix->send_routing[0][idx] & mask;
1223 spin_unlock_irqrestore(&emu->reg_lock, flags);
1227 static int snd_emu10k1_efx_send_routing_put(struct snd_kcontrol *kcontrol,
1228 struct snd_ctl_elem_value *ucontrol)
1230 unsigned long flags;
1231 struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1232 int ch = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
1233 struct snd_emu10k1_pcm_mixer *mix = &emu->efx_pcm_mixer[ch];
1234 int change = 0, idx, val;
1235 int num_efx = emu->audigy ? 8 : 4;
1236 int mask = emu->audigy ? 0x3f : 0x0f;
1238 spin_lock_irqsave(&emu->reg_lock, flags);
1239 for (idx = 0; idx < num_efx; idx++) {
1240 val = ucontrol->value.integer.value[idx] & mask;
1241 if (mix->send_routing[0][idx] != val) {
1242 mix->send_routing[0][idx] = val;
1247 if (change && mix->epcm) {
1248 if (mix->epcm->voices[ch]) {
1249 update_emu10k1_fxrt(emu, mix->epcm->voices[ch]->number,
1250 &mix->send_routing[0][0]);
1253 spin_unlock_irqrestore(&emu->reg_lock, flags);
1257 static struct snd_kcontrol_new snd_emu10k1_efx_send_routing_control =
1259 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE | SNDRV_CTL_ELEM_ACCESS_INACTIVE,
1260 .iface = SNDRV_CTL_ELEM_IFACE_PCM,
1261 .name = "Multichannel PCM Send Routing",
1263 .info = snd_emu10k1_efx_send_routing_info,
1264 .get = snd_emu10k1_efx_send_routing_get,
1265 .put = snd_emu10k1_efx_send_routing_put
1268 static int snd_emu10k1_efx_send_volume_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
1270 struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1271 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
1272 uinfo->count = emu->audigy ? 8 : 4;
1273 uinfo->value.integer.min = 0;
1274 uinfo->value.integer.max = 255;
1278 static int snd_emu10k1_efx_send_volume_get(struct snd_kcontrol *kcontrol,
1279 struct snd_ctl_elem_value *ucontrol)
1281 unsigned long flags;
1282 struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1283 struct snd_emu10k1_pcm_mixer *mix =
1284 &emu->efx_pcm_mixer[snd_ctl_get_ioffidx(kcontrol, &ucontrol->id)];
1286 int num_efx = emu->audigy ? 8 : 4;
1288 spin_lock_irqsave(&emu->reg_lock, flags);
1289 for (idx = 0; idx < num_efx; idx++)
1290 ucontrol->value.integer.value[idx] = mix->send_volume[0][idx];
1291 spin_unlock_irqrestore(&emu->reg_lock, flags);
1295 static int snd_emu10k1_efx_send_volume_put(struct snd_kcontrol *kcontrol,
1296 struct snd_ctl_elem_value *ucontrol)
1298 unsigned long flags;
1299 struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1300 int ch = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
1301 struct snd_emu10k1_pcm_mixer *mix = &emu->efx_pcm_mixer[ch];
1302 int change = 0, idx, val;
1303 int num_efx = emu->audigy ? 8 : 4;
1305 spin_lock_irqsave(&emu->reg_lock, flags);
1306 for (idx = 0; idx < num_efx; idx++) {
1307 val = ucontrol->value.integer.value[idx] & 255;
1308 if (mix->send_volume[0][idx] != val) {
1309 mix->send_volume[0][idx] = val;
1313 if (change && mix->epcm) {
1314 if (mix->epcm->voices[ch]) {
1315 update_emu10k1_send_volume(emu, mix->epcm->voices[ch]->number,
1316 &mix->send_volume[0][0]);
1319 spin_unlock_irqrestore(&emu->reg_lock, flags);
1324 static struct snd_kcontrol_new snd_emu10k1_efx_send_volume_control =
1326 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE | SNDRV_CTL_ELEM_ACCESS_INACTIVE,
1327 .iface = SNDRV_CTL_ELEM_IFACE_PCM,
1328 .name = "Multichannel PCM Send Volume",
1330 .info = snd_emu10k1_efx_send_volume_info,
1331 .get = snd_emu10k1_efx_send_volume_get,
1332 .put = snd_emu10k1_efx_send_volume_put
1335 static int snd_emu10k1_efx_attn_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
1337 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
1339 uinfo->value.integer.min = 0;
1340 uinfo->value.integer.max = 0xffff;
1344 static int snd_emu10k1_efx_attn_get(struct snd_kcontrol *kcontrol,
1345 struct snd_ctl_elem_value *ucontrol)
1347 struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1348 struct snd_emu10k1_pcm_mixer *mix =
1349 &emu->efx_pcm_mixer[snd_ctl_get_ioffidx(kcontrol, &ucontrol->id)];
1350 unsigned long flags;
1352 spin_lock_irqsave(&emu->reg_lock, flags);
1353 ucontrol->value.integer.value[0] = mix->attn[0];
1354 spin_unlock_irqrestore(&emu->reg_lock, flags);
1358 static int snd_emu10k1_efx_attn_put(struct snd_kcontrol *kcontrol,
1359 struct snd_ctl_elem_value *ucontrol)
1361 unsigned long flags;
1362 struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1363 int ch = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
1364 struct snd_emu10k1_pcm_mixer *mix = &emu->efx_pcm_mixer[ch];
1365 int change = 0, val;
1367 spin_lock_irqsave(&emu->reg_lock, flags);
1368 val = ucontrol->value.integer.value[0] & 0xffff;
1369 if (mix->attn[0] != val) {
1373 if (change && mix->epcm) {
1374 if (mix->epcm->voices[ch]) {
1375 snd_emu10k1_ptr_write(emu, VTFT_VOLUMETARGET, mix->epcm->voices[ch]->number, mix->attn[0]);
1378 spin_unlock_irqrestore(&emu->reg_lock, flags);
1382 static struct snd_kcontrol_new snd_emu10k1_efx_attn_control =
1384 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE | SNDRV_CTL_ELEM_ACCESS_INACTIVE,
1385 .iface = SNDRV_CTL_ELEM_IFACE_PCM,
1386 .name = "Multichannel PCM Volume",
1388 .info = snd_emu10k1_efx_attn_info,
1389 .get = snd_emu10k1_efx_attn_get,
1390 .put = snd_emu10k1_efx_attn_put
1393 #define snd_emu10k1_shared_spdif_info snd_ctl_boolean_mono_info
1395 static int snd_emu10k1_shared_spdif_get(struct snd_kcontrol *kcontrol,
1396 struct snd_ctl_elem_value *ucontrol)
1398 struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1401 ucontrol->value.integer.value[0] = inl(emu->port + A_IOCFG) & A_IOCFG_GPOUT0 ? 1 : 0;
1403 ucontrol->value.integer.value[0] = inl(emu->port + HCFG) & HCFG_GPOUT0 ? 1 : 0;
1407 static int snd_emu10k1_shared_spdif_put(struct snd_kcontrol *kcontrol,
1408 struct snd_ctl_elem_value *ucontrol)
1410 unsigned long flags;
1411 struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1412 unsigned int reg, val;
1415 spin_lock_irqsave(&emu->reg_lock, flags);
1416 if ( emu->card_capabilities->i2c_adc) {
1417 /* Do nothing for Audigy 2 ZS Notebook */
1418 } else if (emu->audigy) {
1419 reg = inl(emu->port + A_IOCFG);
1420 val = ucontrol->value.integer.value[0] ? A_IOCFG_GPOUT0 : 0;
1421 change = (reg & A_IOCFG_GPOUT0) != val;
1423 reg &= ~A_IOCFG_GPOUT0;
1425 outl(reg | val, emu->port + A_IOCFG);
1428 reg = inl(emu->port + HCFG);
1429 val = ucontrol->value.integer.value[0] ? HCFG_GPOUT0 : 0;
1430 change |= (reg & HCFG_GPOUT0) != val;
1432 reg &= ~HCFG_GPOUT0;
1434 outl(reg | val, emu->port + HCFG);
1436 spin_unlock_irqrestore(&emu->reg_lock, flags);
1440 static struct snd_kcontrol_new snd_emu10k1_shared_spdif __devinitdata =
1442 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1443 .name = "SB Live Analog/Digital Output Jack",
1444 .info = snd_emu10k1_shared_spdif_info,
1445 .get = snd_emu10k1_shared_spdif_get,
1446 .put = snd_emu10k1_shared_spdif_put
1449 static struct snd_kcontrol_new snd_audigy_shared_spdif __devinitdata =
1451 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1452 .name = "Audigy Analog/Digital Output Jack",
1453 .info = snd_emu10k1_shared_spdif_info,
1454 .get = snd_emu10k1_shared_spdif_get,
1455 .put = snd_emu10k1_shared_spdif_put
1460 static void snd_emu10k1_mixer_free_ac97(struct snd_ac97 *ac97)
1462 struct snd_emu10k1 *emu = ac97->private_data;
1468 static int remove_ctl(struct snd_card *card, const char *name)
1470 struct snd_ctl_elem_id id;
1471 memset(&id, 0, sizeof(id));
1472 strcpy(id.name, name);
1473 id.iface = SNDRV_CTL_ELEM_IFACE_MIXER;
1474 return snd_ctl_remove_id(card, &id);
1477 static struct snd_kcontrol *ctl_find(struct snd_card *card, const char *name)
1479 struct snd_ctl_elem_id sid;
1480 memset(&sid, 0, sizeof(sid));
1481 strcpy(sid.name, name);
1482 sid.iface = SNDRV_CTL_ELEM_IFACE_MIXER;
1483 return snd_ctl_find_id(card, &sid);
1486 static int rename_ctl(struct snd_card *card, const char *src, const char *dst)
1488 struct snd_kcontrol *kctl = ctl_find(card, src);
1490 strcpy(kctl->id.name, dst);
1496 int __devinit snd_emu10k1_mixer(struct snd_emu10k1 *emu,
1497 int pcm_device, int multi_device)
1500 struct snd_kcontrol *kctl;
1501 struct snd_card *card = emu->card;
1503 static char *emu10k1_remove_ctls[] = {
1504 /* no AC97 mono, surround, center/lfe */
1505 "Master Mono Playback Switch",
1506 "Master Mono Playback Volume",
1507 "PCM Out Path & Mute",
1508 "Mono Output Select",
1509 "Front Playback Switch",
1510 "Front Playback Volume",
1511 "Surround Playback Switch",
1512 "Surround Playback Volume",
1513 "Center Playback Switch",
1514 "Center Playback Volume",
1515 "LFE Playback Switch",
1516 "LFE Playback Volume",
1519 static char *emu10k1_rename_ctls[] = {
1520 "Surround Digital Playback Volume", "Surround Playback Volume",
1521 "Center Digital Playback Volume", "Center Playback Volume",
1522 "LFE Digital Playback Volume", "LFE Playback Volume",
1525 static char *audigy_remove_ctls[] = {
1526 /* Master/PCM controls on ac97 of Audigy has no effect */
1527 /* On the Audigy2 the AC97 playback is piped into
1528 * the Philips ADC for 24bit capture */
1529 "PCM Playback Switch",
1530 "PCM Playback Volume",
1531 "Master Mono Playback Switch",
1532 "Master Mono Playback Volume",
1533 "Master Playback Switch",
1534 "Master Playback Volume",
1535 "PCM Out Path & Mute",
1536 "Mono Output Select",
1537 /* remove unused AC97 capture controls */
1542 "Video Playback Switch",
1543 "Video Playback Volume",
1544 "Mic Playback Switch",
1545 "Mic Playback Volume",
1548 static char *audigy_rename_ctls[] = {
1549 /* use conventional names */
1550 "Wave Playback Volume", "PCM Playback Volume",
1551 /* "Wave Capture Volume", "PCM Capture Volume", */
1552 "Wave Master Playback Volume", "Master Playback Volume",
1553 "AMic Playback Volume", "Mic Playback Volume",
1556 static char *audigy_rename_ctls_i2c_adc[] = {
1557 //"Analog Mix Capture Volume","OLD Analog Mix Capture Volume",
1558 "Line Capture Volume", "Analog Mix Capture Volume",
1559 "Wave Playback Volume", "OLD PCM Playback Volume",
1560 "Wave Master Playback Volume", "Master Playback Volume",
1561 "AMic Playback Volume", "Old Mic Playback Volume",
1562 "CD Capture Volume", "IEC958 Optical Capture Volume",
1565 static char *audigy_remove_ctls_i2c_adc[] = {
1566 /* On the Audigy2 ZS Notebook
1567 * Capture via WM8775 */
1568 "Mic Capture Volume",
1569 "Analog Mix Capture Volume",
1570 "Aux Capture Volume",
1571 "IEC958 Optical Capture Volume",
1574 static char *audigy_remove_ctls_1361t_adc[] = {
1575 /* On the Audigy2 the AC97 playback is piped into
1576 * the Philips ADC for 24bit capture */
1577 "PCM Playback Switch",
1578 "PCM Playback Volume",
1579 "Master Mono Playback Switch",
1580 "Master Mono Playback Volume",
1584 "Mic Capture Volume",
1585 "Headphone Playback Switch",
1586 "Headphone Playback Volume",
1587 "3D Control - Center",
1588 "3D Control - Depth",
1589 "3D Control - Switch",
1590 "Line2 Playback Volume",
1591 "Line2 Capture Volume",
1594 static char *audigy_rename_ctls_1361t_adc[] = {
1595 "Master Playback Switch", "Master Capture Switch",
1596 "Master Playback Volume", "Master Capture Volume",
1597 "Wave Master Playback Volume", "Master Playback Volume",
1598 "PC Speaker Playback Switch", "PC Speaker Capture Switch",
1599 "PC Speaker Playback Volume", "PC Speaker Capture Volume",
1600 "Phone Playback Switch", "Phone Capture Switch",
1601 "Phone Playback Volume", "Phone Capture Volume",
1602 "Mic Playback Switch", "Mic Capture Switch",
1603 "Mic Playback Volume", "Mic Capture Volume",
1604 "Line Playback Switch", "Line Capture Switch",
1605 "Line Playback Volume", "Line Capture Volume",
1606 "CD Playback Switch", "CD Capture Switch",
1607 "CD Playback Volume", "CD Capture Volume",
1608 "Aux Playback Switch", "Aux Capture Switch",
1609 "Aux Playback Volume", "Aux Capture Volume",
1610 "Video Playback Switch", "Video Capture Switch",
1611 "Video Playback Volume", "Video Capture Volume",
1616 if (emu->card_capabilities->ac97_chip) {
1617 struct snd_ac97_bus *pbus;
1618 struct snd_ac97_template ac97;
1619 static struct snd_ac97_bus_ops ops = {
1620 .write = snd_emu10k1_ac97_write,
1621 .read = snd_emu10k1_ac97_read,
1624 if ((err = snd_ac97_bus(emu->card, 0, &ops, NULL, &pbus)) < 0)
1626 pbus->no_vra = 1; /* we don't need VRA */
1628 memset(&ac97, 0, sizeof(ac97));
1629 ac97.private_data = emu;
1630 ac97.private_free = snd_emu10k1_mixer_free_ac97;
1631 ac97.scaps = AC97_SCAP_NO_SPDIF;
1632 if ((err = snd_ac97_mixer(pbus, &ac97, &emu->ac97)) < 0) {
1633 if (emu->card_capabilities->ac97_chip == 1)
1635 snd_printd(KERN_INFO "emu10k1: AC97 is optional on this board\n");
1636 snd_printd(KERN_INFO" Proceeding without ac97 mixers...\n");
1637 snd_device_free(emu->card, pbus);
1638 goto no_ac97; /* FIXME: get rid of ugly gotos.. */
1641 /* set master volume to 0 dB */
1642 snd_ac97_write_cache(emu->ac97, AC97_MASTER, 0x0000);
1643 /* set capture source to mic */
1644 snd_ac97_write_cache(emu->ac97, AC97_REC_SEL, 0x0000);
1645 if (emu->card_capabilities->adc_1361t)
1646 c = audigy_remove_ctls_1361t_adc;
1648 c = audigy_remove_ctls;
1651 * Credits for cards based on STAC9758:
1652 * James Courtier-Dutton <James@superbug.demon.co.uk>
1653 * Voluspa <voluspa@comhem.se>
1655 if (emu->ac97->id == AC97_ID_STAC9758) {
1657 snd_emu10k1_ptr_write(emu, AC97SLOT, 0, AC97SLOT_CNTR|AC97SLOT_LFE|AC97SLOT_REAR_LEFT|AC97SLOT_REAR_RIGHT);
1658 snd_ac97_write_cache(emu->ac97, AC97_HEADPHONE, 0x0202);
1660 /* remove unused AC97 controls */
1661 snd_ac97_write_cache(emu->ac97, AC97_SURROUND_MASTER, 0x0202);
1662 snd_ac97_write_cache(emu->ac97, AC97_CENTER_LFE_MASTER, 0x0202);
1663 c = emu10k1_remove_ctls;
1666 remove_ctl(card, *c);
1667 } else if (emu->card_capabilities->i2c_adc) {
1668 c = audigy_remove_ctls_i2c_adc;
1670 remove_ctl(card, *c);
1673 if (emu->card_capabilities->ecard)
1674 strcpy(emu->card->mixername, "EMU APS");
1675 else if (emu->audigy)
1676 strcpy(emu->card->mixername, "SB Audigy");
1678 strcpy(emu->card->mixername, "Emu10k1");
1682 if (emu->card_capabilities->adc_1361t)
1683 c = audigy_rename_ctls_1361t_adc;
1684 else if (emu->card_capabilities->i2c_adc)
1685 c = audigy_rename_ctls_i2c_adc;
1687 c = audigy_rename_ctls;
1689 c = emu10k1_rename_ctls;
1691 rename_ctl(card, c[0], c[1]);
1693 if (emu->card_capabilities->subsystem == 0x20071102) { /* Audigy 4 Pro */
1694 rename_ctl(card, "Line2 Capture Volume", "Line1/Mic Capture Volume");
1695 rename_ctl(card, "Analog Mix Capture Volume", "Line2 Capture Volume");
1696 rename_ctl(card, "Aux2 Capture Volume", "Line3 Capture Volume");
1697 rename_ctl(card, "Mic Capture Volume", "Unknown1 Capture Volume");
1698 remove_ctl(card, "Headphone Playback Switch");
1699 remove_ctl(card, "Headphone Playback Volume");
1700 remove_ctl(card, "3D Control - Center");
1701 remove_ctl(card, "3D Control - Depth");
1702 remove_ctl(card, "3D Control - Switch");
1704 if ((kctl = emu->ctl_send_routing = snd_ctl_new1(&snd_emu10k1_send_routing_control, emu)) == NULL)
1706 kctl->id.device = pcm_device;
1707 if ((err = snd_ctl_add(card, kctl)))
1709 if ((kctl = emu->ctl_send_volume = snd_ctl_new1(&snd_emu10k1_send_volume_control, emu)) == NULL)
1711 kctl->id.device = pcm_device;
1712 if ((err = snd_ctl_add(card, kctl)))
1714 if ((kctl = emu->ctl_attn = snd_ctl_new1(&snd_emu10k1_attn_control, emu)) == NULL)
1716 kctl->id.device = pcm_device;
1717 if ((err = snd_ctl_add(card, kctl)))
1720 if ((kctl = emu->ctl_efx_send_routing = snd_ctl_new1(&snd_emu10k1_efx_send_routing_control, emu)) == NULL)
1722 kctl->id.device = multi_device;
1723 if ((err = snd_ctl_add(card, kctl)))
1726 if ((kctl = emu->ctl_efx_send_volume = snd_ctl_new1(&snd_emu10k1_efx_send_volume_control, emu)) == NULL)
1728 kctl->id.device = multi_device;
1729 if ((err = snd_ctl_add(card, kctl)))
1732 if ((kctl = emu->ctl_efx_attn = snd_ctl_new1(&snd_emu10k1_efx_attn_control, emu)) == NULL)
1734 kctl->id.device = multi_device;
1735 if ((err = snd_ctl_add(card, kctl)))
1738 /* initialize the routing and volume table for each pcm playback stream */
1739 for (pcm = 0; pcm < 32; pcm++) {
1740 struct snd_emu10k1_pcm_mixer *mix;
1743 mix = &emu->pcm_mixer[pcm];
1746 for (v = 0; v < 4; v++)
1747 mix->send_routing[0][v] =
1748 mix->send_routing[1][v] =
1749 mix->send_routing[2][v] = v;
1751 memset(&mix->send_volume, 0, sizeof(mix->send_volume));
1752 mix->send_volume[0][0] = mix->send_volume[0][1] =
1753 mix->send_volume[1][0] = mix->send_volume[2][1] = 255;
1755 mix->attn[0] = mix->attn[1] = mix->attn[2] = 0xffff;
1758 /* initialize the routing and volume table for the multichannel playback stream */
1759 for (pcm = 0; pcm < NUM_EFX_PLAYBACK; pcm++) {
1760 struct snd_emu10k1_pcm_mixer *mix;
1763 mix = &emu->efx_pcm_mixer[pcm];
1766 mix->send_routing[0][0] = pcm;
1767 mix->send_routing[0][1] = (pcm == 0) ? 1 : 0;
1768 for (v = 0; v < 2; v++)
1769 mix->send_routing[0][2+v] = 13+v;
1771 for (v = 0; v < 4; v++)
1772 mix->send_routing[0][4+v] = 60+v;
1774 memset(&mix->send_volume, 0, sizeof(mix->send_volume));
1775 mix->send_volume[0][0] = 255;
1777 mix->attn[0] = 0xffff;
1780 if (! emu->card_capabilities->ecard) { /* FIXME: APS has these controls? */
1781 /* sb live! and audigy */
1782 if ((kctl = snd_ctl_new1(&snd_emu10k1_spdif_mask_control, emu)) == NULL)
1785 kctl->id.device = emu->pcm_efx->device;
1786 if ((err = snd_ctl_add(card, kctl)))
1788 if ((kctl = snd_ctl_new1(&snd_emu10k1_spdif_control, emu)) == NULL)
1791 kctl->id.device = emu->pcm_efx->device;
1792 if ((err = snd_ctl_add(card, kctl)))
1796 if ( emu->card_capabilities->emu1010) {
1797 ; /* Disable the snd_audigy_spdif_shared_spdif */
1798 } else if (emu->audigy) {
1799 if ((kctl = snd_ctl_new1(&snd_audigy_shared_spdif, emu)) == NULL)
1801 if ((err = snd_ctl_add(card, kctl)))
1804 if ((kctl = snd_ctl_new1(&snd_audigy_spdif_output_rate, emu)) == NULL)
1806 if ((err = snd_ctl_add(card, kctl)))
1809 } else if (! emu->card_capabilities->ecard) {
1811 if ((kctl = snd_ctl_new1(&snd_emu10k1_shared_spdif, emu)) == NULL)
1813 if ((err = snd_ctl_add(card, kctl)))
1816 if (emu->card_capabilities->ca0151_chip) { /* P16V */
1817 if ((err = snd_p16v_mixer(emu)))
1821 if ( emu->card_capabilities->emu1010) {
1824 for (i = 0; i < ARRAY_SIZE(snd_emu1010_output_enum_ctls); i++) {
1825 err = snd_ctl_add(card, snd_ctl_new1(&snd_emu1010_output_enum_ctls[i], emu));
1829 for (i = 0; i < ARRAY_SIZE(snd_emu1010_input_enum_ctls); i++) {
1830 err = snd_ctl_add(card, snd_ctl_new1(&snd_emu1010_input_enum_ctls[i], emu));
1834 for (i = 0; i < ARRAY_SIZE(snd_emu1010_adc_pads); i++) {
1835 err = snd_ctl_add(card, snd_ctl_new1(&snd_emu1010_adc_pads[i], emu));
1839 for (i = 0; i < ARRAY_SIZE(snd_emu1010_dac_pads); i++) {
1840 err = snd_ctl_add(card, snd_ctl_new1(&snd_emu1010_dac_pads[i], emu));
1844 err = snd_ctl_add(card, snd_ctl_new1(&snd_emu1010_internal_clock, emu));
1849 if ( emu->card_capabilities->i2c_adc) {
1852 err = snd_ctl_add(card, snd_ctl_new1(&snd_audigy_i2c_capture_source, emu));
1856 for (i = 0; i < ARRAY_SIZE(snd_audigy_i2c_volume_ctls); i++) {
1857 err = snd_ctl_add(card, snd_ctl_new1(&snd_audigy_i2c_volume_ctls[i], emu));