Lines Matching +full:synth +full:- +full:master
1 // SPDX-License-Identifier: GPL-2.0-or-later
4 * James Courtier-Dutton <James@superbug.co.uk>
26 #if 0 /* for testing purposes - digital out -> capture */
29 #if 0 /* for testing purposes - set S/PDIF to AC3 output */
32 #if 0 /* for testing purposes - feed the front signal to Center/LFE outputs */
38 MODULE_PARM_DESC(high_res_gpr_volume, "GPR mixer controls use 31-bit range.");
203 2, -1, -1, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 0, 1
320 static const DECLARE_TLV_DB_SCALE(snd_emu10k1_db_scale1, -4000, 40, 1);
324 static const DECLARE_TLV_DB_SCALE(snd_emu10k1_bass_treble_db_scale, -1200, 60, 0);
337 (struct snd_emu10k1_fx8010_ctl *) kcontrol->private_value;
339 if (ctl->min == 0 && ctl->max == 1)
340 uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN;
342 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
343 uinfo->count = ctl->vcount;
344 uinfo->value.integer.min = ctl->min;
345 uinfo->value.integer.max = ctl->max;
352 (struct snd_emu10k1_fx8010_ctl *) kcontrol->private_value;
355 for (i = 0; i < ctl->vcount; i++)
356 ucontrol->value.integer.value[i] = ctl->value[i];
364 (struct snd_emu10k1_fx8010_ctl *) kcontrol->private_value;
369 for (i = 0; i < ctl->vcount; i++) {
370 nval = ucontrol->value.integer.value[i];
371 if (nval < ctl->min)
372 nval = ctl->min;
373 if (nval > ctl->max)
374 nval = ctl->max;
375 if (nval != ctl->value[i])
377 val = ctl->value[i] = nval;
378 switch (ctl->translation) {
380 snd_emu10k1_ptr_write(emu, emu->gpr_base + ctl->gpr[i], 0, val);
383 snd_emu10k1_ptr_write(emu, emu->gpr_base + ctl->gpr[i], 0, ~val);
386 snd_emu10k1_ptr_write(emu, emu->gpr_base + ctl->gpr[i], 0, db_table[val]);
389 snd_emu10k1_ptr_write(emu, emu->gpr_base + ctl->gpr[i], 0,
390 val == 100 ? 0x80000000 : -(int)db_table[val]);
393 if ((ctl->count % 5) != 0 || (ctl->count / 5) != ctl->vcount) {
394 change = -EIO;
398 snd_emu10k1_ptr_write(emu, emu->gpr_base + ctl->gpr[j * ctl->vcount + i], 0, bass_table[val][j]);
401 if ((ctl->count % 5) != 0 || (ctl->count / 5) != ctl->vcount) {
402 change = -EIO;
406 snd_emu10k1_ptr_write(emu, emu->gpr_base + ctl->gpr[j * ctl->vcount + i], 0, treble_table[val][j]);
409 snd_emu10k1_ptr_write(emu, emu->gpr_base + ctl->gpr[i], 0, onoff_table[val]);
425 irq = emu->fx8010.irq_handlers;
427 nirq = irq->next; /* irq ptr can be removed from list */
428 if (snd_emu10k1_ptr_read(emu, emu->gpr_base + irq->gpr_running, 0) & 0xffff0000) {
429 if (irq->handler)
430 irq->handler(emu, irq->private_data);
431 snd_emu10k1_ptr_write(emu, emu->gpr_base + irq->gpr_running, 0, 1);
443 irq->handler = handler;
444 irq->gpr_running = gpr_running;
445 irq->private_data = private_data;
446 irq->next = NULL;
447 guard(spinlock_irqsave)(&emu->fx8010.irq_lock);
448 if (emu->fx8010.irq_handlers == NULL) {
449 emu->fx8010.irq_handlers = irq;
450 emu->dsp_interrupt = snd_emu10k1_fx8010_interrupt;
453 irq->next = emu->fx8010.irq_handlers;
454 emu->fx8010.irq_handlers = irq;
464 guard(spinlock_irqsave)(&emu->fx8010.irq_lock);
465 tmp = emu->fx8010.irq_handlers;
467 emu->fx8010.irq_handlers = tmp->next;
468 if (emu->fx8010.irq_handlers == NULL) {
470 emu->dsp_interrupt = NULL;
473 while (tmp && tmp->next != irq)
474 tmp = tmp->next;
476 tmp->next = tmp->next->next;
492 code = icode->code + (*ptr) * 2;
493 set_bit(*ptr, icode->code_valid);
509 code = icode->code + (*ptr) * 2;
510 set_bit(*ptr, icode->code_valid);
521 pc += emu->audigy ? A_MICROCODEBASE : MICROCODEBASE;
527 pc += emu->audigy ? A_MICROCODEBASE : MICROCODEBASE;
538 for (gpr = 0; gpr < (emu->audigy ? 0x200 : 0x100); gpr++) {
539 if (!test_bit(gpr, icode->gpr_valid))
542 val = icode->gpr_map[gpr];
543 else if (get_user(val, (__user u32 *)&icode->gpr_map[gpr]))
544 return -EFAULT;
545 snd_emu10k1_ptr_write(emu, emu->gpr_base + gpr, 0, val);
556 for (gpr = 0; gpr < (emu->audigy ? 0x200 : 0x100); gpr++) {
557 set_bit(gpr, icode->gpr_valid);
558 val = snd_emu10k1_ptr_read(emu, emu->gpr_base + gpr, 0);
559 if (put_user(val, (__user u32 *)&icode->gpr_map[gpr]))
560 return -EFAULT;
572 for (tram = 0; tram < (emu->audigy ? 0x100 : 0xa0); tram++) {
573 if (!test_bit(tram, icode->tram_valid))
576 val = icode->tram_data_map[tram];
577 addr = icode->tram_addr_map[tram];
579 if (get_user(val, (__user __u32 *)&icode->tram_data_map[tram]) ||
580 get_user(addr, (__user __u32 *)&icode->tram_addr_map[tram]))
581 return -EFAULT;
584 if (!emu->audigy) {
600 memset(icode->tram_valid, 0, sizeof(icode->tram_valid));
601 for (tram = 0; tram < (emu->audigy ? 0x100 : 0xa0); tram++) {
602 set_bit(tram, icode->tram_valid);
604 if (!emu->audigy) {
610 if (put_user(val, (__user u32 *)&icode->tram_data_map[tram]) ||
611 put_user(addr, (__user u32 *)&icode->tram_addr_map[tram]))
612 return -EFAULT;
623 for (pc = 0; pc < (emu->audigy ? 2*1024 : 2*512); pc += 2) {
624 if (!test_bit(pc / 2, icode->code_valid))
627 lo = icode->code[pc + 0];
628 hi = icode->code[pc + 1];
630 if (get_user(lo, (__user u32 *)&icode->code[pc + 0]) ||
631 get_user(hi, (__user u32 *)&icode->code[pc + 1]))
632 return -EFAULT;
645 memset(icode->code_valid, 0, sizeof(icode->code_valid));
646 for (pc = 0; pc < (emu->audigy ? 2*1024 : 2*512); pc += 2) {
647 set_bit(pc / 2, icode->code_valid);
649 (__user u32 *)&icode->code[pc + 0]))
650 return -EFAULT;
652 (__user u32 *)&icode->code[pc + 1]))
653 return -EFAULT;
666 list_for_each_entry(ctl, &emu->fx8010.gpr_ctl, list) {
667 kcontrol = ctl->kcontrol;
668 if (kcontrol->id.iface == id->iface &&
669 kcontrol->id.index == id->index &&
670 !strcmp(kcontrol->id.name, id->name))
714 if (emu->support_tlv) {
718 return -EFAULT;
727 return -EFAULT;
728 dst->tlv = NULL;
741 if (emu->support_tlv)
757 return -EFAULT;
771 for (i = 0; i < icode->gpr_del_control_count; i++) {
772 err = copy_ctl_elem_id(icode->gpr_del_controls, i, &id,
777 return -ENOENT;
781 return -ENOMEM;
783 for (i = 0; i < icode->gpr_add_control_count; i++) {
784 if (copy_gctl(emu, gctl, icode->gpr_add_controls, i,
786 err = -EFAULT;
789 if (snd_emu10k1_look_for_ctl(emu, &gctl->id))
791 gctl_id = (struct snd_ctl_elem_id *)&gctl->id;
792 if (snd_ctl_find_id(emu->card, gctl_id)) {
793 err = -EEXIST;
796 if (gctl_id->iface != SNDRV_CTL_ELEM_IFACE_MIXER &&
797 gctl_id->iface != SNDRV_CTL_ELEM_IFACE_PCM) {
798 err = -EINVAL;
801 switch (gctl->translation) {
807 if (gctl->min != 0 || gctl->max != 100) {
808 err = -EINVAL;
814 if (gctl->min != 0 || gctl->max != 40) {
815 err = -EINVAL;
820 if (gctl->min != 0 || gctl->max != 1) {
821 err = -EINVAL;
826 err = -EINVAL;
830 for (i = 0; i < icode->gpr_list_control_count; i++) {
832 if (copy_gctl(emu, gctl, icode->gpr_list_controls, i,
834 err = -EFAULT;
847 ctl = (struct snd_emu10k1_fx8010_ctl *) kctl->private_value;
848 kctl->private_value = 0;
849 list_del(&ctl->list);
851 kfree(kctl->tlv.p);
871 err = -ENOMEM;
875 for (i = 0; i < icode->gpr_add_control_count; i++) {
876 if (copy_gctl(emu, gctl, icode->gpr_add_controls, i,
878 err = -EFAULT;
881 gctl_id = (struct snd_ctl_elem_id *)&gctl->id;
882 if (gctl_id->iface != SNDRV_CTL_ELEM_IFACE_MIXER &&
883 gctl_id->iface != SNDRV_CTL_ELEM_IFACE_PCM) {
884 err = -EINVAL;
887 if (!*gctl_id->name) {
888 err = -EINVAL;
891 ctl = snd_emu10k1_look_for_ctl(emu, &gctl->id);
893 knew.iface = gctl_id->iface;
894 knew.name = gctl_id->name;
895 knew.index = gctl_id->index;
896 knew.device = gctl_id->device;
897 knew.subdevice = gctl_id->subdevice;
899 knew.tlv.p = copy_tlv((const unsigned int __user *)gctl->tlv, in_kernel);
906 nctl->vcount = gctl->vcount;
907 nctl->count = gctl->count;
909 nctl->gpr[j] = gctl->gpr[j];
910 nctl->value[j] = ~gctl->value[j]; /* inverted, we want to write new value in gpr_ctl_put() */
911 val->value.integer.value[j] = gctl->value[j];
913 nctl->min = gctl->min;
914 nctl->max = gctl->max;
915 nctl->translation = gctl->translation;
919 err = -ENOMEM;
926 err = snd_ctl_add(emu->card, kctl);
932 kctl->private_free = snd_emu10k1_ctl_private_free;
933 ctl->kcontrol = kctl;
934 list_add_tail(&ctl->list, &emu->fx8010.gpr_ctl);
937 nctl->list = ctl->list;
938 nctl->kcontrol = ctl->kcontrol;
940 snd_ctl_notify(emu->card, SNDRV_CTL_EVENT_MASK_VALUE |
941 SNDRV_CTL_EVENT_MASK_INFO, &ctl->kcontrol->id);
943 snd_emu10k1_gpr_ctl_put(ctl->kcontrol, val);
959 struct snd_card *card = emu->card;
962 for (i = 0; i < icode->gpr_del_control_count; i++) {
963 err = copy_ctl_elem_id(icode->gpr_del_controls, i, &id,
969 snd_ctl_remove(card, ctl->kcontrol);
985 return -ENOMEM;
987 list_for_each_entry(ctl, &emu->fx8010.gpr_ctl, list) {
989 if (icode->gpr_list_controls &&
990 i < icode->gpr_list_control_count) {
992 id = &ctl->kcontrol->id;
993 gctl->id.iface = (__force int)id->iface;
994 strscpy(gctl->id.name, id->name, sizeof(gctl->id.name));
995 gctl->id.index = id->index;
996 gctl->id.device = id->device;
997 gctl->id.subdevice = id->subdevice;
998 gctl->vcount = ctl->vcount;
999 gctl->count = ctl->count;
1001 gctl->gpr[j] = ctl->gpr[j];
1002 gctl->value[j] = ctl->value[j];
1004 gctl->min = ctl->min;
1005 gctl->max = ctl->max;
1006 gctl->translation = ctl->translation;
1007 if (copy_gctl_to_user(emu, icode->gpr_list_controls,
1010 return -EFAULT;
1015 icode->gpr_list_control_total = total;
1026 guard(mutex)(&emu->fx8010.lock);
1030 strscpy(emu->fx8010.name, icode->name, sizeof(emu->fx8010.name));
1031 /* stop FX processor - this may be dangerous, but it's better to miss
1032 some samples than generate wrong ones - [jk] */
1033 if (emu->audigy)
1034 snd_emu10k1_ptr_write(emu, A_DBG, 0, emu->fx8010.dbg | A_DBG_SINGLE_STEP);
1036 snd_emu10k1_ptr_write(emu, DBG, 0, emu->fx8010.dbg | EMU10K1_DBG_SINGLE_STEP);
1054 if (emu->audigy)
1055 snd_emu10k1_ptr_write(emu, A_DBG, 0, emu->fx8010.dbg);
1057 snd_emu10k1_ptr_write(emu, DBG, 0, emu->fx8010.dbg);
1066 guard(mutex)(&emu->fx8010.lock);
1067 strscpy(icode->name, emu->fx8010.name, sizeof(icode->name));
1085 if (ipcm->substream >= EMU10K1_FX8010_PCM_COUNT)
1086 return -EINVAL;
1087 ipcm->substream = array_index_nospec(ipcm->substream,
1089 if (ipcm->channels > 32)
1090 return -EINVAL;
1091 pcm = &emu->fx8010.pcm[ipcm->substream];
1092 guard(mutex)(&emu->fx8010.lock);
1093 guard(spinlock_irq)(&emu->reg_lock);
1094 if (pcm->opened)
1095 return -EBUSY;
1096 if (ipcm->channels == 0) { /* remove */
1097 pcm->valid = 0;
1100 if (ipcm->channels != 2)
1101 return -EINVAL;
1102 pcm->valid = 1;
1103 pcm->opened = 0;
1104 pcm->channels = ipcm->channels;
1105 pcm->tram_start = ipcm->tram_start;
1106 pcm->buffer_size = ipcm->buffer_size;
1107 pcm->gpr_size = ipcm->gpr_size;
1108 pcm->gpr_count = ipcm->gpr_count;
1109 pcm->gpr_tmpcount = ipcm->gpr_tmpcount;
1110 pcm->gpr_ptr = ipcm->gpr_ptr;
1111 pcm->gpr_trigger = ipcm->gpr_trigger;
1112 pcm->gpr_running = ipcm->gpr_running;
1113 for (i = 0; i < pcm->channels; i++)
1114 pcm->etram[i] = ipcm->etram[i];
1125 if (ipcm->substream >= EMU10K1_FX8010_PCM_COUNT)
1126 return -EINVAL;
1127 ipcm->substream = array_index_nospec(ipcm->substream,
1129 pcm = &emu->fx8010.pcm[ipcm->substream];
1130 guard(mutex)(&emu->fx8010.lock);
1131 guard(spinlock_irq)(&emu->reg_lock);
1132 ipcm->channels = pcm->channels;
1133 ipcm->tram_start = pcm->tram_start;
1134 ipcm->buffer_size = pcm->buffer_size;
1135 ipcm->gpr_size = pcm->gpr_size;
1136 ipcm->gpr_ptr = pcm->gpr_ptr;
1137 ipcm->gpr_count = pcm->gpr_count;
1138 ipcm->gpr_tmpcount = pcm->gpr_tmpcount;
1139 ipcm->gpr_trigger = pcm->gpr_trigger;
1140 ipcm->gpr_running = pcm->gpr_running;
1141 for (i = 0; i < pcm->channels; i++)
1142 ipcm->etram[i] = pcm->etram[i];
1143 ipcm->res1 = ipcm->res2 = 0;
1144 ipcm->pad = 0;
1153 #define HR_VAL(v) ((v) * 0x80000000LL / 100 - 1)
1159 ctl->id.iface = (__force int)SNDRV_CTL_ELEM_IFACE_MIXER;
1160 strscpy(ctl->id.name, name);
1161 ctl->vcount = ctl->count = 1;
1163 ctl->min = -1;
1164 ctl->max = 0x7fffffff;
1165 ctl->tlv = snd_emu10k1_db_linear;
1166 ctl->translation = EMU10K1_GPR_TRANSLATION_NEGATE;
1169 ctl->min = 0;
1170 ctl->max = 100;
1171 ctl->tlv = snd_emu10k1_db_scale1;
1172 ctl->translation = EMU10K1_GPR_TRANSLATION_NEG_TABLE100;
1174 ctl->gpr[0] = gpr + 0; ctl->value[0] = defval;
1183 ctl->id.iface = (__force int)SNDRV_CTL_ELEM_IFACE_MIXER;
1184 strscpy(ctl->id.name, name);
1185 ctl->vcount = ctl->count = 2;
1187 ctl->min = -1;
1188 ctl->max = 0x7fffffff;
1189 ctl->tlv = snd_emu10k1_db_linear;
1190 ctl->translation = EMU10K1_GPR_TRANSLATION_NEGATE;
1193 ctl->min = 0;
1194 ctl->max = 100;
1195 ctl->tlv = snd_emu10k1_db_scale1;
1196 ctl->translation = EMU10K1_GPR_TRANSLATION_NEG_TABLE100;
1198 ctl->gpr[0] = gpr + 0; ctl->value[0] = defval;
1199 ctl->gpr[1] = gpr + 1; ctl->value[1] = defval;
1208 ctl->id.iface = (__force int)SNDRV_CTL_ELEM_IFACE_MIXER;
1209 strscpy(ctl->id.name, name);
1210 ctl->vcount = ctl->count = 1;
1211 ctl->gpr[0] = gpr + 0; ctl->value[0] = defval;
1212 ctl->min = 0;
1213 ctl->max = 1;
1214 ctl->translation = EMU10K1_GPR_TRANSLATION_ONOFF;
1221 ctl->id.iface = (__force int)SNDRV_CTL_ELEM_IFACE_MIXER;
1222 strscpy(ctl->id.name, name);
1223 ctl->vcount = ctl->count = 2;
1224 ctl->gpr[0] = gpr + 0; ctl->value[0] = defval;
1225 ctl->gpr[1] = gpr + 1; ctl->value[1] = defval;
1226 ctl->min = 0;
1227 ctl->max = 1;
1228 ctl->translation = EMU10K1_GPR_TRANSLATION_ONOFF;
1232 * Used for emu1010 - conversion from 32-bit capture inputs from the FPGA
1233 * to 2 x 16-bit registers in Audigy - their values are read via DMA.
1248 // Left-shift once more. This is a separate step, as the
1254 #define ENUM_GPR(name, size) name, name ## _dummy = name + (size) - 1
1284 err = -ENOMEM;
1289 icode->gpr_map = kcalloc(512 + 256 + 256 + 2 * 1024,
1291 if (!icode->gpr_map)
1298 gpr_map = icode->gpr_map;
1300 icode->tram_data_map = icode->gpr_map + 512;
1301 icode->tram_addr_map = icode->tram_data_map + 256;
1302 icode->code = icode->tram_addr_map + 256;
1305 memset(icode->gpr_valid, 0xff, 512 / 8);
1308 memset(icode->tram_valid, 0xff, 256 / 8);
1310 strscpy(icode->name, "Audigy DSP code for ALSA");
1317 * playback = -gpr * FXBUS_PCM_LEFT_FRONT >> 31
1333 if (emu->card_capabilities->spk71) {
1359 /* Synth Playback */
1362 snd_emu10k1_init_stereo_control(&controls[nctl++], "Synth Playback Volume", gpr, 100);
1371 /* Synth Capture */
1374 snd_emu10k1_init_stereo_control(&controls[nctl++], "Synth Capture Volume", gpr, 0);
1378 // which is necessary for bit-identical reproduction.
1389 if (emu->card_capabilities->emu_model) {
1392 if (emu->card_capabilities->ca0108_chip) {
1410 if (emu->card_capabilities->ac97_chip) {
1411 /* AC'97 Playback Volume - used only for mic (renamed later) */
1416 /* AC'97 Capture Volume - used only for mic */
1430 emu->card_capabilities->ac97_chip ? "Audigy CD Playback Volume" : "CD Playback Volume",
1437 emu->card_capabilities->ac97_chip ? "Audigy CD Capture Volume" : "CD Capture Volume",
1456 emu->card_capabilities->ac97_chip ? "Line2 Playback Volume" : "Line Playback Volume",
1463 emu->card_capabilities->ac97_chip ? "Line2 Capture Volume" : "Line Capture Volume",
1482 emu->card_capabilities->ac97_chip ? "Aux2 Playback Volume" : "Aux Playback Volume",
1489 emu->card_capabilities->ac97_chip ? "Aux2 Capture Volume" : "Aux Capture Volume",
1518 if (emu->card_capabilities->spk71) {
1547 ctl->id.iface = (__force int)SNDRV_CTL_ELEM_IFACE_MIXER;
1548 strscpy(ctl->id.name, "Tone Control - Bass");
1549 ctl->vcount = 2;
1550 ctl->count = 10;
1551 ctl->min = 0;
1552 ctl->max = 40;
1553 ctl->value[0] = ctl->value[1] = 20;
1554 ctl->translation = EMU10K1_GPR_TRANSLATION_BASS;
1556 ctl->id.iface = (__force int)SNDRV_CTL_ELEM_IFACE_MIXER;
1557 strscpy(ctl->id.name, "Tone Control - Treble");
1558 ctl->vcount = 2;
1559 ctl->count = 10;
1560 ctl->min = 0;
1561 ctl->max = 40;
1562 ctl->value[0] = ctl->value[1] = 20;
1563 ctl->translation = EMU10K1_GPR_TRANSLATION_TREBLE;
1574 snd_emu10k1_init_mono_onoff_control(controls + nctl++, "Tone Control - Switch", gpr, 0);
1578 for (z = 0; z < 4; z++) { /* front/rear/center-lfe/side */
1605 gpr_map[gpr++] = ptr - ptr_skip;
1607 /* Master volume (will be renamed later) */
1610 snd_emu10k1_init_mono_control(&controls[nctl++], "Wave Master Playback Volume", gpr, 0);
1613 if (emu->card_capabilities->emu_model) {
1615 dev_info(emu->card->dev, "EMU outputs on\n");
1617 if (emu->card_capabilities->ca0108_chip) {
1629 if (emu->card_capabilities->spk71)
1641 A_OP(icode, &ptr, iSKIP, A_GPR_COND, A_GPR_COND, A_GPR(gpr - 2), A_C_00000001);
1643 A_OP(icode, &ptr, iANDXOR, A_GPR(tmp + 2), A_GPR(tmp + 2), A_GPR(gpr - 1), A_C_00000000);
1647 if ((z==1) && (emu->card_capabilities->spdif_bug)) {
1649 dev_info(emu->card->dev,
1651 emu->card_capabilities->name);
1652 A_OP(icode, &ptr, iACC3, A_EXTOUT(A_EXTOUT_FRONT_L + z), A_GPR(gpr - 3), A_C_00000000, A_C_00000000);
1653 A_OP(icode, &ptr, iACC3, A_GPR(gpr - 3), A_GPR(tmp + 0), A_GPR(tmp + 1), A_C_00000000);
1674 if (emu->card_capabilities->emu_model) {
1676 if (emu->card_capabilities->ca0108_chip) {
1677 dev_info(emu->card->dev, "EMU2 inputs on\n");
1693 dev_info(emu->card->dev, "EMU inputs on\n");
1697 dev_dbg(emu->card->dev, "emufx.c: gpr=0x%x, tmp=0x%x\n",
1719 /* EFX capture - capture the 16 EXTINs */
1733 err = -EIO;
1741 icode->gpr_add_control_count = nctl;
1742 icode->gpr_add_controls = controls;
1743 emu->support_tlv = 1; /* support TLV */
1745 emu->support_tlv = 0; /* clear again */
1750 kfree(icode->gpr_map);
1761 /* Volumes are in the [-2^31, 0] range, zero being mute. */
1802 err = -ENOMEM;
1807 icode->gpr_map = kcalloc(256 + 160 + 160 + 2 * 512,
1809 if (!icode->gpr_map)
1822 gpr_map = icode->gpr_map;
1824 icode->tram_data_map = icode->gpr_map + 256;
1825 icode->tram_addr_map = icode->tram_data_map + 160;
1826 icode->code = icode->tram_addr_map + 160;
1829 memset(icode->gpr_valid, 0xff, 256 / 8);
1832 memset(icode->tram_valid, 0xff, 160 / 8);
1834 strscpy(icode->name, "SB Live! FX8010 code for ALSA v1.2 by Jaroslav Kysela");
1861 ipcm->substream = 0;
1862 ipcm->channels = 2;
1863 ipcm->tram_start = 0;
1864 ipcm->buffer_size = (64 * 1024) / 2;
1865 ipcm->gpr_size = gpr++;
1866 ipcm->gpr_ptr = gpr++;
1867 ipcm->gpr_count = gpr++;
1868 ipcm->gpr_tmpcount = gpr++;
1869 ipcm->gpr_trigger = gpr++;
1870 ipcm->gpr_running = gpr++;
1871 ipcm->etram[0] = 0;
1872 ipcm->etram[1] = 1;
1880 gpr_map[gpr + 6] = (0x22 - 0x01) - 1; /* skip at 01 to 22 */
1881 gpr_map[gpr + 7] = (0x22 - 0x06) - 1; /* skip at 06 to 22 */
1885 gpr_map[gpr + 11] = (0x24 - 0x0a) - 1; /* skip at 0a to 24 */
1889 /* 00: */ OP(icode, &ptr, iMAC0, C_00000000, GPR(ipcm->gpr_trigger), C_00000000, C_00000000);
1892 /* 02: */ OP(icode, &ptr, iMAC0, C_00000000, GPR(ipcm->gpr_running), C_00000000, C_00000000);
1900 /* 08: */ OP(icode, &ptr, iANDXOR, GPR(ipcm->gpr_running), GPR(ipcm->gpr_running), C_00000000, C_00000001);
1905 /* 0c: */ OP(icode, &ptr, iANDXOR, GPR(tmp + 0), ETRAM_DATA(ipcm->etram[0]), GPR(gpr + 0), C_00000000);
1911 /* 11: */ OP(icode, &ptr, iANDXOR, GPR(tmp + 0), ETRAM_DATA(ipcm->etram[1]), GPR(gpr + 0), C_00000000);
1917 /* 16: */ OP(icode, &ptr, iACC3, GPR(tmp + 0), GPR(ipcm->gpr_ptr), C_00000001, C_00000000);
1918 /* 17: */ OP(icode, &ptr, iMACINT0, C_00000000, GPR(tmp + 0), C_ffffffff, GPR(ipcm->gpr_size));
1921 /* 1a: */ OP(icode, &ptr, iACC3, GPR(ipcm->gpr_ptr), GPR(tmp + 0), C_00000000, C_00000000);
1923 /* 1b: */ OP(icode, &ptr, iACC3, GPR(ipcm->gpr_tmpcount), GPR(ipcm->gpr_tmpcount), C_ffffffff, C_00000000);
1925 /* 1d: */ OP(icode, &ptr, iACC3, GPR(ipcm->gpr_tmpcount), GPR(ipcm->gpr_count), C_00000000, C_00000000);
1927 /* 1f: */ OP(icode, &ptr, iANDXOR, GPR(ipcm->gpr_running), GPR(ipcm->gpr_running), C_00000001, C_00010000);
1929 /* 20: */ OP(icode, &ptr, iANDXOR, GPR(ipcm->gpr_running), GPR(ipcm->gpr_running), C_00010000, C_00000001);
1932 /* 22: */ OP(icode, &ptr, iMACINT1, ETRAM_ADDR(ipcm->etram[0]), GPR(gpr + 8), GPR_DBAC, C_ffffffff);
1933 /* 23: */ OP(icode, &ptr, iMACINT1, ETRAM_ADDR(ipcm->etram[1]), GPR(gpr + 9), GPR_DBAC, C_ffffffff);
1967 /* Synth Playback Volume */
1970 snd_emu10k1_init_stereo_control(controls + i++, "Synth Playback Volume", gpr, 100);
1973 /* Synth Capture Volume + Switch */
1978 snd_emu10k1_init_stereo_control(controls + i++, "Synth Capture Volume", gpr, 0);
1979 snd_emu10k1_init_stereo_onoff_control(controls + i++, "Synth Capture Switch", gpr + 2, 0);
2024 if (emu->fx8010.extin_mask & ((1<<EXTIN_AC97_L)|(1<<EXTIN_AC97_R))) {
2028 snd_emu10k1_init_stereo_control(controls + i++, "AC97 Playback Volume", gpr-2, 0);
2032 snd_emu10k1_init_stereo_control(controls + i++, "AC97 Capture Volume", gpr-2, 100);
2035 if (emu->fx8010.extin_mask & ((1<<EXTIN_SPDIF_CD_L)|(1<<EXTIN_SPDIF_CD_R))) {
2052 if (emu->fx8010.extin_mask & ((1<<EXTIN_ZOOM_L)|(1<<EXTIN_ZOOM_R))) {
2069 if (emu->fx8010.extin_mask & ((1<<EXTIN_TOSLINK_L)|(1<<EXTIN_TOSLINK_R))) {
2086 if (emu->fx8010.extin_mask & ((1<<EXTIN_LINE1_L)|(1<<EXTIN_LINE1_R))) {
2103 if (emu->fx8010.extin_mask & ((1<<EXTIN_COAX_SPDIF_L)|(1<<EXTIN_COAX_SPDIF_R))) {
2120 if (emu->fx8010.extin_mask & ((1<<EXTIN_LINE2_L)|(1<<EXTIN_LINE2_R))) {
2125 controls[i-1].id.index = 1;
2134 controls[i-1].id.index = 1;
2136 controls[i-1].id.index = 1;
2144 ctl->id.iface = (__force int)SNDRV_CTL_ELEM_IFACE_MIXER;
2145 strscpy(ctl->id.name, "Tone Control - Bass");
2146 ctl->vcount = 2;
2147 ctl->count = 10;
2148 ctl->min = 0;
2149 ctl->max = 40;
2150 ctl->value[0] = ctl->value[1] = 20;
2151 ctl->tlv = snd_emu10k1_bass_treble_db_scale;
2152 ctl->translation = EMU10K1_GPR_TRANSLATION_BASS;
2154 ctl->id.iface = (__force int)SNDRV_CTL_ELEM_IFACE_MIXER;
2155 strscpy(ctl->id.name, "Tone Control - Treble");
2156 ctl->vcount = 2;
2157 ctl->count = 10;
2158 ctl->min = 0;
2159 ctl->max = 40;
2160 ctl->value[0] = ctl->value[1] = 20;
2161 ctl->tlv = snd_emu10k1_bass_treble_db_scale;
2162 ctl->translation = EMU10K1_GPR_TRANSLATION_TREBLE;
2177 snd_emu10k1_init_mono_onoff_control(controls + i++, "Tone Control - Switch", gpr, 0);
2181 for (z = 0; z < 3; z++) { /* front/rear/center-lfe */
2208 gpr_map[gpr++] = ptr - ptr_skip;
2216 if (emu->fx8010.extout_mask & ((1<<EXTOUT_AC97_L)|(1<<EXTOUT_AC97_R))) {
2223 if (emu->fx8010.extout_mask & ((1<<EXTOUT_TOSLINK_L)|(1<<EXTOUT_TOSLINK_R))) {
2240 if (emu->fx8010.extout_mask & ((1<<EXTOUT_HEADPHONE_L)|(1<<EXTOUT_HEADPHONE_R))) {
2252 controls[i-1].id.index = 1; /* AC'97 can have also Headphone control */
2254 controls[i-1].id.index = 1;
2256 controls[i-1].id.index = 1;
2261 if (emu->fx8010.extout_mask & ((1<<EXTOUT_REAR_L)|(1<<EXTOUT_REAR_R)))
2265 if (emu->fx8010.extout_mask & ((1<<EXTOUT_AC97_REAR_L)|(1<<EXTOUT_AC97_REAR_R)))
2269 if (emu->fx8010.extout_mask & (1<<EXTOUT_AC97_CENTER)) {
2279 if (emu->fx8010.extout_mask & (1<<EXTOUT_AC97_LFE)) {
2294 if (emu->fx8010.extout_mask & (1<<EXTOUT_MIC_CAP))
2297 /* EFX capture - capture the 16 EXTINS */
2298 if (emu->card_capabilities->sblive51) {
2301 if (c != -1)
2312 err = -EIO;
2317 err = -EIO;
2325 err = snd_emu10k1_fx8010_tram_setup(emu, ipcm->buffer_size);
2328 icode->gpr_add_control_count = i;
2329 icode->gpr_add_controls = controls;
2330 emu->support_tlv = 1; /* support TLV */
2332 emu->support_tlv = 0; /* clear again */
2340 kfree(icode->gpr_map);
2348 spin_lock_init(&emu->fx8010.irq_lock);
2349 INIT_LIST_HEAD(&emu->fx8010.gpr_ctl);
2350 if (emu->audigy)
2359 if (emu->audigy)
2360 snd_emu10k1_ptr_write(emu, A_DBG, 0, emu->fx8010.dbg = A_DBG_SINGLE_STEP);
2362 snd_emu10k1_ptr_write(emu, DBG, 0, emu->fx8010.dbg = EMU10K1_DBG_SINGLE_STEP);
2369 return -EINVAL;
2370 snd_emu10k1_ptr_write(emu, emu->gpr_base + 0x94 + output, 0, 1);
2377 return -EINVAL;
2378 snd_emu10k1_ptr_write(emu, emu->gpr_base + 0x94 + output, 0, 0);
2389 size = (size - 1) >> 13;
2397 if ((emu->fx8010.etram_pages.bytes / 2) == size)
2399 scoped_guard(spinlock_irq, &emu->emu_lock) {
2400 outl(HCFG_LOCKTANKCACHE_MASK | inl(emu->port + HCFG), emu->port + HCFG);
2404 if (emu->fx8010.etram_pages.area != NULL) {
2405 snd_dma_free_pages(&emu->fx8010.etram_pages);
2406 emu->fx8010.etram_pages.area = NULL;
2407 emu->fx8010.etram_pages.bytes = 0;
2411 if (snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, &emu->pci->dev,
2412 size * 2, &emu->fx8010.etram_pages) < 0)
2413 return -ENOMEM;
2414 memset(emu->fx8010.etram_pages.area, 0, size * 2);
2415 snd_emu10k1_ptr_write(emu, TCB, 0, emu->fx8010.etram_pages.addr);
2417 scoped_guard(spinlock_irq, &emu->emu_lock) {
2418 outl(inl(emu->port + HCFG) & ~HCFG_LOCKTANKCACHE_MASK, emu->port + HCFG);
2445 info->internal_tram_size = emu->fx8010.itram_size;
2446 info->external_tram_size = emu->fx8010.etram_pages.bytes / 2;
2448 extin = emu->audigy ? snd_emu10k1_audigy_ins : snd_emu10k1_sblive_ins;
2449 extout = emu->audigy ? snd_emu10k1_audigy_outs : snd_emu10k1_sblive_outs;
2450 extin_mask = emu->audigy ? ~0 : emu->fx8010.extin_mask;
2451 extout_mask = emu->audigy ? ~0 : emu->fx8010.extout_mask;
2453 copy_string(info->fxbus_names[res], *fxbus, "FXBUS", res);
2454 copy_string(info->extin_names[res], extin_mask & (1 << res) ? *extin : NULL, "Unused", res);
2455 copy_string(info->extout_names[res], extout_mask & (1 << res) ? *extout : NULL, "Unused", res);
2458 copy_string(info->extout_names[res], extout_mask & (1 << res) ? *extout : NULL, "Unused", res);
2459 info->gpr_controls = emu->fx8010.gpr_count;
2464 struct snd_emu10k1 *emu = hw->private_data;
2474 emu->support_tlv = 1;
2479 return -ENOMEM;
2483 return -EFAULT;
2489 return -EPERM;
2504 return -EFAULT;
2522 return -EFAULT;
2528 return -EPERM;
2530 return -EFAULT;
2531 scoped_guard(mutex, &emu->fx8010.lock) {
2537 return -EPERM;
2538 if (emu->audigy)
2539 snd_emu10k1_ptr_write(emu, A_DBG, 0, emu->fx8010.dbg |= A_DBG_SINGLE_STEP);
2541 snd_emu10k1_ptr_write(emu, DBG, 0, emu->fx8010.dbg |= EMU10K1_DBG_SINGLE_STEP);
2545 return -EPERM;
2546 if (emu->audigy)
2547 snd_emu10k1_ptr_write(emu, A_DBG, 0, emu->fx8010.dbg = 0);
2549 snd_emu10k1_ptr_write(emu, DBG, 0, emu->fx8010.dbg = 0);
2553 return -EPERM;
2554 if (emu->audigy)
2555 snd_emu10k1_ptr_write(emu, A_DBG, 0, emu->fx8010.dbg | A_DBG_ZC);
2557 snd_emu10k1_ptr_write(emu, DBG, 0, emu->fx8010.dbg | EMU10K1_DBG_ZC);
2559 if (emu->audigy)
2560 snd_emu10k1_ptr_write(emu, A_DBG, 0, emu->fx8010.dbg);
2562 snd_emu10k1_ptr_write(emu, DBG, 0, emu->fx8010.dbg);
2566 return -EPERM;
2568 return -EFAULT;
2569 if (emu->audigy) {
2571 return -EINVAL;
2572 snd_emu10k1_ptr_write(emu, A_DBG, 0, emu->fx8010.dbg |= A_DBG_SINGLE_STEP);
2574 snd_emu10k1_ptr_write(emu, A_DBG, 0, emu->fx8010.dbg | A_DBG_STEP | addr);
2577 return -EINVAL;
2578 snd_emu10k1_ptr_write(emu, DBG, 0, emu->fx8010.dbg |= EMU10K1_DBG_SINGLE_STEP);
2580 snd_emu10k1_ptr_write(emu, DBG, 0, emu->fx8010.dbg | EMU10K1_DBG_STEP | addr);
2584 if (emu->audigy)
2589 return -EFAULT;
2592 return -ENOTTY;
2605 err = snd_hwdep_new(emu->card, "FX8010", device, &hw);
2608 strscpy(hw->name, "EMU10K1 (FX8010)");
2609 hw->iface = SNDRV_HWDEP_IFACE_EMU10K1;
2610 hw->ops.open = snd_emu10k1_fx8010_open;
2611 hw->ops.ioctl = snd_emu10k1_fx8010_ioctl;
2612 hw->ops.release = snd_emu10k1_fx8010_release;
2613 hw->private_data = emu;
2622 len = emu->audigy ? 0x200 : 0x100;
2623 emu->saved_gpr = kmalloc_array(len, 4, GFP_KERNEL);
2624 if (! emu->saved_gpr)
2625 return -ENOMEM;
2626 len = emu->audigy ? 0x100 : 0xa0;
2627 emu->tram_val_saved = kmalloc_array(len, 4, GFP_KERNEL);
2628 emu->tram_addr_saved = kmalloc_array(len, 4, GFP_KERNEL);
2629 if (! emu->tram_val_saved || ! emu->tram_addr_saved)
2630 return -ENOMEM;
2631 len = emu->audigy ? 2 * 1024 : 2 * 512;
2632 emu->saved_icode = vmalloc(array_size(len, 4));
2633 if (! emu->saved_icode)
2634 return -ENOMEM;
2640 kfree(emu->saved_gpr);
2641 kfree(emu->tram_val_saved);
2642 kfree(emu->tram_addr_saved);
2643 vfree(emu->saved_icode);
2653 len = emu->audigy ? 0x200 : 0x100;
2655 emu->saved_gpr[i] = snd_emu10k1_ptr_read(emu, emu->gpr_base + i, 0);
2657 len = emu->audigy ? 0x100 : 0xa0;
2659 emu->tram_val_saved[i] = snd_emu10k1_ptr_read(emu, TANKMEMDATAREGBASE + i, 0);
2660 emu->tram_addr_saved[i] = snd_emu10k1_ptr_read(emu, TANKMEMADDRREGBASE + i, 0);
2661 if (emu->audigy) {
2662 emu->tram_addr_saved[i] >>= 12;
2663 emu->tram_addr_saved[i] |=
2668 len = emu->audigy ? 2 * 1024 : 2 * 512;
2670 emu->saved_icode[i] = snd_emu10k1_efx_read(emu, i);
2678 if (emu->fx8010.etram_pages.bytes > 0) {
2680 size = emu->fx8010.etram_pages.bytes / 2;
2681 size = (size - 1) >> 13;
2686 outl(HCFG_LOCKTANKCACHE_MASK | inl(emu->port + HCFG), emu->port + HCFG);
2687 snd_emu10k1_ptr_write(emu, TCB, 0, emu->fx8010.etram_pages.addr);
2689 outl(inl(emu->port + HCFG) & ~HCFG_LOCKTANKCACHE_MASK, emu->port + HCFG);
2692 if (emu->audigy)
2693 snd_emu10k1_ptr_write(emu, A_DBG, 0, emu->fx8010.dbg | A_DBG_SINGLE_STEP);
2695 snd_emu10k1_ptr_write(emu, DBG, 0, emu->fx8010.dbg | EMU10K1_DBG_SINGLE_STEP);
2697 len = emu->audigy ? 0x200 : 0x100;
2699 snd_emu10k1_ptr_write(emu, emu->gpr_base + i, 0, emu->saved_gpr[i]);
2701 len = emu->audigy ? 0x100 : 0xa0;
2704 emu->tram_val_saved[i]);
2705 if (! emu->audigy)
2707 emu->tram_addr_saved[i]);
2710 emu->tram_addr_saved[i] << 12);
2712 emu->tram_addr_saved[i] >> 20);
2716 len = emu->audigy ? 2 * 1024 : 2 * 512;
2718 snd_emu10k1_efx_write(emu, i, emu->saved_icode[i]);
2721 if (emu->audigy)
2722 snd_emu10k1_ptr_write(emu, A_DBG, 0, emu->fx8010.dbg);
2724 snd_emu10k1_ptr_write(emu, DBG, 0, emu->fx8010.dbg);