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.
66 static int hwports = MTPAV_MAX_PORTS; /* use hardware ports 1-8 */
73 MODULE_PARM_DESC(port, "Parallel port # for MotuMTPAV MIDI.");
75 MODULE_PARM_DESC(irq, "Parallel IRQ # for MotuMTPAV MIDI.");
86 // parallel port usage masks
132 int num_ports; /* number of hw ports (1-8) */
151 * subdevice 0 - (X-1) ports
152 * X - (2*X-1) networked ports
157 * where X = chip->num_ports
168 return 0x01; /* invalid - use port 0 as default */ in translate_subdevice_to_hwport()
169 else if (subdev < chip->num_ports) in translate_subdevice_to_hwport()
171 else if (subdev < chip->num_ports * 2) in translate_subdevice_to_hwport()
172 return subdev - chip->num_ports + 0x09; /* remote port */ in translate_subdevice_to_hwport()
173 else if (subdev == chip->num_ports * 2 + MTPAV_PIDX_COMPUTER) in translate_subdevice_to_hwport()
175 else if (subdev == chip->num_ports + MTPAV_PIDX_ADAT) in translate_subdevice_to_hwport()
184 return chip->num_ports + MTPAV_PIDX_BROADCAST; in translate_hwport_to_subdevice()
186 p = hwport - 1; in translate_hwport_to_subdevice()
187 if (p >= chip->num_ports) in translate_hwport_to_subdevice()
191 p = hwport - 0x09 + chip->num_ports; in translate_hwport_to_subdevice()
192 if (p >= chip->num_ports * 2) in translate_hwport_to_subdevice()
193 p = chip->num_ports; in translate_hwport_to_subdevice()
196 return chip->num_ports + MTPAV_PIDX_COMPUTER; in translate_hwport_to_subdevice()
198 return chip->num_ports + MTPAV_PIDX_ADAT; in translate_hwport_to_subdevice()
210 rval = inb(chip->port + SREG); in snd_mtpav_getreg()
213 rval = inb(chip->port + CREG); in snd_mtpav_getreg()
226 outb(val, chip->port + reg); in snd_mtpav_mputreg()
238 while (!(sbyte & SIGS_RFD) && counts--) { in snd_mtpav_wait_rfdhi()
283 if (portp->hwport != mtp_card->outmidihwport) { in snd_mtpav_output_port_write()
284 mtp_card->outmidihwport = portp->hwport; in snd_mtpav_output_port_write()
287 snd_mtpav_send_byte(mtp_card, portp->hwport); in snd_mtpav_output_port_write()
290 (unsigned int) portp->hwport); in snd_mtpav_output_port_write()
292 if (!(outbyte & 0x80) && portp->running_status) in snd_mtpav_output_port_write()
293 snd_mtpav_send_byte(mtp_card, portp->running_status); in snd_mtpav_output_port_write()
300 portp->running_status = outbyte; in snd_mtpav_output_port_write()
308 struct mtpav *mtp_card = substream->rmidi->private_data; in snd_mtpav_output_write()
309 struct mtpav_port *portp = &mtp_card->ports[substream->number]; in snd_mtpav_output_write()
312 spin_lock_irqsave(&mtp_card->spinlock, flags); in snd_mtpav_output_write()
314 spin_unlock_irqrestore(&mtp_card->spinlock, flags); in snd_mtpav_output_write()
338 struct mtpav *mtp_card = substream->rmidi->private_data; in snd_mtpav_input_open()
339 struct mtpav_port *portp = &mtp_card->ports[substream->number]; in snd_mtpav_input_open()
342 spin_lock_irqsave(&mtp_card->spinlock, flags); in snd_mtpav_input_open()
343 portp->mode |= MTPAV_MODE_INPUT_OPENED; in snd_mtpav_input_open()
344 portp->input = substream; in snd_mtpav_input_open()
345 if (mtp_card->share_irq++ == 0) in snd_mtpav_input_open()
347 spin_unlock_irqrestore(&mtp_card->spinlock, flags); in snd_mtpav_input_open()
356 struct mtpav *mtp_card = substream->rmidi->private_data; in snd_mtpav_input_close()
357 struct mtpav_port *portp = &mtp_card->ports[substream->number]; in snd_mtpav_input_close()
360 spin_lock_irqsave(&mtp_card->spinlock, flags); in snd_mtpav_input_close()
361 portp->mode &= ~MTPAV_MODE_INPUT_OPENED; in snd_mtpav_input_close()
362 portp->input = NULL; in snd_mtpav_input_close()
363 if (--mtp_card->share_irq == 0) in snd_mtpav_input_close()
365 spin_unlock_irqrestore(&mtp_card->spinlock, flags); in snd_mtpav_input_close()
374 struct mtpav *mtp_card = substream->rmidi->private_data; in snd_mtpav_input_trigger()
375 struct mtpav_port *portp = &mtp_card->ports[substream->number]; in snd_mtpav_input_trigger()
378 spin_lock_irqsave(&mtp_card->spinlock, flags); in snd_mtpav_input_trigger()
380 portp->mode |= MTPAV_MODE_INPUT_TRIGGERED; in snd_mtpav_input_trigger()
382 portp->mode &= ~MTPAV_MODE_INPUT_TRIGGERED; in snd_mtpav_input_trigger()
383 spin_unlock_irqrestore(&mtp_card->spinlock, flags); in snd_mtpav_input_trigger()
398 spin_lock_irqsave(&chip->spinlock, flags); in snd_mtpav_output_timer()
400 mod_timer(&chip->timer, 1 + jiffies); in snd_mtpav_output_timer()
402 for (p = 0; p <= chip->num_ports * 2 + MTPAV_PIDX_BROADCAST; p++) { in snd_mtpav_output_timer()
403 struct mtpav_port *portp = &chip->ports[p]; in snd_mtpav_output_timer()
404 if ((portp->mode & MTPAV_MODE_OUTPUT_TRIGGERED) && portp->output) in snd_mtpav_output_timer()
405 snd_mtpav_output_port_write(chip, portp, portp->output); in snd_mtpav_output_timer()
407 spin_unlock_irqrestore(&chip->spinlock, flags); in snd_mtpav_output_timer()
413 mod_timer(&chip->timer, 1 + jiffies); in snd_mtpav_add_output_timer()
419 del_timer(&chip->timer); in snd_mtpav_remove_output_timer()
427 struct mtpav *mtp_card = substream->rmidi->private_data; in snd_mtpav_output_open()
428 struct mtpav_port *portp = &mtp_card->ports[substream->number]; in snd_mtpav_output_open()
431 spin_lock_irqsave(&mtp_card->spinlock, flags); in snd_mtpav_output_open()
432 portp->mode |= MTPAV_MODE_OUTPUT_OPENED; in snd_mtpav_output_open()
433 portp->output = substream; in snd_mtpav_output_open()
434 spin_unlock_irqrestore(&mtp_card->spinlock, flags); in snd_mtpav_output_open()
443 struct mtpav *mtp_card = substream->rmidi->private_data; in snd_mtpav_output_close()
444 struct mtpav_port *portp = &mtp_card->ports[substream->number]; in snd_mtpav_output_close()
447 spin_lock_irqsave(&mtp_card->spinlock, flags); in snd_mtpav_output_close()
448 portp->mode &= ~MTPAV_MODE_OUTPUT_OPENED; in snd_mtpav_output_close()
449 portp->output = NULL; in snd_mtpav_output_close()
450 spin_unlock_irqrestore(&mtp_card->spinlock, flags); in snd_mtpav_output_close()
459 struct mtpav *mtp_card = substream->rmidi->private_data; in snd_mtpav_output_trigger()
460 struct mtpav_port *portp = &mtp_card->ports[substream->number]; in snd_mtpav_output_trigger()
463 spin_lock_irqsave(&mtp_card->spinlock, flags); in snd_mtpav_output_trigger()
465 if (! (portp->mode & MTPAV_MODE_OUTPUT_TRIGGERED)) { in snd_mtpav_output_trigger()
466 if (mtp_card->istimer++ == 0) in snd_mtpav_output_trigger()
468 portp->mode |= MTPAV_MODE_OUTPUT_TRIGGERED; in snd_mtpav_output_trigger()
471 portp->mode &= ~MTPAV_MODE_OUTPUT_TRIGGERED; in snd_mtpav_output_trigger()
472 if (--mtp_card->istimer == 0) in snd_mtpav_output_trigger()
475 spin_unlock_irqrestore(&mtp_card->spinlock, flags); in snd_mtpav_output_trigger()
489 if ((int)mcrd->inmidiport > mcrd->num_ports * 2 + MTPAV_PIDX_BROADCAST) in snd_mtpav_inmidi_process()
492 portp = &mcrd->ports[mcrd->inmidiport]; in snd_mtpav_inmidi_process()
493 if (portp->mode & MTPAV_MODE_INPUT_TRIGGERED) in snd_mtpav_inmidi_process()
494 snd_rawmidi_receive(portp->input, &inbyte, 1); in snd_mtpav_inmidi_process()
500 /* real-time midi code */ in snd_mtpav_inmidi_h()
505 if (mcrd->inmidistate == 0) { // awaiting command in snd_mtpav_inmidi_h()
507 mcrd->inmidistate = 1; in snd_mtpav_inmidi_h()
510 } else if (mcrd->inmidistate) { in snd_mtpav_inmidi_h()
511 mcrd->inmidiport = translate_hwport_to_subdevice(mcrd, inbyte); in snd_mtpav_inmidi_h()
512 mcrd->inmidistate = 0; in snd_mtpav_inmidi_h()
558 spin_lock(&mcard->spinlock); in snd_mtpav_irqh()
560 spin_unlock(&mcard->spinlock); in snd_mtpav_irqh()
569 mcard->res_port = devm_request_region(mcard->card->dev, port, 3, in snd_mtpav_get_ISA()
571 if (!mcard->res_port) { in snd_mtpav_get_ISA()
573 return -EBUSY; in snd_mtpav_get_ISA()
575 mcard->port = port; in snd_mtpav_get_ISA()
576 if (devm_request_irq(mcard->card->dev, irq, snd_mtpav_irqh, 0, in snd_mtpav_get_ISA()
579 return -EBUSY; in snd_mtpav_get_ISA()
581 mcard->irq = irq; in snd_mtpav_get_ISA()
609 if (substream->number >= 0 && substream->number < chip->num_ports) in snd_mtpav_set_name()
610 sprintf(substream->name, "MTP direct %d", (substream->number % chip->num_ports) + 1); in snd_mtpav_set_name()
611 else if (substream->number >= 8 && substream->number < chip->num_ports * 2) in snd_mtpav_set_name()
612 sprintf(substream->name, "MTP remote %d", (substream->number % chip->num_ports) + 1); in snd_mtpav_set_name()
613 else if (substream->number == chip->num_ports * 2) in snd_mtpav_set_name()
614 strcpy(substream->name, "MTP computer"); in snd_mtpav_set_name()
615 else if (substream->number == chip->num_ports * 2 + 1) in snd_mtpav_set_name()
616 strcpy(substream->name, "MTP ADAT"); in snd_mtpav_set_name()
618 strcpy(substream->name, "MTP broadcast"); in snd_mtpav_set_name()
632 mcard->num_ports = hwports; in snd_mtpav_get_RAWMIDI()
634 rval = snd_rawmidi_new(mcard->card, "MotuMIDI", 0, in snd_mtpav_get_RAWMIDI()
635 mcard->num_ports * 2 + MTPAV_PIDX_BROADCAST + 1, in snd_mtpav_get_RAWMIDI()
636 mcard->num_ports * 2 + MTPAV_PIDX_BROADCAST + 1, in snd_mtpav_get_RAWMIDI()
637 &mcard->rmidi); in snd_mtpav_get_RAWMIDI()
640 rawmidi = mcard->rmidi; in snd_mtpav_get_RAWMIDI()
641 rawmidi->private_data = mcard; in snd_mtpav_get_RAWMIDI()
643 list_for_each(list, &rawmidi->streams[SNDRV_RAWMIDI_STREAM_INPUT].substreams) { in snd_mtpav_get_RAWMIDI()
646 substream->ops = &snd_mtpav_input; in snd_mtpav_get_RAWMIDI()
648 list_for_each(list, &rawmidi->streams[SNDRV_RAWMIDI_STREAM_OUTPUT].substreams) { in snd_mtpav_get_RAWMIDI()
651 substream->ops = &snd_mtpav_output; in snd_mtpav_get_RAWMIDI()
652 mcard->ports[substream->number].hwport = translate_subdevice_to_hwport(mcard, substream->number); in snd_mtpav_get_RAWMIDI()
654 rawmidi->info_flags |= SNDRV_RAWMIDI_INFO_OUTPUT | SNDRV_RAWMIDI_INFO_INPUT | in snd_mtpav_get_RAWMIDI()
656 sprintf(rawmidi->name, "MTP AV MIDI"); in snd_mtpav_get_RAWMIDI()
665 struct mtpav *crd = card->private_data; in snd_mtpav_free()
668 spin_lock_irqsave(&crd->spinlock, flags); in snd_mtpav_free()
669 if (crd->istimer > 0) in snd_mtpav_free()
671 spin_unlock_irqrestore(&crd->spinlock, flags); in snd_mtpav_free()
682 err = snd_devm_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()
700 mtp_card->inmidiport = mtp_card->num_ports + MTPAV_PIDX_BROADCAST; in snd_mtpav_probe()
706 strcpy(card->driver, "MTPAV"); in snd_mtpav_probe()
707 strcpy(card->shortname, "MTPAV on parallel port"); in snd_mtpav_probe()
708 snprintf(card->longname, sizeof(card->longname), in snd_mtpav_probe()
709 "MTPAV on parallel port at 0x%lx", port); in snd_mtpav_probe()
713 err = snd_card_register(mtp_card->card); in snd_mtpav_probe()
717 card->private_free = snd_mtpav_free; 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()
741 device = platform_device_register_simple(SND_MTPAV_DRIVER, -1, NULL, 0); in alsa_card_mtpav_init()
746 err = -ENODEV; in alsa_card_mtpav_init()