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_audigy_i2c_capture_source_info(struct snd_kcontrol *kcontrol,
 810                                          struct snd_ctl_elem_info *uinfo)
 811{
 812#if 0
 813        static const char * const texts[4] = {
 814                "Unknown1", "Unknown2", "Mic", "Line"
 815        };
 816#endif
 817        static const char * const texts[2] = {
 818                "Mic", "Line"
 819        };
 820
 821        return snd_ctl_enum_info(uinfo, 1, 2, texts);
 822}
 823
 824static int snd_audigy_i2c_capture_source_get(struct snd_kcontrol *kcontrol,
 825                                        struct snd_ctl_elem_value *ucontrol)
 826{
 827        struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
 828
 829        ucontrol->value.enumerated.item[0] = emu->i2c_capture_source;
 830        return 0;
 831}
 832
 833static int snd_audigy_i2c_capture_source_put(struct snd_kcontrol *kcontrol,
 834                                        struct snd_ctl_elem_value *ucontrol)
 835{
 836        struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
 837        unsigned int source_id;
 838        unsigned int ngain, ogain;
 839        u32 gpio;
 840        int change = 0;
 841        unsigned long flags;
 842        u32 source;
 843        /* If the capture source has changed,
 844         * update the capture volume from the cached value
 845         * for the particular source.
 846         */
 847        source_id = ucontrol->value.enumerated.item[0];
 848        /* Limit: uinfo->value.enumerated.items = 2; */
 849        /*        emu->i2c_capture_volume */
 850        if (source_id >= 2)
 851                return -EINVAL;
 852        change = (emu->i2c_capture_source != source_id);
 853        if (change) {
 854                snd_emu10k1_i2c_write(emu, ADC_MUX, 0); /* Mute input */
 855                spin_lock_irqsave(&emu->emu_lock, flags);
 856                gpio = inl(emu->port + A_IOCFG);
 857                if (source_id==0)
 858                        outl(gpio | 0x4, emu->port + A_IOCFG);
 859                else
 860                        outl(gpio & ~0x4, emu->port + A_IOCFG);
 861                spin_unlock_irqrestore(&emu->emu_lock, flags);
 862
 863                ngain = emu->i2c_capture_volume[source_id][0]; /* Left */
 864                ogain = emu->i2c_capture_volume[emu->i2c_capture_source][0]; /* Left */
 865                if (ngain != ogain)
 866                        snd_emu10k1_i2c_write(emu, ADC_ATTEN_ADCL, ((ngain) & 0xff));
 867                ngain = emu->i2c_capture_volume[source_id][1]; /* Right */
 868                ogain = emu->i2c_capture_volume[emu->i2c_capture_source][1]; /* Right */
 869                if (ngain != ogain)
 870                        snd_emu10k1_i2c_write(emu, ADC_ATTEN_ADCR, ((ngain) & 0xff));
 871
 872                source = 1 << (source_id + 2);
 873                snd_emu10k1_i2c_write(emu, ADC_MUX, source); /* Set source */
 874                emu->i2c_capture_source = source_id;
 875        }
 876        return change;
 877}
 878
 879static struct snd_kcontrol_new snd_audigy_i2c_capture_source =
 880{
 881                .iface =        SNDRV_CTL_ELEM_IFACE_MIXER,
 882                .name =         "Capture Source",
 883                .info =         snd_audigy_i2c_capture_source_info,
 884                .get =          snd_audigy_i2c_capture_source_get,
 885                .put =          snd_audigy_i2c_capture_source_put
 886};
 887
 888static int snd_audigy_i2c_volume_info(struct snd_kcontrol *kcontrol,
 889                                  struct snd_ctl_elem_info *uinfo)
 890{
 891        uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
 892        uinfo->count = 2;
 893        uinfo->value.integer.min = 0;
 894        uinfo->value.integer.max = 255;
 895        return 0;
 896}
 897
 898static int snd_audigy_i2c_volume_get(struct snd_kcontrol *kcontrol,
 899                                 struct snd_ctl_elem_value *ucontrol)
 900{
 901        struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
 902        unsigned int source_id;
 903
 904        source_id = kcontrol->private_value;
 905        /* Limit: emu->i2c_capture_volume */
 906        /*        capture_source: uinfo->value.enumerated.items = 2 */
 907        if (source_id >= 2)
 908                return -EINVAL;
 909
 910        ucontrol->value.integer.value[0] = emu->i2c_capture_volume[source_id][0];
 911        ucontrol->value.integer.value[1] = emu->i2c_capture_volume[source_id][1];
 912        return 0;
 913}
 914
 915static int snd_audigy_i2c_volume_put(struct snd_kcontrol *kcontrol,
 916                                 struct snd_ctl_elem_value *ucontrol)
 917{
 918        struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
 919        unsigned int ogain;
 920        unsigned int ngain;
 921        unsigned int source_id;
 922        int change = 0;
 923
 924        source_id = kcontrol->private_value;
 925        /* Limit: emu->i2c_capture_volume */
 926        /*        capture_source: uinfo->value.enumerated.items = 2 */
 927        if (source_id >= 2)
 928                return -EINVAL;
 929        ogain = emu->i2c_capture_volume[source_id][0]; /* Left */
 930        ngain = ucontrol->value.integer.value[0];
 931        if (ngain > 0xff)
 932                return 0;
 933        if (ogain != ngain) {
 934                if (emu->i2c_capture_source == source_id)
 935                        snd_emu10k1_i2c_write(emu, ADC_ATTEN_ADCL, ((ngain) & 0xff) );
 936                emu->i2c_capture_volume[source_id][0] = ngain;
 937                change = 1;
 938        }
 939        ogain = emu->i2c_capture_volume[source_id][1]; /* Right */
 940        ngain = ucontrol->value.integer.value[1];
 941        if (ngain > 0xff)
 942                return 0;
 943        if (ogain != ngain) {
 944                if (emu->i2c_capture_source == source_id)
 945                        snd_emu10k1_i2c_write(emu, ADC_ATTEN_ADCR, ((ngain) & 0xff));
 946                emu->i2c_capture_volume[source_id][1] = ngain;
 947                change = 1;
 948        }
 949
 950        return change;
 951}
 952
 953#define I2C_VOLUME(xname,chid) \
 954{                                                               \
 955        .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname,     \
 956        .access = SNDRV_CTL_ELEM_ACCESS_READWRITE |             \
 957                  SNDRV_CTL_ELEM_ACCESS_TLV_READ,               \
 958        .info =  snd_audigy_i2c_volume_info,                    \
 959        .get =   snd_audigy_i2c_volume_get,                     \
 960        .put =   snd_audigy_i2c_volume_put,                     \
 961        .tlv = { .p = snd_audigy_db_scale2 },                   \
 962        .private_value = chid                                   \
 963}
 964
 965
 966static struct snd_kcontrol_new snd_audigy_i2c_volume_ctls[] = {
 967        I2C_VOLUME("Mic Capture Volume", 0),
 968        I2C_VOLUME("Line Capture Volume", 0)
 969};
 970
 971#if 0
 972static int snd_audigy_spdif_output_rate_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
 973{
 974        static const char * const texts[] = {"44100", "48000", "96000"};
 975
 976        return snd_ctl_enum_info(uinfo, 1, 3, texts);
 977}
 978
 979static int snd_audigy_spdif_output_rate_get(struct snd_kcontrol *kcontrol,
 980                                 struct snd_ctl_elem_value *ucontrol)
 981{
 982        struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
 983        unsigned int tmp;
 984        unsigned long flags;
 985        
 986
 987        spin_lock_irqsave(&emu->reg_lock, flags);
 988        tmp = snd_emu10k1_ptr_read(emu, A_SPDIF_SAMPLERATE, 0);
 989        switch (tmp & A_SPDIF_RATE_MASK) {
 990        case A_SPDIF_44100:
 991                ucontrol->value.enumerated.item[0] = 0;
 992                break;
 993        case A_SPDIF_48000:
 994                ucontrol->value.enumerated.item[0] = 1;
 995                break;
 996        case A_SPDIF_96000:
 997                ucontrol->value.enumerated.item[0] = 2;
 998                break;
 999        default:
1000                ucontrol->value.enumerated.item[0] = 1;
1001        }
1002        spin_unlock_irqrestore(&emu->reg_lock, flags);
1003        return 0;
1004}
1005
1006static int snd_audigy_spdif_output_rate_put(struct snd_kcontrol *kcontrol,
1007                                 struct snd_ctl_elem_value *ucontrol)
1008{
1009        struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1010        int change;
1011        unsigned int reg, val, tmp;
1012        unsigned long flags;
1013
1014        switch(ucontrol->value.enumerated.item[0]) {
1015        case 0:
1016                val = A_SPDIF_44100;
1017                break;
1018        case 1:
1019                val = A_SPDIF_48000;
1020                break;
1021        case 2:
1022                val = A_SPDIF_96000;
1023                break;
1024        default:
1025                val = A_SPDIF_48000;
1026                break;
1027        }
1028
1029        
1030        spin_lock_irqsave(&emu->reg_lock, flags);
1031        reg = snd_emu10k1_ptr_read(emu, A_SPDIF_SAMPLERATE, 0);
1032        tmp = reg & ~A_SPDIF_RATE_MASK;
1033        tmp |= val;
1034        if ((change = (tmp != reg)))
1035                snd_emu10k1_ptr_write(emu, A_SPDIF_SAMPLERATE, 0, tmp);
1036        spin_unlock_irqrestore(&emu->reg_lock, flags);
1037        return change;
1038}
1039
1040static struct snd_kcontrol_new snd_audigy_spdif_output_rate =
1041{
1042        .access =       SNDRV_CTL_ELEM_ACCESS_READWRITE,
1043        .iface =        SNDRV_CTL_ELEM_IFACE_MIXER,
1044        .name =         "Audigy SPDIF Output Sample Rate",
1045        .count =        1,
1046        .info =         snd_audigy_spdif_output_rate_info,
1047        .get =          snd_audigy_spdif_output_rate_get,
1048        .put =          snd_audigy_spdif_output_rate_put
1049};
1050#endif
1051
1052static int snd_emu10k1_spdif_put(struct snd_kcontrol *kcontrol,
1053                                 struct snd_ctl_elem_value *ucontrol)
1054{
1055        struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1056        unsigned int idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
1057        int change;
1058        unsigned int val;
1059        unsigned long flags;
1060
1061        /* Limit: emu->spdif_bits */
1062        if (idx >= 3)
1063                return -EINVAL;
1064        val = (ucontrol->value.iec958.status[0] << 0) |
1065              (ucontrol->value.iec958.status[1] << 8) |
1066              (ucontrol->value.iec958.status[2] << 16) |
1067              (ucontrol->value.iec958.status[3] << 24);
1068        spin_lock_irqsave(&emu->reg_lock, flags);
1069        change = val != emu->spdif_bits[idx];
1070        if (change) {
1071                snd_emu10k1_ptr_write(emu, SPCS0 + idx, 0, val);
1072                emu->spdif_bits[idx] = val;
1073        }
1074        spin_unlock_irqrestore(&emu->reg_lock, flags);
1075        return change;
1076}
1077
1078static struct snd_kcontrol_new snd_emu10k1_spdif_mask_control =
1079{
1080        .access =       SNDRV_CTL_ELEM_ACCESS_READ,
1081        .iface =        SNDRV_CTL_ELEM_IFACE_PCM,
1082        .name =         SNDRV_CTL_NAME_IEC958("",PLAYBACK,MASK),
1083        .count =        3,
1084        .info =         snd_emu10k1_spdif_info,
1085        .get =          snd_emu10k1_spdif_get_mask
1086};
1087
1088static struct snd_kcontrol_new snd_emu10k1_spdif_control =
1089{
1090        .iface =        SNDRV_CTL_ELEM_IFACE_PCM,
1091        .name =         SNDRV_CTL_NAME_IEC958("",PLAYBACK,DEFAULT),
1092        .count =        3,
1093        .info =         snd_emu10k1_spdif_info,
1094        .get =          snd_emu10k1_spdif_get,
1095        .put =          snd_emu10k1_spdif_put
1096};
1097
1098
1099static void update_emu10k1_fxrt(struct snd_emu10k1 *emu, int voice, unsigned char *route)
1100{
1101        if (emu->audigy) {
1102                snd_emu10k1_ptr_write(emu, A_FXRT1, voice,
1103                                      snd_emu10k1_compose_audigy_fxrt1(route));
1104                snd_emu10k1_ptr_write(emu, A_FXRT2, voice,
1105                                      snd_emu10k1_compose_audigy_fxrt2(route));
1106        } else {
1107                snd_emu10k1_ptr_write(emu, FXRT, voice,
1108                                      snd_emu10k1_compose_send_routing(route));
1109        }
1110}
1111
1112static void update_emu10k1_send_volume(struct snd_emu10k1 *emu, int voice, unsigned char *volume)
1113{
1114        snd_emu10k1_ptr_write(emu, PTRX_FXSENDAMOUNT_A, voice, volume[0]);
1115        snd_emu10k1_ptr_write(emu, PTRX_FXSENDAMOUNT_B, voice, volume[1]);
1116        snd_emu10k1_ptr_write(emu, PSST_FXSENDAMOUNT_C, voice, volume[2]);
1117        snd_emu10k1_ptr_write(emu, DSL_FXSENDAMOUNT_D, voice, volume[3]);
1118        if (emu->audigy) {
1119                unsigned int val = ((unsigned int)volume[4] << 24) |
1120                        ((unsigned int)volume[5] << 16) |
1121                        ((unsigned int)volume[6] << 8) |
1122                        (unsigned int)volume[7];
1123                snd_emu10k1_ptr_write(emu, A_SENDAMOUNTS, voice, val);
1124        }
1125}
1126
1127/* PCM stream controls */
1128
1129static int snd_emu10k1_send_routing_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
1130{
1131        struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1132        uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
1133        uinfo->count = emu->audigy ? 3*8 : 3*4;
1134        uinfo->value.integer.min = 0;
1135        uinfo->value.integer.max = emu->audigy ? 0x3f : 0x0f;
1136        return 0;
1137}
1138
1139static int snd_emu10k1_send_routing_get(struct snd_kcontrol *kcontrol,
1140                                        struct snd_ctl_elem_value *ucontrol)
1141{
1142        unsigned long flags;
1143        struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1144        struct snd_emu10k1_pcm_mixer *mix =
1145                &emu->pcm_mixer[snd_ctl_get_ioffidx(kcontrol, &ucontrol->id)];
1146        int voice, idx;
1147        int num_efx = emu->audigy ? 8 : 4;
1148        int mask = emu->audigy ? 0x3f : 0x0f;
1149
1150        spin_lock_irqsave(&emu->reg_lock, flags);
1151        for (voice = 0; voice < 3; voice++)
1152                for (idx = 0; idx < num_efx; idx++)
1153                        ucontrol->value.integer.value[(voice * num_efx) + idx] = 
1154                                mix->send_routing[voice][idx] & mask;
1155        spin_unlock_irqrestore(&emu->reg_lock, flags);
1156        return 0;
1157}
1158
1159static int snd_emu10k1_send_routing_put(struct snd_kcontrol *kcontrol,
1160                                        struct snd_ctl_elem_value *ucontrol)
1161{
1162        unsigned long flags;
1163        struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1164        struct snd_emu10k1_pcm_mixer *mix =
1165                &emu->pcm_mixer[snd_ctl_get_ioffidx(kcontrol, &ucontrol->id)];
1166        int change = 0, voice, idx, val;
1167        int num_efx = emu->audigy ? 8 : 4;
1168        int mask = emu->audigy ? 0x3f : 0x0f;
1169
1170        spin_lock_irqsave(&emu->reg_lock, flags);
1171        for (voice = 0; voice < 3; voice++)
1172                for (idx = 0; idx < num_efx; idx++) {
1173                        val = ucontrol->value.integer.value[(voice * num_efx) + idx] & mask;
1174                        if (mix->send_routing[voice][idx] != val) {
1175                                mix->send_routing[voice][idx] = val;
1176                                change = 1;
1177                        }
1178                }       
1179        if (change && mix->epcm) {
1180                if (mix->epcm->voices[0] && mix->epcm->voices[1]) {
1181                        update_emu10k1_fxrt(emu, mix->epcm->voices[0]->number,
1182                                            &mix->send_routing[1][0]);
1183                        update_emu10k1_fxrt(emu, mix->epcm->voices[1]->number,
1184                                            &mix->send_routing[2][0]);
1185                } else if (mix->epcm->voices[0]) {
1186                        update_emu10k1_fxrt(emu, mix->epcm->voices[0]->number,
1187                                            &mix->send_routing[0][0]);
1188                }
1189        }
1190        spin_unlock_irqrestore(&emu->reg_lock, flags);
1191        return change;
1192}
1193
1194static struct snd_kcontrol_new snd_emu10k1_send_routing_control =
1195{
1196        .access =       SNDRV_CTL_ELEM_ACCESS_READWRITE | SNDRV_CTL_ELEM_ACCESS_INACTIVE,
1197        .iface =        SNDRV_CTL_ELEM_IFACE_PCM,
1198        .name =         "EMU10K1 PCM Send Routing",
1199        .count =        32,
1200        .info =         snd_emu10k1_send_routing_info,
1201        .get =          snd_emu10k1_send_routing_get,
1202        .put =          snd_emu10k1_send_routing_put
1203};
1204
1205static int snd_emu10k1_send_volume_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
1206{
1207        struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1208        uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
1209        uinfo->count = emu->audigy ? 3*8 : 3*4;
1210        uinfo->value.integer.min = 0;
1211        uinfo->value.integer.max = 255;
1212        return 0;
1213}
1214
1215static int snd_emu10k1_send_volume_get(struct snd_kcontrol *kcontrol,
1216                                       struct snd_ctl_elem_value *ucontrol)
1217{
1218        unsigned long flags;
1219        struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1220        struct snd_emu10k1_pcm_mixer *mix =
1221                &emu->pcm_mixer[snd_ctl_get_ioffidx(kcontrol, &ucontrol->id)];
1222        int idx;
1223        int num_efx = emu->audigy ? 8 : 4;
1224
1225        spin_lock_irqsave(&emu->reg_lock, flags);
1226        for (idx = 0; idx < 3*num_efx; idx++)
1227                ucontrol->value.integer.value[idx] = mix->send_volume[idx/num_efx][idx%num_efx];
1228        spin_unlock_irqrestore(&emu->reg_lock, flags);
1229        return 0;
1230}
1231
1232static int snd_emu10k1_send_volume_put(struct snd_kcontrol *kcontrol,
1233                                       struct snd_ctl_elem_value *ucontrol)
1234{
1235        unsigned long flags;
1236        struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1237        struct snd_emu10k1_pcm_mixer *mix =
1238                &emu->pcm_mixer[snd_ctl_get_ioffidx(kcontrol, &ucontrol->id)];
1239        int change = 0, idx, val;
1240        int num_efx = emu->audigy ? 8 : 4;
1241
1242        spin_lock_irqsave(&emu->reg_lock, flags);
1243        for (idx = 0; idx < 3*num_efx; idx++) {
1244                val = ucontrol->value.integer.value[idx] & 255;
1245                if (mix->send_volume[idx/num_efx][idx%num_efx] != val) {
1246                        mix->send_volume[idx/num_efx][idx%num_efx] = val;
1247                        change = 1;
1248                }
1249        }
1250        if (change && mix->epcm) {
1251                if (mix->epcm->voices[0] && mix->epcm->voices[1]) {
1252                        update_emu10k1_send_volume(emu, mix->epcm->voices[0]->number,
1253                                                   &mix->send_volume[1][0]);
1254                        update_emu10k1_send_volume(emu, mix->epcm->voices[1]->number,
1255                                                   &mix->send_volume[2][0]);
1256                } else if (mix->epcm->voices[0]) {
1257                        update_emu10k1_send_volume(emu, mix->epcm->voices[0]->number,
1258                                                   &mix->send_volume[0][0]);
1259                }
1260        }
1261        spin_unlock_irqrestore(&emu->reg_lock, flags);
1262        return change;
1263}
1264
1265static struct snd_kcontrol_new snd_emu10k1_send_volume_control =
1266{
1267        .access =       SNDRV_CTL_ELEM_ACCESS_READWRITE | SNDRV_CTL_ELEM_ACCESS_INACTIVE,
1268        .iface =        SNDRV_CTL_ELEM_IFACE_PCM,
1269        .name =         "EMU10K1 PCM Send Volume",
1270        .count =        32,
1271        .info =         snd_emu10k1_send_volume_info,
1272        .get =          snd_emu10k1_send_volume_get,
1273        .put =          snd_emu10k1_send_volume_put
1274};
1275
1276static int snd_emu10k1_attn_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
1277{
1278        uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
1279        uinfo->count = 3;
1280        uinfo->value.integer.min = 0;
1281        uinfo->value.integer.max = 0xffff;
1282        return 0;
1283}
1284
1285static int snd_emu10k1_attn_get(struct snd_kcontrol *kcontrol,
1286                                struct snd_ctl_elem_value *ucontrol)
1287{
1288        struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1289        struct snd_emu10k1_pcm_mixer *mix =
1290                &emu->pcm_mixer[snd_ctl_get_ioffidx(kcontrol, &ucontrol->id)];
1291        unsigned long flags;
1292        int idx;
1293
1294        spin_lock_irqsave(&emu->reg_lock, flags);
1295        for (idx = 0; idx < 3; idx++)
1296                ucontrol->value.integer.value[idx] = mix->attn[idx];
1297        spin_unlock_irqrestore(&emu->reg_lock, flags);
1298        return 0;
1299}
1300
1301static int snd_emu10k1_attn_put(struct snd_kcontrol *kcontrol,
1302                                struct snd_ctl_elem_value *ucontrol)
1303{
1304        unsigned long flags;
1305        struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1306        struct snd_emu10k1_pcm_mixer *mix =
1307                &emu->pcm_mixer[snd_ctl_get_ioffidx(kcontrol, &ucontrol->id)];
1308        int change = 0, idx, val;
1309
1310        spin_lock_irqsave(&emu->reg_lock, flags);
1311        for (idx = 0; idx < 3; idx++) {
1312                val = ucontrol->value.integer.value[idx] & 0xffff;
1313                if (mix->attn[idx] != val) {
1314                        mix->attn[idx] = val;
1315                        change = 1;
1316                }
1317        }
1318        if (change && mix->epcm) {
1319                if (mix->epcm->voices[0] && mix->epcm->voices[1]) {
1320                        snd_emu10k1_ptr_write(emu, VTFT_VOLUMETARGET, mix->epcm->voices[0]->number, mix->attn[1]);
1321                        snd_emu10k1_ptr_write(emu, VTFT_VOLUMETARGET, mix->epcm->voices[1]->number, mix->attn[2]);
1322                } else if (mix->epcm->voices[0]) {
1323                        snd_emu10k1_ptr_write(emu, VTFT_VOLUMETARGET, mix->epcm->voices[0]->number, mix->attn[0]);
1324                }
1325        }
1326        spin_unlock_irqrestore(&emu->reg_lock, flags);
1327        return change;
1328}
1329
1330static struct snd_kcontrol_new snd_emu10k1_attn_control =
1331{
1332        .access =       SNDRV_CTL_ELEM_ACCESS_READWRITE | SNDRV_CTL_ELEM_ACCESS_INACTIVE,
1333        .iface =        SNDRV_CTL_ELEM_IFACE_PCM,
1334        .name =         "EMU10K1 PCM Volume",
1335        .count =        32,
1336        .info =         snd_emu10k1_attn_info,
1337        .get =          snd_emu10k1_attn_get,
1338        .put =          snd_emu10k1_attn_put
1339};
1340
1341/* Mutichannel PCM stream controls */
1342
1343static int snd_emu10k1_efx_send_routing_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
1344{
1345        struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1346        uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
1347        uinfo->count = emu->audigy ? 8 : 4;
1348        uinfo->value.integer.min = 0;
1349        uinfo->value.integer.max = emu->audigy ? 0x3f : 0x0f;
1350        return 0;
1351}
1352
1353static int snd_emu10k1_efx_send_routing_get(struct snd_kcontrol *kcontrol,
1354                                        struct snd_ctl_elem_value *ucontrol)
1355{
1356        unsigned long flags;
1357        struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1358        struct snd_emu10k1_pcm_mixer *mix =
1359                &emu->efx_pcm_mixer[snd_ctl_get_ioffidx(kcontrol, &ucontrol->id)];
1360        int idx;
1361        int num_efx = emu->audigy ? 8 : 4;
1362        int mask = emu->audigy ? 0x3f : 0x0f;
1363
1364        spin_lock_irqsave(&emu->reg_lock, flags);
1365        for (idx = 0; idx < num_efx; idx++)
1366                ucontrol->value.integer.value[idx] = 
1367                        mix->send_routing[0][idx] & mask;
1368        spin_unlock_irqrestore(&emu->reg_lock, flags);
1369        return 0;
1370}
1371
1372static int snd_emu10k1_efx_send_routing_put(struct snd_kcontrol *kcontrol,
1373                                        struct snd_ctl_elem_value *ucontrol)
1374{
1375        unsigned long flags;
1376        struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1377        int ch = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
1378        struct snd_emu10k1_pcm_mixer *mix = &emu->efx_pcm_mixer[ch];
1379        int change = 0, idx, val;
1380        int num_efx = emu->audigy ? 8 : 4;
1381        int mask = emu->audigy ? 0x3f : 0x0f;
1382
1383        spin_lock_irqsave(&emu->reg_lock, flags);
1384        for (idx = 0; idx < num_efx; idx++) {
1385                val = ucontrol->value.integer.value[idx] & mask;
1386                if (mix->send_routing[0][idx] != val) {
1387                        mix->send_routing[0][idx] = val;
1388                        change = 1;
1389                }
1390        }       
1391
1392        if (change && mix->epcm) {
1393                if (mix->epcm->voices[ch]) {
1394                        update_emu10k1_fxrt(emu, mix->epcm->voices[ch]->number,
1395                                        &mix->send_routing[0][0]);
1396                }
1397        }
1398        spin_unlock_irqrestore(&emu->reg_lock, flags);
1399        return change;
1400}
1401
1402static struct snd_kcontrol_new snd_emu10k1_efx_send_routing_control =
1403{
1404        .access =       SNDRV_CTL_ELEM_ACCESS_READWRITE | SNDRV_CTL_ELEM_ACCESS_INACTIVE,
1405        .iface =        SNDRV_CTL_ELEM_IFACE_PCM,
1406        .name =         "Multichannel PCM Send Routing",
1407        .count =        16,
1408        .info =         snd_emu10k1_efx_send_routing_info,
1409        .get =          snd_emu10k1_efx_send_routing_get,
1410        .put =          snd_emu10k1_efx_send_routing_put
1411};
1412
1413static int snd_emu10k1_efx_send_volume_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
1414{
1415        struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1416        uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
1417        uinfo->count = emu->audigy ? 8 : 4;
1418        uinfo->value.integer.min = 0;
1419        uinfo->value.integer.max = 255;
1420        return 0;
1421}
1422
1423static int snd_emu10k1_efx_send_volume_get(struct snd_kcontrol *kcontrol,
1424                                       struct snd_ctl_elem_value *ucontrol)
1425{
1426        unsigned long flags;
1427        struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1428        struct snd_emu10k1_pcm_mixer *mix =
1429                &emu->efx_pcm_mixer[snd_ctl_get_ioffidx(kcontrol, &ucontrol->id)];
1430        int idx;
1431        int num_efx = emu->audigy ? 8 : 4;
1432
1433        spin_lock_irqsave(&emu->reg_lock, flags);
1434        for (idx = 0; idx < num_efx; idx++)
1435                ucontrol->value.integer.value[idx] = mix->send_volume[0][idx];
1436        spin_unlock_irqrestore(&emu->reg_lock, flags);
1437        return 0;
1438}
1439
1440static int snd_emu10k1_efx_send_volume_put(struct snd_kcontrol *kcontrol,
1441                                       struct snd_ctl_elem_value *ucontrol)
1442{
1443        unsigned long flags;
1444        struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1445        int ch = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
1446        struct snd_emu10k1_pcm_mixer *mix = &emu->efx_pcm_mixer[ch];
1447        int change = 0, idx, val;
1448        int num_efx = emu->audigy ? 8 : 4;
1449
1450        spin_lock_irqsave(&emu->reg_lock, flags);
1451        for (idx = 0; idx < num_efx; idx++) {
1452                val = ucontrol->value.integer.value[idx] & 255;
1453                if (mix->send_volume[0][idx] != val) {
1454                        mix->send_volume[0][idx] = val;
1455                        change = 1;
1456                }
1457        }
1458        if (change && mix->epcm) {
1459                if (mix->epcm->voices[ch]) {
1460                        update_emu10k1_send_volume(emu, mix->epcm->voices[ch]->number,
1461                                                   &mix->send_volume[0][0]);
1462                }
1463        }
1464        spin_unlock_irqrestore(&emu->reg_lock, flags);
1465        return change;
1466}
1467
1468
1469static struct snd_kcontrol_new snd_emu10k1_efx_send_volume_control =
1470{
1471        .access =       SNDRV_CTL_ELEM_ACCESS_READWRITE | SNDRV_CTL_ELEM_ACCESS_INACTIVE,
1472        .iface =        SNDRV_CTL_ELEM_IFACE_PCM,
1473        .name =         "Multichannel PCM Send Volume",
1474        .count =        16,
1475        .info =         snd_emu10k1_efx_send_volume_info,
1476        .get =          snd_emu10k1_efx_send_volume_get,
1477        .put =          snd_emu10k1_efx_send_volume_put
1478};
1479
1480static int snd_emu10k1_efx_attn_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
1481{
1482        uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
1483        uinfo->count = 1;
1484        uinfo->value.integer.min = 0;
1485        uinfo->value.integer.max = 0xffff;
1486        return 0;
1487}
1488
1489static int snd_emu10k1_efx_attn_get(struct snd_kcontrol *kcontrol,
1490                                struct snd_ctl_elem_value *ucontrol)
1491{
1492        struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1493        struct snd_emu10k1_pcm_mixer *mix =
1494                &emu->efx_pcm_mixer[snd_ctl_get_ioffidx(kcontrol, &ucontrol->id)];
1495        unsigned long flags;
1496
1497        spin_lock_irqsave(&emu->reg_lock, flags);
1498        ucontrol->value.integer.value[0] = mix->attn[0];
1499        spin_unlock_irqrestore(&emu->reg_lock, flags);
1500        return 0;
1501}
1502
1503static int snd_emu10k1_efx_attn_put(struct snd_kcontrol *kcontrol,
1504                                struct snd_ctl_elem_value *ucontrol)
1505{
1506        unsigned long flags;
1507        struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1508        int ch = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
1509        struct snd_emu10k1_pcm_mixer *mix = &emu->efx_pcm_mixer[ch];
1510        int change = 0, val;
1511
1512        spin_lock_irqsave(&emu->reg_lock, flags);
1513        val = ucontrol->value.integer.value[0] & 0xffff;
1514        if (mix->attn[0] != val) {
1515                mix->attn[0] = val;
1516                change = 1;
1517        }
1518        if (change && mix->epcm) {
1519                if (mix->epcm->voices[ch]) {
1520                        snd_emu10k1_ptr_write(emu, VTFT_VOLUMETARGET, mix->epcm->voices[ch]->number, mix->attn[0]);
1521                }
1522        }
1523        spin_unlock_irqrestore(&emu->reg_lock, flags);
1524        return change;
1525}
1526
1527static struct snd_kcontrol_new snd_emu10k1_efx_attn_control =
1528{
1529        .access =       SNDRV_CTL_ELEM_ACCESS_READWRITE | SNDRV_CTL_ELEM_ACCESS_INACTIVE,
1530        .iface =        SNDRV_CTL_ELEM_IFACE_PCM,
1531        .name =         "Multichannel PCM Volume",
1532        .count =        16,
1533        .info =         snd_emu10k1_efx_attn_info,
1534        .get =          snd_emu10k1_efx_attn_get,
1535        .put =          snd_emu10k1_efx_attn_put
1536};
1537
1538#define snd_emu10k1_shared_spdif_info   snd_ctl_boolean_mono_info
1539
1540static int snd_emu10k1_shared_spdif_get(struct snd_kcontrol *kcontrol,
1541                                        struct snd_ctl_elem_value *ucontrol)
1542{
1543        struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1544
1545        if (emu->audigy)
1546                ucontrol->value.integer.value[0] = inl(emu->port + A_IOCFG) & A_IOCFG_GPOUT0 ? 1 : 0;
1547        else
1548                ucontrol->value.integer.value[0] = inl(emu->port + HCFG) & HCFG_GPOUT0 ? 1 : 0;
1549        if (emu->card_capabilities->invert_shared_spdif)
1550                ucontrol->value.integer.value[0] =
1551                        !ucontrol->value.integer.value[0];
1552                
1553        return 0;
1554}
1555
1556static int snd_emu10k1_shared_spdif_put(struct snd_kcontrol *kcontrol,
1557                                        struct snd_ctl_elem_value *ucontrol)
1558{
1559        unsigned long flags;
1560        struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1561        unsigned int reg, val, sw;
1562        int change = 0;
1563
1564        sw = ucontrol->value.integer.value[0];
1565        if (emu->card_capabilities->invert_shared_spdif)
1566                sw = !sw;
1567        spin_lock_irqsave(&emu->reg_lock, flags);
1568        if ( emu->card_capabilities->i2c_adc) {
1569                /* Do nothing for Audigy 2 ZS Notebook */
1570        } else if (emu->audigy) {
1571                reg = inl(emu->port + A_IOCFG);
1572                val = sw ? A_IOCFG_GPOUT0 : 0;
1573                change = (reg & A_IOCFG_GPOUT0) != val;
1574                if (change) {
1575                        reg &= ~A_IOCFG_GPOUT0;
1576                        reg |= val;
1577                        outl(reg | val, emu->port + A_IOCFG);
1578                }
1579        }
1580        reg = inl(emu->port + HCFG);
1581        val = sw ? HCFG_GPOUT0 : 0;
1582        change |= (reg & HCFG_GPOUT0) != val;
1583        if (change) {
1584                reg &= ~HCFG_GPOUT0;
1585                reg |= val;
1586                outl(reg | val, emu->port + HCFG);
1587        }
1588        spin_unlock_irqrestore(&emu->reg_lock, flags);
1589        return change;
1590}
1591
1592static struct snd_kcontrol_new snd_emu10k1_shared_spdif =
1593{
1594        .iface =        SNDRV_CTL_ELEM_IFACE_MIXER,
1595        .name =         "SB Live Analog/Digital Output Jack",
1596        .info =         snd_emu10k1_shared_spdif_info,
1597        .get =          snd_emu10k1_shared_spdif_get,
1598        .put =          snd_emu10k1_shared_spdif_put
1599};
1600
1601static struct snd_kcontrol_new snd_audigy_shared_spdif =
1602{
1603        .iface =        SNDRV_CTL_ELEM_IFACE_MIXER,
1604        .name =         "Audigy Analog/Digital Output Jack",
1605        .info =         snd_emu10k1_shared_spdif_info,
1606        .get =          snd_emu10k1_shared_spdif_get,
1607        .put =          snd_emu10k1_shared_spdif_put
1608};
1609
1610/* workaround for too low volume on Audigy due to 16bit/24bit conversion */
1611
1612#define snd_audigy_capture_boost_info   snd_ctl_boolean_mono_info
1613
1614static int snd_audigy_capture_boost_get(struct snd_kcontrol *kcontrol,
1615                                        struct snd_ctl_elem_value *ucontrol)
1616{
1617        struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1618        unsigned int val;
1619
1620        /* FIXME: better to use a cached version */
1621        val = snd_ac97_read(emu->ac97, AC97_REC_GAIN);
1622        ucontrol->value.integer.value[0] = !!val;
1623        return 0;
1624}
1625
1626static int snd_audigy_capture_boost_put(struct snd_kcontrol *kcontrol,
1627                                        struct snd_ctl_elem_value *ucontrol)
1628{
1629        struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1630        unsigned int val;
1631
1632        if (ucontrol->value.integer.value[0])
1633                val = 0x0f0f;
1634        else
1635                val = 0;
1636        return snd_ac97_update(emu->ac97, AC97_REC_GAIN, val);
1637}
1638
1639static struct snd_kcontrol_new snd_audigy_capture_boost =
1640{
1641        .iface =        SNDRV_CTL_ELEM_IFACE_MIXER,
1642        .name =         "Analog Capture Boost",
1643        .info =         snd_audigy_capture_boost_info,
1644        .get =          snd_audigy_capture_boost_get,
1645        .put =          snd_audigy_capture_boost_put
1646};
1647
1648
1649/*
1650 */
1651static void snd_emu10k1_mixer_free_ac97(struct snd_ac97 *ac97)
1652{
1653        struct snd_emu10k1 *emu = ac97->private_data;
1654        emu->ac97 = NULL;
1655}
1656
1657/*
1658 */
1659static int remove_ctl(struct snd_card *card, const char *name)
1660{
1661        struct snd_ctl_elem_id id;
1662        memset(&id, 0, sizeof(id));
1663        strcpy(id.name, name);
1664        id.iface = SNDRV_CTL_ELEM_IFACE_MIXER;
1665        return snd_ctl_remove_id(card, &id);
1666}
1667
1668static struct snd_kcontrol *ctl_find(struct snd_card *card, const char *name)
1669{
1670        struct snd_ctl_elem_id sid;
1671        memset(&sid, 0, sizeof(sid));
1672        strcpy(sid.name, name);
1673        sid.iface = SNDRV_CTL_ELEM_IFACE_MIXER;
1674        return snd_ctl_find_id(card, &sid);
1675}
1676
1677static int rename_ctl(struct snd_card *card, const char *src, const char *dst)
1678{
1679        struct snd_kcontrol *kctl = ctl_find(card, src);
1680        if (kctl) {
1681                strcpy(kctl->id.name, dst);
1682                return 0;
1683        }
1684        return -ENOENT;
1685}
1686
1687int snd_emu10k1_mixer(struct snd_emu10k1 *emu,
1688                      int pcm_device, int multi_device)
1689{
1690        int err, pcm;
1691        struct snd_kcontrol *kctl;
1692        struct snd_card *card = emu->card;
1693        char **c;
1694        static char *emu10k1_remove_ctls[] = {
1695                /* no AC97 mono, surround, center/lfe */
1696                "Master Mono Playback Switch",
1697                "Master Mono Playback Volume",
1698                "PCM Out Path & Mute",
1699                "Mono Output Select",
1700                "Surround Playback Switch",
1701                "Surround Playback Volume",
1702                "Center Playback Switch",
1703                "Center Playback Volume",
1704                "LFE Playback Switch",
1705                "LFE Playback Volume",
1706                NULL
1707        };
1708        static char *emu10k1_rename_ctls[] = {
1709                "Surround Digital Playback Volume", "Surround Playback Volume",
1710                "Center Digital Playback Volume", "Center Playback Volume",
1711                "LFE Digital Playback Volume", "LFE Playback Volume",
1712                NULL
1713        };
1714        static char *audigy_remove_ctls[] = {
1715                /* Master/PCM controls on ac97 of Audigy has no effect */
1716                /* On the Audigy2 the AC97 playback is piped into
1717                 * the Philips ADC for 24bit capture */
1718                "PCM Playback Switch",
1719                "PCM Playback Volume",
1720                "Master Mono Playback Switch",
1721                "Master Mono Playback Volume",
1722                "Master Playback Switch",
1723                "Master Playback Volume",
1724                "PCM Out Path & Mute",
1725                "Mono Output Select",
1726                /* remove unused AC97 capture controls */
1727                "Capture Source",
1728                "Capture Switch",
1729                "Capture Volume",
1730                "Mic Select",
1731                "Video Playback Switch",
1732                "Video Playback Volume",
1733                "Mic Playback Switch",
1734                "Mic Playback Volume",
1735                NULL
1736        };
1737        static char *audigy_rename_ctls[] = {
1738                /* use conventional names */
1739                "Wave Playback Volume", "PCM Playback Volume",
1740                /* "Wave Capture Volume", "PCM Capture Volume", */
1741                "Wave Master Playback Volume", "Master Playback Volume",
1742                "AMic Playback Volume", "Mic Playback Volume",
1743                NULL
1744        };
1745        static char *audigy_rename_ctls_i2c_adc[] = {
1746                //"Analog Mix Capture Volume","OLD Analog Mix Capture Volume",
1747                "Line Capture Volume", "Analog Mix Capture Volume",
1748                "Wave Playback Volume", "OLD PCM Playback Volume",
1749                "Wave Master Playback Volume", "Master Playback Volume",
1750                "AMic Playback Volume", "Old Mic Playback Volume",
1751                "CD Capture Volume", "IEC958 Optical Capture Volume",
1752                NULL
1753        };
1754        static char *audigy_remove_ctls_i2c_adc[] = {
1755                /* On the Audigy2 ZS Notebook
1756                 * Capture via WM8775  */
1757                "Mic Capture Volume",
1758                "Analog Mix Capture Volume",
1759                "Aux Capture Volume",
1760                "IEC958 Optical Capture Volume",
1761                NULL
1762        };
1763        static char *audigy_remove_ctls_1361t_adc[] = {
1764                /* On the Audigy2 the AC97 playback is piped into
1765                 * the Philips ADC for 24bit capture */
1766                "PCM Playback Switch",
1767                "PCM Playback Volume",
1768                "Master Mono Playback Switch",
1769                "Master Mono Playback Volume",
1770                "Capture Source",
1771                "Capture Switch",
1772                "Capture Volume",
1773                "Mic Capture Volume",
1774                "Headphone Playback Switch",
1775                "Headphone Playback Volume",
1776                "3D Control - Center",
1777                "3D Control - Depth",
1778                "3D Control - Switch",
1779                "Line2 Playback Volume",
1780                "Line2 Capture Volume",
1781                NULL
1782        };
1783        static char *audigy_rename_ctls_1361t_adc[] = {
1784                "Master Playback Switch", "Master Capture Switch",
1785                "Master Playback Volume", "Master Capture Volume",
1786                "Wave Master Playback Volume", "Master Playback Volume",
1787                "Beep Playback Switch", "Beep Capture Switch",
1788                "Beep Playback Volume", "Beep Capture Volume",
1789                "Phone Playback Switch", "Phone Capture Switch",
1790                "Phone Playback Volume", "Phone Capture Volume",
1791                "Mic Playback Switch", "Mic Capture Switch",
1792                "Mic Playback Volume", "Mic Capture Volume",
1793                "Line Playback Switch", "Line Capture Switch",
1794                "Line Playback Volume", "Line Capture Volume",
1795                "CD Playback Switch", "CD Capture Switch",
1796                "CD Playback Volume", "CD Capture Volume",
1797                "Aux Playback Switch", "Aux Capture Switch",
1798                "Aux Playback Volume", "Aux Capture Volume",
1799                "Video Playback Switch", "Video Capture Switch",
1800                "Video Playback Volume", "Video Capture Volume",
1801
1802                NULL
1803        };
1804
1805        if (emu->card_capabilities->ac97_chip) {
1806                struct snd_ac97_bus *pbus;
1807                struct snd_ac97_template ac97;
1808                static struct snd_ac97_bus_ops ops = {
1809                        .write = snd_emu10k1_ac97_write,
1810                        .read = snd_emu10k1_ac97_read,
1811                };
1812
1813                if ((err = snd_ac97_bus(emu->card, 0, &ops, NULL, &pbus)) < 0)
1814                        return err;
1815                pbus->no_vra = 1; /* we don't need VRA */
1816                
1817                memset(&ac97, 0, sizeof(ac97));
1818                ac97.private_data = emu;
1819                ac97.private_free = snd_emu10k1_mixer_free_ac97;
1820                ac97.scaps = AC97_SCAP_NO_SPDIF;
1821                if ((err = snd_ac97_mixer(pbus, &ac97, &emu->ac97)) < 0) {
1822                        if (emu->card_capabilities->ac97_chip == 1)
1823                                return err;
1824                        dev_info(emu->card->dev,
1825                                 "AC97 is optional on this board\n");
1826                        dev_info(emu->card->dev,
1827                                 "Proceeding without ac97 mixers...\n");
1828                        snd_device_free(emu->card, pbus);
1829                        goto no_ac97; /* FIXME: get rid of ugly gotos.. */
1830                }
1831                if (emu->audigy) {
1832                        /* set master volume to 0 dB */
1833                        snd_ac97_write_cache(emu->ac97, AC97_MASTER, 0x0000);
1834                        /* set capture source to mic */
1835                        snd_ac97_write_cache(emu->ac97, AC97_REC_SEL, 0x0000);
1836                        if (emu->card_capabilities->adc_1361t)
1837                                c = audigy_remove_ctls_1361t_adc;
1838                        else 
1839                                c = audigy_remove_ctls;
1840                } else {
1841                        /*
1842                         * Credits for cards based on STAC9758:
1843                         *   James Courtier-Dutton <James@superbug.demon.co.uk>
1844                         *   Voluspa <voluspa@comhem.se>
1845                         */
1846                        if (emu->ac97->id == AC97_ID_STAC9758) {
1847                                emu->rear_ac97 = 1;
1848                                snd_emu10k1_ptr_write(emu, AC97SLOT, 0, AC97SLOT_CNTR|AC97SLOT_LFE|AC97SLOT_REAR_LEFT|AC97SLOT_REAR_RIGHT);
1849                                snd_ac97_write_cache(emu->ac97, AC97_HEADPHONE, 0x0202);
1850                                remove_ctl(card,"Front Playback Volume");
1851                                remove_ctl(card,"Front Playback Switch");
1852                        }
1853                        /* remove unused AC97 controls */
1854                        snd_ac97_write_cache(emu->ac97, AC97_SURROUND_MASTER, 0x0202);
1855                        snd_ac97_write_cache(emu->ac97, AC97_CENTER_LFE_MASTER, 0x0202);
1856                        c = emu10k1_remove_ctls;
1857                }
1858                for (; *c; c++)
1859                        remove_ctl(card, *c);
1860        } else if (emu->card_capabilities->i2c_adc) {
1861                c = audigy_remove_ctls_i2c_adc;
1862                for (; *c; c++)
1863                        remove_ctl(card, *c);
1864        } else {
1865        no_ac97:
1866                if (emu->card_capabilities->ecard)
1867                        strcpy(emu->card->mixername, "EMU APS");
1868                else if (emu->audigy)
1869                        strcpy(emu->card->mixername, "SB Audigy");
1870                else
1871                        strcpy(emu->card->mixername, "Emu10k1");
1872        }
1873
1874        if (emu->audigy)
1875                if (emu->card_capabilities->adc_1361t)
1876                        c = audigy_rename_ctls_1361t_adc;
1877                else if (emu->card_capabilities->i2c_adc)
1878                        c = audigy_rename_ctls_i2c_adc;
1879                else
1880                        c = audigy_rename_ctls;
1881        else
1882                c = emu10k1_rename_ctls;
1883        for (; *c; c += 2)
1884                rename_ctl(card, c[0], c[1]);
1885
1886        if (emu->card_capabilities->subsystem == 0x80401102) { /* SB Live! Platinum CT4760P */
1887                remove_ctl(card, "Center Playback Volume");
1888                remove_ctl(card, "LFE Playback Volume");
1889                remove_ctl(card, "Wave Center Playback Volume");
1890                remove_ctl(card, "Wave LFE Playback Volume");
1891        }
1892        if (emu->card_capabilities->subsystem == 0x20071102) {  /* Audigy 4 Pro */
1893                rename_ctl(card, "Line2 Capture Volume", "Line1/Mic Capture Volume");
1894                rename_ctl(card, "Analog Mix Capture Volume", "Line2 Capture Volume");
1895                rename_ctl(card, "Aux2 Capture Volume", "Line3 Capture Volume");
1896                rename_ctl(card, "Mic Capture Volume", "Unknown1 Capture Volume");
1897                remove_ctl(card, "Headphone Playback Switch");
1898                remove_ctl(card, "Headphone Playback Volume");
1899                remove_ctl(card, "3D Control - Center");
1900                remove_ctl(card, "3D Control - Depth");
1901                remove_ctl(card, "3D Control - Switch");
1902        }
1903        if ((kctl = emu->ctl_send_routing = snd_ctl_new1(&snd_emu10k1_send_routing_control, emu)) == NULL)
1904                return -ENOMEM;
1905        kctl->id.device = pcm_device;
1906        if ((err = snd_ctl_add(card, kctl)))
1907                return err;
1908        if ((kctl = emu->ctl_send_volume = snd_ctl_new1(&snd_emu10k1_send_volume_control, emu)) == NULL)
1909                return -ENOMEM;
1910        kctl->id.device = pcm_device;
1911        if ((err = snd_ctl_add(card, kctl)))
1912                return err;
1913        if ((kctl = emu->ctl_attn = snd_ctl_new1(&snd_emu10k1_attn_control, emu)) == NULL)
1914                return -ENOMEM;
1915        kctl->id.device = pcm_device;
1916        if ((err = snd_ctl_add(card, kctl)))
1917                return err;
1918
1919        if ((kctl = emu->ctl_efx_send_routing = snd_ctl_new1(&snd_emu10k1_efx_send_routing_control, emu)) == NULL)
1920                return -ENOMEM;
1921        kctl->id.device = multi_device;
1922        if ((err = snd_ctl_add(card, kctl)))
1923                return err;
1924        
1925        if ((kctl = emu->ctl_efx_send_volume = snd_ctl_new1(&snd_emu10k1_efx_send_volume_control, emu)) == NULL)
1926                return -ENOMEM;
1927        kctl->id.device = multi_device;
1928        if ((err = snd_ctl_add(card, kctl)))
1929                return err;
1930        
1931        if ((kctl = emu->ctl_efx_attn = snd_ctl_new1(&snd_emu10k1_efx_attn_control, emu)) == NULL)
1932                return -ENOMEM;
1933        kctl->id.device = multi_device;
1934        if ((err = snd_ctl_add(card, kctl)))
1935                return err;
1936
1937        /* initialize the routing and volume table for each pcm playback stream */
1938        for (pcm = 0; pcm < 32; pcm++) {
1939                struct snd_emu10k1_pcm_mixer *mix;
1940                int v;
1941                
1942                mix = &emu->pcm_mixer[pcm];
1943                mix->epcm = NULL;
1944
1945                for (v = 0; v < 4; v++)
1946                        mix->send_routing[0][v] = 
1947                                mix->send_routing[1][v] = 
1948                                mix->send_routing[2][v] = v;
1949                
1950                memset(&mix->send_volume, 0, sizeof(mix->send_volume));
1951                mix->send_volume[0][0] = mix->send_volume[0][1] =
1952                mix->send_volume[1][0] = mix->send_volume[2][1] = 255;
1953                
1954                mix->attn[0] = mix->attn[1] = mix->attn[2] = 0xffff;
1955        }
1956        
1957        /* initialize the routing and volume table for the multichannel playback stream */
1958        for (pcm = 0; pcm < NUM_EFX_PLAYBACK; pcm++) {
1959                struct snd_emu10k1_pcm_mixer *mix;
1960                int v;
1961                
1962                mix = &emu->efx_pcm_mixer[pcm];
1963                mix->epcm = NULL;
1964
1965                mix->send_routing[0][0] = pcm;
1966                mix->send_routing[0][1] = (pcm == 0) ? 1 : 0;
1967                for (v = 0; v < 2; v++)
1968                        mix->send_routing[0][2+v] = 13+v;
1969                if (emu->audigy)
1970                        for (v = 0; v < 4; v++)
1971                                mix->send_routing[0][4+v] = 60+v;
1972                
1973                memset(&mix->send_volume, 0, sizeof(mix->send_volume));
1974                mix->send_volume[0][0]  = 255;
1975                
1976                mix->attn[0] = 0xffff;
1977        }
1978        
1979        if (! emu->card_capabilities->ecard) { /* FIXME: APS has these controls? */
1980                /* sb live! and audigy */
1981                if ((kctl = snd_ctl_new1(&snd_emu10k1_spdif_mask_control, emu)) == NULL)
1982                        return -ENOMEM;
1983                if (!emu->audigy)
1984                        kctl->id.device = emu->pcm_efx->device;
1985                if ((err = snd_ctl_add(card, kctl)))
1986                        return err;
1987                if ((kctl = snd_ctl_new1(&snd_emu10k1_spdif_control, emu)) == NULL)
1988                        return -ENOMEM;
1989                if (!emu->audigy)
1990                        kctl->id.device = emu->pcm_efx->device;
1991                if ((err = snd_ctl_add(card, kctl)))
1992                        return err;
1993        }
1994
1995        if (emu->card_capabilities->emu_model) {
1996                ;  /* Disable the snd_audigy_spdif_shared_spdif */
1997        } else if (emu->audigy) {
1998                if ((kctl = snd_ctl_new1(&snd_audigy_shared_spdif, emu)) == NULL)
1999                        return -ENOMEM;
2000                if ((err = snd_ctl_add(card, kctl)))
2001                        return err;
2002#if 0
2003                if ((kctl = snd_ctl_new1(&snd_audigy_spdif_output_rate, emu)) == NULL)
2004                        return -ENOMEM;
2005                if ((err = snd_ctl_add(card, kctl)))
2006                        return err;
2007#endif
2008        } else if (! emu->card_capabilities->ecard) {
2009                /* sb live! */
2010                if ((kctl = snd_ctl_new1(&snd_emu10k1_shared_spdif, emu)) == NULL)
2011                        return -ENOMEM;
2012                if ((err = snd_ctl_add(card, kctl)))
2013                        return err;
2014        }
2015        if (emu->card_capabilities->ca0151_chip) { /* P16V */
2016                if ((err = snd_p16v_mixer(emu)))
2017                        return err;
2018        }
2019
2020        if (emu->card_capabilities->emu_model == EMU_MODEL_EMU1616) {
2021                /* 1616(m) cardbus */
2022                int i;
2023
2024                for (i = 0; i < ARRAY_SIZE(snd_emu1616_output_enum_ctls); i++) {
2025                        err = snd_ctl_add(card,
2026                                snd_ctl_new1(&snd_emu1616_output_enum_ctls[i],
2027                                             emu));
2028                        if (err < 0)
2029                                return err;
2030                }
2031                for (i = 0; i < ARRAY_SIZE(snd_emu1010_input_enum_ctls); i++) {
2032                        err = snd_ctl_add(card,
2033                                snd_ctl_new1(&snd_emu1010_input_enum_ctls[i],
2034                                             emu));
2035                        if (err < 0)
2036                                return err;
2037                }
2038                for (i = 0; i < ARRAY_SIZE(snd_emu1010_adc_pads) - 2; i++) {
2039                        err = snd_ctl_add(card,
2040                                snd_ctl_new1(&snd_emu1010_adc_pads[i], emu));
2041                        if (err < 0)
2042                                return err;
2043                }
2044                for (i = 0; i < ARRAY_SIZE(snd_emu1010_dac_pads) - 2; i++) {
2045                        err = snd_ctl_add(card,
2046                                snd_ctl_new1(&snd_emu1010_dac_pads[i], emu));
2047                        if (err < 0)
2048                                return err;
2049                }
2050                err = snd_ctl_add(card,
2051                        snd_ctl_new1(&snd_emu1010_internal_clock, emu));
2052                if (err < 0)
2053                        return err;
2054
2055        } else if (emu->card_capabilities->emu_model) {
2056                /* all other e-mu cards for now */
2057                int i;
2058
2059                for (i = 0; i < ARRAY_SIZE(snd_emu1010_output_enum_ctls); i++) {
2060                        err = snd_ctl_add(card,
2061                                snd_ctl_new1(&snd_emu1010_output_enum_ctls[i],
2062                                             emu));
2063                        if (err < 0)
2064                                return err;
2065                }
2066                for (i = 0; i < ARRAY_SIZE(snd_emu1010_input_enum_ctls); i++) {
2067                        err = snd_ctl_add(card,
2068                                snd_ctl_new1(&snd_emu1010_input_enum_ctls[i],
2069                                             emu));
2070                        if (err < 0)
2071                                return err;
2072                }
2073                for (i = 0; i < ARRAY_SIZE(snd_emu1010_adc_pads); i++) {
2074                        err = snd_ctl_add(card,
2075                                snd_ctl_new1(&snd_emu1010_adc_pads[i], emu));
2076                        if (err < 0)
2077                                return err;
2078                }
2079                for (i = 0; i < ARRAY_SIZE(snd_emu1010_dac_pads); i++) {
2080                        err = snd_ctl_add(card,
2081                                snd_ctl_new1(&snd_emu1010_dac_pads[i], emu));
2082                        if (err < 0)
2083                                return err;
2084                }
2085                err = snd_ctl_add(card,
2086                        snd_ctl_new1(&snd_emu1010_internal_clock, emu));
2087                if (err < 0)
2088                        return err;
2089        }
2090
2091        if ( emu->card_capabilities->i2c_adc) {
2092                int i;
2093
2094                err = snd_ctl_add(card, snd_ctl_new1(&snd_audigy_i2c_capture_source, emu));
2095                if (err < 0)
2096                        return err;
2097
2098                for (i = 0; i < ARRAY_SIZE(snd_audigy_i2c_volume_ctls); i++) {
2099                        err = snd_ctl_add(card, snd_ctl_new1(&snd_audigy_i2c_volume_ctls[i], emu));
2100                        if (err < 0)
2101                                return err;
2102                }
2103        }
2104                
2105        if (emu->card_capabilities->ac97_chip && emu->audigy) {
2106                err = snd_ctl_add(card, snd_ctl_new1(&snd_audigy_capture_boost,
2107                                                     emu));
2108                if (err < 0)
2109                        return err;
2110        }
2111
2112        return 0;
2113}
2114