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