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