root/sound/pci/pcxhr/pcxhr_mixer.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. pcxhr_update_analog_audio_level
  2. pcxhr_analog_vol_info
  3. pcxhr_analog_vol_get
  4. pcxhr_analog_vol_put
  5. pcxhr_audio_sw_get
  6. pcxhr_audio_sw_put
  7. pcxhr_update_playback_stream_level
  8. pcxhr_update_audio_pipe_level
  9. pcxhr_digital_vol_info
  10. pcxhr_pcm_vol_get
  11. pcxhr_pcm_vol_put
  12. pcxhr_pcm_sw_get
  13. pcxhr_pcm_sw_put
  14. pcxhr_monitor_vol_get
  15. pcxhr_monitor_vol_put
  16. pcxhr_monitor_sw_get
  17. pcxhr_monitor_sw_put
  18. pcxhr_set_audio_source
  19. pcxhr_audio_src_info
  20. pcxhr_audio_src_get
  21. pcxhr_audio_src_put
  22. pcxhr_clock_type_info
  23. pcxhr_clock_type_get
  24. pcxhr_clock_type_put
  25. pcxhr_clock_rate_info
  26. pcxhr_clock_rate_get
  27. pcxhr_iec958_info
  28. pcxhr_iec958_capture_byte
  29. pcxhr_iec958_get
  30. pcxhr_iec958_mask_get
  31. pcxhr_iec958_update_byte
  32. pcxhr_iec958_put
  33. pcxhr_init_audio_levels
  34. pcxhr_create_mixer

   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 <alsa@digigram.com>
   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 }

/* [<][>][^][v][top][bottom][index][help] */