Lines Matching +full:parallel +full:- +full:memories
1 // SPDX-License-Identifier: GPL-2.0-or-later
12 * -------
20 * PC Parallel Port ( which this driver currently uses )
23 * -------------
26 * 128 'scene' memories, recallable from MIDI program change
30 * - Recoded & debugged
31 * - Added timer interrupt for midi outputs
32 * - hwports is between 1 and 8, which specifies the number of hardware ports.
67 static int hwports = MTPAV_MAX_PORTS; /* use hardware ports 1-8 */
74 MODULE_PARM_DESC(port, "Parallel port # for MotuMTPAV MIDI.");
76 MODULE_PARM_DESC(irq, "Parallel IRQ # for MotuMTPAV MIDI.");
87 // parallel port usage masks
133 int num_ports; /* number of hw ports (1-8) */
152 * subdevice 0 - (X-1) ports
153 * X - (2*X-1) networked ports
158 * where X = chip->num_ports
169 return 0x01; /* invalid - use port 0 as default */ in translate_subdevice_to_hwport()
170 else if (subdev < chip->num_ports) in translate_subdevice_to_hwport()
172 else if (subdev < chip->num_ports * 2) in translate_subdevice_to_hwport()
173 return subdev - chip->num_ports + 0x09; /* remote port */ in translate_subdevice_to_hwport()
174 else if (subdev == chip->num_ports * 2 + MTPAV_PIDX_COMPUTER) in translate_subdevice_to_hwport()
176 else if (subdev == chip->num_ports + MTPAV_PIDX_ADAT) in translate_subdevice_to_hwport()
185 return chip->num_ports + MTPAV_PIDX_BROADCAST; in translate_hwport_to_subdevice()
187 p = hwport - 1; in translate_hwport_to_subdevice()
188 if (p >= chip->num_ports) in translate_hwport_to_subdevice()
192 p = hwport - 0x09 + chip->num_ports; in translate_hwport_to_subdevice()
193 if (p >= chip->num_ports * 2) in translate_hwport_to_subdevice()
194 p = chip->num_ports; in translate_hwport_to_subdevice()
197 return chip->num_ports + MTPAV_PIDX_COMPUTER; in translate_hwport_to_subdevice()
199 return chip->num_ports + MTPAV_PIDX_ADAT; in translate_hwport_to_subdevice()
211 rval = inb(chip->port + SREG); in snd_mtpav_getreg()
214 rval = inb(chip->port + CREG); in snd_mtpav_getreg()
227 outb(val, chip->port + reg); in snd_mtpav_mputreg()
239 while (!(sbyte & SIGS_RFD) && counts--) { in snd_mtpav_wait_rfdhi()
284 if (portp->hwport != mtp_card->outmidihwport) { in snd_mtpav_output_port_write()
285 mtp_card->outmidihwport = portp->hwport; in snd_mtpav_output_port_write()
288 snd_mtpav_send_byte(mtp_card, portp->hwport); in snd_mtpav_output_port_write()
291 (unsigned int) portp->hwport); in snd_mtpav_output_port_write()
293 if (!(outbyte & 0x80) && portp->running_status) in snd_mtpav_output_port_write()
294 snd_mtpav_send_byte(mtp_card, portp->running_status); in snd_mtpav_output_port_write()
301 portp->running_status = outbyte; in snd_mtpav_output_port_write()
309 struct mtpav *mtp_card = substream->rmidi->private_data; in snd_mtpav_output_write()
310 struct mtpav_port *portp = &mtp_card->ports[substream->number]; in snd_mtpav_output_write()
313 spin_lock_irqsave(&mtp_card->spinlock, flags); in snd_mtpav_output_write()
315 spin_unlock_irqrestore(&mtp_card->spinlock, flags); in snd_mtpav_output_write()
339 struct mtpav *mtp_card = substream->rmidi->private_data; in snd_mtpav_input_open()
340 struct mtpav_port *portp = &mtp_card->ports[substream->number]; in snd_mtpav_input_open()
343 spin_lock_irqsave(&mtp_card->spinlock, flags); in snd_mtpav_input_open()
344 portp->mode |= MTPAV_MODE_INPUT_OPENED; in snd_mtpav_input_open()
345 portp->input = substream; in snd_mtpav_input_open()
346 if (mtp_card->share_irq++ == 0) in snd_mtpav_input_open()
348 spin_unlock_irqrestore(&mtp_card->spinlock, flags); in snd_mtpav_input_open()
357 struct mtpav *mtp_card = substream->rmidi->private_data; in snd_mtpav_input_close()
358 struct mtpav_port *portp = &mtp_card->ports[substream->number]; in snd_mtpav_input_close()
361 spin_lock_irqsave(&mtp_card->spinlock, flags); in snd_mtpav_input_close()
362 portp->mode &= ~MTPAV_MODE_INPUT_OPENED; in snd_mtpav_input_close()
363 portp->input = NULL; in snd_mtpav_input_close()
364 if (--mtp_card->share_irq == 0) in snd_mtpav_input_close()
366 spin_unlock_irqrestore(&mtp_card->spinlock, flags); in snd_mtpav_input_close()
375 struct mtpav *mtp_card = substream->rmidi->private_data; in snd_mtpav_input_trigger()
376 struct mtpav_port *portp = &mtp_card->ports[substream->number]; in snd_mtpav_input_trigger()
379 spin_lock_irqsave(&mtp_card->spinlock, flags); in snd_mtpav_input_trigger()
381 portp->mode |= MTPAV_MODE_INPUT_TRIGGERED; in snd_mtpav_input_trigger()
383 portp->mode &= ~MTPAV_MODE_INPUT_TRIGGERED; in snd_mtpav_input_trigger()
384 spin_unlock_irqrestore(&mtp_card->spinlock, flags); in snd_mtpav_input_trigger()
399 spin_lock_irqsave(&chip->spinlock, flags); in snd_mtpav_output_timer()
401 mod_timer(&chip->timer, 1 + jiffies); in snd_mtpav_output_timer()
403 for (p = 0; p <= chip->num_ports * 2 + MTPAV_PIDX_BROADCAST; p++) { in snd_mtpav_output_timer()
404 struct mtpav_port *portp = &chip->ports[p]; in snd_mtpav_output_timer()
405 if ((portp->mode & MTPAV_MODE_OUTPUT_TRIGGERED) && portp->output) in snd_mtpav_output_timer()
406 snd_mtpav_output_port_write(chip, portp, portp->output); in snd_mtpav_output_timer()
408 spin_unlock_irqrestore(&chip->spinlock, flags); in snd_mtpav_output_timer()
414 mod_timer(&chip->timer, 1 + jiffies); in snd_mtpav_add_output_timer()
420 del_timer(&chip->timer); in snd_mtpav_remove_output_timer()
428 struct mtpav *mtp_card = substream->rmidi->private_data; in snd_mtpav_output_open()
429 struct mtpav_port *portp = &mtp_card->ports[substream->number]; in snd_mtpav_output_open()
432 spin_lock_irqsave(&mtp_card->spinlock, flags); in snd_mtpav_output_open()
433 portp->mode |= MTPAV_MODE_OUTPUT_OPENED; in snd_mtpav_output_open()
434 portp->output = substream; in snd_mtpav_output_open()
435 spin_unlock_irqrestore(&mtp_card->spinlock, flags); in snd_mtpav_output_open()
444 struct mtpav *mtp_card = substream->rmidi->private_data; in snd_mtpav_output_close()
445 struct mtpav_port *portp = &mtp_card->ports[substream->number]; in snd_mtpav_output_close()
448 spin_lock_irqsave(&mtp_card->spinlock, flags); in snd_mtpav_output_close()
449 portp->mode &= ~MTPAV_MODE_OUTPUT_OPENED; in snd_mtpav_output_close()
450 portp->output = NULL; in snd_mtpav_output_close()
451 spin_unlock_irqrestore(&mtp_card->spinlock, flags); in snd_mtpav_output_close()
460 struct mtpav *mtp_card = substream->rmidi->private_data; in snd_mtpav_output_trigger()
461 struct mtpav_port *portp = &mtp_card->ports[substream->number]; in snd_mtpav_output_trigger()
464 spin_lock_irqsave(&mtp_card->spinlock, flags); in snd_mtpav_output_trigger()
466 if (! (portp->mode & MTPAV_MODE_OUTPUT_TRIGGERED)) { in snd_mtpav_output_trigger()
467 if (mtp_card->istimer++ == 0) in snd_mtpav_output_trigger()
469 portp->mode |= MTPAV_MODE_OUTPUT_TRIGGERED; in snd_mtpav_output_trigger()
472 portp->mode &= ~MTPAV_MODE_OUTPUT_TRIGGERED; in snd_mtpav_output_trigger()
473 if (--mtp_card->istimer == 0) in snd_mtpav_output_trigger()
476 spin_unlock_irqrestore(&mtp_card->spinlock, flags); in snd_mtpav_output_trigger()
490 if ((int)mcrd->inmidiport > mcrd->num_ports * 2 + MTPAV_PIDX_BROADCAST) in snd_mtpav_inmidi_process()
493 portp = &mcrd->ports[mcrd->inmidiport]; in snd_mtpav_inmidi_process()
494 if (portp->mode & MTPAV_MODE_INPUT_TRIGGERED) in snd_mtpav_inmidi_process()
495 snd_rawmidi_receive(portp->input, &inbyte, 1); in snd_mtpav_inmidi_process()
501 /* real-time midi code */ in snd_mtpav_inmidi_h()
506 if (mcrd->inmidistate == 0) { // awaiting command in snd_mtpav_inmidi_h()
508 mcrd->inmidistate = 1; in snd_mtpav_inmidi_h()
511 } else if (mcrd->inmidistate) { in snd_mtpav_inmidi_h()
512 mcrd->inmidiport = translate_hwport_to_subdevice(mcrd, inbyte); in snd_mtpav_inmidi_h()
513 mcrd->inmidistate = 0; in snd_mtpav_inmidi_h()
559 spin_lock(&mcard->spinlock); in snd_mtpav_irqh()
561 spin_unlock(&mcard->spinlock); in snd_mtpav_irqh()
570 if ((mcard->res_port = request_region(port, 3, "MotuMTPAV MIDI")) == NULL) { in snd_mtpav_get_ISA()
572 return -EBUSY; in snd_mtpav_get_ISA()
574 mcard->port = port; in snd_mtpav_get_ISA()
577 return -EBUSY; in snd_mtpav_get_ISA()
579 mcard->irq = irq; in snd_mtpav_get_ISA()
607 if (substream->number >= 0 && substream->number < chip->num_ports) in snd_mtpav_set_name()
608 sprintf(substream->name, "MTP direct %d", (substream->number % chip->num_ports) + 1); in snd_mtpav_set_name()
609 else if (substream->number >= 8 && substream->number < chip->num_ports * 2) in snd_mtpav_set_name()
610 sprintf(substream->name, "MTP remote %d", (substream->number % chip->num_ports) + 1); in snd_mtpav_set_name()
611 else if (substream->number == chip->num_ports * 2) in snd_mtpav_set_name()
612 strcpy(substream->name, "MTP computer"); in snd_mtpav_set_name()
613 else if (substream->number == chip->num_ports * 2 + 1) in snd_mtpav_set_name()
614 strcpy(substream->name, "MTP ADAT"); in snd_mtpav_set_name()
616 strcpy(substream->name, "MTP broadcast"); in snd_mtpav_set_name()
630 mcard->num_ports = hwports; in snd_mtpav_get_RAWMIDI()
632 if ((rval = snd_rawmidi_new(mcard->card, "MotuMIDI", 0, in snd_mtpav_get_RAWMIDI()
633 mcard->num_ports * 2 + MTPAV_PIDX_BROADCAST + 1, in snd_mtpav_get_RAWMIDI()
634 mcard->num_ports * 2 + MTPAV_PIDX_BROADCAST + 1, in snd_mtpav_get_RAWMIDI()
635 &mcard->rmidi)) < 0) in snd_mtpav_get_RAWMIDI()
637 rawmidi = mcard->rmidi; in snd_mtpav_get_RAWMIDI()
638 rawmidi->private_data = mcard; in snd_mtpav_get_RAWMIDI()
640 list_for_each(list, &rawmidi->streams[SNDRV_RAWMIDI_STREAM_INPUT].substreams) { in snd_mtpav_get_RAWMIDI()
643 substream->ops = &snd_mtpav_input; in snd_mtpav_get_RAWMIDI()
645 list_for_each(list, &rawmidi->streams[SNDRV_RAWMIDI_STREAM_OUTPUT].substreams) { in snd_mtpav_get_RAWMIDI()
648 substream->ops = &snd_mtpav_output; in snd_mtpav_get_RAWMIDI()
649 mcard->ports[substream->number].hwport = translate_subdevice_to_hwport(mcard, substream->number); in snd_mtpav_get_RAWMIDI()
651 rawmidi->info_flags |= SNDRV_RAWMIDI_INFO_OUTPUT | SNDRV_RAWMIDI_INFO_INPUT | in snd_mtpav_get_RAWMIDI()
653 sprintf(rawmidi->name, "MTP AV MIDI"); in snd_mtpav_get_RAWMIDI()
662 struct mtpav *crd = card->private_data; in snd_mtpav_free()
665 spin_lock_irqsave(&crd->spinlock, flags); in snd_mtpav_free()
666 if (crd->istimer > 0) in snd_mtpav_free()
668 spin_unlock_irqrestore(&crd->spinlock, flags); in snd_mtpav_free()
669 if (crd->irq >= 0) in snd_mtpav_free()
670 free_irq(crd->irq, (void *)crd); in snd_mtpav_free()
671 release_and_free_resource(crd->res_port); in snd_mtpav_free()
682 err = snd_card_new(&dev->dev, index, id, THIS_MODULE, in snd_mtpav_probe()
687 mtp_card = card->private_data; in snd_mtpav_probe()
688 spin_lock_init(&mtp_card->spinlock); in snd_mtpav_probe()
689 mtp_card->card = card; in snd_mtpav_probe()
690 mtp_card->irq = -1; in snd_mtpav_probe()
691 mtp_card->share_irq = 0; in snd_mtpav_probe()
692 mtp_card->inmidistate = 0; in snd_mtpav_probe()
693 mtp_card->outmidihwport = 0xffffffff; in snd_mtpav_probe()
694 timer_setup(&mtp_card->timer, snd_mtpav_output_timer, 0); in snd_mtpav_probe()
696 card->private_free = snd_mtpav_free; in snd_mtpav_probe()
702 mtp_card->inmidiport = mtp_card->num_ports + MTPAV_PIDX_BROADCAST; in snd_mtpav_probe()
708 strcpy(card->driver, "MTPAV"); in snd_mtpav_probe()
709 strcpy(card->shortname, "MTPAV on parallel port"); in snd_mtpav_probe()
710 snprintf(card->longname, sizeof(card->longname), in snd_mtpav_probe()
711 "MTPAV on parallel port at 0x%lx", port); in snd_mtpav_probe()
715 err = snd_card_register(mtp_card->card); in snd_mtpav_probe()
720 printk(KERN_INFO "Motu MidiTimePiece on parallel port irq: %d ioport: 0x%lx\n", irq, port); in snd_mtpav_probe()
751 device = platform_device_register_simple(SND_MTPAV_DRIVER, -1, NULL, 0); in alsa_card_mtpav_init()
756 err = -ENODEV; in alsa_card_mtpav_init()