Lines Matching refs:mpu
31 static void snd_mpu401_uart_input_read(struct snd_mpu401 * mpu);
32 static void snd_mpu401_uart_output_write(struct snd_mpu401 * mpu);
38 #define snd_mpu401_input_avail(mpu) \ argument
39 (!(mpu->read(mpu, MPU401C(mpu)) & MPU401_RX_EMPTY))
40 #define snd_mpu401_output_ready(mpu) \ argument
41 (!(mpu->read(mpu, MPU401C(mpu)) & MPU401_TX_FULL))
44 static void mpu401_write_port(struct snd_mpu401 *mpu, unsigned char data, in mpu401_write_port() argument
50 static unsigned char mpu401_read_port(struct snd_mpu401 *mpu, in mpu401_read_port() argument
56 static void mpu401_write_mmio(struct snd_mpu401 *mpu, unsigned char data, in mpu401_write_mmio() argument
62 static unsigned char mpu401_read_mmio(struct snd_mpu401 *mpu, in mpu401_read_mmio() argument
69 static void snd_mpu401_uart_clear_rx(struct snd_mpu401 *mpu) in snd_mpu401_uart_clear_rx() argument
72 for (; timeout > 0 && snd_mpu401_input_avail(mpu); timeout--) in snd_mpu401_uart_clear_rx()
73 mpu->read(mpu, MPU401D(mpu)); in snd_mpu401_uart_clear_rx()
77 mpu->read(mpu, MPU401C(mpu))); in snd_mpu401_uart_clear_rx()
81 static void uart_interrupt_tx(struct snd_mpu401 *mpu) in uart_interrupt_tx() argument
85 if (test_bit(MPU401_MODE_BIT_OUTPUT, &mpu->mode) && in uart_interrupt_tx()
86 test_bit(MPU401_MODE_BIT_OUTPUT_TRIGGER, &mpu->mode)) { in uart_interrupt_tx()
87 spin_lock_irqsave(&mpu->output_lock, flags); in uart_interrupt_tx()
88 snd_mpu401_uart_output_write(mpu); in uart_interrupt_tx()
89 spin_unlock_irqrestore(&mpu->output_lock, flags); in uart_interrupt_tx()
93 static void _snd_mpu401_uart_interrupt(struct snd_mpu401 *mpu) in _snd_mpu401_uart_interrupt() argument
97 if (mpu->info_flags & MPU401_INFO_INPUT) { in _snd_mpu401_uart_interrupt()
98 spin_lock_irqsave(&mpu->input_lock, flags); in _snd_mpu401_uart_interrupt()
99 if (test_bit(MPU401_MODE_BIT_INPUT, &mpu->mode)) in _snd_mpu401_uart_interrupt()
100 snd_mpu401_uart_input_read(mpu); in _snd_mpu401_uart_interrupt()
102 snd_mpu401_uart_clear_rx(mpu); in _snd_mpu401_uart_interrupt()
103 spin_unlock_irqrestore(&mpu->input_lock, flags); in _snd_mpu401_uart_interrupt()
105 if (! (mpu->info_flags & MPU401_INFO_TX_IRQ)) in _snd_mpu401_uart_interrupt()
108 uart_interrupt_tx(mpu); in _snd_mpu401_uart_interrupt()
122 struct snd_mpu401 *mpu = dev_id; in snd_mpu401_uart_interrupt() local
124 if (!mpu) in snd_mpu401_uart_interrupt()
126 _snd_mpu401_uart_interrupt(mpu); in snd_mpu401_uart_interrupt()
143 struct snd_mpu401 *mpu = dev_id; in snd_mpu401_uart_interrupt_tx() local
145 if (!mpu) in snd_mpu401_uart_interrupt_tx()
147 uart_interrupt_tx(mpu); in snd_mpu401_uart_interrupt_tx()
159 struct snd_mpu401 *mpu = from_timer(mpu, t, timer); in snd_mpu401_uart_timer() local
162 spin_lock_irqsave(&mpu->timer_lock, flags); in snd_mpu401_uart_timer()
164 mod_timer(&mpu->timer, 1 + jiffies); in snd_mpu401_uart_timer()
165 spin_unlock_irqrestore(&mpu->timer_lock, flags); in snd_mpu401_uart_timer()
166 if (mpu->rmidi) in snd_mpu401_uart_timer()
167 _snd_mpu401_uart_interrupt(mpu); in snd_mpu401_uart_timer()
173 static void snd_mpu401_uart_add_timer (struct snd_mpu401 *mpu, int input) in snd_mpu401_uart_add_timer() argument
177 spin_lock_irqsave (&mpu->timer_lock, flags); in snd_mpu401_uart_add_timer()
178 if (mpu->timer_invoked == 0) { in snd_mpu401_uart_add_timer()
179 timer_setup(&mpu->timer, snd_mpu401_uart_timer, 0); in snd_mpu401_uart_add_timer()
180 mod_timer(&mpu->timer, 1 + jiffies); in snd_mpu401_uart_add_timer()
182 mpu->timer_invoked |= input ? MPU401_MODE_INPUT_TIMER : in snd_mpu401_uart_add_timer()
184 spin_unlock_irqrestore (&mpu->timer_lock, flags); in snd_mpu401_uart_add_timer()
190 static void snd_mpu401_uart_remove_timer (struct snd_mpu401 *mpu, int input) in snd_mpu401_uart_remove_timer() argument
194 spin_lock_irqsave (&mpu->timer_lock, flags); in snd_mpu401_uart_remove_timer()
195 if (mpu->timer_invoked) { in snd_mpu401_uart_remove_timer()
196 mpu->timer_invoked &= input ? ~MPU401_MODE_INPUT_TIMER : in snd_mpu401_uart_remove_timer()
198 if (! mpu->timer_invoked) in snd_mpu401_uart_remove_timer()
199 del_timer(&mpu->timer); in snd_mpu401_uart_remove_timer()
201 spin_unlock_irqrestore (&mpu->timer_lock, flags); in snd_mpu401_uart_remove_timer()
209 static int snd_mpu401_uart_cmd(struct snd_mpu401 * mpu, unsigned char cmd, in snd_mpu401_uart_cmd() argument
215 spin_lock_irqsave(&mpu->input_lock, flags); in snd_mpu401_uart_cmd()
216 if (mpu->hardware != MPU401_HW_TRID4DWAVE) { in snd_mpu401_uart_cmd()
217 mpu->write(mpu, 0x00, MPU401D(mpu)); in snd_mpu401_uart_cmd()
221 if (mpu->hardware != MPU401_HW_SB) { in snd_mpu401_uart_cmd()
223 !snd_mpu401_output_ready(mpu); timeout--) in snd_mpu401_uart_cmd()
228 mpu->read(mpu, MPU401C(mpu))); in snd_mpu401_uart_cmd()
231 mpu->write(mpu, cmd, MPU401C(mpu)); in snd_mpu401_uart_cmd()
232 if (ack && !(mpu->info_flags & MPU401_INFO_NO_ACK)) { in snd_mpu401_uart_cmd()
236 if (snd_mpu401_input_avail(mpu)) { in snd_mpu401_uart_cmd()
237 if (mpu->read(mpu, MPU401D(mpu)) == MPU401_ACK) in snd_mpu401_uart_cmd()
241 if (!ok && mpu->read(mpu, MPU401D(mpu)) == MPU401_ACK) in snd_mpu401_uart_cmd()
245 spin_unlock_irqrestore(&mpu->input_lock, flags); in snd_mpu401_uart_cmd()
248 "(status = 0x%x, data = 0x%x)\n", cmd, mpu->port, in snd_mpu401_uart_cmd()
249 mpu->read(mpu, MPU401C(mpu)), in snd_mpu401_uart_cmd()
250 mpu->read(mpu, MPU401D(mpu))); in snd_mpu401_uart_cmd()
256 static int snd_mpu401_do_reset(struct snd_mpu401 *mpu) in snd_mpu401_do_reset() argument
258 if (snd_mpu401_uart_cmd(mpu, MPU401_RESET, 1)) in snd_mpu401_do_reset()
260 if (snd_mpu401_uart_cmd(mpu, MPU401_ENTER_UART, 0)) in snd_mpu401_do_reset()
270 struct snd_mpu401 *mpu; in snd_mpu401_uart_input_open() local
273 mpu = substream->rmidi->private_data; in snd_mpu401_uart_input_open()
274 if (mpu->open_input && (err = mpu->open_input(mpu)) < 0) in snd_mpu401_uart_input_open()
276 if (! test_bit(MPU401_MODE_BIT_OUTPUT, &mpu->mode)) { in snd_mpu401_uart_input_open()
277 if (snd_mpu401_do_reset(mpu) < 0) in snd_mpu401_uart_input_open()
280 mpu->substream_input = substream; in snd_mpu401_uart_input_open()
281 set_bit(MPU401_MODE_BIT_INPUT, &mpu->mode); in snd_mpu401_uart_input_open()
285 if (mpu->open_input && mpu->close_input) in snd_mpu401_uart_input_open()
286 mpu->close_input(mpu); in snd_mpu401_uart_input_open()
292 struct snd_mpu401 *mpu; in snd_mpu401_uart_output_open() local
295 mpu = substream->rmidi->private_data; in snd_mpu401_uart_output_open()
296 if (mpu->open_output && (err = mpu->open_output(mpu)) < 0) in snd_mpu401_uart_output_open()
298 if (! test_bit(MPU401_MODE_BIT_INPUT, &mpu->mode)) { in snd_mpu401_uart_output_open()
299 if (snd_mpu401_do_reset(mpu) < 0) in snd_mpu401_uart_output_open()
302 mpu->substream_output = substream; in snd_mpu401_uart_output_open()
303 set_bit(MPU401_MODE_BIT_OUTPUT, &mpu->mode); in snd_mpu401_uart_output_open()
307 if (mpu->open_output && mpu->close_output) in snd_mpu401_uart_output_open()
308 mpu->close_output(mpu); in snd_mpu401_uart_output_open()
314 struct snd_mpu401 *mpu; in snd_mpu401_uart_input_close() local
317 mpu = substream->rmidi->private_data; in snd_mpu401_uart_input_close()
318 clear_bit(MPU401_MODE_BIT_INPUT, &mpu->mode); in snd_mpu401_uart_input_close()
319 mpu->substream_input = NULL; in snd_mpu401_uart_input_close()
320 if (! test_bit(MPU401_MODE_BIT_OUTPUT, &mpu->mode)) in snd_mpu401_uart_input_close()
321 err = snd_mpu401_uart_cmd(mpu, MPU401_RESET, 0); in snd_mpu401_uart_input_close()
322 if (mpu->close_input) in snd_mpu401_uart_input_close()
323 mpu->close_input(mpu); in snd_mpu401_uart_input_close()
331 struct snd_mpu401 *mpu; in snd_mpu401_uart_output_close() local
334 mpu = substream->rmidi->private_data; in snd_mpu401_uart_output_close()
335 clear_bit(MPU401_MODE_BIT_OUTPUT, &mpu->mode); in snd_mpu401_uart_output_close()
336 mpu->substream_output = NULL; in snd_mpu401_uart_output_close()
337 if (! test_bit(MPU401_MODE_BIT_INPUT, &mpu->mode)) in snd_mpu401_uart_output_close()
338 err = snd_mpu401_uart_cmd(mpu, MPU401_RESET, 0); in snd_mpu401_uart_output_close()
339 if (mpu->close_output) in snd_mpu401_uart_output_close()
340 mpu->close_output(mpu); in snd_mpu401_uart_output_close()
353 struct snd_mpu401 *mpu; in snd_mpu401_uart_input_trigger() local
356 mpu = substream->rmidi->private_data; in snd_mpu401_uart_input_trigger()
359 &mpu->mode)) { in snd_mpu401_uart_input_trigger()
362 mpu->read(mpu, MPU401D(mpu)); in snd_mpu401_uart_input_trigger()
363 if (mpu->info_flags & MPU401_INFO_USE_TIMER) in snd_mpu401_uart_input_trigger()
364 snd_mpu401_uart_add_timer(mpu, 1); in snd_mpu401_uart_input_trigger()
368 spin_lock_irqsave(&mpu->input_lock, flags); in snd_mpu401_uart_input_trigger()
369 snd_mpu401_uart_input_read(mpu); in snd_mpu401_uart_input_trigger()
370 spin_unlock_irqrestore(&mpu->input_lock, flags); in snd_mpu401_uart_input_trigger()
372 if (mpu->info_flags & MPU401_INFO_USE_TIMER) in snd_mpu401_uart_input_trigger()
373 snd_mpu401_uart_remove_timer(mpu, 1); in snd_mpu401_uart_input_trigger()
374 clear_bit(MPU401_MODE_BIT_INPUT_TRIGGER, &mpu->mode); in snd_mpu401_uart_input_trigger()
383 static void snd_mpu401_uart_input_read(struct snd_mpu401 * mpu) in snd_mpu401_uart_input_read() argument
389 if (! snd_mpu401_input_avail(mpu)) in snd_mpu401_uart_input_read()
391 byte = mpu->read(mpu, MPU401D(mpu)); in snd_mpu401_uart_input_read()
392 if (test_bit(MPU401_MODE_BIT_INPUT_TRIGGER, &mpu->mode)) in snd_mpu401_uart_input_read()
393 snd_rawmidi_receive(mpu->substream_input, &byte, 1); in snd_mpu401_uart_input_read()
409 static void snd_mpu401_uart_output_write(struct snd_mpu401 * mpu) in snd_mpu401_uart_output_write() argument
415 if (snd_rawmidi_transmit_peek(mpu->substream_output, in snd_mpu401_uart_output_write()
421 if (!snd_mpu401_output_ready(mpu) && in snd_mpu401_uart_output_write()
422 !snd_mpu401_output_ready(mpu)) in snd_mpu401_uart_output_write()
424 mpu->write(mpu, byte, MPU401D(mpu)); in snd_mpu401_uart_output_write()
425 snd_rawmidi_transmit_ack(mpu->substream_output, 1); in snd_mpu401_uart_output_write()
427 snd_mpu401_uart_remove_timer (mpu, 0); in snd_mpu401_uart_output_write()
440 struct snd_mpu401 *mpu; in snd_mpu401_uart_output_trigger() local
442 mpu = substream->rmidi->private_data; in snd_mpu401_uart_output_trigger()
444 set_bit(MPU401_MODE_BIT_OUTPUT_TRIGGER, &mpu->mode); in snd_mpu401_uart_output_trigger()
450 if (! (mpu->info_flags & MPU401_INFO_TX_IRQ)) in snd_mpu401_uart_output_trigger()
451 snd_mpu401_uart_add_timer(mpu, 0); in snd_mpu401_uart_output_trigger()
454 spin_lock_irqsave(&mpu->output_lock, flags); in snd_mpu401_uart_output_trigger()
455 snd_mpu401_uart_output_write(mpu); in snd_mpu401_uart_output_trigger()
456 spin_unlock_irqrestore(&mpu->output_lock, flags); in snd_mpu401_uart_output_trigger()
458 if (! (mpu->info_flags & MPU401_INFO_TX_IRQ)) in snd_mpu401_uart_output_trigger()
459 snd_mpu401_uart_remove_timer(mpu, 0); in snd_mpu401_uart_output_trigger()
460 clear_bit(MPU401_MODE_BIT_OUTPUT_TRIGGER, &mpu->mode); in snd_mpu401_uart_output_trigger()
484 struct snd_mpu401 *mpu = rmidi->private_data; in snd_mpu401_uart_free() local
485 if (mpu->irq >= 0) in snd_mpu401_uart_free()
486 free_irq(mpu->irq, (void *) mpu); in snd_mpu401_uart_free()
487 release_and_free_resource(mpu->res); in snd_mpu401_uart_free()
488 kfree(mpu); in snd_mpu401_uart_free()
516 struct snd_mpu401 *mpu; in snd_mpu401_uart_new() local
530 mpu = kzalloc(sizeof(*mpu), GFP_KERNEL); in snd_mpu401_uart_new()
531 if (!mpu) { in snd_mpu401_uart_new()
535 rmidi->private_data = mpu; in snd_mpu401_uart_new()
537 spin_lock_init(&mpu->input_lock); in snd_mpu401_uart_new()
538 spin_lock_init(&mpu->output_lock); in snd_mpu401_uart_new()
539 spin_lock_init(&mpu->timer_lock); in snd_mpu401_uart_new()
540 mpu->hardware = hardware; in snd_mpu401_uart_new()
541 mpu->irq = -1; in snd_mpu401_uart_new()
544 mpu->res = request_region(port, res_size, "MPU401 UART"); in snd_mpu401_uart_new()
545 if (!mpu->res) { in snd_mpu401_uart_new()
554 mpu->write = mpu401_write_mmio; in snd_mpu401_uart_new()
555 mpu->read = mpu401_read_mmio; in snd_mpu401_uart_new()
557 mpu->write = mpu401_write_port; in snd_mpu401_uart_new()
558 mpu->read = mpu401_read_port; in snd_mpu401_uart_new()
560 mpu->port = port; in snd_mpu401_uart_new()
562 mpu->cport = port + 2; in snd_mpu401_uart_new()
564 mpu->cport = port + 1; in snd_mpu401_uart_new()
567 "MPU401 UART", (void *) mpu)) { in snd_mpu401_uart_new()
576 mpu->info_flags = info_flags; in snd_mpu401_uart_new()
577 mpu->irq = irq; in snd_mpu401_uart_new()
595 mpu->rmidi = rmidi; in snd_mpu401_uart_new()