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 const 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 const 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 const 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 const 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 const 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 const 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 const 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 const 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 const 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 const 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 const 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        change = (tmp != reg);
1123        if (change)
1124                snd_emu10k1_ptr_write(emu, A_SPDIF_SAMPLERATE, 0, tmp);
1125        spin_unlock_irqrestore(&emu->reg_lock, flags);
1126        return change;
1127}
1128
1129static const struct snd_kcontrol_new snd_audigy_spdif_output_rate =
1130{
1131        .access =       SNDRV_CTL_ELEM_ACCESS_READWRITE,
1132        .iface =        SNDRV_CTL_ELEM_IFACE_MIXER,
1133        .name =         "Audigy SPDIF Output Sample Rate",
1134        .count =        1,
1135        .info =         snd_audigy_spdif_output_rate_info,
1136        .get =          snd_audigy_spdif_output_rate_get,
1137        .put =          snd_audigy_spdif_output_rate_put
1138};
1139#endif
1140
1141static int snd_emu10k1_spdif_put(struct snd_kcontrol *kcontrol,
1142                                 struct snd_ctl_elem_value *ucontrol)
1143{
1144        struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1145        unsigned int idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
1146        int change;
1147        unsigned int val;
1148        unsigned long flags;
1149
1150        /* Limit: emu->spdif_bits */
1151        if (idx >= 3)
1152                return -EINVAL;
1153        val = (ucontrol->value.iec958.status[0] << 0) |
1154              (ucontrol->value.iec958.status[1] << 8) |
1155              (ucontrol->value.iec958.status[2] << 16) |
1156              (ucontrol->value.iec958.status[3] << 24);
1157        spin_lock_irqsave(&emu->reg_lock, flags);
1158        change = val != emu->spdif_bits[idx];
1159        if (change) {
1160                snd_emu10k1_ptr_write(emu, SPCS0 + idx, 0, val);
1161                emu->spdif_bits[idx] = val;
1162        }
1163        spin_unlock_irqrestore(&emu->reg_lock, flags);
1164        return change;
1165}
1166
1167static const struct snd_kcontrol_new snd_emu10k1_spdif_mask_control =
1168{
1169        .access =       SNDRV_CTL_ELEM_ACCESS_READ,
1170        .iface =        SNDRV_CTL_ELEM_IFACE_PCM,
1171        .name =         SNDRV_CTL_NAME_IEC958("",PLAYBACK,MASK),
1172        .count =        3,
1173        .info =         snd_emu10k1_spdif_info,
1174        .get =          snd_emu10k1_spdif_get_mask
1175};
1176
1177static const struct snd_kcontrol_new snd_emu10k1_spdif_control =
1178{
1179        .iface =        SNDRV_CTL_ELEM_IFACE_PCM,
1180        .name =         SNDRV_CTL_NAME_IEC958("",PLAYBACK,DEFAULT),
1181        .count =        3,
1182        .info =         snd_emu10k1_spdif_info,
1183        .get =          snd_emu10k1_spdif_get,
1184        .put =          snd_emu10k1_spdif_put
1185};
1186
1187
1188static void update_emu10k1_fxrt(struct snd_emu10k1 *emu, int voice, unsigned char *route)
1189{
1190        if (emu->audigy) {
1191                snd_emu10k1_ptr_write(emu, A_FXRT1, voice,
1192                                      snd_emu10k1_compose_audigy_fxrt1(route));
1193                snd_emu10k1_ptr_write(emu, A_FXRT2, voice,
1194                                      snd_emu10k1_compose_audigy_fxrt2(route));
1195        } else {
1196                snd_emu10k1_ptr_write(emu, FXRT, voice,
1197                                      snd_emu10k1_compose_send_routing(route));
1198        }
1199}
1200
1201static void update_emu10k1_send_volume(struct snd_emu10k1 *emu, int voice, unsigned char *volume)
1202{
1203        snd_emu10k1_ptr_write(emu, PTRX_FXSENDAMOUNT_A, voice, volume[0]);
1204        snd_emu10k1_ptr_write(emu, PTRX_FXSENDAMOUNT_B, voice, volume[1]);
1205        snd_emu10k1_ptr_write(emu, PSST_FXSENDAMOUNT_C, voice, volume[2]);
1206        snd_emu10k1_ptr_write(emu, DSL_FXSENDAMOUNT_D, voice, volume[3]);
1207        if (emu->audigy) {
1208                unsigned int val = ((unsigned int)volume[4] << 24) |
1209                        ((unsigned int)volume[5] << 16) |
1210                        ((unsigned int)volume[6] << 8) |
1211                        (unsigned int)volume[7];
1212                snd_emu10k1_ptr_write(emu, A_SENDAMOUNTS, voice, val);
1213        }
1214}
1215
1216/* PCM stream controls */
1217
1218static int snd_emu10k1_send_routing_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
1219{
1220        struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1221        uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
1222        uinfo->count = emu->audigy ? 3*8 : 3*4;
1223        uinfo->value.integer.min = 0;
1224        uinfo->value.integer.max = emu->audigy ? 0x3f : 0x0f;
1225        return 0;
1226}
1227
1228static int snd_emu10k1_send_routing_get(struct snd_kcontrol *kcontrol,
1229                                        struct snd_ctl_elem_value *ucontrol)
1230{
1231        unsigned long flags;
1232        struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1233        struct snd_emu10k1_pcm_mixer *mix =
1234                &emu->pcm_mixer[snd_ctl_get_ioffidx(kcontrol, &ucontrol->id)];
1235        int voice, idx;
1236        int num_efx = emu->audigy ? 8 : 4;
1237        int mask = emu->audigy ? 0x3f : 0x0f;
1238
1239        spin_lock_irqsave(&emu->reg_lock, flags);
1240        for (voice = 0; voice < 3; voice++)
1241                for (idx = 0; idx < num_efx; idx++)
1242                        ucontrol->value.integer.value[(voice * num_efx) + idx] = 
1243                                mix->send_routing[voice][idx] & mask;
1244        spin_unlock_irqrestore(&emu->reg_lock, flags);
1245        return 0;
1246}
1247
1248static int snd_emu10k1_send_routing_put(struct snd_kcontrol *kcontrol,
1249                                        struct snd_ctl_elem_value *ucontrol)
1250{
1251        unsigned long flags;
1252        struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1253        struct snd_emu10k1_pcm_mixer *mix =
1254                &emu->pcm_mixer[snd_ctl_get_ioffidx(kcontrol, &ucontrol->id)];
1255        int change = 0, voice, idx, val;
1256        int num_efx = emu->audigy ? 8 : 4;
1257        int mask = emu->audigy ? 0x3f : 0x0f;
1258
1259        spin_lock_irqsave(&emu->reg_lock, flags);
1260        for (voice = 0; voice < 3; voice++)
1261                for (idx = 0; idx < num_efx; idx++) {
1262                        val = ucontrol->value.integer.value[(voice * num_efx) + idx] & mask;
1263                        if (mix->send_routing[voice][idx] != val) {
1264                                mix->send_routing[voice][idx] = val;
1265                                change = 1;
1266                        }
1267                }       
1268        if (change && mix->epcm) {
1269                if (mix->epcm->voices[0] && mix->epcm->voices[1]) {
1270                        update_emu10k1_fxrt(emu, mix->epcm->voices[0]->number,
1271                                            &mix->send_routing[1][0]);
1272                        update_emu10k1_fxrt(emu, mix->epcm->voices[1]->number,
1273                                            &mix->send_routing[2][0]);
1274                } else if (mix->epcm->voices[0]) {
1275                        update_emu10k1_fxrt(emu, mix->epcm->voices[0]->number,
1276                                            &mix->send_routing[0][0]);
1277                }
1278        }
1279        spin_unlock_irqrestore(&emu->reg_lock, flags);
1280        return change;
1281}
1282
1283static const struct snd_kcontrol_new snd_emu10k1_send_routing_control =
1284{
1285        .access =       SNDRV_CTL_ELEM_ACCESS_READWRITE | SNDRV_CTL_ELEM_ACCESS_INACTIVE,
1286        .iface =        SNDRV_CTL_ELEM_IFACE_PCM,
1287        .name =         "EMU10K1 PCM Send Routing",
1288        .count =        32,
1289        .info =         snd_emu10k1_send_routing_info,
1290        .get =          snd_emu10k1_send_routing_get,
1291        .put =          snd_emu10k1_send_routing_put
1292};
1293
1294static int snd_emu10k1_send_volume_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
1295{
1296        struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1297        uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
1298        uinfo->count = emu->audigy ? 3*8 : 3*4;
1299        uinfo->value.integer.min = 0;
1300        uinfo->value.integer.max = 255;
1301        return 0;
1302}
1303
1304static int snd_emu10k1_send_volume_get(struct snd_kcontrol *kcontrol,
1305                                       struct snd_ctl_elem_value *ucontrol)
1306{
1307        unsigned long flags;
1308        struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1309        struct snd_emu10k1_pcm_mixer *mix =
1310                &emu->pcm_mixer[snd_ctl_get_ioffidx(kcontrol, &ucontrol->id)];
1311        int idx;
1312        int num_efx = emu->audigy ? 8 : 4;
1313
1314        spin_lock_irqsave(&emu->reg_lock, flags);
1315        for (idx = 0; idx < 3*num_efx; idx++)
1316                ucontrol->value.integer.value[idx] = mix->send_volume[idx/num_efx][idx%num_efx];
1317        spin_unlock_irqrestore(&emu->reg_lock, flags);
1318        return 0;
1319}
1320
1321static int snd_emu10k1_send_volume_put(struct snd_kcontrol *kcontrol,
1322                                       struct snd_ctl_elem_value *ucontrol)
1323{
1324        unsigned long flags;
1325        struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1326        struct snd_emu10k1_pcm_mixer *mix =
1327                &emu->pcm_mixer[snd_ctl_get_ioffidx(kcontrol, &ucontrol->id)];
1328        int change = 0, idx, val;
1329        int num_efx = emu->audigy ? 8 : 4;
1330
1331        spin_lock_irqsave(&emu->reg_lock, flags);
1332        for (idx = 0; idx < 3*num_efx; idx++) {
1333                val = ucontrol->value.integer.value[idx] & 255;
1334                if (mix->send_volume[idx/num_efx][idx%num_efx] != val) {
1335                        mix->send_volume[idx/num_efx][idx%num_efx] = val;
1336                        change = 1;
1337                }
1338        }
1339        if (change && mix->epcm) {
1340                if (mix->epcm->voices[0] && mix->epcm->voices[1]) {
1341                        update_emu10k1_send_volume(emu, mix->epcm->voices[0]->number,
1342                                                   &mix->send_volume[1][0]);
1343                        update_emu10k1_send_volume(emu, mix->epcm->voices[1]->number,
1344                                                   &mix->send_volume[2][0]);
1345                } else if (mix->epcm->voices[0]) {
1346                        update_emu10k1_send_volume(emu, mix->epcm->voices[0]->number,
1347                                                   &mix->send_volume[0][0]);
1348                }
1349        }
1350        spin_unlock_irqrestore(&emu->reg_lock, flags);
1351        return change;
1352}
1353
1354static const struct snd_kcontrol_new snd_emu10k1_send_volume_control =
1355{
1356        .access =       SNDRV_CTL_ELEM_ACCESS_READWRITE | SNDRV_CTL_ELEM_ACCESS_INACTIVE,
1357        .iface =        SNDRV_CTL_ELEM_IFACE_PCM,
1358        .name =         "EMU10K1 PCM Send Volume",
1359        .count =        32,
1360        .info =         snd_emu10k1_send_volume_info,
1361        .get =          snd_emu10k1_send_volume_get,
1362        .put =          snd_emu10k1_send_volume_put
1363};
1364
1365static int snd_emu10k1_attn_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
1366{
1367        uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
1368        uinfo->count = 3;
1369        uinfo->value.integer.min = 0;
1370        uinfo->value.integer.max = 0xffff;
1371        return 0;
1372}
1373
1374static int snd_emu10k1_attn_get(struct snd_kcontrol *kcontrol,
1375                                struct snd_ctl_elem_value *ucontrol)
1376{
1377        struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1378        struct snd_emu10k1_pcm_mixer *mix =
1379                &emu->pcm_mixer[snd_ctl_get_ioffidx(kcontrol, &ucontrol->id)];
1380        unsigned long flags;
1381        int idx;
1382
1383        spin_lock_irqsave(&emu->reg_lock, flags);
1384        for (idx = 0; idx < 3; idx++)
1385                ucontrol->value.integer.value[idx] = mix->attn[idx];
1386        spin_unlock_irqrestore(&emu->reg_lock, flags);
1387        return 0;
1388}
1389
1390static int snd_emu10k1_attn_put(struct snd_kcontrol *kcontrol,
1391                                struct snd_ctl_elem_value *ucontrol)
1392{
1393        unsigned long flags;
1394        struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1395        struct snd_emu10k1_pcm_mixer *mix =
1396                &emu->pcm_mixer[snd_ctl_get_ioffidx(kcontrol, &ucontrol->id)];
1397        int change = 0, idx, val;
1398
1399        spin_lock_irqsave(&emu->reg_lock, flags);
1400        for (idx = 0; idx < 3; idx++) {
1401                val = ucontrol->value.integer.value[idx] & 0xffff;
1402                if (mix->attn[idx] != val) {
1403                        mix->attn[idx] = val;
1404                        change = 1;
1405                }
1406        }
1407        if (change && mix->epcm) {
1408                if (mix->epcm->voices[0] && mix->epcm->voices[1]) {
1409                        snd_emu10k1_ptr_write(emu, VTFT_VOLUMETARGET, mix->epcm->voices[0]->number, mix->attn[1]);
1410                        snd_emu10k1_ptr_write(emu, VTFT_VOLUMETARGET, mix->epcm->voices[1]->number, mix->attn[2]);
1411                } else if (mix->epcm->voices[0]) {
1412                        snd_emu10k1_ptr_write(emu, VTFT_VOLUMETARGET, mix->epcm->voices[0]->number, mix->attn[0]);
1413                }
1414        }
1415        spin_unlock_irqrestore(&emu->reg_lock, flags);
1416        return change;
1417}
1418
1419static const struct snd_kcontrol_new snd_emu10k1_attn_control =
1420{
1421        .access =       SNDRV_CTL_ELEM_ACCESS_READWRITE | SNDRV_CTL_ELEM_ACCESS_INACTIVE,
1422        .iface =        SNDRV_CTL_ELEM_IFACE_PCM,
1423        .name =         "EMU10K1 PCM Volume",
1424        .count =        32,
1425        .info =         snd_emu10k1_attn_info,
1426        .get =          snd_emu10k1_attn_get,
1427        .put =          snd_emu10k1_attn_put
1428};
1429
1430/* Mutichannel PCM stream controls */
1431
1432static int snd_emu10k1_efx_send_routing_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
1433{
1434        struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1435        uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
1436        uinfo->count = emu->audigy ? 8 : 4;
1437        uinfo->value.integer.min = 0;
1438        uinfo->value.integer.max = emu->audigy ? 0x3f : 0x0f;
1439        return 0;
1440}
1441
1442static int snd_emu10k1_efx_send_routing_get(struct snd_kcontrol *kcontrol,
1443                                        struct snd_ctl_elem_value *ucontrol)
1444{
1445        unsigned long flags;
1446        struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1447        struct snd_emu10k1_pcm_mixer *mix =
1448                &emu->efx_pcm_mixer[snd_ctl_get_ioffidx(kcontrol, &ucontrol->id)];
1449        int idx;
1450        int num_efx = emu->audigy ? 8 : 4;
1451        int mask = emu->audigy ? 0x3f : 0x0f;
1452
1453        spin_lock_irqsave(&emu->reg_lock, flags);
1454        for (idx = 0; idx < num_efx; idx++)
1455                ucontrol->value.integer.value[idx] = 
1456                        mix->send_routing[0][idx] & mask;
1457        spin_unlock_irqrestore(&emu->reg_lock, flags);
1458        return 0;
1459}
1460
1461static int snd_emu10k1_efx_send_routing_put(struct snd_kcontrol *kcontrol,
1462                                        struct snd_ctl_elem_value *ucontrol)
1463{
1464        unsigned long flags;
1465        struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1466        int ch = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
1467        struct snd_emu10k1_pcm_mixer *mix = &emu->efx_pcm_mixer[ch];
1468        int change = 0, idx, val;
1469        int num_efx = emu->audigy ? 8 : 4;
1470        int mask = emu->audigy ? 0x3f : 0x0f;
1471
1472        spin_lock_irqsave(&emu->reg_lock, flags);
1473        for (idx = 0; idx < num_efx; idx++) {
1474                val = ucontrol->value.integer.value[idx] & mask;
1475                if (mix->send_routing[0][idx] != val) {
1476                        mix->send_routing[0][idx] = val;
1477                        change = 1;
1478                }
1479        }       
1480
1481        if (change && mix->epcm) {
1482                if (mix->epcm->voices[ch]) {
1483                        update_emu10k1_fxrt(emu, mix->epcm->voices[ch]->number,
1484                                        &mix->send_routing[0][0]);
1485                }
1486        }
1487        spin_unlock_irqrestore(&emu->reg_lock, flags);
1488        return change;
1489}
1490
1491static const struct snd_kcontrol_new snd_emu10k1_efx_send_routing_control =
1492{
1493        .access =       SNDRV_CTL_ELEM_ACCESS_READWRITE | SNDRV_CTL_ELEM_ACCESS_INACTIVE,
1494        .iface =        SNDRV_CTL_ELEM_IFACE_PCM,
1495        .name =         "Multichannel PCM Send Routing",
1496        .count =        16,
1497        .info =         snd_emu10k1_efx_send_routing_info,
1498        .get =          snd_emu10k1_efx_send_routing_get,
1499        .put =          snd_emu10k1_efx_send_routing_put
1500};
1501
1502static int snd_emu10k1_efx_send_volume_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
1503{
1504        struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1505        uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
1506        uinfo->count = emu->audigy ? 8 : 4;
1507        uinfo->value.integer.min = 0;
1508        uinfo->value.integer.max = 255;
1509        return 0;
1510}
1511
1512static int snd_emu10k1_efx_send_volume_get(struct snd_kcontrol *kcontrol,
1513                                       struct snd_ctl_elem_value *ucontrol)
1514{
1515        unsigned long flags;
1516        struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1517        struct snd_emu10k1_pcm_mixer *mix =
1518                &emu->efx_pcm_mixer[snd_ctl_get_ioffidx(kcontrol, &ucontrol->id)];
1519        int idx;
1520        int num_efx = emu->audigy ? 8 : 4;
1521
1522        spin_lock_irqsave(&emu->reg_lock, flags);
1523        for (idx = 0; idx < num_efx; idx++)
1524                ucontrol->value.integer.value[idx] = mix->send_volume[0][idx];
1525        spin_unlock_irqrestore(&emu->reg_lock, flags);
1526        return 0;
1527}
1528
1529static int snd_emu10k1_efx_send_volume_put(struct snd_kcontrol *kcontrol,
1530                                       struct snd_ctl_elem_value *ucontrol)
1531{
1532        unsigned long flags;
1533        struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1534        int ch = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
1535        struct snd_emu10k1_pcm_mixer *mix = &emu->efx_pcm_mixer[ch];
1536        int change = 0, idx, val;
1537        int num_efx = emu->audigy ? 8 : 4;
1538
1539        spin_lock_irqsave(&emu->reg_lock, flags);
1540        for (idx = 0; idx < num_efx; idx++) {
1541                val = ucontrol->value.integer.value[idx] & 255;
1542                if (mix->send_volume[0][idx] != val) {
1543                        mix->send_volume[0][idx] = val;
1544                        change = 1;
1545                }
1546        }
1547        if (change && mix->epcm) {
1548                if (mix->epcm->voices[ch]) {
1549                        update_emu10k1_send_volume(emu, mix->epcm->voices[ch]->number,
1550                                                   &mix->send_volume[0][0]);
1551                }
1552        }
1553        spin_unlock_irqrestore(&emu->reg_lock, flags);
1554        return change;
1555}
1556
1557
1558static const struct snd_kcontrol_new snd_emu10k1_efx_send_volume_control =
1559{
1560        .access =       SNDRV_CTL_ELEM_ACCESS_READWRITE | SNDRV_CTL_ELEM_ACCESS_INACTIVE,
1561        .iface =        SNDRV_CTL_ELEM_IFACE_PCM,
1562        .name =         "Multichannel PCM Send Volume",
1563        .count =        16,
1564        .info =         snd_emu10k1_efx_send_volume_info,
1565        .get =          snd_emu10k1_efx_send_volume_get,
1566        .put =          snd_emu10k1_efx_send_volume_put
1567};
1568
1569static int snd_emu10k1_efx_attn_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
1570{
1571        uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
1572        uinfo->count = 1;
1573        uinfo->value.integer.min = 0;
1574        uinfo->value.integer.max = 0xffff;
1575        return 0;
1576}
1577
1578static int snd_emu10k1_efx_attn_get(struct snd_kcontrol *kcontrol,
1579                                struct snd_ctl_elem_value *ucontrol)
1580{
1581        struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1582        struct snd_emu10k1_pcm_mixer *mix =
1583                &emu->efx_pcm_mixer[snd_ctl_get_ioffidx(kcontrol, &ucontrol->id)];
1584        unsigned long flags;
1585
1586        spin_lock_irqsave(&emu->reg_lock, flags);
1587        ucontrol->value.integer.value[0] = mix->attn[0];
1588        spin_unlock_irqrestore(&emu->reg_lock, flags);
1589        return 0;
1590}
1591
1592static int snd_emu10k1_efx_attn_put(struct snd_kcontrol *kcontrol,
1593                                struct snd_ctl_elem_value *ucontrol)
1594{
1595        unsigned long flags;
1596        struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1597        int ch = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
1598        struct snd_emu10k1_pcm_mixer *mix = &emu->efx_pcm_mixer[ch];
1599        int change = 0, val;
1600
1601        spin_lock_irqsave(&emu->reg_lock, flags);
1602        val = ucontrol->value.integer.value[0] & 0xffff;
1603        if (mix->attn[0] != val) {
1604                mix->attn[0] = val;
1605                change = 1;
1606        }
1607        if (change && mix->epcm) {
1608                if (mix->epcm->voices[ch]) {
1609                        snd_emu10k1_ptr_write(emu, VTFT_VOLUMETARGET, mix->epcm->voices[ch]->number, mix->attn[0]);
1610                }
1611        }
1612        spin_unlock_irqrestore(&emu->reg_lock, flags);
1613        return change;
1614}
1615
1616static const struct snd_kcontrol_new snd_emu10k1_efx_attn_control =
1617{
1618        .access =       SNDRV_CTL_ELEM_ACCESS_READWRITE | SNDRV_CTL_ELEM_ACCESS_INACTIVE,
1619        .iface =        SNDRV_CTL_ELEM_IFACE_PCM,
1620        .name =         "Multichannel PCM Volume",
1621        .count =        16,
1622        .info =         snd_emu10k1_efx_attn_info,
1623        .get =          snd_emu10k1_efx_attn_get,
1624        .put =          snd_emu10k1_efx_attn_put
1625};
1626
1627#define snd_emu10k1_shared_spdif_info   snd_ctl_boolean_mono_info
1628
1629static int snd_emu10k1_shared_spdif_get(struct snd_kcontrol *kcontrol,
1630                                        struct snd_ctl_elem_value *ucontrol)
1631{
1632        struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1633
1634        if (emu->audigy)
1635                ucontrol->value.integer.value[0] = inl(emu->port + A_IOCFG) & A_IOCFG_GPOUT0 ? 1 : 0;
1636        else
1637                ucontrol->value.integer.value[0] = inl(emu->port + HCFG) & HCFG_GPOUT0 ? 1 : 0;
1638        if (emu->card_capabilities->invert_shared_spdif)
1639                ucontrol->value.integer.value[0] =
1640                        !ucontrol->value.integer.value[0];
1641                
1642        return 0;
1643}
1644
1645static int snd_emu10k1_shared_spdif_put(struct snd_kcontrol *kcontrol,
1646                                        struct snd_ctl_elem_value *ucontrol)
1647{
1648        unsigned long flags;
1649        struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1650        unsigned int reg, val, sw;
1651        int change = 0;
1652
1653        sw = ucontrol->value.integer.value[0];
1654        if (emu->card_capabilities->invert_shared_spdif)
1655                sw = !sw;
1656        spin_lock_irqsave(&emu->reg_lock, flags);
1657        if ( emu->card_capabilities->i2c_adc) {
1658                /* Do nothing for Audigy 2 ZS Notebook */
1659        } else if (emu->audigy) {
1660                reg = inl(emu->port + A_IOCFG);
1661                val = sw ? A_IOCFG_GPOUT0 : 0;
1662                change = (reg & A_IOCFG_GPOUT0) != val;
1663                if (change) {
1664                        reg &= ~A_IOCFG_GPOUT0;
1665                        reg |= val;
1666                        outl(reg | val, emu->port + A_IOCFG);
1667                }
1668        }
1669        reg = inl(emu->port + HCFG);
1670        val = sw ? HCFG_GPOUT0 : 0;
1671        change |= (reg & HCFG_GPOUT0) != val;
1672        if (change) {
1673                reg &= ~HCFG_GPOUT0;
1674                reg |= val;
1675                outl(reg | val, emu->port + HCFG);
1676        }
1677        spin_unlock_irqrestore(&emu->reg_lock, flags);
1678        return change;
1679}
1680
1681static const struct snd_kcontrol_new snd_emu10k1_shared_spdif =
1682{
1683        .iface =        SNDRV_CTL_ELEM_IFACE_MIXER,
1684        .name =         "SB Live Analog/Digital Output Jack",
1685        .info =         snd_emu10k1_shared_spdif_info,
1686        .get =          snd_emu10k1_shared_spdif_get,
1687        .put =          snd_emu10k1_shared_spdif_put
1688};
1689
1690static const struct snd_kcontrol_new snd_audigy_shared_spdif =
1691{
1692        .iface =        SNDRV_CTL_ELEM_IFACE_MIXER,
1693        .name =         "Audigy Analog/Digital Output Jack",
1694        .info =         snd_emu10k1_shared_spdif_info,
1695        .get =          snd_emu10k1_shared_spdif_get,
1696        .put =          snd_emu10k1_shared_spdif_put
1697};
1698
1699/* workaround for too low volume on Audigy due to 16bit/24bit conversion */
1700
1701#define snd_audigy_capture_boost_info   snd_ctl_boolean_mono_info
1702
1703static int snd_audigy_capture_boost_get(struct snd_kcontrol *kcontrol,
1704                                        struct snd_ctl_elem_value *ucontrol)
1705{
1706        struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1707        unsigned int val;
1708
1709        /* FIXME: better to use a cached version */
1710        val = snd_ac97_read(emu->ac97, AC97_REC_GAIN);
1711        ucontrol->value.integer.value[0] = !!val;
1712        return 0;
1713}
1714
1715static int snd_audigy_capture_boost_put(struct snd_kcontrol *kcontrol,
1716                                        struct snd_ctl_elem_value *ucontrol)
1717{
1718        struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1719        unsigned int val;
1720
1721        if (ucontrol->value.integer.value[0])
1722                val = 0x0f0f;
1723        else
1724                val = 0;
1725        return snd_ac97_update(emu->ac97, AC97_REC_GAIN, val);
1726}
1727
1728static const struct snd_kcontrol_new snd_audigy_capture_boost =
1729{
1730        .iface =        SNDRV_CTL_ELEM_IFACE_MIXER,
1731        .name =         "Mic Extra Boost",
1732        .info =         snd_audigy_capture_boost_info,
1733        .get =          snd_audigy_capture_boost_get,
1734        .put =          snd_audigy_capture_boost_put
1735};
1736
1737
1738/*
1739 */
1740static void snd_emu10k1_mixer_free_ac97(struct snd_ac97 *ac97)
1741{
1742        struct snd_emu10k1 *emu = ac97->private_data;
1743        emu->ac97 = NULL;
1744}
1745
1746/*
1747 */
1748static int remove_ctl(struct snd_card *card, const char *name)
1749{
1750        struct snd_ctl_elem_id id;
1751        memset(&id, 0, sizeof(id));
1752        strcpy(id.name, name);
1753        id.iface = SNDRV_CTL_ELEM_IFACE_MIXER;
1754        return snd_ctl_remove_id(card, &id);
1755}
1756
1757static struct snd_kcontrol *ctl_find(struct snd_card *card, const char *name)
1758{
1759        struct snd_ctl_elem_id sid;
1760        memset(&sid, 0, sizeof(sid));
1761        strcpy(sid.name, name);
1762        sid.iface = SNDRV_CTL_ELEM_IFACE_MIXER;
1763        return snd_ctl_find_id(card, &sid);
1764}
1765
1766static int rename_ctl(struct snd_card *card, const char *src, const char *dst)
1767{
1768        struct snd_kcontrol *kctl = ctl_find(card, src);
1769        if (kctl) {
1770                strcpy(kctl->id.name, dst);
1771                return 0;
1772        }
1773        return -ENOENT;
1774}
1775
1776int snd_emu10k1_mixer(struct snd_emu10k1 *emu,
1777                      int pcm_device, int multi_device)
1778{
1779        int err, pcm;
1780        struct snd_kcontrol *kctl;
1781        struct snd_card *card = emu->card;
1782        const char * const *c;
1783        static const char * const emu10k1_remove_ctls[] = {
1784                /* no AC97 mono, surround, center/lfe */
1785                "Master Mono Playback Switch",
1786                "Master Mono Playback Volume",
1787                "PCM Out Path & Mute",
1788                "Mono Output Select",
1789                "Surround Playback Switch",
1790                "Surround Playback Volume",
1791                "Center Playback Switch",
1792                "Center Playback Volume",
1793                "LFE Playback Switch",
1794                "LFE Playback Volume",
1795                NULL
1796        };
1797        static const char * const emu10k1_rename_ctls[] = {
1798                "Surround Digital Playback Volume", "Surround Playback Volume",
1799                "Center Digital Playback Volume", "Center Playback Volume",
1800                "LFE Digital Playback Volume", "LFE Playback Volume",
1801                NULL
1802        };
1803        static const char * const audigy_remove_ctls[] = {
1804                /* Master/PCM controls on ac97 of Audigy has no effect */
1805                /* On the Audigy2 the AC97 playback is piped into
1806                 * the Philips ADC for 24bit capture */
1807                "PCM Playback Switch",
1808                "PCM Playback Volume",
1809                "Master Playback Switch",
1810                "Master Playback Volume",
1811                "PCM Out Path & Mute",
1812                "Mono Output Select",
1813                /* remove unused AC97 capture controls */
1814                "Capture Source",
1815                "Capture Switch",
1816                "Capture Volume",
1817                "Mic Select",
1818                "Headphone Playback Switch",
1819                "Headphone Playback Volume",
1820                "3D Control - Center",
1821                "3D Control - Depth",
1822                "3D Control - Switch",
1823                "Video Playback Switch",
1824                "Video Playback Volume",
1825                "Mic Playback Switch",
1826                "Mic Playback Volume",
1827                "External Amplifier",
1828                NULL
1829        };
1830        static const char * const audigy_rename_ctls[] = {
1831                /* use conventional names */
1832                "Wave Playback Volume", "PCM Playback Volume",
1833                /* "Wave Capture Volume", "PCM Capture Volume", */
1834                "Wave Master Playback Volume", "Master Playback Volume",
1835                "AMic Playback Volume", "Mic Playback Volume",
1836                "Master Mono Playback Switch", "Phone Output Playback Switch",
1837                "Master Mono Playback Volume", "Phone Output Playback Volume",
1838                NULL
1839        };
1840        static const char * const audigy_rename_ctls_i2c_adc[] = {
1841                //"Analog Mix Capture Volume","OLD Analog Mix Capture Volume",
1842                "Line Capture Volume", "Analog Mix Capture Volume",
1843                "Wave Playback Volume", "OLD PCM Playback Volume",
1844                "Wave Master Playback Volume", "Master Playback Volume",
1845                "AMic Playback Volume", "Old Mic Playback Volume",
1846                "CD Capture Volume", "IEC958 Optical Capture Volume",
1847                NULL
1848        };
1849        static const char * const audigy_remove_ctls_i2c_adc[] = {
1850                /* On the Audigy2 ZS Notebook
1851                 * Capture via WM8775  */
1852                "Mic Capture Volume",
1853                "Analog Mix Capture Volume",
1854                "Aux Capture Volume",
1855                "IEC958 Optical Capture Volume",
1856                NULL
1857        };
1858        static const char * const audigy_remove_ctls_1361t_adc[] = {
1859                /* On the Audigy2 the AC97 playback is piped into
1860                 * the Philips ADC for 24bit capture */
1861                "PCM Playback Switch",
1862                "PCM Playback Volume",
1863                "Capture Source",
1864                "Capture Switch",
1865                "Capture Volume",
1866                "Mic Capture Volume",
1867                "Headphone Playback Switch",
1868                "Headphone Playback Volume",
1869                "3D Control - Center",
1870                "3D Control - Depth",
1871                "3D Control - Switch",
1872                "Line2 Playback Volume",
1873                "Line2 Capture Volume",
1874                NULL
1875        };
1876        static const char * const audigy_rename_ctls_1361t_adc[] = {
1877                "Master Playback Switch", "Master Capture Switch",
1878                "Master Playback Volume", "Master Capture Volume",
1879                "Wave Master Playback Volume", "Master Playback Volume",
1880                "Beep Playback Switch", "Beep Capture Switch",
1881                "Beep Playback Volume", "Beep Capture Volume",
1882                "Phone Playback Switch", "Phone Capture Switch",
1883                "Phone Playback Volume", "Phone Capture Volume",
1884                "Mic Playback Switch", "Mic Capture Switch",
1885                "Mic Playback Volume", "Mic Capture Volume",
1886                "Line Playback Switch", "Line Capture Switch",
1887                "Line Playback Volume", "Line Capture Volume",
1888                "CD Playback Switch", "CD Capture Switch",
1889                "CD Playback Volume", "CD Capture Volume",
1890                "Aux Playback Switch", "Aux Capture Switch",
1891                "Aux Playback Volume", "Aux Capture Volume",
1892                "Video Playback Switch", "Video Capture Switch",
1893                "Video Playback Volume", "Video Capture Volume",
1894                "Master Mono Playback Switch", "Phone Output Playback Switch",
1895                "Master Mono Playback Volume", "Phone Output Playback Volume",
1896                NULL
1897        };
1898
1899        if (emu->card_capabilities->ac97_chip) {
1900                struct snd_ac97_bus *pbus;
1901                struct snd_ac97_template ac97;
1902                static const struct snd_ac97_bus_ops ops = {
1903                        .write = snd_emu10k1_ac97_write,
1904                        .read = snd_emu10k1_ac97_read,
1905                };
1906
1907                err = snd_ac97_bus(emu->card, 0, &ops, NULL, &pbus);
1908                if (err < 0)
1909                        return err;
1910                pbus->no_vra = 1; /* we don't need VRA */
1911                
1912                memset(&ac97, 0, sizeof(ac97));
1913                ac97.private_data = emu;
1914                ac97.private_free = snd_emu10k1_mixer_free_ac97;
1915                ac97.scaps = AC97_SCAP_NO_SPDIF;
1916                err = snd_ac97_mixer(pbus, &ac97, &emu->ac97);
1917                if (err < 0) {
1918                        if (emu->card_capabilities->ac97_chip == 1)
1919                                return err;
1920                        dev_info(emu->card->dev,
1921                                 "AC97 is optional on this board\n");
1922                        dev_info(emu->card->dev,
1923                                 "Proceeding without ac97 mixers...\n");
1924                        snd_device_free(emu->card, pbus);
1925                        goto no_ac97; /* FIXME: get rid of ugly gotos.. */
1926                }
1927                if (emu->audigy) {
1928                        /* set master volume to 0 dB */
1929                        snd_ac97_write_cache(emu->ac97, AC97_MASTER, 0x0000);
1930                        /* set capture source to mic */
1931                        snd_ac97_write_cache(emu->ac97, AC97_REC_SEL, 0x0000);
1932                        /* set mono output (TAD) to mic */
1933                        snd_ac97_update_bits(emu->ac97, AC97_GENERAL_PURPOSE,
1934                                0x0200, 0x0200);
1935                        if (emu->card_capabilities->adc_1361t)
1936                                c = audigy_remove_ctls_1361t_adc;
1937                        else 
1938                                c = audigy_remove_ctls;
1939                } else {
1940                        /*
1941                         * Credits for cards based on STAC9758:
1942                         *   James Courtier-Dutton <James@superbug.demon.co.uk>
1943                         *   Voluspa <voluspa@comhem.se>
1944                         */
1945                        if (emu->ac97->id == AC97_ID_STAC9758) {
1946                                emu->rear_ac97 = 1;
1947                                snd_emu10k1_ptr_write(emu, AC97SLOT, 0, AC97SLOT_CNTR|AC97SLOT_LFE|AC97SLOT_REAR_LEFT|AC97SLOT_REAR_RIGHT);
1948                                snd_ac97_write_cache(emu->ac97, AC97_HEADPHONE, 0x0202);
1949                                remove_ctl(card,"Front Playback Volume");
1950                                remove_ctl(card,"Front Playback Switch");
1951                        }
1952                        /* remove unused AC97 controls */
1953                        snd_ac97_write_cache(emu->ac97, AC97_SURROUND_MASTER, 0x0202);
1954                        snd_ac97_write_cache(emu->ac97, AC97_CENTER_LFE_MASTER, 0x0202);
1955                        c = emu10k1_remove_ctls;
1956                }
1957                for (; *c; c++)
1958                        remove_ctl(card, *c);
1959        } else if (emu->card_capabilities->i2c_adc) {
1960                c = audigy_remove_ctls_i2c_adc;
1961                for (; *c; c++)
1962                        remove_ctl(card, *c);
1963        } else {
1964        no_ac97:
1965                if (emu->card_capabilities->ecard)
1966                        strcpy(emu->card->mixername, "EMU APS");
1967                else if (emu->audigy)
1968                        strcpy(emu->card->mixername, "SB Audigy");
1969                else
1970                        strcpy(emu->card->mixername, "Emu10k1");
1971        }
1972
1973        if (emu->audigy)
1974                if (emu->card_capabilities->adc_1361t)
1975                        c = audigy_rename_ctls_1361t_adc;
1976                else if (emu->card_capabilities->i2c_adc)
1977                        c = audigy_rename_ctls_i2c_adc;
1978                else
1979                        c = audigy_rename_ctls;
1980        else
1981                c = emu10k1_rename_ctls;
1982        for (; *c; c += 2)
1983                rename_ctl(card, c[0], c[1]);
1984
1985        if (emu->card_capabilities->subsystem == 0x80401102) { /* SB Live! Platinum CT4760P */
1986                remove_ctl(card, "Center Playback Volume");
1987                remove_ctl(card, "LFE Playback Volume");
1988                remove_ctl(card, "Wave Center Playback Volume");
1989                remove_ctl(card, "Wave LFE Playback Volume");
1990        }
1991        if (emu->card_capabilities->subsystem == 0x20071102) {  /* Audigy 4 Pro */
1992                rename_ctl(card, "Line2 Capture Volume", "Line1/Mic Capture Volume");
1993                rename_ctl(card, "Analog Mix Capture Volume", "Line2 Capture Volume");
1994                rename_ctl(card, "Aux2 Capture Volume", "Line3 Capture Volume");
1995                rename_ctl(card, "Mic Capture Volume", "Unknown1 Capture Volume");
1996        }
1997        kctl = emu->ctl_send_routing = snd_ctl_new1(&snd_emu10k1_send_routing_control, emu);
1998        if (!kctl)
1999                return -ENOMEM;
2000        kctl->id.device = pcm_device;
2001        err = snd_ctl_add(card, kctl);
2002        if (err)
2003                return err;
2004        kctl = emu->ctl_send_volume = snd_ctl_new1(&snd_emu10k1_send_volume_control, emu);
2005        if (!kctl)
2006                return -ENOMEM;
2007        kctl->id.device = pcm_device;
2008        err = snd_ctl_add(card, kctl);
2009        if (err)
2010                return err;
2011        kctl = emu->ctl_attn = snd_ctl_new1(&snd_emu10k1_attn_control, emu);
2012        if (!kctl)
2013                return -ENOMEM;
2014        kctl->id.device = pcm_device;
2015        err = snd_ctl_add(card, kctl);
2016        if (err)
2017                return err;
2018
2019        kctl = emu->ctl_efx_send_routing = snd_ctl_new1(&snd_emu10k1_efx_send_routing_control, emu);
2020        if (!kctl)
2021                return -ENOMEM;
2022        kctl->id.device = multi_device;
2023        err = snd_ctl_add(card, kctl);
2024        if (err)
2025                return err;
2026        
2027        kctl = emu->ctl_efx_send_volume = snd_ctl_new1(&snd_emu10k1_efx_send_volume_control, emu);
2028        if (!kctl)
2029                return -ENOMEM;
2030        kctl->id.device = multi_device;
2031        err = snd_ctl_add(card, kctl);
2032        if (err)
2033                return err;
2034        
2035        kctl = emu->ctl_efx_attn = snd_ctl_new1(&snd_emu10k1_efx_attn_control, emu);
2036        if (!kctl)
2037                return -ENOMEM;
2038        kctl->id.device = multi_device;
2039        err = snd_ctl_add(card, kctl);
2040        if (err)
2041                return err;
2042
2043        /* initialize the routing and volume table for each pcm playback stream */
2044        for (pcm = 0; pcm < 32; pcm++) {
2045                struct snd_emu10k1_pcm_mixer *mix;
2046                int v;
2047                
2048                mix = &emu->pcm_mixer[pcm];
2049                mix->epcm = NULL;
2050
2051                for (v = 0; v < 4; v++)
2052                        mix->send_routing[0][v] = 
2053                                mix->send_routing[1][v] = 
2054                                mix->send_routing[2][v] = v;
2055                
2056                memset(&mix->send_volume, 0, sizeof(mix->send_volume));
2057                mix->send_volume[0][0] = mix->send_volume[0][1] =
2058                mix->send_volume[1][0] = mix->send_volume[2][1] = 255;
2059                
2060                mix->attn[0] = mix->attn[1] = mix->attn[2] = 0xffff;
2061        }
2062        
2063        /* initialize the routing and volume table for the multichannel playback stream */
2064        for (pcm = 0; pcm < NUM_EFX_PLAYBACK; pcm++) {
2065                struct snd_emu10k1_pcm_mixer *mix;
2066                int v;
2067                
2068                mix = &emu->efx_pcm_mixer[pcm];
2069                mix->epcm = NULL;
2070
2071                mix->send_routing[0][0] = pcm;
2072                mix->send_routing[0][1] = (pcm == 0) ? 1 : 0;
2073                for (v = 0; v < 2; v++)
2074                        mix->send_routing[0][2+v] = 13+v;
2075                if (emu->audigy)
2076                        for (v = 0; v < 4; v++)
2077                                mix->send_routing[0][4+v] = 60+v;
2078                
2079                memset(&mix->send_volume, 0, sizeof(mix->send_volume));
2080                mix->send_volume[0][0]  = 255;
2081                
2082                mix->attn[0] = 0xffff;
2083        }
2084        
2085        if (! emu->card_capabilities->ecard) { /* FIXME: APS has these controls? */
2086                /* sb live! and audigy */
2087                kctl = snd_ctl_new1(&snd_emu10k1_spdif_mask_control, emu);
2088                if (!kctl)
2089                        return -ENOMEM;
2090                if (!emu->audigy)
2091                        kctl->id.device = emu->pcm_efx->device;
2092                err = snd_ctl_add(card, kctl);
2093                if (err)
2094                        return err;
2095                kctl = snd_ctl_new1(&snd_emu10k1_spdif_control, emu);
2096                if (!kctl)
2097                        return -ENOMEM;
2098                if (!emu->audigy)
2099                        kctl->id.device = emu->pcm_efx->device;
2100                err = snd_ctl_add(card, kctl);
2101                if (err)
2102                        return err;
2103        }
2104
2105        if (emu->card_capabilities->emu_model) {
2106                ;  /* Disable the snd_audigy_spdif_shared_spdif */
2107        } else if (emu->audigy) {
2108                kctl = snd_ctl_new1(&snd_audigy_shared_spdif, emu);
2109                if (!kctl)
2110                        return -ENOMEM;
2111                err = snd_ctl_add(card, kctl);
2112                if (err)
2113                        return err;
2114#if 0
2115                kctl = snd_ctl_new1(&snd_audigy_spdif_output_rate, emu);
2116                if (!kctl)
2117                        return -ENOMEM;
2118                err = snd_ctl_add(card, kctl);
2119                if (err)
2120                        return err;
2121#endif
2122        } else if (! emu->card_capabilities->ecard) {
2123                /* sb live! */
2124                kctl = snd_ctl_new1(&snd_emu10k1_shared_spdif, emu);
2125                if (!kctl)
2126                        return -ENOMEM;
2127                err = snd_ctl_add(card, kctl);
2128                if (err)
2129                        return err;
2130        }
2131        if (emu->card_capabilities->ca0151_chip) { /* P16V */
2132                err = snd_p16v_mixer(emu);
2133                if (err)
2134                        return err;
2135        }
2136
2137        if (emu->card_capabilities->emu_model == EMU_MODEL_EMU1616) {
2138                /* 1616(m) cardbus */
2139                int i;
2140
2141                for (i = 0; i < ARRAY_SIZE(snd_emu1616_output_enum_ctls); i++) {
2142                        err = snd_ctl_add(card,
2143                                snd_ctl_new1(&snd_emu1616_output_enum_ctls[i],
2144                                             emu));
2145                        if (err < 0)
2146                                return err;
2147                }
2148                for (i = 0; i < ARRAY_SIZE(snd_emu1010_input_enum_ctls); i++) {
2149                        err = snd_ctl_add(card,
2150                                snd_ctl_new1(&snd_emu1010_input_enum_ctls[i],
2151                                             emu));
2152                        if (err < 0)
2153                                return err;
2154                }
2155                for (i = 0; i < ARRAY_SIZE(snd_emu1010_adc_pads) - 2; i++) {
2156                        err = snd_ctl_add(card,
2157                                snd_ctl_new1(&snd_emu1010_adc_pads[i], emu));
2158                        if (err < 0)
2159                                return err;
2160                }
2161                for (i = 0; i < ARRAY_SIZE(snd_emu1010_dac_pads) - 2; i++) {
2162                        err = snd_ctl_add(card,
2163                                snd_ctl_new1(&snd_emu1010_dac_pads[i], emu));
2164                        if (err < 0)
2165                                return err;
2166                }
2167                err = snd_ctl_add(card,
2168                        snd_ctl_new1(&snd_emu1010_internal_clock, emu));
2169                if (err < 0)
2170                        return err;
2171                err = snd_ctl_add(card,
2172                        snd_ctl_new1(&snd_emu1010_optical_out, emu));
2173                if (err < 0)
2174                        return err;
2175                err = snd_ctl_add(card,
2176                        snd_ctl_new1(&snd_emu1010_optical_in, emu));
2177                if (err < 0)
2178                        return err;
2179
2180        } else if (emu->card_capabilities->emu_model) {
2181                /* all other e-mu cards for now */
2182                int i;
2183
2184                for (i = 0; i < ARRAY_SIZE(snd_emu1010_output_enum_ctls); i++) {
2185                        err = snd_ctl_add(card,
2186                                snd_ctl_new1(&snd_emu1010_output_enum_ctls[i],
2187                                             emu));
2188                        if (err < 0)
2189                                return err;
2190                }
2191                for (i = 0; i < ARRAY_SIZE(snd_emu1010_input_enum_ctls); i++) {
2192                        err = snd_ctl_add(card,
2193                                snd_ctl_new1(&snd_emu1010_input_enum_ctls[i],
2194                                             emu));
2195                        if (err < 0)
2196                                return err;
2197                }
2198                for (i = 0; i < ARRAY_SIZE(snd_emu1010_adc_pads); i++) {
2199                        err = snd_ctl_add(card,
2200                                snd_ctl_new1(&snd_emu1010_adc_pads[i], emu));
2201                        if (err < 0)
2202                                return err;
2203                }
2204                for (i = 0; i < ARRAY_SIZE(snd_emu1010_dac_pads); i++) {
2205                        err = snd_ctl_add(card,
2206                                snd_ctl_new1(&snd_emu1010_dac_pads[i], emu));
2207                        if (err < 0)
2208                                return err;
2209                }
2210                err = snd_ctl_add(card,
2211                        snd_ctl_new1(&snd_emu1010_internal_clock, emu));
2212                if (err < 0)
2213                        return err;
2214                err = snd_ctl_add(card,
2215                        snd_ctl_new1(&snd_emu1010_optical_out, emu));
2216                if (err < 0)
2217                        return err;
2218                err = snd_ctl_add(card,
2219                        snd_ctl_new1(&snd_emu1010_optical_in, emu));
2220                if (err < 0)
2221                        return err;
2222        }
2223
2224        if ( emu->card_capabilities->i2c_adc) {
2225                int i;
2226
2227                err = snd_ctl_add(card, snd_ctl_new1(&snd_audigy_i2c_capture_source, emu));
2228                if (err < 0)
2229                        return err;
2230
2231                for (i = 0; i < ARRAY_SIZE(snd_audigy_i2c_volume_ctls); i++) {
2232                        err = snd_ctl_add(card, snd_ctl_new1(&snd_audigy_i2c_volume_ctls[i], emu));
2233                        if (err < 0)
2234                                return err;
2235                }
2236        }
2237                
2238        if (emu->card_capabilities->ac97_chip && emu->audigy) {
2239                err = snd_ctl_add(card, snd_ctl_new1(&snd_audigy_capture_boost,
2240                                                     emu));
2241                if (err < 0)
2242                        return err;
2243        }
2244
2245        return 0;
2246}
2247