Lines Matching refs:emu
321 struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol); in snd_emu10k1_gpr_ctl_get() local
327 spin_lock_irqsave(&emu->reg_lock, flags); in snd_emu10k1_gpr_ctl_get()
330 spin_unlock_irqrestore(&emu->reg_lock, flags); in snd_emu10k1_gpr_ctl_get()
336 struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol); in snd_emu10k1_gpr_ctl_put() local
344 spin_lock_irqsave(&emu->reg_lock, flags); in snd_emu10k1_gpr_ctl_put()
356 snd_emu10k1_ptr_write(emu, emu->gpr_base + ctl->gpr[i], 0, val); in snd_emu10k1_gpr_ctl_put()
359 snd_emu10k1_ptr_write(emu, emu->gpr_base + ctl->gpr[i], 0, db_table[val]); in snd_emu10k1_gpr_ctl_put()
367 … snd_emu10k1_ptr_write(emu, emu->gpr_base + ctl->gpr[j * ctl->vcount + i], 0, bass_table[val][j]); in snd_emu10k1_gpr_ctl_put()
375 …snd_emu10k1_ptr_write(emu, emu->gpr_base + ctl->gpr[j * ctl->vcount + i], 0, treble_table[val][j]); in snd_emu10k1_gpr_ctl_put()
378 snd_emu10k1_ptr_write(emu, emu->gpr_base + ctl->gpr[i], 0, onoff_table[val]); in snd_emu10k1_gpr_ctl_put()
383 spin_unlock_irqrestore(&emu->reg_lock, flags); in snd_emu10k1_gpr_ctl_put()
391 static void snd_emu10k1_fx8010_interrupt(struct snd_emu10k1 *emu) in snd_emu10k1_fx8010_interrupt() argument
395 irq = emu->fx8010.irq_handlers; in snd_emu10k1_fx8010_interrupt()
398 if (snd_emu10k1_ptr_read(emu, emu->gpr_base + irq->gpr_running, 0) & 0xffff0000) { in snd_emu10k1_fx8010_interrupt()
400 irq->handler(emu, irq->private_data); in snd_emu10k1_fx8010_interrupt()
401 snd_emu10k1_ptr_write(emu, emu->gpr_base + irq->gpr_running, 0, 1); in snd_emu10k1_fx8010_interrupt()
407 int snd_emu10k1_fx8010_register_irq_handler(struct snd_emu10k1 *emu, in snd_emu10k1_fx8010_register_irq_handler() argument
419 spin_lock_irqsave(&emu->fx8010.irq_lock, flags); in snd_emu10k1_fx8010_register_irq_handler()
420 if (emu->fx8010.irq_handlers == NULL) { in snd_emu10k1_fx8010_register_irq_handler()
421 emu->fx8010.irq_handlers = irq; in snd_emu10k1_fx8010_register_irq_handler()
422 emu->dsp_interrupt = snd_emu10k1_fx8010_interrupt; in snd_emu10k1_fx8010_register_irq_handler()
423 snd_emu10k1_intr_enable(emu, INTE_FXDSPENABLE); in snd_emu10k1_fx8010_register_irq_handler()
425 irq->next = emu->fx8010.irq_handlers; in snd_emu10k1_fx8010_register_irq_handler()
426 emu->fx8010.irq_handlers = irq; in snd_emu10k1_fx8010_register_irq_handler()
428 spin_unlock_irqrestore(&emu->fx8010.irq_lock, flags); in snd_emu10k1_fx8010_register_irq_handler()
432 int snd_emu10k1_fx8010_unregister_irq_handler(struct snd_emu10k1 *emu, in snd_emu10k1_fx8010_unregister_irq_handler() argument
438 spin_lock_irqsave(&emu->fx8010.irq_lock, flags); in snd_emu10k1_fx8010_unregister_irq_handler()
439 if ((tmp = emu->fx8010.irq_handlers) == irq) { in snd_emu10k1_fx8010_unregister_irq_handler()
440 emu->fx8010.irq_handlers = tmp->next; in snd_emu10k1_fx8010_unregister_irq_handler()
441 if (emu->fx8010.irq_handlers == NULL) { in snd_emu10k1_fx8010_unregister_irq_handler()
442 snd_emu10k1_intr_disable(emu, INTE_FXDSPENABLE); in snd_emu10k1_fx8010_unregister_irq_handler()
443 emu->dsp_interrupt = NULL; in snd_emu10k1_fx8010_unregister_irq_handler()
451 spin_unlock_irqrestore(&emu->fx8010.irq_lock, flags); in snd_emu10k1_fx8010_unregister_irq_handler()
493 static void snd_emu10k1_efx_write(struct snd_emu10k1 *emu, unsigned int pc, unsigned int data) in snd_emu10k1_efx_write() argument
495 pc += emu->audigy ? A_MICROCODEBASE : MICROCODEBASE; in snd_emu10k1_efx_write()
496 snd_emu10k1_ptr_write(emu, pc, 0, data); in snd_emu10k1_efx_write()
499 unsigned int snd_emu10k1_efx_read(struct snd_emu10k1 *emu, unsigned int pc) in snd_emu10k1_efx_read() argument
501 pc += emu->audigy ? A_MICROCODEBASE : MICROCODEBASE; in snd_emu10k1_efx_read()
502 return snd_emu10k1_ptr_read(emu, pc, 0); in snd_emu10k1_efx_read()
505 static int snd_emu10k1_gpr_poke(struct snd_emu10k1 *emu, in snd_emu10k1_gpr_poke() argument
512 for (gpr = 0; gpr < (emu->audigy ? 0x200 : 0x100); gpr++) { in snd_emu10k1_gpr_poke()
519 snd_emu10k1_ptr_write(emu, emu->gpr_base + gpr, 0, val); in snd_emu10k1_gpr_poke()
524 static int snd_emu10k1_gpr_peek(struct snd_emu10k1 *emu, in snd_emu10k1_gpr_peek() argument
530 for (gpr = 0; gpr < (emu->audigy ? 0x200 : 0x100); gpr++) { in snd_emu10k1_gpr_peek()
532 val = snd_emu10k1_ptr_read(emu, emu->gpr_base + gpr, 0); in snd_emu10k1_gpr_peek()
539 static int snd_emu10k1_tram_poke(struct snd_emu10k1 *emu, in snd_emu10k1_tram_poke() argument
546 for (tram = 0; tram < (emu->audigy ? 0x100 : 0xa0); tram++) { in snd_emu10k1_tram_poke()
557 snd_emu10k1_ptr_write(emu, TANKMEMDATAREGBASE + tram, 0, val); in snd_emu10k1_tram_poke()
558 if (!emu->audigy) { in snd_emu10k1_tram_poke()
559 snd_emu10k1_ptr_write(emu, TANKMEMADDRREGBASE + tram, 0, addr); in snd_emu10k1_tram_poke()
561 snd_emu10k1_ptr_write(emu, TANKMEMADDRREGBASE + tram, 0, addr << 12); in snd_emu10k1_tram_poke()
562 snd_emu10k1_ptr_write(emu, A_TANKMEMCTLREGBASE + tram, 0, addr >> 20); in snd_emu10k1_tram_poke()
568 static int snd_emu10k1_tram_peek(struct snd_emu10k1 *emu, in snd_emu10k1_tram_peek() argument
575 for (tram = 0; tram < (emu->audigy ? 0x100 : 0xa0); tram++) { in snd_emu10k1_tram_peek()
577 val = snd_emu10k1_ptr_read(emu, TANKMEMDATAREGBASE + tram, 0); in snd_emu10k1_tram_peek()
578 if (!emu->audigy) { in snd_emu10k1_tram_peek()
579 addr = snd_emu10k1_ptr_read(emu, TANKMEMADDRREGBASE + tram, 0); in snd_emu10k1_tram_peek()
581 addr = snd_emu10k1_ptr_read(emu, TANKMEMADDRREGBASE + tram, 0) >> 12; in snd_emu10k1_tram_peek()
582 addr |= snd_emu10k1_ptr_read(emu, A_TANKMEMCTLREGBASE + tram, 0) << 20; in snd_emu10k1_tram_peek()
591 static int snd_emu10k1_code_poke(struct snd_emu10k1 *emu, in snd_emu10k1_code_poke() argument
597 for (pc = 0; pc < (emu->audigy ? 2*1024 : 2*512); pc += 2) { in snd_emu10k1_code_poke()
608 snd_emu10k1_efx_write(emu, pc + 0, lo); in snd_emu10k1_code_poke()
609 snd_emu10k1_efx_write(emu, pc + 1, hi); in snd_emu10k1_code_poke()
614 static int snd_emu10k1_code_peek(struct snd_emu10k1 *emu, in snd_emu10k1_code_peek() argument
620 for (pc = 0; pc < (emu->audigy ? 2*1024 : 2*512); pc += 2) { in snd_emu10k1_code_peek()
622 if (put_user(snd_emu10k1_efx_read(emu, pc + 0), in snd_emu10k1_code_peek()
625 if (put_user(snd_emu10k1_efx_read(emu, pc + 1), in snd_emu10k1_code_peek()
633 snd_emu10k1_look_for_ctl(struct snd_emu10k1 *emu, in snd_emu10k1_look_for_ctl() argument
640 list_for_each_entry(ctl, &emu->fx8010.gpr_ctl, list) { in snd_emu10k1_look_for_ctl()
678 static int copy_gctl(struct snd_emu10k1 *emu, in copy_gctl() argument
688 if (emu->support_tlv) { in copy_gctl()
706 static int copy_gctl_to_user(struct snd_emu10k1 *emu, in copy_gctl_to_user() argument
715 if (emu->support_tlv) in copy_gctl_to_user()
735 static int snd_emu10k1_verify_controls(struct snd_emu10k1 *emu, in snd_emu10k1_verify_controls() argument
750 if (snd_emu10k1_look_for_ctl(emu, &id) == NULL) in snd_emu10k1_verify_controls()
758 if (copy_gctl(emu, gctl, icode->gpr_add_controls, i, in snd_emu10k1_verify_controls()
763 if (snd_emu10k1_look_for_ctl(emu, &gctl->id)) in snd_emu10k1_verify_controls()
766 down_read(&emu->card->controls_rwsem); in snd_emu10k1_verify_controls()
767 if (snd_ctl_find_id(emu->card, gctl_id)) { in snd_emu10k1_verify_controls()
768 up_read(&emu->card->controls_rwsem); in snd_emu10k1_verify_controls()
772 up_read(&emu->card->controls_rwsem); in snd_emu10k1_verify_controls()
781 if (copy_gctl(emu, gctl, icode->gpr_list_controls, i, in snd_emu10k1_verify_controls()
803 static int snd_emu10k1_add_controls(struct snd_emu10k1 *emu, in snd_emu10k1_add_controls() argument
825 if (copy_gctl(emu, gctl, icode->gpr_add_controls, i, in snd_emu10k1_add_controls()
840 ctl = snd_emu10k1_look_for_ctl(emu, &gctl->id); in snd_emu10k1_add_controls()
874 if ((err = snd_ctl_add(emu->card, kctl = snd_ctl_new1(&knew, emu))) < 0) { in snd_emu10k1_add_controls()
881 list_add_tail(&ctl->list, &emu->fx8010.gpr_ctl); in snd_emu10k1_add_controls()
887 snd_ctl_notify(emu->card, SNDRV_CTL_EVENT_MASK_VALUE | in snd_emu10k1_add_controls()
899 static int snd_emu10k1_del_controls(struct snd_emu10k1 *emu, in snd_emu10k1_del_controls() argument
906 struct snd_card *card = emu->card; in snd_emu10k1_del_controls()
915 ctl = snd_emu10k1_look_for_ctl(emu, &id); in snd_emu10k1_del_controls()
923 static int snd_emu10k1_list_controls(struct snd_emu10k1 *emu, in snd_emu10k1_list_controls() argument
936 list_for_each_entry(ctl, &emu->fx8010.gpr_ctl, list) { in snd_emu10k1_list_controls()
956 if (copy_gctl_to_user(emu, icode->gpr_list_controls, in snd_emu10k1_list_controls()
969 static int snd_emu10k1_icode_poke(struct snd_emu10k1 *emu, in snd_emu10k1_icode_poke() argument
975 mutex_lock(&emu->fx8010.lock); in snd_emu10k1_icode_poke()
976 err = snd_emu10k1_verify_controls(emu, icode, in_kernel); in snd_emu10k1_icode_poke()
979 strlcpy(emu->fx8010.name, icode->name, sizeof(emu->fx8010.name)); in snd_emu10k1_icode_poke()
982 if (emu->audigy) in snd_emu10k1_icode_poke()
983 snd_emu10k1_ptr_write(emu, A_DBG, 0, emu->fx8010.dbg | A_DBG_SINGLE_STEP); in snd_emu10k1_icode_poke()
985 snd_emu10k1_ptr_write(emu, DBG, 0, emu->fx8010.dbg | EMU10K1_DBG_SINGLE_STEP); in snd_emu10k1_icode_poke()
987 err = snd_emu10k1_del_controls(emu, icode, in_kernel); in snd_emu10k1_icode_poke()
990 err = snd_emu10k1_gpr_poke(emu, icode, in_kernel); in snd_emu10k1_icode_poke()
993 err = snd_emu10k1_tram_poke(emu, icode, in_kernel); in snd_emu10k1_icode_poke()
996 err = snd_emu10k1_code_poke(emu, icode, in_kernel); in snd_emu10k1_icode_poke()
999 err = snd_emu10k1_add_controls(emu, icode, in_kernel); in snd_emu10k1_icode_poke()
1003 if (emu->audigy) in snd_emu10k1_icode_poke()
1004 snd_emu10k1_ptr_write(emu, A_DBG, 0, emu->fx8010.dbg); in snd_emu10k1_icode_poke()
1006 snd_emu10k1_ptr_write(emu, DBG, 0, emu->fx8010.dbg); in snd_emu10k1_icode_poke()
1008 mutex_unlock(&emu->fx8010.lock); in snd_emu10k1_icode_poke()
1012 static int snd_emu10k1_icode_peek(struct snd_emu10k1 *emu, in snd_emu10k1_icode_peek() argument
1017 mutex_lock(&emu->fx8010.lock); in snd_emu10k1_icode_peek()
1018 strlcpy(icode->name, emu->fx8010.name, sizeof(icode->name)); in snd_emu10k1_icode_peek()
1020 err = snd_emu10k1_gpr_peek(emu, icode); in snd_emu10k1_icode_peek()
1022 err = snd_emu10k1_tram_peek(emu, icode); in snd_emu10k1_icode_peek()
1024 err = snd_emu10k1_code_peek(emu, icode); in snd_emu10k1_icode_peek()
1026 err = snd_emu10k1_list_controls(emu, icode); in snd_emu10k1_icode_peek()
1027 mutex_unlock(&emu->fx8010.lock); in snd_emu10k1_icode_peek()
1031 static int snd_emu10k1_ipcm_poke(struct snd_emu10k1 *emu, in snd_emu10k1_ipcm_poke() argument
1044 pcm = &emu->fx8010.pcm[ipcm->substream]; in snd_emu10k1_ipcm_poke()
1045 mutex_lock(&emu->fx8010.lock); in snd_emu10k1_ipcm_poke()
1046 spin_lock_irq(&emu->reg_lock); in snd_emu10k1_ipcm_poke()
1074 spin_unlock_irq(&emu->reg_lock); in snd_emu10k1_ipcm_poke()
1075 mutex_unlock(&emu->fx8010.lock); in snd_emu10k1_ipcm_poke()
1079 static int snd_emu10k1_ipcm_peek(struct snd_emu10k1 *emu, in snd_emu10k1_ipcm_peek() argument
1090 pcm = &emu->fx8010.pcm[ipcm->substream]; in snd_emu10k1_ipcm_peek()
1091 mutex_lock(&emu->fx8010.lock); in snd_emu10k1_ipcm_peek()
1092 spin_lock_irq(&emu->reg_lock); in snd_emu10k1_ipcm_peek()
1106 spin_unlock_irq(&emu->reg_lock); in snd_emu10k1_ipcm_peek()
1107 mutex_unlock(&emu->fx8010.lock); in snd_emu10k1_ipcm_peek()
1211 static int _snd_emu10k1_audigy_init_efx(struct snd_emu10k1 *emu) in _snd_emu10k1_audigy_init_efx() argument
1262 snd_emu10k1_ptr_write(emu, A_DBG, 0, (emu->fx8010.dbg = 0) | A_DBG_SINGLE_STEP); in _snd_emu10k1_audigy_init_efx()
1282 if (emu->card_capabilities->spk71) { in _snd_emu10k1_audigy_init_efx()
1333 if (emu->card_capabilities->emu_model) { in _snd_emu10k1_audigy_init_efx()
1334 if (emu->card_capabilities->ca0108_chip) { in _snd_emu10k1_audigy_init_efx()
1365 emu->card_capabilities->ac97_chip ? "Audigy CD Playback Volume" : "CD Playback Volume", in _snd_emu10k1_audigy_init_efx()
1372 emu->card_capabilities->ac97_chip ? "Audigy CD Capture Volume" : "CD Capture Volume", in _snd_emu10k1_audigy_init_efx()
1391 emu->card_capabilities->ac97_chip ? "Line2 Playback Volume" : "Line Playback Volume", in _snd_emu10k1_audigy_init_efx()
1398 emu->card_capabilities->ac97_chip ? "Line2 Capture Volume" : "Line Capture Volume", in _snd_emu10k1_audigy_init_efx()
1417 emu->card_capabilities->ac97_chip ? "Aux2 Playback Volume" : "Aux Playback Volume", in _snd_emu10k1_audigy_init_efx()
1424 emu->card_capabilities->ac97_chip ? "Aux2 Capture Volume" : "Aux Capture Volume", in _snd_emu10k1_audigy_init_efx()
1452 if (emu->card_capabilities->spk71) { in _snd_emu10k1_audigy_init_efx()
1486 if (emu->card_capabilities->spk71) { in _snd_emu10k1_audigy_init_efx()
1579 if (emu->card_capabilities->spk71) in _snd_emu10k1_audigy_init_efx()
1587 if (emu->card_capabilities->emu_model) { in _snd_emu10k1_audigy_init_efx()
1589 dev_info(emu->card->dev, "EMU outputs on\n"); in _snd_emu10k1_audigy_init_efx()
1591 if (emu->card_capabilities->ca0108_chip) { in _snd_emu10k1_audigy_init_efx()
1611 if ((z==1) && (emu->card_capabilities->spdif_bug)) { in _snd_emu10k1_audigy_init_efx()
1613 dev_info(emu->card->dev, in _snd_emu10k1_audigy_init_efx()
1615 emu->card_capabilities->name); in _snd_emu10k1_audigy_init_efx()
1637 if (emu->card_capabilities->emu_model) { in _snd_emu10k1_audigy_init_efx()
1638 if (emu->card_capabilities->ca0108_chip) { in _snd_emu10k1_audigy_init_efx()
1639 dev_info(emu->card->dev, "EMU2 inputs on\n"); in _snd_emu10k1_audigy_init_efx()
1647 dev_info(emu->card->dev, "EMU inputs on\n"); in _snd_emu10k1_audigy_init_efx()
1784 emu->support_tlv = 1; /* support TLV */ in _snd_emu10k1_audigy_init_efx()
1785 err = snd_emu10k1_icode_poke(emu, icode, true); in _snd_emu10k1_audigy_init_efx()
1786 emu->support_tlv = 0; /* clear again */ in _snd_emu10k1_audigy_init_efx()
1850 static int _snd_emu10k1_init_efx(struct snd_emu10k1 *emu) in _snd_emu10k1_init_efx() argument
1904 snd_emu10k1_ptr_write(emu, DBG, 0, (emu->fx8010.dbg = 0) | EMU10K1_DBG_SINGLE_STEP); in _snd_emu10k1_init_efx()
2086 if (emu->fx8010.extin_mask & ((1<<EXTIN_AC97_L)|(1<<EXTIN_AC97_R))) { in _snd_emu10k1_init_efx()
2097 if (emu->fx8010.extin_mask & ((1<<EXTIN_SPDIF_CD_L)|(1<<EXTIN_SPDIF_CD_R))) { in _snd_emu10k1_init_efx()
2114 if (emu->fx8010.extin_mask & ((1<<EXTIN_ZOOM_L)|(1<<EXTIN_ZOOM_R))) { in _snd_emu10k1_init_efx()
2131 if (emu->fx8010.extin_mask & ((1<<EXTIN_TOSLINK_L)|(1<<EXTIN_TOSLINK_R))) { in _snd_emu10k1_init_efx()
2148 if (emu->fx8010.extin_mask & ((1<<EXTIN_LINE1_L)|(1<<EXTIN_LINE1_R))) { in _snd_emu10k1_init_efx()
2165 if (emu->fx8010.extin_mask & ((1<<EXTIN_COAX_SPDIF_L)|(1<<EXTIN_COAX_SPDIF_R))) { in _snd_emu10k1_init_efx()
2182 if (emu->fx8010.extin_mask & ((1<<EXTIN_LINE2_L)|(1<<EXTIN_LINE2_R))) { in _snd_emu10k1_init_efx()
2287 if (emu->fx8010.extout_mask & ((1<<EXTOUT_AC97_L)|(1<<EXTOUT_AC97_R))) { in _snd_emu10k1_init_efx()
2294 if (emu->fx8010.extout_mask & ((1<<EXTOUT_TOSLINK_L)|(1<<EXTOUT_TOSLINK_R))) { in _snd_emu10k1_init_efx()
2311 if (emu->fx8010.extout_mask & ((1<<EXTOUT_HEADPHONE_L)|(1<<EXTOUT_HEADPHONE_R))) { in _snd_emu10k1_init_efx()
2332 if (emu->fx8010.extout_mask & ((1<<EXTOUT_REAR_L)|(1<<EXTOUT_REAR_R))) in _snd_emu10k1_init_efx()
2336 if (emu->fx8010.extout_mask & ((1<<EXTOUT_AC97_REAR_L)|(1<<EXTOUT_AC97_REAR_R))) in _snd_emu10k1_init_efx()
2340 if (emu->fx8010.extout_mask & (1<<EXTOUT_AC97_CENTER)) { in _snd_emu10k1_init_efx()
2350 if (emu->fx8010.extout_mask & (1<<EXTOUT_AC97_LFE)) { in _snd_emu10k1_init_efx()
2365 if (emu->fx8010.extout_mask & (1<<EXTOUT_MIC_CAP)) in _snd_emu10k1_init_efx()
2369 if (emu->card_capabilities->sblive51) { in _snd_emu10k1_init_efx()
2406 if ((err = snd_emu10k1_fx8010_tram_setup(emu, ipcm->buffer_size)) < 0) in _snd_emu10k1_init_efx()
2410 emu->support_tlv = 1; /* support TLV */ in _snd_emu10k1_init_efx()
2411 err = snd_emu10k1_icode_poke(emu, icode, true); in _snd_emu10k1_init_efx()
2412 emu->support_tlv = 0; /* clear again */ in _snd_emu10k1_init_efx()
2414 err = snd_emu10k1_ipcm_poke(emu, ipcm); in _snd_emu10k1_init_efx()
2426 int snd_emu10k1_init_efx(struct snd_emu10k1 *emu) in snd_emu10k1_init_efx() argument
2428 spin_lock_init(&emu->fx8010.irq_lock); in snd_emu10k1_init_efx()
2429 INIT_LIST_HEAD(&emu->fx8010.gpr_ctl); in snd_emu10k1_init_efx()
2430 if (emu->audigy) in snd_emu10k1_init_efx()
2431 return _snd_emu10k1_audigy_init_efx(emu); in snd_emu10k1_init_efx()
2433 return _snd_emu10k1_init_efx(emu); in snd_emu10k1_init_efx()
2436 void snd_emu10k1_free_efx(struct snd_emu10k1 *emu) in snd_emu10k1_free_efx() argument
2439 if (emu->audigy) in snd_emu10k1_free_efx()
2440 snd_emu10k1_ptr_write(emu, A_DBG, 0, emu->fx8010.dbg = A_DBG_SINGLE_STEP); in snd_emu10k1_free_efx()
2442 snd_emu10k1_ptr_write(emu, DBG, 0, emu->fx8010.dbg = EMU10K1_DBG_SINGLE_STEP); in snd_emu10k1_free_efx()
2446 int snd_emu10k1_fx8010_tone_control_activate(struct snd_emu10k1 *emu, int output)
2450 snd_emu10k1_ptr_write(emu, emu->gpr_base + 0x94 + output, 0, 1);
2454 int snd_emu10k1_fx8010_tone_control_deactivate(struct snd_emu10k1 *emu, int output)
2458 snd_emu10k1_ptr_write(emu, emu->gpr_base + 0x94 + output, 0, 0);
2463 int snd_emu10k1_fx8010_tram_setup(struct snd_emu10k1 *emu, u32 size) in snd_emu10k1_fx8010_tram_setup() argument
2477 if ((emu->fx8010.etram_pages.bytes / 2) == size) in snd_emu10k1_fx8010_tram_setup()
2479 spin_lock_irq(&emu->emu_lock); in snd_emu10k1_fx8010_tram_setup()
2480 outl(HCFG_LOCKTANKCACHE_MASK | inl(emu->port + HCFG), emu->port + HCFG); in snd_emu10k1_fx8010_tram_setup()
2481 spin_unlock_irq(&emu->emu_lock); in snd_emu10k1_fx8010_tram_setup()
2482 snd_emu10k1_ptr_write(emu, TCB, 0, 0); in snd_emu10k1_fx8010_tram_setup()
2483 snd_emu10k1_ptr_write(emu, TCBS, 0, 0); in snd_emu10k1_fx8010_tram_setup()
2484 if (emu->fx8010.etram_pages.area != NULL) { in snd_emu10k1_fx8010_tram_setup()
2485 snd_dma_free_pages(&emu->fx8010.etram_pages); in snd_emu10k1_fx8010_tram_setup()
2486 emu->fx8010.etram_pages.area = NULL; in snd_emu10k1_fx8010_tram_setup()
2487 emu->fx8010.etram_pages.bytes = 0; in snd_emu10k1_fx8010_tram_setup()
2491 if (snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, &emu->pci->dev, in snd_emu10k1_fx8010_tram_setup()
2492 size * 2, &emu->fx8010.etram_pages) < 0) in snd_emu10k1_fx8010_tram_setup()
2494 memset(emu->fx8010.etram_pages.area, 0, size * 2); in snd_emu10k1_fx8010_tram_setup()
2495 snd_emu10k1_ptr_write(emu, TCB, 0, emu->fx8010.etram_pages.addr); in snd_emu10k1_fx8010_tram_setup()
2496 snd_emu10k1_ptr_write(emu, TCBS, 0, size_reg); in snd_emu10k1_fx8010_tram_setup()
2497 spin_lock_irq(&emu->emu_lock); in snd_emu10k1_fx8010_tram_setup()
2498 outl(inl(emu->port + HCFG) & ~HCFG_LOCKTANKCACHE_MASK, emu->port + HCFG); in snd_emu10k1_fx8010_tram_setup()
2499 spin_unlock_irq(&emu->emu_lock); in snd_emu10k1_fx8010_tram_setup()
2518 static void snd_emu10k1_fx8010_info(struct snd_emu10k1 *emu, in snd_emu10k1_fx8010_info() argument
2525 info->internal_tram_size = emu->fx8010.itram_size; in snd_emu10k1_fx8010_info()
2526 info->external_tram_size = emu->fx8010.etram_pages.bytes / 2; in snd_emu10k1_fx8010_info()
2528 extin = emu->audigy ? audigy_ins : creative_ins; in snd_emu10k1_fx8010_info()
2529 extout = emu->audigy ? audigy_outs : creative_outs; in snd_emu10k1_fx8010_info()
2530 fxbus_mask = emu->fx8010.fxbus_mask; in snd_emu10k1_fx8010_info()
2531 extin_mask = emu->fx8010.extin_mask; in snd_emu10k1_fx8010_info()
2532 extout_mask = emu->fx8010.extout_mask; in snd_emu10k1_fx8010_info()
2540 info->gpr_controls = emu->fx8010.gpr_count; in snd_emu10k1_fx8010_info()
2545 struct snd_emu10k1 *emu = hw->private_data; in snd_emu10k1_fx8010_ioctl() local
2555 emu->support_tlv = 1; in snd_emu10k1_fx8010_ioctl()
2561 snd_emu10k1_fx8010_info(emu, info); in snd_emu10k1_fx8010_ioctl()
2575 res = snd_emu10k1_icode_poke(emu, icode, false); in snd_emu10k1_fx8010_ioctl()
2582 res = snd_emu10k1_icode_peek(emu, icode); in snd_emu10k1_fx8010_ioctl()
2593 res = snd_emu10k1_ipcm_poke(emu, ipcm); in snd_emu10k1_fx8010_ioctl()
2600 res = snd_emu10k1_ipcm_peek(emu, ipcm); in snd_emu10k1_fx8010_ioctl()
2612 mutex_lock(&emu->fx8010.lock); in snd_emu10k1_fx8010_ioctl()
2613 res = snd_emu10k1_fx8010_tram_setup(emu, addr); in snd_emu10k1_fx8010_ioctl()
2614 mutex_unlock(&emu->fx8010.lock); in snd_emu10k1_fx8010_ioctl()
2619 if (emu->audigy) in snd_emu10k1_fx8010_ioctl()
2620 snd_emu10k1_ptr_write(emu, A_DBG, 0, emu->fx8010.dbg |= A_DBG_SINGLE_STEP); in snd_emu10k1_fx8010_ioctl()
2622 snd_emu10k1_ptr_write(emu, DBG, 0, emu->fx8010.dbg |= EMU10K1_DBG_SINGLE_STEP); in snd_emu10k1_fx8010_ioctl()
2627 if (emu->audigy) in snd_emu10k1_fx8010_ioctl()
2628 snd_emu10k1_ptr_write(emu, A_DBG, 0, emu->fx8010.dbg = 0); in snd_emu10k1_fx8010_ioctl()
2630 snd_emu10k1_ptr_write(emu, DBG, 0, emu->fx8010.dbg = 0); in snd_emu10k1_fx8010_ioctl()
2635 if (emu->audigy) in snd_emu10k1_fx8010_ioctl()
2636 snd_emu10k1_ptr_write(emu, A_DBG, 0, emu->fx8010.dbg | A_DBG_ZC); in snd_emu10k1_fx8010_ioctl()
2638 snd_emu10k1_ptr_write(emu, DBG, 0, emu->fx8010.dbg | EMU10K1_DBG_ZC); in snd_emu10k1_fx8010_ioctl()
2640 if (emu->audigy) in snd_emu10k1_fx8010_ioctl()
2641 snd_emu10k1_ptr_write(emu, A_DBG, 0, emu->fx8010.dbg); in snd_emu10k1_fx8010_ioctl()
2643 snd_emu10k1_ptr_write(emu, DBG, 0, emu->fx8010.dbg); in snd_emu10k1_fx8010_ioctl()
2652 if (emu->audigy) in snd_emu10k1_fx8010_ioctl()
2653 snd_emu10k1_ptr_write(emu, A_DBG, 0, emu->fx8010.dbg |= A_DBG_SINGLE_STEP | addr); in snd_emu10k1_fx8010_ioctl()
2655 snd_emu10k1_ptr_write(emu, DBG, 0, emu->fx8010.dbg |= EMU10K1_DBG_SINGLE_STEP | addr); in snd_emu10k1_fx8010_ioctl()
2657 if (emu->audigy) in snd_emu10k1_fx8010_ioctl()
2658 …snd_emu10k1_ptr_write(emu, A_DBG, 0, emu->fx8010.dbg |= A_DBG_SINGLE_STEP | A_DBG_STEP_ADDR | addr… in snd_emu10k1_fx8010_ioctl()
2660 …snd_emu10k1_ptr_write(emu, DBG, 0, emu->fx8010.dbg |= EMU10K1_DBG_SINGLE_STEP | EMU10K1_DBG_STEP |… in snd_emu10k1_fx8010_ioctl()
2663 if (emu->audigy) in snd_emu10k1_fx8010_ioctl()
2664 addr = snd_emu10k1_ptr_read(emu, A_DBG, 0); in snd_emu10k1_fx8010_ioctl()
2666 addr = snd_emu10k1_ptr_read(emu, DBG, 0); in snd_emu10k1_fx8010_ioctl()
2679 int snd_emu10k1_fx8010_new(struct snd_emu10k1 *emu, int device) in snd_emu10k1_fx8010_new() argument
2684 if ((err = snd_hwdep_new(emu->card, "FX8010", device, &hw)) < 0) in snd_emu10k1_fx8010_new()
2691 hw->private_data = emu; in snd_emu10k1_fx8010_new()
2696 int snd_emu10k1_efx_alloc_pm_buffer(struct snd_emu10k1 *emu) in snd_emu10k1_efx_alloc_pm_buffer() argument
2700 len = emu->audigy ? 0x200 : 0x100; in snd_emu10k1_efx_alloc_pm_buffer()
2701 emu->saved_gpr = kmalloc_array(len, 4, GFP_KERNEL); in snd_emu10k1_efx_alloc_pm_buffer()
2702 if (! emu->saved_gpr) in snd_emu10k1_efx_alloc_pm_buffer()
2704 len = emu->audigy ? 0x100 : 0xa0; in snd_emu10k1_efx_alloc_pm_buffer()
2705 emu->tram_val_saved = kmalloc_array(len, 4, GFP_KERNEL); in snd_emu10k1_efx_alloc_pm_buffer()
2706 emu->tram_addr_saved = kmalloc_array(len, 4, GFP_KERNEL); in snd_emu10k1_efx_alloc_pm_buffer()
2707 if (! emu->tram_val_saved || ! emu->tram_addr_saved) in snd_emu10k1_efx_alloc_pm_buffer()
2709 len = emu->audigy ? 2 * 1024 : 2 * 512; in snd_emu10k1_efx_alloc_pm_buffer()
2710 emu->saved_icode = vmalloc(array_size(len, 4)); in snd_emu10k1_efx_alloc_pm_buffer()
2711 if (! emu->saved_icode) in snd_emu10k1_efx_alloc_pm_buffer()
2716 void snd_emu10k1_efx_free_pm_buffer(struct snd_emu10k1 *emu) in snd_emu10k1_efx_free_pm_buffer() argument
2718 kfree(emu->saved_gpr); in snd_emu10k1_efx_free_pm_buffer()
2719 kfree(emu->tram_val_saved); in snd_emu10k1_efx_free_pm_buffer()
2720 kfree(emu->tram_addr_saved); in snd_emu10k1_efx_free_pm_buffer()
2721 vfree(emu->saved_icode); in snd_emu10k1_efx_free_pm_buffer()
2727 void snd_emu10k1_efx_suspend(struct snd_emu10k1 *emu) in snd_emu10k1_efx_suspend() argument
2731 len = emu->audigy ? 0x200 : 0x100; in snd_emu10k1_efx_suspend()
2733 emu->saved_gpr[i] = snd_emu10k1_ptr_read(emu, emu->gpr_base + i, 0); in snd_emu10k1_efx_suspend()
2735 len = emu->audigy ? 0x100 : 0xa0; in snd_emu10k1_efx_suspend()
2737 emu->tram_val_saved[i] = snd_emu10k1_ptr_read(emu, TANKMEMDATAREGBASE + i, 0); in snd_emu10k1_efx_suspend()
2738 emu->tram_addr_saved[i] = snd_emu10k1_ptr_read(emu, TANKMEMADDRREGBASE + i, 0); in snd_emu10k1_efx_suspend()
2739 if (emu->audigy) { in snd_emu10k1_efx_suspend()
2740 emu->tram_addr_saved[i] >>= 12; in snd_emu10k1_efx_suspend()
2741 emu->tram_addr_saved[i] |= in snd_emu10k1_efx_suspend()
2742 snd_emu10k1_ptr_read(emu, A_TANKMEMCTLREGBASE + i, 0) << 20; in snd_emu10k1_efx_suspend()
2746 len = emu->audigy ? 2 * 1024 : 2 * 512; in snd_emu10k1_efx_suspend()
2748 emu->saved_icode[i] = snd_emu10k1_efx_read(emu, i); in snd_emu10k1_efx_suspend()
2751 void snd_emu10k1_efx_resume(struct snd_emu10k1 *emu) in snd_emu10k1_efx_resume() argument
2756 if (emu->fx8010.etram_pages.bytes > 0) { in snd_emu10k1_efx_resume()
2758 size = emu->fx8010.etram_pages.bytes / 2; in snd_emu10k1_efx_resume()
2764 outl(HCFG_LOCKTANKCACHE_MASK | inl(emu->port + HCFG), emu->port + HCFG); in snd_emu10k1_efx_resume()
2765 snd_emu10k1_ptr_write(emu, TCB, 0, emu->fx8010.etram_pages.addr); in snd_emu10k1_efx_resume()
2766 snd_emu10k1_ptr_write(emu, TCBS, 0, size_reg); in snd_emu10k1_efx_resume()
2767 outl(inl(emu->port + HCFG) & ~HCFG_LOCKTANKCACHE_MASK, emu->port + HCFG); in snd_emu10k1_efx_resume()
2770 if (emu->audigy) in snd_emu10k1_efx_resume()
2771 snd_emu10k1_ptr_write(emu, A_DBG, 0, emu->fx8010.dbg | A_DBG_SINGLE_STEP); in snd_emu10k1_efx_resume()
2773 snd_emu10k1_ptr_write(emu, DBG, 0, emu->fx8010.dbg | EMU10K1_DBG_SINGLE_STEP); in snd_emu10k1_efx_resume()
2775 len = emu->audigy ? 0x200 : 0x100; in snd_emu10k1_efx_resume()
2777 snd_emu10k1_ptr_write(emu, emu->gpr_base + i, 0, emu->saved_gpr[i]); in snd_emu10k1_efx_resume()
2779 len = emu->audigy ? 0x100 : 0xa0; in snd_emu10k1_efx_resume()
2781 snd_emu10k1_ptr_write(emu, TANKMEMDATAREGBASE + i, 0, in snd_emu10k1_efx_resume()
2782 emu->tram_val_saved[i]); in snd_emu10k1_efx_resume()
2783 if (! emu->audigy) in snd_emu10k1_efx_resume()
2784 snd_emu10k1_ptr_write(emu, TANKMEMADDRREGBASE + i, 0, in snd_emu10k1_efx_resume()
2785 emu->tram_addr_saved[i]); in snd_emu10k1_efx_resume()
2787 snd_emu10k1_ptr_write(emu, TANKMEMADDRREGBASE + i, 0, in snd_emu10k1_efx_resume()
2788 emu->tram_addr_saved[i] << 12); in snd_emu10k1_efx_resume()
2789 snd_emu10k1_ptr_write(emu, TANKMEMADDRREGBASE + i, 0, in snd_emu10k1_efx_resume()
2790 emu->tram_addr_saved[i] >> 20); in snd_emu10k1_efx_resume()
2794 len = emu->audigy ? 2 * 1024 : 2 * 512; in snd_emu10k1_efx_resume()
2796 snd_emu10k1_efx_write(emu, i, emu->saved_icode[i]); in snd_emu10k1_efx_resume()
2799 if (emu->audigy) in snd_emu10k1_efx_resume()
2800 snd_emu10k1_ptr_write(emu, A_DBG, 0, emu->fx8010.dbg); in snd_emu10k1_efx_resume()
2802 snd_emu10k1_ptr_write(emu, DBG, 0, emu->fx8010.dbg); in snd_emu10k1_efx_resume()