Lines Matching refs:midi

35 #define ca_midi_write_data(midi, data)	midi->write(midi, data, 0)  argument
36 #define ca_midi_write_cmd(midi, data) midi->write(midi, data, 1) argument
37 #define ca_midi_read_data(midi) midi->read(midi, 0) argument
38 #define ca_midi_read_stat(midi) midi->read(midi, 1) argument
39 #define ca_midi_input_avail(midi) (!(ca_midi_read_stat(midi) & midi->input_avail)) argument
40 #define ca_midi_output_ready(midi) (!(ca_midi_read_stat(midi) & midi->output_ready)) argument
42 static void ca_midi_clear_rx(struct snd_ca_midi *midi) in ca_midi_clear_rx() argument
45 for (; timeout > 0 && ca_midi_input_avail(midi); timeout--) in ca_midi_clear_rx()
46 ca_midi_read_data(midi); in ca_midi_clear_rx()
50 ca_midi_read_stat(midi)); in ca_midi_clear_rx()
54 static void ca_midi_interrupt(struct snd_ca_midi *midi, unsigned int status) in ca_midi_interrupt() argument
58 if (midi->rmidi == NULL) { in ca_midi_interrupt()
59 midi->interrupt_disable(midi,midi->tx_enable | midi->rx_enable); in ca_midi_interrupt()
63 spin_lock(&midi->input_lock); in ca_midi_interrupt()
64 if ((status & midi->ipr_rx) && ca_midi_input_avail(midi)) { in ca_midi_interrupt()
65 if (!(midi->midi_mode & CA_MIDI_MODE_INPUT)) { in ca_midi_interrupt()
66 ca_midi_clear_rx(midi); in ca_midi_interrupt()
68 byte = ca_midi_read_data(midi); in ca_midi_interrupt()
69 if(midi->substream_input) in ca_midi_interrupt()
70 snd_rawmidi_receive(midi->substream_input, &byte, 1); in ca_midi_interrupt()
75 spin_unlock(&midi->input_lock); in ca_midi_interrupt()
77 spin_lock(&midi->output_lock); in ca_midi_interrupt()
78 if ((status & midi->ipr_tx) && ca_midi_output_ready(midi)) { in ca_midi_interrupt()
79 if (midi->substream_output && in ca_midi_interrupt()
80 snd_rawmidi_transmit(midi->substream_output, &byte, 1) == 1) { in ca_midi_interrupt()
81 ca_midi_write_data(midi, byte); in ca_midi_interrupt()
83 midi->interrupt_disable(midi,midi->tx_enable); in ca_midi_interrupt()
86 spin_unlock(&midi->output_lock); in ca_midi_interrupt()
90 static void ca_midi_cmd(struct snd_ca_midi *midi, unsigned char cmd, int ack) in ca_midi_cmd() argument
95 spin_lock_irqsave(&midi->input_lock, flags); in ca_midi_cmd()
96 ca_midi_write_data(midi, 0x00); in ca_midi_cmd()
99 ca_midi_write_cmd(midi, cmd); in ca_midi_cmd()
104 if (ca_midi_input_avail(midi)) { in ca_midi_cmd()
105 if (ca_midi_read_data(midi) == midi->ack) in ca_midi_cmd()
109 if (!ok && ca_midi_read_data(midi) == midi->ack) in ca_midi_cmd()
114 spin_unlock_irqrestore(&midi->input_lock, flags); in ca_midi_cmd()
118 midi->get_dev_id_port(midi->dev_id), in ca_midi_cmd()
119 ca_midi_read_stat(midi), in ca_midi_cmd()
120 ca_midi_read_data(midi)); in ca_midi_cmd()
125 struct snd_ca_midi *midi = substream->rmidi->private_data; in ca_midi_input_open() local
128 if (snd_BUG_ON(!midi->dev_id)) in ca_midi_input_open()
130 spin_lock_irqsave(&midi->open_lock, flags); in ca_midi_input_open()
131 midi->midi_mode |= CA_MIDI_MODE_INPUT; in ca_midi_input_open()
132 midi->substream_input = substream; in ca_midi_input_open()
133 if (!(midi->midi_mode & CA_MIDI_MODE_OUTPUT)) { in ca_midi_input_open()
134 spin_unlock_irqrestore(&midi->open_lock, flags); in ca_midi_input_open()
135 ca_midi_cmd(midi, midi->reset, 1); in ca_midi_input_open()
136 ca_midi_cmd(midi, midi->enter_uart, 1); in ca_midi_input_open()
138 spin_unlock_irqrestore(&midi->open_lock, flags); in ca_midi_input_open()
145 struct snd_ca_midi *midi = substream->rmidi->private_data; in ca_midi_output_open() local
148 if (snd_BUG_ON(!midi->dev_id)) in ca_midi_output_open()
150 spin_lock_irqsave(&midi->open_lock, flags); in ca_midi_output_open()
151 midi->midi_mode |= CA_MIDI_MODE_OUTPUT; in ca_midi_output_open()
152 midi->substream_output = substream; in ca_midi_output_open()
153 if (!(midi->midi_mode & CA_MIDI_MODE_INPUT)) { in ca_midi_output_open()
154 spin_unlock_irqrestore(&midi->open_lock, flags); in ca_midi_output_open()
155 ca_midi_cmd(midi, midi->reset, 1); in ca_midi_output_open()
156 ca_midi_cmd(midi, midi->enter_uart, 1); in ca_midi_output_open()
158 spin_unlock_irqrestore(&midi->open_lock, flags); in ca_midi_output_open()
165 struct snd_ca_midi *midi = substream->rmidi->private_data; in ca_midi_input_close() local
168 if (snd_BUG_ON(!midi->dev_id)) in ca_midi_input_close()
170 spin_lock_irqsave(&midi->open_lock, flags); in ca_midi_input_close()
171 midi->interrupt_disable(midi,midi->rx_enable); in ca_midi_input_close()
172 midi->midi_mode &= ~CA_MIDI_MODE_INPUT; in ca_midi_input_close()
173 midi->substream_input = NULL; in ca_midi_input_close()
174 if (!(midi->midi_mode & CA_MIDI_MODE_OUTPUT)) { in ca_midi_input_close()
175 spin_unlock_irqrestore(&midi->open_lock, flags); in ca_midi_input_close()
176 ca_midi_cmd(midi, midi->reset, 0); in ca_midi_input_close()
178 spin_unlock_irqrestore(&midi->open_lock, flags); in ca_midi_input_close()
185 struct snd_ca_midi *midi = substream->rmidi->private_data; in ca_midi_output_close() local
188 if (snd_BUG_ON(!midi->dev_id)) in ca_midi_output_close()
191 spin_lock_irqsave(&midi->open_lock, flags); in ca_midi_output_close()
193 midi->interrupt_disable(midi,midi->tx_enable); in ca_midi_output_close()
194 midi->midi_mode &= ~CA_MIDI_MODE_OUTPUT; in ca_midi_output_close()
195 midi->substream_output = NULL; in ca_midi_output_close()
197 if (!(midi->midi_mode & CA_MIDI_MODE_INPUT)) { in ca_midi_output_close()
198 spin_unlock_irqrestore(&midi->open_lock, flags); in ca_midi_output_close()
199 ca_midi_cmd(midi, midi->reset, 0); in ca_midi_output_close()
201 spin_unlock_irqrestore(&midi->open_lock, flags); in ca_midi_output_close()
208 struct snd_ca_midi *midi = substream->rmidi->private_data; in ca_midi_input_trigger() local
210 if (snd_BUG_ON(!midi->dev_id)) in ca_midi_input_trigger()
214 midi->interrupt_enable(midi,midi->rx_enable); in ca_midi_input_trigger()
216 midi->interrupt_disable(midi, midi->rx_enable); in ca_midi_input_trigger()
222 struct snd_ca_midi *midi = substream->rmidi->private_data; in ca_midi_output_trigger() local
225 if (snd_BUG_ON(!midi->dev_id)) in ca_midi_output_trigger()
232 spin_lock_irqsave(&midi->output_lock, flags); in ca_midi_output_trigger()
236 if (ca_midi_output_ready(midi)) { in ca_midi_output_trigger()
237 if (!(midi->midi_mode & CA_MIDI_MODE_OUTPUT) || in ca_midi_output_trigger()
240 spin_unlock_irqrestore(&midi->output_lock, flags); in ca_midi_output_trigger()
243 ca_midi_write_data(midi, byte); in ca_midi_output_trigger()
250 spin_unlock_irqrestore(&midi->output_lock, flags); in ca_midi_output_trigger()
251 midi->interrupt_enable(midi,midi->tx_enable); in ca_midi_output_trigger()
254 midi->interrupt_disable(midi,midi->tx_enable); in ca_midi_output_trigger()
272 static void ca_midi_free(struct snd_ca_midi *midi) in ca_midi_free() argument
274 midi->interrupt = NULL; in ca_midi_free()
275 midi->interrupt_enable = NULL; in ca_midi_free()
276 midi->interrupt_disable = NULL; in ca_midi_free()
277 midi->read = NULL; in ca_midi_free()
278 midi->write = NULL; in ca_midi_free()
279 midi->get_dev_id_card = NULL; in ca_midi_free()
280 midi->get_dev_id_port = NULL; in ca_midi_free()
281 midi->rmidi = NULL; in ca_midi_free()
289 int ca_midi_init(void *dev_id, struct snd_ca_midi *midi, int device, char *name) in ca_midi_init() argument
294 if ((err = snd_rawmidi_new(midi->get_dev_id_card(midi->dev_id), name, device, 1, 1, &rmidi)) < 0) in ca_midi_init()
297 midi->dev_id = dev_id; in ca_midi_init()
298 midi->interrupt = ca_midi_interrupt; in ca_midi_init()
300 spin_lock_init(&midi->open_lock); in ca_midi_init()
301 spin_lock_init(&midi->input_lock); in ca_midi_init()
302 spin_lock_init(&midi->output_lock); in ca_midi_init()
310 rmidi->private_data = midi; in ca_midi_init()
313 midi->rmidi = rmidi; in ca_midi_init()