Lines Matching +full:serial +full:- +full:midi

1 // SPDX-License-Identifier: GPL-2.0-or-later
7 * Copyright (c) by James Courtier-Dutton <[email protected]>
10 * --
15 * - EMU10K1X-DBQ
16 * - STAC 9708T
21 #include <linux/dma-mapping.h>
62 #define IPR_MIDITRANSBUFEMPTY 0x00000001 /* MIDI UART transmit buffer empty */
63 #define IPR_MIDIRECVBUFEMPTY 0x00000002 /* MIDI UART receive buffer empty */
70 #define INTE_MIDITXENABLE 0x00000001 /* Enable MIDI transmit-buffer-empty interrupts */
71 #define INTE_MIDIRXENABLE 0x00000002 /* Enable MIDI receive-buffer-empty interrupts */
81 #define HCFG_AUDIOENABLE 0x00000001 /* 0 = CODECs transmit zero-valued samples */
84 #define GPIO 0x18 /* Defaults: 00001080-Analog, 00001000-SPDIF. */
92 /* Emu10k1x pointer-offset register set, accessed through the PTR and DATA registers */
100 #define PLAYBACK_LIST_SIZE 0x01 /* Size of list in bytes << 16. E.g. 8 periods -> 0x00380000 */
114 /* From 0x20 - 0x3f, last samples played on each channel */
149 #define SPCS_GENERATIONSTATUS 0x00008000 /* Originality flag (see IEC-958 spec) */
150 #define SPCS_CATEGORYCODEMASK 0x00007f00 /* Category code (see IEC-958 spec) */
151 #define SPCS_MODEMASK 0x000000c0 /* Mode (see IEC-958 spec) */
155 #define SPCS_COPYRIGHT 0x00000004 /* Copyright asserted flag -- do not modify */
157 #define SPCS_PROFESSIONAL 0x00000001 /* 0 = Consumer (IEC-958), 1 = pro (AES3-1992) */
159 #define SPDIF_SELECT 0x45 /* Enables SPDIF or Analogue outputs 0-Analogue, 0x700-SPDIF */
166 /* From 0x50 - 0x5f, last samples captured */
170 * - channel 0 is the front channel
171 * - channel 1 is the rear channel
172 * - channel 2 is the center/lfe channel
175 * Surround Playback Volume. The Sigmatel 4-Speaker Stereo switch affects
177 * 4-Speaker Stereo, both front and rear channels will be mixed in the
213 // definition of the chip-specific record
222 unsigned int serial; /* serial number */ member
237 struct emu10k1x_midi midi; member
288 spin_lock_irqsave(&emu->emu_lock, flags); in snd_emu10k1x_ptr_read()
289 outl(regptr, emu->port + PTR); in snd_emu10k1x_ptr_read()
290 val = inl(emu->port + DATA); in snd_emu10k1x_ptr_read()
291 spin_unlock_irqrestore(&emu->emu_lock, flags); in snd_emu10k1x_ptr_read()
305 spin_lock_irqsave(&emu->emu_lock, flags); in snd_emu10k1x_ptr_write()
306 outl(regptr, emu->port + PTR); in snd_emu10k1x_ptr_write()
307 outl(data, emu->port + DATA); in snd_emu10k1x_ptr_write()
308 spin_unlock_irqrestore(&emu->emu_lock, flags); in snd_emu10k1x_ptr_write()
316 spin_lock_irqsave(&emu->emu_lock, flags); in snd_emu10k1x_intr_enable()
317 intr_enable = inl(emu->port + INTE) | intrenb; in snd_emu10k1x_intr_enable()
318 outl(intr_enable, emu->port + INTE); in snd_emu10k1x_intr_enable()
319 spin_unlock_irqrestore(&emu->emu_lock, flags); in snd_emu10k1x_intr_enable()
327 spin_lock_irqsave(&emu->emu_lock, flags); in snd_emu10k1x_intr_disable()
328 intr_enable = inl(emu->port + INTE) & ~intrenb; in snd_emu10k1x_intr_disable()
329 outl(intr_enable, emu->port + INTE); in snd_emu10k1x_intr_disable()
330 spin_unlock_irqrestore(&emu->emu_lock, flags); in snd_emu10k1x_intr_disable()
337 spin_lock_irqsave(&emu->emu_lock, flags); in snd_emu10k1x_gpio_write()
338 outl(value, emu->port + GPIO); in snd_emu10k1x_gpio_write()
339 spin_unlock_irqrestore(&emu->emu_lock, flags); in snd_emu10k1x_gpio_write()
344 kfree(runtime->private_data); in snd_emu10k1x_pcm_free_substream()
351 epcm = voice->epcm; in snd_emu10k1x_pcm_interrupt()
354 if (epcm->substream == NULL) in snd_emu10k1x_pcm_interrupt()
357 dev_info(emu->card->dev, in snd_emu10k1x_pcm_interrupt()
359 epcm->substream->ops->pointer(epcm->substream), in snd_emu10k1x_pcm_interrupt()
360 snd_pcm_lib_period_bytes(epcm->substream), in snd_emu10k1x_pcm_interrupt()
361 snd_pcm_lib_buffer_bytes(epcm->substream)); in snd_emu10k1x_pcm_interrupt()
363 snd_pcm_period_elapsed(epcm->substream); in snd_emu10k1x_pcm_interrupt()
371 struct snd_pcm_runtime *runtime = substream->runtime; in snd_emu10k1x_playback_open()
383 return -ENOMEM; in snd_emu10k1x_playback_open()
384 epcm->emu = chip; in snd_emu10k1x_playback_open()
385 epcm->substream = substream; in snd_emu10k1x_playback_open()
387 runtime->private_data = epcm; in snd_emu10k1x_playback_open()
388 runtime->private_free = snd_emu10k1x_pcm_free_substream; in snd_emu10k1x_playback_open()
390 runtime->hw = snd_emu10k1x_playback_hw; in snd_emu10k1x_playback_open()
405 struct snd_pcm_runtime *runtime = substream->runtime; in snd_emu10k1x_pcm_hw_params()
406 struct emu10k1x_pcm *epcm = runtime->private_data; in snd_emu10k1x_pcm_hw_params()
408 if (! epcm->voice) { in snd_emu10k1x_pcm_hw_params()
409 epcm->voice = &epcm->emu->voices[substream->pcm->device]; in snd_emu10k1x_pcm_hw_params()
410 epcm->voice->use = 1; in snd_emu10k1x_pcm_hw_params()
411 epcm->voice->epcm = epcm; in snd_emu10k1x_pcm_hw_params()
420 struct snd_pcm_runtime *runtime = substream->runtime; in snd_emu10k1x_pcm_hw_free()
423 if (runtime->private_data == NULL) in snd_emu10k1x_pcm_hw_free()
426 epcm = runtime->private_data; in snd_emu10k1x_pcm_hw_free()
428 if (epcm->voice) { in snd_emu10k1x_pcm_hw_free()
429 epcm->voice->use = 0; in snd_emu10k1x_pcm_hw_free()
430 epcm->voice->epcm = NULL; in snd_emu10k1x_pcm_hw_free()
431 epcm->voice = NULL; in snd_emu10k1x_pcm_hw_free()
441 struct snd_pcm_runtime *runtime = substream->runtime; in snd_emu10k1x_pcm_prepare()
442 struct emu10k1x_pcm *epcm = runtime->private_data; in snd_emu10k1x_pcm_prepare()
443 int voice = epcm->voice->number; in snd_emu10k1x_pcm_prepare()
444 u32 *table_base = (u32 *)(emu->dma_buffer->area+1024*voice); in snd_emu10k1x_pcm_prepare()
445 u32 period_size_bytes = frames_to_bytes(runtime, runtime->period_size); in snd_emu10k1x_pcm_prepare()
448 for(i = 0; i < runtime->periods; i++) { in snd_emu10k1x_pcm_prepare()
449 *table_base++=runtime->dma_addr+(i*period_size_bytes); in snd_emu10k1x_pcm_prepare()
453 snd_emu10k1x_ptr_write(emu, PLAYBACK_LIST_ADDR, voice, emu->dma_buffer->addr+1024*voice); in snd_emu10k1x_pcm_prepare()
454 snd_emu10k1x_ptr_write(emu, PLAYBACK_LIST_SIZE, voice, (runtime->periods - 1) << 19); in snd_emu10k1x_pcm_prepare()
459 snd_emu10k1x_ptr_write(emu, PLAYBACK_DMA_ADDR, voice, runtime->dma_addr); in snd_emu10k1x_pcm_prepare()
461 …snd_emu10k1x_ptr_write(emu, PLAYBACK_PERIOD_SIZE, voice, frames_to_bytes(runtime, runtime->period_… in snd_emu10k1x_pcm_prepare()
471 struct snd_pcm_runtime *runtime = substream->runtime; in snd_emu10k1x_pcm_trigger()
472 struct emu10k1x_pcm *epcm = runtime->private_data; in snd_emu10k1x_pcm_trigger()
473 int channel = epcm->voice->number; in snd_emu10k1x_pcm_trigger()
477 dev_dbg(emu->card->dev, in snd_emu10k1x_pcm_trigger()
478 "trigger - emu10k1x = 0x%x, cmd = %i, pointer = %d\n", in snd_emu10k1x_pcm_trigger()
479 (int)emu, cmd, (int)substream->ops->pointer(substream)); in snd_emu10k1x_pcm_trigger()
484 if(runtime->periods == 2) in snd_emu10k1x_pcm_trigger()
488 epcm->running = 1; in snd_emu10k1x_pcm_trigger()
492 epcm->running = 0; in snd_emu10k1x_pcm_trigger()
497 result = -EINVAL; in snd_emu10k1x_pcm_trigger()
508 struct snd_pcm_runtime *runtime = substream->runtime; in snd_emu10k1x_pcm_pointer()
509 struct emu10k1x_pcm *epcm = runtime->private_data; in snd_emu10k1x_pcm_pointer()
510 int channel = epcm->voice->number; in snd_emu10k1x_pcm_pointer()
513 if (!epcm->running) in snd_emu10k1x_pcm_pointer()
520 if(ptr4 == 0 && ptr1 == frames_to_bytes(runtime, runtime->buffer_size)) in snd_emu10k1x_pcm_pointer()
526 ptr2 += (ptr4 >> 3) * runtime->period_size; in snd_emu10k1x_pcm_pointer()
529 if (ptr >= runtime->buffer_size) in snd_emu10k1x_pcm_pointer()
530 ptr -= runtime->buffer_size; in snd_emu10k1x_pcm_pointer()
551 struct snd_pcm_runtime *runtime = substream->runtime; in snd_emu10k1x_pcm_open_capture()
563 return -ENOMEM; in snd_emu10k1x_pcm_open_capture()
565 epcm->emu = chip; in snd_emu10k1x_pcm_open_capture()
566 epcm->substream = substream; in snd_emu10k1x_pcm_open_capture()
568 runtime->private_data = epcm; in snd_emu10k1x_pcm_open_capture()
569 runtime->private_free = snd_emu10k1x_pcm_free_substream; in snd_emu10k1x_pcm_open_capture()
571 runtime->hw = snd_emu10k1x_capture_hw; in snd_emu10k1x_pcm_open_capture()
586 struct snd_pcm_runtime *runtime = substream->runtime; in snd_emu10k1x_pcm_hw_params_capture()
587 struct emu10k1x_pcm *epcm = runtime->private_data; in snd_emu10k1x_pcm_hw_params_capture()
589 if (! epcm->voice) { in snd_emu10k1x_pcm_hw_params_capture()
590 if (epcm->emu->capture_voice.use) in snd_emu10k1x_pcm_hw_params_capture()
591 return -EBUSY; in snd_emu10k1x_pcm_hw_params_capture()
592 epcm->voice = &epcm->emu->capture_voice; in snd_emu10k1x_pcm_hw_params_capture()
593 epcm->voice->epcm = epcm; in snd_emu10k1x_pcm_hw_params_capture()
594 epcm->voice->use = 1; in snd_emu10k1x_pcm_hw_params_capture()
603 struct snd_pcm_runtime *runtime = substream->runtime; in snd_emu10k1x_pcm_hw_free_capture()
607 if (runtime->private_data == NULL) in snd_emu10k1x_pcm_hw_free_capture()
609 epcm = runtime->private_data; in snd_emu10k1x_pcm_hw_free_capture()
611 if (epcm->voice) { in snd_emu10k1x_pcm_hw_free_capture()
612 epcm->voice->use = 0; in snd_emu10k1x_pcm_hw_free_capture()
613 epcm->voice->epcm = NULL; in snd_emu10k1x_pcm_hw_free_capture()
614 epcm->voice = NULL; in snd_emu10k1x_pcm_hw_free_capture()
624 struct snd_pcm_runtime *runtime = substream->runtime; in snd_emu10k1x_pcm_prepare_capture()
626 snd_emu10k1x_ptr_write(emu, CAPTURE_DMA_ADDR, 0, runtime->dma_addr); in snd_emu10k1x_pcm_prepare_capture()
627 …snd_emu10k1x_ptr_write(emu, CAPTURE_BUFFER_SIZE, 0, frames_to_bytes(runtime, runtime->buffer_size)… in snd_emu10k1x_pcm_prepare_capture()
639 struct snd_pcm_runtime *runtime = substream->runtime; in snd_emu10k1x_pcm_trigger_capture()
640 struct emu10k1x_pcm *epcm = runtime->private_data; in snd_emu10k1x_pcm_trigger_capture()
648 epcm->running = 1; in snd_emu10k1x_pcm_trigger_capture()
651 epcm->running = 0; in snd_emu10k1x_pcm_trigger_capture()
657 result = -EINVAL; in snd_emu10k1x_pcm_trigger_capture()
668 struct snd_pcm_runtime *runtime = substream->runtime; in snd_emu10k1x_pcm_pointer_capture()
669 struct emu10k1x_pcm *epcm = runtime->private_data; in snd_emu10k1x_pcm_pointer_capture()
672 if (!epcm->running) in snd_emu10k1x_pcm_pointer_capture()
676 if (ptr >= runtime->buffer_size) in snd_emu10k1x_pcm_pointer_capture()
677 ptr -= runtime->buffer_size; in snd_emu10k1x_pcm_pointer_capture()
695 struct emu10k1x *emu = ac97->private_data; in snd_emu10k1x_ac97_read()
699 spin_lock_irqsave(&emu->emu_lock, flags); in snd_emu10k1x_ac97_read()
700 outb(reg, emu->port + AC97ADDRESS); in snd_emu10k1x_ac97_read()
701 val = inw(emu->port + AC97DATA); in snd_emu10k1x_ac97_read()
702 spin_unlock_irqrestore(&emu->emu_lock, flags); in snd_emu10k1x_ac97_read()
709 struct emu10k1x *emu = ac97->private_data; in snd_emu10k1x_ac97_write()
712 spin_lock_irqsave(&emu->emu_lock, flags); in snd_emu10k1x_ac97_write()
713 outb(reg, emu->port + AC97ADDRESS); in snd_emu10k1x_ac97_write()
714 outw(val, emu->port + AC97DATA); in snd_emu10k1x_ac97_write()
715 spin_unlock_irqrestore(&emu->emu_lock, flags); in snd_emu10k1x_ac97_write()
728 err = snd_ac97_bus(chip->card, 0, &ops, NULL, &pbus); in snd_emu10k1x_ac97()
731 pbus->no_vra = 1; /* we don't need VRA */ in snd_emu10k1x_ac97()
736 return snd_ac97_mixer(pbus, &ac97, &chip->ac97); in snd_emu10k1x_ac97()
741 struct emu10k1x *chip = card->private_data; in snd_emu10k1x_free()
745 outl(0, chip->port + INTE); in snd_emu10k1x_free()
747 outl(HCFG_LOCKSOUNDCACHE, chip->port + HCFG); in snd_emu10k1x_free()
755 struct emu10k1x_voice *pvoice = chip->voices; in snd_emu10k1x_interrupt()
759 status = inl(chip->port + IPR); in snd_emu10k1x_interrupt()
766 struct emu10k1x_voice *cap_voice = &chip->capture_voice; in snd_emu10k1x_interrupt()
767 if (cap_voice->use) in snd_emu10k1x_interrupt()
778 if (pvoice->use) in snd_emu10k1x_interrupt()
788 if (chip->midi.interrupt) in snd_emu10k1x_interrupt()
789 chip->midi.interrupt(chip, status); in snd_emu10k1x_interrupt()
795 outl(status, chip->port + IPR); in snd_emu10k1x_interrupt()
797 /* dev_dbg(chip->card->dev, "interrupt %08x\n", status); */ in snd_emu10k1x_interrupt()
823 err = snd_pcm_new(emu->card, "emu10k1x", device, 1, capture, &pcm); in snd_emu10k1x_pcm()
827 pcm->private_data = emu; in snd_emu10k1x_pcm()
840 pcm->info_flags = 0; in snd_emu10k1x_pcm()
843 strcpy(pcm->name, "EMU10K1X Front"); in snd_emu10k1x_pcm()
847 strcpy(pcm->name, "EMU10K1X Rear"); in snd_emu10k1x_pcm()
851 strcpy(pcm->name, "EMU10K1X Center/LFE"); in snd_emu10k1x_pcm()
855 emu->pcm = pcm; in snd_emu10k1x_pcm()
858 &emu->pci->dev, 32*1024, 32*1024); in snd_emu10k1x_pcm()
867 struct emu10k1x *chip = card->private_data; in snd_emu10k1x_create()
875 if (dma_set_mask_and_coherent(&pci->dev, DMA_BIT_MASK(28)) < 0) { in snd_emu10k1x_create()
876 dev_err(card->dev, "error to set 28bit mask DMA\n"); in snd_emu10k1x_create()
877 return -ENXIO; in snd_emu10k1x_create()
880 chip->card = card; in snd_emu10k1x_create()
881 chip->pci = pci; in snd_emu10k1x_create()
882 chip->irq = -1; in snd_emu10k1x_create()
884 spin_lock_init(&chip->emu_lock); in snd_emu10k1x_create()
885 spin_lock_init(&chip->voice_lock); in snd_emu10k1x_create()
890 chip->port = pci_resource_start(pci, 0); in snd_emu10k1x_create()
892 if (devm_request_irq(&pci->dev, pci->irq, snd_emu10k1x_interrupt, in snd_emu10k1x_create()
894 dev_err(card->dev, "cannot grab irq %d\n", pci->irq); in snd_emu10k1x_create()
895 return -EBUSY; in snd_emu10k1x_create()
897 chip->irq = pci->irq; in snd_emu10k1x_create()
898 card->sync_irq = chip->irq; in snd_emu10k1x_create()
899 card->private_free = snd_emu10k1x_free; in snd_emu10k1x_create()
901 chip->dma_buffer = snd_devm_alloc_pages(&pci->dev, SNDRV_DMA_TYPE_DEV, in snd_emu10k1x_create()
903 if (!chip->dma_buffer) in snd_emu10k1x_create()
904 return -ENOMEM; in snd_emu10k1x_create()
907 /* read revision & serial */ in snd_emu10k1x_create()
908 chip->revision = pci->revision; in snd_emu10k1x_create()
909 pci_read_config_dword(pci, PCI_SUBSYSTEM_VENDOR_ID, &chip->serial); in snd_emu10k1x_create()
910 pci_read_config_word(pci, PCI_SUBSYSTEM_ID, &chip->model); in snd_emu10k1x_create()
911 dev_info(card->dev, "Model %04x Rev %08x Serial %08x\n", chip->model, in snd_emu10k1x_create()
912 chip->revision, chip->serial); in snd_emu10k1x_create()
914 outl(0, chip->port + INTE); in snd_emu10k1x_create()
917 chip->voices[ch].emu = chip; in snd_emu10k1x_create()
918 chip->voices[ch].number = ch; in snd_emu10k1x_create()
936 chip->spdif_bits[0] = in snd_emu10k1x_create()
942 chip->spdif_bits[1] = in snd_emu10k1x_create()
948 chip->spdif_bits[2] = in snd_emu10k1x_create()
958 outl(HCFG_LOCKSOUNDCACHE|HCFG_AUDIOENABLE, chip->port+HCFG); in snd_emu10k1x_create()
966 struct emu10k1x *emu = entry->private_data; in snd_emu10k1x_proc_reg_read()
973 spin_lock_irqsave(&emu->emu_lock, flags); in snd_emu10k1x_proc_reg_read()
974 value = inl(emu->port + i); in snd_emu10k1x_proc_reg_read()
975 spin_unlock_irqrestore(&emu->emu_lock, flags); in snd_emu10k1x_proc_reg_read()
994 struct emu10k1x *emu = entry->private_data; in snd_emu10k1x_proc_reg_write()
1009 snd_card_rw_proc_new(emu->card, "emu10k1x_regs", emu, in snd_emu10k1x_proc_init()
1022 ucontrol->value.integer.value[0] = (snd_emu10k1x_ptr_read(emu, SPDIF_SELECT, 0) == 0x700) ? 0 : 1; in snd_emu10k1x_shared_spdif_get()
1033 val = ucontrol->value.integer.value[0] ; in snd_emu10k1x_shared_spdif_put()
1060 uinfo->type = SNDRV_CTL_ELEM_TYPE_IEC958; in snd_emu10k1x_spdif_info()
1061 uinfo->count = 1; in snd_emu10k1x_spdif_info()
1069 unsigned int idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id); in snd_emu10k1x_spdif_get()
1071 ucontrol->value.iec958.status[0] = (emu->spdif_bits[idx] >> 0) & 0xff; in snd_emu10k1x_spdif_get()
1072 ucontrol->value.iec958.status[1] = (emu->spdif_bits[idx] >> 8) & 0xff; in snd_emu10k1x_spdif_get()
1073 ucontrol->value.iec958.status[2] = (emu->spdif_bits[idx] >> 16) & 0xff; in snd_emu10k1x_spdif_get()
1074 ucontrol->value.iec958.status[3] = (emu->spdif_bits[idx] >> 24) & 0xff; in snd_emu10k1x_spdif_get()
1081 ucontrol->value.iec958.status[0] = 0xff; in snd_emu10k1x_spdif_get_mask()
1082 ucontrol->value.iec958.status[1] = 0xff; in snd_emu10k1x_spdif_get_mask()
1083 ucontrol->value.iec958.status[2] = 0xff; in snd_emu10k1x_spdif_get_mask()
1084 ucontrol->value.iec958.status[3] = 0xff; in snd_emu10k1x_spdif_get_mask()
1092 unsigned int idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id); in snd_emu10k1x_spdif_put()
1096 val = (ucontrol->value.iec958.status[0] << 0) | in snd_emu10k1x_spdif_put()
1097 (ucontrol->value.iec958.status[1] << 8) | in snd_emu10k1x_spdif_put()
1098 (ucontrol->value.iec958.status[2] << 16) | in snd_emu10k1x_spdif_put()
1099 (ucontrol->value.iec958.status[3] << 24); in snd_emu10k1x_spdif_put()
1100 change = val != emu->spdif_bits[idx]; in snd_emu10k1x_spdif_put()
1103 emu->spdif_bits[idx] = val; in snd_emu10k1x_spdif_put()
1132 struct snd_card *card = emu->card; in snd_emu10k1x_mixer()
1136 return -ENOMEM; in snd_emu10k1x_mixer()
1142 return -ENOMEM; in snd_emu10k1x_mixer()
1148 return -ENOMEM; in snd_emu10k1x_mixer()
1161 return (unsigned char)snd_emu10k1x_ptr_read(emu, mpu->port + idx, 0); in mpu401_read()
1166 snd_emu10k1x_ptr_write(emu, mpu->port + idx, 0, data); in mpu401_write()
1184 for (; timeout > 0 && mpu401_input_avail(emu, mpu); timeout--) in mpu401_clear_rx()
1188 dev_err(emu->card->dev, in mpu401_clear_rx()
1199 struct emu10k1x_midi *midi, unsigned int status) in do_emu10k1x_midi_interrupt() argument
1203 if (midi->rmidi == NULL) { in do_emu10k1x_midi_interrupt()
1204 snd_emu10k1x_intr_disable(emu, midi->tx_enable | midi->rx_enable); in do_emu10k1x_midi_interrupt()
1208 spin_lock(&midi->input_lock); in do_emu10k1x_midi_interrupt()
1209 if ((status & midi->ipr_rx) && mpu401_input_avail(emu, midi)) { in do_emu10k1x_midi_interrupt()
1210 if (!(midi->midi_mode & EMU10K1X_MIDI_MODE_INPUT)) { in do_emu10k1x_midi_interrupt()
1211 mpu401_clear_rx(emu, midi); in do_emu10k1x_midi_interrupt()
1213 byte = mpu401_read_data(emu, midi); in do_emu10k1x_midi_interrupt()
1214 if (midi->substream_input) in do_emu10k1x_midi_interrupt()
1215 snd_rawmidi_receive(midi->substream_input, &byte, 1); in do_emu10k1x_midi_interrupt()
1218 spin_unlock(&midi->input_lock); in do_emu10k1x_midi_interrupt()
1220 spin_lock(&midi->output_lock); in do_emu10k1x_midi_interrupt()
1221 if ((status & midi->ipr_tx) && mpu401_output_ready(emu, midi)) { in do_emu10k1x_midi_interrupt()
1222 if (midi->substream_output && in do_emu10k1x_midi_interrupt()
1223 snd_rawmidi_transmit(midi->substream_output, &byte, 1) == 1) { in do_emu10k1x_midi_interrupt()
1224 mpu401_write_data(emu, midi, byte); in do_emu10k1x_midi_interrupt()
1226 snd_emu10k1x_intr_disable(emu, midi->tx_enable); in do_emu10k1x_midi_interrupt()
1229 spin_unlock(&midi->output_lock); in do_emu10k1x_midi_interrupt()
1234 do_emu10k1x_midi_interrupt(emu, &emu->midi, status); in snd_emu10k1x_midi_interrupt()
1238 struct emu10k1x_midi *midi, unsigned char cmd, int ack) in snd_emu10k1x_midi_cmd() argument
1243 spin_lock_irqsave(&midi->input_lock, flags); in snd_emu10k1x_midi_cmd()
1244 mpu401_write_data(emu, midi, 0x00); in snd_emu10k1x_midi_cmd()
1245 /* mpu401_clear_rx(emu, midi); */ in snd_emu10k1x_midi_cmd()
1247 mpu401_write_cmd(emu, midi, cmd); in snd_emu10k1x_midi_cmd()
1251 while (!ok && timeout-- > 0) { in snd_emu10k1x_midi_cmd()
1252 if (mpu401_input_avail(emu, midi)) { in snd_emu10k1x_midi_cmd()
1253 if (mpu401_read_data(emu, midi) == MPU401_ACK) in snd_emu10k1x_midi_cmd()
1257 if (!ok && mpu401_read_data(emu, midi) == MPU401_ACK) in snd_emu10k1x_midi_cmd()
1262 spin_unlock_irqrestore(&midi->input_lock, flags); in snd_emu10k1x_midi_cmd()
1264 dev_err(emu->card->dev, in snd_emu10k1x_midi_cmd()
1266 cmd, emu->port, in snd_emu10k1x_midi_cmd()
1267 mpu401_read_stat(emu, midi), in snd_emu10k1x_midi_cmd()
1268 mpu401_read_data(emu, midi)); in snd_emu10k1x_midi_cmd()
1277 struct emu10k1x_midi *midi = substream->rmidi->private_data; in snd_emu10k1x_midi_input_open() local
1280 emu = midi->emu; in snd_emu10k1x_midi_input_open()
1282 return -ENXIO; in snd_emu10k1x_midi_input_open()
1283 spin_lock_irqsave(&midi->open_lock, flags); in snd_emu10k1x_midi_input_open()
1284 midi->midi_mode |= EMU10K1X_MIDI_MODE_INPUT; in snd_emu10k1x_midi_input_open()
1285 midi->substream_input = substream; in snd_emu10k1x_midi_input_open()
1286 if (!(midi->midi_mode & EMU10K1X_MIDI_MODE_OUTPUT)) { in snd_emu10k1x_midi_input_open()
1287 spin_unlock_irqrestore(&midi->open_lock, flags); in snd_emu10k1x_midi_input_open()
1288 if (snd_emu10k1x_midi_cmd(emu, midi, MPU401_RESET, 1)) in snd_emu10k1x_midi_input_open()
1290 if (snd_emu10k1x_midi_cmd(emu, midi, MPU401_ENTER_UART, 1)) in snd_emu10k1x_midi_input_open()
1293 spin_unlock_irqrestore(&midi->open_lock, flags); in snd_emu10k1x_midi_input_open()
1298 return -EIO; in snd_emu10k1x_midi_input_open()
1304 struct emu10k1x_midi *midi = substream->rmidi->private_data; in snd_emu10k1x_midi_output_open() local
1307 emu = midi->emu; in snd_emu10k1x_midi_output_open()
1309 return -ENXIO; in snd_emu10k1x_midi_output_open()
1310 spin_lock_irqsave(&midi->open_lock, flags); in snd_emu10k1x_midi_output_open()
1311 midi->midi_mode |= EMU10K1X_MIDI_MODE_OUTPUT; in snd_emu10k1x_midi_output_open()
1312 midi->substream_output = substream; in snd_emu10k1x_midi_output_open()
1313 if (!(midi->midi_mode & EMU10K1X_MIDI_MODE_INPUT)) { in snd_emu10k1x_midi_output_open()
1314 spin_unlock_irqrestore(&midi->open_lock, flags); in snd_emu10k1x_midi_output_open()
1315 if (snd_emu10k1x_midi_cmd(emu, midi, MPU401_RESET, 1)) in snd_emu10k1x_midi_output_open()
1317 if (snd_emu10k1x_midi_cmd(emu, midi, MPU401_ENTER_UART, 1)) in snd_emu10k1x_midi_output_open()
1320 spin_unlock_irqrestore(&midi->open_lock, flags); in snd_emu10k1x_midi_output_open()
1325 return -EIO; in snd_emu10k1x_midi_output_open()
1331 struct emu10k1x_midi *midi = substream->rmidi->private_data; in snd_emu10k1x_midi_input_close() local
1335 emu = midi->emu; in snd_emu10k1x_midi_input_close()
1337 return -ENXIO; in snd_emu10k1x_midi_input_close()
1338 spin_lock_irqsave(&midi->open_lock, flags); in snd_emu10k1x_midi_input_close()
1339 snd_emu10k1x_intr_disable(emu, midi->rx_enable); in snd_emu10k1x_midi_input_close()
1340 midi->midi_mode &= ~EMU10K1X_MIDI_MODE_INPUT; in snd_emu10k1x_midi_input_close()
1341 midi->substream_input = NULL; in snd_emu10k1x_midi_input_close()
1342 if (!(midi->midi_mode & EMU10K1X_MIDI_MODE_OUTPUT)) { in snd_emu10k1x_midi_input_close()
1343 spin_unlock_irqrestore(&midi->open_lock, flags); in snd_emu10k1x_midi_input_close()
1344 err = snd_emu10k1x_midi_cmd(emu, midi, MPU401_RESET, 0); in snd_emu10k1x_midi_input_close()
1346 spin_unlock_irqrestore(&midi->open_lock, flags); in snd_emu10k1x_midi_input_close()
1354 struct emu10k1x_midi *midi = substream->rmidi->private_data; in snd_emu10k1x_midi_output_close() local
1358 emu = midi->emu; in snd_emu10k1x_midi_output_close()
1360 return -ENXIO; in snd_emu10k1x_midi_output_close()
1361 spin_lock_irqsave(&midi->open_lock, flags); in snd_emu10k1x_midi_output_close()
1362 snd_emu10k1x_intr_disable(emu, midi->tx_enable); in snd_emu10k1x_midi_output_close()
1363 midi->midi_mode &= ~EMU10K1X_MIDI_MODE_OUTPUT; in snd_emu10k1x_midi_output_close()
1364 midi->substream_output = NULL; in snd_emu10k1x_midi_output_close()
1365 if (!(midi->midi_mode & EMU10K1X_MIDI_MODE_INPUT)) { in snd_emu10k1x_midi_output_close()
1366 spin_unlock_irqrestore(&midi->open_lock, flags); in snd_emu10k1x_midi_output_close()
1367 err = snd_emu10k1x_midi_cmd(emu, midi, MPU401_RESET, 0); in snd_emu10k1x_midi_output_close()
1369 spin_unlock_irqrestore(&midi->open_lock, flags); in snd_emu10k1x_midi_output_close()
1377 struct emu10k1x_midi *midi = substream->rmidi->private_data; in snd_emu10k1x_midi_input_trigger() local
1378 emu = midi->emu; in snd_emu10k1x_midi_input_trigger()
1383 snd_emu10k1x_intr_enable(emu, midi->rx_enable); in snd_emu10k1x_midi_input_trigger()
1385 snd_emu10k1x_intr_disable(emu, midi->rx_enable); in snd_emu10k1x_midi_input_trigger()
1391 struct emu10k1x_midi *midi = substream->rmidi->private_data; in snd_emu10k1x_midi_output_trigger() local
1394 emu = midi->emu; in snd_emu10k1x_midi_output_trigger()
1403 spin_lock_irqsave(&midi->output_lock, flags); in snd_emu10k1x_midi_output_trigger()
1405 if (mpu401_output_ready(emu, midi)) { in snd_emu10k1x_midi_output_trigger()
1406 if (!(midi->midi_mode & EMU10K1X_MIDI_MODE_OUTPUT) || in snd_emu10k1x_midi_output_trigger()
1409 spin_unlock_irqrestore(&midi->output_lock, flags); in snd_emu10k1x_midi_output_trigger()
1412 mpu401_write_data(emu, midi, byte); in snd_emu10k1x_midi_output_trigger()
1413 max--; in snd_emu10k1x_midi_output_trigger()
1418 spin_unlock_irqrestore(&midi->output_lock, flags); in snd_emu10k1x_midi_output_trigger()
1419 snd_emu10k1x_intr_enable(emu, midi->tx_enable); in snd_emu10k1x_midi_output_trigger()
1421 snd_emu10k1x_intr_disable(emu, midi->tx_enable); in snd_emu10k1x_midi_output_trigger()
1445 struct emu10k1x_midi *midi = rmidi->private_data; in snd_emu10k1x_midi_free() local
1446 midi->interrupt = NULL; in snd_emu10k1x_midi_free()
1447 midi->rmidi = NULL; in snd_emu10k1x_midi_free()
1451 struct emu10k1x_midi *midi, int device, in emu10k1x_midi_init() argument
1457 err = snd_rawmidi_new(emu->card, name, device, 1, 1, &rmidi); in emu10k1x_midi_init()
1460 midi->emu = emu; in emu10k1x_midi_init()
1461 spin_lock_init(&midi->open_lock); in emu10k1x_midi_init()
1462 spin_lock_init(&midi->input_lock); in emu10k1x_midi_init()
1463 spin_lock_init(&midi->output_lock); in emu10k1x_midi_init()
1464 strcpy(rmidi->name, name); in emu10k1x_midi_init()
1467 rmidi->info_flags |= SNDRV_RAWMIDI_INFO_OUTPUT | in emu10k1x_midi_init()
1470 rmidi->private_data = midi; in emu10k1x_midi_init()
1471 rmidi->private_free = snd_emu10k1x_midi_free; in emu10k1x_midi_init()
1472 midi->rmidi = rmidi; in emu10k1x_midi_init()
1478 struct emu10k1x_midi *midi = &emu->midi; in snd_emu10k1x_midi() local
1481 err = emu10k1x_midi_init(emu, midi, 0, "EMU10K1X MPU-401 (UART)"); in snd_emu10k1x_midi()
1485 midi->tx_enable = INTE_MIDITXENABLE; in snd_emu10k1x_midi()
1486 midi->rx_enable = INTE_MIDIRXENABLE; in snd_emu10k1x_midi()
1487 midi->port = MUDATA; in snd_emu10k1x_midi()
1488 midi->ipr_tx = IPR_MIDITRANSBUFEMPTY; in snd_emu10k1x_midi()
1489 midi->ipr_rx = IPR_MIDIRECVBUFEMPTY; in snd_emu10k1x_midi()
1490 midi->interrupt = snd_emu10k1x_midi_interrupt; in snd_emu10k1x_midi()
1503 return -ENODEV; in __snd_emu10k1x_probe()
1506 return -ENOENT; in __snd_emu10k1x_probe()
1509 err = snd_devm_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE, in __snd_emu10k1x_probe()
1513 chip = card->private_data; in __snd_emu10k1x_probe()
1543 strcpy(card->driver, "EMU10K1X"); in __snd_emu10k1x_probe()
1544 strcpy(card->shortname, "Dell Sound Blaster Live!"); in __snd_emu10k1x_probe()
1545 sprintf(card->longname, "%s at 0x%lx irq %i", in __snd_emu10k1x_probe()
1546 card->shortname, chip->port, chip->irq); in __snd_emu10k1x_probe()
1560 return snd_card_free_on_error(&pci->dev, __snd_emu10k1x_probe(pci, pci_id)); in snd_emu10k1x_probe()