Fix to avoid kernel assertion "BUG: scheduling while atomic"

Added spinlock release in mr_alsa_audio_pcm_hw_params() and mr_alsa_audio_pcm_prepare() prior to call to set_sample_rate()
This fixes issue #21
This commit is contained in:
Andrea Bondavalli 2020-09-04 20:36:30 +02:00
parent 561ae1b334
commit b791c559a7

View File

@ -18,13 +18,15 @@ index 3d9debd..169348b 100644
return 0; return 0;
default: default:
return -EINVAL; return -EINVAL;
@@ -870,13 +870,13 @@ static int mr_alsa_audio_pcm_prepare(struct snd_pcm_substream *substream) @@ -870,15 +885,19 @@ static int mr_alsa_audio_pcm_prepare(struct snd_pcm_substream *substream)
{ {
if(runtime_dsd_mode != chip->current_dsd) if(runtime_dsd_mode != chip->current_dsd)
{ {
- chip->mr_alsa_audio_ops->stop_interrupts(chip->ravenna_peer); - chip->mr_alsa_audio_ops->stop_interrupts(chip->ravenna_peer);
+ chip->mr_alsa_audio_ops->stop_interrupts(chip->ravenna_peer, substream->stream == SNDRV_PCM_STREAM_PLAYBACK); + chip->mr_alsa_audio_ops->stop_interrupts(chip->ravenna_peer, substream->stream == SNDRV_PCM_STREAM_PLAYBACK);
+ spin_unlock_irq(&chip->lock);
err = chip->mr_alsa_audio_ops->set_sample_rate(chip->ravenna_peer, runtime_dsd_rate); err = chip->mr_alsa_audio_ops->set_sample_rate(chip->ravenna_peer, runtime_dsd_rate);
+ spin_lock_irq(&chip->lock);
} }
} }
else if(chip->current_rate != runtime->rate) else if(chip->current_rate != runtime->rate)
@ -32,24 +34,33 @@ index 3d9debd..169348b 100644
- chip->mr_alsa_audio_ops->stop_interrupts(chip->ravenna_peer); - chip->mr_alsa_audio_ops->stop_interrupts(chip->ravenna_peer);
+ chip->mr_alsa_audio_ops->stop_interrupts(chip->ravenna_peer, substream->stream == SNDRV_PCM_STREAM_PLAYBACK); + chip->mr_alsa_audio_ops->stop_interrupts(chip->ravenna_peer, substream->stream == SNDRV_PCM_STREAM_PLAYBACK);
//printk("\n### mr_alsa_audio_pcm_prepare: mr_alsa_audio_ops->set_sample_rate to %u\n", runtime->rate); //printk("\n### mr_alsa_audio_pcm_prepare: mr_alsa_audio_ops->set_sample_rate to %u\n", runtime->rate);
+ spin_unlock_irq(&chip->lock);
err = chip->mr_alsa_audio_ops->set_sample_rate(chip->ravenna_peer, runtime->rate); err = chip->mr_alsa_audio_ops->set_sample_rate(chip->ravenna_peer, runtime->rate);
+ spin_lock_irq(&chip->lock);
//printk("### mr_alsa_audio_pcm_prepare: mr_alsa_audio_ops->set_sample_rate returned %d\n\n", err); //printk("### mr_alsa_audio_pcm_prepare: mr_alsa_audio_ops->set_sample_rate returned %d\n\n", err);
@@ -1825,13 +1825,13 @@ static int mr_alsa_audio_pcm_hw_params( struct snd_pcm_substream *substream, }
@@ -1825,14 +1526,18 @@ static int mr_alsa_audio_pcm_hw_params( struct snd_pcm_substream *substream,
{ {
if(dsd_mode != chip->current_dsd) if(dsd_mode != chip->current_dsd)
{ {
- chip->mr_alsa_audio_ops->stop_interrupts(chip->ravenna_peer); - chip->mr_alsa_audio_ops->stop_interrupts(chip->ravenna_peer);
+ chip->mr_alsa_audio_ops->stop_interrupts(chip->ravenna_peer, substream->stream == SNDRV_PCM_STREAM_PLAYBACK); + chip->mr_alsa_audio_ops->stop_interrupts(chip->ravenna_peer, substream->stream == SNDRV_PCM_STREAM_PLAYBACK);
+ spin_unlock_irq(&chip->lock);
err = chip->mr_alsa_audio_ops->set_sample_rate(chip->ravenna_peer, dsd_rate); err = chip->mr_alsa_audio_ops->set_sample_rate(chip->ravenna_peer, dsd_rate);
+ spin_lock_irq(&chip->lock);
} }
} }
else if(rate != chip->current_rate) else if(rate != chip->current_rate)
{ {
- chip->mr_alsa_audio_ops->stop_interrupts(chip->ravenna_peer); - chip->mr_alsa_audio_ops->stop_interrupts(chip->ravenna_peer);
+ chip->mr_alsa_audio_ops->stop_interrupts(chip->ravenna_peer, substream->stream == SNDRV_PCM_STREAM_PLAYBACK); + chip->mr_alsa_audio_ops->stop_interrupts(chip->ravenna_peer, substream->stream == SNDRV_PCM_STREAM_PLAYBACK);
+ spin_unlock_irq(&chip->lock);
err = chip->mr_alsa_audio_ops->set_sample_rate(chip->ravenna_peer, rate); err = chip->mr_alsa_audio_ops->set_sample_rate(chip->ravenna_peer, rate);
+ spin_lock_irq(&chip->lock);
} }
if(chip->ravenna_peer)
diff --git a/driver/manager.c b/driver/manager.c diff --git a/driver/manager.c b/driver/manager.c
index 25b77dc..ec62624 100644 index 25b77dc..ec62624 100644
--- a/driver/manager.c --- a/driver/manager.c