linux/sound/pci/emu10k1/emumixer.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-or-later
   2/*
   3 *  Copyright (c) by Jaroslav Kysela <perex@perex.cz>,
   4 *                   Takashi Iwai <tiwai@suse.de>
   5 *                   Creative Labs, Inc.
   6 *  Routines for control of EMU10K1 chips / mixer routines
   7 *  Multichannel PCM support Copyright (c) Lee Revell <rlrevell@joe-job.com>
   8 *
   9 *  Copyright (c) by James Courtier-Dutton <James@superbug.co.uk>
  10 *      Added EMU 1010 support.
  11 *
  12 *  BUGS:
  13 *    --
  14 *
  15 *  TODO:
  16 *    --
  17 */
  18
  19#include <linux/time.h>
  20#include <linux/init.h>
  21#include <sound/core.h>
  22#include <sound/emu10k1.h>
  23#include <linux/delay.h>
  24#include <sound/tlv.h>
  25
  26#include "p17v.h"
  27
  28#define AC97_ID_STAC9758        0x83847658
  29
  30static const DECLARE_TLV_DB_SCALE(snd_audigy_db_scale2, -10350, 50, 1); /* WM8775 gain scale */
  31
  32static int snd_emu10k1_spdif_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
  33{
  34        uinfo->type = SNDRV_CTL_ELEM_TYPE_IEC958;
  35        uinfo->count = 1;
  36        return 0;
  37}
  38
  39static int snd_emu10k1_spdif_get(struct snd_kcontrol *kcontrol,
  40                                 struct snd_ctl_elem_value *ucontrol)
  41{
  42        struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
  43        unsigned int idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
  44        unsigned long flags;
  45
  46        /* Limit: emu->spdif_bits */
  47        if (idx >= 3)
  48                return -EINVAL;
  49        spin_lock_irqsave(&emu->reg_lock, flags);
  50        ucontrol->value.iec958.status[0] = (emu->spdif_bits[idx] >> 0) & 0xff;
  51        ucontrol->value.iec958.status[1] = (emu->spdif_bits[idx] >> 8) & 0xff;
  52        ucontrol->value.iec958.status[2] = (emu->spdif_bits[idx] >> 16) & 0xff;
  53        ucontrol->value.iec958.status[3] = (emu->spdif_bits[idx] >> 24) & 0xff;
  54        spin_unlock_irqrestore(&emu->reg_lock, flags);
  55        return 0;
  56}
  57
  58static int snd_emu10k1_spdif_get_mask(struct snd_kcontrol *kcontrol,
  59                                      struct snd_ctl_elem_value *ucontrol)
  60{
  61        ucontrol->value.iec958.status[0] = 0xff;
  62        ucontrol->value.iec958.status[1] = 0xff;
  63        ucontrol->value.iec958.status[2] = 0xff;
  64        ucontrol->value.iec958.status[3] = 0xff;
  65        return 0;
  66}
  67
  68/*
  69 * Items labels in enum mixer controls assigning source data to
  70 * each destination
  71 */
  72static const char * const emu1010_src_texts[] = {
  73        "Silence",
  74        "Dock Mic A",
  75        "Dock Mic B",
  76        "Dock ADC1 Left",
  77        "Dock ADC1 Right",
  78        "Dock ADC2 Left",
  79        "Dock ADC2 Right",
  80        "Dock ADC3 Left",
  81        "Dock ADC3 Right",
  82        "0202 ADC Left",
  83        "0202 ADC Right",
  84        "0202 SPDIF Left",
  85        "0202 SPDIF Right",
  86        "ADAT 0",
  87        "ADAT 1",
  88        "ADAT 2",
  89        "ADAT 3",
  90        "ADAT 4",
  91        "ADAT 5",
  92        "ADAT 6",
  93        "ADAT 7",
  94        "DSP 0",
  95        "DSP 1",
  96        "DSP 2",
  97        "DSP 3",
  98        "DSP 4",
  99        "DSP 5",
 100        "DSP 6",
 101        "DSP 7",
 102        "DSP 8",
 103        "DSP 9",
 104        "DSP 10",
 105        "DSP 11",
 106        "DSP 12",
 107        "DSP 13",
 108        "DSP 14",
 109        "DSP 15",
 110        "DSP 16",
 111        "DSP 17",
 112        "DSP 18",
 113        "DSP 19",
 114        "DSP 20",
 115        "DSP 21",
 116        "DSP 22",
 117        "DSP 23",
 118        "DSP 24",
 119        "DSP 25",
 120        "DSP 26",
 121        "DSP 27",
 122        "DSP 28",
 123        "DSP 29",
 124        "DSP 30",
 125        "DSP 31",
 126};
 127
 128/* 1616(m) cardbus */
 129
 130static const char * const emu1616_src_texts[] = {
 131        "Silence",
 132        "Dock Mic A",
 133        "Dock Mic B",
 134        "Dock ADC1 Left",
 135        "Dock ADC1 Right",
 136        "Dock ADC2 Left",
 137        "Dock ADC2 Right",
 138        "Dock SPDIF Left",
 139        "Dock SPDIF Right",
 140        "ADAT 0",
 141        "ADAT 1",
 142        "ADAT 2",
 143        "ADAT 3",
 144        "ADAT 4",
 145        "ADAT 5",
 146        "ADAT 6",
 147        "ADAT 7",
 148        "DSP 0",
 149        "DSP 1",
 150        "DSP 2",
 151        "DSP 3",
 152        "DSP 4",
 153        "DSP 5",
 154        "DSP 6",
 155        "DSP 7",
 156        "DSP 8",
 157        "DSP 9",
 158        "DSP 10",
 159        "DSP 11",
 160        "DSP 12",
 161        "DSP 13",
 162        "DSP 14",
 163        "DSP 15",
 164        "DSP 16",
 165        "DSP 17",
 166        "DSP 18",
 167        "DSP 19",
 168        "DSP 20",
 169        "DSP 21",
 170        "DSP 22",
 171        "DSP 23",
 172        "DSP 24",
 173        "DSP 25",
 174        "DSP 26",
 175        "DSP 27",
 176        "DSP 28",
 177        "DSP 29",
 178        "DSP 30",
 179        "DSP 31",
 180};
 181
 182
 183/*
 184 * List of data sources available for each destination
 185 */
 186static unsigned int emu1010_src_regs[] = {
 187        EMU_SRC_SILENCE,/* 0 */
 188        EMU_SRC_DOCK_MIC_A1, /* 1 */
 189        EMU_SRC_DOCK_MIC_B1, /* 2 */
 190        EMU_SRC_DOCK_ADC1_LEFT1, /* 3 */
 191        EMU_SRC_DOCK_ADC1_RIGHT1, /* 4 */
 192        EMU_SRC_DOCK_ADC2_LEFT1, /* 5 */
 193        EMU_SRC_DOCK_ADC2_RIGHT1, /* 6 */
 194        EMU_SRC_DOCK_ADC3_LEFT1, /* 7 */
 195        EMU_SRC_DOCK_ADC3_RIGHT1, /* 8 */
 196        EMU_SRC_HAMOA_ADC_LEFT1, /* 9 */
 197        EMU_SRC_HAMOA_ADC_RIGHT1, /* 10 */
 198        EMU_SRC_HANA_SPDIF_LEFT1, /* 11 */
 199        EMU_SRC_HANA_SPDIF_RIGHT1, /* 12 */
 200        EMU_SRC_HANA_ADAT, /* 13 */
 201        EMU_SRC_HANA_ADAT+1, /* 14 */
 202        EMU_SRC_HANA_ADAT+2, /* 15 */
 203        EMU_SRC_HANA_ADAT+3, /* 16 */
 204        EMU_SRC_HANA_ADAT+4, /* 17 */
 205        EMU_SRC_HANA_ADAT+5, /* 18 */
 206        EMU_SRC_HANA_ADAT+6, /* 19 */
 207        EMU_SRC_HANA_ADAT+7, /* 20 */
 208        EMU_SRC_ALICE_EMU32A, /* 21 */
 209        EMU_SRC_ALICE_EMU32A+1, /* 22 */
 210        EMU_SRC_ALICE_EMU32A+2, /* 23 */
 211        EMU_SRC_ALICE_EMU32A+3, /* 24 */
 212        EMU_SRC_ALICE_EMU32A+4, /* 25 */
 213        EMU_SRC_ALICE_EMU32A+5, /* 26 */
 214        EMU_SRC_ALICE_EMU32A+6, /* 27 */
 215        EMU_SRC_ALICE_EMU32A+7, /* 28 */
 216        EMU_SRC_ALICE_EMU32A+8, /* 29 */
 217        EMU_SRC_ALICE_EMU32A+9, /* 30 */
 218        EMU_SRC_ALICE_EMU32A+0xa, /* 31 */
 219        EMU_SRC_ALICE_EMU32A+0xb, /* 32 */
 220        EMU_SRC_ALICE_EMU32A+0xc, /* 33 */
 221        EMU_SRC_ALICE_EMU32A+0xd, /* 34 */
 222        EMU_SRC_ALICE_EMU32A+0xe, /* 35 */
 223        EMU_SRC_ALICE_EMU32A+0xf, /* 36 */
 224        EMU_SRC_ALICE_EMU32B, /* 37 */
 225        EMU_SRC_ALICE_EMU32B+1, /* 38 */
 226        EMU_SRC_ALICE_EMU32B+2, /* 39 */
 227        EMU_SRC_ALICE_EMU32B+3, /* 40 */
 228        EMU_SRC_ALICE_EMU32B+4, /* 41 */
 229        EMU_SRC_ALICE_EMU32B+5, /* 42 */
 230        EMU_SRC_ALICE_EMU32B+6, /* 43 */
 231        EMU_SRC_ALICE_EMU32B+7, /* 44 */
 232        EMU_SRC_ALICE_EMU32B+8, /* 45 */
 233        EMU_SRC_ALICE_EMU32B+9, /* 46 */
 234        EMU_SRC_ALICE_EMU32B+0xa, /* 47 */
 235        EMU_SRC_ALICE_EMU32B+0xb, /* 48 */
 236        EMU_SRC_ALICE_EMU32B+0xc, /* 49 */
 237        EMU_SRC_ALICE_EMU32B+0xd, /* 50 */
 238        EMU_SRC_ALICE_EMU32B+0xe, /* 51 */
 239        EMU_SRC_ALICE_EMU32B+0xf, /* 52 */
 240};
 241
 242/* 1616(m) cardbus */
 243static unsigned int emu1616_src_regs[] = {
 244        EMU_SRC_SILENCE,
 245        EMU_SRC_DOCK_MIC_A1,
 246        EMU_SRC_DOCK_MIC_B1,
 247        EMU_SRC_DOCK_ADC1_LEFT1,
 248        EMU_SRC_DOCK_ADC1_RIGHT1,
 249        EMU_SRC_DOCK_ADC2_LEFT1,
 250        EMU_SRC_DOCK_ADC2_RIGHT1,
 251        EMU_SRC_MDOCK_SPDIF_LEFT1,
 252        EMU_SRC_MDOCK_SPDIF_RIGHT1,
 253        EMU_SRC_MDOCK_ADAT,
 254        EMU_SRC_MDOCK_ADAT+1,
 255        EMU_SRC_MDOCK_ADAT+2,
 256        EMU_SRC_MDOCK_ADAT+3,
 257        EMU_SRC_MDOCK_ADAT+4,
 258        EMU_SRC_MDOCK_ADAT+5,
 259        EMU_SRC_MDOCK_ADAT+6,
 260        EMU_SRC_MDOCK_ADAT+7,
 261        EMU_SRC_ALICE_EMU32A,
 262        EMU_SRC_ALICE_EMU32A+1,
 263        EMU_SRC_ALICE_EMU32A+2,
 264        EMU_SRC_ALICE_EMU32A+3,
 265        EMU_SRC_ALICE_EMU32A+4,
 266        EMU_SRC_ALICE_EMU32A+5,
 267        EMU_SRC_ALICE_EMU32A+6,
 268        EMU_SRC_ALICE_EMU32A+7,
 269        EMU_SRC_ALICE_EMU32A+8,
 270        EMU_SRC_ALICE_EMU32A+9,
 271        EMU_SRC_ALICE_EMU32A+0xa,
 272        EMU_SRC_ALICE_EMU32A+0xb,
 273        EMU_SRC_ALICE_EMU32A+0xc,
 274        EMU_SRC_ALICE_EMU32A+0xd,
 275        EMU_SRC_ALICE_EMU32A+0xe,
 276        EMU_SRC_ALICE_EMU32A+0xf,
 277        EMU_SRC_ALICE_EMU32B,
 278        EMU_SRC_ALICE_EMU32B+1,
 279        EMU_SRC_ALICE_EMU32B+2,
 280        EMU_SRC_ALICE_EMU32B+3,
 281        EMU_SRC_ALICE_EMU32B+4,
 282        EMU_SRC_ALICE_EMU32B+5,
 283        EMU_SRC_ALICE_EMU32B+6,
 284        EMU_SRC_ALICE_EMU32B+7,
 285        EMU_SRC_ALICE_EMU32B+8,
 286        EMU_SRC_ALICE_EMU32B+9,
 287        EMU_SRC_ALICE_EMU32B+0xa,
 288        EMU_SRC_ALICE_EMU32B+0xb,
 289        EMU_SRC_ALICE_EMU32B+0xc,
 290        EMU_SRC_ALICE_EMU32B+0xd,
 291        EMU_SRC_ALICE_EMU32B+0xe,
 292        EMU_SRC_ALICE_EMU32B+0xf,
 293};
 294
 295/*
 296 * Data destinations - physical EMU outputs.
 297 * Each destination has an enum mixer control to choose a data source
 298 */
 299static unsigned int emu1010_output_dst[] = {
 300        EMU_DST_DOCK_DAC1_LEFT1, /* 0 */
 301        EMU_DST_DOCK_DAC1_RIGHT1, /* 1 */
 302        EMU_DST_DOCK_DAC2_LEFT1, /* 2 */
 303        EMU_DST_DOCK_DAC2_RIGHT1, /* 3 */
 304        EMU_DST_DOCK_DAC3_LEFT1, /* 4 */
 305        EMU_DST_DOCK_DAC3_RIGHT1, /* 5 */
 306        EMU_DST_DOCK_DAC4_LEFT1, /* 6 */
 307        EMU_DST_DOCK_DAC4_RIGHT1, /* 7 */
 308        EMU_DST_DOCK_PHONES_LEFT1, /* 8 */
 309        EMU_DST_DOCK_PHONES_RIGHT1, /* 9 */
 310        EMU_DST_DOCK_SPDIF_LEFT1, /* 10 */
 311        EMU_DST_DOCK_SPDIF_RIGHT1, /* 11 */
 312        EMU_DST_HANA_SPDIF_LEFT1, /* 12 */
 313        EMU_DST_HANA_SPDIF_RIGHT1, /* 13 */
 314        EMU_DST_HAMOA_DAC_LEFT1, /* 14 */
 315        EMU_DST_HAMOA_DAC_RIGHT1, /* 15 */
 316        EMU_DST_HANA_ADAT, /* 16 */
 317        EMU_DST_HANA_ADAT+1, /* 17 */
 318        EMU_DST_HANA_ADAT+2, /* 18 */
 319        EMU_DST_HANA_ADAT+3, /* 19 */
 320        EMU_DST_HANA_ADAT+4, /* 20 */
 321        EMU_DST_HANA_ADAT+5, /* 21 */
 322        EMU_DST_HANA_ADAT+6, /* 22 */
 323        EMU_DST_HANA_ADAT+7, /* 23 */
 324};
 325
 326/* 1616(m) cardbus */
 327static unsigned int emu1616_output_dst[] = {
 328        EMU_DST_DOCK_DAC1_LEFT1,
 329        EMU_DST_DOCK_DAC1_RIGHT1,
 330        EMU_DST_DOCK_DAC2_LEFT1,
 331        EMU_DST_DOCK_DAC2_RIGHT1,
 332        EMU_DST_DOCK_DAC3_LEFT1,
 333        EMU_DST_DOCK_DAC3_RIGHT1,
 334        EMU_DST_MDOCK_SPDIF_LEFT1,
 335        EMU_DST_MDOCK_SPDIF_RIGHT1,
 336        EMU_DST_MDOCK_ADAT,
 337        EMU_DST_MDOCK_ADAT+1,
 338        EMU_DST_MDOCK_ADAT+2,
 339        EMU_DST_MDOCK_ADAT+3,
 340        EMU_DST_MDOCK_ADAT+4,
 341        EMU_DST_MDOCK_ADAT+5,
 342        EMU_DST_MDOCK_ADAT+6,
 343        EMU_DST_MDOCK_ADAT+7,
 344        EMU_DST_MANA_DAC_LEFT,
 345        EMU_DST_MANA_DAC_RIGHT,
 346};
 347
 348/*
 349 * Data destinations - HANA outputs going to Alice2 (audigy) for
 350 *   capture (EMU32 + I2S links)
 351 * Each destination has an enum mixer control to choose a data source
 352 */
 353static unsigned int emu1010_input_dst[] = {
 354        EMU_DST_ALICE2_EMU32_0,
 355        EMU_DST_ALICE2_EMU32_1,
 356        EMU_DST_ALICE2_EMU32_2,
 357        EMU_DST_ALICE2_EMU32_3,
 358        EMU_DST_ALICE2_EMU32_4,
 359        EMU_DST_ALICE2_EMU32_5,
 360        EMU_DST_ALICE2_EMU32_6,
 361        EMU_DST_ALICE2_EMU32_7,
 362        EMU_DST_ALICE2_EMU32_8,
 363        EMU_DST_ALICE2_EMU32_9,
 364        EMU_DST_ALICE2_EMU32_A,
 365        EMU_DST_ALICE2_EMU32_B,
 366        EMU_DST_ALICE2_EMU32_C,
 367        EMU_DST_ALICE2_EMU32_D,
 368        EMU_DST_ALICE2_EMU32_E,
 369        EMU_DST_ALICE2_EMU32_F,
 370        EMU_DST_ALICE_I2S0_LEFT,
 371        EMU_DST_ALICE_I2S0_RIGHT,
 372        EMU_DST_ALICE_I2S1_LEFT,
 373        EMU_DST_ALICE_I2S1_RIGHT,
 374        EMU_DST_ALICE_I2S2_LEFT,
 375        EMU_DST_ALICE_I2S2_RIGHT,
 376};
 377
 378static int snd_emu1010_input_output_source_info(struct snd_kcontrol *kcontrol,
 379                                                struct snd_ctl_elem_info *uinfo)
 380{
 381        struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
 382
 383        if (emu->card_capabilities->emu_model == EMU_MODEL_EMU1616)
 384                return snd_ctl_enum_info(uinfo, 1, 49, emu1616_src_texts);
 385        else
 386                return snd_ctl_enum_info(uinfo, 1, 53, emu1010_src_texts);
 387}
 388
 389static int snd_emu1010_output_source_get(struct snd_kcontrol *kcontrol,
 390                                 struct snd_ctl_elem_value *ucontrol)
 391{
 392        struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
 393        unsigned int channel;
 394
 395        channel = (kcontrol->private_value) & 0xff;
 396        /* Limit: emu1010_output_dst, emu->emu1010.output_source */
 397        if (channel >= 24 ||
 398            (emu->card_capabilities->emu_model == EMU_MODEL_EMU1616 &&
 399             channel >= 18))
 400                return -EINVAL;
 401        ucontrol->value.enumerated.item[0] = emu->emu1010.output_source[channel];
 402        return 0;
 403}
 404
 405static int snd_emu1010_output_source_put(struct snd_kcontrol *kcontrol,
 406                                 struct snd_ctl_elem_value *ucontrol)
 407{
 408        struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
 409        unsigned int val;
 410        unsigned int channel;
 411
 412        val = ucontrol->value.enumerated.item[0];
 413        if (val >= 53 ||
 414            (emu->card_capabilities->emu_model == EMU_MODEL_EMU1616 &&
 415             val >= 49))
 416                return -EINVAL;
 417        channel = (kcontrol->private_value) & 0xff;
 418        /* Limit: emu1010_output_dst, emu->emu1010.output_source */
 419        if (channel >= 24 ||
 420            (emu->card_capabilities->emu_model == EMU_MODEL_EMU1616 &&
 421             channel >= 18))
 422                return -EINVAL;
 423        if (emu->emu1010.output_source[channel] == val)
 424                return 0;
 425        emu->emu1010.output_source[channel] = val;
 426        if (emu->card_capabilities->emu_model == EMU_MODEL_EMU1616)
 427                snd_emu1010_fpga_link_dst_src_write(emu,
 428                        emu1616_output_dst[channel], emu1616_src_regs[val]);
 429        else
 430                snd_emu1010_fpga_link_dst_src_write(emu,
 431                        emu1010_output_dst[channel], emu1010_src_regs[val]);
 432        return 1;
 433}
 434
 435static int snd_emu1010_input_source_get(struct snd_kcontrol *kcontrol,
 436                                 struct snd_ctl_elem_value *ucontrol)
 437{
 438        struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
 439        unsigned int channel;
 440
 441        channel = (kcontrol->private_value) & 0xff;
 442        /* Limit: emu1010_input_dst, emu->emu1010.input_source */
 443        if (channel >= 22)
 444                return -EINVAL;
 445        ucontrol->value.enumerated.item[0] = emu->emu1010.input_source[channel];
 446        return 0;
 447}
 448
 449static int snd_emu1010_input_source_put(struct snd_kcontrol *kcontrol,
 450                                 struct snd_ctl_elem_value *ucontrol)
 451{
 452        struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
 453        unsigned int val;
 454        unsigned int channel;
 455
 456        val = ucontrol->value.enumerated.item[0];
 457        if (val >= 53 ||
 458            (emu->card_capabilities->emu_model == EMU_MODEL_EMU1616 &&
 459             val >= 49))
 460                return -EINVAL;
 461        channel = (kcontrol->private_value) & 0xff;
 462        /* Limit: emu1010_input_dst, emu->emu1010.input_source */
 463        if (channel >= 22)
 464                return -EINVAL;
 465        if (emu->emu1010.input_source[channel] == val)
 466                return 0;
 467        emu->emu1010.input_source[channel] = val;
 468        if (emu->card_capabilities->emu_model == EMU_MODEL_EMU1616)
 469                snd_emu1010_fpga_link_dst_src_write(emu,
 470                        emu1010_input_dst[channel], emu1616_src_regs[val]);
 471        else
 472                snd_emu1010_fpga_link_dst_src_write(emu,
 473                        emu1010_input_dst[channel], emu1010_src_regs[val]);
 474        return 1;
 475}
 476
 477#define EMU1010_SOURCE_OUTPUT(xname,chid) \
 478{                                                               \
 479        .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname,     \
 480        .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,              \
 481        .info =  snd_emu1010_input_output_source_info,          \
 482        .get =   snd_emu1010_output_source_get,                 \
 483        .put =   snd_emu1010_output_source_put,                 \
 484        .private_value = chid                                   \
 485}
 486
 487static struct snd_kcontrol_new snd_emu1010_output_enum_ctls[] = {
 488        EMU1010_SOURCE_OUTPUT("Dock DAC1 Left Playback Enum", 0),
 489        EMU1010_SOURCE_OUTPUT("Dock DAC1 Right Playback Enum", 1),
 490        EMU1010_SOURCE_OUTPUT("Dock DAC2 Left Playback Enum", 2),
 491        EMU1010_SOURCE_OUTPUT("Dock DAC2 Right Playback Enum", 3),
 492        EMU1010_SOURCE_OUTPUT("Dock DAC3 Left Playback Enum", 4),
 493        EMU1010_SOURCE_OUTPUT("Dock DAC3 Right Playback Enum", 5),
 494        EMU1010_SOURCE_OUTPUT("Dock DAC4 Left Playback Enum", 6),
 495        EMU1010_SOURCE_OUTPUT("Dock DAC4 Right Playback Enum", 7),
 496        EMU1010_SOURCE_OUTPUT("Dock Phones Left Playback Enum", 8),
 497        EMU1010_SOURCE_OUTPUT("Dock Phones Right Playback Enum", 9),
 498        EMU1010_SOURCE_OUTPUT("Dock SPDIF Left Playback Enum", 0xa),
 499        EMU1010_SOURCE_OUTPUT("Dock SPDIF Right Playback Enum", 0xb),
 500        EMU1010_SOURCE_OUTPUT("1010 SPDIF Left Playback Enum", 0xc),
 501        EMU1010_SOURCE_OUTPUT("1010 SPDIF Right Playback Enum", 0xd),
 502        EMU1010_SOURCE_OUTPUT("0202 DAC Left Playback Enum", 0xe),
 503        EMU1010_SOURCE_OUTPUT("0202 DAC Right Playback Enum", 0xf),
 504        EMU1010_SOURCE_OUTPUT("1010 ADAT 0 Playback Enum", 0x10),
 505        EMU1010_SOURCE_OUTPUT("1010 ADAT 1 Playback Enum", 0x11),
 506        EMU1010_SOURCE_OUTPUT("1010 ADAT 2 Playback Enum", 0x12),
 507        EMU1010_SOURCE_OUTPUT("1010 ADAT 3 Playback Enum", 0x13),
 508        EMU1010_SOURCE_OUTPUT("1010 ADAT 4 Playback Enum", 0x14),
 509        EMU1010_SOURCE_OUTPUT("1010 ADAT 5 Playback Enum", 0x15),
 510        EMU1010_SOURCE_OUTPUT("1010 ADAT 6 Playback Enum", 0x16),
 511        EMU1010_SOURCE_OUTPUT("1010 ADAT 7 Playback Enum", 0x17),
 512};
 513
 514
 515/* 1616(m) cardbus */
 516static struct snd_kcontrol_new snd_emu1616_output_enum_ctls[] = {
 517        EMU1010_SOURCE_OUTPUT("Dock DAC1 Left Playback Enum", 0),
 518        EMU1010_SOURCE_OUTPUT("Dock DAC1 Right Playback Enum", 1),
 519        EMU1010_SOURCE_OUTPUT("Dock DAC2 Left Playback Enum", 2),
 520        EMU1010_SOURCE_OUTPUT("Dock DAC2 Right Playback Enum", 3),
 521        EMU1010_SOURCE_OUTPUT("Dock DAC3 Left Playback Enum", 4),
 522        EMU1010_SOURCE_OUTPUT("Dock DAC3 Right Playback Enum", 5),
 523        EMU1010_SOURCE_OUTPUT("Dock SPDIF Left Playback Enum", 6),
 524        EMU1010_SOURCE_OUTPUT("Dock SPDIF Right Playback Enum", 7),
 525        EMU1010_SOURCE_OUTPUT("Dock ADAT 0 Playback Enum", 8),
 526        EMU1010_SOURCE_OUTPUT("Dock ADAT 1 Playback Enum", 9),
 527        EMU1010_SOURCE_OUTPUT("Dock ADAT 2 Playback Enum", 0xa),
 528        EMU1010_SOURCE_OUTPUT("Dock ADAT 3 Playback Enum", 0xb),
 529        EMU1010_SOURCE_OUTPUT("Dock ADAT 4 Playback Enum", 0xc),
 530        EMU1010_SOURCE_OUTPUT("Dock ADAT 5 Playback Enum", 0xd),
 531        EMU1010_SOURCE_OUTPUT("Dock ADAT 6 Playback Enum", 0xe),
 532        EMU1010_SOURCE_OUTPUT("Dock ADAT 7 Playback Enum", 0xf),
 533        EMU1010_SOURCE_OUTPUT("Mana DAC Left Playback Enum", 0x10),
 534        EMU1010_SOURCE_OUTPUT("Mana DAC Right Playback Enum", 0x11),
 535};
 536
 537
 538#define EMU1010_SOURCE_INPUT(xname,chid) \
 539{                                                               \
 540        .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname,     \
 541        .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,              \
 542        .info =  snd_emu1010_input_output_source_info,          \
 543        .get =   snd_emu1010_input_source_get,                  \
 544        .put =   snd_emu1010_input_source_put,                  \
 545        .private_value = chid                                   \
 546}
 547
 548static struct snd_kcontrol_new snd_emu1010_input_enum_ctls[] = {
 549        EMU1010_SOURCE_INPUT("DSP 0 Capture Enum", 0),
 550        EMU1010_SOURCE_INPUT("DSP 1 Capture Enum", 1),
 551        EMU1010_SOURCE_INPUT("DSP 2 Capture Enum", 2),
 552        EMU1010_SOURCE_INPUT("DSP 3 Capture Enum", 3),
 553        EMU1010_SOURCE_INPUT("DSP 4 Capture Enum", 4),
 554        EMU1010_SOURCE_INPUT("DSP 5 Capture Enum", 5),
 555        EMU1010_SOURCE_INPUT("DSP 6 Capture Enum", 6),
 556        EMU1010_SOURCE_INPUT("DSP 7 Capture Enum", 7),
 557        EMU1010_SOURCE_INPUT("DSP 8 Capture Enum", 8),
 558        EMU1010_SOURCE_INPUT("DSP 9 Capture Enum", 9),
 559        EMU1010_SOURCE_INPUT("DSP A Capture Enum", 0xa),
 560        EMU1010_SOURCE_INPUT("DSP B Capture Enum", 0xb),
 561        EMU1010_SOURCE_INPUT("DSP C Capture Enum", 0xc),
 562        EMU1010_SOURCE_INPUT("DSP D Capture Enum", 0xd),
 563        EMU1010_SOURCE_INPUT("DSP E Capture Enum", 0xe),
 564        EMU1010_SOURCE_INPUT("DSP F Capture Enum", 0xf),
 565        EMU1010_SOURCE_INPUT("DSP 10 Capture Enum", 0x10),
 566        EMU1010_SOURCE_INPUT("DSP 11 Capture Enum", 0x11),
 567        EMU1010_SOURCE_INPUT("DSP 12 Capture Enum", 0x12),
 568        EMU1010_SOURCE_INPUT("DSP 13 Capture Enum", 0x13),
 569        EMU1010_SOURCE_INPUT("DSP 14 Capture Enum", 0x14),
 570        EMU1010_SOURCE_INPUT("DSP 15 Capture Enum", 0x15),
 571};
 572
 573
 574
 575#define snd_emu1010_adc_pads_info       snd_ctl_boolean_mono_info
 576
 577static int snd_emu1010_adc_pads_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
 578{
 579        struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
 580        unsigned int mask = kcontrol->private_value & 0xff;
 581        ucontrol->value.integer.value[0] = (emu->emu1010.adc_pads & mask) ? 1 : 0;
 582        return 0;
 583}
 584
 585static int snd_emu1010_adc_pads_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
 586{
 587        struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
 588        unsigned int mask = kcontrol->private_value & 0xff;
 589        unsigned int val, cache;
 590        val = ucontrol->value.integer.value[0];
 591        cache = emu->emu1010.adc_pads;
 592        if (val == 1) 
 593                cache = cache | mask;
 594        else
 595                cache = cache & ~mask;
 596        if (cache != emu->emu1010.adc_pads) {
 597                snd_emu1010_fpga_write(emu, EMU_HANA_ADC_PADS, cache );
 598                emu->emu1010.adc_pads = cache;
 599        }
 600
 601        return 0;
 602}
 603
 604
 605
 606#define EMU1010_ADC_PADS(xname,chid) \
 607{                                                               \
 608        .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname,     \
 609        .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,              \
 610        .info =  snd_emu1010_adc_pads_info,                     \
 611        .get =   snd_emu1010_adc_pads_get,                      \
 612        .put =   snd_emu1010_adc_pads_put,                      \
 613        .private_value = chid                                   \
 614}
 615
 616static struct snd_kcontrol_new snd_emu1010_adc_pads[] = {
 617        EMU1010_ADC_PADS("ADC1 14dB PAD Audio Dock Capture Switch", EMU_HANA_DOCK_ADC_PAD1),
 618        EMU1010_ADC_PADS("ADC2 14dB PAD Audio Dock Capture Switch", EMU_HANA_DOCK_ADC_PAD2),
 619        EMU1010_ADC_PADS("ADC3 14dB PAD Audio Dock Capture Switch", EMU_HANA_DOCK_ADC_PAD3),
 620        EMU1010_ADC_PADS("ADC1 14dB PAD 0202 Capture Switch", EMU_HANA_0202_ADC_PAD1),
 621};
 622
 623#define snd_emu1010_dac_pads_info       snd_ctl_boolean_mono_info
 624
 625static int snd_emu1010_dac_pads_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
 626{
 627        struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
 628        unsigned int mask = kcontrol->private_value & 0xff;
 629        ucontrol->value.integer.value[0] = (emu->emu1010.dac_pads & mask) ? 1 : 0;
 630        return 0;
 631}
 632
 633static int snd_emu1010_dac_pads_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
 634{
 635        struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
 636        unsigned int mask = kcontrol->private_value & 0xff;
 637        unsigned int val, cache;
 638        val = ucontrol->value.integer.value[0];
 639        cache = emu->emu1010.dac_pads;
 640        if (val == 1) 
 641                cache = cache | mask;
 642        else
 643                cache = cache & ~mask;
 644        if (cache != emu->emu1010.dac_pads) {
 645                snd_emu1010_fpga_write(emu, EMU_HANA_DAC_PADS, cache );
 646                emu->emu1010.dac_pads = cache;
 647        }
 648
 649        return 0;
 650}
 651
 652
 653
 654#define EMU1010_DAC_PADS(xname,chid) \
 655{                                                               \
 656        .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname,     \
 657        .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,              \
 658        .info =  snd_emu1010_dac_pads_info,                     \
 659        .get =   snd_emu1010_dac_pads_get,                      \
 660        .put =   snd_emu1010_dac_pads_put,                      \
 661        .private_value = chid                                   \
 662}
 663
 664static struct snd_kcontrol_new snd_emu1010_dac_pads[] = {
 665        EMU1010_DAC_PADS("DAC1 Audio Dock 14dB PAD Playback Switch", EMU_HANA_DOCK_DAC_PAD1),
 666        EMU1010_DAC_PADS("DAC2 Audio Dock 14dB PAD Playback Switch", EMU_HANA_DOCK_DAC_PAD2),
 667        EMU1010_DAC_PADS("DAC3 Audio Dock 14dB PAD Playback Switch", EMU_HANA_DOCK_DAC_PAD3),
 668        EMU1010_DAC_PADS("DAC4 Audio Dock 14dB PAD Playback Switch", EMU_HANA_DOCK_DAC_PAD4),
 669        EMU1010_DAC_PADS("DAC1 0202 14dB PAD Playback Switch", EMU_HANA_0202_DAC_PAD1),
 670};
 671
 672
 673static int snd_emu1010_internal_clock_info(struct snd_kcontrol *kcontrol,
 674                                          struct snd_ctl_elem_info *uinfo)
 675{
 676        static const char * const texts[4] = {
 677                "44100", "48000", "SPDIF", "ADAT"
 678        };
 679                
 680        return snd_ctl_enum_info(uinfo, 1, 4, texts);
 681}
 682
 683static int snd_emu1010_internal_clock_get(struct snd_kcontrol *kcontrol,
 684                                        struct snd_ctl_elem_value *ucontrol)
 685{
 686        struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
 687
 688        ucontrol->value.enumerated.item[0] = emu->emu1010.internal_clock;
 689        return 0;
 690}
 691
 692static int snd_emu1010_internal_clock_put(struct snd_kcontrol *kcontrol,
 693                                        struct snd_ctl_elem_value *ucontrol)
 694{
 695        struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
 696        unsigned int val;
 697        int change = 0;
 698
 699        val = ucontrol->value.enumerated.item[0] ;
 700        /* Limit: uinfo->value.enumerated.items = 4; */
 701        if (val >= 4)
 702                return -EINVAL;
 703        change = (emu->emu1010.internal_clock != val);
 704        if (change) {
 705                emu->emu1010.internal_clock = val;
 706                switch (val) {
 707                case 0:
 708                        /* 44100 */
 709                        /* Mute all */
 710                        snd_emu1010_fpga_write(emu, EMU_HANA_UNMUTE, EMU_MUTE );
 711                        /* Default fallback clock 48kHz */
 712                        snd_emu1010_fpga_write(emu, EMU_HANA_DEFCLOCK, EMU_HANA_DEFCLOCK_44_1K );
 713                        /* Word Clock source, Internal 44.1kHz x1 */
 714                        snd_emu1010_fpga_write(emu, EMU_HANA_WCLOCK,
 715                        EMU_HANA_WCLOCK_INT_44_1K | EMU_HANA_WCLOCK_1X );
 716                        /* Set LEDs on Audio Dock */
 717                        snd_emu1010_fpga_write(emu, EMU_HANA_DOCK_LEDS_2,
 718                                EMU_HANA_DOCK_LEDS_2_44K | EMU_HANA_DOCK_LEDS_2_LOCK );
 719                        /* Allow DLL to settle */
 720                        msleep(10);
 721                        /* Unmute all */
 722                        snd_emu1010_fpga_write(emu, EMU_HANA_UNMUTE, EMU_UNMUTE );
 723                        break;
 724                case 1:
 725                        /* 48000 */
 726                        /* Mute all */
 727                        snd_emu1010_fpga_write(emu, EMU_HANA_UNMUTE, EMU_MUTE );
 728                        /* Default fallback clock 48kHz */
 729                        snd_emu1010_fpga_write(emu, EMU_HANA_DEFCLOCK, EMU_HANA_DEFCLOCK_48K );
 730                        /* Word Clock source, Internal 48kHz x1 */
 731                        snd_emu1010_fpga_write(emu, EMU_HANA_WCLOCK,
 732                                EMU_HANA_WCLOCK_INT_48K | EMU_HANA_WCLOCK_1X );
 733                        /* Set LEDs on Audio Dock */
 734                        snd_emu1010_fpga_write(emu, EMU_HANA_DOCK_LEDS_2,
 735                                EMU_HANA_DOCK_LEDS_2_48K | EMU_HANA_DOCK_LEDS_2_LOCK );
 736                        /* Allow DLL to settle */
 737                        msleep(10);
 738                        /* Unmute all */
 739                        snd_emu1010_fpga_write(emu, EMU_HANA_UNMUTE, EMU_UNMUTE );
 740                        break;
 741                        
 742                case 2: /* Take clock from S/PDIF IN */
 743                        /* Mute all */
 744                        snd_emu1010_fpga_write(emu, EMU_HANA_UNMUTE, EMU_MUTE );
 745                        /* Default fallback clock 48kHz */
 746                        snd_emu1010_fpga_write(emu, EMU_HANA_DEFCLOCK, EMU_HANA_DEFCLOCK_48K );
 747                        /* Word Clock source, sync to S/PDIF input */
 748                        snd_emu1010_fpga_write(emu, EMU_HANA_WCLOCK,
 749                                EMU_HANA_WCLOCK_HANA_SPDIF_IN | EMU_HANA_WCLOCK_1X );
 750                        /* Set LEDs on Audio Dock */
 751                        snd_emu1010_fpga_write(emu, EMU_HANA_DOCK_LEDS_2,
 752                                EMU_HANA_DOCK_LEDS_2_EXT | EMU_HANA_DOCK_LEDS_2_LOCK );
 753                        /* FIXME: We should set EMU_HANA_DOCK_LEDS_2_LOCK only when clock signal is present and valid */        
 754                        /* Allow DLL to settle */
 755                        msleep(10);
 756                        /* Unmute all */
 757                        snd_emu1010_fpga_write(emu, EMU_HANA_UNMUTE, EMU_UNMUTE );
 758                        break;
 759                
 760                case 3:                         
 761                        /* Take clock from ADAT IN */
 762                        /* Mute all */
 763                        snd_emu1010_fpga_write(emu, EMU_HANA_UNMUTE, EMU_MUTE );
 764                        /* Default fallback clock 48kHz */
 765                        snd_emu1010_fpga_write(emu, EMU_HANA_DEFCLOCK, EMU_HANA_DEFCLOCK_48K );
 766                        /* Word Clock source, sync to ADAT input */
 767                        snd_emu1010_fpga_write(emu, EMU_HANA_WCLOCK,
 768                                EMU_HANA_WCLOCK_HANA_ADAT_IN | EMU_HANA_WCLOCK_1X );
 769                        /* Set LEDs on Audio Dock */
 770                        snd_emu1010_fpga_write(emu, EMU_HANA_DOCK_LEDS_2, EMU_HANA_DOCK_LEDS_2_EXT | EMU_HANA_DOCK_LEDS_2_LOCK );
 771                        /* FIXME: We should set EMU_HANA_DOCK_LEDS_2_LOCK only when clock signal is present and valid */        
 772                        /* Allow DLL to settle */
 773                        msleep(10);
 774                        /*   Unmute all */
 775                        snd_emu1010_fpga_write(emu, EMU_HANA_UNMUTE, EMU_UNMUTE );
 776                         
 777                        
 778                        break;          
 779                }
 780        }
 781        return change;
 782}
 783
 784static const struct snd_kcontrol_new snd_emu1010_internal_clock =
 785{
 786        .access =       SNDRV_CTL_ELEM_ACCESS_READWRITE,
 787        .iface =        SNDRV_CTL_ELEM_IFACE_MIXER,
 788        .name =         "Clock Internal Rate",
 789        .count =        1,
 790        .info =         snd_emu1010_internal_clock_info,
 791        .get =          snd_emu1010_internal_clock_get,
 792        .put =          snd_emu1010_internal_clock_put
 793};
 794
 795static int snd_emu1010_optical_out_info(struct snd_kcontrol *kcontrol,
 796                                          struct snd_ctl_elem_info *uinfo)
 797{
 798        static const char * const texts[2] = {
 799                "SPDIF", "ADAT"
 800        };
 801
 802        return snd_ctl_enum_info(uinfo, 1, 2, texts);
 803}
 804
 805static int snd_emu1010_optical_out_get(struct snd_kcontrol *kcontrol,
 806                                        struct snd_ctl_elem_value *ucontrol)
 807{
 808        struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
 809
 810        ucontrol->value.enumerated.item[0] = emu->emu1010.optical_out;
 811        return 0;
 812}
 813
 814static int snd_emu1010_optical_out_put(struct snd_kcontrol *kcontrol,
 815                                        struct snd_ctl_elem_value *ucontrol)
 816{
 817        struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
 818        unsigned int val;
 819        u32 tmp;
 820        int change = 0;
 821
 822        val = ucontrol->value.enumerated.item[0];
 823        /* Limit: uinfo->value.enumerated.items = 2; */
 824        if (val >= 2)
 825                return -EINVAL;
 826        change = (emu->emu1010.optical_out != val);
 827        if (change) {
 828                emu->emu1010.optical_out = val;
 829                tmp = (emu->emu1010.optical_in ? EMU_HANA_OPTICAL_IN_ADAT : 0) |
 830                        (emu->emu1010.optical_out ? EMU_HANA_OPTICAL_OUT_ADAT : 0);
 831                snd_emu1010_fpga_write(emu, EMU_HANA_OPTICAL_TYPE, tmp);
 832        }
 833        return change;
 834}
 835
 836static const struct snd_kcontrol_new snd_emu1010_optical_out = {
 837        .access =       SNDRV_CTL_ELEM_ACCESS_READWRITE,
 838        .iface =        SNDRV_CTL_ELEM_IFACE_MIXER,
 839        .name =         "Optical Output Mode",
 840        .count =        1,
 841        .info =         snd_emu1010_optical_out_info,
 842        .get =          snd_emu1010_optical_out_get,
 843        .put =          snd_emu1010_optical_out_put
 844};
 845
 846static int snd_emu1010_optical_in_info(struct snd_kcontrol *kcontrol,
 847                                          struct snd_ctl_elem_info *uinfo)
 848{
 849        static const char * const texts[2] = {
 850                "SPDIF", "ADAT"
 851        };
 852
 853        return snd_ctl_enum_info(uinfo, 1, 2, texts);
 854}
 855
 856static int snd_emu1010_optical_in_get(struct snd_kcontrol *kcontrol,
 857                                        struct snd_ctl_elem_value *ucontrol)
 858{
 859        struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
 860
 861        ucontrol->value.enumerated.item[0] = emu->emu1010.optical_in;
 862        return 0;
 863}
 864
 865static int snd_emu1010_optical_in_put(struct snd_kcontrol *kcontrol,
 866                                        struct snd_ctl_elem_value *ucontrol)
 867{
 868        struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
 869        unsigned int val;
 870        u32 tmp;
 871        int change = 0;
 872
 873        val = ucontrol->value.enumerated.item[0];
 874        /* Limit: uinfo->value.enumerated.items = 2; */
 875        if (val >= 2)
 876                return -EINVAL;
 877        change = (emu->emu1010.optical_in != val);
 878        if (change) {
 879                emu->emu1010.optical_in = val;
 880                tmp = (emu->emu1010.optical_in ? EMU_HANA_OPTICAL_IN_ADAT : 0) |
 881                        (emu->emu1010.optical_out ? EMU_HANA_OPTICAL_OUT_ADAT : 0);
 882                snd_emu1010_fpga_write(emu, EMU_HANA_OPTICAL_TYPE, tmp);
 883        }
 884        return change;
 885}
 886
 887static const struct snd_kcontrol_new snd_emu1010_optical_in = {
 888        .access =       SNDRV_CTL_ELEM_ACCESS_READWRITE,
 889        .iface =        SNDRV_CTL_ELEM_IFACE_MIXER,
 890        .name =         "Optical Input Mode",
 891        .count =        1,
 892        .info =         snd_emu1010_optical_in_info,
 893        .get =          snd_emu1010_optical_in_get,
 894        .put =          snd_emu1010_optical_in_put
 895};
 896
 897static int snd_audigy_i2c_capture_source_info(struct snd_kcontrol *kcontrol,
 898                                          struct snd_ctl_elem_info *uinfo)
 899{
 900#if 0
 901        static const char * const texts[4] = {
 902                "Unknown1", "Unknown2", "Mic", "Line"
 903        };
 904#endif
 905        static const char * const texts[2] = {
 906                "Mic", "Line"
 907        };
 908
 909        return snd_ctl_enum_info(uinfo, 1, 2, texts);
 910}
 911
 912static int snd_audigy_i2c_capture_source_get(struct snd_kcontrol *kcontrol,
 913                                        struct snd_ctl_elem_value *ucontrol)
 914{
 915        struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
 916
 917        ucontrol->value.enumerated.item[0] = emu->i2c_capture_source;
 918        return 0;
 919}
 920
 921static int snd_audigy_i2c_capture_source_put(struct snd_kcontrol *kcontrol,
 922                                        struct snd_ctl_elem_value *ucontrol)
 923{
 924        struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
 925        unsigned int source_id;
 926        unsigned int ngain, ogain;
 927        u32 gpio;
 928        int change = 0;
 929        unsigned long flags;
 930        u32 source;
 931        /* If the capture source has changed,
 932         * update the capture volume from the cached value
 933         * for the particular source.
 934         */
 935        source_id = ucontrol->value.enumerated.item[0];
 936        /* Limit: uinfo->value.enumerated.items = 2; */
 937        /*        emu->i2c_capture_volume */
 938        if (source_id >= 2)
 939                return -EINVAL;
 940        change = (emu->i2c_capture_source != source_id);
 941        if (change) {
 942                snd_emu10k1_i2c_write(emu, ADC_MUX, 0); /* Mute input */
 943                spin_lock_irqsave(&emu->emu_lock, flags);
 944                gpio = inl(emu->port + A_IOCFG);
 945                if (source_id==0)
 946                        outl(gpio | 0x4, emu->port + A_IOCFG);
 947                else
 948                        outl(gpio & ~0x4, emu->port + A_IOCFG);
 949                spin_unlock_irqrestore(&emu->emu_lock, flags);
 950
 951                ngain = emu->i2c_capture_volume[source_id][0]; /* Left */
 952                ogain = emu->i2c_capture_volume[emu->i2c_capture_source][0]; /* Left */
 953                if (ngain != ogain)
 954                        snd_emu10k1_i2c_write(emu, ADC_ATTEN_ADCL, ((ngain) & 0xff));
 955                ngain = emu->i2c_capture_volume[source_id][1]; /* Right */
 956                ogain = emu->i2c_capture_volume[emu->i2c_capture_source][1]; /* Right */
 957                if (ngain != ogain)
 958                        snd_emu10k1_i2c_write(emu, ADC_ATTEN_ADCR, ((ngain) & 0xff));
 959
 960                source = 1 << (source_id + 2);
 961                snd_emu10k1_i2c_write(emu, ADC_MUX, source); /* Set source */
 962                emu->i2c_capture_source = source_id;
 963        }
 964        return change;
 965}
 966
 967static const struct snd_kcontrol_new snd_audigy_i2c_capture_source =
 968{
 969                .iface =        SNDRV_CTL_ELEM_IFACE_MIXER,
 970                .name =         "Capture Source",
 971                .info =         snd_audigy_i2c_capture_source_info,
 972                .get =          snd_audigy_i2c_capture_source_get,
 973                .put =          snd_audigy_i2c_capture_source_put
 974};
 975
 976static int snd_audigy_i2c_volume_info(struct snd_kcontrol *kcontrol,
 977                                  struct snd_ctl_elem_info *uinfo)
 978{
 979        uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
 980        uinfo->count = 2;
 981        uinfo->value.integer.min = 0;
 982        uinfo->value.integer.max = 255;
 983        return 0;
 984}
 985
 986static int snd_audigy_i2c_volume_get(struct snd_kcontrol *kcontrol,
 987                                 struct snd_ctl_elem_value *ucontrol)
 988{
 989        struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
 990        unsigned int source_id;
 991
 992        source_id = kcontrol->private_value;
 993        /* Limit: emu->i2c_capture_volume */
 994        /*        capture_source: uinfo->value.enumerated.items = 2 */
 995        if (source_id >= 2)
 996                return -EINVAL;
 997
 998        ucontrol->value.integer.value[0] = emu->i2c_capture_volume[source_id][0];
 999        ucontrol->value.integer.value[1] = emu->i2c_capture_volume[source_id][1];
1000        return 0;
1001}
1002
1003static int snd_audigy_i2c_volume_put(struct snd_kcontrol *kcontrol,
1004                                 struct snd_ctl_elem_value *ucontrol)
1005{
1006        struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1007        unsigned int ogain;
1008        unsigned int ngain;
1009        unsigned int source_id;
1010        int change = 0;
1011
1012        source_id = kcontrol->private_value;
1013        /* Limit: emu->i2c_capture_volume */
1014        /*        capture_source: uinfo->value.enumerated.items = 2 */
1015        if (source_id >= 2)
1016                return -EINVAL;
1017        ogain = emu->i2c_capture_volume[source_id][0]; /* Left */
1018        ngain = ucontrol->value.integer.value[0];
1019        if (ngain > 0xff)
1020                return 0;
1021        if (ogain != ngain) {
1022                if (emu->i2c_capture_source == source_id)
1023                        snd_emu10k1_i2c_write(emu, ADC_ATTEN_ADCL, ((ngain) & 0xff) );
1024                emu->i2c_capture_volume[source_id][0] = ngain;
1025                change = 1;
1026        }
1027        ogain = emu->i2c_capture_volume[source_id][1]; /* Right */
1028        ngain = ucontrol->value.integer.value[1];
1029        if (ngain > 0xff)
1030                return 0;
1031        if (ogain != ngain) {
1032                if (emu->i2c_capture_source == source_id)
1033                        snd_emu10k1_i2c_write(emu, ADC_ATTEN_ADCR, ((ngain) & 0xff));
1034                emu->i2c_capture_volume[source_id][1] = ngain;
1035                change = 1;
1036        }
1037
1038        return change;
1039}
1040
1041#define I2C_VOLUME(xname,chid) \
1042{                                                               \
1043        .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname,     \
1044        .access = SNDRV_CTL_ELEM_ACCESS_READWRITE |             \
1045                  SNDRV_CTL_ELEM_ACCESS_TLV_READ,               \
1046        .info =  snd_audigy_i2c_volume_info,                    \
1047        .get =   snd_audigy_i2c_volume_get,                     \
1048        .put =   snd_audigy_i2c_volume_put,                     \
1049        .tlv = { .p = snd_audigy_db_scale2 },                   \
1050        .private_value = chid                                   \
1051}
1052
1053
1054static struct snd_kcontrol_new snd_audigy_i2c_volume_ctls[] = {
1055        I2C_VOLUME("Mic Capture Volume", 0),
1056        I2C_VOLUME("Line Capture Volume", 0)
1057};
1058
1059#if 0
1060static int snd_audigy_spdif_output_rate_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
1061{
1062        static const char * const texts[] = {"44100", "48000", "96000"};
1063
1064        return snd_ctl_enum_info(uinfo, 1, 3, texts);
1065}
1066
1067static int snd_audigy_spdif_output_rate_get(struct snd_kcontrol *kcontrol,
1068                                 struct snd_ctl_elem_value *ucontrol)
1069{
1070        struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1071        unsigned int tmp;
1072        unsigned long flags;
1073        
1074
1075        spin_lock_irqsave(&emu->reg_lock, flags);
1076        tmp = snd_emu10k1_ptr_read(emu, A_SPDIF_SAMPLERATE, 0);
1077        switch (tmp & A_SPDIF_RATE_MASK) {
1078        case A_SPDIF_44100:
1079                ucontrol->value.enumerated.item[0] = 0;
1080                break;
1081        case A_SPDIF_48000:
1082                ucontrol->value.enumerated.item[0] = 1;
1083                break;
1084        case A_SPDIF_96000:
1085                ucontrol->value.enumerated.item[0] = 2;
1086                break;
1087        default:
1088                ucontrol->value.enumerated.item[0] = 1;
1089        }
1090        spin_unlock_irqrestore(&emu->reg_lock, flags);
1091        return 0;
1092}
1093
1094static int snd_audigy_spdif_output_rate_put(struct snd_kcontrol *kcontrol,
1095                                 struct snd_ctl_elem_value *ucontrol)
1096{
1097        struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1098        int change;
1099        unsigned int reg, val, tmp;
1100        unsigned long flags;
1101
1102        switch(ucontrol->value.enumerated.item[0]) {
1103        case 0:
1104                val = A_SPDIF_44100;
1105                break;
1106        case 1:
1107                val = A_SPDIF_48000;
1108                break;
1109        case 2:
1110                val = A_SPDIF_96000;
1111                break;
1112        default:
1113                val = A_SPDIF_48000;
1114                break;
1115        }
1116
1117        
1118        spin_lock_irqsave(&emu->reg_lock, flags);
1119        reg = snd_emu10k1_ptr_read(emu, A_SPDIF_SAMPLERATE, 0);
1120        tmp = reg & ~A_SPDIF_RATE_MASK;
1121        tmp |= val;
1122        if ((change = (tmp != reg)))
1123                snd_emu10k1_ptr_write(emu, A_SPDIF_SAMPLERATE, 0, tmp);
1124        spin_unlock_irqrestore(&emu->reg_lock, flags);
1125        return change;
1126}
1127
1128static struct snd_kcontrol_new snd_audigy_spdif_output_rate =
1129{
1130        .access =       SNDRV_CTL_ELEM_ACCESS_READWRITE,
1131        .iface =        SNDRV_CTL_ELEM_IFACE_MIXER,
1132        .name =         "Audigy SPDIF Output Sample Rate",
1133        .count =        1,
1134        .info =         snd_audigy_spdif_output_rate_info,
1135        .get =          snd_audigy_spdif_output_rate_get,
1136        .put =          snd_audigy_spdif_output_rate_put
1137};
1138#endif
1139
1140static int snd_emu10k1_spdif_put(struct snd_kcontrol *kcontrol,
1141                                 struct snd_ctl_elem_value *ucontrol)
1142{
1143        struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1144        unsigned int idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
1145        int change;
1146        unsigned int val;
1147        unsigned long flags;
1148
1149        /* Limit: emu->spdif_bits */
1150        if (idx >= 3)
1151                return -EINVAL;
1152        val = (ucontrol->value.iec958.status[0] << 0) |
1153              (ucontrol->value.iec958.status[1] << 8) |
1154              (ucontrol->value.iec958.status[2] << 16) |
1155              (ucontrol->value.iec958.status[3] << 24);
1156        spin_lock_irqsave(&emu->reg_lock, flags);
1157        change = val != emu->spdif_bits[idx];
1158        if (change) {
1159                snd_emu10k1_ptr_write(emu, SPCS0 + idx, 0, val);
1160                emu->spdif_bits[idx] = val;
1161        }
1162        spin_unlock_irqrestore(&emu->reg_lock, flags);
1163        return change;
1164}
1165
1166static const struct snd_kcontrol_new snd_emu10k1_spdif_mask_control =
1167{
1168        .access =       SNDRV_CTL_ELEM_ACCESS_READ,
1169        .iface =        SNDRV_CTL_ELEM_IFACE_PCM,
1170        .name =         SNDRV_CTL_NAME_IEC958("",PLAYBACK,MASK),
1171        .count =        3,
1172        .info =         snd_emu10k1_spdif_info,
1173        .get =          snd_emu10k1_spdif_get_mask
1174};
1175
1176static const struct snd_kcontrol_new snd_emu10k1_spdif_control =
1177{
1178        .iface =        SNDRV_CTL_ELEM_IFACE_PCM,
1179        .name =         SNDRV_CTL_NAME_IEC958("",PLAYBACK,DEFAULT),
1180        .count =        3,
1181        .info =         snd_emu10k1_spdif_info,
1182        .get =          snd_emu10k1_spdif_get,
1183        .put =          snd_emu10k1_spdif_put
1184};
1185
1186
1187static void update_emu10k1_fxrt(struct snd_emu10k1 *emu, int voice, unsigned char *route)
1188{
1189        if (emu->audigy) {
1190                snd_emu10k1_ptr_write(emu, A_FXRT1, voice,
1191                                      snd_emu10k1_compose_audigy_fxrt1(route));
1192                snd_emu10k1_ptr_write(emu, A_FXRT2, voice,
1193                                      snd_emu10k1_compose_audigy_fxrt2(route));
1194        } else {
1195                snd_emu10k1_ptr_write(emu, FXRT, voice,
1196                                      snd_emu10k1_compose_send_routing(route));
1197        }
1198}
1199
1200static void update_emu10k1_send_volume(struct snd_emu10k1 *emu, int voice, unsigned char *volume)
1201{
1202        snd_emu10k1_ptr_write(emu, PTRX_FXSENDAMOUNT_A, voice, volume[0]);
1203        snd_emu10k1_ptr_write(emu, PTRX_FXSENDAMOUNT_B, voice, volume[1]);
1204        snd_emu10k1_ptr_write(emu, PSST_FXSENDAMOUNT_C, voice, volume[2]);
1205        snd_emu10k1_ptr_write(emu, DSL_FXSENDAMOUNT_D, voice, volume[3]);
1206        if (emu->audigy) {
1207                unsigned int val = ((unsigned int)volume[4] << 24) |
1208                        ((unsigned int)volume[5] << 16) |
1209                        ((unsigned int)volume[6] << 8) |
1210                        (unsigned int)volume[7];
1211                snd_emu10k1_ptr_write(emu, A_SENDAMOUNTS, voice, val);
1212        }
1213}
1214
1215/* PCM stream controls */
1216
1217static int snd_emu10k1_send_routing_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
1218{
1219        struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1220        uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
1221        uinfo->count = emu->audigy ? 3*8 : 3*4;
1222        uinfo->value.integer.min = 0;
1223        uinfo->value.integer.max = emu->audigy ? 0x3f : 0x0f;
1224        return 0;
1225}
1226
1227static int snd_emu10k1_send_routing_get(struct snd_kcontrol *kcontrol,
1228                                        struct snd_ctl_elem_value *ucontrol)
1229{
1230        unsigned long flags;
1231        struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1232        struct snd_emu10k1_pcm_mixer *mix =
1233                &emu->pcm_mixer[snd_ctl_get_ioffidx(kcontrol, &ucontrol->id)];
1234        int voice, idx;
1235        int num_efx = emu->audigy ? 8 : 4;
1236        int mask = emu->audigy ? 0x3f : 0x0f;
1237
1238        spin_lock_irqsave(&emu->reg_lock, flags);
1239        for (voice = 0; voice < 3; voice++)
1240                for (idx = 0; idx < num_efx; idx++)
1241                        ucontrol->value.integer.value[(voice * num_efx) + idx] = 
1242                                mix->send_routing[voice][idx] & mask;
1243        spin_unlock_irqrestore(&emu->reg_lock, flags);
1244        return 0;
1245}
1246
1247static int snd_emu10k1_send_routing_put(struct snd_kcontrol *kcontrol,
1248                                        struct snd_ctl_elem_value *ucontrol)
1249{
1250        unsigned long flags;
1251        struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1252        struct snd_emu10k1_pcm_mixer *mix =
1253                &emu->pcm_mixer[snd_ctl_get_ioffidx(kcontrol, &ucontrol->id)];
1254        int change = 0, voice, idx, val;
1255        int num_efx = emu->audigy ? 8 : 4;
1256        int mask = emu->audigy ? 0x3f : 0x0f;
1257
1258        spin_lock_irqsave(&emu->reg_lock, flags);
1259        for (voice = 0; voice < 3; voice++)
1260                for (idx = 0; idx < num_efx; idx++) {
1261                        val = ucontrol->value.integer.value[(voice * num_efx) + idx] & mask;
1262                        if (mix->send_routing[voice][idx] != val) {
1263                                mix->send_routing[voice][idx] = val;
1264                                change = 1;
1265                        }
1266                }       
1267        if (change && mix->epcm) {
1268                if (mix->epcm->voices[0] && mix->epcm->voices[1]) {
1269                        update_emu10k1_fxrt(emu, mix->epcm->voices[0]->number,
1270                                            &mix->send_routing[1][0]);
1271                        update_emu10k1_fxrt(emu, mix->epcm->voices[1]->number,
1272                                            &mix->send_routing[2][0]);
1273                } else if (mix->epcm->voices[0]) {
1274                        update_emu10k1_fxrt(emu, mix->epcm->voices[0]->number,
1275                                            &mix->send_routing[0][0]);
1276                }
1277        }
1278        spin_unlock_irqrestore(&emu->reg_lock, flags);
1279        return change;
1280}
1281
1282static const struct snd_kcontrol_new snd_emu10k1_send_routing_control =
1283{
1284        .access =       SNDRV_CTL_ELEM_ACCESS_READWRITE | SNDRV_CTL_ELEM_ACCESS_INACTIVE,
1285        .iface =        SNDRV_CTL_ELEM_IFACE_PCM,
1286        .name =         "EMU10K1 PCM Send Routing",
1287        .count =        32,
1288        .info =         snd_emu10k1_send_routing_info,
1289        .get =          snd_emu10k1_send_routing_get,
1290        .put =          snd_emu10k1_send_routing_put
1291};
1292
1293static int snd_emu10k1_send_volume_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
1294{
1295        struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1296        uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
1297        uinfo->count = emu->audigy ? 3*8 : 3*4;
1298        uinfo->value.integer.min = 0;
1299        uinfo->value.integer.max = 255;
1300        return 0;
1301}
1302
1303static int snd_emu10k1_send_volume_get(struct snd_kcontrol *kcontrol,
1304                                       struct snd_ctl_elem_value *ucontrol)
1305{
1306        unsigned long flags;
1307        struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1308        struct snd_emu10k1_pcm_mixer *mix =
1309                &emu->pcm_mixer[snd_ctl_get_ioffidx(kcontrol, &ucontrol->id)];
1310        int idx;
1311        int num_efx = emu->audigy ? 8 : 4;
1312
1313        spin_lock_irqsave(&emu->reg_lock, flags);
1314        for (idx = 0; idx < 3*num_efx; idx++)
1315                ucontrol->value.integer.value[idx] = mix->send_volume[idx/num_efx][idx%num_efx];
1316        spin_unlock_irqrestore(&emu->reg_lock, flags);
1317        return 0;
1318}
1319
1320static int snd_emu10k1_send_volume_put(struct snd_kcontrol *kcontrol,
1321                                       struct snd_ctl_elem_value *ucontrol)
1322{
1323        unsigned long flags;
1324        struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1325        struct snd_emu10k1_pcm_mixer *mix =
1326                &emu->pcm_mixer[snd_ctl_get_ioffidx(kcontrol, &ucontrol->id)];
1327        int change = 0, idx, val;
1328        int num_efx = emu->audigy ? 8 : 4;
1329
1330        spin_lock_irqsave(&emu->reg_lock, flags);
1331        for (idx = 0; idx < 3*num_efx; idx++) {
1332                val = ucontrol->value.integer.value[idx] & 255;
1333                if (mix->send_volume[idx/num_efx][idx%num_efx] != val) {
1334                        mix->send_volume[idx/num_efx][idx%num_efx] = val;
1335                        change = 1;
1336                }
1337        }
1338        if (change && mix->epcm) {
1339                if (mix->epcm->voices[0] && mix->epcm->voices[1]) {
1340                        update_emu10k1_send_volume(emu, mix->epcm->voices[0]->number,
1341                                                   &mix->send_volume[1][0]);
1342                        update_emu10k1_send_volume(emu, mix->epcm->voices[1]->number,
1343                                                   &mix->send_volume[2][0]);
1344                } else if (mix->epcm->voices[0]) {
1345                        update_emu10k1_send_volume(emu, mix->epcm->voices[0]->number,
1346                                                   &mix->send_volume[0][0]);
1347                }
1348        }
1349        spin_unlock_irqrestore(&emu->reg_lock, flags);
1350        return change;
1351}
1352
1353static const struct snd_kcontrol_new snd_emu10k1_send_volume_control =
1354{
1355        .access =       SNDRV_CTL_ELEM_ACCESS_READWRITE | SNDRV_CTL_ELEM_ACCESS_INACTIVE,
1356        .iface =        SNDRV_CTL_ELEM_IFACE_PCM,
1357        .name =         "EMU10K1 PCM Send Volume",
1358        .count =        32,
1359        .info =         snd_emu10k1_send_volume_info,
1360        .get =          snd_emu10k1_send_volume_get,
1361        .put =          snd_emu10k1_send_volume_put
1362};
1363
1364static int snd_emu10k1_attn_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
1365{
1366        uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
1367        uinfo->count = 3;
1368        uinfo->value.integer.min = 0;
1369        uinfo->value.integer.max = 0xffff;
1370        return 0;
1371}
1372
1373static int snd_emu10k1_attn_get(struct snd_kcontrol *kcontrol,
1374                                struct snd_ctl_elem_value *ucontrol)
1375{
1376        struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1377        struct snd_emu10k1_pcm_mixer *mix =
1378                &emu->pcm_mixer[snd_ctl_get_ioffidx(kcontrol, &ucontrol->id)];
1379        unsigned long flags;
1380        int idx;
1381
1382        spin_lock_irqsave(&emu->reg_lock, flags);
1383        for (idx = 0; idx < 3; idx++)
1384                ucontrol->value.integer.value[idx] = mix->attn[idx];
1385        spin_unlock_irqrestore(&emu->reg_lock, flags);
1386        return 0;
1387}
1388
1389static int snd_emu10k1_attn_put(struct snd_kcontrol *kcontrol,
1390                                struct snd_ctl_elem_value *ucontrol)
1391{
1392        unsigned long flags;
1393        struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1394        struct snd_emu10k1_pcm_mixer *mix =
1395                &emu->pcm_mixer[snd_ctl_get_ioffidx(kcontrol, &ucontrol->id)];
1396        int change = 0, idx, val;
1397
1398        spin_lock_irqsave(&emu->reg_lock, flags);
1399        for (idx = 0; idx < 3; idx++) {
1400                val = ucontrol->value.integer.value[idx] & 0xffff;
1401                if (mix->attn[idx] != val) {
1402                        mix->attn[idx] = val;
1403                        change = 1;
1404                }
1405        }
1406        if (change && mix->epcm) {
1407                if (mix->epcm->voices[0] && mix->epcm->voices[1]) {
1408                        snd_emu10k1_ptr_write(emu, VTFT_VOLUMETARGET, mix->epcm->voices[0]->number, mix->attn[1]);
1409                        snd_emu10k1_ptr_write(emu, VTFT_VOLUMETARGET, mix->epcm->voices[1]->number, mix->attn[2]);
1410                } else if (mix->epcm->voices[0]) {
1411                        snd_emu10k1_ptr_write(emu, VTFT_VOLUMETARGET, mix->epcm->voices[0]->number, mix->attn[0]);
1412                }
1413        }
1414        spin_unlock_irqrestore(&emu->reg_lock, flags);
1415        return change;
1416}
1417
1418static const struct snd_kcontrol_new snd_emu10k1_attn_control =
1419{
1420        .access =       SNDRV_CTL_ELEM_ACCESS_READWRITE | SNDRV_CTL_ELEM_ACCESS_INACTIVE,
1421        .iface =        SNDRV_CTL_ELEM_IFACE_PCM,
1422        .name =         "EMU10K1 PCM Volume",
1423        .count =        32,
1424        .info =         snd_emu10k1_attn_info,
1425        .get =          snd_emu10k1_attn_get,
1426        .put =          snd_emu10k1_attn_put
1427};
1428
1429/* Mutichannel PCM stream controls */
1430
1431static int snd_emu10k1_efx_send_routing_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
1432{
1433        struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1434        uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
1435        uinfo->count = emu->audigy ? 8 : 4;
1436        uinfo->value.integer.min = 0;
1437        uinfo->value.integer.max = emu->audigy ? 0x3f : 0x0f;
1438        return 0;
1439}
1440
1441static int snd_emu10k1_efx_send_routing_get(struct snd_kcontrol *kcontrol,
1442                                        struct snd_ctl_elem_value *ucontrol)
1443{
1444        unsigned long flags;
1445        struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1446        struct snd_emu10k1_pcm_mixer *mix =
1447                &emu->efx_pcm_mixer[snd_ctl_get_ioffidx(kcontrol, &ucontrol->id)];
1448        int idx;
1449        int num_efx = emu->audigy ? 8 : 4;
1450        int mask = emu->audigy ? 0x3f : 0x0f;
1451
1452        spin_lock_irqsave(&emu->reg_lock, flags);
1453        for (idx = 0; idx < num_efx; idx++)
1454                ucontrol->value.integer.value[idx] = 
1455                        mix->send_routing[0][idx] & mask;
1456        spin_unlock_irqrestore(&emu->reg_lock, flags);
1457        return 0;
1458}
1459
1460static int snd_emu10k1_efx_send_routing_put(struct snd_kcontrol *kcontrol,
1461                                        struct snd_ctl_elem_value *ucontrol)
1462{
1463        unsigned long flags;
1464        struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1465        int ch = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
1466        struct snd_emu10k1_pcm_mixer *mix = &emu->efx_pcm_mixer[ch];
1467        int change = 0, idx, val;
1468        int num_efx = emu->audigy ? 8 : 4;
1469        int mask = emu->audigy ? 0x3f : 0x0f;
1470
1471        spin_lock_irqsave(&emu->reg_lock, flags);
1472        for (idx = 0; idx < num_efx; idx++) {
1473                val = ucontrol->value.integer.value[idx] & mask;
1474                if (mix->send_routing[0][idx] != val) {
1475                        mix->send_routing[0][idx] = val;
1476                        change = 1;
1477                }
1478        }       
1479
1480        if (change && mix->epcm) {
1481                if (mix->epcm->voices[ch]) {
1482                        update_emu10k1_fxrt(emu, mix->epcm->voices[ch]->number,
1483                                        &mix->send_routing[0][0]);
1484                }
1485        }
1486        spin_unlock_irqrestore(&emu->reg_lock, flags);
1487        return change;
1488}
1489
1490static const struct snd_kcontrol_new snd_emu10k1_efx_send_routing_control =
1491{
1492        .access =       SNDRV_CTL_ELEM_ACCESS_READWRITE | SNDRV_CTL_ELEM_ACCESS_INACTIVE,
1493        .iface =        SNDRV_CTL_ELEM_IFACE_PCM,
1494        .name =         "Multichannel PCM Send Routing",
1495        .count =        16,
1496        .info =         snd_emu10k1_efx_send_routing_info,
1497        .get =          snd_emu10k1_efx_send_routing_get,
1498        .put =          snd_emu10k1_efx_send_routing_put
1499};
1500
1501static int snd_emu10k1_efx_send_volume_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
1502{
1503        struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1504        uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
1505        uinfo->count = emu->audigy ? 8 : 4;
1506        uinfo->value.integer.min = 0;
1507        uinfo->value.integer.max = 255;
1508        return 0;
1509}
1510
1511static int snd_emu10k1_efx_send_volume_get(struct snd_kcontrol *kcontrol,
1512                                       struct snd_ctl_elem_value *ucontrol)
1513{
1514        unsigned long flags;
1515        struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1516        struct snd_emu10k1_pcm_mixer *mix =
1517                &emu->efx_pcm_mixer[snd_ctl_get_ioffidx(kcontrol, &ucontrol->id)];
1518        int idx;
1519        int num_efx = emu->audigy ? 8 : 4;
1520
1521        spin_lock_irqsave(&emu->reg_lock, flags);
1522        for (idx = 0; idx < num_efx; idx++)
1523                ucontrol->value.integer.value[idx] = mix->send_volume[0][idx];
1524        spin_unlock_irqrestore(&emu->reg_lock, flags);
1525        return 0;
1526}
1527
1528static int snd_emu10k1_efx_send_volume_put(struct snd_kcontrol *kcontrol,
1529                                       struct snd_ctl_elem_value *ucontrol)
1530{
1531        unsigned long flags;
1532        struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1533        int ch = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
1534        struct snd_emu10k1_pcm_mixer *mix = &emu->efx_pcm_mixer[ch];
1535        int change = 0, idx, val;
1536        int num_efx = emu->audigy ? 8 : 4;
1537
1538        spin_lock_irqsave(&emu->reg_lock, flags);
1539        for (idx = 0; idx < num_efx; idx++) {
1540                val = ucontrol->value.integer.value[idx] & 255;
1541                if (mix->send_volume[0][idx] != val) {
1542                        mix->send_volume[0][idx] = val;
1543                        change = 1;
1544                }
1545        }
1546        if (change && mix->epcm) {
1547                if (mix->epcm->voices[ch]) {
1548                        update_emu10k1_send_volume(emu, mix->epcm->voices[ch]->number,
1549                                                   &mix->send_volume[0][0]);
1550                }
1551        }
1552        spin_unlock_irqrestore(&emu->reg_lock, flags);
1553        return change;
1554}
1555
1556
1557static const struct snd_kcontrol_new snd_emu10k1_efx_send_volume_control =
1558{
1559        .access =       SNDRV_CTL_ELEM_ACCESS_READWRITE | SNDRV_CTL_ELEM_ACCESS_INACTIVE,
1560        .iface =        SNDRV_CTL_ELEM_IFACE_PCM,
1561        .name =         "Multichannel PCM Send Volume",
1562        .count =        16,
1563        .info =         snd_emu10k1_efx_send_volume_info,
1564        .get =          snd_emu10k1_efx_send_volume_get,
1565        .put =          snd_emu10k1_efx_send_volume_put
1566};
1567
1568static int snd_emu10k1_efx_attn_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
1569{
1570        uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
1571        uinfo->count = 1;
1572        uinfo->value.integer.min = 0;
1573        uinfo->value.integer.max = 0xffff;
1574        return 0;
1575}
1576
1577static int snd_emu10k1_efx_attn_get(struct snd_kcontrol *kcontrol,
1578                                struct snd_ctl_elem_value *ucontrol)
1579{
1580        struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1581        struct snd_emu10k1_pcm_mixer *mix =
1582                &emu->efx_pcm_mixer[snd_ctl_get_ioffidx(kcontrol, &ucontrol->id)];
1583        unsigned long flags;
1584
1585        spin_lock_irqsave(&emu->reg_lock, flags);
1586        ucontrol->value.integer.value[0] = mix->attn[0];
1587        spin_unlock_irqrestore(&emu->reg_lock, flags);
1588        return 0;
1589}
1590
1591static int snd_emu10k1_efx_attn_put(struct snd_kcontrol *kcontrol,
1592                                struct snd_ctl_elem_value *ucontrol)
1593{
1594        unsigned long flags;
1595        struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1596        int ch = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
1597        struct snd_emu10k1_pcm_mixer *mix = &emu->efx_pcm_mixer[ch];
1598        int change = 0, val;
1599
1600        spin_lock_irqsave(&emu->reg_lock, flags);
1601        val = ucontrol->value.integer.value[0] & 0xffff;
1602        if (mix->attn[0] != val) {
1603                mix->attn[0] = val;
1604                change = 1;
1605        }
1606        if (change && mix->epcm) {
1607                if (mix->epcm->voices[ch]) {
1608                        snd_emu10k1_ptr_write(emu, VTFT_VOLUMETARGET, mix->epcm->voices[ch]->number, mix->attn[0]);
1609                }
1610        }
1611        spin_unlock_irqrestore(&emu->reg_lock, flags);
1612        return change;
1613}
1614
1615static const struct snd_kcontrol_new snd_emu10k1_efx_attn_control =
1616{
1617        .access =       SNDRV_CTL_ELEM_ACCESS_READWRITE | SNDRV_CTL_ELEM_ACCESS_INACTIVE,
1618        .iface =        SNDRV_CTL_ELEM_IFACE_PCM,
1619        .name =         "Multichannel PCM Volume",
1620        .count =        16,
1621        .info =         snd_emu10k1_efx_attn_info,
1622        .get =          snd_emu10k1_efx_attn_get,
1623        .put =          snd_emu10k1_efx_attn_put
1624};
1625
1626#define snd_emu10k1_shared_spdif_info   snd_ctl_boolean_mono_info
1627
1628static int snd_emu10k1_shared_spdif_get(struct snd_kcontrol *kcontrol,
1629                                        struct snd_ctl_elem_value *ucontrol)
1630{
1631        struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1632
1633        if (emu->audigy)
1634                ucontrol->value.integer.value[0] = inl(emu->port + A_IOCFG) & A_IOCFG_GPOUT0 ? 1 : 0;
1635        else
1636                ucontrol->value.integer.value[0] = inl(emu->port + HCFG) & HCFG_GPOUT0 ? 1 : 0;
1637        if (emu->card_capabilities->invert_shared_spdif)
1638                ucontrol->value.integer.value[0] =
1639                        !ucontrol->value.integer.value[0];
1640                
1641        return 0;
1642}
1643
1644static int snd_emu10k1_shared_spdif_put(struct snd_kcontrol *kcontrol,
1645                                        struct snd_ctl_elem_value *ucontrol)
1646{
1647        unsigned long flags;
1648        struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1649        unsigned int reg, val, sw;
1650        int change = 0;
1651
1652        sw = ucontrol->value.integer.value[0];
1653        if (emu->card_capabilities->invert_shared_spdif)
1654                sw = !sw;
1655        spin_lock_irqsave(&emu->reg_lock, flags);
1656        if ( emu->card_capabilities->i2c_adc) {
1657                /* Do nothing for Audigy 2 ZS Notebook */
1658        } else if (emu->audigy) {
1659                reg = inl(emu->port + A_IOCFG);
1660                val = sw ? A_IOCFG_GPOUT0 : 0;
1661                change = (reg & A_IOCFG_GPOUT0) != val;
1662                if (change) {
1663                        reg &= ~A_IOCFG_GPOUT0;
1664                        reg |= val;
1665                        outl(reg | val, emu->port + A_IOCFG);
1666                }
1667        }
1668        reg = inl(emu->port + HCFG);
1669        val = sw ? HCFG_GPOUT0 : 0;
1670        change |= (reg & HCFG_GPOUT0) != val;
1671        if (change) {
1672                reg &= ~HCFG_GPOUT0;
1673                reg |= val;
1674                outl(reg | val, emu->port + HCFG);
1675        }
1676        spin_unlock_irqrestore(&emu->reg_lock, flags);
1677        return change;
1678}
1679
1680static const struct snd_kcontrol_new snd_emu10k1_shared_spdif =
1681{
1682        .iface =        SNDRV_CTL_ELEM_IFACE_MIXER,
1683        .name =         "SB Live Analog/Digital Output Jack",
1684        .info =         snd_emu10k1_shared_spdif_info,
1685        .get =          snd_emu10k1_shared_spdif_get,
1686        .put =          snd_emu10k1_shared_spdif_put
1687};
1688
1689static const struct snd_kcontrol_new snd_audigy_shared_spdif =
1690{
1691        .iface =        SNDRV_CTL_ELEM_IFACE_MIXER,
1692        .name =         "Audigy Analog/Digital Output Jack",
1693        .info =         snd_emu10k1_shared_spdif_info,
1694        .get =          snd_emu10k1_shared_spdif_get,
1695        .put =          snd_emu10k1_shared_spdif_put
1696};
1697
1698/* workaround for too low volume on Audigy due to 16bit/24bit conversion */
1699
1700#define snd_audigy_capture_boost_info   snd_ctl_boolean_mono_info
1701
1702static int snd_audigy_capture_boost_get(struct snd_kcontrol *kcontrol,
1703                                        struct snd_ctl_elem_value *ucontrol)
1704{
1705        struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1706        unsigned int val;
1707
1708        /* FIXME: better to use a cached version */
1709        val = snd_ac97_read(emu->ac97, AC97_REC_GAIN);
1710        ucontrol->value.integer.value[0] = !!val;
1711        return 0;
1712}
1713
1714static int snd_audigy_capture_boost_put(struct snd_kcontrol *kcontrol,
1715                                        struct snd_ctl_elem_value *ucontrol)
1716{
1717        struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1718        unsigned int val;
1719
1720        if (ucontrol->value.integer.value[0])
1721                val = 0x0f0f;
1722        else
1723                val = 0;
1724        return snd_ac97_update(emu->ac97, AC97_REC_GAIN, val);
1725}
1726
1727static const struct snd_kcontrol_new snd_audigy_capture_boost =
1728{
1729        .iface =        SNDRV_CTL_ELEM_IFACE_MIXER,
1730        .name =         "Mic Extra Boost",
1731        .info =         snd_audigy_capture_boost_info,
1732        .get =          snd_audigy_capture_boost_get,
1733        .put =          snd_audigy_capture_boost_put
1734};
1735
1736
1737/*
1738 */
1739static void snd_emu10k1_mixer_free_ac97(struct snd_ac97 *ac97)
1740{
1741        struct snd_emu10k1 *emu = ac97->private_data;
1742        emu->ac97 = NULL;
1743}
1744
1745/*
1746 */
1747static int remove_ctl(struct snd_card *card, const char *name)
1748{
1749        struct snd_ctl_elem_id id;
1750        memset(&id, 0, sizeof(id));
1751        strcpy(id.name, name);
1752        id.iface = SNDRV_CTL_ELEM_IFACE_MIXER;
1753        return snd_ctl_remove_id(card, &id);
1754}
1755
1756static struct snd_kcontrol *ctl_find(struct snd_card *card, const char *name)
1757{
1758        struct snd_ctl_elem_id sid;
1759        memset(&sid, 0, sizeof(sid));
1760        strcpy(sid.name, name);
1761        sid.iface = SNDRV_CTL_ELEM_IFACE_MIXER;
1762        return snd_ctl_find_id(card, &sid);
1763}
1764
1765static int rename_ctl(struct snd_card *card, const char *src, const char *dst)
1766{
1767        struct snd_kcontrol *kctl = ctl_find(card, src);
1768        if (kctl) {
1769                strcpy(kctl->id.name, dst);
1770                return 0;
1771        }
1772        return -ENOENT;
1773}
1774
1775int snd_emu10k1_mixer(struct snd_emu10k1 *emu,
1776                      int pcm_device, int multi_device)
1777{
1778        int err, pcm;
1779        struct snd_kcontrol *kctl;
1780        struct snd_card *card = emu->card;
1781        char **c;
1782        static char *emu10k1_remove_ctls[] = {
1783                /* no AC97 mono, surround, center/lfe */
1784                "Master Mono Playback Switch",
1785                "Master Mono Playback Volume",
1786                "PCM Out Path & Mute",
1787                "Mono Output Select",
1788                "Surround Playback Switch",
1789                "Surround Playback Volume",
1790                "Center Playback Switch",
1791                "Center Playback Volume",
1792                "LFE Playback Switch",
1793                "LFE Playback Volume",
1794                NULL
1795        };
1796        static char *emu10k1_rename_ctls[] = {
1797                "Surround Digital Playback Volume", "Surround Playback Volume",
1798                "Center Digital Playback Volume", "Center Playback Volume",
1799                "LFE Digital Playback Volume", "LFE Playback Volume",
1800                NULL
1801        };
1802        static char *audigy_remove_ctls[] = {
1803                /* Master/PCM controls on ac97 of Audigy has no effect */
1804                /* On the Audigy2 the AC97 playback is piped into
1805                 * the Philips ADC for 24bit capture */
1806                "PCM Playback Switch",
1807                "PCM Playback Volume",
1808                "Master Playback Switch",
1809                "Master Playback Volume",
1810                "PCM Out Path & Mute",
1811                "Mono Output Select",
1812                /* remove unused AC97 capture controls */
1813                "Capture Source",
1814                "Capture Switch",
1815                "Capture Volume",
1816                "Mic Select",
1817                "Headphone Playback Switch",
1818                "Headphone Playback Volume",
1819                "3D Control - Center",
1820                "3D Control - Depth",
1821                "3D Control - Switch",
1822                "Video Playback Switch",
1823                "Video Playback Volume",
1824                "Mic Playback Switch",
1825                "Mic Playback Volume",
1826                "External Amplifier",
1827                NULL
1828        };
1829        static char *audigy_rename_ctls[] = {
1830                /* use conventional names */
1831                "Wave Playback Volume", "PCM Playback Volume",
1832                /* "Wave Capture Volume", "PCM Capture Volume", */
1833                "Wave Master Playback Volume", "Master Playback Volume",
1834                "AMic Playback Volume", "Mic Playback Volume",
1835                "Master Mono Playback Switch", "Phone Output Playback Switch",
1836                "Master Mono Playback Volume", "Phone Output Playback Volume",
1837                NULL
1838        };
1839        static char *audigy_rename_ctls_i2c_adc[] = {
1840                //"Analog Mix Capture Volume","OLD Analog Mix Capture Volume",
1841                "Line Capture Volume", "Analog Mix Capture Volume",
1842                "Wave Playback Volume", "OLD PCM Playback Volume",
1843                "Wave Master Playback Volume", "Master Playback Volume",
1844                "AMic Playback Volume", "Old Mic Playback Volume",
1845                "CD Capture Volume", "IEC958 Optical Capture Volume",
1846                NULL
1847        };
1848        static char *audigy_remove_ctls_i2c_adc[] = {
1849                /* On the Audigy2 ZS Notebook
1850                 * Capture via WM8775  */
1851                "Mic Capture Volume",
1852                "Analog Mix Capture Volume",
1853                "Aux Capture Volume",
1854                "IEC958 Optical Capture Volume",
1855                NULL
1856        };
1857        static char *audigy_remove_ctls_1361t_adc[] = {
1858                /* On the Audigy2 the AC97 playback is piped into
1859                 * the Philips ADC for 24bit capture */
1860                "PCM Playback Switch",
1861                "PCM Playback Volume",
1862                "Capture Source",
1863                "Capture Switch",
1864                "Capture Volume",
1865                "Mic Capture Volume",
1866                "Headphone Playback Switch",
1867                "Headphone Playback Volume",
1868                "3D Control - Center",
1869                "3D Control - Depth",
1870                "3D Control - Switch",
1871                "Line2 Playback Volume",
1872                "Line2 Capture Volume",
1873                NULL
1874        };
1875        static char *audigy_rename_ctls_1361t_adc[] = {
1876                "Master Playback Switch", "Master Capture Switch",
1877                "Master Playback Volume", "Master Capture Volume",
1878                "Wave Master Playback Volume", "Master Playback Volume",
1879                "Beep Playback Switch", "Beep Capture Switch",
1880                "Beep Playback Volume", "Beep Capture Volume",
1881                "Phone Playback Switch", "Phone Capture Switch",
1882                "Phone Playback Volume", "Phone Capture Volume",
1883                "Mic Playback Switch", "Mic Capture Switch",
1884                "Mic Playback Volume", "Mic Capture Volume",
1885                "Line Playback Switch", "Line Capture Switch",
1886                "Line Playback Volume", "Line Capture Volume",
1887                "CD Playback Switch", "CD Capture Switch",
1888                "CD Playback Volume", "CD Capture Volume",
1889                "Aux Playback Switch", "Aux Capture Switch",
1890                "Aux Playback Volume", "Aux Capture Volume",
1891                "Video Playback Switch", "Video Capture Switch",
1892                "Video Playback Volume", "Video Capture Volume",
1893                "Master Mono Playback Switch", "Phone Output Playback Switch",
1894                "Master Mono Playback Volume", "Phone Output Playback Volume",
1895                NULL
1896        };
1897
1898        if (emu->card_capabilities->ac97_chip) {
1899                struct snd_ac97_bus *pbus;
1900                struct snd_ac97_template ac97;
1901                static struct snd_ac97_bus_ops ops = {
1902                        .write = snd_emu10k1_ac97_write,
1903                        .read = snd_emu10k1_ac97_read,
1904                };
1905
1906                if ((err = snd_ac97_bus(emu->card, 0, &ops, NULL, &pbus)) < 0)
1907                        return err;
1908                pbus->no_vra = 1; /* we don't need VRA */
1909                
1910                memset(&ac97, 0, sizeof(ac97));
1911                ac97.private_data = emu;
1912                ac97.private_free = snd_emu10k1_mixer_free_ac97;
1913                ac97.scaps = AC97_SCAP_NO_SPDIF;
1914                if ((err = snd_ac97_mixer(pbus, &ac97, &emu->ac97)) < 0) {
1915                        if (emu->card_capabilities->ac97_chip == 1)
1916                                return err;
1917                        dev_info(emu->card->dev,
1918                                 "AC97 is optional on this board\n");
1919                        dev_info(emu->card->dev,
1920                                 "Proceeding without ac97 mixers...\n");
1921                        snd_device_free(emu->card, pbus);
1922                        goto no_ac97; /* FIXME: get rid of ugly gotos.. */
1923                }
1924                if (emu->audigy) {
1925                        /* set master volume to 0 dB */
1926                        snd_ac97_write_cache(emu->ac97, AC97_MASTER, 0x0000);
1927                        /* set capture source to mic */
1928                        snd_ac97_write_cache(emu->ac97, AC97_REC_SEL, 0x0000);
1929                        /* set mono output (TAD) to mic */
1930                        snd_ac97_update_bits(emu->ac97, AC97_GENERAL_PURPOSE,
1931                                0x0200, 0x0200);
1932                        if (emu->card_capabilities->adc_1361t)
1933                                c = audigy_remove_ctls_1361t_adc;
1934                        else 
1935                                c = audigy_remove_ctls;
1936                } else {
1937                        /*
1938                         * Credits for cards based on STAC9758:
1939                         *   James Courtier-Dutton <James@superbug.demon.co.uk>
1940                         *   Voluspa <voluspa@comhem.se>
1941                         */
1942                        if (emu->ac97->id == AC97_ID_STAC9758) {
1943                                emu->rear_ac97 = 1;
1944                                snd_emu10k1_ptr_write(emu, AC97SLOT, 0, AC97SLOT_CNTR|AC97SLOT_LFE|AC97SLOT_REAR_LEFT|AC97SLOT_REAR_RIGHT);
1945                                snd_ac97_write_cache(emu->ac97, AC97_HEADPHONE, 0x0202);
1946                                remove_ctl(card,"Front Playback Volume");
1947                                remove_ctl(card,"Front Playback Switch");
1948                        }
1949                        /* remove unused AC97 controls */
1950                        snd_ac97_write_cache(emu->ac97, AC97_SURROUND_MASTER, 0x0202);
1951                        snd_ac97_write_cache(emu->ac97, AC97_CENTER_LFE_MASTER, 0x0202);
1952                        c = emu10k1_remove_ctls;
1953                }
1954                for (; *c; c++)
1955                        remove_ctl(card, *c);
1956        } else if (emu->card_capabilities->i2c_adc) {
1957                c = audigy_remove_ctls_i2c_adc;
1958                for (; *c; c++)
1959                        remove_ctl(card, *c);
1960        } else {
1961        no_ac97:
1962                if (emu->card_capabilities->ecard)
1963                        strcpy(emu->card->mixername, "EMU APS");
1964                else if (emu->audigy)
1965                        strcpy(emu->card->mixername, "SB Audigy");
1966                else
1967                        strcpy(emu->card->mixername, "Emu10k1");
1968        }
1969
1970        if (emu->audigy)
1971                if (emu->card_capabilities->adc_1361t)
1972                        c = audigy_rename_ctls_1361t_adc;
1973                else if (emu->card_capabilities->i2c_adc)
1974                        c = audigy_rename_ctls_i2c_adc;
1975                else
1976                        c = audigy_rename_ctls;
1977        else
1978                c = emu10k1_rename_ctls;
1979        for (; *c; c += 2)
1980                rename_ctl(card, c[0], c[1]);
1981
1982        if (emu->card_capabilities->subsystem == 0x80401102) { /* SB Live! Platinum CT4760P */
1983                remove_ctl(card, "Center Playback Volume");
1984                remove_ctl(card, "LFE Playback Volume");
1985                remove_ctl(card, "Wave Center Playback Volume");
1986                remove_ctl(card, "Wave LFE Playback Volume");
1987        }
1988        if (emu->card_capabilities->subsystem == 0x20071102) {  /* Audigy 4 Pro */
1989                rename_ctl(card, "Line2 Capture Volume", "Line1/Mic Capture Volume");
1990                rename_ctl(card, "Analog Mix Capture Volume", "Line2 Capture Volume");
1991                rename_ctl(card, "Aux2 Capture Volume", "Line3 Capture Volume");
1992                rename_ctl(card, "Mic Capture Volume", "Unknown1 Capture Volume");
1993        }
1994        if ((kctl = emu->ctl_send_routing = snd_ctl_new1(&snd_emu10k1_send_routing_control, emu)) == NULL)
1995                return -ENOMEM;
1996        kctl->id.device = pcm_device;
1997        if ((err = snd_ctl_add(card, kctl)))
1998                return err;
1999        if ((kctl = emu->ctl_send_volume = snd_ctl_new1(&snd_emu10k1_send_volume_control, emu)) == NULL)
2000                return -ENOMEM;
2001        kctl->id.device = pcm_device;
2002        if ((err = snd_ctl_add(card, kctl)))
2003                return err;
2004        if ((kctl = emu->ctl_attn = snd_ctl_new1(&snd_emu10k1_attn_control, emu)) == NULL)
2005                return -ENOMEM;
2006        kctl->id.device = pcm_device;
2007        if ((err = snd_ctl_add(card, kctl)))
2008                return err;
2009
2010        if ((kctl = emu->ctl_efx_send_routing = snd_ctl_new1(&snd_emu10k1_efx_send_routing_control, emu)) == NULL)
2011                return -ENOMEM;
2012        kctl->id.device = multi_device;
2013        if ((err = snd_ctl_add(card, kctl)))
2014                return err;
2015        
2016        if ((kctl = emu->ctl_efx_send_volume = snd_ctl_new1(&snd_emu10k1_efx_send_volume_control, emu)) == NULL)
2017                return -ENOMEM;
2018        kctl->id.device = multi_device;
2019        if ((err = snd_ctl_add(card, kctl)))
2020                return err;
2021        
2022        if ((kctl = emu->ctl_efx_attn = snd_ctl_new1(&snd_emu10k1_efx_attn_control, emu)) == NULL)
2023                return -ENOMEM;
2024        kctl->id.device = multi_device;
2025        if ((err = snd_ctl_add(card, kctl)))
2026                return err;
2027
2028        /* initialize the routing and volume table for each pcm playback stream */
2029        for (pcm = 0; pcm < 32; pcm++) {
2030                struct snd_emu10k1_pcm_mixer *mix;
2031                int v;
2032                
2033                mix = &emu->pcm_mixer[pcm];
2034                mix->epcm = NULL;
2035
2036                for (v = 0; v < 4; v++)
2037                        mix->send_routing[0][v] = 
2038                                mix->send_routing[1][v] = 
2039                                mix->send_routing[2][v] = v;
2040                
2041                memset(&mix->send_volume, 0, sizeof(mix->send_volume));
2042                mix->send_volume[0][0] = mix->send_volume[0][1] =
2043                mix->send_volume[1][0] = mix->send_volume[2][1] = 255;
2044                
2045                mix->attn[0] = mix->attn[1] = mix->attn[2] = 0xffff;
2046        }
2047        
2048        /* initialize the routing and volume table for the multichannel playback stream */
2049        for (pcm = 0; pcm < NUM_EFX_PLAYBACK; pcm++) {
2050                struct snd_emu10k1_pcm_mixer *mix;
2051                int v;
2052                
2053                mix = &emu->efx_pcm_mixer[pcm];
2054                mix->epcm = NULL;
2055
2056                mix->send_routing[0][0] = pcm;
2057                mix->send_routing[0][1] = (pcm == 0) ? 1 : 0;
2058                for (v = 0; v < 2; v++)
2059                        mix->send_routing[0][2+v] = 13+v;
2060                if (emu->audigy)
2061                        for (v = 0; v < 4; v++)
2062                                mix->send_routing[0][4+v] = 60+v;
2063                
2064                memset(&mix->send_volume, 0, sizeof(mix->send_volume));
2065                mix->send_volume[0][0]  = 255;
2066                
2067                mix->attn[0] = 0xffff;
2068        }
2069        
2070        if (! emu->card_capabilities->ecard) { /* FIXME: APS has these controls? */
2071                /* sb live! and audigy */
2072                if ((kctl = snd_ctl_new1(&snd_emu10k1_spdif_mask_control, emu)) == NULL)
2073                        return -ENOMEM;
2074                if (!emu->audigy)
2075                        kctl->id.device = emu->pcm_efx->device;
2076                if ((err = snd_ctl_add(card, kctl)))
2077                        return err;
2078                if ((kctl = snd_ctl_new1(&snd_emu10k1_spdif_control, emu)) == NULL)
2079                        return -ENOMEM;
2080                if (!emu->audigy)
2081                        kctl->id.device = emu->pcm_efx->device;
2082                if ((err = snd_ctl_add(card, kctl)))
2083                        return err;
2084        }
2085
2086        if (emu->card_capabilities->emu_model) {
2087                ;  /* Disable the snd_audigy_spdif_shared_spdif */
2088        } else if (emu->audigy) {
2089                if ((kctl = snd_ctl_new1(&snd_audigy_shared_spdif, emu)) == NULL)
2090                        return -ENOMEM;
2091                if ((err = snd_ctl_add(card, kctl)))
2092                        return err;
2093#if 0
2094                if ((kctl = snd_ctl_new1(&snd_audigy_spdif_output_rate, emu)) == NULL)
2095                        return -ENOMEM;
2096                if ((err = snd_ctl_add(card, kctl)))
2097                        return err;
2098#endif
2099        } else if (! emu->card_capabilities->ecard) {
2100                /* sb live! */
2101                if ((kctl = snd_ctl_new1(&snd_emu10k1_shared_spdif, emu)) == NULL)
2102                        return -ENOMEM;
2103                if ((err = snd_ctl_add(card, kctl)))
2104                        return err;
2105        }
2106        if (emu->card_capabilities->ca0151_chip) { /* P16V */
2107                if ((err = snd_p16v_mixer(emu)))
2108                        return err;
2109        }
2110
2111        if (emu->card_capabilities->emu_model == EMU_MODEL_EMU1616) {
2112                /* 1616(m) cardbus */
2113                int i;
2114
2115                for (i = 0; i < ARRAY_SIZE(snd_emu1616_output_enum_ctls); i++) {
2116                        err = snd_ctl_add(card,
2117                                snd_ctl_new1(&snd_emu1616_output_enum_ctls[i],
2118                                             emu));
2119                        if (err < 0)
2120                                return err;
2121                }
2122                for (i = 0; i < ARRAY_SIZE(snd_emu1010_input_enum_ctls); i++) {
2123                        err = snd_ctl_add(card,
2124                                snd_ctl_new1(&snd_emu1010_input_enum_ctls[i],
2125                                             emu));
2126                        if (err < 0)
2127                                return err;
2128                }
2129                for (i = 0; i < ARRAY_SIZE(snd_emu1010_adc_pads) - 2; i++) {
2130                        err = snd_ctl_add(card,
2131                                snd_ctl_new1(&snd_emu1010_adc_pads[i], emu));
2132                        if (err < 0)
2133                                return err;
2134                }
2135                for (i = 0; i < ARRAY_SIZE(snd_emu1010_dac_pads) - 2; i++) {
2136                        err = snd_ctl_add(card,
2137                                snd_ctl_new1(&snd_emu1010_dac_pads[i], emu));
2138                        if (err < 0)
2139                                return err;
2140                }
2141                err = snd_ctl_add(card,
2142                        snd_ctl_new1(&snd_emu1010_internal_clock, emu));
2143                if (err < 0)
2144                        return err;
2145                err = snd_ctl_add(card,
2146                        snd_ctl_new1(&snd_emu1010_optical_out, emu));
2147                if (err < 0)
2148                        return err;
2149                err = snd_ctl_add(card,
2150                        snd_ctl_new1(&snd_emu1010_optical_in, emu));
2151                if (err < 0)
2152                        return err;
2153
2154        } else if (emu->card_capabilities->emu_model) {
2155                /* all other e-mu cards for now */
2156                int i;
2157
2158                for (i = 0; i < ARRAY_SIZE(snd_emu1010_output_enum_ctls); i++) {
2159                        err = snd_ctl_add(card,
2160                                snd_ctl_new1(&snd_emu1010_output_enum_ctls[i],
2161                                             emu));
2162                        if (err < 0)
2163                                return err;
2164                }
2165                for (i = 0; i < ARRAY_SIZE(snd_emu1010_input_enum_ctls); i++) {
2166                        err = snd_ctl_add(card,
2167                                snd_ctl_new1(&snd_emu1010_input_enum_ctls[i],
2168                                             emu));
2169                        if (err < 0)
2170                                return err;
2171                }
2172                for (i = 0; i < ARRAY_SIZE(snd_emu1010_adc_pads); i++) {
2173                        err = snd_ctl_add(card,
2174                                snd_ctl_new1(&snd_emu1010_adc_pads[i], emu));
2175                        if (err < 0)
2176                                return err;
2177                }
2178                for (i = 0; i < ARRAY_SIZE(snd_emu1010_dac_pads); i++) {
2179                        err = snd_ctl_add(card,
2180                                snd_ctl_new1(&snd_emu1010_dac_pads[i], emu));
2181                        if (err < 0)
2182                                return err;
2183                }
2184                err = snd_ctl_add(card,
2185                        snd_ctl_new1(&snd_emu1010_internal_clock, emu));
2186                if (err < 0)
2187                        return err;
2188                err = snd_ctl_add(card,
2189                        snd_ctl_new1(&snd_emu1010_optical_out, emu));
2190                if (err < 0)
2191                        return err;
2192                err = snd_ctl_add(card,
2193                        snd_ctl_new1(&snd_emu1010_optical_in, emu));
2194                if (err < 0)
2195                        return err;
2196        }
2197
2198        if ( emu->card_capabilities->i2c_adc) {
2199                int i;
2200
2201                err = snd_ctl_add(card, snd_ctl_new1(&snd_audigy_i2c_capture_source, emu));
2202                if (err < 0)
2203                        return err;
2204
2205                for (i = 0; i < ARRAY_SIZE(snd_audigy_i2c_volume_ctls); i++) {
2206                        err = snd_ctl_add(card, snd_ctl_new1(&snd_audigy_i2c_volume_ctls[i], emu));
2207                        if (err < 0)
2208                                return err;
2209                }
2210        }
2211                
2212        if (emu->card_capabilities->ac97_chip && emu->audigy) {
2213                err = snd_ctl_add(card, snd_ctl_new1(&snd_audigy_capture_boost,
2214                                                     emu));
2215                if (err < 0)
2216                        return err;
2217        }
2218
2219        return 0;
2220}
2221