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