[ALSA] mpu401: fix recursive locking in timer
When the output and input ports are used at the same time, the timer can be interrupted by the hardware interrupt, so we have to disable interrupts when we take a lock in the timer. Signed-off-by: Clemens Ladisch <clemens@ladisch.de> Signed-off-by: Jaroslav Kysela <perex@perex.cz>
This commit is contained in:
parent
56c36ca3b2
commit
60fac85fff
1 changed files with 8 additions and 4 deletions
|
@ -97,23 +97,27 @@ static void snd_mpu401_uart_clear_rx(struct snd_mpu401 *mpu)
|
|||
|
||||
static void uart_interrupt_tx(struct snd_mpu401 *mpu)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
if (test_bit(MPU401_MODE_BIT_OUTPUT, &mpu->mode) &&
|
||||
test_bit(MPU401_MODE_BIT_OUTPUT_TRIGGER, &mpu->mode)) {
|
||||
spin_lock(&mpu->output_lock);
|
||||
spin_lock_irqsave(&mpu->output_lock, flags);
|
||||
snd_mpu401_uart_output_write(mpu);
|
||||
spin_unlock(&mpu->output_lock);
|
||||
spin_unlock_irqrestore(&mpu->output_lock, flags);
|
||||
}
|
||||
}
|
||||
|
||||
static void _snd_mpu401_uart_interrupt(struct snd_mpu401 *mpu)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
if (mpu->info_flags & MPU401_INFO_INPUT) {
|
||||
spin_lock(&mpu->input_lock);
|
||||
spin_lock_irqsave(&mpu->input_lock, flags);
|
||||
if (test_bit(MPU401_MODE_BIT_INPUT, &mpu->mode))
|
||||
snd_mpu401_uart_input_read(mpu);
|
||||
else
|
||||
snd_mpu401_uart_clear_rx(mpu);
|
||||
spin_unlock(&mpu->input_lock);
|
||||
spin_unlock_irqrestore(&mpu->input_lock, flags);
|
||||
}
|
||||
if (! (mpu->info_flags & MPU401_INFO_TX_IRQ))
|
||||
/* ok. for better Tx performance try do some output
|
||||
|
|
Loading…
Reference in a new issue