Lines Matching full:midi
4 * Creative Audio MIDI, for the CA0106 Driver
20 #define ca_midi_write_data(midi, data) midi->write(midi, data, 0) argument
21 #define ca_midi_write_cmd(midi, data) midi->write(midi, data, 1) argument
22 #define ca_midi_read_data(midi) midi->read(midi, 0) argument
23 #define ca_midi_read_stat(midi) midi->read(midi, 1) argument
24 #define ca_midi_input_avail(midi) (!(ca_midi_read_stat(midi) & midi->input_avail)) argument
25 #define ca_midi_output_ready(midi) (!(ca_midi_read_stat(midi) & midi->output_ready)) argument
27 static void ca_midi_clear_rx(struct snd_ca_midi *midi) in ca_midi_clear_rx() argument
30 for (; timeout > 0 && ca_midi_input_avail(midi); timeout--) in ca_midi_clear_rx()
31 ca_midi_read_data(midi); in ca_midi_clear_rx()
35 ca_midi_read_stat(midi)); in ca_midi_clear_rx()
39 static void ca_midi_interrupt(struct snd_ca_midi *midi, unsigned int status) in ca_midi_interrupt() argument
43 if (midi->rmidi == NULL) { in ca_midi_interrupt()
44 midi->interrupt_disable(midi,midi->tx_enable | midi->rx_enable); in ca_midi_interrupt()
48 spin_lock(&midi->input_lock); in ca_midi_interrupt()
49 if ((status & midi->ipr_rx) && ca_midi_input_avail(midi)) { in ca_midi_interrupt()
50 if (!(midi->midi_mode & CA_MIDI_MODE_INPUT)) { in ca_midi_interrupt()
51 ca_midi_clear_rx(midi); in ca_midi_interrupt()
53 byte = ca_midi_read_data(midi); in ca_midi_interrupt()
54 if(midi->substream_input) in ca_midi_interrupt()
55 snd_rawmidi_receive(midi->substream_input, &byte, 1); in ca_midi_interrupt()
60 spin_unlock(&midi->input_lock); in ca_midi_interrupt()
62 spin_lock(&midi->output_lock); in ca_midi_interrupt()
63 if ((status & midi->ipr_tx) && ca_midi_output_ready(midi)) { in ca_midi_interrupt()
64 if (midi->substream_output && in ca_midi_interrupt()
65 snd_rawmidi_transmit(midi->substream_output, &byte, 1) == 1) { in ca_midi_interrupt()
66 ca_midi_write_data(midi, byte); in ca_midi_interrupt()
68 midi->interrupt_disable(midi,midi->tx_enable); in ca_midi_interrupt()
71 spin_unlock(&midi->output_lock); in ca_midi_interrupt()
75 static void ca_midi_cmd(struct snd_ca_midi *midi, unsigned char cmd, int ack) in ca_midi_cmd() argument
80 spin_lock_irqsave(&midi->input_lock, flags); in ca_midi_cmd()
81 ca_midi_write_data(midi, 0x00); in ca_midi_cmd()
82 /* ca_midi_clear_rx(midi); */ in ca_midi_cmd()
84 ca_midi_write_cmd(midi, cmd); in ca_midi_cmd()
89 if (ca_midi_input_avail(midi)) { in ca_midi_cmd()
90 if (ca_midi_read_data(midi) == midi->ack) in ca_midi_cmd()
94 if (!ok && ca_midi_read_data(midi) == midi->ack) in ca_midi_cmd()
99 spin_unlock_irqrestore(&midi->input_lock, flags); in ca_midi_cmd()
103 midi->get_dev_id_port(midi->dev_id), in ca_midi_cmd()
104 ca_midi_read_stat(midi), in ca_midi_cmd()
105 ca_midi_read_data(midi)); in ca_midi_cmd()
110 struct snd_ca_midi *midi = substream->rmidi->private_data; in ca_midi_input_open() local
113 if (snd_BUG_ON(!midi->dev_id)) in ca_midi_input_open()
115 spin_lock_irqsave(&midi->open_lock, flags); in ca_midi_input_open()
116 midi->midi_mode |= CA_MIDI_MODE_INPUT; in ca_midi_input_open()
117 midi->substream_input = substream; in ca_midi_input_open()
118 if (!(midi->midi_mode & CA_MIDI_MODE_OUTPUT)) { in ca_midi_input_open()
119 spin_unlock_irqrestore(&midi->open_lock, flags); in ca_midi_input_open()
120 ca_midi_cmd(midi, midi->reset, 1); in ca_midi_input_open()
121 ca_midi_cmd(midi, midi->enter_uart, 1); in ca_midi_input_open()
123 spin_unlock_irqrestore(&midi->open_lock, flags); in ca_midi_input_open()
130 struct snd_ca_midi *midi = substream->rmidi->private_data; in ca_midi_output_open() local
133 if (snd_BUG_ON(!midi->dev_id)) in ca_midi_output_open()
135 spin_lock_irqsave(&midi->open_lock, flags); in ca_midi_output_open()
136 midi->midi_mode |= CA_MIDI_MODE_OUTPUT; in ca_midi_output_open()
137 midi->substream_output = substream; in ca_midi_output_open()
138 if (!(midi->midi_mode & CA_MIDI_MODE_INPUT)) { in ca_midi_output_open()
139 spin_unlock_irqrestore(&midi->open_lock, flags); in ca_midi_output_open()
140 ca_midi_cmd(midi, midi->reset, 1); in ca_midi_output_open()
141 ca_midi_cmd(midi, midi->enter_uart, 1); in ca_midi_output_open()
143 spin_unlock_irqrestore(&midi->open_lock, flags); in ca_midi_output_open()
150 struct snd_ca_midi *midi = substream->rmidi->private_data; in ca_midi_input_close() local
153 if (snd_BUG_ON(!midi->dev_id)) in ca_midi_input_close()
155 spin_lock_irqsave(&midi->open_lock, flags); in ca_midi_input_close()
156 midi->interrupt_disable(midi,midi->rx_enable); in ca_midi_input_close()
157 midi->midi_mode &= ~CA_MIDI_MODE_INPUT; in ca_midi_input_close()
158 midi->substream_input = NULL; in ca_midi_input_close()
159 if (!(midi->midi_mode & CA_MIDI_MODE_OUTPUT)) { in ca_midi_input_close()
160 spin_unlock_irqrestore(&midi->open_lock, flags); in ca_midi_input_close()
161 ca_midi_cmd(midi, midi->reset, 0); in ca_midi_input_close()
163 spin_unlock_irqrestore(&midi->open_lock, flags); in ca_midi_input_close()
170 struct snd_ca_midi *midi = substream->rmidi->private_data; in ca_midi_output_close() local
173 if (snd_BUG_ON(!midi->dev_id)) in ca_midi_output_close()
176 spin_lock_irqsave(&midi->open_lock, flags); in ca_midi_output_close()
178 midi->interrupt_disable(midi,midi->tx_enable); in ca_midi_output_close()
179 midi->midi_mode &= ~CA_MIDI_MODE_OUTPUT; in ca_midi_output_close()
180 midi->substream_output = NULL; in ca_midi_output_close()
182 if (!(midi->midi_mode & CA_MIDI_MODE_INPUT)) { in ca_midi_output_close()
183 spin_unlock_irqrestore(&midi->open_lock, flags); in ca_midi_output_close()
184 ca_midi_cmd(midi, midi->reset, 0); in ca_midi_output_close()
186 spin_unlock_irqrestore(&midi->open_lock, flags); in ca_midi_output_close()
193 struct snd_ca_midi *midi = substream->rmidi->private_data; in ca_midi_input_trigger() local
195 if (snd_BUG_ON(!midi->dev_id)) in ca_midi_input_trigger()
199 midi->interrupt_enable(midi,midi->rx_enable); in ca_midi_input_trigger()
201 midi->interrupt_disable(midi, midi->rx_enable); in ca_midi_input_trigger()
207 struct snd_ca_midi *midi = substream->rmidi->private_data; in ca_midi_output_trigger() local
210 if (snd_BUG_ON(!midi->dev_id)) in ca_midi_output_trigger()
217 spin_lock_irqsave(&midi->output_lock, flags); in ca_midi_output_trigger()
221 if (ca_midi_output_ready(midi)) { in ca_midi_output_trigger()
222 if (!(midi->midi_mode & CA_MIDI_MODE_OUTPUT) || in ca_midi_output_trigger()
225 spin_unlock_irqrestore(&midi->output_lock, flags); in ca_midi_output_trigger()
228 ca_midi_write_data(midi, byte); in ca_midi_output_trigger()
235 spin_unlock_irqrestore(&midi->output_lock, flags); in ca_midi_output_trigger()
236 midi->interrupt_enable(midi,midi->tx_enable); in ca_midi_output_trigger()
239 midi->interrupt_disable(midi,midi->tx_enable); in ca_midi_output_trigger()
257 static void ca_midi_free(struct snd_ca_midi *midi) in ca_midi_free() argument
259 midi->interrupt = NULL; in ca_midi_free()
260 midi->interrupt_enable = NULL; in ca_midi_free()
261 midi->interrupt_disable = NULL; in ca_midi_free()
262 midi->read = NULL; in ca_midi_free()
263 midi->write = NULL; in ca_midi_free()
264 midi->get_dev_id_card = NULL; in ca_midi_free()
265 midi->get_dev_id_port = NULL; in ca_midi_free()
266 midi->rmidi = NULL; in ca_midi_free()
274 int ca_midi_init(void *dev_id, struct snd_ca_midi *midi, int device, char *name) in ca_midi_init() argument
279 err = snd_rawmidi_new(midi->get_dev_id_card(midi->dev_id), name, device, 1, 1, &rmidi); in ca_midi_init()
283 midi->dev_id = dev_id; in ca_midi_init()
284 midi->interrupt = ca_midi_interrupt; in ca_midi_init()
286 spin_lock_init(&midi->open_lock); in ca_midi_init()
287 spin_lock_init(&midi->input_lock); in ca_midi_init()
288 spin_lock_init(&midi->output_lock); in ca_midi_init()
296 rmidi->private_data = midi; in ca_midi_init()
299 midi->rmidi = rmidi; in ca_midi_init()