cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

emumixer.c (68468B)


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