• Home
  • Raw
  • Download

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

1 // SPDX-License-Identifier: GPL-2.0-or-later
7 * Copyright (c) by James Courtier-Dutton <James@superbug.demon.co.uk>
10 * --
15 * - EMU10K1X-DBQ
16 * - STAC 9708T
21 #include <linux/dma-mapping.h>
63 #define IPR_MIDITRANSBUFEMPTY 0x00000001 /* MIDI UART transmit buffer empty */
64 #define IPR_MIDIRECVBUFEMPTY 0x00000002 /* MIDI UART receive buffer empty */
71 #define INTE_MIDITXENABLE 0x00000001 /* Enable MIDI transmit-buffer-empty interrupts */
72 #define INTE_MIDIRXENABLE 0x00000002 /* Enable MIDI receive-buffer-empty interrupts */
82 #define HCFG_AUDIOENABLE 0x00000001 /* 0 = CODECs transmit zero-valued samples */
85 #define GPIO 0x18 /* Defaults: 00001080-Analog, 00001000-SPDIF. */
93 /* Emu10k1x pointer-offset register set, accessed through the PTR and DATA registers */
101 #define PLAYBACK_LIST_SIZE 0x01 /* Size of list in bytes << 16. E.g. 8 periods -> 0x00380000 */
115 /* From 0x20 - 0x3f, last samples played on each channel */
150 #define SPCS_GENERATIONSTATUS 0x00008000 /* Originality flag (see IEC-958 spec) */
151 #define SPCS_CATEGORYCODEMASK 0x00007f00 /* Category code (see IEC-958 spec) */
152 #define SPCS_MODEMASK 0x000000c0 /* Mode (see IEC-958 spec) */
156 #define SPCS_COPYRIGHT 0x00000004 /* Copyright asserted flag -- do not modify */
158 #define SPCS_PROFESSIONAL 0x00000001 /* 0 = Consumer (IEC-958), 1 = pro (AES3-1992) */
160 #define SPDIF_SELECT 0x45 /* Enables SPDIF or Analogue outputs 0-Analogue, 0x700-SPDIF */
167 /* From 0x50 - 0x5f, last samples captured */
171 * - channel 0 is the front channel
172 * - channel 1 is the rear channel
173 * - channel 2 is the center/lfe channel
176 * Surround Playback Volume. The Sigmatel 4-Speaker Stereo switch affects
178 * 4-Speaker Stereo, both front and rear channels will be mixed in the
214 // definition of the chip-specific record
224 unsigned int serial; /* serial number */ member
239 struct emu10k1x_midi midi; member
290 spin_lock_irqsave(&emu->emu_lock, flags); in snd_emu10k1x_ptr_read()
291 outl(regptr, emu->port + PTR); in snd_emu10k1x_ptr_read()
292 val = inl(emu->port + DATA); in snd_emu10k1x_ptr_read()
293 spin_unlock_irqrestore(&emu->emu_lock, flags); in snd_emu10k1x_ptr_read()
307 spin_lock_irqsave(&emu->emu_lock, flags); in snd_emu10k1x_ptr_write()
308 outl(regptr, emu->port + PTR); in snd_emu10k1x_ptr_write()
309 outl(data, emu->port + DATA); in snd_emu10k1x_ptr_write()
310 spin_unlock_irqrestore(&emu->emu_lock, flags); in snd_emu10k1x_ptr_write()
318 spin_lock_irqsave(&emu->emu_lock, flags); in snd_emu10k1x_intr_enable()
319 intr_enable = inl(emu->port + INTE) | intrenb; in snd_emu10k1x_intr_enable()
320 outl(intr_enable, emu->port + INTE); in snd_emu10k1x_intr_enable()
321 spin_unlock_irqrestore(&emu->emu_lock, flags); in snd_emu10k1x_intr_enable()
329 spin_lock_irqsave(&emu->emu_lock, flags); in snd_emu10k1x_intr_disable()
330 intr_enable = inl(emu->port + INTE) & ~intrenb; in snd_emu10k1x_intr_disable()
331 outl(intr_enable, emu->port + INTE); in snd_emu10k1x_intr_disable()
332 spin_unlock_irqrestore(&emu->emu_lock, flags); in snd_emu10k1x_intr_disable()
339 spin_lock_irqsave(&emu->emu_lock, flags); in snd_emu10k1x_gpio_write()
340 outl(value, emu->port + GPIO); in snd_emu10k1x_gpio_write()
341 spin_unlock_irqrestore(&emu->emu_lock, flags); in snd_emu10k1x_gpio_write()
346 kfree(runtime->private_data); in snd_emu10k1x_pcm_free_substream()
353 if ((epcm = voice->epcm) == NULL) in snd_emu10k1x_pcm_interrupt()
355 if (epcm->substream == NULL) in snd_emu10k1x_pcm_interrupt()
358 dev_info(emu->card->dev, in snd_emu10k1x_pcm_interrupt()
360 epcm->substream->ops->pointer(epcm->substream), in snd_emu10k1x_pcm_interrupt()
361 snd_pcm_lib_period_bytes(epcm->substream), in snd_emu10k1x_pcm_interrupt()
362 snd_pcm_lib_buffer_bytes(epcm->substream)); in snd_emu10k1x_pcm_interrupt()
364 snd_pcm_period_elapsed(epcm->substream); in snd_emu10k1x_pcm_interrupt()
372 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()
561 return -ENOMEM; in snd_emu10k1x_pcm_open_capture()
563 epcm->emu = chip; in snd_emu10k1x_pcm_open_capture()
564 epcm->substream = substream; in snd_emu10k1x_pcm_open_capture()
566 runtime->private_data = epcm; in snd_emu10k1x_pcm_open_capture()
567 runtime->private_free = snd_emu10k1x_pcm_free_substream; in snd_emu10k1x_pcm_open_capture()
569 runtime->hw = snd_emu10k1x_capture_hw; in snd_emu10k1x_pcm_open_capture()
584 struct snd_pcm_runtime *runtime = substream->runtime; in snd_emu10k1x_pcm_hw_params_capture()
585 struct emu10k1x_pcm *epcm = runtime->private_data; in snd_emu10k1x_pcm_hw_params_capture()
587 if (! epcm->voice) { in snd_emu10k1x_pcm_hw_params_capture()
588 if (epcm->emu->capture_voice.use) in snd_emu10k1x_pcm_hw_params_capture()
589 return -EBUSY; in snd_emu10k1x_pcm_hw_params_capture()
590 epcm->voice = &epcm->emu->capture_voice; in snd_emu10k1x_pcm_hw_params_capture()
591 epcm->voice->epcm = epcm; in snd_emu10k1x_pcm_hw_params_capture()
592 epcm->voice->use = 1; in snd_emu10k1x_pcm_hw_params_capture()
601 struct snd_pcm_runtime *runtime = substream->runtime; in snd_emu10k1x_pcm_hw_free_capture()
605 if (runtime->private_data == NULL) in snd_emu10k1x_pcm_hw_free_capture()
607 epcm = runtime->private_data; in snd_emu10k1x_pcm_hw_free_capture()
609 if (epcm->voice) { in snd_emu10k1x_pcm_hw_free_capture()
610 epcm->voice->use = 0; in snd_emu10k1x_pcm_hw_free_capture()
611 epcm->voice->epcm = NULL; in snd_emu10k1x_pcm_hw_free_capture()
612 epcm->voice = NULL; in snd_emu10k1x_pcm_hw_free_capture()
622 struct snd_pcm_runtime *runtime = substream->runtime; in snd_emu10k1x_pcm_prepare_capture()
624 snd_emu10k1x_ptr_write(emu, CAPTURE_DMA_ADDR, 0, runtime->dma_addr); in snd_emu10k1x_pcm_prepare_capture()
625 …snd_emu10k1x_ptr_write(emu, CAPTURE_BUFFER_SIZE, 0, frames_to_bytes(runtime, runtime->buffer_size)… in snd_emu10k1x_pcm_prepare_capture()
637 struct snd_pcm_runtime *runtime = substream->runtime; in snd_emu10k1x_pcm_trigger_capture()
638 struct emu10k1x_pcm *epcm = runtime->private_data; in snd_emu10k1x_pcm_trigger_capture()
646 epcm->running = 1; in snd_emu10k1x_pcm_trigger_capture()
649 epcm->running = 0; in snd_emu10k1x_pcm_trigger_capture()
655 result = -EINVAL; in snd_emu10k1x_pcm_trigger_capture()
666 struct snd_pcm_runtime *runtime = substream->runtime; in snd_emu10k1x_pcm_pointer_capture()
667 struct emu10k1x_pcm *epcm = runtime->private_data; in snd_emu10k1x_pcm_pointer_capture()
670 if (!epcm->running) in snd_emu10k1x_pcm_pointer_capture()
674 if (ptr >= runtime->buffer_size) in snd_emu10k1x_pcm_pointer_capture()
675 ptr -= runtime->buffer_size; in snd_emu10k1x_pcm_pointer_capture()
693 struct emu10k1x *emu = ac97->private_data; in snd_emu10k1x_ac97_read()
697 spin_lock_irqsave(&emu->emu_lock, flags); in snd_emu10k1x_ac97_read()
698 outb(reg, emu->port + AC97ADDRESS); in snd_emu10k1x_ac97_read()
699 val = inw(emu->port + AC97DATA); in snd_emu10k1x_ac97_read()
700 spin_unlock_irqrestore(&emu->emu_lock, flags); in snd_emu10k1x_ac97_read()
707 struct emu10k1x *emu = ac97->private_data; in snd_emu10k1x_ac97_write()
710 spin_lock_irqsave(&emu->emu_lock, flags); in snd_emu10k1x_ac97_write()
711 outb(reg, emu->port + AC97ADDRESS); in snd_emu10k1x_ac97_write()
712 outw(val, emu->port + AC97DATA); in snd_emu10k1x_ac97_write()
713 spin_unlock_irqrestore(&emu->emu_lock, flags); in snd_emu10k1x_ac97_write()
726 if ((err = snd_ac97_bus(chip->card, 0, &ops, NULL, &pbus)) < 0) in snd_emu10k1x_ac97()
728 pbus->no_vra = 1; /* we don't need VRA */ in snd_emu10k1x_ac97()
733 return snd_ac97_mixer(pbus, &ac97, &chip->ac97); in snd_emu10k1x_ac97()
740 outl(0, chip->port + INTE); in snd_emu10k1x_free()
742 outl(HCFG_LOCKSOUNDCACHE, chip->port + HCFG); in snd_emu10k1x_free()
745 if (chip->irq >= 0) in snd_emu10k1x_free()
746 free_irq(chip->irq, chip); in snd_emu10k1x_free()
749 release_and_free_resource(chip->res_port); in snd_emu10k1x_free()
752 if (chip->dma_buffer.area) { in snd_emu10k1x_free()
753 snd_dma_free_pages(&chip->dma_buffer); in snd_emu10k1x_free()
756 pci_disable_device(chip->pci); in snd_emu10k1x_free()
765 struct emu10k1x *chip = device->device_data; in snd_emu10k1x_dev_free()
774 struct emu10k1x_voice *pvoice = chip->voices; in snd_emu10k1x_interrupt()
778 status = inl(chip->port + IPR); in snd_emu10k1x_interrupt()
785 struct emu10k1x_voice *cap_voice = &chip->capture_voice; in snd_emu10k1x_interrupt()
786 if (cap_voice->use) in snd_emu10k1x_interrupt()
797 if (pvoice->use) in snd_emu10k1x_interrupt()
807 if (chip->midi.interrupt) in snd_emu10k1x_interrupt()
808 chip->midi.interrupt(chip, status); in snd_emu10k1x_interrupt()
814 outl(status, chip->port + IPR); in snd_emu10k1x_interrupt()
816 /* dev_dbg(chip->card->dev, "interrupt %08x\n", status); */ in snd_emu10k1x_interrupt()
842 if ((err = snd_pcm_new(emu->card, "emu10k1x", device, 1, capture, &pcm)) < 0) in snd_emu10k1x_pcm()
845 pcm->private_data = emu; in snd_emu10k1x_pcm()
858 pcm->info_flags = 0; in snd_emu10k1x_pcm()
861 strcpy(pcm->name, "EMU10K1X Front"); in snd_emu10k1x_pcm()
865 strcpy(pcm->name, "EMU10K1X Rear"); in snd_emu10k1x_pcm()
869 strcpy(pcm->name, "EMU10K1X Center/LFE"); in snd_emu10k1x_pcm()
873 emu->pcm = pcm; in snd_emu10k1x_pcm()
876 &emu->pci->dev, 32*1024, 32*1024); in snd_emu10k1x_pcm()
899 dev_err(card->dev, "error to set 28bit mask DMA\n"); in snd_emu10k1x_create()
901 return -ENXIO; in snd_emu10k1x_create()
907 return -ENOMEM; in snd_emu10k1x_create()
910 chip->card = card; in snd_emu10k1x_create()
911 chip->pci = pci; in snd_emu10k1x_create()
912 chip->irq = -1; in snd_emu10k1x_create()
914 spin_lock_init(&chip->emu_lock); in snd_emu10k1x_create()
915 spin_lock_init(&chip->voice_lock); in snd_emu10k1x_create()
917 chip->port = pci_resource_start(pci, 0); in snd_emu10k1x_create()
918 if ((chip->res_port = request_region(chip->port, 8, in snd_emu10k1x_create()
920 dev_err(card->dev, "cannot allocate the port 0x%lx\n", in snd_emu10k1x_create()
921 chip->port); in snd_emu10k1x_create()
923 return -EBUSY; in snd_emu10k1x_create()
926 if (request_irq(pci->irq, snd_emu10k1x_interrupt, in snd_emu10k1x_create()
928 dev_err(card->dev, "cannot grab irq %d\n", pci->irq); in snd_emu10k1x_create()
930 return -EBUSY; in snd_emu10k1x_create()
932 chip->irq = pci->irq; in snd_emu10k1x_create()
933 card->sync_irq = chip->irq; in snd_emu10k1x_create()
935 if (snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, &pci->dev, in snd_emu10k1x_create()
936 4 * 1024, &chip->dma_buffer) < 0) { in snd_emu10k1x_create()
938 return -ENOMEM; in snd_emu10k1x_create()
942 /* read revision & serial */ in snd_emu10k1x_create()
943 chip->revision = pci->revision; in snd_emu10k1x_create()
944 pci_read_config_dword(pci, PCI_SUBSYSTEM_VENDOR_ID, &chip->serial); in snd_emu10k1x_create()
945 pci_read_config_word(pci, PCI_SUBSYSTEM_ID, &chip->model); in snd_emu10k1x_create()
946 dev_info(card->dev, "Model %04x Rev %08x Serial %08x\n", chip->model, in snd_emu10k1x_create()
947 chip->revision, chip->serial); in snd_emu10k1x_create()
949 outl(0, chip->port + INTE); in snd_emu10k1x_create()
952 chip->voices[ch].emu = chip; in snd_emu10k1x_create()
953 chip->voices[ch].number = ch; in snd_emu10k1x_create()
971 chip->spdif_bits[0] = in snd_emu10k1x_create()
977 chip->spdif_bits[1] = in snd_emu10k1x_create()
983 chip->spdif_bits[2] = in snd_emu10k1x_create()
993 outl(HCFG_LOCKSOUNDCACHE|HCFG_AUDIOENABLE, chip->port+HCFG); in snd_emu10k1x_create()
1007 struct emu10k1x *emu = entry->private_data; in snd_emu10k1x_proc_reg_read()
1014 spin_lock_irqsave(&emu->emu_lock, flags); in snd_emu10k1x_proc_reg_read()
1015 value = inl(emu->port + i); in snd_emu10k1x_proc_reg_read()
1016 spin_unlock_irqrestore(&emu->emu_lock, flags); in snd_emu10k1x_proc_reg_read()
1035 struct emu10k1x *emu = entry->private_data; in snd_emu10k1x_proc_reg_write()
1050 snd_card_rw_proc_new(emu->card, "emu10k1x_regs", emu, in snd_emu10k1x_proc_init()
1063 ucontrol->value.integer.value[0] = (snd_emu10k1x_ptr_read(emu, SPDIF_SELECT, 0) == 0x700) ? 0 : 1; in snd_emu10k1x_shared_spdif_get()
1074 val = ucontrol->value.integer.value[0] ; in snd_emu10k1x_shared_spdif_put()
1101 uinfo->type = SNDRV_CTL_ELEM_TYPE_IEC958; in snd_emu10k1x_spdif_info()
1102 uinfo->count = 1; in snd_emu10k1x_spdif_info()
1110 unsigned int idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id); in snd_emu10k1x_spdif_get()
1112 ucontrol->value.iec958.status[0] = (emu->spdif_bits[idx] >> 0) & 0xff; in snd_emu10k1x_spdif_get()
1113 ucontrol->value.iec958.status[1] = (emu->spdif_bits[idx] >> 8) & 0xff; in snd_emu10k1x_spdif_get()
1114 ucontrol->value.iec958.status[2] = (emu->spdif_bits[idx] >> 16) & 0xff; in snd_emu10k1x_spdif_get()
1115 ucontrol->value.iec958.status[3] = (emu->spdif_bits[idx] >> 24) & 0xff; in snd_emu10k1x_spdif_get()
1122 ucontrol->value.iec958.status[0] = 0xff; in snd_emu10k1x_spdif_get_mask()
1123 ucontrol->value.iec958.status[1] = 0xff; in snd_emu10k1x_spdif_get_mask()
1124 ucontrol->value.iec958.status[2] = 0xff; in snd_emu10k1x_spdif_get_mask()
1125 ucontrol->value.iec958.status[3] = 0xff; in snd_emu10k1x_spdif_get_mask()
1133 unsigned int idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id); in snd_emu10k1x_spdif_put()
1137 val = (ucontrol->value.iec958.status[0] << 0) | in snd_emu10k1x_spdif_put()
1138 (ucontrol->value.iec958.status[1] << 8) | in snd_emu10k1x_spdif_put()
1139 (ucontrol->value.iec958.status[2] << 16) | in snd_emu10k1x_spdif_put()
1140 (ucontrol->value.iec958.status[3] << 24); in snd_emu10k1x_spdif_put()
1141 change = val != emu->spdif_bits[idx]; in snd_emu10k1x_spdif_put()
1144 emu->spdif_bits[idx] = val; in snd_emu10k1x_spdif_put()
1173 struct snd_card *card = emu->card; in snd_emu10k1x_mixer()
1176 return -ENOMEM; in snd_emu10k1x_mixer()
1180 return -ENOMEM; in snd_emu10k1x_mixer()
1184 return -ENOMEM; in snd_emu10k1x_mixer()
1196 return (unsigned char)snd_emu10k1x_ptr_read(emu, mpu->port + idx, 0); in mpu401_read()
1201 snd_emu10k1x_ptr_write(emu, mpu->port + idx, 0, data); in mpu401_write()
1219 for (; timeout > 0 && mpu401_input_avail(emu, mpu); timeout--) in mpu401_clear_rx()
1223 dev_err(emu->card->dev, in mpu401_clear_rx()
1234 struct emu10k1x_midi *midi, unsigned int status) in do_emu10k1x_midi_interrupt() argument
1238 if (midi->rmidi == NULL) { in do_emu10k1x_midi_interrupt()
1239 snd_emu10k1x_intr_disable(emu, midi->tx_enable | midi->rx_enable); in do_emu10k1x_midi_interrupt()
1243 spin_lock(&midi->input_lock); in do_emu10k1x_midi_interrupt()
1244 if ((status & midi->ipr_rx) && mpu401_input_avail(emu, midi)) { in do_emu10k1x_midi_interrupt()
1245 if (!(midi->midi_mode & EMU10K1X_MIDI_MODE_INPUT)) { in do_emu10k1x_midi_interrupt()
1246 mpu401_clear_rx(emu, midi); in do_emu10k1x_midi_interrupt()
1248 byte = mpu401_read_data(emu, midi); in do_emu10k1x_midi_interrupt()
1249 if (midi->substream_input) in do_emu10k1x_midi_interrupt()
1250 snd_rawmidi_receive(midi->substream_input, &byte, 1); in do_emu10k1x_midi_interrupt()
1253 spin_unlock(&midi->input_lock); in do_emu10k1x_midi_interrupt()
1255 spin_lock(&midi->output_lock); in do_emu10k1x_midi_interrupt()
1256 if ((status & midi->ipr_tx) && mpu401_output_ready(emu, midi)) { in do_emu10k1x_midi_interrupt()
1257 if (midi->substream_output && in do_emu10k1x_midi_interrupt()
1258 snd_rawmidi_transmit(midi->substream_output, &byte, 1) == 1) { in do_emu10k1x_midi_interrupt()
1259 mpu401_write_data(emu, midi, byte); in do_emu10k1x_midi_interrupt()
1261 snd_emu10k1x_intr_disable(emu, midi->tx_enable); in do_emu10k1x_midi_interrupt()
1264 spin_unlock(&midi->output_lock); in do_emu10k1x_midi_interrupt()
1269 do_emu10k1x_midi_interrupt(emu, &emu->midi, status); in snd_emu10k1x_midi_interrupt()
1273 struct emu10k1x_midi *midi, unsigned char cmd, int ack) in snd_emu10k1x_midi_cmd() argument
1278 spin_lock_irqsave(&midi->input_lock, flags); in snd_emu10k1x_midi_cmd()
1279 mpu401_write_data(emu, midi, 0x00); in snd_emu10k1x_midi_cmd()
1280 /* mpu401_clear_rx(emu, midi); */ in snd_emu10k1x_midi_cmd()
1282 mpu401_write_cmd(emu, midi, cmd); in snd_emu10k1x_midi_cmd()
1286 while (!ok && timeout-- > 0) { in snd_emu10k1x_midi_cmd()
1287 if (mpu401_input_avail(emu, midi)) { in snd_emu10k1x_midi_cmd()
1288 if (mpu401_read_data(emu, midi) == MPU401_ACK) in snd_emu10k1x_midi_cmd()
1292 if (!ok && mpu401_read_data(emu, midi) == MPU401_ACK) in snd_emu10k1x_midi_cmd()
1297 spin_unlock_irqrestore(&midi->input_lock, flags); in snd_emu10k1x_midi_cmd()
1299 dev_err(emu->card->dev, in snd_emu10k1x_midi_cmd()
1301 cmd, emu->port, in snd_emu10k1x_midi_cmd()
1302 mpu401_read_stat(emu, midi), in snd_emu10k1x_midi_cmd()
1303 mpu401_read_data(emu, midi)); in snd_emu10k1x_midi_cmd()
1312 struct emu10k1x_midi *midi = substream->rmidi->private_data; in snd_emu10k1x_midi_input_open() local
1315 emu = midi->emu; in snd_emu10k1x_midi_input_open()
1317 return -ENXIO; in snd_emu10k1x_midi_input_open()
1318 spin_lock_irqsave(&midi->open_lock, flags); in snd_emu10k1x_midi_input_open()
1319 midi->midi_mode |= EMU10K1X_MIDI_MODE_INPUT; in snd_emu10k1x_midi_input_open()
1320 midi->substream_input = substream; in snd_emu10k1x_midi_input_open()
1321 if (!(midi->midi_mode & EMU10K1X_MIDI_MODE_OUTPUT)) { in snd_emu10k1x_midi_input_open()
1322 spin_unlock_irqrestore(&midi->open_lock, flags); in snd_emu10k1x_midi_input_open()
1323 if (snd_emu10k1x_midi_cmd(emu, midi, MPU401_RESET, 1)) in snd_emu10k1x_midi_input_open()
1325 if (snd_emu10k1x_midi_cmd(emu, midi, MPU401_ENTER_UART, 1)) in snd_emu10k1x_midi_input_open()
1328 spin_unlock_irqrestore(&midi->open_lock, flags); in snd_emu10k1x_midi_input_open()
1333 return -EIO; in snd_emu10k1x_midi_input_open()
1339 struct emu10k1x_midi *midi = substream->rmidi->private_data; in snd_emu10k1x_midi_output_open() local
1342 emu = midi->emu; in snd_emu10k1x_midi_output_open()
1344 return -ENXIO; in snd_emu10k1x_midi_output_open()
1345 spin_lock_irqsave(&midi->open_lock, flags); in snd_emu10k1x_midi_output_open()
1346 midi->midi_mode |= EMU10K1X_MIDI_MODE_OUTPUT; in snd_emu10k1x_midi_output_open()
1347 midi->substream_output = substream; in snd_emu10k1x_midi_output_open()
1348 if (!(midi->midi_mode & EMU10K1X_MIDI_MODE_INPUT)) { in snd_emu10k1x_midi_output_open()
1349 spin_unlock_irqrestore(&midi->open_lock, flags); in snd_emu10k1x_midi_output_open()
1350 if (snd_emu10k1x_midi_cmd(emu, midi, MPU401_RESET, 1)) in snd_emu10k1x_midi_output_open()
1352 if (snd_emu10k1x_midi_cmd(emu, midi, MPU401_ENTER_UART, 1)) in snd_emu10k1x_midi_output_open()
1355 spin_unlock_irqrestore(&midi->open_lock, flags); in snd_emu10k1x_midi_output_open()
1360 return -EIO; in snd_emu10k1x_midi_output_open()
1366 struct emu10k1x_midi *midi = substream->rmidi->private_data; in snd_emu10k1x_midi_input_close() local
1370 emu = midi->emu; in snd_emu10k1x_midi_input_close()
1372 return -ENXIO; in snd_emu10k1x_midi_input_close()
1373 spin_lock_irqsave(&midi->open_lock, flags); in snd_emu10k1x_midi_input_close()
1374 snd_emu10k1x_intr_disable(emu, midi->rx_enable); in snd_emu10k1x_midi_input_close()
1375 midi->midi_mode &= ~EMU10K1X_MIDI_MODE_INPUT; in snd_emu10k1x_midi_input_close()
1376 midi->substream_input = NULL; in snd_emu10k1x_midi_input_close()
1377 if (!(midi->midi_mode & EMU10K1X_MIDI_MODE_OUTPUT)) { in snd_emu10k1x_midi_input_close()
1378 spin_unlock_irqrestore(&midi->open_lock, flags); in snd_emu10k1x_midi_input_close()
1379 err = snd_emu10k1x_midi_cmd(emu, midi, MPU401_RESET, 0); in snd_emu10k1x_midi_input_close()
1381 spin_unlock_irqrestore(&midi->open_lock, flags); in snd_emu10k1x_midi_input_close()
1389 struct emu10k1x_midi *midi = substream->rmidi->private_data; in snd_emu10k1x_midi_output_close() local
1393 emu = midi->emu; in snd_emu10k1x_midi_output_close()
1395 return -ENXIO; in snd_emu10k1x_midi_output_close()
1396 spin_lock_irqsave(&midi->open_lock, flags); in snd_emu10k1x_midi_output_close()
1397 snd_emu10k1x_intr_disable(emu, midi->tx_enable); in snd_emu10k1x_midi_output_close()
1398 midi->midi_mode &= ~EMU10K1X_MIDI_MODE_OUTPUT; in snd_emu10k1x_midi_output_close()
1399 midi->substream_output = NULL; in snd_emu10k1x_midi_output_close()
1400 if (!(midi->midi_mode & EMU10K1X_MIDI_MODE_INPUT)) { in snd_emu10k1x_midi_output_close()
1401 spin_unlock_irqrestore(&midi->open_lock, flags); in snd_emu10k1x_midi_output_close()
1402 err = snd_emu10k1x_midi_cmd(emu, midi, MPU401_RESET, 0); in snd_emu10k1x_midi_output_close()
1404 spin_unlock_irqrestore(&midi->open_lock, flags); in snd_emu10k1x_midi_output_close()
1412 struct emu10k1x_midi *midi = substream->rmidi->private_data; in snd_emu10k1x_midi_input_trigger() local
1413 emu = midi->emu; in snd_emu10k1x_midi_input_trigger()
1418 snd_emu10k1x_intr_enable(emu, midi->rx_enable); in snd_emu10k1x_midi_input_trigger()
1420 snd_emu10k1x_intr_disable(emu, midi->rx_enable); in snd_emu10k1x_midi_input_trigger()
1426 struct emu10k1x_midi *midi = substream->rmidi->private_data; in snd_emu10k1x_midi_output_trigger() local
1429 emu = midi->emu; in snd_emu10k1x_midi_output_trigger()
1438 spin_lock_irqsave(&midi->output_lock, flags); in snd_emu10k1x_midi_output_trigger()
1440 if (mpu401_output_ready(emu, midi)) { in snd_emu10k1x_midi_output_trigger()
1441 if (!(midi->midi_mode & EMU10K1X_MIDI_MODE_OUTPUT) || in snd_emu10k1x_midi_output_trigger()
1444 spin_unlock_irqrestore(&midi->output_lock, flags); in snd_emu10k1x_midi_output_trigger()
1447 mpu401_write_data(emu, midi, byte); in snd_emu10k1x_midi_output_trigger()
1448 max--; in snd_emu10k1x_midi_output_trigger()
1453 spin_unlock_irqrestore(&midi->output_lock, flags); in snd_emu10k1x_midi_output_trigger()
1454 snd_emu10k1x_intr_enable(emu, midi->tx_enable); in snd_emu10k1x_midi_output_trigger()
1456 snd_emu10k1x_intr_disable(emu, midi->tx_enable); in snd_emu10k1x_midi_output_trigger()
1480 struct emu10k1x_midi *midi = rmidi->private_data; in snd_emu10k1x_midi_free() local
1481 midi->interrupt = NULL; in snd_emu10k1x_midi_free()
1482 midi->rmidi = NULL; in snd_emu10k1x_midi_free()
1486 struct emu10k1x_midi *midi, int device, in emu10k1x_midi_init() argument
1492 if ((err = snd_rawmidi_new(emu->card, name, device, 1, 1, &rmidi)) < 0) in emu10k1x_midi_init()
1494 midi->emu = emu; in emu10k1x_midi_init()
1495 spin_lock_init(&midi->open_lock); in emu10k1x_midi_init()
1496 spin_lock_init(&midi->input_lock); in emu10k1x_midi_init()
1497 spin_lock_init(&midi->output_lock); in emu10k1x_midi_init()
1498 strcpy(rmidi->name, name); in emu10k1x_midi_init()
1501 rmidi->info_flags |= SNDRV_RAWMIDI_INFO_OUTPUT | in emu10k1x_midi_init()
1504 rmidi->private_data = midi; in emu10k1x_midi_init()
1505 rmidi->private_free = snd_emu10k1x_midi_free; in emu10k1x_midi_init()
1506 midi->rmidi = rmidi; in emu10k1x_midi_init()
1512 struct emu10k1x_midi *midi = &emu->midi; in snd_emu10k1x_midi() local
1515 if ((err = emu10k1x_midi_init(emu, midi, 0, "EMU10K1X MPU-401 (UART)")) < 0) in snd_emu10k1x_midi()
1518 midi->tx_enable = INTE_MIDITXENABLE; in snd_emu10k1x_midi()
1519 midi->rx_enable = INTE_MIDIRXENABLE; in snd_emu10k1x_midi()
1520 midi->port = MUDATA; in snd_emu10k1x_midi()
1521 midi->ipr_tx = IPR_MIDITRANSBUFEMPTY; in snd_emu10k1x_midi()
1522 midi->ipr_rx = IPR_MIDIRECVBUFEMPTY; in snd_emu10k1x_midi()
1523 midi->interrupt = snd_emu10k1x_midi_interrupt; in snd_emu10k1x_midi()
1536 return -ENODEV; in snd_emu10k1x_probe()
1539 return -ENOENT; in snd_emu10k1x_probe()
1542 err = snd_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE, in snd_emu10k1x_probe()
1582 strcpy(card->driver, "EMU10K1X"); in snd_emu10k1x_probe()
1583 strcpy(card->shortname, "Dell Sound Blaster Live!"); in snd_emu10k1x_probe()
1584 sprintf(card->longname, "%s at 0x%lx irq %i", in snd_emu10k1x_probe()
1585 card->shortname, chip->port, chip->irq); in snd_emu10k1x_probe()