Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/sound/pci/emu10k1/emumixer.c
10818 views
1
/*
2
* Copyright (c) by Jaroslav Kysela <[email protected]>,
3
* Takashi Iwai <[email protected]>
4
* Creative Labs, Inc.
5
* Routines for control of EMU10K1 chips / mixer routines
6
* Multichannel PCM support Copyright (c) Lee Revell <[email protected]>
7
*
8
* Copyright (c) by James Courtier-Dutton <[email protected]>
9
* Added EMU 1010 support.
10
*
11
* BUGS:
12
* --
13
*
14
* TODO:
15
* --
16
*
17
* This program is free software; you can redistribute it and/or modify
18
* it under the terms of the GNU General Public License as published by
19
* the Free Software Foundation; either version 2 of the License, or
20
* (at your option) any later version.
21
*
22
* This program is distributed in the hope that it will be useful,
23
* but WITHOUT ANY WARRANTY; without even the implied warranty of
24
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
25
* GNU General Public License for more details.
26
*
27
* You should have received a copy of the GNU General Public License
28
* along with this program; if not, write to the Free Software
29
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
30
*
31
*/
32
33
#include <linux/time.h>
34
#include <linux/init.h>
35
#include <sound/core.h>
36
#include <sound/emu10k1.h>
37
#include <linux/delay.h>
38
#include <sound/tlv.h>
39
40
#include "p17v.h"
41
42
#define AC97_ID_STAC9758 0x83847658
43
44
static const DECLARE_TLV_DB_SCALE(snd_audigy_db_scale2, -10350, 50, 1); /* WM8775 gain scale */
45
46
static int snd_emu10k1_spdif_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
47
{
48
uinfo->type = SNDRV_CTL_ELEM_TYPE_IEC958;
49
uinfo->count = 1;
50
return 0;
51
}
52
53
static int snd_emu10k1_spdif_get(struct snd_kcontrol *kcontrol,
54
struct snd_ctl_elem_value *ucontrol)
55
{
56
struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
57
unsigned int idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
58
unsigned long flags;
59
60
/* Limit: emu->spdif_bits */
61
if (idx >= 3)
62
return -EINVAL;
63
spin_lock_irqsave(&emu->reg_lock, flags);
64
ucontrol->value.iec958.status[0] = (emu->spdif_bits[idx] >> 0) & 0xff;
65
ucontrol->value.iec958.status[1] = (emu->spdif_bits[idx] >> 8) & 0xff;
66
ucontrol->value.iec958.status[2] = (emu->spdif_bits[idx] >> 16) & 0xff;
67
ucontrol->value.iec958.status[3] = (emu->spdif_bits[idx] >> 24) & 0xff;
68
spin_unlock_irqrestore(&emu->reg_lock, flags);
69
return 0;
70
}
71
72
static int snd_emu10k1_spdif_get_mask(struct snd_kcontrol *kcontrol,
73
struct snd_ctl_elem_value *ucontrol)
74
{
75
ucontrol->value.iec958.status[0] = 0xff;
76
ucontrol->value.iec958.status[1] = 0xff;
77
ucontrol->value.iec958.status[2] = 0xff;
78
ucontrol->value.iec958.status[3] = 0xff;
79
return 0;
80
}
81
82
/*
83
* Items labels in enum mixer controls assigning source data to
84
* each destination
85
*/
86
static char *emu1010_src_texts[] = {
87
"Silence",
88
"Dock Mic A",
89
"Dock Mic B",
90
"Dock ADC1 Left",
91
"Dock ADC1 Right",
92
"Dock ADC2 Left",
93
"Dock ADC2 Right",
94
"Dock ADC3 Left",
95
"Dock ADC3 Right",
96
"0202 ADC Left",
97
"0202 ADC Right",
98
"0202 SPDIF Left",
99
"0202 SPDIF Right",
100
"ADAT 0",
101
"ADAT 1",
102
"ADAT 2",
103
"ADAT 3",
104
"ADAT 4",
105
"ADAT 5",
106
"ADAT 6",
107
"ADAT 7",
108
"DSP 0",
109
"DSP 1",
110
"DSP 2",
111
"DSP 3",
112
"DSP 4",
113
"DSP 5",
114
"DSP 6",
115
"DSP 7",
116
"DSP 8",
117
"DSP 9",
118
"DSP 10",
119
"DSP 11",
120
"DSP 12",
121
"DSP 13",
122
"DSP 14",
123
"DSP 15",
124
"DSP 16",
125
"DSP 17",
126
"DSP 18",
127
"DSP 19",
128
"DSP 20",
129
"DSP 21",
130
"DSP 22",
131
"DSP 23",
132
"DSP 24",
133
"DSP 25",
134
"DSP 26",
135
"DSP 27",
136
"DSP 28",
137
"DSP 29",
138
"DSP 30",
139
"DSP 31",
140
};
141
142
/* 1616(m) cardbus */
143
144
static char *emu1616_src_texts[] = {
145
"Silence",
146
"Dock Mic A",
147
"Dock Mic B",
148
"Dock ADC1 Left",
149
"Dock ADC1 Right",
150
"Dock ADC2 Left",
151
"Dock ADC2 Right",
152
"Dock SPDIF Left",
153
"Dock SPDIF Right",
154
"ADAT 0",
155
"ADAT 1",
156
"ADAT 2",
157
"ADAT 3",
158
"ADAT 4",
159
"ADAT 5",
160
"ADAT 6",
161
"ADAT 7",
162
"DSP 0",
163
"DSP 1",
164
"DSP 2",
165
"DSP 3",
166
"DSP 4",
167
"DSP 5",
168
"DSP 6",
169
"DSP 7",
170
"DSP 8",
171
"DSP 9",
172
"DSP 10",
173
"DSP 11",
174
"DSP 12",
175
"DSP 13",
176
"DSP 14",
177
"DSP 15",
178
"DSP 16",
179
"DSP 17",
180
"DSP 18",
181
"DSP 19",
182
"DSP 20",
183
"DSP 21",
184
"DSP 22",
185
"DSP 23",
186
"DSP 24",
187
"DSP 25",
188
"DSP 26",
189
"DSP 27",
190
"DSP 28",
191
"DSP 29",
192
"DSP 30",
193
"DSP 31",
194
};
195
196
197
/*
198
* List of data sources available for each destination
199
*/
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 */
254
};
255
256
/* 1616(m) cardbus */
257
static unsigned int emu1616_src_regs[] = {
258
EMU_SRC_SILENCE,
259
EMU_SRC_DOCK_MIC_A1,
260
EMU_SRC_DOCK_MIC_B1,
261
EMU_SRC_DOCK_ADC1_LEFT1,
262
EMU_SRC_DOCK_ADC1_RIGHT1,
263
EMU_SRC_DOCK_ADC2_LEFT1,
264
EMU_SRC_DOCK_ADC2_RIGHT1,
265
EMU_SRC_MDOCK_SPDIF_LEFT1,
266
EMU_SRC_MDOCK_SPDIF_RIGHT1,
267
EMU_SRC_MDOCK_ADAT,
268
EMU_SRC_MDOCK_ADAT+1,
269
EMU_SRC_MDOCK_ADAT+2,
270
EMU_SRC_MDOCK_ADAT+3,
271
EMU_SRC_MDOCK_ADAT+4,
272
EMU_SRC_MDOCK_ADAT+5,
273
EMU_SRC_MDOCK_ADAT+6,
274
EMU_SRC_MDOCK_ADAT+7,
275
EMU_SRC_ALICE_EMU32A,
276
EMU_SRC_ALICE_EMU32A+1,
277
EMU_SRC_ALICE_EMU32A+2,
278
EMU_SRC_ALICE_EMU32A+3,
279
EMU_SRC_ALICE_EMU32A+4,
280
EMU_SRC_ALICE_EMU32A+5,
281
EMU_SRC_ALICE_EMU32A+6,
282
EMU_SRC_ALICE_EMU32A+7,
283
EMU_SRC_ALICE_EMU32A+8,
284
EMU_SRC_ALICE_EMU32A+9,
285
EMU_SRC_ALICE_EMU32A+0xa,
286
EMU_SRC_ALICE_EMU32A+0xb,
287
EMU_SRC_ALICE_EMU32A+0xc,
288
EMU_SRC_ALICE_EMU32A+0xd,
289
EMU_SRC_ALICE_EMU32A+0xe,
290
EMU_SRC_ALICE_EMU32A+0xf,
291
EMU_SRC_ALICE_EMU32B,
292
EMU_SRC_ALICE_EMU32B+1,
293
EMU_SRC_ALICE_EMU32B+2,
294
EMU_SRC_ALICE_EMU32B+3,
295
EMU_SRC_ALICE_EMU32B+4,
296
EMU_SRC_ALICE_EMU32B+5,
297
EMU_SRC_ALICE_EMU32B+6,
298
EMU_SRC_ALICE_EMU32B+7,
299
EMU_SRC_ALICE_EMU32B+8,
300
EMU_SRC_ALICE_EMU32B+9,
301
EMU_SRC_ALICE_EMU32B+0xa,
302
EMU_SRC_ALICE_EMU32B+0xb,
303
EMU_SRC_ALICE_EMU32B+0xc,
304
EMU_SRC_ALICE_EMU32B+0xd,
305
EMU_SRC_ALICE_EMU32B+0xe,
306
EMU_SRC_ALICE_EMU32B+0xf,
307
};
308
309
/*
310
* Data destinations - physical EMU outputs.
311
* Each destination has an enum mixer control to choose a data source
312
*/
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 */
338
};
339
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,
350
EMU_DST_MDOCK_ADAT,
351
EMU_DST_MDOCK_ADAT+1,
352
EMU_DST_MDOCK_ADAT+2,
353
EMU_DST_MDOCK_ADAT+3,
354
EMU_DST_MDOCK_ADAT+4,
355
EMU_DST_MDOCK_ADAT+5,
356
EMU_DST_MDOCK_ADAT+6,
357
EMU_DST_MDOCK_ADAT+7,
358
EMU_DST_MANA_DAC_LEFT,
359
EMU_DST_MANA_DAC_RIGHT,
360
};
361
362
/*
363
* Data destinations - HANA outputs going to Alice2 (audigy) for
364
* capture (EMU32 + I2S links)
365
* Each destination has an enum mixer control to choose a data source
366
*/
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,
390
};
391
392
static int snd_emu1010_input_output_source_info(struct snd_kcontrol *kcontrol,
393
struct snd_ctl_elem_info *uinfo)
394
{
395
struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
396
char **items;
397
398
uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
399
uinfo->count = 1;
400
if (emu->card_capabilities->emu_model == EMU_MODEL_EMU1616) {
401
uinfo->value.enumerated.items = 49;
402
items = emu1616_src_texts;
403
} else {
404
uinfo->value.enumerated.items = 53;
405
items = emu1010_src_texts;
406
}
407
if (uinfo->value.enumerated.item >= uinfo->value.enumerated.items)
408
uinfo->value.enumerated.item =
409
uinfo->value.enumerated.items - 1;
410
strcpy(uinfo->value.enumerated.name,
411
items[uinfo->value.enumerated.item]);
412
return 0;
413
}
414
415
static int snd_emu1010_output_source_get(struct snd_kcontrol *kcontrol,
416
struct snd_ctl_elem_value *ucontrol)
417
{
418
struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
419
unsigned int channel;
420
421
channel = (kcontrol->private_value) & 0xff;
422
/* Limit: emu1010_output_dst, emu->emu1010.output_source */
423
if (channel >= 24 ||
424
(emu->card_capabilities->emu_model == EMU_MODEL_EMU1616 &&
425
channel >= 18))
426
return -EINVAL;
427
ucontrol->value.enumerated.item[0] = emu->emu1010.output_source[channel];
428
return 0;
429
}
430
431
static int snd_emu1010_output_source_put(struct snd_kcontrol *kcontrol,
432
struct snd_ctl_elem_value *ucontrol)
433
{
434
struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
435
unsigned int val;
436
unsigned int channel;
437
438
val = ucontrol->value.enumerated.item[0];
439
if (val >= 53 ||
440
(emu->card_capabilities->emu_model == EMU_MODEL_EMU1616 &&
441
val >= 49))
442
return -EINVAL;
443
channel = (kcontrol->private_value) & 0xff;
444
/* Limit: emu1010_output_dst, emu->emu1010.output_source */
445
if (channel >= 24 ||
446
(emu->card_capabilities->emu_model == EMU_MODEL_EMU1616 &&
447
channel >= 18))
448
return -EINVAL;
449
if (emu->emu1010.output_source[channel] == val)
450
return 0;
451
emu->emu1010.output_source[channel] = val;
452
if (emu->card_capabilities->emu_model == EMU_MODEL_EMU1616)
453
snd_emu1010_fpga_link_dst_src_write(emu,
454
emu1616_output_dst[channel], emu1616_src_regs[val]);
455
else
456
snd_emu1010_fpga_link_dst_src_write(emu,
457
emu1010_output_dst[channel], emu1010_src_regs[val]);
458
return 1;
459
}
460
461
static int snd_emu1010_input_source_get(struct snd_kcontrol *kcontrol,
462
struct snd_ctl_elem_value *ucontrol)
463
{
464
struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
465
unsigned int channel;
466
467
channel = (kcontrol->private_value) & 0xff;
468
/* Limit: emu1010_input_dst, emu->emu1010.input_source */
469
if (channel >= 22)
470
return -EINVAL;
471
ucontrol->value.enumerated.item[0] = emu->emu1010.input_source[channel];
472
return 0;
473
}
474
475
static int snd_emu1010_input_source_put(struct snd_kcontrol *kcontrol,
476
struct snd_ctl_elem_value *ucontrol)
477
{
478
struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
479
unsigned int val;
480
unsigned int channel;
481
482
val = ucontrol->value.enumerated.item[0];
483
if (val >= 53 ||
484
(emu->card_capabilities->emu_model == EMU_MODEL_EMU1616 &&
485
val >= 49))
486
return -EINVAL;
487
channel = (kcontrol->private_value) & 0xff;
488
/* Limit: emu1010_input_dst, emu->emu1010.input_source */
489
if (channel >= 22)
490
return -EINVAL;
491
if (emu->emu1010.input_source[channel] == val)
492
return 0;
493
emu->emu1010.input_source[channel] = val;
494
if (emu->card_capabilities->emu_model == EMU_MODEL_EMU1616)
495
snd_emu1010_fpga_link_dst_src_write(emu,
496
emu1010_input_dst[channel], emu1616_src_regs[val]);
497
else
498
snd_emu1010_fpga_link_dst_src_write(emu,
499
emu1010_input_dst[channel], emu1010_src_regs[val]);
500
return 1;
501
}
502
503
#define EMU1010_SOURCE_OUTPUT(xname,chid) \
504
{ \
505
.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
506
.access = SNDRV_CTL_ELEM_ACCESS_READWRITE, \
507
.info = snd_emu1010_input_output_source_info, \
508
.get = snd_emu1010_output_source_get, \
509
.put = snd_emu1010_output_source_put, \
510
.private_value = chid \
511
}
512
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),
538
};
539
540
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),
561
};
562
563
564
#define EMU1010_SOURCE_INPUT(xname,chid) \
565
{ \
566
.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
567
.access = SNDRV_CTL_ELEM_ACCESS_READWRITE, \
568
.info = snd_emu1010_input_output_source_info, \
569
.get = snd_emu1010_input_source_get, \
570
.put = snd_emu1010_input_source_put, \
571
.private_value = chid \
572
}
573
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),
597
};
598
599
600
601
#define snd_emu1010_adc_pads_info snd_ctl_boolean_mono_info
602
603
static int snd_emu1010_adc_pads_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
604
{
605
struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
606
unsigned int mask = kcontrol->private_value & 0xff;
607
ucontrol->value.integer.value[0] = (emu->emu1010.adc_pads & mask) ? 1 : 0;
608
return 0;
609
}
610
611
static int snd_emu1010_adc_pads_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
612
{
613
struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
614
unsigned int mask = kcontrol->private_value & 0xff;
615
unsigned int val, cache;
616
val = ucontrol->value.integer.value[0];
617
cache = emu->emu1010.adc_pads;
618
if (val == 1)
619
cache = cache | mask;
620
else
621
cache = cache & ~mask;
622
if (cache != emu->emu1010.adc_pads) {
623
snd_emu1010_fpga_write(emu, EMU_HANA_ADC_PADS, cache );
624
emu->emu1010.adc_pads = cache;
625
}
626
627
return 0;
628
}
629
630
631
632
#define EMU1010_ADC_PADS(xname,chid) \
633
{ \
634
.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
635
.access = SNDRV_CTL_ELEM_ACCESS_READWRITE, \
636
.info = snd_emu1010_adc_pads_info, \
637
.get = snd_emu1010_adc_pads_get, \
638
.put = snd_emu1010_adc_pads_put, \
639
.private_value = chid \
640
}
641
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),
647
};
648
649
#define snd_emu1010_dac_pads_info snd_ctl_boolean_mono_info
650
651
static int snd_emu1010_dac_pads_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
652
{
653
struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
654
unsigned int mask = kcontrol->private_value & 0xff;
655
ucontrol->value.integer.value[0] = (emu->emu1010.dac_pads & mask) ? 1 : 0;
656
return 0;
657
}
658
659
static int snd_emu1010_dac_pads_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
660
{
661
struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
662
unsigned int mask = kcontrol->private_value & 0xff;
663
unsigned int val, cache;
664
val = ucontrol->value.integer.value[0];
665
cache = emu->emu1010.dac_pads;
666
if (val == 1)
667
cache = cache | mask;
668
else
669
cache = cache & ~mask;
670
if (cache != emu->emu1010.dac_pads) {
671
snd_emu1010_fpga_write(emu, EMU_HANA_DAC_PADS, cache );
672
emu->emu1010.dac_pads = cache;
673
}
674
675
return 0;
676
}
677
678
679
680
#define EMU1010_DAC_PADS(xname,chid) \
681
{ \
682
.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
683
.access = SNDRV_CTL_ELEM_ACCESS_READWRITE, \
684
.info = snd_emu1010_dac_pads_info, \
685
.get = snd_emu1010_dac_pads_get, \
686
.put = snd_emu1010_dac_pads_put, \
687
.private_value = chid \
688
}
689
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),
696
};
697
698
699
static int snd_emu1010_internal_clock_info(struct snd_kcontrol *kcontrol,
700
struct snd_ctl_elem_info *uinfo)
701
{
702
static char *texts[4] = {
703
"44100", "48000", "SPDIF", "ADAT"
704
};
705
706
uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
707
uinfo->count = 1;
708
uinfo->value.enumerated.items = 4;
709
if (uinfo->value.enumerated.item >= uinfo->value.enumerated.items)
710
uinfo->value.enumerated.item = uinfo->value.enumerated.items - 1;
711
strcpy(uinfo->value.enumerated.name, texts[uinfo->value.enumerated.item]);
712
return 0;
713
714
715
}
716
717
static int snd_emu1010_internal_clock_get(struct snd_kcontrol *kcontrol,
718
struct snd_ctl_elem_value *ucontrol)
719
{
720
struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
721
722
ucontrol->value.enumerated.item[0] = emu->emu1010.internal_clock;
723
return 0;
724
}
725
726
static int snd_emu1010_internal_clock_put(struct snd_kcontrol *kcontrol,
727
struct snd_ctl_elem_value *ucontrol)
728
{
729
struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
730
unsigned int val;
731
int change = 0;
732
733
val = ucontrol->value.enumerated.item[0] ;
734
/* Limit: uinfo->value.enumerated.items = 4; */
735
if (val >= 4)
736
return -EINVAL;
737
change = (emu->emu1010.internal_clock != val);
738
if (change) {
739
emu->emu1010.internal_clock = val;
740
switch (val) {
741
case 0:
742
/* 44100 */
743
/* Mute all */
744
snd_emu1010_fpga_write(emu, EMU_HANA_UNMUTE, EMU_MUTE );
745
/* Default fallback clock 48kHz */
746
snd_emu1010_fpga_write(emu, EMU_HANA_DEFCLOCK, EMU_HANA_DEFCLOCK_44_1K );
747
/* Word Clock source, Internal 44.1kHz x1 */
748
snd_emu1010_fpga_write(emu, EMU_HANA_WCLOCK,
749
EMU_HANA_WCLOCK_INT_44_1K | EMU_HANA_WCLOCK_1X );
750
/* Set LEDs on Audio Dock */
751
snd_emu1010_fpga_write(emu, EMU_HANA_DOCK_LEDS_2,
752
EMU_HANA_DOCK_LEDS_2_44K | EMU_HANA_DOCK_LEDS_2_LOCK );
753
/* Allow DLL to settle */
754
msleep(10);
755
/* Unmute all */
756
snd_emu1010_fpga_write(emu, EMU_HANA_UNMUTE, EMU_UNMUTE );
757
break;
758
case 1:
759
/* 48000 */
760
/* Mute all */
761
snd_emu1010_fpga_write(emu, EMU_HANA_UNMUTE, EMU_MUTE );
762
/* Default fallback clock 48kHz */
763
snd_emu1010_fpga_write(emu, EMU_HANA_DEFCLOCK, EMU_HANA_DEFCLOCK_48K );
764
/* Word Clock source, Internal 48kHz x1 */
765
snd_emu1010_fpga_write(emu, EMU_HANA_WCLOCK,
766
EMU_HANA_WCLOCK_INT_48K | EMU_HANA_WCLOCK_1X );
767
/* Set LEDs on Audio Dock */
768
snd_emu1010_fpga_write(emu, EMU_HANA_DOCK_LEDS_2,
769
EMU_HANA_DOCK_LEDS_2_48K | EMU_HANA_DOCK_LEDS_2_LOCK );
770
/* Allow DLL to settle */
771
msleep(10);
772
/* Unmute all */
773
snd_emu1010_fpga_write(emu, EMU_HANA_UNMUTE, EMU_UNMUTE );
774
break;
775
776
case 2: /* Take clock from S/PDIF IN */
777
/* Mute all */
778
snd_emu1010_fpga_write(emu, EMU_HANA_UNMUTE, EMU_MUTE );
779
/* Default fallback clock 48kHz */
780
snd_emu1010_fpga_write(emu, EMU_HANA_DEFCLOCK, EMU_HANA_DEFCLOCK_48K );
781
/* Word Clock source, sync to S/PDIF input */
782
snd_emu1010_fpga_write(emu, EMU_HANA_WCLOCK,
783
EMU_HANA_WCLOCK_HANA_SPDIF_IN | EMU_HANA_WCLOCK_1X );
784
/* Set LEDs on Audio Dock */
785
snd_emu1010_fpga_write(emu, EMU_HANA_DOCK_LEDS_2,
786
EMU_HANA_DOCK_LEDS_2_EXT | EMU_HANA_DOCK_LEDS_2_LOCK );
787
/* FIXME: We should set EMU_HANA_DOCK_LEDS_2_LOCK only when clock signal is present and valid */
788
/* Allow DLL to settle */
789
msleep(10);
790
/* Unmute all */
791
snd_emu1010_fpga_write(emu, EMU_HANA_UNMUTE, EMU_UNMUTE );
792
break;
793
794
case 3:
795
/* Take clock from ADAT IN */
796
/* Mute all */
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 */
807
msleep(10);
808
/* Unmute all */
809
snd_emu1010_fpga_write(emu, EMU_HANA_UNMUTE, EMU_UNMUTE );
810
811
812
break;
813
}
814
}
815
return change;
816
}
817
818
static struct snd_kcontrol_new snd_emu1010_internal_clock =
819
{
820
.access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
821
.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
822
.name = "Clock Internal Rate",
823
.count = 1,
824
.info = snd_emu1010_internal_clock_info,
825
.get = snd_emu1010_internal_clock_get,
826
.put = snd_emu1010_internal_clock_put
827
};
828
829
static int snd_audigy_i2c_capture_source_info(struct snd_kcontrol *kcontrol,
830
struct snd_ctl_elem_info *uinfo)
831
{
832
#if 0
833
static char *texts[4] = {
834
"Unknown1", "Unknown2", "Mic", "Line"
835
};
836
#endif
837
static char *texts[2] = {
838
"Mic", "Line"
839
};
840
841
uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
842
uinfo->count = 1;
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]);
847
return 0;
848
}
849
850
static int snd_audigy_i2c_capture_source_get(struct snd_kcontrol *kcontrol,
851
struct snd_ctl_elem_value *ucontrol)
852
{
853
struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
854
855
ucontrol->value.enumerated.item[0] = emu->i2c_capture_source;
856
return 0;
857
}
858
859
static int snd_audigy_i2c_capture_source_put(struct snd_kcontrol *kcontrol,
860
struct snd_ctl_elem_value *ucontrol)
861
{
862
struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
863
unsigned int source_id;
864
unsigned int ngain, ogain;
865
u32 gpio;
866
int change = 0;
867
unsigned long flags;
868
u32 source;
869
/* If the capture source has changed,
870
* update the capture volume from the cached value
871
* for the particular source.
872
*/
873
source_id = ucontrol->value.enumerated.item[0];
874
/* Limit: uinfo->value.enumerated.items = 2; */
875
/* emu->i2c_capture_volume */
876
if (source_id >= 2)
877
return -EINVAL;
878
change = (emu->i2c_capture_source != source_id);
879
if (change) {
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);
883
if (source_id==0)
884
outl(gpio | 0x4, emu->port + A_IOCFG);
885
else
886
outl(gpio & ~0x4, emu->port + A_IOCFG);
887
spin_unlock_irqrestore(&emu->emu_lock, flags);
888
889
ngain = emu->i2c_capture_volume[source_id][0]; /* Left */
890
ogain = emu->i2c_capture_volume[emu->i2c_capture_source][0]; /* Left */
891
if (ngain != ogain)
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 */
895
if (ngain != ogain)
896
snd_emu10k1_i2c_write(emu, ADC_ATTEN_ADCR, ((ngain) & 0xff));
897
898
source = 1 << (source_id + 2);
899
snd_emu10k1_i2c_write(emu, ADC_MUX, source); /* Set source */
900
emu->i2c_capture_source = source_id;
901
}
902
return change;
903
}
904
905
static struct snd_kcontrol_new snd_audigy_i2c_capture_source =
906
{
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
912
};
913
914
static int snd_audigy_i2c_volume_info(struct snd_kcontrol *kcontrol,
915
struct snd_ctl_elem_info *uinfo)
916
{
917
uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
918
uinfo->count = 2;
919
uinfo->value.integer.min = 0;
920
uinfo->value.integer.max = 255;
921
return 0;
922
}
923
924
static int snd_audigy_i2c_volume_get(struct snd_kcontrol *kcontrol,
925
struct snd_ctl_elem_value *ucontrol)
926
{
927
struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
928
unsigned int source_id;
929
930
source_id = kcontrol->private_value;
931
/* Limit: emu->i2c_capture_volume */
932
/* capture_source: uinfo->value.enumerated.items = 2 */
933
if (source_id >= 2)
934
return -EINVAL;
935
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];
938
return 0;
939
}
940
941
static int snd_audigy_i2c_volume_put(struct snd_kcontrol *kcontrol,
942
struct snd_ctl_elem_value *ucontrol)
943
{
944
struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
945
unsigned int ogain;
946
unsigned int ngain;
947
unsigned int source_id;
948
int change = 0;
949
950
source_id = kcontrol->private_value;
951
/* Limit: emu->i2c_capture_volume */
952
/* capture_source: uinfo->value.enumerated.items = 2 */
953
if (source_id >= 2)
954
return -EINVAL;
955
ogain = emu->i2c_capture_volume[source_id][0]; /* Left */
956
ngain = ucontrol->value.integer.value[0];
957
if (ngain > 0xff)
958
return 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;
963
change = 1;
964
}
965
ogain = emu->i2c_capture_volume[source_id][1]; /* Right */
966
ngain = ucontrol->value.integer.value[1];
967
if (ngain > 0xff)
968
return 0;
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;
973
change = 1;
974
}
975
976
return change;
977
}
978
979
#define I2C_VOLUME(xname,chid) \
980
{ \
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 \
989
}
990
991
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)
995
};
996
997
#if 0
998
static int snd_audigy_spdif_output_rate_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
999
{
1000
static char *texts[] = {"44100", "48000", "96000"};
1001
1002
uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
1003
uinfo->count = 1;
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]);
1008
return 0;
1009
}
1010
1011
static int snd_audigy_spdif_output_rate_get(struct snd_kcontrol *kcontrol,
1012
struct snd_ctl_elem_value *ucontrol)
1013
{
1014
struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1015
unsigned int tmp;
1016
unsigned long flags;
1017
1018
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) {
1022
case A_SPDIF_44100:
1023
ucontrol->value.enumerated.item[0] = 0;
1024
break;
1025
case A_SPDIF_48000:
1026
ucontrol->value.enumerated.item[0] = 1;
1027
break;
1028
case A_SPDIF_96000:
1029
ucontrol->value.enumerated.item[0] = 2;
1030
break;
1031
default:
1032
ucontrol->value.enumerated.item[0] = 1;
1033
}
1034
spin_unlock_irqrestore(&emu->reg_lock, flags);
1035
return 0;
1036
}
1037
1038
static int snd_audigy_spdif_output_rate_put(struct snd_kcontrol *kcontrol,
1039
struct snd_ctl_elem_value *ucontrol)
1040
{
1041
struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1042
int change;
1043
unsigned int reg, val, tmp;
1044
unsigned long flags;
1045
1046
switch(ucontrol->value.enumerated.item[0]) {
1047
case 0:
1048
val = A_SPDIF_44100;
1049
break;
1050
case 1:
1051
val = A_SPDIF_48000;
1052
break;
1053
case 2:
1054
val = A_SPDIF_96000;
1055
break;
1056
default:
1057
val = A_SPDIF_48000;
1058
break;
1059
}
1060
1061
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;
1065
tmp |= val;
1066
if ((change = (tmp != reg)))
1067
snd_emu10k1_ptr_write(emu, A_SPDIF_SAMPLERATE, 0, tmp);
1068
spin_unlock_irqrestore(&emu->reg_lock, flags);
1069
return change;
1070
}
1071
1072
static struct snd_kcontrol_new snd_audigy_spdif_output_rate =
1073
{
1074
.access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
1075
.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1076
.name = "Audigy SPDIF Output Sample Rate",
1077
.count = 1,
1078
.info = snd_audigy_spdif_output_rate_info,
1079
.get = snd_audigy_spdif_output_rate_get,
1080
.put = snd_audigy_spdif_output_rate_put
1081
};
1082
#endif
1083
1084
static int snd_emu10k1_spdif_put(struct snd_kcontrol *kcontrol,
1085
struct snd_ctl_elem_value *ucontrol)
1086
{
1087
struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1088
unsigned int idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
1089
int change;
1090
unsigned int val;
1091
unsigned long flags;
1092
1093
/* Limit: emu->spdif_bits */
1094
if (idx >= 3)
1095
return -EINVAL;
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];
1102
if (change) {
1103
snd_emu10k1_ptr_write(emu, SPCS0 + idx, 0, val);
1104
emu->spdif_bits[idx] = val;
1105
}
1106
spin_unlock_irqrestore(&emu->reg_lock, flags);
1107
return change;
1108
}
1109
1110
static struct snd_kcontrol_new snd_emu10k1_spdif_mask_control =
1111
{
1112
.access = SNDRV_CTL_ELEM_ACCESS_READ,
1113
.iface = SNDRV_CTL_ELEM_IFACE_PCM,
1114
.name = SNDRV_CTL_NAME_IEC958("",PLAYBACK,MASK),
1115
.count = 3,
1116
.info = snd_emu10k1_spdif_info,
1117
.get = snd_emu10k1_spdif_get_mask
1118
};
1119
1120
static struct snd_kcontrol_new snd_emu10k1_spdif_control =
1121
{
1122
.iface = SNDRV_CTL_ELEM_IFACE_PCM,
1123
.name = SNDRV_CTL_NAME_IEC958("",PLAYBACK,DEFAULT),
1124
.count = 3,
1125
.info = snd_emu10k1_spdif_info,
1126
.get = snd_emu10k1_spdif_get,
1127
.put = snd_emu10k1_spdif_put
1128
};
1129
1130
1131
static void update_emu10k1_fxrt(struct snd_emu10k1 *emu, int voice, unsigned char *route)
1132
{
1133
if (emu->audigy) {
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));
1138
} else {
1139
snd_emu10k1_ptr_write(emu, FXRT, voice,
1140
snd_emu10k1_compose_send_routing(route));
1141
}
1142
}
1143
1144
static void update_emu10k1_send_volume(struct snd_emu10k1 *emu, int voice, unsigned char *volume)
1145
{
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]);
1150
if (emu->audigy) {
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);
1156
}
1157
}
1158
1159
/* PCM stream controls */
1160
1161
static int snd_emu10k1_send_routing_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
1162
{
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;
1168
return 0;
1169
}
1170
1171
static int snd_emu10k1_send_routing_get(struct snd_kcontrol *kcontrol,
1172
struct snd_ctl_elem_value *ucontrol)
1173
{
1174
unsigned long flags;
1175
struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1176
struct snd_emu10k1_pcm_mixer *mix =
1177
&emu->pcm_mixer[snd_ctl_get_ioffidx(kcontrol, &ucontrol->id)];
1178
int voice, idx;
1179
int num_efx = emu->audigy ? 8 : 4;
1180
int mask = emu->audigy ? 0x3f : 0x0f;
1181
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);
1188
return 0;
1189
}
1190
1191
static int snd_emu10k1_send_routing_put(struct snd_kcontrol *kcontrol,
1192
struct snd_ctl_elem_value *ucontrol)
1193
{
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;
1201
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;
1208
change = 1;
1209
}
1210
}
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]);
1220
}
1221
}
1222
spin_unlock_irqrestore(&emu->reg_lock, flags);
1223
return change;
1224
}
1225
1226
static struct snd_kcontrol_new snd_emu10k1_send_routing_control =
1227
{
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",
1231
.count = 32,
1232
.info = snd_emu10k1_send_routing_info,
1233
.get = snd_emu10k1_send_routing_get,
1234
.put = snd_emu10k1_send_routing_put
1235
};
1236
1237
static int snd_emu10k1_send_volume_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
1238
{
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;
1244
return 0;
1245
}
1246
1247
static int snd_emu10k1_send_volume_get(struct snd_kcontrol *kcontrol,
1248
struct snd_ctl_elem_value *ucontrol)
1249
{
1250
unsigned long flags;
1251
struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1252
struct snd_emu10k1_pcm_mixer *mix =
1253
&emu->pcm_mixer[snd_ctl_get_ioffidx(kcontrol, &ucontrol->id)];
1254
int idx;
1255
int num_efx = emu->audigy ? 8 : 4;
1256
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);
1261
return 0;
1262
}
1263
1264
static int snd_emu10k1_send_volume_put(struct snd_kcontrol *kcontrol,
1265
struct snd_ctl_elem_value *ucontrol)
1266
{
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;
1273
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;
1279
change = 1;
1280
}
1281
}
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]);
1291
}
1292
}
1293
spin_unlock_irqrestore(&emu->reg_lock, flags);
1294
return change;
1295
}
1296
1297
static struct snd_kcontrol_new snd_emu10k1_send_volume_control =
1298
{
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",
1302
.count = 32,
1303
.info = snd_emu10k1_send_volume_info,
1304
.get = snd_emu10k1_send_volume_get,
1305
.put = snd_emu10k1_send_volume_put
1306
};
1307
1308
static int snd_emu10k1_attn_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
1309
{
1310
uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
1311
uinfo->count = 3;
1312
uinfo->value.integer.min = 0;
1313
uinfo->value.integer.max = 0xffff;
1314
return 0;
1315
}
1316
1317
static int snd_emu10k1_attn_get(struct snd_kcontrol *kcontrol,
1318
struct snd_ctl_elem_value *ucontrol)
1319
{
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;
1324
int idx;
1325
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);
1330
return 0;
1331
}
1332
1333
static int snd_emu10k1_attn_put(struct snd_kcontrol *kcontrol,
1334
struct snd_ctl_elem_value *ucontrol)
1335
{
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;
1341
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;
1347
change = 1;
1348
}
1349
}
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]);
1356
}
1357
}
1358
spin_unlock_irqrestore(&emu->reg_lock, flags);
1359
return change;
1360
}
1361
1362
static struct snd_kcontrol_new snd_emu10k1_attn_control =
1363
{
1364
.access = SNDRV_CTL_ELEM_ACCESS_READWRITE | SNDRV_CTL_ELEM_ACCESS_INACTIVE,
1365
.iface = SNDRV_CTL_ELEM_IFACE_PCM,
1366
.name = "EMU10K1 PCM Volume",
1367
.count = 32,
1368
.info = snd_emu10k1_attn_info,
1369
.get = snd_emu10k1_attn_get,
1370
.put = snd_emu10k1_attn_put
1371
};
1372
1373
/* Mutichannel PCM stream controls */
1374
1375
static int snd_emu10k1_efx_send_routing_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
1376
{
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;
1382
return 0;
1383
}
1384
1385
static int snd_emu10k1_efx_send_routing_get(struct snd_kcontrol *kcontrol,
1386
struct snd_ctl_elem_value *ucontrol)
1387
{
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)];
1392
int idx;
1393
int num_efx = emu->audigy ? 8 : 4;
1394
int mask = emu->audigy ? 0x3f : 0x0f;
1395
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);
1401
return 0;
1402
}
1403
1404
static int snd_emu10k1_efx_send_routing_put(struct snd_kcontrol *kcontrol,
1405
struct snd_ctl_elem_value *ucontrol)
1406
{
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;
1414
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;
1420
change = 1;
1421
}
1422
}
1423
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]);
1428
}
1429
}
1430
spin_unlock_irqrestore(&emu->reg_lock, flags);
1431
return change;
1432
}
1433
1434
static struct snd_kcontrol_new snd_emu10k1_efx_send_routing_control =
1435
{
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",
1439
.count = 16,
1440
.info = snd_emu10k1_efx_send_routing_info,
1441
.get = snd_emu10k1_efx_send_routing_get,
1442
.put = snd_emu10k1_efx_send_routing_put
1443
};
1444
1445
static int snd_emu10k1_efx_send_volume_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
1446
{
1447
struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1448
uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
1449
uinfo->count = emu->audigy ? 8 : 4;
1450
uinfo->value.integer.min = 0;
1451
uinfo->value.integer.max = 255;
1452
return 0;
1453
}
1454
1455
static int snd_emu10k1_efx_send_volume_get(struct snd_kcontrol *kcontrol,
1456
struct snd_ctl_elem_value *ucontrol)
1457
{
1458
unsigned long flags;
1459
struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1460
struct snd_emu10k1_pcm_mixer *mix =
1461
&emu->efx_pcm_mixer[snd_ctl_get_ioffidx(kcontrol, &ucontrol->id)];
1462
int idx;
1463
int num_efx = emu->audigy ? 8 : 4;
1464
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);
1469
return 0;
1470
}
1471
1472
static int snd_emu10k1_efx_send_volume_put(struct snd_kcontrol *kcontrol,
1473
struct snd_ctl_elem_value *ucontrol)
1474
{
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;
1481
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;
1487
change = 1;
1488
}
1489
}
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]);
1494
}
1495
}
1496
spin_unlock_irqrestore(&emu->reg_lock, flags);
1497
return change;
1498
}
1499
1500
1501
static struct snd_kcontrol_new snd_emu10k1_efx_send_volume_control =
1502
{
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",
1506
.count = 16,
1507
.info = snd_emu10k1_efx_send_volume_info,
1508
.get = snd_emu10k1_efx_send_volume_get,
1509
.put = snd_emu10k1_efx_send_volume_put
1510
};
1511
1512
static int snd_emu10k1_efx_attn_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
1513
{
1514
uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
1515
uinfo->count = 1;
1516
uinfo->value.integer.min = 0;
1517
uinfo->value.integer.max = 0xffff;
1518
return 0;
1519
}
1520
1521
static int snd_emu10k1_efx_attn_get(struct snd_kcontrol *kcontrol,
1522
struct snd_ctl_elem_value *ucontrol)
1523
{
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;
1528
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);
1532
return 0;
1533
}
1534
1535
static int snd_emu10k1_efx_attn_put(struct snd_kcontrol *kcontrol,
1536
struct snd_ctl_elem_value *ucontrol)
1537
{
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;
1543
1544
spin_lock_irqsave(&emu->reg_lock, flags);
1545
val = ucontrol->value.integer.value[0] & 0xffff;
1546
if (mix->attn[0] != val) {
1547
mix->attn[0] = val;
1548
change = 1;
1549
}
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]);
1553
}
1554
}
1555
spin_unlock_irqrestore(&emu->reg_lock, flags);
1556
return change;
1557
}
1558
1559
static struct snd_kcontrol_new snd_emu10k1_efx_attn_control =
1560
{
1561
.access = SNDRV_CTL_ELEM_ACCESS_READWRITE | SNDRV_CTL_ELEM_ACCESS_INACTIVE,
1562
.iface = SNDRV_CTL_ELEM_IFACE_PCM,
1563
.name = "Multichannel PCM Volume",
1564
.count = 16,
1565
.info = snd_emu10k1_efx_attn_info,
1566
.get = snd_emu10k1_efx_attn_get,
1567
.put = snd_emu10k1_efx_attn_put
1568
};
1569
1570
#define snd_emu10k1_shared_spdif_info snd_ctl_boolean_mono_info
1571
1572
static int snd_emu10k1_shared_spdif_get(struct snd_kcontrol *kcontrol,
1573
struct snd_ctl_elem_value *ucontrol)
1574
{
1575
struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1576
1577
if (emu->audigy)
1578
ucontrol->value.integer.value[0] = inl(emu->port + A_IOCFG) & A_IOCFG_GPOUT0 ? 1 : 0;
1579
else
1580
ucontrol->value.integer.value[0] = inl(emu->port + HCFG) & HCFG_GPOUT0 ? 1 : 0;
1581
if (emu->card_capabilities->invert_shared_spdif)
1582
ucontrol->value.integer.value[0] =
1583
!ucontrol->value.integer.value[0];
1584
1585
return 0;
1586
}
1587
1588
static int snd_emu10k1_shared_spdif_put(struct snd_kcontrol *kcontrol,
1589
struct snd_ctl_elem_value *ucontrol)
1590
{
1591
unsigned long flags;
1592
struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1593
unsigned int reg, val, sw;
1594
int change = 0;
1595
1596
sw = ucontrol->value.integer.value[0];
1597
if (emu->card_capabilities->invert_shared_spdif)
1598
sw = !sw;
1599
spin_lock_irqsave(&emu->reg_lock, flags);
1600
if ( emu->card_capabilities->i2c_adc) {
1601
/* Do nothing for Audigy 2 ZS Notebook */
1602
} else if (emu->audigy) {
1603
reg = inl(emu->port + A_IOCFG);
1604
val = sw ? A_IOCFG_GPOUT0 : 0;
1605
change = (reg & A_IOCFG_GPOUT0) != val;
1606
if (change) {
1607
reg &= ~A_IOCFG_GPOUT0;
1608
reg |= val;
1609
outl(reg | val, emu->port + A_IOCFG);
1610
}
1611
}
1612
reg = inl(emu->port + HCFG);
1613
val = sw ? HCFG_GPOUT0 : 0;
1614
change |= (reg & HCFG_GPOUT0) != val;
1615
if (change) {
1616
reg &= ~HCFG_GPOUT0;
1617
reg |= val;
1618
outl(reg | val, emu->port + HCFG);
1619
}
1620
spin_unlock_irqrestore(&emu->reg_lock, flags);
1621
return change;
1622
}
1623
1624
static struct snd_kcontrol_new snd_emu10k1_shared_spdif __devinitdata =
1625
{
1626
.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1627
.name = "SB Live Analog/Digital Output Jack",
1628
.info = snd_emu10k1_shared_spdif_info,
1629
.get = snd_emu10k1_shared_spdif_get,
1630
.put = snd_emu10k1_shared_spdif_put
1631
};
1632
1633
static struct snd_kcontrol_new snd_audigy_shared_spdif __devinitdata =
1634
{
1635
.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1636
.name = "Audigy Analog/Digital Output Jack",
1637
.info = snd_emu10k1_shared_spdif_info,
1638
.get = snd_emu10k1_shared_spdif_get,
1639
.put = snd_emu10k1_shared_spdif_put
1640
};
1641
1642
/* workaround for too low volume on Audigy due to 16bit/24bit conversion */
1643
1644
#define snd_audigy_capture_boost_info snd_ctl_boolean_mono_info
1645
1646
static int snd_audigy_capture_boost_get(struct snd_kcontrol *kcontrol,
1647
struct snd_ctl_elem_value *ucontrol)
1648
{
1649
struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1650
unsigned int val;
1651
1652
/* FIXME: better to use a cached version */
1653
val = snd_ac97_read(emu->ac97, AC97_REC_GAIN);
1654
ucontrol->value.integer.value[0] = !!val;
1655
return 0;
1656
}
1657
1658
static int snd_audigy_capture_boost_put(struct snd_kcontrol *kcontrol,
1659
struct snd_ctl_elem_value *ucontrol)
1660
{
1661
struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1662
unsigned int val;
1663
1664
if (ucontrol->value.integer.value[0])
1665
val = 0x0f0f;
1666
else
1667
val = 0;
1668
return snd_ac97_update(emu->ac97, AC97_REC_GAIN, val);
1669
}
1670
1671
static struct snd_kcontrol_new snd_audigy_capture_boost __devinitdata =
1672
{
1673
.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1674
.name = "Analog Capture Boost",
1675
.info = snd_audigy_capture_boost_info,
1676
.get = snd_audigy_capture_boost_get,
1677
.put = snd_audigy_capture_boost_put
1678
};
1679
1680
1681
/*
1682
*/
1683
static void snd_emu10k1_mixer_free_ac97(struct snd_ac97 *ac97)
1684
{
1685
struct snd_emu10k1 *emu = ac97->private_data;
1686
emu->ac97 = NULL;
1687
}
1688
1689
/*
1690
*/
1691
static int remove_ctl(struct snd_card *card, const char *name)
1692
{
1693
struct snd_ctl_elem_id id;
1694
memset(&id, 0, sizeof(id));
1695
strcpy(id.name, name);
1696
id.iface = SNDRV_CTL_ELEM_IFACE_MIXER;
1697
return snd_ctl_remove_id(card, &id);
1698
}
1699
1700
static struct snd_kcontrol *ctl_find(struct snd_card *card, const char *name)
1701
{
1702
struct snd_ctl_elem_id sid;
1703
memset(&sid, 0, sizeof(sid));
1704
strcpy(sid.name, name);
1705
sid.iface = SNDRV_CTL_ELEM_IFACE_MIXER;
1706
return snd_ctl_find_id(card, &sid);
1707
}
1708
1709
static int rename_ctl(struct snd_card *card, const char *src, const char *dst)
1710
{
1711
struct snd_kcontrol *kctl = ctl_find(card, src);
1712
if (kctl) {
1713
strcpy(kctl->id.name, dst);
1714
return 0;
1715
}
1716
return -ENOENT;
1717
}
1718
1719
int __devinit snd_emu10k1_mixer(struct snd_emu10k1 *emu,
1720
int pcm_device, int multi_device)
1721
{
1722
int err, pcm;
1723
struct snd_kcontrol *kctl;
1724
struct snd_card *card = emu->card;
1725
char **c;
1726
static char *emu10k1_remove_ctls[] = {
1727
/* no AC97 mono, surround, center/lfe */
1728
"Master Mono Playback Switch",
1729
"Master Mono Playback Volume",
1730
"PCM Out Path & Mute",
1731
"Mono Output Select",
1732
"Surround Playback Switch",
1733
"Surround Playback Volume",
1734
"Center Playback Switch",
1735
"Center Playback Volume",
1736
"LFE Playback Switch",
1737
"LFE Playback Volume",
1738
NULL
1739
};
1740
static char *emu10k1_rename_ctls[] = {
1741
"Surround Digital Playback Volume", "Surround Playback Volume",
1742
"Center Digital Playback Volume", "Center Playback Volume",
1743
"LFE Digital Playback Volume", "LFE Playback Volume",
1744
NULL
1745
};
1746
static char *audigy_remove_ctls[] = {
1747
/* Master/PCM controls on ac97 of Audigy has no effect */
1748
/* On the Audigy2 the AC97 playback is piped into
1749
* the Philips ADC for 24bit capture */
1750
"PCM Playback Switch",
1751
"PCM Playback Volume",
1752
"Master Mono Playback Switch",
1753
"Master Mono Playback Volume",
1754
"Master Playback Switch",
1755
"Master Playback Volume",
1756
"PCM Out Path & Mute",
1757
"Mono Output Select",
1758
/* remove unused AC97 capture controls */
1759
"Capture Source",
1760
"Capture Switch",
1761
"Capture Volume",
1762
"Mic Select",
1763
"Video Playback Switch",
1764
"Video Playback Volume",
1765
"Mic Playback Switch",
1766
"Mic Playback Volume",
1767
NULL
1768
};
1769
static char *audigy_rename_ctls[] = {
1770
/* use conventional names */
1771
"Wave Playback Volume", "PCM Playback Volume",
1772
/* "Wave Capture Volume", "PCM Capture Volume", */
1773
"Wave Master Playback Volume", "Master Playback Volume",
1774
"AMic Playback Volume", "Mic Playback Volume",
1775
NULL
1776
};
1777
static char *audigy_rename_ctls_i2c_adc[] = {
1778
//"Analog Mix Capture Volume","OLD Analog Mix Capture Volume",
1779
"Line Capture Volume", "Analog Mix Capture Volume",
1780
"Wave Playback Volume", "OLD PCM Playback Volume",
1781
"Wave Master Playback Volume", "Master Playback Volume",
1782
"AMic Playback Volume", "Old Mic Playback Volume",
1783
"CD Capture Volume", "IEC958 Optical Capture Volume",
1784
NULL
1785
};
1786
static char *audigy_remove_ctls_i2c_adc[] = {
1787
/* On the Audigy2 ZS Notebook
1788
* Capture via WM8775 */
1789
"Mic Capture Volume",
1790
"Analog Mix Capture Volume",
1791
"Aux Capture Volume",
1792
"IEC958 Optical Capture Volume",
1793
NULL
1794
};
1795
static char *audigy_remove_ctls_1361t_adc[] = {
1796
/* On the Audigy2 the AC97 playback is piped into
1797
* the Philips ADC for 24bit capture */
1798
"PCM Playback Switch",
1799
"PCM Playback Volume",
1800
"Master Mono Playback Switch",
1801
"Master Mono Playback Volume",
1802
"Capture Source",
1803
"Capture Switch",
1804
"Capture Volume",
1805
"Mic Capture Volume",
1806
"Headphone Playback Switch",
1807
"Headphone Playback Volume",
1808
"3D Control - Center",
1809
"3D Control - Depth",
1810
"3D Control - Switch",
1811
"Line2 Playback Volume",
1812
"Line2 Capture Volume",
1813
NULL
1814
};
1815
static char *audigy_rename_ctls_1361t_adc[] = {
1816
"Master Playback Switch", "Master Capture Switch",
1817
"Master Playback Volume", "Master Capture Volume",
1818
"Wave Master Playback Volume", "Master Playback Volume",
1819
"Beep Playback Switch", "Beep Capture Switch",
1820
"Beep Playback Volume", "Beep Capture Volume",
1821
"Phone Playback Switch", "Phone Capture Switch",
1822
"Phone Playback Volume", "Phone Capture Volume",
1823
"Mic Playback Switch", "Mic Capture Switch",
1824
"Mic Playback Volume", "Mic Capture Volume",
1825
"Line Playback Switch", "Line Capture Switch",
1826
"Line Playback Volume", "Line Capture Volume",
1827
"CD Playback Switch", "CD Capture Switch",
1828
"CD Playback Volume", "CD Capture Volume",
1829
"Aux Playback Switch", "Aux Capture Switch",
1830
"Aux Playback Volume", "Aux Capture Volume",
1831
"Video Playback Switch", "Video Capture Switch",
1832
"Video Playback Volume", "Video Capture Volume",
1833
1834
NULL
1835
};
1836
1837
if (emu->card_capabilities->ac97_chip) {
1838
struct snd_ac97_bus *pbus;
1839
struct snd_ac97_template ac97;
1840
static struct snd_ac97_bus_ops ops = {
1841
.write = snd_emu10k1_ac97_write,
1842
.read = snd_emu10k1_ac97_read,
1843
};
1844
1845
if ((err = snd_ac97_bus(emu->card, 0, &ops, NULL, &pbus)) < 0)
1846
return err;
1847
pbus->no_vra = 1; /* we don't need VRA */
1848
1849
memset(&ac97, 0, sizeof(ac97));
1850
ac97.private_data = emu;
1851
ac97.private_free = snd_emu10k1_mixer_free_ac97;
1852
ac97.scaps = AC97_SCAP_NO_SPDIF;
1853
if ((err = snd_ac97_mixer(pbus, &ac97, &emu->ac97)) < 0) {
1854
if (emu->card_capabilities->ac97_chip == 1)
1855
return err;
1856
snd_printd(KERN_INFO "emu10k1: AC97 is optional on this board\n");
1857
snd_printd(KERN_INFO" Proceeding without ac97 mixers...\n");
1858
snd_device_free(emu->card, pbus);
1859
goto no_ac97; /* FIXME: get rid of ugly gotos.. */
1860
}
1861
if (emu->audigy) {
1862
/* set master volume to 0 dB */
1863
snd_ac97_write_cache(emu->ac97, AC97_MASTER, 0x0000);
1864
/* set capture source to mic */
1865
snd_ac97_write_cache(emu->ac97, AC97_REC_SEL, 0x0000);
1866
if (emu->card_capabilities->adc_1361t)
1867
c = audigy_remove_ctls_1361t_adc;
1868
else
1869
c = audigy_remove_ctls;
1870
} else {
1871
/*
1872
* Credits for cards based on STAC9758:
1873
* James Courtier-Dutton <[email protected]>
1874
* Voluspa <[email protected]>
1875
*/
1876
if (emu->ac97->id == AC97_ID_STAC9758) {
1877
emu->rear_ac97 = 1;
1878
snd_emu10k1_ptr_write(emu, AC97SLOT, 0, AC97SLOT_CNTR|AC97SLOT_LFE|AC97SLOT_REAR_LEFT|AC97SLOT_REAR_RIGHT);
1879
snd_ac97_write_cache(emu->ac97, AC97_HEADPHONE, 0x0202);
1880
remove_ctl(card,"Front Playback Volume");
1881
remove_ctl(card,"Front Playback Switch");
1882
}
1883
/* remove unused AC97 controls */
1884
snd_ac97_write_cache(emu->ac97, AC97_SURROUND_MASTER, 0x0202);
1885
snd_ac97_write_cache(emu->ac97, AC97_CENTER_LFE_MASTER, 0x0202);
1886
c = emu10k1_remove_ctls;
1887
}
1888
for (; *c; c++)
1889
remove_ctl(card, *c);
1890
} else if (emu->card_capabilities->i2c_adc) {
1891
c = audigy_remove_ctls_i2c_adc;
1892
for (; *c; c++)
1893
remove_ctl(card, *c);
1894
} else {
1895
no_ac97:
1896
if (emu->card_capabilities->ecard)
1897
strcpy(emu->card->mixername, "EMU APS");
1898
else if (emu->audigy)
1899
strcpy(emu->card->mixername, "SB Audigy");
1900
else
1901
strcpy(emu->card->mixername, "Emu10k1");
1902
}
1903
1904
if (emu->audigy)
1905
if (emu->card_capabilities->adc_1361t)
1906
c = audigy_rename_ctls_1361t_adc;
1907
else if (emu->card_capabilities->i2c_adc)
1908
c = audigy_rename_ctls_i2c_adc;
1909
else
1910
c = audigy_rename_ctls;
1911
else
1912
c = emu10k1_rename_ctls;
1913
for (; *c; c += 2)
1914
rename_ctl(card, c[0], c[1]);
1915
1916
if (emu->card_capabilities->subsystem == 0x80401102) { /* SB Live! Platinum CT4760P */
1917
remove_ctl(card, "Center Playback Volume");
1918
remove_ctl(card, "LFE Playback Volume");
1919
remove_ctl(card, "Wave Center Playback Volume");
1920
remove_ctl(card, "Wave LFE Playback Volume");
1921
}
1922
if (emu->card_capabilities->subsystem == 0x20071102) { /* Audigy 4 Pro */
1923
rename_ctl(card, "Line2 Capture Volume", "Line1/Mic Capture Volume");
1924
rename_ctl(card, "Analog Mix Capture Volume", "Line2 Capture Volume");
1925
rename_ctl(card, "Aux2 Capture Volume", "Line3 Capture Volume");
1926
rename_ctl(card, "Mic Capture Volume", "Unknown1 Capture Volume");
1927
remove_ctl(card, "Headphone Playback Switch");
1928
remove_ctl(card, "Headphone Playback Volume");
1929
remove_ctl(card, "3D Control - Center");
1930
remove_ctl(card, "3D Control - Depth");
1931
remove_ctl(card, "3D Control - Switch");
1932
}
1933
if ((kctl = emu->ctl_send_routing = snd_ctl_new1(&snd_emu10k1_send_routing_control, emu)) == NULL)
1934
return -ENOMEM;
1935
kctl->id.device = pcm_device;
1936
if ((err = snd_ctl_add(card, kctl)))
1937
return err;
1938
if ((kctl = emu->ctl_send_volume = snd_ctl_new1(&snd_emu10k1_send_volume_control, emu)) == NULL)
1939
return -ENOMEM;
1940
kctl->id.device = pcm_device;
1941
if ((err = snd_ctl_add(card, kctl)))
1942
return err;
1943
if ((kctl = emu->ctl_attn = snd_ctl_new1(&snd_emu10k1_attn_control, emu)) == NULL)
1944
return -ENOMEM;
1945
kctl->id.device = pcm_device;
1946
if ((err = snd_ctl_add(card, kctl)))
1947
return err;
1948
1949
if ((kctl = emu->ctl_efx_send_routing = snd_ctl_new1(&snd_emu10k1_efx_send_routing_control, emu)) == NULL)
1950
return -ENOMEM;
1951
kctl->id.device = multi_device;
1952
if ((err = snd_ctl_add(card, kctl)))
1953
return err;
1954
1955
if ((kctl = emu->ctl_efx_send_volume = snd_ctl_new1(&snd_emu10k1_efx_send_volume_control, emu)) == NULL)
1956
return -ENOMEM;
1957
kctl->id.device = multi_device;
1958
if ((err = snd_ctl_add(card, kctl)))
1959
return err;
1960
1961
if ((kctl = emu->ctl_efx_attn = snd_ctl_new1(&snd_emu10k1_efx_attn_control, emu)) == NULL)
1962
return -ENOMEM;
1963
kctl->id.device = multi_device;
1964
if ((err = snd_ctl_add(card, kctl)))
1965
return err;
1966
1967
/* initialize the routing and volume table for each pcm playback stream */
1968
for (pcm = 0; pcm < 32; pcm++) {
1969
struct snd_emu10k1_pcm_mixer *mix;
1970
int v;
1971
1972
mix = &emu->pcm_mixer[pcm];
1973
mix->epcm = NULL;
1974
1975
for (v = 0; v < 4; v++)
1976
mix->send_routing[0][v] =
1977
mix->send_routing[1][v] =
1978
mix->send_routing[2][v] = v;
1979
1980
memset(&mix->send_volume, 0, sizeof(mix->send_volume));
1981
mix->send_volume[0][0] = mix->send_volume[0][1] =
1982
mix->send_volume[1][0] = mix->send_volume[2][1] = 255;
1983
1984
mix->attn[0] = mix->attn[1] = mix->attn[2] = 0xffff;
1985
}
1986
1987
/* initialize the routing and volume table for the multichannel playback stream */
1988
for (pcm = 0; pcm < NUM_EFX_PLAYBACK; pcm++) {
1989
struct snd_emu10k1_pcm_mixer *mix;
1990
int v;
1991
1992
mix = &emu->efx_pcm_mixer[pcm];
1993
mix->epcm = NULL;
1994
1995
mix->send_routing[0][0] = pcm;
1996
mix->send_routing[0][1] = (pcm == 0) ? 1 : 0;
1997
for (v = 0; v < 2; v++)
1998
mix->send_routing[0][2+v] = 13+v;
1999
if (emu->audigy)
2000
for (v = 0; v < 4; v++)
2001
mix->send_routing[0][4+v] = 60+v;
2002
2003
memset(&mix->send_volume, 0, sizeof(mix->send_volume));
2004
mix->send_volume[0][0] = 255;
2005
2006
mix->attn[0] = 0xffff;
2007
}
2008
2009
if (! emu->card_capabilities->ecard) { /* FIXME: APS has these controls? */
2010
/* sb live! and audigy */
2011
if ((kctl = snd_ctl_new1(&snd_emu10k1_spdif_mask_control, emu)) == NULL)
2012
return -ENOMEM;
2013
if (!emu->audigy)
2014
kctl->id.device = emu->pcm_efx->device;
2015
if ((err = snd_ctl_add(card, kctl)))
2016
return err;
2017
if ((kctl = snd_ctl_new1(&snd_emu10k1_spdif_control, emu)) == NULL)
2018
return -ENOMEM;
2019
if (!emu->audigy)
2020
kctl->id.device = emu->pcm_efx->device;
2021
if ((err = snd_ctl_add(card, kctl)))
2022
return err;
2023
}
2024
2025
if (emu->card_capabilities->emu_model) {
2026
; /* Disable the snd_audigy_spdif_shared_spdif */
2027
} else if (emu->audigy) {
2028
if ((kctl = snd_ctl_new1(&snd_audigy_shared_spdif, emu)) == NULL)
2029
return -ENOMEM;
2030
if ((err = snd_ctl_add(card, kctl)))
2031
return err;
2032
#if 0
2033
if ((kctl = snd_ctl_new1(&snd_audigy_spdif_output_rate, emu)) == NULL)
2034
return -ENOMEM;
2035
if ((err = snd_ctl_add(card, kctl)))
2036
return err;
2037
#endif
2038
} else if (! emu->card_capabilities->ecard) {
2039
/* sb live! */
2040
if ((kctl = snd_ctl_new1(&snd_emu10k1_shared_spdif, emu)) == NULL)
2041
return -ENOMEM;
2042
if ((err = snd_ctl_add(card, kctl)))
2043
return err;
2044
}
2045
if (emu->card_capabilities->ca0151_chip) { /* P16V */
2046
if ((err = snd_p16v_mixer(emu)))
2047
return err;
2048
}
2049
2050
if (emu->card_capabilities->emu_model == EMU_MODEL_EMU1616) {
2051
/* 1616(m) cardbus */
2052
int i;
2053
2054
for (i = 0; i < ARRAY_SIZE(snd_emu1616_output_enum_ctls); i++) {
2055
err = snd_ctl_add(card,
2056
snd_ctl_new1(&snd_emu1616_output_enum_ctls[i],
2057
emu));
2058
if (err < 0)
2059
return err;
2060
}
2061
for (i = 0; i < ARRAY_SIZE(snd_emu1010_input_enum_ctls); i++) {
2062
err = snd_ctl_add(card,
2063
snd_ctl_new1(&snd_emu1010_input_enum_ctls[i],
2064
emu));
2065
if (err < 0)
2066
return err;
2067
}
2068
for (i = 0; i < ARRAY_SIZE(snd_emu1010_adc_pads) - 2; i++) {
2069
err = snd_ctl_add(card,
2070
snd_ctl_new1(&snd_emu1010_adc_pads[i], emu));
2071
if (err < 0)
2072
return err;
2073
}
2074
for (i = 0; i < ARRAY_SIZE(snd_emu1010_dac_pads) - 2; i++) {
2075
err = snd_ctl_add(card,
2076
snd_ctl_new1(&snd_emu1010_dac_pads[i], emu));
2077
if (err < 0)
2078
return err;
2079
}
2080
err = snd_ctl_add(card,
2081
snd_ctl_new1(&snd_emu1010_internal_clock, emu));
2082
if (err < 0)
2083
return err;
2084
2085
} else if (emu->card_capabilities->emu_model) {
2086
/* all other e-mu cards for now */
2087
int i;
2088
2089
for (i = 0; i < ARRAY_SIZE(snd_emu1010_output_enum_ctls); i++) {
2090
err = snd_ctl_add(card,
2091
snd_ctl_new1(&snd_emu1010_output_enum_ctls[i],
2092
emu));
2093
if (err < 0)
2094
return err;
2095
}
2096
for (i = 0; i < ARRAY_SIZE(snd_emu1010_input_enum_ctls); i++) {
2097
err = snd_ctl_add(card,
2098
snd_ctl_new1(&snd_emu1010_input_enum_ctls[i],
2099
emu));
2100
if (err < 0)
2101
return err;
2102
}
2103
for (i = 0; i < ARRAY_SIZE(snd_emu1010_adc_pads); i++) {
2104
err = snd_ctl_add(card,
2105
snd_ctl_new1(&snd_emu1010_adc_pads[i], emu));
2106
if (err < 0)
2107
return err;
2108
}
2109
for (i = 0; i < ARRAY_SIZE(snd_emu1010_dac_pads); i++) {
2110
err = snd_ctl_add(card,
2111
snd_ctl_new1(&snd_emu1010_dac_pads[i], emu));
2112
if (err < 0)
2113
return err;
2114
}
2115
err = snd_ctl_add(card,
2116
snd_ctl_new1(&snd_emu1010_internal_clock, emu));
2117
if (err < 0)
2118
return err;
2119
}
2120
2121
if ( emu->card_capabilities->i2c_adc) {
2122
int i;
2123
2124
err = snd_ctl_add(card, snd_ctl_new1(&snd_audigy_i2c_capture_source, emu));
2125
if (err < 0)
2126
return err;
2127
2128
for (i = 0; i < ARRAY_SIZE(snd_audigy_i2c_volume_ctls); i++) {
2129
err = snd_ctl_add(card, snd_ctl_new1(&snd_audigy_i2c_volume_ctls[i], emu));
2130
if (err < 0)
2131
return err;
2132
}
2133
}
2134
2135
if (emu->card_capabilities->ac97_chip && emu->audigy) {
2136
err = snd_ctl_add(card, snd_ctl_new1(&snd_audigy_capture_boost,
2137
emu));
2138
if (err < 0)
2139
return err;
2140
}
2141
2142
return 0;
2143
}
2144
2145