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 <linux/time.h>
34 #include <linux/init.h>
35 #include <sound/core.h>
36 #include <sound/emu10k1.h>
37 #include <linux/delay.h>
38 #include <sound/tlv.h>
42 #define AC97_ID_STAC9758 0x83847658
44 static const DECLARE_TLV_DB_SCALE(snd_audigy_db_scale2
, -10350, 50, 1); /* WM8775 gain scale */
46 static int snd_emu10k1_spdif_info(struct snd_kcontrol
*kcontrol
, struct snd_ctl_elem_info
*uinfo
)
48 uinfo
->type
= SNDRV_CTL_ELEM_TYPE_IEC958
;
53 static int snd_emu10k1_spdif_get(struct snd_kcontrol
*kcontrol
,
54 struct snd_ctl_elem_value
*ucontrol
)
56 struct snd_emu10k1
*emu
= snd_kcontrol_chip(kcontrol
);
57 unsigned int idx
= snd_ctl_get_ioffidx(kcontrol
, &ucontrol
->id
);
60 /* Limit: emu->spdif_bits */
63 spin_lock_irqsave(&emu
->reg_lock
, flags
);
64 ucontrol
->value
.iec958
.status
[0] = (emu
->spdif_bits
[idx
] >> 0) & 0xff;
65 ucontrol
->value
.iec958
.status
[1] = (emu
->spdif_bits
[idx
] >> 8) & 0xff;
66 ucontrol
->value
.iec958
.status
[2] = (emu
->spdif_bits
[idx
] >> 16) & 0xff;
67 ucontrol
->value
.iec958
.status
[3] = (emu
->spdif_bits
[idx
] >> 24) & 0xff;
68 spin_unlock_irqrestore(&emu
->reg_lock
, flags
);
72 static int snd_emu10k1_spdif_get_mask(struct snd_kcontrol
*kcontrol
,
73 struct snd_ctl_elem_value
*ucontrol
)
75 ucontrol
->value
.iec958
.status
[0] = 0xff;
76 ucontrol
->value
.iec958
.status
[1] = 0xff;
77 ucontrol
->value
.iec958
.status
[2] = 0xff;
78 ucontrol
->value
.iec958
.status
[3] = 0xff;
83 * Items labels in enum mixer controls assigning source data to
86 static char *emu1010_src_texts
[] = {
142 /* 1616(m) cardbus */
144 static char *emu1616_src_texts
[] = {
198 * List of data sources available for each destination
200 static unsigned int emu1010_src_regs
[] = {
201 EMU_SRC_SILENCE
,/* 0 */
202 EMU_SRC_DOCK_MIC_A1
, /* 1 */
203 EMU_SRC_DOCK_MIC_B1
, /* 2 */
204 EMU_SRC_DOCK_ADC1_LEFT1
, /* 3 */
205 EMU_SRC_DOCK_ADC1_RIGHT1
, /* 4 */
206 EMU_SRC_DOCK_ADC2_LEFT1
, /* 5 */
207 EMU_SRC_DOCK_ADC2_RIGHT1
, /* 6 */
208 EMU_SRC_DOCK_ADC3_LEFT1
, /* 7 */
209 EMU_SRC_DOCK_ADC3_RIGHT1
, /* 8 */
210 EMU_SRC_HAMOA_ADC_LEFT1
, /* 9 */
211 EMU_SRC_HAMOA_ADC_RIGHT1
, /* 10 */
212 EMU_SRC_HANA_SPDIF_LEFT1
, /* 11 */
213 EMU_SRC_HANA_SPDIF_RIGHT1
, /* 12 */
214 EMU_SRC_HANA_ADAT
, /* 13 */
215 EMU_SRC_HANA_ADAT
+1, /* 14 */
216 EMU_SRC_HANA_ADAT
+2, /* 15 */
217 EMU_SRC_HANA_ADAT
+3, /* 16 */
218 EMU_SRC_HANA_ADAT
+4, /* 17 */
219 EMU_SRC_HANA_ADAT
+5, /* 18 */
220 EMU_SRC_HANA_ADAT
+6, /* 19 */
221 EMU_SRC_HANA_ADAT
+7, /* 20 */
222 EMU_SRC_ALICE_EMU32A
, /* 21 */
223 EMU_SRC_ALICE_EMU32A
+1, /* 22 */
224 EMU_SRC_ALICE_EMU32A
+2, /* 23 */
225 EMU_SRC_ALICE_EMU32A
+3, /* 24 */
226 EMU_SRC_ALICE_EMU32A
+4, /* 25 */
227 EMU_SRC_ALICE_EMU32A
+5, /* 26 */
228 EMU_SRC_ALICE_EMU32A
+6, /* 27 */
229 EMU_SRC_ALICE_EMU32A
+7, /* 28 */
230 EMU_SRC_ALICE_EMU32A
+8, /* 29 */
231 EMU_SRC_ALICE_EMU32A
+9, /* 30 */
232 EMU_SRC_ALICE_EMU32A
+0xa, /* 31 */
233 EMU_SRC_ALICE_EMU32A
+0xb, /* 32 */
234 EMU_SRC_ALICE_EMU32A
+0xc, /* 33 */
235 EMU_SRC_ALICE_EMU32A
+0xd, /* 34 */
236 EMU_SRC_ALICE_EMU32A
+0xe, /* 35 */
237 EMU_SRC_ALICE_EMU32A
+0xf, /* 36 */
238 EMU_SRC_ALICE_EMU32B
, /* 37 */
239 EMU_SRC_ALICE_EMU32B
+1, /* 38 */
240 EMU_SRC_ALICE_EMU32B
+2, /* 39 */
241 EMU_SRC_ALICE_EMU32B
+3, /* 40 */
242 EMU_SRC_ALICE_EMU32B
+4, /* 41 */
243 EMU_SRC_ALICE_EMU32B
+5, /* 42 */
244 EMU_SRC_ALICE_EMU32B
+6, /* 43 */
245 EMU_SRC_ALICE_EMU32B
+7, /* 44 */
246 EMU_SRC_ALICE_EMU32B
+8, /* 45 */
247 EMU_SRC_ALICE_EMU32B
+9, /* 46 */
248 EMU_SRC_ALICE_EMU32B
+0xa, /* 47 */
249 EMU_SRC_ALICE_EMU32B
+0xb, /* 48 */
250 EMU_SRC_ALICE_EMU32B
+0xc, /* 49 */
251 EMU_SRC_ALICE_EMU32B
+0xd, /* 50 */
252 EMU_SRC_ALICE_EMU32B
+0xe, /* 51 */
253 EMU_SRC_ALICE_EMU32B
+0xf, /* 52 */
256 /* 1616(m) cardbus */
257 static unsigned int emu1616_src_regs
[] = {
261 EMU_SRC_DOCK_ADC1_LEFT1
,
262 EMU_SRC_DOCK_ADC1_RIGHT1
,
263 EMU_SRC_DOCK_ADC2_LEFT1
,
264 EMU_SRC_DOCK_ADC2_RIGHT1
,
265 EMU_SRC_MDOCK_SPDIF_LEFT1
,
266 EMU_SRC_MDOCK_SPDIF_RIGHT1
,
268 EMU_SRC_MDOCK_ADAT
+1,
269 EMU_SRC_MDOCK_ADAT
+2,
270 EMU_SRC_MDOCK_ADAT
+3,
271 EMU_SRC_MDOCK_ADAT
+4,
272 EMU_SRC_MDOCK_ADAT
+5,
273 EMU_SRC_MDOCK_ADAT
+6,
274 EMU_SRC_MDOCK_ADAT
+7,
275 EMU_SRC_ALICE_EMU32A
,
276 EMU_SRC_ALICE_EMU32A
+1,
277 EMU_SRC_ALICE_EMU32A
+2,
278 EMU_SRC_ALICE_EMU32A
+3,
279 EMU_SRC_ALICE_EMU32A
+4,
280 EMU_SRC_ALICE_EMU32A
+5,
281 EMU_SRC_ALICE_EMU32A
+6,
282 EMU_SRC_ALICE_EMU32A
+7,
283 EMU_SRC_ALICE_EMU32A
+8,
284 EMU_SRC_ALICE_EMU32A
+9,
285 EMU_SRC_ALICE_EMU32A
+0xa,
286 EMU_SRC_ALICE_EMU32A
+0xb,
287 EMU_SRC_ALICE_EMU32A
+0xc,
288 EMU_SRC_ALICE_EMU32A
+0xd,
289 EMU_SRC_ALICE_EMU32A
+0xe,
290 EMU_SRC_ALICE_EMU32A
+0xf,
291 EMU_SRC_ALICE_EMU32B
,
292 EMU_SRC_ALICE_EMU32B
+1,
293 EMU_SRC_ALICE_EMU32B
+2,
294 EMU_SRC_ALICE_EMU32B
+3,
295 EMU_SRC_ALICE_EMU32B
+4,
296 EMU_SRC_ALICE_EMU32B
+5,
297 EMU_SRC_ALICE_EMU32B
+6,
298 EMU_SRC_ALICE_EMU32B
+7,
299 EMU_SRC_ALICE_EMU32B
+8,
300 EMU_SRC_ALICE_EMU32B
+9,
301 EMU_SRC_ALICE_EMU32B
+0xa,
302 EMU_SRC_ALICE_EMU32B
+0xb,
303 EMU_SRC_ALICE_EMU32B
+0xc,
304 EMU_SRC_ALICE_EMU32B
+0xd,
305 EMU_SRC_ALICE_EMU32B
+0xe,
306 EMU_SRC_ALICE_EMU32B
+0xf,
310 * Data destinations - physical EMU outputs.
311 * Each destination has an enum mixer control to choose a data source
313 static unsigned int emu1010_output_dst
[] = {
314 EMU_DST_DOCK_DAC1_LEFT1
, /* 0 */
315 EMU_DST_DOCK_DAC1_RIGHT1
, /* 1 */
316 EMU_DST_DOCK_DAC2_LEFT1
, /* 2 */
317 EMU_DST_DOCK_DAC2_RIGHT1
, /* 3 */
318 EMU_DST_DOCK_DAC3_LEFT1
, /* 4 */
319 EMU_DST_DOCK_DAC3_RIGHT1
, /* 5 */
320 EMU_DST_DOCK_DAC4_LEFT1
, /* 6 */
321 EMU_DST_DOCK_DAC4_RIGHT1
, /* 7 */
322 EMU_DST_DOCK_PHONES_LEFT1
, /* 8 */
323 EMU_DST_DOCK_PHONES_RIGHT1
, /* 9 */
324 EMU_DST_DOCK_SPDIF_LEFT1
, /* 10 */
325 EMU_DST_DOCK_SPDIF_RIGHT1
, /* 11 */
326 EMU_DST_HANA_SPDIF_LEFT1
, /* 12 */
327 EMU_DST_HANA_SPDIF_RIGHT1
, /* 13 */
328 EMU_DST_HAMOA_DAC_LEFT1
, /* 14 */
329 EMU_DST_HAMOA_DAC_RIGHT1
, /* 15 */
330 EMU_DST_HANA_ADAT
, /* 16 */
331 EMU_DST_HANA_ADAT
+1, /* 17 */
332 EMU_DST_HANA_ADAT
+2, /* 18 */
333 EMU_DST_HANA_ADAT
+3, /* 19 */
334 EMU_DST_HANA_ADAT
+4, /* 20 */
335 EMU_DST_HANA_ADAT
+5, /* 21 */
336 EMU_DST_HANA_ADAT
+6, /* 22 */
337 EMU_DST_HANA_ADAT
+7, /* 23 */
340 /* 1616(m) cardbus */
341 static unsigned int emu1616_output_dst
[] = {
342 EMU_DST_DOCK_DAC1_LEFT1
,
343 EMU_DST_DOCK_DAC1_RIGHT1
,
344 EMU_DST_DOCK_DAC2_LEFT1
,
345 EMU_DST_DOCK_DAC2_RIGHT1
,
346 EMU_DST_DOCK_DAC3_LEFT1
,
347 EMU_DST_DOCK_DAC3_RIGHT1
,
348 EMU_DST_MDOCK_SPDIF_LEFT1
,
349 EMU_DST_MDOCK_SPDIF_RIGHT1
,
351 EMU_DST_MDOCK_ADAT
+1,
352 EMU_DST_MDOCK_ADAT
+2,
353 EMU_DST_MDOCK_ADAT
+3,
354 EMU_DST_MDOCK_ADAT
+4,
355 EMU_DST_MDOCK_ADAT
+5,
356 EMU_DST_MDOCK_ADAT
+6,
357 EMU_DST_MDOCK_ADAT
+7,
358 EMU_DST_MANA_DAC_LEFT
,
359 EMU_DST_MANA_DAC_RIGHT
,
363 * Data destinations - HANA outputs going to Alice2 (audigy) for
364 * capture (EMU32 + I2S links)
365 * Each destination has an enum mixer control to choose a data source
367 static unsigned int emu1010_input_dst
[] = {
368 EMU_DST_ALICE2_EMU32_0
,
369 EMU_DST_ALICE2_EMU32_1
,
370 EMU_DST_ALICE2_EMU32_2
,
371 EMU_DST_ALICE2_EMU32_3
,
372 EMU_DST_ALICE2_EMU32_4
,
373 EMU_DST_ALICE2_EMU32_5
,
374 EMU_DST_ALICE2_EMU32_6
,
375 EMU_DST_ALICE2_EMU32_7
,
376 EMU_DST_ALICE2_EMU32_8
,
377 EMU_DST_ALICE2_EMU32_9
,
378 EMU_DST_ALICE2_EMU32_A
,
379 EMU_DST_ALICE2_EMU32_B
,
380 EMU_DST_ALICE2_EMU32_C
,
381 EMU_DST_ALICE2_EMU32_D
,
382 EMU_DST_ALICE2_EMU32_E
,
383 EMU_DST_ALICE2_EMU32_F
,
384 EMU_DST_ALICE_I2S0_LEFT
,
385 EMU_DST_ALICE_I2S0_RIGHT
,
386 EMU_DST_ALICE_I2S1_LEFT
,
387 EMU_DST_ALICE_I2S1_RIGHT
,
388 EMU_DST_ALICE_I2S2_LEFT
,
389 EMU_DST_ALICE_I2S2_RIGHT
,
392 static int snd_emu1010_input_output_source_info(struct snd_kcontrol
*kcontrol
,
393 struct snd_ctl_elem_info
*uinfo
)
395 struct snd_emu10k1
*emu
= snd_kcontrol_chip(kcontrol
);
398 uinfo
->type
= SNDRV_CTL_ELEM_TYPE_ENUMERATED
;
400 if (emu
->card_capabilities
->emu_model
== EMU_MODEL_EMU1616
) {
401 uinfo
->value
.enumerated
.items
= 49;
402 items
= emu1616_src_texts
;
404 uinfo
->value
.enumerated
.items
= 53;
405 items
= emu1010_src_texts
;
407 if (uinfo
->value
.enumerated
.item
>= uinfo
->value
.enumerated
.items
)
408 uinfo
->value
.enumerated
.item
=
409 uinfo
->value
.enumerated
.items
- 1;
410 strcpy(uinfo
->value
.enumerated
.name
,
411 items
[uinfo
->value
.enumerated
.item
]);
415 static int snd_emu1010_output_source_get(struct snd_kcontrol
*kcontrol
,
416 struct snd_ctl_elem_value
*ucontrol
)
418 struct snd_emu10k1
*emu
= snd_kcontrol_chip(kcontrol
);
419 unsigned int channel
;
421 channel
= (kcontrol
->private_value
) & 0xff;
422 /* Limit: emu1010_output_dst, emu->emu1010.output_source */
424 (emu
->card_capabilities
->emu_model
== EMU_MODEL_EMU1616
&&
427 ucontrol
->value
.enumerated
.item
[0] = emu
->emu1010
.output_source
[channel
];
431 static int snd_emu1010_output_source_put(struct snd_kcontrol
*kcontrol
,
432 struct snd_ctl_elem_value
*ucontrol
)
434 struct snd_emu10k1
*emu
= snd_kcontrol_chip(kcontrol
);
436 unsigned int channel
;
438 val
= ucontrol
->value
.enumerated
.item
[0];
440 (emu
->card_capabilities
->emu_model
== EMU_MODEL_EMU1616
&&
443 channel
= (kcontrol
->private_value
) & 0xff;
444 /* Limit: emu1010_output_dst, emu->emu1010.output_source */
446 (emu
->card_capabilities
->emu_model
== EMU_MODEL_EMU1616
&&
449 if (emu
->emu1010
.output_source
[channel
] == val
)
451 emu
->emu1010
.output_source
[channel
] = val
;
452 if (emu
->card_capabilities
->emu_model
== EMU_MODEL_EMU1616
)
453 snd_emu1010_fpga_link_dst_src_write(emu
,
454 emu1616_output_dst
[channel
], emu1616_src_regs
[val
]);
456 snd_emu1010_fpga_link_dst_src_write(emu
,
457 emu1010_output_dst
[channel
], emu1010_src_regs
[val
]);
461 static int snd_emu1010_input_source_get(struct snd_kcontrol
*kcontrol
,
462 struct snd_ctl_elem_value
*ucontrol
)
464 struct snd_emu10k1
*emu
= snd_kcontrol_chip(kcontrol
);
465 unsigned int channel
;
467 channel
= (kcontrol
->private_value
) & 0xff;
468 /* Limit: emu1010_input_dst, emu->emu1010.input_source */
471 ucontrol
->value
.enumerated
.item
[0] = emu
->emu1010
.input_source
[channel
];
475 static int snd_emu1010_input_source_put(struct snd_kcontrol
*kcontrol
,
476 struct snd_ctl_elem_value
*ucontrol
)
478 struct snd_emu10k1
*emu
= snd_kcontrol_chip(kcontrol
);
480 unsigned int channel
;
482 val
= ucontrol
->value
.enumerated
.item
[0];
484 (emu
->card_capabilities
->emu_model
== EMU_MODEL_EMU1616
&&
487 channel
= (kcontrol
->private_value
) & 0xff;
488 /* Limit: emu1010_input_dst, emu->emu1010.input_source */
491 if (emu
->emu1010
.input_source
[channel
] == val
)
493 emu
->emu1010
.input_source
[channel
] = val
;
494 if (emu
->card_capabilities
->emu_model
== EMU_MODEL_EMU1616
)
495 snd_emu1010_fpga_link_dst_src_write(emu
,
496 emu1010_input_dst
[channel
], emu1616_src_regs
[val
]);
498 snd_emu1010_fpga_link_dst_src_write(emu
,
499 emu1010_input_dst
[channel
], emu1010_src_regs
[val
]);
503 #define EMU1010_SOURCE_OUTPUT(xname,chid) \
505 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
506 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, \
507 .info = snd_emu1010_input_output_source_info, \
508 .get = snd_emu1010_output_source_get, \
509 .put = snd_emu1010_output_source_put, \
510 .private_value = chid \
513 static struct snd_kcontrol_new snd_emu1010_output_enum_ctls
[] __devinitdata
= {
514 EMU1010_SOURCE_OUTPUT("Dock DAC1 Left Playback Enum", 0),
515 EMU1010_SOURCE_OUTPUT("Dock DAC1 Right Playback Enum", 1),
516 EMU1010_SOURCE_OUTPUT("Dock DAC2 Left Playback Enum", 2),
517 EMU1010_SOURCE_OUTPUT("Dock DAC2 Right Playback Enum", 3),
518 EMU1010_SOURCE_OUTPUT("Dock DAC3 Left Playback Enum", 4),
519 EMU1010_SOURCE_OUTPUT("Dock DAC3 Right Playback Enum", 5),
520 EMU1010_SOURCE_OUTPUT("Dock DAC4 Left Playback Enum", 6),
521 EMU1010_SOURCE_OUTPUT("Dock DAC4 Right Playback Enum", 7),
522 EMU1010_SOURCE_OUTPUT("Dock Phones Left Playback Enum", 8),
523 EMU1010_SOURCE_OUTPUT("Dock Phones Right Playback Enum", 9),
524 EMU1010_SOURCE_OUTPUT("Dock SPDIF Left Playback Enum", 0xa),
525 EMU1010_SOURCE_OUTPUT("Dock SPDIF Right Playback Enum", 0xb),
526 EMU1010_SOURCE_OUTPUT("1010 SPDIF Left Playback Enum", 0xc),
527 EMU1010_SOURCE_OUTPUT("1010 SPDIF Right Playback Enum", 0xd),
528 EMU1010_SOURCE_OUTPUT("0202 DAC Left Playback Enum", 0xe),
529 EMU1010_SOURCE_OUTPUT("0202 DAC Right Playback Enum", 0xf),
530 EMU1010_SOURCE_OUTPUT("1010 ADAT 0 Playback Enum", 0x10),
531 EMU1010_SOURCE_OUTPUT("1010 ADAT 1 Playback Enum", 0x11),
532 EMU1010_SOURCE_OUTPUT("1010 ADAT 2 Playback Enum", 0x12),
533 EMU1010_SOURCE_OUTPUT("1010 ADAT 3 Playback Enum", 0x13),
534 EMU1010_SOURCE_OUTPUT("1010 ADAT 4 Playback Enum", 0x14),
535 EMU1010_SOURCE_OUTPUT("1010 ADAT 5 Playback Enum", 0x15),
536 EMU1010_SOURCE_OUTPUT("1010 ADAT 6 Playback Enum", 0x16),
537 EMU1010_SOURCE_OUTPUT("1010 ADAT 7 Playback Enum", 0x17),
541 /* 1616(m) cardbus */
542 static struct snd_kcontrol_new snd_emu1616_output_enum_ctls
[] __devinitdata
= {
543 EMU1010_SOURCE_OUTPUT("Dock DAC1 Left Playback Enum", 0),
544 EMU1010_SOURCE_OUTPUT("Dock DAC1 Right Playback Enum", 1),
545 EMU1010_SOURCE_OUTPUT("Dock DAC2 Left Playback Enum", 2),
546 EMU1010_SOURCE_OUTPUT("Dock DAC2 Right Playback Enum", 3),
547 EMU1010_SOURCE_OUTPUT("Dock DAC3 Left Playback Enum", 4),
548 EMU1010_SOURCE_OUTPUT("Dock DAC3 Right Playback Enum", 5),
549 EMU1010_SOURCE_OUTPUT("Dock SPDIF Left Playback Enum", 6),
550 EMU1010_SOURCE_OUTPUT("Dock SPDIF Right Playback Enum", 7),
551 EMU1010_SOURCE_OUTPUT("Dock ADAT 0 Playback Enum", 8),
552 EMU1010_SOURCE_OUTPUT("Dock ADAT 1 Playback Enum", 9),
553 EMU1010_SOURCE_OUTPUT("Dock ADAT 2 Playback Enum", 0xa),
554 EMU1010_SOURCE_OUTPUT("Dock ADAT 3 Playback Enum", 0xb),
555 EMU1010_SOURCE_OUTPUT("Dock ADAT 4 Playback Enum", 0xc),
556 EMU1010_SOURCE_OUTPUT("Dock ADAT 5 Playback Enum", 0xd),
557 EMU1010_SOURCE_OUTPUT("Dock ADAT 6 Playback Enum", 0xe),
558 EMU1010_SOURCE_OUTPUT("Dock ADAT 7 Playback Enum", 0xf),
559 EMU1010_SOURCE_OUTPUT("Mana DAC Left Playback Enum", 0x10),
560 EMU1010_SOURCE_OUTPUT("Mana DAC Right Playback Enum", 0x11),
564 #define EMU1010_SOURCE_INPUT(xname,chid) \
566 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
567 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, \
568 .info = snd_emu1010_input_output_source_info, \
569 .get = snd_emu1010_input_source_get, \
570 .put = snd_emu1010_input_source_put, \
571 .private_value = chid \
574 static struct snd_kcontrol_new snd_emu1010_input_enum_ctls
[] __devinitdata
= {
575 EMU1010_SOURCE_INPUT("DSP 0 Capture Enum", 0),
576 EMU1010_SOURCE_INPUT("DSP 1 Capture Enum", 1),
577 EMU1010_SOURCE_INPUT("DSP 2 Capture Enum", 2),
578 EMU1010_SOURCE_INPUT("DSP 3 Capture Enum", 3),
579 EMU1010_SOURCE_INPUT("DSP 4 Capture Enum", 4),
580 EMU1010_SOURCE_INPUT("DSP 5 Capture Enum", 5),
581 EMU1010_SOURCE_INPUT("DSP 6 Capture Enum", 6),
582 EMU1010_SOURCE_INPUT("DSP 7 Capture Enum", 7),
583 EMU1010_SOURCE_INPUT("DSP 8 Capture Enum", 8),
584 EMU1010_SOURCE_INPUT("DSP 9 Capture Enum", 9),
585 EMU1010_SOURCE_INPUT("DSP A Capture Enum", 0xa),
586 EMU1010_SOURCE_INPUT("DSP B Capture Enum", 0xb),
587 EMU1010_SOURCE_INPUT("DSP C Capture Enum", 0xc),
588 EMU1010_SOURCE_INPUT("DSP D Capture Enum", 0xd),
589 EMU1010_SOURCE_INPUT("DSP E Capture Enum", 0xe),
590 EMU1010_SOURCE_INPUT("DSP F Capture Enum", 0xf),
591 EMU1010_SOURCE_INPUT("DSP 10 Capture Enum", 0x10),
592 EMU1010_SOURCE_INPUT("DSP 11 Capture Enum", 0x11),
593 EMU1010_SOURCE_INPUT("DSP 12 Capture Enum", 0x12),
594 EMU1010_SOURCE_INPUT("DSP 13 Capture Enum", 0x13),
595 EMU1010_SOURCE_INPUT("DSP 14 Capture Enum", 0x14),
596 EMU1010_SOURCE_INPUT("DSP 15 Capture Enum", 0x15),
601 #define snd_emu1010_adc_pads_info snd_ctl_boolean_mono_info
603 static int snd_emu1010_adc_pads_get(struct snd_kcontrol
*kcontrol
, struct snd_ctl_elem_value
*ucontrol
)
605 struct snd_emu10k1
*emu
= snd_kcontrol_chip(kcontrol
);
606 unsigned int mask
= kcontrol
->private_value
& 0xff;
607 ucontrol
->value
.integer
.value
[0] = (emu
->emu1010
.adc_pads
& mask
) ? 1 : 0;
611 static int snd_emu1010_adc_pads_put(struct snd_kcontrol
*kcontrol
, struct snd_ctl_elem_value
*ucontrol
)
613 struct snd_emu10k1
*emu
= snd_kcontrol_chip(kcontrol
);
614 unsigned int mask
= kcontrol
->private_value
& 0xff;
615 unsigned int val
, cache
;
616 val
= ucontrol
->value
.integer
.value
[0];
617 cache
= emu
->emu1010
.adc_pads
;
619 cache
= cache
| mask
;
621 cache
= cache
& ~mask
;
622 if (cache
!= emu
->emu1010
.adc_pads
) {
623 snd_emu1010_fpga_write(emu
, EMU_HANA_ADC_PADS
, cache
);
624 emu
->emu1010
.adc_pads
= cache
;
632 #define EMU1010_ADC_PADS(xname,chid) \
634 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
635 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, \
636 .info = snd_emu1010_adc_pads_info, \
637 .get = snd_emu1010_adc_pads_get, \
638 .put = snd_emu1010_adc_pads_put, \
639 .private_value = chid \
642 static struct snd_kcontrol_new snd_emu1010_adc_pads
[] __devinitdata
= {
643 EMU1010_ADC_PADS("ADC1 14dB PAD Audio Dock Capture Switch", EMU_HANA_DOCK_ADC_PAD1
),
644 EMU1010_ADC_PADS("ADC2 14dB PAD Audio Dock Capture Switch", EMU_HANA_DOCK_ADC_PAD2
),
645 EMU1010_ADC_PADS("ADC3 14dB PAD Audio Dock Capture Switch", EMU_HANA_DOCK_ADC_PAD3
),
646 EMU1010_ADC_PADS("ADC1 14dB PAD 0202 Capture Switch", EMU_HANA_0202_ADC_PAD1
),
649 #define snd_emu1010_dac_pads_info snd_ctl_boolean_mono_info
651 static int snd_emu1010_dac_pads_get(struct snd_kcontrol
*kcontrol
, struct snd_ctl_elem_value
*ucontrol
)
653 struct snd_emu10k1
*emu
= snd_kcontrol_chip(kcontrol
);
654 unsigned int mask
= kcontrol
->private_value
& 0xff;
655 ucontrol
->value
.integer
.value
[0] = (emu
->emu1010
.dac_pads
& mask
) ? 1 : 0;
659 static int snd_emu1010_dac_pads_put(struct snd_kcontrol
*kcontrol
, struct snd_ctl_elem_value
*ucontrol
)
661 struct snd_emu10k1
*emu
= snd_kcontrol_chip(kcontrol
);
662 unsigned int mask
= kcontrol
->private_value
& 0xff;
663 unsigned int val
, cache
;
664 val
= ucontrol
->value
.integer
.value
[0];
665 cache
= emu
->emu1010
.dac_pads
;
667 cache
= cache
| mask
;
669 cache
= cache
& ~mask
;
670 if (cache
!= emu
->emu1010
.dac_pads
) {
671 snd_emu1010_fpga_write(emu
, EMU_HANA_DAC_PADS
, cache
);
672 emu
->emu1010
.dac_pads
= cache
;
680 #define EMU1010_DAC_PADS(xname,chid) \
682 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
683 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, \
684 .info = snd_emu1010_dac_pads_info, \
685 .get = snd_emu1010_dac_pads_get, \
686 .put = snd_emu1010_dac_pads_put, \
687 .private_value = chid \
690 static struct snd_kcontrol_new snd_emu1010_dac_pads
[] __devinitdata
= {
691 EMU1010_DAC_PADS("DAC1 Audio Dock 14dB PAD Playback Switch", EMU_HANA_DOCK_DAC_PAD1
),
692 EMU1010_DAC_PADS("DAC2 Audio Dock 14dB PAD Playback Switch", EMU_HANA_DOCK_DAC_PAD2
),
693 EMU1010_DAC_PADS("DAC3 Audio Dock 14dB PAD Playback Switch", EMU_HANA_DOCK_DAC_PAD3
),
694 EMU1010_DAC_PADS("DAC4 Audio Dock 14dB PAD Playback Switch", EMU_HANA_DOCK_DAC_PAD4
),
695 EMU1010_DAC_PADS("DAC1 0202 14dB PAD Playback Switch", EMU_HANA_0202_DAC_PAD1
),
699 static int snd_emu1010_internal_clock_info(struct snd_kcontrol
*kcontrol
,
700 struct snd_ctl_elem_info
*uinfo
)
702 static char *texts
[4] = {
703 "44100", "48000", "SPDIF", "ADAT"
706 uinfo
->type
= SNDRV_CTL_ELEM_TYPE_ENUMERATED
;
708 uinfo
->value
.enumerated
.items
= 4;
709 if (uinfo
->value
.enumerated
.item
>= uinfo
->value
.enumerated
.items
)
710 uinfo
->value
.enumerated
.item
= uinfo
->value
.enumerated
.items
- 1;
711 strcpy(uinfo
->value
.enumerated
.name
, texts
[uinfo
->value
.enumerated
.item
]);
717 static int snd_emu1010_internal_clock_get(struct snd_kcontrol
*kcontrol
,
718 struct snd_ctl_elem_value
*ucontrol
)
720 struct snd_emu10k1
*emu
= snd_kcontrol_chip(kcontrol
);
722 ucontrol
->value
.enumerated
.item
[0] = emu
->emu1010
.internal_clock
;
726 static int snd_emu1010_internal_clock_put(struct snd_kcontrol
*kcontrol
,
727 struct snd_ctl_elem_value
*ucontrol
)
729 struct snd_emu10k1
*emu
= snd_kcontrol_chip(kcontrol
);
733 val
= ucontrol
->value
.enumerated
.item
[0] ;
734 /* Limit: uinfo->value.enumerated.items = 4; */
737 change
= (emu
->emu1010
.internal_clock
!= val
);
739 emu
->emu1010
.internal_clock
= val
;
744 snd_emu1010_fpga_write(emu
, EMU_HANA_UNMUTE
, EMU_MUTE
);
745 /* Default fallback clock 48kHz */
746 snd_emu1010_fpga_write(emu
, EMU_HANA_DEFCLOCK
, EMU_HANA_DEFCLOCK_44_1K
);
747 /* Word Clock source, Internal 44.1kHz x1 */
748 snd_emu1010_fpga_write(emu
, EMU_HANA_WCLOCK
,
749 EMU_HANA_WCLOCK_INT_44_1K
| EMU_HANA_WCLOCK_1X
);
750 /* Set LEDs on Audio Dock */
751 snd_emu1010_fpga_write(emu
, EMU_HANA_DOCK_LEDS_2
,
752 EMU_HANA_DOCK_LEDS_2_44K
| EMU_HANA_DOCK_LEDS_2_LOCK
);
753 /* Allow DLL to settle */
756 snd_emu1010_fpga_write(emu
, EMU_HANA_UNMUTE
, EMU_UNMUTE
);
761 snd_emu1010_fpga_write(emu
, EMU_HANA_UNMUTE
, EMU_MUTE
);
762 /* Default fallback clock 48kHz */
763 snd_emu1010_fpga_write(emu
, EMU_HANA_DEFCLOCK
, EMU_HANA_DEFCLOCK_48K
);
764 /* Word Clock source, Internal 48kHz x1 */
765 snd_emu1010_fpga_write(emu
, EMU_HANA_WCLOCK
,
766 EMU_HANA_WCLOCK_INT_48K
| EMU_HANA_WCLOCK_1X
);
767 /* Set LEDs on Audio Dock */
768 snd_emu1010_fpga_write(emu
, EMU_HANA_DOCK_LEDS_2
,
769 EMU_HANA_DOCK_LEDS_2_48K
| EMU_HANA_DOCK_LEDS_2_LOCK
);
770 /* Allow DLL to settle */
773 snd_emu1010_fpga_write(emu
, EMU_HANA_UNMUTE
, EMU_UNMUTE
);
776 case 2: /* Take clock from S/PDIF IN */
778 snd_emu1010_fpga_write(emu
, EMU_HANA_UNMUTE
, EMU_MUTE
);
779 /* Default fallback clock 48kHz */
780 snd_emu1010_fpga_write(emu
, EMU_HANA_DEFCLOCK
, EMU_HANA_DEFCLOCK_48K
);
781 /* Word Clock source, sync to S/PDIF input */
782 snd_emu1010_fpga_write(emu
, EMU_HANA_WCLOCK
,
783 EMU_HANA_WCLOCK_HANA_SPDIF_IN
| EMU_HANA_WCLOCK_1X
);
784 /* Set LEDs on Audio Dock */
785 snd_emu1010_fpga_write(emu
, EMU_HANA_DOCK_LEDS_2
,
786 EMU_HANA_DOCK_LEDS_2_EXT
| EMU_HANA_DOCK_LEDS_2_LOCK
);
787 /* FIXME: We should set EMU_HANA_DOCK_LEDS_2_LOCK only when clock signal is present and valid */
788 /* Allow DLL to settle */
791 snd_emu1010_fpga_write(emu
, EMU_HANA_UNMUTE
, EMU_UNMUTE
);
795 /* Take clock from ADAT IN */
797 snd_emu1010_fpga_write(emu
, EMU_HANA_UNMUTE
, EMU_MUTE
);
798 /* Default fallback clock 48kHz */
799 snd_emu1010_fpga_write(emu
, EMU_HANA_DEFCLOCK
, EMU_HANA_DEFCLOCK_48K
);
800 /* Word Clock source, sync to ADAT input */
801 snd_emu1010_fpga_write(emu
, EMU_HANA_WCLOCK
,
802 EMU_HANA_WCLOCK_HANA_ADAT_IN
| EMU_HANA_WCLOCK_1X
);
803 /* Set LEDs on Audio Dock */
804 snd_emu1010_fpga_write(emu
, EMU_HANA_DOCK_LEDS_2
, EMU_HANA_DOCK_LEDS_2_EXT
| EMU_HANA_DOCK_LEDS_2_LOCK
);
805 /* FIXME: We should set EMU_HANA_DOCK_LEDS_2_LOCK only when clock signal is present and valid */
806 /* Allow DLL to settle */
809 snd_emu1010_fpga_write(emu
, EMU_HANA_UNMUTE
, EMU_UNMUTE
);
818 static struct snd_kcontrol_new snd_emu1010_internal_clock
=
820 .access
= SNDRV_CTL_ELEM_ACCESS_READWRITE
,
821 .iface
= SNDRV_CTL_ELEM_IFACE_MIXER
,
822 .name
= "Clock Internal Rate",
824 .info
= snd_emu1010_internal_clock_info
,
825 .get
= snd_emu1010_internal_clock_get
,
826 .put
= snd_emu1010_internal_clock_put
829 static int snd_audigy_i2c_capture_source_info(struct snd_kcontrol
*kcontrol
,
830 struct snd_ctl_elem_info
*uinfo
)
833 static char *texts
[4] = {
834 "Unknown1", "Unknown2", "Mic", "Line"
837 static char *texts
[2] = {
841 uinfo
->type
= SNDRV_CTL_ELEM_TYPE_ENUMERATED
;
843 uinfo
->value
.enumerated
.items
= 2;
844 if (uinfo
->value
.enumerated
.item
> 1)
845 uinfo
->value
.enumerated
.item
= 1;
846 strcpy(uinfo
->value
.enumerated
.name
, texts
[uinfo
->value
.enumerated
.item
]);
850 static int snd_audigy_i2c_capture_source_get(struct snd_kcontrol
*kcontrol
,
851 struct snd_ctl_elem_value
*ucontrol
)
853 struct snd_emu10k1
*emu
= snd_kcontrol_chip(kcontrol
);
855 ucontrol
->value
.enumerated
.item
[0] = emu
->i2c_capture_source
;
859 static int snd_audigy_i2c_capture_source_put(struct snd_kcontrol
*kcontrol
,
860 struct snd_ctl_elem_value
*ucontrol
)
862 struct snd_emu10k1
*emu
= snd_kcontrol_chip(kcontrol
);
863 unsigned int source_id
;
864 unsigned int ngain
, ogain
;
869 /* If the capture source has changed,
870 * update the capture volume from the cached value
871 * for the particular source.
873 source_id
= ucontrol
->value
.enumerated
.item
[0];
874 /* Limit: uinfo->value.enumerated.items = 2; */
875 /* emu->i2c_capture_volume */
878 change
= (emu
->i2c_capture_source
!= source_id
);
880 snd_emu10k1_i2c_write(emu
, ADC_MUX
, 0); /* Mute input */
881 spin_lock_irqsave(&emu
->emu_lock
, flags
);
882 gpio
= inl(emu
->port
+ A_IOCFG
);
884 outl(gpio
| 0x4, emu
->port
+ A_IOCFG
);
886 outl(gpio
& ~0x4, emu
->port
+ A_IOCFG
);
887 spin_unlock_irqrestore(&emu
->emu_lock
, flags
);
889 ngain
= emu
->i2c_capture_volume
[source_id
][0]; /* Left */
890 ogain
= emu
->i2c_capture_volume
[emu
->i2c_capture_source
][0]; /* Left */
892 snd_emu10k1_i2c_write(emu
, ADC_ATTEN_ADCL
, ((ngain
) & 0xff));
893 ngain
= emu
->i2c_capture_volume
[source_id
][1]; /* Right */
894 ogain
= emu
->i2c_capture_volume
[emu
->i2c_capture_source
][1]; /* Right */
896 snd_emu10k1_i2c_write(emu
, ADC_ATTEN_ADCR
, ((ngain
) & 0xff));
898 source
= 1 << (source_id
+ 2);
899 snd_emu10k1_i2c_write(emu
, ADC_MUX
, source
); /* Set source */
900 emu
->i2c_capture_source
= source_id
;
905 static struct snd_kcontrol_new snd_audigy_i2c_capture_source
=
907 .iface
= SNDRV_CTL_ELEM_IFACE_MIXER
,
908 .name
= "Capture Source",
909 .info
= snd_audigy_i2c_capture_source_info
,
910 .get
= snd_audigy_i2c_capture_source_get
,
911 .put
= snd_audigy_i2c_capture_source_put
914 static int snd_audigy_i2c_volume_info(struct snd_kcontrol
*kcontrol
,
915 struct snd_ctl_elem_info
*uinfo
)
917 uinfo
->type
= SNDRV_CTL_ELEM_TYPE_INTEGER
;
919 uinfo
->value
.integer
.min
= 0;
920 uinfo
->value
.integer
.max
= 255;
924 static int snd_audigy_i2c_volume_get(struct snd_kcontrol
*kcontrol
,
925 struct snd_ctl_elem_value
*ucontrol
)
927 struct snd_emu10k1
*emu
= snd_kcontrol_chip(kcontrol
);
928 unsigned int source_id
;
930 source_id
= kcontrol
->private_value
;
931 /* Limit: emu->i2c_capture_volume */
932 /* capture_source: uinfo->value.enumerated.items = 2 */
936 ucontrol
->value
.integer
.value
[0] = emu
->i2c_capture_volume
[source_id
][0];
937 ucontrol
->value
.integer
.value
[1] = emu
->i2c_capture_volume
[source_id
][1];
941 static int snd_audigy_i2c_volume_put(struct snd_kcontrol
*kcontrol
,
942 struct snd_ctl_elem_value
*ucontrol
)
944 struct snd_emu10k1
*emu
= snd_kcontrol_chip(kcontrol
);
947 unsigned int source_id
;
950 source_id
= kcontrol
->private_value
;
951 /* Limit: emu->i2c_capture_volume */
952 /* capture_source: uinfo->value.enumerated.items = 2 */
955 ogain
= emu
->i2c_capture_volume
[source_id
][0]; /* Left */
956 ngain
= ucontrol
->value
.integer
.value
[0];
959 if (ogain
!= ngain
) {
960 if (emu
->i2c_capture_source
== source_id
)
961 snd_emu10k1_i2c_write(emu
, ADC_ATTEN_ADCL
, ((ngain
) & 0xff) );
962 emu
->i2c_capture_volume
[source_id
][0] = ngain
;
965 ogain
= emu
->i2c_capture_volume
[source_id
][1]; /* Right */
966 ngain
= ucontrol
->value
.integer
.value
[1];
969 if (ogain
!= ngain
) {
970 if (emu
->i2c_capture_source
== source_id
)
971 snd_emu10k1_i2c_write(emu
, ADC_ATTEN_ADCR
, ((ngain
) & 0xff));
972 emu
->i2c_capture_volume
[source_id
][1] = ngain
;
979 #define I2C_VOLUME(xname,chid) \
981 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
982 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE | \
983 SNDRV_CTL_ELEM_ACCESS_TLV_READ, \
984 .info = snd_audigy_i2c_volume_info, \
985 .get = snd_audigy_i2c_volume_get, \
986 .put = snd_audigy_i2c_volume_put, \
987 .tlv = { .p = snd_audigy_db_scale2 }, \
988 .private_value = chid \
992 static struct snd_kcontrol_new snd_audigy_i2c_volume_ctls
[] __devinitdata
= {
993 I2C_VOLUME("Mic Capture Volume", 0),
994 I2C_VOLUME("Line Capture Volume", 0)
998 static int snd_audigy_spdif_output_rate_info(struct snd_kcontrol
*kcontrol
, struct snd_ctl_elem_info
*uinfo
)
1000 static char *texts
[] = {"44100", "48000", "96000"};
1002 uinfo
->type
= SNDRV_CTL_ELEM_TYPE_ENUMERATED
;
1004 uinfo
->value
.enumerated
.items
= 3;
1005 if (uinfo
->value
.enumerated
.item
>= uinfo
->value
.enumerated
.items
)
1006 uinfo
->value
.enumerated
.item
= uinfo
->value
.enumerated
.items
- 1;
1007 strcpy(uinfo
->value
.enumerated
.name
, texts
[uinfo
->value
.enumerated
.item
]);
1011 static int snd_audigy_spdif_output_rate_get(struct snd_kcontrol
*kcontrol
,
1012 struct snd_ctl_elem_value
*ucontrol
)
1014 struct snd_emu10k1
*emu
= snd_kcontrol_chip(kcontrol
);
1016 unsigned long flags
;
1019 spin_lock_irqsave(&emu
->reg_lock
, flags
);
1020 tmp
= snd_emu10k1_ptr_read(emu
, A_SPDIF_SAMPLERATE
, 0);
1021 switch (tmp
& A_SPDIF_RATE_MASK
) {
1023 ucontrol
->value
.enumerated
.item
[0] = 0;
1026 ucontrol
->value
.enumerated
.item
[0] = 1;
1029 ucontrol
->value
.enumerated
.item
[0] = 2;
1032 ucontrol
->value
.enumerated
.item
[0] = 1;
1034 spin_unlock_irqrestore(&emu
->reg_lock
, flags
);
1038 static int snd_audigy_spdif_output_rate_put(struct snd_kcontrol
*kcontrol
,
1039 struct snd_ctl_elem_value
*ucontrol
)
1041 struct snd_emu10k1
*emu
= snd_kcontrol_chip(kcontrol
);
1043 unsigned int reg
, val
, tmp
;
1044 unsigned long flags
;
1046 switch(ucontrol
->value
.enumerated
.item
[0]) {
1048 val
= A_SPDIF_44100
;
1051 val
= A_SPDIF_48000
;
1054 val
= A_SPDIF_96000
;
1057 val
= A_SPDIF_48000
;
1062 spin_lock_irqsave(&emu
->reg_lock
, flags
);
1063 reg
= snd_emu10k1_ptr_read(emu
, A_SPDIF_SAMPLERATE
, 0);
1064 tmp
= reg
& ~A_SPDIF_RATE_MASK
;
1066 if ((change
= (tmp
!= reg
)))
1067 snd_emu10k1_ptr_write(emu
, A_SPDIF_SAMPLERATE
, 0, tmp
);
1068 spin_unlock_irqrestore(&emu
->reg_lock
, flags
);
1072 static struct snd_kcontrol_new snd_audigy_spdif_output_rate
=
1074 .access
= SNDRV_CTL_ELEM_ACCESS_READWRITE
,
1075 .iface
= SNDRV_CTL_ELEM_IFACE_MIXER
,
1076 .name
= "Audigy SPDIF Output Sample Rate",
1078 .info
= snd_audigy_spdif_output_rate_info
,
1079 .get
= snd_audigy_spdif_output_rate_get
,
1080 .put
= snd_audigy_spdif_output_rate_put
1084 static int snd_emu10k1_spdif_put(struct snd_kcontrol
*kcontrol
,
1085 struct snd_ctl_elem_value
*ucontrol
)
1087 struct snd_emu10k1
*emu
= snd_kcontrol_chip(kcontrol
);
1088 unsigned int idx
= snd_ctl_get_ioffidx(kcontrol
, &ucontrol
->id
);
1091 unsigned long flags
;
1093 /* Limit: emu->spdif_bits */
1096 val
= (ucontrol
->value
.iec958
.status
[0] << 0) |
1097 (ucontrol
->value
.iec958
.status
[1] << 8) |
1098 (ucontrol
->value
.iec958
.status
[2] << 16) |
1099 (ucontrol
->value
.iec958
.status
[3] << 24);
1100 spin_lock_irqsave(&emu
->reg_lock
, flags
);
1101 change
= val
!= emu
->spdif_bits
[idx
];
1103 snd_emu10k1_ptr_write(emu
, SPCS0
+ idx
, 0, val
);
1104 emu
->spdif_bits
[idx
] = val
;
1106 spin_unlock_irqrestore(&emu
->reg_lock
, flags
);
1110 static struct snd_kcontrol_new snd_emu10k1_spdif_mask_control
=
1112 .access
= SNDRV_CTL_ELEM_ACCESS_READ
,
1113 .iface
= SNDRV_CTL_ELEM_IFACE_PCM
,
1114 .name
= SNDRV_CTL_NAME_IEC958("",PLAYBACK
,MASK
),
1116 .info
= snd_emu10k1_spdif_info
,
1117 .get
= snd_emu10k1_spdif_get_mask
1120 static struct snd_kcontrol_new snd_emu10k1_spdif_control
=
1122 .iface
= SNDRV_CTL_ELEM_IFACE_PCM
,
1123 .name
= SNDRV_CTL_NAME_IEC958("",PLAYBACK
,DEFAULT
),
1125 .info
= snd_emu10k1_spdif_info
,
1126 .get
= snd_emu10k1_spdif_get
,
1127 .put
= snd_emu10k1_spdif_put
1131 static void update_emu10k1_fxrt(struct snd_emu10k1
*emu
, int voice
, unsigned char *route
)
1134 snd_emu10k1_ptr_write(emu
, A_FXRT1
, voice
,
1135 snd_emu10k1_compose_audigy_fxrt1(route
));
1136 snd_emu10k1_ptr_write(emu
, A_FXRT2
, voice
,
1137 snd_emu10k1_compose_audigy_fxrt2(route
));
1139 snd_emu10k1_ptr_write(emu
, FXRT
, voice
,
1140 snd_emu10k1_compose_send_routing(route
));
1144 static void update_emu10k1_send_volume(struct snd_emu10k1
*emu
, int voice
, unsigned char *volume
)
1146 snd_emu10k1_ptr_write(emu
, PTRX_FXSENDAMOUNT_A
, voice
, volume
[0]);
1147 snd_emu10k1_ptr_write(emu
, PTRX_FXSENDAMOUNT_B
, voice
, volume
[1]);
1148 snd_emu10k1_ptr_write(emu
, PSST_FXSENDAMOUNT_C
, voice
, volume
[2]);
1149 snd_emu10k1_ptr_write(emu
, DSL_FXSENDAMOUNT_D
, voice
, volume
[3]);
1151 unsigned int val
= ((unsigned int)volume
[4] << 24) |
1152 ((unsigned int)volume
[5] << 16) |
1153 ((unsigned int)volume
[6] << 8) |
1154 (unsigned int)volume
[7];
1155 snd_emu10k1_ptr_write(emu
, A_SENDAMOUNTS
, voice
, val
);
1159 /* PCM stream controls */
1161 static int snd_emu10k1_send_routing_info(struct snd_kcontrol
*kcontrol
, struct snd_ctl_elem_info
*uinfo
)
1163 struct snd_emu10k1
*emu
= snd_kcontrol_chip(kcontrol
);
1164 uinfo
->type
= SNDRV_CTL_ELEM_TYPE_INTEGER
;
1165 uinfo
->count
= emu
->audigy
? 3*8 : 3*4;
1166 uinfo
->value
.integer
.min
= 0;
1167 uinfo
->value
.integer
.max
= emu
->audigy
? 0x3f : 0x0f;
1171 static int snd_emu10k1_send_routing_get(struct snd_kcontrol
*kcontrol
,
1172 struct snd_ctl_elem_value
*ucontrol
)
1174 unsigned long flags
;
1175 struct snd_emu10k1
*emu
= snd_kcontrol_chip(kcontrol
);
1176 struct snd_emu10k1_pcm_mixer
*mix
=
1177 &emu
->pcm_mixer
[snd_ctl_get_ioffidx(kcontrol
, &ucontrol
->id
)];
1179 int num_efx
= emu
->audigy
? 8 : 4;
1180 int mask
= emu
->audigy
? 0x3f : 0x0f;
1182 spin_lock_irqsave(&emu
->reg_lock
, flags
);
1183 for (voice
= 0; voice
< 3; voice
++)
1184 for (idx
= 0; idx
< num_efx
; idx
++)
1185 ucontrol
->value
.integer
.value
[(voice
* num_efx
) + idx
] =
1186 mix
->send_routing
[voice
][idx
] & mask
;
1187 spin_unlock_irqrestore(&emu
->reg_lock
, flags
);
1191 static int snd_emu10k1_send_routing_put(struct snd_kcontrol
*kcontrol
,
1192 struct snd_ctl_elem_value
*ucontrol
)
1194 unsigned long flags
;
1195 struct snd_emu10k1
*emu
= snd_kcontrol_chip(kcontrol
);
1196 struct snd_emu10k1_pcm_mixer
*mix
=
1197 &emu
->pcm_mixer
[snd_ctl_get_ioffidx(kcontrol
, &ucontrol
->id
)];
1198 int change
= 0, voice
, idx
, val
;
1199 int num_efx
= emu
->audigy
? 8 : 4;
1200 int mask
= emu
->audigy
? 0x3f : 0x0f;
1202 spin_lock_irqsave(&emu
->reg_lock
, flags
);
1203 for (voice
= 0; voice
< 3; voice
++)
1204 for (idx
= 0; idx
< num_efx
; idx
++) {
1205 val
= ucontrol
->value
.integer
.value
[(voice
* num_efx
) + idx
] & mask
;
1206 if (mix
->send_routing
[voice
][idx
] != val
) {
1207 mix
->send_routing
[voice
][idx
] = val
;
1211 if (change
&& mix
->epcm
) {
1212 if (mix
->epcm
->voices
[0] && mix
->epcm
->voices
[1]) {
1213 update_emu10k1_fxrt(emu
, mix
->epcm
->voices
[0]->number
,
1214 &mix
->send_routing
[1][0]);
1215 update_emu10k1_fxrt(emu
, mix
->epcm
->voices
[1]->number
,
1216 &mix
->send_routing
[2][0]);
1217 } else if (mix
->epcm
->voices
[0]) {
1218 update_emu10k1_fxrt(emu
, mix
->epcm
->voices
[0]->number
,
1219 &mix
->send_routing
[0][0]);
1222 spin_unlock_irqrestore(&emu
->reg_lock
, flags
);
1226 static struct snd_kcontrol_new snd_emu10k1_send_routing_control
=
1228 .access
= SNDRV_CTL_ELEM_ACCESS_READWRITE
| SNDRV_CTL_ELEM_ACCESS_INACTIVE
,
1229 .iface
= SNDRV_CTL_ELEM_IFACE_PCM
,
1230 .name
= "EMU10K1 PCM Send Routing",
1232 .info
= snd_emu10k1_send_routing_info
,
1233 .get
= snd_emu10k1_send_routing_get
,
1234 .put
= snd_emu10k1_send_routing_put
1237 static int snd_emu10k1_send_volume_info(struct snd_kcontrol
*kcontrol
, struct snd_ctl_elem_info
*uinfo
)
1239 struct snd_emu10k1
*emu
= snd_kcontrol_chip(kcontrol
);
1240 uinfo
->type
= SNDRV_CTL_ELEM_TYPE_INTEGER
;
1241 uinfo
->count
= emu
->audigy
? 3*8 : 3*4;
1242 uinfo
->value
.integer
.min
= 0;
1243 uinfo
->value
.integer
.max
= 255;
1247 static int snd_emu10k1_send_volume_get(struct snd_kcontrol
*kcontrol
,
1248 struct snd_ctl_elem_value
*ucontrol
)
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
)];
1255 int num_efx
= emu
->audigy
? 8 : 4;
1257 spin_lock_irqsave(&emu
->reg_lock
, flags
);
1258 for (idx
= 0; idx
< 3*num_efx
; idx
++)
1259 ucontrol
->value
.integer
.value
[idx
] = mix
->send_volume
[idx
/num_efx
][idx
%num_efx
];
1260 spin_unlock_irqrestore(&emu
->reg_lock
, flags
);
1264 static int snd_emu10k1_send_volume_put(struct snd_kcontrol
*kcontrol
,
1265 struct snd_ctl_elem_value
*ucontrol
)
1267 unsigned long flags
;
1268 struct snd_emu10k1
*emu
= snd_kcontrol_chip(kcontrol
);
1269 struct snd_emu10k1_pcm_mixer
*mix
=
1270 &emu
->pcm_mixer
[snd_ctl_get_ioffidx(kcontrol
, &ucontrol
->id
)];
1271 int change
= 0, idx
, val
;
1272 int num_efx
= emu
->audigy
? 8 : 4;
1274 spin_lock_irqsave(&emu
->reg_lock
, flags
);
1275 for (idx
= 0; idx
< 3*num_efx
; idx
++) {
1276 val
= ucontrol
->value
.integer
.value
[idx
] & 255;
1277 if (mix
->send_volume
[idx
/num_efx
][idx
%num_efx
] != val
) {
1278 mix
->send_volume
[idx
/num_efx
][idx
%num_efx
] = val
;
1282 if (change
&& mix
->epcm
) {
1283 if (mix
->epcm
->voices
[0] && mix
->epcm
->voices
[1]) {
1284 update_emu10k1_send_volume(emu
, mix
->epcm
->voices
[0]->number
,
1285 &mix
->send_volume
[1][0]);
1286 update_emu10k1_send_volume(emu
, mix
->epcm
->voices
[1]->number
,
1287 &mix
->send_volume
[2][0]);
1288 } else if (mix
->epcm
->voices
[0]) {
1289 update_emu10k1_send_volume(emu
, mix
->epcm
->voices
[0]->number
,
1290 &mix
->send_volume
[0][0]);
1293 spin_unlock_irqrestore(&emu
->reg_lock
, flags
);
1297 static struct snd_kcontrol_new snd_emu10k1_send_volume_control
=
1299 .access
= SNDRV_CTL_ELEM_ACCESS_READWRITE
| SNDRV_CTL_ELEM_ACCESS_INACTIVE
,
1300 .iface
= SNDRV_CTL_ELEM_IFACE_PCM
,
1301 .name
= "EMU10K1 PCM Send Volume",
1303 .info
= snd_emu10k1_send_volume_info
,
1304 .get
= snd_emu10k1_send_volume_get
,
1305 .put
= snd_emu10k1_send_volume_put
1308 static int snd_emu10k1_attn_info(struct snd_kcontrol
*kcontrol
, struct snd_ctl_elem_info
*uinfo
)
1310 uinfo
->type
= SNDRV_CTL_ELEM_TYPE_INTEGER
;
1312 uinfo
->value
.integer
.min
= 0;
1313 uinfo
->value
.integer
.max
= 0xffff;
1317 static int snd_emu10k1_attn_get(struct snd_kcontrol
*kcontrol
,
1318 struct snd_ctl_elem_value
*ucontrol
)
1320 struct snd_emu10k1
*emu
= snd_kcontrol_chip(kcontrol
);
1321 struct snd_emu10k1_pcm_mixer
*mix
=
1322 &emu
->pcm_mixer
[snd_ctl_get_ioffidx(kcontrol
, &ucontrol
->id
)];
1323 unsigned long flags
;
1326 spin_lock_irqsave(&emu
->reg_lock
, flags
);
1327 for (idx
= 0; idx
< 3; idx
++)
1328 ucontrol
->value
.integer
.value
[idx
] = mix
->attn
[idx
];
1329 spin_unlock_irqrestore(&emu
->reg_lock
, flags
);
1333 static int snd_emu10k1_attn_put(struct snd_kcontrol
*kcontrol
,
1334 struct snd_ctl_elem_value
*ucontrol
)
1336 unsigned long flags
;
1337 struct snd_emu10k1
*emu
= snd_kcontrol_chip(kcontrol
);
1338 struct snd_emu10k1_pcm_mixer
*mix
=
1339 &emu
->pcm_mixer
[snd_ctl_get_ioffidx(kcontrol
, &ucontrol
->id
)];
1340 int change
= 0, idx
, val
;
1342 spin_lock_irqsave(&emu
->reg_lock
, flags
);
1343 for (idx
= 0; idx
< 3; idx
++) {
1344 val
= ucontrol
->value
.integer
.value
[idx
] & 0xffff;
1345 if (mix
->attn
[idx
] != val
) {
1346 mix
->attn
[idx
] = val
;
1350 if (change
&& mix
->epcm
) {
1351 if (mix
->epcm
->voices
[0] && mix
->epcm
->voices
[1]) {
1352 snd_emu10k1_ptr_write(emu
, VTFT_VOLUMETARGET
, mix
->epcm
->voices
[0]->number
, mix
->attn
[1]);
1353 snd_emu10k1_ptr_write(emu
, VTFT_VOLUMETARGET
, mix
->epcm
->voices
[1]->number
, mix
->attn
[2]);
1354 } else if (mix
->epcm
->voices
[0]) {
1355 snd_emu10k1_ptr_write(emu
, VTFT_VOLUMETARGET
, mix
->epcm
->voices
[0]->number
, mix
->attn
[0]);
1358 spin_unlock_irqrestore(&emu
->reg_lock
, flags
);
1362 static struct snd_kcontrol_new snd_emu10k1_attn_control
=
1364 .access
= SNDRV_CTL_ELEM_ACCESS_READWRITE
| SNDRV_CTL_ELEM_ACCESS_INACTIVE
,
1365 .iface
= SNDRV_CTL_ELEM_IFACE_PCM
,
1366 .name
= "EMU10K1 PCM Volume",
1368 .info
= snd_emu10k1_attn_info
,
1369 .get
= snd_emu10k1_attn_get
,
1370 .put
= snd_emu10k1_attn_put
1373 /* Mutichannel PCM stream controls */
1375 static int snd_emu10k1_efx_send_routing_info(struct snd_kcontrol
*kcontrol
, struct snd_ctl_elem_info
*uinfo
)
1377 struct snd_emu10k1
*emu
= snd_kcontrol_chip(kcontrol
);
1378 uinfo
->type
= SNDRV_CTL_ELEM_TYPE_INTEGER
;
1379 uinfo
->count
= emu
->audigy
? 8 : 4;
1380 uinfo
->value
.integer
.min
= 0;
1381 uinfo
->value
.integer
.max
= emu
->audigy
? 0x3f : 0x0f;
1385 static int snd_emu10k1_efx_send_routing_get(struct snd_kcontrol
*kcontrol
,
1386 struct snd_ctl_elem_value
*ucontrol
)
1388 unsigned long flags
;
1389 struct snd_emu10k1
*emu
= snd_kcontrol_chip(kcontrol
);
1390 struct snd_emu10k1_pcm_mixer
*mix
=
1391 &emu
->efx_pcm_mixer
[snd_ctl_get_ioffidx(kcontrol
, &ucontrol
->id
)];
1393 int num_efx
= emu
->audigy
? 8 : 4;
1394 int mask
= emu
->audigy
? 0x3f : 0x0f;
1396 spin_lock_irqsave(&emu
->reg_lock
, flags
);
1397 for (idx
= 0; idx
< num_efx
; idx
++)
1398 ucontrol
->value
.integer
.value
[idx
] =
1399 mix
->send_routing
[0][idx
] & mask
;
1400 spin_unlock_irqrestore(&emu
->reg_lock
, flags
);
1404 static int snd_emu10k1_efx_send_routing_put(struct snd_kcontrol
*kcontrol
,
1405 struct snd_ctl_elem_value
*ucontrol
)
1407 unsigned long flags
;
1408 struct snd_emu10k1
*emu
= snd_kcontrol_chip(kcontrol
);
1409 int ch
= snd_ctl_get_ioffidx(kcontrol
, &ucontrol
->id
);
1410 struct snd_emu10k1_pcm_mixer
*mix
= &emu
->efx_pcm_mixer
[ch
];
1411 int change
= 0, idx
, val
;
1412 int num_efx
= emu
->audigy
? 8 : 4;
1413 int mask
= emu
->audigy
? 0x3f : 0x0f;
1415 spin_lock_irqsave(&emu
->reg_lock
, flags
);
1416 for (idx
= 0; idx
< num_efx
; idx
++) {
1417 val
= ucontrol
->value
.integer
.value
[idx
] & mask
;
1418 if (mix
->send_routing
[0][idx
] != val
) {
1419 mix
->send_routing
[0][idx
] = val
;
1424 if (change
&& mix
->epcm
) {
1425 if (mix
->epcm
->voices
[ch
]) {
1426 update_emu10k1_fxrt(emu
, mix
->epcm
->voices
[ch
]->number
,
1427 &mix
->send_routing
[0][0]);
1430 spin_unlock_irqrestore(&emu
->reg_lock
, flags
);
1434 static struct snd_kcontrol_new snd_emu10k1_efx_send_routing_control
=
1436 .access
= SNDRV_CTL_ELEM_ACCESS_READWRITE
| SNDRV_CTL_ELEM_ACCESS_INACTIVE
,
1437 .iface
= SNDRV_CTL_ELEM_IFACE_PCM
,
1438 .name
= "Multichannel PCM Send Routing",
1440 .info
= snd_emu10k1_efx_send_routing_info
,
1441 .get
= snd_emu10k1_efx_send_routing_get
,
1442 .put
= snd_emu10k1_efx_send_routing_put
1445 static int snd_emu10k1_efx_send_volume_info(struct snd_kcontrol
*kcontrol
, struct snd_ctl_elem_info
*uinfo
)
1447 struct snd_emu10k1
*emu
= snd_kcontrol_chip(kcontrol
);
1448 uinfo
->type
= SNDRV_CTL_ELEM_TYPE_INTEGER
;
1449 uinfo
->count
= emu
->audigy
? 8 : 4;
1450 uinfo
->value
.integer
.min
= 0;
1451 uinfo
->value
.integer
.max
= 255;
1455 static int snd_emu10k1_efx_send_volume_get(struct snd_kcontrol
*kcontrol
,
1456 struct snd_ctl_elem_value
*ucontrol
)
1458 unsigned long flags
;
1459 struct snd_emu10k1
*emu
= snd_kcontrol_chip(kcontrol
);
1460 struct snd_emu10k1_pcm_mixer
*mix
=
1461 &emu
->efx_pcm_mixer
[snd_ctl_get_ioffidx(kcontrol
, &ucontrol
->id
)];
1463 int num_efx
= emu
->audigy
? 8 : 4;
1465 spin_lock_irqsave(&emu
->reg_lock
, flags
);
1466 for (idx
= 0; idx
< num_efx
; idx
++)
1467 ucontrol
->value
.integer
.value
[idx
] = mix
->send_volume
[0][idx
];
1468 spin_unlock_irqrestore(&emu
->reg_lock
, flags
);
1472 static int snd_emu10k1_efx_send_volume_put(struct snd_kcontrol
*kcontrol
,
1473 struct snd_ctl_elem_value
*ucontrol
)
1475 unsigned long flags
;
1476 struct snd_emu10k1
*emu
= snd_kcontrol_chip(kcontrol
);
1477 int ch
= snd_ctl_get_ioffidx(kcontrol
, &ucontrol
->id
);
1478 struct snd_emu10k1_pcm_mixer
*mix
= &emu
->efx_pcm_mixer
[ch
];
1479 int change
= 0, idx
, val
;
1480 int num_efx
= emu
->audigy
? 8 : 4;
1482 spin_lock_irqsave(&emu
->reg_lock
, flags
);
1483 for (idx
= 0; idx
< num_efx
; idx
++) {
1484 val
= ucontrol
->value
.integer
.value
[idx
] & 255;
1485 if (mix
->send_volume
[0][idx
] != val
) {
1486 mix
->send_volume
[0][idx
] = val
;
1490 if (change
&& mix
->epcm
) {
1491 if (mix
->epcm
->voices
[ch
]) {
1492 update_emu10k1_send_volume(emu
, mix
->epcm
->voices
[ch
]->number
,
1493 &mix
->send_volume
[0][0]);
1496 spin_unlock_irqrestore(&emu
->reg_lock
, flags
);
1501 static struct snd_kcontrol_new snd_emu10k1_efx_send_volume_control
=
1503 .access
= SNDRV_CTL_ELEM_ACCESS_READWRITE
| SNDRV_CTL_ELEM_ACCESS_INACTIVE
,
1504 .iface
= SNDRV_CTL_ELEM_IFACE_PCM
,
1505 .name
= "Multichannel PCM Send Volume",
1507 .info
= snd_emu10k1_efx_send_volume_info
,
1508 .get
= snd_emu10k1_efx_send_volume_get
,
1509 .put
= snd_emu10k1_efx_send_volume_put
1512 static int snd_emu10k1_efx_attn_info(struct snd_kcontrol
*kcontrol
, struct snd_ctl_elem_info
*uinfo
)
1514 uinfo
->type
= SNDRV_CTL_ELEM_TYPE_INTEGER
;
1516 uinfo
->value
.integer
.min
= 0;
1517 uinfo
->value
.integer
.max
= 0xffff;
1521 static int snd_emu10k1_efx_attn_get(struct snd_kcontrol
*kcontrol
,
1522 struct snd_ctl_elem_value
*ucontrol
)
1524 struct snd_emu10k1
*emu
= snd_kcontrol_chip(kcontrol
);
1525 struct snd_emu10k1_pcm_mixer
*mix
=
1526 &emu
->efx_pcm_mixer
[snd_ctl_get_ioffidx(kcontrol
, &ucontrol
->id
)];
1527 unsigned long flags
;
1529 spin_lock_irqsave(&emu
->reg_lock
, flags
);
1530 ucontrol
->value
.integer
.value
[0] = mix
->attn
[0];
1531 spin_unlock_irqrestore(&emu
->reg_lock
, flags
);
1535 static int snd_emu10k1_efx_attn_put(struct snd_kcontrol
*kcontrol
,
1536 struct snd_ctl_elem_value
*ucontrol
)
1538 unsigned long flags
;
1539 struct snd_emu10k1
*emu
= snd_kcontrol_chip(kcontrol
);
1540 int ch
= snd_ctl_get_ioffidx(kcontrol
, &ucontrol
->id
);
1541 struct snd_emu10k1_pcm_mixer
*mix
= &emu
->efx_pcm_mixer
[ch
];
1542 int change
= 0, val
;
1544 spin_lock_irqsave(&emu
->reg_lock
, flags
);
1545 val
= ucontrol
->value
.integer
.value
[0] & 0xffff;
1546 if (mix
->attn
[0] != val
) {
1550 if (change
&& mix
->epcm
) {
1551 if (mix
->epcm
->voices
[ch
]) {
1552 snd_emu10k1_ptr_write(emu
, VTFT_VOLUMETARGET
, mix
->epcm
->voices
[ch
]->number
, mix
->attn
[0]);
1555 spin_unlock_irqrestore(&emu
->reg_lock
, flags
);
1559 static struct snd_kcontrol_new snd_emu10k1_efx_attn_control
=
1561 .access
= SNDRV_CTL_ELEM_ACCESS_READWRITE
| SNDRV_CTL_ELEM_ACCESS_INACTIVE
,
1562 .iface
= SNDRV_CTL_ELEM_IFACE_PCM
,
1563 .name
= "Multichannel PCM Volume",
1565 .info
= snd_emu10k1_efx_attn_info
,
1566 .get
= snd_emu10k1_efx_attn_get
,
1567 .put
= snd_emu10k1_efx_attn_put
1570 #define snd_emu10k1_shared_spdif_info snd_ctl_boolean_mono_info
1572 static int snd_emu10k1_shared_spdif_get(struct snd_kcontrol
*kcontrol
,
1573 struct snd_ctl_elem_value
*ucontrol
)
1575 struct snd_emu10k1
*emu
= snd_kcontrol_chip(kcontrol
);
1578 ucontrol
->value
.integer
.value
[0] = inl(emu
->port
+ A_IOCFG
) & A_IOCFG_GPOUT0
? 1 : 0;
1580 ucontrol
->value
.integer
.value
[0] = inl(emu
->port
+ HCFG
) & HCFG_GPOUT0
? 1 : 0;
1584 static int snd_emu10k1_shared_spdif_put(struct snd_kcontrol
*kcontrol
,
1585 struct snd_ctl_elem_value
*ucontrol
)
1587 unsigned long flags
;
1588 struct snd_emu10k1
*emu
= snd_kcontrol_chip(kcontrol
);
1589 unsigned int reg
, val
;
1592 spin_lock_irqsave(&emu
->reg_lock
, flags
);
1593 if ( emu
->card_capabilities
->i2c_adc
) {
1594 /* Do nothing for Audigy 2 ZS Notebook */
1595 } else if (emu
->audigy
) {
1596 reg
= inl(emu
->port
+ A_IOCFG
);
1597 val
= ucontrol
->value
.integer
.value
[0] ? A_IOCFG_GPOUT0
: 0;
1598 change
= (reg
& A_IOCFG_GPOUT0
) != val
;
1600 reg
&= ~A_IOCFG_GPOUT0
;
1602 outl(reg
| val
, emu
->port
+ A_IOCFG
);
1605 reg
= inl(emu
->port
+ HCFG
);
1606 val
= ucontrol
->value
.integer
.value
[0] ? HCFG_GPOUT0
: 0;
1607 change
|= (reg
& HCFG_GPOUT0
) != val
;
1609 reg
&= ~HCFG_GPOUT0
;
1611 outl(reg
| val
, emu
->port
+ HCFG
);
1613 spin_unlock_irqrestore(&emu
->reg_lock
, flags
);
1617 static struct snd_kcontrol_new snd_emu10k1_shared_spdif __devinitdata
=
1619 .iface
= SNDRV_CTL_ELEM_IFACE_MIXER
,
1620 .name
= "SB Live Analog/Digital Output Jack",
1621 .info
= snd_emu10k1_shared_spdif_info
,
1622 .get
= snd_emu10k1_shared_spdif_get
,
1623 .put
= snd_emu10k1_shared_spdif_put
1626 static struct snd_kcontrol_new snd_audigy_shared_spdif __devinitdata
=
1628 .iface
= SNDRV_CTL_ELEM_IFACE_MIXER
,
1629 .name
= "Audigy Analog/Digital Output Jack",
1630 .info
= snd_emu10k1_shared_spdif_info
,
1631 .get
= snd_emu10k1_shared_spdif_get
,
1632 .put
= snd_emu10k1_shared_spdif_put
1637 static void snd_emu10k1_mixer_free_ac97(struct snd_ac97
*ac97
)
1639 struct snd_emu10k1
*emu
= ac97
->private_data
;
1645 static int remove_ctl(struct snd_card
*card
, const char *name
)
1647 struct snd_ctl_elem_id id
;
1648 memset(&id
, 0, sizeof(id
));
1649 strcpy(id
.name
, name
);
1650 id
.iface
= SNDRV_CTL_ELEM_IFACE_MIXER
;
1651 return snd_ctl_remove_id(card
, &id
);
1654 static struct snd_kcontrol
*ctl_find(struct snd_card
*card
, const char *name
)
1656 struct snd_ctl_elem_id sid
;
1657 memset(&sid
, 0, sizeof(sid
));
1658 strcpy(sid
.name
, name
);
1659 sid
.iface
= SNDRV_CTL_ELEM_IFACE_MIXER
;
1660 return snd_ctl_find_id(card
, &sid
);
1663 static int rename_ctl(struct snd_card
*card
, const char *src
, const char *dst
)
1665 struct snd_kcontrol
*kctl
= ctl_find(card
, src
);
1667 strcpy(kctl
->id
.name
, dst
);
1673 int __devinit
snd_emu10k1_mixer(struct snd_emu10k1
*emu
,
1674 int pcm_device
, int multi_device
)
1677 struct snd_kcontrol
*kctl
;
1678 struct snd_card
*card
= emu
->card
;
1680 static char *emu10k1_remove_ctls
[] = {
1681 /* no AC97 mono, surround, center/lfe */
1682 "Master Mono Playback Switch",
1683 "Master Mono Playback Volume",
1684 "PCM Out Path & Mute",
1685 "Mono Output Select",
1686 "Front Playback Switch",
1687 "Front Playback Volume",
1688 "Surround Playback Switch",
1689 "Surround Playback Volume",
1690 "Center Playback Switch",
1691 "Center Playback Volume",
1692 "LFE Playback Switch",
1693 "LFE Playback Volume",
1696 static char *emu10k1_rename_ctls
[] = {
1697 "Surround Digital Playback Volume", "Surround Playback Volume",
1698 "Center Digital Playback Volume", "Center Playback Volume",
1699 "LFE Digital Playback Volume", "LFE Playback Volume",
1702 static char *audigy_remove_ctls
[] = {
1703 /* Master/PCM controls on ac97 of Audigy has no effect */
1704 /* On the Audigy2 the AC97 playback is piped into
1705 * the Philips ADC for 24bit capture */
1706 "PCM Playback Switch",
1707 "PCM Playback Volume",
1708 "Master Mono Playback Switch",
1709 "Master Mono Playback Volume",
1710 "Master Playback Switch",
1711 "Master Playback Volume",
1712 "PCM Out Path & Mute",
1713 "Mono Output Select",
1714 /* remove unused AC97 capture controls */
1719 "Video Playback Switch",
1720 "Video Playback Volume",
1721 "Mic Playback Switch",
1722 "Mic Playback Volume",
1725 static char *audigy_rename_ctls
[] = {
1726 /* use conventional names */
1727 "Wave Playback Volume", "PCM Playback Volume",
1728 /* "Wave Capture Volume", "PCM Capture Volume", */
1729 "Wave Master Playback Volume", "Master Playback Volume",
1730 "AMic Playback Volume", "Mic Playback Volume",
1733 static char *audigy_rename_ctls_i2c_adc
[] = {
1734 //"Analog Mix Capture Volume","OLD Analog Mix Capture Volume",
1735 "Line Capture Volume", "Analog Mix Capture Volume",
1736 "Wave Playback Volume", "OLD PCM Playback Volume",
1737 "Wave Master Playback Volume", "Master Playback Volume",
1738 "AMic Playback Volume", "Old Mic Playback Volume",
1739 "CD Capture Volume", "IEC958 Optical Capture Volume",
1742 static char *audigy_remove_ctls_i2c_adc
[] = {
1743 /* On the Audigy2 ZS Notebook
1744 * Capture via WM8775 */
1745 "Mic Capture Volume",
1746 "Analog Mix Capture Volume",
1747 "Aux Capture Volume",
1748 "IEC958 Optical Capture Volume",
1751 static char *audigy_remove_ctls_1361t_adc
[] = {
1752 /* On the Audigy2 the AC97 playback is piped into
1753 * the Philips ADC for 24bit capture */
1754 "PCM Playback Switch",
1755 "PCM Playback Volume",
1756 "Master Mono Playback Switch",
1757 "Master Mono Playback Volume",
1761 "Mic Capture Volume",
1762 "Headphone Playback Switch",
1763 "Headphone Playback Volume",
1764 "3D Control - Center",
1765 "3D Control - Depth",
1766 "3D Control - Switch",
1767 "Line2 Playback Volume",
1768 "Line2 Capture Volume",
1771 static char *audigy_rename_ctls_1361t_adc
[] = {
1772 "Master Playback Switch", "Master Capture Switch",
1773 "Master Playback Volume", "Master Capture Volume",
1774 "Wave Master Playback Volume", "Master Playback Volume",
1775 "PC Speaker Playback Switch", "PC Speaker Capture Switch",
1776 "PC Speaker Playback Volume", "PC Speaker Capture Volume",
1777 "Phone Playback Switch", "Phone Capture Switch",
1778 "Phone Playback Volume", "Phone Capture Volume",
1779 "Mic Playback Switch", "Mic Capture Switch",
1780 "Mic Playback Volume", "Mic Capture Volume",
1781 "Line Playback Switch", "Line Capture Switch",
1782 "Line Playback Volume", "Line Capture Volume",
1783 "CD Playback Switch", "CD Capture Switch",
1784 "CD Playback Volume", "CD Capture Volume",
1785 "Aux Playback Switch", "Aux Capture Switch",
1786 "Aux Playback Volume", "Aux Capture Volume",
1787 "Video Playback Switch", "Video Capture Switch",
1788 "Video Playback Volume", "Video Capture Volume",
1793 if (emu
->card_capabilities
->ac97_chip
) {
1794 struct snd_ac97_bus
*pbus
;
1795 struct snd_ac97_template ac97
;
1796 static struct snd_ac97_bus_ops ops
= {
1797 .write
= snd_emu10k1_ac97_write
,
1798 .read
= snd_emu10k1_ac97_read
,
1801 if ((err
= snd_ac97_bus(emu
->card
, 0, &ops
, NULL
, &pbus
)) < 0)
1803 pbus
->no_vra
= 1; /* we don't need VRA */
1805 memset(&ac97
, 0, sizeof(ac97
));
1806 ac97
.private_data
= emu
;
1807 ac97
.private_free
= snd_emu10k1_mixer_free_ac97
;
1808 ac97
.scaps
= AC97_SCAP_NO_SPDIF
;
1809 if ((err
= snd_ac97_mixer(pbus
, &ac97
, &emu
->ac97
)) < 0) {
1810 if (emu
->card_capabilities
->ac97_chip
== 1)
1812 snd_printd(KERN_INFO
"emu10k1: AC97 is optional on this board\n");
1813 snd_printd(KERN_INFO
" Proceeding without ac97 mixers...\n");
1814 snd_device_free(emu
->card
, pbus
);
1815 goto no_ac97
; /* FIXME: get rid of ugly gotos.. */
1818 /* set master volume to 0 dB */
1819 snd_ac97_write_cache(emu
->ac97
, AC97_MASTER
, 0x0000);
1820 /* set capture source to mic */
1821 snd_ac97_write_cache(emu
->ac97
, AC97_REC_SEL
, 0x0000);
1822 if (emu
->card_capabilities
->adc_1361t
)
1823 c
= audigy_remove_ctls_1361t_adc
;
1825 c
= audigy_remove_ctls
;
1828 * Credits for cards based on STAC9758:
1829 * James Courtier-Dutton <James@superbug.demon.co.uk>
1830 * Voluspa <voluspa@comhem.se>
1832 if (emu
->ac97
->id
== AC97_ID_STAC9758
) {
1834 snd_emu10k1_ptr_write(emu
, AC97SLOT
, 0, AC97SLOT_CNTR
|AC97SLOT_LFE
|AC97SLOT_REAR_LEFT
|AC97SLOT_REAR_RIGHT
);
1835 snd_ac97_write_cache(emu
->ac97
, AC97_HEADPHONE
, 0x0202);
1837 /* remove unused AC97 controls */
1838 snd_ac97_write_cache(emu
->ac97
, AC97_SURROUND_MASTER
, 0x0202);
1839 snd_ac97_write_cache(emu
->ac97
, AC97_CENTER_LFE_MASTER
, 0x0202);
1840 c
= emu10k1_remove_ctls
;
1843 remove_ctl(card
, *c
);
1844 } else if (emu
->card_capabilities
->i2c_adc
) {
1845 c
= audigy_remove_ctls_i2c_adc
;
1847 remove_ctl(card
, *c
);
1850 if (emu
->card_capabilities
->ecard
)
1851 strcpy(emu
->card
->mixername
, "EMU APS");
1852 else if (emu
->audigy
)
1853 strcpy(emu
->card
->mixername
, "SB Audigy");
1855 strcpy(emu
->card
->mixername
, "Emu10k1");
1859 if (emu
->card_capabilities
->adc_1361t
)
1860 c
= audigy_rename_ctls_1361t_adc
;
1861 else if (emu
->card_capabilities
->i2c_adc
)
1862 c
= audigy_rename_ctls_i2c_adc
;
1864 c
= audigy_rename_ctls
;
1866 c
= emu10k1_rename_ctls
;
1868 rename_ctl(card
, c
[0], c
[1]);
1870 if (emu
->card_capabilities
->subsystem
== 0x20071102) { /* Audigy 4 Pro */
1871 rename_ctl(card
, "Line2 Capture Volume", "Line1/Mic Capture Volume");
1872 rename_ctl(card
, "Analog Mix Capture Volume", "Line2 Capture Volume");
1873 rename_ctl(card
, "Aux2 Capture Volume", "Line3 Capture Volume");
1874 rename_ctl(card
, "Mic Capture Volume", "Unknown1 Capture Volume");
1875 remove_ctl(card
, "Headphone Playback Switch");
1876 remove_ctl(card
, "Headphone Playback Volume");
1877 remove_ctl(card
, "3D Control - Center");
1878 remove_ctl(card
, "3D Control - Depth");
1879 remove_ctl(card
, "3D Control - Switch");
1881 if ((kctl
= emu
->ctl_send_routing
= snd_ctl_new1(&snd_emu10k1_send_routing_control
, emu
)) == NULL
)
1883 kctl
->id
.device
= pcm_device
;
1884 if ((err
= snd_ctl_add(card
, kctl
)))
1886 if ((kctl
= emu
->ctl_send_volume
= snd_ctl_new1(&snd_emu10k1_send_volume_control
, emu
)) == NULL
)
1888 kctl
->id
.device
= pcm_device
;
1889 if ((err
= snd_ctl_add(card
, kctl
)))
1891 if ((kctl
= emu
->ctl_attn
= snd_ctl_new1(&snd_emu10k1_attn_control
, emu
)) == NULL
)
1893 kctl
->id
.device
= pcm_device
;
1894 if ((err
= snd_ctl_add(card
, kctl
)))
1897 if ((kctl
= emu
->ctl_efx_send_routing
= snd_ctl_new1(&snd_emu10k1_efx_send_routing_control
, emu
)) == NULL
)
1899 kctl
->id
.device
= multi_device
;
1900 if ((err
= snd_ctl_add(card
, kctl
)))
1903 if ((kctl
= emu
->ctl_efx_send_volume
= snd_ctl_new1(&snd_emu10k1_efx_send_volume_control
, emu
)) == NULL
)
1905 kctl
->id
.device
= multi_device
;
1906 if ((err
= snd_ctl_add(card
, kctl
)))
1909 if ((kctl
= emu
->ctl_efx_attn
= snd_ctl_new1(&snd_emu10k1_efx_attn_control
, emu
)) == NULL
)
1911 kctl
->id
.device
= multi_device
;
1912 if ((err
= snd_ctl_add(card
, kctl
)))
1915 /* initialize the routing and volume table for each pcm playback stream */
1916 for (pcm
= 0; pcm
< 32; pcm
++) {
1917 struct snd_emu10k1_pcm_mixer
*mix
;
1920 mix
= &emu
->pcm_mixer
[pcm
];
1923 for (v
= 0; v
< 4; v
++)
1924 mix
->send_routing
[0][v
] =
1925 mix
->send_routing
[1][v
] =
1926 mix
->send_routing
[2][v
] = v
;
1928 memset(&mix
->send_volume
, 0, sizeof(mix
->send_volume
));
1929 mix
->send_volume
[0][0] = mix
->send_volume
[0][1] =
1930 mix
->send_volume
[1][0] = mix
->send_volume
[2][1] = 255;
1932 mix
->attn
[0] = mix
->attn
[1] = mix
->attn
[2] = 0xffff;
1935 /* initialize the routing and volume table for the multichannel playback stream */
1936 for (pcm
= 0; pcm
< NUM_EFX_PLAYBACK
; pcm
++) {
1937 struct snd_emu10k1_pcm_mixer
*mix
;
1940 mix
= &emu
->efx_pcm_mixer
[pcm
];
1943 mix
->send_routing
[0][0] = pcm
;
1944 mix
->send_routing
[0][1] = (pcm
== 0) ? 1 : 0;
1945 for (v
= 0; v
< 2; v
++)
1946 mix
->send_routing
[0][2+v
] = 13+v
;
1948 for (v
= 0; v
< 4; v
++)
1949 mix
->send_routing
[0][4+v
] = 60+v
;
1951 memset(&mix
->send_volume
, 0, sizeof(mix
->send_volume
));
1952 mix
->send_volume
[0][0] = 255;
1954 mix
->attn
[0] = 0xffff;
1957 if (! emu
->card_capabilities
->ecard
) { /* FIXME: APS has these controls? */
1958 /* sb live! and audigy */
1959 if ((kctl
= snd_ctl_new1(&snd_emu10k1_spdif_mask_control
, emu
)) == NULL
)
1962 kctl
->id
.device
= emu
->pcm_efx
->device
;
1963 if ((err
= snd_ctl_add(card
, kctl
)))
1965 if ((kctl
= snd_ctl_new1(&snd_emu10k1_spdif_control
, emu
)) == NULL
)
1968 kctl
->id
.device
= emu
->pcm_efx
->device
;
1969 if ((err
= snd_ctl_add(card
, kctl
)))
1973 if (emu
->card_capabilities
->emu_model
) {
1974 ; /* Disable the snd_audigy_spdif_shared_spdif */
1975 } else if (emu
->audigy
) {
1976 if ((kctl
= snd_ctl_new1(&snd_audigy_shared_spdif
, emu
)) == NULL
)
1978 if ((err
= snd_ctl_add(card
, kctl
)))
1981 if ((kctl
= snd_ctl_new1(&snd_audigy_spdif_output_rate
, emu
)) == NULL
)
1983 if ((err
= snd_ctl_add(card
, kctl
)))
1986 } else if (! emu
->card_capabilities
->ecard
) {
1988 if ((kctl
= snd_ctl_new1(&snd_emu10k1_shared_spdif
, emu
)) == NULL
)
1990 if ((err
= snd_ctl_add(card
, kctl
)))
1993 if (emu
->card_capabilities
->ca0151_chip
) { /* P16V */
1994 if ((err
= snd_p16v_mixer(emu
)))
1998 if (emu
->card_capabilities
->emu_model
== EMU_MODEL_EMU1616
) {
1999 /* 1616(m) cardbus */
2002 for (i
= 0; i
< ARRAY_SIZE(snd_emu1616_output_enum_ctls
); i
++) {
2003 err
= snd_ctl_add(card
,
2004 snd_ctl_new1(&snd_emu1616_output_enum_ctls
[i
],
2009 for (i
= 0; i
< ARRAY_SIZE(snd_emu1010_input_enum_ctls
); i
++) {
2010 err
= snd_ctl_add(card
,
2011 snd_ctl_new1(&snd_emu1010_input_enum_ctls
[i
],
2016 for (i
= 0; i
< ARRAY_SIZE(snd_emu1010_adc_pads
) - 2; i
++) {
2017 err
= snd_ctl_add(card
,
2018 snd_ctl_new1(&snd_emu1010_adc_pads
[i
], emu
));
2022 for (i
= 0; i
< ARRAY_SIZE(snd_emu1010_dac_pads
) - 2; i
++) {
2023 err
= snd_ctl_add(card
,
2024 snd_ctl_new1(&snd_emu1010_dac_pads
[i
], emu
));
2028 err
= snd_ctl_add(card
,
2029 snd_ctl_new1(&snd_emu1010_internal_clock
, emu
));
2033 } else if (emu
->card_capabilities
->emu_model
) {
2034 /* all other e-mu cards for now */
2037 for (i
= 0; i
< ARRAY_SIZE(snd_emu1010_output_enum_ctls
); i
++) {
2038 err
= snd_ctl_add(card
,
2039 snd_ctl_new1(&snd_emu1010_output_enum_ctls
[i
],
2044 for (i
= 0; i
< ARRAY_SIZE(snd_emu1010_input_enum_ctls
); i
++) {
2045 err
= snd_ctl_add(card
,
2046 snd_ctl_new1(&snd_emu1010_input_enum_ctls
[i
],
2051 for (i
= 0; i
< ARRAY_SIZE(snd_emu1010_adc_pads
); i
++) {
2052 err
= snd_ctl_add(card
,
2053 snd_ctl_new1(&snd_emu1010_adc_pads
[i
], emu
));
2057 for (i
= 0; i
< ARRAY_SIZE(snd_emu1010_dac_pads
); i
++) {
2058 err
= snd_ctl_add(card
,
2059 snd_ctl_new1(&snd_emu1010_dac_pads
[i
], emu
));
2063 err
= snd_ctl_add(card
,
2064 snd_ctl_new1(&snd_emu1010_internal_clock
, emu
));
2069 if ( emu
->card_capabilities
->i2c_adc
) {
2072 err
= snd_ctl_add(card
, snd_ctl_new1(&snd_audigy_i2c_capture_source
, emu
));
2076 for (i
= 0; i
< ARRAY_SIZE(snd_audigy_i2c_volume_ctls
); i
++) {
2077 err
= snd_ctl_add(card
, snd_ctl_new1(&snd_audigy_i2c_volume_ctls
[i
], emu
));