0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019 #include <linux/time.h>
0020 #include <linux/init.h>
0021 #include <sound/core.h>
0022 #include <sound/emu10k1.h>
0023 #include <linux/delay.h>
0024 #include <sound/tlv.h>
0025
0026 #include "p17v.h"
0027
0028 #define AC97_ID_STAC9758 0x83847658
0029
0030 static const DECLARE_TLV_DB_SCALE(snd_audigy_db_scale2, -10350, 50, 1);
0031
0032 static int snd_emu10k1_spdif_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
0033 {
0034 uinfo->type = SNDRV_CTL_ELEM_TYPE_IEC958;
0035 uinfo->count = 1;
0036 return 0;
0037 }
0038
0039 static int snd_emu10k1_spdif_get(struct snd_kcontrol *kcontrol,
0040 struct snd_ctl_elem_value *ucontrol)
0041 {
0042 struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
0043 unsigned int idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
0044 unsigned long flags;
0045
0046
0047 if (idx >= 3)
0048 return -EINVAL;
0049 spin_lock_irqsave(&emu->reg_lock, flags);
0050 ucontrol->value.iec958.status[0] = (emu->spdif_bits[idx] >> 0) & 0xff;
0051 ucontrol->value.iec958.status[1] = (emu->spdif_bits[idx] >> 8) & 0xff;
0052 ucontrol->value.iec958.status[2] = (emu->spdif_bits[idx] >> 16) & 0xff;
0053 ucontrol->value.iec958.status[3] = (emu->spdif_bits[idx] >> 24) & 0xff;
0054 spin_unlock_irqrestore(&emu->reg_lock, flags);
0055 return 0;
0056 }
0057
0058 static int snd_emu10k1_spdif_get_mask(struct snd_kcontrol *kcontrol,
0059 struct snd_ctl_elem_value *ucontrol)
0060 {
0061 ucontrol->value.iec958.status[0] = 0xff;
0062 ucontrol->value.iec958.status[1] = 0xff;
0063 ucontrol->value.iec958.status[2] = 0xff;
0064 ucontrol->value.iec958.status[3] = 0xff;
0065 return 0;
0066 }
0067
0068
0069
0070
0071
0072 static const char * const emu1010_src_texts[] = {
0073 "Silence",
0074 "Dock Mic A",
0075 "Dock Mic B",
0076 "Dock ADC1 Left",
0077 "Dock ADC1 Right",
0078 "Dock ADC2 Left",
0079 "Dock ADC2 Right",
0080 "Dock ADC3 Left",
0081 "Dock ADC3 Right",
0082 "0202 ADC Left",
0083 "0202 ADC Right",
0084 "0202 SPDIF Left",
0085 "0202 SPDIF Right",
0086 "ADAT 0",
0087 "ADAT 1",
0088 "ADAT 2",
0089 "ADAT 3",
0090 "ADAT 4",
0091 "ADAT 5",
0092 "ADAT 6",
0093 "ADAT 7",
0094 "DSP 0",
0095 "DSP 1",
0096 "DSP 2",
0097 "DSP 3",
0098 "DSP 4",
0099 "DSP 5",
0100 "DSP 6",
0101 "DSP 7",
0102 "DSP 8",
0103 "DSP 9",
0104 "DSP 10",
0105 "DSP 11",
0106 "DSP 12",
0107 "DSP 13",
0108 "DSP 14",
0109 "DSP 15",
0110 "DSP 16",
0111 "DSP 17",
0112 "DSP 18",
0113 "DSP 19",
0114 "DSP 20",
0115 "DSP 21",
0116 "DSP 22",
0117 "DSP 23",
0118 "DSP 24",
0119 "DSP 25",
0120 "DSP 26",
0121 "DSP 27",
0122 "DSP 28",
0123 "DSP 29",
0124 "DSP 30",
0125 "DSP 31",
0126 };
0127
0128
0129
0130 static const char * const emu1616_src_texts[] = {
0131 "Silence",
0132 "Dock Mic A",
0133 "Dock Mic B",
0134 "Dock ADC1 Left",
0135 "Dock ADC1 Right",
0136 "Dock ADC2 Left",
0137 "Dock ADC2 Right",
0138 "Dock SPDIF Left",
0139 "Dock SPDIF Right",
0140 "ADAT 0",
0141 "ADAT 1",
0142 "ADAT 2",
0143 "ADAT 3",
0144 "ADAT 4",
0145 "ADAT 5",
0146 "ADAT 6",
0147 "ADAT 7",
0148 "DSP 0",
0149 "DSP 1",
0150 "DSP 2",
0151 "DSP 3",
0152 "DSP 4",
0153 "DSP 5",
0154 "DSP 6",
0155 "DSP 7",
0156 "DSP 8",
0157 "DSP 9",
0158 "DSP 10",
0159 "DSP 11",
0160 "DSP 12",
0161 "DSP 13",
0162 "DSP 14",
0163 "DSP 15",
0164 "DSP 16",
0165 "DSP 17",
0166 "DSP 18",
0167 "DSP 19",
0168 "DSP 20",
0169 "DSP 21",
0170 "DSP 22",
0171 "DSP 23",
0172 "DSP 24",
0173 "DSP 25",
0174 "DSP 26",
0175 "DSP 27",
0176 "DSP 28",
0177 "DSP 29",
0178 "DSP 30",
0179 "DSP 31",
0180 };
0181
0182
0183
0184
0185
0186 static const unsigned int emu1010_src_regs[] = {
0187 EMU_SRC_SILENCE,
0188 EMU_SRC_DOCK_MIC_A1,
0189 EMU_SRC_DOCK_MIC_B1,
0190 EMU_SRC_DOCK_ADC1_LEFT1,
0191 EMU_SRC_DOCK_ADC1_RIGHT1,
0192 EMU_SRC_DOCK_ADC2_LEFT1,
0193 EMU_SRC_DOCK_ADC2_RIGHT1,
0194 EMU_SRC_DOCK_ADC3_LEFT1,
0195 EMU_SRC_DOCK_ADC3_RIGHT1,
0196 EMU_SRC_HAMOA_ADC_LEFT1,
0197 EMU_SRC_HAMOA_ADC_RIGHT1,
0198 EMU_SRC_HANA_SPDIF_LEFT1,
0199 EMU_SRC_HANA_SPDIF_RIGHT1,
0200 EMU_SRC_HANA_ADAT,
0201 EMU_SRC_HANA_ADAT+1,
0202 EMU_SRC_HANA_ADAT+2,
0203 EMU_SRC_HANA_ADAT+3,
0204 EMU_SRC_HANA_ADAT+4,
0205 EMU_SRC_HANA_ADAT+5,
0206 EMU_SRC_HANA_ADAT+6,
0207 EMU_SRC_HANA_ADAT+7,
0208 EMU_SRC_ALICE_EMU32A,
0209 EMU_SRC_ALICE_EMU32A+1,
0210 EMU_SRC_ALICE_EMU32A+2,
0211 EMU_SRC_ALICE_EMU32A+3,
0212 EMU_SRC_ALICE_EMU32A+4,
0213 EMU_SRC_ALICE_EMU32A+5,
0214 EMU_SRC_ALICE_EMU32A+6,
0215 EMU_SRC_ALICE_EMU32A+7,
0216 EMU_SRC_ALICE_EMU32A+8,
0217 EMU_SRC_ALICE_EMU32A+9,
0218 EMU_SRC_ALICE_EMU32A+0xa,
0219 EMU_SRC_ALICE_EMU32A+0xb,
0220 EMU_SRC_ALICE_EMU32A+0xc,
0221 EMU_SRC_ALICE_EMU32A+0xd,
0222 EMU_SRC_ALICE_EMU32A+0xe,
0223 EMU_SRC_ALICE_EMU32A+0xf,
0224 EMU_SRC_ALICE_EMU32B,
0225 EMU_SRC_ALICE_EMU32B+1,
0226 EMU_SRC_ALICE_EMU32B+2,
0227 EMU_SRC_ALICE_EMU32B+3,
0228 EMU_SRC_ALICE_EMU32B+4,
0229 EMU_SRC_ALICE_EMU32B+5,
0230 EMU_SRC_ALICE_EMU32B+6,
0231 EMU_SRC_ALICE_EMU32B+7,
0232 EMU_SRC_ALICE_EMU32B+8,
0233 EMU_SRC_ALICE_EMU32B+9,
0234 EMU_SRC_ALICE_EMU32B+0xa,
0235 EMU_SRC_ALICE_EMU32B+0xb,
0236 EMU_SRC_ALICE_EMU32B+0xc,
0237 EMU_SRC_ALICE_EMU32B+0xd,
0238 EMU_SRC_ALICE_EMU32B+0xe,
0239 EMU_SRC_ALICE_EMU32B+0xf,
0240 };
0241
0242
0243 static const unsigned int emu1616_src_regs[] = {
0244 EMU_SRC_SILENCE,
0245 EMU_SRC_DOCK_MIC_A1,
0246 EMU_SRC_DOCK_MIC_B1,
0247 EMU_SRC_DOCK_ADC1_LEFT1,
0248 EMU_SRC_DOCK_ADC1_RIGHT1,
0249 EMU_SRC_DOCK_ADC2_LEFT1,
0250 EMU_SRC_DOCK_ADC2_RIGHT1,
0251 EMU_SRC_MDOCK_SPDIF_LEFT1,
0252 EMU_SRC_MDOCK_SPDIF_RIGHT1,
0253 EMU_SRC_MDOCK_ADAT,
0254 EMU_SRC_MDOCK_ADAT+1,
0255 EMU_SRC_MDOCK_ADAT+2,
0256 EMU_SRC_MDOCK_ADAT+3,
0257 EMU_SRC_MDOCK_ADAT+4,
0258 EMU_SRC_MDOCK_ADAT+5,
0259 EMU_SRC_MDOCK_ADAT+6,
0260 EMU_SRC_MDOCK_ADAT+7,
0261 EMU_SRC_ALICE_EMU32A,
0262 EMU_SRC_ALICE_EMU32A+1,
0263 EMU_SRC_ALICE_EMU32A+2,
0264 EMU_SRC_ALICE_EMU32A+3,
0265 EMU_SRC_ALICE_EMU32A+4,
0266 EMU_SRC_ALICE_EMU32A+5,
0267 EMU_SRC_ALICE_EMU32A+6,
0268 EMU_SRC_ALICE_EMU32A+7,
0269 EMU_SRC_ALICE_EMU32A+8,
0270 EMU_SRC_ALICE_EMU32A+9,
0271 EMU_SRC_ALICE_EMU32A+0xa,
0272 EMU_SRC_ALICE_EMU32A+0xb,
0273 EMU_SRC_ALICE_EMU32A+0xc,
0274 EMU_SRC_ALICE_EMU32A+0xd,
0275 EMU_SRC_ALICE_EMU32A+0xe,
0276 EMU_SRC_ALICE_EMU32A+0xf,
0277 EMU_SRC_ALICE_EMU32B,
0278 EMU_SRC_ALICE_EMU32B+1,
0279 EMU_SRC_ALICE_EMU32B+2,
0280 EMU_SRC_ALICE_EMU32B+3,
0281 EMU_SRC_ALICE_EMU32B+4,
0282 EMU_SRC_ALICE_EMU32B+5,
0283 EMU_SRC_ALICE_EMU32B+6,
0284 EMU_SRC_ALICE_EMU32B+7,
0285 EMU_SRC_ALICE_EMU32B+8,
0286 EMU_SRC_ALICE_EMU32B+9,
0287 EMU_SRC_ALICE_EMU32B+0xa,
0288 EMU_SRC_ALICE_EMU32B+0xb,
0289 EMU_SRC_ALICE_EMU32B+0xc,
0290 EMU_SRC_ALICE_EMU32B+0xd,
0291 EMU_SRC_ALICE_EMU32B+0xe,
0292 EMU_SRC_ALICE_EMU32B+0xf,
0293 };
0294
0295
0296
0297
0298
0299 static const unsigned int emu1010_output_dst[] = {
0300 EMU_DST_DOCK_DAC1_LEFT1,
0301 EMU_DST_DOCK_DAC1_RIGHT1,
0302 EMU_DST_DOCK_DAC2_LEFT1,
0303 EMU_DST_DOCK_DAC2_RIGHT1,
0304 EMU_DST_DOCK_DAC3_LEFT1,
0305 EMU_DST_DOCK_DAC3_RIGHT1,
0306 EMU_DST_DOCK_DAC4_LEFT1,
0307 EMU_DST_DOCK_DAC4_RIGHT1,
0308 EMU_DST_DOCK_PHONES_LEFT1,
0309 EMU_DST_DOCK_PHONES_RIGHT1,
0310 EMU_DST_DOCK_SPDIF_LEFT1,
0311 EMU_DST_DOCK_SPDIF_RIGHT1,
0312 EMU_DST_HANA_SPDIF_LEFT1,
0313 EMU_DST_HANA_SPDIF_RIGHT1,
0314 EMU_DST_HAMOA_DAC_LEFT1,
0315 EMU_DST_HAMOA_DAC_RIGHT1,
0316 EMU_DST_HANA_ADAT,
0317 EMU_DST_HANA_ADAT+1,
0318 EMU_DST_HANA_ADAT+2,
0319 EMU_DST_HANA_ADAT+3,
0320 EMU_DST_HANA_ADAT+4,
0321 EMU_DST_HANA_ADAT+5,
0322 EMU_DST_HANA_ADAT+6,
0323 EMU_DST_HANA_ADAT+7,
0324 };
0325
0326
0327 static const unsigned int emu1616_output_dst[] = {
0328 EMU_DST_DOCK_DAC1_LEFT1,
0329 EMU_DST_DOCK_DAC1_RIGHT1,
0330 EMU_DST_DOCK_DAC2_LEFT1,
0331 EMU_DST_DOCK_DAC2_RIGHT1,
0332 EMU_DST_DOCK_DAC3_LEFT1,
0333 EMU_DST_DOCK_DAC3_RIGHT1,
0334 EMU_DST_MDOCK_SPDIF_LEFT1,
0335 EMU_DST_MDOCK_SPDIF_RIGHT1,
0336 EMU_DST_MDOCK_ADAT,
0337 EMU_DST_MDOCK_ADAT+1,
0338 EMU_DST_MDOCK_ADAT+2,
0339 EMU_DST_MDOCK_ADAT+3,
0340 EMU_DST_MDOCK_ADAT+4,
0341 EMU_DST_MDOCK_ADAT+5,
0342 EMU_DST_MDOCK_ADAT+6,
0343 EMU_DST_MDOCK_ADAT+7,
0344 EMU_DST_MANA_DAC_LEFT,
0345 EMU_DST_MANA_DAC_RIGHT,
0346 };
0347
0348
0349
0350
0351
0352
0353 static const unsigned int emu1010_input_dst[] = {
0354 EMU_DST_ALICE2_EMU32_0,
0355 EMU_DST_ALICE2_EMU32_1,
0356 EMU_DST_ALICE2_EMU32_2,
0357 EMU_DST_ALICE2_EMU32_3,
0358 EMU_DST_ALICE2_EMU32_4,
0359 EMU_DST_ALICE2_EMU32_5,
0360 EMU_DST_ALICE2_EMU32_6,
0361 EMU_DST_ALICE2_EMU32_7,
0362 EMU_DST_ALICE2_EMU32_8,
0363 EMU_DST_ALICE2_EMU32_9,
0364 EMU_DST_ALICE2_EMU32_A,
0365 EMU_DST_ALICE2_EMU32_B,
0366 EMU_DST_ALICE2_EMU32_C,
0367 EMU_DST_ALICE2_EMU32_D,
0368 EMU_DST_ALICE2_EMU32_E,
0369 EMU_DST_ALICE2_EMU32_F,
0370 EMU_DST_ALICE_I2S0_LEFT,
0371 EMU_DST_ALICE_I2S0_RIGHT,
0372 EMU_DST_ALICE_I2S1_LEFT,
0373 EMU_DST_ALICE_I2S1_RIGHT,
0374 EMU_DST_ALICE_I2S2_LEFT,
0375 EMU_DST_ALICE_I2S2_RIGHT,
0376 };
0377
0378 static int snd_emu1010_input_output_source_info(struct snd_kcontrol *kcontrol,
0379 struct snd_ctl_elem_info *uinfo)
0380 {
0381 struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
0382
0383 if (emu->card_capabilities->emu_model == EMU_MODEL_EMU1616)
0384 return snd_ctl_enum_info(uinfo, 1, 49, emu1616_src_texts);
0385 else
0386 return snd_ctl_enum_info(uinfo, 1, 53, emu1010_src_texts);
0387 }
0388
0389 static int snd_emu1010_output_source_get(struct snd_kcontrol *kcontrol,
0390 struct snd_ctl_elem_value *ucontrol)
0391 {
0392 struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
0393 unsigned int channel;
0394
0395 channel = (kcontrol->private_value) & 0xff;
0396
0397 if (channel >= 24 ||
0398 (emu->card_capabilities->emu_model == EMU_MODEL_EMU1616 &&
0399 channel >= 18))
0400 return -EINVAL;
0401 ucontrol->value.enumerated.item[0] = emu->emu1010.output_source[channel];
0402 return 0;
0403 }
0404
0405 static int snd_emu1010_output_source_put(struct snd_kcontrol *kcontrol,
0406 struct snd_ctl_elem_value *ucontrol)
0407 {
0408 struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
0409 unsigned int val;
0410 unsigned int channel;
0411
0412 val = ucontrol->value.enumerated.item[0];
0413 if (val >= 53 ||
0414 (emu->card_capabilities->emu_model == EMU_MODEL_EMU1616 &&
0415 val >= 49))
0416 return -EINVAL;
0417 channel = (kcontrol->private_value) & 0xff;
0418
0419 if (channel >= 24 ||
0420 (emu->card_capabilities->emu_model == EMU_MODEL_EMU1616 &&
0421 channel >= 18))
0422 return -EINVAL;
0423 if (emu->emu1010.output_source[channel] == val)
0424 return 0;
0425 emu->emu1010.output_source[channel] = val;
0426 if (emu->card_capabilities->emu_model == EMU_MODEL_EMU1616)
0427 snd_emu1010_fpga_link_dst_src_write(emu,
0428 emu1616_output_dst[channel], emu1616_src_regs[val]);
0429 else
0430 snd_emu1010_fpga_link_dst_src_write(emu,
0431 emu1010_output_dst[channel], emu1010_src_regs[val]);
0432 return 1;
0433 }
0434
0435 static int snd_emu1010_input_source_get(struct snd_kcontrol *kcontrol,
0436 struct snd_ctl_elem_value *ucontrol)
0437 {
0438 struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
0439 unsigned int channel;
0440
0441 channel = (kcontrol->private_value) & 0xff;
0442
0443 if (channel >= 22)
0444 return -EINVAL;
0445 ucontrol->value.enumerated.item[0] = emu->emu1010.input_source[channel];
0446 return 0;
0447 }
0448
0449 static int snd_emu1010_input_source_put(struct snd_kcontrol *kcontrol,
0450 struct snd_ctl_elem_value *ucontrol)
0451 {
0452 struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
0453 unsigned int val;
0454 unsigned int channel;
0455
0456 val = ucontrol->value.enumerated.item[0];
0457 if (val >= 53 ||
0458 (emu->card_capabilities->emu_model == EMU_MODEL_EMU1616 &&
0459 val >= 49))
0460 return -EINVAL;
0461 channel = (kcontrol->private_value) & 0xff;
0462
0463 if (channel >= 22)
0464 return -EINVAL;
0465 if (emu->emu1010.input_source[channel] == val)
0466 return 0;
0467 emu->emu1010.input_source[channel] = val;
0468 if (emu->card_capabilities->emu_model == EMU_MODEL_EMU1616)
0469 snd_emu1010_fpga_link_dst_src_write(emu,
0470 emu1010_input_dst[channel], emu1616_src_regs[val]);
0471 else
0472 snd_emu1010_fpga_link_dst_src_write(emu,
0473 emu1010_input_dst[channel], emu1010_src_regs[val]);
0474 return 1;
0475 }
0476
0477 #define EMU1010_SOURCE_OUTPUT(xname,chid) \
0478 { \
0479 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
0480 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, \
0481 .info = snd_emu1010_input_output_source_info, \
0482 .get = snd_emu1010_output_source_get, \
0483 .put = snd_emu1010_output_source_put, \
0484 .private_value = chid \
0485 }
0486
0487 static const struct snd_kcontrol_new snd_emu1010_output_enum_ctls[] = {
0488 EMU1010_SOURCE_OUTPUT("Dock DAC1 Left Playback Enum", 0),
0489 EMU1010_SOURCE_OUTPUT("Dock DAC1 Right Playback Enum", 1),
0490 EMU1010_SOURCE_OUTPUT("Dock DAC2 Left Playback Enum", 2),
0491 EMU1010_SOURCE_OUTPUT("Dock DAC2 Right Playback Enum", 3),
0492 EMU1010_SOURCE_OUTPUT("Dock DAC3 Left Playback Enum", 4),
0493 EMU1010_SOURCE_OUTPUT("Dock DAC3 Right Playback Enum", 5),
0494 EMU1010_SOURCE_OUTPUT("Dock DAC4 Left Playback Enum", 6),
0495 EMU1010_SOURCE_OUTPUT("Dock DAC4 Right Playback Enum", 7),
0496 EMU1010_SOURCE_OUTPUT("Dock Phones Left Playback Enum", 8),
0497 EMU1010_SOURCE_OUTPUT("Dock Phones Right Playback Enum", 9),
0498 EMU1010_SOURCE_OUTPUT("Dock SPDIF Left Playback Enum", 0xa),
0499 EMU1010_SOURCE_OUTPUT("Dock SPDIF Right Playback Enum", 0xb),
0500 EMU1010_SOURCE_OUTPUT("1010 SPDIF Left Playback Enum", 0xc),
0501 EMU1010_SOURCE_OUTPUT("1010 SPDIF Right Playback Enum", 0xd),
0502 EMU1010_SOURCE_OUTPUT("0202 DAC Left Playback Enum", 0xe),
0503 EMU1010_SOURCE_OUTPUT("0202 DAC Right Playback Enum", 0xf),
0504 EMU1010_SOURCE_OUTPUT("1010 ADAT 0 Playback Enum", 0x10),
0505 EMU1010_SOURCE_OUTPUT("1010 ADAT 1 Playback Enum", 0x11),
0506 EMU1010_SOURCE_OUTPUT("1010 ADAT 2 Playback Enum", 0x12),
0507 EMU1010_SOURCE_OUTPUT("1010 ADAT 3 Playback Enum", 0x13),
0508 EMU1010_SOURCE_OUTPUT("1010 ADAT 4 Playback Enum", 0x14),
0509 EMU1010_SOURCE_OUTPUT("1010 ADAT 5 Playback Enum", 0x15),
0510 EMU1010_SOURCE_OUTPUT("1010 ADAT 6 Playback Enum", 0x16),
0511 EMU1010_SOURCE_OUTPUT("1010 ADAT 7 Playback Enum", 0x17),
0512 };
0513
0514
0515
0516 static const struct snd_kcontrol_new snd_emu1616_output_enum_ctls[] = {
0517 EMU1010_SOURCE_OUTPUT("Dock DAC1 Left Playback Enum", 0),
0518 EMU1010_SOURCE_OUTPUT("Dock DAC1 Right Playback Enum", 1),
0519 EMU1010_SOURCE_OUTPUT("Dock DAC2 Left Playback Enum", 2),
0520 EMU1010_SOURCE_OUTPUT("Dock DAC2 Right Playback Enum", 3),
0521 EMU1010_SOURCE_OUTPUT("Dock DAC3 Left Playback Enum", 4),
0522 EMU1010_SOURCE_OUTPUT("Dock DAC3 Right Playback Enum", 5),
0523 EMU1010_SOURCE_OUTPUT("Dock SPDIF Left Playback Enum", 6),
0524 EMU1010_SOURCE_OUTPUT("Dock SPDIF Right Playback Enum", 7),
0525 EMU1010_SOURCE_OUTPUT("Dock ADAT 0 Playback Enum", 8),
0526 EMU1010_SOURCE_OUTPUT("Dock ADAT 1 Playback Enum", 9),
0527 EMU1010_SOURCE_OUTPUT("Dock ADAT 2 Playback Enum", 0xa),
0528 EMU1010_SOURCE_OUTPUT("Dock ADAT 3 Playback Enum", 0xb),
0529 EMU1010_SOURCE_OUTPUT("Dock ADAT 4 Playback Enum", 0xc),
0530 EMU1010_SOURCE_OUTPUT("Dock ADAT 5 Playback Enum", 0xd),
0531 EMU1010_SOURCE_OUTPUT("Dock ADAT 6 Playback Enum", 0xe),
0532 EMU1010_SOURCE_OUTPUT("Dock ADAT 7 Playback Enum", 0xf),
0533 EMU1010_SOURCE_OUTPUT("Mana DAC Left Playback Enum", 0x10),
0534 EMU1010_SOURCE_OUTPUT("Mana DAC Right Playback Enum", 0x11),
0535 };
0536
0537
0538 #define EMU1010_SOURCE_INPUT(xname,chid) \
0539 { \
0540 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
0541 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, \
0542 .info = snd_emu1010_input_output_source_info, \
0543 .get = snd_emu1010_input_source_get, \
0544 .put = snd_emu1010_input_source_put, \
0545 .private_value = chid \
0546 }
0547
0548 static const struct snd_kcontrol_new snd_emu1010_input_enum_ctls[] = {
0549 EMU1010_SOURCE_INPUT("DSP 0 Capture Enum", 0),
0550 EMU1010_SOURCE_INPUT("DSP 1 Capture Enum", 1),
0551 EMU1010_SOURCE_INPUT("DSP 2 Capture Enum", 2),
0552 EMU1010_SOURCE_INPUT("DSP 3 Capture Enum", 3),
0553 EMU1010_SOURCE_INPUT("DSP 4 Capture Enum", 4),
0554 EMU1010_SOURCE_INPUT("DSP 5 Capture Enum", 5),
0555 EMU1010_SOURCE_INPUT("DSP 6 Capture Enum", 6),
0556 EMU1010_SOURCE_INPUT("DSP 7 Capture Enum", 7),
0557 EMU1010_SOURCE_INPUT("DSP 8 Capture Enum", 8),
0558 EMU1010_SOURCE_INPUT("DSP 9 Capture Enum", 9),
0559 EMU1010_SOURCE_INPUT("DSP A Capture Enum", 0xa),
0560 EMU1010_SOURCE_INPUT("DSP B Capture Enum", 0xb),
0561 EMU1010_SOURCE_INPUT("DSP C Capture Enum", 0xc),
0562 EMU1010_SOURCE_INPUT("DSP D Capture Enum", 0xd),
0563 EMU1010_SOURCE_INPUT("DSP E Capture Enum", 0xe),
0564 EMU1010_SOURCE_INPUT("DSP F Capture Enum", 0xf),
0565 EMU1010_SOURCE_INPUT("DSP 10 Capture Enum", 0x10),
0566 EMU1010_SOURCE_INPUT("DSP 11 Capture Enum", 0x11),
0567 EMU1010_SOURCE_INPUT("DSP 12 Capture Enum", 0x12),
0568 EMU1010_SOURCE_INPUT("DSP 13 Capture Enum", 0x13),
0569 EMU1010_SOURCE_INPUT("DSP 14 Capture Enum", 0x14),
0570 EMU1010_SOURCE_INPUT("DSP 15 Capture Enum", 0x15),
0571 };
0572
0573
0574
0575 #define snd_emu1010_adc_pads_info snd_ctl_boolean_mono_info
0576
0577 static int snd_emu1010_adc_pads_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
0578 {
0579 struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
0580 unsigned int mask = kcontrol->private_value & 0xff;
0581 ucontrol->value.integer.value[0] = (emu->emu1010.adc_pads & mask) ? 1 : 0;
0582 return 0;
0583 }
0584
0585 static int snd_emu1010_adc_pads_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
0586 {
0587 struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
0588 unsigned int mask = kcontrol->private_value & 0xff;
0589 unsigned int val, cache;
0590 val = ucontrol->value.integer.value[0];
0591 cache = emu->emu1010.adc_pads;
0592 if (val == 1)
0593 cache = cache | mask;
0594 else
0595 cache = cache & ~mask;
0596 if (cache != emu->emu1010.adc_pads) {
0597 snd_emu1010_fpga_write(emu, EMU_HANA_ADC_PADS, cache );
0598 emu->emu1010.adc_pads = cache;
0599 }
0600
0601 return 0;
0602 }
0603
0604
0605
0606 #define EMU1010_ADC_PADS(xname,chid) \
0607 { \
0608 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
0609 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, \
0610 .info = snd_emu1010_adc_pads_info, \
0611 .get = snd_emu1010_adc_pads_get, \
0612 .put = snd_emu1010_adc_pads_put, \
0613 .private_value = chid \
0614 }
0615
0616 static const struct snd_kcontrol_new snd_emu1010_adc_pads[] = {
0617 EMU1010_ADC_PADS("ADC1 14dB PAD Audio Dock Capture Switch", EMU_HANA_DOCK_ADC_PAD1),
0618 EMU1010_ADC_PADS("ADC2 14dB PAD Audio Dock Capture Switch", EMU_HANA_DOCK_ADC_PAD2),
0619 EMU1010_ADC_PADS("ADC3 14dB PAD Audio Dock Capture Switch", EMU_HANA_DOCK_ADC_PAD3),
0620 EMU1010_ADC_PADS("ADC1 14dB PAD 0202 Capture Switch", EMU_HANA_0202_ADC_PAD1),
0621 };
0622
0623 #define snd_emu1010_dac_pads_info snd_ctl_boolean_mono_info
0624
0625 static int snd_emu1010_dac_pads_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
0626 {
0627 struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
0628 unsigned int mask = kcontrol->private_value & 0xff;
0629 ucontrol->value.integer.value[0] = (emu->emu1010.dac_pads & mask) ? 1 : 0;
0630 return 0;
0631 }
0632
0633 static int snd_emu1010_dac_pads_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
0634 {
0635 struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
0636 unsigned int mask = kcontrol->private_value & 0xff;
0637 unsigned int val, cache;
0638 val = ucontrol->value.integer.value[0];
0639 cache = emu->emu1010.dac_pads;
0640 if (val == 1)
0641 cache = cache | mask;
0642 else
0643 cache = cache & ~mask;
0644 if (cache != emu->emu1010.dac_pads) {
0645 snd_emu1010_fpga_write(emu, EMU_HANA_DAC_PADS, cache );
0646 emu->emu1010.dac_pads = cache;
0647 }
0648
0649 return 0;
0650 }
0651
0652
0653
0654 #define EMU1010_DAC_PADS(xname,chid) \
0655 { \
0656 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
0657 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, \
0658 .info = snd_emu1010_dac_pads_info, \
0659 .get = snd_emu1010_dac_pads_get, \
0660 .put = snd_emu1010_dac_pads_put, \
0661 .private_value = chid \
0662 }
0663
0664 static const struct snd_kcontrol_new snd_emu1010_dac_pads[] = {
0665 EMU1010_DAC_PADS("DAC1 Audio Dock 14dB PAD Playback Switch", EMU_HANA_DOCK_DAC_PAD1),
0666 EMU1010_DAC_PADS("DAC2 Audio Dock 14dB PAD Playback Switch", EMU_HANA_DOCK_DAC_PAD2),
0667 EMU1010_DAC_PADS("DAC3 Audio Dock 14dB PAD Playback Switch", EMU_HANA_DOCK_DAC_PAD3),
0668 EMU1010_DAC_PADS("DAC4 Audio Dock 14dB PAD Playback Switch", EMU_HANA_DOCK_DAC_PAD4),
0669 EMU1010_DAC_PADS("DAC1 0202 14dB PAD Playback Switch", EMU_HANA_0202_DAC_PAD1),
0670 };
0671
0672
0673 static int snd_emu1010_internal_clock_info(struct snd_kcontrol *kcontrol,
0674 struct snd_ctl_elem_info *uinfo)
0675 {
0676 static const char * const texts[4] = {
0677 "44100", "48000", "SPDIF", "ADAT"
0678 };
0679
0680 return snd_ctl_enum_info(uinfo, 1, 4, texts);
0681 }
0682
0683 static int snd_emu1010_internal_clock_get(struct snd_kcontrol *kcontrol,
0684 struct snd_ctl_elem_value *ucontrol)
0685 {
0686 struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
0687
0688 ucontrol->value.enumerated.item[0] = emu->emu1010.internal_clock;
0689 return 0;
0690 }
0691
0692 static int snd_emu1010_internal_clock_put(struct snd_kcontrol *kcontrol,
0693 struct snd_ctl_elem_value *ucontrol)
0694 {
0695 struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
0696 unsigned int val;
0697 int change = 0;
0698
0699 val = ucontrol->value.enumerated.item[0] ;
0700
0701 if (val >= 4)
0702 return -EINVAL;
0703 change = (emu->emu1010.internal_clock != val);
0704 if (change) {
0705 emu->emu1010.internal_clock = val;
0706 switch (val) {
0707 case 0:
0708
0709
0710 snd_emu1010_fpga_write(emu, EMU_HANA_UNMUTE, EMU_MUTE );
0711
0712 snd_emu1010_fpga_write(emu, EMU_HANA_DEFCLOCK, EMU_HANA_DEFCLOCK_44_1K );
0713
0714 snd_emu1010_fpga_write(emu, EMU_HANA_WCLOCK,
0715 EMU_HANA_WCLOCK_INT_44_1K | EMU_HANA_WCLOCK_1X );
0716
0717 snd_emu1010_fpga_write(emu, EMU_HANA_DOCK_LEDS_2,
0718 EMU_HANA_DOCK_LEDS_2_44K | EMU_HANA_DOCK_LEDS_2_LOCK );
0719
0720 msleep(10);
0721
0722 snd_emu1010_fpga_write(emu, EMU_HANA_UNMUTE, EMU_UNMUTE );
0723 break;
0724 case 1:
0725
0726
0727 snd_emu1010_fpga_write(emu, EMU_HANA_UNMUTE, EMU_MUTE );
0728
0729 snd_emu1010_fpga_write(emu, EMU_HANA_DEFCLOCK, EMU_HANA_DEFCLOCK_48K );
0730
0731 snd_emu1010_fpga_write(emu, EMU_HANA_WCLOCK,
0732 EMU_HANA_WCLOCK_INT_48K | EMU_HANA_WCLOCK_1X );
0733
0734 snd_emu1010_fpga_write(emu, EMU_HANA_DOCK_LEDS_2,
0735 EMU_HANA_DOCK_LEDS_2_48K | EMU_HANA_DOCK_LEDS_2_LOCK );
0736
0737 msleep(10);
0738
0739 snd_emu1010_fpga_write(emu, EMU_HANA_UNMUTE, EMU_UNMUTE );
0740 break;
0741
0742 case 2:
0743
0744 snd_emu1010_fpga_write(emu, EMU_HANA_UNMUTE, EMU_MUTE );
0745
0746 snd_emu1010_fpga_write(emu, EMU_HANA_DEFCLOCK, EMU_HANA_DEFCLOCK_48K );
0747
0748 snd_emu1010_fpga_write(emu, EMU_HANA_WCLOCK,
0749 EMU_HANA_WCLOCK_HANA_SPDIF_IN | EMU_HANA_WCLOCK_1X );
0750
0751 snd_emu1010_fpga_write(emu, EMU_HANA_DOCK_LEDS_2,
0752 EMU_HANA_DOCK_LEDS_2_EXT | EMU_HANA_DOCK_LEDS_2_LOCK );
0753
0754
0755 msleep(10);
0756
0757 snd_emu1010_fpga_write(emu, EMU_HANA_UNMUTE, EMU_UNMUTE );
0758 break;
0759
0760 case 3:
0761
0762
0763 snd_emu1010_fpga_write(emu, EMU_HANA_UNMUTE, EMU_MUTE );
0764
0765 snd_emu1010_fpga_write(emu, EMU_HANA_DEFCLOCK, EMU_HANA_DEFCLOCK_48K );
0766
0767 snd_emu1010_fpga_write(emu, EMU_HANA_WCLOCK,
0768 EMU_HANA_WCLOCK_HANA_ADAT_IN | EMU_HANA_WCLOCK_1X );
0769
0770 snd_emu1010_fpga_write(emu, EMU_HANA_DOCK_LEDS_2, EMU_HANA_DOCK_LEDS_2_EXT | EMU_HANA_DOCK_LEDS_2_LOCK );
0771
0772
0773 msleep(10);
0774
0775 snd_emu1010_fpga_write(emu, EMU_HANA_UNMUTE, EMU_UNMUTE );
0776
0777
0778 break;
0779 }
0780 }
0781 return change;
0782 }
0783
0784 static const struct snd_kcontrol_new snd_emu1010_internal_clock =
0785 {
0786 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
0787 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
0788 .name = "Clock Internal Rate",
0789 .count = 1,
0790 .info = snd_emu1010_internal_clock_info,
0791 .get = snd_emu1010_internal_clock_get,
0792 .put = snd_emu1010_internal_clock_put
0793 };
0794
0795 static int snd_emu1010_optical_out_info(struct snd_kcontrol *kcontrol,
0796 struct snd_ctl_elem_info *uinfo)
0797 {
0798 static const char * const texts[2] = {
0799 "SPDIF", "ADAT"
0800 };
0801
0802 return snd_ctl_enum_info(uinfo, 1, 2, texts);
0803 }
0804
0805 static int snd_emu1010_optical_out_get(struct snd_kcontrol *kcontrol,
0806 struct snd_ctl_elem_value *ucontrol)
0807 {
0808 struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
0809
0810 ucontrol->value.enumerated.item[0] = emu->emu1010.optical_out;
0811 return 0;
0812 }
0813
0814 static int snd_emu1010_optical_out_put(struct snd_kcontrol *kcontrol,
0815 struct snd_ctl_elem_value *ucontrol)
0816 {
0817 struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
0818 unsigned int val;
0819 u32 tmp;
0820 int change = 0;
0821
0822 val = ucontrol->value.enumerated.item[0];
0823
0824 if (val >= 2)
0825 return -EINVAL;
0826 change = (emu->emu1010.optical_out != val);
0827 if (change) {
0828 emu->emu1010.optical_out = val;
0829 tmp = (emu->emu1010.optical_in ? EMU_HANA_OPTICAL_IN_ADAT : 0) |
0830 (emu->emu1010.optical_out ? EMU_HANA_OPTICAL_OUT_ADAT : 0);
0831 snd_emu1010_fpga_write(emu, EMU_HANA_OPTICAL_TYPE, tmp);
0832 }
0833 return change;
0834 }
0835
0836 static const struct snd_kcontrol_new snd_emu1010_optical_out = {
0837 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
0838 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
0839 .name = "Optical Output Mode",
0840 .count = 1,
0841 .info = snd_emu1010_optical_out_info,
0842 .get = snd_emu1010_optical_out_get,
0843 .put = snd_emu1010_optical_out_put
0844 };
0845
0846 static int snd_emu1010_optical_in_info(struct snd_kcontrol *kcontrol,
0847 struct snd_ctl_elem_info *uinfo)
0848 {
0849 static const char * const texts[2] = {
0850 "SPDIF", "ADAT"
0851 };
0852
0853 return snd_ctl_enum_info(uinfo, 1, 2, texts);
0854 }
0855
0856 static int snd_emu1010_optical_in_get(struct snd_kcontrol *kcontrol,
0857 struct snd_ctl_elem_value *ucontrol)
0858 {
0859 struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
0860
0861 ucontrol->value.enumerated.item[0] = emu->emu1010.optical_in;
0862 return 0;
0863 }
0864
0865 static int snd_emu1010_optical_in_put(struct snd_kcontrol *kcontrol,
0866 struct snd_ctl_elem_value *ucontrol)
0867 {
0868 struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
0869 unsigned int val;
0870 u32 tmp;
0871 int change = 0;
0872
0873 val = ucontrol->value.enumerated.item[0];
0874
0875 if (val >= 2)
0876 return -EINVAL;
0877 change = (emu->emu1010.optical_in != val);
0878 if (change) {
0879 emu->emu1010.optical_in = val;
0880 tmp = (emu->emu1010.optical_in ? EMU_HANA_OPTICAL_IN_ADAT : 0) |
0881 (emu->emu1010.optical_out ? EMU_HANA_OPTICAL_OUT_ADAT : 0);
0882 snd_emu1010_fpga_write(emu, EMU_HANA_OPTICAL_TYPE, tmp);
0883 }
0884 return change;
0885 }
0886
0887 static const struct snd_kcontrol_new snd_emu1010_optical_in = {
0888 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
0889 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
0890 .name = "Optical Input Mode",
0891 .count = 1,
0892 .info = snd_emu1010_optical_in_info,
0893 .get = snd_emu1010_optical_in_get,
0894 .put = snd_emu1010_optical_in_put
0895 };
0896
0897 static int snd_audigy_i2c_capture_source_info(struct snd_kcontrol *kcontrol,
0898 struct snd_ctl_elem_info *uinfo)
0899 {
0900 #if 0
0901 static const char * const texts[4] = {
0902 "Unknown1", "Unknown2", "Mic", "Line"
0903 };
0904 #endif
0905 static const char * const texts[2] = {
0906 "Mic", "Line"
0907 };
0908
0909 return snd_ctl_enum_info(uinfo, 1, 2, texts);
0910 }
0911
0912 static int snd_audigy_i2c_capture_source_get(struct snd_kcontrol *kcontrol,
0913 struct snd_ctl_elem_value *ucontrol)
0914 {
0915 struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
0916
0917 ucontrol->value.enumerated.item[0] = emu->i2c_capture_source;
0918 return 0;
0919 }
0920
0921 static int snd_audigy_i2c_capture_source_put(struct snd_kcontrol *kcontrol,
0922 struct snd_ctl_elem_value *ucontrol)
0923 {
0924 struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
0925 unsigned int source_id;
0926 unsigned int ngain, ogain;
0927 u32 gpio;
0928 int change = 0;
0929 unsigned long flags;
0930 u32 source;
0931
0932
0933
0934
0935 source_id = ucontrol->value.enumerated.item[0];
0936
0937
0938 if (source_id >= 2)
0939 return -EINVAL;
0940 change = (emu->i2c_capture_source != source_id);
0941 if (change) {
0942 snd_emu10k1_i2c_write(emu, ADC_MUX, 0);
0943 spin_lock_irqsave(&emu->emu_lock, flags);
0944 gpio = inl(emu->port + A_IOCFG);
0945 if (source_id==0)
0946 outl(gpio | 0x4, emu->port + A_IOCFG);
0947 else
0948 outl(gpio & ~0x4, emu->port + A_IOCFG);
0949 spin_unlock_irqrestore(&emu->emu_lock, flags);
0950
0951 ngain = emu->i2c_capture_volume[source_id][0];
0952 ogain = emu->i2c_capture_volume[emu->i2c_capture_source][0];
0953 if (ngain != ogain)
0954 snd_emu10k1_i2c_write(emu, ADC_ATTEN_ADCL, ((ngain) & 0xff));
0955 ngain = emu->i2c_capture_volume[source_id][1];
0956 ogain = emu->i2c_capture_volume[emu->i2c_capture_source][1];
0957 if (ngain != ogain)
0958 snd_emu10k1_i2c_write(emu, ADC_ATTEN_ADCR, ((ngain) & 0xff));
0959
0960 source = 1 << (source_id + 2);
0961 snd_emu10k1_i2c_write(emu, ADC_MUX, source);
0962 emu->i2c_capture_source = source_id;
0963 }
0964 return change;
0965 }
0966
0967 static const struct snd_kcontrol_new snd_audigy_i2c_capture_source =
0968 {
0969 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
0970 .name = "Capture Source",
0971 .info = snd_audigy_i2c_capture_source_info,
0972 .get = snd_audigy_i2c_capture_source_get,
0973 .put = snd_audigy_i2c_capture_source_put
0974 };
0975
0976 static int snd_audigy_i2c_volume_info(struct snd_kcontrol *kcontrol,
0977 struct snd_ctl_elem_info *uinfo)
0978 {
0979 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
0980 uinfo->count = 2;
0981 uinfo->value.integer.min = 0;
0982 uinfo->value.integer.max = 255;
0983 return 0;
0984 }
0985
0986 static int snd_audigy_i2c_volume_get(struct snd_kcontrol *kcontrol,
0987 struct snd_ctl_elem_value *ucontrol)
0988 {
0989 struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
0990 unsigned int source_id;
0991
0992 source_id = kcontrol->private_value;
0993
0994
0995 if (source_id >= 2)
0996 return -EINVAL;
0997
0998 ucontrol->value.integer.value[0] = emu->i2c_capture_volume[source_id][0];
0999 ucontrol->value.integer.value[1] = emu->i2c_capture_volume[source_id][1];
1000 return 0;
1001 }
1002
1003 static 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
1014
1015 if (source_id >= 2)
1016 return -EINVAL;
1017 ogain = emu->i2c_capture_volume[source_id][0];
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];
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
1054 static 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
1060 static 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
1067 static 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
1094 static 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
1129 static 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
1141 static 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
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
1167 static 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
1177 static 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
1188 static 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
1201 static 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
1217
1218 static 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
1228 static 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
1248 static 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
1283 static 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
1294 static 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
1304 static 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
1321 static 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
1354 static 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
1365 static 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
1374 static 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
1390 static 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
1419 static 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
1431
1432 static 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
1442 static 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
1461 static 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
1491 static 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
1502 static 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
1512 static 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
1529 static 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
1558 static 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
1569 static 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
1578 static 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
1592 static 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
1616 static 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
1629 static 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
1645 static 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
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
1681 static 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
1690 static 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
1700
1701 #define snd_audigy_capture_boost_info snd_ctl_boolean_mono_info
1702
1703 static 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
1710 val = snd_ac97_read(emu->ac97, AC97_REC_GAIN);
1711 ucontrol->value.integer.value[0] = !!val;
1712 return 0;
1713 }
1714
1715 static 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
1728 static 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
1740 static 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
1748 static 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
1757 static 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
1766 static 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
1776 int 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
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
1805
1806
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
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
1832 "Wave Playback Volume", "PCM Playback Volume",
1833
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
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
1851
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
1860
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;
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;
1926 }
1927 if (emu->audigy) {
1928
1929 snd_ac97_write_cache(emu->ac97, AC97_MASTER, 0x0000);
1930
1931 snd_ac97_write_cache(emu->ac97, AC97_REC_SEL, 0x0000);
1932
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
1942
1943
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
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) {
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) {
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
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
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) {
2086
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 ;
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
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) {
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
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
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 }