55 #include <linux/module.h>
75 #define MTPAV_IOBASE 0x378
77 #define MTPAV_MAX_PORTS 8
104 #define SIGS_BYTE 0x08
105 #define SIGS_RFD 0x80
106 #define SIGS_IRQ 0x40
107 #define SIGS_IN0 0x10
108 #define SIGS_IN1 0x20
110 #define SIGC_WRITE 0x04
111 #define SIGC_READ 0x08
112 #define SIGC_INTEN 0x10
119 #define MTPAV_MODE_INPUT_OPENED 0x01
120 #define MTPAV_MODE_OUTPUT_OPENED 0x02
121 #define MTPAV_MODE_INPUT_TRIGGERED 0x04
122 #define MTPAV_MODE_OUTPUT_TRIGGERED 0x08
124 #define NUMPORTS (0x12+1)
177 #define MTPAV_PIDX_COMPUTER 0
178 #define MTPAV_PIDX_ADAT 1
179 #define MTPAV_PIDX_BROADCAST 2
182 static int translate_subdevice_to_hwport(
struct mtpav *
chip,
int subdev)
188 else if (subdev < chip->num_ports * 2)
197 static int translate_hwport_to_subdevice(
struct mtpav *
chip,
int hwport)
202 else if (hwport <= 0x08) {
207 }
else if (hwport <= 0x10) {
212 }
else if (hwport == 0x11)
228 rval = (rval & 0xf8);
229 }
else if (reg ==
CREG) {
231 rval = (rval & 0x1c);
240 static inline void snd_mtpav_mputreg(
struct mtpav *chip,
u16 reg,
u8 val)
249 static void snd_mtpav_wait_rfdhi(
struct mtpav *chip)
254 sbyte = snd_mtpav_getreg(chip,
SREG);
255 while (!(sbyte &
SIGS_RFD) && counts--) {
256 sbyte = snd_mtpav_getreg(chip,
SREG);
261 static void snd_mtpav_send_byte(
struct mtpav *chip,
u8 byte)
267 snd_mtpav_wait_rfdhi(chip);
271 tcbyt = snd_mtpav_getreg(chip,
CREG);
275 snd_mtpav_mputreg(chip,
DREG, byte);
276 snd_mtpav_mputreg(chip,
CREG, clrwrite);
278 snd_mtpav_mputreg(chip,
CREG, setwrite);
287 static void snd_mtpav_output_port_write(
struct mtpav *mtp_card,
303 snd_mtpav_send_byte(mtp_card, 0xf5);
304 snd_mtpav_send_byte(mtp_card, portp->
hwport);
319 snd_mtpav_send_byte(mtp_card, outbyte);
325 struct mtpav *mtp_card = substream->
rmidi->private_data;
330 snd_mtpav_output_port_write(mtp_card, portp, substream);
331 spin_unlock_irqrestore(&mtp_card->
spinlock, flags);
339 static void snd_mtpav_portscan(
struct mtpav *chip)
343 for (p = 0; p < 8; p++) {
344 snd_mtpav_send_byte(chip, 0xf5);
345 snd_mtpav_send_byte(chip, p);
346 snd_mtpav_send_byte(chip, 0xfe);
355 struct mtpav *mtp_card = substream->
rmidi->private_data;
361 portp->
input = substream;
364 spin_unlock_irqrestore(&mtp_card->
spinlock, flags);
373 struct mtpav *mtp_card = substream->
rmidi->private_data;
381 snd_mtpav_mputreg(mtp_card,
CREG, 0);
382 spin_unlock_irqrestore(&mtp_card->
spinlock, flags);
391 struct mtpav *mtp_card = substream->
rmidi->private_data;
400 spin_unlock_irqrestore(&mtp_card->
spinlock, flags);
409 static void snd_mtpav_output_timer(
unsigned long data)
423 snd_mtpav_output_port_write(chip, portp, portp->
output);
425 spin_unlock_irqrestore(&chip->
spinlock, flags);
429 static void snd_mtpav_add_output_timer(
struct mtpav *chip)
436 static void snd_mtpav_remove_output_timer(
struct mtpav *chip)
446 struct mtpav *mtp_card = substream->
rmidi->private_data;
452 portp->
output = substream;
453 spin_unlock_irqrestore(&mtp_card->
spinlock, flags);
462 struct mtpav *mtp_card = substream->
rmidi->private_data;
469 spin_unlock_irqrestore(&mtp_card->
spinlock, flags);
478 struct mtpav *mtp_card = substream->
rmidi->private_data;
486 snd_mtpav_add_output_timer(mtp_card);
492 snd_mtpav_remove_output_timer(mtp_card);
494 spin_unlock_irqrestore(&mtp_card->
spinlock, flags);
497 snd_mtpav_output_write(substream);
504 static void snd_mtpav_inmidi_process(
struct mtpav *mcrd,
u8 inbyte)
516 static void snd_mtpav_inmidi_h(
struct mtpav *mcrd,
u8 inbyte)
518 if (inbyte >= 0xf8) {
520 snd_mtpav_inmidi_process(mcrd, inbyte);
528 snd_mtpav_inmidi_process(mcrd, inbyte);
530 mcrd->
inmidiport = translate_hwport_to_subdevice(mcrd, inbyte);
535 static void snd_mtpav_read_bytes(
struct mtpav *mcrd)
542 u8 sbyt = snd_mtpav_getreg(mcrd,
SREG);
549 cbyt = snd_mtpav_getreg(mcrd,
CREG);
556 for (i = 0; i < 4; i++) {
557 snd_mtpav_mputreg(mcrd,
CREG, setread);
558 sr = snd_mtpav_getreg(mcrd,
SREG);
559 snd_mtpav_mputreg(mcrd,
CREG, clrread);
563 mtp_read_byte |= sr << (i * 2);
566 snd_mtpav_inmidi_h(mcrd, mtp_read_byte);
568 sbyt = snd_mtpav_getreg(mcrd,
SREG);
570 }
while (sbyt & SIGS_BYTE);
578 snd_mtpav_read_bytes(mcard);
606 .open = snd_mtpav_output_open,
607 .close = snd_mtpav_output_close,
608 .trigger = snd_mtpav_output_trigger,
612 .open = snd_mtpav_input_open,
613 .close = snd_mtpav_input_close,
614 .trigger = snd_mtpav_input_trigger,
646 else if (hwports > 8)
655 rawmidi = mcard->
rmidi;
660 snd_mtpav_set_name(mcard, substream);
661 substream->
ops = &snd_mtpav_input;
665 snd_mtpav_set_name(mcard, substream);
666 substream->
ops = &snd_mtpav_output;
667 mcard->
ports[substream->
number].hwport = translate_subdevice_to_hwport(mcard, substream->
number);
685 snd_mtpav_remove_output_timer(crd);
686 spin_unlock_irqrestore(&crd->
spinlock, flags);
698 struct mtpav *mtp_card;
713 mtp_card->
timer.function = snd_mtpav_output_timer;
714 mtp_card->
timer.data = (
unsigned long) mtp_card;
718 err = snd_mtpav_get_RAWMIDI(mtp_card);
724 err = snd_mtpav_get_ISA(mtp_card);
731 "MTPAV on parallel port at 0x%lx",
port);
733 snd_mtpav_portscan(mtp_card);
740 platform_set_drvdata(dev, card);
752 platform_set_drvdata(devptr,
NULL);
756 #define SND_MTPAV_DRIVER "snd_mtpav"
759 .probe = snd_mtpav_probe,
767 static int __init alsa_card_mtpav_init(
void)
775 if (!IS_ERR(device)) {
776 if (platform_get_drvdata(device))
781 err = PTR_ERR(device);
786 static void __exit alsa_card_mtpav_exit(
void)