Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
pcxhr_mixer.c
Go to the documentation of this file.
1 #define __NO_VERSION__
2 /*
3  * Driver for Digigram pcxhr compatible soundcards
4  *
5  * mixer callbacks
6  *
7  * Copyright (c) 2004 by Digigram <[email protected]>
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 
46 static const DECLARE_TLV_DB_SCALE(db_scale_analog_capture, -11200, 50, 1550);
47 static const DECLARE_TLV_DB_SCALE(db_scale_analog_playback, -10400, 100, 2400);
48 
49 static const DECLARE_TLV_DB_SCALE(db_scale_a_hr222_capture, -11150, 50, 1600);
50 static const DECLARE_TLV_DB_SCALE(db_scale_a_hr222_playback, -2550, 50, 2400);
51 
52 static 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 
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
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  */
86 static 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 
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 
121 static 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 
137 static 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)
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 
187 static struct snd_kcontrol_new pcxhr_control_analog_level = {
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 
202 static 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 
214 static 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)
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 
237 static struct snd_kcontrol_new pcxhr_control_output_switch = {
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 
250 static 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 
258 static 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
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 
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 */
280  rmh.cmd[2] |= (left << 10);
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 
301 static 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 
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) {
321  /* VALID_AUDIO_IO_MUTE_LEVEL not yet handled
322  * (capture pipe level) */
323  rmh.cmd[2] = chip->digital_capture_volume[channel];
324  } else {
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)
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 */
347 static int pcxhr_digital_vol_info(struct snd_kcontrol *kcontrol,
348  struct snd_ctl_elem_info *uinfo)
349 {
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 
358 static 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 
377 static 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 ||
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 
410 static struct snd_kcontrol_new snd_pcxhr_pcm_vol =
411 {
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 
424 static 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 
437 static 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 
461 static struct snd_kcontrol_new pcxhr_control_pcm_switch = {
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 
475 static 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 
486 static 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 
510 static struct snd_kcontrol_new pcxhr_control_monitor_vol = {
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 
525 static 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 
536 static 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 
563 static struct snd_kcontrol_new pcxhr_control_monitor_sw = {
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 
582 static 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) {
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 */
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 */
631  rmh.cmd_len = 3;
632  rmh.cmd[0] |= IO_NUM_UER_CHIP_REG;
633  rmh.cmd[1] = codec;
635  (use_src ? 0x41 : 0x54));
636  err = pcxhr_send_msg(chip->mgr, &rmh);
637  if (err)
638  return err;
640  (use_src ? 0x41 : 0x49));
641  err = pcxhr_send_msg(chip->mgr, &rmh);
642  }
643  return err;
644 }
645 
646 static 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  }
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 
671 static 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 
679 static 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)
697  else
698  pcxhr_set_audio_source(chip);
699  ret = 1;
700  }
701  mutex_unlock(&chip->mgr->mixer_mutex);
702  return ret;
703 }
704 
705 static struct snd_kcontrol_new pcxhr_control_audio_src = {
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 
732 static 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  }
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 
767 static 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 
775 static 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;
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 
813 static struct snd_kcontrol_new pcxhr_control_clock_type = {
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  */
825 static 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);
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 
836 static 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 
857 static 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  */
868 static int pcxhr_iec958_info(struct snd_kcontrol *kcontrol,
869  struct snd_ctl_elem_info *uinfo)
870 {
872  uinfo->count = 1;
873  return 0;
874 }
875 
876 static 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 
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 
939 static 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 
966 static 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 
975 static 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 */
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 
1008 static 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 
1031 static 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 };
1038 static struct snd_kcontrol_new pcxhr_control_playback_iec958 = {
1039  .iface = SNDRV_CTL_ELEM_IFACE_PCM,
1041  .info = pcxhr_iec958_info,
1042  .get = pcxhr_iec958_get,
1043  .put = pcxhr_iec958_put,
1044  .private_value = 0 /* playback */
1045 };
1046 
1047 static 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 };
1054 static struct snd_kcontrol_new pcxhr_control_capture_iec958 = {
1055  .access = SNDRV_CTL_ELEM_ACCESS_READ,
1056  .iface = SNDRV_CTL_ELEM_IFACE_PCM,
1058  .info = pcxhr_iec958_info,
1059  .get = pcxhr_iec958_get,
1060  .private_value = 1 /* capture */
1061 };
1062 
1063 static 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] =
1075  }
1076  /* after boot, only two bits are set on the uer
1077  * interface
1078  */
1079  chip->aes_bits[0] = (IEC958_AES0_PROFESSIONAL |
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] =
1089  else {
1090  chip->analog_playback_volume[i] =
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] =
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] =
1111  else {
1112  chip->analog_capture_volume[i] =
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 
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";
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 }