• Home
  • Raw
  • Download

Lines Matching +full:out +full:- +full:volume +full:- +full:limit

1 // SPDX-License-Identifier: GPL-2.0-or-later
7 * Multichannel PCM support Copyright (c) Lee Revell <rlrevell@joe-job.com>
9 * Copyright (c) by James Courtier-Dutton <James@superbug.co.uk>
13 * --
16 * --
30 static const DECLARE_TLV_DB_SCALE(snd_audigy_db_scale2, -10350, 50, 1); /* WM8775 gain scale */
34 uinfo->type = SNDRV_CTL_ELEM_TYPE_IEC958; in snd_emu10k1_spdif_info()
35 uinfo->count = 1; in snd_emu10k1_spdif_info()
43 unsigned int idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id); in snd_emu10k1_spdif_get()
46 /* Limit: emu->spdif_bits */ in snd_emu10k1_spdif_get()
48 return -EINVAL; in snd_emu10k1_spdif_get()
49 spin_lock_irqsave(&emu->reg_lock, flags); in snd_emu10k1_spdif_get()
50 ucontrol->value.iec958.status[0] = (emu->spdif_bits[idx] >> 0) & 0xff; in snd_emu10k1_spdif_get()
51 ucontrol->value.iec958.status[1] = (emu->spdif_bits[idx] >> 8) & 0xff; in snd_emu10k1_spdif_get()
52 ucontrol->value.iec958.status[2] = (emu->spdif_bits[idx] >> 16) & 0xff; in snd_emu10k1_spdif_get()
53 ucontrol->value.iec958.status[3] = (emu->spdif_bits[idx] >> 24) & 0xff; in snd_emu10k1_spdif_get()
54 spin_unlock_irqrestore(&emu->reg_lock, flags); in snd_emu10k1_spdif_get()
61 ucontrol->value.iec958.status[0] = 0xff; in snd_emu10k1_spdif_get_mask()
62 ucontrol->value.iec958.status[1] = 0xff; in snd_emu10k1_spdif_get_mask()
63 ucontrol->value.iec958.status[2] = 0xff; in snd_emu10k1_spdif_get_mask()
64 ucontrol->value.iec958.status[3] = 0xff; in snd_emu10k1_spdif_get_mask()
296 * Data destinations - physical EMU outputs.
349 * Data destinations - HANA outputs going to Alice2 (audigy) for
383 if (emu->card_capabilities->emu_model == EMU_MODEL_EMU1616) in snd_emu1010_input_output_source_info()
395 channel = (kcontrol->private_value) & 0xff; in snd_emu1010_output_source_get()
396 /* Limit: emu1010_output_dst, emu->emu1010.output_source */ in snd_emu1010_output_source_get()
398 (emu->card_capabilities->emu_model == EMU_MODEL_EMU1616 && in snd_emu1010_output_source_get()
400 return -EINVAL; in snd_emu1010_output_source_get()
401 ucontrol->value.enumerated.item[0] = emu->emu1010.output_source[channel]; in snd_emu1010_output_source_get()
412 val = ucontrol->value.enumerated.item[0]; in snd_emu1010_output_source_put()
414 (emu->card_capabilities->emu_model == EMU_MODEL_EMU1616 && in snd_emu1010_output_source_put()
416 return -EINVAL; in snd_emu1010_output_source_put()
417 channel = (kcontrol->private_value) & 0xff; in snd_emu1010_output_source_put()
418 /* Limit: emu1010_output_dst, emu->emu1010.output_source */ in snd_emu1010_output_source_put()
420 (emu->card_capabilities->emu_model == EMU_MODEL_EMU1616 && in snd_emu1010_output_source_put()
422 return -EINVAL; in snd_emu1010_output_source_put()
423 if (emu->emu1010.output_source[channel] == val) in snd_emu1010_output_source_put()
425 emu->emu1010.output_source[channel] = val; in snd_emu1010_output_source_put()
426 if (emu->card_capabilities->emu_model == EMU_MODEL_EMU1616) in snd_emu1010_output_source_put()
441 channel = (kcontrol->private_value) & 0xff; in snd_emu1010_input_source_get()
442 /* Limit: emu1010_input_dst, emu->emu1010.input_source */ in snd_emu1010_input_source_get()
444 return -EINVAL; in snd_emu1010_input_source_get()
445 ucontrol->value.enumerated.item[0] = emu->emu1010.input_source[channel]; in snd_emu1010_input_source_get()
456 val = ucontrol->value.enumerated.item[0]; in snd_emu1010_input_source_put()
458 (emu->card_capabilities->emu_model == EMU_MODEL_EMU1616 && in snd_emu1010_input_source_put()
460 return -EINVAL; in snd_emu1010_input_source_put()
461 channel = (kcontrol->private_value) & 0xff; in snd_emu1010_input_source_put()
462 /* Limit: emu1010_input_dst, emu->emu1010.input_source */ in snd_emu1010_input_source_put()
464 return -EINVAL; in snd_emu1010_input_source_put()
465 if (emu->emu1010.input_source[channel] == val) in snd_emu1010_input_source_put()
467 emu->emu1010.input_source[channel] = val; in snd_emu1010_input_source_put()
468 if (emu->card_capabilities->emu_model == EMU_MODEL_EMU1616) in snd_emu1010_input_source_put()
580 unsigned int mask = kcontrol->private_value & 0xff; in snd_emu1010_adc_pads_get()
581 ucontrol->value.integer.value[0] = (emu->emu1010.adc_pads & mask) ? 1 : 0; in snd_emu1010_adc_pads_get()
588 unsigned int mask = kcontrol->private_value & 0xff; in snd_emu1010_adc_pads_put()
590 val = ucontrol->value.integer.value[0]; in snd_emu1010_adc_pads_put()
591 cache = emu->emu1010.adc_pads; in snd_emu1010_adc_pads_put()
596 if (cache != emu->emu1010.adc_pads) { in snd_emu1010_adc_pads_put()
598 emu->emu1010.adc_pads = cache; in snd_emu1010_adc_pads_put()
628 unsigned int mask = kcontrol->private_value & 0xff; in snd_emu1010_dac_pads_get()
629 ucontrol->value.integer.value[0] = (emu->emu1010.dac_pads & mask) ? 1 : 0; in snd_emu1010_dac_pads_get()
636 unsigned int mask = kcontrol->private_value & 0xff; in snd_emu1010_dac_pads_put()
638 val = ucontrol->value.integer.value[0]; in snd_emu1010_dac_pads_put()
639 cache = emu->emu1010.dac_pads; in snd_emu1010_dac_pads_put()
644 if (cache != emu->emu1010.dac_pads) { in snd_emu1010_dac_pads_put()
646 emu->emu1010.dac_pads = cache; in snd_emu1010_dac_pads_put()
688 ucontrol->value.enumerated.item[0] = emu->emu1010.internal_clock; in snd_emu1010_internal_clock_get()
699 val = ucontrol->value.enumerated.item[0] ; in snd_emu1010_internal_clock_put()
700 /* Limit: uinfo->value.enumerated.items = 4; */ in snd_emu1010_internal_clock_put()
702 return -EINVAL; in snd_emu1010_internal_clock_put()
703 change = (emu->emu1010.internal_clock != val); in snd_emu1010_internal_clock_put()
705 emu->emu1010.internal_clock = val; in snd_emu1010_internal_clock_put()
810 ucontrol->value.enumerated.item[0] = emu->emu1010.optical_out; in snd_emu1010_optical_out_get()
822 val = ucontrol->value.enumerated.item[0]; in snd_emu1010_optical_out_put()
823 /* Limit: uinfo->value.enumerated.items = 2; */ in snd_emu1010_optical_out_put()
825 return -EINVAL; in snd_emu1010_optical_out_put()
826 change = (emu->emu1010.optical_out != val); in snd_emu1010_optical_out_put()
828 emu->emu1010.optical_out = val; in snd_emu1010_optical_out_put()
829 tmp = (emu->emu1010.optical_in ? EMU_HANA_OPTICAL_IN_ADAT : 0) | in snd_emu1010_optical_out_put()
830 (emu->emu1010.optical_out ? EMU_HANA_OPTICAL_OUT_ADAT : 0); in snd_emu1010_optical_out_put()
861 ucontrol->value.enumerated.item[0] = emu->emu1010.optical_in; in snd_emu1010_optical_in_get()
873 val = ucontrol->value.enumerated.item[0]; in snd_emu1010_optical_in_put()
874 /* Limit: uinfo->value.enumerated.items = 2; */ in snd_emu1010_optical_in_put()
876 return -EINVAL; in snd_emu1010_optical_in_put()
877 change = (emu->emu1010.optical_in != val); in snd_emu1010_optical_in_put()
879 emu->emu1010.optical_in = val; in snd_emu1010_optical_in_put()
880 tmp = (emu->emu1010.optical_in ? EMU_HANA_OPTICAL_IN_ADAT : 0) | in snd_emu1010_optical_in_put()
881 (emu->emu1010.optical_out ? EMU_HANA_OPTICAL_OUT_ADAT : 0); in snd_emu1010_optical_in_put()
917 ucontrol->value.enumerated.item[0] = emu->i2c_capture_source; in snd_audigy_i2c_capture_source_get()
932 * update the capture volume from the cached value in snd_audigy_i2c_capture_source_put()
935 source_id = ucontrol->value.enumerated.item[0]; in snd_audigy_i2c_capture_source_put()
936 /* Limit: uinfo->value.enumerated.items = 2; */ in snd_audigy_i2c_capture_source_put()
937 /* emu->i2c_capture_volume */ in snd_audigy_i2c_capture_source_put()
939 return -EINVAL; in snd_audigy_i2c_capture_source_put()
940 change = (emu->i2c_capture_source != source_id); in snd_audigy_i2c_capture_source_put()
943 spin_lock_irqsave(&emu->emu_lock, flags); in snd_audigy_i2c_capture_source_put()
944 gpio = inl(emu->port + A_IOCFG); in snd_audigy_i2c_capture_source_put()
946 outl(gpio | 0x4, emu->port + A_IOCFG); in snd_audigy_i2c_capture_source_put()
948 outl(gpio & ~0x4, emu->port + A_IOCFG); in snd_audigy_i2c_capture_source_put()
949 spin_unlock_irqrestore(&emu->emu_lock, flags); in snd_audigy_i2c_capture_source_put()
951 ngain = emu->i2c_capture_volume[source_id][0]; /* Left */ in snd_audigy_i2c_capture_source_put()
952 ogain = emu->i2c_capture_volume[emu->i2c_capture_source][0]; /* Left */ in snd_audigy_i2c_capture_source_put()
955 ngain = emu->i2c_capture_volume[source_id][1]; /* Right */ in snd_audigy_i2c_capture_source_put()
956 ogain = emu->i2c_capture_volume[emu->i2c_capture_source][1]; /* Right */ in snd_audigy_i2c_capture_source_put()
962 emu->i2c_capture_source = source_id; in snd_audigy_i2c_capture_source_put()
979 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; in snd_audigy_i2c_volume_info()
980 uinfo->count = 2; in snd_audigy_i2c_volume_info()
981 uinfo->value.integer.min = 0; in snd_audigy_i2c_volume_info()
982 uinfo->value.integer.max = 255; in snd_audigy_i2c_volume_info()
992 source_id = kcontrol->private_value; in snd_audigy_i2c_volume_get()
993 /* Limit: emu->i2c_capture_volume */ in snd_audigy_i2c_volume_get()
994 /* capture_source: uinfo->value.enumerated.items = 2 */ in snd_audigy_i2c_volume_get()
996 return -EINVAL; in snd_audigy_i2c_volume_get()
998 ucontrol->value.integer.value[0] = emu->i2c_capture_volume[source_id][0]; in snd_audigy_i2c_volume_get()
999 ucontrol->value.integer.value[1] = emu->i2c_capture_volume[source_id][1]; in snd_audigy_i2c_volume_get()
1012 source_id = kcontrol->private_value; in snd_audigy_i2c_volume_put()
1013 /* Limit: emu->i2c_capture_volume */ in snd_audigy_i2c_volume_put()
1014 /* capture_source: uinfo->value.enumerated.items = 2 */ in snd_audigy_i2c_volume_put()
1016 return -EINVAL; in snd_audigy_i2c_volume_put()
1017 ogain = emu->i2c_capture_volume[source_id][0]; /* Left */ in snd_audigy_i2c_volume_put()
1018 ngain = ucontrol->value.integer.value[0]; in snd_audigy_i2c_volume_put()
1022 if (emu->i2c_capture_source == source_id) in snd_audigy_i2c_volume_put()
1024 emu->i2c_capture_volume[source_id][0] = ngain; in snd_audigy_i2c_volume_put()
1027 ogain = emu->i2c_capture_volume[source_id][1]; /* Right */ in snd_audigy_i2c_volume_put()
1028 ngain = ucontrol->value.integer.value[1]; in snd_audigy_i2c_volume_put()
1032 if (emu->i2c_capture_source == source_id) in snd_audigy_i2c_volume_put()
1034 emu->i2c_capture_volume[source_id][1] = ngain; in snd_audigy_i2c_volume_put()
1055 I2C_VOLUME("Mic Capture Volume", 0),
1056 I2C_VOLUME("Line Capture Volume", 0)
1075 spin_lock_irqsave(&emu->reg_lock, flags);
1079 ucontrol->value.enumerated.item[0] = 0;
1082 ucontrol->value.enumerated.item[0] = 1;
1085 ucontrol->value.enumerated.item[0] = 2;
1088 ucontrol->value.enumerated.item[0] = 1;
1090 spin_unlock_irqrestore(&emu->reg_lock, flags);
1102 switch(ucontrol->value.enumerated.item[0]) {
1118 spin_lock_irqsave(&emu->reg_lock, flags);
1124 spin_unlock_irqrestore(&emu->reg_lock, flags);
1144 unsigned int idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id); in snd_emu10k1_spdif_put()
1149 /* Limit: emu->spdif_bits */ in snd_emu10k1_spdif_put()
1151 return -EINVAL; in snd_emu10k1_spdif_put()
1152 val = (ucontrol->value.iec958.status[0] << 0) | in snd_emu10k1_spdif_put()
1153 (ucontrol->value.iec958.status[1] << 8) | in snd_emu10k1_spdif_put()
1154 (ucontrol->value.iec958.status[2] << 16) | in snd_emu10k1_spdif_put()
1155 (ucontrol->value.iec958.status[3] << 24); in snd_emu10k1_spdif_put()
1156 spin_lock_irqsave(&emu->reg_lock, flags); in snd_emu10k1_spdif_put()
1157 change = val != emu->spdif_bits[idx]; in snd_emu10k1_spdif_put()
1160 emu->spdif_bits[idx] = val; in snd_emu10k1_spdif_put()
1162 spin_unlock_irqrestore(&emu->reg_lock, flags); in snd_emu10k1_spdif_put()
1189 if (emu->audigy) { in update_emu10k1_fxrt()
1200 static void update_emu10k1_send_volume(struct snd_emu10k1 *emu, int voice, unsigned char *volume) in update_emu10k1_send_volume() argument
1202 snd_emu10k1_ptr_write(emu, PTRX_FXSENDAMOUNT_A, voice, volume[0]); in update_emu10k1_send_volume()
1203 snd_emu10k1_ptr_write(emu, PTRX_FXSENDAMOUNT_B, voice, volume[1]); in update_emu10k1_send_volume()
1204 snd_emu10k1_ptr_write(emu, PSST_FXSENDAMOUNT_C, voice, volume[2]); in update_emu10k1_send_volume()
1205 snd_emu10k1_ptr_write(emu, DSL_FXSENDAMOUNT_D, voice, volume[3]); in update_emu10k1_send_volume()
1206 if (emu->audigy) { in update_emu10k1_send_volume()
1207 unsigned int val = ((unsigned int)volume[4] << 24) | in update_emu10k1_send_volume()
1208 ((unsigned int)volume[5] << 16) | in update_emu10k1_send_volume()
1209 ((unsigned int)volume[6] << 8) | in update_emu10k1_send_volume()
1210 (unsigned int)volume[7]; in update_emu10k1_send_volume()
1220 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; in snd_emu10k1_send_routing_info()
1221 uinfo->count = emu->audigy ? 3*8 : 3*4; in snd_emu10k1_send_routing_info()
1222 uinfo->value.integer.min = 0; in snd_emu10k1_send_routing_info()
1223 uinfo->value.integer.max = emu->audigy ? 0x3f : 0x0f; in snd_emu10k1_send_routing_info()
1233 &emu->pcm_mixer[snd_ctl_get_ioffidx(kcontrol, &ucontrol->id)]; in snd_emu10k1_send_routing_get()
1235 int num_efx = emu->audigy ? 8 : 4; in snd_emu10k1_send_routing_get()
1236 int mask = emu->audigy ? 0x3f : 0x0f; in snd_emu10k1_send_routing_get()
1238 spin_lock_irqsave(&emu->reg_lock, flags); in snd_emu10k1_send_routing_get()
1241 ucontrol->value.integer.value[(voice * num_efx) + idx] = in snd_emu10k1_send_routing_get()
1242 mix->send_routing[voice][idx] & mask; in snd_emu10k1_send_routing_get()
1243 spin_unlock_irqrestore(&emu->reg_lock, flags); in snd_emu10k1_send_routing_get()
1253 &emu->pcm_mixer[snd_ctl_get_ioffidx(kcontrol, &ucontrol->id)]; in snd_emu10k1_send_routing_put()
1255 int num_efx = emu->audigy ? 8 : 4; in snd_emu10k1_send_routing_put()
1256 int mask = emu->audigy ? 0x3f : 0x0f; in snd_emu10k1_send_routing_put()
1258 spin_lock_irqsave(&emu->reg_lock, flags); in snd_emu10k1_send_routing_put()
1261 val = ucontrol->value.integer.value[(voice * num_efx) + idx] & mask; in snd_emu10k1_send_routing_put()
1262 if (mix->send_routing[voice][idx] != val) { in snd_emu10k1_send_routing_put()
1263 mix->send_routing[voice][idx] = val; in snd_emu10k1_send_routing_put()
1267 if (change && mix->epcm) { in snd_emu10k1_send_routing_put()
1268 if (mix->epcm->voices[0] && mix->epcm->voices[1]) { in snd_emu10k1_send_routing_put()
1269 update_emu10k1_fxrt(emu, mix->epcm->voices[0]->number, in snd_emu10k1_send_routing_put()
1270 &mix->send_routing[1][0]); in snd_emu10k1_send_routing_put()
1271 update_emu10k1_fxrt(emu, mix->epcm->voices[1]->number, in snd_emu10k1_send_routing_put()
1272 &mix->send_routing[2][0]); in snd_emu10k1_send_routing_put()
1273 } else if (mix->epcm->voices[0]) { in snd_emu10k1_send_routing_put()
1274 update_emu10k1_fxrt(emu, mix->epcm->voices[0]->number, in snd_emu10k1_send_routing_put()
1275 &mix->send_routing[0][0]); in snd_emu10k1_send_routing_put()
1278 spin_unlock_irqrestore(&emu->reg_lock, flags); in snd_emu10k1_send_routing_put()
1296 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; in snd_emu10k1_send_volume_info()
1297 uinfo->count = emu->audigy ? 3*8 : 3*4; in snd_emu10k1_send_volume_info()
1298 uinfo->value.integer.min = 0; in snd_emu10k1_send_volume_info()
1299 uinfo->value.integer.max = 255; in snd_emu10k1_send_volume_info()
1309 &emu->pcm_mixer[snd_ctl_get_ioffidx(kcontrol, &ucontrol->id)]; in snd_emu10k1_send_volume_get()
1311 int num_efx = emu->audigy ? 8 : 4; in snd_emu10k1_send_volume_get()
1313 spin_lock_irqsave(&emu->reg_lock, flags); in snd_emu10k1_send_volume_get()
1315 ucontrol->value.integer.value[idx] = mix->send_volume[idx/num_efx][idx%num_efx]; in snd_emu10k1_send_volume_get()
1316 spin_unlock_irqrestore(&emu->reg_lock, flags); in snd_emu10k1_send_volume_get()
1326 &emu->pcm_mixer[snd_ctl_get_ioffidx(kcontrol, &ucontrol->id)]; in snd_emu10k1_send_volume_put()
1328 int num_efx = emu->audigy ? 8 : 4; in snd_emu10k1_send_volume_put()
1330 spin_lock_irqsave(&emu->reg_lock, flags); in snd_emu10k1_send_volume_put()
1332 val = ucontrol->value.integer.value[idx] & 255; in snd_emu10k1_send_volume_put()
1333 if (mix->send_volume[idx/num_efx][idx%num_efx] != val) { in snd_emu10k1_send_volume_put()
1334 mix->send_volume[idx/num_efx][idx%num_efx] = val; in snd_emu10k1_send_volume_put()
1338 if (change && mix->epcm) { in snd_emu10k1_send_volume_put()
1339 if (mix->epcm->voices[0] && mix->epcm->voices[1]) { in snd_emu10k1_send_volume_put()
1340 update_emu10k1_send_volume(emu, mix->epcm->voices[0]->number, in snd_emu10k1_send_volume_put()
1341 &mix->send_volume[1][0]); in snd_emu10k1_send_volume_put()
1342 update_emu10k1_send_volume(emu, mix->epcm->voices[1]->number, in snd_emu10k1_send_volume_put()
1343 &mix->send_volume[2][0]); in snd_emu10k1_send_volume_put()
1344 } else if (mix->epcm->voices[0]) { in snd_emu10k1_send_volume_put()
1345 update_emu10k1_send_volume(emu, mix->epcm->voices[0]->number, in snd_emu10k1_send_volume_put()
1346 &mix->send_volume[0][0]); in snd_emu10k1_send_volume_put()
1349 spin_unlock_irqrestore(&emu->reg_lock, flags); in snd_emu10k1_send_volume_put()
1357 .name = "EMU10K1 PCM Send Volume",
1366 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; in snd_emu10k1_attn_info()
1367 uinfo->count = 3; in snd_emu10k1_attn_info()
1368 uinfo->value.integer.min = 0; in snd_emu10k1_attn_info()
1369 uinfo->value.integer.max = 0xffff; in snd_emu10k1_attn_info()
1378 &emu->pcm_mixer[snd_ctl_get_ioffidx(kcontrol, &ucontrol->id)]; in snd_emu10k1_attn_get()
1382 spin_lock_irqsave(&emu->reg_lock, flags); in snd_emu10k1_attn_get()
1384 ucontrol->value.integer.value[idx] = mix->attn[idx]; in snd_emu10k1_attn_get()
1385 spin_unlock_irqrestore(&emu->reg_lock, flags); in snd_emu10k1_attn_get()
1395 &emu->pcm_mixer[snd_ctl_get_ioffidx(kcontrol, &ucontrol->id)]; in snd_emu10k1_attn_put()
1398 spin_lock_irqsave(&emu->reg_lock, flags); in snd_emu10k1_attn_put()
1400 val = ucontrol->value.integer.value[idx] & 0xffff; in snd_emu10k1_attn_put()
1401 if (mix->attn[idx] != val) { in snd_emu10k1_attn_put()
1402 mix->attn[idx] = val; in snd_emu10k1_attn_put()
1406 if (change && mix->epcm) { in snd_emu10k1_attn_put()
1407 if (mix->epcm->voices[0] && mix->epcm->voices[1]) { in snd_emu10k1_attn_put()
1408 snd_emu10k1_ptr_write(emu, VTFT_VOLUMETARGET, mix->epcm->voices[0]->number, mix->attn[1]); in snd_emu10k1_attn_put()
1409 snd_emu10k1_ptr_write(emu, VTFT_VOLUMETARGET, mix->epcm->voices[1]->number, mix->attn[2]); in snd_emu10k1_attn_put()
1410 } else if (mix->epcm->voices[0]) { in snd_emu10k1_attn_put()
1411 snd_emu10k1_ptr_write(emu, VTFT_VOLUMETARGET, mix->epcm->voices[0]->number, mix->attn[0]); in snd_emu10k1_attn_put()
1414 spin_unlock_irqrestore(&emu->reg_lock, flags); in snd_emu10k1_attn_put()
1422 .name = "EMU10K1 PCM Volume",
1434 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; in snd_emu10k1_efx_send_routing_info()
1435 uinfo->count = emu->audigy ? 8 : 4; in snd_emu10k1_efx_send_routing_info()
1436 uinfo->value.integer.min = 0; in snd_emu10k1_efx_send_routing_info()
1437 uinfo->value.integer.max = emu->audigy ? 0x3f : 0x0f; in snd_emu10k1_efx_send_routing_info()
1447 &emu->efx_pcm_mixer[snd_ctl_get_ioffidx(kcontrol, &ucontrol->id)]; in snd_emu10k1_efx_send_routing_get()
1449 int num_efx = emu->audigy ? 8 : 4; in snd_emu10k1_efx_send_routing_get()
1450 int mask = emu->audigy ? 0x3f : 0x0f; in snd_emu10k1_efx_send_routing_get()
1452 spin_lock_irqsave(&emu->reg_lock, flags); in snd_emu10k1_efx_send_routing_get()
1454 ucontrol->value.integer.value[idx] = in snd_emu10k1_efx_send_routing_get()
1455 mix->send_routing[0][idx] & mask; in snd_emu10k1_efx_send_routing_get()
1456 spin_unlock_irqrestore(&emu->reg_lock, flags); in snd_emu10k1_efx_send_routing_get()
1465 int ch = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id); in snd_emu10k1_efx_send_routing_put()
1466 struct snd_emu10k1_pcm_mixer *mix = &emu->efx_pcm_mixer[ch]; in snd_emu10k1_efx_send_routing_put()
1468 int num_efx = emu->audigy ? 8 : 4; in snd_emu10k1_efx_send_routing_put()
1469 int mask = emu->audigy ? 0x3f : 0x0f; in snd_emu10k1_efx_send_routing_put()
1471 spin_lock_irqsave(&emu->reg_lock, flags); in snd_emu10k1_efx_send_routing_put()
1473 val = ucontrol->value.integer.value[idx] & mask; in snd_emu10k1_efx_send_routing_put()
1474 if (mix->send_routing[0][idx] != val) { in snd_emu10k1_efx_send_routing_put()
1475 mix->send_routing[0][idx] = val; in snd_emu10k1_efx_send_routing_put()
1480 if (change && mix->epcm) { in snd_emu10k1_efx_send_routing_put()
1481 if (mix->epcm->voices[ch]) { in snd_emu10k1_efx_send_routing_put()
1482 update_emu10k1_fxrt(emu, mix->epcm->voices[ch]->number, in snd_emu10k1_efx_send_routing_put()
1483 &mix->send_routing[0][0]); in snd_emu10k1_efx_send_routing_put()
1486 spin_unlock_irqrestore(&emu->reg_lock, flags); in snd_emu10k1_efx_send_routing_put()
1504 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; in snd_emu10k1_efx_send_volume_info()
1505 uinfo->count = emu->audigy ? 8 : 4; in snd_emu10k1_efx_send_volume_info()
1506 uinfo->value.integer.min = 0; in snd_emu10k1_efx_send_volume_info()
1507 uinfo->value.integer.max = 255; in snd_emu10k1_efx_send_volume_info()
1517 &emu->efx_pcm_mixer[snd_ctl_get_ioffidx(kcontrol, &ucontrol->id)]; in snd_emu10k1_efx_send_volume_get()
1519 int num_efx = emu->audigy ? 8 : 4; in snd_emu10k1_efx_send_volume_get()
1521 spin_lock_irqsave(&emu->reg_lock, flags); in snd_emu10k1_efx_send_volume_get()
1523 ucontrol->value.integer.value[idx] = mix->send_volume[0][idx]; in snd_emu10k1_efx_send_volume_get()
1524 spin_unlock_irqrestore(&emu->reg_lock, flags); in snd_emu10k1_efx_send_volume_get()
1533 int ch = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id); in snd_emu10k1_efx_send_volume_put()
1534 struct snd_emu10k1_pcm_mixer *mix = &emu->efx_pcm_mixer[ch]; in snd_emu10k1_efx_send_volume_put()
1536 int num_efx = emu->audigy ? 8 : 4; in snd_emu10k1_efx_send_volume_put()
1538 spin_lock_irqsave(&emu->reg_lock, flags); in snd_emu10k1_efx_send_volume_put()
1540 val = ucontrol->value.integer.value[idx] & 255; in snd_emu10k1_efx_send_volume_put()
1541 if (mix->send_volume[0][idx] != val) { in snd_emu10k1_efx_send_volume_put()
1542 mix->send_volume[0][idx] = val; in snd_emu10k1_efx_send_volume_put()
1546 if (change && mix->epcm) { in snd_emu10k1_efx_send_volume_put()
1547 if (mix->epcm->voices[ch]) { in snd_emu10k1_efx_send_volume_put()
1548 update_emu10k1_send_volume(emu, mix->epcm->voices[ch]->number, in snd_emu10k1_efx_send_volume_put()
1549 &mix->send_volume[0][0]); in snd_emu10k1_efx_send_volume_put()
1552 spin_unlock_irqrestore(&emu->reg_lock, flags); in snd_emu10k1_efx_send_volume_put()
1561 .name = "Multichannel PCM Send Volume",
1570 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; in snd_emu10k1_efx_attn_info()
1571 uinfo->count = 1; in snd_emu10k1_efx_attn_info()
1572 uinfo->value.integer.min = 0; in snd_emu10k1_efx_attn_info()
1573 uinfo->value.integer.max = 0xffff; in snd_emu10k1_efx_attn_info()
1582 &emu->efx_pcm_mixer[snd_ctl_get_ioffidx(kcontrol, &ucontrol->id)]; in snd_emu10k1_efx_attn_get()
1585 spin_lock_irqsave(&emu->reg_lock, flags); in snd_emu10k1_efx_attn_get()
1586 ucontrol->value.integer.value[0] = mix->attn[0]; in snd_emu10k1_efx_attn_get()
1587 spin_unlock_irqrestore(&emu->reg_lock, flags); in snd_emu10k1_efx_attn_get()
1596 int ch = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id); in snd_emu10k1_efx_attn_put()
1597 struct snd_emu10k1_pcm_mixer *mix = &emu->efx_pcm_mixer[ch]; in snd_emu10k1_efx_attn_put()
1600 spin_lock_irqsave(&emu->reg_lock, flags); in snd_emu10k1_efx_attn_put()
1601 val = ucontrol->value.integer.value[0] & 0xffff; in snd_emu10k1_efx_attn_put()
1602 if (mix->attn[0] != val) { in snd_emu10k1_efx_attn_put()
1603 mix->attn[0] = val; in snd_emu10k1_efx_attn_put()
1606 if (change && mix->epcm) { in snd_emu10k1_efx_attn_put()
1607 if (mix->epcm->voices[ch]) { in snd_emu10k1_efx_attn_put()
1608 snd_emu10k1_ptr_write(emu, VTFT_VOLUMETARGET, mix->epcm->voices[ch]->number, mix->attn[0]); in snd_emu10k1_efx_attn_put()
1611 spin_unlock_irqrestore(&emu->reg_lock, flags); in snd_emu10k1_efx_attn_put()
1619 .name = "Multichannel PCM Volume",
1633 if (emu->audigy) in snd_emu10k1_shared_spdif_get()
1634 ucontrol->value.integer.value[0] = inl(emu->port + A_IOCFG) & A_IOCFG_GPOUT0 ? 1 : 0; in snd_emu10k1_shared_spdif_get()
1636 ucontrol->value.integer.value[0] = inl(emu->port + HCFG) & HCFG_GPOUT0 ? 1 : 0; in snd_emu10k1_shared_spdif_get()
1637 if (emu->card_capabilities->invert_shared_spdif) in snd_emu10k1_shared_spdif_get()
1638 ucontrol->value.integer.value[0] = in snd_emu10k1_shared_spdif_get()
1639 !ucontrol->value.integer.value[0]; in snd_emu10k1_shared_spdif_get()
1652 sw = ucontrol->value.integer.value[0]; in snd_emu10k1_shared_spdif_put()
1653 if (emu->card_capabilities->invert_shared_spdif) in snd_emu10k1_shared_spdif_put()
1655 spin_lock_irqsave(&emu->reg_lock, flags); in snd_emu10k1_shared_spdif_put()
1656 if ( emu->card_capabilities->i2c_adc) { in snd_emu10k1_shared_spdif_put()
1658 } else if (emu->audigy) { in snd_emu10k1_shared_spdif_put()
1659 reg = inl(emu->port + A_IOCFG); in snd_emu10k1_shared_spdif_put()
1665 outl(reg | val, emu->port + A_IOCFG); in snd_emu10k1_shared_spdif_put()
1668 reg = inl(emu->port + HCFG); in snd_emu10k1_shared_spdif_put()
1674 outl(reg | val, emu->port + HCFG); in snd_emu10k1_shared_spdif_put()
1676 spin_unlock_irqrestore(&emu->reg_lock, flags); in snd_emu10k1_shared_spdif_put()
1698 /* workaround for too low volume on Audigy due to 16bit/24bit conversion */
1709 val = snd_ac97_read(emu->ac97, AC97_REC_GAIN); in snd_audigy_capture_boost_get()
1710 ucontrol->value.integer.value[0] = !!val; in snd_audigy_capture_boost_get()
1720 if (ucontrol->value.integer.value[0]) in snd_audigy_capture_boost_put()
1724 return snd_ac97_update(emu->ac97, AC97_REC_GAIN, val); in snd_audigy_capture_boost_put()
1741 struct snd_emu10k1 *emu = ac97->private_data; in snd_emu10k1_mixer_free_ac97()
1742 emu->ac97 = NULL; in snd_emu10k1_mixer_free_ac97()
1769 strcpy(kctl->id.name, dst); in rename_ctl()
1772 return -ENOENT; in rename_ctl()
1780 struct snd_card *card = emu->card; in snd_emu10k1_mixer()
1785 "Master Mono Playback Volume", in snd_emu10k1_mixer()
1786 "PCM Out Path & Mute", in snd_emu10k1_mixer()
1789 "Surround Playback Volume", in snd_emu10k1_mixer()
1791 "Center Playback Volume", in snd_emu10k1_mixer()
1793 "LFE Playback Volume", in snd_emu10k1_mixer()
1797 "Surround Digital Playback Volume", "Surround Playback Volume", in snd_emu10k1_mixer()
1798 "Center Digital Playback Volume", "Center Playback Volume", in snd_emu10k1_mixer()
1799 "LFE Digital Playback Volume", "LFE Playback Volume", in snd_emu10k1_mixer()
1807 "PCM Playback Volume", in snd_emu10k1_mixer()
1809 "Master Playback Volume", in snd_emu10k1_mixer()
1810 "PCM Out Path & Mute", in snd_emu10k1_mixer()
1815 "Capture Volume", in snd_emu10k1_mixer()
1818 "Headphone Playback Volume", in snd_emu10k1_mixer()
1819 "3D Control - Center", in snd_emu10k1_mixer()
1820 "3D Control - Depth", in snd_emu10k1_mixer()
1821 "3D Control - Switch", in snd_emu10k1_mixer()
1823 "Video Playback Volume", in snd_emu10k1_mixer()
1825 "Mic Playback Volume", in snd_emu10k1_mixer()
1831 "Wave Playback Volume", "PCM Playback Volume", in snd_emu10k1_mixer()
1832 /* "Wave Capture Volume", "PCM Capture Volume", */ in snd_emu10k1_mixer()
1833 "Wave Master Playback Volume", "Master Playback Volume", in snd_emu10k1_mixer()
1834 "AMic Playback Volume", "Mic Playback Volume", in snd_emu10k1_mixer()
1836 "Master Mono Playback Volume", "Phone Output Playback Volume", in snd_emu10k1_mixer()
1840 //"Analog Mix Capture Volume","OLD Analog Mix Capture Volume", in snd_emu10k1_mixer()
1841 "Line Capture Volume", "Analog Mix Capture Volume", in snd_emu10k1_mixer()
1842 "Wave Playback Volume", "OLD PCM Playback Volume", in snd_emu10k1_mixer()
1843 "Wave Master Playback Volume", "Master Playback Volume", in snd_emu10k1_mixer()
1844 "AMic Playback Volume", "Old Mic Playback Volume", in snd_emu10k1_mixer()
1845 "CD Capture Volume", "IEC958 Optical Capture Volume", in snd_emu10k1_mixer()
1851 "Mic Capture Volume", in snd_emu10k1_mixer()
1852 "Analog Mix Capture Volume", in snd_emu10k1_mixer()
1853 "Aux Capture Volume", in snd_emu10k1_mixer()
1854 "IEC958 Optical Capture Volume", in snd_emu10k1_mixer()
1861 "PCM Playback Volume", in snd_emu10k1_mixer()
1864 "Capture Volume", in snd_emu10k1_mixer()
1865 "Mic Capture Volume", in snd_emu10k1_mixer()
1867 "Headphone Playback Volume", in snd_emu10k1_mixer()
1868 "3D Control - Center", in snd_emu10k1_mixer()
1869 "3D Control - Depth", in snd_emu10k1_mixer()
1870 "3D Control - Switch", in snd_emu10k1_mixer()
1871 "Line2 Playback Volume", in snd_emu10k1_mixer()
1872 "Line2 Capture Volume", in snd_emu10k1_mixer()
1877 "Master Playback Volume", "Master Capture Volume", in snd_emu10k1_mixer()
1878 "Wave Master Playback Volume", "Master Playback Volume", in snd_emu10k1_mixer()
1880 "Beep Playback Volume", "Beep Capture Volume", in snd_emu10k1_mixer()
1882 "Phone Playback Volume", "Phone Capture Volume", in snd_emu10k1_mixer()
1884 "Mic Playback Volume", "Mic Capture Volume", in snd_emu10k1_mixer()
1886 "Line Playback Volume", "Line Capture Volume", in snd_emu10k1_mixer()
1888 "CD Playback Volume", "CD Capture Volume", in snd_emu10k1_mixer()
1890 "Aux Playback Volume", "Aux Capture Volume", in snd_emu10k1_mixer()
1892 "Video Playback Volume", "Video Capture Volume", in snd_emu10k1_mixer()
1894 "Master Mono Playback Volume", "Phone Output Playback Volume", in snd_emu10k1_mixer()
1898 if (emu->card_capabilities->ac97_chip) { in snd_emu10k1_mixer()
1906 if ((err = snd_ac97_bus(emu->card, 0, &ops, NULL, &pbus)) < 0) in snd_emu10k1_mixer()
1908 pbus->no_vra = 1; /* we don't need VRA */ in snd_emu10k1_mixer()
1914 if ((err = snd_ac97_mixer(pbus, &ac97, &emu->ac97)) < 0) { in snd_emu10k1_mixer()
1915 if (emu->card_capabilities->ac97_chip == 1) in snd_emu10k1_mixer()
1917 dev_info(emu->card->dev, in snd_emu10k1_mixer()
1919 dev_info(emu->card->dev, in snd_emu10k1_mixer()
1921 snd_device_free(emu->card, pbus); in snd_emu10k1_mixer()
1924 if (emu->audigy) { in snd_emu10k1_mixer()
1925 /* set master volume to 0 dB */ in snd_emu10k1_mixer()
1926 snd_ac97_write_cache(emu->ac97, AC97_MASTER, 0x0000); in snd_emu10k1_mixer()
1928 snd_ac97_write_cache(emu->ac97, AC97_REC_SEL, 0x0000); in snd_emu10k1_mixer()
1930 snd_ac97_update_bits(emu->ac97, AC97_GENERAL_PURPOSE, in snd_emu10k1_mixer()
1932 if (emu->card_capabilities->adc_1361t) in snd_emu10k1_mixer()
1939 * James Courtier-Dutton <James@superbug.demon.co.uk> in snd_emu10k1_mixer()
1942 if (emu->ac97->id == AC97_ID_STAC9758) { in snd_emu10k1_mixer()
1943 emu->rear_ac97 = 1; in snd_emu10k1_mixer()
1945 snd_ac97_write_cache(emu->ac97, AC97_HEADPHONE, 0x0202); in snd_emu10k1_mixer()
1946 remove_ctl(card,"Front Playback Volume"); in snd_emu10k1_mixer()
1950 snd_ac97_write_cache(emu->ac97, AC97_SURROUND_MASTER, 0x0202); in snd_emu10k1_mixer()
1951 snd_ac97_write_cache(emu->ac97, AC97_CENTER_LFE_MASTER, 0x0202); in snd_emu10k1_mixer()
1956 } else if (emu->card_capabilities->i2c_adc) { in snd_emu10k1_mixer()
1962 if (emu->card_capabilities->ecard) in snd_emu10k1_mixer()
1963 strcpy(emu->card->mixername, "EMU APS"); in snd_emu10k1_mixer()
1964 else if (emu->audigy) in snd_emu10k1_mixer()
1965 strcpy(emu->card->mixername, "SB Audigy"); in snd_emu10k1_mixer()
1967 strcpy(emu->card->mixername, "Emu10k1"); in snd_emu10k1_mixer()
1970 if (emu->audigy) in snd_emu10k1_mixer()
1971 if (emu->card_capabilities->adc_1361t) in snd_emu10k1_mixer()
1973 else if (emu->card_capabilities->i2c_adc) in snd_emu10k1_mixer()
1982 if (emu->card_capabilities->subsystem == 0x80401102) { /* SB Live! Platinum CT4760P */ in snd_emu10k1_mixer()
1983 remove_ctl(card, "Center Playback Volume"); in snd_emu10k1_mixer()
1984 remove_ctl(card, "LFE Playback Volume"); in snd_emu10k1_mixer()
1985 remove_ctl(card, "Wave Center Playback Volume"); in snd_emu10k1_mixer()
1986 remove_ctl(card, "Wave LFE Playback Volume"); in snd_emu10k1_mixer()
1988 if (emu->card_capabilities->subsystem == 0x20071102) { /* Audigy 4 Pro */ in snd_emu10k1_mixer()
1989 rename_ctl(card, "Line2 Capture Volume", "Line1/Mic Capture Volume"); in snd_emu10k1_mixer()
1990 rename_ctl(card, "Analog Mix Capture Volume", "Line2 Capture Volume"); in snd_emu10k1_mixer()
1991 rename_ctl(card, "Aux2 Capture Volume", "Line3 Capture Volume"); in snd_emu10k1_mixer()
1992 rename_ctl(card, "Mic Capture Volume", "Unknown1 Capture Volume"); in snd_emu10k1_mixer()
1994 if ((kctl = emu->ctl_send_routing = snd_ctl_new1(&snd_emu10k1_send_routing_control, emu)) == NULL) in snd_emu10k1_mixer()
1995 return -ENOMEM; in snd_emu10k1_mixer()
1996 kctl->id.device = pcm_device; in snd_emu10k1_mixer()
1999 if ((kctl = emu->ctl_send_volume = snd_ctl_new1(&snd_emu10k1_send_volume_control, emu)) == NULL) in snd_emu10k1_mixer()
2000 return -ENOMEM; in snd_emu10k1_mixer()
2001 kctl->id.device = pcm_device; in snd_emu10k1_mixer()
2004 if ((kctl = emu->ctl_attn = snd_ctl_new1(&snd_emu10k1_attn_control, emu)) == NULL) in snd_emu10k1_mixer()
2005 return -ENOMEM; in snd_emu10k1_mixer()
2006 kctl->id.device = pcm_device; in snd_emu10k1_mixer()
2010 …if ((kctl = emu->ctl_efx_send_routing = snd_ctl_new1(&snd_emu10k1_efx_send_routing_control, emu)) … in snd_emu10k1_mixer()
2011 return -ENOMEM; in snd_emu10k1_mixer()
2012 kctl->id.device = multi_device; in snd_emu10k1_mixer()
2016 …if ((kctl = emu->ctl_efx_send_volume = snd_ctl_new1(&snd_emu10k1_efx_send_volume_control, emu)) ==… in snd_emu10k1_mixer()
2017 return -ENOMEM; in snd_emu10k1_mixer()
2018 kctl->id.device = multi_device; in snd_emu10k1_mixer()
2022 if ((kctl = emu->ctl_efx_attn = snd_ctl_new1(&snd_emu10k1_efx_attn_control, emu)) == NULL) in snd_emu10k1_mixer()
2023 return -ENOMEM; in snd_emu10k1_mixer()
2024 kctl->id.device = multi_device; in snd_emu10k1_mixer()
2028 /* initialize the routing and volume table for each pcm playback stream */ in snd_emu10k1_mixer()
2033 mix = &emu->pcm_mixer[pcm]; in snd_emu10k1_mixer()
2034 mix->epcm = NULL; in snd_emu10k1_mixer()
2037 mix->send_routing[0][v] = in snd_emu10k1_mixer()
2038 mix->send_routing[1][v] = in snd_emu10k1_mixer()
2039 mix->send_routing[2][v] = v; in snd_emu10k1_mixer()
2041 memset(&mix->send_volume, 0, sizeof(mix->send_volume)); in snd_emu10k1_mixer()
2042 mix->send_volume[0][0] = mix->send_volume[0][1] = in snd_emu10k1_mixer()
2043 mix->send_volume[1][0] = mix->send_volume[2][1] = 255; in snd_emu10k1_mixer()
2045 mix->attn[0] = mix->attn[1] = mix->attn[2] = 0xffff; in snd_emu10k1_mixer()
2048 /* initialize the routing and volume table for the multichannel playback stream */ in snd_emu10k1_mixer()
2053 mix = &emu->efx_pcm_mixer[pcm]; in snd_emu10k1_mixer()
2054 mix->epcm = NULL; in snd_emu10k1_mixer()
2056 mix->send_routing[0][0] = pcm; in snd_emu10k1_mixer()
2057 mix->send_routing[0][1] = (pcm == 0) ? 1 : 0; in snd_emu10k1_mixer()
2059 mix->send_routing[0][2+v] = 13+v; in snd_emu10k1_mixer()
2060 if (emu->audigy) in snd_emu10k1_mixer()
2062 mix->send_routing[0][4+v] = 60+v; in snd_emu10k1_mixer()
2064 memset(&mix->send_volume, 0, sizeof(mix->send_volume)); in snd_emu10k1_mixer()
2065 mix->send_volume[0][0] = 255; in snd_emu10k1_mixer()
2067 mix->attn[0] = 0xffff; in snd_emu10k1_mixer()
2070 if (! emu->card_capabilities->ecard) { /* FIXME: APS has these controls? */ in snd_emu10k1_mixer()
2073 return -ENOMEM; in snd_emu10k1_mixer()
2074 if (!emu->audigy) in snd_emu10k1_mixer()
2075 kctl->id.device = emu->pcm_efx->device; in snd_emu10k1_mixer()
2079 return -ENOMEM; in snd_emu10k1_mixer()
2080 if (!emu->audigy) in snd_emu10k1_mixer()
2081 kctl->id.device = emu->pcm_efx->device; in snd_emu10k1_mixer()
2086 if (emu->card_capabilities->emu_model) { in snd_emu10k1_mixer()
2088 } else if (emu->audigy) { in snd_emu10k1_mixer()
2090 return -ENOMEM; in snd_emu10k1_mixer()
2095 return -ENOMEM; in snd_emu10k1_mixer()
2099 } else if (! emu->card_capabilities->ecard) { in snd_emu10k1_mixer()
2102 return -ENOMEM; in snd_emu10k1_mixer()
2106 if (emu->card_capabilities->ca0151_chip) { /* P16V */ in snd_emu10k1_mixer()
2111 if (emu->card_capabilities->emu_model == EMU_MODEL_EMU1616) { in snd_emu10k1_mixer()
2129 for (i = 0; i < ARRAY_SIZE(snd_emu1010_adc_pads) - 2; i++) { in snd_emu10k1_mixer()
2135 for (i = 0; i < ARRAY_SIZE(snd_emu1010_dac_pads) - 2; i++) { in snd_emu10k1_mixer()
2154 } else if (emu->card_capabilities->emu_model) { in snd_emu10k1_mixer()
2155 /* all other e-mu cards for now */ in snd_emu10k1_mixer()
2198 if ( emu->card_capabilities->i2c_adc) { in snd_emu10k1_mixer()
2212 if (emu->card_capabilities->ac97_chip && emu->audigy) { in snd_emu10k1_mixer()