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