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