Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/sound/pci/pcxhr/pcxhr_mixer.c
26439 views
1
// SPDX-License-Identifier: GPL-2.0-or-later
2
#define __NO_VERSION__
3
/*
4
* Driver for Digigram pcxhr compatible soundcards
5
*
6
* mixer callbacks
7
*
8
* Copyright (c) 2004 by Digigram <[email protected]>
9
*/
10
11
#include <linux/time.h>
12
#include <linux/interrupt.h>
13
#include <linux/init.h>
14
#include <linux/mutex.h>
15
#include <sound/core.h>
16
#include "pcxhr.h"
17
#include "pcxhr_hwdep.h"
18
#include "pcxhr_core.h"
19
#include <sound/control.h>
20
#include <sound/tlv.h>
21
#include <sound/asoundef.h>
22
#include "pcxhr_mixer.h"
23
#include "pcxhr_mix22.h"
24
25
#define PCXHR_LINE_CAPTURE_LEVEL_MIN 0 /* -112.0 dB */
26
#define PCXHR_LINE_CAPTURE_LEVEL_MAX 255 /* +15.5 dB */
27
#define PCXHR_LINE_CAPTURE_ZERO_LEVEL 224 /* 0.0 dB ( 0 dBu -> 0 dBFS ) */
28
29
#define PCXHR_LINE_PLAYBACK_LEVEL_MIN 0 /* -104.0 dB */
30
#define PCXHR_LINE_PLAYBACK_LEVEL_MAX 128 /* +24.0 dB */
31
#define PCXHR_LINE_PLAYBACK_ZERO_LEVEL 104 /* 0.0 dB ( 0 dBFS -> 0 dBu ) */
32
33
static const DECLARE_TLV_DB_SCALE(db_scale_analog_capture, -11200, 50, 1550);
34
static const DECLARE_TLV_DB_SCALE(db_scale_analog_playback, -10400, 100, 2400);
35
36
static const DECLARE_TLV_DB_SCALE(db_scale_a_hr222_capture, -11150, 50, 1600);
37
static const DECLARE_TLV_DB_SCALE(db_scale_a_hr222_playback, -2550, 50, 2400);
38
39
static int pcxhr_update_analog_audio_level(struct snd_pcxhr *chip,
40
int is_capture, int channel)
41
{
42
int err, vol;
43
struct pcxhr_rmh rmh;
44
45
pcxhr_init_rmh(&rmh, CMD_ACCESS_IO_WRITE);
46
if (is_capture) {
47
rmh.cmd[0] |= IO_NUM_REG_IN_ANA_LEVEL;
48
rmh.cmd[2] = chip->analog_capture_volume[channel];
49
} else {
50
rmh.cmd[0] |= IO_NUM_REG_OUT_ANA_LEVEL;
51
if (chip->analog_playback_active[channel])
52
vol = chip->analog_playback_volume[channel];
53
else
54
vol = PCXHR_LINE_PLAYBACK_LEVEL_MIN;
55
/* playback analog levels are inversed */
56
rmh.cmd[2] = PCXHR_LINE_PLAYBACK_LEVEL_MAX - vol;
57
}
58
rmh.cmd[1] = 1 << ((2 * chip->chip_idx) + channel); /* audio mask */
59
rmh.cmd_len = 3;
60
err = pcxhr_send_msg(chip->mgr, &rmh);
61
if (err < 0) {
62
dev_dbg(chip->card->dev,
63
"error update_analog_audio_level card(%d)"
64
" is_capture(%d) err(%x)\n",
65
chip->chip_idx, is_capture, err);
66
return -EINVAL;
67
}
68
return 0;
69
}
70
71
/*
72
* analog level control
73
*/
74
static int pcxhr_analog_vol_info(struct snd_kcontrol *kcontrol,
75
struct snd_ctl_elem_info *uinfo)
76
{
77
struct snd_pcxhr *chip = snd_kcontrol_chip(kcontrol);
78
79
uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
80
uinfo->count = 2;
81
if (kcontrol->private_value == 0) { /* playback */
82
if (chip->mgr->is_hr_stereo) {
83
uinfo->value.integer.min =
84
HR222_LINE_PLAYBACK_LEVEL_MIN; /* -25 dB */
85
uinfo->value.integer.max =
86
HR222_LINE_PLAYBACK_LEVEL_MAX; /* +24 dB */
87
} else {
88
uinfo->value.integer.min =
89
PCXHR_LINE_PLAYBACK_LEVEL_MIN; /*-104 dB */
90
uinfo->value.integer.max =
91
PCXHR_LINE_PLAYBACK_LEVEL_MAX; /* +24 dB */
92
}
93
} else { /* capture */
94
if (chip->mgr->is_hr_stereo) {
95
uinfo->value.integer.min =
96
HR222_LINE_CAPTURE_LEVEL_MIN; /*-112 dB */
97
uinfo->value.integer.max =
98
HR222_LINE_CAPTURE_LEVEL_MAX; /* +15.5 dB */
99
} else {
100
uinfo->value.integer.min =
101
PCXHR_LINE_CAPTURE_LEVEL_MIN; /*-112 dB */
102
uinfo->value.integer.max =
103
PCXHR_LINE_CAPTURE_LEVEL_MAX; /* +15.5 dB */
104
}
105
}
106
return 0;
107
}
108
109
static int pcxhr_analog_vol_get(struct snd_kcontrol *kcontrol,
110
struct snd_ctl_elem_value *ucontrol)
111
{
112
struct snd_pcxhr *chip = snd_kcontrol_chip(kcontrol);
113
mutex_lock(&chip->mgr->mixer_mutex);
114
if (kcontrol->private_value == 0) { /* playback */
115
ucontrol->value.integer.value[0] = chip->analog_playback_volume[0];
116
ucontrol->value.integer.value[1] = chip->analog_playback_volume[1];
117
} else { /* capture */
118
ucontrol->value.integer.value[0] = chip->analog_capture_volume[0];
119
ucontrol->value.integer.value[1] = chip->analog_capture_volume[1];
120
}
121
mutex_unlock(&chip->mgr->mixer_mutex);
122
return 0;
123
}
124
125
static int pcxhr_analog_vol_put(struct snd_kcontrol *kcontrol,
126
struct snd_ctl_elem_value *ucontrol)
127
{
128
struct snd_pcxhr *chip = snd_kcontrol_chip(kcontrol);
129
int changed = 0;
130
int is_capture, i;
131
132
mutex_lock(&chip->mgr->mixer_mutex);
133
is_capture = (kcontrol->private_value != 0);
134
for (i = 0; i < 2; i++) {
135
int new_volume = ucontrol->value.integer.value[i];
136
int *stored_volume = is_capture ?
137
&chip->analog_capture_volume[i] :
138
&chip->analog_playback_volume[i];
139
if (is_capture) {
140
if (chip->mgr->is_hr_stereo) {
141
if (new_volume < HR222_LINE_CAPTURE_LEVEL_MIN ||
142
new_volume > HR222_LINE_CAPTURE_LEVEL_MAX)
143
continue;
144
} else {
145
if (new_volume < PCXHR_LINE_CAPTURE_LEVEL_MIN ||
146
new_volume > PCXHR_LINE_CAPTURE_LEVEL_MAX)
147
continue;
148
}
149
} else {
150
if (chip->mgr->is_hr_stereo) {
151
if (new_volume < HR222_LINE_PLAYBACK_LEVEL_MIN ||
152
new_volume > HR222_LINE_PLAYBACK_LEVEL_MAX)
153
continue;
154
} else {
155
if (new_volume < PCXHR_LINE_PLAYBACK_LEVEL_MIN ||
156
new_volume > PCXHR_LINE_PLAYBACK_LEVEL_MAX)
157
continue;
158
}
159
}
160
if (*stored_volume != new_volume) {
161
*stored_volume = new_volume;
162
changed = 1;
163
if (chip->mgr->is_hr_stereo)
164
hr222_update_analog_audio_level(chip,
165
is_capture, i);
166
else
167
pcxhr_update_analog_audio_level(chip,
168
is_capture, i);
169
}
170
}
171
mutex_unlock(&chip->mgr->mixer_mutex);
172
return changed;
173
}
174
175
static const struct snd_kcontrol_new pcxhr_control_analog_level = {
176
.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
177
.access = (SNDRV_CTL_ELEM_ACCESS_READWRITE |
178
SNDRV_CTL_ELEM_ACCESS_TLV_READ),
179
/* name will be filled later */
180
.info = pcxhr_analog_vol_info,
181
.get = pcxhr_analog_vol_get,
182
.put = pcxhr_analog_vol_put,
183
/* tlv will be filled later */
184
};
185
186
/* shared */
187
188
#define pcxhr_sw_info snd_ctl_boolean_stereo_info
189
190
static int pcxhr_audio_sw_get(struct snd_kcontrol *kcontrol,
191
struct snd_ctl_elem_value *ucontrol)
192
{
193
struct snd_pcxhr *chip = snd_kcontrol_chip(kcontrol);
194
195
mutex_lock(&chip->mgr->mixer_mutex);
196
ucontrol->value.integer.value[0] = chip->analog_playback_active[0];
197
ucontrol->value.integer.value[1] = chip->analog_playback_active[1];
198
mutex_unlock(&chip->mgr->mixer_mutex);
199
return 0;
200
}
201
202
static int pcxhr_audio_sw_put(struct snd_kcontrol *kcontrol,
203
struct snd_ctl_elem_value *ucontrol)
204
{
205
struct snd_pcxhr *chip = snd_kcontrol_chip(kcontrol);
206
int i, changed = 0;
207
mutex_lock(&chip->mgr->mixer_mutex);
208
for(i = 0; i < 2; i++) {
209
if (chip->analog_playback_active[i] !=
210
ucontrol->value.integer.value[i]) {
211
chip->analog_playback_active[i] =
212
!!ucontrol->value.integer.value[i];
213
changed = 1;
214
/* update playback levels */
215
if (chip->mgr->is_hr_stereo)
216
hr222_update_analog_audio_level(chip, 0, i);
217
else
218
pcxhr_update_analog_audio_level(chip, 0, i);
219
}
220
}
221
mutex_unlock(&chip->mgr->mixer_mutex);
222
return changed;
223
}
224
225
static const struct snd_kcontrol_new pcxhr_control_output_switch = {
226
.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
227
.name = "Master Playback Switch",
228
.info = pcxhr_sw_info, /* shared */
229
.get = pcxhr_audio_sw_get,
230
.put = pcxhr_audio_sw_put
231
};
232
233
234
#define PCXHR_DIGITAL_LEVEL_MIN 0x000 /* -110 dB */
235
#define PCXHR_DIGITAL_LEVEL_MAX 0x1ff /* +18 dB */
236
#define PCXHR_DIGITAL_ZERO_LEVEL 0x1b7 /* 0 dB */
237
238
static const DECLARE_TLV_DB_SCALE(db_scale_digital, -10975, 25, 1800);
239
240
#define MORE_THAN_ONE_STREAM_LEVEL 0x000001
241
#define VALID_STREAM_PAN_LEVEL_MASK 0x800000
242
#define VALID_STREAM_LEVEL_MASK 0x400000
243
#define VALID_STREAM_LEVEL_1_MASK 0x200000
244
#define VALID_STREAM_LEVEL_2_MASK 0x100000
245
246
static int pcxhr_update_playback_stream_level(struct snd_pcxhr* chip, int idx)
247
{
248
int err;
249
struct pcxhr_rmh rmh;
250
struct pcxhr_pipe *pipe = &chip->playback_pipe;
251
int left, right;
252
253
if (chip->digital_playback_active[idx][0])
254
left = chip->digital_playback_volume[idx][0];
255
else
256
left = PCXHR_DIGITAL_LEVEL_MIN;
257
if (chip->digital_playback_active[idx][1])
258
right = chip->digital_playback_volume[idx][1];
259
else
260
right = PCXHR_DIGITAL_LEVEL_MIN;
261
262
pcxhr_init_rmh(&rmh, CMD_STREAM_OUT_LEVEL_ADJUST);
263
/* add pipe and stream mask */
264
pcxhr_set_pipe_cmd_params(&rmh, 0, pipe->first_audio, 0, 1<<idx);
265
/* volume left->left / right->right panoramic level */
266
rmh.cmd[0] |= MORE_THAN_ONE_STREAM_LEVEL;
267
rmh.cmd[2] = VALID_STREAM_PAN_LEVEL_MASK | VALID_STREAM_LEVEL_1_MASK;
268
rmh.cmd[2] |= (left << 10);
269
rmh.cmd[3] = VALID_STREAM_PAN_LEVEL_MASK | VALID_STREAM_LEVEL_2_MASK;
270
rmh.cmd[3] |= right;
271
rmh.cmd_len = 4;
272
273
err = pcxhr_send_msg(chip->mgr, &rmh);
274
if (err < 0) {
275
dev_dbg(chip->card->dev, "error update_playback_stream_level "
276
"card(%d) err(%x)\n", chip->chip_idx, err);
277
return -EINVAL;
278
}
279
return 0;
280
}
281
282
#define AUDIO_IO_HAS_MUTE_LEVEL 0x400000
283
#define AUDIO_IO_HAS_MUTE_MONITOR_1 0x200000
284
#define VALID_AUDIO_IO_DIGITAL_LEVEL 0x000001
285
#define VALID_AUDIO_IO_MONITOR_LEVEL 0x000002
286
#define VALID_AUDIO_IO_MUTE_LEVEL 0x000004
287
#define VALID_AUDIO_IO_MUTE_MONITOR_1 0x000008
288
289
static int pcxhr_update_audio_pipe_level(struct snd_pcxhr *chip,
290
int capture, int channel)
291
{
292
int err;
293
struct pcxhr_rmh rmh;
294
struct pcxhr_pipe *pipe;
295
296
if (capture)
297
pipe = &chip->capture_pipe[0];
298
else
299
pipe = &chip->playback_pipe;
300
301
pcxhr_init_rmh(&rmh, CMD_AUDIO_LEVEL_ADJUST);
302
/* add channel mask */
303
pcxhr_set_pipe_cmd_params(&rmh, capture, 0, 0,
304
1 << (channel + pipe->first_audio));
305
/* TODO : if mask (3 << pipe->first_audio) is used, left and right
306
* channel will be programmed to the same params */
307
if (capture) {
308
rmh.cmd[0] |= VALID_AUDIO_IO_DIGITAL_LEVEL;
309
/* VALID_AUDIO_IO_MUTE_LEVEL not yet handled
310
* (capture pipe level) */
311
rmh.cmd[2] = chip->digital_capture_volume[channel];
312
} else {
313
rmh.cmd[0] |= VALID_AUDIO_IO_MONITOR_LEVEL |
314
VALID_AUDIO_IO_MUTE_MONITOR_1;
315
/* VALID_AUDIO_IO_DIGITAL_LEVEL and VALID_AUDIO_IO_MUTE_LEVEL
316
* not yet handled (playback pipe level)
317
*/
318
rmh.cmd[2] = chip->monitoring_volume[channel] << 10;
319
if (chip->monitoring_active[channel] == 0)
320
rmh.cmd[2] |= AUDIO_IO_HAS_MUTE_MONITOR_1;
321
}
322
rmh.cmd_len = 3;
323
324
err = pcxhr_send_msg(chip->mgr, &rmh);
325
if (err < 0) {
326
dev_dbg(chip->card->dev,
327
"error update_audio_level(%d) err=%x\n",
328
chip->chip_idx, err);
329
return -EINVAL;
330
}
331
return 0;
332
}
333
334
335
/* shared */
336
static int pcxhr_digital_vol_info(struct snd_kcontrol *kcontrol,
337
struct snd_ctl_elem_info *uinfo)
338
{
339
uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
340
uinfo->count = 2;
341
uinfo->value.integer.min = PCXHR_DIGITAL_LEVEL_MIN; /* -109.5 dB */
342
uinfo->value.integer.max = PCXHR_DIGITAL_LEVEL_MAX; /* 18.0 dB */
343
return 0;
344
}
345
346
347
static int pcxhr_pcm_vol_get(struct snd_kcontrol *kcontrol,
348
struct snd_ctl_elem_value *ucontrol)
349
{
350
struct snd_pcxhr *chip = snd_kcontrol_chip(kcontrol);
351
int idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id); /* index */
352
int *stored_volume;
353
int is_capture = kcontrol->private_value;
354
355
mutex_lock(&chip->mgr->mixer_mutex);
356
if (is_capture) /* digital capture */
357
stored_volume = chip->digital_capture_volume;
358
else /* digital playback */
359
stored_volume = chip->digital_playback_volume[idx];
360
ucontrol->value.integer.value[0] = stored_volume[0];
361
ucontrol->value.integer.value[1] = stored_volume[1];
362
mutex_unlock(&chip->mgr->mixer_mutex);
363
return 0;
364
}
365
366
static int pcxhr_pcm_vol_put(struct snd_kcontrol *kcontrol,
367
struct snd_ctl_elem_value *ucontrol)
368
{
369
struct snd_pcxhr *chip = snd_kcontrol_chip(kcontrol);
370
int idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id); /* index */
371
int changed = 0;
372
int is_capture = kcontrol->private_value;
373
int *stored_volume;
374
int i;
375
376
mutex_lock(&chip->mgr->mixer_mutex);
377
if (is_capture) /* digital capture */
378
stored_volume = chip->digital_capture_volume;
379
else /* digital playback */
380
stored_volume = chip->digital_playback_volume[idx];
381
for (i = 0; i < 2; i++) {
382
int vol = ucontrol->value.integer.value[i];
383
if (vol < PCXHR_DIGITAL_LEVEL_MIN ||
384
vol > PCXHR_DIGITAL_LEVEL_MAX)
385
continue;
386
if (stored_volume[i] != vol) {
387
stored_volume[i] = vol;
388
changed = 1;
389
if (is_capture) /* update capture volume */
390
pcxhr_update_audio_pipe_level(chip, 1, i);
391
}
392
}
393
if (!is_capture && changed) /* update playback volume */
394
pcxhr_update_playback_stream_level(chip, idx);
395
mutex_unlock(&chip->mgr->mixer_mutex);
396
return changed;
397
}
398
399
static const struct snd_kcontrol_new snd_pcxhr_pcm_vol =
400
{
401
.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
402
.access = (SNDRV_CTL_ELEM_ACCESS_READWRITE |
403
SNDRV_CTL_ELEM_ACCESS_TLV_READ),
404
/* name will be filled later */
405
/* count will be filled later */
406
.info = pcxhr_digital_vol_info, /* shared */
407
.get = pcxhr_pcm_vol_get,
408
.put = pcxhr_pcm_vol_put,
409
.tlv = { .p = db_scale_digital },
410
};
411
412
413
static int pcxhr_pcm_sw_get(struct snd_kcontrol *kcontrol,
414
struct snd_ctl_elem_value *ucontrol)
415
{
416
struct snd_pcxhr *chip = snd_kcontrol_chip(kcontrol);
417
int idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id); /* index */
418
419
mutex_lock(&chip->mgr->mixer_mutex);
420
ucontrol->value.integer.value[0] = chip->digital_playback_active[idx][0];
421
ucontrol->value.integer.value[1] = chip->digital_playback_active[idx][1];
422
mutex_unlock(&chip->mgr->mixer_mutex);
423
return 0;
424
}
425
426
static int pcxhr_pcm_sw_put(struct snd_kcontrol *kcontrol,
427
struct snd_ctl_elem_value *ucontrol)
428
{
429
struct snd_pcxhr *chip = snd_kcontrol_chip(kcontrol);
430
int changed = 0;
431
int idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id); /* index */
432
int i, j;
433
434
mutex_lock(&chip->mgr->mixer_mutex);
435
j = idx;
436
for (i = 0; i < 2; i++) {
437
if (chip->digital_playback_active[j][i] !=
438
ucontrol->value.integer.value[i]) {
439
chip->digital_playback_active[j][i] =
440
!!ucontrol->value.integer.value[i];
441
changed = 1;
442
}
443
}
444
if (changed)
445
pcxhr_update_playback_stream_level(chip, idx);
446
mutex_unlock(&chip->mgr->mixer_mutex);
447
return changed;
448
}
449
450
static const struct snd_kcontrol_new pcxhr_control_pcm_switch = {
451
.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
452
.name = "PCM Playback Switch",
453
.count = PCXHR_PLAYBACK_STREAMS,
454
.info = pcxhr_sw_info, /* shared */
455
.get = pcxhr_pcm_sw_get,
456
.put = pcxhr_pcm_sw_put
457
};
458
459
460
/*
461
* monitoring level control
462
*/
463
464
static int pcxhr_monitor_vol_get(struct snd_kcontrol *kcontrol,
465
struct snd_ctl_elem_value *ucontrol)
466
{
467
struct snd_pcxhr *chip = snd_kcontrol_chip(kcontrol);
468
mutex_lock(&chip->mgr->mixer_mutex);
469
ucontrol->value.integer.value[0] = chip->monitoring_volume[0];
470
ucontrol->value.integer.value[1] = chip->monitoring_volume[1];
471
mutex_unlock(&chip->mgr->mixer_mutex);
472
return 0;
473
}
474
475
static int pcxhr_monitor_vol_put(struct snd_kcontrol *kcontrol,
476
struct snd_ctl_elem_value *ucontrol)
477
{
478
struct snd_pcxhr *chip = snd_kcontrol_chip(kcontrol);
479
int changed = 0;
480
int i;
481
482
mutex_lock(&chip->mgr->mixer_mutex);
483
for (i = 0; i < 2; i++) {
484
if (chip->monitoring_volume[i] !=
485
ucontrol->value.integer.value[i]) {
486
chip->monitoring_volume[i] =
487
ucontrol->value.integer.value[i];
488
if (chip->monitoring_active[i])
489
/* update monitoring volume and mute */
490
/* do only when monitoring is unmuted */
491
pcxhr_update_audio_pipe_level(chip, 0, i);
492
changed = 1;
493
}
494
}
495
mutex_unlock(&chip->mgr->mixer_mutex);
496
return changed;
497
}
498
499
static const struct snd_kcontrol_new pcxhr_control_monitor_vol = {
500
.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
501
.access = (SNDRV_CTL_ELEM_ACCESS_READWRITE |
502
SNDRV_CTL_ELEM_ACCESS_TLV_READ),
503
.name = "Monitoring Playback Volume",
504
.info = pcxhr_digital_vol_info, /* shared */
505
.get = pcxhr_monitor_vol_get,
506
.put = pcxhr_monitor_vol_put,
507
.tlv = { .p = db_scale_digital },
508
};
509
510
/*
511
* monitoring switch control
512
*/
513
514
static int pcxhr_monitor_sw_get(struct snd_kcontrol *kcontrol,
515
struct snd_ctl_elem_value *ucontrol)
516
{
517
struct snd_pcxhr *chip = snd_kcontrol_chip(kcontrol);
518
mutex_lock(&chip->mgr->mixer_mutex);
519
ucontrol->value.integer.value[0] = chip->monitoring_active[0];
520
ucontrol->value.integer.value[1] = chip->monitoring_active[1];
521
mutex_unlock(&chip->mgr->mixer_mutex);
522
return 0;
523
}
524
525
static int pcxhr_monitor_sw_put(struct snd_kcontrol *kcontrol,
526
struct snd_ctl_elem_value *ucontrol)
527
{
528
struct snd_pcxhr *chip = snd_kcontrol_chip(kcontrol);
529
int changed = 0;
530
int i;
531
532
mutex_lock(&chip->mgr->mixer_mutex);
533
for (i = 0; i < 2; i++) {
534
if (chip->monitoring_active[i] !=
535
ucontrol->value.integer.value[i]) {
536
chip->monitoring_active[i] =
537
!!ucontrol->value.integer.value[i];
538
changed |= (1<<i); /* mask 0x01 and 0x02 */
539
}
540
}
541
if (changed & 0x01)
542
/* update left monitoring volume and mute */
543
pcxhr_update_audio_pipe_level(chip, 0, 0);
544
if (changed & 0x02)
545
/* update right monitoring volume and mute */
546
pcxhr_update_audio_pipe_level(chip, 0, 1);
547
548
mutex_unlock(&chip->mgr->mixer_mutex);
549
return (changed != 0);
550
}
551
552
static const struct snd_kcontrol_new pcxhr_control_monitor_sw = {
553
.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
554
.name = "Monitoring Playback Switch",
555
.info = pcxhr_sw_info, /* shared */
556
.get = pcxhr_monitor_sw_get,
557
.put = pcxhr_monitor_sw_put
558
};
559
560
561
562
/*
563
* audio source select
564
*/
565
#define PCXHR_SOURCE_AUDIO01_UER 0x000100
566
#define PCXHR_SOURCE_AUDIO01_SYNC 0x000200
567
#define PCXHR_SOURCE_AUDIO23_UER 0x000400
568
#define PCXHR_SOURCE_AUDIO45_UER 0x001000
569
#define PCXHR_SOURCE_AUDIO67_UER 0x040000
570
571
static int pcxhr_set_audio_source(struct snd_pcxhr* chip)
572
{
573
struct pcxhr_rmh rmh;
574
unsigned int mask, reg;
575
unsigned int codec;
576
int err, changed;
577
578
switch (chip->chip_idx) {
579
case 0 : mask = PCXHR_SOURCE_AUDIO01_UER; codec = CS8420_01_CS; break;
580
case 1 : mask = PCXHR_SOURCE_AUDIO23_UER; codec = CS8420_23_CS; break;
581
case 2 : mask = PCXHR_SOURCE_AUDIO45_UER; codec = CS8420_45_CS; break;
582
case 3 : mask = PCXHR_SOURCE_AUDIO67_UER; codec = CS8420_67_CS; break;
583
default: return -EINVAL;
584
}
585
if (chip->audio_capture_source != 0) {
586
reg = mask; /* audio source from digital plug */
587
} else {
588
reg = 0; /* audio source from analog plug */
589
}
590
/* set the input source */
591
pcxhr_write_io_num_reg_cont(chip->mgr, mask, reg, &changed);
592
/* resync them (otherwise channel inversion possible) */
593
if (changed) {
594
pcxhr_init_rmh(&rmh, CMD_RESYNC_AUDIO_INPUTS);
595
rmh.cmd[0] |= (1 << chip->chip_idx);
596
err = pcxhr_send_msg(chip->mgr, &rmh);
597
if (err)
598
return err;
599
}
600
if (chip->mgr->board_aes_in_192k) {
601
int i;
602
unsigned int src_config = 0xC0;
603
/* update all src configs with one call */
604
for (i = 0; (i < 4) && (i < chip->mgr->capture_chips); i++) {
605
if (chip->mgr->chip[i]->audio_capture_source == 2)
606
src_config |= (1 << (3 - i));
607
}
608
/* set codec SRC on off */
609
pcxhr_init_rmh(&rmh, CMD_ACCESS_IO_WRITE);
610
rmh.cmd_len = 2;
611
rmh.cmd[0] |= IO_NUM_REG_CONFIG_SRC;
612
rmh.cmd[1] = src_config;
613
err = pcxhr_send_msg(chip->mgr, &rmh);
614
} else {
615
int use_src = 0;
616
if (chip->audio_capture_source == 2)
617
use_src = 1;
618
/* set codec SRC on off */
619
pcxhr_init_rmh(&rmh, CMD_ACCESS_IO_WRITE);
620
rmh.cmd_len = 3;
621
rmh.cmd[0] |= IO_NUM_UER_CHIP_REG;
622
rmh.cmd[1] = codec;
623
rmh.cmd[2] = ((CS8420_DATA_FLOW_CTL & CHIP_SIG_AND_MAP_SPI) |
624
(use_src ? 0x41 : 0x54));
625
err = pcxhr_send_msg(chip->mgr, &rmh);
626
if (err)
627
return err;
628
rmh.cmd[2] = ((CS8420_CLOCK_SRC_CTL & CHIP_SIG_AND_MAP_SPI) |
629
(use_src ? 0x41 : 0x49));
630
err = pcxhr_send_msg(chip->mgr, &rmh);
631
}
632
return err;
633
}
634
635
static int pcxhr_audio_src_info(struct snd_kcontrol *kcontrol,
636
struct snd_ctl_elem_info *uinfo)
637
{
638
static const char *texts[5] = {
639
"Line", "Digital", "Digi+SRC", "Mic", "Line+Mic"
640
};
641
int i;
642
struct snd_pcxhr *chip = snd_kcontrol_chip(kcontrol);
643
644
i = 2; /* no SRC, no Mic available */
645
if (chip->mgr->board_has_aes1) {
646
i = 3; /* SRC available */
647
if (chip->mgr->board_has_mic)
648
i = 5; /* Mic and MicroMix available */
649
}
650
return snd_ctl_enum_info(uinfo, 1, i, texts);
651
}
652
653
static int pcxhr_audio_src_get(struct snd_kcontrol *kcontrol,
654
struct snd_ctl_elem_value *ucontrol)
655
{
656
struct snd_pcxhr *chip = snd_kcontrol_chip(kcontrol);
657
ucontrol->value.enumerated.item[0] = chip->audio_capture_source;
658
return 0;
659
}
660
661
static int pcxhr_audio_src_put(struct snd_kcontrol *kcontrol,
662
struct snd_ctl_elem_value *ucontrol)
663
{
664
struct snd_pcxhr *chip = snd_kcontrol_chip(kcontrol);
665
int ret = 0;
666
int i = 2; /* no SRC, no Mic available */
667
if (chip->mgr->board_has_aes1) {
668
i = 3; /* SRC available */
669
if (chip->mgr->board_has_mic)
670
i = 5; /* Mic and MicroMix available */
671
}
672
if (ucontrol->value.enumerated.item[0] >= i)
673
return -EINVAL;
674
mutex_lock(&chip->mgr->mixer_mutex);
675
if (chip->audio_capture_source != ucontrol->value.enumerated.item[0]) {
676
chip->audio_capture_source = ucontrol->value.enumerated.item[0];
677
if (chip->mgr->is_hr_stereo)
678
hr222_set_audio_source(chip);
679
else
680
pcxhr_set_audio_source(chip);
681
ret = 1;
682
}
683
mutex_unlock(&chip->mgr->mixer_mutex);
684
return ret;
685
}
686
687
static const struct snd_kcontrol_new pcxhr_control_audio_src = {
688
.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
689
.name = "Capture Source",
690
.info = pcxhr_audio_src_info,
691
.get = pcxhr_audio_src_get,
692
.put = pcxhr_audio_src_put,
693
};
694
695
696
/*
697
* clock type selection
698
* enum pcxhr_clock_type {
699
* PCXHR_CLOCK_TYPE_INTERNAL = 0,
700
* PCXHR_CLOCK_TYPE_WORD_CLOCK,
701
* PCXHR_CLOCK_TYPE_AES_SYNC,
702
* PCXHR_CLOCK_TYPE_AES_1,
703
* PCXHR_CLOCK_TYPE_AES_2,
704
* PCXHR_CLOCK_TYPE_AES_3,
705
* PCXHR_CLOCK_TYPE_AES_4,
706
* PCXHR_CLOCK_TYPE_MAX = PCXHR_CLOCK_TYPE_AES_4,
707
* HR22_CLOCK_TYPE_INTERNAL = PCXHR_CLOCK_TYPE_INTERNAL,
708
* HR22_CLOCK_TYPE_AES_SYNC,
709
* HR22_CLOCK_TYPE_AES_1,
710
* HR22_CLOCK_TYPE_MAX = HR22_CLOCK_TYPE_AES_1,
711
* };
712
*/
713
714
static int pcxhr_clock_type_info(struct snd_kcontrol *kcontrol,
715
struct snd_ctl_elem_info *uinfo)
716
{
717
static const char *textsPCXHR[7] = {
718
"Internal", "WordClock", "AES Sync",
719
"AES 1", "AES 2", "AES 3", "AES 4"
720
};
721
static const char *textsHR22[3] = {
722
"Internal", "AES Sync", "AES 1"
723
};
724
const char **texts;
725
struct pcxhr_mgr *mgr = snd_kcontrol_chip(kcontrol);
726
int clock_items = 2; /* at least Internal and AES Sync clock */
727
if (mgr->board_has_aes1) {
728
clock_items += mgr->capture_chips; /* add AES x */
729
if (!mgr->is_hr_stereo)
730
clock_items += 1; /* add word clock */
731
}
732
if (mgr->is_hr_stereo) {
733
texts = textsHR22;
734
snd_BUG_ON(clock_items > (HR22_CLOCK_TYPE_MAX+1));
735
} else {
736
texts = textsPCXHR;
737
snd_BUG_ON(clock_items > (PCXHR_CLOCK_TYPE_MAX+1));
738
}
739
return snd_ctl_enum_info(uinfo, 1, clock_items, texts);
740
}
741
742
static int pcxhr_clock_type_get(struct snd_kcontrol *kcontrol,
743
struct snd_ctl_elem_value *ucontrol)
744
{
745
struct pcxhr_mgr *mgr = snd_kcontrol_chip(kcontrol);
746
ucontrol->value.enumerated.item[0] = mgr->use_clock_type;
747
return 0;
748
}
749
750
static int pcxhr_clock_type_put(struct snd_kcontrol *kcontrol,
751
struct snd_ctl_elem_value *ucontrol)
752
{
753
struct pcxhr_mgr *mgr = snd_kcontrol_chip(kcontrol);
754
int rate, ret = 0;
755
unsigned int clock_items = 2; /* at least Internal and AES Sync clock */
756
if (mgr->board_has_aes1) {
757
clock_items += mgr->capture_chips; /* add AES x */
758
if (!mgr->is_hr_stereo)
759
clock_items += 1; /* add word clock */
760
}
761
if (ucontrol->value.enumerated.item[0] >= clock_items)
762
return -EINVAL;
763
mutex_lock(&mgr->mixer_mutex);
764
if (mgr->use_clock_type != ucontrol->value.enumerated.item[0]) {
765
mutex_lock(&mgr->setup_mutex);
766
mgr->use_clock_type = ucontrol->value.enumerated.item[0];
767
rate = 0;
768
if (mgr->use_clock_type != PCXHR_CLOCK_TYPE_INTERNAL) {
769
pcxhr_get_external_clock(mgr, mgr->use_clock_type,
770
&rate);
771
} else {
772
rate = mgr->sample_rate;
773
if (!rate)
774
rate = 48000;
775
}
776
if (rate) {
777
pcxhr_set_clock(mgr, rate);
778
if (mgr->sample_rate)
779
mgr->sample_rate = rate;
780
}
781
mutex_unlock(&mgr->setup_mutex);
782
ret = 1; /* return 1 even if the set was not done. ok ? */
783
}
784
mutex_unlock(&mgr->mixer_mutex);
785
return ret;
786
}
787
788
static const struct snd_kcontrol_new pcxhr_control_clock_type = {
789
.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
790
.name = "Clock Mode",
791
.info = pcxhr_clock_type_info,
792
.get = pcxhr_clock_type_get,
793
.put = pcxhr_clock_type_put,
794
};
795
796
/*
797
* clock rate control
798
* specific control that scans the sample rates on the external plugs
799
*/
800
static int pcxhr_clock_rate_info(struct snd_kcontrol *kcontrol,
801
struct snd_ctl_elem_info *uinfo)
802
{
803
struct pcxhr_mgr *mgr = snd_kcontrol_chip(kcontrol);
804
uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
805
uinfo->count = 3 + mgr->capture_chips;
806
uinfo->value.integer.min = 0; /* clock not present */
807
uinfo->value.integer.max = 192000; /* max sample rate 192 kHz */
808
return 0;
809
}
810
811
static int pcxhr_clock_rate_get(struct snd_kcontrol *kcontrol,
812
struct snd_ctl_elem_value *ucontrol)
813
{
814
struct pcxhr_mgr *mgr = snd_kcontrol_chip(kcontrol);
815
int i, err, rate;
816
817
mutex_lock(&mgr->mixer_mutex);
818
for(i = 0; i < 3 + mgr->capture_chips; i++) {
819
if (i == PCXHR_CLOCK_TYPE_INTERNAL)
820
rate = mgr->sample_rate_real;
821
else {
822
err = pcxhr_get_external_clock(mgr, i, &rate);
823
if (err)
824
break;
825
}
826
ucontrol->value.integer.value[i] = rate;
827
}
828
mutex_unlock(&mgr->mixer_mutex);
829
return 0;
830
}
831
832
static const struct snd_kcontrol_new pcxhr_control_clock_rate = {
833
.access = SNDRV_CTL_ELEM_ACCESS_READ,
834
.iface = SNDRV_CTL_ELEM_IFACE_CARD,
835
.name = "Clock Rates",
836
.info = pcxhr_clock_rate_info,
837
.get = pcxhr_clock_rate_get,
838
};
839
840
/*
841
* IEC958 status bits
842
*/
843
static int pcxhr_iec958_info(struct snd_kcontrol *kcontrol,
844
struct snd_ctl_elem_info *uinfo)
845
{
846
uinfo->type = SNDRV_CTL_ELEM_TYPE_IEC958;
847
uinfo->count = 1;
848
return 0;
849
}
850
851
static int pcxhr_iec958_capture_byte(struct snd_pcxhr *chip,
852
int aes_idx, unsigned char *aes_bits)
853
{
854
int i, err;
855
unsigned char temp;
856
struct pcxhr_rmh rmh;
857
858
pcxhr_init_rmh(&rmh, CMD_ACCESS_IO_READ);
859
rmh.cmd[0] |= IO_NUM_UER_CHIP_REG;
860
switch (chip->chip_idx) {
861
/* instead of CS8420_01_CS use CS8416_01_CS for AES SYNC plug */
862
case 0: rmh.cmd[1] = CS8420_01_CS; break;
863
case 1: rmh.cmd[1] = CS8420_23_CS; break;
864
case 2: rmh.cmd[1] = CS8420_45_CS; break;
865
case 3: rmh.cmd[1] = CS8420_67_CS; break;
866
default: return -EINVAL;
867
}
868
if (chip->mgr->board_aes_in_192k) {
869
switch (aes_idx) {
870
case 0: rmh.cmd[2] = CS8416_CSB0; break;
871
case 1: rmh.cmd[2] = CS8416_CSB1; break;
872
case 2: rmh.cmd[2] = CS8416_CSB2; break;
873
case 3: rmh.cmd[2] = CS8416_CSB3; break;
874
case 4: rmh.cmd[2] = CS8416_CSB4; break;
875
default: return -EINVAL;
876
}
877
} else {
878
switch (aes_idx) {
879
/* instead of CS8420_CSB0 use CS8416_CSBx for AES SYNC plug */
880
case 0: rmh.cmd[2] = CS8420_CSB0; break;
881
case 1: rmh.cmd[2] = CS8420_CSB1; break;
882
case 2: rmh.cmd[2] = CS8420_CSB2; break;
883
case 3: rmh.cmd[2] = CS8420_CSB3; break;
884
case 4: rmh.cmd[2] = CS8420_CSB4; break;
885
default: return -EINVAL;
886
}
887
}
888
/* size and code the chip id for the fpga */
889
rmh.cmd[1] &= 0x0fffff;
890
/* chip signature + map for spi read */
891
rmh.cmd[2] &= CHIP_SIG_AND_MAP_SPI;
892
rmh.cmd_len = 3;
893
err = pcxhr_send_msg(chip->mgr, &rmh);
894
if (err)
895
return err;
896
897
if (chip->mgr->board_aes_in_192k) {
898
temp = (unsigned char)rmh.stat[1];
899
} else {
900
temp = 0;
901
/* reversed bit order (not with CS8416_01_CS) */
902
for (i = 0; i < 8; i++) {
903
temp <<= 1;
904
if (rmh.stat[1] & (1 << i))
905
temp |= 1;
906
}
907
}
908
dev_dbg(chip->card->dev, "read iec958 AES %d byte %d = 0x%x\n",
909
chip->chip_idx, aes_idx, temp);
910
*aes_bits = temp;
911
return 0;
912
}
913
914
static int pcxhr_iec958_get(struct snd_kcontrol *kcontrol,
915
struct snd_ctl_elem_value *ucontrol)
916
{
917
struct snd_pcxhr *chip = snd_kcontrol_chip(kcontrol);
918
unsigned char aes_bits;
919
int i, err;
920
921
mutex_lock(&chip->mgr->mixer_mutex);
922
for(i = 0; i < 5; i++) {
923
if (kcontrol->private_value == 0) /* playback */
924
aes_bits = chip->aes_bits[i];
925
else { /* capture */
926
if (chip->mgr->is_hr_stereo)
927
err = hr222_iec958_capture_byte(chip, i,
928
&aes_bits);
929
else
930
err = pcxhr_iec958_capture_byte(chip, i,
931
&aes_bits);
932
if (err)
933
break;
934
}
935
ucontrol->value.iec958.status[i] = aes_bits;
936
}
937
mutex_unlock(&chip->mgr->mixer_mutex);
938
return 0;
939
}
940
941
static int pcxhr_iec958_mask_get(struct snd_kcontrol *kcontrol,
942
struct snd_ctl_elem_value *ucontrol)
943
{
944
int i;
945
for (i = 0; i < 5; i++)
946
ucontrol->value.iec958.status[i] = 0xff;
947
return 0;
948
}
949
950
static int pcxhr_iec958_update_byte(struct snd_pcxhr *chip,
951
int aes_idx, unsigned char aes_bits)
952
{
953
int i, err, cmd;
954
unsigned char new_bits = aes_bits;
955
unsigned char old_bits = chip->aes_bits[aes_idx];
956
struct pcxhr_rmh rmh;
957
958
for (i = 0; i < 8; i++) {
959
if ((old_bits & 0x01) != (new_bits & 0x01)) {
960
cmd = chip->chip_idx & 0x03; /* chip index 0..3 */
961
if (chip->chip_idx > 3)
962
/* new bit used if chip_idx>3 (PCX1222HR) */
963
cmd |= 1 << 22;
964
cmd |= ((aes_idx << 3) + i) << 2; /* add bit offset */
965
cmd |= (new_bits & 0x01) << 23; /* add bit value */
966
pcxhr_init_rmh(&rmh, CMD_ACCESS_IO_WRITE);
967
rmh.cmd[0] |= IO_NUM_REG_CUER;
968
rmh.cmd[1] = cmd;
969
rmh.cmd_len = 2;
970
dev_dbg(chip->card->dev,
971
"write iec958 AES %d byte %d bit %d (cmd %x)\n",
972
chip->chip_idx, aes_idx, i, cmd);
973
err = pcxhr_send_msg(chip->mgr, &rmh);
974
if (err)
975
return err;
976
}
977
old_bits >>= 1;
978
new_bits >>= 1;
979
}
980
chip->aes_bits[aes_idx] = aes_bits;
981
return 0;
982
}
983
984
static int pcxhr_iec958_put(struct snd_kcontrol *kcontrol,
985
struct snd_ctl_elem_value *ucontrol)
986
{
987
struct snd_pcxhr *chip = snd_kcontrol_chip(kcontrol);
988
int i, changed = 0;
989
990
/* playback */
991
mutex_lock(&chip->mgr->mixer_mutex);
992
for (i = 0; i < 5; i++) {
993
if (ucontrol->value.iec958.status[i] != chip->aes_bits[i]) {
994
if (chip->mgr->is_hr_stereo)
995
hr222_iec958_update_byte(chip, i,
996
ucontrol->value.iec958.status[i]);
997
else
998
pcxhr_iec958_update_byte(chip, i,
999
ucontrol->value.iec958.status[i]);
1000
changed = 1;
1001
}
1002
}
1003
mutex_unlock(&chip->mgr->mixer_mutex);
1004
return changed;
1005
}
1006
1007
static const struct snd_kcontrol_new pcxhr_control_playback_iec958_mask = {
1008
.access = SNDRV_CTL_ELEM_ACCESS_READ,
1009
.iface = SNDRV_CTL_ELEM_IFACE_PCM,
1010
.name = SNDRV_CTL_NAME_IEC958("",PLAYBACK,MASK),
1011
.info = pcxhr_iec958_info,
1012
.get = pcxhr_iec958_mask_get
1013
};
1014
static const struct snd_kcontrol_new pcxhr_control_playback_iec958 = {
1015
.iface = SNDRV_CTL_ELEM_IFACE_PCM,
1016
.name = SNDRV_CTL_NAME_IEC958("",PLAYBACK,DEFAULT),
1017
.info = pcxhr_iec958_info,
1018
.get = pcxhr_iec958_get,
1019
.put = pcxhr_iec958_put,
1020
.private_value = 0 /* playback */
1021
};
1022
1023
static const struct snd_kcontrol_new pcxhr_control_capture_iec958_mask = {
1024
.access = SNDRV_CTL_ELEM_ACCESS_READ,
1025
.iface = SNDRV_CTL_ELEM_IFACE_PCM,
1026
.name = SNDRV_CTL_NAME_IEC958("",CAPTURE,MASK),
1027
.info = pcxhr_iec958_info,
1028
.get = pcxhr_iec958_mask_get
1029
};
1030
static const struct snd_kcontrol_new pcxhr_control_capture_iec958 = {
1031
.access = SNDRV_CTL_ELEM_ACCESS_READ,
1032
.iface = SNDRV_CTL_ELEM_IFACE_PCM,
1033
.name = SNDRV_CTL_NAME_IEC958("",CAPTURE,DEFAULT),
1034
.info = pcxhr_iec958_info,
1035
.get = pcxhr_iec958_get,
1036
.private_value = 1 /* capture */
1037
};
1038
1039
static void pcxhr_init_audio_levels(struct snd_pcxhr *chip)
1040
{
1041
int i;
1042
1043
for (i = 0; i < 2; i++) {
1044
if (chip->nb_streams_play) {
1045
int j;
1046
/* at boot time the digital volumes are unmuted 0dB */
1047
for (j = 0; j < PCXHR_PLAYBACK_STREAMS; j++) {
1048
chip->digital_playback_active[j][i] = 1;
1049
chip->digital_playback_volume[j][i] =
1050
PCXHR_DIGITAL_ZERO_LEVEL;
1051
}
1052
/* after boot, only two bits are set on the uer
1053
* interface
1054
*/
1055
chip->aes_bits[0] = (IEC958_AES0_PROFESSIONAL |
1056
IEC958_AES0_PRO_FS_48000);
1057
#ifdef CONFIG_SND_DEBUG
1058
/* analog volumes for playback
1059
* (is LEVEL_MIN after boot)
1060
*/
1061
chip->analog_playback_active[i] = 1;
1062
if (chip->mgr->is_hr_stereo)
1063
chip->analog_playback_volume[i] =
1064
HR222_LINE_PLAYBACK_ZERO_LEVEL;
1065
else {
1066
chip->analog_playback_volume[i] =
1067
PCXHR_LINE_PLAYBACK_ZERO_LEVEL;
1068
pcxhr_update_analog_audio_level(chip, 0, i);
1069
}
1070
#endif
1071
/* stereo cards need to be initialised after boot */
1072
if (chip->mgr->is_hr_stereo)
1073
hr222_update_analog_audio_level(chip, 0, i);
1074
}
1075
if (chip->nb_streams_capt) {
1076
/* at boot time the digital volumes are unmuted 0dB */
1077
chip->digital_capture_volume[i] =
1078
PCXHR_DIGITAL_ZERO_LEVEL;
1079
chip->analog_capture_active = 1;
1080
#ifdef CONFIG_SND_DEBUG
1081
/* analog volumes for playback
1082
* (is LEVEL_MIN after boot)
1083
*/
1084
if (chip->mgr->is_hr_stereo)
1085
chip->analog_capture_volume[i] =
1086
HR222_LINE_CAPTURE_ZERO_LEVEL;
1087
else {
1088
chip->analog_capture_volume[i] =
1089
PCXHR_LINE_CAPTURE_ZERO_LEVEL;
1090
pcxhr_update_analog_audio_level(chip, 1, i);
1091
}
1092
#endif
1093
/* stereo cards need to be initialised after boot */
1094
if (chip->mgr->is_hr_stereo)
1095
hr222_update_analog_audio_level(chip, 1, i);
1096
}
1097
}
1098
1099
return;
1100
}
1101
1102
1103
int pcxhr_create_mixer(struct pcxhr_mgr *mgr)
1104
{
1105
struct snd_pcxhr *chip;
1106
int err, i;
1107
1108
mutex_init(&mgr->mixer_mutex); /* can be in another place */
1109
1110
for (i = 0; i < mgr->num_cards; i++) {
1111
struct snd_kcontrol_new temp;
1112
chip = mgr->chip[i];
1113
1114
if (chip->nb_streams_play) {
1115
/* analog output level control */
1116
temp = pcxhr_control_analog_level;
1117
temp.name = "Master Playback Volume";
1118
temp.private_value = 0; /* playback */
1119
if (mgr->is_hr_stereo)
1120
temp.tlv.p = db_scale_a_hr222_playback;
1121
else
1122
temp.tlv.p = db_scale_analog_playback;
1123
err = snd_ctl_add(chip->card,
1124
snd_ctl_new1(&temp, chip));
1125
if (err < 0)
1126
return err;
1127
1128
/* output mute controls */
1129
err = snd_ctl_add(chip->card,
1130
snd_ctl_new1(&pcxhr_control_output_switch,
1131
chip));
1132
if (err < 0)
1133
return err;
1134
1135
temp = snd_pcxhr_pcm_vol;
1136
temp.name = "PCM Playback Volume";
1137
temp.count = PCXHR_PLAYBACK_STREAMS;
1138
temp.private_value = 0; /* playback */
1139
err = snd_ctl_add(chip->card,
1140
snd_ctl_new1(&temp, chip));
1141
if (err < 0)
1142
return err;
1143
1144
err = snd_ctl_add(chip->card,
1145
snd_ctl_new1(&pcxhr_control_pcm_switch, chip));
1146
if (err < 0)
1147
return err;
1148
1149
/* IEC958 controls */
1150
err = snd_ctl_add(chip->card,
1151
snd_ctl_new1(&pcxhr_control_playback_iec958_mask,
1152
chip));
1153
if (err < 0)
1154
return err;
1155
1156
err = snd_ctl_add(chip->card,
1157
snd_ctl_new1(&pcxhr_control_playback_iec958,
1158
chip));
1159
if (err < 0)
1160
return err;
1161
}
1162
if (chip->nb_streams_capt) {
1163
/* analog input level control */
1164
temp = pcxhr_control_analog_level;
1165
temp.name = "Line Capture Volume";
1166
temp.private_value = 1; /* capture */
1167
if (mgr->is_hr_stereo)
1168
temp.tlv.p = db_scale_a_hr222_capture;
1169
else
1170
temp.tlv.p = db_scale_analog_capture;
1171
1172
err = snd_ctl_add(chip->card,
1173
snd_ctl_new1(&temp, chip));
1174
if (err < 0)
1175
return err;
1176
1177
temp = snd_pcxhr_pcm_vol;
1178
temp.name = "PCM Capture Volume";
1179
temp.count = 1;
1180
temp.private_value = 1; /* capture */
1181
1182
err = snd_ctl_add(chip->card,
1183
snd_ctl_new1(&temp, chip));
1184
if (err < 0)
1185
return err;
1186
1187
/* Audio source */
1188
err = snd_ctl_add(chip->card,
1189
snd_ctl_new1(&pcxhr_control_audio_src, chip));
1190
if (err < 0)
1191
return err;
1192
1193
/* IEC958 controls */
1194
err = snd_ctl_add(chip->card,
1195
snd_ctl_new1(&pcxhr_control_capture_iec958_mask,
1196
chip));
1197
if (err < 0)
1198
return err;
1199
1200
err = snd_ctl_add(chip->card,
1201
snd_ctl_new1(&pcxhr_control_capture_iec958,
1202
chip));
1203
if (err < 0)
1204
return err;
1205
1206
if (mgr->is_hr_stereo) {
1207
err = hr222_add_mic_controls(chip);
1208
if (err < 0)
1209
return err;
1210
}
1211
}
1212
/* monitoring only if playback and capture device available */
1213
if (chip->nb_streams_capt > 0 && chip->nb_streams_play > 0) {
1214
/* monitoring */
1215
err = snd_ctl_add(chip->card,
1216
snd_ctl_new1(&pcxhr_control_monitor_vol, chip));
1217
if (err < 0)
1218
return err;
1219
1220
err = snd_ctl_add(chip->card,
1221
snd_ctl_new1(&pcxhr_control_monitor_sw, chip));
1222
if (err < 0)
1223
return err;
1224
}
1225
1226
if (i == 0) {
1227
/* clock mode only one control per pcxhr */
1228
err = snd_ctl_add(chip->card,
1229
snd_ctl_new1(&pcxhr_control_clock_type, mgr));
1230
if (err < 0)
1231
return err;
1232
/* non standard control used to scan
1233
* the external clock presence/frequencies
1234
*/
1235
err = snd_ctl_add(chip->card,
1236
snd_ctl_new1(&pcxhr_control_clock_rate, mgr));
1237
if (err < 0)
1238
return err;
1239
}
1240
1241
/* init values for the mixer data */
1242
pcxhr_init_audio_levels(chip);
1243
}
1244
1245
return 0;
1246
}
1247
1248