• Home
  • Raw
  • Download

Lines Matching +full:dsp +full:- +full:gpio

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()
94 "DSP 0",
95 "DSP 1",
96 "DSP 2",
97 "DSP 3",
98 "DSP 4",
99 "DSP 5",
100 "DSP 6",
101 "DSP 7",
102 "DSP 8",
103 "DSP 9",
104 "DSP 10",
105 "DSP 11",
106 "DSP 12",
107 "DSP 13",
108 "DSP 14",
109 "DSP 15",
110 "DSP 16",
111 "DSP 17",
112 "DSP 18",
113 "DSP 19",
114 "DSP 20",
115 "DSP 21",
116 "DSP 22",
117 "DSP 23",
118 "DSP 24",
119 "DSP 25",
120 "DSP 26",
121 "DSP 27",
122 "DSP 28",
123 "DSP 29",
124 "DSP 30",
125 "DSP 31",
148 "DSP 0",
149 "DSP 1",
150 "DSP 2",
151 "DSP 3",
152 "DSP 4",
153 "DSP 5",
154 "DSP 6",
155 "DSP 7",
156 "DSP 8",
157 "DSP 9",
158 "DSP 10",
159 "DSP 11",
160 "DSP 12",
161 "DSP 13",
162 "DSP 14",
163 "DSP 15",
164 "DSP 16",
165 "DSP 17",
166 "DSP 18",
167 "DSP 19",
168 "DSP 20",
169 "DSP 21",
170 "DSP 22",
171 "DSP 23",
172 "DSP 24",
173 "DSP 25",
174 "DSP 26",
175 "DSP 27",
176 "DSP 28",
177 "DSP 29",
178 "DSP 30",
179 "DSP 31",
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()
549 EMU1010_SOURCE_INPUT("DSP 0 Capture Enum", 0),
550 EMU1010_SOURCE_INPUT("DSP 1 Capture Enum", 1),
551 EMU1010_SOURCE_INPUT("DSP 2 Capture Enum", 2),
552 EMU1010_SOURCE_INPUT("DSP 3 Capture Enum", 3),
553 EMU1010_SOURCE_INPUT("DSP 4 Capture Enum", 4),
554 EMU1010_SOURCE_INPUT("DSP 5 Capture Enum", 5),
555 EMU1010_SOURCE_INPUT("DSP 6 Capture Enum", 6),
556 EMU1010_SOURCE_INPUT("DSP 7 Capture Enum", 7),
557 EMU1010_SOURCE_INPUT("DSP 8 Capture Enum", 8),
558 EMU1010_SOURCE_INPUT("DSP 9 Capture Enum", 9),
559 EMU1010_SOURCE_INPUT("DSP A Capture Enum", 0xa),
560 EMU1010_SOURCE_INPUT("DSP B Capture Enum", 0xb),
561 EMU1010_SOURCE_INPUT("DSP C Capture Enum", 0xc),
562 EMU1010_SOURCE_INPUT("DSP D Capture Enum", 0xd),
563 EMU1010_SOURCE_INPUT("DSP E Capture Enum", 0xe),
564 EMU1010_SOURCE_INPUT("DSP F Capture Enum", 0xf),
565 EMU1010_SOURCE_INPUT("DSP 10 Capture Enum", 0x10),
566 EMU1010_SOURCE_INPUT("DSP 11 Capture Enum", 0x11),
567 EMU1010_SOURCE_INPUT("DSP 12 Capture Enum", 0x12),
568 EMU1010_SOURCE_INPUT("DSP 13 Capture Enum", 0x13),
569 EMU1010_SOURCE_INPUT("DSP 14 Capture Enum", 0x14),
570 EMU1010_SOURCE_INPUT("DSP 15 Capture Enum", 0x15),
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()
927 u32 gpio; in snd_audigy_i2c_capture_source_put() local
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()
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()
1206 if (emu->audigy) { 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()
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()
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()
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()
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()
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()
1819 "3D Control - Center", in snd_emu10k1_mixer()
1820 "3D Control - Depth", in snd_emu10k1_mixer()
1821 "3D Control - Switch", 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()
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()
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()
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()
1988 if (emu->card_capabilities->subsystem == 0x20071102) { /* Audigy 4 Pro */ 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()
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()
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()