Lines Matching +full:mode +full:- +full:xxx
1 // SPDX-License-Identifier: GPL-2.0-only
3 * Copyright (C) by Paul Barton-Davis 1998-1999
8 * Note that there is also an MPU-401 emulation (actually, a UART-401
12 * The interface is essentially just a UART-401, but is has the
14 * "Virtual MIDI" mode. In this mode, there are effectively *two*
20 * This driver fully supports this mode, allowing two distinct MIDI
25 * something other than 0 and 1 if the CS4232 UART/MPU-401 interface
31 * NOTE: VIRTUAL MIDI MODE IS ON BY DEFAULT (see lowlevel/isa/wavefront.c)
33 * The main reason to turn off Virtual MIDI mode is when you want to
39 * The main reason to turn on Virtual MIDI Mode is to provide two
40 * completely independent 16-channel MIDI buses, one to the
58 return inb (midi->mpu_status_port); in wf_mpu_status()
79 return inb (midi->mpu_data_port); in read_data()
86 outb (byte, midi->mpu_data_port); in write_data()
96 if (substream == NULL || substream->rmidi == NULL) in get_wavefront_midi()
99 card = substream->rmidi->card; in get_wavefront_midi()
104 if (card->private_data == NULL) in get_wavefront_midi()
107 acard = card->private_data; in get_wavefront_midi()
109 return &acard->wavefront.midi; in get_wavefront_midi()
114 snd_wavefront_midi_t *midi = &card->wavefront.midi; in snd_wavefront_midi_output_write()
132 if (midi->substream_output[midi->output_mpu] == NULL) { in snd_wavefront_midi_output_write()
138 /* XXX fix me - no hard timing loops allowed! */ in snd_wavefront_midi_output_write()
140 for (timeout = 30000; timeout > 0; timeout--) { in snd_wavefront_midi_output_write()
145 spin_lock_irqsave (&midi->virtual, flags); in snd_wavefront_midi_output_write()
146 if ((midi->mode[midi->output_mpu] & MPU401_MODE_OUTPUT) == 0) { in snd_wavefront_midi_output_write()
147 spin_unlock_irqrestore (&midi->virtual, flags); in snd_wavefront_midi_output_write()
151 if (snd_rawmidi_transmit(midi->substream_output[midi->output_mpu], &midi_byte, 1) == 1) { in snd_wavefront_midi_output_write()
152 if (!midi->isvirtual || in snd_wavefront_midi_output_write()
156 max--; in snd_wavefront_midi_output_write()
158 if (midi->istimer) { in snd_wavefront_midi_output_write()
159 if (--midi->istimer <= 0) in snd_wavefront_midi_output_write()
160 del_timer(&midi->timer); in snd_wavefront_midi_output_write()
162 midi->mode[midi->output_mpu] &= ~MPU401_MODE_OUTPUT_TRIGGER; in snd_wavefront_midi_output_write()
163 spin_unlock_irqrestore (&midi->virtual, flags); in snd_wavefront_midi_output_write()
167 spin_unlock_irqrestore (&midi->virtual, flags); in snd_wavefront_midi_output_write()
170 spin_unlock_irqrestore (&midi->virtual, flags); in snd_wavefront_midi_output_write()
175 if (midi->substream_output[!midi->output_mpu] == NULL) { in snd_wavefront_midi_output_write()
181 /* XXX fix me - no hard timing loops allowed! */ in snd_wavefront_midi_output_write()
183 for (timeout = 30000; timeout > 0; timeout--) { in snd_wavefront_midi_output_write()
188 spin_lock_irqsave (&midi->virtual, flags); in snd_wavefront_midi_output_write()
189 if (!midi->isvirtual) in snd_wavefront_midi_output_write()
191 mpu = midi->output_mpu ^ mask; in snd_wavefront_midi_output_write()
193 if ((midi->mode[mpu] & MPU401_MODE_OUTPUT) == 0) { in snd_wavefront_midi_output_write()
194 spin_unlock_irqrestore (&midi->virtual, flags); in snd_wavefront_midi_output_write()
197 if (snd_rawmidi_transmit_empty(midi->substream_output[mpu])) in snd_wavefront_midi_output_write()
200 if (mpu != midi->output_mpu) { in snd_wavefront_midi_output_write()
204 midi->output_mpu = mpu; in snd_wavefront_midi_output_write()
205 } else if (snd_rawmidi_transmit(midi->substream_output[mpu], &midi_byte, 1) == 1) { in snd_wavefront_midi_output_write()
206 if (!midi->isvirtual || in snd_wavefront_midi_output_write()
210 max--; in snd_wavefront_midi_output_write()
213 if (midi->istimer) { in snd_wavefront_midi_output_write()
214 if (--midi->istimer <= 0) in snd_wavefront_midi_output_write()
215 del_timer(&midi->timer); in snd_wavefront_midi_output_write()
217 midi->mode[mpu] &= ~MPU401_MODE_OUTPUT_TRIGGER; in snd_wavefront_midi_output_write()
218 spin_unlock_irqrestore (&midi->virtual, flags); in snd_wavefront_midi_output_write()
222 spin_unlock_irqrestore (&midi->virtual, flags); in snd_wavefront_midi_output_write()
225 spin_unlock_irqrestore (&midi->virtual, flags); in snd_wavefront_midi_output_write()
235 if (snd_BUG_ON(!substream || !substream->rmidi)) in snd_wavefront_midi_input_open()
236 return -ENXIO; in snd_wavefront_midi_input_open()
237 if (snd_BUG_ON(!substream->rmidi->private_data)) in snd_wavefront_midi_input_open()
238 return -ENXIO; in snd_wavefront_midi_input_open()
240 mpu = *((snd_wavefront_mpu_id *) substream->rmidi->private_data); in snd_wavefront_midi_input_open()
243 return -EIO; in snd_wavefront_midi_input_open()
245 spin_lock_irqsave (&midi->open, flags); in snd_wavefront_midi_input_open()
246 midi->mode[mpu] |= MPU401_MODE_INPUT; in snd_wavefront_midi_input_open()
247 midi->substream_input[mpu] = substream; in snd_wavefront_midi_input_open()
248 spin_unlock_irqrestore (&midi->open, flags); in snd_wavefront_midi_input_open()
259 if (snd_BUG_ON(!substream || !substream->rmidi)) in snd_wavefront_midi_output_open()
260 return -ENXIO; in snd_wavefront_midi_output_open()
261 if (snd_BUG_ON(!substream->rmidi->private_data)) in snd_wavefront_midi_output_open()
262 return -ENXIO; in snd_wavefront_midi_output_open()
264 mpu = *((snd_wavefront_mpu_id *) substream->rmidi->private_data); in snd_wavefront_midi_output_open()
267 return -EIO; in snd_wavefront_midi_output_open()
269 spin_lock_irqsave (&midi->open, flags); in snd_wavefront_midi_output_open()
270 midi->mode[mpu] |= MPU401_MODE_OUTPUT; in snd_wavefront_midi_output_open()
271 midi->substream_output[mpu] = substream; in snd_wavefront_midi_output_open()
272 spin_unlock_irqrestore (&midi->open, flags); in snd_wavefront_midi_output_open()
283 if (snd_BUG_ON(!substream || !substream->rmidi)) in snd_wavefront_midi_input_close()
284 return -ENXIO; in snd_wavefront_midi_input_close()
285 if (snd_BUG_ON(!substream->rmidi->private_data)) in snd_wavefront_midi_input_close()
286 return -ENXIO; in snd_wavefront_midi_input_close()
288 mpu = *((snd_wavefront_mpu_id *) substream->rmidi->private_data); in snd_wavefront_midi_input_close()
291 return -EIO; in snd_wavefront_midi_input_close()
293 spin_lock_irqsave (&midi->open, flags); in snd_wavefront_midi_input_close()
294 midi->mode[mpu] &= ~MPU401_MODE_INPUT; in snd_wavefront_midi_input_close()
295 spin_unlock_irqrestore (&midi->open, flags); in snd_wavefront_midi_input_close()
306 if (snd_BUG_ON(!substream || !substream->rmidi)) in snd_wavefront_midi_output_close()
307 return -ENXIO; in snd_wavefront_midi_output_close()
308 if (snd_BUG_ON(!substream->rmidi->private_data)) in snd_wavefront_midi_output_close()
309 return -ENXIO; in snd_wavefront_midi_output_close()
311 mpu = *((snd_wavefront_mpu_id *) substream->rmidi->private_data); in snd_wavefront_midi_output_close()
314 return -EIO; in snd_wavefront_midi_output_close()
316 spin_lock_irqsave (&midi->open, flags); in snd_wavefront_midi_output_close()
317 midi->mode[mpu] &= ~MPU401_MODE_OUTPUT; in snd_wavefront_midi_output_close()
318 spin_unlock_irqrestore (&midi->open, flags); in snd_wavefront_midi_output_close()
328 if (substream == NULL || substream->rmidi == NULL) in snd_wavefront_midi_input_trigger()
331 if (substream->rmidi->private_data == NULL) in snd_wavefront_midi_input_trigger()
334 mpu = *((snd_wavefront_mpu_id *) substream->rmidi->private_data); in snd_wavefront_midi_input_trigger()
340 spin_lock_irqsave (&midi->virtual, flags); in snd_wavefront_midi_input_trigger()
342 midi->mode[mpu] |= MPU401_MODE_INPUT_TRIGGER; in snd_wavefront_midi_input_trigger()
344 midi->mode[mpu] &= ~MPU401_MODE_INPUT_TRIGGER; in snd_wavefront_midi_input_trigger()
346 spin_unlock_irqrestore (&midi->virtual, flags); in snd_wavefront_midi_input_trigger()
352 snd_wavefront_card_t *card = midi->timer_card; in snd_wavefront_midi_output_timer()
355 spin_lock_irqsave (&midi->virtual, flags); in snd_wavefront_midi_output_timer()
356 mod_timer(&midi->timer, 1 + jiffies); in snd_wavefront_midi_output_timer()
357 spin_unlock_irqrestore (&midi->virtual, flags); in snd_wavefront_midi_output_timer()
367 if (substream == NULL || substream->rmidi == NULL) in snd_wavefront_midi_output_trigger()
370 if (substream->rmidi->private_data == NULL) in snd_wavefront_midi_output_trigger()
373 mpu = *((snd_wavefront_mpu_id *) substream->rmidi->private_data); in snd_wavefront_midi_output_trigger()
379 spin_lock_irqsave (&midi->virtual, flags); in snd_wavefront_midi_output_trigger()
381 if ((midi->mode[mpu] & MPU401_MODE_OUTPUT_TRIGGER) == 0) { in snd_wavefront_midi_output_trigger()
382 if (!midi->istimer) { in snd_wavefront_midi_output_trigger()
383 timer_setup(&midi->timer, in snd_wavefront_midi_output_trigger()
386 mod_timer(&midi->timer, 1 + jiffies); in snd_wavefront_midi_output_trigger()
388 midi->istimer++; in snd_wavefront_midi_output_trigger()
389 midi->mode[mpu] |= MPU401_MODE_OUTPUT_TRIGGER; in snd_wavefront_midi_output_trigger()
392 midi->mode[mpu] &= ~MPU401_MODE_OUTPUT_TRIGGER; in snd_wavefront_midi_output_trigger()
394 spin_unlock_irqrestore (&midi->virtual, flags); in snd_wavefront_midi_output_trigger()
397 snd_wavefront_midi_output_write((snd_wavefront_card_t *)substream->rmidi->card->private_data); in snd_wavefront_midi_output_trigger()
411 midi = &card->wavefront.midi; in snd_wavefront_midi_interrupt()
418 spin_lock_irqsave (&midi->virtual, flags); in snd_wavefront_midi_interrupt()
419 while (--max) { in snd_wavefront_midi_interrupt()
424 if (midi->isvirtual) { in snd_wavefront_midi_interrupt()
426 substream = midi->substream_input[external_mpu]; in snd_wavefront_midi_interrupt()
429 substream = midi->substream_output[internal_mpu]; in snd_wavefront_midi_interrupt()
433 substream = midi->substream_input[internal_mpu]; in snd_wavefront_midi_interrupt()
441 if (midi->mode[mpu] & MPU401_MODE_INPUT_TRIGGER) { in snd_wavefront_midi_interrupt()
448 spin_unlock_irqrestore (&midi->virtual, flags); in snd_wavefront_midi_interrupt()
459 spin_lock_irqsave (&card->wavefront.midi.virtual, flags); in snd_wavefront_midi_enable_virtual()
460 card->wavefront.midi.isvirtual = 1; in snd_wavefront_midi_enable_virtual()
461 card->wavefront.midi.output_mpu = internal_mpu; in snd_wavefront_midi_enable_virtual()
462 card->wavefront.midi.input_mpu = internal_mpu; in snd_wavefront_midi_enable_virtual()
463 spin_unlock_irqrestore (&card->wavefront.midi.virtual, flags); in snd_wavefront_midi_enable_virtual()
472 spin_lock_irqsave (&card->wavefront.midi.virtual, flags); in snd_wavefront_midi_disable_virtual()
473 // snd_wavefront_midi_input_close (card->ics2115_external_rmidi); in snd_wavefront_midi_disable_virtual()
474 // snd_wavefront_midi_output_close (card->ics2115_external_rmidi); in snd_wavefront_midi_disable_virtual()
475 card->wavefront.midi.isvirtual = 0; in snd_wavefront_midi_disable_virtual()
476 spin_unlock_irqrestore (&card->wavefront.midi.virtual, flags); in snd_wavefront_midi_disable_virtual()
488 dev = &card->wavefront; in snd_wavefront_midi_start()
489 midi = &dev->midi; in snd_wavefront_midi_start()
491 /* The ICS2115 MPU-401 interface doesn't do anything in snd_wavefront_midi_start()
492 until its set into UART mode. in snd_wavefront_midi_start()
495 /* XXX fix me - no hard timing loops allowed! */ in snd_wavefront_midi_start()
501 return -1; in snd_wavefront_midi_start()
508 dev->interrupts_are_midi = 1; in snd_wavefront_midi_start()
510 outb (UART_MODE_ON, midi->mpu_command_port); in snd_wavefront_midi_start()
512 for (ok = 0, i = 50000; i > 0 && !ok; i--) { in snd_wavefront_midi_start()
522 snd_printk ("cannot set UART mode for MIDI interface"); in snd_wavefront_midi_start()
523 dev->interrupts_are_midi = 0; in snd_wavefront_midi_start()
524 return -1; in snd_wavefront_midi_start()
530 snd_printk ("can't enable MIDI-IN-2-synth routing.\n"); in snd_wavefront_midi_start()
531 /* XXX error ? */ in snd_wavefront_midi_start()
546 snd_printk ("virtual MIDI mode not disabled\n"); in snd_wavefront_midi_start()
553 snd_printk ("cannot enable virtual MIDI mode.\n"); in snd_wavefront_midi_start()