Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d64c5cf8 authored by Liam Girdwood's avatar Liam Girdwood Committed by Takashi Iwai
Browse files

ALSA: pcm: Allow drivers to set R/W wait time.



Currently ALSA core blocks userspace for about 10 seconds for PCM R/W IO.
This needs to be configurable for modern hardware like DSPs where no
pointer update in milliseconds can indicate terminal DSP errors.

Add a substream variable to set the wait time in ms. This allows userspace
and drivers to recover more quickly from terminal DSP errors.

Signed-off-by: default avatarLiam Girdwood <liam.r.girdwood@linux.intel.com>
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent e647f5a5
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -462,6 +462,7 @@ struct snd_pcm_substream {
        /* -- timer section -- */
	struct snd_timer *timer;		/* timer */
	unsigned timer_running: 1;	/* time is running */
	long wait_time;	/* time in ms for R/W to wait for avail */
	/* -- next substream -- */
	struct snd_pcm_substream *next;
	/* -- linked substreams -- */
+12 −5
Original line number Diff line number Diff line
@@ -1833,13 +1833,20 @@ static int wait_for_avail(struct snd_pcm_substream *substream,
	if (runtime->no_period_wakeup)
		wait_time = MAX_SCHEDULE_TIMEOUT;
	else {
		/* use wait time from substream if available */
		if (substream->wait_time) {
			wait_time = substream->wait_time;
		} else {
			wait_time = 10;

			if (runtime->rate) {
			long t = runtime->period_size * 2 / runtime->rate;
				long t = runtime->period_size * 2 /
					 runtime->rate;
				wait_time = max(t, wait_time);
			}
			wait_time = msecs_to_jiffies(wait_time * 1000);
		}
	}

	for (;;) {
		if (signal_pending(current)) {