brintos

brintos / linux-shallow public Read only

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