2
* C-Media CMI8788 driver - mixer code
4
* Copyright (c) Clemens Ladisch <clemens@ladisch.de>
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.
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.
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
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>
28
static int dac_volume_info(struct snd_kcontrol *ctl,
29
struct snd_ctl_elem_info *info)
31
struct oxygen *chip = ctl->private_data;
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;
40
static int dac_volume_get(struct snd_kcontrol *ctl,
41
struct snd_ctl_elem_value *value)
43
struct oxygen *chip = ctl->private_data;
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);
53
static int dac_volume_put(struct snd_kcontrol *ctl,
54
struct snd_ctl_elem_value *value)
56
struct oxygen *chip = ctl->private_data;
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];
68
chip->model.update_dac_volume(chip);
69
mutex_unlock(&chip->mutex);
73
static int dac_mute_get(struct snd_kcontrol *ctl,
74
struct snd_ctl_elem_value *value)
76
struct oxygen *chip = ctl->private_data;
78
mutex_lock(&chip->mutex);
79
value->value.integer.value[0] = !chip->dac_mute;
80
mutex_unlock(&chip->mutex);
84
static int dac_mute_put(struct snd_kcontrol *ctl,
85
struct snd_ctl_elem_value *value)
87
struct oxygen *chip = ctl->private_data;
90
mutex_lock(&chip->mutex);
91
changed = !value->value.integer.value[0] != chip->dac_mute;
93
chip->dac_mute = !value->value.integer.value[0];
94
chip->model.update_dac_mute(chip);
96
mutex_unlock(&chip->mutex);
100
static unsigned int upmix_item_count(struct oxygen *chip)
102
if (chip->model.dac_channels_pcm < 8)
104
else if (chip->model.update_center_lfe_mix)
110
static int upmix_info(struct snd_kcontrol *ctl, struct snd_ctl_elem_info *info)
112
static const char *const names[5] = {
115
"Front+Surround+Back",
116
"Front+Surround+Center/LFE",
117
"Front+Surround+Center/LFE+Back",
119
struct oxygen *chip = ctl->private_data;
120
unsigned int count = upmix_item_count(chip);
122
return snd_ctl_enum_info(info, 1, count, names);
125
static int upmix_get(struct snd_kcontrol *ctl, struct snd_ctl_elem_value *value)
127
struct oxygen *chip = ctl->private_data;
129
mutex_lock(&chip->mutex);
130
value->value.enumerated.item[0] = chip->dac_routing;
131
mutex_unlock(&chip->mutex);
135
void oxygen_update_dac_routing(struct oxygen *chip)
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),
166
unsigned int reg_value;
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);
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);
194
static int upmix_put(struct snd_kcontrol *ctl, struct snd_ctl_elem_value *value)
196
struct oxygen *chip = ctl->private_data;
197
unsigned int count = upmix_item_count(chip);
200
if (value->value.enumerated.item[0] >= count)
202
mutex_lock(&chip->mutex);
203
changed = value->value.enumerated.item[0] != chip->dac_routing;
205
chip->dac_routing = value->value.enumerated.item[0];
206
oxygen_update_dac_routing(chip);
208
mutex_unlock(&chip->mutex);
212
static int spdif_switch_get(struct snd_kcontrol *ctl,
213
struct snd_ctl_elem_value *value)
215
struct oxygen *chip = ctl->private_data;
217
mutex_lock(&chip->mutex);
218
value->value.integer.value[0] = chip->spdif_playback_enable;
219
mutex_unlock(&chip->mutex);
223
static unsigned int oxygen_spdif_rate(unsigned int oxygen_rate)
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;
245
void oxygen_update_spdif_source(struct oxygen *chip)
247
u32 old_control, new_control;
248
u16 old_routing, new_routing;
249
unsigned int oxygen_rate;
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;
270
new_control = old_control & ~OXYGEN_SPDIF_OUT_ENABLE;
271
new_routing = old_routing;
272
oxygen_rate = OXYGEN_RATE_44100;
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);
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);
287
static int spdif_switch_put(struct snd_kcontrol *ctl,
288
struct snd_ctl_elem_value *value)
290
struct oxygen *chip = ctl->private_data;
293
mutex_lock(&chip->mutex);
294
changed = value->value.integer.value[0] != chip->spdif_playback_enable;
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);
301
mutex_unlock(&chip->mutex);
305
static int spdif_info(struct snd_kcontrol *ctl, struct snd_ctl_elem_info *info)
307
info->type = SNDRV_CTL_ELEM_TYPE_IEC958;
312
static void oxygen_to_iec958(u32 bits, struct snd_ctl_elem_value *value)
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;
321
static u32 iec958_to_oxygen(struct snd_ctl_elem_value *value)
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;
334
static inline void write_spdif_bits(struct oxygen *chip, u32 bits)
336
oxygen_write32_masked(chip, OXYGEN_SPDIF_OUTPUT_BITS, bits,
337
OXYGEN_SPDIF_NONAUDIO |
339
OXYGEN_SPDIF_PREEMPHASIS |
340
OXYGEN_SPDIF_CATEGORY_MASK |
341
OXYGEN_SPDIF_ORIGINAL |
345
static int spdif_default_get(struct snd_kcontrol *ctl,
346
struct snd_ctl_elem_value *value)
348
struct oxygen *chip = ctl->private_data;
350
mutex_lock(&chip->mutex);
351
oxygen_to_iec958(chip->spdif_bits, value);
352
mutex_unlock(&chip->mutex);
356
static int spdif_default_put(struct snd_kcontrol *ctl,
357
struct snd_ctl_elem_value *value)
359
struct oxygen *chip = ctl->private_data;
363
new_bits = iec958_to_oxygen(value);
364
mutex_lock(&chip->mutex);
365
changed = new_bits != chip->spdif_bits;
367
chip->spdif_bits = new_bits;
368
if (!(chip->pcm_active & (1 << PCM_SPDIF)))
369
write_spdif_bits(chip, new_bits);
371
mutex_unlock(&chip->mutex);
375
static int spdif_mask_get(struct snd_kcontrol *ctl,
376
struct snd_ctl_elem_value *value)
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;
385
static int spdif_pcm_get(struct snd_kcontrol *ctl,
386
struct snd_ctl_elem_value *value)
388
struct oxygen *chip = ctl->private_data;
390
mutex_lock(&chip->mutex);
391
oxygen_to_iec958(chip->spdif_pcm_bits, value);
392
mutex_unlock(&chip->mutex);
396
static int spdif_pcm_put(struct snd_kcontrol *ctl,
397
struct snd_ctl_elem_value *value)
399
struct oxygen *chip = ctl->private_data;
403
new_bits = iec958_to_oxygen(value);
404
mutex_lock(&chip->mutex);
405
changed = new_bits != chip->spdif_pcm_bits;
407
chip->spdif_pcm_bits = new_bits;
408
if (chip->pcm_active & (1 << PCM_SPDIF))
409
write_spdif_bits(chip, new_bits);
411
mutex_unlock(&chip->mutex);
415
static int spdif_input_mask_get(struct snd_kcontrol *ctl,
416
struct snd_ctl_elem_value *value)
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;
425
static int spdif_input_default_get(struct snd_kcontrol *ctl,
426
struct snd_ctl_elem_value *value)
428
struct oxygen *chip = ctl->private_data;
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;
439
static int spdif_bit_switch_get(struct snd_kcontrol *ctl,
440
struct snd_ctl_elem_value *value)
442
struct oxygen *chip = ctl->private_data;
443
u32 bit = ctl->private_value;
445
value->value.integer.value[0] =
446
!!(oxygen_read32(chip, OXYGEN_SPDIF_CONTROL) & bit);
450
static int spdif_bit_switch_put(struct snd_kcontrol *ctl,
451
struct snd_ctl_elem_value *value)
453
struct oxygen *chip = ctl->private_data;
454
u32 bit = ctl->private_value;
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;
463
newreg = oldreg & ~bit;
464
changed = newreg != oldreg;
466
oxygen_write32(chip, OXYGEN_SPDIF_CONTROL, newreg);
467
spin_unlock_irq(&chip->reg_lock);
471
static int monitor_volume_info(struct snd_kcontrol *ctl,
472
struct snd_ctl_elem_info *info)
474
info->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
476
info->value.integer.min = 0;
477
info->value.integer.max = 1;
481
static int monitor_get(struct snd_kcontrol *ctl,
482
struct snd_ctl_elem_value *value)
484
struct oxygen *chip = ctl->private_data;
485
u8 bit = ctl->private_value;
486
int invert = ctl->private_value & (1 << 8);
488
value->value.integer.value[0] =
489
!!invert ^ !!(oxygen_read8(chip, OXYGEN_ADC_MONITOR) & bit);
493
static int monitor_put(struct snd_kcontrol *ctl,
494
struct snd_ctl_elem_value *value)
496
struct oxygen *chip = ctl->private_data;
497
u8 bit = ctl->private_value;
498
int invert = ctl->private_value & (1 << 8);
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;
507
newreg = oldreg & ~bit;
508
changed = newreg != oldreg;
510
oxygen_write8(chip, OXYGEN_ADC_MONITOR, newreg);
511
spin_unlock_irq(&chip->reg_lock);
515
static int ac97_switch_get(struct snd_kcontrol *ctl,
516
struct snd_ctl_elem_value *value)
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);
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;
531
value->value.integer.value[0] = 0;
535
static void mute_ac97_ctl(struct oxygen *chip, unsigned int control)
537
unsigned int priv_idx;
540
if (!chip->controls[control])
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);
553
static int ac97_switch_put(struct snd_kcontrol *ctl,
554
struct snd_ctl_elem_value *value)
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);
564
mutex_lock(&chip->mutex);
565
oldreg = oxygen_read_ac97(chip, codec, index);
567
if (!value->value.integer.value[0] ^ !invert)
568
newreg |= 1 << bitnr;
570
newreg &= ~(1 << bitnr);
571
change = newreg != oldreg;
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,
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);
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);
593
mutex_unlock(&chip->mutex);
597
static int ac97_volume_info(struct snd_kcontrol *ctl,
598
struct snd_ctl_elem_info *info)
600
int stereo = (ctl->private_value >> 16) & 1;
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;
609
static int ac97_volume_get(struct snd_kcontrol *ctl,
610
struct snd_ctl_elem_value *value)
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;
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);
623
value->value.integer.value[1] = 31 - ((reg >> 8) & 0x1f);
627
static int ac97_volume_put(struct snd_kcontrol *ctl,
628
struct snd_ctl_elem_value *value)
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;
637
mutex_lock(&chip->mutex);
638
oldreg = oxygen_read_ac97(chip, codec, index);
640
newreg = (newreg & ~0x1f) |
641
(31 - (value->value.integer.value[0] & 0x1f));
643
newreg = (newreg & ~0x1f00) |
644
((31 - (value->value.integer.value[1] & 0x1f)) << 8);
646
newreg = (newreg & ~0x1f00) | ((newreg & 0x1f) << 8);
647
change = newreg != oldreg;
649
oxygen_write_ac97(chip, codec, index, newreg);
650
mutex_unlock(&chip->mutex);
654
static int mic_fmic_source_info(struct snd_kcontrol *ctl,
655
struct snd_ctl_elem_info *info)
657
static const char *const names[] = { "Mic Jack", "Front Panel" };
659
return snd_ctl_enum_info(info, 1, 2, names);
662
static int mic_fmic_source_get(struct snd_kcontrol *ctl,
663
struct snd_ctl_elem_value *value)
665
struct oxygen *chip = ctl->private_data;
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);
674
static int mic_fmic_source_put(struct snd_kcontrol *ctl,
675
struct snd_ctl_elem_value *value)
677
struct oxygen *chip = ctl->private_data;
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;
686
newreg = oldreg & ~CM9780_FMIC2MIC;
687
change = newreg != oldreg;
689
oxygen_write_ac97(chip, 0, CM9780_JACK, newreg);
690
mutex_unlock(&chip->mutex);
694
static int ac97_fp_rec_volume_info(struct snd_kcontrol *ctl,
695
struct snd_ctl_elem_info *info)
697
info->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
699
info->value.integer.min = 0;
700
info->value.integer.max = 7;
704
static int ac97_fp_rec_volume_get(struct snd_kcontrol *ctl,
705
struct snd_ctl_elem_value *value)
707
struct oxygen *chip = ctl->private_data;
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;
718
static int ac97_fp_rec_volume_put(struct snd_kcontrol *ctl,
719
struct snd_ctl_elem_value *value)
721
struct oxygen *chip = ctl->private_data;
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;
732
oxygen_write_ac97(chip, 1, AC97_REC_GAIN, newreg);
733
mutex_unlock(&chip->mutex);
737
#define AC97_SWITCH(xname, codec, index, bitnr, invert) { \
738
.iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
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), \
746
#define AC97_VOLUME(xname, codec, index, stereo) { \
747
.iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
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), \
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);
762
static const struct snd_kcontrol_new controls[] = {
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,
772
.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
773
.name = "Master Playback Switch",
774
.info = snd_ctl_boolean_mono_info,
779
.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
780
.name = "Stereo Upmixing",
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,
793
.iface = SNDRV_CTL_ELEM_IFACE_PCM,
795
.name = SNDRV_CTL_NAME_IEC958("", PLAYBACK, DEFAULT),
797
.get = spdif_default_get,
798
.put = spdif_default_put,
801
.iface = SNDRV_CTL_ELEM_IFACE_PCM,
803
.name = SNDRV_CTL_NAME_IEC958("", PLAYBACK, CON_MASK),
804
.access = SNDRV_CTL_ELEM_ACCESS_READ,
806
.get = spdif_mask_get,
809
.iface = SNDRV_CTL_ELEM_IFACE_PCM,
811
.name = SNDRV_CTL_NAME_IEC958("", PLAYBACK, PCM_STREAM),
812
.access = SNDRV_CTL_ELEM_ACCESS_READWRITE |
813
SNDRV_CTL_ELEM_ACCESS_INACTIVE,
815
.get = spdif_pcm_get,
816
.put = spdif_pcm_put,
820
static const struct snd_kcontrol_new spdif_input_controls[] = {
822
.iface = SNDRV_CTL_ELEM_IFACE_PCM,
824
.name = SNDRV_CTL_NAME_IEC958("", CAPTURE, MASK),
825
.access = SNDRV_CTL_ELEM_ACCESS_READ,
827
.get = spdif_input_mask_get,
830
.iface = SNDRV_CTL_ELEM_IFACE_PCM,
832
.name = SNDRV_CTL_NAME_IEC958("", CAPTURE, DEFAULT),
833
.access = SNDRV_CTL_ELEM_ACCESS_READ,
835
.get = spdif_input_default_get,
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,
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,
855
static const struct {
856
unsigned int pcm_dev;
857
struct snd_kcontrol_new controls[2];
858
} monitor_controls[] = {
860
.pcm_dev = CAPTURE_0_FROM_I2S_1,
863
.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
864
.name = "Analog Input Monitor Playback Switch",
865
.info = snd_ctl_boolean_mono_info,
868
.private_value = OXYGEN_ADC_MONITOR_A,
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,
878
.private_value = OXYGEN_ADC_MONITOR_A_HALF_VOL
880
.tlv = { .p = monitor_db_scale, },
885
.pcm_dev = CAPTURE_0_FROM_I2S_2,
888
.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
889
.name = "Analog Input Monitor Playback Switch",
890
.info = snd_ctl_boolean_mono_info,
893
.private_value = OXYGEN_ADC_MONITOR_B,
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,
903
.private_value = OXYGEN_ADC_MONITOR_B_HALF_VOL
905
.tlv = { .p = monitor_db_scale, },
910
.pcm_dev = CAPTURE_2_FROM_I2S_2,
913
.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
914
.name = "Analog Input Monitor Playback Switch",
916
.info = snd_ctl_boolean_mono_info,
919
.private_value = OXYGEN_ADC_MONITOR_B,
922
.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
923
.name = "Analog Input Monitor Playback Volume",
925
.access = SNDRV_CTL_ELEM_ACCESS_READWRITE |
926
SNDRV_CTL_ELEM_ACCESS_TLV_READ,
927
.info = monitor_volume_info,
930
.private_value = OXYGEN_ADC_MONITOR_B_HALF_VOL
932
.tlv = { .p = monitor_db_scale, },
937
.pcm_dev = CAPTURE_1_FROM_SPDIF,
940
.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
941
.name = "Digital Input Monitor Playback Switch",
942
.info = snd_ctl_boolean_mono_info,
945
.private_value = OXYGEN_ADC_MONITOR_C,
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,
955
.private_value = OXYGEN_ADC_MONITOR_C_HALF_VOL
957
.tlv = { .p = monitor_db_scale, },
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),
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,
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),
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),
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, },
994
AC97_SWITCH("Front Panel Capture Switch", 1, AC97_REC_GAIN, 15, 1),
997
static void oxygen_any_ctl_free(struct snd_kcontrol *ctl)
999
struct oxygen *chip = ctl->private_data;
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;
1007
static int add_controls(struct oxygen *chip,
1008
const struct snd_kcontrol_new controls[],
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",
1022
struct snd_kcontrol_new template;
1023
struct snd_kcontrol *ctl;
1026
for (i = 0; i < count; ++i) {
1027
template = controls[i];
1028
if (chip->model.control_filter) {
1029
err = chip->model.control_filter(&template);
1035
if (!strcmp(template.name, "Stereo Upmixing") &&
1036
chip->model.dac_channels_pcm == 2)
1038
if (!strcmp(template.name, "Mic Source Capture Enum") &&
1039
!(chip->model.device_config & AC97_FMIC_SWITCH))
1041
if (!strncmp(template.name, "CD Capture ", 11) &&
1042
!(chip->model.device_config & AC97_CD_INPUT))
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;
1049
ctl = snd_ctl_new1(&template, chip);
1052
err = snd_ctl_add(chip->card, ctl);
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;
1064
int oxygen_mixer_init(struct oxygen *chip)
1069
err = add_controls(chip, controls, ARRAY_SIZE(controls));
1072
if (chip->model.device_config & CAPTURE_1_FROM_SPDIF) {
1073
err = add_controls(chip, spdif_input_controls,
1074
ARRAY_SIZE(spdif_input_controls));
1078
for (i = 0; i < ARRAY_SIZE(monitor_controls); ++i) {
1079
if (!(chip->model.device_config & monitor_controls[i].pcm_dev))
1081
err = add_controls(chip, monitor_controls[i].controls,
1082
ARRAY_SIZE(monitor_controls[i].controls));
1086
if (chip->has_ac97_0) {
1087
err = add_controls(chip, ac97_controls,
1088
ARRAY_SIZE(ac97_controls));
1092
if (chip->has_ac97_1) {
1093
err = add_controls(chip, ac97_fp_controls,
1094
ARRAY_SIZE(ac97_fp_controls));
1098
return chip->model.mixer_init ? chip->model.mixer_init(chip) : 0;