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) { in snd_mpu401_uart_input_open()
275 err = mpu->open_input(mpu); in snd_mpu401_uart_input_open()
279 if (! test_bit(MPU401_MODE_BIT_OUTPUT, &mpu->mode)) { in snd_mpu401_uart_input_open()
280 if (snd_mpu401_do_reset(mpu) < 0) in snd_mpu401_uart_input_open()
283 mpu->substream_input = substream; in snd_mpu401_uart_input_open()
284 set_bit(MPU401_MODE_BIT_INPUT, &mpu->mode); in snd_mpu401_uart_input_open()
288 if (mpu->open_input && mpu->close_input) in snd_mpu401_uart_input_open()
289 mpu->close_input(mpu); in snd_mpu401_uart_input_open()
295 struct snd_mpu401 *mpu; in snd_mpu401_uart_output_open() local
298 mpu = substream->rmidi->private_data; in snd_mpu401_uart_output_open()
299 if (mpu->open_output) { in snd_mpu401_uart_output_open()
300 err = mpu->open_output(mpu); in snd_mpu401_uart_output_open()
304 if (! test_bit(MPU401_MODE_BIT_INPUT, &mpu->mode)) { in snd_mpu401_uart_output_open()
305 if (snd_mpu401_do_reset(mpu) < 0) in snd_mpu401_uart_output_open()
308 mpu->substream_output = substream; in snd_mpu401_uart_output_open()
309 set_bit(MPU401_MODE_BIT_OUTPUT, &mpu->mode); in snd_mpu401_uart_output_open()
313 if (mpu->open_output && mpu->close_output) in snd_mpu401_uart_output_open()
314 mpu->close_output(mpu); in snd_mpu401_uart_output_open()
320 struct snd_mpu401 *mpu; in snd_mpu401_uart_input_close() local
323 mpu = substream->rmidi->private_data; in snd_mpu401_uart_input_close()
324 clear_bit(MPU401_MODE_BIT_INPUT, &mpu->mode); in snd_mpu401_uart_input_close()
325 mpu->substream_input = NULL; in snd_mpu401_uart_input_close()
326 if (! test_bit(MPU401_MODE_BIT_OUTPUT, &mpu->mode)) in snd_mpu401_uart_input_close()
327 err = snd_mpu401_uart_cmd(mpu, MPU401_RESET, 0); in snd_mpu401_uart_input_close()
328 if (mpu->close_input) in snd_mpu401_uart_input_close()
329 mpu->close_input(mpu); in snd_mpu401_uart_input_close()
337 struct snd_mpu401 *mpu; in snd_mpu401_uart_output_close() local
340 mpu = substream->rmidi->private_data; in snd_mpu401_uart_output_close()
341 clear_bit(MPU401_MODE_BIT_OUTPUT, &mpu->mode); in snd_mpu401_uart_output_close()
342 mpu->substream_output = NULL; in snd_mpu401_uart_output_close()
343 if (! test_bit(MPU401_MODE_BIT_INPUT, &mpu->mode)) in snd_mpu401_uart_output_close()
344 err = snd_mpu401_uart_cmd(mpu, MPU401_RESET, 0); in snd_mpu401_uart_output_close()
345 if (mpu->close_output) in snd_mpu401_uart_output_close()
346 mpu->close_output(mpu); in snd_mpu401_uart_output_close()
359 struct snd_mpu401 *mpu; in snd_mpu401_uart_input_trigger() local
362 mpu = substream->rmidi->private_data; in snd_mpu401_uart_input_trigger()
365 &mpu->mode)) { in snd_mpu401_uart_input_trigger()
368 mpu->read(mpu, MPU401D(mpu)); in snd_mpu401_uart_input_trigger()
369 if (mpu->info_flags & MPU401_INFO_USE_TIMER) in snd_mpu401_uart_input_trigger()
370 snd_mpu401_uart_add_timer(mpu, 1); in snd_mpu401_uart_input_trigger()
374 spin_lock_irqsave(&mpu->input_lock, flags); in snd_mpu401_uart_input_trigger()
375 snd_mpu401_uart_input_read(mpu); in snd_mpu401_uart_input_trigger()
376 spin_unlock_irqrestore(&mpu->input_lock, flags); in snd_mpu401_uart_input_trigger()
378 if (mpu->info_flags & MPU401_INFO_USE_TIMER) in snd_mpu401_uart_input_trigger()
379 snd_mpu401_uart_remove_timer(mpu, 1); in snd_mpu401_uart_input_trigger()
380 clear_bit(MPU401_MODE_BIT_INPUT_TRIGGER, &mpu->mode); in snd_mpu401_uart_input_trigger()
389 static void snd_mpu401_uart_input_read(struct snd_mpu401 * mpu) in snd_mpu401_uart_input_read() argument
395 if (! snd_mpu401_input_avail(mpu)) in snd_mpu401_uart_input_read()
397 byte = mpu->read(mpu, MPU401D(mpu)); in snd_mpu401_uart_input_read()
398 if (test_bit(MPU401_MODE_BIT_INPUT_TRIGGER, &mpu->mode)) in snd_mpu401_uart_input_read()
399 snd_rawmidi_receive(mpu->substream_input, &byte, 1); in snd_mpu401_uart_input_read()
415 static void snd_mpu401_uart_output_write(struct snd_mpu401 * mpu) in snd_mpu401_uart_output_write() argument
421 if (snd_rawmidi_transmit_peek(mpu->substream_output, in snd_mpu401_uart_output_write()
427 if (!snd_mpu401_output_ready(mpu) && in snd_mpu401_uart_output_write()
428 !snd_mpu401_output_ready(mpu)) in snd_mpu401_uart_output_write()
430 mpu->write(mpu, byte, MPU401D(mpu)); in snd_mpu401_uart_output_write()
431 snd_rawmidi_transmit_ack(mpu->substream_output, 1); in snd_mpu401_uart_output_write()
433 snd_mpu401_uart_remove_timer (mpu, 0); in snd_mpu401_uart_output_write()
446 struct snd_mpu401 *mpu; in snd_mpu401_uart_output_trigger() local
448 mpu = substream->rmidi->private_data; in snd_mpu401_uart_output_trigger()
450 set_bit(MPU401_MODE_BIT_OUTPUT_TRIGGER, &mpu->mode); in snd_mpu401_uart_output_trigger()
456 if (! (mpu->info_flags & MPU401_INFO_TX_IRQ)) in snd_mpu401_uart_output_trigger()
457 snd_mpu401_uart_add_timer(mpu, 0); in snd_mpu401_uart_output_trigger()
460 spin_lock_irqsave(&mpu->output_lock, flags); in snd_mpu401_uart_output_trigger()
461 snd_mpu401_uart_output_write(mpu); in snd_mpu401_uart_output_trigger()
462 spin_unlock_irqrestore(&mpu->output_lock, flags); in snd_mpu401_uart_output_trigger()
464 if (! (mpu->info_flags & MPU401_INFO_TX_IRQ)) in snd_mpu401_uart_output_trigger()
465 snd_mpu401_uart_remove_timer(mpu, 0); in snd_mpu401_uart_output_trigger()
466 clear_bit(MPU401_MODE_BIT_OUTPUT_TRIGGER, &mpu->mode); in snd_mpu401_uart_output_trigger()
490 struct snd_mpu401 *mpu = rmidi->private_data; in snd_mpu401_uart_free() local
491 if (mpu->irq >= 0) in snd_mpu401_uart_free()
492 free_irq(mpu->irq, (void *) mpu); in snd_mpu401_uart_free()
493 release_and_free_resource(mpu->res); in snd_mpu401_uart_free()
494 kfree(mpu); in snd_mpu401_uart_free()
522 struct snd_mpu401 *mpu; in snd_mpu401_uart_new() local
537 mpu = kzalloc(sizeof(*mpu), GFP_KERNEL); in snd_mpu401_uart_new()
538 if (!mpu) { in snd_mpu401_uart_new()
542 rmidi->private_data = mpu; in snd_mpu401_uart_new()
544 spin_lock_init(&mpu->input_lock); in snd_mpu401_uart_new()
545 spin_lock_init(&mpu->output_lock); in snd_mpu401_uart_new()
546 spin_lock_init(&mpu->timer_lock); in snd_mpu401_uart_new()
547 mpu->hardware = hardware; in snd_mpu401_uart_new()
548 mpu->irq = -1; in snd_mpu401_uart_new()
551 mpu->res = request_region(port, res_size, "MPU401 UART"); in snd_mpu401_uart_new()
552 if (!mpu->res) { in snd_mpu401_uart_new()
561 mpu->write = mpu401_write_mmio; in snd_mpu401_uart_new()
562 mpu->read = mpu401_read_mmio; in snd_mpu401_uart_new()
564 mpu->write = mpu401_write_port; in snd_mpu401_uart_new()
565 mpu->read = mpu401_read_port; in snd_mpu401_uart_new()
567 mpu->port = port; in snd_mpu401_uart_new()
569 mpu->cport = port + 2; in snd_mpu401_uart_new()
571 mpu->cport = port + 1; in snd_mpu401_uart_new()
574 "MPU401 UART", (void *) mpu)) { in snd_mpu401_uart_new()
583 mpu->info_flags = info_flags; in snd_mpu401_uart_new()
584 mpu->irq = irq; in snd_mpu401_uart_new()
602 mpu->rmidi = rmidi; in snd_mpu401_uart_new()