Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/sound/pci/oxygen/oxygen_mixer.c
29266 views
1
// SPDX-License-Identifier: GPL-2.0-only
2
/*
3
* C-Media CMI8788 driver - mixer code
4
*
5
* Copyright (c) Clemens Ladisch <[email protected]>
6
*/
7
8
#include <linux/mutex.h>
9
#include <sound/ac97_codec.h>
10
#include <sound/asoundef.h>
11
#include <sound/control.h>
12
#include <sound/tlv.h>
13
#include "oxygen.h"
14
#include "cm9780.h"
15
16
static int dac_volume_info(struct snd_kcontrol *ctl,
17
struct snd_ctl_elem_info *info)
18
{
19
struct oxygen *chip = ctl->private_data;
20
21
info->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
22
info->count = chip->model.dac_channels_mixer;
23
info->value.integer.min = chip->model.dac_volume_min;
24
info->value.integer.max = chip->model.dac_volume_max;
25
return 0;
26
}
27
28
static int dac_volume_get(struct snd_kcontrol *ctl,
29
struct snd_ctl_elem_value *value)
30
{
31
struct oxygen *chip = ctl->private_data;
32
unsigned int i;
33
34
guard(mutex)(&chip->mutex);
35
for (i = 0; i < chip->model.dac_channels_mixer; ++i)
36
value->value.integer.value[i] = chip->dac_volume[i];
37
return 0;
38
}
39
40
static int dac_volume_put(struct snd_kcontrol *ctl,
41
struct snd_ctl_elem_value *value)
42
{
43
struct oxygen *chip = ctl->private_data;
44
unsigned int i;
45
int changed;
46
47
changed = 0;
48
guard(mutex)(&chip->mutex);
49
for (i = 0; i < chip->model.dac_channels_mixer; ++i)
50
if (value->value.integer.value[i] != chip->dac_volume[i]) {
51
chip->dac_volume[i] = value->value.integer.value[i];
52
changed = 1;
53
}
54
if (changed)
55
chip->model.update_dac_volume(chip);
56
return changed;
57
}
58
59
static int dac_mute_get(struct snd_kcontrol *ctl,
60
struct snd_ctl_elem_value *value)
61
{
62
struct oxygen *chip = ctl->private_data;
63
64
guard(mutex)(&chip->mutex);
65
value->value.integer.value[0] = !chip->dac_mute;
66
return 0;
67
}
68
69
static int dac_mute_put(struct snd_kcontrol *ctl,
70
struct snd_ctl_elem_value *value)
71
{
72
struct oxygen *chip = ctl->private_data;
73
int changed;
74
75
guard(mutex)(&chip->mutex);
76
changed = (!value->value.integer.value[0]) != chip->dac_mute;
77
if (changed) {
78
chip->dac_mute = !value->value.integer.value[0];
79
chip->model.update_dac_mute(chip);
80
}
81
return changed;
82
}
83
84
static unsigned int upmix_item_count(struct oxygen *chip)
85
{
86
if (chip->model.dac_channels_pcm < 8)
87
return 2;
88
else if (chip->model.update_center_lfe_mix)
89
return 5;
90
else
91
return 3;
92
}
93
94
static int upmix_info(struct snd_kcontrol *ctl, struct snd_ctl_elem_info *info)
95
{
96
static const char *const names[5] = {
97
"Front",
98
"Front+Surround",
99
"Front+Surround+Back",
100
"Front+Surround+Center/LFE",
101
"Front+Surround+Center/LFE+Back",
102
};
103
struct oxygen *chip = ctl->private_data;
104
unsigned int count = upmix_item_count(chip);
105
106
return snd_ctl_enum_info(info, 1, count, names);
107
}
108
109
static int upmix_get(struct snd_kcontrol *ctl, struct snd_ctl_elem_value *value)
110
{
111
struct oxygen *chip = ctl->private_data;
112
113
guard(mutex)(&chip->mutex);
114
value->value.enumerated.item[0] = chip->dac_routing;
115
return 0;
116
}
117
118
void oxygen_update_dac_routing(struct oxygen *chip)
119
{
120
/* DAC 0: front, DAC 1: surround, DAC 2: center/LFE, DAC 3: back */
121
static const unsigned int reg_values[5] = {
122
/* stereo -> front */
123
(0 << OXYGEN_PLAY_DAC0_SOURCE_SHIFT) |
124
(1 << OXYGEN_PLAY_DAC1_SOURCE_SHIFT) |
125
(2 << OXYGEN_PLAY_DAC2_SOURCE_SHIFT) |
126
(3 << OXYGEN_PLAY_DAC3_SOURCE_SHIFT),
127
/* stereo -> front+surround */
128
(0 << OXYGEN_PLAY_DAC0_SOURCE_SHIFT) |
129
(0 << OXYGEN_PLAY_DAC1_SOURCE_SHIFT) |
130
(2 << OXYGEN_PLAY_DAC2_SOURCE_SHIFT) |
131
(3 << OXYGEN_PLAY_DAC3_SOURCE_SHIFT),
132
/* stereo -> front+surround+back */
133
(0 << OXYGEN_PLAY_DAC0_SOURCE_SHIFT) |
134
(0 << OXYGEN_PLAY_DAC1_SOURCE_SHIFT) |
135
(2 << OXYGEN_PLAY_DAC2_SOURCE_SHIFT) |
136
(0 << OXYGEN_PLAY_DAC3_SOURCE_SHIFT),
137
/* stereo -> front+surround+center/LFE */
138
(0 << OXYGEN_PLAY_DAC0_SOURCE_SHIFT) |
139
(0 << OXYGEN_PLAY_DAC1_SOURCE_SHIFT) |
140
(0 << OXYGEN_PLAY_DAC2_SOURCE_SHIFT) |
141
(3 << OXYGEN_PLAY_DAC3_SOURCE_SHIFT),
142
/* stereo -> front+surround+center/LFE+back */
143
(0 << OXYGEN_PLAY_DAC0_SOURCE_SHIFT) |
144
(0 << OXYGEN_PLAY_DAC1_SOURCE_SHIFT) |
145
(0 << OXYGEN_PLAY_DAC2_SOURCE_SHIFT) |
146
(0 << OXYGEN_PLAY_DAC3_SOURCE_SHIFT),
147
};
148
u8 channels;
149
unsigned int reg_value;
150
151
channels = oxygen_read8(chip, OXYGEN_PLAY_CHANNELS) &
152
OXYGEN_PLAY_CHANNELS_MASK;
153
if (channels == OXYGEN_PLAY_CHANNELS_2)
154
reg_value = reg_values[chip->dac_routing];
155
else if (channels == OXYGEN_PLAY_CHANNELS_8)
156
/* in 7.1 mode, "rear" channels go to the "back" jack */
157
reg_value = (0 << OXYGEN_PLAY_DAC0_SOURCE_SHIFT) |
158
(3 << OXYGEN_PLAY_DAC1_SOURCE_SHIFT) |
159
(2 << OXYGEN_PLAY_DAC2_SOURCE_SHIFT) |
160
(1 << OXYGEN_PLAY_DAC3_SOURCE_SHIFT);
161
else
162
reg_value = (0 << OXYGEN_PLAY_DAC0_SOURCE_SHIFT) |
163
(1 << OXYGEN_PLAY_DAC1_SOURCE_SHIFT) |
164
(2 << OXYGEN_PLAY_DAC2_SOURCE_SHIFT) |
165
(3 << OXYGEN_PLAY_DAC3_SOURCE_SHIFT);
166
if (chip->model.adjust_dac_routing)
167
reg_value = chip->model.adjust_dac_routing(chip, reg_value);
168
oxygen_write16_masked(chip, OXYGEN_PLAY_ROUTING, reg_value,
169
OXYGEN_PLAY_DAC0_SOURCE_MASK |
170
OXYGEN_PLAY_DAC1_SOURCE_MASK |
171
OXYGEN_PLAY_DAC2_SOURCE_MASK |
172
OXYGEN_PLAY_DAC3_SOURCE_MASK);
173
if (chip->model.update_center_lfe_mix)
174
chip->model.update_center_lfe_mix(chip, chip->dac_routing > 2);
175
}
176
EXPORT_SYMBOL(oxygen_update_dac_routing);
177
178
static int upmix_put(struct snd_kcontrol *ctl, struct snd_ctl_elem_value *value)
179
{
180
struct oxygen *chip = ctl->private_data;
181
unsigned int count = upmix_item_count(chip);
182
int changed;
183
184
if (value->value.enumerated.item[0] >= count)
185
return -EINVAL;
186
guard(mutex)(&chip->mutex);
187
changed = value->value.enumerated.item[0] != chip->dac_routing;
188
if (changed) {
189
chip->dac_routing = value->value.enumerated.item[0];
190
oxygen_update_dac_routing(chip);
191
}
192
return changed;
193
}
194
195
static int spdif_switch_get(struct snd_kcontrol *ctl,
196
struct snd_ctl_elem_value *value)
197
{
198
struct oxygen *chip = ctl->private_data;
199
200
guard(mutex)(&chip->mutex);
201
value->value.integer.value[0] = chip->spdif_playback_enable;
202
return 0;
203
}
204
205
static unsigned int oxygen_spdif_rate(unsigned int oxygen_rate)
206
{
207
switch (oxygen_rate) {
208
case OXYGEN_RATE_32000:
209
return IEC958_AES3_CON_FS_32000 << OXYGEN_SPDIF_CS_RATE_SHIFT;
210
case OXYGEN_RATE_44100:
211
return IEC958_AES3_CON_FS_44100 << OXYGEN_SPDIF_CS_RATE_SHIFT;
212
default: /* OXYGEN_RATE_48000 */
213
return IEC958_AES3_CON_FS_48000 << OXYGEN_SPDIF_CS_RATE_SHIFT;
214
case OXYGEN_RATE_64000:
215
return 0xb << OXYGEN_SPDIF_CS_RATE_SHIFT;
216
case OXYGEN_RATE_88200:
217
return IEC958_AES3_CON_FS_88200 << OXYGEN_SPDIF_CS_RATE_SHIFT;
218
case OXYGEN_RATE_96000:
219
return IEC958_AES3_CON_FS_96000 << OXYGEN_SPDIF_CS_RATE_SHIFT;
220
case OXYGEN_RATE_176400:
221
return IEC958_AES3_CON_FS_176400 << OXYGEN_SPDIF_CS_RATE_SHIFT;
222
case OXYGEN_RATE_192000:
223
return IEC958_AES3_CON_FS_192000 << OXYGEN_SPDIF_CS_RATE_SHIFT;
224
}
225
}
226
227
void oxygen_update_spdif_source(struct oxygen *chip)
228
{
229
u32 old_control, new_control;
230
u16 old_routing, new_routing;
231
unsigned int oxygen_rate;
232
233
old_control = oxygen_read32(chip, OXYGEN_SPDIF_CONTROL);
234
old_routing = oxygen_read16(chip, OXYGEN_PLAY_ROUTING);
235
if (chip->pcm_active & (1 << PCM_SPDIF)) {
236
new_control = old_control | OXYGEN_SPDIF_OUT_ENABLE;
237
new_routing = (old_routing & ~OXYGEN_PLAY_SPDIF_MASK)
238
| OXYGEN_PLAY_SPDIF_SPDIF;
239
oxygen_rate = (old_control >> OXYGEN_SPDIF_OUT_RATE_SHIFT)
240
& OXYGEN_I2S_RATE_MASK;
241
/* S/PDIF rate was already set by the caller */
242
} else if ((chip->pcm_active & (1 << PCM_MULTICH)) &&
243
chip->spdif_playback_enable) {
244
new_routing = (old_routing & ~OXYGEN_PLAY_SPDIF_MASK)
245
| OXYGEN_PLAY_SPDIF_MULTICH_01;
246
oxygen_rate = oxygen_read16(chip, OXYGEN_I2S_MULTICH_FORMAT)
247
& OXYGEN_I2S_RATE_MASK;
248
new_control = (old_control & ~OXYGEN_SPDIF_OUT_RATE_MASK) |
249
(oxygen_rate << OXYGEN_SPDIF_OUT_RATE_SHIFT) |
250
OXYGEN_SPDIF_OUT_ENABLE;
251
} else {
252
new_control = old_control & ~OXYGEN_SPDIF_OUT_ENABLE;
253
new_routing = old_routing;
254
oxygen_rate = OXYGEN_RATE_44100;
255
}
256
if (old_routing != new_routing) {
257
oxygen_write32(chip, OXYGEN_SPDIF_CONTROL,
258
new_control & ~OXYGEN_SPDIF_OUT_ENABLE);
259
oxygen_write16(chip, OXYGEN_PLAY_ROUTING, new_routing);
260
}
261
if (new_control & OXYGEN_SPDIF_OUT_ENABLE)
262
oxygen_write32(chip, OXYGEN_SPDIF_OUTPUT_BITS,
263
oxygen_spdif_rate(oxygen_rate) |
264
((chip->pcm_active & (1 << PCM_SPDIF)) ?
265
chip->spdif_pcm_bits : chip->spdif_bits));
266
oxygen_write32(chip, OXYGEN_SPDIF_CONTROL, new_control);
267
}
268
269
static int spdif_switch_put(struct snd_kcontrol *ctl,
270
struct snd_ctl_elem_value *value)
271
{
272
struct oxygen *chip = ctl->private_data;
273
int changed;
274
275
guard(mutex)(&chip->mutex);
276
changed = value->value.integer.value[0] != chip->spdif_playback_enable;
277
if (changed) {
278
chip->spdif_playback_enable = !!value->value.integer.value[0];
279
spin_lock_irq(&chip->reg_lock);
280
oxygen_update_spdif_source(chip);
281
spin_unlock_irq(&chip->reg_lock);
282
}
283
return changed;
284
}
285
286
static int spdif_info(struct snd_kcontrol *ctl, struct snd_ctl_elem_info *info)
287
{
288
info->type = SNDRV_CTL_ELEM_TYPE_IEC958;
289
info->count = 1;
290
return 0;
291
}
292
293
static void oxygen_to_iec958(u32 bits, struct snd_ctl_elem_value *value)
294
{
295
value->value.iec958.status[0] =
296
bits & (OXYGEN_SPDIF_NONAUDIO | OXYGEN_SPDIF_C |
297
OXYGEN_SPDIF_PREEMPHASIS);
298
value->value.iec958.status[1] = /* category and original */
299
bits >> OXYGEN_SPDIF_CATEGORY_SHIFT;
300
}
301
302
static u32 iec958_to_oxygen(struct snd_ctl_elem_value *value)
303
{
304
u32 bits;
305
306
bits = value->value.iec958.status[0] &
307
(OXYGEN_SPDIF_NONAUDIO | OXYGEN_SPDIF_C |
308
OXYGEN_SPDIF_PREEMPHASIS);
309
bits |= value->value.iec958.status[1] << OXYGEN_SPDIF_CATEGORY_SHIFT;
310
if (bits & OXYGEN_SPDIF_NONAUDIO)
311
bits |= OXYGEN_SPDIF_V;
312
return bits;
313
}
314
315
static inline void write_spdif_bits(struct oxygen *chip, u32 bits)
316
{
317
oxygen_write32_masked(chip, OXYGEN_SPDIF_OUTPUT_BITS, bits,
318
OXYGEN_SPDIF_NONAUDIO |
319
OXYGEN_SPDIF_C |
320
OXYGEN_SPDIF_PREEMPHASIS |
321
OXYGEN_SPDIF_CATEGORY_MASK |
322
OXYGEN_SPDIF_ORIGINAL |
323
OXYGEN_SPDIF_V);
324
}
325
326
static int spdif_default_get(struct snd_kcontrol *ctl,
327
struct snd_ctl_elem_value *value)
328
{
329
struct oxygen *chip = ctl->private_data;
330
331
guard(mutex)(&chip->mutex);
332
oxygen_to_iec958(chip->spdif_bits, value);
333
return 0;
334
}
335
336
static int spdif_default_put(struct snd_kcontrol *ctl,
337
struct snd_ctl_elem_value *value)
338
{
339
struct oxygen *chip = ctl->private_data;
340
u32 new_bits;
341
int changed;
342
343
new_bits = iec958_to_oxygen(value);
344
guard(mutex)(&chip->mutex);
345
changed = new_bits != chip->spdif_bits;
346
if (changed) {
347
chip->spdif_bits = new_bits;
348
if (!(chip->pcm_active & (1 << PCM_SPDIF)))
349
write_spdif_bits(chip, new_bits);
350
}
351
return changed;
352
}
353
354
static int spdif_mask_get(struct snd_kcontrol *ctl,
355
struct snd_ctl_elem_value *value)
356
{
357
value->value.iec958.status[0] = IEC958_AES0_NONAUDIO |
358
IEC958_AES0_CON_NOT_COPYRIGHT | IEC958_AES0_CON_EMPHASIS;
359
value->value.iec958.status[1] =
360
IEC958_AES1_CON_CATEGORY | IEC958_AES1_CON_ORIGINAL;
361
return 0;
362
}
363
364
static int spdif_pcm_get(struct snd_kcontrol *ctl,
365
struct snd_ctl_elem_value *value)
366
{
367
struct oxygen *chip = ctl->private_data;
368
369
guard(mutex)(&chip->mutex);
370
oxygen_to_iec958(chip->spdif_pcm_bits, value);
371
return 0;
372
}
373
374
static int spdif_pcm_put(struct snd_kcontrol *ctl,
375
struct snd_ctl_elem_value *value)
376
{
377
struct oxygen *chip = ctl->private_data;
378
u32 new_bits;
379
int changed;
380
381
new_bits = iec958_to_oxygen(value);
382
guard(mutex)(&chip->mutex);
383
changed = new_bits != chip->spdif_pcm_bits;
384
if (changed) {
385
chip->spdif_pcm_bits = new_bits;
386
if (chip->pcm_active & (1 << PCM_SPDIF))
387
write_spdif_bits(chip, new_bits);
388
}
389
return changed;
390
}
391
392
static int spdif_input_mask_get(struct snd_kcontrol *ctl,
393
struct snd_ctl_elem_value *value)
394
{
395
value->value.iec958.status[0] = 0xff;
396
value->value.iec958.status[1] = 0xff;
397
value->value.iec958.status[2] = 0xff;
398
value->value.iec958.status[3] = 0xff;
399
return 0;
400
}
401
402
static int spdif_input_default_get(struct snd_kcontrol *ctl,
403
struct snd_ctl_elem_value *value)
404
{
405
struct oxygen *chip = ctl->private_data;
406
u32 bits;
407
408
bits = oxygen_read32(chip, OXYGEN_SPDIF_INPUT_BITS);
409
value->value.iec958.status[0] = bits;
410
value->value.iec958.status[1] = bits >> 8;
411
value->value.iec958.status[2] = bits >> 16;
412
value->value.iec958.status[3] = bits >> 24;
413
return 0;
414
}
415
416
static int spdif_bit_switch_get(struct snd_kcontrol *ctl,
417
struct snd_ctl_elem_value *value)
418
{
419
struct oxygen *chip = ctl->private_data;
420
u32 bit = ctl->private_value;
421
422
value->value.integer.value[0] =
423
!!(oxygen_read32(chip, OXYGEN_SPDIF_CONTROL) & bit);
424
return 0;
425
}
426
427
static int spdif_bit_switch_put(struct snd_kcontrol *ctl,
428
struct snd_ctl_elem_value *value)
429
{
430
struct oxygen *chip = ctl->private_data;
431
u32 bit = ctl->private_value;
432
u32 oldreg, newreg;
433
int changed;
434
435
guard(spinlock_irq)(&chip->reg_lock);
436
oldreg = oxygen_read32(chip, OXYGEN_SPDIF_CONTROL);
437
if (value->value.integer.value[0])
438
newreg = oldreg | bit;
439
else
440
newreg = oldreg & ~bit;
441
changed = newreg != oldreg;
442
if (changed)
443
oxygen_write32(chip, OXYGEN_SPDIF_CONTROL, newreg);
444
return changed;
445
}
446
447
static int monitor_volume_info(struct snd_kcontrol *ctl,
448
struct snd_ctl_elem_info *info)
449
{
450
info->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
451
info->count = 1;
452
info->value.integer.min = 0;
453
info->value.integer.max = 1;
454
return 0;
455
}
456
457
static int monitor_get(struct snd_kcontrol *ctl,
458
struct snd_ctl_elem_value *value)
459
{
460
struct oxygen *chip = ctl->private_data;
461
u8 bit = ctl->private_value;
462
int invert = ctl->private_value & (1 << 8);
463
464
value->value.integer.value[0] =
465
!!invert ^ !!(oxygen_read8(chip, OXYGEN_ADC_MONITOR) & bit);
466
return 0;
467
}
468
469
static int monitor_put(struct snd_kcontrol *ctl,
470
struct snd_ctl_elem_value *value)
471
{
472
struct oxygen *chip = ctl->private_data;
473
u8 bit = ctl->private_value;
474
int invert = ctl->private_value & (1 << 8);
475
u8 oldreg, newreg;
476
int changed;
477
478
guard(spinlock_irq)(&chip->reg_lock);
479
oldreg = oxygen_read8(chip, OXYGEN_ADC_MONITOR);
480
if ((!!value->value.integer.value[0] ^ !!invert) != 0)
481
newreg = oldreg | bit;
482
else
483
newreg = oldreg & ~bit;
484
changed = newreg != oldreg;
485
if (changed)
486
oxygen_write8(chip, OXYGEN_ADC_MONITOR, newreg);
487
return changed;
488
}
489
490
static int ac97_switch_get(struct snd_kcontrol *ctl,
491
struct snd_ctl_elem_value *value)
492
{
493
struct oxygen *chip = ctl->private_data;
494
unsigned int codec = (ctl->private_value >> 24) & 1;
495
unsigned int index = ctl->private_value & 0xff;
496
unsigned int bitnr = (ctl->private_value >> 8) & 0xff;
497
int invert = ctl->private_value & (1 << 16);
498
u16 reg;
499
500
guard(mutex)(&chip->mutex);
501
reg = oxygen_read_ac97(chip, codec, index);
502
if (!(reg & (1 << bitnr)) ^ !invert)
503
value->value.integer.value[0] = 1;
504
else
505
value->value.integer.value[0] = 0;
506
return 0;
507
}
508
509
static void mute_ac97_ctl(struct oxygen *chip, unsigned int control)
510
{
511
unsigned int priv_idx;
512
u16 value;
513
514
if (!chip->controls[control])
515
return;
516
priv_idx = chip->controls[control]->private_value & 0xff;
517
value = oxygen_read_ac97(chip, 0, priv_idx);
518
if (!(value & 0x8000)) {
519
oxygen_write_ac97(chip, 0, priv_idx, value | 0x8000);
520
if (chip->model.ac97_switch)
521
chip->model.ac97_switch(chip, priv_idx, 0x8000);
522
snd_ctl_notify(chip->card, SNDRV_CTL_EVENT_MASK_VALUE,
523
&chip->controls[control]->id);
524
}
525
}
526
527
static int ac97_switch_put(struct snd_kcontrol *ctl,
528
struct snd_ctl_elem_value *value)
529
{
530
struct oxygen *chip = ctl->private_data;
531
unsigned int codec = (ctl->private_value >> 24) & 1;
532
unsigned int index = ctl->private_value & 0xff;
533
unsigned int bitnr = (ctl->private_value >> 8) & 0xff;
534
int invert = ctl->private_value & (1 << 16);
535
u16 oldreg, newreg;
536
int change;
537
538
guard(mutex)(&chip->mutex);
539
oldreg = oxygen_read_ac97(chip, codec, index);
540
newreg = oldreg;
541
if (!value->value.integer.value[0] ^ !invert)
542
newreg |= 1 << bitnr;
543
else
544
newreg &= ~(1 << bitnr);
545
change = newreg != oldreg;
546
if (change) {
547
oxygen_write_ac97(chip, codec, index, newreg);
548
if (codec == 0 && chip->model.ac97_switch)
549
chip->model.ac97_switch(chip, index, newreg & 0x8000);
550
if (index == AC97_LINE) {
551
oxygen_write_ac97_masked(chip, 0, CM9780_GPIO_STATUS,
552
newreg & 0x8000 ?
553
CM9780_GPO0 : 0, CM9780_GPO0);
554
if (!(newreg & 0x8000)) {
555
mute_ac97_ctl(chip, CONTROL_MIC_CAPTURE_SWITCH);
556
mute_ac97_ctl(chip, CONTROL_CD_CAPTURE_SWITCH);
557
mute_ac97_ctl(chip, CONTROL_AUX_CAPTURE_SWITCH);
558
}
559
} else if ((index == AC97_MIC || index == AC97_CD ||
560
index == AC97_VIDEO || index == AC97_AUX) &&
561
bitnr == 15 && !(newreg & 0x8000)) {
562
mute_ac97_ctl(chip, CONTROL_LINE_CAPTURE_SWITCH);
563
oxygen_write_ac97_masked(chip, 0, CM9780_GPIO_STATUS,
564
CM9780_GPO0, CM9780_GPO0);
565
}
566
}
567
return change;
568
}
569
570
static int ac97_volume_info(struct snd_kcontrol *ctl,
571
struct snd_ctl_elem_info *info)
572
{
573
int stereo = (ctl->private_value >> 16) & 1;
574
575
info->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
576
info->count = stereo ? 2 : 1;
577
info->value.integer.min = 0;
578
info->value.integer.max = 0x1f;
579
return 0;
580
}
581
582
static int ac97_volume_get(struct snd_kcontrol *ctl,
583
struct snd_ctl_elem_value *value)
584
{
585
struct oxygen *chip = ctl->private_data;
586
unsigned int codec = (ctl->private_value >> 24) & 1;
587
int stereo = (ctl->private_value >> 16) & 1;
588
unsigned int index = ctl->private_value & 0xff;
589
u16 reg;
590
591
guard(mutex)(&chip->mutex);
592
reg = oxygen_read_ac97(chip, codec, index);
593
if (!stereo) {
594
value->value.integer.value[0] = 31 - (reg & 0x1f);
595
} else {
596
value->value.integer.value[0] = 31 - ((reg >> 8) & 0x1f);
597
value->value.integer.value[1] = 31 - (reg & 0x1f);
598
}
599
return 0;
600
}
601
602
static int ac97_volume_put(struct snd_kcontrol *ctl,
603
struct snd_ctl_elem_value *value)
604
{
605
struct oxygen *chip = ctl->private_data;
606
unsigned int codec = (ctl->private_value >> 24) & 1;
607
int stereo = (ctl->private_value >> 16) & 1;
608
unsigned int index = ctl->private_value & 0xff;
609
u16 oldreg, newreg;
610
int change;
611
612
guard(mutex)(&chip->mutex);
613
oldreg = oxygen_read_ac97(chip, codec, index);
614
if (!stereo) {
615
newreg = oldreg & ~0x1f;
616
newreg |= 31 - (value->value.integer.value[0] & 0x1f);
617
} else {
618
newreg = oldreg & ~0x1f1f;
619
newreg |= (31 - (value->value.integer.value[0] & 0x1f)) << 8;
620
newreg |= 31 - (value->value.integer.value[1] & 0x1f);
621
}
622
change = newreg != oldreg;
623
if (change)
624
oxygen_write_ac97(chip, codec, index, newreg);
625
return change;
626
}
627
628
static int mic_fmic_source_info(struct snd_kcontrol *ctl,
629
struct snd_ctl_elem_info *info)
630
{
631
static const char *const names[] = { "Mic Jack", "Front Panel" };
632
633
return snd_ctl_enum_info(info, 1, 2, names);
634
}
635
636
static int mic_fmic_source_get(struct snd_kcontrol *ctl,
637
struct snd_ctl_elem_value *value)
638
{
639
struct oxygen *chip = ctl->private_data;
640
641
guard(mutex)(&chip->mutex);
642
value->value.enumerated.item[0] =
643
!!(oxygen_read_ac97(chip, 0, CM9780_JACK) & CM9780_FMIC2MIC);
644
return 0;
645
}
646
647
static int mic_fmic_source_put(struct snd_kcontrol *ctl,
648
struct snd_ctl_elem_value *value)
649
{
650
struct oxygen *chip = ctl->private_data;
651
u16 oldreg, newreg;
652
int change;
653
654
guard(mutex)(&chip->mutex);
655
oldreg = oxygen_read_ac97(chip, 0, CM9780_JACK);
656
if (value->value.enumerated.item[0])
657
newreg = oldreg | CM9780_FMIC2MIC;
658
else
659
newreg = oldreg & ~CM9780_FMIC2MIC;
660
change = newreg != oldreg;
661
if (change)
662
oxygen_write_ac97(chip, 0, CM9780_JACK, newreg);
663
return change;
664
}
665
666
static int ac97_fp_rec_volume_info(struct snd_kcontrol *ctl,
667
struct snd_ctl_elem_info *info)
668
{
669
info->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
670
info->count = 2;
671
info->value.integer.min = 0;
672
info->value.integer.max = 7;
673
return 0;
674
}
675
676
static int ac97_fp_rec_volume_get(struct snd_kcontrol *ctl,
677
struct snd_ctl_elem_value *value)
678
{
679
struct oxygen *chip = ctl->private_data;
680
u16 reg;
681
682
guard(mutex)(&chip->mutex);
683
reg = oxygen_read_ac97(chip, 1, AC97_REC_GAIN);
684
value->value.integer.value[0] = reg & 7;
685
value->value.integer.value[1] = (reg >> 8) & 7;
686
return 0;
687
}
688
689
static int ac97_fp_rec_volume_put(struct snd_kcontrol *ctl,
690
struct snd_ctl_elem_value *value)
691
{
692
struct oxygen *chip = ctl->private_data;
693
u16 oldreg, newreg;
694
int change;
695
696
guard(mutex)(&chip->mutex);
697
oldreg = oxygen_read_ac97(chip, 1, AC97_REC_GAIN);
698
newreg = oldreg & ~0x0707;
699
newreg = newreg | (value->value.integer.value[0] & 7);
700
newreg = newreg | ((value->value.integer.value[1] & 7) << 8);
701
change = newreg != oldreg;
702
if (change)
703
oxygen_write_ac97(chip, 1, AC97_REC_GAIN, newreg);
704
return change;
705
}
706
707
#define AC97_SWITCH(xname, codec, index, bitnr, invert) { \
708
.iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
709
.name = xname, \
710
.info = snd_ctl_boolean_mono_info, \
711
.get = ac97_switch_get, \
712
.put = ac97_switch_put, \
713
.private_value = ((codec) << 24) | ((invert) << 16) | \
714
((bitnr) << 8) | (index), \
715
}
716
#define AC97_VOLUME(xname, codec, index, stereo) { \
717
.iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
718
.name = xname, \
719
.access = SNDRV_CTL_ELEM_ACCESS_READWRITE | \
720
SNDRV_CTL_ELEM_ACCESS_TLV_READ, \
721
.info = ac97_volume_info, \
722
.get = ac97_volume_get, \
723
.put = ac97_volume_put, \
724
.tlv = { .p = ac97_db_scale, }, \
725
.private_value = ((codec) << 24) | ((stereo) << 16) | (index), \
726
}
727
728
static DECLARE_TLV_DB_SCALE(monitor_db_scale, -600, 600, 0);
729
static DECLARE_TLV_DB_SCALE(ac97_db_scale, -3450, 150, 0);
730
static DECLARE_TLV_DB_SCALE(ac97_rec_db_scale, 0, 150, 0);
731
732
static const struct snd_kcontrol_new controls[] = {
733
{
734
.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
735
.name = "Master Playback Volume",
736
.access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
737
.info = dac_volume_info,
738
.get = dac_volume_get,
739
.put = dac_volume_put,
740
},
741
{
742
.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
743
.name = "Master Playback Switch",
744
.info = snd_ctl_boolean_mono_info,
745
.get = dac_mute_get,
746
.put = dac_mute_put,
747
},
748
{
749
.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
750
.name = "Stereo Upmixing",
751
.info = upmix_info,
752
.get = upmix_get,
753
.put = upmix_put,
754
},
755
};
756
757
static const struct snd_kcontrol_new spdif_output_controls[] = {
758
{
759
.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
760
.name = SNDRV_CTL_NAME_IEC958("", PLAYBACK, SWITCH),
761
.info = snd_ctl_boolean_mono_info,
762
.get = spdif_switch_get,
763
.put = spdif_switch_put,
764
},
765
{
766
.iface = SNDRV_CTL_ELEM_IFACE_PCM,
767
.device = 1,
768
.name = SNDRV_CTL_NAME_IEC958("", PLAYBACK, DEFAULT),
769
.info = spdif_info,
770
.get = spdif_default_get,
771
.put = spdif_default_put,
772
},
773
{
774
.iface = SNDRV_CTL_ELEM_IFACE_PCM,
775
.device = 1,
776
.name = SNDRV_CTL_NAME_IEC958("", PLAYBACK, CON_MASK),
777
.access = SNDRV_CTL_ELEM_ACCESS_READ,
778
.info = spdif_info,
779
.get = spdif_mask_get,
780
},
781
{
782
.iface = SNDRV_CTL_ELEM_IFACE_PCM,
783
.device = 1,
784
.name = SNDRV_CTL_NAME_IEC958("", PLAYBACK, PCM_STREAM),
785
.access = SNDRV_CTL_ELEM_ACCESS_READWRITE |
786
SNDRV_CTL_ELEM_ACCESS_INACTIVE,
787
.info = spdif_info,
788
.get = spdif_pcm_get,
789
.put = spdif_pcm_put,
790
},
791
};
792
793
static const struct snd_kcontrol_new spdif_input_controls[] = {
794
{
795
.iface = SNDRV_CTL_ELEM_IFACE_PCM,
796
.device = 1,
797
.name = SNDRV_CTL_NAME_IEC958("", CAPTURE, MASK),
798
.access = SNDRV_CTL_ELEM_ACCESS_READ,
799
.info = spdif_info,
800
.get = spdif_input_mask_get,
801
},
802
{
803
.iface = SNDRV_CTL_ELEM_IFACE_PCM,
804
.device = 1,
805
.name = SNDRV_CTL_NAME_IEC958("", CAPTURE, DEFAULT),
806
.access = SNDRV_CTL_ELEM_ACCESS_READ,
807
.info = spdif_info,
808
.get = spdif_input_default_get,
809
},
810
{
811
.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
812
.name = SNDRV_CTL_NAME_IEC958("Loopback ", NONE, SWITCH),
813
.info = snd_ctl_boolean_mono_info,
814
.get = spdif_bit_switch_get,
815
.put = spdif_bit_switch_put,
816
.private_value = OXYGEN_SPDIF_LOOPBACK,
817
},
818
{
819
.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
820
.name = SNDRV_CTL_NAME_IEC958("Validity Check ",CAPTURE,SWITCH),
821
.info = snd_ctl_boolean_mono_info,
822
.get = spdif_bit_switch_get,
823
.put = spdif_bit_switch_put,
824
.private_value = OXYGEN_SPDIF_SPDVALID,
825
},
826
};
827
828
static const struct {
829
unsigned int pcm_dev;
830
struct snd_kcontrol_new controls[2];
831
} monitor_controls[] = {
832
{
833
.pcm_dev = CAPTURE_0_FROM_I2S_1,
834
.controls = {
835
{
836
.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
837
.name = "Analog Input Monitor Playback Switch",
838
.info = snd_ctl_boolean_mono_info,
839
.get = monitor_get,
840
.put = monitor_put,
841
.private_value = OXYGEN_ADC_MONITOR_A,
842
},
843
{
844
.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
845
.name = "Analog Input Monitor Playback Volume",
846
.access = SNDRV_CTL_ELEM_ACCESS_READWRITE |
847
SNDRV_CTL_ELEM_ACCESS_TLV_READ,
848
.info = monitor_volume_info,
849
.get = monitor_get,
850
.put = monitor_put,
851
.private_value = OXYGEN_ADC_MONITOR_A_HALF_VOL
852
| (1 << 8),
853
.tlv = { .p = monitor_db_scale, },
854
},
855
},
856
},
857
{
858
.pcm_dev = CAPTURE_0_FROM_I2S_2,
859
.controls = {
860
{
861
.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
862
.name = "Analog Input Monitor Playback Switch",
863
.info = snd_ctl_boolean_mono_info,
864
.get = monitor_get,
865
.put = monitor_put,
866
.private_value = OXYGEN_ADC_MONITOR_B,
867
},
868
{
869
.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
870
.name = "Analog Input Monitor Playback Volume",
871
.access = SNDRV_CTL_ELEM_ACCESS_READWRITE |
872
SNDRV_CTL_ELEM_ACCESS_TLV_READ,
873
.info = monitor_volume_info,
874
.get = monitor_get,
875
.put = monitor_put,
876
.private_value = OXYGEN_ADC_MONITOR_B_HALF_VOL
877
| (1 << 8),
878
.tlv = { .p = monitor_db_scale, },
879
},
880
},
881
},
882
{
883
.pcm_dev = CAPTURE_2_FROM_I2S_2,
884
.controls = {
885
{
886
.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
887
.name = "Analog Input Monitor Playback Switch",
888
.index = 1,
889
.info = snd_ctl_boolean_mono_info,
890
.get = monitor_get,
891
.put = monitor_put,
892
.private_value = OXYGEN_ADC_MONITOR_B,
893
},
894
{
895
.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
896
.name = "Analog Input Monitor Playback Volume",
897
.index = 1,
898
.access = SNDRV_CTL_ELEM_ACCESS_READWRITE |
899
SNDRV_CTL_ELEM_ACCESS_TLV_READ,
900
.info = monitor_volume_info,
901
.get = monitor_get,
902
.put = monitor_put,
903
.private_value = OXYGEN_ADC_MONITOR_B_HALF_VOL
904
| (1 << 8),
905
.tlv = { .p = monitor_db_scale, },
906
},
907
},
908
},
909
{
910
.pcm_dev = CAPTURE_3_FROM_I2S_3,
911
.controls = {
912
{
913
.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
914
.name = "Analog Input Monitor Playback Switch",
915
.index = 2,
916
.info = snd_ctl_boolean_mono_info,
917
.get = monitor_get,
918
.put = monitor_put,
919
.private_value = OXYGEN_ADC_MONITOR_C,
920
},
921
{
922
.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
923
.name = "Analog Input Monitor Playback Volume",
924
.index = 2,
925
.access = SNDRV_CTL_ELEM_ACCESS_READWRITE |
926
SNDRV_CTL_ELEM_ACCESS_TLV_READ,
927
.info = monitor_volume_info,
928
.get = monitor_get,
929
.put = monitor_put,
930
.private_value = OXYGEN_ADC_MONITOR_C_HALF_VOL
931
| (1 << 8),
932
.tlv = { .p = monitor_db_scale, },
933
},
934
},
935
},
936
{
937
.pcm_dev = CAPTURE_1_FROM_SPDIF,
938
.controls = {
939
{
940
.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
941
.name = "Digital Input Monitor Playback Switch",
942
.info = snd_ctl_boolean_mono_info,
943
.get = monitor_get,
944
.put = monitor_put,
945
.private_value = OXYGEN_ADC_MONITOR_C,
946
},
947
{
948
.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
949
.name = "Digital Input Monitor Playback Volume",
950
.access = SNDRV_CTL_ELEM_ACCESS_READWRITE |
951
SNDRV_CTL_ELEM_ACCESS_TLV_READ,
952
.info = monitor_volume_info,
953
.get = monitor_get,
954
.put = monitor_put,
955
.private_value = OXYGEN_ADC_MONITOR_C_HALF_VOL
956
| (1 << 8),
957
.tlv = { .p = monitor_db_scale, },
958
},
959
},
960
},
961
};
962
963
static const struct snd_kcontrol_new ac97_controls[] = {
964
AC97_VOLUME("Mic Capture Volume", 0, AC97_MIC, 0),
965
AC97_SWITCH("Mic Capture Switch", 0, AC97_MIC, 15, 1),
966
AC97_SWITCH("Mic Boost (+20dB)", 0, AC97_MIC, 6, 0),
967
{
968
.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
969
.name = "Mic Source Capture Enum",
970
.info = mic_fmic_source_info,
971
.get = mic_fmic_source_get,
972
.put = mic_fmic_source_put,
973
},
974
AC97_SWITCH("Line Capture Switch", 0, AC97_LINE, 15, 1),
975
AC97_VOLUME("CD Capture Volume", 0, AC97_CD, 1),
976
AC97_SWITCH("CD Capture Switch", 0, AC97_CD, 15, 1),
977
AC97_VOLUME("Aux Capture Volume", 0, AC97_AUX, 1),
978
AC97_SWITCH("Aux Capture Switch", 0, AC97_AUX, 15, 1),
979
};
980
981
static const struct snd_kcontrol_new ac97_fp_controls[] = {
982
AC97_VOLUME("Front Panel Playback Volume", 1, AC97_HEADPHONE, 1),
983
AC97_SWITCH("Front Panel Playback Switch", 1, AC97_HEADPHONE, 15, 1),
984
{
985
.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
986
.name = "Front Panel Capture Volume",
987
.access = SNDRV_CTL_ELEM_ACCESS_READWRITE |
988
SNDRV_CTL_ELEM_ACCESS_TLV_READ,
989
.info = ac97_fp_rec_volume_info,
990
.get = ac97_fp_rec_volume_get,
991
.put = ac97_fp_rec_volume_put,
992
.tlv = { .p = ac97_rec_db_scale, },
993
},
994
AC97_SWITCH("Front Panel Capture Switch", 1, AC97_REC_GAIN, 15, 1),
995
};
996
997
static void oxygen_any_ctl_free(struct snd_kcontrol *ctl)
998
{
999
struct oxygen *chip = ctl->private_data;
1000
unsigned int i;
1001
1002
/* I'm too lazy to write a function for each control :-) */
1003
for (i = 0; i < ARRAY_SIZE(chip->controls); ++i)
1004
chip->controls[i] = NULL;
1005
}
1006
1007
static int add_controls(struct oxygen *chip,
1008
const struct snd_kcontrol_new controls[],
1009
unsigned int count)
1010
{
1011
static const char *const known_ctl_names[CONTROL_COUNT] = {
1012
[CONTROL_SPDIF_PCM] =
1013
SNDRV_CTL_NAME_IEC958("", PLAYBACK, PCM_STREAM),
1014
[CONTROL_SPDIF_INPUT_BITS] =
1015
SNDRV_CTL_NAME_IEC958("", CAPTURE, DEFAULT),
1016
[CONTROL_MIC_CAPTURE_SWITCH] = "Mic Capture Switch",
1017
[CONTROL_LINE_CAPTURE_SWITCH] = "Line Capture Switch",
1018
[CONTROL_CD_CAPTURE_SWITCH] = "CD Capture Switch",
1019
[CONTROL_AUX_CAPTURE_SWITCH] = "Aux Capture Switch",
1020
};
1021
unsigned int i;
1022
struct snd_kcontrol_new template;
1023
struct snd_kcontrol *ctl;
1024
int j, err;
1025
1026
for (i = 0; i < count; ++i) {
1027
template = controls[i];
1028
if (chip->model.control_filter) {
1029
err = chip->model.control_filter(&template);
1030
if (err < 0)
1031
return err;
1032
if (err == 1)
1033
continue;
1034
}
1035
if (!strcmp(template.name, "Stereo Upmixing") &&
1036
chip->model.dac_channels_pcm == 2)
1037
continue;
1038
if (!strcmp(template.name, "Mic Source Capture Enum") &&
1039
!(chip->model.device_config & AC97_FMIC_SWITCH))
1040
continue;
1041
if (!strncmp(template.name, "CD Capture ", 11) &&
1042
!(chip->model.device_config & AC97_CD_INPUT))
1043
continue;
1044
if (!strcmp(template.name, "Master Playback Volume") &&
1045
chip->model.dac_tlv) {
1046
template.tlv.p = chip->model.dac_tlv;
1047
template.access |= SNDRV_CTL_ELEM_ACCESS_TLV_READ;
1048
}
1049
ctl = snd_ctl_new1(&template, chip);
1050
if (!ctl)
1051
return -ENOMEM;
1052
err = snd_ctl_add(chip->card, ctl);
1053
if (err < 0)
1054
return err;
1055
j = match_string(known_ctl_names, CONTROL_COUNT, ctl->id.name);
1056
if (j >= 0) {
1057
chip->controls[j] = ctl;
1058
ctl->private_free = oxygen_any_ctl_free;
1059
}
1060
}
1061
return 0;
1062
}
1063
1064
int oxygen_mixer_init(struct oxygen *chip)
1065
{
1066
unsigned int i;
1067
int err;
1068
1069
err = add_controls(chip, controls, ARRAY_SIZE(controls));
1070
if (err < 0)
1071
return err;
1072
if (chip->model.device_config & PLAYBACK_1_TO_SPDIF) {
1073
err = add_controls(chip, spdif_output_controls,
1074
ARRAY_SIZE(spdif_output_controls));
1075
if (err < 0)
1076
return err;
1077
}
1078
if (chip->model.device_config & CAPTURE_1_FROM_SPDIF) {
1079
err = add_controls(chip, spdif_input_controls,
1080
ARRAY_SIZE(spdif_input_controls));
1081
if (err < 0)
1082
return err;
1083
}
1084
for (i = 0; i < ARRAY_SIZE(monitor_controls); ++i) {
1085
if (!(chip->model.device_config & monitor_controls[i].pcm_dev))
1086
continue;
1087
err = add_controls(chip, monitor_controls[i].controls,
1088
ARRAY_SIZE(monitor_controls[i].controls));
1089
if (err < 0)
1090
return err;
1091
}
1092
if (chip->has_ac97_0) {
1093
err = add_controls(chip, ac97_controls,
1094
ARRAY_SIZE(ac97_controls));
1095
if (err < 0)
1096
return err;
1097
}
1098
if (chip->has_ac97_1) {
1099
err = add_controls(chip, ac97_fp_controls,
1100
ARRAY_SIZE(ac97_fp_controls));
1101
if (err < 0)
1102
return err;
1103
}
1104
return chip->model.mixer_init ? chip->model.mixer_init(chip) : 0;
1105
}
1106
1107